<?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>TrueJournals</title>
	<atom:link href="http://truejournals.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://truejournals.com</link>
	<description>College student; Engineer; Programmer; Nerd.</description>
	<lastBuildDate>Sun, 03 Mar 2013 19:33:40 +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>My First Open Source Library: libptp++</title>
		<link>http://truejournals.com/2013/03/03/my-first-open-source-library-libptp/</link>
		<comments>http://truejournals.com/2013/03/03/my-first-open-source-library-libptp/#comments</comments>
		<pubDate>Sun, 03 Mar 2013 19:33:40 +0000</pubDate>
		<dc:creator>TrueJournals</dc:creator>
				<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://truejournals.com/?p=769</guid>
		<description><![CDATA[I&#8217;ve been working on it for a while, but since I&#8217;ve made the code public, it&#8217;s time for an official announcement: libptp++ is ready! When working on my project for senior design, part of the challenge was being able to communicate with a Canon camera, and be able to send commands to CHDK.  There&#8217;s an [...]]]></description>
				<content:encoded><![CDATA[<p>I&#8217;ve been working on it for a while, but since I&#8217;ve made the code public, it&#8217;s time for an official announcement: <a href="https://github.com/TrueJournals/libptp--" target="_blank">libptp++</a> is ready!</p>
<p>When working on my project for senior design, part of the challenge was being able to communicate with a Canon camera, and be able to send commands to <a href="http://chdk.wikia.com" target="_blank">CHDK</a>.  There&#8217;s an <a href="https://code.google.com/p/pyptp2/" target="_blank">excellent python library</a> that does the job, but running on the Raspberry Pi, it was really slow.  After doing some more benchmarking and testing, I determined that Python was just going to be slow on the Raspberry Pi, and it was time to move on to a different language.</p>
<p>I decided to pick C++ for a few reasons:</p>
<ol>
<li><span style="line-height: 13px;">It&#8217;s just about as fast as you can get.  I&#8217;m sure there are people who will say that it&#8217;s not quite as fast as C, but it&#8217;s going to be pretty close.  Having a compiled language is much faster than any interpreted language.</span></li>
<li>It&#8217;s object-oriented.  I felt that pyptp2 had a great API, and was already accustomed to using it.  With an object-oriented language, I could simply implement this existing API.  I also feel that objects provide great assistance to the programmer.</li>
<li>I wanted to.  I&#8217;ve been wanting to get into C++ and see what the syntax is like and what it&#8217;s capable of, but haven&#8217;t had a good chance to.  This provided me this opportunity.</li>
</ol>
<p>So, I started work on building a PTP library in C++.  I&#8217;ll note here that there IS <a href="http://libptp.sourceforge.net/" target="_blank">a PTP library in C</a>.  However, I had a lot of trouble figuring out how to use this library (it&#8217;s heavily tied in to the ptpcam program it comes with), and all CHDK extensions I could find were poorly documented, and, again, tied heavily to some other program.</p>
<p>Having said all that, I&#8217;m very proud with where libptp++ is.  It&#8217;s as functionally complete as I need it for my senior design project, but I&#8217;m still working on expanding it.  The CHDKCamera class it provides is mostly complete, but the PTPCamera (for camera&#8217;s that don&#8217;t or can&#8217;t run CHDK) is unimplemented.  Going forward, I&#8217;ll need to look into what functionality that class will need to provide.</p>
<p>I&#8217;ll also note that I did my best to document everything using <a href="http://doxygen.org/" target="_blank">Doxygen</a> strings.  One of my complaints about libptp2 is that it&#8217;s poorly documented, so I don&#8217;t want to run into the same trap.  Run libptp++ through Doxygen and you&#8217;ll get some wonderful documentation.  There&#8217;s even an example included in there!</p>
<p>I&#8217;m releasing this code under the LGPLv3.  Basically, this means (to my understanding) that you can use it however you want, as long as you release the source code.  Additionally, the LGPL allows this library to be included in commercial products.  Again, though, the source code must be provided.</p>
<p>I hope someone else can get some use out of this library!  It&#8217;s certainly not perfect, but its current state is a good start.  I encourage anyone that finds a bug to file an issue on GitHub, or fork the project, fix the bug and send in a pull request!</p>
<p><a href="https://github.com/TrueJournals/libptp--" target="_blank">https://github.com/TrueJournals/libptp&#8211;</a></p>
]]></content:encoded>
			<wfw:commentRss>http://truejournals.com/2013/03/03/my-first-open-source-library-libptp/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Google Drive Form Report Generation</title>
		<link>http://truejournals.com/2013/01/22/google-drive-form-report-generation/</link>
		<comments>http://truejournals.com/2013/01/22/google-drive-form-report-generation/#comments</comments>
		<pubDate>Tue, 22 Jan 2013 06:10:26 +0000</pubDate>
		<dc:creator>TrueJournals</dc:creator>
				<category><![CDATA[programming]]></category>
		<category><![CDATA[drive]]></category>
		<category><![CDATA[forms]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[print]]></category>
		<category><![CDATA[report]]></category>

		<guid isPermaLink="false">http://truejournals.com/?p=761</guid>
		<description><![CDATA[Printing form responses in Google Drive is an awful experience. That&#8217;s a strong statement, but it&#8217;s the truth.  Forms in Google Drive are used for so much more than simply numerical responses, with some being used for surveys, sign ups, and other data that just doesn&#8217;t fit properly in a spreadsheet.  Yet, that&#8217;s the only [...]]]></description>
				<content:encoded><![CDATA[<p>Printing form responses in Google Drive is an awful experience.</p>
<p>That&#8217;s a strong statement, but it&#8217;s the truth.  Forms in Google Drive are used for so much more than simply numerical responses, with some being used for surveys, sign ups, and other data that just doesn&#8217;t fit properly in a spreadsheet.  Yet, that&#8217;s the only format Google presents this data in.  While spreadsheets are fantastic for numerical data analysis, they do little for analysis of open-ended survey responses.</p>
<p>And this statement even makes the assumption that you&#8217;re attempting to read the data off a computer screen.  Want to print out the data to keep a hard copy (or just to reduce eye strain from your computer&#8217;s back light)?  Forget it!  You can attempt to print the responses in landscape, but you&#8217;ll end up with an unorganized mess of papers which doesn&#8217;t really solve the original problem.</p>
<p>So, how can we get the data from the Form into a format that&#8217;s pleasant to read, and easy to print?  We use a script!</p>
<p>The Google Apps scripting engine is amazing.  I&#8217;ve previously used it to create rudimentary <a title="Conditional Formatting in Google Docs" href="http://truejournals.com/2012/06/05/conditional-formatting-in-google-docs/">conditional formatting in Google Docs</a>.  Now, I wanted to play around with it more and generate single page(-ish) reports of individual responses to a Google Drive Form.  I say &#8220;-ish&#8221;, because the script doesn&#8217;t guarantee a single page.  The end length is simply based on the response length and number of questions.</p>
<p>So, how do you use this script?  Just find it in the script gallery!  Searching for &#8220;Report Generator&#8221; should find the script and allow you to install it easily!  Once installed, a new menu &#8212; &#8220;Report Generation&#8221; will pop up on your spreadsheet.  Simply select the row you want to generate a report for, and choose &#8220;Generate Single Report&#8221; (or generate all at once!).  In a few moments, you&#8217;ll have a new folder in your document list, and a doc and/or PDF of the report.</p>
<p>The script has a few configurable options, which are for the most part self-explanatory.  I&#8217;m working on getting some documentation up at <a title="Form Report Generation Help" href="http://truejournals.com/form-report-generation-help">the script&#8217;s help page</a>, but that may take me some time.  I also plan on adding more features to the script: the ability to change the folder name, change the resulting document names, change the formatting of the output, etc.  I&#8217;ve never published a script to the gallery before, but I&#8217;m hoping I&#8217;ll just be able to update the script when I have new features ready.</p>
<p>So, if you&#8217;re looking for a good solution to printing out responses to Google Drive Forms, check out &#8220;Report Generator&#8221; in the script gallery!</p>
]]></content:encoded>
			<wfw:commentRss>http://truejournals.com/2013/01/22/google-drive-form-report-generation/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>&#8220;I&#8217;m always worried I&#8217;m going to blow something up&#8221;</title>
		<link>http://truejournals.com/2012/08/07/im-always-worried-im-going-to-blow-something-up/</link>
		<comments>http://truejournals.com/2012/08/07/im-always-worried-im-going-to-blow-something-up/#comments</comments>
		<pubDate>Tue, 07 Aug 2012 23:10:45 +0000</pubDate>
		<dc:creator>TrueJournals</dc:creator>
				<category><![CDATA[technology]]></category>
		<category><![CDATA[thoughts]]></category>
		<category><![CDATA[college]]></category>
		<category><![CDATA[helpdesk]]></category>
		<category><![CDATA[tech]]></category>
		<category><![CDATA[work]]></category>

		<guid isPermaLink="false">http://truejournals.com/?p=279</guid>
		<description><![CDATA[For the past two summers, I&#8217;ve worked at a level 1 tech support job at my college.  For those unfamiliar with this jargon, this means that I&#8217;m the person who sits at the help desk, and attempts to help out anyone who comes into the desk, or calls the phone, or e-mails us.  Technically speaking, [...]]]></description>
				<content:encoded><![CDATA[<p>For the past two summers, I&#8217;ve worked at a level 1 tech support job at my college.  For those unfamiliar with this jargon, this means that I&#8217;m the person who sits at the help desk, and attempts to help out anyone who comes into the desk, or calls the phone, or e-mails us.  Technically speaking, it&#8217;s a pretty simple job, as we do some basic troubleshooting, then bump any issues up to level 2 if we determine we need to fix something in person.</p>
<p>Today, I was on the phone with someone, and they inadvertently reminded me of the difference between &#8220;technical&#8221; people and &#8220;non-technical&#8221; people.</p>
<p>The phone call was simple: Gmail brought up a page reporting that the person&#8217;s browser was out of date because they were using Internet Explorer.  I suggested that he install Chrome, as it is a faster and more secure web browser, and now our &#8220;officially supported&#8221; browser, and proceeded to walk him through the installation.</p>
<p>And when I say walk him through the installation, I mean walk him through every step of the installation.  Every button he should click, when he should click them, etc.  During this process, he explained to me why he was asking for my help at every step of the process:</p>
<blockquote><p>I&#8217;m always worried I&#8217;m going to blow something up.</p></blockquote>
<p>So, this is the difference between &#8220;tech&#8221; people and &#8220;non-tech&#8221; people: the non-tech people think that if they click a wrong button, their computer will either explode, or stop working permanently.  The tech people have opened their computer to find that no explosives are contained within.</p>
<p>One of the things I enjoy doing is breaking my operating system.  I use Ubuntu Linux as my main operating system, and regularly do stupid things that might be considered destructive.  But that&#8217;s OK &#8212; I know that I can always get my data, and I enjoy going through the processes of figuring out what went wrong, and how to fix it.</p>
<p>In a word, I&#8217;m fearless when fixing computers: I know that if I click the wrong button, there&#8217;s always a way to go back or undo whatever I just did.  Sometimes, this is as simple as clicking a &#8220;back&#8221; or &#8220;undo&#8221; button.  Sometimes it&#8217;s a bit more involved, but that&#8217;s OK!  Because it means I&#8217;m going to learn what doesn&#8217;t work, and possibly learn something more about my operating system while I attempt to fix what&#8217;s broken.</p>
<p>If there&#8217;s one piece of advice I can give to non-tech people, it&#8217;s this: don&#8217;t be afraid to click buttons.  Seriously.  Most buttons you press are not going to permanently destroy your software.  If you&#8217;re worried about losing data, make a backup of whatever file you&#8217;re working, then click buttons to your hearts content!</p>
]]></content:encoded>
			<wfw:commentRss>http://truejournals.com/2012/08/07/im-always-worried-im-going-to-blow-something-up/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Google&#8217;s an ISP &#8212; Now what?</title>
		<link>http://truejournals.com/2012/07/27/googles-an-isp-now-what/</link>
		<comments>http://truejournals.com/2012/07/27/googles-an-isp-now-what/#comments</comments>
		<pubDate>Sat, 28 Jul 2012 01:59:43 +0000</pubDate>
		<dc:creator>TrueJournals</dc:creator>
				<category><![CDATA[thoughts]]></category>
		<category><![CDATA[comcast]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[Internet]]></category>
		<category><![CDATA[isp]]></category>

		<guid isPermaLink="false">http://truejournals.com/?p=277</guid>
		<description><![CDATA[As most people have probably heard by now, Google is a certified ISP.  Google will be providing Kansas City residents with a 1 Gbps fiber-to-the-home connection for $70/month.  Add TV to that service for an extra $50/month, and you get the most awesome Internet and TV bundle for $120/month.  Can&#8217;t afford that? Google&#8217;s even offering [...]]]></description>
				<content:encoded><![CDATA[<p>As most people have probably heard by now, <a title="Google Fiber" href="https://fiber.google.com/about/" target="_blank">Google is a certified ISP</a>.  Google will be providing Kansas City residents with a 1 Gbps fiber-to-the-home connection for $70/month.  Add TV to that service for an extra $50/month, and you get the most awesome Internet and TV bundle for $120/month.  Can&#8217;t afford that? Google&#8217;s even offering a 5 Mbps connection for <strong>free</strong> (after a $300 installation fee).  All of this makes Google possibly the best ISP in the nation.</p>
<p>But, as some have pointed out, <a href="http://gigaom.com/2012/07/26/the-economics-of-google-fiber-and-what-it-means-for-u-s-broadband/" target="_blank">Google isn&#8217;t doing so with a huge profit margin</a>.  It&#8217;s not that Google is losing money on this deal, per-say, but it doesn&#8217;t seem that they&#8217;re making enough profit to survive on this business alone.  Luckily, this isn&#8217;t a problem for Google, as they have plenty of other revenue streams.  But, it does lead to a question of Google&#8217;s true motivation in this move.</p>
<p>So, I offer here my theory: Google is becoming an ISP to put pressure on existing ISPs to upgrade their infrastructure to be able to provide cheaper and faster access.  Currently, there isn&#8217;t an ISP I&#8217;m aware of that can come close to the deal Google&#8217;s making in Kansas City for residential customers.  If Kansas Citians realize this, they&#8217;ll flock to Google, leaving bigger ISPs (Comcast? AT&amp;T?) in the dust.</p>
<p>Of course, as businesses, Comcast and AT&amp;T should do whatever they can to keep their customers.  At first, they might just offer to lower prices for customers that threaten to leave, but that really can&#8217;t maintain them long-term.  They will be forced to do something to remain competitive.  Especially if Google starts to move into other areas.</p>
<p>Remaining competitive will mean upgrading networks. That&#8217;s just a simple fact. The current residential Internet infrastructure just can&#8217;t compete with what Google&#8217;s offering.  And as long as things remain as they are, the major players have no motivation to put money into upgrading their networks.  I believe we&#8217;re seeing essentially the same thing with cell phone providers in the US: there isn&#8217;t enough competition to force true network infrastructure upgrades.</p>
<p>So, here&#8217;s my predictions for the next 10-20 years:</p>
<ul>
<li>Major ISPs in Kansas City will slowly start to upgrade their infrastructure and offer lower prices in order to compete with Google&#8217;s offering.</li>
<li>Google will start to move into/threaten to move into other areas.</li>
<li>Large ISPs will (and this might be very wishful thinking) learn from the Kansas City situation and per-emptively start upgrading their infrastructure across the nation.</li>
</ul>
<p>After all this happens, it doesn&#8217;t really matter if Google moves into other areas, or even continues to offer service.  The end result is that they&#8217;ve accomplished their goal, and that&#8217;s good for all of us.  If things proceed how I think they will, the US will see some major improvements in its residential Internet in the coming years.</p>
]]></content:encoded>
			<wfw:commentRss>http://truejournals.com/2012/07/27/googles-an-isp-now-what/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Building a Better WHD Notifier</title>
		<link>http://truejournals.com/2012/06/29/building-a-better-whd-notifier/</link>
		<comments>http://truejournals.com/2012/06/29/building-a-better-whd-notifier/#comments</comments>
		<pubDate>Fri, 29 Jun 2012 16:12:07 +0000</pubDate>
		<dc:creator>TrueJournals</dc:creator>
				<category><![CDATA[programming]]></category>
		<category><![CDATA[technology]]></category>
		<category><![CDATA[chrome]]></category>
		<category><![CDATA[extension]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[web help desk]]></category>
		<category><![CDATA[whd]]></category>

		<guid isPermaLink="false">http://truejournals.com/?p=271</guid>
		<description><![CDATA[At my work, we use Web Help Desk to track support tickets.  It&#8217;s a very nice, very slick piece of software, and from my understanding, version 10.2 implements an API going forward.  Unfortunately, we use version 10.1.10.1, which doesn&#8217;t have the same API. The problem I ran into was this: often, there are other tasks [...]]]></description>
				<content:encoded><![CDATA[<p>At my work, we use <a title="Web Help Desk" href="http://webhelpdesk.com">Web Help Desk</a> to track support tickets.  It&#8217;s a very nice, very slick piece of software, and from my understanding, version 10.2 implements an API going forward.  Unfortunately, we use version 10.1.10.1, which doesn&#8217;t have the same API.</p>
<p>The problem I ran into was this: often, there are other tasks to be completed, so I&#8217;m not just staring at the WHD ticket queue the entire time I&#8217;m at work.  However, if a client logs a ticket, I have no way of being notified without going to the web help desk page and checking manually.  This results in one of two things happening: either I check the ticket queue every few minutes, breaking my workflow on other projects, or a ticket doesn&#8217;t get responded to for a while.</p>
<p>I wanted a way to be notified of new or updated tickets that pop up without having to continually go back to the WHD tab of my browser to actually check for new or updated tickets.  Unfortunately, without an API, I thought this was going to be difficult.  Until I found this: <a title="WHD Notifier Chrome Extension" href="https://chrome.google.com/webstore/detail/dfijaohkokappmgggfcldmnepdpcalkm" target="_blank">a WHD Notifier for Chrome</a>.</p>
<p>However, this still didn&#8217;t quite achieve what I was looking for.  While this did provide me with a notification of the number of new or updated tickets within the browser, it didn&#8217;t <strong>notify</strong> me when this number changed. So, I still had to watch my web browser, and even then, continually check this small, inconspicuous number in the top-right corner of my screen.  Since Chrome extensions are simply Javascript, HTML and CSS, I decided to try my hand at modifying it to better suit my needs.</p>
<p>Here&#8217;s the list of things I needed:</p>
<ol>
<li>Pop-up notifications of a change in the number of new/updated tickets (like in Gmail).</li>
<li>The ability to <strong>not</strong> save username and password.  The computers share a single profile between multiple users, so I don&#8217;t want individual passwords saved past the browser session.</li>
<li>(Optional, if I could figure it out) Grabbing login info from the WHD web login, so you don&#8217;t have to go into the extension options every browser session.</li>
</ol>
<p>After some coding, a lot of trial and error, and a lot of research, I was able to meet all three goals. If you&#8217;d find it useful, you can <a title="WHD Notifier 1.5" href="http://truejournals.com/downloads/whd-notify.crx" target="_blank">download WHD Notifier version 1.5</a>.  Simply configure it with your WHD URL, choose what to display/be notified of, and you&#8217;re good to go.  If you login to web help desk, the notifier will grab that login information and start updating.</p>
<p>If you&#8217;re interested in seeing the source code for this extension, you can find <a href="http://truejournals.com/downloads/whd-notify-src.zip" target="_blank">a zip of the source here</a>.  I&#8217;ll see if I can throw it up on GitHub later today or this weekend.  There&#8217;s some interesting things being done here &#8212; submitting the login form in WHD sends a call to forms.submit() instead of going through the normal submit procedure &#8212; this means that I couldn&#8217;t simply add an onsubmit handler to capture the login information.</p>
<p>Instead, I inject another piece of JavaScript into the page which overrides the submit() method for all forms.  This calls chrome.extension.sendMessage to message the background page with the username and password, then proceeds to call the submit() method I had overridden.  You can find the form handling things in autoLogin.js and autoLogin2.js.  I had to inject autoLogin2.js on the page because chrome content scripts aren&#8217;t allowed to override prototype methods.</p>
<p>If we ever update our WHD installation, I&#8217;ll try to update this extension again to use the new API &#8212; I should be able to add some more features with that, too.  For now, this should work for all versions of WHD 10.0.8 or later.</p>
<p><strong>Update: </strong>Code is now <a title="whd-notifier repository on GitHub" href="https://github.com/TrueJournals/whd-notifier" target="_blank">on GitHub</a></p>
]]></content:encoded>
			<wfw:commentRss>http://truejournals.com/2012/06/29/building-a-better-whd-notifier/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Automatically Associating Label and Input, and Setting Width</title>
		<link>http://truejournals.com/2012/06/26/automatically-associating-label-and-input-and-setting-width/</link>
		<comments>http://truejournals.com/2012/06/26/automatically-associating-label-and-input-and-setting-width/#comments</comments>
		<pubDate>Tue, 26 Jun 2012 23:27:53 +0000</pubDate>
		<dc:creator>TrueJournals</dc:creator>
				<category><![CDATA[technology]]></category>
		<category><![CDATA[development]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[web]]></category>

		<guid isPermaLink="false">http://truejournals.com/?p=265</guid>
		<description><![CDATA[When creating forms in HTML, one of the best practices is to always use &#60;label&#62; to associate the labels with their form fields.  However, this creates the complication of needing to give each label the &#8220;for&#8221; attribute, and perhaps wanting some extra magic to set the width of each label so that all the form [...]]]></description>
				<content:encoded><![CDATA[<p>When creating forms in HTML, one of the best practices is to always use &lt;label&gt; to associate the labels with their form fields.  However, this creates the complication of needing to give each label the &#8220;for&#8221; attribute, and perhaps wanting some extra magic to set the width of each label so that all the form fields are lined up.  Recently, I decided to play around with form fields like this a little to see if I could automate this process using <a href="http://jquery.com">jQuery</a>.</p>
<p>Here&#8217;s what I came up with:</p>
<pre class="wp-code-highlight prettyprint">var w = 0;
$(&quot;label&quot;).each(function() {
    if($(this).width()&amp;gt;w) w=$(this).width();
    // Assume the input immediately follows the label
    var input = $(this).next();
    input.prop(&#039;id&#039;, input.prop(&#039;name&#039;));
    $(this).prop(&#039;for&#039;, input.prop(&#039;name&#039;));
});
$(&quot;label&quot;).width(w+10);
$(&quot;label&quot;).css(&#039;float&#039;, &#039;left&#039;);</pre>
<p>And here&#8217;s what it does: first, it loops through each label on the page looking for the maximum width.  When it finds that, it sets all labels to have a width of (maximum width)+10px. The extra 10px are just so the label and field aren&#8217;t directly on top of one another.</p>
<p>In the same loop, this code associates the label with the field next to it.  For my sake, I made the assumption that I will always have &lt;label&gt;&#8230;&lt;/label&gt;&lt;input /&gt;.  If this is not the case, the code will associate the label with the wrong field.  It simply sets the next element&#8217;s id to be the same as its name, and sets the label&#8217;s &#8220;for&#8221; property to be the element&#8217;s name, also.</p>
<p>Use this with caution. If you&#8217;re not careful, you could end up with duplicate IDs (a no-no).  There are other reasons this code isn&#8217;t necessarily a good idea, but it&#8217;s good enough for me.  For a page with a lazy HTML coder, this will work perfectly.</p>
<p><strong>Bonus:</strong> Add input.prop(&#8216;placeholder&#8217;, $(this).text()); inside the loop to also set the &#8220;placeholder&#8221; text to whatever the label is.  You could also detect if the browser supports &#8220;placeholder&#8221;, and hide the label if it does:</p>
<pre class="wp-code-highlight prettyprint">var w = 0;
$(&quot;label&quot;).each(function() {
	if($(this).width()&gt;w) w=$(this).width();
	// Assume the input immediately follows the label
	var input = $(this).next();
	input.prop(&#039;id&#039;, input.prop(&#039;name&#039;));
	input.prop(&#039;placeholder&#039;, $(this).text());
        if(&#039;placeholder&#039; in document.createElement(&#039;input&#039;)) $(this).hide();
	$(this).prop(&#039;for&#039;, input.prop(&#039;name&#039;));
});
$(&quot;label&quot;).width(w+10);
$(&quot;label&quot;).css(&#039;float&#039;, &#039;left&#039;);</pre>
]]></content:encoded>
			<wfw:commentRss>http://truejournals.com/2012/06/26/automatically-associating-label-and-input-and-setting-width/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Conditional Formatting in Google Docs</title>
		<link>http://truejournals.com/2012/06/05/conditional-formatting-in-google-docs/</link>
		<comments>http://truejournals.com/2012/06/05/conditional-formatting-in-google-docs/#comments</comments>
		<pubDate>Wed, 06 Jun 2012 04:23:02 +0000</pubDate>
		<dc:creator>TrueJournals</dc:creator>
				<category><![CDATA[technology]]></category>
		<category><![CDATA[coding]]></category>
		<category><![CDATA[google docs]]></category>

		<guid isPermaLink="false">http://truejournals.com/?p=259</guid>
		<description><![CDATA[Recently, I was working on a project which involved generating a spreadsheet of a bunch of changes I was making to some information.  As part of this, I wanted to color code the rows of the spreadsheet: green would mean OK, yellow would mean a change, and red would mean a problem.  I could do all this [...]]]></description>
				<content:encoded><![CDATA[<p>Recently, I was working on a project which involved generating a spreadsheet of a bunch of changes I was making to some information.  As part of this, I wanted to color code the rows of the spreadsheet: green would mean OK, yellow would mean a change, and red would mean a problem.  I could do all this formatting manually&#8230; but I decided to find a way to make Excel do it for me.  Enter conditional formatting!</p>
<p>Conditional formatting in Excel is very, <strong>very</strong> robust.  For this project, I needed to change a row&#8217;s background color and font color based on three possibilities:</p>
<ol>
<li>If Column E has any text, the row should be red.</li>
<li>If Column A and Column D contain different values (case-insensitive), the row should be yellow.</li>
<li>Otherwise, the row should be green.</li>
</ol>
<p>Unfortunately for me, Excel&#8217;s conditional formatting works on a per-cell basis.  However, Excel does provide the ability to choose conditional formats based on a formula!  After some fiddling with Excel functions, I was able to generate formulas to check different cells in the row, then apply the conditional formatting based on that.  I ended up with these three formulas, executed in this order, and corresponding with the above three conditions:</p>
<ol>
<li>=AND(CELL(&#8220;contents&#8221;, INDIRECT(CONCATENATE(&#8220;E&#8221;, ROW())))&gt;0,ROW()&gt;1)</li>
<li>=AND(CELL(&#8220;contents&#8221;, INDIRECT(CONCATENATE(&#8220;A&#8221;, ROW())))&lt;&gt;CELL(&#8220;contents&#8221;, INDIRECT(CONCATENATE(&#8220;D&#8221;, ROW()))), ROW()&gt;1)</li>
<li>=AND(CELL(&#8220;contents&#8221;, INDIRECT(CONCATENATE(&#8220;E&#8221;, ROW())))=0, CELL(&#8220;contents&#8221;, INDIRECT(CONCATENATE(&#8220;A&#8221;, ROW())))&gt;0)</li>
</ol>
<p>Wow!  First, notice all of these start with an AND function.  AND evaluates the conditions given, performs a logical AND on all of them, and returns a boolean true or false based on that.  Explanation of the conditions:</p>
<ol>
<li>Two conditions:</li>
<ul>
<li>CELL(&#8220;contents&#8221;, INDIRECT(CONCATENATE(&#8220;E&#8221;, ROW())))&gt;0 checks for text in Column E. If there is nothing in the cell, the value is 0.</li>
<li>ROW()&gt;1 checks if this cell is NOT in the first row.  The first row is my header row, and I don&#8217;t need that one color coded.</li>
</ul>
<li>Two conditions:</li>
<ul>
<li>CELL(&#8220;contents&#8221;, INDIRECT(CONCATENATE(&#8220;A&#8221;, ROW())))&lt;&gt;CELL(&#8220;contents&#8221;, INDIRECT(CONCATENATE(&#8220;D&#8221;, ROW()))) checks if the contents of the cell in Column A and the contents of the cell in Column D are different. The &lt;&gt; operator is &#8220;not equals&#8221;, and Excel seems to automatically do a case-insensitive comparison.</li>
<li>ROW()&gt;1 checks if this cell is NOT in the first row.</li>
</ul>
<li>Two conditions:</li>
<ul>
<li>CELL(&#8220;contents&#8221;, INDIRECT(CONCATENATE(&#8220;E&#8221;, ROW())))=0 ensures that Column E is empty. (Again, the value is 0 if there is nothing in the cell)</li>
<li>CELL(&#8220;contents&#8221;, INDIRECT(CONCATENATE(&#8220;A&#8221;, ROW())))&gt;0 ensures that there is some value in Column A. If there&#8217;s no value in Column A, there&#8217;s no point in any highlighting.</li>
</ul>
</ol>
<p>Alright&#8230; So, with all those conditions set up, text is automatically highlighted based on what values are entered. This made editing the spreadsheet really easy: simply type in values, and the highlighting is automatic. If I go back and change something later, the highlighting changes without me needing to do anything.<span id="more-259"></span></p>
<p>Next, however, I decided that it might be useful to bring this spreadsheet into Google Docs. This would allow me to easily share the document with my supervisor, and he can share it with the relevant people that need the information.  Upon importing the spreadsheet in Google Docs, my highlighting went away.  As it turns out, Google Docs does support conditional formatting, but <strong>not</strong> via a formula.</p>
<p>So, I now have two options: perform the highlighting manually (tedious), or figure out a workaround.  Since I enjoy tinkering out things, and I knew about the Google Apps scripting engine, I decided to see if I could figure out a workaround.  A lot of tinkering and documentation later, I have the following script:</p>
<pre class="wp-code-highlight prettyprint">function getTableRange(ss, activeSheet) {
  if(activeSheet == &quot;renaming&quot;) {
    return ss.getRange(&quot;A2:E&quot;+ss.getLastRow());
  } else {
    return null;
  }
}

function getColorsRenaming(cell1, cell4, cell5) {
  // Abstract this function out so we can easily add different colors if we want.
  var colors = new Array(2); // bgColor = colors[0], textColor = colors[1]

  if(cell5 != &quot;&quot;) {
    // &quot;Notes&quot; cell has a value -- red
    colors[0] = &quot;#ffc7ce&quot;;
    colors[1] = &quot;#9c0006&quot;;
  } else if(cell1 != cell4) {
    // Cell 1 and 4 contain different values -- yellow
    colors[0] = &quot;#ffeb9c&quot;;
    colors[1] = &quot;#9c6500&quot;;
  } else {
    // No notes and they&#039;re the same -- green!
    colors[0] = &quot;#c6efce&quot;;
    colors[1] = &quot;#006100&quot;;
  }

  return colors;
}

function firstRun() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var tableRange = getTableRange(ss);
  var bgColors = new Array(tableRange.getNumRows());
  var textColors = new Array(tableRange.getNumRows());
  for(var row = 0; row &amp;lt; tableRange.getNumRows(); row++) {
    bgColors[row] = new Array(tableRange.getNumColumns());
    textColors[row] = new Array(tableRange.getNumColumns());

    var bgColor = &quot;#FFFFFF&quot;;
    var textColor = &quot;#000000&quot;;

    var cell1 = tableRange.getCell(row+1, 1).getValue().toLowerCase();
    var cell4 = tableRange.getCell(row+1, 4).getValue().toLowerCase();
    var cell5 = tableRange.getCell(row+1, 5).getValue();

    var colors = getColorsRenaming(cell1, cell4, cell5);

    for(var col = 0; col &amp;lt; tableRange.getNumColumns(); col++) {
      bgColors[row][col] = colors[0];
      textColors[row][col] = colors[1];
    }
  }

  tableRange.setBackgroundColors(bgColors);
  tableRange.setFontColors(textColors);
}

function onEdit(event) {
  var ss = SpreadsheetApp.getActive();
  var editedCell = ss.getActiveCell();
  var editedRow = editedCell.getRow();

  var tableRange = getTableRange(ss, SpreadsheetApp.getActiveSheet().getName().toLowerCase());

  // editedRow-1 below because tableRange starts at row 2, but editedRow is absolute
  var cell1 = tableRange.getCell(editedRow-1, 1).getValue().toLowerCase();
  var cell4 = tableRange.getCell(editedRow-1, 4).getValue().toLowerCase();
  var cell5 = tableRange.getCell(editedRow-1, 5).getValue();

  if(SpreadsheetApp.getActiveSheet().getName().toLowerCase() == &quot;renaming&quot;) {
    var colors = getColorsRenaming(cell1, cell4, cell5);
  } else {
    // Unfortunately, if row colors aren&#039;t uniform, this&#039;ll cause issues...
    // Hmmm... I&#039;ll come back to that if I decide something like that should happen
    var colors = [tableRange.getCell(editedRow-1, 1).getBackgroundColor(), tableRange.getCell(editedRow-1, 1).getFontColor()];
  }
  var bgColors = new Array(1);
  var textColors = new Array(1);
  bgColors[0] = new Array(tableRange.getNumColumns());
  textColors[0] = new Array(tableRange.getNumColumns());
  for(var col = 0; col &amp;lt; tableRange.getNumColumns(); col++) {
    bgColors[0][col] = colors[0];
    textColors[0][col] = colors[1];
  }

  var row = SpreadsheetApp.getActiveSheet().getRange(editedRow, 1, 1, tableRange.getNumColumns());
  row.setBackgroundColors(bgColors);
  row.setFontColors(textColors);

}</pre>
<p>A couple things to note here:</p>
<ol>
<li>The first run function exists solely to do the first run of highlighting.  Since I imported the document without the highlighting, I needed something to perform the initial functionality before going forward.</li>
<li>The onEdit function is run every time the spreadsheet is edited. It finds the highlighted cell, grabs the correct values from the row, figures out and sets the colors.</li>
<li>getTableRange and getColorsRemaining are simply helper functions, since this functionality is used in both firstRun and onEdit.</li>
</ol>
<p>I know there&#8217;s not a lot more documentation about the code, but it&#8217;s pretty readable thanks to Google&#8217;s nice APIs.  However, this successfully updates the highlighting any time a row is edited. The onEdit function ONLY checks the row of the last edited cell for efficiency&#8217;s sake.  Even so, it&#8217;s not as smooth as Excel.  It takes a moment before the row is actually updated, but that&#8217;s fine for my sake.</p>
<p>By tweaking this script, it should be pretty simply to adapt this sort of conditional formatting via formula for any situation.  Unfortunately, Google doesn&#8217;t provide Excel&#8217;s formula entry for conditional formatting, so this is the next best thing.</p>
]]></content:encoded>
			<wfw:commentRss>http://truejournals.com/2012/06/05/conditional-formatting-in-google-docs/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>How do you Describe Security?</title>
		<link>http://truejournals.com/2012/05/29/how-do-you-describe-security/</link>
		<comments>http://truejournals.com/2012/05/29/how-do-you-describe-security/#comments</comments>
		<pubDate>Wed, 30 May 2012 00:48:48 +0000</pubDate>
		<dc:creator>TrueJournals</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://truejournals.com/?p=252</guid>
		<description><![CDATA[Every now and then, working in an IT position, you get asked questions that are&#8230; interesting.  Sometimes, these are questions that, while obviously simple to the experienced techie, really are things that take learning.  Tonight, however, I encountered the other kind: the kind you just don&#8217;t know how to answer. &#8220;Are these computers secure? I&#8217;m [...]]]></description>
				<content:encoded><![CDATA[<p>Every now and then, working in an IT position, you get asked questions that are&#8230; interesting.  Sometimes, these are questions that, while obviously simple to the experienced techie, really are things that take learning.  Tonight, however, I encountered the other kind: the kind you just don&#8217;t know how to answer.</p>
<p>&#8220;Are these computers secure? I&#8217;m going to be putting in my credit card information, so I want to make sure these computers are secure.&#8221;</p>
<p>How do I even <strong>begin</strong> to answer this question?  After the customer left, my coworker and I had a small laugh at this question, because the answer I eventually gave this person was a simple &#8220;yes&#8221;.</p>
<p>My coworker pointed out that I could have given this person any answer &#8212; as long as it had a few buzzwords, it would be believable.  &#8221;Oh yeah, the memory addresses of the internet piplines sync well with Adobe Connect, so its definitely secure.&#8221;</p>
<p>My original answer was one about the security of a wired connection versus that of a wireless, pointing out that these computers have wired connection, so yes, they are secure.  This only gained a quizzical look from the uninitiated.</p>
<p>My next answer was going to be a note about SSL.  Perhaps a small explanation about how security is up to the place you are entering your credit card information, with a note that you should always check for &#8220;HTTPS&#8221; when entering credit card information.  However, if the wired vs. wireless explanation was confusing, this would have done nothing to clear up the situation.</p>
<p>So, instead of attempting to explain security, or gain further insight into what this customer was actually asking, I simply gave the answer &#8220;yes&#8221;.  It might seem like a cop-out, but it was the only answer I could give within her frame of knowledge.</p>
<p>I leave you with this video of Richard Feynman attempting to explain how magnets work, and instead explaining why he can&#8217;t answer &#8220;Why&#8221; questions:<br />
<iframe src="https://www.youtube.com/embed/qjmtJpzoW0o" frameborder="0" width="480" height="360"></iframe></p>
]]></content:encoded>
			<wfw:commentRss>http://truejournals.com/2012/05/29/how-do-you-describe-security/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Are Penny Auctions a Scam?</title>
		<link>http://truejournals.com/2011/07/17/are-penny-auctions-a-scam/</link>
		<comments>http://truejournals.com/2011/07/17/are-penny-auctions-a-scam/#comments</comments>
		<pubDate>Mon, 18 Jul 2011 04:24:03 +0000</pubDate>
		<dc:creator>TrueJournals</dc:creator>
				<category><![CDATA[technology]]></category>
		<category><![CDATA[thoughts]]></category>
		<category><![CDATA[auctions]]></category>
		<category><![CDATA[penny]]></category>
		<category><![CDATA[quibids]]></category>
		<category><![CDATA[theory]]></category>

		<guid isPermaLink="false">http://truejournals.com/?p=240</guid>
		<description><![CDATA[If you haven&#8217;t heard, someone was lucky enough to buy a Chevy Camero for only $5.28.  Now, if you actually read the article, you&#8217;ll notice a very important detail: this car was bought off a &#8220;penny auction&#8221; site.  These sites, like quibids.com, are becoming more and more popular.  Recently, I&#8217;ve had a couple of my [...]]]></description>
				<content:encoded><![CDATA[<p>If you haven&#8217;t heard, someone was lucky enough to <a href="http://www.autoblog.com/2011/07/14/cnn-shows-how-man-won-chevy-camaro-on-auction-website-for-5-28/">buy a Chevy Camero for only $5.28</a>.  Now, if you actually read the article, you&#8217;ll notice a very important detail: this car was bought off a &#8220;penny auction&#8221; site.  These sites, like <a href="http://quibids.com">quibids.com</a>, are becoming more and more popular.  Recently, I&#8217;ve had a couple of my friends ask me my opinion on these sites: are they a scam?  It certainly sounds too good to be true.  But, I will give this sites credit: real people do win real items from these sites.  In this sense, these sites are not a scam.</p>
<p>So, how exactly do these sites operate?  How can anyone run a profitable business by selling $1,000 products for about $20?  The answer isn&#8217;t generous owners.  While we might like to think that there are people that generous in this world, it&#8217;s simply not a sustainable business model.  Click through to the rest of the post, and I&#8217;ll do my best to explain how these sites work, and why you shouldn&#8217;t (or maybe should) waste your time.<br />
<span id="more-240"></span></p>
<h2>Where&#8217;s the Profit?</h2>
<p>The first, and obvious, question when dealing with a site like this is where&#8217;s the profit?  How do you create a site that sells items for pennies on the dollar, and still make money?  It&#8217;s a simple trick, really, but most people will participate without even realizing what&#8217;s going on.  The trick is in what happens when a bid is placed.  When a bid is placed, a couple things happen:</p>
<ol>
<li>The bidder loses some money.  For sake of argument, we&#8217;ll say $0.80.  Bids are purchased in &#8220;bid packs&#8221;.  More on this later.</li>
<li>The price of the item increases by $0.01.</li>
<li>The time to the end of the bid gets reset to anywhere from 10-20 seconds remaining.</li>
</ol>
<p>Whoever wins the item then pays the final price of the item.  Now, let&#8217;s see this in action: let&#8217;s say there&#8217;s a 16 GB WiFi-only iPad2 up for bid (<a href="http://store.apple.com/us/browse/home/shop_ipad/family/ipad/select?mco=MjE0OTI0MDI">retails for $499</a>).  The bidding starts at $0, and someone eventually decides to bid, boosting the price up to $0.01.  BUT, what also happens is that bidder loses one of their &#8220;bids&#8221;, which costs about $0.80.  Finally, the time remaining is set to 20 seconds.  After 15 seconds (there are 5 seconds remaining on the bid timer), another person bids.  The price is set at $0.02, this bidder loses a &#8220;bid&#8221;, and the remaining time is set to 20 seconds.  This process continues until the price of the item gets to&#8230; $18.47, the bid timer runs out, and the winning bidder pays $18.47 for the iPad2.  WOW! What a steal!  But, let&#8217;s look at how much money the website actually gets.</p>
<p>Remember that each bid costs the bidder $0.80.  If the iPad2 sold for $18.47, that means there were 1,847 bids placed.  Let&#8217;s do some math: 1847*0.80=$1,477.60!  But wait, there&#8217;s also the $18.47 paid as the final bid price.  That brings the total amount of money the site raked in for this iPad2 $1,496.07.  If the bidding site bought the iPad2 at the retail price of $499, that means the site made a profit of $997.07! That&#8217;s a $1,000 profit margin for <strong>one</strong> item.  Sites like this sell multiple items in a day.  That means huge profit margins, for little work.</p>
<h2>What are these &#8220;Bid Packs&#8221;?</h2>
<p>When you sign up for a site like Quibids, before you can start bidding, you&#8217;ll be forced to buy your bids, as outlined above.  When signing up for Quibids, you must buy a &#8220;starter bid pack&#8221; for $60 which gets you 100 bids (quibids charges $0.60/bid, other sites vary).  From this point, regardless of whether you win anything or not, you&#8217;ve spent $60.  You could easily spend all 100 of your bids without winning any items, which means you&#8217;re out $60 and have nothing to show for it.  If you finally do win an auction&#8230; congratulations!  How much have you spent buying bids?  Chances are, you&#8217;ve spent more than just the $60 on the initial bid pack.  Again, that&#8217;s <strong>if</strong> you win anything at all.</p>
<p>Unfortunately, I don&#8217;t have the $60 to spend on nothing right now, so I can&#8217;t tell what the bid pack options are after the initial buy-in.</p>
<h2>So why isn&#8217;t it a scam?</h2>
<p>It&#8217;s not a scam because QuiBids is very open about all of this.  Most people just don&#8217;t read all this information.  Additionally, it&#8217;s difficult to tell that you&#8217;re losing money when you&#8217;re just bidding, and, at that, only losing $0.60 each time.  By making the amount of money you lose each time you bid a trivially small amount, QuiBids is able to trick you into not realizing that you&#8217;re actually losing money and getting nothing.  This certainly sounds like a scam!  Again, though, people actually <strong>do</strong> win items off these sites, and they&#8217;re all very open about how this whole process works.</p>
<h2>How can I beat the system?</h2>
<p><strong>Note:</strong> The following is complete speculation and guesswork on my part.  I take no responsibility for your actions following reading this.  This is an outside view of the process, and I could very easily be very wrong in this matter.</p>
<p>The trick to beating a site like QuiBids is simple, but lengthy: study.  Find an item you want, and look for similar items on the site.  Spend a month or two studying these items and figuring out how much they sell for.  With that information, you should be all site.  When the item you want is up for bidding.  Don&#8217;t bid until the item gets close to the average price you&#8217;ve found in the past month or two, and then bid to win.  If you study enough and save your bids, I figure you should be able to win an item.  Granted, you&#8217;ll spend $60 on the bid pack, then another $20-$50 for the item, so you&#8217;re still looking at around $100.  But, for an item that costs $600-$2,000, this is still a steal!  I figure a strategy like this should make you a winner.  Most people try to get in on the ground floor of these auctions, and hope they can get it cheap.  The trick would be to save your bids until the end, then bid to win.</p>
<h2>Should I risk it?</h2>
<p>This is a tricky question, and the answer is most likely no.  Odds are, you&#8217;re going to waste a lot of time bidding and get nothing in return.  If you have the patience to try my method outlined above, and can afford to spare $60, I would say go for it!  Best case scenario, you can get some item you&#8217;d like incredibly cheap.  Worst case, you&#8217;ve already said you have $60 to spare if things don&#8217;t work out.  For the average Joe, however, I would say it&#8217;s not worth your time.  Stick to paying full price for items you really want, or you&#8217;ll end up losing money without gaining anything.</p>
]]></content:encoded>
			<wfw:commentRss>http://truejournals.com/2011/07/17/are-penny-auctions-a-scam/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Obligatory Google+ Post</title>
		<link>http://truejournals.com/2011/07/03/obligatory-google-post/</link>
		<comments>http://truejournals.com/2011/07/03/obligatory-google-post/#comments</comments>
		<pubDate>Mon, 04 Jul 2011 04:30:21 +0000</pubDate>
		<dc:creator>TrueJournals</dc:creator>
				<category><![CDATA[technology]]></category>
		<category><![CDATA[thoughts]]></category>
		<category><![CDATA[circles]]></category>
		<category><![CDATA[facebook]]></category>
		<category><![CDATA[friends]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[google plus]]></category>
		<category><![CDATA[googleplus]]></category>
		<category><![CDATA[invitation]]></category>
		<category><![CDATA[invite]]></category>
		<category><![CDATA[plus]]></category>
		<category><![CDATA[social networking]]></category>

		<guid isPermaLink="false">http://truejournals.com/?p=227</guid>
		<description><![CDATA[Well, here it is &#8212; my actual post about Google+. For those of you who still haven&#8217;t heard, the bird is the word Google+ is Google&#8217;s new social networking experiment.  Their response to Facebook, if you will.  Google has more-or-less tried this before, with Buzz, but Buzz never really took off.  At this point, it&#8217;s [...]]]></description>
				<content:encoded><![CDATA[<p>Well, here it is &#8212; my actual post about Google+.</p>
<p>For those of you who still haven&#8217;t heard, <del>the bird is the word</del> Google+ is Google&#8217;s new social networking experiment.  Their response to Facebook, if you will.  Google has more-or-less tried this before, with <a title="Google Buzz" href="http://buzz.google.com" target="_blank">Buzz</a>, but Buzz never really took off.  At this point, it&#8217;s difficult for me to tell what Google&#8217;s strategy is for how Google+ and Buzz will coexist.  Right now, they seem to be completely separate, yet strangely intertwined.  I have a feeling that as Google+ develops, it will eventually completely replace Buzz.</p>
<p>I hope this is helpful.  <del>Unfortunately, I&#8217;ve left out screenshots for now.  I&#8217;ll try to get some in later this week to better illustrate what I&#8217;m talking about.</del> Added screenshots July 4 @ 11:50 PM.</p>
<p>Now that you know what Google+ is, click through to read an overview of my view of the evolution of Google+, a review of the UI, and my general thoughts on things.<br />
<span id="more-227"></span></p>
<h1>Evolution of Google+</h1>
<p>While Google+ is an entirely new product at Google, it clearly combines past experiments to make for a more pleasant and combined experience.  This goes all the way back to Google Talk.  Granted, Google probably wasn&#8217;t thinking of leading up to Google+ all the way back when designing Google Talk, but Google Talk is still greatly integrated into the Google+ experience.  It has to be.  Social networking is all about communication.  My friends and I often complain about the poor quality of Facebook Chat, but I&#8217;ve never had a single issue with Google Talk.  From this standpoint, Google is starting on very solid ground.  Having a good instant messaging system is definitely a must for a new social networking website if it even remotely hopes to compete with the likes of Facebook.</p>
<p>However, Google was able to take this a step further than Facebook has.  Although there are <a title="Facebook to Unveil Skype Video Chat Next Week" href="http://mashable.com/2011/07/01/facebook-skype-video-chat/" target="_blank">rumors of Skype video chat being integrated into Facebook later this week</a>, Google+ has video from the start thanks to Google Talk.  There are some good and bad points to this.  The good news is that Google+ handles video chat in the form of &#8220;Hangouts&#8221; which allow up to <strong>10</strong> participants in-browser, cross-platform.  The bad news is that this requires the installation of the Google Talk browser add-on (not just standard flash), but that&#8217;s a small price to pay.  Hopefully, this add-on won&#8217;t be required in the future with the help of <a title="WebRTC" href="https://sites.google.com/site/webrtc/" target="_blank">WebRTC</a>, but that won&#8217;t be for a while.</p>
<p>As noted above, Buzz also seems to influence Google+, but I have yet to determine quite how so far.  Right now, Google+ and Buzz do seem to operate as separate entities, but I wouldn&#8217;t be surprised if that changed by the time of official release.  When viewing a user&#8217;s profile in Google+, you have the ability to see their Buzz posts.  However, I have a feeling Buzz posts will soon be converted to Google+ &#8220;shares&#8221;, and that Buzz tab will disappear.</p>
<p>Another prevalent Google influence in Google+ is the &#8220;+1&#8243; feature that has been around for a couple months.  +1 is Google&#8217;s version of the Facebook &#8220;like&#8221;.  You can +1 websites, posts, pictures, etc.  It&#8217;s a great way to quickly say &#8220;this is cool, check it out.&#8221;  Facebook users have been crying out for a &#8220;dislike&#8221; button for a while, and there is notably no &#8220;-1&#8243; button in Google+.  Perhaps that&#8217;ll come in the future, though.</p>
<p>My last paragraph is much speculation on my part.  I believe Google Wave has and will have impact on Google+ also.  The only possible impact I see right now is the notification system, which now present in all Google products if you are signed in.  The bar at the top will instantly notify of relevant account activity.  I speculate that Google Wave had something to do with the code behind this notification system.  I&#8217;m also guessing that in the future, we&#8217;ll see more real-time communication and update ability in Google+ courtesy of what Google learned with Wave.</p>
<h1>Relevant Concepts</h1>
<h2>Circles</h2>
<div id="attachment_233" class="wp-caption aligncenter" style="width: 310px"><a href="http://truejournals.com/wp-content/uploads/2011/07/shot-circles.png"><img class="size-medium wp-image-233" title="Google+ Circles" src="http://truejournals.com/wp-content/uploads/2011/07/shot-circles-300x72.png" alt="Circles" width="300" height="72" /></a><p class="wp-caption-text">How Google+ Circles Show Up</p></div>
<p>It&#8217;s difficult to write a Google+ post without talking about Circles, so I&#8217;ll start with that.  In Google+, circles allow you to organize your friends, and this organization is a basic idea of how social networking works in Google+.  This is something that Google has done right from the start, as opposed to Facebook, who have just recently implemented &#8220;Friend lists&#8221; that no one really seems to use and are a bit clunky.  The circles solution is elegant and beautiful: people can exist in as many different &#8220;friend circles&#8221; as you please.  The default distribution is: Friends &#8212; the people you know in real life; family &#8212; as much or as little as you want; acquaintances &#8212; people who you know, but might not want to share too many personal details with; and &#8220;following&#8221; &#8212; people you don&#8217;t know personally, but whose posts you find interesting.</p>
<p>But, you are not locked into this simple four-circle organization.  You can create as many circles as you want.  Perhaps, for instance, you want to separate high school friends from college friends.  Or have another circle for colleagues.  The organization is endless, but completely up to the user, and, to a point, enforced.  When adding someone as a friend, to use the Facebook terms we&#8217;re familiar with, you simply put them in a circle.  And by put them in a circle, I mean literally that: drag and drop their name into a circle.  The method is executed flawlessly, and is a great way to keep things organized.</p>
<p>Now, when posting content, you have a choice of who to share with.  Maybe something embarrassing happened that you&#8217;re happy to share with friends, but you&#8217;d rather not have your family know of.  Not a problem: simply only share that post with your &#8220;Friends&#8221; circle.  It couldn&#8217;t be simpler to share, but limit.</p>
<h2>Hangouts</h2>
<p>Hangouts are exactly what the name implies: virtual hangouts.  Creating a hangout is a way of saying &#8220;Hey, I&#8217;m bored.  Anyone want to hang out?&#8221;  This is the video chat feature of Google+, and, unfortunately, I really can&#8217;t say much of it because I haven&#8217;t had a good chance to try it out.  The feature definitely looks promising, though.  Hangouts can be limited by circle or by individuals.  From what I&#8217;ve seen, I&#8217;m not sure if Hangouts include IMing or not.  Unfortunately, the computer I&#8217;m using right now is old, slow, and lacks a webcam and microphone, so there&#8217;s little testing I can do in terms of the Hangouts feature.  It seems nice, though.</p>
<h2>Sparks</h2>
<p>Sparks seems to be a way to integrate Google Reader into Google+ &#8212; kind of.  Tell Google something you&#8217;re interested in, and it&#8217;ll bring up news relating to that subject.  From there, you have the option to share posts to your circles.  This seems to be a stripped-down non-customizable RSS reader.  However, it does give an interesting way to keep up on some topics from within your social networking site, and a good way to share news articles.  I haven&#8217;t found much use for it yet, though.</p>
<h2>Profiles</h2>
<div id="attachment_235" class="wp-caption aligncenter" style="width: 310px"><a href="http://truejournals.com/wp-content/uploads/2011/07/shot-profile.png"><img class="size-medium wp-image-235" title="Profile" src="http://truejournals.com/wp-content/uploads/2011/07/shot-profile-300x85.png" alt="" width="300" height="85" /></a><p class="wp-caption-text">What a Google+ profile looks like</p></div>
<p>Finding personal details about your friends is, of course, an important part of social networking, and it seems that Google has decided to make Profiles a big part of Google+.  Luckily, they&#8217;ve already created Google Profiles a while ago, so if you&#8217;ve filled out that, there&#8217;s not a lot of work you need to do to get Google+ set up.  Google+ also allows extended privacy controls for profile details.  Again, circles play a big part in this.</p>
<h2>Privacy/Takeout</h2>
<div id="attachment_236" class="wp-caption alignleft" style="width: 310px"><a href="http://truejournals.com/wp-content/uploads/2011/07/shot-takeout.png"><img class="size-medium wp-image-236" title="Takeout" src="http://truejournals.com/wp-content/uploads/2011/07/shot-takeout-300x258.png" alt="" width="300" height="258" /></a><p class="wp-caption-text">Take your data with you</p></div>
<p>Since many, many people have complained about privacy concerns with Facebook, Google has decided to let you control your privacy as much as you could possibly want.  Almost every aspect of Google+ can be privacy controlled by, you guessed it, circles.  This is a perfect way to do this, simply because of how elegant circles are.  There&#8217;s not much to say on this topic, because it simply works how you expect it to work &#8212; you can control who sees what.  There&#8217;s not much more you can ask for in terms of privacy control.</p>
<p>Along with Google+, Google introduced Google Takeout.  Takeout allows you to easily export your data from Google, in order to either back it up or take it somewhere else.  Google is very open about this: they want to provide you the flexibility to own your data.  This is something, again, that people have complained about with Facebook.  Finally, with Google+ and Google Takeout, you actually own your data &#8212; not Google.</p>
<p>&nbsp;</p>
<h1>The Interface</h1>
<div id="attachment_234" class="wp-caption alignright" style="width: 193px"><a href="http://truejournals.com/wp-content/uploads/2011/07/shot-leftpanel.png"><img class="size-full wp-image-234" title="Left Panel" src="http://truejournals.com/wp-content/uploads/2011/07/shot-leftpanel.png" alt="" width="183" height="405" /></a><p class="wp-caption-text">Google+&#39;s left panel on the &quot;Stream&quot;</p></div>
<p>One word: elegant.  Google is working on a cross-service redesign of its user interface in order to make an overall more elegant, simpler experience.  Google+ is the glue that seems to tie all this together, along with the driving force behind it.  It seems that Google wants you to stop thinking about its separate services as separate services, and start thinking about them as one website.  I think that in the future, more and more services will start to integrate themselves into Google+.  The Google+ bar and redesign are just the beginning of this.</p>
<p>Right now, the Google+ bar (the bar at the top of Google) simply allows access to Google+ notifications from any Google service, but, again, I feel that we&#8217;ll see an overall more streamlined cross-service experience in the future.  Right now, Google+ notifications are awesome in the fact that you don&#8217;t have to leave the Google+ bar in order to see notification details.  This is another plus for Google.  Facebook notifications require you to go to whatever relevant page the notification is for in order to see what the notification is telling you.  The Google+ bar doesn&#8217;t require this.  Click the notification number, click the notification, and relevant details will slide into view in the top right corner of your screen, <strong>without</strong> having to leave the page.</p>
<p>At first, I wasn&#8217;t sure I liked the color choices in the new design &#8212; everything is very muted, orange and grey with some blue highlights &#8212; but it&#8217;s growing on me.  The whole interface is, in fact, very clean, and the color scheme works.  It&#8217;s Google&#8217;s way of drawing your focus away from the design, and towards the content.  It&#8217;s not the overall design of the website that&#8217;s important, it&#8217;s the content you&#8217;re sharing and that&#8217;s being shared with you.</p>
<p>&nbsp;</p>
<h1>Mobile Experience</h1>
<p>Of course, no modern social networking site could ever become popular without some kind of mobile experience.  Currently, the Google+ mobile experience is limited to Android phones, but that will change in the future.  Luckily for me, I now have an Android phone, so I&#8217;ve been able to play with the Google+ mobile app a bit.  Let me first say this: it is <strong>way</strong> better than Facebook&#8217;s mobile app.  The app runs smoother and works better overall.  Here&#8217;s a couple key features from the mobile app.</p>
<h2>Instant Upload</h2>
<p>This is awesome.  The idea is that you can have your phone instantly upload any pictures you take to Google+.  Then, later, when you&#8217;re at a computer, you can choose which pictures to share, and organize your photos.  Take anywhere, deal with later is the motto here.  While cell phones are great for taking pictures on the go, computers often work better to do the heavy lifting of organization and describing.  Now, you don&#8217;t have to worry about choosing which photos to upload.  Simply upload all of them, and worry about which ones you want others to see later.</p>
<h2>Huddles</h2>
<p>Huddles are the mobile, text-only version of Hangouts.  This is where I&#8217;m slightly disappointed.  Hangouts and Huddles are two completely separate entities; Huddles are mobile-only, and Hangouts are computer-only.  From this standpoint, there is no cross-over between the mobile and the computer experience, which is extremely disappointing.  I hope this changes in the future, because there is no reason that some of your friends should be left out of a conversation just because of whether or not they&#8217;re sitting at a computer.  I really hope to see a bigger cross-over in this respect in the future.</p>
<h1>The Review</h1>
<h2>The Good</h2>
<p>Overall, I&#8217;ve come to like Google+ a lot more than Facebook.  From a cleaner way to organize friends, to a cleaner interface, to some new features that just plain work better than Facebook.  On top of that, the fact that it integrates with Gmail means that I need one less tab open when browsing.  I also like status sharing a lot better on Google+.  Facebook does let you customize sharing with friends lists, but this is a recent after-thought.  In Google+, this is built-in from the beginning.  On top of that, Google+ status seem more multi-purpose than Facebook&#8217;s in that you can location tag <strong>any</strong> status update: pictures, videos or links.</p>
<p>Circles are by and far the best feature of Google+.  Being able to categorize my friends is a great way to manage them, and the way Google enforces this categorization is elegant.  The notification system also works perfectly.  With a modern browser, there is no reason to leave a web page to get content from another page, and Google&#8217;s notification system does exactly that.  No matter what Google product you&#8217;re using, not only can you see notifications, you can see the content behind the notification without leaving the page.  This is something that isn&#8217;t implemented well in Facebook.  In order to view a notification, you really have to stop whatever else you&#8217;re doing in Facebook, and view the notification.  Not so in Google+, and it works beautifully.</p>
<p>I really like the workflow of Google+, but I will also admit that I&#8217;m still getting used to it.  Every now and then, I find something that might not work quite how I expect it to, but I haven&#8217;t encountered any unreasonable behavior.  There are a couple paradigm shifts I&#8217;m still getting used to, but, again, that&#8217;s not necessarily a bad thing.  Google+ has no wall to speak of, you simply restrict who you share a status update with.  Additionally, private messages have been done away with in favor of e-mail.  Events are non-existent due to Google Calendar.  Features that we take for granted in Facebook are hidden due to their presence in other Google products.  I predict that, over time, this integration with other Google services will become more and more transparent.  But, then, I&#8217;m stuck in the mindset that separate Google products are separate websites.  It&#8217;s obvious that Google wants me to stop thinking about them this way.</p>
<h2>The Bad</h2>
<p>I&#8217;ll admit: I don&#8217;t see much wrong with Google+.  On top of that, a lot of things I do see as &#8220;bad&#8221; are only &#8220;bad due to being different in comparison with Facebook&#8221;.  Although, this will be a large hurdle for Google.  It&#8217;s difficult to convince people that the way they&#8217;re doing things is wrong, and that you have a better way.  If Google is able to do this, they have a chance to take over, or at least make a dent in, the social networking market.  Until that happens, however, people won&#8217;t change their ways.</p>
<p>As stated above, I&#8217;m a bit disappointed in the separation in the mobile and web experiences.  I see no justification for Huddles and Hangouts being entirely separate entities, so I&#8217;d like to see these two drawn together more.  I understand that you might not want to allow video chat on mobile devices, but that simply means that you should allow text chat on browsers and integrate Huddles into Hangouts.  As it is now, Huddles are a mass text-messaging system, with &#8220;Reply All&#8221; being the only option.  This needs changed to Huddles being integrated with Hangouts so everyone can communicate regardless of location and device.</p>
<h2>Overall</h2>
<p>Overall, I&#8217;ve really enjoyed using Google+.  I&#8217;m really hoping that more of my friends will migrate to Google+, but I will also admit that I&#8217;ll be surprised if that happens.  There&#8217;s a possibility that the transition from Facebook to Google+ could be similar to the transition from MySpace to Facebook, but I think that would require Facebook falling behind in technology.  And, let&#8217;s face it, Facebook isn&#8217;t letting that happen.  Right now, what&#8217;s going to cause people to switch is how Facebook handles privacy, and that simply isn&#8217;t a big enough argument for most people.  At this point, I&#8217;m stuck using both networks, because most of my friends aren&#8217;t on Google+.  Unfortunately, that means I&#8217;ll keep using Facebook more than Google+, which means the switch will never happen.</p>
<p>Google+ does a lot better than Facebook, and provides a smoother, cleaner, more elegant social networking experience.  But, until Facebook actually falls behind, it will stay in the spotlight because people will see no reason to switch.</p>
]]></content:encoded>
			<wfw:commentRss>http://truejournals.com/2011/07/03/obligatory-google-post/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>
