<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-2589537411099484208</id><updated>2012-02-16T07:34:43.134-08:00</updated><category term='Linux'/><title type='text'>The Coffee Shop Review</title><subtitle type='html'>What I do when I am in a Coffee Shop</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://dontburnmybeans.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2589537411099484208/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://dontburnmybeans.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Jamtech</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/-RNwpfmrDdPU/Tn1tpZWh2zI/AAAAAAAAAHg/ICZaej4kWOk/s220/hitmana3_2.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>22</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-2589537411099484208.post-5721695757751048225</id><published>2009-11-04T11:48:00.001-08:00</published><updated>2009-11-04T11:54:35.638-08:00</updated><title type='text'>I Wish More Real Estate Bloggers Would Use Twitter</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;&lt;blockquote&gt;&lt;big&gt;&lt;b&gt;&lt;b&gt;&lt;a href='http://agentgenius.com/real-estate-technology-new-media/i-wish-more-real-estate-bloggers-would-use-twitter/'/&gt;&lt;/b&gt;&lt;/b&gt;&lt;/big&gt;&lt;b&gt;By Daniel Rothamel on October 12, 2007&lt;br/&gt;&lt;br/&gt;I admit it. I am into the whole social media thing.&lt;br/&gt;&lt;br/&gt;&lt;/b&gt;&lt;ol&gt;&lt;li&gt;&lt;b&gt;Facebook? Check.&lt;/b&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;LinkedIn? Check.&lt;/b&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;Twitter? Check.&lt;/b&gt;&lt;/li&gt;&lt;/ol&gt;&lt;b&gt;&lt;br/&gt;I am a self-professed information junkie, so I find these sites fascinting. I have also found that they are a great way for me to stay in contact not only with my clients, but with other RE.net bloggers out there. I have met plenty of new bloggers and made some great contacts by using Facebook and LinkedIn. Twitter seems to be lacking a significant real estate voice, however. Sure, some of my favorite real estate bloggers have Twitter profiles (Greg, Joel, &amp;amp; Jim among them). The problem is, they don’t update them much, if ever. I think this is a real shame.&lt;br/&gt;&lt;br/&gt;I started using Twitter a few weeks ago. I admit that I came in with a built-in bias against Twitter. To be honest, I find the stated purpose of Twitter (i.e. “What are you doing?”) pretty lame. I don’t think there are a lot of people out there who really care what I am doing at any given moment. I decided that I would try to follow 5 rules when writing my tweets. I didn’t want things to get boring.&lt;br/&gt;&lt;br/&gt;In true Web 2.0-spirit, people have taken Twitter and turned into more than just countless status updates of millions of random people. It is truly a great place to find out what has captured people’s attention. All you have to do is seek out people who you find interesting and follow their tweets. It is a great way to stay on the bleeding edge of news and information.&lt;br/&gt;&lt;br/&gt;Twitter has also established itself as a premier micro-blogging platform. It has been great for me because I can post links on Twitter that I find interesting, but that I don’t really have the time or inclination to use an entire blog post to discuss. There are plenty of other notable bloggers out there who are doing the very same thing. Sometimes following the tweets of others has inspired blog posts of my own. At the very least, Twitter has become a platform from which to launch discoveries into all sorts of things that I might have otherwise missed.&lt;br/&gt;&lt;br/&gt;Real estate bloggers could benefit tremendously from using Twitter. The micro-blogging aspect of Twitter could be very valuable to people like real estate bloggers, who I am sure have all kinds of great ideas, but not always the time to write about them. Let’s say that I read a great story about mortgage fraud, but I just don’t have the time to devote a full post to it. I can post the link on Twitter, and perhaps someone else who is following me will follow the link and write a post of their own. Even if that doesn’t happen, because bloggers tend to be more plugged-in to what is happening in the industry, Twitter would help everyone stay on top of the industry by offering instantaneous communication and dissemination of information. In a way, Twitter is a living uber-wiki.&lt;br/&gt;&lt;br/&gt;The real estate bloggers that I know are all very smart and creative people. Twitter offers a convenient and efficient way to get their message out to not only the rest of the blogosphere, but also to the public as well. I am also confident that real estate bloggers could also come up with alternative uses for Twitter that would benefit us all, bloggers, clients and customers alike.&lt;br/&gt;&lt;br/&gt;So, real estate bloggers, if you are reading this, head on over to Twitter and get going– the RE.net needs you!&lt;br/&gt;&lt;/b&gt;&lt;/blockquote&gt;&lt;b&gt;&lt;br/&gt;&lt;br/&gt;&lt;/b&gt;&lt;br/&gt;&lt;br/&gt;&lt;div class='zemanta-pixie'&gt;&lt;img src='http://img.zemanta.com/pixy.gif?x-id=52e7c43c-c740-8d96-b1c8-017c03bd85b7' alt='' class='zemanta-pixie-img'/&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2589537411099484208-5721695757751048225?l=dontburnmybeans.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dontburnmybeans.blogspot.com/feeds/5721695757751048225/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2589537411099484208&amp;postID=5721695757751048225' title='40 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2589537411099484208/posts/default/5721695757751048225'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2589537411099484208/posts/default/5721695757751048225'/><link rel='alternate' type='text/html' href='http://dontburnmybeans.blogspot.com/2009/11/i-wish-more-real-estate-bloggers-would.html' title='I Wish More Real Estate Bloggers Would Use Twitter'/><author><name>Jamtech</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/-RNwpfmrDdPU/Tn1tpZWh2zI/AAAAAAAAAHg/ICZaej4kWOk/s220/hitmana3_2.jpg'/></author><thr:total>40</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2589537411099484208.post-5923602733576156987</id><published>2008-08-12T23:14:00.001-07:00</published><updated>2009-04-18T21:33:16.961-07:00</updated><title type='text'>6 Steps to Secure Your Home Wireless Network</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;&lt;h2&gt;6 Steps to Secure Your Home Wireless Network&lt;/h2&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;				&lt;div class='postinfo'&gt;&lt;br /&gt;Posted on &lt;span class='postdate'&gt;August 7th, 2008&lt;/span&gt; by Ramesh				&lt;/div&gt;&lt;br /&gt;Filed Under: &lt;a rel='category tag' title='View all posts in Security' href='http://www.thegeekstuff.com/category/security/'&gt;Security&lt;/a&gt;   Tags: &lt;a rel='tag' href='http://www.thegeekstuff.com/tag/wi-fi/'&gt;Wi-Fi&lt;/a&gt;, &lt;a rel='tag' href='http://www.thegeekstuff.com/tag/wireless/'&gt;Wireless&lt;/a&gt;     &lt;br /&gt;&lt;br /&gt;			&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;				&lt;p&gt;&lt;a href='http://www.thegeekstuff.com/wp-content/uploads/2008/08/wireless-router.jpg'&gt;&lt;img width='270' height='175' alt='Wireless Router' src='http://www.thegeekstuff.com/wp-content/uploads/2008/08/wireless-router.jpg' title='Wireless Router' style='float: right;' class='alignright alignnone size-medium wp-image-127'/&gt;&lt;/a&gt;Most&lt;br /&gt;of you might have enabled wireless encryption, which is only one of the&lt;br /&gt;6 steps mentioned in this article to make your wireless network safe&lt;br /&gt;and secure from hackers.  The screenshots mentioned below are from&lt;br /&gt;Linksys wireless router. But, you’ll find similar options for all the 6&lt;br /&gt;steps mentioned below in wireless routers from any other vendors.&lt;br/&gt;&lt;br /&gt;&lt;span id='more-122'/&gt;&lt;/p&gt;&lt;br /&gt;&lt;h3&gt;1. Enable Encryption&lt;/h3&gt;&lt;br /&gt;&lt;p&gt;Let us start with the basics. Most of the wireless router has the&lt;br /&gt;encryption disabled by default. Make sure to enable either WPA or WPA2&lt;br /&gt;wireless encryption.  Click on &lt;em&gt;Wireless -&amp;gt; Wireless Security , &lt;/em&gt;to&lt;br /&gt;enable the encryption and assign a password as shown in Fig-1.&lt;br /&gt;Following are the different wireless encryption options available.&lt;/p&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;WEP (Wired Equivalent Protection) 64-bit and 128-bit&lt;/strong&gt;: WEP is an old wireless encryption standard. Never use WEP encryption, which can be hacked within seconds.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;WPA (Wi-Fi Protected Access)&lt;/strong&gt;: WPA-PSK is also&lt;br /&gt;refered as WPA-Personal. This is a new version of wireless encryption&lt;br /&gt;standard and more secure than WEP. Most of the wireless adapters on&lt;br /&gt;your laptop will  support WPA.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;WPA2&lt;/strong&gt;: This is the latest wireless encryption&lt;br /&gt;standard that provides the best encryption. Always use WPA2, if both&lt;br /&gt;your wireless router and laptop wireless adapter supports it.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;div style='text-align: center;'&gt;&lt;img width='386' height='216' alt='Enable Encryption' src='http://www.thegeekstuff.com/wp-content/uploads/2008/08/1-1-enable-encryption.jpg' title='Enable Encryption' class='aligncenter size-full wp-image-128'/&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style='text-align: center;'&gt;Fig-1 Enable Wireless Encryption&lt;/div&gt;&lt;br /&gt;&lt;h3&gt;2. Change the SSID name&lt;/h3&gt;&lt;br /&gt;&lt;p&gt;&lt;strong&gt;SSID (Service Set Identifier)&lt;/strong&gt; refers to the name of&lt;br /&gt;your wireless connection, that you see on the “Available Wireless&lt;br /&gt;Connections” list from your laptop while connecting.  Changing the&lt;br /&gt;wireless name itself doesn’t offer any protection, but usually&lt;br /&gt;discourages a hacker, as they know that you’ve taken some steps to&lt;br /&gt;secure your wireless connection. Click on &lt;em&gt;Wireless -&amp;gt; Basic wireless settings -&amp;gt; Change the “Wireless Network Name (SSID):”&lt;/em&gt;, as shown in the Fig-2.&lt;/p&gt;&lt;br /&gt;&lt;h3&gt;3. Disable SSID broadcast&lt;/h3&gt;&lt;br /&gt;&lt;p&gt;You can avoid your wireless name from getting displayed on&lt;br /&gt;“Available Wireless Connections” on all your neighbors laptop. This can&lt;br /&gt;be done by instructing the wireless router not to broadcast the name to&lt;br /&gt;everybody. Once you’ve disabled the SSID broadcast, the first time when&lt;br /&gt;someone wants to connect to your wireless network, you need to provide&lt;br /&gt;the name to them. Click on &lt;em&gt;Wireless -&amp;gt; Basic wireless settings -&amp;gt; Click on the Disable radio-button next to “Wireless SSID Broadcast”&lt;/em&gt;, as shown in Fig-2.&lt;/p&gt;&lt;br /&gt;&lt;div style='text-align: center;'&gt;&lt;img width='340' height='214' alt='Disable SSID Broadcast' src='http://www.thegeekstuff.com/wp-content/uploads/2008/08/2-change-ssid-name.jpg' title='Disable SSID Broadcast' class='aligncenter size-full wp-image-124'/&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style='text-align: center;'&gt;Fig-2: Change SSID Name and Disable Broadcast&lt;/div&gt;&lt;br /&gt;&lt;h3&gt;4. Enable MAC filtering&lt;/h3&gt;&lt;br /&gt;&lt;p&gt;Even after you have performed the above item#1 - #3, a very&lt;br /&gt;determined hacker may still get access to your network. The next&lt;br /&gt;security step is to allow wireless access only to your trusted laptops,&lt;br /&gt;by allowing wireless connection only to known MAC address. &lt;strong&gt;MAC (Media Access Control) address&lt;/strong&gt;&lt;br /&gt;is an unique identifier attached to most network adapters. In this&lt;br /&gt;case, this should be the unique identifier of your laptop wireless&lt;br /&gt;adapter.  On Linux, do &lt;strong&gt;ifconfig&lt;/strong&gt; from the command prompt to get wireless hardware address. On windows, do &lt;strong&gt;ipconfig /all&lt;/strong&gt; from the command prompt to identify the MAC address as shown below.&lt;/p&gt;&lt;br /&gt;&lt;pre&gt;C:&amp;gt;ipconfig /all&amp;lt;br /&amp;gt;Ethernet adapter Wireless Network Connection:&amp;lt;br /&amp;gt;Connection-specific DNS Suffix  . : socal.rr.com&amp;lt;br /&amp;gt;Description . . . . . . . . . . . : Dell Wireless 1390 WLAN Mini-Card&amp;lt;br /&amp;gt;Physical Address. . . . . . . . . : &amp;lt;strong&amp;gt;00:1A:92:2B:70:B6&amp;lt;/strong&amp;gt;&lt;/pre&gt;&lt;br /&gt;&lt;p align='left'&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Click on &lt;em&gt;Wireless -&amp;gt; Wireless MAC filter -&amp;gt; Click on&lt;br /&gt;Enable radio-button next to “Wireless MAC filter” -&amp;gt; Click on&lt;br /&gt;“Permit only PCs listed to access the wireless network” radio-button&lt;/em&gt;, as shown in Fig-3.&lt;/p&gt;&lt;br /&gt;&lt;div style='text-align: center;'&gt;&lt;img width='424' height='244' alt='Enable MAC Filter' src='http://www.thegeekstuff.com/wp-content/uploads/2008/08/3-enable-mac-filter.jpg' title='Enable MAC Filter' class='aligncenter size-full wp-image-125'/&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style='text-align: center;'&gt;Fig-3 Enable Wireless MAC Filter&lt;/div&gt;&lt;br /&gt;&lt;p&gt;&lt;code&gt;&lt;br/&gt;&lt;br /&gt;&lt;/code&gt;&lt;br/&gt;&lt;br /&gt;Click on &lt;em&gt;Edit MAC filter list&lt;/em&gt; and add the MAC&lt;br /&gt;address of your laptop to this list. If you want to allow access to&lt;br /&gt;more than one laptop, add the MAC address of all the laptops to this&lt;br /&gt;list as shown in Fig-4 and click on &lt;em&gt;“Save Settings”&lt;/em&gt;.&lt;/p&gt;&lt;br /&gt;&lt;div style='text-align: center;'&gt;&lt;img width='438' height='176' alt='Add MAC Address List' src='http://www.thegeekstuff.com/wp-content/uploads/2008/08/3-add-mac-address-list.jpg' title='Add MAC Address List' class='alignnone size-full wp-image-126'/&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style='text-align: center;'&gt;Fig-4 Add MAC Address to the list&lt;/div&gt;&lt;br /&gt;&lt;h3&gt;5. Change password for Web Access&lt;/h3&gt;&lt;br /&gt;&lt;p&gt;The default password for wireless web access are the same for the&lt;br /&gt;specific model of a wireless router assigned by the manufacturer.&lt;br /&gt;Change the default password of the wireless router web access to a&lt;br /&gt;strong password. Click on &lt;em&gt;Administration -&amp;gt; Management&lt;/em&gt;, to change the password as shown in Fig-5 below.&lt;/p&gt;&lt;br /&gt;&lt;div style='text-align: center;'&gt;&lt;img width='500' height='225' alt='Disable Wireless Web Access' src='http://www.thegeekstuff.com/wp-content/uploads/2008/08/5-disable-wireless-web-access.jpg' title='Disable Wireless Web Access' class='aligncenter size-full wp-image-129'/&gt;&lt;/div&gt;&lt;br /&gt;&lt;p style='text-align: center;'&gt;Fig-5 Change password and disable wireless web access&lt;/p&gt;&lt;br /&gt;&lt;h3&gt;6. Disable administrative access through web&lt;/h3&gt;&lt;br /&gt;&lt;p&gt;As a final step, make sure to disable web administrative access&lt;br /&gt;through wireless. Once you do this, to make any configuration changes&lt;br /&gt;to the wireless router, you can always use ethernet cable connection&lt;br /&gt;from your laptop to configure the wireless.  Click on &lt;em&gt;Administration -&amp;gt; Management -&amp;gt; Disable radio-button next to “Wireless Access Web”, &lt;/em&gt;as shown in Fig-5 above.&lt;/p&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2589537411099484208-5923602733576156987?l=dontburnmybeans.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dontburnmybeans.blogspot.com/feeds/5923602733576156987/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2589537411099484208&amp;postID=5923602733576156987' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2589537411099484208/posts/default/5923602733576156987'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2589537411099484208/posts/default/5923602733576156987'/><link rel='alternate' type='text/html' href='http://dontburnmybeans.blogspot.com/2008/08/6-steps-to-secure-your-home-wireless.html' title='6 Steps to Secure Your Home Wireless Network'/><author><name>Jamtech</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/-RNwpfmrDdPU/Tn1tpZWh2zI/AAAAAAAAAHg/ICZaej4kWOk/s220/hitmana3_2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2589537411099484208.post-4469791644809858166</id><published>2008-07-10T23:45:00.001-07:00</published><updated>2009-04-18T21:33:16.965-07:00</updated><title type='text'>Bringing the trashcan to the command line</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;&lt;div id='main'&gt;&lt;br /&gt;&lt;h1&gt;&lt;br /&gt;       &lt;a title='Linux.com' href='http://www.linux.com/'&gt;&lt;br /&gt;            &lt;span&gt;Linux.com&lt;/span&gt;&lt;br /&gt;       &lt;/a&gt;&lt;br /&gt;   &lt;/h1&gt;&lt;br /&gt;   &lt;p id='xc-slogan'&gt;&lt;br /&gt;Everything Linux and Open Source    &lt;/p&gt;&lt;br /&gt;    &lt;div class='xar-standard-box-padding'&gt;&lt;br /&gt;        &lt;h2&gt;&lt;br /&gt;            Bringing the trashcan to the command line&lt;/h2&gt;&lt;br /&gt;       &lt;div class='xar-article-details'&gt;&lt;br /&gt;June 17, 2008 (9:00:00 AM)	         &lt;small&gt; -  3 weeks, 2 days ago&lt;/small&gt;&lt;br /&gt;            &lt;p&gt;&lt;br /&gt;                By: &lt;a href='http://monkeyiq.blogspot.com/'&gt;Ben Martin&lt;/a&gt;&lt;br /&gt;            &lt;/p&gt;&lt;br /&gt;       &lt;/div&gt;&lt;br /&gt;       &lt;div class='xar-clearleft'&gt;&lt;br /&gt;           &lt;p&gt;The &lt;a href='http://www.andreafrancia.it/trash/'&gt;trash&lt;/a&gt;&lt;br /&gt;project allows you to interact with your desktop trashcan from the&lt;br /&gt;command line. It lets users "undo" deletions made with the trash&lt;br /&gt;command in a similar manner to restoring files from the trashcan in a&lt;br /&gt;desktop environment. For experienced Linux users, the trash command&lt;br /&gt;comes in handy when you want to put a file into the trashcan from the&lt;br /&gt;command line.&lt;/p&gt;       &lt;/div&gt;&lt;br /&gt;           &lt;p&gt;Because trash implements the FreeDesktop.org &lt;a href='http://freedesktop.org/wiki/Specifications/trash-spec'&gt;Trash Specification&lt;/a&gt;,&lt;br /&gt;it plays nicely with the trashcan offered by the KDE desktop&lt;br /&gt;environment. That means you can trash a directory from the command line&lt;br /&gt;and see it in your trashcan from Konqueror. Unfortunately, the trash&lt;br /&gt;implementation in GNOME 2.20 did not communicate with either KDE 3.5.8&lt;br /&gt;or the trash command.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Installation&lt;/h4&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Trash is not available from the distribution repositories for&lt;br /&gt;Ubuntu, Fedora, or openSUSE. I built version 0.1.10 from source on a&lt;br /&gt;64-bit Fedora 8 machine. Trash is written in Python, so build and&lt;br /&gt;installation follows the normal &lt;code&gt;python setup.py install&lt;/code&gt; procedure.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;When you use the list-trash command to view the contents of your&lt;br /&gt;trashcan, you might encounter an error if you are also using the Linux&lt;br /&gt;Logical Volume Manager (&lt;a href='http://tldp.org/HOWTO/LVM-HOWTO/'&gt;LVM&lt;/a&gt;).&lt;br /&gt;Version 0.1.10 of trash uses the df command to work out what&lt;br /&gt;filesystems are available. Unfortunately, it invokes df without the&lt;br /&gt;POSIX compatibility mode &lt;code&gt;-P&lt;/code&gt;, and as such the lines&lt;br /&gt;specifying LVM devices will include line breaks where trash does not&lt;br /&gt;expect them to be. You can fix this by changing line 460 of&lt;br /&gt;/usr/lib/python2.5/site-packages/libtrash.py to include the &lt;code&gt;-P&lt;/code&gt; option when spawning the df command, as shown below:&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&amp;lt;div class="code"&amp;gt;&amp;lt;br /&amp;gt;       else:&amp;lt;br /&amp;gt;          df_file=os.popen('df &amp;lt;b&amp;gt;-P&amp;lt;/b&amp;gt;')&amp;lt;br /&amp;gt;          while True:&amp;lt;br /&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;p&amp;gt;I also found an issue executing some trash commands when using bind&lt;br /&gt;mounts to mount filesystems in two locations. The commands would simply&lt;br /&gt;fail with &amp;lt;code&amp;gt;ValueError: path is not a mount point&amp;lt;/code&amp;gt;, not informing which path is not a mount point or what you should do to fix the situation.&amp;lt;/p&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;h4&amp;gt;Usage&amp;lt;/h4&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;p&amp;gt;The trash project includes four commands: empty-trash, list-trash,&lt;br /&gt;restore-trash, and trash, the latter being the main command, with the&lt;br /&gt;others enabling full trashcan interaction from the command line. The&lt;br /&gt;only two commands that accept command-line parameters are empty-trash&lt;br /&gt;and trash. The empty-trash command accepts a single argument that&lt;br /&gt;specifies a cutoff for the number of days old that a trash item can be.&lt;br /&gt;For example, If you specify 7, then any items in your trashcan older&lt;br /&gt;than a week will be deleted. The trash command takes the files and&lt;br /&gt;directory names that you wish to put into your trashcan, and also&lt;br /&gt;accepts &amp;lt;code&amp;gt;-d&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;-f&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;-i&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;-r&amp;lt;/code&amp;gt;&lt;br /&gt;options for compatibility with the rm(1) command. These last four&lt;br /&gt;options don't actually do anything with the trash command apart from&lt;br /&gt;make its invocation more familiar to users of the rm command.&amp;lt;/p&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;p&amp;gt;Let's run through an example of how to use the trash commands:&amp;lt;/p&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;pre&amp;gt;&amp;lt;div class="code"&amp;gt;&amp;lt;br /&amp;gt;$ mkdir trashdir1&amp;lt;br /&amp;gt;$ date &amp;gt;trashdir1/dfa.txt&amp;lt;br /&amp;gt;$ date &amp;gt;trashdir1/dfb.txt&amp;lt;br /&amp;gt;$ list-trash &amp;lt;br /&amp;gt;$ trash  trashdir1&amp;lt;br /&amp;gt;$ list-trash &amp;lt;br /&amp;gt;2008-06-10 15:03:11 /home/ben/trashdir1&amp;lt;br /&amp;gt;$ mkdir trashdir1&amp;lt;br /&amp;gt;$ date &amp;gt;trashdir1/dfc.txt&amp;lt;br /&amp;gt;$ trash trashdir1&amp;lt;br /&amp;gt;$ list-trash &amp;lt;br /&amp;gt;2008-06-10 15:04:01 /home/ben/trashdir1&amp;lt;br /&amp;gt;2008-06-10 15:03:11 /home/ben/trashdir1&amp;lt;br /&amp;gt;$ restore-trash &amp;lt;br /&amp;gt;   0 2008-06-10 15:04:01 /home/ben/trashdir1&amp;lt;br /&amp;gt;   1 2008-06-10 15:03:11 /home/ben/trashdir1&amp;lt;br /&amp;gt;What file to restore [0..1]: 0&amp;lt;br /&amp;gt;$ l trashdir1/&amp;lt;br /&amp;gt;total 8.0K&amp;lt;br /&amp;gt;-rw-rw-r-- 1 ben ben 29 2008-06-10 15:03 dfc.txt&amp;lt;br /&amp;gt;&amp;lt;/div&amp;gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;As you can see, it is perfectly valid for multiple items in the&lt;br /&gt;trashcan to have the same file name and have been deleted from the same&lt;br /&gt;directory. Here I restored only the latest trashdir1 that was moved to&lt;br /&gt;the trashcan.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;The restore-trash command must be executed in the directory of the&lt;br /&gt;trashed file. The above commands were all executed in my home&lt;br /&gt;directory; if I had been in /tmp and executed restore-trash, I would&lt;br /&gt;not have seen /home/ben/trashdir1 as a restore option. At times it&lt;br /&gt;might be misleading to execute restore-trash and be told that there are&lt;br /&gt;"No trashed files." Perhaps the developers should expand this message&lt;br /&gt;to inform you that there are "No trashed files for directory X" so that&lt;br /&gt;you have a hint that you should be in the directory that the file was&lt;br /&gt;deleted from before executing restore-trash. For scripting it might&lt;br /&gt;also be convenient to be able to use restore-trash with a path and have&lt;br /&gt;it restore the most recent file or directory with that name.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;While the command-line options to the trash commands are currently&lt;br /&gt;fairly spartan, the ability to interact with the same trashcan that KDE&lt;br /&gt;3 is using from the command line can assist folks getting into&lt;br /&gt;command-line interaction without stepping up to using the more&lt;br /&gt;permanent &lt;code&gt;rm&lt;/code&gt; command right off the bat.&lt;/p&gt;&lt;div style=''&gt;&lt;br /&gt;            &lt;br /&gt;      &lt;/div&gt;&lt;br /&gt;&lt;br /&gt;       &lt;div style='padding-top: 10px;' class='xar-align-left'&gt;&lt;br /&gt;Read in the original layout at: &lt;a href='http://www.linux.com/feature/138331'&gt;http://www.linux.com/feature/138331&lt;/a&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;        &lt;/p&gt;&lt;/div&gt;&lt;br /&gt;   &lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2589537411099484208-4469791644809858166?l=dontburnmybeans.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dontburnmybeans.blogspot.com/feeds/4469791644809858166/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2589537411099484208&amp;postID=4469791644809858166' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2589537411099484208/posts/default/4469791644809858166'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2589537411099484208/posts/default/4469791644809858166'/><link rel='alternate' type='text/html' href='http://dontburnmybeans.blogspot.com/2008/07/bringing-trashcan-to-command-line.html' title='Bringing the trashcan to the command line'/><author><name>Jamtech</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/-RNwpfmrDdPU/Tn1tpZWh2zI/AAAAAAAAAHg/ICZaej4kWOk/s220/hitmana3_2.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2589537411099484208.post-5329790370952979083</id><published>2008-07-10T23:43:00.001-07:00</published><updated>2009-04-18T21:33:16.970-07:00</updated><title type='text'>Kudos to openSUSE 11.0</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;&lt;div id='main'&gt;&lt;br /&gt;&lt;h1&gt;&lt;br /&gt;       &lt;a title='Linux.com' href='http://www.linux.com/'&gt;&lt;br /&gt;            &lt;span&gt;Linux.com&lt;/span&gt;&lt;br /&gt;       &lt;/a&gt;&lt;br /&gt;   &lt;/h1&gt;&lt;br /&gt;   &lt;p id='xc-slogan'&gt;&lt;br /&gt;Everything Linux and Open Source    &lt;/p&gt;&lt;br /&gt;    &lt;div class='xar-standard-box-padding'&gt;&lt;br /&gt;        &lt;h2&gt;&lt;br /&gt;            Kudos to openSUSE 11.0&lt;/h2&gt;&lt;br /&gt;       &lt;div class='xar-article-details'&gt;&lt;br /&gt;June 20, 2008 (4:00:00 PM)	         &lt;small&gt; -  2 weeks, 6 days ago&lt;/small&gt;&lt;br /&gt;            &lt;p&gt;&lt;br /&gt;                By: &lt;a href='mailto:srlinuxx@gmail.com'&gt;Susan Linton&lt;/a&gt;&lt;br /&gt;            &lt;/p&gt;&lt;br /&gt;       &lt;/div&gt;&lt;br /&gt;       &lt;div class='xar-clearleft'&gt;&lt;br /&gt;           &lt;p&gt;&lt;a href='http://en.opensuse.org/Welcome_to_openSUSE.org'&gt;openSUSE 11.0&lt;/a&gt;&lt;br /&gt;was one of the most anticipated Linux distro releases of 2008. Despite&lt;br /&gt;a few bugs in the final code, which was released yesterday, it was&lt;br /&gt;worth the wait. The openSUSE version of KDE 4 alone is worth the&lt;br /&gt;download, and the improvements to the software manager make customizing&lt;br /&gt;a pleasure.&lt;/p&gt;        &lt;/div&gt;&lt;br /&gt;           &lt;p&gt;&lt;br /&gt;I used the 4.3GB DVD version, but live CD versions are also available.&lt;br /&gt;In either, the first thing you might notice is the beautiful new&lt;br /&gt;installer. The layout is similar to that of previous versions, with a&lt;br /&gt;large interactive window and a progress list to the right, but with an&lt;br /&gt;elegant new color scheme and stylish graphics. And the beauty is not&lt;br /&gt;only skin deep -- there are a lot of changes under the hood in this&lt;br /&gt;release.&lt;br /&gt;&lt;/p&gt;&lt;br /&gt; &lt;br /&gt;&lt;p&gt;The openSUSE developers have made many improvements to save users&lt;br /&gt;time and effort. A new "Installation from Images" option uses a defined&lt;br /&gt;set of packages in an install image for many common package groups,&lt;br /&gt;such as the GNOME desktop. Using this saves users from having to&lt;br /&gt;organize the needed packages and resolve the dependencies at the time&lt;br /&gt;of the system installation. It's a feature users can disable if they&lt;br /&gt;wish, but it does seem to save some install time.&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;At the beginning of the install process you can tick "Use Automatic&lt;br /&gt;Configuration." In other distributions, similarly worded phrases can&lt;br /&gt;turn off hardware auto-detection and lead to long, agonizing&lt;br /&gt;configurations. Wanting to avoid that fate, I checked the box, but as&lt;br /&gt;it turns out, this setting merely bypasses the hardware confirmation&lt;br /&gt;screen where users normally accept the auto-detected proposal or custom&lt;br /&gt;configure their hardware. For users who normally agree to the proposed&lt;br /&gt;settings, this saves time and clicks.&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;a title='OpenSUSE 11.0' class='thickbox' href='http://www.linux.com/var/uploads/Image/articles/139073-1.jpg'&gt;&lt;br /&gt;&lt;img align='right' title='Click to enlarge' src='http://www.linux.com/var/uploads/Image/articles/139073-1-thumb.jpg'/&gt;&lt;br /&gt;&lt;/a&gt;Automatic Configuration does not bypass the installation summary.&lt;br /&gt;You can still change many options, such as the partitioning proposal.&lt;br /&gt;openSUSE presents the user with a proposed partitioning layout, but you&lt;br /&gt;can edit the configuration to your needs. For example, you can make a&lt;br /&gt;new partition or choose one that is already present. You can even use&lt;br /&gt;advanced options such as LVM and RAID.&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;During the DVD install you can choose your desktop envirnoment from&lt;br /&gt;among GNOME, KDE 4, KDE 3, Xfce, and Others, listed in alphabetical&lt;br /&gt;order. Some other desktops available for install include Enlightenment,&lt;br /&gt;IceWM, FVWM, and Window Maker. These less popular desktops don't&lt;br /&gt;include the openSUSE look. They are provided as released by the&lt;br /&gt;upstream developers.&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;No desktop environment is selected by default -- you must choose&lt;br /&gt;one. At the installation summary screen, you can click the Software&lt;br /&gt;heading to select additional desktop environments and software if&lt;br /&gt;desired.&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;The package selection screens haven't changed much in function on&lt;br /&gt;the surface, but they too have received a facelift. You can still&lt;br /&gt;search or choose packages by groups, package patterns, or individually.&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;To save another step during the install the openSUSE developers&lt;br /&gt;decided that the first user and root would share the same password.&lt;br /&gt;They believe that a large percentage of users use the same password for&lt;br /&gt;the first user and root, but if you have security concerns, it's easy&lt;br /&gt;to change the root password later.&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;OpenSUSE has always had one of the premier installers in the Linux&lt;br /&gt;landscape, and the developers have worked hard to make it even better&lt;br /&gt;in 11.0. Besides the items I specifically mentioned, there are little&lt;br /&gt;changes all over that make it more streamlined and easier than ever.&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Because of its many desktop options, openSUSE is like several&lt;br /&gt;distributions in one. Here's a look at each of the major desktop&lt;br /&gt;environments.&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;h4&gt;KDE and Xfce&lt;/h4&gt;&lt;br /&gt;&lt;p&gt;KDE 3.5.9 and Xfce 4.4.2 are stable, old-reliable desktops, and they&lt;br /&gt;functioned just as expected with no problems. Like the other major&lt;br /&gt;openSUSE desktops, they are customized to give them an openSUSE look&lt;br /&gt;and feel. In fact, the gray and green theme runs throughout the whole&lt;br /&gt;of openSUSE, including the GRUB screen, login screen, and application&lt;br /&gt;splash screens, which gives the desktop a uniform professional touch.&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;At first glance, little distinguishes KDE 4 from KDE 3 -- which is a&lt;br /&gt;good thing. Instead of a clunky, buggy Vista clone, users are welcomed&lt;br /&gt;into a familiar reassuring environment. KDE 4 in openSUSE is an tidy&lt;br /&gt;understated desktop with a panel at the bottom, a few icons, the&lt;br /&gt;Kickoff menu, and the widget creator in the upper right corner.&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;  &lt;br /&gt;&lt;p&gt;In addition to the comfortable environment, many KDE applications&lt;br /&gt;are now ported or backported to KDE 4.04 in openSUSE. I was able to&lt;br /&gt;import mbox mail files as well as KDE 3 maildir-format files into KMail&lt;br /&gt;1.9.51. Likewise, I was able to import my news feeds into Akregator&lt;br /&gt;1.2.50. Both of these functioned well, except Akregator was a bit&lt;br /&gt;sluggish during fetches under the weight of my 700+ feeds. I was able&lt;br /&gt;to just drop my Konqueror bookmark file into the .kde4 directory. It&lt;br /&gt;appears that for all the improvements KDE 4 is supposed to bring, Flash&lt;br /&gt;is still broken in Konqueror, although this is probably a universal in&lt;br /&gt;KDE and not confined to openSUSE.&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;When inserting removable media under KDE 4, the New Device Notifier&lt;br /&gt;located in the panel beside the clock opens with a list of devices.&lt;br /&gt;Depending upon the media, you may be given a choice of actions or have&lt;br /&gt;one default. For example, a data CD gives only "Open in Dolphin," while&lt;br /&gt;a USB memory stick opens an action chooser. Beside each device is an&lt;br /&gt;icon that will umount or eject the device.&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Overall I was impressed with the usability and stability found in&lt;br /&gt;openSUSE's KDE 4 implementation. I began experiencing crashes only&lt;br /&gt;while exploring the Personal Settings module (Systemsettings, the&lt;br /&gt;replacement for the KDE Control Center) and changing numerous settings&lt;br /&gt;and reversing them back and forth. This is when I discovered that you&lt;br /&gt;need to press Ctrl-Alt-Backspace twice to kill the X server. This is&lt;br /&gt;the first time I've needed to do this in openSUSE.&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;h4&gt;GNOME 2.22&lt;/h4&gt;&lt;br /&gt;&lt;p&gt;I experienced some issues with the GNOME desktop. It started just&lt;br /&gt;fine and seemed functional during the first tests. Problems arose when&lt;br /&gt;I tested the update applet. When I was adding a repository, the online&lt;br /&gt;update utility crashed and left most of GNOME unresponsive. When I left&lt;br /&gt;the GNOME desktop, the login screen font was scrambled or not fully&lt;br /&gt;rendered. I logged back into GNOME, but the font problem persisted. I&lt;br /&gt;tried to log out again, but now the Logout tool didn't function any&lt;br /&gt;longer.&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;  &lt;br /&gt;&lt;p&gt;After rebooting the system, GNOME seemed to function normally, but&lt;br /&gt;the update applet never returned to the panel. Running Online Update&lt;br /&gt;configuration through the YaST Control Center in GNOME continued to&lt;br /&gt;crash, and thus the Online Update tool would not function. However, the&lt;br /&gt;update applet did continue to appear in the KDE desktops afterward, and&lt;br /&gt;I was able to complete configuration and check for updates while in&lt;br /&gt;KDE.&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;h4&gt;Hardware support&lt;/h4&gt;&lt;br /&gt;&lt;p&gt;Though I had some problems with software in different desktop&lt;br /&gt;environments, hardware support in Linux has all but become a non-issue,&lt;br /&gt;and this is even more true with openSUSE. While I don't own any exotic&lt;br /&gt;or bleeding-edge hardware, what I do have is well supported. For&lt;br /&gt;example, my Hewlett-Packard laptop, which was designed for Windows, is&lt;br /&gt;almost fully supported. The only exception is the wireless Ethernet&lt;br /&gt;chip, which requires Windows drivers. I used Ndiswrapper in 11.0 to&lt;br /&gt;extract and load the drivers to bring it to life. Other critical laptop&lt;br /&gt;features were available by default, although Suspend to RAM didn't work&lt;br /&gt;for me.&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Sometimes, though, my Internet connection, which was configured to&lt;br /&gt;start at boot, wouldn't be started. The KNetwork Manager didn't&lt;br /&gt;function for me this release either. The GNOME network applet seemed to&lt;br /&gt;work well, however, so as a workaround, I just used it in KDE too.&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;h4&gt;Software&lt;/h4&gt;&lt;br /&gt;&lt;p&gt;openSUSE is what I commonly refer to as a "kitchen sink" distro&lt;br /&gt;because it includes everything but the kitchen sink. It'd almost be&lt;br /&gt;easier to list what it doesn't have than what it does.&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Besides a few extra desktops and the kernel development packages, my&lt;br /&gt;install consisted of the default package selection. This includes&lt;br /&gt;Firefox 3.0b5, OpenOffice.org 2.4.0, GIMP 2.4.5, Inkscape, Pidgin,&lt;br /&gt;Liferea, Ekiga, GnuCash, Evolution, Tasque, and KOffice.&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;openSUSE also includes the lastest Compiz Fusion. AIGLX, which&lt;br /&gt;provides GL-accelerated effects on desktops, should be enabled by&lt;br /&gt;default for those with supported hardware. That unfortunately leaves&lt;br /&gt;Nvidia users out until they install the proprietary graphic drivers.&lt;br /&gt;However, there are graphical configuration tools for enabling and&lt;br /&gt;setting options such as the choice of profile. You can choose profiles&lt;br /&gt;ranging from lightweight with few effects to full with lots of effects.&lt;br /&gt;The CompizConfig Settings Manager provides deeper settings. In&lt;br /&gt;addition, there are lots of great plugins included, such as the&lt;br /&gt;Magnifier, Window Scaling, and Show Mouse.&lt;br /&gt;&lt;/p&gt;&lt;br /&gt; &lt;br /&gt;&lt;p&gt;&lt;br /&gt;Under the hood openSUSE 11.0 ships with Linux-2.6.25.5, X.Org X Server 1.4.0.90, Xorg-X11 7.3, and GCC 4.3.1 20080507.&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;h4&gt;Multimedia&lt;/h4&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;Multimedia support is a bit lacking in openSUSE by default. &lt;a href='http://en.opensuse.org/Restricted_Formats'&gt;openSUSE has a policy&lt;/a&gt; of excluding certain code that does not conform to the &lt;a href='http://www.opensource.org/docs/osd'&gt;open source definition&lt;/a&gt;&lt;br /&gt;and, unfortunately, that includes support for most multimedia formats.&lt;br /&gt;openSUSE 11.0 includes the just released Banshee 1.0, Amarok 1.4.9.1,&lt;br /&gt;K3b, Brasero, Totem, and Kaffeine. I could listen to an audio CD and&lt;br /&gt;watch Flash content from the Web, but I couldn't use any other&lt;br /&gt;multimedia file on hand.&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;However, community-provided solutions are already in place. &lt;a href='http://opensuse-community.org/Multimedia#openSUSE_11.0_or_10.3'&gt;YaST one-click install wizards&lt;/a&gt;&lt;br /&gt;will add repositories and install support for popular audio and video&lt;br /&gt;formats. After installing the codecs, libraries, and updated&lt;br /&gt;applications, I was able to enjoy any video or audio file I tested. I&lt;br /&gt;sometimes experienced crashes in Banshee while trying to adjust the&lt;br /&gt;volume. The problem was reproducible, but not consistent. I can't seem&lt;br /&gt;to get Amarok to recognize my CD-ROM drive either, but I can use KsCD&lt;br /&gt;or Banshee instead to listen to audio CDs.&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;h4&gt;Software management&lt;/h4&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a title='YaST software management' class='thickbox' href='http://www.linux.com/var/uploads/Image/articles/139073-2.jpg'&gt;&lt;br /&gt;&lt;img align='right' title='Click to enlarge' src='http://www.linux.com/var/uploads/Image/articles/139073-2-thumb.jpg'/&gt;&lt;br /&gt;&lt;/a&gt;If you'd like to install additional software, openSUSE comes with a&lt;br /&gt;powerful package management system. ZYpp, which utilizes the &lt;a href='http://www.rpm.org/'&gt;RPM Package Management&lt;/a&gt;&lt;br /&gt;format, was completely rewritten during the 10.x series, and 11.0&lt;br /&gt;brings even more improvement. To the end user this means better&lt;br /&gt;dependency resolution and much faster performance.&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Zypper, the command-line package manager, functions much like&lt;br /&gt;apt-get does for APT. It can install, uninstall, update repositories,&lt;br /&gt;upgrade the system, or update packages. For example, zypper install&lt;br /&gt;crack-attack will install the game Crack Attack. zypper search tuxpaint&lt;br /&gt;will see if Tuxpaint is available in the openSUSE repositories you have&lt;br /&gt;configured. Some other arguments include remove, addrepo, update, and&lt;br /&gt;dist-upgrade.&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Those who prefer graphical tools are in for a treat. The YaST&lt;br /&gt;package management front ends have gotten a facelift this release. It&lt;br /&gt;comes in a Qt version for KDE desktops and a GTK version for GNOME&lt;br /&gt;users. Using YaST simplifies software installation for users of all&lt;br /&gt;experience levels. It just takes a few mouse clicks to install any&lt;br /&gt;package.&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;  &lt;br /&gt;&lt;p&gt;In my testing, I found that both the command line and the graphical&lt;br /&gt;package tools worked well and were much faster than in previous&lt;br /&gt;releases. My only complaint is that the YaST GUI still refreshes the&lt;br /&gt;repository databases automatically each time it is opened. Fortunately,&lt;br /&gt;in this release there is a Skip Refresh button, but with the speed&lt;br /&gt;improvements it's usually half done by the time I grab the mouse and&lt;br /&gt;click it.&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;h4&gt;Conclusions&lt;/h4&gt;&lt;br /&gt;&lt;p&gt;openSUSE 11.0 is a fabulous release. The pretty new graphics set the&lt;br /&gt;stage for significant improvements under the surface. All the time and&lt;br /&gt;energy put into the package management system has paid off. Including&lt;br /&gt;KDE 4 is not as big of a risk for openSUSE as it might be for other&lt;br /&gt;major distributions because of the conservative and intuitive way KDE 4&lt;br /&gt;is set up. openSUSE has given me hope that I could actually like KDE 4.&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;As many point-0 releases, 11.0 does have bugs and rough edges. I&lt;br /&gt;experienced a few, and others are likely to be reported in the upcoming&lt;br /&gt;weeks. For the most part, the ones I encountered were insignificant,&lt;br /&gt;not showstoppers.&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Overall, 11.0 is a commendable release. The developers have done an&lt;br /&gt;admirable job walking that fine line between stable and bleeding edge.&lt;br /&gt;If you like the latest software or wish for a nice usable KDE 4, then&lt;br /&gt;openSUSE 11.0 is for you. If you're completely happy with 10.3, well,&lt;br /&gt;perhaps you might want to wait for further reports.&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;div style=''&gt;&lt;br /&gt;            &lt;br /&gt;      &lt;/div&gt;&lt;br /&gt;&lt;br /&gt;       &lt;div style='padding-top: 10px;' class='xar-align-left'&gt;&lt;br /&gt;Read in the original layout at: &lt;a href='http://www.linux.com/feature/139073'&gt;http://www.linux.com/feature/139073&lt;/a&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;        &lt;/p&gt;&lt;/div&gt;&lt;br /&gt;   &lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2589537411099484208-5329790370952979083?l=dontburnmybeans.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dontburnmybeans.blogspot.com/feeds/5329790370952979083/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2589537411099484208&amp;postID=5329790370952979083' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2589537411099484208/posts/default/5329790370952979083'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2589537411099484208/posts/default/5329790370952979083'/><link rel='alternate' type='text/html' href='http://dontburnmybeans.blogspot.com/2008/07/kudos-to-opensuse-110.html' title='Kudos to openSUSE 11.0'/><author><name>Jamtech</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/-RNwpfmrDdPU/Tn1tpZWh2zI/AAAAAAAAAHg/ICZaej4kWOk/s220/hitmana3_2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2589537411099484208.post-7654580262814239903</id><published>2008-07-10T23:42:00.001-07:00</published><updated>2009-04-18T21:31:52.434-07:00</updated><title type='text'>Build your own ultimate boot disc</title><content type='html'>&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;&lt;div id="main"&gt;&lt;br /&gt;&lt;h1&gt;&lt;br /&gt;      &lt;a title="Linux.com" href="http://www.linux.com/"&gt;&lt;br /&gt;           &lt;span&gt;Linux.com&lt;/span&gt;&lt;br /&gt;      &lt;/a&gt;&lt;br /&gt;  &lt;/h1&gt;&lt;br /&gt;  &lt;p id="xc-slogan"&gt;&lt;br /&gt;Everything Linux and Open Source    &lt;/p&gt;&lt;br /&gt;   &lt;div class="xar-standard-box-padding"&gt;&lt;br /&gt;       &lt;h2&gt;&lt;br /&gt;           Build your own ultimate boot disc&lt;/h2&gt;&lt;br /&gt;      &lt;div class="xar-article-details"&gt;&lt;br /&gt;June 25, 2008 (4:00:00 PM)          &lt;small&gt; -  2 weeks, 1 day ago&lt;/small&gt;&lt;br /&gt;           &lt;p&gt;&lt;br /&gt;               By: &lt;a href="mailto:kedelbrock@gmail.com"&gt;Kurt Edelbrock&lt;/a&gt;&lt;br /&gt;           &lt;/p&gt;&lt;br /&gt;      &lt;/div&gt;&lt;br /&gt;      &lt;div class="xar-clearleft"&gt;&lt;br /&gt;          &lt;p&gt;You&lt;br /&gt;turn on your trusty old Linux box, and things are going well as you&lt;br /&gt;pass through the boot loader, until the disk check reveals that your&lt;br /&gt;hard drive partition table is corrupt, and you are unable to access&lt;br /&gt;your machine. You need a good rescue disk -- and the best way to get&lt;br /&gt;one is to create your own.&lt;/p&gt;       &lt;/div&gt;&lt;br /&gt;          &lt;p&gt;You can&lt;br /&gt;customize an Ubuntu 8.04 Hardy Heron live CD to make a good bootable&lt;br /&gt;utilities disk by adding and removing packages from the standard&lt;br /&gt;installation. Specifically, you can remove most of the Ubuntu&lt;br /&gt;applications and install antivirus, a partition recover tool, a few&lt;br /&gt;disk utilities, and a rootkit checker, among other things. I'm going to&lt;br /&gt;create the live CD within an Ubuntu installation, but the directions&lt;br /&gt;should work for most Debian-based operating systems, and can be easily&lt;br /&gt;ported elsewhere. This guide largely follows the &lt;a href="https://help.ubuntu.com/community/LiveCDCustomization"&gt;community documentation article&lt;/a&gt;&lt;br /&gt;on the Ubuntu customization process, which is a good place to look for&lt;br /&gt;more advanced information and troubleshooting support, while the &lt;a href="http://www.livecdlist.com/wiki/index.php/LiveCD_Creation_Resources"&gt;livecdlist.com wiki&lt;/a&gt; is the best place to look for customized directions. &lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;To create and use the Ubuntu-based boot CD, you'll need a computer&lt;br /&gt;with at least 3GB of disk space and 512MB RAM. 1GB of swap is&lt;br /&gt;recommended, though I did it with 512 MB.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Create the live CD environment&lt;/h4&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;The first step is to &lt;a href="http://releases.ubuntu.com/hardy/"&gt;download&lt;/a&gt;&lt;br /&gt;the Ubuntu 8.04 live CD ISO file for your system type. You can get it&lt;br /&gt;from the Web site, or you can use wget on the command line:&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;code&gt;wget -v http://releases.ubuntu.com/hardy/ubuntu-8.04-desktop-i386.iso&lt;/code&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;To work with the image, you'll need to install a few packages to&lt;br /&gt;support the squashfs filesystem format, and mkisofs, the utility to&lt;br /&gt;create ISO images. On Ubuntu, you can install them with the command &lt;code&gt;sudo apt-get install squashfs-tools mkisofs&lt;/code&gt;.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Now, load the squashfs module, then copy, mount, and extract the contents of the ISO file in order to customize the contents:&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&amp;lt;div class="code"&amp;gt;sudo modprobe squashfs&amp;lt;br /&amp;gt;mkdir rescue&amp;lt;br /&amp;gt;mv ubuntu-8.04-desktop-i386.iso rescue&amp;lt;br /&amp;gt;cd rescue&amp;lt;br /&amp;gt;mkdir mnt&amp;lt;br /&amp;gt;sudo mount -o loop ubuntu-8.04-desktop-i386.iso mnt&amp;lt;br /&amp;gt;mkdir extract-cd&amp;lt;br /&amp;gt;rsync --exclude=/casper/filesystem.squashfs -a mnt/ extract-cd&amp;lt;br /&amp;gt;mkdir squashfs&amp;lt;br /&amp;gt;sudo mount -t squashfs -o loop mnt/casper/filesystem.squashfs squashfs&amp;lt;br /&amp;gt;mkdir edit&amp;lt;br /&amp;gt;sudo cp -a squashfs/* edit/&amp;lt;br /&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;p&amp;gt;You'll want to customize the CD in a chroot environment. Chroot&lt;br /&gt;changes the root directory of the environment, allowing you to access&lt;br /&gt;the files and applications inside the CD directly, which you must do in&lt;br /&gt;order to use tools like apt-get. In order to use a network connection&lt;br /&gt;inside chroot, which you'll probably want to do to add new packages,&lt;br /&gt;you'll need to copy in the hosts and resolv.conf files to configure&lt;br /&gt;your network settings. You can achieve this with the following:&amp;lt;/p&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;pre&amp;gt;&amp;lt;div class="code"&amp;gt;sudo cp /etc/resolv.conf edit/etc/&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;sudo cp /etc/hosts edit/etc/&amp;lt;/div&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;p&amp;gt;Once you've completed these steps, you can start to work inside the&lt;br /&gt;live CD. Mount the live CD to the edit/dev mountpoint, then change your&lt;br /&gt;root directory into the newly mounted volume. You'll need to mount&lt;br /&gt;/proc and /sys volumes to work with the kernel, and export your&lt;br /&gt;settings to avoid locale and GPG problems later on:&amp;lt;/p&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;pre&amp;gt;&amp;lt;div class="code"&amp;gt;sudo mount --bind /dev/ edit/dev&amp;lt;br /&amp;gt;sudo chroot edit&amp;lt;br /&amp;gt;mount -t proc none /proc&amp;lt;br /&amp;gt;mount -t sysfs none /sys&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;export HOME=/root&amp;lt;br /&amp;gt;export LC_ALL=C&amp;lt;br /&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;h4&amp;gt;Free space by removing unneeded packages&amp;lt;/h4&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;p&amp;gt;You can configure the packages that are included with the live CD&lt;br /&gt;using apt-get or Aptitude. You'll want to free up some space to add the&lt;br /&gt;rescue applications; even though the data is compressed, all of it&lt;br /&gt;needs to fit on a 700MB CD or on a higher-capacity DVD. You can remove&lt;br /&gt;packages and applications that aren't useful for the recovery. I chose&lt;br /&gt;to remove the OpenOffice.org suite, the GNOME games set, Ekiga,&lt;br /&gt;Ubiquity, Evolution, and the GIMP, saving me around 200MB. If you are&lt;br /&gt;comfortable without a command-line environment, you might want to get&lt;br /&gt;rid of GNOME and Xorg; if you do that, you need not install GParted and&lt;br /&gt;the other graphical tools in the next section. In any case, the goal is&lt;br /&gt;to get rid of large applications. To sort all of the installed packages&lt;br /&gt;by size, run the following command in the chrooted environment:&amp;lt;/p&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;dpkg-query -W --showformat='${Installed-Size} ${Package}\n' | sort -nr | less&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;p&amp;gt;You can use apt-get to remove a package. Use it with the &amp;lt;code&amp;gt;--purge&amp;lt;/code&amp;gt; argument to get rid of configuration files. The sudo command won't work in the chroot, and therefore should be omitted:&amp;lt;/p&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;apt-get remove --purge &amp;lt;em&amp;gt;package-name&amp;lt;/em&amp;gt;&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;div class="sidebar"&amp;gt;&lt;br /&gt;&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Prebuilt Linux rescue CDs&amp;lt;/strong&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;p&amp;gt;You don't need to build a custom rescue disk to get a great bootable&lt;br /&gt;utility CD. Here are a few pre-built rescue CDs you can try.&amp;lt;/p&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;ul&amp;gt;&amp;lt;li&amp;gt;&amp;lt;a href="http://partedmagic.com/"&amp;gt;Parted Magic&amp;lt;/a&amp;gt; -- This 45MB boot&lt;br /&gt;CD uses GParted, the GNOME partition editor, to handle partition table&lt;br /&gt;management for an extensive list of filesystems, including ext2/3,&lt;br /&gt;NTFS, and HFS+. Parted Magic uses the Xfce desktop environment to&lt;br /&gt;provide a variety of tools, including Firefox, Thunar, and ISO tools.&lt;br /&gt;It also has a USB version to use from a thumb drive.&amp;lt;/li&amp;gt;&amp;lt;li&amp;gt;&amp;lt;a href="http://www.sysresccd.org/"&amp;gt;SystemRescueCd&amp;lt;/a&amp;gt; -- The 191MB&lt;br /&gt;CD features partition, archive, and networking tools, along with a slew&lt;br /&gt;of editors and file browsers. This is probably the easiest system boot&lt;br /&gt;CD, and is recommended for less advanced Linux users. It also has a&lt;br /&gt;rootkit checker, virus scan, and CD burning utilities. It includes an X&lt;br /&gt;interface through Xfce.&amp;lt;/li&amp;gt;&amp;lt;li&amp;gt;&amp;lt;a href="http://trinityhome.org/"&amp;gt;Trinity Rescue Kit&amp;lt;/a&amp;gt; -- The&lt;br /&gt;129MB Trinity Rescue Kit is designed for the rescue and recovery of&lt;br /&gt;Windows machines, but it will work for Linux as well. It includes a few&lt;br /&gt;virus scan applications, a Windows password reset tool, Samba, SSH,&lt;br /&gt;rootkit removal tools, and partition and backup tools. It is based on&lt;br /&gt;Mandriva Linux.&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;h4&amp;gt;Add rescue applications&amp;lt;/h4&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;p&amp;gt;Once you have removed all of the unneeded applications from the live&lt;br /&gt;CD you can start to add rescue and recovery applications. Generally,&lt;br /&gt;rescue CDs include a variety of disk utilities and security tools, as&lt;br /&gt;well as networking tools to find support and access outside machines.&lt;br /&gt;You may not want all of the applications I mention, and you can add&lt;br /&gt;some that I don't. This is your personal boot CD, and should be&lt;br /&gt;configured as you see fit. For ideas about what to include on your CD,&lt;br /&gt;you might want to check out some of the prebuilt rescue distributions&lt;br /&gt;mentioned in the sidebar.&amp;lt;/p&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;p&amp;gt;You can install packages from the repositories using apt-get, but&lt;br /&gt;you must add the multiverse repository to your /etc/apt/sources.list&lt;br /&gt;file:&amp;lt;/p&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;pre&amp;gt;&amp;lt;div class="code"&amp;gt;&amp;lt;br /&amp;gt;deb http://us.archive.ubuntu.com/ubuntu/ hardy main multiverse&amp;lt;br /&amp;gt;deb-src http://us.archive.ubuntu.com/ubuntu/ hardy main multiverse&amp;lt;br /&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;!-- Image: partimage_thumb.png - Cutline: Partimage is an essential program for a rescue disk. Use it to copy and restore data. --&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;p&amp;gt;A disk partition tool is the staple of a mature boot disk. Fortunately, the Ubuntu live CD comes with &amp;lt;a href="http://gparted.sourceforge.net/"&amp;gt;GParted&amp;lt;/a&amp;gt;,&lt;br /&gt;the GNOME Partition Editor, so adding a package isn't required. If you&lt;br /&gt;chose to forgo a graphical environment, you should make sure that&lt;br /&gt;parted is installed instead to handle partition tables from the command&lt;br /&gt;line. If you accidentally delete a partition, installing a program like&lt;br /&gt;&amp;lt;a href="http://www.cgsecurity.org/wiki/TestDisk"&amp;gt;testdisk&amp;lt;/a&amp;gt; can help&lt;br /&gt;you recover it, as well as provide a few other basic disk tools. If you&lt;br /&gt;are using the ext2 filesystem type and you accidentally delete a file,&lt;br /&gt;you'll find the &amp;lt;a href="http://e2undel.sourceforge.net/"&amp;gt;e2undel&amp;lt;/a&amp;gt; package helpful in recovering it. If you need to copy an entire partition from a dying disk, or just want to make a backup, &amp;lt;a href="http://www.partimage.org/Main_Page"&amp;gt;partimage&amp;lt;/a&amp;gt; is the way to go. You can also use it to restore a partition with a previously made backup.&amp;lt;/p&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;!-- Image: GParted_thumb.png - Cutline: Use GParted to configure your partition tables for your hard disk --&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;p&amp;gt;If you plan to use this disc with Windows machines, you will want to install antivirus and rootkit tools. &amp;lt;a href="http://www.clamav.net/"&amp;gt;Clamscan&amp;lt;/a&amp;gt; provides quick and easy virus scan with a command-line-based update tool. &amp;lt;a href="http://www.chkrootkit.org/"&amp;gt;Chkrootkit&amp;lt;/a&amp;gt; is a scanner to find and remove rootkits that could be hiding in your computer. You can use &amp;lt;a href="http://www.sleuthkit.org/"&amp;gt;sleuthkit&amp;lt;/a&amp;gt; to conduct analysis of your filesystem and browse through hidden files.&amp;lt;/p&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;p&amp;gt;After you finish adding packages, clean up your temporary data and unmount the environment:&amp;lt;/p&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;pre&amp;gt;&amp;lt;div class="code"&amp;gt;apt-get clean&amp;lt;br /&amp;gt;rm -rf /tmp/*&amp;lt;br /&amp;gt;rm /etc/resolv.conf&amp;lt;br /&amp;gt;umount /proc&amp;lt;br /&amp;gt;umount /sys&amp;lt;br /&amp;gt;exit&amp;lt;br /&amp;gt;sudo umount edit/dev&amp;lt;br /&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;p&amp;gt;Now, regenerate the manifest (which is basically a list of installed packages) and copy in into the correct directory:&amp;lt;/p&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;pre&amp;gt;&amp;lt;div class="code"&amp;gt;&amp;lt;br /&amp;gt;chmod +w extract-cd/casper/filesystem.manifest&amp;lt;br /&amp;gt;sudo chroot edit dpkg-query -W --showformat='${Package} ${Version}\n' &amp;gt; extract-cd/casper/filesystem.manifest&amp;lt;br /&amp;gt;sudo cp extract-cd/casper/filesystem.manifest extract-cd/casper/filesystem.manifest-desktop&amp;lt;br /&amp;gt;sudo sed -i '/ubiquity/d' extract-cd/casper/filesystem.manifest-desktop&amp;lt;br /&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;p&amp;gt;Compress the filesystem to squeeze it onto a disc:&amp;lt;/p&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;pre&amp;gt;&amp;lt;div class="code"&amp;gt;&amp;lt;br /&amp;gt;sudo rm extract-cd/casper/filesystem.squashfs&amp;lt;br /&amp;gt;sudo mksquashfs edit extract-cd/casper/filesystem.squashfs -nolzma&amp;lt;br /&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;p&amp;gt;And finally, create the ISO file:&amp;lt;/p&amp;gt;&lt;br /&gt;&amp;lt;pre&amp;gt;&amp;lt;div class="code"&amp;gt;&amp;lt;br /&amp;gt;cd extract-cd&amp;lt;br /&amp;gt;sudo mkisofs -r -V "$IMAGE_NAME" -cache-inodes -J -l -b isolinux/isolinux.bin -c isolinux/boot.cat -no-emul-boot -boot-load-size 4 -boot-info-table -o ../ubuntu-8.04-desktop-i386.iso&amp;lt;br /&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;p&amp;gt;Once the image file is created, you need to burn it to a disc. You&lt;br /&gt;can do that pretty easily with K3b or Brasero. If you want, you can do&lt;br /&gt;it from the command line:&amp;lt;/p&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;pre&amp;gt;&amp;lt;div class="code"&amp;gt;&amp;lt;br /&amp;gt;cdrecord dev=/dev/cdrom ubuntu-8.04-desktop-i386.iso&amp;lt;br /&amp;gt;&amp;lt;/div&amp;gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Once the CD is finished burning, you should be able to put it into&lt;br /&gt;your optical drive and boot into the environment you just created.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;This should give you more than enough information to start building&lt;br /&gt;your ultimate custom rescue CD. Add the packages and tools you need,&lt;br /&gt;and hopefully you'll never be at a loss the next time your computer has&lt;br /&gt;a problem during startup.&lt;/p&gt;&lt;div style=""&gt;&lt;br /&gt;          &lt;br /&gt;     &lt;/div&gt;&lt;br /&gt;&lt;br /&gt;      &lt;div style="padding-top: 10px;" class="xar-align-left"&gt;&lt;br /&gt;Read in the original layout at: &lt;a href="http://www.linux.com/feature/137524"&gt;http://www.linux.com/feature/137524&lt;/a&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;       &lt;/p&gt;&lt;/div&gt;&lt;br /&gt;  &lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2589537411099484208-7654580262814239903?l=dontburnmybeans.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dontburnmybeans.blogspot.com/feeds/7654580262814239903/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2589537411099484208&amp;postID=7654580262814239903' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2589537411099484208/posts/default/7654580262814239903'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2589537411099484208/posts/default/7654580262814239903'/><link rel='alternate' type='text/html' href='http://dontburnmybeans.blogspot.com/2008/07/build-your-own-ultimate-boot-disc.html' title='Build your own ultimate boot disc'/><author><name>Jamtech</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/-RNwpfmrDdPU/Tn1tpZWh2zI/AAAAAAAAAHg/ICZaej4kWOk/s220/hitmana3_2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2589537411099484208.post-2832650634883844584</id><published>2008-07-10T23:41:00.001-07:00</published><updated>2009-04-18T21:31:35.065-07:00</updated><title type='text'>Don't forget the text editor</title><content type='html'>&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;&lt;div id="main"&gt;&lt;br /&gt;&lt;h1&gt;&lt;br /&gt;      &lt;a title="Linux.com" href="http://www.linux.com/"&gt;&lt;br /&gt;           &lt;span&gt;Linux.com&lt;/span&gt;&lt;br /&gt;      &lt;/a&gt;&lt;br /&gt;  &lt;/h1&gt;&lt;br /&gt;  &lt;p id="xc-slogan"&gt;&lt;br /&gt;Everything Linux and Open Source    &lt;/p&gt;&lt;br /&gt;   &lt;div class="xar-standard-box-padding"&gt;&lt;br /&gt;       &lt;h2&gt;&lt;br /&gt;           Don't forget the text editor&lt;/h2&gt;&lt;br /&gt;      &lt;div class="xar-article-details"&gt;&lt;br /&gt;June 26, 2008 (4:00:00 PM)          &lt;small&gt; -  2 weeks ago&lt;/small&gt;&lt;br /&gt;           &lt;p&gt;&lt;br /&gt;               By: &lt;a href="http://home.uva.nl/a.m.berg"&gt;Alan Berg&lt;/a&gt;&lt;br /&gt;           &lt;/p&gt;&lt;br /&gt;      &lt;/div&gt;&lt;br /&gt;      &lt;div class="xar-clearleft"&gt;&lt;br /&gt;          &lt;p&gt;Text&lt;br /&gt;editors are important for many tasks, from editing configuration files,&lt;br /&gt;nudging cron jobs, and manipulating XML files to quickly pushing out a&lt;br /&gt;README. Luckily, there are a number of interesting editors available.&lt;br /&gt;Here's a brief introduction to nine intriguing choices. While some may&lt;br /&gt;be better suited to certain tasks, it's no one tool is better than&lt;br /&gt;another for all tasks. Try them all and use the ones you like best.&lt;/p&gt;       &lt;/div&gt;&lt;br /&gt;          &lt;h4&gt;vi&lt;/h4&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Old favorite &lt;a href="http://thomer.com/vi/vi.html"&gt;vi&lt;/a&gt; (or one&lt;br /&gt;of its variants, such as Vim or Elvis) is available on most *nix&lt;br /&gt;systems. If you are a system administrator moving from one *nix system&lt;br /&gt;to another, the one reliable fact is that vi will work, &lt;a href="ftp://ftp.cc.monash.edu.au/pub/vi/macros"&gt;macros&lt;/a&gt;&lt;br /&gt;and all. Once you have learned the keystrokes, swapping words at the&lt;br /&gt;boundaries, replacing sections of text, or transversing through a large&lt;br /&gt;file with vi is efficient, fast, and predictable. However, its initial&lt;br /&gt;learning curve is somewhat steep, and there is no real GUI.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Gedit and Kate&lt;/h4&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.gedit.org/"&gt;Gedit&lt;/a&gt; (see figure 1) is a small and&lt;br /&gt;lightweight text editor for the GNOME desktop, and the default text&lt;br /&gt;editor for Ubuntu. An excellent tool with syntax highlighting for a&lt;br /&gt;wealth of scripting and programming languages, it allows for extension&lt;br /&gt;via plugins (&lt;a title="Figure 2." class="thickbox" href="http://www.linux.com/var/uploads/Image/articles/137879-2.png"&gt;figure 2&lt;/a&gt;) and does most tasks efficiently, without fuss.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;a title="Figure 1." class="thickbox" href="http://www.linux.com/var/uploads/Image/articles/137879-1.png"&gt;&lt;br /&gt;&lt;img title="Figure 1. Click to enlarge" src="http://www.linux.com/var/uploads/Image/articles/137879-1-thumb.png" align="right" /&gt;&lt;br /&gt;&lt;/a&gt;&lt;br /&gt;The editor is modern in design, with a tab per open file, thus allowing&lt;br /&gt;for easy cut and pasting between documents. The interface is&lt;br /&gt;uncluttered and somewhat configurable via Edit -&amp;gt; Preferences for&lt;br /&gt;such attributes as the enabling of allowing line numbering and changing&lt;br /&gt;tabs to spaces.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;You can also run &lt;a href="http://kate-editor.org/"&gt;Kate&lt;/a&gt; (KDE Advanced Text Editor) under the GNOME desktop. However, you will have to install its package with a command like &lt;code&gt;sudo apt-get install kate-plugins&lt;/code&gt;, which will also install some extra plugin-enabled functionality.  Kate has a slightly busier interface than Gedit &lt;a title="Figure 3." class="thickbox" href="http://www.linux.com/var/uploads/Image/articles/137879-3.png"&gt;(figure 3)&lt;/a&gt;,&lt;br /&gt;and to use tabbing between documents, you must activate the feature via&lt;br /&gt;enabling the correct plugin. But Kate is significantly more&lt;br /&gt;configurable than Gedit, exposing more of its innards as preferences.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;An immediately helpful feature is the ability to hide code that is&lt;br /&gt;within a certain scope. For example, to hide all the code within a&lt;br /&gt;foreach statement, double-click on the offending line. This is a&lt;br /&gt;significant help for uncluttering verbose scripting text. Also, under&lt;br /&gt;the Tools menu, you can change the end of line type to switch between&lt;br /&gt;Unix, DOS, and Mac, thus avoiding subtle issues in your text later.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Both Kate and Gedit support quick ad-hoc editing of numerous&lt;br /&gt;scripting and programming languages. They are both excellent editors&lt;br /&gt;for a variety of tasks.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;TEA and Emacs&lt;/h4&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;a href="http://www.gnu.org/software/emacs/"&gt;Emacs&lt;/a&gt; and &lt;a href="http://tea-editor.sourceforge.net/about.html"&gt;TEA&lt;/a&gt;&lt;br /&gt;are more complex and configurable than Gedit and Kate, with a much&lt;br /&gt;wider scope of potential abilities. If you want to work within a single&lt;br /&gt;environment, including sending mail, then these adaptive tools have the&lt;br /&gt;power to let you.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;TEA &lt;a title="Figure 4." class="thickbox" href="http://www.linux.com/var/uploads/Image/articles/137879-4.png"&gt;(figure 4)&lt;/a&gt;&lt;br /&gt;is a compact, configurable, and function-rich editor that takes up only&lt;br /&gt;around 500KB of memory. TEA provides a decent text editor, with markup&lt;br /&gt;support for LaTeX, DocBook, Wikipedia, and HTML. It does not provide&lt;br /&gt;any syntax highlighting, but does provide an extremely basic project&lt;br /&gt;environment for compiling code. &lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Thankfully, TEA also contains a delightfully named crapbook (read&lt;br /&gt;notes holder) for storing temporary text. The editor provides a spell&lt;br /&gt;checker and statistics for documents and therefore sits comfortably&lt;br /&gt;between an office suite and a plain editor. Other functionality&lt;br /&gt;includes a file browser and a calendar. Because the editor's compact&lt;br /&gt;size is based on the fact that it relies heavily on using external&lt;br /&gt;tools, under the Help menu there is a well-thought-out self-check&lt;br /&gt;command that on activation mentions any missing dependencies.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;You can extend TEA via manipulating text files to expand specific&lt;br /&gt;features. For example, to add your own command to the Run menu, open&lt;br /&gt;the ext_programs text file via File -&amp;gt; Manage utility Files -&amp;gt;&lt;br /&gt;External programs to add the option xterm, which activates -- yes, you&lt;br /&gt;guessed it -- an xterm window. Add and save the text on a new line:&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;code&gt;xterm=xterm &amp;amp;&lt;/code&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;a href="http://www.gnu.org/software/emacs/tour/"&gt;Emacs&lt;/a&gt; &lt;a title="Figure 5." class="thickbox" href="http://www.linux.com/var/uploads/Image/articles/137879-5.png"&gt;(figure 5)&lt;/a&gt;&lt;br /&gt;is powerful, feature-rich, and configurable. This tool has a long&lt;br /&gt;history reaching back as far as 1976. Originally written by Richard&lt;br /&gt;Stallman and Guy Steele, Emacs split into two main branches, Xemacs and&lt;br /&gt;Emacs, in 1991. The functionality in both branches is comparable.&lt;br /&gt;Having a long and renowned history implies fitness of purpose and core&lt;br /&gt;stability.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Emacs is not only a text editor but also an interpreter for Emacs&lt;br /&gt;Lisp, an extension of the Lisp programming language. Elisp makes&lt;br /&gt;scripting relatively easy. If you are a power user, you can tweak the&lt;br /&gt;.emacs configuration file (or whatever your local equivalent is) to,&lt;br /&gt;for example, add extra menus.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;People have written a large number of modes in the Elisp language&lt;br /&gt;exist. A mode is an extension, modification, or enhancement. For&lt;br /&gt;example, one mode may be for SQL development, and another for Perl&lt;br /&gt;programming. The main &lt;a href="http://www.emacswiki.org/cgi-bin/wiki"&gt;Emacs wiki&lt;/a&gt; details the most up-to-date information and lists a full set of potential modes. &lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Emacs' default GUI is succinct and contains much functionality&lt;br /&gt;beyond editing. You can perform file navigation, send out email (if&lt;br /&gt;configured correctly), and perform specific tasks such as debugging,&lt;br /&gt;patching, and creating diffs with a few succinct keystrokes.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;The software's documentation and international language support is superb, and the editor includes an online tutorial.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Gaining full mastery of Emacs, even for the cleverest among us,&lt;br /&gt;requires patience and time. The intuitive use of buffers or the&lt;br /&gt;memorizing of Ctrl and Alt keystroke combinations is a chore, but if&lt;br /&gt;you perfect it, expect massive gains in efficiency.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Leafpad, Mousepad, and Medit&lt;/h4&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;If you are looking for a simple editor that does the bare minimum, then either &lt;a href="http://tarot.freeshell.org/leafpad/"&gt;Leafpad&lt;/a&gt; or &lt;a href="http://www.xfce.org/projects/mousepad/"&gt;Mousepad&lt;/a&gt;&lt;br /&gt;will fulfill the basics. They look the same and allow for word wrap,&lt;br /&gt;line numbering, auto indent, and a choice of fonts, and not much else.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;a href="http://mooedit.sourceforge.net/"&gt;Medit&lt;/a&gt; is a&lt;br /&gt;straightforward text editor with syntax highlighting and tabbed panes.&lt;br /&gt;To add an entry to its configurable tool menu (figure 6) select&lt;br /&gt;Settings -&amp;gt; Preferences then highlight the Tools option. Clicking on&lt;br /&gt;the new item icon (the picture of a document with the orange circle at&lt;br /&gt;the bottom center) activates a dialog. Change the name of the item from&lt;br /&gt;"new command," then add the entries displayed in figure 5. You will&lt;br /&gt;then have a new tool that lists in the currently selected document all&lt;br /&gt;the running processes (figure 7). For the devotees, Medit has its own&lt;br /&gt;scripting language, called mooscript.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;The editor also has a well placed expandable no fuss file selector&lt;br /&gt;that is readily available via a click on the right side of the main&lt;br /&gt;window.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;SciTE&lt;/h4&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;a href="http://scintilla.sourceforge.net/SciTE.html"&gt;SciTE&lt;/a&gt;, the &lt;a href="http://www.scintilla.org/"&gt;Scintilla&lt;/a&gt;-based&lt;br /&gt;text editor, offers some of the features of a programmer's interactive&lt;br /&gt;development environment. It supports tab panes, syntax highlighting,&lt;br /&gt;and code folding, and goes a solid step further for programmers. For&lt;br /&gt;example, on opening a Perl file, or numerous other languages, you can&lt;br /&gt;check a script's basic validity via the menu option Tools -&amp;gt; Check&lt;br /&gt;syntax. That displays a second window (figure 8) with the gruesome&lt;br /&gt;details.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;SciTE presents a no-fuss, easy-to-learn approach to controlling a scripting environment. A development tool like &lt;a href="http://www.eclipse.org/"&gt;Eclipse&lt;/a&gt; will give you more features and adaptability, but also a steeper learning curve.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Final comments&lt;/h4&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;This article covers only a fraction of the available text editors&lt;br /&gt;for the Linux desktop. If I have missed your favorite, share your&lt;br /&gt;opinion and place a link in the comments section for this article.&lt;/p&gt;&lt;div style=""&gt;&lt;br /&gt;          &lt;br /&gt;     &lt;/div&gt;&lt;br /&gt;&lt;br /&gt;      &lt;div style="padding-top: 10px;" class="xar-align-left"&gt;&lt;br /&gt;Read in the original layout at: &lt;a href="http://www.linux.com/feature/137879"&gt;http://www.linux.com/feature/137879&lt;/a&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;       &lt;/p&gt;&lt;/div&gt;&lt;br /&gt;  &lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2589537411099484208-2832650634883844584?l=dontburnmybeans.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dontburnmybeans.blogspot.com/feeds/2832650634883844584/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2589537411099484208&amp;postID=2832650634883844584' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2589537411099484208/posts/default/2832650634883844584'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2589537411099484208/posts/default/2832650634883844584'/><link rel='alternate' type='text/html' href='http://dontburnmybeans.blogspot.com/2008/07/don-forget-text-editor.html' title='Don&amp;#39;t forget the text editor'/><author><name>Jamtech</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/-RNwpfmrDdPU/Tn1tpZWh2zI/AAAAAAAAAHg/ICZaej4kWOk/s220/hitmana3_2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2589537411099484208.post-3657033966350540090</id><published>2008-07-10T23:36:00.001-07:00</published><updated>2009-04-18T21:30:24.018-07:00</updated><title type='text'>Desktop Linux strategies for marketplace success</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;&lt;a href='http://www.linux.com/feature/134126?theme=print'&gt;Linux.com :: Desktop Linux strategies for marketplace success&lt;/a&gt;&lt;br/&gt;&lt;blockquote&gt;Linux.com&lt;br/&gt;&lt;br/&gt;Everything Linux and Open Source&lt;br/&gt;Desktop Linux strategies for marketplace success&lt;br/&gt;May 03, 2008 (2:00:00 PM)  -  2 months, 1 week ago&lt;br/&gt;&lt;br/&gt;By: Carlton Hobbs&lt;br/&gt;&lt;br/&gt;What strategy is needed to really spread desktop Linux to average home users? Here are some ideas that just might work.&lt;br/&gt;&lt;br/&gt;Journalist Steven J. Vaughan-Nichols argues that&lt;br/&gt;&lt;br/&gt;    Linux businesses, for the most part, don't do marketing. I think they're extremely foolish not to spend any money on it, but there it is.... Like the Linux companies, many of them were sure that they didn't need to market themselves. Like Linux companies, they thought word of mouth was enough.... Well guess what: it's not. Without marketing, no one from the outside looking in can tell one Linux from another. They just see a confusing mish-mash of names, and unless they're already really motivated, they're going to start turning off from Linux at the very start.&lt;br/&gt;&lt;br/&gt;I argue almost the opposite. A large part of mainstream media marketing, advertising, and branding is a means to get name recognition at a very superficial level. Its main targets are people who make superficial buying decisions, and for the right products, this works. Why buy name brand Tylenol vs. generic acetaminophen, name brand cereal, or a thousand other identical products that come off the same assembly line but use different packaging at different prices? From the perspective of the thrifty, the main answers are ignorance and brand recognition.&lt;br/&gt;&lt;br/&gt;Of course, not all marketing is to compete with effectively identical products. Consider the American beer industry as a major marketing powerhouse with a few similarities to the Windows vs. Linux market. The major American breweries formulated modern beers after Prohibition to appeal to people who didn't like the taste of beer, and as a side effect the major brewers accepted, these beers taste bad to beer connoisseurs. The post-Prohibition era, even to this day, retains elements of a cartelized liquor distribution industry designed to make it difficult and expensive to compete with the major breweries, such that there have been no new domestic majors in decades. The rebirth of real beer in America was through microbreweries that have small to non-existent marketing budgets. They rely on beer connoisseurs who communicate through beer fan reviews, word of mouth, willingness to experiment, and seeking out the minority of stores that actually carry microbrew and local beers. Beer commercials for microbrews about sports and sexy women would not get many beer drinkers to seek out good beer that isn't already easy to find. Such commercials are just for "all beer is beer" drinkers who are susceptible to brand association marketing and herd opinion.&lt;br/&gt;&lt;br/&gt;This doesn't mean that high-cost marketing is innately wrong or bad. It means that if you can increase the marginal sales of your high-profit-per-sale product to people who make quick decisions based on brand recognition, then your marketing expenses were a good investment, but otherwise not. Unfortunately for Linux companies, desktop Linux is a very low profit per "sale" product that is not an impulse choice off a shelf of interchangeable consumer goods. As Red Hat learned years ago, the shrink-wrapped box on a store shelf will not change the current OS market.&lt;br/&gt;&lt;br/&gt;So if word of mouth and near-zero-budget advertising are our main prospects, then perhaps what is needed is a better person-to-person strategy. Fortunately, there is definite room for improvement here. One major barrier to entry is lack of Linux preinstallation, and the occasional need for more expertise with compatibility issues. Desktop Linux must partly resolve these challenges through its internal advantage of strong community by strategic and expansionary networking, and by using the big opportunity of failure to address the massive number of PCs that people keep collecting dust, thinking they will upgrade sometime, someday.&lt;br/&gt;&lt;br/&gt;Desktop Linux must focus on local communities for recruiting the next wave of users and evangelists. Ubuntu has the right idea with its LoCo initiative. However, to get really local and networked, a distro-centric local community is not the most efficient. If local Ubuntu, Debian, Slackware, etc. users never meet, they will forfeit great networking opportunities. There needs to be local GNU/Linux/FOSS communities with broad ranges of software experience, occupations, contacts, and distro preferences. Fortunately, many already exist, and there is at least one list where people can find groups near them. Linux promoters must recognize face-to-face personal interaction as a primary means for strategic growth of desktop Linux.&lt;br/&gt;&lt;br/&gt;Local free software organizations need to be able to offer free Linux installation and encourage people to reuse or donate computers that would run poorly with current Windows systems. Certain groups are naturally good targets to recruit and possibly join as recruiters themselves. Decentralist political groups, neighborhood associations, Parent Teacher Associations, and other educational organizations are also intelligent low budget groups. College groups, homeschool groups, agriculture co-ops, churches, and religious groups are all great places to find people who have spare computers to reinvigorate or donate, or would be willing to have a computer set to dual boot. In general, groups that depend on donations or have small budgets are looking for ways to minimize unnecessary costs. Some of their members would likely be radicalized when they learn what little is required to show others how to switch to Linux.&lt;br/&gt;&lt;br/&gt;Local free software organizations need a quick and easy tool to communicate what the GNU/Linux OS can do. Perhaps the best method would also serve as a means of introduction. An organization could create business cards that provide a brief description of the local Linux group, its Web address, and purpose. The card should be visually impressive and colorful. They can let people know that the card itself was designed with only free software, whether it be OpenOffice.org, gLabels, Inkscape, Scribus, or some combination that anyone could easily get through Linux.&lt;br/&gt;&lt;br/&gt;Is there a model for such success without advertising budgets? Ask yourself how you heard about and started using Google. Was it through advertising? Google became a giant because the barrier to trying a new search engine was so low and the value quickly obvious. It was used by almost everyone before anyone saw a Google advertisement. If Linux advocates can do the same, then Windows will be in trouble. I don't see how this can happen without active local free software groups that seek out growth, and success would likely be in proportion to the efficiency of local groups. If some are more successful than others, then the more successful local methods could be adopted elsewhere.&lt;br/&gt;&lt;br/&gt;All the experience and networked knowledge of local free software cooperatives might be enough that small businesses would hire the local groups to upgrade their computer systems to Linux for real money. Local groups could even have contracts with particular distros that provide paid business support to receive some of the profit. Local cooperatives would not likely make much money, but maybe enough on occasion to purchase a few rounds of quality microbrews to celebrate a few more people unshackled from Goliath-soft. Very few people will get rich with Linux, but a lot of people could be meaningfully less poor with it, and free-as-in-freedom might actually buy the enjoyment of a few free-as-in-beers.&lt;br/&gt;Read in the original layout at: http://www.linux.com/feature/134126&lt;br/&gt;&lt;br/&gt;&lt;/blockquote&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2589537411099484208-3657033966350540090?l=dontburnmybeans.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dontburnmybeans.blogspot.com/feeds/3657033966350540090/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2589537411099484208&amp;postID=3657033966350540090' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2589537411099484208/posts/default/3657033966350540090'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2589537411099484208/posts/default/3657033966350540090'/><link rel='alternate' type='text/html' href='http://dontburnmybeans.blogspot.com/2008/07/desktop-linux-strategies-for.html' title='Desktop Linux strategies for marketplace success'/><author><name>Jamtech</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/-RNwpfmrDdPU/Tn1tpZWh2zI/AAAAAAAAAHg/ICZaej4kWOk/s220/hitmana3_2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2589537411099484208.post-6728771722589531433</id><published>2008-07-10T23:34:00.001-07:00</published><updated>2009-04-18T21:29:51.748-07:00</updated><title type='text'>How to write a thorought review of a linux distribution</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;&lt;a href='http://www.linux.com/feature/139593?theme=print'&gt;Linux.com :: How to write a thorough review of a Linux distribution&lt;/a&gt;&lt;br/&gt;&lt;blockquote&gt;Linux.com&lt;br/&gt;&lt;br/&gt;Everything Linux and Open Source&lt;br/&gt;How to write a thorough review of a Linux distribution&lt;br/&gt;July 03, 2008 (9:00:00 PM)  -  1 week ago&lt;br/&gt;&lt;br/&gt;By: Mark Gregson&lt;br/&gt;&lt;br/&gt;I have never written a review of a Linux distribution, but I've read more than I can count, and many of them have been maddeningly incomplete and not worth the time it took to read them. Here's a list of items you need to talk about in order to write a thorough review, covering every aspect of the distribution from the initial download to the final recommendation and everything in between.&lt;br/&gt;&lt;br/&gt;Not every item below applies to every distribution; you need to choose which items to include and which to ignore. For example, if the distribution is for an embedded device, there's probably not much point in discussing window manager themes. However, the more you include, the better your review will be. You can cover some of this information in a simple table, but many of the points deserve more explanation.&lt;br/&gt;&lt;br/&gt;In addition to talking about each item, you should tell your readers how important or useful you think each item is. For example, if the distribution automatically boots all the way to a logged-in guest account, do you like this or not?&lt;br/&gt;Purpose of distribution&lt;br/&gt;&lt;br/&gt;Describe the purpose of the distribution as given by the creators. For example, the distribution may be intended for servers or it might instead be for multimedia creators. If the creators do not list a purpose, you can give your view, but this should be done in a later section where you describe your impressions and recommendations.&lt;br/&gt;Parent distribution&lt;br/&gt;&lt;br/&gt;Describe the "parent" distribution this distribution is based on. For example, is this distribution Slackware or Debian based? If it is not based on a parent distribution, discuss the implications of this. Spend more time on this point if the parent distribution is particularly relevant -- for example, is the distribution intended to be minimalist but was built on the biggest kernel around?&lt;br/&gt;Version&lt;br/&gt;&lt;br/&gt;Give the version number of the distribution you are reviewing. What is the release date? Is this the latest version? If not, explain why you are you reviewing an older version. For example, the latest version might be beta and you only want to review the latest stable release. Which kernel is the distribution based on? Does the distribution contain multiple kernel versions? Don't just list the kernel as "2.6" but rather give the minor release number also (e.g. 2.6.25). Note whether the kernel is recent or older and discuss the distribution release dates versus the kernel release dates if that is relevant. For example, if the distribution is only days or weeks old but the kernel version is much older, note this. If the distribution uses a special kernel, include the bug fix number (e.g. 2.6.16.28).&lt;br/&gt;Distribution creators&lt;br/&gt;&lt;br/&gt;Mention the distribution creators -- is it one person working out of his home or is the distribution from a large scientific or government body?&lt;br/&gt;Acquiring&lt;br/&gt;&lt;br/&gt;Describe the methods provided to get the distribution. List the size of the distribution. Are there mirrors in major regions or is the distribution only available on its Web site? How fast was the download? How did you find out about this distribution? Are there other formats available? For example, can one purchase a DVD or CD? Is this a commercial or a free release?&lt;br/&gt;CPU architectures&lt;br/&gt;&lt;br/&gt;List the CPU architectures the version supports. Tell the readers whether one download supports multiple architectures, and about any special architectures that are supported.&lt;br/&gt;Live vs. install&lt;br/&gt;&lt;br/&gt;Say whether the distribution requires an install before you can use it fully. Most distributions have a live CD version. List the various "flavours" the distribution comes in. For example, are there separate minimal and full versions? Are there versions for different kinds or users or for different computer architectures?&lt;br/&gt;Live CD issues&lt;br/&gt;&lt;br/&gt;Describe the distribution's approach to saving personal files while in live CD mode. Are there any ways of saving the configuration? Does the distribution have a control panel entry for this? How easy is it to restart the live CD version and apply your saved configuration?&lt;br/&gt;Install&lt;br/&gt;&lt;br/&gt;Discuss the tools and process of installing the distribution onto the hard drive. How much manual intervention is required? How much technical expertise is needed? How well is the process documented? Does the system automatically partition the drives? Does it automatically backup existing files? Which filesystems are supported? Is there a default filesystem?&lt;br/&gt;Languages&lt;br/&gt;&lt;br/&gt;Since you will likely write your review in English (since you are reading this guide in English) then if the default language is not English emphasize the point. List the languages supported by the distribution. What is the default language? How well supported are the other listed languages? For example, if English is not the default language, do applications and documentation switch to English when you switch the language to English?&lt;br/&gt;Boot issues&lt;br/&gt;&lt;br/&gt;Describe which boot parameters are required and which boot options are available. Does the distribution stop and ask for user input or does it boot automatically? Even if it does boot all the way to a graphical desktop, does it still require configuration settings in the desktop? For example, some distributions will run all the way to a logged-in user running X but then show a dialog box requiring the person to set up the network card.&lt;br/&gt;&lt;br/&gt;Describe the ease of modifying the boot parameters, especially if you had to change any of the defaults in order to get the distribution working on your machine. Were there function keys that changed the default resolution or runlevel? Describe the level of documentation provided on the boot screens themselves. For example, did you have to already know that you should type "noapci" or did the boot screens explain all that and all other "cheat codes" (at least the ones required to get your machine working)?&lt;br/&gt;&lt;br/&gt;Tell the user if the system boots with a splash screen. This is particularly important if the distribution is intended for novice users. Does the distribution show any boot output or is it fully hidden?&lt;br/&gt;Start scripts&lt;br/&gt;&lt;br/&gt;Describe the startup scripts that come with the distribution. Besides startx, are there separate start scripts for each window manager? How easy is it to find them (i.e. are they documented clearly)? Are there start scripts for services like CUPS and firewalls?&lt;br/&gt;Graphical vs. text&lt;br/&gt;&lt;br/&gt;Explain what happens when the system has finished booting. Does it automatically start an X session? Which version of X does it use? If it doesn't start X automatically, what does it do? What sorts of instructions are given on screen, regardless of the boot mode? Is there enough information given to tell the user how to log in? For example, for any distribution intended for novice users, are the username and password shown on the login screen?&lt;br/&gt;Screen resolution&lt;br/&gt;&lt;br/&gt;Discuss the video mode the system boots to by default if it boots to X. Does it automatically find and use the highest resolution or possibly the highest refresh rate? Is the boot video mode selectable at some point?&lt;br/&gt;Hardware detection&lt;br/&gt;&lt;br/&gt;Describe the automatic hardware detection of the distribution. This includes but is not limited to video cards, audio cards, keyboards, mice (including the scroll wheel), USB ports, hard drives, CD and DVD devices, modems, network cards, printers, and scanners. Are the correct video drivers loaded? If you plug in or remove USB devices, does the system correctly configure the devices? Does your sound card work? Which sound architecture does it use?&lt;br/&gt;Mounting&lt;br/&gt;&lt;br/&gt;Tell whether the hard drives are mounted in read-only or in read-write mode. Can the distribution read and write non-Linux drives? How easy is it to switch between read-only and read-write? Were all the hard drives automatically mounted?&lt;br/&gt;Network&lt;br/&gt;&lt;br/&gt;Discuss how the distribution configures the network devices. Are they all discovered? Does the system let you use DHCP? How much manual configuration is required? What tools are provided for managing the network?&lt;br/&gt;&lt;br/&gt;Describe whether wireless network cards are properly configured. On startup, does the system tell you whether it tried, and what the result is? Are there any special tools to help you manage wireless connections?&lt;br/&gt;Printing&lt;br/&gt;&lt;br/&gt;Describe the printer setup process. Print some documents. Is CUPS automatically started? How easy is it to add a printer? Which printers are supported?&lt;br/&gt;Laptop support&lt;br/&gt;&lt;br/&gt;If you run the distribution on a laptop, discuss how well the hardware is supported. Does the distribution correctly deal with putting the laptop into sleep and hibernate modes? Is the infrared port configured? Does it support Bluetooth?&lt;br/&gt;Login manager&lt;br/&gt;&lt;br/&gt;Mention the login manager that starts by default. You can also list other supplied login managers, if any.&lt;br/&gt;Window managers&lt;br/&gt;&lt;br/&gt;List all the window managers supplied with the distribution and their version numbers. Does the login manager (if any) list the window managers and allow the user to select one different from the default? Are there window managers included that aren't shown by the login manager? Are there any unusual window managers?&lt;br/&gt;Themes&lt;br/&gt;&lt;br/&gt;Discuss the themes provided. How easy is it to change themes and get new ones?&lt;br/&gt;Look and feel&lt;br/&gt;&lt;br/&gt;Discuss the overall look of the distribution. Is there a consistent feel starting from the boot loader and going all the way through the login manager, default themes, and any customized control panels?&lt;br/&gt;Fonts&lt;br/&gt;&lt;br/&gt;Discuss the fonts that are installed with the distribution. Note anything exceptional, such as a large number of unusual fonts.&lt;br/&gt;Desktop&lt;br/&gt;&lt;br/&gt;Describe the desktop. Which applets are started and in which taskbars? What icons are there? Are there any special panels or menus? Do any other programs start automatically?&lt;br/&gt;Menus&lt;br/&gt;&lt;br/&gt;Describe how well the menus are configured in each window manager. Does each window manager have the same applications listed as the others, and are they laid out identically to the other supplied window managers as far as the window manager will allow? Are all the important installed applications listed? Are there submenus by category? If so, how well do the applications fit the assigned category? How many submenus do you need to navigate before you find what you want? Are there desktop icons for any applications? Do not assume that all applications shown in menus actually work or are even installed. For example, if the distribution includes a word processor in the menu, did you start it?&lt;br/&gt;Software selection&lt;br/&gt;&lt;br/&gt;Discuss the applications that are installed in the distribution by category. Highlight any unusual applications. List any non-open-source applications. Note especially if anything is missing. For example, if this is a desktop distribution, are there office applications? If it is a server edition, are all the services available?&lt;br/&gt;Codecs&lt;br/&gt;&lt;br/&gt;Discuss the codecs supplied with the distribution. How complete is the set of included codecs? Are all the free codecs included by default? Are there non-free codecs that might cause legal issues in some jurisdictions? How easy is it to get additional codecs if required? How well did the applications play the media you tested?&lt;br/&gt;Customized control panel&lt;br/&gt;&lt;br/&gt;Describe any customized control panels that come with the distribution. What tasks do they cover? How easy are they to find and use? Do the tools work completely or does the user need to do further work via non-customized tools?&lt;br/&gt;Customized application configuration&lt;br/&gt;&lt;br/&gt;Describe any customized application configuration tools provided. For example, is there a customized tool to configure encryption?&lt;br/&gt;Special configurations&lt;br/&gt;&lt;br/&gt;Describe any special programs and configurations not found in most other distributions. For example, if the distribution includes Wine, is it fully configured to run, and are there any installed Windows applications that are preconfigured? Are there icons or menu items that start these applications?&lt;br/&gt;Development tools&lt;br/&gt;&lt;br/&gt;Describe the development tools provided. List the compilers, editors, and integrated development environments.&lt;br/&gt;Services&lt;br/&gt;&lt;br/&gt;List the services that are started automatically. For example, is sshd started? Describe the system for controlling the starting and stopping of services. Is there an administration control panel for services? Are any important services not included in the control panel?&lt;br/&gt;Security&lt;br/&gt;&lt;br/&gt;Describe the security features of the distribution. Is the root password weak or strong? Are there any guest accounts or does the distribution automatically log in as root? Are the guest accounts password protected? Does the distribution boot all the way to a desktop or is there a login screen? Are the passwords easy to find? For example, some distributions show the password on the login screen as part of the wallpaper. Are there special security features such as firewalls or automatically encrypted filesystems?&lt;br/&gt;Packages&lt;br/&gt;&lt;br/&gt;Discuss package management for the distribution. Test out some package installs. Which package repositories are preconfigured? How many packages are there for this distribution? What is the package manager? How easy was it to install applications? Did the newly installed packages work?&lt;br/&gt;Patches&lt;br/&gt;&lt;br/&gt;Describe the method provided by the distribution creators for patching the distribution. For example, are there any patches or does the user need to download a complete copy of the latest distribution? How easy is it to apply the patches?&lt;br/&gt;Performance&lt;br/&gt;&lt;br/&gt;Discuss the speed of the distribution if it differs significantly from other distributions. Does it boot extra quickly? Is the windowing system extremely responsive? Is the kernel optimized in any way that shows? Does the distribution run entirely within RAM? Did the install go extremely slow?&lt;br/&gt;Stability&lt;br/&gt;&lt;br/&gt;Describe the stability of the distribution. Do any of the applications crash? Does the distribution start the same every time? Does it have trouble with certain configurations of hardware such as laptops or old computers?&lt;br/&gt;Shutdown&lt;br/&gt;&lt;br/&gt;Describe what happens when the user exits. For example, if you shut down X via the Ctrl-Alt-Backspace key combination, do you return to a login screen or does the system shut down? Does it drop the user to a command line? Does the system power off automatically? Does it eject the CD during shutdown?&lt;br/&gt;Remastering&lt;br/&gt;&lt;br/&gt;Discuss any tools provided for rebuilding the distribution. How easily can you remaster the distribution? Is there any documentation for this task?&lt;br/&gt;Upgrade and rollback&lt;br/&gt;&lt;br/&gt;Discuss the process of moving to a newer or older version of the distribution after having done an install. Are there any tools provided to assist with this?&lt;br/&gt;Problems&lt;br/&gt;&lt;br/&gt;List all the problems you encountered. Discuss what you found confusing. What did not work as documented? What workarounds did you have to apply? Did the solutions provided by the official support staff or the user community work? Are problems noted on the Web site, and does the project have an expected schedule of when they will be fixed?&lt;br/&gt;Documentation&lt;br/&gt;&lt;br/&gt;Describe the documentation provided with the distribution. Are there man pages for every application? Is the info command included with full documentation? Does the distribution include the help files for each application? Are all the customized tools documented?&lt;br/&gt;Support&lt;br/&gt;&lt;br/&gt;Describe the official support for the distribution. How responsive are the creators to user questions? Are they open to receiving help? How complete is the Web site, and how easy is it to find help there? Are there other help forums, such as IRC channels, and do developers frequent them?&lt;br/&gt;User community&lt;br/&gt;&lt;br/&gt;Describe the user community to the extent you can judge from the distribution's forums. How large and active is it? How helpful is it? How friendly is it?&lt;br/&gt;Source code availability&lt;br/&gt;&lt;br/&gt;Describe the process of getting the software for the distribution. How easy is it to find all the software, especially for the customized tools? How well is it documented?&lt;br/&gt;Releases and roadmap&lt;br/&gt;&lt;br/&gt;Does the distribution have a regular release schedule? Is the schedule published? How closely do the creators adhere to the schedule? Describe the roadmap for the distribution. Are there documented plans for future releases? What things are in the roadmap?&lt;br/&gt;History&lt;br/&gt;&lt;br/&gt;Describe the history of the distribution. Has the distribution been stable at each release? How has the distribution changed over time? When did the distribution first appear and how often was it updated? Has the distribution been influential on other distributions or in other ways?&lt;br/&gt;Screenshots&lt;br/&gt;&lt;br/&gt;Provide useful screenshots, not just screenshots for the sake of having some pictures in your review. Useful screenshots mean noteworthy items described in the text, such as something that makes the distribution distinctive or anything particularly interesting.&lt;br/&gt;Links&lt;br/&gt;&lt;br/&gt;Provide links in your review not only to the distribution Web site but also to anything that is not directly related to the distribution you are reviewing. For example, if you mention other distributions you should include links to them.&lt;br/&gt;Your omissions&lt;br/&gt;&lt;br/&gt;List the things you did not test and the reasons why you did not.&lt;br/&gt;Your system and your perspective&lt;br/&gt;&lt;br/&gt;Describe the hardware and software configuration of your test machine. Did you have any esoteric hardware? Did you run the distribution inside a virtual machine?&lt;br/&gt;&lt;br/&gt;Describe your relevant experience. How long have you been using Linux? How many distributions have you tried? Which distributions do you regularly use? Are you an administrator or programmer?&lt;br/&gt;&lt;br/&gt;Discuss your reasons for reviewing this distribution. For example, do you want to describe the latest release of this distribution? Do the distribution creators make any special claims for this release or this distribution? Have you been using this distribution for day-to-day work?&lt;br/&gt;&lt;br/&gt;Disclose your biases. For example, do you prefer everything to be automated or would you rather have manual control? Do you have a favourite application that wasn't included when you thought it should be?&lt;br/&gt;Recommendations&lt;br/&gt;&lt;br/&gt;Summarize your review and your impressions. Compare this distribution against others of the same type. If the target audience is described by the creators, does the distribution meet the needs of the target audience? What kind of users will most like this distribution?&lt;br/&gt;Final words&lt;br/&gt;&lt;br/&gt;Consider having your review edited. Your review should be well-organized, clearly worded, and without grammar or spelling errors.&lt;br/&gt;&lt;br/&gt;This guide on writing reviews means that you won't be able to blast through a distribution in 20 minutes, but the extra time you take to cover so many items will be rewarded by your readers' interest and appreciation. They'll want to read the next thing you write. Your review may become the definitive standard against which all others are compared.&lt;br/&gt;Read in the original layout at: http://www.linux.com/feature/139593&lt;br/&gt;&lt;br/&gt;&lt;/blockquote&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2589537411099484208-6728771722589531433?l=dontburnmybeans.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dontburnmybeans.blogspot.com/feeds/6728771722589531433/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2589537411099484208&amp;postID=6728771722589531433' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2589537411099484208/posts/default/6728771722589531433'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2589537411099484208/posts/default/6728771722589531433'/><link rel='alternate' type='text/html' href='http://dontburnmybeans.blogspot.com/2008/07/how-to-write-thorought-review-of-linux.html' title='How to write a thorought review of a linux distribution'/><author><name>Jamtech</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/-RNwpfmrDdPU/Tn1tpZWh2zI/AAAAAAAAAHg/ICZaej4kWOk/s220/hitmana3_2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2589537411099484208.post-4298226202085277233</id><published>2008-07-09T18:58:00.000-07:00</published><updated>2009-04-18T21:25:15.780-07:00</updated><title type='text'>Beyond Your First Shell Script</title><content type='html'>Beyond Your First Shell Script&lt;br /&gt;August 1st, 1996 by Brian Rice in&lt;br /&gt;&lt;br /&gt;    * Software&lt;br /&gt;&lt;br /&gt;As your shell scripts get more complex, you'll need to put a directive at the beginning to tell the operating system what sort of shell script this is.&lt;br /&gt;&lt;br /&gt;So here it is—your first shell script:&lt;br /&gt;&lt;br /&gt;lpr weekly.report&lt;br /&gt;Mail boss &lt; weekly.report&lt;br /&gt;cp weekly.report /floppy/report.txt&lt;br /&gt;rm weekly.report&lt;br /&gt;&lt;br /&gt;You found yourself repeating the same few commands over and over: print out your weekly report, mail a copy to the boss, copy the report onto a floppy disc, and delete the original. So it was a big time saver when someone showed you that you can place those commands into a text file (“dealwithit”, for instance), mark the file as executable with chmod +x dealwithit, and then run it just by typing its filename.&lt;br /&gt;&lt;br /&gt;But you'd like to know more. This script you've written is not very robust; if you run it in the wrong directory, you get a cascade of ugly error messages. And the script is not very flexible either—if you'd like to print, mail, backup, and delete some other file, you'll have to create another version of the script. Finally, if someone asks you what kind of shell script you've written—Bourne? Korn? C shell?—you can't say. Then read on.&lt;br /&gt;&lt;br /&gt;Last question first: what kind of shell script is this? Actually, the script above is quite generic. It uses only features common to all the shells. Lucky you. As your shell scripts get more complex, you'll need to put a directive at the beginning to tell the operating system what sort of shell script this is.&lt;br /&gt;&lt;br /&gt;#!/bin/bash&lt;br /&gt;&lt;br /&gt;The #! should be the first two characters of the file, and the rest should be the complete pathname of the shell program you intend this script to be run by. Astute readers will note that this line looks like a comment, and, since it begins with a # character, it is one, syntactically. It's also magic.&lt;br /&gt;&lt;br /&gt;When the operating system tries to run a file as a program, it reads the first few bytes of the file (its “magic number”) to learn what kind of file it is. The byte pattern #! means that this is a shell script, and that the next several bytes, up to a newline character, make up the name of the binary that the OS should really run, feeding it this script file.&lt;br /&gt;&lt;br /&gt;Paranoid programmers will make sure that no spaces are placed after the executable name on the #! line. You are paranoid, aren't you? Good. Also, notice that running a shell script requires that it be read first; this is why you must have both read and execute permission to run a shell script file, while you need only execute permission to run a binary file.&lt;br /&gt;&lt;br /&gt;In this article, we will focus on writing programs for the Bourne shell and its descendants. A Bourne shell script will run flawlessly not only under the Bourne shell, but also under the Korn shell, which adds a variety of features for efficiency and ease of use. The Korn shell itself has two descendents of its own: the POSIX standard shell, which is virtually identical to the Korn shell; and a big Linux favorite, the Bourne Again shell. The Bourne Again shell (“bash”) adds mostly interactive features from the descendants of the C shell, Bill Joy's attempt to introduce a shell that would use C-like control structures. What a great idea! Due to a few good reasons, most shell programming has followed the Bourne shell side of the genealogical tree. But people love the C shell's interactive features, which is why they too were incorporated into the Bourne Again shell.&lt;br /&gt;&lt;br /&gt;Let me rephrase: do not write C shell scripts. Continue to use the C shell, or its descendant tcsh, interactively if you care to; your author does. But learn and use the Bourne/Korn/bash shells for scripting.&lt;br /&gt;&lt;br /&gt;So here is our shell script now:&lt;br /&gt;&lt;br /&gt;#!/bin/bash&lt;br /&gt;lpr weekly.report&lt;br /&gt;Mail boss &lt; weekly.report&lt;br /&gt;cp weekly.report /floppy/report.txt&lt;br /&gt;rm weekly.report&lt;br /&gt;&lt;br /&gt;If we run this script in the wrong directory, or if we accidentally name our file something other than “weekly.report”, here's what happens:&lt;br /&gt;&lt;br /&gt;lpr: weekly.report: No such file or directory&lt;br /&gt;./dealwithit: weekly.report: No such file or directory&lt;br /&gt;cp: weekly.report: No such file or directory&lt;br /&gt;rm: weekly.report: No such file or directory&lt;br /&gt;&lt;br /&gt;and we get a bunch of “Permission denied” messages if we run the script when the permissions on the file are wrong. Bleah. Couldn't we do a check at the beginning of the program, so that if something is wrong we can avert all these ugly messages? Indeed we can, using (surprise!) an if.&lt;br /&gt;&lt;br /&gt;It occurs to us that if cat weekly.report works, so will most of the things our script wants to do. The shell's if statement works just as this thought suggests: you give the if statement a command to try, and if the command runs successfully, it will run the other commands for you too. You also can specify some commands to run if the first command—called the “control command”--fails. Let's give it a try:&lt;br /&gt;&lt;br /&gt;#!/bin/bash&lt;br /&gt;if&lt;br /&gt;    cat weekly.report&lt;br /&gt;then&lt;br /&gt;    lpr weekly.report&lt;br /&gt;    Mail boss &lt; weekly.report&lt;br /&gt;    cp weekly.report /floppy/report.txt&lt;br /&gt;    rm weekly.report&lt;br /&gt;else&lt;br /&gt;  echo I see no weekly.report file here.&lt;br /&gt;fi&lt;br /&gt;&lt;br /&gt;The indentation is not mandatory, but does make your shell scripts easier to read. You can put the control command on the same line as the if keyword itself.&lt;br /&gt;&lt;br /&gt;This new version works great when there's an error. We get only one “No such file or directory” message, an improvement over four, and then our helpful personalized error message appears. But the script isn't so hot when it works: now we get the contents of weekly.report dumped to the screen as a preliminary. This is, after all, what cat does. Couldn't it just shut up?&lt;br /&gt;&lt;br /&gt;You may know something about redirecting input and output in the world of Unix: the &gt; character sends a command's output to a file, and the &lt; character arranges for a command to get its input from a file, as in our Mail command. So if only we could send the cat command's output to the trash can instead of to a file... Wait! Maybe there's a trash can file somewhere. There is: /dev/null. Any output sent to /dev/null dribbles out the back of the computer. So let's change our cat command to:&lt;br /&gt;&lt;br /&gt;cat weekly.report &gt;/dev/null&lt;br /&gt;&lt;br /&gt;Because you are paranoid, you may be wondering whether sending output to the trash can will affect whether this command succeeds or fails. Since /dev/null always exists and is writable by anyone, it will not fail.&lt;br /&gt;&lt;br /&gt;Now our script is much quieter. But when cat fails, we still see the&lt;br /&gt;&lt;br /&gt;cat: weekly.report: No such file or directory&lt;br /&gt;&lt;br /&gt;error message. Why didn't this go into the trash can too? Because error messages flow separately from output, even though they usually share a common destination: the screen. We redirected standard output, but said nothing about errors. To redirect the errors, we can:&lt;br /&gt;&lt;br /&gt;cat weekly.report &gt;/dev/null 2&gt;/dev/null&lt;br /&gt;&lt;br /&gt;Just as &gt; means “Send output here,” 2&gt; means “Send errors here.” In fact, &gt; is really just a synonym for 1&gt;. Another, terser way to say the above command is this:&lt;br /&gt;&lt;br /&gt;cat weekly.report &gt;/dev/null 2&gt;&amp;1&lt;br /&gt;&lt;br /&gt;The incantation 2&gt;&amp;1 means “Send errors (output stream number 2) to the same place ordinary output (output stream number 1) is going to.” By the way, this 2&gt; jazz only works in the Bourne shell and its descendants. The C shell makes it annoying to separate errors from output, which is one of the reasons people avoid programming in it.&lt;br /&gt;&lt;br /&gt;You may be saying to yourself: “This cat trick is fun, but isn't there some way I can just give a true-or-false expression? Like, either the file exists and is readable, or not?” Yes, you can. There is a command whose whole job is to succeed or fail depending on whether the expression you give is true or not: test. This is why your test programs called “test” never work, by the way. Here is our program, rewritten to use test:&lt;br /&gt;&lt;br /&gt;#!/bin/bash&lt;br /&gt;if&lt;br /&gt;    test -r weekly.report&lt;br /&gt;then&lt;br /&gt;    lpr weekly.report&lt;br /&gt;    Mail boss &lt; weekly.report&lt;br /&gt;    cp weekly.report /floppy/report.txt&lt;br /&gt;    rm weekly.report&lt;br /&gt;else&lt;br /&gt;    echo I see no weekly.report file here.&lt;br /&gt;fi&lt;br /&gt;&lt;br /&gt;The test command's -r operator means, “Does this file exist, and can I read it?” test is quiet regardless of whether it succeeds or fails, so there's no need for anything to get sent to /dev/null.&lt;br /&gt;&lt;br /&gt;Test also has an alternative syntax: you can use a [ character instead of the word test, so long as you have a ] at the end of the line. Be sure to put a space between any other characters and the [ and the ] characters! We can make our if look like this now:&lt;br /&gt;&lt;br /&gt;if [ -r weekly.report ]&lt;br /&gt;&lt;br /&gt;Hey, now that looks like a program! Even though we're using brackets, this is still the test command. There are lots of other things test can do for you; see its man page for the complete list. For example, we seem to recall that what lets you delete a file is not whether you can read it, but whether the directory it sits in gives you write permission. So we can re-write our script like this:&lt;br /&gt;&lt;br /&gt;#!/bin/bash&lt;br /&gt;if [ ! -r weekly.report ]&lt;br /&gt;then&lt;br /&gt;    echo I see no weekly.report file here.&lt;br /&gt;    exit 1&lt;br /&gt;fi&lt;br /&gt;    if [ ! -w . ]&lt;br /&gt;then&lt;br /&gt;    echo I will not be able to delete&lt;br /&gt;    echo weekly.report for you, so I give up.&lt;br /&gt;    exit 2&lt;br /&gt;fi&lt;br /&gt;# Real work omitted...&lt;br /&gt;&lt;br /&gt;Each test now has a ! character in it, which means “not”. So the first test succeeds if the weekly.report is not readable, and the second succeeds if the current directory (“.”) is not writable. In each case, the script prints an error message and exits. Notice that there's a different number fed to exit each time. This is how Unix commands (including if itself!) tell whether other commands succeed: if they exit with any exit code other than 0, they didn't. What each non-zero number (up to 255) means, other than “Something bad happened,” is up to you. But 0 always means success.&lt;br /&gt;&lt;br /&gt;If this seems backwards to you, give yourself a cookie. It is backwards. But there's a good design reason for it, and it's a universal Unix-command convention, so get used to it.&lt;br /&gt;&lt;br /&gt;Notice also that our real work no longer has an if wrapped around it. Our script will only get that far if none of our error conditions are detected. So we can just assume that all those error conditions are not in fact present! Real shell scripts exploit this property ruthlessly, often beginning with screenfuls of tests before any real work is done.&lt;br /&gt;&lt;br /&gt;Now that we've made our script more robust, let's work on making it more general. Most Unix commands can take an argument from their command lines that tells them what to do; why can't our script? Because it has “weekly.report” littered all through it, that's why. We need to replace weekly.report with something that means “the thing on the command line.” Meet $1.&lt;br /&gt;&lt;br /&gt;#!/bin/bash&lt;br /&gt;if [ ! -r $1 ]&lt;br /&gt;then&lt;br /&gt;    echo I see no $1 file here.&lt;br /&gt;    exit 1&lt;br /&gt;fi&lt;br /&gt;if [ ! -w . ]&lt;br /&gt;then&lt;br /&gt;    echo I will not be able to delete $1 for you.&lt;br /&gt;    echo So I give up.&lt;br /&gt;    exit 2&lt;br /&gt;fi&lt;br /&gt;lpr $1&lt;br /&gt;Mail boss &lt; $1&lt;br /&gt;# and so forth...&lt;br /&gt;exit 0&lt;br /&gt;&lt;br /&gt;$1 means the first argument on the command line. Yes, $2 means the second, $3 means the third, and so on. What's $0? The name of the command itself. So we can change our error messages so that they look like this:&lt;br /&gt;&lt;br /&gt;echo $0: I see no $1 file here.&lt;br /&gt;&lt;br /&gt;Ever noticed that Unix error messages introduce themselves? That's how.&lt;br /&gt;&lt;br /&gt;Unfortunately, now there's a new threat to our program: what if the user forgets to put an argument on the command line? Then the right thing for $1 to have in it would be nothing at all. We might be back to our cascade of error messages, since a lot of commands, such as rm, complain at you if you put nothing at all on their command lines. In this program's case, it's even worse, since the first time $1 is used is as an argument to test -r, and test will give you a syntax error if you ask it to test -r nothing at all. And what does lpr do if you put nothing at all on its command line? Try it! But be prepared; you could end up with a mess.&lt;br /&gt;&lt;br /&gt;Fortunately, test can help. Let's put this as the very first test in our program, right after the #!/bin/bash:&lt;br /&gt;&lt;br /&gt;if [ -z "$1" ]&lt;br /&gt;then&lt;br /&gt;    echo $0: usage: $0 filename&lt;br /&gt;    exit 3&lt;br /&gt;fi&lt;br /&gt;&lt;br /&gt;Now if the user puts nothing on the command line, we print a usage message and quit. The -z operator means “is this an empty string?”. Notice the double quotes around the $1: they are mandatory here. If you leave them out, test will give an error message in just the situation we are trying to detect. The quotes protect the nothing-at-all stored in $1 from causing a syntax error.&lt;br /&gt;&lt;br /&gt;This if clause appears at the very top of many, many shell scripts. Among its other benefits, it relieves us from having to wrap $1 in quote marks later in our program, since if $1 were empty we would have exited at the start. In fact, the only time quotes would still be necessary would be if $1 could contain characters with a special meaning to the shell, such as a space or a question mark. Filenames don't, usually.&lt;br /&gt;&lt;br /&gt;What if we want our script to be able to take a variable number of arguments? Most Unix commands can, after all. One way is clear: we could just cut and paste all the stuff in our shell script, so we'd have a bunch of commands that dealt with $1, then a bunch of commands that dealt with $2, and so forth. Sound like a good idea? No? Good for you; it's a terrible idea.&lt;br /&gt;&lt;br /&gt;First of all, there would be some fixed upper limit on the number of arguments we could handle, determined by when we got tired of cutting, pasting, and editing our script. Second, any time you have many copies of the same code, you have a quality problem waiting to happen. You'll forget to make a change, or fix a bug, all of the many places necessary. Third, we often hand wildcards, like *, to Unix commands on their command lines. These wildcards are expanded into a list of filenames before the command runs! So it's very easy to get a command line with more arguments than some arbitrary, low limit.&lt;br /&gt;&lt;br /&gt;Maybe we could use some kind of arithmetic trick to count through our arguments, like $i or something. This won't work either. The expression $i means “the contents of the variable called i”, not “the i'th thing on the command line.” Furthermore, not all shells let you refer to command-line words after $9 at all, and those that do make you use ${10}, ${11}, and so forth.&lt;br /&gt;&lt;br /&gt;So what do we do? This:&lt;br /&gt;&lt;br /&gt;while [ ! -z "$1" ]&lt;br /&gt;do&lt;br /&gt;    # do stuff to $1&lt;br /&gt;    shift&lt;br /&gt;done&lt;br /&gt;&lt;br /&gt;Here's how we read that script: “While there's something in $1, we mess with it. Immediately after we finish messing with it, we do the shift command, which moves the contents of $2 into $1, the contents of $3 into $2, and so forth, regardless of how many of these command-line arguments there are. Then we go back and do it all again. We know we've finished when there's nothing at all in $1.”&lt;br /&gt;&lt;br /&gt;This technique allows us to write a script that can handle any number of arguments, while only dealing with $1 at a time. So now our script looks like this:&lt;br /&gt;&lt;br /&gt;#!/bin/bash&lt;br /&gt;while [ ! -z "$1" ]&lt;br /&gt;do&lt;br /&gt;    # do stuff to $1&lt;br /&gt;    if [ ! -r $1 ]&lt;br /&gt;    then&lt;br /&gt;        echo $0: I see no $1 file here.&lt;br /&gt;        exit 1&lt;br /&gt;    fi&lt;br /&gt;        # omitted test...&lt;br /&gt;    lpr $1&lt;br /&gt;    Mail boss &lt; $1&lt;br /&gt;    # and so forth...&lt;br /&gt;    shift&lt;br /&gt;done&lt;br /&gt;exit 0&lt;br /&gt;&lt;br /&gt;Notice that we nested if inside while. We can do that all we like. Also notice that this program quits the instant it finds something wrong. If you would like it to continue on to the next argument instead of bombing out, just replace an exit with:&lt;br /&gt;&lt;br /&gt;shift&lt;br /&gt;continue&lt;br /&gt;&lt;br /&gt;The continue command just means “Go back up to the top of the loop right now, and try the control command again.” Thought question: why did we have to put a shift right before the continue?&lt;br /&gt;&lt;br /&gt;Here's a potential problem: we've made it easy for someone to use this program on files that live in different directories. But we're only testing the current directory for writability. Instead, we should do this:&lt;br /&gt;&lt;br /&gt;if [ ! -w `dirname $1` ]&lt;br /&gt;then&lt;br /&gt;    echo $0: I will not be able to delete $1 for you.&lt;br /&gt;    # ...&lt;br /&gt;&lt;br /&gt;The dirname command prints out what directory a file is in, judging from its pathname. If you give dirname a filename that doesn't start with a directory, it will print “.”--the current directory. And those backquotes? Unlike all other kinds of quotation marks, they don't mean “this is really all one piece ignore spaces.” Instead, backquotes—also called “grave accents”--mean “Run the command inside the backquotes before you run the whole command line. Capture all of the backquoted command's output, and pretend that was what appeared on the larger command line instead of the junk in backquotes.” In other words, we are substituting a command's output into another command line.&lt;br /&gt;&lt;br /&gt;So here is the final version of our shell script:&lt;br /&gt;&lt;br /&gt;#!/bin/bash&lt;br /&gt;while [ ! -z "$1" ]&lt;br /&gt;do&lt;br /&gt;    if [ ! -r $1 ]&lt;br /&gt;    then&lt;br /&gt;        echo $0: I see no $1 file here.&lt;br /&gt;        shift&lt;br /&gt;        continue&lt;br /&gt;    fi&lt;br /&gt;    if [ ! -w `dirname $1` ]&lt;br /&gt;    then&lt;br /&gt;        echo $0: I will not be able to delete $1 for you.&lt;br /&gt;        shift&lt;br /&gt;        continue&lt;br /&gt;    fi&lt;br /&gt;    lpr $1&lt;br /&gt;    Mail boss &lt; $1&lt;br /&gt;    cp $1 /floppy/`basename $1`&lt;br /&gt;    rm $1&lt;br /&gt;    shift&lt;br /&gt;done&lt;br /&gt;exit 0&lt;br /&gt;&lt;br /&gt;An exercise for the reader: what does `basename $1` do?&lt;br /&gt;&lt;br /&gt;Now there are only two other techniques you need to know to meet the vast majority of your scripting needs. First, suppose you really do need to count. How do we do the equivalent of a C for loop? Here's the traditional Bourne shell way:&lt;br /&gt;&lt;br /&gt;i=0&lt;br /&gt;upperlim=10&lt;br /&gt;while [ $i -lt $upperlim ]&lt;br /&gt;do&lt;br /&gt;    # mess with $i&lt;br /&gt;    i=`expr $i + 1`&lt;br /&gt;done&lt;br /&gt;&lt;br /&gt;Notice that we did not use the for keyword. for is for something else entirely. Instead, here we initialize a variable i to 0, then we enter and remain in the loop as long as the value in i is less than 10. (Fortran programmers will recognize -lt as the less-than operator; guess why &gt; is not used in this context.) The rather mysterious line&lt;br /&gt;&lt;br /&gt;i=`expr $i + 1`&lt;br /&gt;&lt;br /&gt;calls the expr command, which evaluates arithmetic expression. We stuff expr's output back into i using backquotes.&lt;br /&gt;&lt;br /&gt;Ugly, isn't it? And not especially fast either, since we are running a command every time we want to add 1 to i. Can't the shell just do the arithmetic itself? If the shell is the Bourne shell, no, it can't. But the Korn shell can:&lt;br /&gt;&lt;br /&gt;((i=i+1))&lt;br /&gt;&lt;br /&gt;Use that syntax if it works, and if you don't need portability. The bash shell uses something similar:&lt;br /&gt;&lt;br /&gt;i=$(($i+1))&lt;br /&gt;&lt;br /&gt;which is a bit more portable (it even works in the Korn shell), since it is specified by POSIX, but still won't work for some non-POSIX bourne shells.&lt;br /&gt;&lt;br /&gt;So what does for do? It allows you to wade through a list of items, assigning a variable to each element of the list in turn. Here's a trivial example:&lt;br /&gt;&lt;br /&gt;for a in Larry Moe Curly&lt;br /&gt;do&lt;br /&gt;    echo $a&lt;br /&gt;done&lt;br /&gt;&lt;br /&gt;which would print&lt;br /&gt;&lt;br /&gt;Larry&lt;br /&gt;Moe&lt;br /&gt;Curly&lt;br /&gt;&lt;br /&gt;Less trivially, we can use this to handle the case where we want to do something for each word in a variable:&lt;br /&gt;&lt;br /&gt;mylist="apple banana cheese rutabaga"&lt;br /&gt;for w in $mylist&lt;br /&gt;do&lt;br /&gt;    # mess with $w&lt;br /&gt;done&lt;br /&gt;&lt;br /&gt;or for each file matched by a shell wildcard pattern:&lt;br /&gt;&lt;br /&gt;for f in /docs/reports/*.txt&lt;br /&gt;do&lt;br /&gt;    pr -h $f $f | lpr&lt;br /&gt;done&lt;br /&gt;&lt;br /&gt;or for each word in the output of a command:&lt;br /&gt;&lt;br /&gt;for a in `cat people.txt`&lt;br /&gt;do&lt;br /&gt;    banner $a&lt;br /&gt;done&lt;br /&gt;&lt;br /&gt;Here's how you can use for to simulate the C for you know and love:&lt;br /&gt;&lt;br /&gt;for i in 0 1 2 3 4 5 6 7 8 9 10 11&lt;br /&gt;do&lt;br /&gt;    # mess with $i&lt;br /&gt;done&lt;br /&gt;&lt;br /&gt;Of course, it'd be very difficult to have a variable upper limit with this syntax, which is why we usually use the while loop shown above.&lt;br /&gt;&lt;br /&gt;Congratulations! You've now seen what's at work in the vast bulk of practical shell scripts. Go forth and save time!&lt;br /&gt;&lt;br /&gt;Brian Rice (rice@kcomputing.com) s Member of Technical Staff with K Computing, a nationwide Unix and Internet training firm.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2589537411099484208-4298226202085277233?l=dontburnmybeans.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dontburnmybeans.blogspot.com/feeds/4298226202085277233/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2589537411099484208&amp;postID=4298226202085277233' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2589537411099484208/posts/default/4298226202085277233'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2589537411099484208/posts/default/4298226202085277233'/><link rel='alternate' type='text/html' href='http://dontburnmybeans.blogspot.com/2008/07/beyond-your-first-shell-script.html' title='Beyond Your First Shell Script'/><author><name>Jamtech</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/-RNwpfmrDdPU/Tn1tpZWh2zI/AAAAAAAAAHg/ICZaej4kWOk/s220/hitmana3_2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2589537411099484208.post-8781109820908111393</id><published>2008-07-09T18:38:00.001-07:00</published><updated>2009-04-18T21:26:15.850-07:00</updated><title type='text'>Validating an IP Address in a Bash Script</title><content type='html'>Validating an IP Address in a Bash Script&lt;br /&gt;June 26th, 2008 by Mitch Frazier in&lt;br /&gt;&lt;br /&gt;I've recently written about using bash arrays and bash regular expressions, so here's a more useful example of using them to test IP addresses for validity.&lt;br /&gt;&lt;br /&gt;To belabor the obvious: IP addresses are 32 bit values written as four numbers (the individual bytes of the IP address) separated by dots (periods). Each of the four numbers has a valid range of 0 to 255.&lt;br /&gt;&lt;br /&gt;The following bash script contains a bash function which returns true if it is passed a valid IP address and false otherwise. In bash speak true means it exits with a zero status, anything else is false. The status of a command/function is stored in the bash variable "$?".&lt;br /&gt;&lt;br /&gt;#!/bin/bash&lt;br /&gt;&lt;br /&gt;# Test an IP address for validity:&lt;br /&gt;# Usage:&lt;br /&gt;#      valid_ip IP_ADDRESS&lt;br /&gt;#      if [[ $? -eq 0 ]]; then echo good; else echo bad; fi&lt;br /&gt;#   OR&lt;br /&gt;#      if valid_ip IP_ADDRESS; then echo good; else echo bad; fi&lt;br /&gt;#&lt;br /&gt;function valid_ip()&lt;br /&gt;{&lt;br /&gt;   local  ip=$1&lt;br /&gt;   local  stat=1&lt;br /&gt;&lt;br /&gt;   if [[ $ip =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]]; then&lt;br /&gt;       OIFS=$IFS&lt;br /&gt;       IFS='.'&lt;br /&gt;       ip=($ip)&lt;br /&gt;       IFS=$OIFS&lt;br /&gt;       [[ ${ip[0]} -le 255 &amp;amp;&amp;amp; ${ip[1]} -le 255 \&lt;br /&gt;           &amp;amp;&amp;amp; ${ip[2]} -le 255 &amp;amp;&amp;amp; ${ip[3]} -le 255 ]]&lt;br /&gt;       stat=$?&lt;br /&gt;   fi&lt;br /&gt;   return $stat&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;# If run directly, execute some tests.&lt;br /&gt;if [[ "$(basename $0 .sh)" == 'valid_ip' ]]; then&lt;br /&gt;   ips='&lt;br /&gt;       4.2.2.2&lt;br /&gt;       a.b.c.d&lt;br /&gt;       192.168.1.1&lt;br /&gt;       0.0.0.0&lt;br /&gt;       255.255.255.255&lt;br /&gt;       255.255.255.256&lt;br /&gt;       192.168.0.1&lt;br /&gt;       192.168.0&lt;br /&gt;       1234.123.123.123&lt;br /&gt;       '&lt;br /&gt;   for ip in $ips&lt;br /&gt;   do&lt;br /&gt;       if valid_ip $ip; then stat='good'; else stat='bad'; fi&lt;br /&gt;       printf "%-20s: %s\n" "$ip" "$stat"&lt;br /&gt;   done&lt;br /&gt;fi&lt;br /&gt;&lt;br /&gt;If you save this script as "valid_ip.sh" and then run it directly it will run some tests and prints the results:&lt;br /&gt;&lt;br /&gt; # sh valid_ip.sh&lt;br /&gt; 4.2.2.2             : good&lt;br /&gt; a.b.c.d             : bad&lt;br /&gt; 192.168.1.1         : good&lt;br /&gt; 0.0.0.0             : good&lt;br /&gt; 255.255.255.255     : good&lt;br /&gt; 255.255.255.256     : bad&lt;br /&gt; 192.168.0.1         : good&lt;br /&gt; 192.168.0           : bad&lt;br /&gt; 1234.123.123.123    : bad&lt;br /&gt;&lt;br /&gt;In the function valid_ip, the if statement uses a regular expression to make sure the subject IP address consists of four dot separated numbers:&lt;br /&gt;&lt;br /&gt; if [[ $ip =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]]; then&lt;br /&gt;&lt;br /&gt;If that test passes then the code inside the if statement separates the subject IP address into four parts at the dots and places the parts in an array:&lt;br /&gt;&lt;br /&gt; OIFS=$IFS&lt;br /&gt; IFS='.'&lt;br /&gt; ip=($ip)&lt;br /&gt; IFS=$OIFS&lt;br /&gt;&lt;br /&gt;It does this by momentarily changing bash's Internal Field Separator variable so that rather than parsing words as whitespace separated items, bash parses them as dot separated. Putting the value of the subject IP address inside parenthesis and assigning it to itself thereby turns it into an array where each dot separated number is assigned to an array slot. Now the individual pieces are tested to make sure they're all less than or equal to 255 and the status of the test is saved so that it can be returned to the caller:&lt;br /&gt;&lt;br /&gt; [[ ${ip[0]} -le 255 &amp;amp;&amp;amp; ${ip[1]} -le 255 \&lt;br /&gt;         &amp;amp;&amp;amp; ${ip[2]} -le 255 &amp;amp;&amp;amp; ${ip[3]} -le 255 ]]&lt;br /&gt; stat=$?&lt;br /&gt;&lt;br /&gt;Note that there's no need to test that the numbers are greater than or equal to zero because the regular expression test has already eliminated any thing that doesn't consist of only dots and digits. __________________________&lt;br /&gt;&lt;br /&gt;Mitch Frazier is the System Administrator at Linux Journal.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2589537411099484208-8781109820908111393?l=dontburnmybeans.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dontburnmybeans.blogspot.com/feeds/8781109820908111393/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2589537411099484208&amp;postID=8781109820908111393' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2589537411099484208/posts/default/8781109820908111393'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2589537411099484208/posts/default/8781109820908111393'/><link rel='alternate' type='text/html' href='http://dontburnmybeans.blogspot.com/2008/07/validating-ip-address-in-bash-script.html' title='Validating an IP Address in a Bash Script'/><author><name>Jamtech</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/-RNwpfmrDdPU/Tn1tpZWh2zI/AAAAAAAAAHg/ICZaej4kWOk/s220/hitmana3_2.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2589537411099484208.post-3787275527091131251</id><published>2008-06-17T23:15:00.001-07:00</published><updated>2009-04-18T21:14:06.400-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Linux'/><title type='text'>Things to do after installing openSUSE 11.0</title><content type='html'>&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;&lt;a title="Permanent Link: Things to do after installing openSUSE 11.0" rel="bookmark" href="http://www.benkevan.com/blog/things-to-do-after-installing-opensuse-110/"&gt;Things to do after installing openSUSE 11.0&lt;/a&gt;&lt;br /&gt;&lt;h2 class="title"&gt;&lt;font size="3"&gt;&lt;a title="Ben Kevan's Blog Home" href="http://www.benkevan.com/blog/"&gt;Ben Kevan’s Blog&lt;/a&gt; :&lt;/font&gt;&lt;/h2&gt;&lt;font size="3"&gt;So you’ve downloaded and installed openSUSE 11.0. Are you now wondering&lt;br /&gt;&lt;/font&gt;&lt;p&gt;&lt;font size="3"&gt;what you may have to do post installation, here’s a quick run down:&lt;/font&gt;&lt;/p&gt;Setup suggested repositories&lt;br /&gt;&lt;p&gt;&lt;font size="3"&gt;Setup your Video Card (if you have more configurations to do, ie Nvidia / ATI)&lt;br /&gt;&lt;br /&gt;Get Compiz running (if you wish)&lt;br /&gt;&lt;br /&gt;Codec Support (Restricted Formats, multimedia)&lt;br /&gt;&lt;br /&gt;Install various applications&lt;/font&gt;&lt;/p&gt;&lt;font size="3"&gt;So here we go:&lt;/font&gt;&lt;font size="3"&gt;&lt;br /&gt;&lt;/font&gt;&lt;p&gt;&lt;font size="3"&gt;Setting up repositories:&lt;/font&gt;&lt;/p&gt;For my machine I added the following repositories for my final build:&lt;br /&gt;&lt;p&gt;&lt;font size="2"&gt;http://download.videolan.org/pub/vlc/SuSE/11.0 (VLC Media, restricted formats)&lt;br /&gt;&lt;br /&gt;http://download.opensuse.org/repositories/KDE:/KDE4:/STABLE:/Desktop/openSUSE_11.0/&lt;br /&gt;(KDE 4 Stable) Note: if this was not my workbox, I would actually do&lt;br /&gt;Unstable to get KDE 4.1&lt;br /&gt;&lt;br /&gt;http://download.opensuse.org/repositories/Emulators:/Wine/openSUSE_11.0/ (Wine, for windows emulation)&lt;br /&gt;&lt;br /&gt;http://download.opensuse.org/repositories/KDE:/Backports/openSUSE_11.0/&lt;br /&gt;(KDE Backports, updates to Amarok and other KDE Applications)&lt;br /&gt;&lt;br /&gt;http://download.opensuse.org/repositories/X11:/XGL/openSUSE_11.0/&lt;br /&gt;(Compiz Fusion, staying up to date and hip with the most recent Compiz&lt;br /&gt;builds, I highly recommend since it’s constantly developed on)&lt;br /&gt;&lt;br /&gt;http://ftp.skynet.be/pub/packman/suse/11.0/ (Packman, xinelibs / codecs and so much more)&lt;br /&gt;&lt;br /&gt;http://download.opensuse.org/repositories/mozilla/openSUSE_11.0/ (Firefox, recent builds of Firefox)&lt;br /&gt;&lt;br /&gt;http://download.opensuse.org/repositories/GNOME:/Community/openSUSE_11.0/ (Gnome Community, I use for Pidgin and GIMP)&lt;br /&gt;&lt;br /&gt;http://download.opensuse.org/repositories/OpenOffice.org:/STABLE/openSUSE_11.0/&lt;br /&gt;(OpenOffice is an important application for me since I use it daily for&lt;br /&gt;word processing or spreadsheets, keeping it up to date allows for the&lt;br /&gt;best compatabilities with people using restricted formats like xls/doc)&lt;br /&gt;&lt;br /&gt;http://download.opensuse.org/repositories/Education:/desktop/openSUSE_11.0/ (Education - For Bluefish)&lt;br /&gt;&lt;br /&gt;http://download.opensuse.org/repositories/KDE:/KDE3/openSUSE_11.0/ (KDE&lt;br /&gt;Stable repository, not sure why because not many changes should happen&lt;br /&gt;to the 3.5.9 family)&lt;/font&gt;&lt;/p&gt;&lt;font size="3"&gt;&lt;br /&gt;&lt;/font&gt;&lt;p&gt;&lt;font size="3"&gt;Here is a quick screenshot of my repositories:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.benkevan.com/gallery/albums/userpics/10001/Software_Repos.jpg"&gt;&lt;img alt="Configured Repos" src="http://www.benkevan.com/gallery/albums/userpics/10001/normal_Software_Repos.jpg" height="147" width="400"&gt;&lt;/a&gt;&lt;/font&gt;&lt;/p&gt;&lt;font size="3"&gt;&lt;br /&gt;&lt;/font&gt;&lt;p&gt;&lt;font size="3"&gt;(Note: I am running KDE, if you are running GNOME, I highly recommend the following repo:&lt;br /&gt;&lt;br /&gt;http://download.opensuse.org/repositories/GNOME:/STABLE/openSUSE_11.0/)&lt;br /&gt;&lt;br /&gt;(Note: If you are running an NVIDIA card, setup the following repository:&lt;br /&gt;&lt;br /&gt;ftp://download.nvidia.com/opensuse/11.0/)&lt;br /&gt;&lt;br /&gt;(Note: If you are running an ATI card, setup the following repository:&lt;br /&gt;&lt;br /&gt;http://www2.ati.com/suse/11.0/)&lt;br /&gt;&lt;br /&gt;(Note: If you are running a wireless card that has a requirement for MadWifi, setup the following repository:&lt;br /&gt;&lt;br /&gt;http://madwifi.org/suse/11.0/)&lt;/font&gt;&lt;/p&gt;&lt;font size="3"&gt;&lt;br /&gt;&lt;/font&gt;&lt;p&gt;&lt;font size="3"&gt;Setup your Video Card (if you have more configurations to do, ie Nvidia / ATI)&lt;br /&gt;&lt;br /&gt;Install the packages that are associated with your NVIDIA / ATI card.&lt;/font&gt;&lt;/p&gt;&lt;font size="3"&gt;&lt;br /&gt;&lt;/font&gt;&lt;p&gt;&lt;font size="3"&gt;For me I downloaded the NVIDIA Driver from nvidia.com and installing running:&lt;br /&gt;&lt;br /&gt;sudo sh NVIDIA-Linux-x86-173.08-pkg1.run&lt;br /&gt;&lt;br /&gt;Since I had some issues with the 173.14 driver.&lt;/font&gt;&lt;/p&gt;&lt;font size="3"&gt;&lt;br /&gt;&lt;/font&gt;&lt;p&gt;&lt;font size="3"&gt;Get Compiz running (if you wish)&lt;br /&gt;&lt;br /&gt;With openSUSE 11.0 it works out of the box, but I recommend installing&lt;br /&gt;some of the other packages that don’t come installed by default also&lt;br /&gt;updating to the Compiz Fusions newest build service.&lt;/font&gt;&lt;/p&gt;&lt;font size="3"&gt;&lt;br /&gt;&lt;/font&gt;&lt;p&gt;&lt;font size="3"&gt;Here are the compiz packages I have installed:&lt;br /&gt;&lt;br /&gt;rpm -qa | grep compiz&lt;br /&gt;&lt;br /&gt;compiz-fusion-plugins-main-0.7.6-2.6&lt;br /&gt;&lt;br /&gt;compiz-fusion-plugins-extra-0.7.6-1.3&lt;br /&gt;&lt;br /&gt;compizconfig-settings-manager-0.7.6-1.6&lt;br /&gt;&lt;br /&gt;compiz-kde-0.7.6-2.5&lt;br /&gt;&lt;br /&gt;compiz-emerald-0.7.6-1.6&lt;br /&gt;&lt;br /&gt;compiz-manager-0.0.1_git080201-24.1&lt;br /&gt;&lt;br /&gt;compiz-emerald-themes-0.6.0-16.1&lt;br /&gt;&lt;br /&gt;compiz-0.7.6-2.5&lt;br /&gt;&lt;br /&gt;libcompizconfig-0.7.6-1.6&lt;br /&gt;&lt;br /&gt;python-compizconfig-0.7.6-1.6&lt;/font&gt;&lt;/p&gt;&lt;font size="3"&gt;&lt;br /&gt;&lt;/font&gt;&lt;p&gt;&lt;font size="3"&gt;sudo zypper up -t package -r “Compiz Fusion”&lt;br /&gt;&lt;br /&gt;(Note: I named my Compiz Fusion repository Compiz Fusion, the -r switch&lt;br /&gt;is for your Repo Alias that you have included into your Repository&lt;br /&gt;Configuraiton)&lt;/font&gt;&lt;/p&gt;&lt;font size="3"&gt;&lt;br /&gt;&lt;/font&gt;&lt;p&gt;&lt;font size="3"&gt;Codec Support (Restricted Formats, multimedia)&lt;br /&gt;&lt;br /&gt;Install the restricted formats you want to (i personally do not install&lt;br /&gt;libdvdcss since I have no need to play dvd’s on my work machine, and it&lt;br /&gt;is prohibited in the US (for now)). This should allow you to play avi /&lt;br /&gt;mpg / mp3 / dvd’s and many other formats&lt;/font&gt;&lt;/p&gt;&lt;font size="3"&gt;&lt;br /&gt;&lt;/font&gt;&lt;p&gt;&lt;font size="3"&gt;You can install by running: (this requires packman and vlc repositories)&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;sudo zypper in libdvdcss libxine1 w32codec-all k3b-codecs&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;&lt;font size="3"&gt;&lt;br /&gt;&lt;/font&gt;&lt;p&gt;&lt;font size="3"&gt;Note: if this is a home machine for multimedia I recommend also installing vlc by running:&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;sudo zypper in vlc&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;&lt;font size="3"&gt;&lt;br /&gt;&lt;/font&gt;&lt;p&gt;&lt;font size="3"&gt;Install various applications&lt;br /&gt;&lt;br /&gt;I typically install wine, opera, pidgin and bluefish from the repos.&lt;br /&gt;&lt;br /&gt;I also install vmware for my daily work needs.&lt;/font&gt;&lt;/p&gt;&lt;font size="3"&gt;&lt;br /&gt;&lt;/font&gt;&lt;p&gt;&lt;font size="3"&gt;You can install running:&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;sudo zypper in wine opera pidgin bluefish&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;sudo rpm -ivh sudo rpm -ivh VMware-workstation-6.0.4-93057.i386.rpm&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;I then configured vmware by running:&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;sudo /usr/bin/vmware-config.pl&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;(Note: you have to install kernel-source, gcc, gcc++ and make)&lt;br /&gt;&lt;br /&gt;You can install running:&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;sudo zypper in make kernel-source gcc gcc-c++&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;You can check my &lt;a href="http://www.benkevan.com/wiki/index.php/Installing_VMWare_Workstation_6.0.4_on_openSUSE_11.0"&gt;wiki located here&lt;/a&gt; for more indept installation procedures&lt;/font&gt;&lt;/p&gt;&lt;font size="3"&gt;&lt;br /&gt;&lt;/font&gt;&lt;p&gt;&lt;font size="3"&gt;Here is a screenshot of my machine running KDE 3.5.9, openSUSE 11.0 and Compiz Fusion:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.benkevan.com/gallery/albums/userpics/10001/Linux_Force_SH.jpg"&gt;&lt;img alt="Screenshot" src="http://www.benkevan.com/gallery/albums/userpics/10001/normal_Linux_Force_SH.jpg" height="250" width="400"&gt;&lt;/a&gt;&lt;/font&gt;&lt;/p&gt;&lt;font size="3"&gt;&lt;br /&gt;&lt;/font&gt;&lt;p&gt;&lt;font size="3"&gt;Bonus: I also installed the Oxygen packages for yast, to beautify my KDE 3.5.9 yast, you can do the same by running:&lt;br /&gt;&lt;br /&gt;sudo zypper in yast2-theme-openSUSE-Oxygen&lt;/font&gt;&lt;/p&gt;&lt;font size="3"&gt;&lt;br /&gt;&lt;/font&gt;&lt;p&gt;&lt;font size="3"&gt;&lt;a href="http://www.benkevan.com/gallery/albums/userpics/10001/YaST2_Oxygen.jpg"&gt;&lt;img alt="YaST2 Oxygen" src="http://www.benkevan.com/gallery/albums/userpics/10001/normal_YaST2_Oxygen.jpg" height="169" width="400"&gt;&lt;/a&gt;&lt;/font&gt;&lt;/p&gt;&lt;font size="3"&gt;&lt;br /&gt;&lt;/font&gt;&lt;p&gt;&lt;font size="3"&gt;Please if you believe there is more to be done after installing&lt;br /&gt;openSUSE 11.0 let me know so I can update this, and it can be helpful&lt;br /&gt;to a bigger vast of people.&lt;/font&gt;&lt;/p&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2589537411099484208-3787275527091131251?l=dontburnmybeans.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dontburnmybeans.blogspot.com/feeds/3787275527091131251/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2589537411099484208&amp;postID=3787275527091131251' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2589537411099484208/posts/default/3787275527091131251'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2589537411099484208/posts/default/3787275527091131251'/><link rel='alternate' type='text/html' href='http://dontburnmybeans.blogspot.com/2008/06/things-to-do-after-installing-opensuse.html' title='Things to do after installing openSUSE 11.0'/><author><name>Jamtech</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/-RNwpfmrDdPU/Tn1tpZWh2zI/AAAAAAAAAHg/ICZaej4kWOk/s220/hitmana3_2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2589537411099484208.post-625103064339728901</id><published>2008-06-17T22:20:00.000-07:00</published><updated>2008-06-17T22:21:03.298-07:00</updated><title type='text'>Programming Python, Part II</title><content type='html'>Programming Python, Part II&lt;br /&gt;    July 1st, 2007 by José P. E. "Pupeno" Fernandez in&lt;br /&gt;&lt;br /&gt;    * HOWTOs&lt;br /&gt;&lt;br /&gt;    Having covered some advanced features in Part I, it's time to include some basics.&lt;br /&gt;&lt;br /&gt;    The tutorial in last month's issue covered the basics of installing Python, running it and using it. Then, we moved on to building a basic blog in Python. The blog was extremely simple—only a Python list. We focused on the posts and built a Post class:&lt;br /&gt;&lt;br /&gt;    class Post(object):&lt;br /&gt;    def __init__(self, title, body):&lt;br /&gt;    self.set_title(title)&lt;br /&gt;    self.set_body(body)&lt;br /&gt;&lt;br /&gt;    def set_title(self, title):&lt;br /&gt;    self._title = title&lt;br /&gt;&lt;br /&gt;    def get_title(self):&lt;br /&gt;    return self._title&lt;br /&gt;&lt;br /&gt;    def set_body(self, body):&lt;br /&gt;    self._body = body&lt;br /&gt;&lt;br /&gt;    def get_body(self):&lt;br /&gt;    return self._body&lt;br /&gt;&lt;br /&gt;    def __repr__(self):&lt;br /&gt;    return "Blog Post: %s" % self.get_title()&lt;br /&gt;&lt;br /&gt;    In this follow-up article, let's focus on the blog itself and go further.&lt;br /&gt;    The Blog&lt;br /&gt;&lt;br /&gt;    Now that we have the Post class, we can make the Blog class. An initial implementation may look like this:&lt;br /&gt;&lt;br /&gt;    class Blog(object):&lt;br /&gt;    def __init__(self):&lt;br /&gt;    self._posts = []&lt;br /&gt;&lt;br /&gt;    def add_post(self, post):&lt;br /&gt;    self._posts.append(post)&lt;br /&gt;&lt;br /&gt;    def get_posts(self):&lt;br /&gt;    return self._posts&lt;br /&gt;&lt;br /&gt;    We are using a list to maintain the posts, but the interface is totally abstract behind a set of methods in the Blog class. This has a huge advantage: tomorrow we could replace that simple list with an SQL back end, and the code that uses Blog will need few, if any, changes.&lt;br /&gt;&lt;br /&gt;    Notice that there's no way to delete a post. We could tamper with _posts directly, but as long as we do what the class was meant to do, we can't delete a post. That may be good or bad, but the important thing is that by defining a set of methods, we exposed the design of how the class should be used.&lt;br /&gt;    To Publish or Not to Publish&lt;br /&gt;&lt;br /&gt;    The method get_posts returns all the posts. When we are writing a new post, we don't want the whole world to be able to read it until it is finished. The posts need a new member that tell whether it is published. In Post's initalizator, __init__, we add the line:&lt;br /&gt;&lt;br /&gt;    self._published = False&lt;br /&gt;&lt;br /&gt;    That makes every new post private by default. To switch states, we add the methods:&lt;br /&gt;&lt;br /&gt;    def publish(self):&lt;br /&gt;    self._published = True&lt;br /&gt;&lt;br /&gt;    def hide(self):&lt;br /&gt;    self._published = False&lt;br /&gt;&lt;br /&gt;    def is_public(self):&lt;br /&gt;    return self._published&lt;br /&gt;&lt;br /&gt;    In these methods, I introduced a new kind of variable—the boolean. Booleans are simple; they can be true or false. Let's play with that a bit:&lt;br /&gt;&lt;br /&gt;    /&amp;gt;&amp;gt;&amp;gt; cool = blog.Post("Cool", "Python is cool")&lt;br /&gt;    /&amp;gt;&amp;gt;&amp;gt; cool.is_public()&lt;br /&gt;    False&lt;br /&gt;    /&amp;gt;&amp;gt;&amp;gt; cool.publish()&lt;br /&gt;    /&amp;gt;&amp;gt;&amp;gt; cool.is_public()&lt;br /&gt;    True&lt;br /&gt;    /&amp;gt;&amp;gt;&amp;gt; cool.hide()&lt;br /&gt;    /&amp;gt;&amp;gt;&amp;gt; cool.is_public()&lt;br /&gt;    False&lt;br /&gt;    /&amp;gt;&amp;gt;&amp;gt;&lt;br /&gt;&lt;br /&gt;    If, when you run is_public, you get:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;    Traceback (most recent call last):&lt;br /&gt;    File "", line 1, in ?&lt;br /&gt;    File "blog.py", line 25, in is_public&lt;br /&gt;    return self._published&lt;br /&gt;    AttributeError: 'Post' object has no attribute&lt;br /&gt;    '_published'&lt;br /&gt;&lt;br /&gt;    That's because _published was not created, it can't be used, and is_public wants to use it. Understanding errors in your tools is important if you want to be a successful programmer.&lt;br /&gt;&lt;br /&gt;    In this short set of messages, the last line is the error itself. There are various types of errors, and this one is an AttributeError. A lot of important information is given in the traceback. A traceback is a list of “who called whom”, providing an idea of what was being executed when the error occurred.&lt;br /&gt;&lt;br /&gt;    The first line of the traceback doesn't give much information. It probably relates to the line we typed at the REPL. The second line tells that the error was in the file blog.py, on line 25, on the method is_public. Now we have the line that raised the problem.&lt;br /&gt;&lt;br /&gt;    This traceback is simple. In a real application, you would have methods that call methods that call methods and so on. In those cases, it is not uncommon to see tracebacks of 25 lines or more. I've seen tracebacks of more than 150 lines, but those were extreme cases in extreme conditions.&lt;br /&gt;&lt;br /&gt;    The next step is a modification to the Blog class to pick up only published posts. So, we add a new method:&lt;br /&gt;&lt;br /&gt;    def get_public_posts(self):&lt;br /&gt;    published_posts = []&lt;br /&gt;    for post in self._posts:&lt;br /&gt;    if port.is_public():&lt;br /&gt;    published_posts.append(post)&lt;br /&gt;&lt;br /&gt;    Python tries to be as readable as possible, but that method introduces too many new things, so it requires some careful explanations.&lt;br /&gt;    Loops&lt;br /&gt;&lt;br /&gt;    One of the Python's looping constructs is for. It is designed to iterate over lists, sets, maps and other iterable objects. In this case, it takes all the items in self._posts and, one by one, assigns them to the variable post. In the body of the for, which is executed on each iteration, we can use the variable post.&lt;br /&gt;&lt;br /&gt;    The body of the for, as with other constructs that need a piece of code, is delimited by nothing more than the indentation. Here's an example:&lt;br /&gt;&lt;br /&gt;    /&amp;gt;&amp;gt;&amp;gt; the_list = [1,2,3,"a","b"]&lt;br /&gt;    /&amp;gt;&amp;gt;&amp;gt; for item in the_list:&lt;br /&gt;    ... print item&lt;br /&gt;    ...&lt;br /&gt;    1&lt;br /&gt;    2&lt;br /&gt;    3&lt;br /&gt;    a&lt;br /&gt;    b&lt;br /&gt;    /&amp;gt;&amp;gt;&amp;gt;&lt;br /&gt;&lt;br /&gt;    Various tasks are solved with a loop. One such task is doing something for each member of a collection, like we did in the previous example. For those types of tasks, the for construct is excellent.&lt;br /&gt;&lt;br /&gt;    Another common practice is to perform an action a given number of times—for example, printing “Hello, world” three times. To do that we can use:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;    /&amp;gt;&amp;gt;&amp;gt; a = 0&lt;br /&gt;    /&amp;gt;&amp;gt;&amp;gt; while a &amp;lt; 3:&lt;br /&gt;    ... print "Hello world"&lt;br /&gt;    ... a = a + 1&lt;br /&gt;    ...&lt;br /&gt;    Hello world&lt;br /&gt;    Hello world&lt;br /&gt;    Hello world&lt;br /&gt;    /&amp;gt;&amp;gt;&amp;gt;&lt;br /&gt;&lt;br /&gt;    Another loop construct is while, and it will continue to run its body until the check—that is, the expression after while and before the colon—becomes false.&lt;br /&gt;&lt;br /&gt;    We can rethink the previous loop as iterating over a list containing the numbers 0–9. There's a way to do it with a for construct:&lt;br /&gt;&lt;br /&gt;    /&amp;gt;&amp;gt;&amp;gt; for a in range(0,3):&lt;br /&gt;    ... print "Hello world"&lt;br /&gt;    ...&lt;br /&gt;    Hello world&lt;br /&gt;    Hello world&lt;br /&gt;    Hello world&lt;br /&gt;    /&amp;gt;&amp;gt;&amp;gt;&amp;gt;&lt;br /&gt;&lt;br /&gt;    This is shorter and arguably more readable. What is while useful for then? It is useful any time you don't really know when you are going to stop the loop. Here are some examples:&lt;br /&gt;&lt;br /&gt;    *&lt;br /&gt;&lt;br /&gt;    Reading characters from a file until you encounter the End of File (EOF).&lt;br /&gt;    *&lt;br /&gt;&lt;br /&gt;    Reading commands from a user until the user enters the quit command.&lt;br /&gt;    *&lt;br /&gt;&lt;br /&gt;    Reading temperatures from a sensor until the temperature is too high.&lt;br /&gt;    *&lt;br /&gt;&lt;br /&gt;    Reading events from a user interface until the user presses the X button at the top of the window to close the program.&lt;br /&gt;&lt;br /&gt;    There's a pattern forming here—doing something until something else happens. That's what while is good for.&lt;br /&gt;&lt;br /&gt;    Some time ago, when we didn't have as many choices in programming languages and we ended up using C most of the time, the while construct tended to be much more useful than the for construct. But today, with a powerful for construct, nice functions such as range and the possibility of putting an iterator around anything, for is being used much more than while.&lt;br /&gt;&lt;br /&gt;    Here's one last example for your enjoyment:&lt;br /&gt;&lt;br /&gt;    /&amp;gt;&amp;gt;&amp;gt; for l in "Hello World":&lt;br /&gt;    ... print l + " ",&lt;br /&gt;    ...&lt;br /&gt;    H e l l o W o r l d&lt;br /&gt;&lt;br /&gt;    Conditionals&lt;br /&gt;&lt;br /&gt;    In the fourth line of some previous sample code, if post.is_public(), we have another new construct—an if. This allows programs to make choices based on data. It needs a boolean value and a piece of code. The code is run only if the boolean is True. If you provide something that is not a boolean, Python does its best to interpret it as a boolean. For example, the number 0 is interpreted as False, but all the other numbers as True. Here are some examples:&lt;br /&gt;&lt;br /&gt;    /&amp;gt;&amp;gt;&amp;gt; if True:&lt;br /&gt;    ... print "It is true!"&lt;br /&gt;    ...&lt;br /&gt;    It is true!&lt;br /&gt;    /&amp;gt;&amp;gt;&amp;gt; if False:&lt;br /&gt;    ... print "Is it false?"&lt;br /&gt;    ...&lt;br /&gt;    /&amp;gt;&amp;gt;&amp;gt;&lt;br /&gt;&lt;br /&gt;    We can perform many different types of comparisons on different kinds of objects. Note that the equality operator is ==, not = (that is, two equal signs):&lt;br /&gt;&lt;br /&gt;    /&amp;gt;&amp;gt;&amp;gt; a = 10&lt;br /&gt;    /&amp;gt;&amp;gt;&amp;gt; if a == 10:&lt;br /&gt;    ... print "Ten!"&lt;br /&gt;    ...&lt;br /&gt;    Ten!&lt;br /&gt;&lt;br /&gt;    There are other comparisons, such as greater than (&amp;gt;), less than (&amp;lt;) and different (!=). You can experiment with comparisons directly on the REPL:&lt;br /&gt;&lt;br /&gt;    /&amp;gt;&amp;gt;&amp;gt; 3 == 4&lt;br /&gt;    False&lt;br /&gt;    /&amp;gt;&amp;gt;&amp;gt; 10 != 5&lt;br /&gt;    True&lt;br /&gt;    /&amp;gt;&amp;gt;&amp;gt; 4 &amp;gt;= 1&lt;br /&gt;    True&lt;br /&gt;&lt;br /&gt;    It is common to run a piece of code if something is true and another piece of code if it is false. For example, we could do the following:&lt;br /&gt;&lt;br /&gt;    if a == 10:&lt;br /&gt;    print "A is ten."&lt;br /&gt;    if a != 10:&lt;br /&gt;    print "A is not ten."&lt;br /&gt;&lt;br /&gt;    This has a big problem. If we change a to b in the first case, we have to remember to change it in the second. And, the same should be done for any other little changes we do. The solution is an extension to the if construct:&lt;br /&gt;&lt;br /&gt;    if a == 10:&lt;br /&gt;    print "A is ten."&lt;br /&gt;    else:&lt;br /&gt;    print "A is not ten."&lt;br /&gt;&lt;br /&gt;    The piece of code after the else will be executed if the first piece wasn't executed.&lt;br /&gt;&lt;br /&gt;    Another common situation is having various conditionals for different cases. In that case, we use a string of ifs:&lt;br /&gt;&lt;br /&gt;    if a == 10:&lt;br /&gt;    print "A is ten."&lt;br /&gt;    elif a == 0:&lt;br /&gt;    print "A is zero."&lt;br /&gt;    elif a != 30:&lt;br /&gt;    print "A is not thirty."&lt;br /&gt;    else:&lt;br /&gt;    print "Who cares about a ?"&lt;br /&gt;&lt;br /&gt;    elif is the contraction of “else if”, and indeed, the previous code could be written as:&lt;br /&gt;&lt;br /&gt;    if a == 10:&lt;br /&gt;    print "A is ten."&lt;br /&gt;    else:&lt;br /&gt;    if a == 0:&lt;br /&gt;    print "A is zero."&lt;br /&gt;    else:&lt;br /&gt;    if a != 30:&lt;br /&gt;    print "A is not thirty."&lt;br /&gt;    else:&lt;br /&gt;    print "Who cares about a ?"&lt;br /&gt;&lt;br /&gt;    But, that is ugly and prone to errors. If you have 10 or 15 different cases, you'll need a 29"-widescreen monitor just to view it. (Not that I have anything against such a monitor. I'd like to have one.)&lt;br /&gt;&lt;br /&gt;    If you come from other languages that have a switch or select or case construct and are wondering where they are in Python, I'm sorry to disappoint you. Python doesn't have such constructs. There's a proposal to include them, but it hasn't been implemented yet. Right now, the solution is to use a chain of ifs, elifs and elses. After you use this a few times, it's not so bad.&lt;br /&gt;&lt;br /&gt;    Now that you know about else, here's an interesting tidbit: for and while also can have elses. What do they do? Run Python, and try it out until you discover for yourself. While programming, you'll need to run a lot of code to find out how many undocumented, obscure, almost black-magic, things work, so starting with something simple will help you get some training.&lt;br /&gt;    Inheritance&lt;br /&gt;&lt;br /&gt;    The short introduction to object-oriented programming (OOP) in Part I of this article left out a big topic—inheritance. This feature is what makes OOP really useful, and as OOP tries to mimic real life, I explain inheritance here with real-life examples.&lt;br /&gt;&lt;br /&gt;    Think about a chair. A chair is made out of some kind of material, has two armrests, a back, a color, a style and maybe even a warranty. Now, think about a table. It is made out of some kind of material, might have some drawers, a color, a style and maybe a warranty. They have a lot in common! If we were to make the two classes, Chair and Table, a lot of code would be repeated. In programming, when you write the same line of code twice, you probably are doing something wrong—inheritance to the rescue.&lt;br /&gt;&lt;br /&gt;    A chair is a piece of furniture. So is a table. Such similarities can be in the Furniture class. Let's make the Furniture class have a default material and the ability to set other materials:&lt;br /&gt;&lt;br /&gt;    class Furniture(object):&lt;br /&gt;    def __init__(self):&lt;br /&gt;    self._material = "wood"&lt;br /&gt;&lt;br /&gt;    def set_material(self, material):&lt;br /&gt;    self._material = material&lt;br /&gt;&lt;br /&gt;    And now, a Chair class inheriting Furniture:&lt;br /&gt;&lt;br /&gt;    class Chair(Furniture):&lt;br /&gt;    def __init__(self):&lt;br /&gt;    self._backrest_height = 30&lt;br /&gt;&lt;br /&gt;    def set_backrest_height(self, height):&lt;br /&gt;    self._backrest_height = height&lt;br /&gt;&lt;br /&gt;    Now, you know what goes inside parentheses in the class header: the name of the class being inherited, which also is known as a super class or parent class. Let's play a bit with this, so you can see what happens:&lt;br /&gt;&lt;br /&gt;    /&amp;gt;&amp;gt;&amp;gt; c = Chair()&lt;br /&gt;    /&amp;gt;&amp;gt;&amp;gt; c.set_backrest_height(50)&lt;br /&gt;    /&amp;gt;&amp;gt;&amp;gt; c._backrest_height&lt;br /&gt;    50&lt;br /&gt;    /&amp;gt;&amp;gt;&amp;gt; c.set_material("plastic")&lt;br /&gt;    /&amp;gt;&amp;gt;&amp;gt; c._material&lt;br /&gt;    'plastic'&lt;br /&gt;    /&amp;gt;&amp;gt;&amp;gt;&lt;br /&gt;&lt;br /&gt;    As you can see, the methods of Furniture also are on Chair. I leave the definition of the Table class as an exercise for the reader. But first, here's another interaction:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;    /&amp;gt;&amp;gt;&amp;gt; d = Chair()&lt;br /&gt;    /&amp;gt;&amp;gt;&amp;gt; d._backrest_height&lt;br /&gt;    30&lt;br /&gt;    /&amp;gt;&amp;gt;&amp;gt; d._material&lt;br /&gt;    Traceback (most recent call last):&lt;br /&gt;    File "", line 1, in ?&lt;br /&gt;    AttributeError: 'Chair' object has no attribute '_material'&lt;br /&gt;    /&amp;gt;&amp;gt;&amp;gt;&lt;br /&gt;&lt;br /&gt;    I bet that is not what you expected. Let's take a closer look at what happened. We created a Chair, the method Chair.__init__ was run setting _backrest_height. Oh! Nobody called Furniture.__init__, which never set _material. There are two solutions to that.&lt;br /&gt;&lt;br /&gt;    Setting _material in Chair.__init__ is not a solution. If we do that, the classes would be coupled, meaning the implementation of one will depend on the implementation of the other. If we change the name of _material to _materials, suddenly Chair will stop working. If you have hundreds of classes developed by hundreds of different people, keeping track of those changes is difficult. Also, Furniture will grow to have more members, so we have to remember to set all those members to the same defaults in Chair.__init__. I'm getting a headache just thinking about it.&lt;br /&gt;&lt;br /&gt;    One real solution is calling Furniture.__init__ and rewriting Chair.__init__ this way:&lt;br /&gt;&lt;br /&gt;    def __init__(self):&lt;br /&gt;    Furniture.__init__(self)&lt;br /&gt;    self._backrest_height = 30&lt;br /&gt;&lt;br /&gt;    We had to pass self to __init__, because if we called it with the class instead of the object, it wouldn't know in which object to do its operations.&lt;br /&gt;&lt;br /&gt;    I personally don't like that solution, because it implies writing the name of the class in two or more places. If you ever change the name, you'll have to remember to run a search and replace. Another solution is more cryptic than it should be, but it doesn't have the problem I just mentioned:&lt;br /&gt;&lt;br /&gt;    def __init__(self):&lt;br /&gt;    super(Chair, self).__init__()&lt;br /&gt;    self._backrest_height = 30&lt;br /&gt;&lt;br /&gt;    In this solution, I call super, passing the current class and the current object, and it allows me to make a call to the parent class using the current object. Here we may have a problem if we change the name of the class itself, but running a search and replace on the file is a good idea when making that kind of change. You'd want to change the documentation as well. The real problem with this solution is hard to understand and to explain—it has to do with multiple inheritance. For more information, read “Python's Super Considered Harmful”. Personally, I've been using this second solution without any problems.&lt;br /&gt;&lt;br /&gt;    You'll see that all classes I defined inherit from object. That is the most basic class—the root (or top) class. It is a good idea to make all your classes inherit from it unless they inherit from another class. If you don't do that, your class will be an old-style class, and some things won't work, such as super. It is important to know this, because you may encounter old-style classes anywhere, and you should be prepared.&lt;br /&gt;    Python 2.5&lt;br /&gt;&lt;br /&gt;    During the process of writing this article, with much excitement and fanfare, Python 2.5 was released. It is the most important release in almost two years, and it comes with many promises.&lt;br /&gt;&lt;br /&gt;    It promises to be more reliable due to improvements in the testing procedures used by the Python development team. It now has Buildbot, a program that continuously builds and tests Python, and whenever there's something wrong, it raises an alarm for all the world to see. The shame of being the developer who made the error will make all the developers more careful—at least, that's what happened to me when I had a Buildbot watching my code.&lt;br /&gt;&lt;br /&gt;    For some, like this author who had a new release at the worst possible time, the most important thing is that Python 2.5 is backward-compatible. All that you've learned here will work. And, not only will it work, it is still the way to do it.&lt;br /&gt;&lt;br /&gt;    The new release also promises to be faster and has many new advanced features, including new modules and packages. The future is bright for Python and Python coders.&lt;br /&gt;    What Now?&lt;br /&gt;&lt;br /&gt;    This was nothing but a short introduction to Python; there's still much to learn. A good place to start is the official Python Tutorial. You also can read Dive Into Python, a book that you can buy or read for free on the Web. And, of course, a lot of other books and tutorials are available. I learned Python mainly from the Python Tutorial, which is very good.&lt;br /&gt;&lt;br /&gt;    Whenever you are creating a program in Python, never, and I repeat, never, do anything without checking whether it has been done before. Python has a lot of features and a lot of built-in libraries. And, if that isn't enough, there are hundreds, maybe thousands of third-party Python libraries. In fact, the huge amount of code that's already written in Python is one of the reasons to use it.&lt;br /&gt;&lt;br /&gt;    The first stop is Python's Documentation. There we have the previously mentioned tutorial, the library reference and the language reference.&lt;br /&gt;&lt;br /&gt;    The language reference can be a bit hard to use and understand. Programming languages tend to be difficult to understand and so are their references, which often have exclusive jargon, such as lexical analysis, tokens, identifiers, keywords or delimiters. This piece of documentation can be particularly useful in showing how to use language constructs, such as for, if, while and more complex ones that I haven't mentioned, such as yield, break or continue.&lt;br /&gt;&lt;br /&gt;    The library references let us know about all the classes, methods and functions that Python already provides. It is so important and useful that I always have it open when I am programming on Python. In the second chapter, you can read about the built-in functions and classes. Getting familiar with them is always useful. The rest of the documentation is very specific, and each chapter deals with subjects ranging from runtime internals to string, from the Python debugger to some generic operating systems services. In that chapter, a very important module is documented: os. I can't remember making a single program that didn't use that module.&lt;br /&gt;&lt;br /&gt;    Finding what you want in so much documentation can be a difficult task. A trick that I find very useful is to use Google to search in a specific site. That is achieved by adding “site:python.org” or “site:docs.python.org” to the search query. The first one is more generic and sometimes leads to countless mailing-list posts that have nothing to do with what you are looking for. In that situation, use the second one. To give it a try, search for “print site:python.org” or “options site:python.org”.&lt;br /&gt;&lt;br /&gt;    What if all of your searches return nothing? Then, you need to do a broader search to find some third-party libraries or frameworks. If you want to make a graphical user interface, I recommend both PyGTK and PyQt, both are very good and include support for their respective desktops, GNOME and KDE. I've heard good opinions of wxPython, but I've not used it myself.&lt;br /&gt;&lt;br /&gt;    If you want to build a Web application, I see two paths. If you want something not so spectacular but that gets you there fast, I recommend Django. Django is very similar to Ruby on Rails. It's a framework in which you use the model-view-controller paradigm and a relational database such as MySQL or PostgreSQL; both are well supported on Python.&lt;br /&gt;&lt;br /&gt;    The other way to build Web sites (that I know of) is Zope. Zope is a big framework with a Web server and object-oriented database. The database is different from other relational databases, and it is very powerful. It allows you to store information in a much more flexible way. Zope 3—I don't recommend the previous versions unless you have to use the award-winning content management system Plone—is prepared to help you build reliable and robust code by means of interfaces, unit testing, adapters and much more.&lt;br /&gt;&lt;br /&gt;    If you need to build any kind of dæmon—those little applications running in the background making the earth turn—take a look at Twisted Matrix. Twisted Matrix is an event-based framework that solves a lot of the common problems of building dæmons, including separation of protocol and logic. It comes with many protocols already built in, and it allows you to create new protocols. A proof of its usefulness is that Zope, after years of shipping its own Web sever, has migrated to using the Twisted Matrix HTTP server.&lt;br /&gt;&lt;br /&gt;    Resources&lt;br /&gt;&lt;br /&gt;    Python Tutorial: docs.python.org/tut/tut.html&lt;br /&gt;&lt;br /&gt;    Dive Into Python: www.diveintopython.org&lt;br /&gt;&lt;br /&gt;    Python Documentation: www.python.org/doc&lt;br /&gt;&lt;br /&gt;    PyGTK: www.pygtk.org&lt;br /&gt;&lt;br /&gt;    PyQt: www.riverbankcomputing.co.uk/pyqt&lt;br /&gt;&lt;br /&gt;    Django: www.djangoproject.com&lt;br /&gt;&lt;br /&gt;    Zope: zope.org&lt;br /&gt;&lt;br /&gt;    Python's Super Considered Harmful: fuhm.net/super-harmful&lt;br /&gt;&lt;br /&gt;    José P. E. “Pupeno” Fernández has been programming since...at what age is a child capable of siting in a chair and reaching a keyboard? He has experimented with more languages than can be listed on this page. His Web site is at pupeno.com, and he always can be reached, unless you are a spammer, at pupeno@pupeno.com.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2589537411099484208-625103064339728901?l=dontburnmybeans.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dontburnmybeans.blogspot.com/feeds/625103064339728901/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2589537411099484208&amp;postID=625103064339728901' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2589537411099484208/posts/default/625103064339728901'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2589537411099484208/posts/default/625103064339728901'/><link rel='alternate' type='text/html' href='http://dontburnmybeans.blogspot.com/2008/06/programming-python-part-ii.html' title='Programming Python, Part II'/><author><name>Jamtech</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/-RNwpfmrDdPU/Tn1tpZWh2zI/AAAAAAAAAHg/ICZaej4kWOk/s220/hitmana3_2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2589537411099484208.post-490532792501544509</id><published>2008-06-17T22:17:00.000-07:00</published><updated>2008-06-17T22:19:03.873-07:00</updated><title type='text'>Programming Python, Part I</title><content type='html'>Programming Python, Part I&lt;br /&gt;    June 1st, 2007 by José P. E. "Pupeno" Fernandez in&lt;br /&gt;&lt;br /&gt;    * Software&lt;br /&gt;&lt;br /&gt;    This tutorial jumps right in to the power of Python without dragging you through basic programming.&lt;br /&gt;&lt;br /&gt;    Python is a programming language that is highly regarded for its simplicity and ease of use. It often is recommended to programming newcomers as a good starting point. Python also is a program that interprets programs written in Python. There are other implementations of Python, such as Jython (in Java), CLPython (Common Lisp), IronPython (.NET) and possibly more. Here, we use only Python.&lt;br /&gt;    Installing Python&lt;br /&gt;&lt;br /&gt;    Installing Python and getting it running is the first step. These days, it should be very easy. If you are running Gentoo GNU/Linux, you already have Python 2.4 installed. The packaging system for Gentoo, Portage, is written in Python. If you don't have it, your installation is broken.&lt;br /&gt;&lt;br /&gt;    If you are running Debian GNU/Linux, Ubuntu, Kubuntu or MEPIS, simply run the following (or log in as root and leave out sudo):&lt;br /&gt;&lt;br /&gt;    sudo apt-get install python&lt;br /&gt;&lt;br /&gt;    One catch is that Debian's stable Python is 2.3, while for the rest of the distributions, you are likely to find 2.4. They are not very different, and most code will run on both versions. The main differences I have encountered are in the API of some library classes, new features added to 2.4 and some internals, which shouldn't concern us here.&lt;br /&gt;&lt;br /&gt;    If you are running some other distribution, it is very likely that Python is prepackaged for it. Use the usual resources and tools you use for other packages to find the Python package.&lt;br /&gt;&lt;br /&gt;    If all that fails, you need to do a manual installation. It is not difficult, but be aware that it is easy to break your system unless you follow this simple guideline: install Python into a well-isolated place, I like /opt/python/2.4.3, or whatever version it is.&lt;br /&gt;&lt;br /&gt;    To perform the installation, download Python, unpack it, and run the following commands:&lt;br /&gt;&lt;br /&gt;    ./configure --prefix=/opt/python2.4/&lt;br /&gt;    make&lt;br /&gt;    make install&lt;br /&gt;&lt;br /&gt;    This task is well documented on Python's README, which is included in the downloaded tarball; take a look at it for further details. The only missing task here is adding Python to your path. Alternatively, you can run it directly by calling it with its path, which I recommend for initial exploration.&lt;br /&gt;    First Steps&lt;br /&gt;&lt;br /&gt;    Now that we have Python running, let's jump right in to programming and examine the language as we go along. To start, let's build a blog engine. By engine, I mean that it won't have any kind of interface, such as a Web interface, but it's a good exercise anyway.&lt;br /&gt;&lt;br /&gt;    Python comes with an REPL—a nice invention courtesy of the Lisp community. REPL stands for Read Eval Print Loop, and it means there's a program that can read expressions and statements, evaluate them, print the result and wait for more. Let's run the REPL (adjust your path according to where you installed Python in the previous section):&lt;br /&gt;&lt;br /&gt;    $ python&lt;br /&gt;    Python 2.4.3 (#1, Sep 1 2006, 18:35:05)&lt;br /&gt;    [GCC 4.1.1 (Gentoo 4.1.1)] on linux2&lt;br /&gt;    Type "help", "copyright", "credits" or "license" for&lt;br /&gt;    more information.&lt;br /&gt;    /&gt;&gt;&gt;&lt;br /&gt;&lt;br /&gt;    Those three greater-than signs (&gt;&gt;&gt;) are the Python prompt where you write statements and expressions. To quit Python, press Ctrl-D.&lt;br /&gt;&lt;br /&gt;    Let's type some simple expressions:&lt;br /&gt;&lt;br /&gt;    /&gt;&gt;&gt; 5&lt;br /&gt;    5&lt;br /&gt;&lt;br /&gt;    The value of 5 is, well, 5.&lt;br /&gt;&lt;br /&gt;    /&gt;&gt;&gt; 10 + 4&lt;br /&gt;    14&lt;br /&gt;&lt;br /&gt;    That's more interesting, isn't it?&lt;br /&gt;&lt;br /&gt;    There are other kinds of expressions, such as a string:&lt;br /&gt;&lt;br /&gt;    /&gt;&gt;&gt; "Hello"&lt;br /&gt;    'Hello'&lt;br /&gt;&lt;br /&gt;    Quotes are used to create strings. Single or double quotes are treated essentially the same. In fact, you can see that I used double quotes, and Python showed the strings in single quotes.&lt;br /&gt;&lt;br /&gt;    Another kind of expression is a list:&lt;br /&gt;&lt;br /&gt;    /&gt;&gt;&gt; [1,3,2]&lt;br /&gt;    [1, 3, 2]&lt;br /&gt;&lt;br /&gt;    Square brackets are used to create lists in which items are separated by commas. And, as we can add numbers, we can add—actually concatenate—lists:&lt;br /&gt;&lt;br /&gt;    /&gt;&gt;&gt; [1,3,2] + [11,3,2]&lt;br /&gt;    [1, 3, 2, 11, 3, 2]&lt;br /&gt;&lt;br /&gt;    By now, you might be getting bored. Let's switch to something more exciting—a blog. A blog is a sequence of posts, and a Python list is a good way to represent a blog, with posts as strings. In the REPL, we can build a simple blog like this:&lt;br /&gt;&lt;br /&gt;    /&gt;&gt;&gt; ["My first post", "Python is cool"]&lt;br /&gt;    ['My first post', 'Python is cool']&lt;br /&gt;    /&gt;&gt;&gt;&lt;br /&gt;&lt;br /&gt;    That's a list of strings. You can make lists of whatever you want, including a list of lists. So far, all our expressions are evaluated, shown and lost. We have no way to recall our blog to add more items or to show them in a browser. Assignment comes to the rescue:&lt;br /&gt;&lt;br /&gt;    /&gt;&gt;&gt; blog = ["My first post", "Python is cool"]&lt;br /&gt;    /&gt;&gt;&gt;&lt;br /&gt;&lt;br /&gt;    Now blog, a so-called variable, contains the list. Unlike in the previous example, nothing was printed this time, because it is an assignment. Assignments are statements, and statements don't have a return value. Simply evaluating the variable shows us the content:&lt;br /&gt;&lt;br /&gt;    /&gt;&gt;&gt; blog&lt;br /&gt;    ['My first post', 'Python is cool']&lt;br /&gt;&lt;br /&gt;    Accessing our blog is easy. We simply identify each post by number:&lt;br /&gt;&lt;br /&gt;    /&gt;&gt;&gt; blog[0]&lt;br /&gt;    'My first post'&lt;br /&gt;    /&gt;&gt;&gt; blog[1]&lt;br /&gt;    'Python is cool'&lt;br /&gt;&lt;br /&gt;    Be aware that Python starts counting at 0.&lt;br /&gt;    Encapsulating Behavior&lt;br /&gt;&lt;br /&gt;    A blog is not a blog if we can't add new posts, so let's do that:&lt;br /&gt;&lt;br /&gt;    /&gt;&gt;&gt; blog = blog + ["A new post."]&lt;br /&gt;    /&gt;&gt;&gt; blog&lt;br /&gt;    ['My first post', 'Python is cool', 'A new post.']&lt;br /&gt;&lt;br /&gt;    Here we set blog to a new value, which is the old blog, and a new post. Remembering all that merely to add a new post is not pleasant though, so we can encapsulate it in what is called a function:&lt;br /&gt;&lt;br /&gt;    /&gt;&gt;&gt; def add_post(blog, new_post):&lt;br /&gt;    ... return blog + [new_post]&lt;br /&gt;    ...&lt;br /&gt;    /&gt;&gt;&gt;&lt;br /&gt;&lt;br /&gt;    def is the keyword used to define a new function or method (more on functions in structured or functional programming and methods in object-oriented programming later in this article). What follows is the name of the function. Inside the parentheses, we have the formal parameters. Those are like variables that will be defined by the caller of the function. After the colon, the prompt has changed from &gt;&gt;&gt; to ... to show that we are inside a definition. The function is composed of all those lines with a level of indentation below the level of the def line.&lt;br /&gt;&lt;br /&gt;    So, where other programming languages use curly braces or begin/end keywords, Python uses indentation. The idea is that if you are a good programmer, you'd indent it anyway, so we'll use that indentation and make you a good programmer at the same time. Indeed, it's a controversial issue; I didn't like it at first, but I learned to live with it.&lt;br /&gt;&lt;br /&gt;    While working with the REPL, you safely can press Tab to make an indentation level, and although a Tab character can do it, using four spaces is the strongly recommended way. Many text editors know to put four spaces when you press Tab when editing a Python file. Whatever you do, never, I repeat, never, mix Tabs with spaces. In other programming languages, it may make the community dislike you, but in Python, it'll make your program fail with weird error messages.&lt;br /&gt;&lt;br /&gt;    Being practical, to reproduce what I did, simply type the class header, def add_post(blog, new_post):, press Enter, press Tab, type return blog + [new_post], press Enter, press Enter again, and that's it. Let's see the function in action:&lt;br /&gt;&lt;br /&gt;    /&gt;&gt;&gt; blog = add_post(blog, "Fourth post")&lt;br /&gt;    /&gt;&gt;&gt; blog&lt;br /&gt;    ['My first post', 'Python is cool', 'A new post.',&lt;br /&gt;    'Fourth post']&lt;br /&gt;    /&gt;&gt;&gt;&lt;br /&gt;&lt;br /&gt;    add_post takes two parameters. The first is the blog itself, and it gets assigned to blog. This is tricky. The blog inside the function is not the same as the blog outside the function. They are in different scopes. That's why the following:&lt;br /&gt;&lt;br /&gt;    /&gt;&gt;&gt; def add_post(blog, new_post):&lt;br /&gt;    ... blog = blog + [new_post]&lt;br /&gt;&lt;br /&gt;    doesn't work. blog is modified only inside the function. By now, you might know that new_post contains the post passed to the function.&lt;br /&gt;&lt;br /&gt;    Our blog is growing, and it is time to see that the posts are simply strings, but we want to have a title and a body. One way to do this is to use tuples, like this:&lt;br /&gt;&lt;br /&gt;    /&gt;&gt;&gt; blog = []&lt;br /&gt;    /&gt;&gt;&gt; blog = add_post(blog, ("New blog", "First post"))&lt;br /&gt;    /&gt;&gt;&gt; blog = add_post(blog, ("Cool", "Python is cool"))&lt;br /&gt;    /&gt;&gt;&gt; blog&lt;br /&gt;    [('New blog', 'First post'),&lt;br /&gt;    ('Cool', 'Python and is cool')]&lt;br /&gt;    /&gt;&gt;&gt;&lt;br /&gt;&lt;br /&gt;    In the first line, I reset the blog to be an empty list. Then, I added two posts. See the double parentheses? The outside parentheses are part of the function call, and the inside parentheses are the creation of a tuple.&lt;br /&gt;&lt;br /&gt;    A tuple is created by parentheses, and its members are separated by commas. They are similar to lists, but semantically, they are different. For example, you can't update the members of a tuple. Tuples are used to build some kind of structure with a fixed set of elements. Let's see a tuple outside of our blog:&lt;br /&gt;&lt;br /&gt;    /&gt;&gt;&gt; (1,2,3)&lt;br /&gt;    (1, 2, 3)&lt;br /&gt;&lt;br /&gt;    Accessing each part of the posts is similar to accessing each part of the blog:&lt;br /&gt;&lt;br /&gt;    /&gt;&gt;&gt; blog[0][0]&lt;br /&gt;    'New blog'&lt;br /&gt;    /&gt;&gt;&gt; blog[0][1]&lt;br /&gt;    'This is my first post'&lt;br /&gt;&lt;br /&gt;    This might be a good solution if we want to store only a title and a body. But, how long until we want to add the date and time, excerpts, tags or messages? You may begin thinking you'll need to hang a sheet of paper on the wall, as shown in Figure 1, to remember the index of each field—not pleasant at all. To solve this problem, and some others, Python gives us object-oriented programming.&lt;br /&gt;&lt;br /&gt;    Figure 1. Index Handling the Hard Way&lt;br /&gt;    Object-Oriented Programming&lt;br /&gt;&lt;br /&gt;    Object-oriented programming was born more than 20 years ago so developers could separate each part of a computer program in a way similar to how objects are separated in the real world. Python models objects by using classes. A class is an abstract definition of what an object has and what an object can do. If this sounds foreign, don't worry, OOP (object-oriented programming) is difficult at first.&lt;br /&gt;&lt;br /&gt;    An example might help. A bridge is a structure that allows people or vehicles to cross an obstacle, such as a river, canal or railway. A bridge has some length, some width and even some color. It may allow vehicles or only persons. It may allow heavy vehicles or not. When I say “bridge”, I am not defining any of those details. Bridge is a class. If I say Golden Gate, Le Pont de Normandie or Akashi-Kaikyo, I am naming particular bridges; they have some specific length, width, vehicle allowance and color. In OOP jargon, they are instances of bridge.&lt;br /&gt;&lt;br /&gt;    Back to our blog, let's create a class to model our post:&lt;br /&gt;&lt;br /&gt;    /&gt;&gt;&gt; class Post(object):&lt;br /&gt;    ... pass&lt;br /&gt;    ...&lt;br /&gt;    /&gt;&gt;&gt;&lt;br /&gt;&lt;br /&gt;    We start with class, the keyword for creating new classes. Next comes the name of the class—in this case, Post. In parentheses, we have the super-classes—ignore that for now.&lt;br /&gt;&lt;br /&gt;    Here again, the prompt has changed from &gt;&gt;&gt; to ..., and Python expects something in a class. Because we don't want to put anything in yet, we write pass, which is something, but in fact, it is nothing. Python knows when a class starts and ends because of the indentation, the same as with functions.&lt;br /&gt;&lt;br /&gt;    To reproduce what I did, simply type the class header, class Post(object):, press Enter, press Tab, type pass, press Enter, press Enter again, and that's it.&lt;br /&gt;&lt;br /&gt;    Now, we can create a Post:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;    /&gt;&gt;&gt; cool = Post()&lt;br /&gt;    /&gt;&gt;&gt; cool&lt;br /&gt;    &lt;__main__.Post object at 0xb7ca642c&gt;&lt;br /&gt;&lt;br /&gt;    Note that what is being printed when we evaluate a post is a generic representation for the object. We can set its title and body:&lt;br /&gt;&lt;br /&gt;    /&gt;&gt;&gt; cool.title = "Cool"&lt;br /&gt;    /&gt;&gt;&gt; cool.body = "Python is cool."&lt;br /&gt;&lt;br /&gt;    And retrieve them:&lt;br /&gt;&lt;br /&gt;    /&gt;&gt;&gt; cool.title&lt;br /&gt;    'Cool'&lt;br /&gt;    /&gt;&gt;&gt; cool.body&lt;br /&gt;    'Python is cool.'&lt;br /&gt;&lt;br /&gt;    Up to this point, a Post is like a simple container for anything you can imagine putting there. The problem with this is we may get lost as to what to put in it, or what not to put in it. Back to a sheet of paper? No! Although we can't stop making the posts a container in that way, we can put some methods there, so users have an idea of what a post may contain. To do this, we write our own methods in the class Post:&lt;br /&gt;&lt;br /&gt;    /&gt;&gt;&gt; class Post(object):&lt;br /&gt;    ... def set_title(self, title):&lt;br /&gt;    ... self._title = title&lt;br /&gt;    ... def get_title(self):&lt;br /&gt;    ... return self._title&lt;br /&gt;    ...&lt;br /&gt;    /&gt;&gt;&gt;&lt;br /&gt;&lt;br /&gt;    Methods are like functions, but as they are in a class, they are associated with the objects of the class. This means different classes can have different methods with the same name. Just imagine the difference between bat.hit(ball) and stick.hit(drum).&lt;br /&gt;&lt;br /&gt;    Python has a convention that the first parameter (normally called self) to a method is the object on which we are calling the method. That means running cool.set_title("Cool")will set self to be cool, and title to be "Cool". Running:&lt;br /&gt;&lt;br /&gt;    cool.set_title("Cool")&lt;br /&gt;&lt;br /&gt;    is the equivalent of:&lt;br /&gt;&lt;br /&gt;    cool._title = "Cool"&lt;br /&gt;&lt;br /&gt;    The leading underscore lets others know that we don't want them playing with it. It means “don't access _title; use get_title and set_title”.&lt;br /&gt;&lt;br /&gt;    The previous interaction with the cool object can be rewritten as:&lt;br /&gt;&lt;br /&gt;    /&gt;&gt;&gt; cool = Post()&lt;br /&gt;    /&gt;&gt;&gt; cool.set_title("Cool")&lt;br /&gt;    /&gt;&gt;&gt; cool.set_body("Python is cool.")&lt;br /&gt;    /&gt;&gt;&gt; cool.get_title()&lt;br /&gt;    'Cool'&lt;br /&gt;    /&gt;&gt;&gt; cool.get_body()&lt;br /&gt;    'Python is cool.'&lt;br /&gt;&lt;br /&gt;    Writing the same set of methods for body should be easy now. But, be aware that you have to write the whole class in one go. Write the class header, the set_title and get_title methods, and then create your set_body and get_body methods. It may take you a couple of tries.&lt;br /&gt;    Files&lt;br /&gt;&lt;br /&gt;    As the Post class becomes bigger, you'll get tired of rewriting it every time you want to add a method. If you're tired already, that's a good sign. And besides, all that's in the REPL will be lost when we quit Python. We should start saving our work in files.&lt;br /&gt;&lt;br /&gt;    Python modules are simple text files, and you can use any text editor you want. As a programmer, you are going to spend most of your time with your editor, so take some time to choose one you really like and learn to use it well.&lt;br /&gt;&lt;br /&gt;    Emacs might not be the most beautiful editor, but for many programming tasks, it is awesome. (You could read that as “I don't like Emacs but it makes my life so much easier that I keep coming to it time after time”.) Installing Emacs from source is beyond the scope of this article. As usual, with programs that are so popular, your distribution is likely to provide it. In Debian and its derivatives try:&lt;br /&gt;&lt;br /&gt;    apt-get install emacs&lt;br /&gt;&lt;br /&gt;    For Gentoo, the counterpart is:&lt;br /&gt;&lt;br /&gt;    emerge emacs&lt;br /&gt;&lt;br /&gt;    To achieve the magic I am going to show here, you need python-mode.&lt;br /&gt;&lt;br /&gt;    In Debian:&lt;br /&gt;&lt;br /&gt;    apt-get install python-mode&lt;br /&gt;&lt;br /&gt;    In Gentoo:&lt;br /&gt;&lt;br /&gt;    emerge python-mode&lt;br /&gt;&lt;br /&gt;    Run Emacs. If you are serious about learning how to use it, now it is time to press Ctrl-H T, which in Emacs jargon means press Ctrl-H, release it and then press T. But, you can leave that for later, when you've finished reading this Linux Journal issue. For this article, I provide all the keystrokes you need.&lt;br /&gt;&lt;br /&gt;    Press Ctrl-X Ctrl-F (Ctrl-X, release, Ctrl-F) to visit a file. On the bottom of the Emacs window, you'll see the cursor waiting for you to type the path and filename. Type blog.py and press Enter. (Python modules should have the extension .py.) Now, you can start typing the Post class we programmed before. Emacs tries to be smart about indentation and places it where you are likely to want it. If you need a different indentation, simply press Tab and keep pressing it until you get the desired results.&lt;br /&gt;&lt;br /&gt;    On the top, you should have two menus: IM-Python and Python. The first one contains a list of classes and methods in the file you are editing. Click on Rescan if it doesn't show information you know is there. This is very useful when working with huge files. The second menu is even more useful, but explore and play with it later. For now, simply run Start interpreter... or press Ctrl-C !.&lt;br /&gt;&lt;br /&gt;    Suddenly the window is split, and you have an embedded Python interpreter below the file you are editing (Figure 2). And the fun is only beginning. Click on the file you are editing to set the focus on it. Run Import/reload file from the Python menu or press Ctrl-C Enter. Now, you're ready to test your code on the REPL, but be aware that you'll have to add blog. before the name of the class, Post, because now the class is in the module blog. See Figure 2 for further reference.&lt;br /&gt;&lt;br /&gt;    Figure 2. Testing the REPL&lt;br /&gt;&lt;br /&gt;    You can, of course, do the same without Emacs. But for that, you need to learn how Python modules and packages are made. Set PYTHON_PATH, an environment variable, accordingly, and use the built-in function reload. With Emacs, you'll find iterating between coding and testing the code to be very fast. This speed can improve your performance and make programming more fun. In fact, Lisp programmers have been advocating this way of working for more than two decades.&lt;br /&gt;    Special Methods&lt;br /&gt;&lt;br /&gt;    Having to create an object and then set each of its members is not pleasant. It takes a lot of lines and is very error-prone—did I remember to set the tags? There's a better way to do it—using the initialization method.&lt;br /&gt;&lt;br /&gt;    This special method is called __init__, and the parameters you define it to take have to be passed in the creation of the object. A possible initialization method would be:&lt;br /&gt;&lt;br /&gt;    class Post(object):&lt;br /&gt;    def __init__(self, title, body):&lt;br /&gt;    self.set_title(title)&lt;br /&gt;    self.set_body(body)&lt;br /&gt;&lt;br /&gt;    Simply add the __init__ definition to the file and reload it. We now can, and have to, set the title and body at initialization time:&lt;br /&gt;&lt;br /&gt;    /&gt;&gt;&gt; cool = blog.Post("Cool", "Python is cool")&lt;br /&gt;    /&gt;&gt;&gt; cool.get_title()&lt;br /&gt;    'Cool'&lt;br /&gt;    /&gt;&gt;&gt; cool.get_body()&lt;br /&gt;    'Python is cool'&lt;br /&gt;    /&gt;&gt;&gt;&lt;br /&gt;&lt;br /&gt;    Hint: to retrieve previous lines in the REPL inside Emacs use Alt-P.&lt;br /&gt;&lt;br /&gt;    There are other special methods. Remember how ugly it was to evaluate a Post itself? Let me remind you:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;    /&gt;&gt;&gt; cool&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;    We can solve that. There's another special method called __repr__, which is used to retrieve that string. Inside the Post class add:&lt;br /&gt;&lt;br /&gt;    def __repr__(self):&lt;br /&gt;    return "Blog Post: %s" % self.get_title()&lt;br /&gt;&lt;br /&gt;    Reload the file, the same way you loaded it previously, and evaluate a post:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;    /&gt;&gt;&gt; ## working on region in file /usr/tmp/python...&lt;br /&gt;    /&gt;&gt;&gt; cool&lt;br /&gt;&lt;br /&gt;    /&gt;&gt;&gt;&lt;br /&gt;&lt;br /&gt;    Oops! That's not what we wanted. The problem here is that the cool object was created with an older version of the Post class, so it doesn't have the new method. That is a very common mistake, and not being prepared for it can cause a lot of headaches. But, simply re-create the object, and you are set:&lt;br /&gt;&lt;br /&gt;    /&gt;&gt;&gt; ## working on region in file /usr/tmp/python...&lt;br /&gt;    /&gt;&gt;&gt; cool = blog.Post("Cool", "Python is cool")&lt;br /&gt;    /&gt;&gt;&gt; cool&lt;br /&gt;    Blog Post: Cool&lt;br /&gt;    /&gt;&gt;&gt;&lt;br /&gt;&lt;br /&gt;    That's better.&lt;br /&gt;    What Now?&lt;br /&gt;&lt;br /&gt;    Easy—wait for the next issue of Linux Journal for Part II of this tutorial. If you really want something to do now, start learning Emacs.&lt;br /&gt;&lt;br /&gt;    Resources&lt;br /&gt;&lt;br /&gt;    Python: python.org&lt;br /&gt;&lt;br /&gt;    Python Download: python.org/download&lt;br /&gt;&lt;br /&gt;    Python 2.4.3: www.python.org/ftp/python/2.4.3/Python-2.4.3.tgz&lt;br /&gt;&lt;br /&gt;    José P. E. “Pupeno” Fern´ndez has been programming since...at what age is a child capable of siting in a chair and reaching a keyboard? He has experimented with more languages than can be listed on this page. His Web site is at pupeno.com, and he always can be reached, unless you are a spammer, at pupeno@pupeno.com.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2589537411099484208-490532792501544509?l=dontburnmybeans.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dontburnmybeans.blogspot.com/feeds/490532792501544509/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2589537411099484208&amp;postID=490532792501544509' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2589537411099484208/posts/default/490532792501544509'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2589537411099484208/posts/default/490532792501544509'/><link rel='alternate' type='text/html' href='http://dontburnmybeans.blogspot.com/2008/06/programming-python-part-i.html' title='Programming Python, Part I'/><author><name>Jamtech</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/-RNwpfmrDdPU/Tn1tpZWh2zI/AAAAAAAAAHg/ICZaej4kWOk/s220/hitmana3_2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2589537411099484208.post-1873284805011211866</id><published>2008-05-05T15:34:00.001-07:00</published><updated>2008-05-08T15:37:09.283-07:00</updated><title type='text'>Getting Wireless the NDISwrapper Way</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;&lt;br/&gt;&lt;a href='http://www.linuxjournal.com/article/9859'&gt;Getting Wireless the NDISwrapper Way&lt;/a&gt; &lt;br/&gt; &lt;blockquote&gt;Getting Wireless the NDISwrapper Way&lt;br/&gt;December 1st, 2007 by Federico Kereki in&lt;br/&gt;&lt;br/&gt;    * HOWTOs&lt;br/&gt;&lt;br/&gt;How to make NDISwrapper work with different wireless devices.&lt;br/&gt;&lt;br/&gt;Using a wireless connection on Linux still is a dicey thing, and you must acknowledge the fact that you probably will have to go a non-open-source software direction, if you want to have any chance of getting connected. A lot of development is happening in this realm, but let's face it, making wireless devices work natively with open-source drivers is not something you can count on, at least for the time being.&lt;br/&gt;&lt;br/&gt;What's the reason for this state of affairs? Just as with graphics cards, there are many factors. Vendors are quite interested in offering newer devices, but the majority of them do not care about Linux and have a Windows-only mindset. Furthermore, if you purchase a laptop, you may not even have the option to choose the card, so you have to make do with whatever you are dealt. Finally, developers cannot produce the needed software when manufacturers won't release the specs, APIs and so on for their products, and this documentation almost never is available.&lt;br/&gt;&lt;br/&gt;Thus, unless you are quite lucky and happen to have one of the few open-source-supported options, NDISwrapper probably will be your best option; however, it's no surefire silver bullet. NDISwrapper tries to provide a wrapper around Windows drivers, so Linux can use them as if they were native ones. If you are lucky (okay, not so much lucky, as many drivers seem to work), your Linux machine will think it has perfectly fine drivers and will use them.&lt;br/&gt;&lt;br/&gt;Though the program itself is open source, this usage of proprietary drivers is objectionable (maybe even not 100% legal?) and obviously not guaranteed. Furthermore, it's still a bit of a hit-or-miss, not very well documented and somewhat obscure method. There's no fancy graphic interfaces here, only old-fashioned command-line work, with many possibilities for mistakes. Taking all of this into account, it's no wonder many people become conscientious objectors of NDISwrapper or end up not being able to make it work.&lt;br/&gt;&lt;br/&gt;Hopefully, in the near future, this will be a moot point, and we will have full open-source software for most, if not all, wireless cards. Certainly, such drivers exist for a select few. In the meantime, we have to make do with this sort of kludge—even though NDISwrapper is brilliant, it's a pity we have to rely on such a program—and wait for better times.&lt;br/&gt;&lt;br/&gt;I recently got a somewhat old eMachines M5305 laptop, and as I had to work in a wireless-only office, I had no option but to get wireless going. In this article, I explain how I installed two different kinds of cards (USB and PCI) and got them to function with NDISwrapper. I won't dwell on the many other alternatives I tried (which got me nowhere) and focus on the NDISwrapper solution. Being purely practical, I needed my box to work—open-source software or not.&lt;br/&gt;What Is NDISwrapper?&lt;br/&gt;&lt;br/&gt;NDISwrapper stands for Network Driver Interface Spec Wrapper. A wrapper is a technical name for a piece of software that, loosely speaking, allows you to use something in a somewhat different way. Using Windows drivers under Linux certainly qualifies as “using something in a somewhat different way”.&lt;br/&gt;&lt;br/&gt;You can find NDISwrapper in most modern distributions. Either use the provided repositories, or go to the NDISwrapper site (see Resources), download the source files and install them yourself. As a matter of fact, even though I use OpenSUSE 10.2 and NDISwrapper was readily available, I opted to go that route myself, so as to get the most up-to-date version. At the time of this writing, the current stable version stands at 1.47, and there is a 1.48RC2 release candidate in the works, but I decided to go with the former.&lt;br/&gt;&lt;br/&gt;If you already had a version of NDISwrapper on your system, it might be best to uninstall it first (using the tools in your distribution—I used YaST), and then, as a common user, go to wherever you downloaded the file, and do the following:&lt;br/&gt;&lt;br/&gt;tar zxvf ndiswrapper-1.47&lt;br/&gt;cd ndiswrapper-1.47&lt;br/&gt;make distclean&lt;br/&gt;make&lt;br/&gt;&lt;br/&gt;Finally, as root, type make install.&lt;br/&gt;First Experiment: the USB Method&lt;br/&gt;&lt;br/&gt;I went to a nearby computer shop and found a cheap, nice USB wireless adapter, Allied Telesyn's AT-WCU201G model, which supports speeds up to 108Mbps and is compatible with IEEE 802.11, 802.11b and 802.11g. Of course, today, speeds of 54Mbps are more common, so it's nice having an extra speed reserve resource.&lt;br/&gt;&lt;br/&gt;Because this is a USB device, you can use the lsusb command to get the device ID. Insert the device at any USB slot, and do:&lt;br/&gt;&lt;br/&gt;lsusb&lt;br/&gt;Bus 003 Device 002: ID 3242:4001&lt;br/&gt;Bus 003 Device 001: ID 0000:0000&lt;br/&gt;Bus 002 Device 001: ID 0000:0000&lt;br/&gt;Bus 001 Device 001: ID 0000:0000&lt;br/&gt;&lt;br/&gt;It's pretty clear our device's ID is 3242:4001. If you want more information—there's lots of it—about the device, try lsusb -d 3242:4001 -v, and you can verify the manufacturer, product code, serial number and so on. It's highly likely that other people already will have tried their hands at getting the device to work, so I Googled it on-line to see if there was any help or known good Linux drivers. I didn't find any useful references, but I went on ahead anyway—did you expect to give up so easily?&lt;br/&gt;&lt;br/&gt;If you're following along, you will need a Windows XP driver, both the .inf and the .sys files. Fortunately, the product I chose includes a CD with several appropriate drivers, and it's just a matter of copying it to disk. Note that possibly not all Windows drivers will work or be stable. Sometimes you may discover you need to try alternate drivers to get your card to work. Also, the vendor might have included the needed files within an EXE file (try unzipping it and see if you get what you need) or a CAB file.&lt;br/&gt;&lt;br/&gt;In my particular case, it was easy—just a matter of copying some files (atiwu.inf and atiwu.sys) and then typing ndiswrapper -i atiwu.inf, followed by ndiswrapper -m and then ndiswrapper -l to list all drivers. I got:&lt;br/&gt;&lt;br/&gt;atiwu : driver installed&lt;br/&gt;        device (3242:4001) present&lt;br/&gt;&lt;br/&gt;which shows that the device was recognized and the driver was installed. Now, it's time to let Linux know more about the new device. Because I use OpenSUSE, I opened YaST and went to Network Devices→Network Card→Add, and selected the following:&lt;br/&gt;&lt;br/&gt;    *&lt;br/&gt;&lt;br/&gt;      Device type: wireless.&lt;br/&gt;    *&lt;br/&gt;&lt;br/&gt;      Configuration name: 0 (so the device will be known as wlan0).&lt;br/&gt;    *&lt;br/&gt;&lt;br/&gt;      Hardware configuration name: static-2 (whatever).&lt;br/&gt;    *&lt;br/&gt;&lt;br/&gt;      Module name: ndiswrapper (most important). &lt;br/&gt;&lt;br/&gt;Do not choose PCMCIA or BUS. Then, go through the next screens (pick either DHCP or an IP, specify your DNS servers and so on), until you come to the Wireless Device Settings form. There, you probably will have to set the following:&lt;br/&gt;&lt;br/&gt;    *&lt;br/&gt;&lt;br/&gt;      Operating mode: managed (ad hoc would work for a peer-to-peer network).&lt;br/&gt;    *&lt;br/&gt;&lt;br/&gt;      Network name: Guiamovil (the name of the network to which I wanted to connect).&lt;br/&gt;    *&lt;br/&gt;&lt;br/&gt;      Authentication mode: WPA-PSK (open would work for an unrestricted, unprotected, passwordless network).&lt;br/&gt;    *&lt;br/&gt;&lt;br/&gt;      Key input type and encryption key: whatever the network administrator tells you to use. (Of course, you don't need this for an “open” network.) &lt;br/&gt;&lt;br/&gt;You can leave all these changes out, however, if you don't know to what network you will be connecting. Simply exit the program, save all the changes, and you will have device wlan0 available. We are almost there!&lt;br/&gt;How Do I Connect?&lt;br/&gt;&lt;br/&gt;If you made it this far, you can use the wireless tools, which include iwconfig and iwlist, to configure your device and search for available networks. (Of course, there are many similar tools, some even have graphic interfaces; look around if you so desire.) In my situation, I already knew the network to which I wanted to connect, but in other cases (Wi-Fi hot areas at airports, for example), you would need to look around to find one.&lt;br/&gt;&lt;br/&gt;You can scan for networks with iwlist wlan0, and you'll get something like this:&lt;br/&gt;&lt;br/&gt;wlan0  Scan completed :&lt;br/&gt;       Cell 01 - Address: 00:16:B6:DB:10:93&lt;br/&gt;                 ESSID:"linksys"&lt;br/&gt;                 Protocol:IEEE 802.11g&lt;br/&gt;                 Mode:Managed&lt;br/&gt;                 Frequency:2.437 GHz (Channel 6)&lt;br/&gt;                 Quality:0/100 Signal level:-84 dBm Noise level:-256 dBm&lt;br/&gt;                 Encryption key:off&lt;br/&gt;                 Bit Rates:1 Mb/s; 2 Mb/s; 5.5 Mb/s; 11 Mb/s; 18 Mb/s&lt;br/&gt;                          24 Mb/s; 36 Mb/s; 54 Mb/s; 6 Mb/s; 9 Mb/s&lt;br/&gt;                          12 Mb/s; 48 Mb/s&lt;br/&gt;                 Extra:bcn_int=100&lt;br/&gt;                 Extra:atim=0&lt;br/&gt;       Cell 02 - Address: 00:4F:67:00:C1:AA&lt;br/&gt;                 ESSID:"Guiamovil"&lt;br/&gt;                 Protocol:IEEE 802.11g&lt;br/&gt;                 Mode:Managed&lt;br/&gt;                 Frequency:2.437 GHz (Channel 6)&lt;br/&gt;                 Quality:0/100 Signal level:-67 dBm Noise level:-256 dBm&lt;br/&gt;                 Encryption key:on&lt;br/&gt;                 Bit Rates:1 Mb/s; 2 Mb/s; 5.5 Mb/s; 11 Mb/s; 6 Mb/s&lt;br/&gt;                           9 Mb/s; 12 Mb/s; 18 Mb/s; 24 Mb/s; 36 Mb/s&lt;br/&gt;                           48 Mb/s; 54 Mb/s&lt;br/&gt;                 Extra:bcn_int=200&lt;br/&gt;                 Extra:atim=0&lt;br/&gt;                 IE: WPA Version 1&lt;br/&gt;                     Group Cipher : WEP-40&lt;br/&gt;                     Pairwise Ciphers (1) : WEP-40&lt;br/&gt;                     Authentication Suites (1) : PSK&lt;br/&gt;&lt;br/&gt;Great, the connection I wanted is there (the second one, Guiamovil), and also another open, unprotected one called Linksys. (The unchanged name is a giveaway that the wireless router was installed without any specific configuration.)&lt;br/&gt;&lt;br/&gt;If you would rather use the command line, iwconfig allows configuring the wireless device. Try iwconfig --help or man iwconfig to learn more about this. For example, I could get the same results that I did with YaST by typing:&lt;br/&gt;&lt;br/&gt;iwconfig wlan0 essid "Guiamovil" mode managed key &lt;br/&gt;"s:THESECRETPASSWORD" commit&lt;br/&gt;&lt;br/&gt;Now, you simply can ping any site to check how the device is working or connect to the Web and surf along.&lt;br/&gt;Second Experiment: the PCMCIA Method&lt;br/&gt;&lt;br/&gt;A friend of mine loaned me a PCMCIA card, so I could test a different kind of device. I first thought about removing the USB driver and setup and then installing his card, but that would have been sort of lame. Anyway, just to make sure the card worked, I tried it, starting with:&lt;br/&gt;&lt;br/&gt;ndiswrapper -r atiwu&lt;br/&gt;rm /etc/modprobe.d/ndiswrapper&lt;br/&gt;cd /path.where.you.downloaded.ndiswrapper&lt;br/&gt;make uninstall&lt;br/&gt;make clear&lt;br/&gt;make&lt;br/&gt;make install&lt;br/&gt;&lt;br/&gt;to get back to square zero. I then inserted the card into its slot and used the lspci and lspci -v commands to learn more about it. I found the card at the bottom of the listing, and the second command produced its ID (11ab:1faa):&lt;br/&gt;&lt;br/&gt;$ lspci&lt;br/&gt;00:00.0 Host bridge: ATI Technologies Inc AGP Bridge &lt;br/&gt;                     [IGP 320M] (rev 13)&lt;br/&gt;00:01.0 PCI bridge: ATI Technologies Inc PCI Bridge &lt;br/&gt;                    [IGP 320M] (rev 01)&lt;br/&gt;00:07.0 ISA bridge: ALi Corporation M1533/M1535 PCI to &lt;br/&gt;                    ISA Bridge [Aladdin IV/V/V+]&lt;br/&gt;00:08.0 Multimedia audio controller: ALi Corporation M5451 &lt;br/&gt;          PCI AC-Link Controller Audio Device (rev 02)&lt;br/&gt;00:09.0 Modem: ALi Corporation M5457 AC'97 Modem Controller&lt;br/&gt;00:0a.0 CardBus bridge: ENE Technology Inc CB1410 Cardbus Controller&lt;br/&gt;00:0d.0 USB Controller: NEC Corporation USB (rev 43)&lt;br/&gt;00:0d.1 USB Controller: NEC Corporation USB (rev 43)&lt;br/&gt;00:0d.2 USB Controller: NEC Corporation USB 2.0 (rev 04)&lt;br/&gt;00:0e.0 Ethernet controller: Broadcom Corporation BCM4401 &lt;br/&gt;                             100Base-T (rev 01)&lt;br/&gt;00:10.0 IDE interface: ALi Corporation M5229 IDE (rev c4)&lt;br/&gt;00:11.0 Bridge: ALi Corporation M7101 Power &lt;br/&gt;                Management Controller [PMU]&lt;br/&gt;01:05.0 VGA compatible controller: ATI Technologies Inc &lt;br/&gt;                                   Radeon Mobility U1&lt;br/&gt;02:00.0 Ethernet controller: Marvell Technology Group Ltd. &lt;br/&gt;              88w8335 [Libertas] 802.11b/g Wireless (rev 03)&lt;br/&gt;$ lspci -s 02:00.0 -v&lt;br/&gt;02:00.0 Class 0200: 11ab:1faa (rev 03)&lt;br/&gt;&lt;br/&gt;This time, Googling for 11ab:1faa was lucky. I found several references saying that the card worked well, so I went ahead and installed it using the same method as with the USB card. It worked just fine—it was almost anticlimactic.&lt;br/&gt;&lt;br/&gt;Now, back to the original idea of installing both devices at the same time. I wasn't even sure if NDISwrapper could handle two drivers at the same time, and when I searched the Web, I found nothing. Plowing ahead, I decided to experiment a bit. It turns out that the /etc/modprobe.d/ndiswrapper file read:&lt;br/&gt;&lt;br/&gt;alias wlan0 ndiswrapper&lt;br/&gt;&lt;br/&gt;So, I added an alias wlan1 ndiswrapper line to it, just to see if it made any difference. I went back to the beginning (uninstalled everything), rebooted (just in case) and started again. After setting up both devices, I tried iwconfig and happily saw that both interfaces were recognized. I could remove either of them, and the other still worked fine. I noted that the Allied Telesyn USB device was more sensitive—it could find more remote networks—than the Netgear card, but I guess that's reasonable, as the former is newer and could be expected to be more potent.&lt;br/&gt;Conclusion&lt;br/&gt;&lt;br/&gt;Even though wireless devices are still a low point for Linux, using NDISwrapper provides a good solution, if you are not dogmatic about proprietary binary drivers or using Windows software on your Linux box. I would prefer an OSS solution, but I can't wait for it. There are no guarantees, of course, but my experiments convinced me that getting wireless to work should be an easy job, and I was able to make two different devices work at the same time, which attests to the quality of NDISwrapper.&lt;/blockquote&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2589537411099484208-1873284805011211866?l=dontburnmybeans.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dontburnmybeans.blogspot.com/feeds/1873284805011211866/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2589537411099484208&amp;postID=1873284805011211866' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2589537411099484208/posts/default/1873284805011211866'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2589537411099484208/posts/default/1873284805011211866'/><link rel='alternate' type='text/html' href='http://dontburnmybeans.blogspot.com/2008/05/getting-wireless-ndiswrapper-way.html' title='Getting Wireless the NDISwrapper Way'/><author><name>Jamtech</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/-RNwpfmrDdPU/Tn1tpZWh2zI/AAAAAAAAAHg/ICZaej4kWOk/s220/hitmana3_2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2589537411099484208.post-3648778554405524603</id><published>2008-04-14T14:33:00.001-07:00</published><updated>2008-04-22T15:48:01.143-07:00</updated><title type='text'>The Five Coolest Hacks of 2007</title><content type='html'>&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;&lt;a href="http://www.darkreading.com/document.asp?doc_id=142127&amp;amp;print=true"&gt;Dark Reading&lt;/a&gt;&lt;br /&gt;&lt;blockquote&gt;Nothing was sacred – not cars, not truckers, not even the stock exchange&lt;br /&gt;&lt;br /&gt;DECEMBER 31, 2007 | 2:51 PM&lt;br /&gt;    By Kelly Jackson Higgins&lt;br /&gt;    Senior Editor, Dark Reading&lt;br /&gt;&lt;br /&gt;    Hackers are creative folk, for sure. But some researchers are more imaginative and crafty than others. We're talking the kind of guys who aren't content with finding the next bug in Windows or a Cisco router. Instead, they go after the everyday things we take for granted even more than our PCs -- our cars, our wireless connections, and (gulp) the electronic financial trading systems that record our stock purchases and other online transactions.&lt;br /&gt;&lt;br /&gt;    Not that there's anything wrong with a new Windows or Vista flaw. But you can't help but secretly admire the ingenuity and persistence it takes to hack something that we hadn't thought of as hackable -- or that maybe that we just didn't want to think was. These are the kinds of hacks that pierce the mainsteam consciousness: Your mom's eyes may glaze over when you warn her about the risk of her PC becoming a bot, but you can bet you'll have her full attention when you show how a hacker could redirect her brand-new car navigation system to a deserted dead end street far from her intended destination.&lt;br /&gt;&lt;br /&gt;    We've selected five of the coolest hacks we covered here at Dark Reading in 2007 -- unusual vulnerabilities that were exposed and exploited this past year by researchers who don't just do Windows. So raise your glass to some innovative, and sometimes wacky, hacks that we won't soon forget (nor maybe will Mom):&lt;br /&gt;&lt;br /&gt;Contents:&lt;br /&gt;&lt;br /&gt;   * Page 1: The car navigation system&lt;br /&gt;   * Page 2: WiFi 'sidejacking'&lt;br /&gt;   * Page 3: Eighteen-wheelers&lt;br /&gt;   * Page 4: 'Hacking capitalism'&lt;br /&gt;   * Page 5: iPhone&lt;br /&gt;&lt;br /&gt;Next Page: The car navigation system&lt;br /&gt;    1. The car navigation system&lt;br /&gt;&lt;br /&gt;DECEMBER 31, 2007 | A pair of Italian researchers earlier this year drove right through holes they discovered in some car navigation systems -- vulnerabilities that would let an attacker inject phony messages into the system or launch a denial-of-service attack against it. (See Hacking the Car Navigation System.)&lt;br /&gt;&lt;br /&gt;Andrea Barisani, chief security engineer of Inverse Path, and Daniele Bianco, hardware hacker for Inverse Path, built tools for hacking satellite-based navigation systems that use Radio Data System-Traffic Message Channel (RDS-TMC) to receive traffic broadcasts and emergency messages. RDS-TMC is popular in vehicle navigation systems sold in Europe, and has been catching on in North America as well.&lt;br /&gt;&lt;br /&gt;RDS-TMC provides broadcasts on traffic conditions, accidents, and detours for the driver. Its main weakness: It doesn't authenticate where the traffic comes from, the researchers say. That leaves the door wide open for a bad guy to reroute drivers to a detour, or to overwhelm it with a DDOS, killing the navigation system as well as its climate-control system and stereo.&lt;br /&gt;&lt;br /&gt;The researchers tested their hardware and software tools with a one- to five-kilometer radius of the targeted vehicles, but they say an attacker could target a specific vehicle by adding a directional antenna, for instance. The good news is there are some emerging navigation-system technologies that may be safer -- including one that will include encryption, although that's at least five years out.&lt;br /&gt;&lt;br /&gt;So how can you tell if your navigation system has been hacked? There's not much you can do until it's too late and your AC and stereo are out, and you're sitting on a hot and dusty, deserted road nowhere near Starbucks.&lt;br /&gt;&lt;br /&gt;Next Page: WiFi 'sidejacking'&lt;br /&gt;    2. WiFi 'sidejacking'&lt;br /&gt;&lt;br /&gt;DECEMBER 31, 2007 | First it was the Ferret, then the Hamster: WiFi will never be safe again. Researcher Robert Graham, CEO of Errata Security, wowed (and in some cases, shamed) the Black Hat DC and Las Vegas crowds this year with live hacks of attendees who dared to use the WiFi network unprotected, using his homegrown WiFi sniffing tools that basically sniff and grab WiFi traffic out of the air.&lt;br /&gt;&lt;br /&gt;Yes, some of us got a firsthand lesson in "it can't happen to me." (See Joke's on Me.) As I checked my email during a session at Black Hat DC last February, little did I know that as Graham and colleague David Maynor were demonstrating Ferret next door, the tool was blasting my username and password up on the screen for all to see.&lt;br /&gt;&lt;br /&gt;But Graham turned his WiFi hack up a notch in Vegas in August, with a more powerful version of Ferret -- Hamster -- that "sidejacks" machines using WiFi and accesses their Web accounts. Hamster grabs users' Gmail, Yahoo, and other online accounts. It basically clones the victim's cookies by sniffing their session IDs and controlling their Website accounts. (See 'Sidejacking' Tool Unleashed.)&lt;br /&gt;&lt;br /&gt;"You can be in a café and see a list of people browsing [over WiFi]. And you can hijack and clone their Gmail system," for example, Graham says. And it's very easy to do, he says.&lt;br /&gt;&lt;br /&gt;Hamster doesn't hack passwords, just the cookies and URL trail left behind by a WiFi user. The attacker then can pose as the victim and read, send, and receive email on his or her behalf. It does not, however, see the victim's actual email messages (phew).&lt;br /&gt;&lt;br /&gt;Interestingly, Graham had a little trouble finding many users in Vegas who dared to go WiFi unprotected. Still, he recommends logging out of your Web session to wipe out your cookie trail when you're using WiFi.&lt;br /&gt;&lt;br /&gt;Next Page: Eighteen-wheelers&lt;br /&gt;    3. Eighteen-wheelers&lt;br /&gt;&lt;br /&gt;DECEMBER 31, 2007 | Truckers are sleep-deprived enough without having to worry about their RFID-based electronic product code (EPC)-based load of plasma TVs getting hacked while they park and snooze at a truck stop. But researchers from PacketFocus Security Solutions have shown that's a very real threat. (See Hacking Truckers.)&lt;br /&gt;&lt;br /&gt;PacketFocus, along with some researchers at Atlas RFID Solutions, were able to read EPC codes using standard EPC Generation 2 readers and antennas on an 18-wheeler they rented from a local freight company. They loaded the rig with EPC-tagged boxes to test out just what data can be intercepted from it, and found it was easy to scan and hack information off the labels.&lt;br /&gt;&lt;br /&gt;Joshua Perrymon, hacking director for PacketFocus, and his colleagues used off-the-shelf tools to hack the freight information. "We are showing you can do this with off-the-shelf products, and you don't have to be a super-hacker" to get EPC data off a tractor-trailer, Perrymon says.&lt;br /&gt;&lt;br /&gt;EPC provides more detailed information about a product than a standard bar code, with unique tags for each item to improve inventory and shipment-tracking. But that information could also fall into the hands of a malicious competitor or criminal: "Each product has its own EPC number," he says. "If a company is using EPC numbers, we can sit outside the tractor-trailer and scan them, reference them with known EPC numbers, and know the inventory of what's on that trailer."&lt;br /&gt;&lt;br /&gt;Aside from the obvious danger of this information falling into a competitor's hands, criminals could sniff the 18-wheeler's payload to better target their holdups: "Unless they had a lot of inside information, they don't have enough information to rob that truck," Perrymon says. "Now they can scan it if it's not secure -- they don't want to rob that toilet paper truck, but if it's got plasma TVs with surround sound, [that's their] target."&lt;br /&gt;&lt;br /&gt;Next Page: 'Hacking capitalism'&lt;br /&gt;    4. 'Hacking capitalism'&lt;br /&gt;&lt;br /&gt;DECEMBER 31, 2007 | The financial services industry is typically on the leading edge when it comes to adopting new security technologies and standards. But researchers at Matasano Security this year revealed that one of the most popular application-layer protocols used by financial services firms, stock exchanges, and investment banks for automated financial trading, has some serious security holes. (See 'Hacking Capitalism'.)&lt;br /&gt;&lt;br /&gt;Applications written to the FIX (financial information exchange) protocol can be vulnerable to denial-of-service, session-hijacking, and man-in-the middle attacks over the Internet -- and could let an attacker "watch" transactions, according to David Goldsmith, CEO of Matasano Security, who discussed these issues at Black Hat USA in August.&lt;br /&gt;&lt;br /&gt;Even scarier is that an attack on a FIX-based app could be silent and by the time it's detected, it may be too late. "If a hacker was monitoring or viewing [the transactions], you may never know they are there," Goldsmith says. "[He] could take that information and use it to their advantage for insider trading... or to cause significant financial damage."&lt;br /&gt;&lt;br /&gt;Security tools are mostly ineffective for protecting financial systems from this type of attack, although Goldsmith recommends strong firewalls and external session-layer encryption. But an IDS or a vulnerability scanner isn't going to find FIX bugs, he says, and because these systems are mission-critical and can't be taken offline for testing, it's even difficult to search for vulnerabilities in them.&lt;br /&gt;&lt;br /&gt;Goldsmith wouldn't reveal details on the actual vulnerabilities he and his colleagues found in FIX, but he says financial firms should revisit how they secure these applications, looking at changing passwords, for instance.&lt;br /&gt;&lt;br /&gt;Next Page: iPhone&lt;br /&gt;    5. iPhone&lt;br /&gt;&lt;br /&gt;DECEMBER 31, 2007 | Hacking and bypassing the iPhone's exclusive service with AT&amp;amp;T was all the rage when the new device first got into users' palms this year, but it wasn't until researcher HD Moore added an iPhone hacking module to the Metasploit penetration testing tool that the real iPhone hacking could begin. (See Metasploit Adds iPhone Hacking Tools and i Caramba! iPhone Hacked Already.)&lt;br /&gt;&lt;br /&gt;Moore released an Apple iPhone shellcode for Metasploit 3.0 in September, with "payloads" for writing exploits using the wildly popular Metasploit framework. "The addition of iPhone payloads to Metasploit makes it easy for a researcher to write exploits," Moore says. "The payloads also provide an example of how to develop new shellcode for the iPhone, which could accelerate exploit development for the platform."&lt;br /&gt;&lt;br /&gt;He had a little fun with it, too, creating a payload that lets you make a victim's phone vibrate. But the other payloads are no laughing matter -- they can give the attacker remote shell access. Moore also wrote some exploit modules for the iPhone.&lt;br /&gt;&lt;br /&gt;The powerful stuff, of course, comes with the rootkits that attackers could use on an iPhone. "A rootkit takes on a whole new meaning when the attacker has access to the camera, microphone, contact list, and phone hardware. Couple this with 'always-on' Internet access over EDGE and you have a perfect spying device," Moore said in a Metasploit blog post.&lt;br /&gt;&lt;br /&gt;Moore, who is also director of security research for BreakingPoint Systems, says he added the iPhone hacking tools for Metasploit in hopes that it would help researchers discover new attack vectors on the smart phone. Meanwhile, iPhone hacking has made many a 2008 threat prediction list -- so look out in the new year.&lt;br /&gt;&lt;br /&gt;Have a comment on this story? Please click "Discuss" below. If you'd like to contact Dark Reading's editors directly, send us a message.&lt;br /&gt;&lt;br /&gt;# Errata Security&lt;br /&gt;# Matasano Security LLC&lt;br /&gt;# BreakingPoint Systems&lt;br /&gt;# Apple Inc. (Nasdaq: AAPL)&lt;br /&gt;&lt;br /&gt;Copyright © 2008 United Business Media LLC - All rights reserved. &lt;/blockquote&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2589537411099484208-3648778554405524603?l=dontburnmybeans.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dontburnmybeans.blogspot.com/feeds/3648778554405524603/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2589537411099484208&amp;postID=3648778554405524603' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2589537411099484208/posts/default/3648778554405524603'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2589537411099484208/posts/default/3648778554405524603'/><link rel='alternate' type='text/html' href='http://dontburnmybeans.blogspot.com/2008/04/five-coolest-hacks-of-2007.html' title='The Five Coolest Hacks of 2007'/><author><name>Jamtech</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/-RNwpfmrDdPU/Tn1tpZWh2zI/AAAAAAAAAHg/ICZaej4kWOk/s220/hitmana3_2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2589537411099484208.post-1847568438528057710</id><published>2008-03-27T21:22:00.001-07:00</published><updated>2008-03-27T21:22:46.632-07:00</updated><title type='text'>Commenting Code by Ryan Campbell</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;&lt;div class='single' id='features'&gt;  &lt;div class='headline'&gt;		 &lt;h3&gt;&lt;a title='Permanent Link: Successful Strategies for Commenting Code' rel='bookmark' href='http://particletree.com/features/successful-strategies-for-commenting-code/'&gt;Successful Strategies for Commenting Code    &lt;cite&gt;By Ryan Campbell · August 1st, 2005&lt;/cite&gt;&lt;/a&gt;&lt;/h3&gt; &lt;/div&gt;  &lt;div class='content'&gt; &lt;h3&gt;Introduction&lt;/h3&gt;  &lt;p&gt;Commenting your code is like cleaning your bathroom—you never want to do it, but it really does create a more pleasant experience for you and your guests. Because I’ve recently adopted a new mantra to use comments frequently and appropriately in my code, I spent a few hours researching the literature on commenting readability, reusability, and guidelines.&lt;/p&gt;  &lt;p&gt;&lt;a title='HTML Form Builder' href='http://wufoo.com/?gad=CO_3o6UDEghyApM_y2FKeRjZ8LH7AyDP_uch&amp;amp;gkw=fast+fun+easy' class='ptad'&gt;&lt;br/&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;It was a bit overwhelming to see the sheer amount of information and discussions on the topic. Basically, there are a lot of tough, but fundamental questions out there like what does “frequently and appropriately” mean? Because there are a million different beliefs and contradictions on the subject, I created this brief overview to present my findings.&lt;/p&gt;  &lt;h3&gt;Types of Comments&lt;/h3&gt;  &lt;p&gt;&lt;strong&gt;Code Commenting&lt;/strong&gt; - This refers to writing descriptive variable names that are self explanatory. This is a minimalist form of commenting, and looks like this:&lt;/p&gt;  &lt;pre&gt;&lt;code&gt;function addUserToDatabase(userName, userAge)&lt;br/&gt;&lt;/code&gt;&lt;/pre&gt;  &lt;p&gt;Without any additional information, you can tell that the function will add a user’s name and age to a database. A common implementation of this is called &lt;a title='Detailed documentation' href='http://www4.ncsu.edu:8030/%7Emoriedl/projects/hungarian/'&gt;Hungarian Notation&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Inline Commenting&lt;/strong&gt; - Specifically, these types of comments come at the end of a line of code, but we can also use this term to refer to comments inside of a function as well. This is the most basic form of commenting.&lt;/p&gt;  &lt;pre&gt;&lt;code&gt;function calculateHitPoints(cUser) {&lt;br/&gt;    var nStrength = document.getElementById("enemyStrength").value; // grab current enemy strength&lt;br/&gt;&lt;br/&gt;    // subtract user size : small = 1, medium = 2, large = 3&lt;br/&gt;    var nDamage = (nStrength * 3) � cUser.nSize;&lt;br/&gt;    return cUser.nCurrentHitPoints � nDamage;&lt;br/&gt;}&lt;br/&gt;&lt;/code&gt;&lt;/pre&gt;  &lt;p&gt;&lt;strong&gt;Function Commenting&lt;/strong&gt; - This type of commenting is found on the lines above a function, and reveals all of the necessary details about that function. This includes parameters, return values, and any logic quirks or decisions that were made:&lt;/p&gt;  &lt;pre&gt;&lt;code&gt;/*&lt;br/&gt; * Summary:      Calculate hitpoints after attack using formula&lt;br/&gt; *               new = current � ((enemyStrength*3) � size)&lt;br/&gt; * Parameters:   cUser � object containing hero's stats&lt;br/&gt; * Return:       Boolean indicating life or death&lt;br/&gt; */&lt;br/&gt;function calculateHitPoints(cUser) {&lt;br/&gt;    �&lt;br/&gt;} // end calculateHitPoints&lt;br/&gt;&lt;/code&gt;&lt;/pre&gt;  &lt;p&gt;&lt;strong&gt;Class / Page Commenting&lt;/strong&gt; - Comments that refer to an entire page or top level object fall into this category. Usually these comments include a broad overview, last edit date, associated files, author, and contact information. Additionally, this may include a general footer at the bottom of every page. Kevin wrote some great templates for building these types of comments in his feature on using &lt;a title='Go Team!' href='http://particletree.com/features/quick-start-your-design-with-xhtml-templates'&gt;XHTML templates&lt;/a&gt;.&lt;/p&gt;  &lt;pre&gt;&lt;code&gt;/* &lt;br/&gt;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - &lt;br/&gt;&lt;br/&gt;Title : &lt;br/&gt;Author : &lt;br/&gt;URL : &lt;br/&gt;&lt;br/&gt;Description : &lt;br/&gt;&lt;br/&gt;Created : &lt;br/&gt;Modified : &lt;br/&gt;&lt;br/&gt;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - &lt;br/&gt;*/&lt;br/&gt;&lt;/code&gt;&lt;/pre&gt;  &lt;h3&gt;Commenting Regulars&lt;/h3&gt;  &lt;p&gt;When developing in a team environment, standardized ways of indicating the next step in the process are great ways of communicating to other programmers and making the entire process efficient. These are also known as functional comments.&lt;/p&gt;  &lt;blockquote&gt;  &lt;p&gt;[Functional Comments] serve one purpose: adding functionality to the development process.&lt;/p&gt;    &lt;p&gt;&lt;cite&gt;Bernhard Spuida · &lt;a title='Excellent article. Must read.' href='http://www.icsharpcode.net/TechNotes/Commenting20020413.pdf'&gt;The Fine Art of Commenting&lt;/a&gt;&lt;/cite&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;They don’t tell you anything about the code, but they do provide documentation on what needs to be done as well as what &lt;em&gt;has been done&lt;/em&gt;. Here are some common comments you can feel comfortable using in your code:&lt;/p&gt;  &lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;TODO&lt;/strong&gt;: This key phrase signifies what needs to be accomplished and should be placed on the line where the future code should go. Some development environments recognize this phrase and will create a to-do list off of it.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;BUG / FIX&lt;/strong&gt;: Document a specific bug, or a fix for a bug, and place the comment above the line it pertains to. If you use bug tracking software, include the ID of the bug, so you can always track where it occurred and how you fixed it.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;TEAMNAME&lt;/strong&gt;: This comment is usually different wherever you work, but is used to call attention to a certain programmer or programming team. For example, you may want to let the Artificial Intelligence team know why you made a certain decision and so you would use this type of comment to alert them. Read more about this in &lt;a title='Game programmers know what they are talking about.' href='http://www.gamedev.net/reference/programming/features/codedoc/page5.asp'&gt;The Art of Code Documentation&lt;/a&gt; by Drew Sikora.&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;  &lt;p&gt;In addition to commenting keywords, there are programs out there that will document your code based on standard comments. While relying on these programs leaves room for error, they are still worth taking a look at. Briefly, two types are &lt;a title='XML Comments' href='http://msdn.microsoft.com/msdnmag/issues/02/06/XMLC/default.aspx'&gt;XML Comments&lt;/a&gt; and &lt;a title='JavaDoc' href='http://java.sun.com/j2se/javadoc/writingdoccomments/'&gt;JavaDoc&lt;/a&gt;&lt;/p&gt;  &lt;h3&gt;Increasing Comment Readability&lt;/h3&gt;  &lt;p&gt;In a perfect world, reading code would be like reading a book. Unfortunately, code is written for computers to execute, not for humans to read. You can’t just read code from start to finish—they’re like those choose-your-own-ending books, forcing you to go all over the place to figure out how not to kill your main character. Comments are a great tool for adding context to your code, so that when you jump around you know where you are. With that in mind, here are some tips to make your code easier to read:&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Commented Paragraphs&lt;/strong&gt; � Write your code and comments in paragraph format. In &lt;a title='Great tips on all coding practices in Perl, not just commenting.' href='http://www.perl.com/lpt/a/2005/07/14/bestpractices.html'&gt;10 Essential Development Practices&lt;/a&gt;, Damian Conway suggests that we should, “Break each piece of code into sequences that achieve a single task.”&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Precede comments by a blank line&lt;/strong&gt; � Doing this creates a distinct separation between your code and comments. Plus, it’s visually pleasing.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Properly tab comments&lt;/strong&gt; � Make sure comments are tabbed out to the line they are referencing. Additionally, make sure similar comment types align when tabbed. Here’s an example:&lt;/p&gt;  &lt;pre&gt;&lt;code&gt;var MAX_USERS = 2           //all players&lt;br/&gt;var MAX_POINTS = 100000     //needed to win game&lt;br/&gt;&lt;/code&gt;&lt;/pre&gt;  &lt;p&gt;&lt;strong&gt;Don’t insult anyone’s intelligence&lt;/strong&gt; � All commenting is not productive commenting. Too many comments can make your code less meaningful and therefore less readable. An example:&lt;/p&gt;  &lt;pre&gt;&lt;code&gt;for(i = 0; i &amp;amp;lt; object.length; i++) { //loop until i hits max length&lt;br/&gt;&lt;/code&gt;&lt;/pre&gt;  &lt;p&gt;&lt;strong&gt;It’s not design&lt;/strong&gt; � I see a lot of people use crazy characters all over the place and it’s really not necessary. More often than not, it distracts from the business at hand. Keep it simple, keep it sweet.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Create a consistent style&lt;/strong&gt; � There are many beliefs on the proper way to comment code. Some feel comments should be so detailed that a non programmer could follow the logic, while others believe you use comments for support. What matters most, I think, is that you are consistent in your commenting style. This helps your reader know what to expect when going through several different projects.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Comment while you code&lt;/strong&gt; - The chances of you commenting a finished project are slim, so do yourself a favor and comment your code immediately.&lt;/p&gt;  &lt;blockquote&gt;  &lt;p&gt;It is a good practice to write comments at the same time (or earlier than) you write your code.&lt;/p&gt;    &lt;p&gt;&lt;cite&gt;MSDN · &lt;a title='Microsoft is always there for me.' href='http://msdn.microsoft.com/library/default.asp?url=/library/en-us/modcore/html/deconusingcommentseffectively.asp'&gt;Using Comments Effectively&lt;/a&gt;&lt;/cite&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Commenting while you code forces you to make sure your logic “sounds right.” Plus, your comments are going to be more accurate when the understanding of what’s going on behind-the-scenes is fresh in your mind.&lt;/p&gt;  &lt;h3&gt;Reusability in Comments&lt;/h3&gt;  &lt;p&gt;The most interesting concept I came across while reading about code commenting is “comment reusability.” This is something we think about all the time when writing markup and CSS to minimize the amount of work that needs to be done when changes are made. Same principle works wonderfully when it comes to commenting. Here’s an example: Imagine that we have a textbox that’s being edited:&lt;/p&gt;  &lt;pre&gt;&lt;code&gt;document.getElementById("myTextbox").style.width = "100px"; // change textbox width&lt;br/&gt;&lt;/code&gt;&lt;/pre&gt;  &lt;p&gt;The simple comment in that line is not reusable. What if we were to change the textbox to a select element? We would have to change the comment as well. While looking over some coding practices, I came across another question: Is it acceptable to comment the end of a code block, like this:&lt;/p&gt;  &lt;pre&gt;&lt;code&gt;function calculateHitPoints(cUser) {&lt;br/&gt;�&lt;br/&gt;}  // end calculateHitPoints&lt;br/&gt;&lt;/code&gt;&lt;/pre&gt;  &lt;p&gt;I’m split down the middle on this one. With modern text editors that draw lines based on your tabbing, I would not comment the end of every code block. I do, however, see the benefits of commenting the end of a function. Functions usually remain in place, but logic blocks switch around often until bugs are ironed out. Because there are usually a good number of code blocks in a document, the commenting can get pretty heavy without adding a lot of new and useful information.&lt;/p&gt;  &lt;p&gt;Speaking of function commenting, Cprogramming.com produced &lt;a title='Quick read with good tips' href='http://www.cprogramming.com/tutorial/comments.html'&gt;The Hows and Whys of Commenting&lt;/a&gt;, which stresses the importance of reusable variable names in functions. They use an example of a funciton that calculates speed. Instead of declaring the function like this:&lt;/p&gt;  &lt;pre&gt;&lt;code&gt;function getSpeed(runnerDistance, runnerTime)&lt;br/&gt;&lt;/code&gt;&lt;/pre&gt;  &lt;p&gt;You should make it reusable by naming the variables generically:&lt;/p&gt;  &lt;pre&gt;&lt;code&gt;function getSpeed(totalDistance, totalTime)&lt;br/&gt;&lt;/code&gt;&lt;/pre&gt;  &lt;p&gt;By doing so, you can logically calculate the distance for any object, such as a plane, car, train, and not just that of a runner.&lt;/p&gt;  &lt;p&gt;Now, when it comes to using Hungarian Notation, I want to point out that the topic is a bit controversial, stirring up quite a few heated debates. &lt;a title='Problems in paradise.' href='http://ootips.org/hungarian-notation.html'&gt;The Good, The Bad and The Ugly&lt;/a&gt; believe it is inefficient to change the variable name every time you change the variable type. For example, ‘szEventType’ should not need to be changed to ‘nEventType’ if you decide to make it an integer rather than a string.&lt;/p&gt;  &lt;p&gt;Regardless of you decide to do it, try to remember to take reusability in your comments into consideration. The more reusable the comments, the less time you’re going to spend dealing with them. More importantly, when a team member comes along and makes changes to the code, hopefully, he won’t have to browse through all the comments looking for what to change.&lt;/p&gt;  &lt;h3&gt;Why Bother?&lt;/h3&gt;  &lt;p&gt;One of the hardest hurdles in commenting code is convincing yourself to do it, so it is important to look to other sources for motivation.&lt;/p&gt;  &lt;blockquote&gt;  &lt;p&gt;Prior, clear, and extensive documentation is a key element in creating software that can survive and adapt.&lt;/p&gt;    &lt;p&gt;&lt;cite&gt;Jef Raskin · &lt;a title='Great to get you motivated' href='http://acmqueue.com/modules.php?name=Content&amp;amp;pa=showpage&amp;amp;pid=290'&gt;Comments Are More Important Than Code&lt;/a&gt;.&lt;/cite&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;On a more personal note, after I applied my findings to some of my recent projects, I noticed some significant improvements to my programming lifestyle:&lt;/p&gt;  &lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;I was writing better code.&lt;/strong&gt; By commenting everything, I was forced to think about why I was doing something rather than just making it work. I was programming smarter rather than harder. Because commenting my code forced me to verbalize my logic and make me think twice about a line of action when putting it into words, I usually found ways to optimize my code when it didn’t “sound right” to me. The comments lead to increased optimization and ultimately less work. Had I gone through after I finished a project to explain things, I’m positive I would have wasted a lot of time reprogramming and recommending bad logic. Time will tell if it decreased bugs as well.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;I was improving the future.&lt;/strong&gt; You never know who’s going to be looking at your code or when you’ll need to refer back to it. Future Ryan, my co-workers, potential employers and even my mom are really going to appreciate my commenting investment, because it’s going to save them time. Time is money (especially in programming) and so shaving off time wasted on confusion and interpretation is definitely worth the effort.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;I was proud of my work.&lt;/strong&gt; One of my biggest problems I have in my life is working on the same thing day in and day out. If I’m proud of what I doing, it basically removes that mental block. Because my projects were clean, flexible, efficient and sexy, I really enjoyed coming back to them and that, to me, is something priceless. Also, it makes it a lot easier to give a great first impression to job applicants, investors or even obsessive-compulsive blog readers when the code was created in a professional and consistent manner.&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;  &lt;h3&gt;See For Yourself&lt;/h3&gt;  &lt;p&gt;I’ve written a simple JavaScript function to illustrate how even if you think all of the comments seem important, bad commenting decisions can hurt the readability of your code. Here is the result:&lt;/p&gt;  &lt;pre&gt;&lt;code&gt;//-+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_-&lt;br/&gt;// I wrote this script to process a battle between two units.  &lt;br/&gt;// The attack member functions do the calculation, but this&lt;br/&gt;// function determines the order of attacks.&lt;br/&gt;// Two valid objects must be passed in, and then the function&lt;br/&gt;// will return true if everything worked ok. &lt;br/&gt;//-+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_-&lt;br/&gt;function beginBattle(attacker, defender) {&lt;br/&gt;    var b; // boolean to hold life or death&lt;br/&gt;    var teamCount; // counter for loops&lt;br/&gt;    if(defender.agility &amp;amp;gt; attacker.agility) {&lt;br/&gt;        b = defender.attack(attacker);&lt;br/&gt;    }&lt;br/&gt;    // if there was a previous strike, make sure he is still alive then process the attack&lt;br/&gt;    if(b) {&lt;br/&gt;        b = attacker.attack(defender);&lt;br/&gt;    }&lt;br/&gt;    // see if any teammates want to counter attack&lt;br/&gt;    // loop through the defenders teamates starting at i = 0&lt;br/&gt;    for(teamCount = 0; teamCount &amp;amp;lt; defender.team.length; i++) {&lt;br/&gt;        var teammate = defender.team[teamCount];    //individual teammate&lt;br/&gt;        if(teammate.counterAttack = 1) { // 1 means they have counter attack enabled&lt;br/&gt;            b = teammate.attack(attacker);&lt;br/&gt;        }&lt;br/&gt;    }   &lt;br/&gt;    // make sure that somewhere in here death processing is handled.&lt;br/&gt;    return true;&lt;br/&gt;} // end function&lt;br/&gt;&lt;/code&gt;&lt;/pre&gt;  &lt;p&gt;It’s not terrible, but it could be better. Using the exact same function, we’ll apply some of the commenting guidelines I talked about above:&lt;/p&gt;  &lt;pre&gt;&lt;code&gt;/*&lt;br/&gt; * Summary:     Determine order of attacks, and process each battle&lt;br/&gt; * Parameters:  Creature object representing attacker | Creature object representing defender&lt;br/&gt; * Return:      Boolean indicating successful fight&lt;br/&gt; * Author:      Ryan Campbell&lt;br/&gt; */&lt;br/&gt;function beginBattle(attacker, defender) {&lt;br/&gt;    var isAlive;    // Boolean inidicating life or death after attack&lt;br/&gt;    var teamCount;  // Loop counter&lt;br/&gt;&lt;br/&gt;    // Check for pre-emptive strike&lt;br/&gt;    if(defender.agility &amp;amp;gt; attacker.agility) {&lt;br/&gt;        isAlive = defender.attack(attacker);&lt;br/&gt;    }&lt;br/&gt;&lt;br/&gt;    // Continue original attack if still alive&lt;br/&gt;    if(isAlive) {&lt;br/&gt;        isAlive = attacker.attack(defender);&lt;br/&gt;    }&lt;br/&gt;&lt;br/&gt;    // See if any of the defenders teammates wish to counter attack&lt;br/&gt;    for(teamCount = 0; teamCount &amp;amp;lt; defender.team.length; i++) {&lt;br/&gt;        var teammate = defender.team[teamCount];&lt;br/&gt;        if(teammate.counterAttack = 1) {&lt;br/&gt;            isAlive = teammate.attack(attacker);&lt;br/&gt;        }&lt;br/&gt;    }   &lt;br/&gt;&lt;br/&gt;    // TODO: Process the logic that handles attacker or defender deaths&lt;br/&gt;&lt;br/&gt;    return true;&lt;br/&gt;} // End beginBattle&lt;br/&gt;&lt;/code&gt;&lt;/pre&gt;  &lt;p&gt;In my opinion, the code has become much more pleasant to read with only minimal changes. First, we applied some consistency. All of the comments have a blank line above them, start with a capital letter, and are tabbed properly. Next, variables such as ‘b’ were changed to ‘isAlive’ to make them self explanatory. Lastly, a ‘TODO:’ was added to make future changes stand out. By using brief and consistent pieces of language, I’ve significantly improved the readability of my code.&lt;/p&gt;  &lt;h3&gt;Build Your Own Style&lt;/h3&gt;  &lt;p&gt;Now, there is an entire movement of programmers out there that believe that code is essentially another form of personal expression and so it’s important for me to stress that I am not suggesting that these ideas and strategies are the only way to explain your code. Instead, I want people to walk away understanding that comments are important because they can affect the readability, performance and professionalism of your programming. I highly recommend that everyone take some time to reflect upon and create commenting guidelines based on what you find is important and necessary for your situation.&lt;/p&gt;  &lt;p&gt;If you want to find more information on this topic, I suggest reading all of the articles I’ve linked to throughout this essay. And while I have not read it myself, I have heard many good things about &lt;a title='Literate Programming' href='http://amazon.com/o/ASIN/0937073814/ref=nosim/particletree-20'&gt;Literate Progamming&lt;/a&gt; by Donald E. Knuth. As always, if you have any good ideas about commenting code, let us know because we always like to hear.&lt;/p&gt;  &lt;a title='HTML Form Builder' href='http://wufoo.com/' class='ptad'&gt;&lt;br/&gt;&lt;/a&gt; &lt;/div&gt;  &lt;div class='notice'&gt; 	&lt;img alt='Ryan Campbell' src='http://particletree.com/images/rcampbell.gif'/&gt; 	&lt;h3&gt;Successful Strategies for Commenting Code by Ryan Campbell&lt;/h3&gt; 					 	This entry was posted &lt;b&gt; 	2 years ago	 	&lt;/b&gt; and was filed under &lt;a rel='category tag' title='View all posts in Features' href='http://particletree.com/archives/features/'&gt;Features&lt;/a&gt;.&lt;br/&gt;	 	You can follow comments on this entry by subscribing to the &lt;a href='http://particletree.com/features/successful-strategies-for-commenting-code/feed/'&gt;RSS feed&lt;/a&gt;.  	 			Comments are currently closed. 	&lt;/div&gt;  &lt;div class='navigation'&gt; 	&lt;div class='lt'&gt;&lt;a href='http://particletree.com/notebook/examples-of-good-form-implementations/'&gt;« Previous&lt;/a&gt;&lt;/div&gt; 	&lt;div class='rt'&gt;&lt;a href='http://particletree.com/notebook/lets-party-like-its-1997/'&gt;Next »&lt;/a&gt;&lt;/div&gt; &lt;/div&gt;  &lt;/div&gt;   &lt;cite&gt; 						&lt;/cite&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2589537411099484208-1847568438528057710?l=dontburnmybeans.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dontburnmybeans.blogspot.com/feeds/1847568438528057710/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2589537411099484208&amp;postID=1847568438528057710' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2589537411099484208/posts/default/1847568438528057710'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2589537411099484208/posts/default/1847568438528057710'/><link rel='alternate' type='text/html' href='http://dontburnmybeans.blogspot.com/2008/03/commenting-code-by-ryan-campbell.html' title='Commenting Code by Ryan Campbell'/><author><name>Jamtech</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/-RNwpfmrDdPU/Tn1tpZWh2zI/AAAAAAAAAHg/ICZaej4kWOk/s220/hitmana3_2.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2589537411099484208.post-7073843246259787580</id><published>2008-02-21T23:00:00.001-08:00</published><updated>2008-02-21T23:05:12.465-08:00</updated><title type='text'>Interview with Linus Torvalds</title><content type='html'>&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;&lt;h2 class="date-header"&gt;&lt;small&gt;&lt;small&gt;&lt;small&gt;February 18, 2008&lt;/small&gt;&lt;/small&gt;&lt;/small&gt;&lt;/h2&gt;&lt;h2 class="date-header"&gt;&lt;a name="8668803578631384410"&gt;&lt;/a&gt;&lt;a href="http://linuxhelp.blogspot.com/2008/02/interview-with-linus-torvalds.html"&gt;Interview with Linus Torvalds&lt;/a&gt;&lt;br /&gt;&lt;/h2&gt;&lt;div style="text-align: justify;"&gt;&lt;a href="http://1.bp.blogspot.com/_2rbhsHEyVVg/R7krZ0Qi3ZI/AAAAAAAAAIQ/Z9uI13hqbMM/s1600-h/linus_torvalds.jpg" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img id="BLOGGER_PHOTO_ID_5168209769909116306" alt="" src="http://1.bp.blogspot.com/_2rbhsHEyVVg/R7krZ0Qi3ZI/AAAAAAAAAIQ/Z9uI13hqbMM/s400/linus_torvalds.jpg" style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" border="0" /&gt;&lt;/a&gt;&lt;small&gt;&lt;span style="font-size:180%;"&gt;L&lt;/span&gt;inus Torvalds the self confessed benevolent dictator and father of Linux&lt;br /&gt;recently gave a frank interview to the Linux Foundation. In it he holds a conversation with &lt;span style="font-weight: bold;"&gt;Jim Zemlin&lt;/span&gt; and talks about the future of Linux, patents, internal and external competition,Microsoft and so on.&lt;br /&gt;&lt;/small&gt;&lt;/div&gt;&lt;small&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;The interview is in the form of a podcast and is split into two parts [ &lt;a target="_blank" href="http://linux-foundation.org/weblogs/openvoices/files/2008/01/torvalds5-section1.ogg"&gt;Part I&lt;/a&gt; and &lt;a target="_blank" href="http://podcasts.linux-foundation.org/ogg/feb_08/Torvalds5-Section2.ogg"&gt;Part II&lt;/a&gt;&lt;br /&gt;]. Linux Foundation has also made available transcripts of the&lt;br /&gt;interview which you can read if you have a low bandwidth link.&lt;br /&gt;Transcripts of &lt;a target="_blank" href="http://linux-foundation.org/weblogs/openvoices/linus-torvalds-part-i/"&gt;part I&lt;/a&gt; and &lt;a target="_blank" href="http://linux-foundation.org/weblogs/openvoices/linus-torvalds-part-ii/"&gt;part II&lt;/a&gt; .&lt;/div&gt;&lt;/span&gt;&lt;/small&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2589537411099484208-7073843246259787580?l=dontburnmybeans.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dontburnmybeans.blogspot.com/feeds/7073843246259787580/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2589537411099484208&amp;postID=7073843246259787580' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2589537411099484208/posts/default/7073843246259787580'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2589537411099484208/posts/default/7073843246259787580'/><link rel='alternate' type='text/html' href='http://dontburnmybeans.blogspot.com/2008/02/interview-with-linus-torvalds.html' title='Interview with Linus Torvalds'/><author><name>Jamtech</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/-RNwpfmrDdPU/Tn1tpZWh2zI/AAAAAAAAAHg/ICZaej4kWOk/s220/hitmana3_2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_2rbhsHEyVVg/R7krZ0Qi3ZI/AAAAAAAAAIQ/Z9uI13hqbMM/s72-c/linus_torvalds.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2589537411099484208.post-9096138821067845740</id><published>2008-01-23T22:38:00.001-08:00</published><updated>2008-01-23T22:38:05.407-08:00</updated><title type='text'>Top 50 Linux Quotes of All Time</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;&lt;h2 class='post-title'&gt;&lt;small&gt;&lt;small&gt;&lt;br /&gt;&lt;a href='http://junauza.blogspot.com/2008/01/top-50-linux-quotes-of-all-time.html'&gt;Top 50 Linux Quotes of All Time&lt;/a&gt;&lt;br /&gt;&lt;/small&gt;&lt;/small&gt;&lt;/h2&gt;&lt;br /&gt;&lt;p class='date-header'&gt;&lt;small&gt;&lt;small&gt;Saturday, January 19, 2008&lt;br/&gt;&lt;/small&gt;&lt;/small&gt;&lt;/p&gt;&lt;div id='Header1' class='widget Header'&gt;&lt;div id='header-inner'&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align='center' id='example1'&gt;&lt;small&gt;&lt;small&gt;This collection of Quotes came from This Blog Site&lt;/small&gt;&lt;/small&gt;&lt;br /&gt;&lt;a style='display: block;' href='http://junauza.blogspot.com/2008/01/top-50-linux-quotes-of-all-time.html'&gt;&lt;img width='235' height='63' style='display: block;' src='http://2.bp.blogspot.com/_UqUwVPikChs/R4zFzxv4YVI/AAAAAAAAB9I/yt3vpJ_kjis/S900-R/monkey78.jpg' id='Header1_headerimg' alt='TECH SOURCE FROM BOHOL'/&gt;&lt;/a&gt;&lt;a style='display: block;' href='http://junauza.blogspot.com/2008/01/top-50-linux-quotes-of-all-time.html'/&gt;&lt;small&gt;&lt;small&gt;Source for technology hacks, insights, tutorials, news, reviews and more...|&lt;br/&gt;&lt;br/&gt;&lt;br /&gt;&lt;/small&gt;&lt;/small&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href='http://2.bp.blogspot.com/_UqUwVPikChs/R5Hx0hv4YmI/AAAAAAAAB_U/z46I0FYRP9M/s1600-h/linux.png' onblur='try {parent.deselectBloggerImageGracefully();} catch(e) {}'&gt;&lt;img border='0' id='BLOGGER_PHOTO_ID_5157168933030617698' alt='' src='http://2.bp.blogspot.com/_UqUwVPikChs/R5Hx0hv4YmI/AAAAAAAAB_U/z46I0FYRP9M/s200/linux.png' style='margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;'/&gt;&lt;/a&gt;&lt;span lang='EN-US' style=''/&gt;&lt;small&gt;&lt;span lang='EN-US' style=''&gt;I have collected 50 of my favorite "Linux quotes" of all time. Feel free to add yours. Enjoy!  &lt;o:p/&gt;&lt;/span&gt;&lt;br/&gt;&lt;/small&gt;&lt;br/&gt;&lt;br/&gt;&lt;small&gt;&lt;br/&gt;&lt;span style='font-weight: bold;'&gt;50.&lt;/span&gt; I develop for Linux for a living, I used to develop for DOS.&lt;br/&gt;Going from DOS to Linux is like trading a glider for an F117.&lt;br/&gt;  -- Lawrence Foard, entropy@world.std.com&lt;br/&gt;&lt;br/&gt;&lt;span style='font-weight: bold;'&gt;49.&lt;/span&gt; Avoid the Gates of Hell.  Use Linux&lt;br/&gt;  -- unknown source&lt;br/&gt;&lt;br/&gt;&lt;span style='font-weight: bold;'&gt;48.&lt;/span&gt; I've run DOOM more in the last few days than I have the last few&lt;br/&gt;months.  I just love debugging ;-)&lt;br/&gt;(Linus Torvalds)&lt;br/&gt;&lt;br/&gt;&lt;span style='font-weight: bold;'&gt;47.&lt;/span&gt; By golly, I'm beginning to think Linux really *is* the best thing since&lt;br/&gt;sliced bread.&lt;br/&gt;  -- Vance Petree, Virginia Power&lt;br/&gt;&lt;br/&gt;&lt;span style='font-weight: bold;'&gt;46.&lt;/span&gt; Linux poses a real challenge for those with a taste for late-night&lt;br/&gt;hacking (and/or conversations with God).&lt;br/&gt;  -- Matt Welsh&lt;br/&gt;&lt;br/&gt;&lt;span style='font-weight: bold;'&gt;45.&lt;/span&gt; Linux is obsolete&lt;br/&gt;  -- Andrew Tanenbaum&lt;br/&gt;&lt;br/&gt;&lt;span style='font-weight: bold;'&gt;44.&lt;/span&gt;&lt;br /&gt;Your job is being a professor and researcher: That's one hell of a good&lt;br /&gt;excuse for some of the brain-damages of minix. (Linus Torvalds to&lt;br /&gt;Andrew Tanenbaum)&lt;br/&gt;&lt;br/&gt;&lt;span style='font-weight: bold;'&gt;43.&lt;/span&gt; I&lt;br /&gt;still maintain the point that designing a monolithic kernel in 1991 is&lt;br /&gt;a fundamental error. Be thankful you are not my student. You would not&lt;br /&gt;get a high grade for such a design :-) (Andrew Tanenbaum to Linus&lt;br /&gt;Torvalds)&lt;br/&gt;&lt;br/&gt;&lt;span style='font-weight: bold;'&gt;42.&lt;/span&gt; We all know Linux is great... it does infinite loops in 5 seconds.&lt;br/&gt;  - Linus Torvalds about the superiority of Linux&lt;br/&gt;        on the Amterdam Linux Symposium&lt;br/&gt;&lt;br/&gt;&lt;span style='font-weight: bold;'&gt;41.&lt;/span&gt; People disagree with me.  I just ignore them.&lt;br/&gt;(Linus Torvalds, regarding the use of C++ for the Linux kernel.)&lt;br/&gt;&lt;br/&gt;&lt;span style='font-weight: bold;'&gt;40.&lt;/span&gt; Some people have told me they don't think a fat penguin really embodies the&lt;br/&gt;grace of Linux, which just tells me they have never seen a angry penguin&lt;br/&gt;charging at them in excess of 100mph.  They'd be a lot more careful about what&lt;br/&gt;they say if they had.&lt;br/&gt;  -- Linus Torvalds, announcing Linux v2.0&lt;br/&gt;&lt;br/&gt;&lt;span style='font-weight: bold;'&gt;39.&lt;/span&gt; Other than the fact Linux has a cool name, could someone explain why should use Linux over BSD?&lt;br/&gt;&lt;br/&gt;&lt;span style='font-weight: bold;'&gt;38.&lt;/span&gt;&lt;br /&gt;“How should I know if it works? That's what beta testers are for. I&lt;br /&gt;only coded it." (Attributed to Linus Torvalds, somewhere in a posting)&lt;br/&gt;&lt;br/&gt;&lt;span style='font-weight: bold;'&gt;37.&lt;/span&gt; "Problem solving under linux has never been the circus that it is under AIX." (By Pete Ehlke in comp.unix.aix)&lt;br/&gt;&lt;br/&gt;&lt;span style='font-weight: bold;'&gt;36.&lt;/span&gt; "Besides, I think Slackware sounds better than 'Microsoft,' don't you?" (By Patrick Volkerding)&lt;br/&gt;&lt;br/&gt;&lt;span style='font-weight: bold;'&gt;35.&lt;/span&gt;&lt;br /&gt;"And the next time you consider complaining that running Lucid Emacs&lt;br /&gt;19.05 via NFS from a remote Linux machine in Paraguay doesn't seem to&lt;br /&gt;get the background colors right, you'll know who to thank." (By Matt&lt;br /&gt;Welsh)&lt;br/&gt;&lt;br/&gt;&lt;span style='font-weight: bold;'&gt;34.&lt;/span&gt; "...Deep Hack Mode--that mysterious and frightening state of consciousness where Mortal Users fear to tread." (By Matt Welsh)&lt;br/&gt;&lt;br/&gt;&lt;span style='font-weight: bold;'&gt;33.&lt;/span&gt;&lt;br /&gt;Sigh. I like to think it's just the Linux people who want to be on the&lt;br /&gt;"leading edge" so bad they walk right off the precipice. (Craig E.&lt;br /&gt;Groeschel)&lt;br/&gt;&lt;br/&gt;&lt;span style='font-weight: bold;'&gt;32.&lt;/span&gt; Microsoft&lt;br /&gt;Corp., concerned by the growing popularity of the free 32-bit operating&lt;br /&gt;system for Intel systems, Linux, has employed a number of top&lt;br /&gt;programmers from the underground world of virus development. Bill Gates&lt;br /&gt;stated yesterday: "World domination, fast -- it's either us or Linus".&lt;br /&gt;Mr. Torvalds was unavailable for comment ... (rjm@swift.eng.ox.ac.uk&lt;br /&gt;(Robert Manners), in comp.os.linux.setup)&lt;br/&gt;&lt;br/&gt;&lt;span style='font-weight: bold;'&gt;31.&lt;/span&gt;&lt;br /&gt;Who wants to remember that escape-x-alt-control-left shift-b puts you&lt;br /&gt;into super-edit-debug-compile mode? (Discussion in comp.os.linux.misc&lt;br /&gt;on the intuitiveness of commands, especially Emacs.)&lt;br/&gt;&lt;br/&gt;&lt;span style='font-weight: bold;'&gt;30.&lt;/span&gt;&lt;br /&gt;It's a bird.. It's a plane.. No, it's KernelMan, faster than a speeding&lt;br /&gt;bullet, to your rescue. Doing new kernel versions in under 5 seconds&lt;br /&gt;flat.. (Linus, in the announcement for 1.3.27)&lt;br/&gt;&lt;br/&gt;&lt;span style='font-weight: bold;'&gt;29.&lt;/span&gt; Those who don't understand Linux are doomed to reinvent it, poorly. (Unidentified source.)&lt;br/&gt;&lt;br/&gt;&lt;span style='font-weight: bold;'&gt;28.&lt;/span&gt;&lt;br /&gt;"How do you power off this machine?" (Linus, when upgrading&lt;br /&gt;linux.cs.helsinki.fi, and after using the machine for several months.)&lt;br/&gt;&lt;br/&gt;&lt;span style='font-weight: bold;'&gt;27.&lt;/span&gt; I've discovered that using VMS is a lot like driving a nail with your head:&lt;br/&gt;sure, you eventually get something practical done, but it usually results&lt;br/&gt;in a headache and some blood loss.&lt;br/&gt;(submitted by Sean A. Simpson)&lt;br/&gt;&lt;br/&gt;&lt;span style='font-weight: bold;'&gt;26.&lt;/span&gt;&lt;br /&gt;"... being a Linux user is sort of like living in a house inhabited by&lt;br /&gt;a large family of carpenters and architects. Every morning when you&lt;br /&gt;wake up, the house is a little different. Maybe there is a new turret,&lt;br /&gt;or some walls have moved. Or perhaps someone has temporarily removed&lt;br /&gt;the floor under your bed." - Unix for Dummies, 2nd Edition (Found in&lt;br /&gt;the .sig of Rob Riggs)&lt;br/&gt;&lt;br/&gt;&lt;span style='font-weight: bold;'&gt;25.&lt;/span&gt; If Bill Gates is the Devil then Linus Torvalds must be the Messiah. (Unknown source)&lt;br/&gt;&lt;br/&gt;&lt;span style='font-weight: bold;'&gt;24.&lt;/span&gt; LILO, you've got me on my knees!&lt;br/&gt;(from David Black, dblack@pilot.njin.net, with apologies to Derek and the&lt;br/&gt;Dominos, and Werner Almsberger)&lt;br/&gt;&lt;br/&gt;&lt;span style='font-weight: bold;'&gt;23.&lt;/span&gt; Anyone can build a fast processor. The trick is to build a fast system. (Seymour Cray)&lt;br/&gt;&lt;br/&gt;&lt;span style='font-weight: bold;'&gt;22.&lt;/span&gt;&lt;br /&gt;We can use symlinks of course... syslogd would be a symlink to syslogp&lt;br /&gt;and ftpd and ircd would be linked to ftpp and ircp... and of course the&lt;br /&gt;point-to-point protocal paenguin. (Kevin M. Bealer, commenting on the&lt;br /&gt;penguin Linux logo.)&lt;br/&gt;&lt;br/&gt;&lt;span style='font-weight: bold;'&gt;21.&lt;/span&gt; A multithreaded file system is only a performance hack. (Andrew Tanenbaum to Linus Torvalds)&lt;br/&gt;&lt;br/&gt;&lt;span style='font-weight: bold;'&gt;20.&lt;/span&gt; I did this 'cause Linux gives me a woody. It doesn't generate revenue. (Dave '-ddt-&amp;amp;gt;` Taylor, announcing DOOM for Linux)&lt;br/&gt;&lt;br/&gt;&lt;span style='font-weight: bold;'&gt;19.&lt;/span&gt;&lt;br /&gt;This message was brought to you by Linux, the free unix. Windows&lt;br /&gt;without the X is like making love without a partner. Sex, Drugs &amp;amp;&lt;br /&gt;Linux Rules win-nt from the people who invented edlin apples have meant&lt;br /&gt;trouble since eden Linux, the way to get rid of boot viruses (By&lt;br /&gt;mwikholm@at8.abo.fi, MaDsen Wikholm)&lt;br/&gt;&lt;br/&gt;&lt;span style='font-weight: bold;'&gt;18.&lt;/span&gt; Be warned that typing killall name may not have the desired&lt;br/&gt;effect on non-Linux systems, especially when done by a privileged user.&lt;br/&gt;  -- From the killall manual page&lt;br/&gt;&lt;br/&gt;&lt;span style='font-weight: bold;'&gt;17.&lt;/span&gt; Only wimps use tape backup: _real_ men just upload their important stuff on ftp, and let the rest of the world mirror it "&lt;br/&gt;&lt;br/&gt;--- Linus Torvalds&lt;br/&gt;&lt;br/&gt;&lt;span style='font-weight: bold;'&gt;16.&lt;/span&gt; Linux is not user-friendly.&lt;br/&gt;It _is_ user-friendly. It is not ignorant-friendly and idiot-friendly.&lt;br/&gt;&lt;br/&gt;---Source unknown&lt;br/&gt;&lt;br/&gt;&lt;span style='font-weight: bold;'&gt;15.&lt;/span&gt;&lt;br /&gt;`When you say "I wrote a program that crashed Windows", people just&lt;br /&gt;stare at you blankly and say "Hey, I got those with the system, *for&lt;br /&gt;free*".' (By Linus Torvalds)&lt;br/&gt;&lt;br/&gt;&lt;span style='font-weight: bold;'&gt;14.&lt;/span&gt;&lt;br /&gt;"If you want to travel around the world and be invited to speak at a&lt;br /&gt;lot of different places, just write a Unix operating system." (By Linus&lt;br /&gt;Torvalds)&lt;br/&gt;&lt;br/&gt;&lt;span style='font-weight: bold;'&gt;13.&lt;/span&gt; "Are Linux&lt;br /&gt;users lemmings collectively jumping off of the cliff of reliable,&lt;br /&gt;well-engineered commercial software?" (By Matt Welsh)&lt;br/&gt;&lt;br/&gt;&lt;span style='font-weight: bold;'&gt;12.&lt;/span&gt; "Linux: the operating system with a CLUE... Command Line User Environment". (seen in a posting in comp.software.testing)&lt;br/&gt;&lt;br/&gt;&lt;span style='font-weight: bold;'&gt;11.&lt;/span&gt;&lt;br /&gt;“See, you not only have to be a good coder to create a system like&lt;br /&gt;Linux, you have to be a sneaky bastard too” (By Linus Torvalds)&lt;br/&gt;&lt;br/&gt;&lt;span style='font-weight: bold;'&gt;10.&lt;/span&gt; "What happens when you read some doc and either it doesn't answer your&lt;br/&gt;question or is demonstrably wrong? In Linux, you say "Linux sucks" and go&lt;br/&gt;read the code. In Windows/Oracle/etc you say "Windows sucks" and&lt;br/&gt;start banging your head against the wall."&lt;br/&gt;--- Denis Vlasenko on lkml&lt;br/&gt;&lt;br/&gt;&lt;span style='font-weight: bold;'&gt;9.&lt;/span&gt;&lt;br /&gt;"...you might as well skip the Xmas celebration completely, and instead&lt;br /&gt;sit in front of your linux computer playing with the&lt;br /&gt;all-new-and-improved linux kernel version." (By Linus Torvalds)&lt;br/&gt;&lt;br/&gt;&lt;span style='font-weight: bold;'&gt;8.&lt;/span&gt; Linux hackers are funny people: They count the time in patchlevels. (Seen in the .sig of Gerd Knorr.)&lt;br/&gt;&lt;br/&gt;&lt;span style='font-weight: bold;'&gt;7.&lt;/span&gt; Linux: the choice of a GNU generation&lt;br/&gt;  -- ksh@cis.ufl.edu put this on Tshirts in '93\&lt;br/&gt;&lt;br/&gt;&lt;span style='font-weight: bold;'&gt;6.&lt;/span&gt; "Not me, guy. I read the Bash man page each day like a Jehovah's Witness reads&lt;br/&gt;the Bible. No wait, the Bash man page IS the bible. Excuse me..."&lt;br/&gt;(More on confusing aliases, taken from comp.os.linux.misc)&lt;br/&gt;&lt;br/&gt;&lt;span style='font-weight: bold;'&gt;5.&lt;/span&gt; What's this script do?&lt;br/&gt;  unzip ; touch ; finger ; mount ; gasp ; yes ; umount ; sleep&lt;br/&gt;Hint for the answer: not everything is computer-oriented. Sometimes you're&lt;br/&gt;in a sleeping bag, camping out with your girlfriend.&lt;br/&gt;(Contributed by Frans van der Zande.)&lt;br/&gt;&lt;br/&gt;&lt;span style='font-weight: bold;'&gt;4.&lt;/span&gt; I'm an idiot.. At least this [bug] took about 5 minutes to find..&lt;br/&gt;Surely, Linus is talking about the kind of idiocy that others aspire to :-).&lt;br/&gt;(Bruce Perens in response to Linus Torvalds's mailing about a kernel bug.)&lt;br/&gt;&lt;br/&gt;&lt;span style='font-weight: bold;'&gt;3.&lt;/span&gt; One OS to rule them all,&lt;br/&gt;One OS to find them.&lt;br/&gt;One OS to call them all,&lt;br/&gt;And in salvation bind them.&lt;br/&gt;In the bright land of Linux,&lt;br/&gt;Where the hackers play.&lt;br/&gt;(J. Scott Thayer, with apologies to J.R.R.T.)&lt;br/&gt;&lt;br/&gt;&lt;span style='font-weight: bold;'&gt;2.&lt;/span&gt; ...the Linux philosophy is "laugh in the face of danger". Oops. Wrong one. "Do it yourself". That's it. (by Linus)&lt;br/&gt;&lt;br/&gt;&lt;span style='font-weight: bold;'&gt;1. &lt;/span&gt;We are using Linux daily to UP our productivity - so UP yours!&lt;br/&gt;  -- Adapted from Pat Paulsen by Joe Sloan&lt;br/&gt;&lt;br/&gt;-&lt;span style='font-weight: bold; font-size: 85%;'&gt;END&lt;/span&gt;-&lt;br/&gt;&lt;/small&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;p class='poweredbyperformancing'&gt;Powered by &lt;a href='http://scribefire.com/'&gt;ScribeFire&lt;/a&gt;.&lt;/p&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2589537411099484208-9096138821067845740?l=dontburnmybeans.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dontburnmybeans.blogspot.com/feeds/9096138821067845740/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2589537411099484208&amp;postID=9096138821067845740' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2589537411099484208/posts/default/9096138821067845740'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2589537411099484208/posts/default/9096138821067845740'/><link rel='alternate' type='text/html' href='http://dontburnmybeans.blogspot.com/2008/01/top-50-linux-quotes-of-all-time.html' title='Top 50 Linux Quotes of All Time'/><author><name>Jamtech</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/-RNwpfmrDdPU/Tn1tpZWh2zI/AAAAAAAAAHg/ICZaej4kWOk/s220/hitmana3_2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_UqUwVPikChs/R4zFzxv4YVI/AAAAAAAAB9I/yt3vpJ_kjis/s72-Rc/monkey78.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2589537411099484208.post-5806849643088309541</id><published>2007-10-22T22:06:00.000-07:00</published><updated>2007-10-22T22:12:50.924-07:00</updated><title type='text'>Linux for Business From www.virtualhosting.com</title><content type='html'>&lt;h2 class="article_title"&gt;&lt;a href="http://www.virtualhosting.com/blog/2007/linux-for-business-50-apps-to-get-your-office-on-open-source/" rel="bookmark" title="Permanent Link: Linux for Business: 50 Apps to Get your Office on Open Source"&gt;Linux for Business: 50 Apps to Get your Office on Open Source&lt;/a&gt;&lt;/h2&gt;                                                      &lt;div class="entry"&gt;                                     &lt;p&gt;&lt;strong&gt;By Christina Laun&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;Open source software has a lot to offer the business world. Aside from the fact that they’re generally free, many open source programs are more secure, reliable and customizable than their proprietary counterparts. In fact, many large companies, including big names like Amazon, Google, and Yahoo, run their servers with Linux rather than Windows. Open source software is often some of the best software for the job, even when cost is no consideration. So how can you make open source software work for your business? Here are 50 apps that can help your office get on track to join the growing numbers of businesses that have made the switch to open source.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Desktop and Server Distributions&lt;/strong&gt;&lt;/p&gt; &lt;ol&gt;&lt;li&gt;&lt;strong&gt;&lt;a href="http://www.ubuntu.com/"&gt;Ubuntu&lt;/a&gt; &lt;/strong&gt;Ubuntu is a free, Linux-based operating system that can be used for both desktop systems and servers. It contains everything you need for the office, including a web browser, software for presentation, document and spreadsheets, as well as instant messaging. It has regular updates, new releases, and a reputation for being user friendly and easy to install.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;a href="http://www.linspire.com/"&gt;Linspire&lt;/a&gt; &lt;/strong&gt;Unlike Ubuntu, Linspire is not free, but that doesn’t mean you shouldn’t check it out as an option for desktop systems. Linspire focuses on making open source software easy to use for even the technically un-savvy with its Click’n'Run software. It comes complete with applications for multimedia, office productivity, browsers and instant messaging.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;a href="http://fedoraproject.org/"&gt;Fedora&lt;/a&gt; &lt;/strong&gt;Fedora is another free Linux-based OS, though it’s not designed with the novice user in mind, and accordingly, is better suited to current Linux users that want to stay on the cutting edge. The system comes with OpenOffice, Firefox, Thunderbird and a number of other open source applications pre-loaded, giving you access to just about anything you need to get work done.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;a href="http://www.opensuse.org/"&gt;SUSE Linux&lt;/a&gt; &lt;/strong&gt;Suse Linux is enterprise-focused software created and sponsored by Novell. It is designed to be especially stable and reliable as well as meet the special needs of business owners. It comes in both desktop and server versions, which come complete with office suites, desktop search, and virus protection. While not free, it does have the benefit of a dedicated support team if you ever have any problems.&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.debian.org/"&gt;&lt;strong&gt;Debian&lt;/strong&gt;&lt;/a&gt; Debian is a free Linux-based OS known for its abundance of software options. There are currently almost 18,000 software packages for eleven different computer architectures, making it highly versatile and customizable to your needs. Software available for the OS includes everything from standard web browsers to language interpreters and tools for scientific work.&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.redhat.com/"&gt;&lt;strong&gt;RedHat&lt;/strong&gt;&lt;/a&gt; Redhat offers some of the most popular enterprise Linux software. Available for both servers and desktops, the software offers a comprehensive suite of productivity software as well as easy-to-use and reliable options for managing multiple servers and mainframes for a price considerably lower than that of proprietary software.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;a href="http://www.gnome.org/"&gt;GNOME&lt;/a&gt; &lt;/strong&gt;GNOME is another free Linux-based desktop environment. Business owners can benefit not only from its cost, but also from its dedication to accessibility for the disabled, large amount of available software, and extensive development platform for building new applications.&lt;/li&gt;&lt;/ol&gt; &lt;p&gt;&lt;strong&gt;Email and Instant Messaging&lt;/strong&gt;&lt;/p&gt; &lt;ol start="8"&gt;&lt;li&gt;&lt;a href="http://www.gnome.org/projects/evolution"&gt;&lt;strong&gt;Evolution&lt;/strong&gt;&lt;/a&gt; Evolution, designed as an open source alternative to Microsoft Outlook, gives users integrated email, an address book, and calendar functionality, among many other features.&lt;/li&gt;&lt;li&gt;&lt;a href="http://kontact.kde.org/"&gt;&lt;strong&gt;KDE Kontact&lt;/strong&gt;&lt;/a&gt; KDE Kontact is another freeware alternative to using Outlook. KDE Kontact provides many of the same features, plus some additional ones, which include email management, groupware, calendar and organization tools, sticky notes and even Google synchronization.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;a href="http://www.mozilla.com/en-US/thunderbird"&gt;Thunderbird&lt;/a&gt;&lt;/strong&gt; Thunderbird is Mozilla’s open source answer to a desktop email client. Thunderbird allows users to customize their inbox, easily search, and enjoy enhanced security and privacy measures that help protect your information.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;a href="http://www.jabber.org/"&gt;Jabber&lt;/a&gt; &lt;/strong&gt;Jabber is an open source instant messaging program. It has standard instant messaging chat features, but also gives users the ability to have VoIP conversations and transfer files.&lt;/li&gt;&lt;/ol&gt; &lt;p&gt;&lt;strong&gt;Productivity&lt;/strong&gt;&lt;/p&gt; &lt;ol start="12"&gt;&lt;li&gt;&lt;strong&gt;&lt;a href="http://www.gnome.org/projects/tomboy"&gt;Tomboy&lt;/a&gt; &lt;/strong&gt;Tomboy makes taking and keeping track of notes easy. Busy employees can save time looking for websites, emails, or ideas they jotted down by using Tomboy notes that are available at the push of a button anytime they’re needed.&lt;/li&gt;&lt;li&gt;&lt;a href="http://beagle-project.org/Main_Page"&gt;&lt;strong&gt;Beagle&lt;/strong&gt;&lt;/a&gt; Beagle is a desktop search application that can make it easy to find documents, emails, notes, calendar appointments, music and more. Any information that can be extracted from these and other types of data is available for you to search, making even the most disorganized desktop easy to manage.&lt;/li&gt;&lt;li&gt;&lt;a href="http://f-spot.org/Main_Page"&gt;&lt;strong&gt;F-Spot&lt;/strong&gt;&lt;/a&gt; F-Spot can help you easily sort and manage your photos. It even comes complete with a basic photo editing system. Whether you’re using photos for design or just in your personal time, F-Spot can be a valuable tool for keeping track of your images.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;a href="http://live.gnome.org/Planner"&gt;Planner&lt;/a&gt; &lt;/strong&gt; Planner is a great free open source tool for project management. Businesses can set up projects and use the program to track, monitor, plan, schedule, and even assign tasks to individual employees, making working together and managing a project easier than ever.&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.ifolder.com/index.php/Main_Page"&gt;&lt;strong&gt; iFolder&lt;/strong&gt;&lt;/a&gt;iFolder is also a valuable tool for those who need to work together on a project. Users simply save files to their system as they normally would, and iFolder enables them to be shared on any computer within your office by putting them on your network server. It can also be a great way to back up important information and documents.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;a href="http://k3b.plainblack.com/"&gt;K3B&lt;/a&gt; &lt;/strong&gt; K3B provides businesses with an easy and free way to burn CDs and DVDs. The program allows users to compile data, music, video, and mixed media CDs, as well as the ability to create DVD projects. It’s a great way to quickly share and backup information.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;a href="http://www.rdesktop.org/"&gt;RDesktop&lt;/a&gt; &lt;/strong&gt; RDesktop is a remote desktop client. It can make it easy to share information remotely, or to access your own workstation away from the office. It can also be used to help interface Linux with desktops that are still running Windows.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;a href="http://ekiga.org/"&gt;Ekiga&lt;/a&gt; &lt;/strong&gt;Ekiga, formerly known as GNOMEMeeting, is VoIP and videoconferencing software. It has numerous features and can be a practical way to meet with clients when you can’t meet face-to-face.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;a href="http://www.openoffice.org/"&gt;OpenOffice&lt;/a&gt;&lt;/strong&gt; OpenOffice is the virtual holy grail of free business software. OpenOffice comes complete with everything you’ll need to do including word processing, spreadsheets, presentation, databases, vector drawing, and even edit mathematical formulas.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;a href="http://www.horde.org/projects.php"&gt;Horde&lt;/a&gt;&lt;/strong&gt; Horde isn’t just one program, but a framework upon which a number of programs are built. This framework supports a number of applications that can be useful to businesses, including webmail, file managers, calendars, and managers for bookmarks and calendars.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;a href="http://www.gnome.org/projects/evince"&gt;Evince&lt;/a&gt;&lt;/strong&gt; Acrobat Reader is a key application for any business, but the program isn’t always the best solution for reading documents. Evince provides an open source alternative, allowing users to view documents in a wide variety of formats with a much lighter and quicker program.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;a href="http://www.getautomatix.com/"&gt;Automatix&lt;/a&gt;&lt;/strong&gt; For those delaying the move to open source due to fears about the difficulty of installing new applications, Automatix may be the solution you are looking for. The program is designed to automate the installation of everything you could need, including fonts, applications, and codecs, making installation easy and painless.&lt;/li&gt;&lt;/ol&gt; &lt;p&gt;&lt;strong&gt;Imaging and Design&lt;/strong&gt;&lt;/p&gt; &lt;ol start="24"&gt;&lt;li&gt;&lt;strong&gt;&lt;a href="http://www.gimp.org/"&gt;GIMP&lt;/a&gt;&lt;/strong&gt; GIMP is image editing software and can act as a slightly less full featured alternative to Photoshop for businesses looking to save. While it lacks some of the more advanced productivity tools found in Photoshop, many if not most of the basic features are the same and it can be a great open source alternative for businesses that need image editing software without the frills or the price tag of Photoshop.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;a href="http://subversion.tigris.org/"&gt;Subversion&lt;/a&gt;&lt;/strong&gt; Subversion was designed as version control system that can act as an open source alternative to CVS, giving business owners a free program to manage servers and edit code.&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.inkscape.org/"&gt;&lt;strong&gt;Inkscape&lt;/strong&gt;&lt;/a&gt; For businesses that need an open source program for vector drawing, Inkscape can be a great choice, with capabilities that are similar to those of Illustrator or CorelDraw.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;a href="http://www.scribus.net/"&gt;Scribus&lt;/a&gt;&lt;/strong&gt; Scribus brings desktop publishing into the open source realm. Users can design and format page layouts and typesetting much in the same way as Adobe InDesign, making the creation of brochures, posters and books easy and much less costly.&lt;/li&gt;&lt;/ol&gt; &lt;p&gt;&lt;strong&gt;Content Management&lt;/strong&gt;&lt;/p&gt; &lt;ol start="28"&gt;&lt;li&gt;&lt;strong&gt;&lt;a href="http://www.joomla.org/"&gt;Joomla!&lt;/a&gt;&lt;/strong&gt; Joomla! is an open source content management program, that allows businesses to easily upload and create a variety of different types of web pages. Features include page caching, RSS feeds, news flashes, blogs, polls, and website searching, making it a valuable tool for entrepreneurs doing business on the web.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;a href="http://www.postnuke.com/"&gt;PostNuke&lt;/a&gt;&lt;/strong&gt; PostNuke is another option for businesses that want a content management system. PostNuke makes it easy to create and upload websites and can be customized by installing additional themes, modules and blocks to the existing program.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;a href="http://www.xoops.org/"&gt;Xoops&lt;/a&gt;&lt;/strong&gt; Xoops is a program that allows users to easily create web content and can be used to develop anything from large community portals to business weblogs. It has advanced features, including the ability to send email and instant messages within the program.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;a href="http://www.exponentcms.org/"&gt;Exponent&lt;/a&gt;&lt;/strong&gt; Even the less technologically inclined can make great websites using Exponent. Users don’t directly code web pages or manage site navigation, and instead create the page as they would see it on the web by typing, editing and rearranging in one simple window. It can be a better solution than more complicated programs for those who don’t know much coding but still need content management software for their business.&lt;/li&gt;&lt;li&gt;&lt;a href="http://smarty.php.net/"&gt;&lt;strong&gt;Smarty&lt;/strong&gt;&lt;/a&gt; For users that will need more in-depth web editing abilities, Smarty can help you easily manage and edit the templates for your sites. It provides tools that can help automate tasks associated with the programming of the presentation level of webpages.&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.mysql.com/"&gt;&lt;strong&gt;MySQL&lt;/strong&gt;&lt;/a&gt; The most popular open source database management program, MySQL can provide businesses with a platform to create useful web applications. It’s often used in conjunction with popular content management systems such as WordPress. MySQL can also act as the database component for &lt;a href="http://en.wikipedia.org/wiki/LAMP_%28software_bundle%29"&gt;LAMP, MAMP, and WAMP&lt;/a&gt; style platforms. The company offers a version of the software created especially for businesses.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;a href="http://www.kompozer.net/"&gt;KompoZer&lt;/a&gt;&lt;/strong&gt; KompoZer is an HTML editor based on the &lt;a href="http://www.nvu.com/"&gt;Nvu&lt;/a&gt; system that can provide web editing abilities similar to that of DreamWeaver. While aimed towards more advanced users, it can be a valuable tool when designing and publishing material for the web.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;a href="http://www.eclipse.org/"&gt;Eclipse&lt;/a&gt;&lt;/strong&gt; For those working on developing software or web apps, Eclipse is a great open source program to try out. Eclipse is a software framework written and designed primarily for Java, but plugins can be added to make the software useful to other programming languages.&lt;/li&gt;&lt;/ol&gt; &lt;p&gt;&lt;strong&gt;Web Tools &lt;/strong&gt;&lt;/p&gt; &lt;ol start="36"&gt;&lt;li&gt;&lt;strong&gt;&lt;a href="http://www.mozilla.com/firefox"&gt;Firefox&lt;/a&gt;&lt;/strong&gt; Firefox is popular even among businesses that haven’t gone completely open source because it’s packed with features and simply works well. Businesses may find Firefox’s numerous plugins and extensions useful.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;a href="http://www.zencart.com/"&gt;ZenCart&lt;/a&gt;&lt;/strong&gt; Businesses that want to sell products on the web can benefit from open source software like ZenCart. ZenCart is free software for creating an online shopping cart system. Unlike many shopping cart applications, ZenCart is easy to install and use, making life easier for both customers and merchants.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;a href="http://www.php-collab.com/blog"&gt;phpCollab&lt;/a&gt;&lt;/strong&gt; For businesses that need to work and collaborate on projects over the internet, phpCollab is a possible solution. This fully featured program comes with tools to create team or client sites, assign tasks, keep track of workflow, discuss projects, create invoices, and send out notifications.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;a href="http://www.openads.org/"&gt;OpenAds&lt;/a&gt;&lt;/strong&gt; OpenAds is used by millions of business and personal websites to sell, manage and serve ads. The interface doesn’t require any advanced knowledge of coding and can help you easily and simply create and sell advertising for your business.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;a href="http://www.skype.com/download/skype/linux"&gt;Skype&lt;/a&gt;&lt;/strong&gt; For businesses that make a lot of international and long distance calls, Skype can be a valuable and money-saving tool. It allows users to make calls through the Internet using peer-to-peer technology. The program is free and provides international calls at a greatly discounted rate. The program can also be used to set up a call center for customer support complete with links that can easily be placed on a business website.&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.butterfat.net/wiki/Projects/phpESP"&gt;&lt;strong&gt;phpESP&lt;/strong&gt;&lt;/a&gt; phpESP is a great tool for non-technical users of php-based web applications to administer surveys, gather the results from them, and easily view the statistics. Businesses can use it as a tool to monitor customer service experiences, or gather input and advice on how to make their products and services better.&lt;/li&gt;&lt;/ol&gt; &lt;p&gt;&lt;strong&gt;Network and Server Management&lt;/strong&gt;&lt;/p&gt; &lt;ol start="42"&gt;&lt;li&gt;&lt;strong&gt;&lt;a href="http://www.asterisk.org/"&gt;Asterisk&lt;/a&gt;&lt;/strong&gt; Asterisk is &lt;a href="http://en.wikipedia.org/wiki/Pbx"&gt;PBX&lt;/a&gt; (Private Branch eXchange) software that can allow you to easily and cheaply control the telephone system in your office. Asterisk works with both &lt;a href="http://en.wikipedia.org/wiki/Voip"&gt;VoIP&lt;/a&gt; telephony as well as old-fashioned telephone systems with the addition of some inexpensive hardware. It even comes complete with features usually only found in high end and high price PBX systems.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;a href="http://www.zabbix.com/"&gt;Zabbix&lt;/a&gt;&lt;/strong&gt; Zabbix is designed to allow users to easily monitor and track the status of network services, servers, and other network based hardware. Businesses looking for a way to track and report status on network systems will find Zabbix’s easy-to-use mapping and graphing visualizations very useful.&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.apache.org/"&gt;&lt;strong&gt;Apache&lt;/strong&gt;&lt;/a&gt; Apache provides some of the most widely used and stable HTTP servers available, open source or otherwise. Apache supports a variety of features including virtual hosting, &lt;a href="http://en.wikipedia.org/wiki/Secure_Sockets_Layer"&gt;SSL and TSL&lt;/a&gt; support, custom log files, and a proxy module, among many others. It can be used as a secure server for web pages or as a way to safely share files over the Internet.&lt;/li&gt;&lt;/ol&gt; &lt;p&gt;&lt;strong&gt;Finances&lt;/strong&gt;&lt;/p&gt; &lt;ol start="45"&gt;&lt;li&gt;&lt;strong&gt;&lt;a href="http://www.gnucash.org/"&gt;GnuCash&lt;/a&gt;&lt;/strong&gt; GnuCash can make keeping track of business finances easy and less costly. This free program allows users to track bank accounts, stocks, income and expenses with features to create reports, do financial calculations, and schedule transactions.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;a href="http://www.uversainc.com/products/sureinvoice"&gt;SureInvoice&lt;/a&gt;&lt;/strong&gt; SureInvoice provides an easy system for creating and managing invoices. Businesses will find it useful in time entry, automated invoice generation, and customer self-service, as well as many other areas, helping them make sure they are paid fairly and on time for work.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;a href="http://sourceforge.net/projects/ezybiz"&gt;EzyBiz&lt;/a&gt;&lt;/strong&gt; EzyBiz is business sales chain management software for small to medium size businesses. It is highly customizable and allows businesses to track finances, including taxes with easy-to-use custom forms and magic menus.&lt;/li&gt;&lt;/ol&gt; &lt;p&gt;&lt;strong&gt;Security and Tracking&lt;/strong&gt;&lt;/p&gt; &lt;ol start="48"&gt;&lt;li&gt;&lt;strong&gt;&lt;a href="http://www.mantisbt.org/"&gt;Mantis&lt;/a&gt;&lt;/strong&gt; Mantis is a popular bug tracking application that works in conjunction with the MySQL database system. It has a simple interface that allows users to monitor and track any issues with a color coded issue list, providing all the information needed to address and resolve an issue.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;a href="http://www.snort.org/"&gt;Snort&lt;/a&gt;&lt;/strong&gt; Protecting computer systems is incredibly important, especially for businesses. Snort can be a valuable part of securing your systems. The program acts as a network intrusion detector and prevention system, helping you detect and deter a wide variety of network probes and attacks.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;a href="http://www.fs-security.com/"&gt;Firestarter&lt;/a&gt;&lt;/strong&gt; When sensitive client and business information hangs in the balance, security is of the utmost importance. Businesses can make use of Firestarter to help protect their information and safeguard their data. Firestarter is a firewall application with features including real-time monitoring, whitelists and blacklists, and controlled access policies.&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2589537411099484208-5806849643088309541?l=dontburnmybeans.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dontburnmybeans.blogspot.com/feeds/5806849643088309541/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2589537411099484208&amp;postID=5806849643088309541' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2589537411099484208/posts/default/5806849643088309541'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2589537411099484208/posts/default/5806849643088309541'/><link rel='alternate' type='text/html' href='http://dontburnmybeans.blogspot.com/2007/10/linux-for-business-from.html' title='Linux for Business From www.virtualhosting.com'/><author><name>Jamtech</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/-RNwpfmrDdPU/Tn1tpZWh2zI/AAAAAAAAAHg/ICZaej4kWOk/s220/hitmana3_2.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2589537411099484208.post-829216723686759285</id><published>2007-10-22T21:32:00.000-07:00</published><updated>2007-10-22T21:32:01.670-07:00</updated><title type='text'>When work becomes a game From The BBC NEWS (Technology)</title><content type='html'>&lt;a href="http://news.bbc.co.uk/2/hi/technology/7030234.stm"&gt;&lt;span style="font-size:85%;"&gt;&lt;b&gt;Video games are big business and soon they could be big in business too.&lt;/b&gt; &lt;/span&gt;&lt;/a&gt;&lt;p&gt; &lt;b&gt;Video games are big&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size:85%;"&gt;A whole generation is growing up for whom video games are a key part of how they relax, whether it be fragging friends in a first person shooter or backing up the main tank in a Warcraft raid.&lt;/span&gt;&lt;/p&gt;&lt;table align="right" border="0" cellpadding="0" cellspacing="0" width="203"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;div&gt;     &lt;img src="http://newsimg.bbc.co.uk/media/images/44186000/jpg/_44186399_gamework-ap203.jpg" alt="Young men playing games, AP" border="0" height="152" hspace="0" vspace="0" width="203" /&gt;     &lt;div class="cap"&gt;A generation is growing up playing immersive online games&lt;/div&gt;    &lt;/div&gt;    &lt;/td&gt;&lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;         &lt;!-- E IIMA --&gt;&lt;span style="font-size:85%;"&gt;And it is not just youngsters. There are plenty of older folks who shake off the dust of the working day in many different virtual worlds. &lt;/span&gt;&lt;p&gt; &lt;span style="font-size:85%;"&gt;Statistics from the the US Entertainment Software Association (ESA) back this up. It claims that the average player is 33 and has more than a decade of gaming under their belt. &lt;/span&gt;&lt;/p&gt;&lt;p&gt; &lt;span style="font-size:85%;"&gt;All of a sudden, say academics and researchers, companies have realized that all the time employees spend gaming in virtual worlds is changing them. &lt;/span&gt;&lt;/p&gt;&lt;p&gt; &lt;span style="font-size:85%;"&gt;Ian Hughes, IBM's metaverse evangelist, said many organizations were considering ways of harnessing the skills and familiarity their employees have with virtual environments. &lt;/span&gt;&lt;/p&gt;&lt;p&gt; &lt;span style="font-size:85%;"&gt;This familiarity has driven many organisations to consider virtual worlds as places where employees can meet,&lt;br /&gt;mix and get on with the job. &lt;/span&gt;&lt;/p&gt;&lt;p&gt; &lt;span style="font-size:85%;"&gt;"A lot of people are more accepting of that way of working just because of games," he said.  &lt;/span&gt;&lt;/p&gt;&lt;p&gt; &lt;span style="font-size:85%;"&gt;"It's about harnessing that ability to play to get work done." &lt;/span&gt;&lt;/p&gt;&lt;p&gt; &lt;span style="font-size:85%;"&gt;The formidable organizational skills needed to run a game team or guild, organize raids involving perhaps 40 people and co-ordinate their different abilities to defeat a game's strongest foes are all relevant to work, said Mr Hughes. &lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size:85%;"&gt;&lt;b&gt;Game gear&lt;/b&gt; &lt;/span&gt;&lt;/p&gt;&lt;p&gt; &lt;span style="font-size:85%;"&gt;But it is not just the skills that gamers hone in futuristic or fantasy worlds that businesses want to co-opt. Some are taking their inspiration directly from the way that online games are structured. &lt;/span&gt;&lt;/p&gt;&lt;p&gt; &lt;!-- S IIMA --&gt; &lt;span style="font-size:85%;"&gt;    &lt;table align="right" border="0" cellpadding="0" cellspacing="0" width="203"&gt;    &lt;tbody&gt;&lt;tr&gt;&lt;td&gt;    &lt;div&gt;     &lt;img src="http://newsimg.bbc.co.uk/media/images/44186000/jpg/_44186398_gamework-blizzard203.jpg" alt="Screenshot from World of Warcraft, Blizzard" border="0" height="152" hspace="0" vspace="0" width="203" /&gt;     &lt;div class="cap"&gt;Skills learned on raids in games could apply to work too&lt;/div&gt;    &lt;/div&gt;    &lt;/td&gt;&lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;         &lt;!-- E IIMA --&gt;Dr Byron Reeves, a professor of education at Stanford University, said some firms were taking elements from games to overcome the difficulties of working life in the 21st Century. &lt;/span&gt;&lt;/p&gt;&lt;p&gt; &lt;span style="font-size:85%;"&gt;"The problems associated with distributed teams, collaboration and information overload right now are so severe, and the opportunities so good, that they are willing to look at anything," he said. &lt;/span&gt;&lt;/p&gt;&lt;p&gt; &lt;span style="font-size:85%;"&gt;Dr Reeves has founded a company called Seriosity that applies game elements to workplaces.  &lt;/span&gt;&lt;/p&gt;&lt;p&gt; &lt;span style="font-size:85%;"&gt;It was working with five or six unnamed Fortune 500 companies to harness the efficiencies of those game mechanics, said Dr Reeve. &lt;/span&gt;&lt;/p&gt;&lt;p&gt; &lt;span style="font-size:85%;"&gt;One of the programs developed by Seriosity adds a virtual currency element to e-mail in a bid to help people cope with information overload. &lt;/span&gt;&lt;/p&gt;&lt;p&gt; &lt;span style="font-size:85%;"&gt;Anyone sending a message adds some of their limited supply of virtual coins, called Serios, to show how important they consider that e-mail to be. &lt;/span&gt;&lt;/p&gt;&lt;p&gt; &lt;span style="font-size:85%;"&gt;It was a more finely grained grading system than the low, medium or high importance flags found in most e-mail programs, said Dr Reeves. &lt;/span&gt;&lt;/p&gt;&lt;p&gt; &lt;span style="font-size:85%;"&gt;It had other benefits too, he said. It revealed not just the flow of messages but also started to show who people pay attention to and who did a good job of getting responses. &lt;/span&gt;&lt;/p&gt;&lt;p&gt; &lt;span style="font-size:85%;"&gt;Some companies were starting to adopt even more of the elements familiar from games. &lt;/span&gt;&lt;/p&gt;&lt;p&gt; &lt;span style="font-size:85%;"&gt;"There are people right now trying to map it one-to-one," said Dr Reeves.  &lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size:85%;"&gt;&lt;b&gt;Level playing field&lt;/b&gt; &lt;/span&gt;&lt;/p&gt;&lt;p&gt; &lt;span style="font-size:85%;"&gt;Convinced that games can help them thrive some companies have turned work groups into guilds, rewarded staff with experience points when they complete tasks, giving out titles and badges when a guild finished a project and portraying objectives as quests. &lt;/span&gt;&lt;/p&gt;&lt;p&gt; &lt;!-- S IIMA --&gt; &lt;span style="font-size:85%;"&gt;    &lt;table align="right" border="0" cellpadding="0" cellspacing="0" width="203"&gt;    &lt;tbody&gt;&lt;tr&gt;&lt;td&gt;    &lt;div&gt;     &lt;img src="http://newsimg.bbc.co.uk/media/images/44186000/jpg/_44186401_workgame-ap203.jpg" alt="Screenshot from Second Life, AP" border="0" height="152" hspace="0" vspace="0" width="203" /&gt;     &lt;div class="cap"&gt;Virtual worlds could become key to future business life&lt;/div&gt;    &lt;/div&gt;    &lt;/td&gt;&lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;         &lt;!-- E IIMA --&gt;Some were also considering using a virtual currency as a reward system allowing workers to cash in their savings for benefits or extras for their office space. The top performing guilds also get to do the best projects. &lt;/span&gt;&lt;/p&gt;&lt;p&gt; &lt;span style="font-size:85%;"&gt;None, so far, he said, were tying wages to how people performed in the quests and against other guilds. &lt;/span&gt;&lt;/p&gt;&lt;p&gt; &lt;span style="font-size:85%;"&gt;"Mapping levels and points on to wages is the most extreme application," he said. &lt;/span&gt;&lt;/p&gt;&lt;p&gt; &lt;span style="font-size:85%;"&gt;Companies were adopting game mechanics for several reasons, said Dr Reeves.  &lt;/span&gt;&lt;/p&gt;&lt;p&gt; &lt;span style="font-size:85%;"&gt;Partly because workers were so familiar with this structure, he said, and because people become powerfully motivated when they know how they compare to their contemporaries. &lt;/span&gt;&lt;/p&gt;&lt;p&gt; &lt;span style="font-size:85%;"&gt;The main reason was for the transparency it gave to the way workplaces were organized and for revealing who got things done. &lt;/span&gt;&lt;/p&gt;&lt;p&gt; &lt;span style="font-size:85%;"&gt;"It exposes those that do and do not play well," said Dr Reeves. "There is a leader board and you know the rules." &lt;/span&gt;&lt;/p&gt;&lt;p&gt; &lt;span style="font-size:85%;"&gt;It had the potential to turn workplaces into meritocracies where the most accomplished are easy to spot because they have racked up all rewards, achievements and levels required for a particular post. &lt;/span&gt;&lt;/p&gt;&lt;p&gt; &lt;span style="font-size:85%;"&gt;While it may not sweep away systems of privilege or end nepotism it had the potential to make workplaces fairer and take some of the grind out of the day job, he said. &lt;/span&gt;&lt;/p&gt;&lt;p&gt; &lt;span style="font-size:85%;"&gt;"The whole idea here is to get the objectives of the individual players aligned with the objectives of the organization," said Dr Reeves. "Do that and you have something good." &lt;/span&gt;&lt;/p&gt;&lt;p&gt; &lt;span style="font-size:85%;"&gt;Angela Barron, an advisor at the Chartered Institute of Personnel and Development, said games had long been used in training to expose personal preferences and prejudices. &lt;/span&gt;&lt;/p&gt;&lt;p&gt; &lt;span style="font-size:85%;"&gt;Many organizations also used courses that revolve around games to help make teams work together better or expose power structures among workers. &lt;/span&gt;&lt;/p&gt;&lt;p&gt; &lt;span style="font-size:85%;"&gt;She said this was the first time she had heard of elements of online games being used in a similar way.  &lt;/span&gt;&lt;/p&gt;&lt;p&gt; &lt;span style="font-size:85%;"&gt;"I would not have thought enough people play games for it to be a great motivator," she said.  &lt;/span&gt;&lt;/p&gt;&lt;p&gt; &lt;span style="font-size:85%;"&gt;But, she said, anything that helped staff develop a better working relationship and promote team work was likely to be a good thing. &lt;/span&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2589537411099484208-829216723686759285?l=dontburnmybeans.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://news.bbc.co.uk/2/hi/technology/7030234.stm' title='When work becomes a game From The BBC NEWS (Technology)'/><link rel='replies' type='application/atom+xml' href='http://dontburnmybeans.blogspot.com/feeds/829216723686759285/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2589537411099484208&amp;postID=829216723686759285' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2589537411099484208/posts/default/829216723686759285'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2589537411099484208/posts/default/829216723686759285'/><link rel='alternate' type='text/html' href='http://dontburnmybeans.blogspot.com/2007/10/when-work-becomes-game-from-bbc-news.html' title='When work becomes a game From The BBC NEWS (Technology)'/><author><name>Jamtech</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/-RNwpfmrDdPU/Tn1tpZWh2zI/AAAAAAAAAHg/ICZaej4kWOk/s220/hitmana3_2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2589537411099484208.post-6446289556651669510</id><published>2007-10-22T20:33:00.000-07:00</published><updated>2007-10-22T20:38:43.995-07:00</updated><title type='text'>Thinking of Using Linux? Linux and Open Source Blog</title><content type='html'>Thinking of Using Linux?&lt;br /&gt;&lt;br /&gt;This Article brought to you by http://linux.wordpress.com/&lt;br /&gt;&lt;br /&gt;    &lt;div class="storycontent"&gt;   &lt;div class="snap_preview"&gt;&lt;p&gt;&lt;img src="http://linux.files.wordpress.com/2006/11/linux-logo.thumbnail.gif" alt="TUX Logo" align="left" /&gt;&lt;span&gt;You have probably heard about this thing called Linux. Everybody seems to be arguing over it. Is it better than Windows or faster or cheaper. Some say it doesn’t support anything while others say it supports more than windows. Your curiosity is aroused and you wonder if you should give linux a try before parting with a few hundred dollars for the latest version of windows.&lt;/span&gt;&lt;/p&gt; &lt;p&gt;For a start you need to have an open mind. Linux is similar in operation to windows but it is not windows. There are differences. Sometimes significant ones. Programs will have different names and will appear different. You will definitely have some learning ahead of you. However that learning will not be much different than going from windows XP to windows Vista. The most important thing is to expect things to be different and until you get used to where everything is you will have to do a bit of searching.&lt;/p&gt; &lt;p&gt;I&lt;span&gt;nstallation of modern linux distributions is very simple now and in some cases even simpler and faster than installing windows. There are very few questions asked and in almost all cases the default answers are the right ones so the familiar next,next,next routine of installing programs will feel right at home.&lt;/span&gt;&lt;/p&gt; &lt;p&gt;Once your new linux is installed you will be presented with a different looking desktop to what you will be used to. That’s normal because it is a completely different operating system. Before throwing up your hands in confusion and exasperation take a minute or two to have a close look at what you see.&lt;/p&gt; &lt;p&gt;&lt;span&gt;You will see going across the bottom of the desktop a bar similar but not quite like the windows task bar. In fact it does the exact same thing. Right where you expect the windows start button to be you will see a button that when clicked on opens up a menu exactly the same way windows does. That button may have a picture of a gear on it or it may be something else.&lt;/span&gt;&lt;/p&gt; &lt;p&gt;On that menu, just like windows, you will see several choices. Much more than a fresh install of windows will offer. That is because a freshly installed Linux gives you all the programs you need to do 90% of your daily tasks without having to install anything else. You will have your internet, email, word processing, spreadsheet, presentation, music player, instant messaging, scanning and photograph editor and of course the requisite card games. These are all ready to use as soon as you have finished installing linux.&lt;/p&gt; &lt;p&gt;A&lt;span&gt;ll of these programs look and operate very similar to their windows counterparts so after a bit of playing around they will feel right at home. Until you get used to your new linux system just about all of the linux distributions will have a forum or mailing list that are populated by people from all over the world who are willing and even eager to help you on your path of learning. In fact most, if not all questions you will have will have already been answered in a document called a FAQ which is short for frequently answered questions. It is highly suggested the this document is read at least once.&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;img src="http://linux.files.wordpress.com/2006/04/logomed.128.png" alt="Linux Logo Medium" align="right" /&gt;&lt;span&gt;Now that you are more familiar with your linux system and the time comes that you want to install some other programs. In the windows world that generally means buying a program from a supplier and then manually installing it. With linux you have access to tens of thousands of programs, for free, that can be installed with a few mouse clicks. This is possible because every good distribution has a packet manager which connects to a repository of programs and presents you with a list that can be categorised and searched. All you need to do is select the programs you want to install, click on install and the linux system does the rest. Once the program is finished installing it is ready to use.&lt;/span&gt;&lt;/p&gt; &lt;p&gt;Maintenance of a linux system is very easy too. With a good linux distribution all configuration that you need to worry about is presented in a very similar way to the windows control panel and you can easily adjust to the slightly different syntax. Upgrading and security patches are also handled automatically and in a linux system all installed programs from the packet manager are upgraded and patched by the distribution. You don’t need to have to manually monitor third party programs like with windows.&lt;/p&gt; &lt;p&gt;So when you decide to give Linux a try you will find that you will have an interesting time ahead of you. You will be confused sometimes, you will be frustrated sometimes. Sometimes you will feel like shooting your computer but then you have probably had those same feelings with windows. I can guarantee that your journey with linux will never be boring and you will learn a lot along the way.&lt;/p&gt; &lt;p align="right"&gt;&lt;em&gt;- Locutus&lt;/em&gt;&lt;/p&gt; &lt;/div&gt; &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2589537411099484208-6446289556651669510?l=dontburnmybeans.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dontburnmybeans.blogspot.com/feeds/6446289556651669510/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2589537411099484208&amp;postID=6446289556651669510' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2589537411099484208/posts/default/6446289556651669510'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2589537411099484208/posts/default/6446289556651669510'/><link rel='alternate' type='text/html' href='http://dontburnmybeans.blogspot.com/2007/10/4a-thinking-of-using-linux-linux-and.html' title='Thinking of Using Linux? Linux and Open Source Blog'/><author><name>Jamtech</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/-RNwpfmrDdPU/Tn1tpZWh2zI/AAAAAAAAAHg/ICZaej4kWOk/s220/hitmana3_2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2589537411099484208.post-1538401422278725080</id><published>2007-10-01T23:09:00.000-07:00</published><updated>2008-06-17T22:52:58.733-07:00</updated><title type='text'>The Coffee Shop Review</title><content type='html'>&lt;a href="http://dontburnmybeans.blogspot.com/"&gt;The Coffee Shop Review&lt;/a&gt;: "Please Don't Burn My Beans"&lt;br /&gt;&lt;br /&gt;I have decided to give this Blog thing a try. As I travel the world of the World wide web stopping off at various coffee shops sampling the fine flavors that they offer. &lt;br /&gt;&lt;br /&gt;I will post my findings on topics that I like and dislike. &lt;br /&gt;&lt;br /&gt;Best of all you will see my Day to day functions as an IT Manager for a well known company in the field of education.&lt;br /&gt;&lt;br /&gt;My main goal for this site is to blog about the Coffee shops that I visit since most of my job details 100% travel and a good cup of joe helps when you step off a red eye flight from Phoenix to New York. &lt;br /&gt;&lt;br /&gt;Please feel free to give your review on your best or worst coffee shop near you. If you can post photos as well.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2589537411099484208-1538401422278725080?l=dontburnmybeans.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dontburnmybeans.blogspot.com/feeds/1538401422278725080/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2589537411099484208&amp;postID=1538401422278725080' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2589537411099484208/posts/default/1538401422278725080'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2589537411099484208/posts/default/1538401422278725080'/><link rel='alternate' type='text/html' href='http://dontburnmybeans.blogspot.com/2007/10/coffee-shop-review.html' title='The Coffee Shop Review'/><author><name>Jamtech</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/-RNwpfmrDdPU/Tn1tpZWh2zI/AAAAAAAAAHg/ICZaej4kWOk/s220/hitmana3_2.jpg'/></author><thr:total>0</thr:total></entry></feed>
