<?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"
	>

<channel>
	<title>Dancing Mammoth</title>
	<atom:link href="http://dancingmammoth.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://dancingmammoth.com</link>
	<description>Cleaner websites for a cleaner future</description>
	<pubDate>Mon, 11 Aug 2008 12:56:14 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.6.1</generator>
	<language>en</language>
			<item>
		<title>Derived Attributes with UNION</title>
		<link>http://dancingmammoth.com/2008/08/10/derived-attributes-with-union/</link>
		<comments>http://dancingmammoth.com/2008/08/10/derived-attributes-with-union/#comments</comments>
		<pubDate>Sun, 10 Aug 2008 16:00:06 +0000</pubDate>
		<dc:creator>Francis Avila</dc:creator>
		
		<category><![CDATA[Lab]]></category>

		<category><![CDATA[derived attribute]]></category>

		<category><![CDATA[mysql]]></category>

		<category><![CDATA[optimization]]></category>

		<category><![CDATA[union]]></category>

		<category><![CDATA[view]]></category>

		<guid isPermaLink="false">http://dancingmammoth.com/?p=32</guid>
		<description><![CDATA[A Story
Recently, a client of ours wanted to institute a &#8220;point&#8221; system for an existing body of users. The idea was that certain actions of the user would generate points for that user, which the client could then track as part of an incentive program.
But What are &#8220;Points&#8221;?
At the time, we had a simple &#8220;users&#8221; [...]]]></description>
			<content:encoded><![CDATA[<h4>A Story</h4>
<p>Recently, a client of ours wanted to institute a &#8220;point&#8221; system for an existing body of users. The idea was that certain actions of the user would generate points for that user, which the client could then track as part of an incentive program.</p>
<h5>But What are &#8220;Points&#8221;?</h5>
<p>At the time, we had a simple &#8220;users&#8221; table in our database which stored all our user-related data. Now we were asked, essentially, to add a new &#8220;points&#8221; attribute to the &#8220;user&#8221; entity. However, we could not simply add a &#8220;points&#8221; column to the &#8220;user&#8221; table, because the client needed to track individual point-granting actions separately, with descriptions and such.</p>
<p>But this was also not a one-to-many relationship with an abstract &#8220;point-event&#8221; entity either, since some points were inferred from information which was properly normalized into other parts of the database. For example, referring another user (information we know at user registration time) was worth a certain number of points, but to copy a &#8220;referred user&#8221; event to a &#8220;point-event&#8221; entity would mean denormalizing the database.  If a user-referral were added or changed later, we would have to make sure to do the same thing to a corresponding point-event.</p>
<p>Thus a user&#8217;s &#8220;points&#8221; are an attribute of the user, but the value of this attribute is derived from potentially many different entities or attributes.  Guess what? It&#8217;s a <a href="http://it.toolbox.com/blogs/enterprise-solutions/understanding-attributes-in-er-diagrams-14287">derived attribute</a> (scroll to the bottom).</p>
<p>So, how are we going to deal with this?</p>
<h4>Implementation</h4>
<h5>Derived Columns</h5>
<p>Some &#8220;real&#8221; databases have native support for derived attributes (e.g., SQL Server) but as far as I know they all require that the value of the derived attribute be defined as an expression, not the result of an arbitrary query.  We could get around this using a stored function which calculates the points for us, but this particular database was MySQL (which does not support derived attributes), version 4.1 (which does not support stored functions).</p>
<p>In any case, this is a bad solution for us because any changes to the point calculation algorithm would require modification of the database, yet we had been accustomed to putting this kind of logic into the application.  Additionally, a lazy <code>SELECT *</code> (many of which were unfortunately sprinkled throughout our application) would suddenly become much more expensive, requiring an additional function call per row.</p>
<h5>Application Code</h5>
<p>The other solution, of course, is that we simply put all the point-calculation code into the application.  The problem with this is that it would take multiple queries to the database for every user that interested us, and we could potentially get the wrong point value if a change were made to the database in between our queries (since MySQL MyISAM does not have transactions).  Plus, if we want to sort by points (or something more complicated), we would have to do the sorting ourselves, in the application.</p>
<h5>UNION</h5>
<p>Clearly, we wanted to handle point calculation by a single query. The solution we finally hit upon was to use a temporary table (not a view, since MySQL 4.1 doesn&#8217;t support them) filled by a <code>UNION</code>. This is quite possibly the only good use for a <code>UNION</code>. Each subquery of the <code>UNION</code> would calculate points based on a particular attribute or entity, and all the subqueries would <code>SELECT</code> to common column names.</p>
<pre name="code" class="sql">
DROP TEMPORARY TABLE IF EXISTS tmp_all_points;
CREATE TEMPORARY TABLE tmp_all_points
-- Get referrer-derived points
(SELECT user.id AS user_id, COUNT(*)*5 AS points
FROM user ... INNER JOIN ... GROUP BY ...)
UNION
-- Get pointevents-derived points
(SELECT user_id AS user_id, SUM(points) AS points
FROM pointevents GROUP BY user_id HAVING points != 0);
</pre>
<p>This will give us a temporary table with 0, 1, or 2 rows per user. If we want to limit this to particular users, we can add the relevant <code>WHERE</code> conditions to the individual subqueries before we send them to the database.</p>
<p>Now if we want to do any queries which involve points, we can just treat <code>tmp_all_points</code> as a &#8220;points&#8221; entity with a many-to-one relationship with the &#8220;users&#8221; entity.</p>
<p>Want the top five point-holders?</p>
<pre name="code" class="sql">
SELECT users.name, SUM(tmp_all_points.points) AS points
FROM users
INNER JOIN tmp_all_points ON users.id = tmp_all_points.users_id
GROUP BY users.id
ORDER BY points DESC
LIMIT 5
</pre>
<h4>Happy Ending?</h4>
<p>By using a <code>UNION</code>, we were able to neatly model the derived attribute as a table, using a single query that maps easily to the logic of the derived attribute and is easy to extend to account for any additional criteria that the client may dream up.  And we didn&#8217;t have to denormalize our database or introduce complex application code.</p>
<p>There is a caveat, however.  Tables defined by a query have no index, and probably we are going to want to join on this table, which means we&#8217;ll be doing a join without an index.  For this reason, it is pretty important to keep the result set of your UNION query as small as possible using additional <code>WHERE</code> conditions.</p>
<p>If your result set will always be large, split off the temporary table creation into a definition with keys and use a <code>INSERT INTO tmp_table SELECT ... UNION SELECT ...</code>.  <strong>Don&#8217;t</strong> use <code>CREATE INDEX</code> after filling your table, since creating an index on a full table is <em>much</em> slower than building it incrementally (except for <code>FULLTEXT</code> indexes, where the opposite is true).</p>
<h5>Don&#8217;t Try This With Views</h5>
<p>If you are using MySQL 5.0 or above, you won&#8217;t be able to mitigate this problem by using a <a href="http://dev.mysql.com/doc/refman/5.0/en/create-view.html"><code>VIEW</code></a>.  MySQL is <a href="http://www.mysqlperformanceblog.com/2007/08/12/mysql-view-as-performance-troublemaker/">not very good at optimizing views</a>. If there is not a one-to-one relationship between the rows of your view and the rows of the underlying tables, MySQL will use <code>ALGORITHM = TEMPTABLE</code> for your view. So any view with a UNION in it will be created as a temporary table anyway.</p>
<p>Thus I would not wrap a <code>UNION</code> in a view for this technique, since you can&#8217;t control the result set size for a view and you will be generating a new temporary table every time you use the view, instead of once per connection.</p>
]]></content:encoded>
			<wfw:commentRss>http://dancingmammoth.com/2008/08/10/derived-attributes-with-union/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Broadband for the People</title>
		<link>http://dancingmammoth.com/2008/07/17/broadband-for-the-people/</link>
		<comments>http://dancingmammoth.com/2008/07/17/broadband-for-the-people/#comments</comments>
		<pubDate>Thu, 17 Jul 2008 19:04:14 +0000</pubDate>
		<dc:creator>Chris Coté</dc:creator>
		
		<category><![CDATA[Case Studies]]></category>

		<category><![CDATA[broadband census]]></category>

		<category><![CDATA[javascript]]></category>

		<category><![CDATA[mysql]]></category>

		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://dancingmammoth.com/?p=19</guid>
		<description><![CDATA[Technology author and activist Drew Clark turned to Dancing Mammoth when he wanted to make his idea for Broadbandcensus.com into a reality. He envisioned a site capable of providing the most accurate and up-to-date information on broadband technologies to consumers in the United States.]]></description>
			<content:encoded><![CDATA[<p>Technology author and activist Drew Clark turned to Dancing Mammoth when he wanted to make his idea for <a href="http://broadbandcensus.com">Broadbandcensus.com</a> into a reality. He envisioned a site capable of providing the most accurate and up-to-date information  on broadband technologies to consumers in the United States.</p>
<p>Dancing Mammoth implemented blogs, wikis, speed tests, comments, real time graphs and carrier data into <a href="http://broadbandcensus.com">Broadbandcensus.com</a> and designed the clearinghouse Clark imagined.</p>
<p>The first step in the creation of the site involved gathering data for the &#8220;What are your broadband internet options?&#8221; function. Dancing Mammoth collected data from the <a href="http://www.fcc.gov">FCC</a> and maps from the <a href="http://www.usps.com">U.S. postal service</a>. Data was also gathered from individual carriers websites, this data is usually buried deep in the sites, or worse yet, involved some programming knowledge to scrape the data from the sites. We did the scraping and we did the hours of manipulating data to create a tool where users could search their market by zip code.</p>
<p>The website also continues to learn about broadband markets by surveying its users about location, carrier, promised speeds, and an individual&#8217;s rating of his service through a census. The survey data, in combination with the search function previously mentioned, a user can automatically correlate carriers to specific zip codes, along with promised speeds and any comments about that location and carrier.</p>
<p>The second part of the census involves a speed test. <a href="http://broadbandcensus.com">Broadbandcensus.com</a> has worked closely with <a href="http://www.internet2.edu">Internet2</a> and <a href="http://www.vt.edu">Virginia Tech</a> to implement a modified Java-based <a href="http://e2epi.internet2.edu/ndt/ndt-server-list.html">NDT (Network Diagnostics Tool) client</a>.</p>
<p>Based on the location provided by the user in the census, the site calculates the closest online NDT server accepting connections. The speed test takes approximately 30 seconds and roughly 50 data points are collected during this time, which measure everything from total speed to where bottlenecks in the network are occurring. Once this data is collected it allows the site to display real time percentages of user ratings and percentage of users getting their promised speeds. This is crucial when trying to find the right (only) carrier in your market and makes it a great research tool for consumers.</p>
<p><a href="http://broadbandcensus.com">Broadbandcensus.com</a> is now a publicly available resource that provides real data to consumers about broadband in the U.S. and facilitates consumer research and competition in the broadband carrier sector. </p>
<p>Technologies:</p>
<ul>
<li>Custom ORM Framework written in PHP/MySQL</li>
<li>Java</li>
<li>Javascript</li>
<li>Wordpress</li>
<li>custom wiki software</li>
</ul>
<p>Data:</p>
<ul>
<li>37,000 zipcodes</li>
<li>30,000 Federal datapoints</li>
<li>95,000 relationships</li>
<li>110,000 objects</li>
<li>1500 providers (and growing)</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://dancingmammoth.com/2008/07/17/broadband-for-the-people/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Please Take a Number</title>
		<link>http://dancingmammoth.com/2008/07/09/please-take-a-number/</link>
		<comments>http://dancingmammoth.com/2008/07/09/please-take-a-number/#comments</comments>
		<pubDate>Wed, 09 Jul 2008 23:44:44 +0000</pubDate>
		<dc:creator>Brian Kieffer</dc:creator>
		
		<category><![CDATA[Case Studies]]></category>

		<category><![CDATA[Lab]]></category>

		<category><![CDATA[Flash]]></category>

		<category><![CDATA[javascript]]></category>

		<category><![CDATA[jQuery]]></category>

		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://dancingmammoth.com/?p=18</guid>
		<description><![CDATA[In the Internet world of seemingly endless computer resources, it&#8217;s not often that a website requires visitors to wait in line to visit, but a recent Dancing Mammoth project called for just that.
The Requirements:

Visitors will be added to a Virtual Waiting Room prior to advancing to website content.
Visitors will be advanced according to First In [...]]]></description>
			<content:encoded><![CDATA[<p>In the Internet world of seemingly endless computer resources, it&#8217;s not often that a website requires visitors to wait in line to visit, but a recent Dancing Mammoth project called for just that.</p>
<p>The Requirements:</p>
<ul>
<li>Visitors will be added to a Virtual Waiting Room prior to advancing to website content.</li>
<li>Visitors will be advanced according to First In First Out.</li>
<li>Page must indicate current position in line via a client provided Flash object.</li>
<li>An administrator must be able to control flow of traffic.</li>
</ul>
<p>The client expected light traffic to their video chat feature, so we decided that capturing queue data in a single table was the most efficient way to go. We could then poll at a some set interval to determine a visitor&#8217;s place in line, and take action based on the result.</p>
<p>The client-provided Flash object required use of a bit of javascript, so I decided to go ahead and implement the polling with the jQuery library&#8217;s ajax functionality &#8212; I ♥ jQuery. Here&#8217;s what the javascript function looks like:</p>
<pre name="code" class="php">
function updatePosition()
{
	$.ajax({
		type: &quot;GET&quot;,
		url: &quot;queue/index.php&quot;,
		data: &quot;sess=&lt;?php echo $session_id ?&gt;&amp;random=&quot; + new Date().getTime(),
		dataType: &quot;xml&quot;,
		success: function(xml){
			var ky = &quot;&quot;;
			var val = &quot;&quot;;
			var action = &quot;&quot;;
			var pos = 0;
			$(&quot;response&quot;, xml).each(function(){
				$(&quot;action&quot;, this).each(function(){
					action = $(&quot;key&quot;, this).text();
					val = $(&quot;value&quot;, this).text();
					if(action == &quot;forward&quot;)
					{
						// Forward
						forwardToUrl(val);
					}else{
						//Update
						pos = val;
						thisMovie(&#039;queueCountdown&#039;).update(pos);
					}
				});
			});
		}
	});
}
</pre>
<p>If you&#8217;d like to review all the sample files, you can <a href="http://dancingmammoth.com/wp-content/uploads/vwr.zip">download them here</a>, but no warranty is expressed or implied.</p>
<p>jQuery sends the visitor&#8217;s session id (as well as a random string &#8212; always send a random string when making ajax GET calls or IE will give you cached content) to a script that checks the queue and returns some XML with the action and associate value. Then the visitor is either forward to the content, or their position in line is displayed.</p>
<p>On the back end, the VirtualWaitingRoom class provides functionality to retrieve queue position, administratively advance visitors through the queue, and remove records for abandoned sessions.</p>
<p>The project was a success and while there&#8217;s nothing especially complex about it, this Virtual Waiting Room is a good short example of how various web technologies can come together to provide a unique solution.</p>
]]></content:encoded>
			<wfw:commentRss>http://dancingmammoth.com/2008/07/09/please-take-a-number/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Where To Purchase Your Next Mac</title>
		<link>http://dancingmammoth.com/2008/07/09/where-to-purchase-your-next-mac/</link>
		<comments>http://dancingmammoth.com/2008/07/09/where-to-purchase-your-next-mac/#comments</comments>
		<pubDate>Wed, 09 Jul 2008 20:26:56 +0000</pubDate>
		<dc:creator>Matt Niemi</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<category><![CDATA[amazon]]></category>

		<category><![CDATA[Apple]]></category>

		<category><![CDATA[bargain]]></category>

		<category><![CDATA[Mac]]></category>

		<guid isPermaLink="false">http://dancingmammoth.com/?p=16</guid>
		<description><![CDATA[I&#8217;ve been to a few Apple stores in the past and I love their clean design. The products they sell are well displayed and their staff are usually very helpful, but I am always looking for a bargain. So I can&#8217;t envision myself purchasing a new computer from my local Apple store with the deals [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve been to a few Apple stores in the past and I love their clean design. The products they sell are well displayed and their staff are usually very helpful, but I am always looking for a bargain. So I can&#8217;t envision myself purchasing a new computer from my local Apple store with the deals that <a href="http://www.amazon.com/gp/redirect.html?ie=UTF8&amp;location=http%3A%2F%2Fwww.amazon.com%2FApple-Computers%2Fb%3Fie%3DUTF8%26node%3D565124&amp;tag=unclutterer-20&amp;linkCode=ur2&amp;camp=1789&amp;creative=9325">Amazon</a> is currently offering (mail in rebates on all Macs from $25-$150). Below is a chart comparing the Apple store price vs. the Amazon prices for all Mac computers. Shipping is free from both Apple and Amazon, unless of course, you need your Mac shipped express.</p>
<p>With the money that you save by purchasing from Amazon you can increase your RAM, purchase peripherals, or hold onto that money for a rainy day. The choice is rather easy if you look at the prices below. I have added a 5% sales tax to all Apple prices. Your particular sales tax may be higher or lower depending on where you live.</p>
<table border="1" cellspacing="0" cellpadding="5" width="550" align="center" bordercolor="#666666">
<tbody>
<tr valign="middle">
<td><strong>Model</strong></td>
<td><strong>Apple Store Price*</strong></td>
<td><strong>Amazon Price**</strong></td>
</tr>
<tr valign="top" bgcolor="#cccccc">
<td>Apple MacBook 13.3&#8243; Laptop (2.4 GHz Intel Core 2 Duo Processor, 2<br />
GB RAM, 160 GB Hard Drive)</td>
<td>$1,363.00</td>
<td><a href="http://www.amazon.com/exec/obidos/ASIN/B0013FPYRK/unclutterer-20/ref=nosim/">$1,204.99</a></td>
</tr>
<tr valign="top">
<td>Apple MacBook 13.3&#8243; Laptop (2.4 GHz Intel Core 2 Duo Processor, 2<br />
GB RAM, 250GB Hard Drive) - Black</td>
<td>$1573.95</td>
<td><a href="http://www.amazon.com/exec/obidos/ASIN/B0013FNZ1M/unclutterer-20/ref=nosim/">$1,398.97</a></td>
</tr>
<tr valign="top" bgcolor="#cccccc">
<td>Apple MacBook Pro 15.4&#8243; Laptop (2.4 GHz Intel Core 2 Duo Processor,<br />
2 GB RAM, 200 GB Hard Drive, DVD/CD SuperDrive)</td>
<td>$2098.95</td>
<td><a href="http://www.amazon.com/exec/obidos/ASIN/B0013FLU96/unclutterer-20/ref=nosim/">$1,789.99</a></td>
</tr>
<tr valign="top">
<td>Apple MacBook Pro 15.4&#8243; Laptop (2.5 GHz Intel Core 2 Duo Processor,<br />
2 GB RAM, 250 GB Hard Drive, DVD/CD SuperDrive)</td>
<td>$2,623.95</td>
<td><a href="http://www.amazon.com/exec/obidos/ASIN/B0013FLTNS/unclutterer-20/ref=nosim/">$2,289.99</a></td>
</tr>
<tr valign="top" bgcolor="#cccccc">
<td>Apple MacBook Pro 17&#8243; Laptop (2.5 GHz Intel Core 2 Duo Processor,<br />
2 GB RAM, 250 GB Hard Drive, DVD/CD SuperDrive)</td>
<td>$2,938.95</td>
<td><a href="http://www.amazon.com/exec/obidos/ASIN/B0013FPMXG/unclutterer-20/ref=nosim/">$2,557.98</a></td>
</tr>
<tr valign="top">
<td>Apple MacBook Air 13.3&#8243; Laptop (1.6 GHz Intel Core 2 Duo Processor,<br />
2 GB RAM, 80 GB Hard Drive)</td>
<td>$1,888.95</td>
<td><a href="http://www.amazon.com/exec/obidos/ASIN/B0006HU4DK/unclutterer-20/ref=nosim/">$1,689.99</a></td>
</tr>
<tr valign="top" bgcolor="#cccccc">
<td>Apple MacBook Air 13.3&#8243; Laptop (1.8 GHz Intel Core 2 Duo Processor,<br />
2 GB RAM, 80 GB Hard Drive)</td>
<td>$2,727.90</td>
<td><a href="http://www.amazon.com/exec/obidos/ASIN/B0007OW520/unclutterer-20/ref=nosim/">$2,743.00</a></td>
</tr>
<tr valign="top">
<td>Apple Mac mini (1.83 GHz Intel Core 2 Duo, 1 GB RAM, 80 GB Hard Drive,<br />
Combo Drive)</td>
<td>$628.95</td>
<td><a href="http://www.amazon.com/exec/obidos/ASIN/B0006HU49Y/unclutterer-20/ref=nosim/">$570.00</a></td>
</tr>
<tr valign="top" bgcolor="#cccccc">
<td>Apple Mac mini (2.0 GHz Intel Core 2 Duo, 1 GB RAM, 120 GB Hard Drive,<br />
SuperDrive)</td>
<td>$838.95</td>
<td><a href="http://www.amazon.com/exec/obidos/ASIN/B000K9V9H4/unclutterer-20/ref=nosim/">$769.99</a></td>
</tr>
<tr valign="top">
<td>Apple iMac Desktop with 20&#8243; Display (2.4 GHz Intel Core 2 Duo, 1<br />
GB RAM, 250 GB Hard Drive, DVD/CD SuperDrive)</td>
<td>$1,258.95</td>
<td><a href="http://www.amazon.com/exec/obidos/ASIN/B000X3GTMM/unclutterer-20/ref=nosim/">$1,144.00</a></td>
</tr>
<tr valign="top" bgcolor="#cccccc">
<td>Apple iMac Desktop with 20&#8243; Display (2.66 GHz Intel Core 2 Duo, 2<br />
GB RAM, 320 GB Hard Drive, DVD/CD SuperDrive)</td>
<td>$1,573.95</td>
<td><a href="http://www.amazon.com/exec/obidos/ASIN/B000WHSFYY/unclutterer-20/ref=nosim/">$1,419.00</a></td>
</tr>
<tr valign="top">
<td>Apple iMac Desktop with 24&#8243; Display (2.8 GHz Intel Core 2 Duo, 2<br />
GB RAM, 320 GB Hard Drive, DVD/CD SuperDrive)</td>
<td>$1,888.95</td>
<td><a href="http://www.amazon.com/exec/obidos/ASIN/B000WHZKGA/unclutterer-20/ref=nosim/">$1,694.00</a></td>
</tr>
<tr valign="top" bgcolor="#cccccc">
<td>Apple Mac Pro Desktop (Two 2.8GHz Quad-Core Intel Xeon Processors,<br />
2 GB RAM, 320 GB Hard Drive, 16x SuperDrive)</td>
<td>$2,938.95</td>
<td><a href="http://www.amazon.com/exec/obidos/ASIN/B000VR4F2Q/unclutterer-20/ref=nosim/">$2,589.99</a></td>
</tr>
<tr>
<td colspan="3"><strong>* Apple price includes local/state sales tax of 5%<br />
(Sales tax may be higher or lower depending on your location)</strong>   </p>
<p><strong>** Amazon price includes mail-in rebate (expirese 7/14/08)<br />
Residents of KS, KY, ND, NY and WA have to pay a sales tax on all Amazon<br />
purchases. (Thank your state legislatures.)</strong></td>
</tr>
</tbody>
</table>
]]></content:encoded>
			<wfw:commentRss>http://dancingmammoth.com/2008/07/09/where-to-purchase-your-next-mac/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Use Your iMac as a Display</title>
		<link>http://dancingmammoth.com/2008/05/28/use-your-imac-as-a-display/</link>
		<comments>http://dancingmammoth.com/2008/05/28/use-your-imac-as-a-display/#comments</comments>
		<pubDate>Thu, 29 May 2008 01:20:46 +0000</pubDate>
		<dc:creator>Francis Avila</dc:creator>
		
		<category><![CDATA[Lab]]></category>

		<category><![CDATA[Apple]]></category>

		<category><![CDATA[Display]]></category>

		<category><![CDATA[Mac]]></category>

		<guid isPermaLink="false">http://dancingmammoth.com/?p=14</guid>
		<description><![CDATA[I have an Intel iMac (the white kind).  It&#8217;s my personal machine.  I like it.  It&#8217;s nice.  What I especially like about it is that it has a big screen (1680&#215;1050).
I also have an Intel MacBook. It&#8217;s my work machine.  I like it.  It&#8217;s nice.  But what I [...]]]></description>
			<content:encoded><![CDATA[<p>I have an Intel iMac (the white kind).  It&#8217;s my personal machine.  I like it.  It&#8217;s nice.  What I especially like about it is that it has a big screen (1680&#215;1050).</p>
<p>I also have an Intel MacBook. It&#8217;s my work machine.  I like it.  It&#8217;s nice.  But what I don&#8217;t like about it is that the screen is a bit smaller than my iMac (1200&#215;800).  Using the smaller keyboard and mouse isn&#8217;t so nice either.</p>
<p>What to do?</p>
<p>Well, there&#8217;s VNC. OS X even has a VNC server built in.  So I could turn that on and then use a VNC client on my iMac.  But that only gives me the keyboard and mouse and a 1280&#215;800 window mirroring the MacBook screen.  Not cool.</p>
<p>The same guy who makes this <a title="JollysFastVNC" href="http://www.jinx.de/JollysFastVNC.html">excellent VNC client</a> also makes <a title="ScreenRecycler" href="http://www.screenrecycler.com/home.html">ScreenRecycler</a>.  ScreenRecycler turns your VNC client into an attached display.  The monitor of the computer your VNC client runs on looks to OS X like just another monitor, plugged in through the mini-DVI port.  So now I can work on my MacBook and have a 1680&#215;1050 screen <em>in addition</em>. Joy!</p>
<p>But ScreenRecycler ignores input from the VNC client, so I can&#8217;t use my iMac&#8217;s keyboard and mouse to control my MacBook.  No joy.</p>
<p>But some other guy on the internet makes <a href="http://www.abyssoft.com/software/teleport/">Transport</a>.  Transport lets you control other Macs using your keyboard and mouse.  Joy has returned!</p>
<p>So, the plan:</p>
<ol>
<li>Install and run ScreenRecycler and Transport on the MacBook.</li>
<li>Install and run JollysFastVNC and Transport on the iMac.</li>
<li>The VNC client finds ScreenRecycler via Bonjour.  No sweat.</li>
<li>On the MacBook, tell Teleport to &#8220;Share this Mac.&#8221;</li>
</ol>
<p>All done!  Now I can use my iMac as a second display to my MacBook <em>and</em> control my MacBook with my iMac.  (I can even make the iMac the MacBook&#8217;s main display!)  Using the power of <a href="http://www.apple.com/macosx/features/spaces.html">Spaces</a>, I can even have multiple workspaces, and keep (for example) Mail and iChat permanently displayed in the MacBook screen, no matter what workspace I&#8217;m in.</p>
<p>A caveat:  Transport doesn&#8217;t seem to recognize the ScreenRecycler display, at least when one machine is Panther (iMac) and the other Leopard (MacBook).  You have to arrange your virtual screens in Transport in such a way that they don&#8217;t share the same borders.  Otherwise your pointer will get stuck on the MacBook.</p>
]]></content:encoded>
			<wfw:commentRss>http://dancingmammoth.com/2008/05/28/use-your-imac-as-a-display/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Unclutterer</title>
		<link>http://dancingmammoth.com/2008/05/28/unclutterer/</link>
		<comments>http://dancingmammoth.com/2008/05/28/unclutterer/#comments</comments>
		<pubDate>Wed, 28 May 2008 21:04:47 +0000</pubDate>
		<dc:creator>Erin Doland</dc:creator>
		
		<category><![CDATA[Internal Projects]]></category>

		<category><![CDATA[Organization]]></category>

		<guid isPermaLink="false">http://dancingmammoth.com/?p=5</guid>
		<description><![CDATA[Unclutterer.com, a website providing daily tips on how to organize your home and office, is a Dancing Mammoth publication. Erin Rooney Doland is the site&#8217;s Editor-in-Chief and manages the internal project.
Started in early 2007, the site promotes the idea of &#8220;a place for everything, and everything in its place.&#8221; Unclutterer is not just for the [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://unclutterer.com"><img class="image" title="080528-unclutterer" src="http://dancingmammoth.com/wp-content/uploads/080528-unclutterer.png" alt="" width="350" height="270" style="float:right;" /></a><a href="http://unclutterer.com">Unclutterer.com</a>, a website providing daily tips on how to organize your home and office, is a Dancing Mammoth publication. Erin Rooney Doland is the site&#8217;s Editor-in-Chief and manages the internal project.</p>
<p>Started in early 2007, the site promotes the idea of &#8220;a place for everything, and everything in its place.&#8221; Unclutterer is not just for the helplessly disorganized who would lose their heads if they weren’t attached, and pack rats looking to put their stashes on a diet, but also for obsessive compulsive neat freaks looking to squeeze even more order into their lives. We hope we can make getting and staying organized fun and informative.</p>
<p>Chances are you don’t have as much space as you’d like, so you need to make the most of the space you do have. This doesn’t just mean finding a new nook in which to cram more clutter, or devising a clever way to stack piles of papers. Instead, it’s about streamlining your space and your possessions so that you can be more efficient at work and enjoy a more relaxing and serene environment at home.</p>
<p>Unclutterer features tips, organization strategies, product reviews, reader questions and more. We’re not a personal productivity blog or a site about interior design, but we still hope we can help you in those areas. Getting uncluttered and organized can be the first step to more efficiently tackling your projects and realizing a better-looking space.</p>
]]></content:encoded>
			<wfw:commentRss>http://dancingmammoth.com/2008/05/28/unclutterer/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Does Numbers Make Charts Like This?</title>
		<link>http://dancingmammoth.com/2008/03/05/does-numbers-make-charts-like-this/</link>
		<comments>http://dancingmammoth.com/2008/03/05/does-numbers-make-charts-like-this/#comments</comments>
		<pubDate>Wed, 05 Mar 2008 22:44:47 +0000</pubDate>
		<dc:creator>PJ Doland</dc:creator>
		
		<category><![CDATA[Miscellaneous]]></category>

		<category><![CDATA[Advertising]]></category>

		<category><![CDATA[Deception]]></category>

		<category><![CDATA[Infographics]]></category>

		<guid isPermaLink="false">http://dancingmammoth.com/?p=11</guid>
		<description><![CDATA[I’m in the process of upgrading my first-generation Core Duo Macbook, which is getting a little long-in-the-tooth. So this afternoon I visited Apple.com and I took a little time to review the specs of the newly released models.
I eventually came across the following bar chart, which is accessible as a pop-up from this page. It [...]]]></description>
			<content:encoded><![CDATA[<p>I’m in the process of upgrading my first-generation Core Duo Macbook, which is getting a little long-in-the-tooth. So this afternoon I visited Apple.com and I took a little time to review the specs of the newly released models.</p>
<p>I eventually came across the following bar chart, which is accessible as a pop-up from <a href="http://www.apple.com/macbook/features.html">this page</a>. It compares my current notebook (coincidentally) with the one I intend to purchase.</p>
<p><a href="http://www.apple.com/macbook/features.html"><img class="image" style="display: block; margin-left: auto; margin-right: auto" title="080305-deceptive-macbook-chart" src="http://dancingmammoth.com/wp-content/uploads/080305-deceptive-macbook-chart.gif" alt="Deceptive Macbook Chart" width="450" height="378" /></a></p>
<p>At first glance, it was obvious that something wasn’t quite right. The percentages listed inside the blue bars don’t even remotely correspond to the visual length of those bars relative to the baseline bar at the bottom. It isn’t even close.</p>
<p>I took a screenshot and did some measuring in Photoshop with the ruler tool. The baseline bar is 216 pixels wide. The bars above it are 357, 362, 382, and 417 pixels wide, respectively. That would yield rounded percentages of 65%, 68%, 77%, and 93%.</p>
<p>I assume the numbers are correct and Apple is just being deceptive to make the performance gains look more impressive. In any case, it&#8217;s definitely not cool.</p>
]]></content:encoded>
			<wfw:commentRss>http://dancingmammoth.com/2008/03/05/does-numbers-make-charts-like-this/feed/</wfw:commentRss>
		</item>
	</channel>
</rss>
