<?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>Jon Chin</title>
	<atom:link href="http://otherchin.com/blog/feed/" rel="self" type="application/rss+xml" />
	<link>http://otherchin.com/blog</link>
	<description>Your other chin</description>
	<lastBuildDate>Wed, 27 Mar 2013 08:30:01 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.5.1</generator>
		<item>
		<title>How to give Google Analytics access for only single websites</title>
		<link>http://otherchin.com/blog/2013/03/how-to-give-google-analytics-access-for-only-single-websites/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=how-to-give-google-analytics-access-for-only-single-websites</link>
		<comments>http://otherchin.com/blog/2013/03/how-to-give-google-analytics-access-for-only-single-websites/#comments</comments>
		<pubDate>Wed, 27 Mar 2013 08:26:16 +0000</pubDate>
		<dc:creator>jon</dc:creator>
				<category><![CDATA[development]]></category>
		<category><![CDATA[software]]></category>
		<category><![CDATA[Google Analytics]]></category>

		<guid isPermaLink="false">http://otherchin.com/blog/?p=276</guid>
		<description><![CDATA[In a previous post, I talked about how to transfer a Google Analytics account from one User Account to another. It&#8217;s not possible to transfer Properties in an account without transferring ALL of the Properties in the account. In this post I&#8217;ll talk about what you should do if you have Properties in the account [...]]]></description>
				<content:encoded><![CDATA[<p>In a <a href="http://otherchin.com/blog/2013/03/how-to-transfer-google-analytics-account-without-losing-data/" title="How to transfer Google Analytics account without losing data">previous post</a>, I talked about how to transfer a Google Analytics account from one User Account to another.  It&#8217;s not possible to transfer Properties in an account without transferring ALL of the Properties in the account.  In this post I&#8217;ll talk about what you should do if you have Properties in the account that you don&#8217;t want to transfer.</p>
<p>What we&#8217;ll do is just give the user non-administrator access to the analytics.  This isn&#8217;t ideal, but it&#8217;s the best we can do.  Here&#8217;s how:</p>
<ol>
<li>Log in to Google Analytics.</li>
<li>Click the &#8220;Admin&#8221; button at the top-right.</li>
<li>Click the Account the website belongs to.</li>
<li>Click the Property you want to give access to.  If you skip this step, you&#8217;ll probably do something you didn&#8217;t want to</li>
<li>Click the Profile (or &#8220;All Web Site Data&#8221;) that you want to give access to.</li>
<li>Click on the &#8220;Users&#8221; tab</li>
<li>Click &#8220;+ New User&#8221;</li>
<li>Enter the person&#8217;s email address and select &#8220;User&#8221; as the role.</li>
</ol>
<p>The next time they log in they&#8217;ll be able to see the data for that website only and none of the other websites that you have in your Account.  Like I said earlier, this has some drawbacks in that you are still the admin and could revoke their access at any time.  I recommend that the new owner create a new Account/Property/Profile in their own Google Analytics account and change all of the analytics codes in their website to the new code.  With this method, they&#8217;ll have full control of their analytics, but still have access to the historical data.</p>
]]></content:encoded>
			<wfw:commentRss>http://otherchin.com/blog/2013/03/how-to-give-google-analytics-access-for-only-single-websites/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>How to transfer Google Analytics account without losing data</title>
		<link>http://otherchin.com/blog/2013/03/how-to-transfer-google-analytics-account-without-losing-data/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=how-to-transfer-google-analytics-account-without-losing-data</link>
		<comments>http://otherchin.com/blog/2013/03/how-to-transfer-google-analytics-account-without-losing-data/#comments</comments>
		<pubDate>Wed, 27 Mar 2013 08:21:10 +0000</pubDate>
		<dc:creator>jon</dc:creator>
				<category><![CDATA[development]]></category>
		<category><![CDATA[software]]></category>
		<category><![CDATA[Google Analytics]]></category>

		<guid isPermaLink="false">http://otherchin.com/blog/?p=267</guid>
		<description><![CDATA[It is possible to transfer Google Analytics accounts from one user account to another. This is important, because when somebody takes ownership of a website they won&#8217;t want to lose that valuable analytics data. First, let&#8217;s go over some terminology. Since there&#8217;s a deep hierarchy, it&#8217;s important to know what&#8217;s what. Throughout this article, I&#8217;ll [...]]]></description>
				<content:encoded><![CDATA[<p>It is possible to transfer Google Analytics accounts from one user account to another. This is important, because when somebody takes ownership of a website they won&#8217;t want to lose that valuable analytics data.</p>
<p>First, let&#8217;s go over some terminology. Since there&#8217;s a deep hierarchy, it&#8217;s important to know what&#8217;s what. Throughout this article, I&#8217;ll capitalize these terms so they&#8217;re easier to identify.</p>
<ul>
<li><strong>User Account</strong> &#8211; This is your Google account.</li>
<li><strong>Account</strong> &#8211; This is the account that you will be transferring.</li>
<li><strong>Property</strong> &#8211; This is the website.</li>
<li><strong>Profile</strong> &#8211; This is a view of your analytics data.</li>
</ul>
<p><a href="http://otherchin.com/blog/wp-content/uploads/2013/03/terminology.png"><img src="http://otherchin.com/blog/wp-content/uploads/2013/03/terminology-500x220.png" alt="Google Analytics account terminology" width="500" height="220" class="alignnone size-medium wp-image-273" /></a><br />
View your accounts by logging in to Google Analytics and clicking the home button.  In this screenshot, I&#8217;ve circled an Account that has one Property that has one Profile. You might have multiple items.</p>
<p>You will be transferring the <strong>entire</strong> account, along with all properties that belong to it. If you see websites listed in that account that you do not want to transfer, you shouldn&#8217;t proceed with this tutorial! There is no way to split them up.  I wrote a <a href="http://otherchin.com/blog/2013/03/how-to-give-google-analytics-access-for-only-single-websites/" title="How to give Google Analytics access for only single websites">separate post</a> for what you should do in this case.</p>
<p>If everything beneath the Account is okay to transfer, follow these steps:</p>
<ol>
<li>Click the &#8220;Admin&#8221; button at the top-right.</li>
<li>From the list click the account you want to transfer.</li>
<li>Click the &#8220;Users&#8221; tab.</li>
<li>Click the &#8220;+ New User&#8221; button.</li>
<li>Enter the new user&#8217;s email address, select &#8220;Administrator&#8221; for the role, and then check &#8220;Add User&#8221;.</li>
</ol>
<p>That&#8217;s it!  If all went well, when the new user logs in to Google Analytics, they will see the account and all of the data.  After they&#8217;ve confirmed that it&#8217;s all working, for security they should remove your email on that same &#8220;Users&#8221; tab.</p>
]]></content:encoded>
			<wfw:commentRss>http://otherchin.com/blog/2013/03/how-to-transfer-google-analytics-account-without-losing-data/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Checklist for transferring a website</title>
		<link>http://otherchin.com/blog/2013/02/checklist-for-transferring-a-website/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=checklist-for-transferring-a-website</link>
		<comments>http://otherchin.com/blog/2013/02/checklist-for-transferring-a-website/#comments</comments>
		<pubDate>Thu, 28 Feb 2013 00:46:42 +0000</pubDate>
		<dc:creator>jon</dc:creator>
				<category><![CDATA[development]]></category>
		<category><![CDATA[software]]></category>
		<category><![CDATA[transfer]]></category>
		<category><![CDATA[website]]></category>

		<guid isPermaLink="false">http://otherchin.com/blog/?p=253</guid>
		<description><![CDATA[There&#8217;s a lot of stuff to do when transferring a website, so I compiled a list of things to not forget. This list takes the point of view of transferring a website that was purchased from somebody else, although a lot of the items still apply. Initiate the domain transfer. Each registrar has a slightly [...]]]></description>
				<content:encoded><![CDATA[<p>There&#8217;s a lot of stuff to do when transferring a website, so I compiled a list of things to not forget.  This list takes the point of view of transferring a website that was purchased from somebody else, although a lot of the items still apply.</p>
<ol>
<li><strong>Initiate the domain transfer.</strong>  Each registrar has a slightly different process, so check with them to find out how to make the transfer.  This process takes at least five days, so I like to do this first.  If you want to minimize the total amount of time it takes for the complete site transfer, you should do this right after step 9.  The domain is one of the most important assets in a site purchase, so I prefer to do this first-thing.</li>
<li><strong>Set up the web host that the site will be moving to.</strong>  I use <a href="http://secure.hostgator.com/~affiliat/cgi-bin/affiliates/clickthru.cgi?id=jchin" title="HostGator" target="_blank">HostGator</a>, which has been a pretty good PHP/WordPress host.  I have a reseller account so all of my websites are completely sectored off from each other.  This makes managing the sites very clean and easy.</li>
<li><strong>Transfer the files from the old host to the new host.</strong></li>
<li><strong>Transfer all the databases (if any) from the old host to the new host.</strong></li>
<li><strong>Transfer all email accounts from the old host to the new host.</strong>  If applicable, transfer ownership of the Google Apps account.</li>
<li><strong>Set up AdSense for the new site.</strong>  Remember to create ad units for all ads on the site and to update all ad codes.  Also, create AdSense custom channels.</li>
<li><strong>Transfer ownership of Google Analytics account or set up a new account.</strong>  Remember to update the Analytics code if you&#8217;ve set up a new account.</li>
<li><strong>Test the new website and fix any issues.</strong>  You can hard-code the domain and IP in your computer&#8217;s hosts file so you can see the new site without the rest of the world seeing it.  Just remember to remove it when you&#8217;re done!</li>
<li><strong>Change the DNS for the domain to point to the DNS servers of the new host</strong></li>
<li><strong>Transfer ownership of Facebook, Twitter, and all other social media accounts.</strong></li>
</ol>
]]></content:encoded>
			<wfw:commentRss>http://otherchin.com/blog/2013/02/checklist-for-transferring-a-website/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Sorting objects by django-secretballot votes</title>
		<link>http://otherchin.com/blog/2013/01/sorting-objects-by-django-secretballot-votes/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=sorting-objects-by-django-secretballot-votes</link>
		<comments>http://otherchin.com/blog/2013/01/sorting-objects-by-django-secretballot-votes/#comments</comments>
		<pubDate>Wed, 16 Jan 2013 17:38:08 +0000</pubDate>
		<dc:creator>jon</dc:creator>
				<category><![CDATA[development]]></category>
		<category><![CDATA[django]]></category>
		<category><![CDATA[django-secretballot]]></category>
		<category><![CDATA[python]]></category>

		<guid isPermaLink="false">http://otherchin.com/blog/?p=244</guid>
		<description><![CDATA[Sorting objects rated using django-secretballot is a little tricky. Simply using order_by causes duplicates. There&#8217;s even a warning about it in the Django manual for QuerySet. I figured out how to rank the objects and avoid duplicates. It&#8217;s not that elegant, so if you have a better solution I&#8217;d love to hear it. from django.db.models [...]]]></description>
				<content:encoded><![CDATA[<p>Sorting objects rated using django-secretballot is a little tricky. Simply using order_by causes duplicates. There&#8217;s even a warning about it in the <a title="distinct()" href="https://docs.djangoproject.com/en/dev/ref/models/querysets/#distinct" target="_blank">Django manual for QuerySet</a>.</p>
<p>I figured out how to rank the objects and avoid duplicates.  It&#8217;s not that elegant, so if you have a better solution I&#8217;d love to hear it.<br />
<code><br />
from django.db.models import Sum</p>
<p>photo_list = Photo.objects.annotate(total_votes=Sum('votes')).order_by('-total_votes')<br />
</code></p>
]]></content:encoded>
			<wfw:commentRss>http://otherchin.com/blog/2013/01/sorting-objects-by-django-secretballot-votes/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Creating a Linux VirtualBox share</title>
		<link>http://otherchin.com/blog/2013/01/creating-a-linux-virtualbox-share/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=creating-a-linux-virtualbox-share</link>
		<comments>http://otherchin.com/blog/2013/01/creating-a-linux-virtualbox-share/#comments</comments>
		<pubDate>Wed, 09 Jan 2013 23:06:48 +0000</pubDate>
		<dc:creator>jon</dc:creator>
				<category><![CDATA[development]]></category>
		<category><![CDATA[share]]></category>
		<category><![CDATA[shared]]></category>
		<category><![CDATA[Ubuntu]]></category>
		<category><![CDATA[VirtualBox]]></category>

		<guid isPermaLink="false">http://otherchin.com/blog/?p=241</guid>
		<description><![CDATA[I use a GUI-less Linux VirtualBox VM for development. I needed an easy way to transfer files back and forth. Seeing as this is the third time I needed to set this up, I figured I should document the steps. Install VirtualBox Guest Additions on the Linux VM On the host VM, click &#8220;Devices&#8221;-&#62;&#8221;Install Guest [...]]]></description>
				<content:encoded><![CDATA[<p>I use a GUI-less Linux VirtualBox VM for development. I needed an easy way to transfer files back and forth. Seeing as this is the third time I needed to set this up, I figured I should document the steps.</p>
<ol>
<li>Install VirtualBox Guest Additions on the Linux VM
<ul>
<li>On the host VM, click &#8220;Devices&#8221;-&gt;&#8221;Install Guest Additions&#8221;</li>
<li>cd /media/cdrom</li>
<li>sudo mount /dev/cdrom /media/cdrom</li>
<li>sudo ./VBoxLinuxAdditions.run</li>
</ul>
</li>
<li>Create the shared folder
<ul>
<li>Open the host VM settings</li>
<li>Click &#8220;Shared Folders&#8221;</li>
<li>Click the icon with the plus sign to add a share</li>
<li>Select the path on your host system that you want to designate as the commonly shared directory</li>
<li>Check &#8220;Auto-mount&#8221; and &#8220;Make Permanent&#8221;</li>
<li>Click &#8220;OK&#8221; to save the share</li>
</ul>
</li>
<li>Add your user to the group so you can access the share
<ul>
<li>useradd -a -G vboxsf [username]</li>
<li>Reboot</li>
</ul>
</li>
</ol>
<p>After you do these steps, your share will be available on your host operating system and your Linux guest operating system (and will be there on reboot).  You can find the share on your Linux system at /media/sf_shared .</p>
]]></content:encoded>
			<wfw:commentRss>http://otherchin.com/blog/2013/01/creating-a-linux-virtualbox-share/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Put birthdays on your Google Calendar</title>
		<link>http://otherchin.com/blog/2010/10/put-birthdays-on-your-google-calendar/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=put-birthdays-on-your-google-calendar</link>
		<comments>http://otherchin.com/blog/2010/10/put-birthdays-on-your-google-calendar/#comments</comments>
		<pubDate>Mon, 11 Oct 2010 00:22:57 +0000</pubDate>
		<dc:creator>jon</dc:creator>
				<category><![CDATA[software]]></category>
		<category><![CDATA[birthday]]></category>
		<category><![CDATA[calendar]]></category>
		<category><![CDATA[Google]]></category>

		<guid isPermaLink="false">http://blog.boogly.net/?p=230</guid>
		<description><![CDATA[Ever since I first got into PDAs back in 2000, it&#8217;s been really important to me to be able to keep track of my contacts&#8217; birthdays. When I got my Pocket PC (basically Windows for PDAs), I loved that it automatically placed birthdays on my calendar. But since then, I haven&#8217;t had a solution that [...]]]></description>
				<content:encoded><![CDATA[<p>Ever since I first got into PDAs back in 2000, it&#8217;s been really important to me to be able to keep track of my contacts&#8217; birthdays.  When I got my Pocket PC (basically Windows for PDAs), I loved that it automatically placed birthdays on my calendar.  But since then, I haven&#8217;t had a solution that would flawlessly do this.</p>
<p>Today, I discovered that Google Calendar does this exact thing!  And since I sync my calendar with my Android phone, I get the birthdays placed on my phone&#8217;s calendar too.  I absolutely love this feature, but it&#8217;s sort of obscure to get to.  There are instructions on how to do it at <a href="http://www.nicholasoverstreet.com/2010/03/android-contacts-birthdays-in-your-calendar/">Nicholas Overstreet</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://otherchin.com/blog/2010/10/put-birthdays-on-your-google-calendar/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Be up-front and filter quickly when outsourcing your work</title>
		<link>http://otherchin.com/blog/2010/09/be-up-front-and-filter-quickly-when-outsourcing-your-work/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=be-up-front-and-filter-quickly-when-outsourcing-your-work</link>
		<comments>http://otherchin.com/blog/2010/09/be-up-front-and-filter-quickly-when-outsourcing-your-work/#comments</comments>
		<pubDate>Thu, 23 Sep 2010 06:23:58 +0000</pubDate>
		<dc:creator>jon</dc:creator>
				<category><![CDATA[GrabContent]]></category>
		<category><![CDATA[startup]]></category>
		<category><![CDATA[jobs]]></category>
		<category><![CDATA[outsourcing]]></category>

		<guid isPermaLink="false">http://blog.boogly.net/?p=227</guid>
		<description><![CDATA[One of the critical parts of outsourcing is selecting who to hire. At GrabContent, we get 50-70 applicants for a single job posting. It&#8217;s important to decide up front what is important to your business. Doing so will set you up for finding the best match as well as help you avoid wasting precious time. [...]]]></description>
				<content:encoded><![CDATA[<p>One of the critical parts of outsourcing is selecting who to hire.  At <a href="http://grabcontent.com">GrabContent</a>, we get 50-70 applicants for a single job posting.  It&#8217;s important to decide up front what is important to your business.  Doing so will set you up for finding the best match as well as help you avoid wasting precious time.</p>
<p>Before you even fire up the computer, decide on the 3-5 most important attributes of a successful worker in your business.  You will attract better matches when your job listing describes what is important in a new recruit.  It will also help make filtering through all the applicants significantly easier.</p>
<p>Especially in today&#8217;s economy, you&#8217;ll no doubt have a lot of people respond to your job opportunity.  You need to remember all along the way the things that matter most to your business.  One of the things that is important for us is that our writers pay extremely close attention to detail.  When we create a job listing, we state in the first sentence that that&#8217;s what we&#8217;re looking for.  Then we proceed to state the exact steps that they need to take to be considered.  It always surprises me at how many people don&#8217;t follow our directions, even when we&#8217;ve stated in the first sentence that we won&#8217;t consider anybody who doesn&#8217;t follow all the directions.  Because we embed a test into the application process, we&#8217;re able to weed out in just a matter of seconds about 80% of the applicants.</p>
<p>Be up front with your applicants.  For me this means highlighting the advantages of working with your company as well as disclosing the significant disadvantages.  Although some might not agree, I like to state a salary range directly in the job posting and outline what it takes to get raises.  Sure, this gives the other person a slight advantage in negotiations, but it also reduces the time spent on back-and-forth on every project.  This will allow you both to spend more time on what matters most&#8211;your product.</p>
]]></content:encoded>
			<wfw:commentRss>http://otherchin.com/blog/2010/09/be-up-front-and-filter-quickly-when-outsourcing-your-work/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>GrabContent&#8211;when you need quality writing fast</title>
		<link>http://otherchin.com/blog/2010/08/grabcontent-when-you-need-quality-writing-fast/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=grabcontent-when-you-need-quality-writing-fast</link>
		<comments>http://otherchin.com/blog/2010/08/grabcontent-when-you-need-quality-writing-fast/#comments</comments>
		<pubDate>Wed, 25 Aug 2010 02:39:31 +0000</pubDate>
		<dc:creator>jon</dc:creator>
				<category><![CDATA[GrabContent]]></category>
		<category><![CDATA[startup]]></category>
		<category><![CDATA[articles]]></category>
		<category><![CDATA[seo]]></category>
		<category><![CDATA[writing]]></category>

		<guid isPermaLink="false">http://blog.boogly.net/?p=222</guid>
		<description><![CDATA[I&#8217;ll be honest&#8211;I haven&#8217;t been writing here as often as I&#8217;d like. Things have gotten busy with my job and all of the little projects I&#8217;ve been working on. But as of this post, I vow to do better! Back in February, my friend and I started a business that we named GrabContent. In a [...]]]></description>
				<content:encoded><![CDATA[<p>I&#8217;ll be honest&#8211;I haven&#8217;t been writing here as often as I&#8217;d like.  Things have gotten busy with my job and all of the little projects I&#8217;ve been working on.  But as of this post, I vow to do better!</p>
<p>Back in February, my friend and I started a business that we named <a href="http://grabcontent.com">GrabContent</a>.  In a nutshell, we create custom, search engine optimized articles in order to help our customers improve their websites&#8217; organic traffic.  You&#8217;re probably wondering why we&#8217;re doing this and how we plan to compete against the jillions of other writers in the world.  The current problem is that it takes quite a bit of turnaround time when you need large numbers of articles, and you don&#8217;t want to sacrifice the quality of the writing.  We&#8217;ve got a few tricks up our sleeves to solve these problems without charging more.</p>
<p>I won&#8217;t reveal our secret sauce, but in the next few blog posts, I&#8217;ll talk about some of the things we&#8217;ve learned along the way.  I&#8217;m hoping to be able to talk about how to select writers, what writers can improve on, and how we&#8217;re managing our technology back end.</p>
]]></content:encoded>
			<wfw:commentRss>http://otherchin.com/blog/2010/08/grabcontent-when-you-need-quality-writing-fast/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>LMGTFY now for 64 bit Linux</title>
		<link>http://otherchin.com/blog/2010/03/lmgtfy-now-for-64-bit-linux/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=lmgtfy-now-for-64-bit-linux</link>
		<comments>http://otherchin.com/blog/2010/03/lmgtfy-now-for-64-bit-linux/#comments</comments>
		<pubDate>Thu, 11 Mar 2010 08:39:01 +0000</pubDate>
		<dc:creator>jon</dc:creator>
				<category><![CDATA[development]]></category>
		<category><![CDATA[software]]></category>
		<category><![CDATA[64-bit]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[lmgtfy]]></category>
		<category><![CDATA[pidgin]]></category>
		<category><![CDATA[stfw]]></category>

		<guid isPermaLink="false">http://blog.boogly.net/?p=213</guid>
		<description><![CDATA[A few months ago, I did a build of the STFW Pidgin plugin for Windows. Recently I started using Ubuntu but found that STFW didn&#8217;t work on my system. So I did a 64-bit build of the plugin for Pidgin 2.6.x. Here it is! To install, just copy that file over to /usr/lib64/purple-2/ . If [...]]]></description>
				<content:encoded><![CDATA[<p>A few months ago, I did a build of the <a href="http://linuxandwhatever.wordpress.com/stfw-pidgin-plugin/">STFW</a> Pidgin plugin <a href="http://otherchin.com/blog/2009/09/lmgtfy-plugin-for-pidgin-in-windows/">for Windows</a>. Recently I started using Ubuntu but found that STFW didn&#8217;t work on my system. So I did a 64-bit build of the plugin for Pidgin 2.6.x. <a href="http://otherchin.com/blog/wp-content/uploads/2010/03/stfw.so">Here it is!</a></p>
<p>To install, just copy that file over to /usr/lib64/purple-2/ . If you don&#8217;t have root access, copy it to ~/.purple/plugins/ instead. Then restart Pidgin, enable the plugin, and you&#8217;re good to go!</p>
]]></content:encoded>
			<wfw:commentRss>http://otherchin.com/blog/2010/03/lmgtfy-now-for-64-bit-linux/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>CakePHP login form with password confirmation using Auth component</title>
		<link>http://otherchin.com/blog/2009/12/cakephp-login-form-with-password-confirmation-using-auth-component/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=cakephp-login-form-with-password-confirmation-using-auth-component</link>
		<comments>http://otherchin.com/blog/2009/12/cakephp-login-form-with-password-confirmation-using-auth-component/#comments</comments>
		<pubDate>Mon, 14 Dec 2009 18:59:33 +0000</pubDate>
		<dc:creator>jon</dc:creator>
				<category><![CDATA[development]]></category>
		<category><![CDATA[auth]]></category>
		<category><![CDATA[cakephp]]></category>

		<guid isPermaLink="false">http://blog.boogly.net/?p=199</guid>
		<description><![CDATA[Every time I start CakePHP project, I find that I&#8217;ve forgotten how to set up the user auth system of logins, creating accounts, etc. There seems to be only a few examples of it on the internet, so I thought I&#8217;d post up my solution. It uses the Auth component and follows normal user creation [...]]]></description>
				<content:encoded><![CDATA[<p>Every time I start CakePHP project, I find that I&#8217;ve forgotten how to set up the user auth system of logins, creating accounts, etc.  There seems to be only a few examples of it on the internet, so I thought I&#8217;d post up my solution.  It uses the <a href="http://api.cakephp.org/class/auth-component">Auth component</a> and follows normal user creation convention.  By &#8220;normal user creation convention,&#8221; I mean that you require an email address that&#8217;s used as the login name, a password field, a confirm-password field, and checks to make sure the passwords match.<span id="more-199"></span></p>
<p>First, create your db table:</p>
<pre><code>CREATE TABLE `users` (
  `id` int(11) unsigned NOT NULL auto_increment,
  `email` varchar(60) default NULL,
  `firstname` varchar(30) default NULL,
  `lastname` varchar(30) default NULL,
  `password` varchar(40) default NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8</code></pre>
<p>Next, create models/user.php and add validation definitions.  Modify the validation parameters as neede.  You&#8217;ll also need a function that checks whether the two password fields match.</p>
<pre><code>class User extends AppModel {
  var $name = 'User';
  var $useTable = 'users';


  var $validate = array(
    'email' => array(
      'kosher' => array(
        'rule' => 'email',
        'message' => 'Please make sure your email is entered correctly.'
      ),
      'unique' => array(
        'rule' => 'isUnique',
        'message' => 'An account with that email already exists.'
      ),
      'required' => array(
        'rule' => 'notEmpty',
        'message' => 'Please Enter your email.'
      )
    ),
    'passwd' => array(
      'min' => array(
        'rule' => array('minLength', 6),
        'message' => 'Usernames must be at least 6 characters.'
      ),
      'required' => array(
        'rule' => 'notEmpty',
        'message'=>'Please enter a password.'
      ),
    ),
    'passwd_confirm' => array(
      'required'=>'notEmpty',
      'match'=>array(
        'rule' => 'validatePasswdConfirm',
        'message' => 'Passwords do not match'
      )
    ),
    'firstname' => array(
      'required' => array(
        'rule' => 'notEmpty',
        'message'=>'Please enter your first name.'
      ),
      'max' => array(
        'rule' => array('maxLength', 30),
        'message' => 'First name must be fewer than 30 characters'
      )
    ),
    'lastname' => array(
      'required' => array(
        'rule' => 'notEmpty',
        'message' => 'Please enter your last name.'
      ),
      'max' => array(
        'rule' => array('maxLength', 30),
        'message' => 'Last name must be fewer than 30 characters'
      )
    )
  );

  function validatePasswdConfirm($data)
  {
    if ($this->data['User']['passwd'] !== $data['passwd_confirm'])
    {
      return false;
    }
    return true;
  }

  function beforeSave()
  {
    if (isset($this->data['User']['passwd']))
    {
      $this->data['User']['password'] = Security::hash($this->data['User']['passwd'], null, true);
      unset($this->data['User']['passwd']);
    }

    if (isset($this->data['User']['passwd_confirm']))
    {
      unset($this->data['User']['passwd_confirm']);
    }

    return true;
}

}</code></pre>
<p>Create the controllers/user_controller.php file:</p>
<pre><code>class UsersController extends AppController {
  var $name = 'Users';
  var $helpers = array('Html', 'Form');
  var $components = array('Auth');

  function beforeFilter() {
    $this->Auth->fields = array(
        'username' => 'email',
        'password' => 'password'
    );

    $this->Auth->allow('register');
  }

  function index() {

  }

  function login() {

  }

  function logout() {
    $this->redirect($this->Auth->logout());
  }

  function register() {
    if (!empty($this->data)) {
      $this->User->create();
      if($this->User->save($this->data))
      {
        $this->Session->setFlash("Account created!");
        $this->redirect('/');
      }
    }
  }

}</code></pre>
<p>Create the login.ctp view:</p>
<pre><code>$session->flash('auth');
echo $form->create('User', array('action' => 'login'));
echo $form->input('email');
echo $form->input('password');
echo $form->end('Login');
echo $html->link('Sign up', array('controller'=>'users', 'action'=>'register'));</code></pre>
<p>Create the register.ctp view:</p>
<pre><code>echo $form->create('User', array('action' => 'register'));
echo $form->input('email');
echo $form->input('firstname');
echo $form->input('lastname');
echo $form->input('passwd');
echo $form->input('passwd_confirm', array('type' => 'password'));
echo $form->submit();
echo $form->end();</code></pre>
<p>Notice that we named the field &#8220;passwd&#8221; and not &#8220;password&#8221;?  This is because Cake recognizes it as being a password and automatically hashes it.  Although you could set up your app this way, it makes it complicated to do validation on it.  Instead, we just use &#8220;passwd&#8221; and assign the value to &#8220;password&#8221; in our beforeSave function.</p>
<p>That&#8217;s it!  Your basic user login/registration should be working now.  Customize it according to your app&#8217;s needs.</p>
]]></content:encoded>
			<wfw:commentRss>http://otherchin.com/blog/2009/12/cakephp-login-form-with-password-confirmation-using-auth-component/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
	</channel>
</rss>

<!-- Performance optimized by W3 Total Cache. Learn more: http://www.w3-edge.com/wordpress-plugins/

Page Caching using disk: enhanced
Database Caching 4/12 queries in 0.129 seconds using disk: basic

 Served from: otherchin.com @ 2013-06-19 13:49:44 by W3 Total Cache -->