<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>TangoRangers.com&#039;s Blog</title>
	<atom:link href="http://blog.tangorangers.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.tangorangers.com</link>
	<description>Misc crap and such</description>
	<lastBuildDate>Wed, 18 Jan 2012 02:26:16 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>How To Update a Live Website via SVN</title>
		<link>http://blog.tangorangers.com/2012/01/how-to-update-a-live-website-via-svn/</link>
		<comments>http://blog.tangorangers.com/2012/01/how-to-update-a-live-website-via-svn/#comments</comments>
		<pubDate>Wed, 18 Jan 2012 02:26:16 +0000</pubDate>
		<dc:creator>DaijoubuKun</dc:creator>
				<category><![CDATA[coding]]></category>
		<category><![CDATA[good to know]]></category>

		<guid isPermaLink="false">http://blog.tangorangers.com/?p=372</guid>
		<description><![CDATA[Do you want to use SVN to update your website? This guide will help you and includes information not found anywhere else on how to get it working. Many websites give basic information and comments complain about it not working. If those other website didn&#8217;t work for you. This will. After digging around for hours [...]]]></description>
			<content:encoded><![CDATA[<p>Do you want to use SVN to update your website? This guide will help you and includes information not found anywhere else on how to get it working. Many websites give basic information and comments complain about it not working. If those other website didn&#8217;t work for you. This will.</p>
<p>After digging around for hours and seeing everyone complain about having the same problems after being told the same solutions, I decided to figure it out for myself. If you read this carefully you too will have a website setup that can be updated via subversion.</p>
<h3><font color='black'>Getting Started</font></h3>
<p>I&#8217;m going to assume that your SVN server and website are on the same machine and that you are using Apache to serve both. I&#8217;m also going to assume that you are somewhat familiar with SVN and Apache. I&#8217;m not going to go into much detail on how to get everything setup from scratch.</p>
<p>The tools you will need to have installed are as follows (may need more depending on your configuration). Apache HTTPd, Subversion, and gcc.</p>
<p>Many Linux users and distributions use sudo. I do not, and I will not provide information on how to use sudo. My recommendation, before doing anything, is to type <b>sudo su</b> which will make you root. Do everything from there so you don&#8217;t have to sudo anymore.</p>
<h3><font color='black'>Setup a new SVN repository</font></h3>
<p>Alright, now we are going to setup the new SVN repository. This can be done easily with:</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">svnadmin create &lt;path to repository&gt;</pre></div></div>

<p>Place it in a good location that you will remember since you need to point Apache to it. In my examples we are going to use <b>/home/www/domain/svn/website/</b> for our project location and <b>/home/www/domain/htdocs/</b> for our website.</p>
<p>For user access controls I use a 2 part process. I have an authz and passwd file in the root of my SVN directory (/home/www/domain/svn/). The reason I do this is because I host several SVN projects and I don&#8217;t want everyone to have access to everything. This way I can also setup (this comes later) Apache to have read-only access to the repository.</p>
<p>First, we need to create our authz and passwd files. Lets call them svn.authz and svn.passwd so we know what they are for.</p>
<p>In the svn.authz file we need something like this:</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">[groups]
project = dkun
other1 = dkun, someguy
website = dkun, friend1
readonly = redmine,apache
&nbsp;
[project:/]
@project = rw
@readonly = r
* =
&nbsp;
[other1:/]
@other1 = rw
* =
&nbsp;
[website:/]
@website = rw
@readonly = r
* =</pre></div></div>

<p>Looks a bit overwhelming. Let me explain.</p>
<p>Starting from the top, we have <b>[groups]</b>. These are groups of users that we give project names to. Notice that 2 of the projects have more that one user. There is also a read-only group. You can name the groups what every you want. I do it by project name to make it easy to read.</p>
<p>After that you see <b>[project:/]</b>. This is the project group. It has one user and is set to read/write. It also has a readonly group. This way I can setup both Apache and Redmine with read only access.</p>
<p>Lastly you might have noticed <b>*=</b>. What is that? It turns off anonymous access. So unless your project has code going out to the web, make sure to put this in.</p>
<p>Now we need to setup the svn.passwd file. This is pretty easy. Just type:</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">htpasswd svn.passwd &lt;username&gt;</pre></div></div>

<p>You will be prompted for the password. That&#8217;s it! Pretty easy right? Just don&#8217;t forget to setup the user apache (keep it lower case, trust me), and any others you might need.</p>
<h3><font color='black'>Setup Apache</font></h3>
<p>Now that we have SVN and out new project setup, we need to configure Apache to serve everything. Setup your <b>VirtualHost</b> to point to where you want your website to be hosted from. So for me it would be <b>/home/www/domain/htdocs/</b>. I&#8217;m going to assume you already know how to do this. All you need to add is a little directive.</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">&lt;DirectoryMatch &quot;^/.*/\.svn/&quot;&gt;
     Order deny,allow
     Deny from all
&lt;/DirectoryMatch&gt;</pre></div></div>

<p>This will stop someone from browsing your .svn folder on the website.</p>
<p>Now setup an SVN VirtualHost. This gets a bit more complicated. I&#8217;m going to avoid going into detail here. I want to assume you have some background.</p>
<p>In your Virtual host we need to set a few options and point to the SVN repository root. Here is an example of the options you need to put inside the VirtualHost section for SVN to work. Don&#8217;t forget to set other items you need!</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">&lt;Location /svn&gt;
   DAV svn
   SVNParentPath /home/www/domain/svn
   AuthType Basic
   AuthName &quot;My SVN Repository&quot;
   AuthUserFile /home/www/domain/svn/svn.passwd
   AuthzSVNAccessFile /home/www/domain/svn/svn.authz
   Require valid-user
&lt;/Location&gt;
&lt;Directory /home/www/domain/svn&gt;
   Options +Indexes FollowSymLinks +ExecCGI
   AllowOverride AuthConfig FileInfo
   Order allow,deny
   Allow from all
&lt;/Directory&gt;</pre></div></div>

<p>Note all the directories. Change them to match your server. Also, verify that your SVN modules are enabled in Apache. They should be in your apache.conf or httpd.conf (depending on your server). You will need to enable:</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">LoadModule dav_svn_module lib/httpd/modules/mod_dav_svn.so
LoadModule authz_svn_module lib/httpd/modules/mod_authz_svn.so</pre></div></div>

<p>That&#8217;s it! Now type <b>apachectl configtest</b> and you will get messages back if there is a problem in your Apache config. If it is a warning about your website directory missing, don&#8217;t worry. Just create the directory and give full ownership to the apache user (We will get back to this in a moment).</p>
<p>Before continuing, restart Apache with <b>apachectl restart</b> and make sure your SVN works! If it does not then the next section will fail.</p>
<h3><font color='black'>Do some weird stuff with Apache</font></h3>
<p>Here is where things get a little weird. This is also where 99% of people fail because there is no good information out there. I will do my best to explain what to do and why you should do it.</p>
<p>The first step is you need to find out what user and group Apache runs under. For me, both are <b>apache</b>, but for you it could use <b>www</b> or <b>www-user</b>. You can find this by checking <b>/etc/passwd</b> and <b>/etc/group</b>, or by going through your apache.conf file and look for <b>User</b> and <b>Group</b> directives.</p>
<p>Now look in /etc/passwd for the apache user. The second to last option shows Apache&#8217;s  home directory. In my case it is <b>/srv/httpd</b>. Go to that directory and type:</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">chown apache.apache ./</pre></div></div>

<p>Set the user and group to which ever Apache runs under. This will allow Apache to create new directories there without changing ownership of anything else. Also, that is just one (1) period before the slash!</p>
<p>Open /etc/passwd and find the apache user again. At the end of the line you should see something like <b>/bin/false</b>. This keeps the Apache user from logging in. This is for security reasons. We are going to temporarily change it to <b>/bin/bash</b>.</p>
<p>Now that you are already root, type:</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">su – apache</pre></div></div>

<p>Once again I assume your Apache&#8217;s user is apache. Adjust as needed.</p>
<p>Now you are logged in as the Apache user. You should see a new shell and be ready to go. Make sure you are in the <b>/var/httpd</b> directory (as stated previously as being Apache&#8217;s home directory) by typing <b>pwd</b>. If you are, then you have created a new session and are ready for the next step.</p>
<p>Navigate to the directory where the website will be served from. So if the website is in <b>/home/www/domain/htdocs/</b> then go one level up; <b>/home/www/domain/</b>. Now we are going to perform an SVN checkout and have subversion remember our credentials.</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">svn co http://&lt;domain&gt;/svn/website</pre></div></div>

<p>Adjust the http directive as needed. If you use SSL have subversion permanently accept the certificate. You should see a prompt for apache&#8217;s password. This is the password you created for it in svn.passwd. Type it in and when asked if you want to store the password, say yes!</p>
<p>If everything went as planned then you should see a successful checkout as revision 0. If not&#8230; well you did something wrong. Double check your paths, apache config files, and passwords. If needed, you may need to give ownership of the directory to Apache so that user can create a new directory and write to it.</p>
<p>Check to make sure a <b>.subversion</b> directory was created in Apache&#8217;s home directory and that there is a <b>.svn</b> folder in <b>/home/www/domain/htdocs/</b>. If now you need to give ownership of that directory to the Apache user (you will have to be root for this). If there is so .svn directory, then change ownership of the htdocs directory to Apache and run the checkout again.</p>
<p>If everything went smoothly then we are done as the Apache user. Type <b>logout</b> to return to being root.</p>
<p>Last thing. Open up <b>/etc/passwd</b> and change <b>/bin/bash</b> back to <b>/bin/false</b>. No need to have a security hole.</p>
<h3><font color='black'>Create an executable</font></h3>
<p>Now that we have SVN, Apache, and a SVN checkout setup, we can finally finish this. The first thing you need to do is find where svn is located:</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">whereis svn
svn: /usr/bin/svn /usr/man/man1/svn.1.gz /usr/share/man/man1/svn.1.gz</pre></div></div>

<p>As you can see, I used <b>whereis</b> to find the svn executable. It&#8217;s the first one, /usr/bin/svn.</p>
<p>Navigate over to the htdocs directory. Open up your favorite text editor and dump this in it:</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #339933;">#include &lt;stddef.h&gt;</span>
<span style="color: #339933;">#include &lt;stdlib.h&gt;</span>
<span style="color: #339933;">#include &lt;unistd.h&gt;</span>
<span style="color: #993333;">int</span> main<span style="color: #009900;">&#40;</span><span style="color: #993333;">void</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
   execl<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;/usr/bin/svn&quot;</span><span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;svn&quot;</span><span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;update&quot;</span><span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;/home/www/domain/htdocs/&quot;</span><span style="color: #339933;">,</span>
      <span style="color: #009900;">&#40;</span><span style="color: #993333;">const</span> <span style="color: #993333;">char</span> <span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span> NULL<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
   <span style="color: #b1b100;">return</span><span style="color: #009900;">&#40;</span>EXIT_FAILURE<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>See where the directives of <b>/usr/bin/svn</b> and <b>/home/www/domain/htdocs/</b> are? Just change those to match your server. Save the file as <b>update.c</b> and just back to the shell.<br />
Now we need to compile the program:</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">cc -o update update.c</pre></div></div>

<p>This will create an executable called update. You can call it what ever you want, just as long as before renaming it you type <b>chown apache.apache update; chmod +s update</b>. It should be owned by the Apache user.</p>
<h3><font color='black'>Setup post-commit</font></h3>
<p>Just over to your SVN repository, then into the hooks directory. So if you were following, <b>cd /home/www/domain/svn/website/hooks</b>. There you will see a bunch of .tmpl files. Rename of copy <b>post-commit.tmpl</b> to <b>post-commit</b>, then chmod 755 post-commit.</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">cp post-commit.tmpl post-commit
chmod 755 post-commit</pre></div></div>

<p>Open post-commit in your editor. You may see a bunch of stuff in there. Just put a hash (#) sign in front of any other commands there. They are examples. Add:</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">/home/www/domain/htdocs/update</pre></div></div>

<p>That&#8217;s it. Don&#8217;t add sh, or bash to the front, just put in the path with executable at the end. Save and exit.</p>
<h3><font color='black'>Try it!</font></h3>
<p>Now, as long as you followed along and I didn&#8217;t skip anything. This should work. Try it out. Try committing something to SVN and see what happens! If you can view the website right away, they you did it correctly. If now, you should check your apache log files. Specifically <b>error_log</b>. If SVN threw an error you will have to see what went wrong there. Sometimes just putting a commit message in will fix any error.</p>
<p>That&#8217;s it. I hope you found this informative. Please feel free to drop my a comment below if you have anything you wish to add or just want to say thanks for the info. I appreciate all feedback. Thanks for reading!</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.tangorangers.com/2012/01/how-to-update-a-live-website-via-svn/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>How to use Redmine when your Ruby is too new</title>
		<link>http://blog.tangorangers.com/2011/12/how-to-use-redmine-when-your-ruby-is-too-new/</link>
		<comments>http://blog.tangorangers.com/2011/12/how-to-use-redmine-when-your-ruby-is-too-new/#comments</comments>
		<pubDate>Tue, 13 Dec 2011 04:21:19 +0000</pubDate>
		<dc:creator>DaijoubuKun</dc:creator>
				<category><![CDATA[coding]]></category>
		<category><![CDATA[good to know]]></category>
		<category><![CDATA[hacks]]></category>

		<guid isPermaLink="false">http://blog.tangorangers.com/?p=334</guid>
		<description><![CDATA[Recently my work switched to Redmine to keep track of our projects and such, I loved it so much, I wanted to use it at home for my personal projects. Seriously, if you have never used it, give it a try, you won&#8217;t be disappointed. However, there is a problem that I ran into when [...]]]></description>
			<content:encoded><![CDATA[<p>Recently my work switched to <a href="http://redmine.org" title="Redmine" target="_blank">Redmine</a> to keep track of our projects and such, I loved it so much, I wanted to use it at home for my personal projects. Seriously, if you have never used it, give it a try, you won&#8217;t be disappointed. However, there is a problem that I ran into when setting it up at home, my Ruby was too new! At the time of this writing Redmine version 1.2.2 was the current stable, and required Ruby 1.8.6 or 1.8.7. My server came with 1.9.1! I could either downgrade and risk possible incompatibility problems, or I could take another approach. After days of Goggling, I found a solution.</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">Check out https://rvm.beginrescueend.com/rvm/install/</pre></div></div>

<p>I recommend the single user install. I did it with no problems. Things get a bit tricky when using RVM, so I decided to create this Quick and Dirty Guide.</p>
<h3><font color='black'>How to Install and Setup Redmine with RVM</font></h3>
<p>Be sure to pay attention to directories, I will make notes to help make things easy. Also, I recommend trying this out in a VM or a dev box. Please read the HowTos on redmine.org and do some research and testing before following this guide.</p>
<p>Note: This was done running Slackware 13.1. I do NOT use sudo on my machines. If you get a permissions error you can use sudo if your Linux distro is setup for it. The first part of this I did as the root user. If you use sudo, type <strong>&#8216;sudo su -&#8217;</strong> to become full root. If you see Redmine (with the capital R), I&#8217;m referring to the Redmine program or website. Lowercase, is the user redmine.</p>
<p>After downloading the source from redmine.org extract it and rename the folder to redmine, you don&#8217;t have to do this, it&#8217;s just how I did it.</p>
<p><strong>Setup a Redmine user</strong></p>
<p>This user doesn&#8217;t need remote access, or the ability to login directly. We are going to create a new user and group for Redmine to run under.</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">groupadd redmine
useradd redmine -g redmine -m</pre></div></div>

<p>Now set permission to where you extracted Redmine to. We are going to give everything to the redmine user and group.</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">chown redmine:redmine redmine/ -R</pre></div></div>

<p>Now you need to <strong>su &#8211; redmine</strong>. Make sure you are in the redmine user&#8217;s home directory. Usually /home/redmine/</p>
<p><strong>Setup RVM</strong></p>
<p>Now that you are the redmine user and in their home directory, it&#8217;s time to install RVM. Be sure to check out their <a href="https://rvm.beginrescueend.com/rvm/install/" title="RVM install information" target="_blank">website</a> for full and up to date information. The information listed here maybe out of date!</p>
<p>Lets install RVM for single user use. You are welcome to use the multi-user version, but this way worked just fine for me. Once again, make sure you are in the redmine user&#8217;s home directory.</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">bash &lt; &lt;(curl -s https://raw.github.com/wayneeseguin/rvm/master/binscripts/rvm-installer )</pre></div></div>

<p>This will get the installer going. Once it finishes, run this:</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">echo '[[ -s &quot;$HOME/.rvm/scripts/rvm&quot; ]] &amp;&amp; . &quot;$HOME/.rvm/scripts/rvm&quot; # Load RVM function' &gt;&gt; ~/.bash_profile</pre></div></div>

<p>Now logout. Log back in as the redmine user. and type:</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">type rvm | head -1</pre></div></div>

<p>You should get back <em>rvm in a function</em>. If not, something went wrong. Try the commands listed above again. If you get an error about a broken pipe, don&#8217;t worry about it. I got it once, but never again. I have no idea why.</p>
<p>If you do get back the good news type:</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">rvm install 1.8.7</pre></div></div>

<p>This will install ruby 1.8.7! Once it is complete type:</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">rvm use 1.8.7</pre></div></div>

<p>If you don&#8217;t get back any errors, type:</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">rvm use 1.8.7 --default</pre></div></div>

<p>This will set that ruby version as your default (only for the redmine user!) RVM is now setup. Good job!</p>
<p><strong>Install Some Ruby Gems</strong></p>
<p>Now that RVM is setup and Ruby 1.8.7 is installed, we need to setup some gems for ruby. First step is getting the correct version of RubyGems installed. As per the Redmine documentation, we want version 1.3.7. I find the easiest way of doing this is to grab their .tgz file. Once you get it (you can also find a list of versions available for download <a href="http://rubyforge.org/frs/?group_id=126" title="RubyGems Download" target="_blank">here.</a> Extract it, and run setup.rb.</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">wget http://rubyforge.org/frs/download.php/70696/rubygems-1.3.7.tgz
tar zxf rubygems-1.3.7.tgz
ruby rubygems-1.3.7/setup.rb</pre></div></div>

<p>It should only take a second or two to install. Once it&#8217;s complete there are two more gems that need to be installed before continuing. It is easy and straight forward. Note: If your system appears to freeze when running the commands below, do not worry. It&#8217;s working in the background a may take a minute or two.</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">gem install rails -v=2.3.11
gem install -v=0.4.2 i18n</pre></div></div>

<p><strong>Setup MySQL</strong></p>
<p>Assuming you are still the redmine user and MySQL is setup and ready to go, these next steps are very easy and were taken right from Redmine&#8217;s website. Follow the steps below.</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">mysql -u root -p
create database redmine character set utf8;
create user 'redmine'@'localhost' identified by 'redpass';
grant all privileges on redmine.* to 'redmine'@'localhost';
flush privileges;</pre></div></div>

<p>Take note of <strong>redpass</strong>. Change it to the password you want to use!</p>
<p>Log out of MySQL and stay logged in as the redmine user. Change directory to where the redmine program is stored. For this example, and the rest of the article, I&#8217;m going to assume it&#8217;s in <strong>/srv/redmine</strong></p>
<p>Copy config/database.yml.example to config/database.yml then edit config/database.yml to include your db setup (under production. You can remove the others)</p>
<p>Copy public/dispatch.cgi.example to public/dispatch.cgi then changes first line to the path of the redmine user&#8217;s ruby location (<strong>/home/redmine/.rvm/bin/ruby</strong> in my case)</p>
<p>public/dispatch.cgi needs to have execute permissions. If it does not, type: <strong>chmod 755 public/dispatch.cgi</strong></p>
<p>Uncomment <strong>NV['RAILS_ENV'] ||= &#8216;production&#8217;</strong> in config/environment.rb</p>
<p>Now we need to setup MySQL access. Below are four (4) commands that will do all this including building the MySQL gem. Please note the path to mysql_config. Make sure this matches your setup!</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">rake generate_session_store
gem install mysql -- --with-mysql-config=/usr/bin/mysql_config
RAILS_ENV=production rake db:migrate
RAILS_ENV=production rake redmine:load_default_data</pre></div></div>

<p>If any of these fail, something may have gone wrong with RVM or MySQL. Check you meet the minimum qualifications listed on Redmine&#8217;s website and your paths are correct.</p>
<p><strong>Setup Passenger</strong></p>
<p>Passenger is designed to run as an apache module to keep Ruby of Rails running. If Redmine isn&#8217;t used for a while, Ruby of Rails may stop running, it&#8217;s not a big deal, it just means it will take a second longer to access your first request. It&#8217;s easy to setup, and can be done as the redmine user. So make sure you are still logged in as your redmine user.</p>
<p>I&#8217;m running version 3.0.11 or Passenger, you are welcome to do the same. There are only three (3) simple steps involved. So I put them below. Just give it some time to build, it can take a few minutes.</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">wget http://rubyforge.org/frs/download.php/75548/passenger-3.0.11.tar.gz
tar zxf passenger-3.0.11.tar.gz
./passenger-3.0.11/bin/passenger-install-apache2-module</pre></div></div>

<p>Once the build finishes there are some lines you need to add to your apache.conf file. They are listed above, they are easy to see. Now, depending on your Linux distro, there are several names and locations for this file. You will need root access to edit the Apache config.</p>
<p>At this point you can stop being logged in as the redmine user. Go back to being root (or your regular user with sudo access)</p>
<p><strong>Setup Apache</strong></p>
<p>This setup worked well for me, I would recommend reading up on Apache config options at <a href="http://www.redmine.org/projects/redmine/wiki/HowTo_configure_Apache_to_run_Redmine" title="How to configure apache" target="_blank">http://www.redmine.org/projects/redmine/wiki/HowTo_configure_Apache_to_run_Redmine</a></p>
<p>The page is a little hard to understand when talking about mod_fcgi and mod_fastcgi. You do NOT need them. They maybe faster, but I find that mod_cgi works just fine.</p>
<p>I&#8217;m getting a bit lazy here, and I don&#8217;t feel much like going into a lot of explanation on all the options you can use in Apache. Below is a sample of what I used.</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">&lt;VirtualHost *:80&gt;
   ServerName redmine.&lt;YOUR-DOMAIN&gt;.com
   ServerAdmin webmaster@&lt;YOUR-DOMAIN&gt;.com
   DocumentRoot /srv/redmine/redmine/public/
   ErrorLog /srv/redmine/redmine/log/redmine_error_log
   &lt;Directory &quot;/srv/redmine/redmine/public/&quot;&gt;
      Options Indexes ExecCGI FollowSymLinks
      Order allow,deny
      Allow from all
      AllowOverride all
   &lt;/Directory&gt;
&lt;/VirtualHost&gt;</pre></div></div>

<p>Obviously there are changes you need to make, like ServerName and ServerAdmin. Note how all the directories start with /srv/redmine/, Update it to where you extracted the Redmine program.</p>
<p><strong>All done!</strong></p>
<p>At this point you should just have to restart apache and you are good to go! Assuming you actually read the Redmine documentation, you can now login as admin (password admin) and give it a go. The first thing I recommend doing is creating a new Admin Level User and removing the default admin. If you get an <em>Internal Error 500</em> when trying to add a new user, then something is definitely wrong. Check the redmine_error_log and production.log file (both should be in the same directory). If you see something about an error with US_ASCII, then Ruby is not running out of the redmine user&#8217;s home directory. Go back through and double check your settings.</p>
<p>I have been told that creating the redmine user in the fashion shown above can create a security risk. As root open /etc/shadow in your favorite editor. At the bottom of the list will be the redmine user. You may see something like:</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">redmine:!:12585:0:99999:7:::</pre></div></div>

<p>If you change the exclamation point to an asterisk, it disables the account. That way you can not log into it remotely. Also, if you really want to play it safe, you can edit /etc/passwd also. Just change the last part of the file from /bin/bash to /bin/false. However, by doing this you will not be able to login, or su to that user.</p>
<p><strong>Well?</strong></p>
<p>Did this guide work for you? Do you have any suggestions that may work better? I would love to hear! Feel free to post a comment and let me know how it worked for you, and let me know what Linux distro and version you are running. Thank you.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.tangorangers.com/2011/12/how-to-use-redmine-when-your-ruby-is-too-new/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Apache looking for .htaccess in the wrong places &#8211; Fixed!</title>
		<link>http://blog.tangorangers.com/2011/03/apache-looking-for-htaccess-in-the-wrong-places-fixed/</link>
		<comments>http://blog.tangorangers.com/2011/03/apache-looking-for-htaccess-in-the-wrong-places-fixed/#comments</comments>
		<pubDate>Sun, 20 Mar 2011 16:51:43 +0000</pubDate>
		<dc:creator>DaijoubuKun</dc:creator>
				<category><![CDATA[good to know]]></category>

		<guid isPermaLink="false">http://blog.tangorangers.com/?p=318</guid>
		<description><![CDATA[Is Apache looking for a .htaccess file in all the wrong places? Maybe you have an area where one doesn&#8217;t even exist, nor should it. Do you get a message such as: Permission denied: /srv/http/domain/files/images/.htaccess pcfg_openfile: unable to check htaccess file, ensure it is readable If you are, you may be wondering why apache is [...]]]></description>
			<content:encoded><![CDATA[<p>Is Apache looking for a .htaccess file in all the wrong places? Maybe you have an area where one doesn&#8217;t even exist, nor should it. Do you get a message such as:</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">Permission denied: /srv/http/domain/files/images/.htaccess pcfg_openfile: unable to check htaccess file, ensure it is readable</pre></div></div>

<p>If you are, you may be wondering why apache is looking for a .htaccess file in the images sub-folder. You may even be wondering why it is asking for one at all because you don&#8217;t even use .htaccess file anywhere. Turns out there is a very simple fix.</p>
<p>The problem has to do with file and directory permissions on the server. First off we need to check permissions, here is a fake directory tree for an example.</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">-rw-r--r--  1 root root    72K 2006-09-30 17:06 file1.htm
drw-r--r--  2 root root   4.0K 2007-05-09 11:52 images/
-rw-r--r--  1 root root    72K 2006-09-30 17:06 index.htm
-rw-r-----  1 root root    625 2010-10-17 14:25 news.php
-rw-------  1 root root    598 2010-10-17 14:25 stuff.php
-rw-r--r--  1 root root     56 2008-03-23 13:42 stuff2.php</pre></div></div>

<p>See how everything is owned by root? Sometimes this is OK, but for some users it is not possible. Find out from your service provider if you need to use another name, such as apache, or your login user name. For me, I like having everything owned by root. That way other programs or users on my server can&#8217;t edit my files.</p>
<p>Look at the images/ directory. It&#8217;s permissions are wrong. It turns out Apache wants the directory to be executable. Currently the directory has read-write on user, read on group, and read on world level permissions. We need to make is rwx-r-xr-x, or read-write-execute on user, read-execute on group, and read-execute on world levels.</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">chmod 755 images/</pre></div></div>

<p>That should do it. Did you see any other problems with the directory tree above? I actually put 2 more mistakes. They are news.php and stuff.php. Chmod them both to 644. Then they will have the same permissions as index.htm.</p>
<p>If you are like me and want to set the following permissions for everything. I have an easy way of doing it.</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">-rw-r--r-- for files
drwxr-xr-x for directories</pre></div></div>


<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">chmod</span> <span style="color: #000000;">644</span> <span style="color: #000000; font-weight: bold;">*</span> <span style="color: #660033;">-R</span>
<span style="color: #c20cb9; font-weight: bold;">find</span> . <span style="color: #660033;">-type</span> d <span style="color: #660033;">-exec</span> <span style="color: #c20cb9; font-weight: bold;">chmod</span> <span style="color: #000000;">755</span> \<span style="color: #7a0874; font-weight: bold;">&#123;</span>\<span style="color: #7a0874; font-weight: bold;">&#125;</span> \;</pre></div></div>

<p>When complete you will get a list like this.</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">-rw-r--r--  1 root root    72K 2006-09-30 17:06 file1.htm
drwxr-xr-x  2 root root   4.0K 2007-05-09 11:52 images/
-rw-r--r--  1 root root    72K 2006-09-30 17:06 index.htm
-rw-r--r--  1 root root    625 2010-10-17 14:25 news.php
-rw-r--r--  1 root root    598 2010-10-17 14:25 stuff.php
-rw-r--r--  1 root root     56 2008-03-23 13:42 stuff2.php</pre></div></div>

<p>That will do it. Keep in mind that depending on your configuration this may not work, but I hope it does. If this did work for you please drop a comment to let others know. Thank you, and good luck!</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.tangorangers.com/2011/03/apache-looking-for-htaccess-in-the-wrong-places-fixed/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Wireless Tethering Android with Slackware</title>
		<link>http://blog.tangorangers.com/2011/01/wireless-tethering-android-with-slackware/</link>
		<comments>http://blog.tangorangers.com/2011/01/wireless-tethering-android-with-slackware/#comments</comments>
		<pubDate>Sun, 02 Jan 2011 18:36:15 +0000</pubDate>
		<dc:creator>DaijoubuKun</dc:creator>
				<category><![CDATA[hacks]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[slackware]]></category>
		<category><![CDATA[tether]]></category>

		<guid isPermaLink="false">http://blog.tangorangers.com/?p=295</guid>
		<description><![CDATA[Almost two years ago I wrote a how to on tethering with my G1 and Slackware, located here. This was back before I rooted my phone to breathe more life back into it. I still have the phone and plan on having it for a long time. Sure it is as slow as can be, [...]]]></description>
			<content:encoded><![CDATA[<p>Almost two years ago I wrote a how to on tethering with my G1 and Slackware, <a href="http://blog.tangorangers.com/2009/02/tetherbot_android_and_slackware_how_to/">located here.</a> This was back before I rooted my phone to breathe more life back into it. I still have the phone and plan on having it for a long time. Sure it is as slow as can be, but I still love the full qwerty keyboard&#8230; oops, sorry, I&#8217;m not here to talk about that. Anyways, like I was saying. I rooted my phone and I&#8217;m currently running <a href="http://www.cyanogenmod.com/" target="_blank">CyanogenMod 6.0</a> on my G1.</p>
<p>Wireless Tethering allows you to connect your computer through the phone and use the 3G (or 4G, EDGE, etc) as your internet connection. Some new phones can do wireless tether without rooting, but often times you must pay extra for the service. If you rooted your phone there are two ways of doing wireless tether. First check and see if you have wireless tethering built into your MOD. Go to Settings &#8211;> Wireless &#038; networks &#8211;> Tethering. If you only see USB tethering then there are extra steps you must take to enable wireless tethering. See the 3 images below. Note that my phone only lists USB Tethering. If your phone is the same, then continue.<br />
<img src="http://www.tangorangers.com/files_blog/Wireless_Tether/settings--.png" alt="img" />&nbsp;<img src="http://www.tangorangers.com/files_blog/Wireless_Tether/settings--wireless--.png" alt="img" />&nbsp;<img src="http://www.tangorangers.com/files_blog/Wireless_Tether/settings--wireless--tethering.png" alt="img" /></p>
<p>Some people I know are also running CyanogenMod and they have wireless tether built in. Why is that? For starters, since the phone is newer than my G1, they have a more up to date wireless card. These cards can be put into AP mode. This is the same style mode that your wireless router at home uses. Some phones that have wireless tether can also put the card into Ad-Hoc mode. This mode is also known as Computer to Computer without an Access Point. However, it seems that you still need the extra software to do wireless tethering. It is kind of hard for me to explain as I don&#8217;t have access to many phone to see how they work. Let alone ones that are rooted. With my G1, I can say that the wireless card was not even designed to operate in Ad-Hoc mode. Thanks to the software I&#8217;m running I can force the card into Ad-Hoc mode and connect to it with my laptop.</p>
<p>Keep in mind that wireless tethering will kill your battery quickly. Be sure to have a USB charging cable with you as your battery will not last long. Also note that many service providers do not want you to tether without paying extra. Be sure to read the terms of service of your provider before continuing.</p>
<p>If you made it this far you are going to need extra software. Once again, if your phone is not rooted this will NOT work! Head on over to <a href="https://code.google.com/p/android-wifi-tether/downloads/list" target="_blank">Google Code</a> to download. At the time of this writing I am running version 2.0.2. A later version has been released, but I have not tested it as mine works very nicely. Download the software to your phone and install. If you don&#8217;t know how, I can&#8217;t help you.</p>
<p>After installing there are several features to the software. I highly recommend encryption and if you want, Access Control. By default the software uses wpa_supplicant to set the WEP key. This is done via a passphrase. If you like the shell (like I do) you will need to use iwconfig to set the key. Below are some pictures of the settings menu in Wireless Tether.<br />
<img src="http://www.tangorangers.com/files_blog/Wireless_Tether/settings1.png" alt="img" />&nbsp;<img src="http://www.tangorangers.com/files_blog/Wireless_Tether/settings_encryption_setup_method.png" alt="img" />&nbsp;<img src="http://www.tangorangers.com/files_blog/Wireless_Tether/settings_wifi_key.png" alt="img" /><br />
<img src="http://www.tangorangers.com/files_blog/Wireless_Tether/settings_edit_essid.png" alt="img" />&nbsp;<img src="http://www.tangorangers.com/files_blog/Wireless_Tether/settings_channel.png" alt="img" />&nbsp;<img src="http://www.tangorangers.com/files_blog/Wireless_Tether/settings_enable_access_control.png" alt="img" /></p>
<p>If you use Access Control, before a newly connected device can access the net you will have to allow it. I don&#8217;t have pictures, but if I remember it will be in the notification bar. Just drag it down, select the computer/device and hit allow. Later you can look in the Access Control Panel by hitting Menu then Access Control. Here is what mine looks like (and no, the computer is not actually connected. I just have it set to always allow the machines based on it&#8217;s MAC address.<br />
<img src="http://www.tangorangers.com/files_blog/Wireless_Tether/settings_example_access_control.png" alt="img" /></p>
<p>My laptop has a Broadcom wireless card. I&#8217;m using the b43 drivers <a href="http://wireless.kernel.org/en/users/Drivers/b43" target="_blank">found here.</a> As it turns out there are several problems found with my current kernel version (2.6.28) and the rc.wireless script that Slackware uses. There are two fixes. One is to remove the b43 module and reload it (this is so we can put the card in Ad-Hoc mode) and I have had problems setting the WEP key via iwconfig. With iwconfig you can set the key (default for this software being &#8216;abcdefghijklm&#8217;) by typing:</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">iwconfig &lt;card-id&gt; key s:&lt;passphrase&gt;</pre></div></div>

<p>I always got an error. I solved the problem by using another computer to set the key then you can type iwconfig again and see the key. In this case, the key is 6162636465666768696A6B6C6D. If needs be, write down this key so you can use iwconfig to set it again.</p>
<p>Ok. I hope by now you have the wireless software installed on your Android phone and it is running. Note: I have found that sometimes even when encryption is set it doesn&#8217;t turn on. Be sure to scan for wireless networks to see your phone and if encryption is turned on or not. Also note that the software has created an Ad-Hoc style connection. If everything seems to be working here is what you do. In the next steps I will have some bash commands, then a note on what each command does. You may need a make changes to it to suit your needs. I turned it into a script I can run on my laptop so I don&#8217;t have to type every line in every time I tether.</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">rmmod b43   -unloads the b43 module
modprobe b43   -reloads the b43 module
ifconfig wlan0 down   -take the card offline
iwconfig wlan0 mode ad-hoc   -set to Ad-Hoc mode
iwconfig wlan0 essid android   -set the essid (be sure to check your configs)
iwconfig wlan0 key 6162636465666768696A6B6C6D   -set the WEP key (may differ!)
ifconfig wlan0 up   -bring the card online
dhclient wlan0   -get an IP address to your phone</pre></div></div>

<p>Now type ifconfig and make sure you have an IP. If so, try surfing! If you are a hardcore Slackware user you may note that I use dhclient instead of dhcpcd. For some reason dhcpcd never gets me an IP. If this doesn&#8217;t work try it again. Sometimes I have to run the script twice, but I always get it working eventually.</p>
<p>I don&#8217;t have a problem with Windows 7 on the same machine. Windows will allow you to type in the paraphrase and it works great. If you&#8217;re running Linux and using the b43 module there are several things you can try to fix any problems. I hear the 2.6.33 and newer kernel have these problems fixed. Also if you don&#8217;t run a wireless script on boot, that may help. Most newer Linux distributions have GUI programs to help you connect to networks. I&#8217;m still running an older version of Slackware, and at the time, it didn&#8217;t come with those programs.</p>
<p>Now for some more pictures I took of the program. No reason. I just thought I would share.<br />
<img src="http://www.tangorangers.com/files_blog/Wireless_Tether/main_screen.png" alt="img" />&nbsp;<img src="http://www.tangorangers.com/files_blog/Wireless_Tether/menu_options.png" alt="img" />&nbsp;<img src="http://www.tangorangers.com/files_blog/Wireless_Tether/starting.png" alt="img" /><br />
<img src="http://www.tangorangers.com/files_blog/Wireless_Tether/tethering_complete.png" alt="img" />&nbsp;<img src="http://www.tangorangers.com/files_blog/Wireless_Tether/stopping.png" alt="img" />&nbsp;<img src="http://www.tangorangers.com/files_blog/Wireless_Tether/about.png" alt="img" /></p>
<p>I hope this all makes sense. If not you can always ask, if I know the answer I will reply. I would also recommend asking on a help forum or asking Google. Good luck and Happy Hacking!</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.tangorangers.com/2011/01/wireless-tethering-android-with-slackware/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>101010</title>
		<link>http://blog.tangorangers.com/2010/10/101010/</link>
		<comments>http://blog.tangorangers.com/2010/10/101010/#comments</comments>
		<pubDate>Sun, 10 Oct 2010 06:00:31 +0000</pubDate>
		<dc:creator>DaijoubuKun</dc:creator>
				<category><![CDATA[In The News]]></category>

		<guid isPermaLink="false">http://blog.tangorangers.com/?p=273</guid>
		<description><![CDATA[Today is 10/10/10. It is a very special day. This is something that happens only once in a lifetime! When I first saw what today was, it seemed like any other day, but a friend pointed out something awesome. Open up your calculator and change it to binary and type 101010, then click decimal. If [...]]]></description>
			<content:encoded><![CDATA[<p>Today is 10/10/10. It is a very special day. This is something that happens only once in a lifetime! When I first saw what today was, it seemed like any other day, but a friend pointed out something awesome. Open up your calculator and change it to binary and type 101010, then click decimal. If you don&#8217;t know how to do it let me give you a quick translation in the binary to decimal conversion.</p>
<p>To start, the first thing you need to see is that in every byte (8 bits) is capable of holding a number from 0 to 255. An easy way to translate a number is to write it down. so&#8230;</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #cc66cc;">101010</span></pre></div></div>

<p>Now granted, this number is not 8 digits long, but it still works, just add 2 zeros in front.</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #208080;">00101010</span></pre></div></div>

<p>Now the easiest way I have found it to make a table to put your numbers in.</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #cc66cc;">128</span><span style="color: #339933;">|</span><span style="color: #cc66cc;">64</span><span style="color: #339933;">|</span><span style="color: #cc66cc;">32</span><span style="color: #339933;">|</span><span style="color: #cc66cc;">16</span><span style="color: #339933;">|</span><span style="color: #cc66cc;">8</span><span style="color: #339933;">|</span><span style="color: #cc66cc;">4</span><span style="color: #339933;">|</span><span style="color: #cc66cc;">2</span><span style="color: #339933;">|</span><span style="color: #cc66cc;">1</span>
<span style="color: #339933;">----------------------------</span>
 <span style="color: #cc66cc;">0</span>  <span style="color: #cc66cc;">0</span>  <span style="color: #cc66cc;">1</span>  <span style="color: #cc66cc;">0</span>  <span style="color: #cc66cc;">1</span> <span style="color: #cc66cc;">0</span> <span style="color: #cc66cc;">1</span> <span style="color: #cc66cc;">0</span></pre></div></div>

<p>(Hopefully this aligns properly on everyone&#8217;s screen.)<br />
Now, Add those numbers up and what do you get?<br />
32+8+2 = ???<br />
Well?<br />
42! The meaning of the universe!</p>
<p>How cool is that! So take today and make it the best day you can! This only happens once (well, as long as you remove the first 2 numbers from the year). Make today the best day of your life and remember. 42 is the best number out there, today will be your lucky day!</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.tangorangers.com/2010/10/101010/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Secunia PSI is a must for any Windows machines</title>
		<link>http://blog.tangorangers.com/2010/07/secunia-psi-is-a-must-for-any-windows-machines/</link>
		<comments>http://blog.tangorangers.com/2010/07/secunia-psi-is-a-must-for-any-windows-machines/#comments</comments>
		<pubDate>Fri, 30 Jul 2010 00:58:17 +0000</pubDate>
		<dc:creator>DaijoubuKun</dc:creator>
				<category><![CDATA[good to know]]></category>
		<category><![CDATA[windows]]></category>

		<guid isPermaLink="false">http://blog.tangorangers.com/?p=252</guid>
		<description><![CDATA[Keeping up with program patches and updates can be extremely difficult, but thanks to your friends over at Secunia, those problems can be all but eliminated! This is a (somewhat) complete guide on getting Secunia PSI (Personal Software Inspector), installing, and running it! This program is a must for anyone who runs any Windows OS. [...]]]></description>
			<content:encoded><![CDATA[<p>Keeping up with program patches and updates can be extremely difficult, but thanks to your friends over at Secunia, those problems can be all but eliminated! This is a (somewhat) complete guide on getting Secunia PSI (Personal Software Inspector), installing, and running it! This program is a must for anyone who runs any Windows OS. This is partly because it&#8217;s only available for Windows. These images were taken from a Windows 7 Home Premium 64-bit OS, but it should be pretty much the same for any other OS.</p>
<p>At the time of this writing Secunia PSI was on version 1.5.0.2.</p>
<p>First, lets get Secunia PSI downloaded. Head on over to <a href="http://secunia.com/vulnerability_scanning/personal/" target="_blank">Secuina.com</a> and look for the download button.</p>
<p><img src="http://www.tangorangers.com/files_blog/secunia_psi_pics/sec_1.jpg" alt="this is an image" /></p>
<p>After downloading head over to where ever you saved it to, and double-click to run. NOTE: Windows may ask is you want to run the program, click yes!</p>
<p>Now follow the instructions. Images below will help guide you through the process.</p>
<p>Select a language.<br />
<img src="http://www.tangorangers.com/files_blog/secunia_psi_pics/sec_3.jpg" alt="this is an image" /><br />
Click Next<br />
<img src="http://www.tangorangers.com/files_blog/secunia_psi_pics/sec_4.jpg" alt="this is an image" /><br />
I accept the terms of the License Agreement (Don&#8217;t forget to read it!)<br />
<img src="http://www.tangorangers.com/files_blog/secunia_psi_pics/sec_5.jpg" alt="this is an image" /><br />
Select Personal Use, unless you are using it for business purposes.<br />
<img src="http://www.tangorangers.com/files_blog/secunia_psi_pics/sec_6.jpg" alt="this is an image" /><br />
More reading<br />
<img src="http://www.tangorangers.com/files_blog/secunia_psi_pics/sec_7.jpg" alt="this is an image" /><br />
Tell it where to install<br />
<img src="http://www.tangorangers.com/files_blog/secunia_psi_pics/sec_8.jpg" alt="this is an image" /><br />
Once done, click finish<br />
<img src="http://www.tangorangers.com/files_blog/secunia_psi_pics/sec_9.jpg" alt="this is an image" /><br />
It will ask if you want to run it. Say yes.<br />
<img src="http://www.tangorangers.com/files_blog/secunia_psi_pics/sec_10.jpg" alt="this is an image" /><br />
Once it starts you may see message saying &#8220;Please wait while network connectivity is verified.&#8221; Have no fear, this is normal. As soon as the program can see the servers it will continue. If you have a software firewall installed you may need to allow Secunia PSI access to the Internet.</p>
<p>Now onto usage!</p>
<p>After the program scans it will come up with a list like this. This image is a good scenario (of a bad situation), you may get one just like it or worse. If the insecure program is listed as a Microsoft product it should be dealt with by using Windows Update. I did not include how to do this because it varies from XP, Vista, and 7.<br />
<img src="http://www.tangorangers.com/files_blog/secunia_psi_pics/secunia_psi_1.jpg" alt="this is an image" /></p>
<p>Here I&#8217;m going to update Adobe Flash Player 10.x. I click on the Blue down arrow, I get a dialog box to download the new software.<br />
<img src="http://www.tangorangers.com/files_blog/secunia_psi_pics/secunia_psi_2.jpg" alt="this is an image" /></p>
<p>Save the file (remember where you save it to!)<br />
<img src="http://www.tangorangers.com/files_blog/secunia_psi_pics/secunia_psi_3.jpg" alt="this is an image" /></p>
<p>Then run it! Just follow the steps for each program. In this case there were many listings for Adobe Flash Player. You only need to download it once and run it once. Once you scan again it will show them all fixed up. (FYI: The reason it lists many copies is because Flash Player is installed in several places due to different web browsers)<br />
<img src="http://www.tangorangers.com/files_blog/secunia_psi_pics/secunia_psi_4.jpg" alt="this is an image" /></p>
<p>After you do this a few times and run windows update you can manually start the scan again. Once you are set you will see something like this.<br />
<img src="http://www.tangorangers.com/files_blog/secunia_psi_pics/secunia_psi_5.jpg" alt="this is an image" /></p>
<p>You are set! Look at you! You have already mastered this awesome utility!</p>
<p>By default Secunia PSI is set to run at system startup. This may not be best if you are on a laptop, or have a very slow computer. If Secunia PSI is running you will see a little icon in the bottom left corner of your screen. It looks a little like this.<br />
<img src="http://www.tangorangers.com/files_blog/secunia_psi_pics/secunia_psi_7.jpg" alt="this is an image" /></p>
<p>Questions?</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.tangorangers.com/2010/07/secunia-psi-is-a-must-for-any-windows-machines/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Use SSH Keys Instead of Passwords</title>
		<link>http://blog.tangorangers.com/2010/05/use-ssh-keys-instead-of-passwords/</link>
		<comments>http://blog.tangorangers.com/2010/05/use-ssh-keys-instead-of-passwords/#comments</comments>
		<pubDate>Sat, 08 May 2010 21:47:41 +0000</pubDate>
		<dc:creator>DaijoubuKun</dc:creator>
				<category><![CDATA[good to know]]></category>
		<category><![CDATA[ssh]]></category>

		<guid isPermaLink="false">http://blog.tangorangers.com/?p=246</guid>
		<description><![CDATA[I have been living and working in SSH environments for quite some time now. I even created a little bash script to help me keep track of all my connections. Today I wanted to talk about a new way (well, it&#8217;s not really new, but new to me I guess) of connecting to other Linux [...]]]></description>
			<content:encoded><![CDATA[<p>I have been living and working in SSH environments for quite some time now. I even created a little bash script to help me keep track of all my connections. Today I wanted to talk about a new way (well, it&#8217;s not really new, but new to me I guess) of connecting to other Linux systems by using keys instead of passwords.</p>
<p>Normally when you open an SSH connection you are presented with a password request. The down side to using passwords is that if your not paying attention you can be hit with a brute force or dictionary attack. Because you allow passwords to be used there is a chance of someone gaining access. With keys only you have nothing to fear from these types of attacks.</p>
<p>Here is how it works. Normally you enter a password. With keys all you need to do is form the SSH connection and the keys transmit automatically. Once the keys are paired you are connected with a shell. There are two different ways of performing key pairs. The first way is just the key. No need for a passphrase. The other is a passphrased key. I will talk about both.</p>
<p>First is the “no passphrase key.” In this example you will create a key, upload it to the host, then every time you connect you will not be asked for a password or passphrase. Keep in mind that by doing this there are risks involved. More on that later.</p>
<p>To make a “no passphrase key” you need to generate a key pair. The simplest way of doing this is:</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">ssh-keygen -t rsa</pre></div></div>

<p>When it asks you for the password just hit enter. You will get an output of something like this.</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">Generating public/private rsa key pair.
Enter file in which to save the key (/home/user/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/user/.ssh/id_rsa.
Your public key has been saved in /home/user/.ssh/id_rsa.pub.
The key fingerprint is:
52:b8:d4:fd:d3:f6:ef:46:d1:90:42:de:e2:94:f4:09 user@localhost
The key's randomart image is:
+--[ RSA 2048]----+
|           .E  . |
|       o . o.=o. |
|      o o . =.+..|
|     . o   + o ..|
|      o S   + o .|
|       .     o ..|
|               ..|
|                o|
|               oo|
+-----------------+</pre></div></div>

<p>NOTE: These are test keys I generated, they won&#8217;t work after today.<br />
This created two files. “id_rsa” and “id_rsa.pub”</p>
<p>Take the id_rsa.pub file and upload it to the remote system. There are several ways of doing this. You can use scp, or if you are already connected you can copy and paste the contents of the file in pico, nano, vi, vim, what ever your favorite editor it. Be sure if you use the copy and paste method you keep the entire key in one line!</p>
<p>For scp type:</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">scp id_rsa.pub @:/.ssh/</pre></div></div>

<p>This will upload the pub file to the remote host. Once uploaded, login then navigate to ~/.ssh (your user&#8217;s home directory then to .ssh). Once there look for a file called “authorized_keys” and cat the contents of the pub file to it. If the file already exists type:</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">cat id_rsa.pub &amp;gt;&amp;gt; authorized_keys</pre></div></div>

<p>If the file doesn&#8217;t exist use only one (1) “&gt;”</p>
<p>For the copy and past method, cat the id_rsa.pub file to display the output. Select it. Login to the remote host. Open authorized_keys in an editor of your choice. Then paste the copied key. Make sure it stays all on one line! If you don&#8217;t it will not work. Save the file.</p>
<p>Once one of these two steps for implementing the key file has been completed you are good to go! You can delete the .pub file if you desire.</p>
<p>Now, onto part 2!</p>
<p>Here is where we generate passphrase keys. It&#8217;s basically the same task. When you generate a key put in a passphrase! Remember the passphrase. It is very important. Now when you login you will be prompted to enter you passphrase. This will unlock the key to be used for the connection. It should be different from your normal password.</p>
<p>Now, a few more little notes I want to talk about.</p>
<p>The problem with no passphrase keys: Without the need for a key is someone gains access to your system (like a laptop) they can gain access to any system you authorized that laptop to connect to. With passphrased keys you must type in a passphrase to authorize the key.</p>
<p>If you have problems make sure your ssh config is set to allow keys! Refer to your distro&#8217;s help files for more information. In the config you can also disallow passwords all together. The only way to login would be with the use the keys. The down side is if you lose your local key. If you do this method, ensure you have a backup plan. Like another computer with access keys. In Slackware Linux the lines to look for are in /etc/ssh/sshd_config</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">PubkeyAuthentication yes
AuthorizedKeysFile      .ssh/authorized_keys
PasswordAuthentication no</pre></div></div>

<p>Note that it becomes a pain if you generate multiple keys for multiple machines. There are ways of doing it, but it adds longer lines to your ssh commands. You can use the same .pub file on any other remote machine you wish to connect to. I don&#8217;t know for sure if it would be considered bad practice to do so, but I don&#8217;t see what problems would truly arise.</p>
<p>What&#8217;s the true benefit to this instead of saving time typing a password? Security. If an attacker can&#8217;t use a password (since many users passwords are weak) it would essentially eliminate their ability to gain SSH access. What do you think if the likelihood of the attacker to guess your key. Look at id_rsa. It&#8217;s a pretty big key to guess.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.tangorangers.com/2010/05/use-ssh-keys-instead-of-passwords/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Samba (cifs) through SSH</title>
		<link>http://blog.tangorangers.com/2010/04/samba-cifs-through-ssh/</link>
		<comments>http://blog.tangorangers.com/2010/04/samba-cifs-through-ssh/#comments</comments>
		<pubDate>Sun, 25 Apr 2010 22:59:11 +0000</pubDate>
		<dc:creator>DaijoubuKun</dc:creator>
				<category><![CDATA[good to know]]></category>
		<category><![CDATA[samba]]></category>
		<category><![CDATA[ssh]]></category>

		<guid isPermaLink="false">http://blog.tangorangers.com/?p=234</guid>
		<description><![CDATA[Ever needed to work from home, but have the problem of using a Samba share on the server while at work, but not at home? Well here is a simple fix. In my example I&#8217;m working on a &#8220;sandbox&#8221; from home. The folders I work in have files with more than one owner. This becomes [...]]]></description>
			<content:encoded><![CDATA[<p>Ever needed to work from home, but have the problem of using a Samba share on the server while at work, but not at home? Well here is a simple fix.</p>
<p>In my example I&#8217;m working on a &#8220;sandbox&#8221; from home. The folders I work in have files with more than one owner. This becomes a nightmare even when I ssh in. Some might think an NFS share would be better. Unfortunately with NFS you are stuck with the current file permissions. With Samba those file permissions are given to you. That may sound a bit confusing, so let me try to clear it up a bit. Let us say there is only one file in the Samba share. User &#8220;ender&#8221; has ownership of the file. I can&#8217;t alter it. When I login with Samba the file appears to be owned by me not &#8220;ender&#8221;. Now I can do my work and when I log out the file is still owned by &#8220;ender&#8221;&#8230; wow, I don&#8217;t think I did a good job there either. Lets just say that when in comes to file permissions, Samba is the way to go.</p>
<p>But I need to work over ssh? Only port 22 is open from the outside. No problem!</p>
<p>We simply need to create a ssh tunnel. For this we already know we need to connect to port 139 on &#8220;sandbox&#8221;, and we need a local port to connect to. I would say just make it 139 also. Unfortunately for me I&#8217;m also running Samba on my local machine, and I can&#8217;t do that. So any non used port will do. How about 1139?</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">ssh user@remotehost -L 1139:localhost:139</pre></div></div>

<p>Simple as that. That will connect port 1139 on your local machine to 139 of the remote host. The &#8220;localhost&#8221; actually refers to the remote host. It&#8217;s saying connect 1139 to my local machine to the remote host&#8217;s &#8220;localhost&#8221; port 139. If you are actually connecting to a windows box on that network you can &#8220;bounce&#8221; off the linux host to the windows. For more information you can refer to a previous post: <a href="http://blog.tangorangers.com/2008/12/secure-vnc-for-free/">Secure VNC for free</a> for more information.</p>
<p>Now comes the fun part. You have 1139 on your local machine tied to 139 on the server. Now to mount the share as a local disk.</p>
<p>As root we mount the share.</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">mount -t cifs //sandbox/www /mnt/sandbox/ -o username=&lt;username&gt;,password=&lt;password&gt;,ip=127.0.0.1,port=1139,uid=&lt;your local UID&gt;,gid=&lt;your local GID&gt;,file_mode=0770,dir_mode=0770</pre></div></div>

<p>Fill in your Samba share&#8217;s username and password, then your local machine&#8217;s UID and GID. To find the UID and GID type:</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">cat /etc/passwd | grep &lt;your local username&gt;
cat /etc/group | grep users</pre></div></div>

<p>This assumes your regular user is part of the &#8220;users&#8221; group.<br />
It will show 2 numbers. UID is most likely 500 or 1000, and GID is likely to be 100.</p>
<p>After filling in the blanks hit enter and your set! This will use the local port 1139 through the ssh connection to 139 on the server. It may seem a little slow at first, but that may be from the old server I&#8217;m connecting to.</p>
<p>If you want to store the info in fstab try:</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">//sandbox/www    /mnt/sandbox     cifs        noauto,rw,username=&lt;username&gt;,password=&lt;password&gt;,ip=127.0.0.1,port=1139,uid=&lt;UID&gt;,gid=&lt;GID&gt;,file_mode=0770,dir_mode=0770          0   0</pre></div></div>

<p>Now for some reason I can&#8217;t quite get this to work, but others seem to have no problem with it. You can add the mount line above into your /etc/fstab file so a regular user can mount. I did this, but it doesn&#8217;t work for me. I get an error saying &#8220;only ROOT can mount this&#8221;. If you get this error try:</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">chmod +s /usr/sbin/mount.cifs
chmod +s /usr/sbin/umount.cifs</pre></div></div>

<p>Like I said, it didn&#8217;t work for me, however after creating the ssh tunnel I simply open a new terminal window, su to root and then type &#8220;mount //sandbox/www&#8221; and it works fine.</p>
<p>Also, the reason I don&#8217;t background the ssh connection is because if it drops you may run into some problems with trying to mount it again (or even trying to use umount). I had this problem and it gave me a head ache to try to fix it without just rebooting. I&#8217;m sure I could have forced an umount.cifs, but I didn&#8217;t try (actually I didn&#8217;t realize it was actually still mounted). When logging in I recommend running a command that continuously sends data like &#8220;top&#8221;. That will help prevent the connection from being lost. If the connection is lost you must umount the share, reform the ssh tunnel, and try again.</p>
<p>NOTE: If you are connecting to a share on a Windows 7 box you must open 2 ports, 139 and 443 (or so I&#8217;m told). To do this open up a few terminal windows and create two separate connections. After that I do not know as I have never tried.</p>
<p>EDIT NOTE: I wrote this some time ago and just now got around to posting it. I hope everything works fine for you as the mount works fine for me (except under fstab for some reason). Don&#8217;t forget that by typing the command into the shell it will be stored in your history. If the password is sensitive I would recommend clearing out your history after mounting the share.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.tangorangers.com/2010/04/samba-cifs-through-ssh/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Project: SSHT</title>
		<link>http://blog.tangorangers.com/2009/11/project-ssht/</link>
		<comments>http://blog.tangorangers.com/2009/11/project-ssht/#comments</comments>
		<pubDate>Sat, 21 Nov 2009 06:05:14 +0000</pubDate>
		<dc:creator>DaijoubuKun</dc:creator>
				<category><![CDATA[Projects]]></category>
		<category><![CDATA[ssht]]></category>

		<guid isPermaLink="false">http://blog.tangorangers.com/?p=231</guid>
		<description><![CDATA[SSHT is also known as Secure SHell Tracker. Think of it like a tracker for your ssh connections. I wrote it a long time ago to help keep track of all my connections. It has evolved a bit since then. As of this writing I&#8217;m at version 1.3. I know this program (more of a [...]]]></description>
			<content:encoded><![CDATA[<p>SSHT is also known as Secure SHell Tracker. Think of it like a tracker for your ssh connections. I wrote it a long time ago to help keep track of all my connections. It has evolved a bit since then. As of this writing I&#8217;m at version 1.3. I know this program (more of a script right now) could be useful to many Linux admins. The problem? It is hard to find. I&#8217;m trying to get on the list at Google if you type &#8220;ssh tracker.&#8221; Unfortunately it only works if you type &#8220;SSHT&#8221; or &#8220;Secure shell tracker.&#8221; I hope in the future I can get this script out to the wild for everyone to enjoy. Check it out at <a href="http://www.tangorangers.com/projects/ssht.php">TangoRangers.com.</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.tangorangers.com/2009/11/project-ssht/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ShopSavvy, Compare Everywhere, and SnapTell for Android</title>
		<link>http://blog.tangorangers.com/2009/10/shopsavvy-compare-everywhere-and-snaptell-for-android/</link>
		<comments>http://blog.tangorangers.com/2009/10/shopsavvy-compare-everywhere-and-snaptell-for-android/#comments</comments>
		<pubDate>Thu, 15 Oct 2009 01:28:21 +0000</pubDate>
		<dc:creator>DaijoubuKun</dc:creator>
				<category><![CDATA[android]]></category>

		<guid isPermaLink="false">http://blog.tangorangers.com/?p=219</guid>
		<description><![CDATA[Some time ago I wrote that I was going to start writing regular reviews on cool apps for Android. Well I got side tracked. So today I&#8217;m going to talk about 3! ShopSavvy, Compate Everywhere, and SnapTell. ShopSavvy and Compare Everywhere use the phone&#8217;s camera to scan barecodes! It&#8217;s pretty cool. I have both simply [...]]]></description>
			<content:encoded><![CDATA[<p>Some time ago I wrote that I was going to start writing regular reviews on cool apps for Android. Well I got side tracked. So today I&#8217;m going to talk about 3! ShopSavvy, Compate Everywhere, and SnapTell.</p>
<p>ShopSavvy and Compare Everywhere use the phone&#8217;s camera to scan barecodes! It&#8217;s pretty cool. I have both simply because they both have their own different databases. For example, what I like to do is go to at my local super store and see what movies I would like. I always cringe when I see an older movie for $25 or more. That&#8217;s when I scan the barcode. Now I can see where to go to get the better deal. Keep in mind that the local portions don&#8217;t do very well all the time. This is by no fault of the program or it&#8217;s writers. It&#8217;s just the way things are.</p>
<p>Below are screen caps from both programs. Thinking back when I did those shots, I don&#8217;t know why I didn&#8217;t check the same product to see how the results differ.</p>
<p>First up, ShopSavvy. (Click on the picture to see the full size!)<br />
Picture Index:<br />
1. Main Screen.<br />
2. Scan the Barcode. See the Use Keyboard button. You can type in what you want to find!<br />
3. It found the book just fine.<br />
4. Two different local businesses were found.<br />
5. And a local map showing where to go.<br />
1<a href="http://www.tangorangers.com/files_blog/ShopSavy-Compare_Everywhere-and-SnapTell-for-Android/ShopSavvy_001.png"><img src="http://www.tangorangers.com/files_blog/ShopSavy-Compare_Everywhere-and-SnapTell-for-Android/thumb-ShopSavvy_001.png" alt="ShopSavy_1" /></a>&nbsp;&nbsp;2<a href="http://www.tangorangers.com/files_blog/ShopSavy-Compare_Everywhere-and-SnapTell-for-Android/ShopSavvy_002.png"><img src="http://www.tangorangers.com/files_blog/ShopSavy-Compare_Everywhere-and-SnapTell-for-Android/thumb-ShopSavvy_002.png" alt="ShopSavy_2" /></a>&nbsp;&nbsp;3<a href="http://www.tangorangers.com/files_blog/ShopSavy-Compare_Everywhere-and-SnapTell-for-Android/ShopSavvy_003.png"><img src="http://www.tangorangers.com/files_blog/ShopSavy-Compare_Everywhere-and-SnapTell-for-Android/thumb-ShopSavvy_003.png" alt="ShopSavy_3" /></a>&nbsp;&nbsp;4<a href="http://www.tangorangers.com/files_blog/ShopSavy-Compare_Everywhere-and-SnapTell-for-Android/ShopSavvy_004.png"><img src="http://www.tangorangers.com/files_blog/ShopSavy-Compare_Everywhere-and-SnapTell-for-Android/thumb-ShopSavvy_004.png" alt="ShopSavy_4" /></a>&nbsp;&nbsp;5<a href="http://www.tangorangers.com/files_blog/ShopSavy-Compare_Everywhere-and-SnapTell-for-Android/ShopSavvy_005.png"><img src="http://www.tangorangers.com/files_blog/ShopSavy-Compare_Everywhere-and-SnapTell-for-Android/thumb-ShopSavvy_005.png" alt="ShopSavy_5" /></a></p>
<p>Now I forgot to take a picture, but ShopSavvy will take you to the website where you can see more on the product and if you really want to you could buy it right away. That part is the same as the other programs.</p>
<p>Ok, so ShopSavvy is pretty cool. Now check out these pictures for Compare Everywhere:<br />
Picture Index:<br />
1. Main Screen<br />
2. Scan the Barcode<br />
3. Get your local and online store options.<br />
4. Just a scroll down from picture 3.<br />
5. Lets check these guys.<br />
6. Opened the browser and took me right there.<br />
1<a href="http://www.tangorangers.com/files_blog/ShopSavy-Compare_Everywhere-and-SnapTell-for-Android/Compare_Everywhere_001.png"><img src="http://www.tangorangers.com/files_blog/ShopSavy-Compare_Everywhere-and-SnapTell-for-Android/thumb-Compare_Everywhere_001.png" alt="Compare_Everywhere_1" /></a>&nbsp;&nbsp;2<a href="http://www.tangorangers.com/files_blog/ShopSavy-Compare_Everywhere-and-SnapTell-for-Android/Compare_Everywhere_002.png"><img src="http://www.tangorangers.com/files_blog/ShopSavy-Compare_Everywhere-and-SnapTell-for-Android/thumb-Compare_Everywhere_002.png" alt="Compare_Everywhere_2" /></a>&nbsp;&nbsp;3<a href="http://www.tangorangers.com/files_blog/ShopSavy-Compare_Everywhere-and-SnapTell-for-Android/Compare_Everywhere_003.png"><img src="http://www.tangorangers.com/files_blog/ShopSavy-Compare_Everywhere-and-SnapTell-for-Android/thumb-Compare_Everywhere_003.png" alt="Compare_Everywhere_3" /></a>&nbsp;&nbsp;4<a href="http://www.tangorangers.com/files_blog/ShopSavy-Compare_Everywhere-and-SnapTell-for-Android/Compare_Everywhere_004.png"><img src="http://www.tangorangers.com/files_blog/ShopSavy-Compare_Everywhere-and-SnapTell-for-Android/thumb-Compare_Everywhere_004.png" alt="Compare_Everywhere_4" /></a>&nbsp;&nbsp;5<a href="http://www.tangorangers.com/files_blog/ShopSavy-Compare_Everywhere-and-SnapTell-for-Android/Compare_Everywhere_005.png"><img src="http://www.tangorangers.com/files_blog/ShopSavy-Compare_Everywhere-and-SnapTell-for-Android/thumb-Compare_Everywhere_005.png" alt="Compare_Everywhere_5" /></a>&nbsp;&nbsp;6<a href="http://www.tangorangers.com/files_blog/ShopSavy-Compare_Everywhere-and-SnapTell-for-Android/Compare_Everywhere_006.png"><img src="http://www.tangorangers.com/files_blog/ShopSavy-Compare_Everywhere-and-SnapTell-for-Android/thumb-Compare_Everywhere_006.png" alt="Compare_Everywhere_6" /></a>&nbsp;&nbsp;</p>
<p>Not to bad so far right? Now I want to talk about SnapTell. If my memory serves me well, this app was originally written for the iphone, but it&#8217;s the same thing in the end. The difference here is that you take a picture of the movie, book, or what ever, and SnapTell tries the find you a match. As you will see in the pictures below, I took an alright picture of the book and SnapTell still figured it out very quickly.</p>
<p>Picture Index:<br />
1. The picture I took (This is an awesome book).<br />
2. The results.<br />
3. Took me right to the website I wanted.<br />
1<a href="http://www.tangorangers.com/files_blog/ShopSavy-Compare_Everywhere-and-SnapTell-for-Android/SnapTell_001.png"><img src="http://www.tangorangers.com/files_blog/ShopSavy-Compare_Everywhere-and-SnapTell-for-Android/thumb-SnapTell_001.png" alt="SnapTell_1" /></a>&nbsp;&nbsp;2<a href="http://www.tangorangers.com/files_blog/ShopSavy-Compare_Everywhere-and-SnapTell-for-Android/SnapTell_002.png"><img src="http://www.tangorangers.com/files_blog/ShopSavy-Compare_Everywhere-and-SnapTell-for-Android/thumb-SnapTell_002.png" alt="SnapTell_2" /></a>&nbsp;&nbsp;3<a href="http://www.tangorangers.com/files_blog/ShopSavy-Compare_Everywhere-and-SnapTell-for-Android/SnapTell_003.png"><img src="http://www.tangorangers.com/files_blog/ShopSavy-Compare_Everywhere-and-SnapTell-for-Android/thumb-SnapTell_003.png" alt="SnapTell_3" /></a></p>
<p>As you can see, all three of these programs are very cool. I use them quite often. Did you find an app like these and really like it? Let me know so I can share the information.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.tangorangers.com/2009/10/shopsavvy-compare-everywhere-and-snaptell-for-android/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

