<?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>The Nothingness of Scott</title>
	<atom:link href="http://www.jwir3.com/blog/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.jwir3.com/blog</link>
	<description>jwir3&#039;s blog on software development, mythology, and pretty much anything that comes to mind</description>
	<lastBuildDate>Thu, 02 Oct 2014 00:14:15 +0000</lastBuildDate>
	<language>en-US</language>
		<sy:updatePeriod>hourly</sy:updatePeriod>
		<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=4.0</generator>
	<item>
		<title>git transfusion</title>
		<link>http://www.jwir3.com/blog/2014/10/01/git-transfusion/</link>
		<comments>http://www.jwir3.com/blog/2014/10/01/git-transfusion/#comments</comments>
		<pubDate>Thu, 02 Oct 2014 00:10:34 +0000</pubDate>
		<dc:creator><![CDATA[jwir3]]></dc:creator>
				<category><![CDATA[Engineering]]></category>
		<category><![CDATA[git]]></category>
		<category><![CDATA[Open Source]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[Version Control]]></category>
		<category><![CDATA[bitbucket]]></category>
		<category><![CDATA[branch]]></category>
		<category><![CDATA[clone]]></category>
		<category><![CDATA[engineering]]></category>
		<category><![CDATA[fetch]]></category>
		<category><![CDATA[github]]></category>
		<category><![CDATA[open source]]></category>
		<category><![CDATA[push]]></category>
		<category><![CDATA[remote]]></category>
		<category><![CDATA[repository]]></category>
		<category><![CDATA[tag]]></category>
		<category><![CDATA[transfer]]></category>
		<category><![CDATA[version control]]></category>

		<guid isPermaLink="false">http://www.jwir3.com/blog/?p=495</guid>
		<description><![CDATA[Motivation: Poor Judgement (and lack of patience) Recently, I&#8217;ve been working a lot with git, a version control system. My current company decided that it would be useful to switch from Bitbucket to GitHub. Given that we had a number of repositories already in Bitbucket, it became necessary to move each of these repositories from [&#8230;]]]></description>
				<content:encoded><![CDATA[<h2>Motivation: Poor Judgement (and lack of patience)</h2>
<p>Recently, I&#8217;ve been working a lot with <em>git</em>, a version control system. My current company decided that it would be useful to switch from <a title="Bitbucket" href="http://www.bitbucket.org">Bitbucket</a> to <a title="Github" href="http://github.com">GitHub</a>. Given that we had a number of repositories already in Bitbucket, it became necessary to move each of these repositories from one source to another. Obviously, we wanted to keep all branches and history intact. It&#8217;s not very hard to search Google and find the easiest way to accomplish this<sup><a href="#note1">1</a></sup>, but I, being of the persuasion that enjoys pain, decided to ignore this simple prerequisite and instead push on with the benefit of only my experience. I accomplished, generally, a satisfactory result, but I thought I would document for posterity both how I <em>should</em> have done it, and how I <em>did</em> do it.</p>
<h2>The Easy Way (How I should have done it)</h2>
<p>The easiest way to move from one repository hosting service to another is answered in <a title="stackoverflow post" href="http://stackoverflow.com/a/22907155/281460">this stackoverflow post</a>. Basically, you perform the following<sup><a href="#note2">2</a></sup>:</p>
<pre class="brush:shell">git clone --mirror git@bitbucket.org:yourrepository
cd yourrepository.git
git remote rename origin bitbucket
git remote add origin github:yourgithubusername/yournewremoterepo
git push origin --mirror
</pre>
<h2>The Hard(er) Way (How I <em>did</em> do it)</h2>
<p>This is slightly more difficult, but the reason I&#8217;m posting this is because, if you did like I did, which is move the repository initially, then make a few commits against the new repository (that, of course, weren&#8217;t in the old repository, since you now consider that one dead to you), and then realize that there were items that you neglected to transfer over, then this is for you.</p>
<p>First, move the repository over (I assume you&#8217;ve probably already did this step):</p>
<pre class="brush:shell">cd yourrepositoryworkingdir
git remote add github github:yourgithubusername/yournewremoterepo
git remote rename origin bitbucket
git remote rename github origin
git push origin master
</pre>
<p>So, now your <em>master</em> branch is in the new origin, but what about the other branches? Let&#8217;s move them over<sup><a href="#note3">3</a></sup>:</p>
<pre class="brush:shell">cd yourrepository
# Temporarily remove reference to new remote
git remote rm origin
git remote rename bitbucket origin

# Now, track all remote branches [3]
remote=origin; for brname in `git branch -r | grep $remote | grep -v master | grep -v HEAD | awk '{gsub(/^[^\/]+\//,"",$1); print $1}'`; do git checkout $brname; done

# Remove master temporarily (as that branch has already been pushed). You'll want to do this
# For any other branches you've moved over, as well.
git branch -D master

# Add back the origin
git remote rename origin bitbucket
git remote add origin github:yourgithubusername/yourgithubrepo

# Push all branches
git push origin --all

# Push all tags
git push origin --tags
</pre>
<p>While this is slightly more difficult than simply doing it the &#8220;easy&#8221; way, it does give you a bit more knowledge about the inner workings of git. A colleague of mine, L. David Baron, once told me, &#8220;Good judgement comes from experience. Experience comes from exercising poor judgement.&#8221;<sup><a href="#note4">4</a></sup> I gained a modicum of experience here, but it was worth it. Hopefully, this saves you from making the same mistakes I did, and if you do make those mistakes, it gives you an easier out to correcting them than searching Google for a couple of hours to collect all the pieces of what you need to do.</p>
<h2>Footnotes</h2>
<hr />
<ol>
<li><a name="note1"></a>A <a title="Google search" href="http://lmgtfy.com/?q=moving+from+bitbucket+to+github">Google search</a> reveals the easiest way to do this with its first result.</li>
<li><a name="note2"></a>Note that this, as well as other sections of this post assume you&#8217;ve added the following shortened <em>github </em>url syntax to your global git configuration (~/.gitconfig):
<pre class="&quot;brush:text">[url "git@github.com:"]
	insteadOf = "github:"
</pre>
</li>
<li><a name="note3"></a>Note that for the step where branches are tracked from a remote branch, I modified a snippet I found <a href="http://stackoverflow.com/a/6300386/281460">here</a><a name="note3"></a>.</li>
<li><a name="note4"></a>I love to quote this saying (as readers of my blog are aware from previous posts). For those of you who haven&#8217;t read this before, the quote doesn&#8217;t originate with David. While the exact origins of the quote are unknown, but it&#8217;s been attributed to the Sufi Sage <a title="Mulla Nasrudin" href="http://en.wikiquote.org/wiki/Nasreddin">Mulla Nasrudin</a><a name="note4"></a>, <a title="Jim Horning" href="http://en.wikipedia.org/wiki/Jim_Horning">Jim Horning</a><a name="note4"></a>, and <a title="Fred Brooks" href="http://en.wikipedia.org/wiki/Fred_Brooks">Frederick P. Brooks</a><a name="note4"></a>.</li>
</ol>
]]></content:encoded>
			<wfw:commentRss>http://www.jwir3.com/blog/2014/10/01/git-transfusion/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Drop the puck!</title>
		<link>http://www.jwir3.com/blog/2013/04/03/drop-the-puck/</link>
		<comments>http://www.jwir3.com/blog/2013/04/03/drop-the-puck/#comments</comments>
		<pubDate>Wed, 03 Apr 2013 15:18:13 +0000</pubDate>
		<dc:creator><![CDATA[jwir3]]></dc:creator>
				<category><![CDATA[Hockey]]></category>
		<category><![CDATA[Officiating]]></category>
		<category><![CDATA[game]]></category>
		<category><![CDATA[goal]]></category>
		<category><![CDATA[hockey]]></category>
		<category><![CDATA[ice]]></category>
		<category><![CDATA[official]]></category>
		<category><![CDATA[offsides]]></category>
		<category><![CDATA[penalty]]></category>
		<category><![CDATA[play]]></category>
		<category><![CDATA[referee]]></category>
		<category><![CDATA[skating]]></category>
		<category><![CDATA[stripes]]></category>
		<category><![CDATA[usahockey]]></category>
		<category><![CDATA[whistle]]></category>

		<guid isPermaLink="false">http://jwir3.wordpress.com/?p=398</guid>
		<description><![CDATA[Introduction As many of my friends and family are aware, I&#8217;ve wanted to be a hockey referee for a number of years. Why? Mostly because I love the game of hockey. There are, however, other reasons &#8211; I think calling penalties and rule infractions in a high-speed game like ice hockey is a challenging and [&#8230;]]]></description>
				<content:encoded><![CDATA[<h1>Introduction</h1>
<div id="attachment_407" style="width: 310px" class="wp-caption alignleft"><a href="http://www.jwir3.com/blog/wp-content/uploads/2013/04/faceoff.png"><img class="size-medium wp-image-407" alt="Conducting my first faceoff" src="http://www.jwir3.com/blog/wp-content/uploads/2013/04/faceoff.png?w=300" width="300" height="178" /></a><p class="wp-caption-text">Conducting my first faceoff</p></div>
<p>As many of my friends and family are aware, I&#8217;ve wanted to be a hockey referee for a number of years. Why? Mostly because I love the game of hockey. There are, however, other reasons &#8211; I think calling penalties and rule infractions in a high-speed game like ice hockey is a challenging and interesting endeavor. I also highly enjoy skating, and I like to give back to my community when I can. Finally, while most hockey fans (and really, fans of any sport) don&#8217;t realize it, the game would not be possible without the referees. Referees play a vital role in keeping the game from degrading into a five-on-five boxing match on ice, and we enforce aspects of the rules that enable the game to remain fast-paced and skill-oriented. We also serve as teachers about the rules of the game to players, coaches, and sometimes even fans.</p>
<p>How does one become a hockey referee? Well, my experience is probably not like the experiences of others. In fact, my guess is that many referees probably have interesting stories about how and why they became a referee, but one thing I learned while training for this particular side-career is that I am almost completely unique in the art of hockey officiating, as I have never played hockey prior to this season. That said, I love the spectator aspect of the game, and truth be told, I enjoy the ritualistic nature of the signaling that referees use to communicate.</p>
<p>The governing body for youth hockey in the United States is <a href="http://www.usahockey.com/">USAHockey</a>. Other organizations, such as the NHL and NCAA, have their own referees, each of whom may or may not be affiliated with USAHockey. It&#8217;s even possible that one could become a referee for one of these higher-level organizations without first working in youth hockey, but I definitely want to hone my skills and become a better referee before advancing to a level of competition like that <sup><a href="#note1">1</a></sup>.</p>
<p>USAHockey has four referee classification levels, aptly numbered level 1-4. Every new referee must start out at level 1, which enables them to work games up to the &#8220;peewee&#8221; classification (typically 12 and under, but it can vary by district and association). A referee can, hypothetically, advance to the next level after they have spent a season at the previous level. So, hypothetically, I could advance to level 2 next season. Often, though, a referee will spend several seasons at levels 2 and 3 in order to get their skills in a shape where they feel they can handle the demands at a higher level. I&#8217;ve spoken with a couple of officials who don&#8217;t want to referee high school or adult games, and thus keep their certifications lower so they don&#8217;t get scheduled for these.</p>
<p>Every referee must attend a seminar at the beginning of each season in order to refresh their knowledge of the rules and skills necessary for conducting a game. Unfortunately, I didn&#8217;t get into a seminar until late last November (the last seminar of the 2012-2013 season, actually). Each area in USAHockey is broken up into districts. Officials typically officiate games in districts near where they live (to minimize travel time). Each district has their own rules and regulations that an official must meet before being assigned games. In the district in which I live, Minnesota District 6, one of these requirements is to attend a district meeting (held in August, September, and early October of each season) before being assigned to ref games. What this meant was that by the time I received my certification for level 1, I was unable to officiate games for the regular 2012-2013 season in district 6, as I wasn&#8217;t able to attend one of these meetings.</p>
<p>I tried contacting a number of other districts in the Minneapolis/St. Paul area, but they were all full for the 2012-2013 season. Fortunately, though, the scheduler for district 6 also helps schedule games for Minnesota&#8217;s summer hockey program, called &#8220;Showcase&#8221;. I was able to start being assigned to games starting in mid-April of 2013.</p>
<h1>The First Game</h1>
<p>During the seminar, one of the big topics they kept discussing was that your first game is typically quite difficult. Every referee, regardless of experience, makes mistakes. Newer referees will, for obvious reasons, make more mistakes than more experienced referees <sup><a href="#note2">2</a></sup>. I definitely realized at my first game that I had skills that needed to be honed. Not the least of these skills was my ability to skate. That&#8217;s right &#8211; I fell twice during the game. One of these extravagant falls was caught on video by my wife. Feel free to view it and laugh at my mixture of (bad) figure skating and hockey officiating:</p>
<p><iframe src="https://www.facebook.com/video/embed?video_id=10100527309409805" width="600" height="340" frameborder="2"></iframe></p>
<p>So what do you do when you fall in front of a bunch of people when you&#8217;re trying to keep control of a game like this? Get back up on your skates and try not to do it again &#8211; which is exactly what I did (well, that, and practice your skating skills in your off time to try and not get into the situation again).</p>
<h1>On-the-Job Learning</h1>
<p>Obviously, it&#8217;s important for a referee to know the rules of ice hockey. The officials are supposed to be the experts in how the game of ice hockey is played. So much is this the case, that in order to become a referee (at all levels of USAHockey), one must pass officiating exams. As you increase in level, you&#8217;re expected to be able to achieve better and better scores on these exams. About 20% of the questions on these exams cover officiating practices (e.g. how one should skate to keep play in view, where one should be positioned when the play is in certain areas of the ice, etc), with the remaining 80% covering the rules of ice hockey.</p>
<div id="attachment_426" style="width: 310px" class="wp-caption aligncenter"><a href="http://www.jwir3.com/blog/wp-content/uploads/2013/05/532151_10100527254150545_1346849524_n.jpg"><img class="size-medium wp-image-426" alt="Watching the play" src="http://www.jwir3.com/blog/wp-content/uploads/2013/05/532151_10100527254150545_1346849524_n.jpg?w=300" width="300" height="225" /></a><p class="wp-caption-text">Watching the play</p></div>
<p>In this area, at least, I am most certainly an expert. Or, more accurately, I thought I was. I have been watching ice hockey almost my entire life. My parents literally took me to watch college hockey games when I was 3 and 4 years old. What I didn&#8217;t realize is that there are fundamental differences to the way ice hockey is played at the youth level versus at the college or adult level. In general, the rules of the game are very similar, but there are a few rules that take some getting used to. For one thing, in college hockey, every faceoff is at a faceoff spot on the ice. This isn&#8217;t true in youth hockey. It&#8217;s possible to have a faceoff at a &#8220;last play&#8221; faceoff location, which could be anywhere along an imaginary line connecting the end zone faceoff spots lengthwise across the ice.</p>
<p>The other major difference in youth hockey is the immediate offsides rule <sup><a href="#note3">3</a></sup>. In most ice hockey games (aside from the youth level), the concept of &#8220;tag-up&#8221; offsides (sometimes called a &#8220;slow whistle&#8221;) is used. Basically, this means that, provided the attacking team doesn&#8217;t have possession and control of the puck, the puck can be in the attacking zone with attacking players offside. Once attacking players all make skate contact with the blue line <em>at the same time</em>, the offsides infraction is waived, and play continues. If, however, the attacking team takes possession of the puck before all players make skate contact with the blue line, then the play is blown dead, and the faceoff takes place at the nearest faceoff location in the neutral zone (unless it was intentional, in which case it will take place in an end zone).</p>
<p>With <em>immediate</em><em></em> offsides, as soon as the puck crosses the blue line with attacking players offside, the play is blown dead. The only real exception to this is if the defending team passes the puck backward into their defending zone, in which case the official at the blue line should waive the offsides violation.</p>
<h2>Number of Referees on the Ice</h2>
<p>One other interesting area where USAHockey differs from the adult classifications is in the number of on-ice officials. Typically, in collegiate and professional ice hockey, there are four officials on the ice during the game: two referees and two linesmen <sup><a href="#note4">4</a></sup>. In youth hockey, there are either three officials (one referee and two linesman), or two officials (two referees). The two-official system is the most common for me, since all youth hockey up to about the high school level utilize this system. Originally, I thought it would be difficult to get used to, since I&#8217;m used to each on-ice official having a specific role to play in the game, and this seemed like it could get confusing when two referees handle everything. Fortunately, it&#8217;s not actually that difficult to learn. The basic rule of thumb is that the two referees, in general, have equal power to call penalties and infractions, and should be situated in such a way so they are 1) not in the same zone, and 2) diagonally across from one another.</p>
<h2>Skating Fast and Hard</h2>
<p>Learning on the ice is tricky. I&#8217;ve been skating since I was probably six years old, but not all of that time have I been continually practicing my skating abilities. When I finally decided to become an official, I had to learn a number of ice skating techniques in a fairly quick manner in order to simply stay on my feet when officiating a game. It&#8217;s also humbling to be officiating a game where the ten-year-old players are better skaters than you are. The thing is, nothing teaches quite as quickly as a trial by fire, so after a few games, my skating skills have drastically improved. It&#8217;s a skill that will likely need to be practiced my entire life to master, though. In a way, it&#8217;s much like riding a bike &#8211; once you learn, it comes back pretty quickly, but that doesn&#8217;t mean you can&#8217;t make a fool of yourself if you don&#8217;t practice regularly and develop the skills you need to master it and make it look easy.</p>
<h2>Details, Details, Details&#8230;</h2>
<p>As I said in the previous paragraph, learning on the ice is tricky. There&#8217;s a lot going on. There are ten skaters on the ice, all of which are trying desperately to get the puck into the opposing net. They are randomly swapping players in and out of play, so at any given time, you might have players coming up from behind you, or about to cut in front of you. You have a solid 3-inch diameter piece of frozen black rubber that may be making its way toward your head or body, as well as twelve sticks that could potentially become deadly weapons if you get caught in the wrong place at the wrong time. You have to think and process plays <em>extremely</em> quickly, as you often only get a single chance to make a call on a given play. You have to be focusing on staying out of the way, while at the same time focusing on where the puck is, who has possession, who last had possession, who last had possession before that (as you can award up to two assists for every goal), what the other players are doing that don&#8217;t have the puck, where your partner is, and, in my case, how fast I&#8217;m going and whether or not I&#8217;ll be able to stop without crashing into something or someone. All this, oh, and by the way, you&#8217;ve got a ton of people screaming at you (or at players on the ice, sometimes I don&#8217;t know, since I can&#8217;t really hear them).</p>
<div id="attachment_424" style="width: 280px" class="wp-caption alignright"><a href="http://www.jwir3.com/blog/wp-content/uploads/2013/05/544866_10100527253856135_81487302_n.jpg"><img class=" wp-image-424    " style="margin: 0;" alt="Delayed Penalty" src="http://www.jwir3.com/blog/wp-content/uploads/2013/05/544866_10100527253856135_81487302_n.jpg?w=300" width="270" height="203" /></a><p class="wp-caption-text">Delayed Penalty</p></div>
<p>So, needless to say, you need to keep focused. Let me give you an example of what I mean. The other night, a scrimmage match (exhibition game) between two teams in Minneapolis was open and didn&#8217;t have a referee. I volunteered, because, being at the experience level I am right now, every game I can get makes me a better ref. What I didn&#8217;t realize at the time is that scrimmage matches typically only have one referee on the ice. That was probably the fastest and most exhausting game I&#8217;ve been on the ice for to date.</p>
<p>Here I am, in the middle of watching a play in one of the end zones, and I see what looks like a clear tripping penalty. I raise my arm, and wait for the team that committed the infraction to get possession of the puck, which happens after about eight agonizingly long seconds. I blow my whistle to indicate the play is dead, and signal the tripping penalty by taking my non-whistle hand and swiping it across my leg just below the knee. First of all, this was incorrect. I should have pointed to the player that committed the penalty first, but even more of an error was that I looked down at my hand as I&#8217;m making the tripping signal. I knew it as soon as I did it, too, that I was in trouble. Sure enough, I look back up from my tripping signal and realize: <em>I don&#8217;t remember who committed the penalty</em>. There are three kids in the vicinity of where the penalty happened, so I know it is one of these three, but I don&#8217;t know which one.</p>
<p>Now what? Well, one of the things that they kept talking about in the officiating seminars is &#8220;Everyone makes mistakes. You&#8217;re going to make a bad call once in a while. The key is, you need to sell it.&#8221; In other words, have confidence in your calls and do your best to get them right. So, I pointed to one of the three kids and verbalized the penalty. He comes over to me and says, &#8220;But I didn&#8217;t do it.&#8221; I asked him, &#8220;Ok, well then who did?&#8221; He responds, &#8220;Um&#8230; I don&#8217;t know.&#8221; &#8220;Well, sorry bud,&#8221; I say, &#8220;I guess I&#8217;m calling it on you.&#8221; The coaches didn&#8217;t argue, nor did any of the other players, so I thought that perhaps I picked the right kid and he was just trying to get out of a penalty, but I&#8217;m still unsure.</p>
<p>I definitely don&#8217;t mean to sound arrogant or infallible about that call. If the kid had told me, &#8220;Well, number 6 was the one that tripped him&#8221;, then I would have changed the penalty call to be called on number 6. But, regardless of the fact that I messed up the individual who committed the infraction, I witnessed a tripping infraction from a team, and that team needed to be assessed a penalty.</p>
<h1>Conclusion</h1>
<p>Being a hockey referee is much more complicated than it looks. There&#8217;s a lot to think about when you&#8217;re on the ice. When I was in the seminar last November, one of the things the instructors spent time doing was teaching us about how to conduct a proper faceoff. This is trickier than it sounds. Players can be moving, but, aside from the centers, they can&#8217;t be inside of a circle ten feet in diameter, centered around the faceoff spot. Often, the instructors mentioned, you&#8217;ll have to tell the kids to back up. If they don&#8217;t back up, or they don&#8217;t get in position, you may have to eject the center and start the faceoff again. Inevitably, you&#8217;re going to hear the phrase shouted from the stands, &#8220;Drop the puck!&#8221; The instructors laughed about this, saying, &#8220;Yeah, it&#8217;s never the players fault. You never hear them shout &#8216;Get in position!'&#8221;.</p>
<p>So, I expressed this frustration to my brother, Kyle. He has a tendency to do some crazy things from time to time. When my sister, mother, Kyle, and I went to the WCHA Final Five this past March to celebrate his birthday, we heard one of the fans expressing their (probably drunk) disapproval of the linesmen by uttering those exact words &#8211; &#8220;Drop the puck!&#8221; So, taking it in stride, Kyle gets up on his feet (we&#8217;re ten rows up from the ice, right behind the goal &#8211; pretty close to the linesman conducting the faceoff), and yells, &#8220;Hey guys! GET IN POSITION!&#8221; He then calmly sits back down, and turns to me and says, &#8220;Well, now you can&#8217;t say that everyone only picks on the refs.&#8221;</p>
<h2>Footnotes</h2>
<hr />
<ol>
<li><a name="note1"></a>As the age classification increases, so does the intensity. I&#8217;ve found, from my limited experience so far, that some coaches (and parents) can be extremely intense. It&#8217;s possible that I might not want to ref at higher levels than youth hockey. I truly believe that the game of ice hockey is just that &#8211; a game. Tempers flare, and words can sometimes get heated, but, in the end, the point is to have fun. That includes the referees &#8211; I am doing this because, right now, it&#8217;s fun for me. I don&#8217;t know if I would want to officiate a game where that&#8217;s not the case, so it&#8217;s entirely possible that I might never officiate a college, olympic, semi-pro, or professional match.</li>
<li><a name="note2"></a>There&#8217;s a saying from a computer scientist named Jim Horning that goes something like &#8220;Good judgement comes from experience; Experience comes from exercising poor judgement&#8221;. I think that this is especially true of referees, since &#8220;poor judgement&#8221; usually translates into a bad call. All of the referees I&#8217;ve spoken with have told me they have made their share of bad calls over the years &#8211; the key is to learn from them, accept that they are bad, and be willing to be flexible to change and improve your skills.</li>
<li><a name="note3"></a>The offsides rule in ice hockey is somewhat tricky, so I&#8217;ll likely discuss it in more detail in a future blog post.</li>
<li><a name="note4"></a>This wasn&#8217;t always the case. The NCAA changed the rules of ice hockey a few years ago to include an additional referee. Previously, there were three officials on the ice: a single referee and two linesmen.</li>
</ol>
]]></content:encoded>
			<wfw:commentRss>http://www.jwir3.com/blog/2013/04/03/drop-the-puck/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>(Hopefully) Easier Firefox Building with JMozTools</title>
		<link>http://www.jwir3.com/blog/2012/09/14/hopefully-easier-firefox-building-with-jmoztools/</link>
		<comments>http://www.jwir3.com/blog/2012/09/14/hopefully-easier-firefox-building-with-jmoztools/#comments</comments>
		<pubDate>Sat, 15 Sep 2012 01:04:27 +0000</pubDate>
		<dc:creator><![CDATA[jwir3]]></dc:creator>
				<category><![CDATA[Browsers]]></category>
		<category><![CDATA[Build Systems]]></category>
		<category><![CDATA[Mozilla]]></category>
		<category><![CDATA[Open Source]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[build system]]></category>
		<category><![CDATA[community]]></category>
		<category><![CDATA[development]]></category>
		<category><![CDATA[firefox]]></category>
		<category><![CDATA[gecko]]></category>
		<category><![CDATA[mozilla]]></category>
		<category><![CDATA[open source]]></category>
		<category><![CDATA[patches]]></category>
		<category><![CDATA[python]]></category>

		<guid isPermaLink="false">http://jwir3.wordpress.com/?p=350</guid>
		<description><![CDATA[One of the things I learned when I first started at Mozilla a little over a year ago is that there&#8217;s this kind-of unwritten &#8216;rite of passage&#8217;, so to speak. If you want to be a developer, one of the first things you have to do is learn to build Mozilla. I, like many others [&#8230;]]]></description>
				<content:encoded><![CDATA[<p><img class="alignleft" title="JMozTools" src="http://www.glasstowerstudios.com/trac-htdocs/site/BugTrackingJMozTools.png" alt="Introducing JMozTools" width="186" height="56" />One of the things I learned when I first started at Mozilla a little over a year ago is that there&#8217;s this kind-of unwritten &#8216;rite of passage&#8217;, so to speak. If you want to be a developer, one of the first things you have to do is learn to build Mozilla. I, like many others at Mozilla, have contributed to open source projects in the past, and so we expect the effort it takes to get the product built. Not everyone is so lucky, and it&#8217;s definitely possible to lack patience when trying to join an organization to which you&#8217;re donating your time. Building Mozilla can be intricate, tricky, and downright frustrating. Even if you get it the first time, there are a lot of long commands (at least on linux) you have to remember and keep track of in order to rebuild the software.</p>
<p>If you don&#8217;t believe me, or you want to give it a try (please do &#8211; it&#8217;s always great to have people who can think about our processes and make them better!), take a look at our <em>simple</em> build documentation:</p>
<p><a title="Firefox Simple Build" href="https://developer.mozilla.org/en-US/docs/Simple_Firefox_build">https://developer.mozilla.org/en-US/docs/Simple_Firefox_build</a></p>
<p>You might now be asking, &#8216;How does anyone do this every day?&#8217; Well, that&#8217;s where the unwritten rite of passage comes into play &#8211; most developers, in their early days with the organization, spend a great deal of time developing a set of automated scripts, designed to ease the burden of all of these commands, and to customize the build system to their workflow. If you do it correctly, you can spend anywhere from few days to a few weeks creating these scripts, and then only spend a few minutes every so often, polishing them and updating them.</p>
<p>This works great for the ambitious and eager script-writer. But, keep in mind that these scripts are written, and this trial by fire is passed, <em>before a contributor can even begin working on a real problem</em>. Not only that, but because our organization is made up of so many different kinds of people &#8211; non-platform developers, UX experts, artists/creative folks, add-on developers, test engineers, build engineers, automation engineers&#8230; (the list goes on) &#8211; not everyone has the skill or patience to understand arcane build output.</p>
<p>I&#8217;ve found that new contributors are excited to get working on a problem with Firefox. Unfortunately, if it takes them an entire week or more (I&#8217;m not talking build time here&#8230; I mean actually fiddling with .mozconfig files, Makefiles, directory structures, etc&#8230;), they end up getting burned out before they even begin their project! I&#8217;d really like to avoid having contributors quit before they even get to the heart of the problem they originally signed up to take on.</p>
<p>So, to that end, I decided to take the scripts <em>I</em> originally used to make building Mozilla a bit easier and more customized for <em>me</em> and open them up to the general public. I call the set of tools &#8216;JMozTools&#8217;, and they are available at <a title="JMozTools" href="http://www.glasstowerstudios.com/trac/JMozTools/">http://www.glasstowerstudios.com/trac/JMozTools/</a> These tools are not designed to replace the set of build tools already existing in Mozilla; they are designed to provide a set of &#8216;shortcuts&#8217; for common build and run commands that would otherwise sometimes get unwieldy.</p>
<p>As time goes on, I intend to add some other tools to the suite, as well, such as Eclipse plugins that assist in merging those irritating .rej files that sometimes persist after running hg update and hg qpush&#8217;ing a bitrotted patch. For now, all of the scripts that I use on a regular basis (everyday &#8211; literally) are in this suite. Installation and use documentation is on the trac site, as are current bug reports and roadmaps for the future of the toolset. I encourage you to contact me if you have any questions about how to use the scripts, or especially if you&#8217;d like to contribute to this mini-project.</p>
<p>Happy (Mozilla) Hacking!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.jwir3.com/blog/2012/09/14/hopefully-easier-firefox-building-with-jmoztools/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Prototyping Refloz (Reflow-On-Zoom)</title>
		<link>http://www.jwir3.com/blog/2012/09/04/prototyping-refloz-reflow-on-zoom/</link>
		<comments>http://www.jwir3.com/blog/2012/09/04/prototyping-refloz-reflow-on-zoom/#comments</comments>
		<pubDate>Tue, 04 Sep 2012 16:22:59 +0000</pubDate>
		<dc:creator><![CDATA[jwir3]]></dc:creator>
				<category><![CDATA[Browsers]]></category>
		<category><![CDATA[Fennec]]></category>
		<category><![CDATA[Gecko]]></category>
		<category><![CDATA[Mozilla]]></category>
		<category><![CDATA[Readability]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[fennec]]></category>
		<category><![CDATA[firefox]]></category>
		<category><![CDATA[gecko]]></category>
		<category><![CDATA[light box]]></category>
		<category><![CDATA[mozilla]]></category>
		<category><![CDATA[pan]]></category>
		<category><![CDATA[prototype]]></category>
		<category><![CDATA[readability]]></category>
		<category><![CDATA[readability 2.0]]></category>
		<category><![CDATA[reader mode]]></category>
		<category><![CDATA[reflow]]></category>
		<category><![CDATA[reflow on zoom]]></category>
		<category><![CDATA[zoom]]></category>

		<guid isPermaLink="false">http://jwir3.wordpress.com/?p=323</guid>
		<description><![CDATA[As part of the Readability 2.0 project, we&#8217;re trying a few different approaches to making text beautiful and easily readable on a mobile device in Firefox for Android. When text isn&#8217;t readable, most people think that increasing the size of the text is the answer to making it readable, and this is one approach, which [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>As part of the Readability 2.0 project, we&#8217;re trying a few different approaches to making text beautiful and easily readable on a mobile device in Firefox for Android. When text isn&#8217;t readable, most people think that increasing the size of the text is the answer to making it readable, and this is one approach, which we call &#8220;font inflation&#8221;. This technique is described (in probably excruciating detail) in a previous blog post <sup><a href="#fontInflationPost">1</a></sup>. There are a couple of other approaches, though, that we&#8217;ve been toying with.</p>
<p><span id="more-323"></span></p>
<p>One solution is to offer users a &#8220;mini reader mode&#8221; &#8211; a pop-over or &#8220;light box&#8221; that contains the text, in a more readable format, which floats over the main page. Kats <sup><a href="#katsReadabilityPost">2</a></sup> is working on a prototype to show how this might work. The original idea for this was to have a floating box overlay the text in a given area, so that user could see both the box with the more readable text, but also the context in which that text fits into the underlying page by showing the page behind the box. The idea is novel and unique to Firefox, although it&#8217;s not clear whether this prototype is going to ship in a release yet or not. In any case, Kats&#8217; prototype is really beginning to demonstrate the possibilities of this approach to improving readability.</p>
<p>Another approach is the &#8220;reflow on zoom&#8221; approach. Basically, the idea here is to reflow the page as the user zooms in, potentially narrowing the text frames in order to force text wrapping. This is a solution to the horizontal scrolling problem described in <em>Font Inflation, Fennec, and You</em> <sup><a href="#fontInflationPost">1</a></sup>. The technical details of this aren&#8217;t incredibly exciting &#8211; I added an API for specifying the max line box width, which, when changed, generates a reflow event <sup><a href="#bug780258">3</a></sup>. This API is accessible from <em>chrome </em>javascript, meaning that webpages don&#8217;t have access to this API, only javascript used as part of the rendering of the browser itself (what we call the &#8220;browser chrome&#8221;, meaning the window decorations, the address bar, etc&#8230;). Inside of the browser itself, on mobile, I then specify the max line box width to be no greater than the width of the viewport (minus some padding so that text doesn&#8217;t go right to the edge of the screen). Currently, this is still a pretty rough prototype. There are a number of things that still need to be polished before it can be ready for actual use. You can see an example of what the prototype looks like in the following image, though:</p>
<table style="margin:auto;" cellpadding="20">
<tbody>
<tr>
<td>
<p><div id="attachment_325" style="width: 190px" class="wp-caption aligncenter"><a href="http://www.jwir3.com/blog/wp-content/uploads/2012/09/scap1.png"><img class=" wp-image-325 " title="scap1" src="http://www.jwir3.com/blog/wp-content/uploads/2012/09/scap1.png?w=180" alt="Screen Capture 1, Without Reflow-On-Zoom" width="180" height="317" /></a><p class="wp-caption-text">Article without any reflow-on-zoom enhancements</p></div></td>
<td>
<p><div id="attachment_326" style="width: 190px" class="wp-caption aligncenter"><a href="http://www.jwir3.com/blog/wp-content/uploads/2012/09/scap2.png"><img class="size-medium wp-image-326" title="scap2" src="http://www.jwir3.com/blog/wp-content/uploads/2012/09/scap2.png?w=180" alt="Screen Capture 2 - With Reflow-On-Zoom" width="180" height="300" /></a><p class="wp-caption-text">Article text with reflow-on-zoom (line box width constrained to viewport width).</p></div></td>
</tr>
</tbody>
</table>
<p>The problem I&#8217;m currently working on is a positioning problem. There are two methods commonly used to trigger zoom on mobile &#8211; a double tap gesture, and a pinch gesture. If the user double taps the screen, it will find the element associated with a particular point where the double tap occurred and then zoom in to this element. Unfortunately, this is somewhat less than ideal, since the whole point of the reflow on zoom concept is for the user to specify what the ideal zoom level is for her, then have the text wrap according to this width. Many elements are already almost as wide as the viewport, so enhancing them just a bit isn&#8217;t really a useful technique &#8211; we&#8217;re not actually increasing readability.</p>
<p>The other gesture, pinching to indicate the level of zoom, is more promising, but comes with its own set of difficulties. The biggest difficulty is that when the user zooms in to a particular rectangle, we want to maintain the position of the text she zoomed in to in relation to the viewport. When the reflow event happens after changing the line box width, the text moves a bit to the left, since the width of the element changes, causing it to no longer be centered within the viewport. This can be rectified easily using similar code in the double-tap gesture approach, but only if we can identify the element into which the user wanted to zoom. This is further complicated by the fact that pinching doesn&#8217;t have a single point to zoom in on like double-tapping does. Instead, it has a beginning point, several points as the user widens their fingers, and then a final point. These points appear to track the center of the line between the user&#8217;s two fingers. So, do we take the average of these points? The first point where the user&#8217;s fingers are close together? The last point, where the user&#8217;s fingers are furthest apart? As an additional problem, we might not be able to identify a specific element correctly &#8211; a DOM element might be too large of an area for us to use &#8211; perhaps we want something more like a piece of text to target.</p>
<p>All of these problems are solvable, but the prototype is still in the early stages. It&#8217;ll probably be many more iterations of this prototype before it&#8217;s finally ready for the prime time.</p>
<h2>References</h2>
<p><a name="fontInflationPost"></a><br />
[1] Johnson, Scott. Font Inflation, Fennec, and You (2012). <em>The Nothingness of Scott</em><em>. </em>Retrieved 31 August, 2012 from <a title="http://jwir3.wordpress.com/2012/07/30/font-inflation-fennec-and-you/" href="http://jwir3.wordpress.com/2012/07/30/font-inflation-fennec-and-you/">http://jwir3.wordpress.com/2012/07/30/font-inflation-fennec-and-you/</a>.</p>
<p><a name="katsReadabilityPost"></a><br />
[2] Gupta, Kartikaya. <em>Readability 2.0 Prototyping</em> (2012). Retrieved 31 August 2012 from <a title="https://staktrace.com/spout/entry.php?id=759" href="https://staktrace.com/spout/entry.php?id=759">https://staktrace.com/spout/entry.php?id=759.</a></p>
<p><a name="bug780258"></a><br />
[3] <a title="Bug 780258" href="https://bugzilla.mozilla.org/show_bug.cgi?id=780258">Bug 780258: Add support for max line box width API</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.jwir3.com/blog/2012/09/04/prototyping-refloz-reflow-on-zoom/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>Font Inflation, Fennec, and You</title>
		<link>http://www.jwir3.com/blog/2012/07/30/font-inflation-fennec-and-you/</link>
		<comments>http://www.jwir3.com/blog/2012/07/30/font-inflation-fennec-and-you/#comments</comments>
		<pubDate>Tue, 31 Jul 2012 03:09:06 +0000</pubDate>
		<dc:creator><![CDATA[jwir3]]></dc:creator>
				<category><![CDATA[Browsers]]></category>
		<category><![CDATA[Fennec]]></category>
		<category><![CDATA[Gecko]]></category>
		<category><![CDATA[Mobile]]></category>
		<category><![CDATA[Mozilla]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[fennec]]></category>
		<category><![CDATA[firefox]]></category>
		<category><![CDATA[font-inflation]]></category>
		<category><![CDATA[mobile browsing]]></category>
		<category><![CDATA[mozilla]]></category>
		<category><![CDATA[readability]]></category>
		<category><![CDATA[software]]></category>
		<category><![CDATA[text]]></category>

		<guid isPermaLink="false">http://jwir3.wordpress.com/?p=216</guid>
		<description><![CDATA[All right small fonts - we're going to <em>PUMP - YOU - UP</em>! It's time that small fonts on mobile devices became readable with little or no effort from the user. But how does this get accomplished? How does the browser engine know which bits of text should be enlarged, and which ones should be left alone? How can the browser possibly know enlargement of specific areas of the page won't cause crazy layout problems? This article gives an overview of what font inflation is in Fennec (mobile Firefox), how it works, and what you should do to help it work more efficiently.]]></description>
				<content:encoded><![CDATA[<h2>The Need for Readability</h2>
<p>Many people in the world now use mobile devices to browse the web. It&#8217;s fast, convenient, and absolutely indispensable when you <em>absolutely have to prove that you are correct in an argument</em>. However, early on in the mobile browsing craze, my father asked me (and he wasn&#8217;t the only one), &#8220;Why would anyone choose to use the internet on such a tiny screen?&#8221; Probably the most obvious reason is the convenience of being able to look up restaurants, stores, reviews, or virtually anything, while you&#8217;re trying to find a place and you&#8217;re disconnected from a traditional desktop/monitor setup. Or, for some people, being able to play <em>Angry Birds</em> or watch a TV show while outside sitting in a hammock is enough reason to want the web on your mobile device.</p>
<p>However, small text is difficult to read. If you are unable to read text, surfing the web really isn&#8217;t that much fun. It&#8217;s a lot of frustration and irritation &#8211; a commonly enjoyable task now becomes a disliked chore. How can we get around this? Well, zooming is a common way to alleviate something that is too small &#8211; effectively including a magnifying glass in the software you write. So, if something is too small on the screen &#8211; fonts, images, smileys, shortcuts, etc&#8230; &#8211; you simply increase the number of pixels these objects take up, effectively making them larger. This works reasonably well, assuming, or course, you have enough data. But, zooming has its own issues. If we zoom in on a piece of text, we&#8217;re making that text larger, along with all the surrounding text. This is what we want, but what if by zooming in on the text to make it readable, we now have a smaller <em>amount</em> of text on the screen? That is, we have to scroll after having read only a small amount of information. If you have to scroll after having read only two words, it gets tiresome very quickly. Another issue is having to scroll in multiple directions. We&#8217;re fairly content with scrolling vertically (or horizontally, if that&#8217;s the only direction), but having to scroll horizontally AND vertically is a pain (if you don&#8217;t believe me, try reading a PDF paper on your mobile device with the default reader &#8211; after the first half page, I get annoyed at having to scroll horizontally AND vertically).</p>
<h2>Enter Font Inflation, Stage Left</h2>
<p><em>Font Inflation</em><sup><a href="#note1">1</a></sup> is the term for the Gecko implementation of an adjustment made to text during Reflow<sup><a href="#reflowNote">2</a></sup>. The basic idea is that we divide up our set of frames into some which are text containers, and then increase the size of the fonts used for text within these containers. Font Inflation, as a concept, is not actually unique to Gecko. A form of this concept, called <em>text size adjustment,</em> is also implemented in WebKit, specifically for iOS devices<sup><a href="#iOSTextSizeAdjustRef">3</a></sup>. The tricky parts are determining what constitutes a container for font size inflation, and enlarging text without drastically changing the page layout.</p>
<h3>Basic Algorithm</h3>
<address>Non-technical readers (or technically saavy readers that aren&#8217;t interested in the explicit details) might want to skip this part, as it goes over how font inflation works within Gecko.</address>
<p>David Baron developed the basic font inflation algorithm and processing in Gecko<sup><a href="#originalFIBug">4</a></sup>. There are really two basic stages in which font inflation plays a role: Frame Construction and Reflow. During the phase of Frame Construction, we mark some frames as <em>font inflation containers</em>, and a subset of these as <em>font inflation flow roots</em>. A font inflation container is a frame that is an ancestor of frames containing text, with the added condition that font inflation containers are <em>never</em> line participants (e.g. inline frames such as &lt;font&gt; and &lt;b&gt;, and line breaks), because we want font inflation to be consistent within a line (i.e. <span style="font-size:medium;">we don&#8217;t want</span> <span style="font-size:large;">font inflation</span> <span style="font-size:medium;">to adjust</span> <span style="font-size:xx-large;">a line</span> <span style="font-size:large;">like this</span>). You can think of font inflation containers as block frames containing some amount of text to be inflated. If there is more than one frame that represents a particular node in the content tree, only the outermost frame is a font inflation container. Font inflation containers happen to be the smallest unit of text for which we can disable font inflation entirely.</p>
<p>A font inflation flow root, on the other hand, is a slightly different beast. It&#8217;s a frame that is a font inflation container, where we want to start aggregation of font inflation data. In other words, it&#8217;s a bit of an artificial construct designed to fine-tune the heuristics we use to factor out things like copyright notices at the bottom of pages, and other areas of text where font inflation isn&#8217;t desired. In order to be a font inflation flow root, a frame must satisfy the following conditions:</p>
<ol>
<li>It must be a font inflation container.</li>
<li>It must establish a new <em>block formatting context</em><sup><a href="#bfcNote">5</a></sup></li>
<li>It must be either<sup><a href="#otherConditionsNote">6</a></sup>:
<ol>
<li>Absolutely positioned</li>
<li>or, floating</li>
<li>or, a table cell</li>
<li>or, it&#8217;s the root frame</li>
</ol>
</li>
</ol>
<p>If these conditions are met, then <em>during frame construction</em>, the frame is set as a font inflation flow root. This essentially means that this is the beginning of an area of &#8220;text flow&#8221; that we want to inflate. (Ideally,the content within the frames underneath a given flow root should be &#8220;connected&#8221; in the user&#8217;s mind. An example might be different paragraphs of a single section of a single article. Unfortunately, we can&#8217;t determine semantic connections, at least not without assistance from a more robust language than HTML 4.01). In other words, this is a subtree of the frame tree for which we want a separate font inflation statistical-aggregate data structure. It isn&#8217;t uncommon for the root frame to be the only font inflation flow root in a document.</p>
<p>Since I&#8217;m a visual person, I thought I&#8217;d give a visual example of what we&#8217;re talking about here. You can take a look at the example at <a title="Font Inflation Example" href="http://people.mozilla.org/~sjohnson/font-inflation-documentation/example1.html" target="_blank">http://people.mozilla.org/~sjohnson/font-inflation-documentation/example1.html</a>. If you&#8217;re currently on Firefox for Android, then you should see the font inflated page. If you&#8217;re on desktop Firefox, open a new tab, type <em>about:config</em>, search for <em>inflation</em>, and set <em>font.size.inflation.emPerLine</em> to <em>15</em> and <em>font.size.inflation.lineThreshold</em>  to <em>200</em>. You&#8217;ll then need to reload the example page. (A quick warning: this will inflate any pages you visit, so you&#8217;ll want to turn it off again after you&#8217;ve reloaded the example).</p>
<p>If you&#8217;re not interested in testing the font inflation for yourself on this example, here&#8217;s an idea of what it looks like after these inflation configuration settings have been enabled:</p>
<div id="attachment_248" style="width: 165px" class="wp-caption aligncenter"><a href="http://www.jwir3.com/blog/wp-content/uploads/2012/07/inflated-example.png"><img class="size-medium wp-image-248" title="inflated-example" src="http://www.jwir3.com/blog/wp-content/uploads/2012/07/inflated-example.png?w=155" alt="Example with Font Inflation" width="155" height="300" /></a><p class="wp-caption-text">Example page with font inflation enabled</p></div>
<p>So why weren&#8217;t the sidebar and footer inflated? Shouldn&#8217;t they have been inflated as much as possible, just like the main article text? The answer to these questions lies in the work that was done to specify regions of layout that collect separate font inflation data (the flow roots mentioned above). This example is similar in structure to the layout of the New York Times website, which we had issues with regarding font inflation abnormally inflating the footer of the page (see &#8220;Footer Text&#8221;, in the <em>Exceptions</em> section, below, for context as to why this works the way it does). In order to better understand how this process, it&#8217;s useful to look at the example alongside a representation of the frame tree that is built within Gecko at the time of page layout. A non-inflated version of this page looks something like this:</p>
<div id="attachment_242" style="width: 310px" class="wp-caption aligncenter"><a href="http://www.jwir3.com/blog/wp-content/uploads/2012/07/frame-visual-layout.png"><img class="size-medium wp-image-242" title="frame-visual-layout" src="http://www.jwir3.com/blog/wp-content/uploads/2012/07/frame-visual-layout.png?w=300" alt="Example of Font Inflation Page Layout Internals " width="300" height="199" /></a><p class="wp-caption-text">Example page rendered without font inflation. The background colors indicate which frame the particular element corresponds to in the frame tree image (below).</p></div>
<p>I&#8217;ve color-coded the different frames so that it&#8217;s easier to coordinate them with the frame tree, which looks something like the following:</p>
<div id="attachment_244" style="width: 310px" class="wp-caption aligncenter"><a href="http://www.jwir3.com/blog/wp-content/uploads/2012/07/frame-tree.png"><img class="size-medium wp-image-244" title="frame-tree" src="http://www.jwir3.com/blog/wp-content/uploads/2012/07/frame-tree.png?w=300" alt="Frame Tree Example" width="300" height="147" /></a><p class="wp-caption-text">The frame tree for the example web page, condensed for brevity and clarity.</p></div>
<p>As you can see from the frame tree diagram, the root frame and the two block frames with id &#8220;main&#8221; and &#8220;sidebar&#8221; are our font inflation flow roots. This means that font inflation data is aggregated, starting at each of these frames, and not including the other font inflation flow root frames, or their respective subtrees. The font inflation containers are the block frames &#8220;body&#8221;, &#8220;page&#8221;, and &#8220;footer&#8221;. Since the descendants of the &#8220;footer&#8221; frame are the only content within the &#8220;root frame&#8221; font inflation flow root, and the text isn&#8217;t sufficient (the meaning of this might not be clear until the lineThreshold setting is discussed below), it isn&#8217;t inflated. For the same reason, the text underneath the &#8220;sidebar&#8221; flow root isn&#8217;t inflated. The text underneath the &#8220;main&#8221; frame, however, is sufficient, and thus is inflated as expected.</p>
<p>In other words, you can think of the font inflation <em>flow roots</em> as areas of the page that collect statistical data regarding the size (i.e. text amount) of their children, <em>in total</em>. This data is then used to determine whether or not the font inflation functionality should take effect for the child frames beneath these roots. They are also used to determine the maximum width (and thus the minimum text size), if font inflation is enabled for a given frame beneath the flow root. <em>Font inflation containers</em> are used to disable font inflation entirely for a smaller chunk of text than the flow roots.</p>
<p>Once we&#8217;ve initialized our frames to have the appropriate state bits and such, we perform a font size inflation calculation during reflow. First, given a particular target frame for which we want to inflate fonts, we find its font size inflation flow root, and compute the width. In order to compute the width that descendent frames will use from a given flow root, we find the nearest common ancestor of the first and last pieces of inflatable text within a given flow root. We then use the width of this ancestor frame, which might not be the flow root itself.  Then, given the two preferences for font size inflation (discussed below), we compute the minimum font size that will satisfy these parameters and will fit within the given container width. Using this minimum font size, we map all font sizes in the target frame within the range (0-150%] of the minimum font size to the range [100-150%] of the minimum font size<sup><a href="#minFontSizNote">7</a></sup>.</p>
<div id="attachment_253" style="width: 310px" class="wp-caption aligncenter"><a href="http://www.jwir3.com/blog/wp-content/uploads/2012/07/min-font-size-diagram2.png"><img class="size-medium wp-image-253  " title="min-font-size-diagram" src="http://www.jwir3.com/blog/wp-content/uploads/2012/07/min-font-size-diagram2.png?w=300" alt="Minimum Font Size Diagram" width="300" height="200" /></a><p class="wp-caption-text">With a minimum font size of 20.0 px, 12.0 px gets mapped to 23.33 px.</p></div>
<p>Why not simply map everything under the minimum font size to the minimum font size itself? Because we want to be able to preserve differentiation between fonts at a size less than the minimum. So, for example, if we have text that is 12pt, with headers that are 16pt and 14pt, we want to make sure that all of these fonts, once adjusted, can be distinguished from one another.</p>
<p>One thing I glossed over here is that we only perform a font size inflation calculation during reflow <em>if font inflation is enabled for the frame in question</em>. This actually ends up being an important point, because there are certain situations where we want to disable font inflation for certain frames. The exceptional cases where we want to detect a certain (somewhat general) category of web page layout, and <em>disable font</em> <em>inflation</em>, either for individual frames or entire pages, is detailed in the next section.</p>
<h3>Exceptions</h3>
<p>The basic algorithm works really well, but there are still some situations where we want to limit or disable font inflation logic. Together, these situations comprise the bulk of the heuristics Gecko abides by when determining font inflation settings for a given set of frames. Development of the font inflation feature is essentially the refinement of these heuristics. Putting them together, and verifying which ones work well without too drastically impacting the performance of the rendering engine, as well as testing for correctness and general usability has been the goal of the font inflation project for the past 6+ months. Unfortunately, these don&#8217;t all fit very easily into a single area of the code, so it&#8217;s difficult to tell someone to look at the logic in X class on line Y if he/she wants to learn about how the font inflation heuristics work.</p>
<p>In the following sections, a brief summary of the most pressing issues confronting font inflation over the last few months are described. I try to explain these situations as clearly and concisely as possible. In addition, I try to give code references and documentation links that you can look to for more information if you&#8217;d like to see how something was implemented, or perhaps would like to try to fix something that you think is broken with the font inflation algorithm as a whole. That said, keep in mind that only <em>as a whole</em> do these heuristics work to bring you the font inflation feature that is new in Firefox 14.0 and the all-new Firefox for Android (Fennec), so any individual piece may be only one part of the process, or even nonsensical, when taken by itself.</p>
<h4>Small Text Bits</h4>
<p>The most notable (perhaps notorious is a better descriptor) bug we encountered when fine-tuning the heuristics is in what we&#8217;ve come to refer to as &#8220;the New York Times footer case&#8221; (<a title="Bug 706193" href="https://bugzilla.mozilla.org/show_bug.cgi?id=706193">Bug 706193</a>). In this case, the New York Times site was inflated in certain areas (conforming as expected to the basic algorithm), but there was a problem where the algorithm was over-inflating the footer text, and causing the text to wrap &#8211; the text at the bottom of the page with links to different sections of the New York Times.</p>
<div id="attachment_256" style="width: 254px" class="wp-caption aligncenter"><a href="http://www.jwir3.com/blog/wp-content/uploads/2012/07/nytimes.png"><img class="size-medium wp-image-256" title="nytimes" src="http://www.jwir3.com/blog/wp-content/uploads/2012/07/nytimes.png?w=244" alt="NY Times &quot;Footer&quot; bug in action" width="244" height="300" /></a><p class="wp-caption-text">The difference in footer text size versus the article text size was incredibly noticeable, and quite distracting for users.</p></div>
<p>This applies to situations where small bits of text are in the document, and where the layout of the page is dependent on these small bits of text. Usually, site authors may not have explicitly defined a height on these bits, because there wasn&#8217;t previously a possibility that the text could wrap. Once we inflate the size of the text, however, this assumption is no longer valid.</p>
<p>To fix this, we utilize a technique where a threshold value is specified. This threshold is an amount of text for which font inflation is disabled if the threshold is not met. However, we couldn&#8217;t just use a specific amount of text within a block directly. If this were the case, then adjacent blocks within a document that had differing amounts of text would have differing font inflation settings, resulting in possibly strange rendering of text sizes. To better adjust for this, a line threshold was added as part of the fix for this bug. The line threshold works like this &#8211; for each block formatting context, we construct a set of data by scanning the items contained within that block formatting context (BFC). As we scan, we accumulate the text in each of the frames contained in the BFC &#8211; if we find sufficient text that has the same font size for inflation, then we set a bit in the font inflation data structure that enables font inflation for that size font.</p>
<p>An astute reader will realize this sounds a lot like what was described in the &#8220;Basic Algorithm&#8221; section above. In fact, this is the case. Since it&#8217;s such an important aspect of how David rewrote the font inflation code, I consider it part of the &#8220;Basic Algorithm,&#8221; and describe it twice. One thing that I didn&#8217;t explain in detail above, though, was what makes the text amount &#8220;sufficient.&#8221; The preference that was added for controlling this is somewhat unintuitive. The name of the preference is <em>font.size.inflation.lineThreshold</em>, and it controls &#8220;the percentage of a number of lines of text we&#8217;d need to trigger inflation&#8221;<sup><a href="#mxrNote1">8</a></sup>. What that means is that if each of our characters&#8217; widths are equivalent to 1em (most characters aren&#8217;t &#8211; they are usually smaller than this), then a value of 100 for this preference means we&#8217;d need 1 line of 1em-width text to trigger font inflation. Since we know the width and the size of the font for the text, we can determine how much text will fit on a line, based on the em-size of the text. By default, (at the time of this writing), the value for this threshold is 400, which means we need <em>approximately</em> 4 lines of text (under the assumption that all characters are square, which means that we&#8217;ll actually only need slightly under 2 lines of normal text) to trigger font inflation.</p>
<h4>Constrained-Height Blocks</h4>
<p>One of the first caveats to the font inflation algorithm that was recognized by David Baron was that block-level elements that have a constrained height cannot perform font inflation in the same way as blocks with unconstrained heights. The point of font inflation in the first place is to increase readability while discouraging the use of horizontal scrolling. This second part is important in this case, because if we want to avoid horizontal scrolling, then at some point, we&#8217;re always going to have constrained width. This means that as text gets larger, there will be more lines of text, since wrapping will happen more frequently. This is, in large part, due to the fact that the ultimate upper bound on the width, the screen size, remains constant. Thus, since we have more lines of text, we&#8217;re going to grow in the block direction &#8211; i.e. the height of our blocks will grow as font inflation deviates more and more from the original font size.</p>
<p>This issue was addressed in the <a title="Allow minimum font size based on size of frame" href="https://bugzilla.mozilla.org/show_bug.cgi?id=627842">original font inflation bug</a> with a new frame state bit, NS_FRAME_IN_CONSTRAINED_HEIGHT. If the font inflation algorithm detects that a frame has this bit set, it does not enable font inflation for that frame. Interestingly, we&#8217;d also need to handle this case if we were to implement <em>reflow-on-zoom </em>(see the bottom part of note <a href="#note1">1</a> for more details about reflow-on-zoom), so this is a problem that plagues both of the major readability enhancement solutions.</p>
<p>A related, but slightly different bug, had to do with <a title="Bug 708175" href="https://bugzilla.mozilla.org/show_bug.cgi?id=708175">constrained sizes with form controls</a>. This was actually the symptom of a more general case, wherein if a frame was to be inflated, but between that frame and it&#8217;s nearest ancestor font inflation container on the frame tree there was a frame representing a non-inline element with constrained height or width (because these can&#8217;t wrap), then font inflation should not happen on that frame. This sounds complex, but, in reality, it&#8217;s a pretty simple case of determining whether we can actually inflate, based on size restrictions.</p>
<h4>Mobile Sites</h4>
<p>Sites that are already optimized for mobile (e.g. m.twitter.com) likely don&#8217;t need additional inflation, since the web developer already has adjusted the font size to fit on a phone-sized screen. These sites can often be detected by looking for the mobile-specific tag &lt;meta name=&#8221;viewport&#8221;&gt; in the header of the document. However, this was a bit tricky for us, because the code that detects the &lt;meta name=&#8221;viewport&#8221;&gt; tag was in the front-end code of Firefox, rather than in the platform, Gecko. As part of <a title="font inflation not working well on mobile sites" href="https://bugzilla.mozilla.org/show_bug.cgi?id=706198">Bug 706198</a>, we pulled the processing of the &lt;meta name=&#8221;viewport&#8221;&gt; element into Gecko and added two conditions that disable font inflation in what we consider to be &#8220;mobile&#8221; cases.</p>
<p>The first case depends on the default zoom attribute, which corresponds to the <em>initial-scale</em> attribute of the viewport metadata element. What this indicates is how &#8220;zoomed in&#8221; the viewport is initially upon page load. Typically, this value is inferred from other settings (such as when width or height are set) in the viewport metadata, so it&#8217;s not usually specified directly, unless a developer wants to use a specific zoom setting<sup><a href="#operaNote">9</a></sup>. If this default zoom attribute is greater than or equal to 1.0, then we assume that this was set explicitly, or inferred from the width/height being set, which are typically done on mobile-optimized websites. Thus, in this case, we disable font inflation. Similarly, we disable font inflation on sites where the width or height attributes of the viewport meta tag are set to <em>device-width</em>.</p>
<p>There&#8217;s also something somewhat subtle about the logic for this condition &#8211; if the doctype string contains the text &#8220;WML&#8221;, &#8220;WAP&#8221;, or &#8220;Mobile&#8221;, or if the meta tag &lt;meta name=&#8221;handheldFriendly&#8221;&gt; has its content equal to &#8220;true&#8221;, we return early from our viewport metadata processing. Since the defaultZoom in this case is initially set to 1.0, font inflation will be disabled under these conditions as well. The former of these indicates that the page is using either the XHTML Mobile Profile or the Wireless Markup Language<sup><a href="#xhtmlNote">10</a></sup>, and the latter indicates that the site is optimized for mobile using the old AvantGo standard for Palm devices (being phased out now, I believe).</p>
<h4>Lists</h4>
<p><a title="Ordered list numerals are cut off" href="https://bugzilla.mozilla.org/show_bug.cgi?id=758079">Bug 758079</a> shows another, more difficult bug to deal with. Bullets and ordered list numerals are rendered in the space given to either the left (for left to right text) or right (for right to left text) of the list item. Specifically, this ends up being placed in the margins of the block element in which the list is embedded. Unfortunately, this isn&#8217;t associated in the code directly with the list item itself. That means that if the list item is inflated, the space to the left or right (where the bullet/list numeral is rendered) is not inflated. By default, the area we have to render a list numeral or bullet icon is 40px. This normally works fine, but once we start playing with the font size in the rendering engine, we end up with numerals that might be larger than the amount of space we have in which to render the text. In this case, the text gets clipped somewhere before the start of the block element&#8217;s boundary.</p>
<p>Ideally, we&#8217;d solve this problem by linking the thing that constructs the indentation of the list item with the list item itself within the platform. This could be a quite massive change, though, and would require that we significantly reconstruct how we deal with bullets and lists. Instead, we opted for a bit more pragmatic approach: increase the amount of margin space in the event of font inflation. We increase the margin by multiplying the default margin size by the same ratio as the text in the bullet is inflated.</p>
<h4>Incorrect Flow Roots</h4>
<p>As a final exception to the basic algorithm, I&#8217;m going to discuss a problem that we don&#8217;t yet have a solution for: incorrect flow root assignment. Sometimes, we actually don&#8217;t want a table cell or float to be a flow root. It can cause issues like what happens at ycombinator.com when reading comments (<a title="Bug 707195" href="https://bugzilla.mozilla.org/show_bug.cgi?id=707195">Bug 707195</a>):</p>
<div id="attachment_307" style="width: 190px" class="wp-caption aligncenter"><a href="http://www.jwir3.com/blog/wp-content/uploads/2012/07/sjohnson.png"><img class="size-medium wp-image-307" title="ycombinator" src="http://www.jwir3.com/blog/wp-content/uploads/2012/07/sjohnson.png?w=180" alt="Incorrect Flow Roots for Tables" width="180" height="300" /></a><p class="wp-caption-text">Sometimes we don&#8217;t want to make individual table cells flow roots</p></div>
<p>Because some sites utilize tables for layout (indentation in the case of ycombinator.com) rather than for actually displaying tabular data, there exists a problem where the same type of syntactic node is used for two vastly different things. When indentation is controlled by tables by using nested tables, the width of each individual cell gets smaller with each nesting. This causes comments that come later in the thread (and thus are indented more) to be inflated less, and comments that come earlier in the thread to be inflated more, simply due to width restrictions. Because each table cell is an individual font inflation flow root, we can&#8217;t accumulate data across table cells to consistently apply font inflation to the entire set of table cells.</p>
<p>Somehow, we need to add heuristics to determine when a table cell is used for layout, and thus should not be a font inflation flow root, and when it should be a flow root. This isn&#8217;t unique to tables, either. Reddit.com also experiences a similar problem:</p>
<div id="attachment_308" style="width: 178px" class="wp-caption aligncenter"><a href="http://www.jwir3.com/blog/wp-content/uploads/2012/07/sjohnson1.png"><img class="size-medium wp-image-308" title="reddit" src="http://www.jwir3.com/blog/wp-content/uploads/2012/07/sjohnson1.png?w=168" alt="Example image of font inflation on reddit.com" width="168" height="300" /></a><p class="wp-caption-text">Reddit.com has a similar issue with nested div elements</p></div>
<h2>Conclusion</h2>
<p>The all-new Firefox for Android, nicknamed &#8220;Fennec&#8221; or, sometimes, &#8220;Fennec Native&#8221; has shipped. The new readability enhancements described above are included in this version of the software. This is fantastic, and it makes readability for the web on the Android platform better than ever. But, the work isn&#8217;t done yet. Font inflation is a great feature, but it&#8217;s not the only aspect of readability that we want to include in future versions of Firefox. Crisper, clearer fonts are also on the docket, along with an investigation of how reflow on zoom might be incorporated into our product. Another area of current development is <em>Reader Mode</em><sup><a href="#readerMode">11</a></sup>. Reader Mode takes the text content of an article, strips away aspects of the page that might not be relevant to a user while trying to read the article, and places the resulting text onto a more readable background, with an easier-to-read font.</p>
<p>Let&#8217;s face it &#8211; much of what we do on the web is reading. We read news articles to learn about current events. We read recipes in order to prepare that fantastic salmon dinner your boyfriend/girlfriend wants. We read through instructions on how to fix that misfiring cylinder in our car. Almost every web page you visit has some text on it &#8211; it&#8217;s integral to the way we communicate and live. We want to make that experience not just better, but better than any other browser on the market. We literally (no pun intended) want everyone &#8212; from your 102-year-old grandmother to your 4-year-old nephew who just learned to read &#8212; to be able to interpret clear text in Firefox as easily as if they were reading a piece of paper. Our goal is to develop the features that will make you want to use Firefox as your daily browser because of how it renders text.</p>
<h2>Notes and References</h2>
<p><em>A special thanks to Daniel Holbert and David Baron for proofreading this post and pointing out issues they saw. Guys, I really appreciate your help and guidance!</em></p>
<p><a name="note1"></a></p>
<p>[1] This is sometimes called &#8220;text size adjustment,&#8221; or just &#8220;text size adjust.&#8221; <em>Font inflation</em> is the name given to the Gecko implementation of this feature. Note that this is actually different than <a title="Font-size-adjust CSS Property" href="http://www.w3.org/TR/css3-fonts/#propdef-font-size-adjust">font-size-adjust</a>, a CSS property that is used to preserve the <em>aspect value</em> (relative height of lowercase letters as compared to uppercase equivalents). It&#8217;s quite confusing, since both the <a title="Text-size-adjust property definition" href="https://developer.mozilla.org/en/CSS/text-size-adjust">text-size-adjust</a> and font-size-adjust properties exist, and are different. It can also be confused with <em>Reflow on zoom</em>, another technique for increasing readability, which triggers the reflow process when a user double-taps to zoom. The key to this approach is that the user has effectively given us more information about what he/she is interested in, and thus we are able to make that text larger at the expense of the rest of the page (which is outside the viewport). Unfortunately, this approach doesn&#8217;t play nicely with panning after zooming, nor does it work quite right with pinch-to-zoom interfaces. Opera and the Android stock browser use the latter technique for readability, whereas the former is used by Google Chrome, Firefox, and Safari.<a name="reflowNote"></a></p>
<p>[2] <em>Reflow </em>is the process by which frames representing rectangular areas containing the content of a webpage, are laid out (i.e. given a width and height, and x and y locations on the screen) by the rendering engine of a web browser in preparation for display on the screen. Rendering a webpage happens essentially in a set of phases: 1) construction of a data structure representing content (element) tree, 2) parsing and construction of the style data structure, 3) combination of the style data structure and content tree to construct frame (or render) tree, 4) reflow, which includes placing and sizing frames, and 5) Painting/Compositing, which is the process of utilizing the frame tree, content tree, and style structures to produce individually-colored pixels, which are then drawn on the screen. Much of what we call &#8220;layout&#8221; code in Gecko is specifically targeted toward algorithms that create the frame tree and place content within frames during the reflow process. You can see an example of how reflow works (visually) by watching the following video: <a title="Gecko Reflow Visualization" href="http://www.youtube.com/watch?v=ZTnIxIA5KGw">Gecko Reflow Visualization</a>.<a name="iOSTextSizeAdjustRef"></a></p>
<p>[3] Adjusting the Text Size (2011). <em>Safari Web Content Guide</em>, iOS Developer Library. Retrieved 28 June 2012, from <a href="http://developer.apple.com/library/ios/#DOCUMENTATION/AppleApplications/Reference/SafariWebContent/AdjustingtheTextSize/AdjustingtheTextSize.html">http://developer.apple.com/library/ios/#DOCUMENTATION/AppleApplications/Reference/SafariWebContent/AdjustingtheTextSize/AdjustingtheTextSize.html</a><a name="originalFIBug"></a></p>
<p>[4] Font inflation as a feature in Gecko was originally developed under <a title="Allow minimum font size based on size of frame" href="https://bugzilla.mozilla.org/show_bug.cgi?id=627842">Bug 627842</a><a name="originalFIBug"></a>: Allow minimum font size based on size of frame, which landed on mozilla-central on 23 November, 2011. It wasn&#8217;t included in a release until the new Firefox for Android, which happens to be Firefox 14.0.<a name="bfcNote"></a></p>
<p>[5] A container that establishes a new <em>Block Formatting Context</em> is a container inside which individual block frames are laid out vertically (i.e. in the &#8220;block&#8221; direction). A new block formatting context is created with an absolutely positioned frame, a float, a block container that&#8217;s not a block box, and a block box with an overflow setting other than &#8216;visible&#8217;. All of the items in condition 3 establish a new block formatting context, so this condition is somewhat redundant, and serves only so that this can be described in more detail. The visual formatting section of the CSS v2 specification has more information on block formatting contexts at <a href="http://www.w3.org/TR/CSS2/visuren.html#block-formatting">http://www.w3.org/TR/CSS2/visuren.html#block-formatting</a>.<a name="otherConditionsNote"></a></p>
<p>[6] There are a couple of other situations where a font inflation flow root is established. Namely, nsOuterSVGFrame (frames that bound the outermost &lt;svg&gt; element in an SVG document), nsSVGForeignObjectFrame (frames within an SVG document containing <a title="SVG Foreign Object Specification" href="http://www.w3.org/TR/SVG/extend.html">SVG Foreign Objects</a>), nsBoxFrame (frames containing <a title="XUL Box Documentation" href="https://developer.mozilla.org/en/XUL/box">XUL boxes</a>), and nsLeafBoxFrame (a generic class containing logic that is shared by the frames displaying <a title="XUL Tree" href="https://developer.mozilla.org/en/XUL/tree">XUL trees</a>, <a title="XUL Images" href="https://developer.mozilla.org/en/XUL_Tutorial/Adding_Labels_and_Images#Images">XUL images</a>, and <a title="XUL Textbox" href="https://developer.mozilla.org/en/XUL/textbox">XUL text boxes</a>), but these are glossed over since they are reasonably special cases, and aren&#8217;t probably of interest to the reader.<a name="minFontSizeNote"></a></p>
<p>[7] This algorithm might change in the future. Currently, the algorithm has a somewhat flat curve in terms of font differentiation, and we&#8217;d like it to be a bit steeper, so that different font sizes are more readily distinguishable after inflation. See <a title="Bug 777089" href="https://bugzilla.mozilla.org/show_bug.cgi?id=777089">Bug 777089</a> for more information.<a name="mxrNote1"></a></p>
<p>[8]  <a title="Mozilla HG Reference Source Code Link" href="http://hg.mozilla.org/mozilla-central/file/30dce13b71d0/modules/libpref/src/init/all.js#l1654">http://hg.mozilla.org/mozilla-central/file/30dce13b71d0/modules/libpref/src/init/all.js#l1654</a><a name="operaNote"></a></p>
<p>[9] Bovens, Andreas (2011). An Introduction to meta viewport and @viewport. Retrieved June 28, 2012, from <a title="An Introduction to meta viewport and @viewport" href="http://dev.opera.com/articles/view/an-introduction-to-meta-viewport-and-viewport/">http://dev.opera.com/articles/view/an-introduction-to-meta-viewport-and-viewport/</a>.<a name="xhtmlNote"></a></p>
<p>[10] XHTML Mobile Profile. <em>Wikipedia: The Free Encyclopedia</em>. Retrieved June 28, 2012, from <a title="XHTML Mobile Profile" href="http://en.wikipedia.org/wiki/XHTML_Mobile_Profile">http://en.wikipedia.org/wiki/XHTML_Mobile_Profile.</a><a name="readerMode"></a></p>
<p>[11] Rocha, Lucas (2012). <em>Reader Mode in Firefox Mobile</em>. Retrieved June 29, 2012, from <a title="Reader Mode in Firefox Mobile" href="http://lucasr.org/2012/06/21/reader-mode-in-firefox-mobile/">http://lucasr.org/2012/06/21/reader-mode-in-firefox-mobile/.</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.jwir3.com/blog/2012/07/30/font-inflation-fennec-and-you/feed/</wfw:commentRss>
		<slash:comments>27</slash:comments>
		</item>
		<item>
		<title>Now You Have a Friend in the Kung Fu Business</title>
		<link>http://www.jwir3.com/blog/2012/02/15/now-you-have-a-friend-in-the-kung-fu-business/</link>
		<comments>http://www.jwir3.com/blog/2012/02/15/now-you-have-a-friend-in-the-kung-fu-business/#comments</comments>
		<pubDate>Wed, 15 Feb 2012 23:16:29 +0000</pubDate>
		<dc:creator><![CDATA[jwir3]]></dc:creator>
				<category><![CDATA[Kung Fu]]></category>
		<category><![CDATA[class]]></category>
		<category><![CDATA[commercials]]></category>
		<category><![CDATA[funny]]></category>
		<category><![CDATA[kung fu]]></category>
		<category><![CDATA[students]]></category>
		<category><![CDATA[teaching]]></category>
		<category><![CDATA[wu chi]]></category>

		<guid isPermaLink="false">http://jwir3.wordpress.com/?p=184</guid>
		<description><![CDATA[Almost two years ago, my friend Ryan Carden started a martial arts school here in Burnsville, MN, and was kind enough to ask me to assist him in teaching. Since then, we&#8217;ve grown quite a bit, but we&#8217;re always looking for new students. During classes, we typically listen to the radio, and inevitably, hear the [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Almost two years ago, my friend Ryan Carden started a martial arts school here in Burnsville, MN, and was kind enough to ask me to assist him in teaching. Since then, we&#8217;ve grown quite a bit, but we&#8217;re always looking for new students. </p>
<p>During classes, we typically listen to the radio, and inevitably, hear the Tom Shane, Shane Co., commercials. I told Ryan that we should do something similar to this, but instead of saying &#8220;Now you have a friend in the diamond business&#8221;, insert our own tagline, &#8220;Now you have a friend in the Kung Fu business.&#8221; He thought it was a pretty funny idea, and definitely something that would draw attention. </p>
<p>So, almost two years later, I finally decided that it was time to put this idea to the test. I don&#8217;t know if it will ever make it into mainstream radio, and I&#8217;m not sure I got the monotone sound of my voice correct, but here&#8217;s a little tidbit for your listening enjoyment:</p>
<p><a href="http://www.glasstowerstudios.com/files/WuChiFightingArts-Radio.mp3" title="Wu Chi Fighting Arts Radio Commercial">Wu Chi Fighting Arts Radio Commercial</a></p>
<p>It&#8217;s somewhat amusing, at least if you&#8217;re bored out of your mind.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.jwir3.com/blog/2012/02/15/now-you-have-a-friend-in-the-kung-fu-business/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
<enclosure url="http://www.glasstowerstudios.com/files/WuChiFightingArts-Radio.mp3" length="1446893" type="audio/mpeg" />
		</item>
		<item>
		<title>The Lifecycle of Demons</title>
		<link>http://www.jwir3.com/blog/2012/01/21/the-lifecycle-of-demons/</link>
		<comments>http://www.jwir3.com/blog/2012/01/21/the-lifecycle-of-demons/#comments</comments>
		<pubDate>Sun, 22 Jan 2012 03:14:38 +0000</pubDate>
		<dc:creator><![CDATA[jwir3]]></dc:creator>
				<category><![CDATA[Book Reviews]]></category>
		<category><![CDATA[Cosmic Dice]]></category>
		<category><![CDATA[Mythology]]></category>
		<category><![CDATA[amazon]]></category>
		<category><![CDATA[books]]></category>
		<category><![CDATA[demons]]></category>
		<category><![CDATA[fantasy]]></category>
		<category><![CDATA[fiction]]></category>
		<category><![CDATA[goblins]]></category>
		<category><![CDATA[immortality]]></category>
		<category><![CDATA[mad void]]></category>
		<category><![CDATA[magic]]></category>
		<category><![CDATA[ogres]]></category>
		<category><![CDATA[orcs]]></category>
		<category><![CDATA[reading]]></category>
		<category><![CDATA[salamander]]></category>
		<category><![CDATA[shapeshifting]]></category>

		<guid isPermaLink="false">http://jwir3.wordpress.com/?p=172</guid>
		<description><![CDATA[I think that A. Lee Martinez's writing style developed significantly in the year between the publishing of <em>Gil's All Fright Diner</em><sup><a href="#note2">2</a></sup> (his first novel) and <em>In the Company Of Ogres</em>.]]></description>
				<content:encoded><![CDATA[<p><a href="http://www.jwir3.com/blog/wp-content/uploads/2012/01/ogres.png"><img src="http://www.jwir3.com/blog/wp-content/uploads/2012/01/ogres.png" alt="In the Company of Ogres Graphic" title="In the Company of Ogres" width="144" height="149" class="alignleft size-full wp-image-185" /></a>I just finished reading <em>In the Company of Ogres</em>, by A. Lee Martinez<sup><a href="#note1">1</a></sup>. The essential plot line follows an individual named Ned (called &#8216;Never Dead Ned&#8217;), who is probably what I would consider an &#8220;anti-hero.&#8221; Ned is pretty much incompetent at everything in his life &#8211; he can&#8217;t really do anything well, or in many cases, even sub-par, with one exception &#8211; he can&#8217;t die. Or, rather, he can die (he&#8217;s actually pretty practiced at that), but for reasons that become clear later in the book, Ned doesn&#8217;t stay dead.</p>
<h2>Synopsis</h2>
<p>At the beginning of the book, Ned is an accountant for Brute&#8217;s Legion, an army of skilled and fearsome warriors. We get the impression that, while Ned isn&#8217;t extraordinarily good at being an accountant, he isn&#8217;t awful at it, either. He is transferred from this position to a command position in Ogre Company, which is a motley assortment of undisciplined characters that include a fire-breathing salamander, a shapeshifting goblin, several ogres (for which the company is apparently named), a promiscuous siren, and a bloodthirsty Amazon.</p>
<p>Ned isn&#8217;t quite sure how to handle this command position, and he is fairly disinterested in being a commander in general. As the story progresses, we learn more about Ned&#8217;s past, which leads to a confrontation that could ultimately destroy universes (yes, plural!). Ned is also the subject of essentially two female crushes, although he is oblivious to both of them. This situation adds humor and a bit of frustration to the novel. Frustration is felt by the reader (at least by me) on behalf of Ned&#8217;s two lovers&#8217; feelings going not only unrequited, but unacknowledged. Add to this a plot to destroy Ned as a commander (in normal terms, this would mean killing the individual, but since Ned doesn&#8217;t stay dead, this becomes quite a conundrum), and there is a whole avenue of ridiculous humor to be explored.</p>
<h2>Comparison to Other Works</h2>
<p>I think that A. Lee Martinez&#8217;s writing style developed significantly in the year between the publishing of <em>Gil&#8217;s All Fright Diner</em><sup><a href="#note2">2</a></sup> (his first novel) and <em>In the Company Of Ogres</em>. The writing seems to be more fluid in <em>In the Company of Ogres</em>, whereas in <em>Gil&#8217;s All Fright Diner</em>, it seemed to me that the author was still trying to determine his place in the set of amusing and ridiculous fantasy novels. With <em>In the Company of Ogres</em>, Martinez seems to blend well with other authors in this genre such as Terry Pratchett, Douglas Adams, and (in some cases) Neil Gaiman.</p>
<p>One thing I will say regarding the comparison between <em>Gil&#8217;s All Fright Diner</em> and <em>In the Company of Ogres</em> is that I actually thought the overall topic of <em>Gil&#8217;s All Fright Diner</em> was more interesting. I&#8217;m not exactly sure why, but it seems to me that when reading a fantasy novel, especially one that&#8217;s set in an era similar in style to Earth&#8217;s &#8220;middle ages&#8221; (e.g. weapons are mostly melee, farming is done by hand, communication done by carrier pigeon or other bird, etc&#8230;), magic, demons, monsters, etc&#8230; are all just <em>expected</em>. So, the fact that in <em>Gil&#8217;s All Fright Diner</em>, a novel set in a rural town in what appears similar to modern America, the two main characters are a vampire and a werewolf, is original and unexpected. Even more unexpected is the fact that nobody seems to give this a second thought!</p>
<h2>Review</h2>
<p>Overall, I was pleased with the novel. I thought that the protagonist, in this case, Never Dead Ned, was interesting and developed in an unexpected way over the course of the novel. The novel was fairly funny, and it kept me interested throughout the book. I only have two criticisms about the book in general. One is that I thought the idea of the <em>Mad Void</em> &#8211; the supposed all-powerful demon asleep in Ned&#8217;s mortal shell &#8211; was somewhat hard to swallow, given that he had (some) difficulty defeating Rucka (a supposed smaller, or less-powerful demon). The Mad Void is introduced as a character that literally destroys universes for entertainment &#8211; that&#8217;s how powerful he is. On the other hand, he was somehow bound into a mortal form and trapped, as well as (almost) being defeated by Rucka. This sort of boggles my mind, and it might have been interesting to have a chapter on the back-history of the Mad Void either when he is first introduced, or perhaps at the beginning of the novel. Something that makes it clear how he was trapped in that shell originally, and why the Red Woman was assigned to watch him (rather than one of the magicians that originally trapped him) would have been useful.<em></em></p>
<p>The only other criticism I have of the novel is the idea of Ned&#8217;s autonomous left arm. I don&#8217;t think the idea is bad &#8211; in fact, I think it was a great idea that just wasn&#8217;t pushed quite hard enough. In the beginning, it&#8217;s introduced that Ned doesn&#8217;t have complete control over this arm, and my first reaction was &#8220;Oh boy, this is going to be funny later in the book.&#8221; There are some scenes where it enters in, such as in the pub when Ned first arrives at Ogre Company, but other than that, this plot device isn&#8217;t used much until the end of the book. I think it would have been really funny if it had gotten him into some strange troubles. I can see all kinds of jokes, especially given that there were two women chasing Ned, but Ned was somewhat oblivious to both of them. If the arm wasn&#8217;t oblivious, and had a mind of its own in situations like this, it would have been hilarious to see the reactions from Regina and Miriam as they get multiple signals from Ned &#8211; one of disinterest from Ned himself, but one of innate attraction from Ned&#8217;s left arm.</p>
<p>All in all, though, the book is definitely worth reading. I&#8217;m excited to see Martinez&#8217;s development as an author, and I&#8217;m looking forward to reading his other novels soon.</p>
<p>[<a name="note1"></a>1] <a href="http://www.amazon.com/Company-Ogres-Lee-Martinez/dp/0765354578/ref=sr_1_1?ie=UTF8&amp;qid=1327201922&amp;sr=8-1">In The Company of Ogres</a>.<br />
[<a name="note2"></a>2] <a href="http://www.amazon.com/Gils-All-Fright-Diner-Martinez/dp/0765350017/ref=sr_1_1?ie=UTF8&amp;qid=1327201467&amp;sr=8-1">Gil&#8217;s All Fright Diner</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.jwir3.com/blog/2012/01/21/the-lifecycle-of-demons/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Let the Games End</title>
		<link>http://www.jwir3.com/blog/2012/01/13/let-the-games-end/</link>
		<comments>http://www.jwir3.com/blog/2012/01/13/let-the-games-end/#comments</comments>
		<pubDate>Fri, 13 Jan 2012 16:51:47 +0000</pubDate>
		<dc:creator><![CDATA[jwir3]]></dc:creator>
				<category><![CDATA[Book Reviews]]></category>
		<category><![CDATA[Mythology]]></category>
		<category><![CDATA[books]]></category>
		<category><![CDATA[catching fire]]></category>
		<category><![CDATA[hunger games]]></category>
		<category><![CDATA[mockingjay]]></category>
		<category><![CDATA[movie]]></category>
		<category><![CDATA[mythology]]></category>
		<category><![CDATA[opinion]]></category>
		<category><![CDATA[review]]></category>

		<guid isPermaLink="false">http://jwir3.wordpress.com/?p=125</guid>
		<description><![CDATA[I was warned, by my sister, prior to starting the Hunger Games series, that she considered the series excellent, but she pretends that the last two books in the series don't exist.]]></description>
				<content:encoded><![CDATA[<p>I recently finished the book <em>Mockingjay</em>, by Suzanne Collins<sup><a href="#note1">1</a></sup>, which is the last in a trilogy including both <em>The Hunger Games</em><sup><a href="#note2">2</a></sup> and <em>Catching Fire</em><sup><a href="#note3">3</a></sup>. I was warned, by my sister, prior to starting the series, that she considered the series excellent, but she pretends that the last two books in the series don&#8217;t exist. I&#8217;m still unsure why her hatred of <em>Catching Fire</em> and <em>Mockingjay</em> (this last one in particular) are so intense. I found that the books told an interesting story, albeit in a rather immature and unpolished writing style. This is a short review of each of the books in the series, ending with a review of the series as a whole.</p>
<h2>The Hunger Games</h2>
<p>This book introduces the characters that will tell the story of a revolution. Specifically, it&#8217;s told from the perspective of one Katniss Everdeen, a teenage girl from a place called District 12. District 12, we find out, is one of twelve (formerly 13) districts in a country called Panem. Panem exists as a country, ruled by a totalitarian government that is located in a separate district, called (unimaginatively) The Capitol. Each of the districts provides much needed food and supplies to citizens in the Capitol, which are essentially an aristocracy bend on doing nothing, but yet have an unsatisfying urge to be entertained. The Capitol pushes each of the districts to the brink of starvation, but keeps them subjugated with brutal enforcers known as Peacekeepers.</p>
<p>We find out early in the story that there were previously 13 districts, but District 13 incited a rebellion against the Capitol, resulting in it being entirely obliterated. As another repercussion of the failed coup, each district must give two children (known as Tributes) to the Capitol each year for a sport they call, &#8220;The Hunger Games.&#8221; In the Games, the children essentially fight to the death in a complicated arena for the entertainment of the Capitol&#8217;s citizens (and horror of those parents and friends watching from the other districts). Each year, there is exactly one winner.</p>
<p>The rationale for calling this bizarre circus &#8220;The Hunger Games&#8221; isn&#8217;t immediately clear, until you find out that from each district, every child between the ages of 12 and 18 must sign up once per year from their twelfth birthday,  to be chosen as a tribute. So, for example, if a child is twelve, they must enter their name once. If they are thirteen, twice. After that, you can put your name into the pool of potential tributes additional times for &#8220;tessera,&#8221; which are basically additional rations, in the event your family is poor and cannot afford enough food.</p>
<p>Now, I won&#8217;t ruin the story for you in telling all of the dramatics, but suffice it to say that Katniss is chosen as a tribute (albeit through a roundabout way). Likewise, a male tribute is chosen from District 12 named Peeta Mellark. Peeta and Katniss have an interesting history, which basically entails a sort of &#8220;love from afar&#8221; idea, but you don&#8217;t learn about this until later on in the novel. It&#8217;s used as a plot device to springboard into the rebellion that comes in the later novels.</p>
<p>All in all, the book is interesting. I enjoyed the concept of the arena, and how the Hunger Games are played out. The novel feels like you&#8217;re watching a grisly reality TV show. It&#8217;s a fascinating environment Katniss and Peeta exist within, and you&#8217;re thrown into this world that is similar to our world, but in many ways, you&#8217;re not sure what has been remembered from the time before Panem. I do thing it would have been interesting if more historical context were given. For example, a sub-story begins to develop when Katniss recalls a girl that was taken by the Capitol before her and her friend, Gale&#8217;s eyes. We find out that the girl has been turned into an &#8220;Avox&#8221; &#8211; which essentially just means her tongue was cut out. But no connection is made between this and the rest of the story. It&#8217;s as if the whole thing is simply a roundabout explanation of Avoxes in general. Instead, I think it would have been more interesting to have that part of the back-story lead somewhere, rather than simply being told and then dropped. I also had a number of questions like &#8220;Where did the hovercrafts come from?&#8221; and &#8220;How is an arena chosen and constructed?&#8221; which were left similarly unanswered.</p>
<p>There were some great lines from the book. I especially liked the line &#8220;May the odds be ever in your favor.&#8221; I find it exciting when an author can create a phrase, which, at first glance, seems uninteresting, but the more you read it and it rolls around in your mind, the better it seems<sup><a href="#note4">4</a></sup>.</p>
<p>The major criticism I have of the novel, and really of the entire series, is that there doesn&#8217;t seem to be any character development. Every character is basically the same, personality-wise, from the beginning of this novel to the end of the last novel in the series. Especially Katniss Everdeen &#8211; she doesn&#8217;t seem to change throughout the entire series, even though we&#8217;re basically reading her thoughts and fears. They don&#8217;t seem to change from the moment we&#8217;re thrown in to the novel. This is probably partially a result of the book reading as though it was written by a twelfth-grader. Many of the sentences are short and direct. There isn&#8217;t a lot of self-reflection or complexity to the characters or the settings. The book is very focused on action and navigation from one plot point to another &#8211; one problem/climax/resolution set to another. Everything in the novel is black and white &#8211; there isn&#8217;t a lot of gray area shown.</p>
<h2>Catching Fire</h2>
<p>Katniss and Peeta are returned to the arena (in a special Hunger Games called a &#8220;Quarter Quell&#8221;), each having made a &#8220;deal&#8221; with Haymitch to keep the other alive. The reason for their being returned to the Hunger Games is mostly inferred to be a political move on President Snow&#8217;s part. He is attempting to crush the rebellion that started with Peeta and Katniss refusing to let only one victor be taken from the arena in the previous novel. Katniss learns that just their unwillingness to obey the manipulations of the Capitol and instead put up a small resistance of their own has sparked sentiments of unrest that have been growing for quite a while.</p>
<p>Add to this the growing tension between Gale and Peeta after Katniss and Peeta&#8217;s return from the Hunger Games, and there&#8217;s an actual story here. There is also some mystery revealed about the aforementioned District 13, previously thought to have been destroyed, actually being alive and well, albeit beneath the surface of the original district. The oppressive hand of the Capitol swoops down on District 12 in the form of additional security, and both Katniss and Gale have a run-in with the new guards, most of which aren&#8217;t as easy to appease as the previous ones were.</p>
<p>Tributes are chosen from among the other district&#8217;s victors, and surprisingly, instead of outright trying to kill Katniss and Peeta within the Games, some of them actually protect the newest victors from the dangers of the arena (and the other tributes who have decided, for whatever reason, not to &#8220;play ball&#8221;). In an epic conclusion, they actually assist Katniss in escaping from the arena without the games being finished. Peeta, however, isn&#8217;t quite as lucky. He gets left behind and we are led to assume he&#8217;s been captured by the Capitol.</p>
<p>Of the books in the series, this novel was probably my favorite in several regards. Before we get into the details, though, one needs to overlook the stupid repetition that is reminiscent of another plot hole that leaves one thinking, &#8220;Really? That&#8217;s the best you could come up with? A second Death Star?&#8221; (Oops.. I meant &#8220;Hunger Games.&#8221; A second &#8220;Hunger Games.&#8221;) Once you look past that, though, you begin to see the complexity of what&#8217;s happening. The idea of the clock as an arena was really intriguing, made even more so by the first showing of the watch to Katniss during the celebrations by Plutarch.</p>
<p>And then there&#8217;s the whole idea of District 13. Are they still around? It is interesting to think the Capitol has been using the same video shots over and over, if they could have actually gone back to the original site. But, if this were true, why wouldn&#8217;t have District 13 been clandestinely aiding the other districts?</p>
<p>It also  gives rise to a bunch of questions that really aren&#8217;t answered &#8211; where are the arenas physically located? Are they within the Capitol or somewhere outside? How does the force shield enclosing the games work? What is the back-story behind all of the tributes? This last question, in particular, could have made the story MUCH more interesting. Using <i>Catching Fire</i> as a jumping-off point, the rebellion could have lasted a number of additional books, and been told from the point of view of each of the tributes involved in <i>Catching Fire</i> &#8211; in a sort-of Lost way &#8211; which would have made the story leagues more provocative. Instead, it seems to sort of leave us hanging at the edge of our seats. This is fine with me &#8211; I love cliffhangers &#8211; but what&#8217;s not fine is that all of the enticement goes unfulfilled in the final installation of the series.</p>
<h2>Mockingjay</h2>
<p>The last book in the series, <em>Mockingjay</em> concludes the story of Katniss Everdeen. After escaping from the Quarter Quell with the assistance of the other tributes, Katniss is taken to District 13 for recovery. Once there, she learns that District 12 was obliterated due to her lack of willingness to cooperate, and as punishment for what President Snow feels was incitement for the Districts to rebel against the Capitol. Although it isn&#8217;t really stated, the other districts are in open revolt against the Capitol, led by District 13, which has the weapons and technology necessary to bring the fight to the Capitol.</p>
<p>Although Katniss is a wreck because Peeta was captured during their escape, District 13&#8217;s President Coin entices her to be used as a propaganda puppet. In exchange for amnesty of Peeta and they other tributes, as well as the opportunity to kill President Snow, Katniss agrees to utilize the concept of the Mockingjay debuted in <i>Catching Fire</i> by her stylist, Cinna, in order to sway public opinion against the Capitol.</p>
<p>Most of this novel has to do with Katniss&#8217; internal struggles. It&#8217;s pretty grisly, as war is in real life. Many of the characters we&#8217;ve come to like or even tolerate don&#8217;t make it through the story alive. Those that die usually suffer horrible deaths, such as how Finnick dies at the hands of &#8220;muttations&#8221; while tredging through the Capitol&#8217;s sewers, trying to get to President Snow&#8217;s palace. Eventually, Peeta is rescued, but he&#8217;s been turned against Katniss and the Rebels via a technique called &#8220;hijacking&#8221;, where the venom of mutated yellow jackets (called &#8220;Tracker Jackers&#8221;) is put into his blood while he&#8217;s focusing on memories of events in his life, twisting and warping his sense of reality.</p>
<p>The story moves very quickly. It&#8217;s difficult to follow at times, because you&#8217;re unaware whether a few minutes or a few years has passed. The rebellion seems to last a very short amount of time &#8211; only a matter of months. I found this difficult to understand, as the fictional story I most commonly associate with rebels overthrowing a totalitarian government &#8211; the <i>Star Wars</i> saga &#8211; takes almost an entire generation for the Rebels to actually get to the point where they are making progress against the Empire. Most of this novel&#8217;s description of the overthrowing of the government happens in the course of 100 pages.</p>
<p>The criticism I have for this part of the series is pretty much the same as the criticism I have for the other two books: There&#8217;s no character development. In this novel, though, it&#8217;s even worse, as my sister points out so eloquently:</p>
<blockquote><p>I didn&#8217;t particularly love the way that death was dealt with in the book. Several people die in instantaneous &#8211; completely unadorned ways (Prim, Cinna, Snow, Finnick). It was very blunt- just death, over. Katniss never reflected on the deaths really nor did she ask herself questions about why/how people died, she just accepted it and moved on (particularly in the case of Snow and Finnick).</p></blockquote>
<p>My theory on this subject is pretty simple: Katniss didn&#8217;t reflect about anything in <em>The Hunger Games</em>, so why should she all of a sudden stop and start reflecting now? Oh, right, because characters should develop over the course of the novel, in order to better attune the reader to them as a person, and give them more depth and dimension than the simple black and white that&#8217;s on the page.</p>
<p>In general, the novel moved too quickly for my taste. It lacked subtlety and style. The plot skipped from one action sequence to the next, almost as if the rebellion itself were a series of snapshots or video clips. Or, like a storybook reading to a child, where the narrator is asked to skip the sections which the child cannot understand or appreciate, and therefore are considered &#8220;boring.&#8221; The most interesting aspect of the whole novel &#8211; the possibility that President Coin herself committed the acts of atrocity toward the children at the end of the novel (including, by the way, Katniss&#8217; sister, who was the reason Katniss volunteered for the Hunger Games in the first place, and thus the reason for much of the storyline) &#8211; and therefore were not committed by President Snow &#8211; was even underdeveloped. It&#8217;s almost like an afterthought that perhaps President Coin isn&#8217;t the savior everyone thought she was after all, except that in Katniss&#8217; mind, it&#8217;s certain enough that she deserved to die.</p>
<h2>Overall</h2>
<p>I understand that the point of the series is that war has an insurmountable cost, but that some things are worth fighting for. This is true even if the price for those things you hold most dear is steep. The problem with this &#8220;moral&#8221; so to speak, is that it&#8217;s not handled with care. All of the things worth fighting for in Katniss&#8217; life are taken away. She&#8217;s left with an empty shell of a life &#8211; sacrificed so much &#8211; that the point of the war becomes unclear at the end. Even Peeta, with whom she survives, is not the same as he was at the beginning of the series. But, that&#8217;s due to a sudden and involuntary change &#8211; not the change one would expect of a character after going through so much hell.</p>
<p>It&#8217;s also unclear, at the end of the series, what the point of the war actually was. The Rebels from District 13 aren&#8217;t really any better than the original totalitarian government. President Coin, after the Capitol has been taken, puts an absurd choice to the remaining Hunger Games victors: Either everyone in the Capitol is put to death, or all of the children from the Capitol are taken and put into one final Hunger Games. What? How does this make any sense? Why would the Rebels, who have just fought and died to overthrow a regime that keeps them in constant fear of losing their children actually want to make such a choice? And why is the choice created in the first place? Where did it come from. I mean, that&#8217;s ridiculous. There&#8217;s no need to just kill everyone off that doesn&#8217;t agree with you. Even a child can see that&#8217;s how totalitarian regimes begin in the first place. This story just takes an incredibly strange turn as the end approaches &#8211; there doesn&#8217;t seem to be any heroes or villains left at the end of the novel. It seems almost as though the author got tired of writing and decided to just speed up the conclusion. I feel that a good author needs to carefully choose the themes of the story so that he/she can illustrate the differences and similarities inherent between good and evil, black and white, day and night. A really good author either decides to separate these things completely or blend them together so much as to make it indistinguishable when the line has been crossed from light into darkness. Traditional stories, such as most fairy tales and one of my favorite mythologies that I mentioned earlier, <i>Star Wars</i>, take the former approach. Darth Vader is pure evil. He&#8217;s represented in black, and has no problem killing others. Obi Wan Kenobi, Yoda, Luke, and eventually, Anakin Skywalker, refuse to sacrifice others for their own good. They act in very moral and justified ways. An example of the latter approach might be <i>A Game of Thrones</i> or <i>Lost</i> &#8211; it&#8217;s not really clear why people are doing the things they are, but as the story progresses, it becomes clear that no one individual is completely good or completely evil.</p>
<p><em>The Hunger Games</em> series disappoints on this account. It initially tries to present a clear demarcation of good and evil, but later in the series decides that it is more interesting to blur the line. The problem is that not enough thought and time were put into how this line is shaded. Instead, in my opinion, it ends up becoming a smudge across the face of an otherwise interesting story.</p>
<p>On a somewhat unrelated note, as I was writing this post, I happened to go and see <i>Sherlock Holmes: A Game of Shadows</i> at my local theater (that movie is pretty good, by the way). Before the movie, there was a preview for the movie version of <em>The Hunger Games</em>, which looked pretty interesting. I&#8217;ll definitely go and see the movie version of this story. My hope is that the screenplay writers took the original story and spiced it up a bit &#8211; made the dialogue less tinny, enhanced the overall grandeur of the plot, and in general added special effects that make up for some of the shortcomings I see in the original novel. My hope is that this will be one case where the movies are better than the original novels.</p>
<p>[<a name="note1"></a>1] <a title="Mockingjay" href="http://www.amazon.com/Mockingjay-Hunger-Games-Book-3/dp/0439023513/ref=sr_1_1?ie=UTF8&amp;qid=1326341028&amp;sr=8-1">Mockingjay</a></p>
<p>[<a name="note2"></a>2] <a title="The Hunger Games" href="http://www.amazon.com/Hunger-Games-Suzanne-Collins/dp/0439023521/ref=pd_sim_b_2">The Hunger Games</a></p>
<p>[<a name="note3"></a>3] <a title="Catching Fire" href="http://www.amazon.com/Catching-Fire-Second-Hunger-Games/dp/0439023491/ref=sr_1_1?s=books&amp;ie=UTF8&amp;qid=1326341075&amp;sr=1-1">Catching Fire</a></p>
<p>[<a name="note4"></a>4] My favorite example of this is the first line of Stephen King&#8217;s <i>The Gunslinger</i>: &#8220;The man in black fled across the desert, and the gunslinger followed.&#8221; This is a very simple, but yet eloquent introduction to the novel. It is short, but yet leaves so many questions unanswered that you must continue reading. I once read that Stephen King thought this was one of the best lines he had ever written. (Don&#8217;t quote me on this, though, because I am unable to substantiate from where I retrieved the quote).</p>
]]></content:encoded>
			<wfw:commentRss>http://www.jwir3.com/blog/2012/01/13/let-the-games-end/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Omnipotent and Omniscient</title>
		<link>http://www.jwir3.com/blog/2011/10/10/omnipotent-and-omniscient/</link>
		<comments>http://www.jwir3.com/blog/2011/10/10/omnipotent-and-omniscient/#comments</comments>
		<pubDate>Tue, 11 Oct 2011 01:59:06 +0000</pubDate>
		<dc:creator><![CDATA[jwir3]]></dc:creator>
				<category><![CDATA[Cosmic Dice]]></category>
		<category><![CDATA[Mythology]]></category>
		<category><![CDATA[Philosophy]]></category>
		<category><![CDATA[Theology/Religion]]></category>
		<category><![CDATA[books]]></category>
		<category><![CDATA[God]]></category>
		<category><![CDATA[mythology]]></category>
		<category><![CDATA[omnipotence]]></category>
		<category><![CDATA[omniscience]]></category>
		<category><![CDATA[philosophy]]></category>
		<category><![CDATA[the magician king]]></category>
		<category><![CDATA[the magicians]]></category>

		<guid isPermaLink="false">http://jwir3.wordpress.com/?p=97</guid>
		<description><![CDATA[Recently, I&#8217;ve finished the book The Magician King1, by Lev Grossman. It&#8217;s an interesting book, although, in my opinion, not as interesting as his first book in the series, The Magicians. The series is like a combination of Harry Potter and Narnia, except significantly darker, with some mature content. One of the things I always [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Recently, I&#8217;ve finished the book <em>The Magician King</em><a href="#bibentry1"><sup>1</sup></a>, by Lev Grossman. It&#8217;s an interesting book, although, in my opinion, not as interesting as his first book in the series, <em>The Magicians</em>. The series is like a combination of Harry Potter and Narnia, except significantly darker, with some mature content. One of the things I always liked about the Narnia series is that it brings up interesting philosophical points of view. In this respect, both <em>The Magicians </em>and <em>The Magician King</em> don&#8217;t disappoint.</p>
<p>One of the most interesting areas of philosophy in <em>The Magician King</em> is a conversation between the main character, Quentin, and his rival/friend, Penny, regarding a super-being they are witnessing performing a task that will remove magic from their world:</p>
<blockquote>
<p style="padding-left: 30px;"><em>&#8220;Maybe we should talk to him,&#8221; Quentin said. &#8220;Maybe we can change his mind. We could, I don&#8217;t know, prove ourselves worthy of magic or something. Maybe they have a test.&#8221;</em></p>
<p style="padding-left: 30px;"><em>Penny shook his head.</em></p>
<p style="padding-left: 30px;"><em>&#8220;I don&#8217;t think they can change their minds. When you get to that level of power and knowledge and perfection, the question of what you should do next gets increasingly obvious. Everything is very rule-governed. All you can ever do in any given situation is the most gloriously perfect thing, and there&#8217;s only one of them. Finally, there aren&#8217;t any choices left to make at all.&#8221;</em></p>
<p style="padding-left: 30px;"><em>&#8220;You&#8217;re saying the gods don&#8217;t have free will.&#8221;</em></p>
<p style="padding-left: 30px;"><em>&#8220;The power to make mistakes,&#8221; Penny said. &#8220;Only we have that. Mortals.&#8221; <em><a href="#bibentry2"><sup>2</sup></a></em></em></p>
</blockquote>
<p>This brings in a new and interesting idea that I hadn&#8217;t considered before: <em>What if the very nature of how a deity exists prevents such an intelligent, all-powerful being from having free will? </em></p>
<p>Let&#8217;s consider this for a moment based on the faith of Protestant Christianity. (I&#8217;m not trying to be offensive here, this is merely for the sake of argument, and is based entirely on my own knowledge faith, which happens to come in the form of Lutheran Christianity). There are a few assumptions that are made by most Christians regarding God:</p>
<ol>
<li>God is Omnipotent (all-powerful).</li>
<li>God is Omniscient (all-knowing).</li>
<li>God is absolutely good.</li>
</ol>
<p>Note that #3 doesn&#8217;t actually mean &#8220;all-good&#8221; for an individual. That is to say, what could be good for the universe as a whole, might not be good for me individually. This is usually phrased along the lines of &#8220;God has a plan&#8221; or &#8220;God works in mysterious ways&#8221; &#8211; indicating that we can neither expect that His plan is individually good for us, or that we can even <em>understand</em> His plan.</p>
<p>Now, if we take the logic that Penny was talking about in the snippet, and apply it, along with these axioms, we come up with the following train of thought (note that &#8216;virtuous&#8217; and &#8216;good&#8217; would have to have some definitions in this context. I save the definition of &#8216;good&#8217; and &#8216;virtuous&#8217; as an exercise for the reader): If God is all-knowing and absolutely good, it means that He will always take the most virtuous course of action, given a set of actions. Given a set of actions, there is always one action which is more good than the other actions. However, some actions are outside of the abilities of the one making the choice to act. Since God is all-powerful, no actions are outside of his abilities. Thus, there will always be a single choice, given a set of choices, which is absolutely good and virtuous, and which is within God&#8217;s power to act upon. It is therefore inherent in these axioms that God has a <em>single</em> choice which He will make at any juncture. Thus, it is <em>impossible</em> that He can choose to do anything aside from these choices. This is pretty much the definition of lack of free will. Thought of another way, since God is perfect, there is, at every juncture, only one <em>perfect</em> choice, given all possible sets of all possible actions. This leads us to the same conclusion as before, only with &#8216;absolutely good&#8217; replaced by &#8216;perfect&#8217; in this context.</p>
<p><em></em>So, I found this incredibly interesting. More so, because we, as Christian Protestants believe, are <em>created </em>from God. But, we (seemingly) have free will. So, how can an entity that lacks free will create an entity that <em>has </em>free will? Talk about a mind bender. (Of course, there is the possibility that we <em>don&#8217;t</em> have free will, and that everything is, at least for us, pre-destined. Perhaps this is a slightly different way of looking at Shakespeare&#8217;s famous quote, &#8220;All the world&#8217;s a stage, And all the men and women merely players.&#8221;).<em></em></p>
<p>There are a couple of flaws (that I see) in this philosophical argument. One is that we can&#8217;t know for certain that there is only <em>one </em>perfect choice. What if there are an infinite number of perfect choices? I suppose, when you&#8217;re operating on a plane where you are a supreme being, given a set of infinitely perfect choices, one must ultimately pick at least one of them, and thus, at some level, the deity would require free will.</p>
<p>Another flaw is if there isn&#8217;t a single entity &#8211; but rather, multiple deities operating in concert (or competition) with one another. In this case, if a deity is going to act, it must perform the most perfect choice available, unless another deity has already made this choice irrelevant (either by performing it itself, or by making a move which would make the previous &#8216;perfect&#8217; move obsolete). In this case, we get more into a game-theory based philosophical argument. Really, it isn&#8217;t a lot different, though, because if the deities are all-knowing, then they will know the moves of one another in advance. It simply eliminates that as a possible choice, and they are back to choosing the <em>most perfect </em>of a set of reduced choices.</p>
<p>Neil Gaiman, one of my favorite authors, has written a lot about gods<a href="#bibentry3"><sup>3</sup></a> &#8211; stories about how gods are really products of human worship, rather than human worship being the product of their actions. I don&#8217;t remember seeing an argument to the effect of lack of free will in any of his stories (alebit it may have been treated in passing as part of the existence of The Endless in his Sandman novels &#8211; they each have a very specific role, although they don&#8217;t seem to lack free will). It would be interesting if he wrote a story or book on this concept.</p>
<p>At any rate, I realize this argument is a bit like the Omnipotence paradox<a href="#bibentry4"><sup>4</sup></a>, but it definitely struck a chord in my mind while reading it. I would, for certain, recommend reading the novel. Although, I really hope Lev Grossman makes the series at least a trilogy, as the ending of <em>The Magician King</em> leaves quite a bit to be desired (in the way <em>The Empire Strikes Back</em> leaves you thinking, &#8220;What? That&#8217;s the end of the movie!?!?&#8221;).</p>
<p>I&#8217;m always interesting in a good thought-provoking novel, and in that respect, <em>The Magician King</em> definitely doesn&#8217;t disappoint.</p>
<h3></h3>
<h3>Notes and Bibliography</h3>
<p><a name="bibentry1"></a><br />
[1] There are some spoilers in this post, and I have tried hard to minimize them, but if you have an intention of reading <em>The Magician King</em>, I would recommend doing so now, then coming back to this post at a later date.<br />
<a name="bibentry2"></a><br />
[2] Grossman, Lev. (2011). <em>The Magician King</em> (pp. 303). New York, NY: Viking.<br />
<a name="bibentry3"></a><br />
[3] If you&#8217;re interested in reading more on the existential question of deities, I highly recommend The Sandman graphic novels, as well as American Gods and Anansi Boys.<br />
<a name="bibentry4"></a><br />
[4] <a title="Omnipotence Paradox (Wikipedia Entry)" href="http://en.wikipedia.org/wiki/Omnipotence_paradox">Omnipotence Paradox (Wikipedia Entry)</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.jwir3.com/blog/2011/10/10/omnipotent-and-omniscient/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Foxes, Monsters, and Dinosaurs, Oh My!</title>
		<link>http://www.jwir3.com/blog/2011/08/31/foxes-monsters-and-dinosaurs-oh-my/</link>
		<comments>http://www.jwir3.com/blog/2011/08/31/foxes-monsters-and-dinosaurs-oh-my/#comments</comments>
		<pubDate>Wed, 31 Aug 2011 16:58:55 +0000</pubDate>
		<dc:creator><![CDATA[jwir3]]></dc:creator>
				<category><![CDATA[California]]></category>
		<category><![CDATA[Mozilla]]></category>
		<category><![CDATA[browsing]]></category>
		<category><![CDATA[california]]></category>
		<category><![CDATA[development]]></category>
		<category><![CDATA[dinosaurs]]></category>
		<category><![CDATA[firefox]]></category>
		<category><![CDATA[mountain view]]></category>
		<category><![CDATA[mozilla]]></category>
		<category><![CDATA[travel]]></category>
		<category><![CDATA[work]]></category>

		<guid isPermaLink="false">http://jwir3.wordpress.com/?p=72</guid>
		<description><![CDATA[During June and July, I was out in Mountain View, CA, at the Mozilla Corporation (and Foundation) headquarters, learning all I could about the process of creating Mozilla products. In June of this year, I chose to leave General Dynamics Advanced Information Systems to take a position as a Platform Engineer at Mozilla. I&#8217;ve been [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>During June and July, I was out in Mountain View, CA, at the Mozilla Corporation (and Foundation) headquarters, learning all I could about the process of creating Mozilla products. In June of this year, I chose to leave General Dynamics Advanced Information Systems to take a position as a Platform Engineer at Mozilla. I&#8217;ve been looking for a different position for a while now, as I&#8217;ve felt that defense contracting just doesn&#8217;t suit me. With my love of free and open source software, Mozilla seemed like it could be a dream come true. So far, it seems to be exceeding even my wildest dreams.</p>
<p>Imagine a place where the smartest people get together to discuss and work on issues about which they are passionate, coaxing thoughtful insight and comment from one another to create new things that previously could never have been imagined. Academia, you say? Perhaps. But now imagine that place where the things you build are used by 500 million people worldwide, and where the politics are minimalistic compared to Academia. Mozilla fits this bill. There are quirks, for sure, no company or organization is completely without politics and difficulties. But, everyone in the company is so <em>driven</em> to make the user front and center that it&#8217;s difficult to imagine a product coming out of this environment that wasn&#8217;t absolutely awesome.</p>
<div id="attachment_78" style="width: 310px" class="wp-caption alignleft"><a href="http://www.jwir3.com/blog/wp-content/uploads/2011/07/mozilla-godzilla.jpg"><img class="size-medium wp-image-78" title="Mozilla-Godzilla" src="http://www.jwir3.com/blog/wp-content/uploads/2011/07/mozilla-godzilla.jpg?w=300" alt="Mozilla Office Dinosaur Statue" width="300" height="262" /></a><p class="wp-caption-text">The Dinosaur Statue In the Main Lobby</p></div>
<p>Probably the burning question on your mind is&#8230; &#8216;What&#8217;s it like working for Mozilla?&#8217; It&#8217;s fantastic, that&#8217;s for sure. Other than that, it&#8217;s difficult to describe, so I thought I&#8217;d show some pictures. The first thing I noticed (when I originally came for the interview) was the cool dinosaur statue in the main lobby of the office (pictured to the left). Now, if you&#8217;re wondering why the dinosaur statue is there at all, you should probably be advised that the dinosaur logo has been used by Mozilla long before it was an open source company (hint: Firefox actually used to be called by the name &#8216;Netscape Navigator&#8217;). The dinosaur logo came about after the Netscape team chose the name &#8216;Mozilla&#8217;, a concatenation of &#8216;Mosaic&#8217; (the leading browser at the time) and &#8216;Killer&#8217;, as a codename for the Netscape Navigator browser[<a href="#firstReference">1</a>]. The dinosaur was used as part of a logo because of the similarity of the name &#8216;Mozilla&#8217; and &#8216;Godzilla&#8217;. Unfortunately, this has led to some less-than-informed commentary on Mozilla being &#8216;The Godzilla of Search Engines&#8217; &#8211; see <a title="Jono's blog post" href="http://www.evilbrainjono.net/blog?tag=tv_makes_you_stupid&amp;showcomments=false">Jono&#8217;s Blog post</a> about this if you&#8217;d like a laugh.</p>
<p>I have to say, the office in Mountain View is pretty cool. Mozilla runs part of the 2nd floor, all of the 3rd floor, and half of the 4th floor. All of the conference rooms on the 3rd floor are named alphabetically after internet memes, such as &#8216;Get to Da Choppa&#8217;, &#8216;Rickroll&#8217;, &#8216;ICANHAZCHEEZBURGER&#8217; or &#8216;Keyboard Cat&#8217;.</p>
<div id="attachment_82" style="width: 310px" class="wp-caption alignright"><a href="http://www.jwir3.com/blog/wp-content/uploads/2011/08/camera-photos-056.jpg"><img class="size-medium wp-image-82" title="ICANHAZCHEEZBURGER Room" src="http://www.jwir3.com/blog/wp-content/uploads/2011/08/camera-photos-056.jpg?w=300" alt="The 'ICANHAZCHEEZBURGER' Conference Room" width="300" height="225" /></a><p class="wp-caption-text">The &#039;ICANHAZCHEEZBURGER&#039; Conference Room</p></div>
<p>The major conference rooms are named after rooms in the Starship Enterprise: Warp Core, Sickbay, and The Bridge being some of these. This may seem pretty geeky to you, but how many people can say they are going to have a meeting in the Warp Core, or The Bridge?</p>
<p>Then there&#8217;s my all-time favorite, probably the favorite of many others as well, the lounge. Sticking with the Star Trek theme, the large room toward the front of the office space is aptly named &#8216;Ten Forward&#8217;. The coolest part about this particular room is not that it&#8217;s named after a Star Trek lounge (see<a title="Memory Alpha" href="http://memory-alpha.org/wiki/Ten_Forward"> Memory Alpha</a> for an explanation of Ten Forward, if you don&#8217;t know what it is), but that it actually <em>looks a lot like </em>Ten Forward from Star Trek: The Next Generation. I know it&#8217;s difficult to tell, given that I took an image from the left side facing toward the bar, whereas the image on the right is from the right side facing the bar, but I definitely got the feeling while I was there that this layout was entirely meant to remind one of the Starship Enterprise.</p>
<table align="center">
<tbody>
<tr>
<td>
<p><div id="attachment_84" style="width: 310px" class="wp-caption alignnone"><a href="http://www.jwir3.com/blog/wp-content/uploads/2011/08/ten-forward-left-side.jpg"><img class="size-medium wp-image-84 " title="Mozilla-Ten-Forward" src="http://www.jwir3.com/blog/wp-content/uploads/2011/08/ten-forward-left-side.jpg?w=300" alt="Mozilla's Version of Ten Forward" width="300" height="225" /></a><p class="wp-caption-text">Mozilla&#039;s Version of Ten Forward</p></div></td>
<td>
<p><div id="attachment_86" style="width: 310px" class="wp-caption alignright"><a href="http://www.jwir3.com/blog/wp-content/uploads/2011/08/ten-forward1.jpg"><img class="size-medium wp-image-86" title="ten-forward" src="http://www.jwir3.com/blog/wp-content/uploads/2011/08/ten-forward1.jpg?w=300" alt="Ten Forward on the NCC-1701D" width="300" height="229" /></a><p class="wp-caption-text">Ten Forward on the NCC-1701D</p></div></td>
</tr>
</tbody>
</table>
<p>There&#8217;s definitely an atmosphere of fun. I&#8217;ve never before seen so many Firefox logos. There&#8217;s even one made from Legos!</p>
<p>All throughout the office space, there&#8217;s the feeling that you&#8217;re in a place where cool things happen. There&#8217;s a lot of pride taken in the end product, and in the fact that the users are front and center when designing the product. I can honestly say I&#8217;ve never seen so many people (outside of Google or Walmart, but those are different stories) who are genuinely excited to be in the office working. I really got the impression that the folks at Mozilla are dedicated to furthering the web, whether it be through the development of a stable, user-friendly, feature-rich, free (as in freedom) browser or email client, or simply through furthering the knowledge that one has gained in technical endeavors and relaying that to others. I am excited to be a part of this world, and hopefully someday I&#8217;ll be able to describe to younger generations of software developers just what it was like to have the freedom to develop in such an environment.</p>
<p><a name="firstReference"></a><br />
[1] http://www.nczonline.net/blog/2010/01/12/history-of-the-user-agent-string/</p>
]]></content:encoded>
			<wfw:commentRss>http://www.jwir3.com/blog/2011/08/31/foxes-monsters-and-dinosaurs-oh-my/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
