Zola2023-04-02T18:30:40.620479+00:00https://blog.codezen.org/atom.xmlOn Cryptonomicon2023-04-02T18:30:40.620479+00:002023-04-02T18:30:40.620479+00:00Unknownhttps://blog.codezen.org/posts/on-cryptonomicon/<p>I almost never re-read books, but this time I made an exception. I read
<em>Cryptonomicon</em> right before I graduated high school circa 2004. My friend
Frank, with whom I was doing a senior service project, loaned me his copy to
read while the kids we were ostensibly helping were expected to do quiet work.
He'd also loaned me <em>Snow Crash</em> previously and generally helped turn me
into a cyberpunk and Stephenson fan. Thanks, Frank.</p>
<p>I decided to re-read <em>Cryptonomicon</em> because, a few years after reading it the
first time, I made an abortive attempt to read Stephenson's <em>Baroque Cycle</em>
books, and since then those three tomes have been re-released as eight separate
books that are more focused in nature. Reading them is my end goal, and even
though <em>Cryptonomicon</em> isn't part of the cycle itself, it's clearly a related
work. I also wanted to re-read <em>Cryptonomicon</em> because I feel old. I was a
fresh-faced teen when I read it the first time, now I'm basically a version of
Randy Waterhouse... a UNIX guru that works in tech in my mid- (or now late-)
30s.</p>
<p>Half way through this book, I was really enjoying myself and I was
reconsidering reading the split Baroque Cycle books. I was theorizing that as a
much more accomplished reader with a better handle on the history Stephenson
covers I might be able to deal with the interlacing of three basically
unrelated stories a little better than before, since <em>Cryptonomicon</em> did its
story weaving well enough. By the end of <em>Cryptonomicon</em>, I reconsidered the
reconsidering. I enjoy Stephenson's style of writing very much, I don't mind
being taken on wide tangents to illuminate some facet of a character, but it
was around the time that we started getting into long tangents about
ejaculation frequency and a trip into the jungle that's told in a twenty page
email (tangents within tangents) that I felt my patience being tested.</p>
<p>The tangents felt especially annoying at the conclusion of <em>Cryptonomicon</em>
because, like Stephenson's <em>Anathem</em>, the story sort of... stops, just as
it's gotten to the most interesting part. In this case, our present timeline
heroes finally achieve their business goals, which is painted as this huge
societal upheaval, but exploring any sort of immediate consequence of that
upheaval is left as an exercise to the reader. Stephenson hints at it, there are
protesters and counter-protestors (that show up in the middle of a jungle no
less), Randy Waterhouse is on magazine covers, etc. but not even one paragraph
is spent after it becomes clear the main characters "won". I suppose this is a
less damning criticism than it sounds because the 40s era timelines all conclude
nicely precisely because we can see 50 years into the future.</p>
<p>However, most of what I enjoyed in <em>Cryptonomicon</em> the first time was amplified
this time, and I do believe I had a better experience on this re-read. I was
pleased to find that I remembered a lot of the extant points in the novel, but
after 20 years not so many that I felt bored. I think I derived more enjoyment
from the math portions of the book this time, being more familiar with series
notations and vectors etc. but also being less impatient to get to "action".
The Waterhouse and Goto Dengo chapters felt a lot less dry.</p>
<p>Bobby Shaftoe's story was still a highlight but for different reasons. The
chapters are clearly the most pulpy action, but the passages also let
Stephenson play with the narrative in surreal ways, as Shaftoe drifts in and
out of tortured sleep, morphine withdrawal, or just a boring conversation.</p>
<p>I also immensely enjoyed the UNIX aspect of Randy's storyline. At 18 I was
already a Linux user and got a big kick out of the book's hacker terminal cred.
I largely found its tech basis to be still really solid in 2023. It's fun how
much stuff that was real and cutting edge in 1999 is so commonplace today. I
remember distinctly being jealous of Randy's wireless internet ("packet radio")
on his expensive laptop and today we have WiFi enabled <em>everything</em>. I also
love than Van Eck phreaking is applied practically, it's a great example of how
security gets complicated when thinking about computers as physical objects
with physical properties rather than as black boxes that can only be attacked
via code exploits.</p>
<p>Let's also take a moment to debunk something I frequently read on the internet
when <em>Cryptonomicon</em> comes up. The Epiphyte(2) currency is not Bitcoin. It's
cryptocurrency adjacent, but what Stephenson is describing is far more
conventional. It's entirely centralized. It's backed by gold for Chrissake.
That said, what he's describing is actually more useful than Bitcoin for that
reason. If you can trust a corporation (and Epiphyte(2) is probably as close to
a perfect storm for me personally as could exist, being run by freedom-minded
UNIX crypto geeks - although Google is a big counterexample of well meaning
techies gone wrong), then their currency could actually be anonymous, stable
and not based on wasting colossal amounts of energy "mining". Epiphyte(2) is
crypto PayPal with a data haven attached.</p>
<p>This re-read has definitely made me consider reading some other works from my
younger days. Particularly Stephenson's own <em>Snow Crash</em>, which would probably
be interesting now that I've read William Gibson's Sprawl Trilogy (among other
cyberpunk works) and the idea of the metaverse has re-entered the public
consciousness.</p>
<p>As for <em>Cryptonomicon</em> itself, it's still a great work and holds up really well
after 20 years of advancement. It's a hard book to recommend to the average
person because it's hard to gauge how interested people would be in reading
about theoretical underpinnings of cryptology, or the history of the information
theory etc. but for anyone technically minded this is a lot of fun.</p>
How I Learned to Stop Worrying and Love Rust2023-01-29T05:52:11.267635+00:002023-01-29T05:52:11.267635+00:00Unknownhttps://blog.codezen.org/posts/how-i-learned-to-stop-worrying-and-love-rust/<h3 id="c-still-sucks">C++ (still) sucks</h3>
<p>Back in 2020, a great misfortune befell me at work, right before the pandemic.</p>
<p>My project, a solo effort nestled between firmware (UEFI) and OS had been beaten into shape and was working admirably.
It had a flexible configuration and was filling its niche. It had matured, and the slackened maintenance burden meant I
had free time.</p>
<p>I spent that free time exploring the adjacent problem space, targeting hard to hit CPU bugs and... suddenly, a manager
realized that I had spare cycles and I got pulled into a project only tangentially related to my interests and in a
language I despise, C++.</p>
<p>Now, I was "raised" as a developer as a kernel hacker. I'd hacked firmware / OS level C for myself and for my corporate
overlords for almost 15 years and I bring the perspective of open source with me wherever I go. Before that, I spent
college diligently doing my assignments in C (or LISP on occasion) except for a brief bout of Visual Studio C++ that was
required for a data structures class that covered GUI programming that I absolutely hated. Linus Torvalds asserted C++
is garbage and totally unsuitable for low level developement and I took that as gospel.</p>
<p>So in 2020, I found myself the odd man out on a team of true believers. These engineers had spent the last 20 years
writing C++ and they assured me this wasn't old, broken C++03 I learned in college, this was <em>Modern C++</em>. C++11, no 14,
no 17, no 20. Things were <em>different</em> now, better. C++ had reformed. The 40 year old language got its <em>groove back</em>.</p>
<p>In the intervening three years of working daily with modern C++, multiple training seminars, and rubbing elbows with C++
gurus on my team, I'm still convinced it's terrible but my reasoning has changed. Where my experience with C++03 was
that C++ was basically C with namespaces, exceptions, a half baked object system, and an awkward template system,
<em>Modern C++</em> is a language in a full-fledged identity crisis.</p>
<p>C++ has spent the last decade attempting to morph into something different. Virtually any project written <em>old</em> C++ is
now ugly and broken. The idioms of 20 years ago have been fully abandoned, and premiere feaures have been bolted on from
elsewhere. Shifting to automatic memory management, RAII, sprinkling closures into the standard library. It's trying
hard to get you to forget it's still carrying all of its C baggage. Ownership is enforced, copying minimized in favor of
moving, standard data types replaced with bounds-checked alternatives. The standard library has expanded to include
native threading, tuples, optional return types. All, in and of themselves, not bad features to have in a language.</p>
<p>But nothing has been done to curb all of the old broken behavior in the name of backward compatibility and, as such,
projects have to cope by using a hundred and one linters, formatters, and sanitizers to enforce all of the unwritten,
idiomatic rules of the new language. All of those C data types being replaced are still there under the covers, waiting
to have clang-tidy smack your hand for using them. The C Preprocessor is still there, but using variadic macros is
<em>soooo</em> 2005 so you better only use it for simple substitutions, but only if you can't constexpr, oh and those symbols
better fit the awkward naming convention or else! Passé parts of the language, like overloading basic operations are
verboten, as are basic C operations like for loops to search a list (because why do something that basic when std::find
and friends will let you do the same thing, but more clumsily).</p>
<p>I understand that I sound like a C programmer bitter at having to adapt, and that's a valid read of this post, but I'll
tell you what makes working with C++ even worse than being a bitter C programmer... Learning Rust.</p>
<h3 id="rust-is-great">Rust is great</h3>
<p>I have toyed with many programming languages, but most were out of curiosity about a different paradigm than C (LISP,
Haskell, Factor) or for scriptier purposes like text processing (Python) or embeddability (Lua).</p>
<p>When it came to getting work done and writing high performance code though, I had mastered C and I was going to stick to it.
Especially in the difficult environments I work in (where there is no OS and debugging a program often comes down to
reading register and stack dumps via a hardware debugger) I appreciated that it's extremely easy to get a grip on what's
going on in a C program staring at its in-memory assembly image.</p>
<p>Dealing with modern C++ though, I kept getting torn between "that's a really cool feature" and "my code has been linted
and reviewed into something ugly and unreadable." I found myself wanting something in that mid-range between C being
portable assembly and an interpreted language of convenience like Python. Something compiled and performant, but with
some basic niceties like implicit memory management, error handling, and baked in basic types like vectors.</p>
<p>So I began writing Rust a couple of years ago and it's like a breath of fresh air. I now understand C++ is attempting to
evolve into Rust, it just can't. This became especially obvious to me lately when, leaving the toy problem Project Euler
universe, I started trying to do "real work" and interact with other Rust projects, as well as libraries through the
Rust FFI.</p>
<p>Rust has no C baggage. It has no headers but an extremely powerful macro system that makes the C pre-processor look
antiquated. It has implicit memory management from the ground up. Explicit mutability that C++ can only poke at with
const. Traits and a trait based constraint syntax that allow much finer grain, piecemeal implementation of "classes". In
many places it seems like Rust just has parity with C++ (e.g. the expanded standard library), but without the C baggage
these are all wins because the language isn't littered with trapdoors that let you violate the new normal. You can't
just decide to start using dumb pointers, or use C style arbitrary casts, or any of the other million things clang-tidy
will complain about that are still valid C++. In fact, the only way to "escape" Rust's guarantees is to explicitly mark
your code 'unsafe', something I imagine C++ committee members wish they could tuck all of their legacy, unsafe,
unidiomatic, undefined behavior behind.</p>
<p>Outside of syntax, Rust also has an integrated build system and package manager that reminds me of the Python "batteries
included" promise. Crates make it so easy to create a new Rust package or library, advertise dependencies, and even
release your code. In C++ you're basically forced to use a third party tool, like CMake to build and Conan to manage
packages and it complicates everything immensely, but it's just another area where C++ can't escape its age. Rust was
developed in a world where all developers are online all the time and it's no longer acceptable to expect someone else
(your distro, your toolchain) to have dealt with packaging and distributing your dependencies.</p>
<p>In my opinion there is no place where Rust isn't an improvement over C++. Perhaps compiler support (I'd like GCC Rust,
which will be experimental in GCC 13.1) and optimization that comes with being a younger language, but in terms of
what's on the page - the act of prototyping and writing Rust code - and dealing with the library ecosystem, Rust is a
fucking slam dunk.</p>
On 'The Left Hand of Darkness'2022-09-07T02:06:15.343215+00:002022-09-07T02:06:15.343215+00:00Unknownhttps://blog.codezen.org/posts/on-the-left-hand-of-darkness/<p>Ursula K. LeGuin has quickly become one of my favorite classic sci-fi authors.
<a href="https://blog.codezen.org/posts/on-a-wizard-of-earthsea/">Wizard of Earthsea</a>
and <a href="https://blog.codezen.org/posts/on-the-dispossessed/">The Dispossessed</a>
were both excellent and really showed LeGuin's great range of imagination.</p>
<p><em>The Left Hand of Darkness</em> is yet another story that gives intense focus to the
interesting part of the story and doesn't dawdle on minutiae. LeGuin spends a
lot of time examining the interesting facets of the Gethenians, a human branch
species living on Gethen (aka Winter for it's brutally cold).</p>
<p>To give an example, within a short reading section the main character, Genly Ai,
a typical Terran human, goes from being a comfortable guest of Orgoreyn (an
authoritarian communist state) to being arrested and shipped to prison. During
this sequence virtually no prose is spent on Genly's capture, no description
given of his arrest or any sort of resistance or chase, no reasoning is given
(though the reader can infer easily enough). What LeGuin spends time on,
however, is the harrowing, dehumanizing trip Genly spends locked in a truck on
the way.</p>
<p>This is signature LeGuin. A different, although not necessarily <em>lesser</em>, author
would get a lot of thriller mileage out of Genly's apprehension but instead
LeGuin skips to the part that actually illuminates Gethenian culture - where
Genly and his fellow prisoners are mistreated and left to silently bond together
to avoid death.</p>
<p>As such, even being a scant 300-ish pages (similar to the other novels) it does
so much to explore the Gethenian culture and the results of adapting to the
harsh life on Winter. We get a sense of their values, their society, places
where they are more generous and egalitarian than we are as well as places they
are backwards from our viewpoint. The overall story of Genly Ai, similar to that
of Shevek in <em>The Dispossessed</em>, isn't as important or as conclusive as one may
expect, instead it's a vehicle to enhance our understanding.</p>
<p>One thing that seems mandatory to mention with this work is LeGuin's treatment
of gender. The Gethenians have no set gender. They are hermaphroditic but
asexual most of the time, and enter "kemmer" for a few days each month at which
point their sex may become more definite for a period of time. Each person may
become male or female at different points in their lives and each may bear or
sire children in due course. It's a fascinating aspect of the Gethenians and
LeGuin gives a lot of attention to it via Genly who instinctively struggles to
put the people he meets into male/female boxes and who wonders if certain facets
of Gethenian biology (or Karhidish culture) lead to things like lack of a
concept of war. Or the poorly developed idea of nationalism/patriotism. Mostly
though the Gethenian cultures portrayed just defy concepts of what is "gender
normal" when a person is typically neither male or female and can potentially be
either at any given cycle.</p>
<p>This is, no doubt, a great imaginary exercise and really colors a lot of the
work of world building Gethenian cultures, along with the harsh cold of the
planet, but it's also an image of what our society could look like if we could
ever defeat prejudice. I'm not sure that's actually an attainable goal (our
monkey brains being stubbornly tribal), but it's refreshing to see a society
with such radical equality that race and gender (and thus orientation) are
totally meaningless. It's a reminder that true equality isn't just allowing
girls and boys to play with toys from both the pink or blue toybox... it's when
all of the childrens' toys are in one toybox. In a truly just world, we're all
they/them.</p>
<p>I'm not sure LeGuin would go that far (and in the foreword of my edition she
makes is clear that this is a thought experiment rather than a prediction of any
sort) but it's an achievement that she didn't just overlay the gender politics
of 1969 onto an alien culture. Compare this with <em>Dune</em>, published a few years
earlier and widely regarded as one of the most influential science fiction books
ever, where it's the year 10,000 and women are still largely second class
citizens even if they can wield superpowers.</p>
<p>To say LeGuin was ahead of her time is barely doing her justice, but as with
her other works she proves to be quite imaginative and never wastes your time.
I'm looking forward to reading more entries in the <em>Hainish Cycle</em>.</p>
On Stargate2022-08-16T22:00:52.797287+00:002022-08-16T22:00:52.797287+00:00Unknownhttps://blog.codezen.org/posts/on-stargate/<p>Over the past few months I've watched the entire franchise of Stargate TV shows.</p>
<p>To be honest... it's pretty bad, but I enjoyed a lot of it.</p>
<h2 id="premise">Premise</h2>
<p>First off let me say that the whole premise of the franchise is beautiful and
evergreen. Mixing mythology with sci-fi tech, linking Earth to an ancient alien
transport system means every episode you're just a stroll away from literally
any situation the writers come up with. I'm glad the TV shows were developed
because the initial <em>Stargate</em> movie barely had time to look at how cool this
premise is.</p>
<p>It took me a while to get acclimated to the formula of the show. I tried
watching <em>SG-1</em> a few years ago and was thrown by the whole militaristic
propaganda feeling. Airforce soldiers rolling around with P90s fighting aliens
and protecting the human race was just too far from the enlightened <em>Star Trek</em>
world I consider my primary TV fandom. Too much shooting and action, not enough
clever, diplomatic or ethical sci-fi.</p>
<p>After watching <em>MacGyver</em> and getting addicted to Richard Dean Anderson (since
he was literally the only reason to ever watch that show), revisiting <em>SG-1</em> was
only natural and for some combination of reasons the militaristic aspect didn't
bother me as much.</p>
<p>The real trouble with the Stargate TV shows is that, especially early on, I
think they're just way too cheaply done. Some of this cheapness is built into
the premise so it's not "unreal" per se, but virtually all of the costumes and
props are the sort of off-the-shelf items you'd expect to find on a studio lot.
Soldier gear, Egyptian pyramids, tattered peasantry, medieval castles, frontier
homes, 1940s warehouses. Most planets are Planet Canada, or endless dune seas.</p>
<p>There is some charm in the proximity to our world though. In the world of
Stargate we haven't progressed into that post-scarcity <em>Trek</em> utopia. We are
still flawed, we still have fractured politics and national interests. There are
some good plot lines that revolve around keeping our place in the universe a
secret from the public of Earth, of dealing with corporate interference,
espionage and just plain political meddling in the project. There's also some
fun seeing our heroes still being integrated into their lives on Earth even
while adventuring during their day jobs.</p>
<h2 id="creating-tension">Creating Tension</h2>
<p>A major problem <em>SG-1</em> and <em>Stargate: Atlantis (SGA)</em> have is that the formula
ends up having real trouble creating meaningful tension.</p>
<p>In part this is because the scale of conflict has the doors blown off from the
start. In <em>SG-1</em> the Goa'uld, and eventually the Ori are galaxy spanning
baddies. It takes extraordinary circumstances for an even bigger threat to
arrive, but over the course of its 10 seasons, humanity rises to every occasion and
eventually prevails (spoiler alert =P) against what should be literally
impossible odds.</p>
<p>Along the way you begin to recognize that O'Neill, Carter, Jackson, and Teal'c
are in a very real way invincible. They never fail. Jackson is even killed once
and comes back thanks to the Ancients and literal <em>deus ex machina</em>. The show
has real trouble with consequences.</p>
<p><em>SGA</em> is largely the same. Dealing with the Wraith and the Genii you begin to
feel like there is literally no way Sheppard, Teyla, McKay or Ronon can fail.
Down to the finale where they <em>literally fly Atlantis back to Earth</em>.</p>
<p>In each show, there is a genius character that will <em>always</em> figure out a
solution. It gets to the point where any clock on the episode feels utterly
toothless. Carter, Jackson, and McKay are the primary examples of total
wunderkind multi-disciplinarians that cannot fail. The medical staff
occasionally get a bone too, but even the militaristic characters will
inevitably escape.</p>
<p>Stargate Command never really brings home the L. The stakes are sky high, but
because they never fail it's never brought home. Earth is under threat many
times, but never faces real consequences. Stargate Command or Atlantis are under
attack many times, but we never really feel consequences. In a show that is
trying desperately to be serial with long story arcs, all the ratcheting of
stakes takes place off screen and on screen we get nothing but reset time and
time again - with one notable exception of the death of Dr. Fraiser in <em>SG-1</em>
and the defection of Lt. Ford in <em>SGA</em>.</p>
<p>This is where Stargate's over reliance on military action really ruins it.
Action is only exciting when there are real stakes and when the audience feels
like the main characters are using cheat codes, it just becomes a yawnfest. The
writers feel bound to make everything an existential threat to be defeated by
force of arms or guile and it's, frankly, boring.</p>
<p>It made me appreciate <em>Star Trek: The Next Generation (TNG)</em> a lot more. Not
only did <em>TNG</em> kill off Tasha Yar early in its run (establishing that, yes,
main cast are mortal even if the others made it through the show) but the
average episode had much lower stakes. There are some character episodes that
have basically <em>no</em> stakes. But typically the danger is to the ship, or some
members of the crew, not the entire Federation, or the balance of power in the
whole galaxy. The big existential threat, the big bads, are usually your season
finale type fare. None of them (the Borg, the Dominion etc.) are even close
to galaxy spanning either, the galaxy is populated by thousands of minor species
as well as hundreds of factions with their own culture and goals (even if
they're portrayed as monoliths for the purposes of TV).</p>
<p>Now, <em>TNG</em> was not immune to the concept of plot armor, and the franchise reliance on
"treknobabble" solutions literally coined the term, but the larger ensemble
spread out the credit (avoiding the McKay style wunderkind tropes, even with
Wesley Crusher on board) and, critically, the crew can take the L sometimes
personally, or as a ship, as Starfleet or the Federation as a whole.</p>
<h2 id="reining-it-in">Reining It In</h2>
<p>I know this sounds like I'm ripping Stargate a new one so let me soften the blow
a little. The broad strokes of the show are mediocre at best, but there are some
<em>great</em> episodes of <em>SG-1</em> and <em>SGA</em> too. Generally these happen when the show
is tackling some very fun sci-fi concepts.</p>
<p>For example, "Window of Opportunity" (<em>SG-1</em> S04E06) is so much damn fun. It's
<em>Groundhog Day</em>, but the execution is perfect. Unsurprisingly, the solution
hinges on Jackson translating some Ancient text and messing with and getting an
alien to break the time loop but on the journey there is plenty of time for
comedy as well as character development.</p>
<p>Similarly, "The Other Guys" (<em>SG-1</em> S06E08) is a great departure from the
standard SG-1 fare that focuses outside of the main cast.</p>
<p>In <em>SGA</em> there were plenty of episodes I enjoyed, mostly separate from the main
plot. Like "The Game" (S03E15) which was unbelievable but fun. Or Richard Kind's
guest spots in "Irresistible" (S03E03) and "Irresponsible" (S03E13) because he
made for such an atypical "villain."</p>
<p>And this obviously isn't a exhaustive list. There are plenty of episodes that
are just great sci-fi fun, or have great individual moments. It's just how these
episodes hang as a season - the frequency of combat, the frequency of a
Carter/McKay miracle, the weakness of the overall plot that causes the shows to
grind a bit.</p>
<p>As such I wonder how much both <em>SG-1</em> and <em>SGA</em> suffer from forming in the cable
TV pre-DVR and pre-streaming world. Both attempt to give their main stories a
lot of time (compared to <em>TNG</em> which had hardly any continuity, or <em>Star Trek:
Deep Space Nine</em> which had plenty, but spread much thinner) but were still
designed to watched week to week. A lot of the patterns and sameness I detect
would probably be less apparent if I wasn't watching in three episode chunks
multiple times a week.</p>
<h2 id="but-the-characters">... But the Characters</h2>
<p>So what makes the franchise worth watching? The characters, no doubt.</p>
<p>O'Neill is great for his deadpan humor. Teal'c for his eyebrow lifting
skepticism and outsider POV. Carter for her cheery brilliance. I found Daniel
Jackson insufferable (especially any time ascension was mentioned) but he had
some good moments too. General Hammond, Dr. Fraiser, even the oft-maligned Cam
Mitchell and Vala were all great on screen (and tangentially I think the Ori
were more fun as a big bad than the Goa'uld).</p>
<p>The <em>SGA</em> main cast is more of an acquired taste I think, but they all play
their parts well. Sheppard and McKay sort of suck the air out of the room in
their scenes, but Carson, Teyla and Ronon are fun sometimes too.</p>
<p>In fact, about half way through my watch, Stargate sort of broke my brain. I
began to view the characters as player characters in a poorly run tabletop RPG.
Sometimes the DM flails a bit, a plot point falls flat, or a setting seems too
stock photo, but you watch to see the characters interact with each other on
their way to inevitable victory.</p>
<p>It will be a while before I revisit these shows, but I'm curious how this
perspective will reshape my enjoyment of the earlier seasons.</p>
<h2 id="stargate-universe">Stargate Universe</h2>
<p>You may have noticed that I haven't made many references to <em>Stargate Universe
(SGU)</em> even though that show capped my initial run through the franchise.</p>
<p>I actually think SGU is good and exempt from a lot of the criticism of the first
two shows. I can see why contemporary Stargate fans might have hated it, but
from a modern binger's point of view the show did a much better job of keeping
my attention episode to episode.</p>
<p>Yeah, some of the early soap opera-y elements fell flat (Col. Young and Dr. Rush
backstabbing each other in particular), and it does suffer a bit from the same
"genius miracle worker" issue the previous shows did, but ultimately it fixed
one of the main issues I had with <em>SG-1</em> and <em>SGA</em> - it very successfully
brought the stakes home. There's a lot of struggle, a lot of death, and I
genuinely didn't feel like I could predict what would happen next. Their victory
did not feel assured like it did in the previous shows and that was refreshing.</p>
<p>The main plot benefited from being much looser as well. The tension between
the impulse to find a way home and the impulse to complete Destiny's mission was
very effective as the main conflict, without having to paint entire galaxies
with a single big bad, or to make every episode about kicking ass on some plot
planet for some reason.</p>
<p>I also think <em>SGU</em> did a much better job fleshing out an ensemble that was
larger than an SG team. With their body swapping visits to Earth (which is
totally unbelievable but neat sci-fi tech) we learned a lot about many
characters that make me feel as if I know them much better than O'Neill or McKay
or any of the previous show's other main cast.</p>
<p>The show wasn't perfect, but it definitely deserved to have a better conclusion
than it got.</p>
On Tai-Pan2022-07-27T16:00:40.982553+00:002022-07-27T16:00:40.982553+00:00Unknownhttps://blog.codezen.org/posts/on-tai-pan/<p>After <a href="https://blog.codezen.org/posts/on-shogun/">reading <em>Shōgun</em></a>, I decided to
continue Clavell's Asian Saga chronologically and arrived at <em>Tai-Pan</em>.</p>
<p>This story was written almost 10 years before <em>Shōgun</em> and it reads much more like
an adventure genre novel. Both are historical fiction, but the main character of
<em>Tai-Pan</em>, Dirk Struan, feels much more like a Mary Sue or an author insert than
Blackthorne did in <em>Shōgun</em>.</p>
<p>In part this is due to Struan's anachronistic attitudes as an Englishman in
China, some of which I don't think are realistic. I can believe Struan would
respect the Chinese, and even adopt some of their customs, but some of his
modern hygiene and clothing choices, not to mention deciding to marry his love
match Chinese mistress just seem like transporting the values of 1966 back to 1841.</p>
<p>It's also that Struan is so confident and good at everything - he's a master sea
captain, cunning trader, manipulator, diplomat, formidable melee fighter. He's
universally respected even by rivals. There are a few sequences where Struan is
captaining his ship, barking orders, and reflecting on the sea where I had to
stop and laugh about how much of a stoic action hero trope he was.</p>
<p>Reading for pleasure, I don't mind Struan's anachronisms or his main character
syndrome, but it really made me long for a stronger counterpoint to elevate the
story out of adventure genre fiction territory. Struan is almost always the POV
character and the other characters are defined in relation to him as The
Tai-Pan. His trade rivals (Brock et. al.) exist to destroy him and take his
title or dominate his son, Culum, after he becomes Tai-Pan. Others (Orlov,
Longstaff, Skinner) exist to serve him or be manipulated by him.</p>
<p>There are many brief subplots and minor characters but they're of little
consequence except to add a bit of action (Scragger), intrigue (Zergeyev),
tragedy (Mary Sinclair) or comic relief (Quance) to the overall story.</p>
<p>The exceptions are the Chinese characters (May May, Jin-qua, Gordon Chen) that
receive a bit of attention and are used to expound on the hidden workings of the
Chinese empire and specifically how the Chinese relate to the English traders
but even these characters have sparse backstories and only act in relation to
Struan himself. In fact, China is more of a backdrop for this English story than
a real setting.</p>
<p>Compare this to <em>Shōgun</em> where Blackthorne was a competent navigator in
exceptional circumstances, but he wasn't supernaturally good at everything. He
was also forced into integrating into Japanese society reluctantly. More
importantly, he was our European observer of a fundamentally Japanese story
focused on Toranaga. There were many points of view, some quite alien, but you
got the sense that the wheels had been turning for years by the time
Blackthorne washes up. Not every plot is resolved, but each one seems integral
to the various main characters and their motivations.</p>
<p>Regardless of these criticisms though, it was a fun read. I would even argue it
had a more satisfying (and conclusive) ending than <em>Shōgun</em>, it's just a little
pulpy and plot driven comparatively. Where <em>Shōgun</em> read like a masterpiece of
fiction and exploration of Japanese culture, <em>Tai-Pan</em> reads more like a fleshed
out 1966 screenplay for a swashbuckling summer popcorn movie. Fun, just in a
different way.</p>
<p>I will say I'm very curious to read Clavell's <em>Gai-Jin</em> at some point. It's the
next book chronologically and looks to be a direct sequel to <em>Tai-Pan</em>, but
it's the last book in the series by publication order. Published in 1993, right
before Clavell's death in 1994, I'm curious to see The Noble House in the final
evolution of his style in contrast to this relatively early work.</p>
On The Dispossessed2022-03-10T02:04:39.701264+00:002022-03-10T02:04:39.701264+00:00Unknownhttps://blog.codezen.org/posts/on-the-dispossessed/<p>This book is profound in a way that all science fiction should aspire to be.</p>
<p>Previously, I read Le Guin's <a href="https://blog.codezen.org/posts/on-a-wizard-of-earthsea/">Wizard of
Earthsea</a> and I
thoroughly enjoyed it, particularly being a very no-frills fantasy novel that
didn't fall into the familiar pattern of being so epic and drawn out that it
needed 1000 pages to deliver a bit of fun.</p>
<p><em>The Dispossessed</em> feels similar. It wastes no time getting to the point. There is
virtually no fat on the story and as such it hits hard and fast.</p>
<p>In the last couple of years I've started identifying as an anarchist and a
communist. I'll write an entry on that one day (I've already drafted it multiple
times) but in the meantime I've been searching for visions of what that world
<em>could</em> look like. Kropotkin's <a href="https://blog.codezen.org/posts/on-the-conquest-of-bread/">Conquest of
Bread</a> was enticing,
but it was also hung up in the 1890s and searching hard for contemporary
examples. In <em>The Dispossessed</em> Le Guin uses science fiction's greatest asset,
the imagination, and shows us a fully realized world that operates on the
principles of human solidarity and mutual aid.</p>
<p>Like <em>Wizard of Earthsea</em>, the book is very personal and has a single main
character, Shevek. We see the world through his lens and, to Le Guin's credit,
neither the propertarian (capitalist) world of Urras or the Odonian
(anarcho-communist) world of Anarres is a paradise. Each has their flaws, but
the most damning criticisms are definitely laid at the feet of capitalism. My
favorite quote:</p>
<blockquote>
<p>"He tried to read an elementary economics text; it bored him past endurance, it
was like listening to somebody interminably recounting a long and stupid dream.
He could not force himself to understand how banks functioned and so forth,
because all the operations of capitalism were as meaningless to him as the rites
of a primitive religion, as barbaric, as elaborate, and as unnecessary. In a
human sacrifice to deity there might be at least a mistaken and terrible
beauty; in the rites of the money-changers, where greed, laziness, and envy were
assumed to move all men's acts, even the terrible became banal."</p>
</blockquote>
<p>Elsewhere, Le Guin gets to the crux of the individual hypocrisy of the Urrati in
more specific terms. The facade of obscene luxury built on the hidden working
class that Shevek is intentionally isolated from during his visit has many
layers and analogs to the United States and other late stage capitalist
societies.</p>
<p>Shevek's world, Anarres, is always described as a world of a more austere
beauty, harsher. Survival is more difficult and the material conditions of the
Annaresti are undoubtedly more spartan. I'm glad Le Guin took a critical look at
the consequences of Annaresti society because they are the problems that must be
hand-waved away in less hypothetic, more academic works like Kropotkin's. In a
society without hierarchies there is still convention that develops, still
expected behavior patterns, still societal pressure to conform and that is why
even an anarchist world designed around freedom can calcify and harden into the
familiar patterns of power. Shevek's antagonists on Anarres are people that have
empowered themselves by monopolizing influence as consultants and judges that
<em>must</em> exist to prioritize effort.</p>
<p>The primary example is Sabul, the consultant physicist that determines whether
Shevek's work is worth sending to Urras. Sabul uses his position of privilege
to elevate himself not in rank, but in practice. He has his own office to look
over the papers, a brilliant reputation thanks to plagiarizing Urrasti physics,
his name on Shevek's work as the price of recognition. This person must exist
no matter how the economy is designed because only so many things will fit in a
spaceship (or a truck, or a magazine, or a piece of software) and a subjective
priority must be established. To count on all of these decision makers being
perfectly ego-less and rational would be foolish.</p>
<p>This is why Le Guin, via Shevek, echoes Marx in the recognition that such a
society must live in a permanent state of revolution. It is not enough to
achieve the system, it must be maintained, the freedoms afforded to the
individual must be exercised and that means perpetually breaking the
relationships of power that congeal out of practical reality.</p>
<p>Overall the Anarresti live what seems to me to be an idyllic life and that same
convention that is toxic when manipulated by the Sabuls of the world that have
insinuated themselves into position of power, is the fiber of their society.
The radical idea that everybody deserved to be fed and clothed and taken care
of. That everyone deserves to have agency in their lives and they will
naturally balance that impulse with the need to contribute directly to ensure
those guarantees.</p>
<p>That, I think, is where Le Guin finds the crux of the issue and the starkest
contrast between the capitalist Urrasti and anarchist Anarres societies. There
is no true freedom when you are being coerced to survive. Referencing a previous
moment when Shevek detects the uniform guilt and anxiety on the faces of the
Urrasti workers he lets his opinions be known with a little help of unaccustomed
alcohol:</p>
<blockquote>
<p>"You are rich, you own. We are poor, we lack. You have, we do not have.
Everything is beautiful here. Only not the faces. On Anarres nothing is
beautiful, nothing but the faces. The other faces, the men and women. We have
nothing but that, nothing but each other. Here you see the jewels, there you
the eyes. And in the eyes you see the splendor, the splendor of the human
spirit. Because our men and women are free - possessing nothing, they are free.
And you the possessors are possessed. You are all in jail. Each alone,
solitary, with a heap of what he owns. You live in prison, die in prison. It is
all I can see in your eyes - the wall, the wall!"</p>
</blockquote>
<p>As someone doomed to never retire and of a generation working hard to scrape by
in a system growing ever more brutal, this resonated with me along with all of
the gross hypocrisies Le Guin highlights in the fictional but all too real
Urrasti society. There is a difference between the freedom of capitalism, the
freedom to consume all you can afford, and the freedom of Anarres, the freedom
to actually dictate the terms of your life without the hidden whip of
destitution.</p>
<p>This is a great book and one that actually imagines this radical world without
resorting to the science fiction trope of infinite post-scarcity. Le Guin
totally nails every aspect of it from the criticism of capitalism, to the
pitfalls of radical anarchy, to the biographical story of Shevek that brought me
to tears more than a few times.</p>
On Diablo 2: Resurrected2021-09-22T17:32:55.041856+00:002021-09-22T17:32:55.041856+00:00Unknownhttps://blog.codezen.org/posts/on-diablo-2-resurrected/<p>Tomorrow marks the release of Diablo 2: Resurrected, the Blizzard remaster of
Diablo 2. Despite my better judgment, I'm hyped.</p>
<p>Like a lot of gamers my age (35), I cut my teeth on Diablo 2 back in high school
and it still holds a special place in my heart. I spent many a night spamming
[Trade] on closed Battle.net trying to turn a nickel into a dime, or doing
endless Mephisto runs.</p>
<p>I've talked about Diablo 3 <a href="https://blog.codezen.org/posts/on-diablo/">more</a>
than a <a href="https://blog.codezen.org/posts/diablo-revisited/">few</a>
<a href="https://blog.codezen.org/posts/more-d3-the-fanbase-from-hell/">times</a> in the
past, mostly covering Blizzard's struggles to get Diablo 3 into a good state,
but also some criticism of the community that seems progression obsessed but
can't decide whether there's too much end game or not enough.</p>
<p>To summarize - in the torturous process of getting Diablo 3's meta right,
Blizzard threw out a lot of what made Diablo 2 great. No trading of any sort, no
PvP, the general funneling of players into certain cookie cutter builds based
around set items (or, recently, explicitly avoiding sets). The progression of
Diablo 3 is largely built around power creep. Free items, tweaking this or that
set to be 10,000x as powerful, handing out new slots and free powers. The result
is a lot of <em>fun</em>, I've put thousands of hours into Diablo 3, but there's still
a feeling that it never lived up to its predecessor.</p>
<p>I'm curious how much a glossy new graphical paint job and a handful of
QoL fixes will bring Diablo 2 back into the realities of modern gaming and how
much this remaster is Blizzard's elaborate bluff call (or cynical cash in) on
all of the people that complained about Diablo 3.</p>
<h3 id="be-careful-what-you-wish-for">Be Careful What You Wish For</h3>
<p>I would not be surprised if D2 veterans (including myself and my wife) get a few
runs deep into D2R and then realize how many places D3 is just a completely
superior game.</p>
<p>For example, could anyone really prefer grinding the same zones with the same
sets of enemies over and over and over compared to the randomness of D3's rifts?</p>
<p>It's hard for me to imagine, after the nostalgia of seeing the old environments
rendered beautifully wears off, that anyone could prefer doing 1000 Baal runs
over an equivalent amount of playtime in D3 rifts / greater rifts with random
levels, enemies, and end-bosses (rift guardians).</p>
<p>What about going from having 16 freely toggle-able difficulties (or potentially
<em>infinite</em> levels of difficulty in greater rifts) down to 3? As someone that
graduated to playing hardcore in Diablo 3, I can tell you I'm going to miss
being able to finely calibrate the difficulty without having to grind "Nightmare"
until I feel safe for "Hell"...</p>
<p>Then there's itemization. It's argued D2 has better itemization and it doesn't
force you into cookie cutter builds and that's objectively true, but it's also a
product of having a max difficulty. If Diablo 3's difficulty wasn't literally
infinite and Torment 16 (or Inferno) difficulty was the maximum a ton more
builds would be "endgame" viable there too.</p>
<p>On top of that, the drop tables in D2 are just <em>brutal</em>. It's true you won't
need 6 set items just to start having fun, but it will take hours and hours to
find specific items. In 2001 this grind was acceptable, but back then the
gaming market wasn't as saturated, there weren't digital marketplaces filled
with AAA games you could instantly download. The expectation of a single game
drawing out the experience indefinitely has faded in favor of shorter, more
meaningful games. Not to mention the personal facts that you probably have far
less time to game now than you did then, provided you were even alive during
the first run of D2.</p>
<p>The bottom line is that D2 is slow. It's combat is slower paced. The grind is
longer and more repetitive. There will be sessions where you play for an hour
and have nothing to show for it except a bit more gold and experience.</p>
<p>D3, for all of its flaws, evolved in the modern landscape. It's fast, it's
bright, it's arcade-y. Rifts are designed to be at most 15-minutes long and, on
higher difficulties, are virtually guaranteed to give you at least a couple of
chances at the drops you want. Given an hour play session, D3 gives you more
guaranteed progression no matter how you slice it.</p>
<h3 id="on-the-other-hand">On The Other Hand...</h3>
<p>Perhaps D2 is the perfect antidote for the arcade nature of D3.</p>
<p>For example, the variety issue. It's true D3 has a lot of environments and rifts
will stick them together in new random ways with random enemies found from all
over... but it could be argued that by the time you're max level (which is only
a matter of hours, not days) there are only two types of enemies in the game.
Trash, which is ignored or vaporized instantly, and Elites which actually may be
a challenge. When farming, even that distinction is moot as you speed from one
pack to the next.</p>
<p>Or the difficulty. Sure you don't have an infinite progression, but you still
have three difficulties and set monster levels. And maybe having a max
difficulty is a good thing precisely because it means builds that would be
considered "suboptimal" in D3 because they can't push Torment 200, are just
fine because they wreck Hell Act V.</p>
<p>Maybe the item grind will be offset by the ability to trade (which will be much
easier in the era of the fan site like <a href="https://diablo2.io">diablo2.io</a>). Or
perhaps, because of the difficulty cap, will just be something fun to do instead
of an obstacle to finally getting to the vaunted end game. Maybe having those
hours where nothing drops will just make the lucky hours feel that much better
as opposed to sifting through and destroying every useless "legendary" D3
scatters at your feet.</p>
<h3 id="time-will-tell">Time Will Tell</h3>
<p>I'm excited to see how this turns out. Is this the D2 renaissance, or is it one
last goodbye? Will it be the ultimate validation of D2's classic status, or will
it be a reminder of how far we've come?</p>
<p>Personally, I'm hoping that D2R will be a ton of fun and a bridge to an eventual
Diablo 4 but I can't say I wouldn't enjoy watching the D2 curmudgeons that pipe
up in every D3 discussion eat crow either...</p>
Hindsight: Retiring Some Early Entries2021-08-04T22:23:56.263652+00:002021-08-04T22:23:56.263652+00:00Unknownhttps://blog.codezen.org/posts/hindsight-retiring-some-early-entries/<p>Doing some spring cleaning as part of the <a href="/posts/migration-to-zola/">migration to
Zola</a> I had to go through my older entries with a
bit of a fine-toothed comb to ensure that things like comments and images
were properly migrated by my scripts.</p>
<p>Reading my words from a decade ago, I realized I've changed a lot as a
programmer since then and I don't really endorse my old viewpoints. But it
seems a shame to just delete the old entries without examining why I was wrong
or, at least, why my opinion changed.</p>
<p>So, I'm retiring the two earliest entries on this blog.</p>
<p>The first post, named "Calm Down!", was written as I discovered the need to
pace myself when handling Canto bugs. While I don't think it's a bad idea to
avoid panic when programming, the prescription to re-design over iterate is a
bit ridiculous. This post is indicative of where I was at 24 having never
really worked on anything much bigger than a toy, or for longer than a year
or two. Now that I've got more experience, and have tangled with more than my
fair share of twisted legacy codebases that leech your will to program out by
papercutting you to death, this post doesn't ring true for me anymore.</p>
<p>The second post is one I wrote about using Python decorators to parse
commands into function arguments automatically. I effectively wrote an
ad-hoc, runtime type system annotation for Python. This is also indicative of
my mindset at 24. I fell in love with Python around 2010 and it wasn't my
first interpreted language, but it was the first one I really bothered to
master... long after this post that I cringe at now because decorators are
<em>almost</em> always a terrible idea and Canto itself has long since abandoned
this in favor of a much more straightforward parser.</p>
<p>I hesitate to retire these posts a bit because they're closer in tone to what
I initially blogged about. Circa 2008-2009 I was regularly posting in a crazy
do-it-yourself CMS based on Python and Git and, shockingly, I was actually
trying to get people to read what I wrote. Now I just review books and
briefly update nobody about whatever I care to blather on about and if
someone stumbles in from a search engine once in awhile so be it.</p>
<p>On balance though, there's plenty of other amateurish (and not so technical)
early opinions hosted here so I think giving these two the axe and saving
myself the internal cringe every time I read them is no great crime.</p>
Migration to Zola2021-08-04T22:02:05.974850+00:002021-08-04T22:02:05.974850+00:00Unknownhttps://blog.codezen.org/posts/migration-to-zola/<p>Recently I've been learning Rust and enjoying it quite a lot. So as a
side-project I began porting my blog to <a href="https://www.getzola.org">Zola</a>, a
Rust based static site generator.</p>
<p>I wrote a basic Python script to convert my Wordpress posts into the expected
TOML format, and then found <a href="https://posativ.org/isso/">Isso</a> to handle
comment functionality, and it included a Wordpress import tool so comments
should all be in place.</p>
<p>URLs for the old Wordpress posts should still work thanks to Zola's aliases. </p>
<p>With the TOML formatted entries, I was also able to write a Python script to
dump my Goodreads reviews into book review entries with a special format.
These now comprise most of the entries in the <a href="/tags/books/">books
tag</a></p>
<p>Anyway, consider this the obligatory migration post. I did a general amount
of spring cleaning on tags and unified some of the old plugin markup
(specifically annotated code tags).</p>
<p>In the immediate future I'm going to write some retrospective on the earlier
entries of this blog before archiving some of them.</p>
On Maskerade 2021-04-14T00:00:00+00:002021-04-14T00:00:00+00:00Unknownhttps://blog.codezen.org/posts/on-maskerade/<p>I've been in a funk lately and Pratchett never fails to cheer me up.</p>
On Shōgun2020-11-14T00:00:00+00:002020-11-14T00:00:00+00:00Unknownhttps://blog.codezen.org/posts/on-shogun/<p>I enjoyed this book, but it comes dangerously close to overstaying its welcome.<br/><br/>I have to give credit to Clavell for putting together such a far-reaching epic story in a stand alone work. He does such a good job giving you well-researched details about feudal Japan and how their society hung together in contrast to feudal Europe, highlighting the many ways in which feudal Japan reads as more modern to the 20th / 21st century standard while also acknowledging their sort of collective, efficient brutality. The plot that emerges is twisty in a delightful way that court intrigue seems uniquely capable of delivering regardless of which culture it takes place in. Clavell does an especially great job making each of the <i>many</i> characters feel unique, with their own agendas, secrets, and desires. Not one of them felt like a caricature, or a mindless antagonist.<br/><br/>The one flaw with <i>Shogun</i> is the pacing. You spend the first half of the story getting a very thorough introduction to feudal Japan, then the plot gets moving and it becomes more character driven, but once you're closing in on the end you realize there's no way Clavell is going to give a fully satisfying ending in the remaining pages. The story ends too quickly from a plot perspective, and it makes some of the 1200 pages of exhaustive details seem needless in retrospect*. Ultimately, I would have traded a couple hundred pages of early world-building and administrative minutiae (as edifying as I found that at the time) for a couple hundred pages on the end to full settle the plot and explore the short term consequences.<br/><br/>Ending a little abruptly keeps this book from being a true masterpiece, but it's still a damn good read, an interesting glimpse into feudal Japan and its complicated politics, and a very entertaining story of adventure, romance, loyalty and betrayal. I'd recommend it for anyone that isn't scared off by the page count.<br/><br/>* <spoiler>Like the musket regiment details when we never get to see them used, or the Blackthorne/Rodrigues dynamic when he never assaults the Black Ship. A lot of discussion and maneuvering went in to setting up a battles that just never happen "on screen".</spoiler></p>
On Masters of Doom: How Two Guys Created an Empire and Transformed Pop Culture2020-08-31T00:00:00+00:002020-08-31T00:00:00+00:00Unknownhttps://blog.codezen.org/posts/on-masters-of-doom-how-two-guys-created-an-empire-and-transformed-pop-culture/<p>I enjoyed reading this. I was about 6 when Doom came out, but in the subsequent years I played the shareware versions of it as well as Commander Keen and Wolfenstein 3D regularly. The first half of this book was a bit of a nostalgia trip but it filled in a lot of the backstory of Carmack (who is a personal hero of mine as a C programmer) and Romero (who was more of a famous name).<br/><br/>I was most interested in the early, hacker days of basically turning pizza and Diet Coke into seminal videogames. The book did a good job chronicling the creation of Commander Keen and Wolf3D as a prelude to Doom and setting the scene of BBS era shareware gaming. It also colored in some of the other notables whose roles were never as clear to me. The contributions of fellow Softdisk guys/id founders Tom Hall, Adrian Carmack, and to a lesser extent designers like American McGee and Sandy Petersen are all made clear. There's a lot of fun in reading about just what a huge splash Doom made and getting some light shed on other players like Scott Miller's Apogee, or Bill Gates trying hard to sell Windows 95 as an upgrade over DOS, Burger Bill, Nintendo trying to keep the SNES a family system, or even Joe Lieberman calling for the creation of the ESRB.<br/><br/>As a programmer I was generally pleased with how technical the book got in some places. Nothing too insane for the non-technical reader, but it did go into details about how each iteration of Carmack's engine was different and better than the last. The rise of the GPU is also a minor tangent here. It didn't get everything right (at one point it referred to OpenGL as a programming language which... is a simplification at best) but it grounds the software work well and even gives some details about the rigs they were using to do their work.<br/><br/>I was less interested in the second half, mostly because I was actually old enough to remember some of the broad strokes but there are still plenty of bits of trivia and readings from .plan files that were new to me. The book does a pretty great job overall of painting Carmack and Romero as the yin and yang of early id, and the later history of Ion Storm (Romero's game developer utopia that failed to do much - classic status of Deus Ex aside) versus id's more diminished role of being an engine publisher (which is harsh but mostly true up until Doom 2016 well after this book) underscores that they both really needed each other to bring balance to their early work. Even with 16 more years of retrospect that analysis holds up.<br/><br/>Anyway, very interesting book and I'd highly recommend it to anyone that enjoyed the 90s PC gaming scene, even if you were just a kid.</p>
On Getting the Bands Back Together2020-08-09T22:38:46+00:002020-08-09T22:38:46+00:00Unknownhttps://blog.codezen.org/posts/on-getting-the-bands-back-together/<p>Recently, Google forced my family from Google Music onto YouTube Music. It wasn't a huge deal, our playlists made it over, the selection seems the same. Aside from some housekeeping (clearing up the billing, switching apps etc.) it was <em>almost</em> painless.</p>
<p>That said, my opinion of Google has been pretty low for a few years. Maybe since the move to "Alphabet", maybe since "Don't be Evil" was <a href="https://gizmodo.com/google-removes-nearly-all-mentions-of-dont-be-evil-from-1826153393">removed as their motto</a> back in 2018. They've fallen a long way since the heady days of adopting Android when we in the Linux community looked at them as a savior of sorts.</p>
<p>A year or two ago, we started trying to "divest" from Google. We started using <a href="http://duckduckgo.com">DuckDuckGo</a> as our primary search, I shifted my personal email from being a redirect to my GMail account, to being a <a href="https://proton.me">ProtonMail</a> with my old GMail redirected to <em>it</em> (as an aside, if you can ever get out of running your own mail server <strong>do it</strong>, it does wonders for peace of mind). But of course this movement was incomplete. We have three Android devices in the house crammed with Google software, two Chromecasts, we still regularly use Maps (or would if we had anywhere to go during COVID-19), pay for YouTube Music / Premium etc. The idea was to become <em>less</em> reliant, rather than cutting it out completely (like we have done with Amazon and, long ago, Facebook).</p>
<p>The forced march to YouTube Music had me pining for something that I lost... my meticulously curated FLAC collection. It was the product of years of effort in college, either downloaded from private torrent trackers Oink and Waffles, or ripped from CDs of my own childhood collection and the Rolla radio station where I briefly trained as a DJ (circa 2007 <a href="https://kmnr.org/">KMNR</a>) mostly to get access to their library.</p>
<p>Five or six years ago that FLAC collection was lost in a sudden disk failure along with some modded Minecraft servers that I wish I still had (like the summer camp jungle beach where Scarlett and I set off fireworks on the 4th of July one year). I put the disk on a shelf with the idea of getting it forensically reconstructed ($$$) but mostly I just shrugged, bought a new disk, and moved on. Everything else was backed up, I was paranoid with my source and our family pictures, but the FLAC collection was too large to easily shift elsewhere and… if I'm being honest, I basically didn't use it anymore.</p>
<p>I'm ashamed to admit it, but I got out of the habit of listening to my FLACs for a couple of reasons. The first being that, as soon as we started getting smartphones (2010, I got my first HTC Hero on Sprint) it started feeling cumbersome. Suddenly burning CDs seemed like it was from the Stone Age and an iPod (which was the high-water mark for Apple in our Linux household) was just an extra annoyance. The phone could actually play FLACs, but when you've got like 2.5G of storage, that's <em>maybe</em> 10 albums. I transcoded down to Oggs for a while, but that still didn't come close to getting the whole collection (and let it be a given that when you only have access to 10% of your collection, the music you want to listen to is <strong>always</strong> in the other 90%). Second, my wife, who loves new music, would have to ask me multiple times for new releases and even though we'd occasionally sit and I'd download a laundry list of albums for her, and she had remote access to the collection, it wasn't exactly a seamless experience and didn't cover the "I'm not sitting at home on my laptop" case she needed a lot more than I did. Even though I tried hard to <a href="http://blog.codezen.org/2011/06/29/android-mediatomb-upnplay-music-anywhere/">make it work</a>, having these pristine FLACs stuck on a fileserver just wasn't cutting it anymore.</p>
<p>It wasn't too long after these problems cropped up that Google Music arrived and appeared to be the perfect solution. Suddenly streaming to a phone to play in the car was easy, new releases popped up with zero effort, and it even allowed you to upload your own music to cover any of the rarities (or artists like The Beatles or Tool that didn't sign on for streaming until later). We bought in, and I uploaded my FLAC collection in its entirety because even if it was a little gross to have them transcoded to whatever MP3 format Google would serve, it solved a bunch of problems for us. It didn't take long for my actual FLACs to start collecting virtual dust. Eventually, I even deleted my uploaded copy because Google Music showed double for all of the duplicate albums and hey... I still had the originals... until I didn't.</p>
<p>I took me a while to really miss the FLACs. I'd like to say that I really noticed the downtick in quality, but I didn't. The average 192kbps MP3 is enough to fool most ears, so I'll admit I prefer FLAC purely from a data completeness and open format point of view. The ease of using Google Music, which only increased with the introduction of the Chromecast and the improvement of our phones and mobile connections over the last decade, outweighed pretty much every other concern, but there were still gaps. <em>The Grey Album</em>. <em>Ratatat Remixes</em>. <em>Deltron 3030</em>. <em>Girl Talk</em>'s earlier albums. These still aren't there. There are also a handful of places where I had albums from weird releases that I still honestly miss. I had a copy of <em>Tortoise - Millions Living Now Will Never Die</em> that sounds way different from the official release. I don't know if I got some weird JP release, or if the files were just mismatched etc. but whatever the case it's gone.</p>
<p>The intervening years have been nothing but an improvement for the concept of a personal music collection. Phone connectivity and storage has improved, yes, but more importantly <em>cloud</em> storage is now a thing that's cheap and mature. I have more than 1TB of free space on Google Drive at this point, the left over space from the latest iteration of storing our family photos and videos (encrypted with <a href="http://rclone.org">rclone</a>). That's storage I can get to anywhere, even at work or on the road. For the local copy of the collection I've got a similar amount of space on my desktop and a 4TB spinning disk left over from my last torrent box project that I'm not using for <em>anything</em>. Moving, backing up, or accessing a 500GB FLAC collection just doesn't seem as daunting as it did in 2010 or 2011.</p>
<p>The one thing that streaming offers that is impossible to replicate with a personal collection is the appearance of new music automatically. That limitation is inherent because it's not a curated collection if you are merely aggregating all music. Streaming is still too hard to resist as a tool for new music discovery, and it's going to take a while for any collection to even include all the music I <em>already</em> like, much less encompassing all of the new stuff on the horizon. Not to mention the three other members of the streaming plan that I frankly don't want to provide support for again.</p>
<p>Without dropping Google's service what's the point? With their pervasiveness in our lives, in our browsers, in our pockets, attached to our TVs, the idea is to <em>rely on it less</em>. To cultivate alternatives, to look for ways to take greater control of our data footprint. It's the idea that next time I want to listen to an old favorite, I don't have to go to Google, or Spotify, or whoever that will charge me for the pleasure of tightening their web of heuristics.</p>
<p>There's also a component of vanity to any curated collection, and I'll cop to that freely. A music, book, or movie collection in any form is expressing an opinion, a style, a fashion. "<em><strong>I</strong> selected each of <strong>these</strong></em>. <em>I have</em> <em><strong>taste</strong>.</em>" When you find something you like it's enshrined, where other candidates just weren't up to <em>your</em> standard. It follows that in some ways losing that collection feels like losing your taste. With my FLAC collection lost, and with Waffles down, I was relegated to buying into someone <em>else's</em> collection. A broad collection, well studied by the ten million previous users feeding the algorithms that helped generate the recommendations you follow or the playlists you enjoy, but no matter how comprehensive or useful it's not <em>yours</em>. You're a visitor in someone <em>else's</em> taste. You're subject to their rules. You don't get to move in and make yourself comfortable.</p>
<p>So, with a bit of trepidation, I successfully interviewed for a new private music tracker, logged on and started the long haul to rebuild my massive collection. Judging from the fact I have exactly 0 bytes uploaded in the last three days, it's going to take a long time before I can feasibly rebuild the whole thing, but it feels good to download albums that have been immaculately ripped from known sources. It might not be a very good collection yet, but it's <em>mine</em>.</p>
<p>To celebrate, I picked up my first ever USB DAC (AudioEngine D1) and a fresh pair of Grado SR80e headphones to see how they compare to my old pair of Sennheiser HD598s (which may have been burnt out with drunken volume boosting and head banging). I bet it will make <em>zero</em> difference, but I'm already salivating at the idea of listening to a 24-bit vinyl rip of <em>Tame Impala - The Slow Rush</em> on pristine hardware. It's good to be back.</p>
RIP Rupert2020-07-16T17:57:14+00:002020-07-16T17:57:14+00:00Unknownhttps://blog.codezen.org/posts/rip-rupert/<p>Yesterday, July 15th 2020, my tortoise Rupert died. He isn't the first pet, or the first tortoise that has died in my care, but he was with us long enough that I feel a special affection for him and as such it doesn't feel right to bury him without having put some thoughts about hm down somewhere that won't be lost in a notebook or a scrap of paper.</p>
<p><img src="/rupertpalm.jpg" alt="" />The day he arrived, February 13th, 2019, in my wife's hand</p>
<p>The first thing I have to say is that I miss the little guy. I have pictures and videos of him from better days, but none of them can convey the feeling of running your fingers across his shell. The little dimple he had on his right shoulder since the day we got him. The way the big scales at his wrists felt soft if you rubbed them the right way. The way he would pull his foot in if you playfully pinched it. Or how he would push your hand out of the way if you put it in his path.</p>
<p>There's an entire vocabulary that now feels like live wires of grief. His full name was Rupert Snakefist, because of the smooth yellow arm scales that bordered the black scales down his arms. Rupes. Rupington. Tortugita. Mortoise was our classical corruption of his species.</p>
<p>About a month ago, he was in dire shape. He had a respiratory infection, but he started to pull out of it, he got his appetite back, he started putting on weight again. I was hand feeding him Mazuri and butter lettuce daily. We were treating his dry eyes with liquid tears and occasional medication. Another bit of vocabulary dead - Globbo, Globbington.</p>
<p><img src="/rupert-munch.jpg" alt="" />Rupert chowing down in November</p>
<p>Monday he got a Vitamin A shot. Tuesday we tried to convince him to eat some Reptivite with Vitamin A as well, by sprinkling it on some white nectarine which he ate vigorously. He'd eaten small bits of nectarine before, but I guess it was too much. He started to struggle a bit, in a way that was familiar after he gorged himself on special fruit or veg. Wednesday morning he was weak and I rushed him to the vet. By the time he got there, I think he was already dead. The vet found a heartbeat, but he was no longer responding. In less than 24 hours he went from recovering to dead.</p>
<p>There's a certainty with pets when their death is your fault. This is undeniably at our feet. We got Rupert on February 13th 2019 and he was maybe a few months to six months old at the outside. That means he was roughly 2 years old. Still a baby in tortoise time. Still fragile. But whether it was the lingering effects of the infection, or the overdose of white nectarine, or both, it doesn't matter now.</p>
<p>As he was recovering, I spent many a weekend day with him out on the concrete slab in our backyard. He loved the sun. I'd sit and read and he'd explore or soak in the little dish. Maybe work on some of the food I'd brought out. That's how I want to remember him. On the slab, or crawling up my shoulder. When I laid in bed with him on my chest, he'd tuck his head into my beard.</p>
<p><img src="/rupert-raspberry-1.jpg" alt="" />Rupert on the sunny slab back in May</p>
<p>They say that tortoises aren't very affectionate, but I don't believe that. The way he looked at us. The way he crawled to us. He knew us and loved us. Out on that back slab he was theoretically in danger from aerial predators so even when he crawled far, you'd look up and find him looking back at you. We were his safety and I feel like we betrayed him in the end because we didn't take good enough care of him.</p>
<p>All through his treatment though, as he was improving, he was so brave. So goddam brave. He took the shots and the flushes and the poking and the prodding. He didn't have a choice, but he tried hard to make it. He tried so hard. He was brave. He was brave when he was throwing himself over barriers. Brave when he jumped off the couch or the bed. He was fearless sticking his head into the log pile outside before I could run to get him. </p>
<p><img src="/rupertclimb-small.jpg" alt="" />Rupert the day we got him, brave as always</p>
<p>Rupert, your courage and struggle will not be forgotten, the lessons you taught us will not be forgotten. My heart feels empty and those sunny days on the slab will never be the same without you bumping around.</p>
On The Bell Jar2020-07-05T00:00:00+00:002020-07-05T00:00:00+00:00Unknownhttps://blog.codezen.org/posts/on-the-bell-jar/<p>Unexpectedly intense and fascinating read.<br/><br/>I read this without knowing anything about the plot, but of course it's reputation as a "sad book" preceded it. I was unprepared for how much of an understatement that is.<br/><br/>The first part of this book, before it becomes a hospital log, is amazing. I feel like it perfectly portrays the morbid cynicism of the suicidally depressed, but also the caged feeling of being a woman in this time period. Esther is straining against the parameters of her society and actually demanding agency of any sort she can get. It is a feminist book and is definitely judgmental of men, but I would say deservedly so... It's radical points of view are based only in equality and resisting the sort of angel-whore dichotomy and double standards facing women in the '50s. As she becomes more fixated on suicide, I wanted to shout to her (and Plath by extension) that things would get better even if her current status seemed hopeless.<br/><br/>It's in the last fifth that the book loses this intense thread. After the main suicide attempt, Esther is treated successfully. I didn't anticipate that, expecting more of a <i>One Flew Over the Cuckoo's Nest</i> style derision for EST and asylum psychiatry... But Esther pulls out of it. In a way that's a relief, but Plath makes it clear that the solution is temporary, that the bell jar that causes Esther to rot in "her own foul air" and become suicidal can surround her again. Especially since this work is obviously biographical, and Plath did indeed kill herself later, the work feels incomplete and the temporary solution unsatisfying. It feels ghoulish to say Esther should have died, but alternatively she could have learned to see something beautiful or hopeful in the world instead of being scrambled by EST.<br/><br/>I have to give this book credit for making me feel raw and sad the way it did, and for being a really powerful account of suicidal ideation that rings true. It's only the rather incomplete end that keeps it from being a perfect score.</p>
On One Flew Over the Cuckoo's Nest2020-07-02T00:00:00+00:002020-07-02T00:00:00+00:00Unknownhttps://blog.codezen.org/posts/on-one-flew-over-the-cuckoo-s-nest/<p>I really enjoyed this book. I'd been spoiled by the (also classic) movie, but there was plenty of extra perspective and detail to make it worth experiencing in its original form. Kesey's straight forward, spoken word style is charming, occasionally devastating, and definitely hard to put down.</p>
On Fear and Loathing in Las Vegas: A Savage Journey to the Heart of the American Dream2020-06-27T00:00:00+00:002020-06-27T00:00:00+00:00Unknownhttps://blog.codezen.org/posts/on-fear-and-loathing-in-las-vegas-a-savage-journey-to-the-heart-of-the-american-dream/<p>This book was great fun. I'd read some of Thompson's short stories and loved his sort of frantic, unreliable, trippy style and this book is basically the epitome of that drug-skewed paranoia without being devoid of meaning and introspection.<br/><br/>That said, I didn't feel like the book added much over the 1998 Terry Gilliam movie based on it. The movie hits all of the major plot points, and frequently quotes the book verbatim in both dialogue and narration. There were a few minor things that didn't make it to the movie, including one that had me in stitches, but the movie ends a little tighter and ultimately was a worthy stand in for reading the book.<br/><br/>Anyway, this was a blast to read and hard to put down (I read it in a day, the 200 pages frequently broken up with chapter and part breaks and great Steadman illustrations) but I was hoping for more content that I hadn't already seen on the screen.</p>
On The High Window 2020-06-24T00:00:00+00:002020-06-24T00:00:00+00:00Unknownhttps://blog.codezen.org/posts/on-the-high-window/<p>This novel is a bit bipolar reading it almost 80 years after it was written.<br/><br/>There are flashes of great hard-boiled prose in the work and the dialogue occasionally made me smile with how colorfully stilted it is (in a good, film noir way). In these stretches it's easy to see why Chandler was as influential on pop culture as he was.<br/><br/>I got thrown off more than a few times by just how detailed the main character, Marlowe, gets in describing locations and people - particularly women. I was baffled by some of the choices made to describe almost tangential things in great detail. Being written from the first person as the detective explains some of this terse but exhaustive note taking style, but I found myself skimming for some of the better turns of phrase.<br/><br/>There was also surprisingly little action in this novel. Marlowe discovers a lot by questioning, people come to him and point him at others, he finds dead bodies, etc. but he never really feels like he's in danger despite the presence of the usual heavies. There's a token fistfight that doesn't feel very realistically motivated, and all of the crime happens without Marlowe present. There's no sexual element either, no chemistry with any of the women. The result is Marlowe feels relatively passive, mostly just an agent to pursue leads, like a detached Agatha Christie protagonist, right up until he puts it all together.<br/><br/>In that way, I think the intervening 80 years of film noir has really sapped a lot from my enjoyment of this book. I was expecting gunplay and a sizzling femme fatale with creatively oblique dialogue but this novel is more akin to a morally ambiguous Poirot.<br/><br/>However, I have to give it some credit as the pulp fiction of its day. Like those Christie novels, this was intended to be short and to the point, to entertain for a while, and maybe not to provoke the sort of academic dissection more literary fiction might attempt. From that point of view I can appreciate this work like a 1942 version of a TV procedural... but I still feel like I got an episode of Dragnet when I was looking for <i>Double Indemnity</i>.</p>
On The Yiddish Policemen's Union2020-06-21T00:00:00+00:002020-06-21T00:00:00+00:00Unknownhttps://blog.codezen.org/posts/on-the-yiddish-policemen-s-union/<p>Well written, compelling take on the hardboiled detective story set in an alternate history where Jews were given grudging shelter from persecution in Alaska.<br/><br/>I found it hard to put this book down. Chabon's clear, colorful prose is nicely seasoned with the more abstract, terse style of Raymond Chandler and the result is delightful. As it is a detective story, the characters are a bit archetypal but they are filled out nicely. The setting is fascinating and well envisioned as a weird mix of Jewish and Tlingit culture that I doubt has ever been even suggested by another author.<br/><br/>The only criticism I would level is that the novel feels a little... tidy. There's a certain economy of characters and locations that felt a little contrived as they were revisited. I would have also liked another hundred pages or so exploring the consequences outside of the main mystery storyline, but if anything that's a testament to the intricate world Chabon created and how engaged I felt at the end. Definitely worth a read.</p>
On Interference 2020-06-09T00:00:00+00:002020-06-09T00:00:00+00:00Unknownhttps://blog.codezen.org/posts/on-interference/<p>If you enjoyed <i>Semiosis</i>, you'll want to read <i>Interference</i>. It picks up the story and further fleshes out the world of Pax, while updating us on the colony there as well as giving us a few glimpses into what became of Earth in the meantime. Super quick read thanks to the sparse style but it never lacks creativity and I enjoyed every bit of it. I'm crossing my fingers Burke continues the story because there are still plenty of questions I'd like to see answered.</p>
On The Conquest of Bread2020-06-03T00:00:00+00:002020-06-03T00:00:00+00:00Unknownhttps://blog.codezen.org/posts/on-the-conquest-of-bread/<p>This is a well thought out and concisely written explanation of the basic tenets of anarchist communism.<br/><br/>I can't say that it converted me to Kropotkin's specific political ideology, but it did raise some very interesting points about how society is organized and envision some very creative, maybe even seductive, ideas about how we can change that organization for the better even if it's light on practical details about how to get from here to there.<br/><br/>Incredibly, for a book written in 1892, it actually holds up pretty well. From a historical point of view, Kropotkin was dealing with the foreshadows of basically every economic issue we face today. Industrialization was in full swing, globalization was in its infancy as colonialism and trade swept the world, even communication (with the advent of the telegraph and the trans-atlantic cable) is easily relatable to the modern day. Kropotkin is seeing the seeds of our current troubles everywhere. The only place the 130 year gap is really evident is when he gets into the statistics or makes pointed remarks at contemporary opponents (although the notes in this edition are very helpful).<br/><br/>I found the basic concept that drives him to communism very persuasive. The idea that work should be done to provide all people with the necessities (food, water, shelter, clothing) with the least amount of expended energy seems obvious but following that thought to a logical conclusion unravels the basic premise of capitalism. <br/><br/>The lowest rungs of our society, those producing the fundamental materials of life and industry with manual labor, cannot just produce enough for themselves and their countrymen because that's not how they assure their own livelihood. They need money for all of their other needs, which means they need excess to sell, which means they are competing against the very cheapest possible producer and, because every link in the chain needs to make money, the worker inherently creates more than he earns - the free market of capitalism working as planned.<br/><br/>But Kropotkin effectively argues that this is rife with problems. Not only is it obvious exploitation (the worker creates more value than he earns and the less he is paid the better), it relies on inequality. The farmer's wheat that ends up baked in bread and is sold to someone that can afford to purchase their food rather than cultivate it themselves. In the reverse, if the baker can buy wheat from someone for cheaper, they will. Without bothering here to factor in tax or rent that go directly to the state/owners, the bottom of society is sinking lower, the top of society is rising higher. Kropotkin saw this in post-feudal Europe thanks to the huge leaps brought by industrialization and the exploitation of cheap colonial labor. We see it today in our societies straining under wealth inequality thanks to automation and globalization taking the bottom out of the labor market.<br/><br/>While the criticism Kropotkin levels at capitalism is similar to Marx, and they broadly agree on the ownership of the means of production, his overall solution is much different. Marx argues that the solution to capitalism is state communism, where the state is given absolute authority to speak for "the people" to enforce equality from the top down, to ensure everyone gets their fair share. In a lot of ways that's a more practical approach because Marx allows for a lot of the machinery of capitalism to stay in place. The state can define prices and wages, levy taxes, hire people and so on. Marxism amounts to switching one state for another rather than a grand scale reordering of society and this is why, mostly after Kropotkin's time, Marxism had such a huge impact on the 20th century with revolutions across the globe.<br/><br/>Kropotkin explicitly rejects Marx, the state in its entirety (thus "anarchist" communism) and all of the machinery of capitalism, like money and wagedom which he calls "slavery in modern garb." He argues that both the state and capitalism <i>inherently</i> lead to inequality and the potential of abuse and corruption. It's hard to look at the intervening 130 years and disagree with his points. In the US we've seen our own government in decline, eroded by the corrosive influence of capitalism, deadlocked, made a mockery by corporations. The communist states aren't in much better shape, either disbanded or turned into one party autocracies that are unabashedly capitalist in everything but rhetoric. A lot of Kropotkin's critiques were damn near prescient.<br/><br/>The way Kropotkin envisioned society the state is replaced by many city sized communes that are basically autonomously feeding, clothing, and sheltering its citizens. A certain part of every person's day is spent serving the common good, and the rest can be spent as one pleases to enrich oneself. Developments that require inter-commune / national / global level coordination are accomplished through federation between the communes, and free agreement to proposals that are submitted there.<br/><br/>It's a very attractive society to think about. It's almost like Star Trek, except instead of replicators each person contributes work to the common good, and if you want something more than the basic necessities, you work directly toward that goal. If you want a telescope, you find who can make telescopes and you work with / for them in order to create a telescope. If you need any materials, you just go down the chain of production until you reach some core material you can help gather, or that society has deemed a necessity. It's almost like quest based communism. To get rewarded with that luxury item, or even create a new one, you basically craft it with the help of the artisans, or barter something you can do to earn the others' work. Unneeded work is never done. There are no imports or exports, no commodity speculation. There is no reason to overproduce, no need to do extra to survive. Society is no longer based around exploitation.<br/><br/>However, as much as I like to imagine living in such a beautiful and fair society, and this book goes to great lengths to prove it's not completely <i>insane</i> to think a society like this would work, and gives many examples of specific enterprises that have successfully worked this way in reality, it never really gives satisfying answers to how a region following this ethos would be established or defended either from internal or external threats. Kropotkin inserts "the community, by agreement" in any place that state management would logically take over. Who defines how much is "enough" wheat, or coal, or bread, or clothing? The community, by agreement. Who tackles public works like pipes, roads, and dams? The community, by agreement.<br/><br/>In a perfect world, where people act rationally, hold rational opinions, and can be convinced by superior logic, that would indeed work beautifully. But in 2020 it's obvious that people don't act in their own best interests, they aren't rational, they don't have to listen to reason. They can, and will, use whatever power they have to elevate themselves and ruin that equality by discriminating against any class of people that can't form a majority. Atrocity and injustice, however small scale, is still quite possible in a world where every action is justified by convincing 51% of the people that care enough to have an opinion.<br/><br/>More broadly, Kropotkin has no mechanism for arbitration within or between these communes. No state means no one person has the power to decide or even just break a tie. Free agreement works when both sides benefit from agreement (like the railway standards he references, each side gets a way to access the other's system). What about when two growing communes want to claim the same corner of fertile land? There is no mechanism to deal with that. What about when a commune that is majority one religion decides another commune is full of infidels and should be destroyed? Does every commune need to be able to defend itself? Need to maintain a military? Ambassadors? When taken in aggregate, rather than in isolation, Kropotkin's world starts to feel like a maze of feudal fiefdoms where it's easy to live with your neighbors as long as they are ideologically identical to you but if one of them shows up on your doorstep ready to rape and pillage you better hope your local military enthusiasts have thought up a plan.<br/><br/>These criticisms are also assuming that the society is already created. The real trick would be convincing a revolution to not just replace the current state (as we've seen time and time again through history) but to actively tear down the apparatus of power and completely rebuild society from the bottom up.<br/><br/>Ultimately, that's what makes Kropotkin's vision impossible. It is a wonderful idea and he does a great job extolling its virtues, but without a way to create, much less maintain, that level of equality from a realistic starting point and without the ability to assume peaceful coexistence with the rest of the world, it's still just another utopic fantasy.<br/><br/>That said, this book never set out to be a manual for the revolutionary. Kropotkin doesn't end it calling for the workers to rise up, or make plans for how Europe will be converted like in the <i>Communist Manifesto</i>. This is a philosophical text, an illuminating of some ideas and possible solutions backed with some interesting statistics. Kropotkin succeeds more in his criticism of capitalism and state communism than he does in putting forth a real vision of the future. Yet, when reading it, I couldn't help but think that just as his criticisms were accurate, the idea that a liberated, federated society might work is actually less far-fetched now than it was in 1892 thanks to computer automation and examples like the proliferation of Open Source.<br/><br/>Anyway, if there is a work that has a more concrete path for anarchist communism, I'd like to read it. For now, I'll just sigh and say "Maybe someday, but definitely not tomorrow."</p>
On Interesting Times 2020-05-11T00:00:00+00:002020-05-11T00:00:00+00:00Unknownhttps://blog.codezen.org/posts/on-interesting-times/<p>Within Discworld, this pretty much checks all boxes.<br/><br/>This deep into the long series (17 novels) it's not really possible to review independently, and it wouldn't stand alone as well, but it was really nice to return to Pratchett's Discworld and particularly returning to Rincewind, Cohen, and Twoflower - the main characters of the first two Discworld novels, <i>The Colour of Magic</i> and <i>The Light Fantastic</i>.<br/><br/>In some ways <i>Interesting Times</i> is predictable and in other books I'd consider that instantly lethal to any sort of interest, but like most of the Discworld books the interest isn't so much in the plot as it is being led by Pratchett through the intricacies of this world and his use of metaphor to talk about human nature. In this case, the main characters head to an oppressive regime modeled on China and has a lot to say about that oppression, but also the nature and contradictions of civilization in general and it's all done in the sort of tongue-in-cheek, circumspect way that Pratchett is so good at. I didn't need to feel like Rincewind, Cohen, or Twoflower were somehow in danger, or question whether Lord Hong would get his due, to be thoroughly entertained.<br/><br/>Would it stand up literarily to some of the other work I've give four stars? Maybe not, but I spent half of this book with a grin on my face, so as far as I'm concerned it's mission accomplished.</p>
On American Psycho2020-04-30T00:00:00+00:002020-04-30T00:00:00+00:00Unknownhttps://blog.codezen.org/posts/on-american-psycho/<p>I read this book based on some snippets of Ellis' writing I found intriguing. This is also a rare example (for me) of a book I read after seeing the movie so, in some ways, Patrick Bateman will always be Christian Bale to me.<br/><br/>I understand that this book was controversial on release in 1991 and it's not hard to see why. It leaves absolutely nothing to the imagination. The sex is straight out of <i>Letters to Penthouse</i>, the violence is equally pornographic and barbaric. This is not your typical literature. This is not something you discuss with your children or coworkers. There isn't one scene with anything admirable in it, there is nothing life affirming, nothing hopeful.<br/><br/>Yet the novel is also utterly believable and portrays something that I think needs to be examined - the complete and utter lack of accountability of the wealthy. This is what makes <i>American Psycho</i> so compelling. The sex and violence can both titillate and disgust, but the intervening time is spent showing us how everyone in Bateman's world, the world of the rich elite, doesn't care about <i>anything</i> but their own appearance. Other people don't really exist to them.<br/><br/>Everyone is speaking, no one is saying anything of substance, no one is listening.<br/><br/>Everyone fights over prestige restaurant reservations, no one eats anything which doesn't keep them from reciting snippets of critical praise from a newspaper or magazine.<br/><br/>Everyone is interested in fashion and brands and price tags to measure themselves against others, no one cares about the actual substance of their lives.<br/><br/>Through the book, Bateman is almost always confused for other men and never makes a correction. Much time is spent with his rotating crew of acquaintances trying to identify others and failing. The men who can name a garment by designer and collection, or list the model number, features and price tag of their stereo, can't remember a face if their lives depended on it. The business card is a fetish object more notable for its lettering and thickness than any information conveyed by it.<br/><br/>At one point in time I think the outrageous level of narcissism depicted in this book might have read as a satirical caricature. It might have seemed like we lived in a country where justice is equal and the Patrick Batemans of the world would be punished. In 2020, with 30 years of hindsight with Enron, subprime mortgages, Weinstein, Epstein, and of course Donald Trump (who is explicitly idolized by Patrick's ilk in the book) it's almost chillingly real. During a chase in the novel, Patrick shoots someone on the street and all I could hear was Trump's claim he could shoot someone on 5th Avenue and not lose a voter.<br/><br/>The bottom line is that consequences aren't on the table for these people. Bateman tells us that he doesn't have any clear emotion except "greed and, possibly, total disgust." No happiness. No sadness. Certainly no remorse. No fear of discovery. Bateman is occasionally upfront about his violence and even confesses but it's always ignored or taken as a joke because those around him are pathologically incapable of noticing his aberrant behavior for fear that their own will be noticed.<br/><br/>It's a bleak story overall that shows us the ruling class is entirely self-serving, vapid, unfaithful and even murderous and yet the one character central to Bateman's life that is merely average, Jean, his secretary, has actually fallen in love with the facade he presents to the world. It's darkly ironic and indicative of how stupid we, the American people, are that we believe there is any goodness or high intention in them.<br/><br/>The one criticism I will level, and the reason I didn't give this five stars for prose alone, is that I think Bateman's unreliability about murdering Paul Owen does nothing but rob the story of some of its clarity. It would be one thing to turn Bateman into a gutless fantasizer and relegate all of his butchery to his imagination, but we suspect some of his exploits did occur (the taxicab driver accused him of murder he recounted, the police at Evelyn's neighbor's brownstone, the blinded bum) so not knowing how much of Bateman's memory is true just undermines the overall point that it doesn't matter.<br/><br/>I would also say I found the three musical interlude chapters to be rather pointless filler. Assuming they are written from Bateman's point of view all it proves is that he can appear quite discerning about music I don't care about. The main body of the work aged well in retrospect, but these sequences seem far more dated to someone that wasn't immersed in 80s pop culture. I suppose they serve as palate cleansers in a book that only has one character to follow.<br/><br/>All together though, the book was a compelling read that shocked me and made me feel dirty for reading it, and dirty for living in a society where this level of flagrant disregard for humanity is basically par for the course for the moneyed elite.</p>
On The State of the Art 2020-04-25T00:00:00+00:002020-04-25T00:00:00+00:00Unknownhttps://blog.codezen.org/posts/on-the-state-of-the-art/<p>Rather uneven, but that's almost to be expected from a collection of early work.<br/><br/>The titular story, which takes up about half of the 200 pages, is the sort of science fiction payoff that everyone wants to read but is hard to do well and I'm not sure Banks really pulls it off. It describes the perspective of a highly advanced "enlightened" civilization (The Culture, naturally) on our local setting, the Earth of recent memory (circa 1977) rather than some distant analog serving as a metaphor or another wholly alien culture. Reading about aliens taking an unbiased view of our actual planet and ultimately deciding its fate is quite fun science fiction.<br/><br/>However, none of the moral hand-wringing or even calls to annihilate Earth ever really feel consequential thanks to the decision being left to The Culture who are always portrayed as far too measured and noble to negatively affect us in any way. The use of contemporary references like <i>Star Trek</i>, <i>Star Wars</i>, or David Bowie and the use of many major Western cities as a backdrop can also come off as a little lazy when the Culture lens doesn't add much. For example, the main character's view of divided East and West Berlin as post-modern political art is very interesting, but ship making requests on BBC or fashioning a lightsaber feels a little too much like Earth fan service. Ultimately, that's why I think <i>The State of the Art</i> is left as mediocre novella - the interest in the outsider view of real life is overwhelmed by a philosophical but toothless plot set in a relatively mundane location. Too much of Banks' creativity that I enjoy in the other Culture works is forced into hiding to serve the premise.<br/><br/>The rest of the stories are also quite a mixed bag. <i>A Gift From the Culture</i> and <i>Descendant</i> are good one session reads also in the Culture-verse. <i>Odd Attachment</i> was amusing and short. <i>Cleaning Up</i> was an entertaining retro-futuristic Cold War story. The remaining three stories, <i>Piece</i>, <i>Road of Skulls</i>, and <i>Scratch</i> were less successful in the end, although only <i>Scratch</i> was a complete failure (experiment all you want, but the result was unreadable garbage).<br/><br/>On balance there's more good than bad in this collection, but I wouldn't exactly call it essential reading either.</p>
On The Grapes of Wrath2020-03-08T00:00:00+00:002020-03-08T00:00:00+00:00Unknownhttps://blog.codezen.org/posts/on-the-grapes-of-wrath/<p>At this point I'm a confirmed Steinbeck fan, but I'll admit that I was a bit lukewarm on this book right up until the end. The story of the Joad family is actually only half of the text, with every other chapter being this sort of disconnected world building that basically serves as a very eloquent soapbox for Steinbeck to stand on, and while I appreciate Steinbeck making it clear that the system was rigged against a whole class of Americans, these chapters weren't as compelling as the more focused Joad chapters.<br/><br/>That said, the end really took the whole book up a notch for me. I kept expecting the Joad family's journey to end in some sort of positive way. Not necessarily some white picket fence fantasy life, but maybe starting to put down the roots of a new life in California. It never happened. The Joad family, and the class of Americans they represent, just get kicked over and over and over. Nobody's life is better at the end. The core of the family is still together, but penniless and literally underwater on the verge of winter. The grandparents are dead, Noah wandered off, Tom is on the run, Rose of Sharon is abandoned by her boyfriend and has a stillborn child.<br/><br/>Admittedly I took a lot of socialist views into this book but I can definitely see how contemporary critics attacked Steinbeck for his views when they work against the American streak of cowboy rugged individualism. There is a lot of meat on a socialist or collectivist reading of the work, and Steinbeck does not shy away from being quite overt about what he believes to be the solution to the plight of these workers. In that way, I think now is a very good time to read this classic - the sort of inequality Steinbeck rails against is still present in every aspect of our society and it's good to see what that looked like in the age before the corporations learned we were more useful with full bellies and empty wallets. Tom Joad was a hero 90 years ago, and he's still a hero today.<br/><br/>Anyway, this classic doesn't disappoint.</p>
On Semiosis 2020-01-30T00:00:00+00:002020-01-30T00:00:00+00:00Unknownhttps://blog.codezen.org/posts/on-semiosis/<p>This book was an unexpected gem. It was at once realistic and also very alien, it didn't shy away from being weird or predicting broad generational consequences for a group of humans trying to thrive in an ecology they didn't evolve in.<br/><br/>The book is very direct and straight forward. Partially because the generational scale precludes having one set of main characters, instead focusing on specific individuals in the history of this colony. It feels a lot like Asimov's Foundation series that way - effective, if a bit sparse, prose covering long stretches of history (although Semiosis is closer to 100 years on a single planet, rather than 10,000 across the galaxy).<br/><br/>It also has a bit of Star Trek vibe, which I loved, because the group of humans is so dedicated to peaceful coexistence, study, and survival through adherence to principles. It is a very positive view of a human future despite the exodus from a violent Earth, and it's just so much more fun to read about this group being molded by their new home to live in peace instead of battling to remake it in the image of Earth.<br/><br/>The author also really nails the plant perspective in the novel too. I won't get too deeply into detail, because that's the pleasure of reading this story, but the author never shies away from covering how the plants think, intertwine and communicate in a very satisfying way.<br/><br/>My only criticism is that it's too short, and in some ways it ended right as things were at their most interesting. However, it was a logical stopping point and really the whole story was so jam-packed with payoff that I might just be being greedy. I'm looking forward to reading the sequel.</p>
On Blade Runner 20192019-11-07T22:12:05+00:002019-11-07T22:12:05+00:00Unknownhttps://blog.codezen.org/posts/on-blade-runner-2019/<p>Here we are in November, 2019 - the starting date for the original <em>Blade Runner</em>.</p>
<p><em>Blade Runner</em> is a classic by any measure. The world is practically the definition of cyberpunk, even though it predates a lot of other works - specifically <em>Neuromancer</em>- that really set the foundation for the genre as separate from general near-future sci-fi.</p>
<p>I've seen <em>Blade Runner</em> many times, and played the equally great <a href="https://en.wikipedia.org/wiki/Blade_Runner_(1997_video_game)">PC game</a> when it came out in 1997 on a stack of CDs. It colored my imagination of a what a corporate dystopian future looks like, and even now it evokes that world well, and to some extent even better than its modern sequel <em>Blade Runner 2049</em> could with its masterful use of CG. That said, every time I rewatch this classic bit of film, and appreciate the gritty setting and the ambiguities of the plot, the thing that strikes me isn't just how imaginative the world is, it's also the extremely mismatched idea of technology it spawned. It's the <em>perfect</em> amalgamation of 80s tech flung forward in time.</p>
<p>This is a world that can envision flying cars, off world colonies, and the signature deep genetic engineering (i.e. replicants) but still has video pay-phones and glorious computers with green on black text and a bunch of fun analog controls. There's no such thing as wireless communication, or even the internet. There's no such thing as a general purpose machine. The Voight-Kampff machine, or the ESPER (the machine Deckard uses to do his mind-blowing photo investigation) are both these great, twisted and beautiful desktop machines that serve one purpose.</p>
<p><img src="/esper-1024x425.jpg" alt="" />Pan right, wait... enhance</p>
<p>Future Los Angeles is also cyberpunk perfection. Apartment buildings 100 stories tall crammed together. Everything at street level is mostly pedestrian because of the flying car situation, but even so it's twisted and claustrophobic. One of my favorite street level places is a literal hole the wall bar Deckard visits after he retires Zhora</p>
<p><img src="/bladerunner-1024x428.jpg" alt="" />Little nook for a drink</p>
<p>With all of the foot traffic it's easy to imagine this place making money, but there's also a contradiction in the story here. On film the world is densely populated and yet there are huge sections of Los Angeles that are empty - like the Hotel Yukon that hosts a single tenant. <em>Blade Runner 2049</em> elaborates on this theme where large swathes of old LA are just completely desolate. This is a fundamental tension in all cyberpunk - how do you have so much humanity packed into a single place? There's a required claustrophobia that's never really balanced with the reality that the world is a massive place and it's easier to build out than up.</p>
<p>Regardless of setting contradictions, <em>Blade Runner</em> also has this great melange of characters, some of which are now cyberpunk tropes (like Deckard the hard-boiled future detective himself) but many of which defy expectations. Like the old asian woman that Deckard takes the snake scale to - not the sort of person you'd expect to be doing microscopic analysis. Similar to Dr. Chew, or J.F. Sebastian the genetic engineers behind the Nexus 6 - both extremely weird people in extremely weird settings.</p>
<p><img src="/4953467354_8f298712f3_o.png" alt="" />Typical data analyst in 2019</p>
<p>Anyway, now that we've officially entered the corporate dystopia of 2019, it's fun to look at <em>Blade Runner</em> from a retro-futuristic angle and appreciate its bold predictions and well envisioned world - even if that world thankfully didn't end up looking much like our own.</p>
On A Fire Upon The Deep 2019-09-25T00:00:00+00:002019-09-25T00:00:00+00:00Unknownhttps://blog.codezen.org/posts/on-a-fire-upon-the-deep/<p>It's rare that I'd give a perfect score to a space opera, but this novel is so inventive and well told that I had to give it the nod.<br/><br/>Vinge accomplished something with <i>A Fire Upon The Deep</i> that I feel like I've been searching for ever since I read the Iain M. Banks' first Culture novel (<i>Consider Phlebas</i>) - a galaxy that is lively, filled with truly <i>alien</i> aliens, obscenely high technology, and many disparate factions - but in a lot of ways Vinge succeeds where Banks' later Culture books fail.<br/><br/>In Vinge's universe, humanity is not only a small part of a huge tapestry of civilizations of all descriptions, it's also a fragile and vulnerable race. The loss of a single world, or a single ship actually hurts and the main characters of the novel are usually some of the only humans nearby. This is a refreshing change of pace from Banks' work where humanity is ensconced in the nearly all powerful and galaxy dominating Culture that is so far beyond the usual needs and wants of us lowly 21st century Earth humans that in <i>Look to Windward</i><spoiler>a literal God race had to be tailor made for the story to imbue a particularly depressed suicide bomber with a small chance to kill billions of humans on a Culture Orbital - all as a purely symbolic "fuck you" that would have accomplished nothing by making a point</spoiler>.<br/><br/>Vinge does a better job of conveying what is happening on a galactic level too. He takes a page out of the early internet's decentralization so his civilizations, businesses, and individuals all communicate on a BBS-style low bandwidth galactic Net. The reader follows along with characters receiving the news and the messages paint a good picture of what's happening and how the rest of the galaxy is reacting to events without needing extraneous scenes or characters. Transmission also requires line of sight and long distance requires many hops which, compared to the instantaneous and disembodied chatter of Banks' hyper-intelligent AI Minds, is wonderfully grounded. The mechanic is never overused either (which was one of my big complaints about Banks' <i>Excession</i> where pages were devoted to what amount to first person ship logs).<br/><br/>Even space itself has more character in <i>A Fire Upon The Deep</i>. Space is not one big homogenous grid we're hanging in. It has "zones" that characterize how fast energy and information can be transmitted. Closer to the galactic core, high tech things like AI automation, FTL, and data transmission begin to degrade - not because of a plot convenient accident ("oh no, the AI went haywire!") but naturally and predictably such that characters are aware of it and plan for it. I love this idea and it made me think differently about something most space fiction takes for granted - the void of space itself. The concept is so well applied it informs every aspect of the story (thus the name of the series <i>Zones of Thought</i>). Primitive core worlds are trapped but also protected by the reluctance of the more advanced, high worlds to even enter their space and those advanced worlds are in turn protected from the civilizations that have effectively transcended in a similar way.<br/><br/>Vinge's conception of alien races is also deeply satisfying. Alien cultures, particularly the ones <i>A Fire Upon The Deep</i> focuses on are <b>weird</b>. And not just in a "I have a bumpy forehead and an odd number of legs" or a "My cultural values are different" weird, but a "you can't even comprehend what my life is like" weird. <spoiler>The Tines and the Skroderiders both followed an evolutionary path that is utterly foreign and novel compared to any other fictional race. It's hard, but fun, to puzzle out just what life would be like if one was, say, six different dog creatures or member of a billion year old sentient tree race.</spoiler> Best of all, Vinge does a great job of making these alien cultures feel real and true to what makes them unique instead of just being humanity with a few extra appendages.<br/><br/>Lastly, I have to acknowledge how Vinge wrote this book as a completely self-contained story. The end of the book is conclusive and satisfying in a way that some fiction is lacking these days. There are follow up books, including a direct sequel that came out 20 years later, but at no point does it feel like plot hook are being laid to support the next entry. I appreciate the brevity in comparison to series like <i>The Expanse</i> or <i>Mistborn</i> whose entries were fun but still obviously written to be parts of a larger, overall work.<br/><br/>These points elevate <i>A Fire Upon The Deep</i> well above the average space opera and I wish I'd read it earlier.</p>
On A Sense of General Malaise and 20202019-09-16T02:58:44+00:002019-09-16T02:58:44+00:00Unknownhttps://blog.codezen.org/posts/on-a-sense-of-general-malaise-and-2020/<p>It's been a while since I've taken the time to update. Admittedly, most of my online activity has taken the form of Reddit comments and Goodreads reviews of my latest books.</p>
<p>Lately I've been feeling quite depressed, in a weird global way. In my local bubble things are going well. My family is doing well, I make more money than I ever have doing work I believe in, we just took a nice week long vacation to the Sequoias that was beautiful and relaxing. Hell, my baseball team is even in line for the playoffs (if they don't fuck it up in the remaining 13 games). But on a macro level the world is actively declining.</p>
<p>I'd love to point to Trump, McConnell, or Kavanaugh, or further afield the likes of Bolsonaro, Putin, or Duterte as worrying signs that the world is facing another rise of fascism. The reality though, is that the deeper you look into global history the more our current troubles just become the latest symptoms of an illness: capitalism.</p>
<p>At the risk of waxing Marxist, it seems like basically every societal ill stems from love of money and the capture of our governments by people that have it.</p>
<p>There is a certain gleaming image of America that exists only in our minds, injected by high minded rhetoric in movies and TV and advertisements, but beneath the deluded hagiography that has been pushed on us by our own culture, America is an utterly brutal place to live for the same reasons that any third-world dictatorship is: the rich will do whatever they want, whenever they want and if you disagree you are to be vilified or eliminated by the mechanisms they control. Our media is the greatest spin machine the world has ever known focused on deifying its owners and minimizing the ugly truth of what happens to everyone that opposes them. Our secret police - who could be ICE, the FBI, CIA, NSA, or just their wannabes embedded in your local PD - is so effectively spun by the media that our own populace waves blue striped flags and worship them in spite of (or <em>because of</em>) their body count.</p>
<p>The secret of the American way of life is that billionaires always wear jackboots, out of frame, unmentioned, or more likely diligently ignored by a media they control. They always benefit from making rules to benefit themselves, and have the pocketbook to do just that with a little help from a vast swathe of ignorant, barely literate voters that cling to their Bibles almost as fervently as their Fox News and dream of one day being rich in White America. These billionaires know exactly what they're doing because they've been doing it for as long as money has equaled power. Citizens United was nothing but an American formalization of what we've known for millennia: money is the only thing that matters.</p>
<p>As such, our only shield from the rich, the media, or the law is our status as consumers with a few dollars in our pockets. Dollars which are themselves a largely fictional leftover from the post-WWII economy that benefited from the rest of the industrialized world being in ruins. Money that's turned from a living wage to achieve the American Dream into the company scrip of our begrudging overlords to be minimized and manipulated into schemes to increase their wealth that some would call "loans" or "credit" for things that we can no longer actually afford without pledging financial servitude to our masters.</p>
<p>So often in school we paint feudalism as this medieval, backward, ignorant system of peasant oppression that was practically abolished by the blooming of the merchant middle class marking the dawn of upward mobility. It's no surprise the heroes of this fiction are business people, but feudalism lasted well into the Renaissance "Enlightenment", and the capital-L Lords of the past became the landlords of the present. They didn't even change the terminology, they just clarified it. Landlords are lords by right of ownership rather than right of birth.</p>
<p>The only difference between the feudal age and now is that there is enough fluff to distract us from the myriad of Lords that are salivating, ready to take advantage of us at the earliest opportunity. Where once a peasant worker could get fucked by a single Lord taxing his harvest, now we Americans (and all of our brethren around the world to a greater or lesser extent) have the opportunity to be raped by any number of monied interests. The Lords foreclosing on your mortgage they knew you couldn't pay. The health insurance Lords who are getting erect at the prospect of you being mutilated in a major car accident just so they can deny you treatment and foist you off on their pharmaceutical buddies for life. The land-Lord that raises your rent every year. The boss-Lord who underpays you. The government Lord that taxes you in order to destabilize governments and murder opposition around the world in the name of "liberating" their resources. On every corner and in every high rise there's someone positively making bank to fuck you and yours over in the name of profit.</p>
<p>Yet none of this matters because the media has so thoroughly fuzzed our brains into a consumer mindset, where nothing matters but comfort and entertainment that can be obtained for dirt cheap. For the low low cost of wage slavery and the loss of your humanity, you can be showered in endless entertainment and feast on a hundred varieties of cheap foods crafted by the finest engineers from ingredients whose names are forty-five syllables long and were synthesized in vats rather than grown. Ideally you'll do this in your rented home, furnished on credit, with a car or two in the driveway you're still paying off with money you make at a job you got by taking student loans and getting a worthless degree. Bonus points if you do it while raising the next generation of consumers whose only source of love is expensive gadgetry in pretty packages. Look at all these wonderful ways you can spend money. Now look at all the ways you wish you could spend money. Obviously you need more money. There's only one answer to every problem: more money.</p>
<p>This is why I can live a comfortable life, but I cannot be comforted. The capitalist world is a torture test. I make a salary well into the 100k range and can afford to be ping-ponged between a thousand different places to spend it. But overall system is designed to dehumanize us and despite how much money I make it's not enough to buy freedom from this system of oppression. For that I'd need to get into the only business that pays well enough to get on the level of Bezos: exploitation. Unfortunately, I have a working conscience and a moral compass that was formed outside of the influence of mountains of cash.</p>
<p>In this context, as a tiny and comfortable part of the latest entry in the history of human oppression by money, I can't help but think our society needs a huge realignment with reality.</p>
<p>Previous entries, starting with those feudal peasants followed by a long parade of workers and artisans crippled by the heartless nature of greed, had the benefit that the ruling class wasn't going to literally destroy our world. If the idea of people starving in a world of surplus, or homeless in a world of empty homes wasn't enough to motivate us in the times of yore, surely the extinction of our human race would be enough impetus to change. Yet I keep having visions that the world the rich believe we are traveling to is a sort of post-apocalypse where the veil is lifted and the mechanisms that oppress us now are laid bare. The militant police forces become private militias, the gated communities become literal fortresses, and the pretense of "democracy" finally dies. In other words, we return to the bald-faced feudalism of a thousand years ago without even paying lip service to the needs of the little people that make it happen. The sort of world where powerful friends of moron kings can traffic underage sex workers with impunity, the truth can be suppressed indefinitely, ignorance is unassailable, brown people can be chained for the crime of existing, and the earth can be exploited ruthlessly. In short, the world we live in now but with all of the voices of dissent conveniently silenced.</p>
<p>I never thought I'd be a radical. I was raised to love this country. I grew up thinking corporate Democrats were the "good guys" and rich people deserved their luxury. But I was also raised to believe in a fictional concept of America that is fair, just, and equal. An America that took immigrants and refugees in its loving arms instead of locking them in cages and separating them from their children. An America that fought fascism and autocracy instead of installing dictatorships over democratically elected leaders.</p>
<p>That America has never existed. Under the covers, America has only one defining characteristic and it's not baseball, fireworks, apple pie, freedom, or any other egalitarian ideal - it's the ability to exploit free labor to make a handful of those ancient feudal Lords rich beyond reason. First with slaves kidnapped from Africa. Then, after the Civil War dried up the slave market, it became poor immigrants and children. When the Progressives in the early 20th century won us the right to minimum wages, eight hour days and five day weeks, the exploitation turned to suppressing that wage, eroding those rights and opening up new markets where those protections don't exist. Like prisons filled with non-violent offenders, or overseas countries desperate to turn their own populace into American style drones in the name of assimilating into the capitalist hellscape. Now there's even the oncoming "threat" of advanced automation that should be liberating us from the concept of working-to-live entirely, but instead it's a specter of unemployment and destitution. It's all class warfare that's so cleverly hidden that half of us are rooting for the wrong side.</p>
<p>As such, despite the fact that I was raised to abhor communism (and, in fact I still despise all autocrats and genocides, communist or not), I can't help but read Marx and think he was onto something. His criticisms are not just apt but insightful and if anything more prescient in the world of insidious, globalized, coordinated capitalism than they were in the comparatively primitive strain of nation-state capitalism Marx actually observed 150 years ago.</p>
<p>We need a revolution, just like Marx said.</p>
<p>Our final hope, and my hope for America, is that our democracy is still functional enough to perform this revolutionary trick without a call to literal arms. I don't want blood to be spilled, I want to live a life free of worrying about medical debt. I want every person to have a home. I want laws to be applied equally to all people, regardless of race, gender or orientation. I want our prisons filled with people that are actual criminals, and focused on rehabilitating them. I want everyone to have access to as high an education as they wish to pursue. Above all, I want to keep us from ruining our planet, our only home in the cosmos. These goals are not incompatible with wealthy people existing, they are just incompatible with plutocracy - because if there's one thing the last 500 years have proved it's that people with money will do <em>anything</em> to keep it, including dooming us all.</p>
<p>Anyway, maybe tomorrow I'll stop believing we can change the system from within and quit my job to call for the bloody revolution to commence (at which point my city will be annihilated by the rest of Texas). For now, I'll just satisfy myself with hoping for our last hope:</p>
<p><strong>Bernie Sanders 2020.</strong></p>
On The Amazing Adventures of Kavalier & Clay2019-08-26T00:00:00+00:002019-08-26T00:00:00+00:00Unknownhttps://blog.codezen.org/posts/on-the-amazing-adventures-of-kavalier-clay/<p>This book was wonderful. I have enjoyed most of the Pulitzer winning fiction I've read, unsurprisingly, but this was a rare book that was so compelling that I found myself reading it in bed until the early hours of the morning.<br/><br/>Chabon's writing is very evocative while flowing easily. He's not afraid of a well fitting bit of vocabulary (or making up his own ala "aetataureate") but the entire book is just a joy to read. Chabon's style shifts seamlessly between author omniscience and a sort of a well-researched paper with citations without ever breaking stride. It's this diligence that makes the world feel like it's real - Chabon's old New York actually works and the characters breathe within it.<br/><br/>The story is perfectly encapsulated. It doesn't rush, and doesn't dawdle. It spends a long time establishing characters and then pays them off. Predictably, with the backdrop of WWII, there is a bit of military adventure but even that interlude is relevant and surprising.<br/><br/>Best of all the three main characters just feel right. They are talented, but not superhuman. They make mistakes, but stay true to their motivations and their relationships.<br/><br/>I don't want to spoil anything so before I tag the rest of the review, suffice it to say this book is well worth a read.<br/><br/><spoiler><br/>I absolutely loved Josef and Rosa's relationship and the conflict Josef feels about living the wealthy, comfortable life with her while his family is still trapped in Europe. The things they notice about each other, the appreciation of each other's art. I identified strongly with Josef and Rosa shares a lot of traits with my wife that were actually a bit spooky. I think the idea that Josef would effectively abandon her after the war actually makes sense when you think about all he's been put through and the tragedy of losing his family in the Holocaust after all of his efforts.<br/><br/>Sammy's relationship with Tracy is also really well done and heartbreaking from the point of view of being repressed in this supposed "Golden Age" of American culture. The conflict Sammy feels in identifying as a "fairy" and his self-repression of taking Rosa as his loveless wife all ring true for the time and work well - not only as a juxtaposition with the idyllic concept of the 40s-50s post-war home life, but as a realistic development with Josef's behavior.<br/><br/>Tangentially, I want to call out Chabon's frequent use of smell in his descriptions. From the usual lingering perfumes and cigars, to the distinctive smell of Josef's office apartment, the basement smell of old comics, to the Navy pilot that stank "as if he had been dipped in some ungodly confection of camembert and rancid gasoline brewed up in a spit-filled cuspidor.” I mean, talk about descriptive. The more positive smells of Josef and Rosa serve to underscore their longing for each other during Joe's long period of absence as well. It's just good to get the nose engaged seriously.<br/><br/>The rise and fall of the comic book industry also plays a big part in the structure of this novel, but more importantly the creation of the comics themselves serve as a great mirror for the characters to reflect their internal thought processes. Josef's need to defeat endless waves of Nazi stand-ins before the war, and then portray the Golem (Jewish protector) afterwards. Sammy's conflict at creating successful pulp comics versus his desire to be a serious author (writing <i>American Disillusionment</i> which is a perfect companion for his story). Even Rosa moving from being a "serious" artist collaging and painting, to writing and inking her own comics to form a sort pseudo-love with Sammy (and a powerful connection to Joe while he was missing).<br/><br/>Chabon also does a great job creating the fictional Escapist / Luna Moth and other stories and layering them with meaning in the outside world as written by the main characters. Throughout most of the book it's not clear where the line between reality and fiction is drawn, but the comic aspect is so well backstopped by reality (including a lot of real comic authors and obscure heroes) that the Escapist and Luna Moth fit in like a missing puzzle piece.<br/><br/>The use of comics as a window into the American psyche also feels particularly inspired when considering this book was written 20 years ago, before comics became a truly mainstream affair. I say that with a bit of incredulity as someone that read comics as a kid in the 90s, but even with the 60 year history at the time, comics were still the niche interest of nerds. Chabon's research and use of comics as the central theme of the book in award winning fiction seems almost prescient in the world before the MCU dominated the box office and Marvel (briefly mentioned in the book, including a few lines of dialogue from Stan Lee) was a multi-billion dollar Disney acquisition.<br/><br/>This book does a lot, but manages to stay well focused and tight throughout. I teared up many times, I felt inspired, I felt worried, I laughed. As I mentioned before, it's a rare book that draws me in so completely and the one dirty trick it pulled was ending with so many pages left in the book intentionally dedicated to notes, acknowledgements and fragments of stories. It took me by surprise, but the story proper never pulled a punch down to the final line, which changed the entire meaning of the title.<br/><br/>I loved this book.<br/></spoiler></p>
On Cannery Row 2019-08-05T00:00:00+00:002019-08-05T00:00:00+00:00Unknownhttps://blog.codezen.org/posts/on-cannery-row/<p>I picked up this book expecting it to be a handful of short stories loosely centered around Cannery Row and in a way that's exactly what this book is, but it's more coordinated and interwoven than I expected. The scope of the work is tight (especially compared to an epic like <i>East of Eden</i>) but Steinbeck is capable of putting so much life into the characters and places with just a few lines of text that before I knew it I was wrapped up in the world.</p>
On Soul Music 2019-07-08T00:00:00+00:002019-07-08T00:00:00+00:00Unknownhttps://blog.codezen.org/posts/on-soul-music/<p>This was a frustrating entry to the Discworld collection. Similar to <i>Moving Pictures</i>, this story just superimposes a bunch of real world references into Discworld and every time it pretty much falls flat.<br/><br/>Discworld is at its best when it leans on the real world least. For example <i>Small Gods</i> (my favorite Pratchett so far) clearly referenced a lot of religion and ancient civilizations of Earth, but at no point does it cross into gougingly obvious parody and instead makes some insightful points about all religions and faith overall.<br/><br/>There's a certain aspect of that in <i>Soul Music</i>, defending creativity against the bean counters, the supernatural essence of music, and even some lore gems about Death and Susan Sto Helit, but it's all sandwhiched into too many one-to-one glaring cultural references and characters acting out snippets of the real world in jarringly un-Discworld ways.</p>
On The Name of the Rose2019-06-26T00:00:00+00:002019-06-26T00:00:00+00:00Unknownhttps://blog.codezen.org/posts/on-the-name-of-the-rose/<p>I honestly couldn't finish this book. I'm trying not to be overly critical and to give it the benefit of the doubt considering its 40 years old and a translation to boot, but after getting 350 pages into it, I started to dread picking it up and to me that's a strong sign it's time to move on.<br/><br/>The actual core mystery plot, and even the two main characters, were interesting and fun to read about but the author spends so much time on the minutiae of 1300s Catholic politics that I had trouble staying focused. I almost nodded off more than once. In the end I had to skip paragraphs just to keep from drowning in the sea of text rife with untranslated Latin, tangential names and places and nuanced theological argument about tiny aspects of Christianity that only a monk would fret over.<br/><br/>The worst part is that I feel like I'm actually a softer audience for this book than most. I have a grasp on the history and Catholic theology (being ex- myself), I can appreciate a smattering of Latin, I can even find interest in the abuses pre-Reformation Catholicism and its heresies. The trouble is that none of this painstaking historical table setting really matters that much to the main story.<br/><br/>It's almost like reading two books - one an exciting story of a Holmes/Watson style duo investigating a medieval serial killer around a labyrinth of forbidden knowledge (almost in the vein of Dan Brown), the other a very dry log of a group of Biblical scholars arguing. In fact the only reason I read as much as I did was that the murder mystery part was just compelling enough to get me through the mind numbing parts that seem to switch on every other chapter.<br/><br/>Reading the synopsis online I'll admit I might be bailing right as it was starting to climax, but ultimately I couldn't bring myself to keep slogging through it to dig out a few gems when I've got other books to read.</p>
On Inversions2019-06-11T00:00:00+00:002019-06-11T00:00:00+00:00Unknownhttps://blog.codezen.org/posts/on-inversions/<p>This was a really interesting book in the Culture series even though it didn't really match the others in subject matter.<br/><br/>The premise of this book is fascinating and it let Banks completely escape the usual hyper-advanced Culture setting and spend some of his boundless imagination on a medieval or Renaissance level world with two Culture agents basically having a long distance philosophical argument.<br/><br/>The world was deep and well thought out in the Banksian way, having enough detail to really make it feel like a unique place while using a lot of Earth short hand for the stuff that doesn't matter (i.e. the world is still very similar to feudal Europe in terms of organization, kings, dukes, barons etc.). The top level plot ends up being a bit boilerplate, but that's because the reader is more interested in the world and individual characters than the political machinations of this backwards planet so I wouldn't necessarily call that a flaw (and is quite typical for the other Culture books).<br/><br/>I enjoyed reading this book a lot, but if I had to criticize one portion of it, it's that we never get the sort of curtain dropping chapter at the end where all of the reader's suspicions about these characters and their origins are confirmed. There are plenty of tantalizing clues about our Culture representatives and their history together told as a story within a story, there are several sly references where it's clear to readers of previous entries what's actually being talked about, but in the end it's entirely background. In a way that's more fun than just having a final chapter that's like "Hey, remember that time we lived on a medieval planet? That was nuts." but I still expected a bit more of a concrete connection to the Culture at the end of the book even if it was just a glimpse of the characters leaving the planet. I did appreciate that the author of the in-world text (Oelph) did spend some time summarizing what happened in his world after the Culture agents faded from view, so I guess that's fair compensation.</p>
On Look to Windward 2019-05-21T00:00:00+00:002019-05-21T00:00:00+00:00Unknownhttps://blog.codezen.org/posts/on-look-to-windward/<p>This was a thoroughly enjoyable entry in the Culture series. I've been bouncing through the series based on interest and availability (my local bookstore has a big gap between <i>Use of Weapons</i> and <i>Matter</i> for some reason) but this story is much more in the vein of earlier Culture novels than the experimental <i>Use of Weapons</i> (in which the plot was overly confused by characters having multiple disconnected names in different time periods) or the abstract <i>Excession</i> (which focused too closely on floating conversations between AIs).<br/><br/>This story, similar to <i>Consider Phlebas</i> and <i>The Player of Games</i>, is able to use the Culture universe as a setting for a more conventional humanoid story. Which isn't to say that the story is unoriginal or straightforward, it's actually rather unpredictable and twisty, but it boils down to a much more relatable human level of "character I like is in danger" rather than being a more abstract, less tangible threat to be resolved and this is a perfect setup for Banks' writing.<br/><br/>Banks is at his best when delving into the minutiae of his world. Whether it's reasoning about how the vast megastructure Orbitals are created and maintained, or how the Culture deals with personal danger in a world full of safety nets and backups, or the inner workings of alien societies or even the bizarre mating habits of city sized alien creatures. <i>Look to Windward</i> has these details in droves and it's an absolute pleasure to read and imagine.</p>
On Light in August2019-04-18T00:00:00+00:002019-04-18T00:00:00+00:00Unknownhttps://blog.codezen.org/posts/on-light-in-august/<p>I read this because it's one of my dad's old books. He calls it his favorite, and is a Faulkner fan in general, but I gotta admit that I wouldn't have finished this if it wasn't for that connection.<br/><br/>There are passages of this book that are great. Long sequences of evocative imagery, especially with Christmas and the "street" of crime he follows from 17 to 33 and his various wanderings leading to Jefferson or his flight after the house burns down where he drifts for days unable to keep track of time.<br/><br/>Faulkner has a definite style of his own, the story reads like it's being told to you, with a lot of vernacular and contextual repetition of words and in that way it feels personal. Considering it was set in Faulkner's modern day and place, that makes sense - it's literally him telling you this story as if you were just sitting and listening.<br/><br/>Generally I love authors with a point of view. That said, Faulkner's style basically goes against everything that I value in prose. His sentences are long and winding and hard to parse. The story jumps back and forth in time, sometimes in order to fill in backstory, but sometimes it just feels like he was jumping ahead to touch on one character before the others and then later he fills in the gap. This does work some of the time (for example, knowing that Brown flees the cabin before you read the scene where he's in the cabin colors all of the lies he tells to Lena) but other times it's just confusing (like when we find out Christmas is shot to death before we read the passage about his "escape", even though we already knew he died). There are also more one-off characters than I care to remember (like how the final chapter is told as a first person recounting of a new character introduced for no real reason). Again, all of this mirrors the sort of long, winding oral history vibe that Faulkner was presenting, but just because that's the case doesn't make it any easier to read.<br/><br/>Anyway, it was these bipolar stretches of greatness connected with almost tediously windy prose that turned this book into more of a chore than I usually tolerate. By the time I was on the last 100 pages I was just reading to finish the book more than any enjoyment or interest in the story and, even if I can intellectually see where Faulkner was going and recognize that there are probably themes and symbols I'm failing to examine, in my mind that gut check is pretty damning.</p>
On East of Eden2019-02-18T00:00:00+00:002019-02-18T00:00:00+00:00Unknownhttps://blog.codezen.org/posts/on-east-of-eden/<p>I really enjoyed this book, even if it's a bit reminiscent of the familial epics I've been growing a bit tired of.<br/><br/>A 3.5 might be a bit more honest, because even though Steinbeck's writing is a pleasure, I think this story was bit indulgent. A lot of words were spent on very early history that was only mildly relevant, tangents out of Steinbeck's life (the novel is semi-autobiographical), and even though he is quite affectionate in his description of Salinas it's occasionally a bit much.<br/><br/>That said, for a novel that's pretty clearly a re-telling of the beginning of Genesis (I mean, look at the title) it had a lot of really great scenes, action, drama, and even a few chapters that were just plain funny. Even though it hits some of the bullet points from the Bible it wasn't predictable and the overall message - which was beautifully underscored by the ending - was quite different than the usual take away from the story of Cain and Abel.<br/><br/>Lots of really good side characters as well. Samuel Hamilton and Lee particularly being a couple of guys I'd like to sit down and have a drink of ng-ka-py with.</p>
On The Old Man and the Sea2019-01-21T00:00:00+00:002019-01-21T00:00:00+00:00Unknownhttps://blog.codezen.org/posts/on-the-old-man-and-the-sea/<p>This book was amazing and definitely the antidote to some of today's twisty, obfuscated stories.<br/><br/>Coming off of recent Pulitzer fiction that seems to pride itself in being spoken word deep in vernacular and circumlocution this story was so refreshing.<br/><br/>I read it in one sitting, it's only 120 pages, but every single sentence held meaning and advanced the beautifully simple story. In true Hemingway fashion the old man is great at what he does and focused with purpose that's a joy to read about, but the book was captivating as a Zen like meditation on dealing with life as it comes. I felt the whole spectrum of emotions as I read it, and never once did a passage feel weak or unnecessary.<br/><br/>Truly a great work of fiction.</p>
On Men at Arms 2019-01-15T00:00:00+00:002019-01-15T00:00:00+00:00Unknownhttps://blog.codezen.org/posts/on-men-at-arms/<p>Once again Pratchett delights. It's funny, I always start Discworld books and in some sort of reflexive memory from the first few books that were much more straight parody, I think "Oh, I know exactly where this is going" and without fail I'm wrong.<br/><br/>This book is no different. Of course, Ankh-Morpork and the Watch are returning characters, and the setup for the story is very much like Guards! Guards! (someone wants to install a king, new watchmen) but at its core this book is a solid mystery plot that twists on you more than a few times.<br/><br/>Pratchett's charm, to me, is that reading him makes me feel like everyone has a place in this universe. Everyone has something to bring to the table. The Patrician believes all men are evil, and rules the city accordingly, but effectively. Carrot believes all men are good, and inspires those around him to be good. The dwarves and trolls of Ankh-Morpork are opposing, but only because each is unwilling to listen to the other. Vimes, Nobby, Colon, Angua, Cuddy are all flawed, in their own ways, but all manage to be assets to the Watch and thus the city. Even Gaspode the dog, a flea bitten stray has found his niche in life.<br/><br/>I also thought it was especially brilliant that Pratchett relates Trolls to computer processors because it sneakily fits with lore (trolls being rocks coming from high, cold mountains and evolved best there) but also means inherently Trolls aren't actually dumb... they're just different and running slow at "normal" temperatures for Men and Dwarves. Counting in powers of 2 was a nice touch, and yet another subtle nod Pratchett makes to real world advanced technology.<br/><br/>I also found it interesting the comparison Pratchett draws between traditional Discworld weapons (your typical fantasy fare) which draw on the person's own strength to work, versus the Gonne (the pivotal artifact of the book) which harnesses outside energy in the form of gunpowder (errr Powder #1) and requires you to trigger. You own a sword and put it to use, but the Gonne owns you, and uses you. The Gonne speaks to the user, but it is not actually magical... it speaks to you because of the ease with which it kills. The tempting voice is not some evil spirit, it's your own nature when given an easy way to eliminate your enemies.<br/><br/>I think that's a fascinating distinction to make and it made me think hard about how the shift from sword and arrow to gunpowder also coincided with the shift in how we humans view warfare, and how our leaders use warfare so quickly in the modern day.<br/><br/>Anyway, all of this is wrapped up in the usual comic wit Pratchett brings to his work. I appreciated touching base with a lot of the old favorite characters, and I was thoroughly pleased with the ending. I'm looking forward to the next in the Watch series of Discworld, or another glimpse at Ankh-Morpork with the new Watch.</p>
On The Diamond Age: Or, a Young Lady's Illustrated Primer2018-12-13T00:00:00+00:002018-12-13T00:00:00+00:00Unknownhttps://blog.codezen.org/posts/on-the-diamond-age-or-a-young-lady-s-illustrated-primer/<p>Stephenson is one of my favorite sci-fi authors. I loved <i>Snow Crash</i>, <i>Anathem</i>, and <i>Cryptonomicon</i>. I had less of a taste for the Baroque Cycle books (although I've been meaning to give them a re-read), but <i>The Diamond Age</i> is easily my favorite of his novels so far.<br/><br/>If <i>Snow Crash</i> was Stephenson's breakthrough into hardcore science fiction, <i>The Diamond Age</i> is really a beautiful midpoint between it and <i>Cryptonomicon</i>. Where <i>Snow Crash</i> was imaginative and fun to read if relatively simple, and <i>Cryptonomicon</i> was brilliant despite being the beginning of his sometimes tediously verbose and tangent-prone stage, <i>The Diamond Age</i> is just the right balance of complexity, sweeping scope, mind-bending technology and interesting characters.<br/><br/>It's actually sort of shocking to me that this book was published in 1995. Stephenson's ideas about technology still feel fresh 23 years later. From the "matter compilers" being echoed (poorly) in modern 3D printers, to intensely distributed systems and heavy crypto that pre-date things like BitTorrent and Bitcoin, to even farther future ideas like the implications of designer nanotech that can carpet the world searching, or building, or killing, or defending. Stephenson also bravely looks at the next permutations of human organization and society. I was especially fascinated by the Drummers and their hivemind orgy of computation, as well as the Reformed Distributed Republic that is creedless and amorphous but anchored to each other through randomized trust exercises. These are the ideas I read science fiction for and in true Stephenson fashion they are well grounded in reality. For example, one of the final stages of the main character, Nell's, education is based in Turing machines that form the foundation of modern computers, as well as the future nanotech. The crypto and routing ideas woven into the other tech all ring true. The result is when Stephenson makes a more fantastic reach (e.g. cities floating on air, or disposable chopsticks made of animated screens) the reader is more than happy to accept that it's not just possible, but an inevitable consequence of the technology.<br/><br/>I don't want to give a rote plot summary, but in the midst of this technology Stephenson still weaves a story that is engaging and compelling. To be honest though, despite the fact that it ends well, Stephenson's characters are never the main event to me, and almost always tend to feel like expository devices. This isn't a criticism, I view it more as the product of the scope of his work. The characters still grow and change over the 20 year timeline, but at the end of the story I was much more interested in the repercussions in the world rather than the specific outcomes. I felt for Nell, I rooted for her, but her story is mostly that of the Chosen One, despite being grounded in technology and chance rather than prophecy. The other characters were sympathetic and fine, well realized, but mostly served their purpose and then collected at the end to be eyes on the Battle of Shanghai. I'm mostly referring to Carl Hollywood and Miranda (and Bud, Judge Fang et. al. in different ways) but even Hackworth, who is as close to a second main character as we get, instigates the initial plot by creating and counterfeiting the Primer, and then checks out for half the timeline (while with the Drummers) only to return with selective amnesia as a vector to explain and effect the Celestial Kingdom's endgame.<br/><br/>Regardless, <i>The Diamond Age</i> is a masterpiece of science fiction and was really hard to put down once I got far enough into the story to get hooked.</p>
On Down and Out in the Magic Kingdom2018-12-02T00:00:00+00:002018-12-02T00:00:00+00:00Unknownhttps://blog.codezen.org/posts/on-down-and-out-in-the-magic-kingdom/<p>I'm vaguely a fan of Doctorow in the real world. I've read BoingBoing on and off, I relate to the perspective he brings to his work, of a sort of radical technologist concerned with information freedom. I identify with and align with that point of view.<br/><br/>That said, this novel was meh. I ended up giving it a 2 because it just reads too plainly and the conflict was utterly neutered by the utopian setting. The society Doctorow portrays is like <i>Star Trek</i> (post-scarcity) meets <i>Altered Carbon</i> (post-death) but it's really hard to have consequences when you live in a world in which the worst possible thing to happen to you is your social score goes down.<br/><br/>There are two components to the overall story. The main one is Julius, Lil, and Dan effectively defending their slice of Disney World from Debra - who represents a social threat of modernizing and thus discarding whatever special magic Julius et. al. ascribe to the place. The second component is discovering who arranged to kill Julius but that ends up being an utterly pointless dead end of a storyline that I expected to have a more interesting conclusion. Julius guesses correctly (in the abstract) who killed him, and then it's revealed his friend Dan was part of the plot... in order to gain enough Whuffie (social currency) to suicide with a high score. This mystery is officially solved in like one sentence (Dan's confession) and then nothing comes of it.<br/><br/>It's a common theme that all of the characters, who read like Doctorow stand ins, are perfectly rational up to the instant that they need to do something dumb to advance the plot. Dan's actions are stupid... there may be few predictable consequences of Julius' death but he's still going to fuck over his best friend for Whuffie when he's already in line for a bunch of it? Does not compute. Then Julius' actions to fight Debra never make sense. His behavior can be hand waved by his malfunctioning implants (which he also irrationally doesn't fix), but that doesn't somehow excuse his actions. He crawls into a tube to destroy Debra's work with some sort of EMP gun, and fails, then later when the heat is really on, he just flat breaks in and takes a hammer to everything. And for what? He states that he only believes it will buy him one or two days (and it ends up being a week) so he burned all of his social credit for a few days of breathing room? Lil and Dan start an affair out of nowhere, and are revealed when Julius comes online for a few moments and they're basically sexting each other in his presence assuming he can't see their locally public messages. What?<br/><br/>Even the motivations of the main antagonist, Debra, make no sense to me. Everyone's gaming to get their Whuffie score higher but at what point is enough enough? Domination seems to be her motivation, Julius believes she wants to control the entire park. But she also theoretically came from Disney World Beijing where she did great. So she's going to risk her Whuffie (and eventually lose it) by engineering Julius' death... and for what? The prestige of running a slice of theme park? Even if you buy that for her take over of the Hall of Presidents, what is her motivation for annexing the Haunted Mansion? How much better can she live with more Whuffie? As Julius mentions when he's become an outcast (for his irrational actions) even the baseline life in Bitchun Society is more luxurious than 99.9999% of all humans that ever lived. It's hard for me to believe that Debra is just that bent on Disney World when she could be literally anywhere else in the world building her own theme park from scratch if she wanted.<br/><br/>Fundamentally, I like this concept of the post-scarcity world and this social ranking meritocracy ("ad-hocracy") to determine who gets control of what (down to who can use the elevator or rent a hotel room) but the entire conflict is undermined by the fact that the very worst possible thing that could ever happen, the thing Julius is trying so hard to avoid, is that he gets kicked out of running a theme park ride and is forced to find something else to do in this wonderful utopia. The horror.<br/><br/>Some of the tangents (like Zora, or the U of T experience at the beginning of Bitchun Society) are more interesting than the main plot, but ultimately also unfulfilling. The themes were better explored in books like <i>Altered Carbon</i> (which came out a year before) or in the Culture books which deal with the post-scarcity and relatively post-death plot by having a galactic scale.<br/><br/>I would have loved to read more about what it means to be broke and undesirable in the Bitchun world, hitting notes similar to Black Mirror's <i>Nosedive</i> episode 15 years earlier. Or even explore the cultures that resist Bitchun society referenced early on (sort of like the Culture's Contact section on a small scale). Unfortunately, as it is the story is less <i>Down and Out</i> and more <i>In the Magic Kingdom</i>.<br/><br/>Speaking of... I've never been to Disney World so I spent a lot of this novel feeling like the setting was completely undescribed. Doctorow name drops a ton of attractions that I've never seen. I have no idea what the Haunted Mansion at Disney World looks like now, much less a hundred years into a post-scarcity future. I kept feeling like there was implicit information that I was expected to have but didn't - I was basically hanging in space. Even outside of the park, Doctorow seems pathologically averse to actually telling the reader about the surroundings instead relying on tropes. Unfortunately, that also makes it feel like early 21st century rather than whatever far future timeframe the story is set in.<br/><br/>Anyway, I was pretty disappointed in this book. I was expecting something a little more clever and absurd on a far future Disney backdrop, something akin to Neal Stephenson in <i>Snow Crash</i> that Doctorow directly references. Instead I got a really amateurish storyline set in a world that eliminates all consequences and never fleshes out what could be a really interesting setting.</p>
On Small Gods 2018-11-05T00:00:00+00:002018-11-05T00:00:00+00:00Unknownhttps://blog.codezen.org/posts/on-small-gods/<p>Reading the previous 12 Discworld novels, you see Sir Terry Pratchett's style mature and his concepts become more complex. Some of those 12 are great (like Reaper Man), some... merely okay.<br/><br/>Small Gods is the first Discworld novel that feels truly original and well crafted from page one. It's still Discworld, which means there are still correlations to the real world, but for the first time it feels like the story is told entirely in Discworld terms, rather than bringing in images from the real world to lend to the comedy or absurdity of the story.<br/><br/>This book was just flat great. I loved the characters, I loved the philosophy, the rationality of the story. It's really an examination of how belief is formed, is important, and how it's shaped for better or worse. How words can be twisted from intention and removed from context. This book really made me feel like the Discworld was an actual place far removed from the sort of one-to-one Europe-but-not-really tropes that dominated the previous works to a greater or lesser extent.<br/><br/>Other Discworld novels I would recommend to current fans. This book I'd recommend to anyone.</p>
On Witches Abroad 2018-11-05T00:00:00+00:002018-11-05T00:00:00+00:00Unknownhttps://blog.codezen.org/posts/on-witches-abroad/<p>I ended up enjoying this Discworld novel, but I can see why people generally don't rank the Witches series very highly (and I say that as someone who's read Equal Rites / Wyrd Sisters as well).<br/><br/>The first half of this book I was in danger of putting it down (like I did with Moving Pictures) because it seemed like a bunch of disconnected chances for the three witches to comment on real-world cultures from a sort of backward Lancre (rural UK) point of view. There's comedy there, but it's not so compelling.<br/><br/>I'm glad I stuck it out for the second half, however, because once the witches finish traveling and start to pursue the main plot it becomes a lot more interesting and coherent. Exploring the nature of stories and their unrealistic expectations, and even adding some interesting depth to the magic of Discworld. The end, in particular, really did a great job of tying the whole story together.<br/><br/>Definitely worth a read for Discworld fans, despite a bit of a slow start.<br/><br/></p>
On A Prayer for Owen Meany2018-06-04T00:00:00+00:002018-06-04T00:00:00+00:00Unknownhttps://blog.codezen.org/posts/on-a-prayer-for-owen-meany/<p>I'm an ex-Catholic atheist that picked up this book based on some recommendations on baseball forums (of all places).<br/><br/>This book was far better than I expected. It only loosely counts as baseball literature (compared to fic. lit. like The Art of Fielding, which I also enjoyed), but it really stands out as an expansive tale about growing up with the inimitable Owen Meany and his effect on basically everyone in the fictional town of Gravesend, NH.<br/><br/>The story gets off to a bit of a slow start, but it only feels that way because the book needs to lay a broad foundation for the story that Irving unfolds masterfully. With hindsight, each bit of lore that seems tangential early on is important later and that's a sign of great writing. Once you've become familiar with the core of characters, the story flits easily from one time period to another, one character arc to another, without ever being boring or confusing. Irving has a talent for brief yet powerful description and dialogue that makes even the most everyday scene carry weight.<br/><br/>In threads about this book there seems to be a lot of hand-wringing about the religious aspect. I will admit some of the recounted hymns and prayers can be a bit tedious for a non-believer, but at the same time the religious characters in the book are real and flawed and despite the equation of faith with courage, the book is actually critical of the blindly dogmatic aspect of religion. The supernatural/divine element of the book is light and restricted to Owen Meany himself, so there's no sappy come-to-Jesus tearful conversion crap.<br/><br/>There is also a very political component of the book. As the story moves into the Vietnam Era, the characters generally take a strong anti-war stance for a variety of reasons. Time passing is usually underlined by describing the situation in Vietnam, and characters compare the euphemistic doublespeak of the government with what they know is actually happening on the ground. The first person narrator, John Wheelwright, also flashes forward to 1987 ("modern day") and offers criticism of Reagan and Iran-Contra as evidence of American misdeeds. This might have felt stale just a few years after the book was published, but in the world of George W. Bush and Donald Trump a lot of the criticisms aimed at the insanity of the American public are still well targeted.<br/><br/>Where this book really shines though is weaving all of the various stories of Owen, John and a large cast of Gravesenders into one great story while defying your predictions, but also without leaving any loose ends. Maybe I read too much sequel-obsessed science fiction but it's rare that I've felt so satisfied by the end of a story and that's why I had to give it 5 stars instead of a more typical 4.</p>
On Excession 2018-06-04T00:00:00+00:002018-06-04T00:00:00+00:00Unknownhttps://blog.codezen.org/posts/on-excession/<p>I'm a fan of Banks' Culture universe but this book was hard to finish for me.<br/><br/>Culture books, in general, work best when the insane level of technology is a backdrop for a more selective, human story. Excession attempts to follow this formula, but relies too heavily on the detached technological angle and bungles the human one. The main plot line is driven by machines making decisions and communicating with each other, while the human characters are just caught up in their plans. This doesn't sound too different from previous Culture books, but in Consider Phlebas, The Player of Games (or even Use of Weapons which was meh for other reasons) Banks did a better job of creating interesting characters and a plot within the vast and complex universe without the human element feeling vestigial.<br/><br/>This book is only saved by Banks' usual gift for scale, description, and dry humor that occasionally reminds you why the Culture universe is so compelling. It's unfortunate that these are exactly the attributes that are lost when reading pages and pages of what amount to ship logs.</p>
Router Refresh: Netgear R7800 as a torrenting NAS and PXE server with LEDE2018-02-17T06:59:36+00:002018-02-17T06:59:36+00:00Unknownhttps://blog.codezen.org/posts/router-refresh-netgear-r7800-as-a-torrenting-nas-and-pxe-server-with-lede/<p>More than a few years ago, I invested in a Netgear WNDR 3800. I intentionally bought it because it was supported by <a href="http://openwrt.org">OpenWRT</a>, a Linux based firmware, similar to <a href="http://dd-wrt.com">DD-WRT</a> and capable of running a lot of extra services at the center of your network.</p>
<p>Time marches on however, and despite the fact that the WNDR 3800 was the Rolls-Royce of routers five or six years ago, it started to show its age. It's 680 Mhz MIPS processor wasn't beefy enough that I could run a VPN endpoint on the router with any amount of bandwidth, for example, but the main reason for an upgrade was its lack of support for 802.11ac, which was standardized after the 3800 was on the market, much less 802.11ac "wave 2" which is the current best option.</p>
<p>In the meantime, I also became an AMD employee and suddenly had an embarrassing array of Intel processors sitting on my home network. While I can't reasonably go out and replace every machine in the name of some sort of ideological purity (although I did promptly build a Ryzen 7 1700X rig for myself), eliminating some of these Intel devices has a certain appeal to me. Case in point, the little Celeron machine serving as a NAS. At one point this box ran a desktop on the TV via HDMI, controlled by <a href="https://symless.com/synergy">Synergy</a>, SSH, Kodi, or PS3 controllers over a Bluetooth dongle. Since then we've started using Steam Links which covers the HDMI/controller case much, <strong>much</strong> better so the Celeron basically existed just to run the RAID, Samba, Transmission, and Sonarr. None of which requires a particularly beefy machine, or HDMI any longer.</p>
<p>So, to upgrade my home network and potentially eliminate a redundant machine, I decided it was time to throw down on a new router setup and, to keep this from being an unmaintainable mess as soon as I've moved on, I figured I'd document how I set everything up.</p>
<p>[toc]</p>
<h2 id="the-hardware">The Hardware</h2>
<p>I initially looked at some <a href="http://ubnt.com">Ubiquiti</a> hardware. The Power-over-Ethernet single cable approach was appealing, as were the sleek interfaces, but it's clear those devices are designed for scale out that I didn't need, and wouldn't be much help for replacing a NAS either.</p>
<p>So I settled on the Netgear R7800 "Nighthawk X4S" which looks a bit like a stealth bomber.</p>
<p><img src="/AFCN_1_201801171740149907-300x225.jpg" alt="" /></p>
<p>I'll admit I was showing a bit of favoritism to Netgear after my 3800 was such a workhorse, but so far it's been a good choice. Instead of a rickety 680 Mhz MIPS, this bad boy came with a two thread 1.7Ghz ARMv7 processor and 512M of RAM. Dual USB 3.0 ports (or eSATA if you prefer). 802.11ac wave 2 support. Pretty standard wired networking (4xLAN 1xWAN).</p>
<p>I paid about $220 for it at my local Fry's (similar prices on Amazon/Newegg) and while it's not objectively the best router on the market, I didn't feel the extra features of some of the more expensive models warranted the extra cost. Most of them have similar processors and RAM sizes, similar ranges etc. Most importantly, however, the R7800 has pre-built OpenWRT images.</p>
<p>I also purchased a HornetTek four bay SATA enclosure that supports USB 3.0.</p>
<p><img src="/4137TniZfL-291x300.jpg" alt="" /></p>
<p>I hadn't ever heard of HornetTek but SATA enclosures are simple devices and so far it's worked admirably. It doesn't do any sort of hardware RAID or anything, it just enumerates the four drives separately. I chose it specifically because it had four bays instead of two which would allow me to run my 2x2TB RAID devices along with a single 120G SSD.</p>
<h2 id="lede">LEDE</h2>
<p>I won't cover the basics about router setup, running ethernet cables, plugging in the enclosure etc. It's all rather common knowledge and if you can't figure out that part based on the diagrams that came with your router, then you need a much more basic page than this one, trust me.</p>
<p>Once your router is online running the factory firmware, the first thing you want to do is install <a href="http://lede-project.org">LEDE</a>, which is now the parent project of OpenWRT. The switch is simple, just make sure you grab the right model and choose a <code>-factory.img</code> from their <a href="https://downloads.openwrt.org/">download page</a> which you can then install using the factory firmware's firmware upgrade mechanism.</p>
<hr />
<h3 id="caveat-1-snapshot-images">Caveat 1: Snapshot Images</h3>
<p>Here's the first little bump in the setup. Later, we'll want to use a standard Linux tool, <code>mdadm</code> to setup our RAID. Unfortunately, the existing release of LEDE (17.01.4 from October 2017) doesn't include kernel support for "direct IO" that is required for software RAID. The wise developers of LEDE have corrected this minor issue in the meantime, so while we wait for the next official release, the snapshot releases work ... for the most part. The issue is that snapshots don't include the web interface, LUCI, but to access the router via SSH you need to have a password configured... which you can only do through the web interface on a fresh install. As a result, until the next official release you may need to install a release image, set a password, then install a sysupgrade image for a snapshot. Then you can SSH into the router and install luci with <code>opkg update; opkg install luci</code>.</p>
<hr />
<p>Once you've installed LEDE, you can tweak all of the standard router knobs. WiFi SSID, encryption, static DHCP leases etc.</p>
<h2 id="raid">RAID</h2>
<p>With the drive bay plugged in and powered on, we need the USB storage kernel modules to enumerate the devices, <code>mdadm</code> as well as kernel support for RAID.</p>
<pre style="background-color:#2b303b;color:#c0c5ce;"><code><span>
</span><span>$ opkg update
</span><span>...
</span><span>$ opkg install kmod-usb-storage mdadm kmod-md-raid0 kmod-md-raid1
</span><span>
</span></code></pre>
<p>With my setup, I have two 2TB drives. Each drive has two partitions. A small rare-use backup partition that is RAID1 (mirrored) across the drives, and a larger RAID0 (striping) partition I use for torrents. The idea being that if a drive fails the (replaceable) torrents are toast, and I can recover the backup off of the remaining disk. This isn't ideal from the point of view that I'm putting wear on both backup disks that may fail around the same time, but this backup is in turn backed up on other machines.</p>
<p>Anyway, with the proper modules installed, this is my drive setup:</p>
<table><thead><tr><th></th><th></th><th></th></tr></thead><tbody>
<tr><td>Device</td><td>Partition 1</td><td>Partition 2</td></tr>
<tr><td>sda</td><td>swap</td><td>extra</td></tr>
<tr><td>sdb</td><td>backup</td><td>torrents</td></tr>
<tr><td>sdc</td><td>backup</td><td>torrents</td></tr>
</tbody></table>
<h3 id="creating-a-raid">Creating a RAID</h3>
<p>There are a ton of resources to teach you how to create a RAID with <code>mdadm</code>. I used the information in the ever-useful Arch wiki on <a href="https://wiki.archlinux.org/index.php/RAID#Installation">RAID installation</a>. The short version, however, is that you install a number of disks, partition them identically (or as nearly as possible), and then use <code>mdadm</code> to create the array. I created my array previously, so I haven't done this in a LEDE environment, but if I just had the disks partitioned I would have created my arrays with these commands:</p>
<pre style="background-color:#2b303b;color:#c0c5ce;"><code><span>
</span><span>$ mdadm --create --verbose --level=1 --metadata=1.2 --raid-devices=2 /dev/md0 /dev/sdb1 /dev/sdc1
</span><span>$ mdadm --create --verbose --level=0 --metadata=1.2 --raid-devices=2 /dev/md1 /dev/sdb2 /dev/sdc2
</span><span>
</span></code></pre>
<p>After the initial creation the raid devices (i.e. <code>/dev/md0</code>) are just like standard block devices, so you'd throw a filesystem on them (<code>mkfs.ext4 /dev/md0</code>) and mount them as usual.</p>
<h3 id="configuring-mdadm">Configuring <code>mdadm</code></h3>
<p>There is no LUCI integration for <code>mdadm</code>, so I hand configured this in <code>/etc/config/mdadm</code></p>
<pre style="background-color:#2b303b;color:#c0c5ce;"><code><span>
</span><span>config mdadm
</span><span> option email root
</span><span>
</span><span>config array
</span><span> option device /dev/md0
</span><span> option name archiso:0
</span><span> list devices /dev/sdb1
</span><span> list devices /dev/sdc1
</span><span>
</span><span>config array
</span><span> option device /dev/md1
</span><span> option name archiso:1
</span><span> list devices /dev/sdb2
</span><span> list devices /dev/sdc2
</span><span>
</span></code></pre>
<p>I don't think the name is important, but I transferred the same name from when my RAID was created (unsurprisingly during an Arch install, thus the name). I also would have preferred to use UUIDs from my old <code>mdadm.conf</code> but that brings me to another issue. I'm not even certain the above configuration is correct because..</p>
<hr />
<h3 id="caveat-2-mdadm-segfaults">Caveat 2: <code>mdadm</code> segfaults</h3>
<p>This may be an issue with the <code>mdadm</code> packaged in the snapshot tree, but anytime I ran any command <code>mdadm</code> that parsed a config, it segfaulted. The <code>mdadm.conf</code> that the LEDE <code>mdadm</code> package creates based on the above LEDE config appears to be correct, but the init script just assumes everything worked out when invoking it. I haven't spent any time trying to figure out who is "responsible" for this, whether it's <code>mdadm</code> being broken, any LEDE patches, or if this segfault is just a weird symptom of the kernel missing some sort of support (which is how the lack of direct IO support revealed itself).</p>
<p>To avoid parsing a config file, I thought about editing <code>/etc/rc.local</code>, but that code is only invoked after the other init scripts are run, and I want the RAID running before other init scripts like Samba or Transmission start running. So, as a really shitty hack, I edited my installed copy of <code>/etc/init.d/mdadm</code> and replaced a line that does the final invocation with two lines that manually start the RAID devices without parsing a config.</p>
<pre style="background-color:#2b303b;color:#c0c5ce;"><code><span>
</span><span> # $PROG --assemble --scan --config="$CONF"
</span><span> $PROG --assemble /dev/md0 /dev/sdb1 /dev/sdc1
</span><span> $PROG --assemble /dev/md1 /dev/sdb2 /dev/sdc2
</span><span>
</span></code></pre>
<p>Once I'm running an actual release version of LEDE instead of snapshots, I'll take a closer look at this.</p>
<hr />
<h3 id="automounting">Automounting</h3>
<p>Once <code>mdadm</code> has been properly configured (or horribly hacked, depending) we can setup mount points. Fortunately, LUCI has native support for this if you install the <code>block-mount</code> package with <code>opkg install block-mount</code>. Once that's been installed, you should see a "Mount Points" option underneath the "System" tab in LUCI, which will take you to a screen where you can add mounted filesystems. Here's an example shot of my setup:</p>
<p><img src="/Screenshot-2018-2-12-LEDE-Mount-Points-LuCI.png" alt="" /></p>
<p>As you can see, I've got two RAID mounts at <code>/mnt/backup</code> and <code>/mnt/torrents</code>, along with a small SSD that's providing the 4G of swap space (to be safe) and an extra partition that we'll use later to host TFTP/NBD files as well as running Sonarr.</p>
<p>At this stage, you should be able to reboot the router and have the RAID come up and get mounted automatically.</p>
<h2 id="transmission">Transmission</h2>
<p>My next step was to get the router to deal with torrents. Fortunately, this is a very common usecase for LEDE and it's well supported. I use the web interface and the RPC API (to communicate with <a href="http://transdroid.org">Transdroid</a>, an Android torrent app).</p>
<pre style="background-color:#2b303b;color:#c0c5ce;"><code><span>
</span><span>$ opkg update
</span><span>$ opkg install transmission-daemon-openssl transmission-web luci-app-transmission
</span><span>
</span></code></pre>
<p>For the most part, the default selections for Transmission are good. It's configured to allow connection from LAN addresses without a password. With the LUCI app installed, there's a new option "Transmission" under the "Services" tab that will let you set the download directory to your USB storage (i.e. <code>/mnt/torrents</code> in my case). The settings do seem a little conservative however. I upped the cache to 16M from 2M to give Transmission a bit more memory to fill before hitting the disk, for example, just because I still have quite a bit of headroom in my 512M of RAM.</p>
<p>Once you've pointed Transmission to your torrent drive, it should be good to go.</p>
<p>One thing to take note of with Transmission is that by default its configuration directory is under <code>/tmp</code> and this is lost on reboot. This includes any settings you set from outside LUCI through the Transmission interface itself, as well as all of the accumulated torrents you've uploaded. In general this isn't an issue, but if your router goes down be prepared to re-upload torrents to complete them or meet any tracker seeding requirements. If this is a problem, you can shift the Transmission config directory to a real disk instead of <code>/tmp</code>.</p>
<p>Make sure that your torrents directory is writable by transmission as well:</p>
<pre style="background-color:#2b303b;color:#c0c5ce;"><code><span>
</span><span>$ chown transmission:transmission -R /mnt/torrents
</span><span>$ chmod ug+rw -R /mnt/torrents
</span><span>
</span></code></pre>
<p>At this point, you should be able to upload a torrent via the web interface at <code>192.168.1.1:9091</code>.</p>
<h2 id="samba">Samba</h2>
<p>Now that you have a disk to fill up, you need to be able to share all those files. Fortunately, LEDE has great support for Samba which most operating systems and media players support to some extent. Simply install Samba and the corresponding LUCI app.</p>
<pre style="background-color:#2b303b;color:#c0c5ce;"><code><span>
</span><span>$ opkg update
</span><span>$ opkg install samba36-server luci-app-samba
</span><span>
</span></code></pre>
<p>Now, under LUCI's "Services" tab, there's a "Network Share" option where you can configure individual shares. Here's a shot of my setup:</p>
<p><img src="/Screenshot-2018-2-12-LEDE-Network-Shares-LuCI.png" alt="" /></p>
<p>Pretty straightforward, enabling guest access to each share.</p>
<hr />
<h3 id="caveat-3-permissions">Caveat 3: Permissions</h3>
<p>One issue I ran into was ensuring that Samba guests and Transmission both have full access to the drive. By default, Samba maps the guest user to the group-less 'nobody' user that won't have permissions to write the torrents directory by default. I chose to edit the template, either through the "Services" -> "Network Shares" -> "Edit Template" box, or by directly editing /etc/samba/smb.conf.template to set</p>
<pre style="background-color:#2b303b;color:#c0c5ce;"><code><span>
</span><span> guest account = transmission
</span><span>
</span></code></pre>
<p>Fortunately, this template is preserved during sysupgrade. Initially, I just made the torrents directory owned by <code>nobody:transmission</code> as a sort of compromise, but the files created by Transmission are owned by the <code>transmission</code> user by default so it caused me to lose write access through Samba guests after I did the initial manual <code>chown</code>.</p>
<hr />
<p>At this stage, you should be able to access your torrents through your standard SMB capable programs. Kodi. Nautilus/Nemo. Windows Explorer etc.</p>
<h2 id="sonarr">Sonarr</h2>
<p>Here's where we deviate from the well worn path of LEDE. <a href="https://sonarr.tv">Sonarr</a> is a great web app for tracking TV shows, watching schedules and automatically downloading torrents from your configured trackers (or Usenet). Unfortunately, it also depends on Mono and some other dependencies that are <em>way</em> out of scope for LEDE packages. I'm not a fan of Mono, but Sonarr is a massive leap up from other solutions like Sickrage in my experience.</p>
<p>So, since we're moving well out of the router wheelhouse, and I don't want to do something crazy time consuming like packaging Sonarr and all of its dependencies myself, we're going to rely on our old friends at <a href="http://debian.org">Debian</a> to do the heavy lifting for us with their <code>armhf</code> port.</p>
<h3 id="setting-up-a-debian-chroot">Setting up a Debian chroot</h3>
<p>Fortunately, the LEDE developers make this really easy. The first step is to install debootstrap, which already has a package.</p>
<pre style="background-color:#2b303b;color:#c0c5ce;"><code><span>
</span><span>$ opkg update
</span><span>$ opkg install debootstrap
</span><span>
</span></code></pre>
<p>Then, we install our pocket Debian. I chose the Debian rolling release, 'sid' because I'm very comfortable with Debian if it breaks, but you may want to stick to 'jessie' or 'stretch' for their latest official release, or the upcoming one. Frankly, I don't imagine I'll be updating this chroot very often so release isn't that important, but I can vouch for 'sid' including all of the Mono dependencies I needed.</p>
<p>I have my 116G ext4 partition mounted at <code>/mnt/aux</code>, separate from my RAID/Transmission/Samba setup. Debian chroots are pretty lightweight when you only install one thing, even pulling the entire Mono ecosystem my current chroot is under 2G. Obviously far too big for router flash but hardly a real issue for average sized USB storage. There's also nothing keep us from hosting this chroot on RAID devices either, I just happened to have a spare disk since I was scrapping a machine.</p>
<pre style="background-color:#2b303b;color:#c0c5ce;"><code><span>
</span><span>$ cd /mnt/aux
</span><span>$ debootstrap --arch=armhf sid debian
</span><span>
</span></code></pre>
<p>Note that <code>armhf</code> is the proper architecture for the IPQ806x in the R7800 and I imagine for all of the other recent embedded ARM variants until <code>arm64</code> filters down to routers, but it's possible that your router has a different architecture, so choose wisely.</p>
<p>This will take a bit.</p>
<p>As an aside, the strategy of chroots is very useful as a sort of primitive proto-container like this and with a little more legwork we could theoretically run all of our other daemons out of this Debian environment as well. For the most part, there really isn't a reason to - the packages provided with LEDE are sufficient and minimal - but if you needed a newer or heavier version of something (say Samba 4 instead of Samba 3.6, or a full blown mail server) it saves you a lot of effort to just graft in a working system than if you homebrewed your own packages.</p>
<p>Once <code>debootstrap</code> completes, I recommend mounting some filesystems into it</p>
<pre style="background-color:#2b303b;color:#c0c5ce;"><code><span>
</span><span>$ mount /dev /mnt/aux/debian/dev -o bind
</span><span>$ mount /dev/pts /mnt/aux/debian/dev/pts -o bind
</span><span>$ mount /proc /mnt/aux/debian/proc -o bind
</span><span>
</span><span>$ mkdir /mnt/aux/debian/mnt/torrents
</span><span>$ mount /mnt/torrents /mnt/aux/debian/mnt/torrents
</span><span>
</span></code></pre>
<p>The first three mounts just make sure that <code>/proc</code>, <code>/dev</code>, and <code>/dev/pts</code> are present so that programs in the Debian chroot won't get confused if they rely on any of these virtual entries, or try to create pseudo-terminals. Without these mounted, you can end up with many different types of misbehavior. Mono, for example, won't even <em>try</em> to run if <code>/proc</code> isn't mounted. Debian's <code>apt-get</code> will complain about missing <code>/dev/pts</code> as well, and some package installation scripts may fail depending on how finicky they are about such things.</p>
<p>In theory, we should bind mount <code>/sys</code> as well, but in my experience that's unnecessary.</p>
<p>The last mount is to make sure that the torrent drive is accessible to Sonarr, which will import and rename items for you if it can. If you just want Sonarr to dispatch torrents and not manage the downloaded files this is probably unnecessary.</p>
<p>Now you should be able to enter the Debian environment like this:</p>
<pre style="background-color:#2b303b;color:#c0c5ce;"><code><span>
</span><span>$ chroot /mnt/aux/debian /bin/bash
</span><span>
</span></code></pre>
<p>You need to specify <code>/bin/bash</code> because the LEDE busybox shell is actually <code>ash</code>. Once you're in the chroot, make sure apt-get is operational.</p>
<pre style="background-color:#2b303b;color:#c0c5ce;"><code><span>
</span><span>chroot$ apt-get update
</span><span>chroot$ apt-get upgrade
</span><span>
</span></code></pre>
<p>You shouldn't have an upgrades since you just installed it, but it should gracefully tell you so.</p>
<h3 id="installing-sonarr">Installing Sonarr</h3>
<p>Now the easy part. Thanks to the Sonarr devs, their site includes <a href="https://github.com/Sonarr/Sonarr/wiki/Installation#linux">instructions to install on Debian</a> which you can follow verbatim.</p>
<p>Start by adding the Sonarr public key to your chroot's keyring and their repository to your apt sources.</p>
<pre style="background-color:#2b303b;color:#c0c5ce;"><code><span>
</span><span>chroot$ apt-key adv --keyserver keyserver.ubuntu.com --recv-keys FDA5DFFC
</span><span>chroot$ echo "deb http://apt.sonarr.tv/ master main" > /etc/apt/sources.list.d/sonarr.list
</span><span>
</span></code></pre>
<p>Then you're read to actually install Sonarr, which is still called <code>nzbdrone</code> after the initial Usenet implementation.</p>
<pre style="background-color:#2b303b;color:#c0c5ce;"><code><span>
</span><span>chroot$ apt-get update
</span><span>chroot$ apt-get install nzbdrone
</span><span>
</span></code></pre>
<h3 id="running-sonarr">Running Sonarr</h3>
<p>From outside the chroot (use 'exit' if you're still in it) you can always chroot into Debian for just one command instead of invoking a shell.</p>
<p>To integrate the chrooted Sonarr with LEDE, just paste the following text into <code>/etc/init.d/sonarr</code></p>
<pre style="background-color:#2b303b;color:#c0c5ce;"><code><span>
</span><span>#!/bin/sh /etc/rc.common
</span><span>
</span><span>START=99
</span><span>USE\_PROCD=1
</span><span>
</span><span>start\_service() {
</span><span> mount /proc /mnt/aux/debian/proc -o bind
</span><span> mount /dev /mnt/aux/debian/dev -o bind
</span><span> mount /dev/pts /mnt/aux/debian/dev/pts -o bind
</span><span> mount /mnt/torrents /mnt/aux/debian/mnt/torrents -o bind
</span><span>
</span><span> procd\_open\_instance
</span><span> procd\_set\_param command chroot /mnt/aux/debian env HOME=/root /usr/bin/mono /opt/NzbDrone/NzbDrone.exe
</span><span> procd\_close\_instance
</span><span>}
</span><span>
</span><span>stop\_service() {
</span><span> procd\_kill "sonarr" "$1"
</span><span> umount /mnt/aux/debian/proc
</span><span> umount /mnt/aux/debian/dev/pts
</span><span> umount /mnt/aux/debian/dev
</span><span> umount /mnt/aux/debian/mnt/torrents
</span><span>}
</span><span>
</span></code></pre>
<p>Then Sonarr should show up as a service in LUCI's "System" -> "Startup" screen at the very bottom along with Transmission and any other lower priority init daemons.</p>
<p>A few notes on the init script. We need to invoke <code>mono</code> with <code>env</code> so we can set <code>$HOME</code> properly and Sonarr will properly choose <code>/root/.config</code> instead of the completely inappropriate <code>/.config</code>. This may not be strictly necessary, but it means that if you chroot into the Debian environment and run <code>mono</code> by hand, you get the same result as starting it with this init script. Also note that the <code>stop\_service()</code> manually kills Sonarr so it won't be occupying our mounts. This ensures we can properly unmount but it's also probably not good practice. I did attempt to add the virtual filesystem mounts to the official LEDE storage mount point system (what we used above for the RAID devices), but it didn't like the bind as written, so I just added it here where I have full control over the command invoked. </p>
<p>To keep this service intact after a sysupgrade, we can add it to <code>/etc/sysupgrade.conf</code></p>
<pre style="background-color:#2b303b;color:#c0c5ce;"><code><span>
</span><span>## This file contains files and directories that should
</span><span>## be preserved during an upgrade.
</span><span>
</span><span>/etc/init.d/sonarr
</span><span>
</span></code></pre>
<h3 id="configuring-sonarr">Configuring Sonarr</h3>
<p>With Sonarr running, you can access its web interface from 192.168.1.1:8989 and because it's in the Debian chroot, all of its internal settings will be persistent.</p>
<p>Other resources have covered setting up Sonarr (like the <a href="https://github.com/Sonarr/Sonarr/wiki">Sonarr Wiki</a>), but the short version is that you want to setup at least one <strong>Indexer</strong> (source of torrents found under System -> Indexers). These will encompass most of the major private TV trackers and you'll likely need to paste an API key into their configuration. Sonarr provides a convenient "Test" button that will do a basic sanity check without actually downloading anything.</p>
<p>After you have an indexer setup, add a <strong>Download Client</strong> (under System -> Download Clients) for your local Transmission server:</p>
<p><img src="/Screenshot-2018-2-12-Settings-Sonarr.png" alt="" /></p>
<p>Once you've done that, you're all set to start adding shows you're interested in. The search is under "Series -> Add Series" and will allow you to add each series with options for the desired profile. I suggest starting with a 720p profile by default and updating to 1080p for any series you think are worth it. Personally, spending 50G downloading 1080 Blu-ray rips of an office sitcom seems like a waste. Especially when...</p>
<hr />
<h3 id="caveat-4-sonarr-double-disk-space">Caveat 4: Sonarr double disk space</h3>
<p>One flaw with Sonarr is that it's hard to balance the desire to organize and rename files with the need to seed consistently. In theory, Sonarr supports hard-linking files instead of copying them (which would allow the filename to be different without having an extra copy of the data) but I have not seen this actually work. I just make sure I go through and cleanup my torrent list every once in awhile.</p>
<p>There are two options I want to point out though. The first is that you don't necessarily have to use Sonarr to organize at all by disabling "Completed Download Handling" in the download client settings, this keeps Sonarr from copying files and it will operate only as a torrent dispatcher. The second option is that you can enable "Ignore Deleted Episodes" in the "Media Management" settings. This will allow you to hand delete series you're done watching without Sonarr freaking out and re-downloading them.</p>
<hr />
<p>In my setup, I chose to allow Sonarr to import/rename everything, but to ignore deleted episodes. I go in and clear my torrents on a regular basis and if I need to free up further space, I go and delete shows I'm not actively watching.</p>
<p>Sonarr is pretty intelligent about downloading as well. When you add a series, it will ask you what part of the series you want to "monitor" and this monitoring determines whether Sonarr will automatically download that series. New episodes are automatically monitored, but for the purposes of trying out shows monitoring the first season is plenty, or if you've caught most of the latest episodes but are a bit behind, just grab the last season, or just future episodes. After adding, this monitor status is indicated with the little banner icon on the individual show pages.</p>
<p><img src="/Screenshot-2018-2-13-The-Wire-Sonarr.png" alt="" /></p>
<p>In this screen, the season is monitored (indicated by the big black banner icon), but each of the individual episodes aren't (small white banner icons) so Sonarr will attempt to download the whole season. If the season was unmonitored, but an episode was, Sonarr would attempt to download the episode alone first, and then fallback on the season if there was no other option.</p>
<p>Anywhere you see a magnifying glass icon, you can manually initiate a search for a specific torrent, and if you click the little head and shoulders icon, it will even let you manually select a release. Both of these can be extremely useful if you're in a hurry, or to debug why Sonarr picked a specific release over another.</p>
<p>Sonarr can be a tad idiosyncratic however. One little annoyance I have with it is that whenever you add a series, the options you choose (quality profile, season folder settings, etc.) become the defaults for the <em>next</em> series you add. So if you add a daily news show once, the next time you add a series, it will default to a daily show. It's not the end of the world, of course, but you just need to be careful, especially when doing the initial setup adding multiple shows.</p>
<h2 id="pxe">PXE</h2>
<p>Moving away from the entertainment sphere, I wanted to be able to PXE boot a Linux install image. For those unfamiliar, PXE (Pre-eXecution-Environment) is a nice, BIOS enabled method to DHCP a wired network interface, fetch a specific file and boot it. This can be quite useful for accessing live distros without a DVD or a USB.</p>
<p>In my case, my work laptop is disappointingly locked down. The BIOS options to boot to USB are disabled, and Windows' laughable disk encryption Bitlocker apparently doesn't play nice with UEFI booting so it's forced into legacy mode. To install Linux, I had to resize the encrypted partition (which required talking to IT for some bullshit passcode to unlock afterward), then PXE boot Arch. Because of being forced into legacy BIOS mode, installing a Windows update is like playing Russian roulette with my bootloader. Point being that I need a PXE server every time Windows randomly borks my disk, and since PXE is intrinsically linked to DHCP the router is the prime location to set it up.</p>
<p>Most of this setup was cribbed from the OpenWRT page for <a href="https://wiki.openwrt.org/doc/howto/tftp.pxe-server#tab__prepare_files_for_pxe-booting">PXE booting</a>, combined with some Arch specific settings on the Arch wiki page for <a href="https://wiki.archlinux.org/index.php/PXE">PXE</a>.</p>
<h3 id="syslinux">syslinux</h3>
<p>Before we configure our PXE server, let's setup a directory to serve. I decided to use more of the auxiliary SSD mounted at <code>/mnt/aux</code> to serve <a href="http://www.syslinux.org/">Syslinux</a>'s PXELINUX, a PXE bootloader capable of loading Linux kernels through the DHCP connection negotiated by the PXE. I downloaded Syslinux 6.03 and untarred it, then copied the binary implementations directly out of the release and into <code>/mnt/aux/tftp</code>, the root of my soon-to-be TFTP server.</p>
<pre style="background-color:#2b303b;color:#c0c5ce;"><code><span>
</span><span>$ cd /mnt/aux
</span><span>$ mkdir tftp
</span><span>$ wget https://www.kernel.org/pub/linux/utils/boot/syslinux/syslinux-6.03.tar.gz
</span><span>$ tar -xzf syslinux-6.03.tar.gz
</span><span>$ cd syslinux-6.03/bios
</span><span>$ cp core/pxelinux.0 com32/elflink/ldlinux/ldlinux.c32 com32/menu/vesamenu.c32 com32/lib/libcom32.c32 com32/libutil/libutil.c32 /mnt/aux/tftp
</span><span>
</span></code></pre>
<p>The important files here were identified in the OpenWRT wiki, but it includes the basic binary (<code>pxelinux.0</code>) as well as enough support to display a nice menu and boot Linux.</p>
<h3 id="dhcp-tftp">DHCP/TFTP</h3>
<p>Unsurprisingly, one place the LEDE project didn't spare any expense (in terms of configuration options, at least) was in its DNS/DHCP server, <a href="http://www.thekelleys.org.uk/dnsmasq/doc.html">dnsmasq</a>. dnsmasq includes a basic TFTP server implementation that we can enable directly in the LUCI interface under "Network" > "DHCP and DNS". There's a tab for TFTP settings you switch to and a few settings.</p>
<p><img src="/Screenshot-2018-2-16-LEDE-DHCP-and-DNS-LuCI.png" alt="" /></p>
<p>Once you enable the TFTP server, you should be able to PXE boot a wired device (usually by rebooting and mashing F12 or some other BIOS hotkey) and it will get far enough to show you a GRUB like bootloader screen, without any options because you still need to configure PXELINUX.</p>
<h3 id="using-an-arch-iso">Using an Arch ISO</h3>
<p>Now that we have PXELINUX booting without a configuration, we need to give it something useful to do. I like to use Arch install media as a basic recovery tool or fresh installation environment. It has most of the relevant disk and crypto tools, and network support I need to nip in and fix a broken bootloader, or transfer things off of backup disks.</p>
<p>I torrent my copies of Arch install media, so the router naturally has access to the ISO in <code>/mnt/torrents</code>. My first stab at this, I thought I'd be clever and take advantage of this fact by serving the files out of a loopback mounted ISO, thus using no extra space. This turned out to be impractical because the LEDE mount point system doesn't appear to support loopback mounts any better than the bind mounts I tried for the chroot. So, instead of adding yet another temporary hack to <code>/etc/rc.local</code> or somewhere else, I decided to just unpack the ISO elsewhere and copy its contents into <code>/mnt/aux/archiso</code>.</p>
<p>Inside, there are a handful of notable files. The kernel and initrd we'll need PXELINUX to serve up for us is in <code>archiso/arch/boot/x86\_64/</code>, files <code>vmlinuz</code> and <code>archiso.img</code>. There's also the ISO's built in Syslinux configuration in <code>archiso/arch/boot/syslinux</code>, where we can see just what arguments Arch expects. Specifically, there are three options in <code>archiso\_pxe.cfg</code> that enumerate our network boot options. We can choose an HTTP boot, an NFS boot, or an NBD boot.</p>
<p>HTTP boot would be fine and in fact the LUCI interface depends on <code>uhttpd</code> so it would be convenient just to symlink the ISO directory to <code>/www/archiso</code> and call it a day, but this method didn't work on my system. Arch fetches files from the server with <code>curl</code> which will choke if there's an issue with SSL like having a self-signed certificate like the default <code>uhttpd</code> server advertises with the <code>luci-ssl</code> package installed. I don't care to mess with certificates that are basically unavoidably vague (you are visiting 192.168.1.1 after all) so I moved on.</p>
<p>NFS is a good, mature candidate but it's also extreme overkill in my opinion. We're only going to have one user at a time, read-only, we don't need most of the robust features offered by NFS.</p>
<p>Which leads us to NBD, which is less featureful, dead simple to configure, and provides better performance for our usecase anyway.</p>
<p>One advantage that NFS would offer would be the ability to just serve the unpacked <code>archiso</code> directory, compared to NBD which requires access to the <code>.iso</code>, but since I generally have a copy in <code>/mnt/torrents</code> anyway, that isn't much of an upside compared to the extra complexity and dependencies of NFS. I didn't perform any metrics on resource usage either, but it's hard for me to imagine that NFS would end up being lighter on resources than NBD especially when NBD is taking up about 500k of RAM and NFS has so many more bells and whistles. Anyway, I chose to go with NBD.</p>
<h3 id="nbd">NBD</h3>
<p>The NBD server is trivial to install and configure. Just grab the <code>nbd-server</code> package, and add your configuration to <code>/etc/config/nbd-server</code>.</p>
<pre style="background-color:#2b303b;color:#c0c5ce;"><code><span>
</span><span>$ opkg update
</span><span>$ opkg install nbd-server
</span><span>
</span></code></pre>
<p>Here's an example of my <code>/etc/config/nbd-server</code></p>
<pre style="background-color:#2b303b;color:#c0c5ce;"><code><span>
</span><span>config nbd-server
</span><span> option enabled 1
</span><span>
</span><span>config share archiso
</span><span> option filename '/mnt/torrents/archlinux-2018.02.01-x86\_64.iso'
</span><span> option readonly 1
</span><span>
</span></code></pre>
<p>Just make sure the service gets started, and you're good to go. Unfortunately, this configuration does mean that we'll have to update this file if we update our Arch ISO, instead of just overwriting <code>/mnt/aux/archiso</code> with the new files.</p>
<h3 id="final-pxelinux-configuration">Final PXELINUX Configuration</h3>
<p>Now that we have everything we need unpacked and the NBD server is ready, we can put everything together into our PXELINUX configuration. First, we'll symlink the kernel and initrd someplace where the TFTP server will serve them up. I decided to just drop the symlinks in the TFTP root directory.</p>
<pre style="background-color:#2b303b;color:#c0c5ce;"><code><span>
</span><span>$ cd /mnt/aux/tftp
</span><span>$ ln -s /mnt/aux/archiso/arch/boot/x86\_64/* ./
</span><span>$ ln -s /mnt/aux/archiso/arch/boot/intel\_ucode.img ./
</span><span>
</span></code></pre>
<p>In the same directory, create a <code>pxelinux.cfg</code> directory, and in that directory create a <code>default</code> file. In there, we can paste our configuration.</p>
<pre style="background-color:#2b303b;color:#c0c5ce;"><code><span>
</span><span>DEFAULT vesamenu.c32
</span><span>PROMPT 0
</span><span>MENU TITLE OpenWRT PXE-Boot Menu
</span><span>
</span><span>label Arch
</span><span> MENU LABEL Arch 2018-02
</span><span> KERNEL vmlinuz
</span><span> INITRD intel\_ucode.img,archiso.img
</span><span> APPEND archisobasedir=arch archiso\_nbd\_srv=192.168.1.1 iommu=off nomodeset ip=::
</span><span> TEXT HELP
</span><span> Arch install media, 2018-02
</span><span> ENDTEXT
</span><span>
</span></code></pre>
<p>This is mostly boilerplate, taken from the previously mentioned <code>archiso/arch/boot/syslinux/archiso\_pxe.cfg</code>, except the paths are all flat (files are in the TFTP root) and the NBD server has been subbed in. Note that the <code>iommu=off</code> and <code>nomodeset</code> options are custom because my laptop has a buggy IOMMU and its framebuffer gets scrambled if it tries to do early modesetting in the Arch ISO environment. You probably won't need these options, but if you do end up requiring custom options you don't want to hand insert from the Syslinux prompt, this is the place for them.</p>
<p>Once you have this file in place, you should be able to boot to an Arch ISO prompt over any typical computer wired into your LAN without messing with USB keys.</p>
<h2 id="final-thoughts">Final Thoughts</h2>
<p>This is a work in progress. I'm a little disappointed that I had to hack <code>mdadm</code>'s init script, but other than that most of this configuration should be bulletproof in terms of reboot and sysupgrade. I would have liked to use HTTP for the Arch ISO as well, if the SSL configuration wasn't in the way. I could uninstall <code>luci-ssl</code> I suppose, but that seems a bit like a lateral move when NBD is working just fine.</p>
<p>I've been running with this router configuration for a couple of weeks now and it seems to be rock solid. It may need further tweaks because it seems reluctant to use swap, but at the same time the memory usage generally hovers under the 50% mark. Can't tell if that's because 512M is more than enough RAM, or the packages are just so conservatively configured that it needs to be told to use the rest. Regardless, the Netgear R7800 has proven to be a worthy successor to my older WNDR 3800.</p>
On The Brief Wondrous Life of Oscar Wao2018-02-02T00:00:00+00:002018-02-02T00:00:00+00:00Unknownhttps://blog.codezen.org/posts/on-the-brief-wondrous-life-of-oscar-wao/<p>Unsurprising for a Pulitzer winner, this story was extremely well told, and I ended up reading the last 200 pages in one sitting.<br/><br/>It was an interesting journey and punctuated with juicy and sometimes frightening tidbits from the Dominican Republic in its dictator days. Similar to other spoken word style family biographies, but still unique and compelling.<br/><br/>My one criticism is that I think some poor editing choices were made. Footnotes were sometimes historical and sometimes in universe and those occasionally took me out of the story. Chapters open from an unknown point of view that takes a few sentences longer to resolve than I'd like. Some idiomatic Dominican Spanish wasn't translated and wasn't made clear with a search engine. It felt clumsy in those notes, even giving definitions of terms we were expected to lookup or infer pages before.<br/><br/>Anyway, I could hear Diaz's voice telling the story clearly from page one and it was told with such expertise and practice that I can forgive any minor foibles and just say it was definitely worth a read.</p>
On The Sympathizer2018-02-02T00:00:00+00:002018-02-02T00:00:00+00:00Unknownhttps://blog.codezen.org/posts/on-the-sympathizer/<p>Unsurprisingly for a Pulitzer winner, this book is phenomenal.<br/><br/>I thoroughly enjoyed the story. It's equal parts thriller, satire, and meditation grappling with the complexity of discovering one's identity. Both in terms of the title character's split allegiances and the struggle of his fellow refugees, but also in terms of Vietnam and America reshaping (or failing to reshape) their conceptions of self once the Vietnam War ended.<br/><br/>I'll admit I was skeptical about the writing style at first. The book is written almost as if spoken, sort of weaving and tangenting naturally. Nguyen also eschews some basic English style (like giving proper names, or having quotation marks and spacing to denote someone speaking) which can be a pretentious warning flag. Once you're immersed in the story, however, it's hard to imagine it written any other way and the natural flow and thriller pacing makes this book extremely hard to put down.</p>
On Lord Foul's Bane 2018-01-18T00:00:00+00:002018-01-18T00:00:00+00:00Unknownhttps://blog.codezen.org/posts/on-lord-foul-s-bane/<p>I hated this book and, for the record, I didn't finish it.<br/><br/>I get that Covenant is not likable on purpose. The whole idea that attracted me to this book is that Covenant doesn't "opt in" when the call to adventure is thrust upon him and for about 50 pages it was nice to have a protagonist that was such a miserable prick.<br/><br/>But then <spoiler>Covenant rapes Lena</spoiler>. At that point I took a long hard look at the book, read another 100 pages or so to see what consequences fell out, and then decided to cut my losses.<br/><br/>I can appreciate that Donaldson was trying to push the boundaries of fantasy by defying a ton of hero tropes, but - at least for me - he didn't have the skill to actually make a good story out of it. Covenant is inexplicably transported to The Land, a name which reflects the utterly boilerplate nature of this fantasy world, and is helped by a bunch of people that read like cardboard cutouts to defeat Lord Foul, another name which might as well be Lord Badguy Placeholder.<br/><br/>The prose is just as devoid of interest as the setting and characters. Donaldson's style is dusty and most of the time not very evocative. When the characters of the Land speak it's in this stilted fantasy accent that made my brain flatline. If Covenant wasn't such an ass this book would have just been unimaginative and boring instead of torturously frustrating.<br/><br/>I gave this book 200 pages to pique my interest and after that long there was just nothing that could provoke me to turn another page except picking up a totally different book.</p>
On Altered Carbon 2017-12-27T00:00:00+00:002017-12-27T00:00:00+00:00Unknownhttps://blog.codezen.org/posts/on-altered-carbon/<p>There are the bones of a good story here. Morgan's key technology (the ability to transfer your consciousness into another body - a "sleeve") is really cool and he did a good job showing us a society that's different but also very similar to our own. The book is written in a classically hard-boiled style, and like a lot of that Chandler/Hammett source material tends to be simultaneously terse and abstract, and when the book is working, it's great.<br/><br/>Unfortunately, there's more than a few places in this book that threw me off when reading them. Confusing or half-working metaphors, characters from 200 pages back that are re-introduced without sufficient callbacks (like, say, having a name). In my opinion this books is about 100 pages too long and would have been well served by another run through an editor. I also want to note that there's a couple of graphic sex scenes and while I appreciate the fact that Morgan included a bit of eroticism, the sexiest part of hard boiled stories / film noir is the sizzling energy between the main character and his femme fatale. In this respect, as well as a lot of the others, the book falls victim to telling and not showing and it sort of comes off cheap.<br/><br/><spoiler>Lastly, I held off on judgment of this book until I completed it, in case the end really tied it together. Instead the ending was way too predictable with virtually everyone getting exactly what was coming to them.</spoiler></p>
On A Wizard of Earthsea 2017-12-03T00:00:00+00:002017-12-03T00:00:00+00:00Unknownhttps://blog.codezen.org/posts/on-a-wizard-of-earthsea/<p>I picked this up based on a recommendation of Le Guin despite the fact that I haven't been in much of a fantasy mood lately, and I was a bit put off by it being filed in the Teen section, expecting to find underdeveloped <a href="http://tvtropes.org/pmwiki/pmwiki.php/Main/MarySue">Mary Sue</a> characters that apparently plague teen media these days.<br/><br/>I'm really glad I gave it a chance, because it's so much better than that.<br/><br/>This book moves <i>fast</i>. The main story is only about 200 pages, but it covers about 15-20 years and the titular wizard, Ged, has many adventures. It's much more akin to reading Earthsea mythology than fantasy epics like LOTR or ASOIAF. Ged is like a wizard version of Hercules progressing through a series of trials.<br/><br/>In addition, I really appreciated that this is a more personal tale than most fantasy. Ged is the only main character, and the book never deviates from his story. It's intimated early on that Ged will be a Big Important Wizard some day, but for this book Ged's problems are his own. There is no political level, there are no wars being fought. There isn't an <i>us</i> versus <i>them</i> dynamic that ends the book with an obligatory climactic battle. No, Ged fights some specific evil, but most of his conflict is with himself (albeit made physical in a way that only fantasy can achieve).<br/><br/>The book is written in a very classic, medieval fantasy voice that could be a bit of a stumbling block for a novice reader, but overall Le Guin does a great job of making it feel like this story is ancient and profound without being too dense or overwrought. She also does really well on giving the sense that the world of Earthsea is deep and alive, without necessarily getting on the Tolkien level of mythos.<br/><br/>My version includes a 2012 afterword that is an interesting note on Le Guin's thought process writing the book and puts it's initial 1968 publishing into context, so check it out if it's in your copy as well.<br/><br/>Anyway, I think I'll pass this one on to my daughter and see what she thinks.</p>
On Black Wings Has My Angel2017-11-27T00:00:00+00:002017-11-27T00:00:00+00:00Unknownhttps://blog.codezen.org/posts/on-black-wings-has-my-angel/<p>Great pure noir. Sexy and nihilistic.</p>
On Mistborn2017-11-01T03:22:22+00:002017-11-01T03:22:22+00:00Unknownhttps://blog.codezen.org/posts/on-mistborn/<p><strong>As with all of my book entries, this is intensely spoilerific.</strong></p>
<p>I had intended to follow up my <a href="https://blog.codezen.org/2017/01/26/on-leaving-ibm/">super serious last post</a> with more ruminating about corporate programming and my new digs at AMD, but writing about that requires a lot of effort now that I'm almost a year into the grind and it's not feeling novel as much as it's feeling like... well, work. There's a reason I barely mentioned IBM on this blog the entire time I worked there.</p>
<p>Anyway, life has gotten pretty hectic and long story short, I've made a conscious effort to drop the bottle and pickup the book again and as such I've spent a lot of time stone sober absolutely flying through books.</p>
<p>Despite the fact that I've been reading a lot of "literary" fiction like Bukowski's <em>Ham on Rye</em> and the most excellent <em>Middlesex</em> by Jeffrey Eugenides, unpacking those books is a scholarly pursuit that sounds distinctly... un-relaxing to undertake so, I'd like to spend a bit of time writing about the <em>Mistborn</em> trilogy by Brandon Sanderson.</p>
<p>I picked up the first book in a buying frenzy along with a slew of other books that I wanted to read, but after completing <em>Mistborn</em>, I had to move on directly to <em>The Well of Ascension</em>, and that of course led me straight into <em>The Hero of Ages</em>. I read the entire (first) trilogy, somewhere north of 2000 pages, in a few weeks because it's just plain compelling. This was mid-September, I'm just now getting around to actually finishing this post =/.</p>
<p>Let me say, unequivocally, that I enjoyed the hell out of these books and I'd recommend them to any fantasy fan. Each story is logically self-contained and yet functions in the broader arc. Each character is well thought out, with clear motivations (at least, clear after you know the whole story). I felt truly invested in Vin, Elend, Sazed, Kelsier, and really the rest of Kelsier's thieving crew from the first book all through the entirety of the story. Every one of these characters grew and evolved over the roughly five or six year span of the novels, and each one in a completely realistic way. There wasn't a single point through the entire story that I felt like plot points weren't well underpinned by previous information, or <em>deus ex machina</em> was used, which is especially impressive given that the story literally has gods in it.</p>
<h4 id="magic">Magic</h4>
<p>I also really enjoyed the magic system, which is actually how I got the initial <em>Mistborn</em> recommendation from reddit. It's really refreshing to read a fantasy series with "high magic" where magic users are so common that society has evolved around it, instead of "low magic" where magic is so rare that it's basically extinct. This is really difficult to pull off since magic is, by definition, world breaking. The changes in society based around magic really added a huge amount of color and realism to the world. From the existence of hazekillers and the prevalence of "dueling canes" to fight Allomancers, to the caste system enforced by rounding up skaa (servant/slave class) with powers, and the Misting thieving crews created to fight back against it. Even the special creatures, mistwraiths/kandra, koloss, and Inquisitors all turn out to be natural extensions of the magic system rather than beasts that just somehow evolved nonsensically or were just created from scratch by the Lord Ruler without any regard for consistency.</p>
<p>Allomancy, Feruchemy, and Hemalurgy are all extremely well thought out and balanced in interesting ways. Allomancy requires fuel that's consumed, but provides amazing powers. Feruchemy uses metal to hold "charges", but they only work for each specific feruchemist and each feat of strength is only possible after an interval of weakness. Speed is purchased with lethargy, wakefulness with sleep, memorization with forgetfulness. It's really beautifully balanced. Hemalurgy provides great power and permanently, but it has the heavy cost of death and diminished returns and the fact that you basically need to be controlled by Ruin itself in order to place a hemalurgic spike in the right place to convey that power.</p>
<h4 id="progression">Progression</h4>
<p>One great thing about the <em>Mistborn</em> trilogy is that each books really has a distinct identity.</p>
<p>The first book is very much about rebelling against an oppressive and brutal dictator, the Lord Ruler, who is the immortal God controlling the entire world. This story takes place in a stagnant, but extremely stable, world of basically Victorian England complete with street urchin thieves and a feudal style nobility that are fanatically devoted to that God. Add in an underdog orphan, Vin, that discovers she's actually a powerful Allomancer and gets involved with a legendary thief, Kelsier, who trains her as part of his budding rebellion to overthrow the Lord Ruler, and you've got a great basis for a story. There's a lot of thieving, spying, and even some courtly balls and romance before the skaa are ignited in rebellion. In this book, a lot of trappings of the universe, the mist that floods the landscape at night, the persistent ashfall, mistwraiths, kandra, Inquisitors all seem like pretty window dressing, but in reality they form the foundation of the overall story. Anyone that reads the setup for this book knows how it ends, our plucky heroes succeed at overthrowing the Lord Ruler, but there's quite of lot of twists and turns on the way and the <em>consequences</em> of that success are unpredictable.</p>
<p>Which leads us directly to the second book, <em>The Well of Ascension</em>. This book is drastically different in no small part because the society of the Lord Ruler has fallen apart and the Empire is in chaos. Kelsier, the charming leader in <em>Mistborn</em> is dead and his crew is tasked with forming the cabinet of the new king, Elend, Vin's love interest, who was put in charge after the Lord Ruler's death. This book is the weakest of the three, like a lot of middle books in a trilogy, because it has to form a bridge between the origin book one and the actual resolution in book three. It spends a lot of time on Elend becoming a leader rather than a scholar, the thieving crew changing into advisors and generals instead of criminals, and Vin herself coming into her own as a noble, Mistborn assassin instead of Kelsier's sidekick. Most of the characters are in a transitional state that's as awkward for the readers as it is for the characters, but at the same time Sanderson really does a good job showing how each character adapts to fit their new roles.</p>
<p>The second book's overall story is driven by politics instead of rebellion. Elend holds Luthadel, the former capital of the Final Empire, with the title of King, but that throne is contested by multiple usurpers in a four way Mexican siege-off. Meanwhile, the mists that were harmless window dressing in the first book, begin to kill people and last longer and longer into the day such that Vin believes that the mists are the Deepness, the mythical enemy that the Lord Rule defeated at the Well of Ascension, so Vin spends a lot of time realizing that she is the new Hero of Ages and that she has to follow the Lord Ruler's example, go to the Well of Ascension but instead of wielding the power there, like the Lord Ruler did, she has to selflessly give it up to save the world. After a ton of political manuevering, Elend getting deposed as King by the parliamentary Assembly he himself designed, and the Battle of Luthadel resolved by Vin discovering she could control the massive koloss army waiting outside the walls, Vin finds the Well of Ascension, takes the power and releases selflessly... only to realize she's made a terrible, terrible mistake and has released Ruin, who is basically an evil God that had been manipulating them all the entire time. It was a great subversion that plays so well because we've been trained to expect the hero's noble sacrifice will set things right, but instead the heroes were all acting as agents of Ruin the whole time.</p>
<p><em>The Hero Ages</em> then opens on a world that is imminently ending. The mists are still getting worse, and now the ashfalls are threatening to choke the world. Only a tiny portion of the Empire is capable of actually growing crops. Elend, who is now a powerful Mistborn thanks to the events of the Well of Ascension, and Vin have worked together to solidify his position as the new Emperor, taking cities to protect them from the new, harsh world nearing the apocalypse.</p>
<p>The third book does a great job tying everything together. The book reframes the entire series conflict in terms of Ruin and its opposite, but equal god, Preservation. This is the book that introduces Hemalurgy properly (after only getting glimpses previously) as the magic art of Ruin, Allomancy as that of Preservation, and Feruchemy as the art of humanity who were created by Preservation and Ruin together. Interestingly, <em>The Hero of Ages</em> also completely reframes the Lord Ruler. The Lord Ruler, initially viewed as a brutal dictator, and then as a selfish impostor Rashek that should have given the power of the Well of Ascension up, was proved to be a good guy. The Deepness, which was the product of Ruin influencing the mists, had to be stopped, so the Lord Ruler took the power of the Well (instead of releasing Ruin) and attempted to burn the mists off by moving the planet closer to the sun, but screwed up. So to deal with that, he creates the ashmounts to spew ash into the sky and insulate the world by reflecting the heat back into space. Of course humans can't breathe ash and plants can't grow in it or under a red sun, so he modified them and created microbes to eat ash, and then he was distracted by Ruin to create mistwraiths, kandra, and Inquisitors through hemalurgy. After that, the power of the Well, a sliver of Preservation, faded from him. So really, his heart was in the right place but he only had power for a few minutes, constantly waning, so he had to use his experience to subtly deal with the mistakes he himself made trying to solve the initial problem of the Deepness.</p>
<p>The third book ends with our heroes succesfully averting the end of the world by defeating Ruin in a climactic battle.</p>
<p>The point of this recap, however, is to show that each book is different (revolution, politics, and apocalypse) and yet builds on all of the previous work in inventive ways such that details like the reasons for the Lord Ruler's brutal behavior, the reason that ash falls from the sky, or how magic works all fit together nicely without spending any time rehashing the same plots.</p>
<h4 id="a-bit-of-criticism">A Bit of Criticism</h4>
<p>It should be obvious at this stage that I really enjoyed these books, and particularly how well the world was constructed and the story told within its confines with the reader's understanding pleasurably shifting from one page to the next.</p>
<p>That said, if I had to issue a single critique of all three books, it would be that Sanderson spent a lot of time constructing his world and constructing his plot and constructing his characters so that they all interlock perfectly, like a jigsaw puzzle, but the books can come off stilted as a result.</p>
<p>I mentioned before that each twist and turn of the story was well supported by previous text. This generally means that character motivations are clear and well thought out, and without this level of thought there would be a lot of "where did that come from, WTF" moments that are the hallmark of shitty fiction... but it seems like Sanderson is almost <em>too</em> afraid of that criticism that everything needs to be not only consistent but well telegraphed and logical.</p>
<p>For example, in both <em>Well of Ascension</em> and <em>Hero of Ages</em>, the leaders that oppose our main characters. Straff Venture, Cett, Lekal, and later Yomen are hyper rational. This may seem silly to assert considering Straff trusts his clearly insane Mistborn son, Zane, even though he suspects (wrongly) that he's constantly trying to poison him, and Elend's old friend Jastes Lekal basically screws himself by bringing an army of koloss he can't control, but it's clear that both of them weighed their options carefully and made logical decisions even if their gambits ended up being mistakes. For example, Straff uses Zane because Mistborns are just <em>that</em> powerful. Indeed, if Zane didn't have his own agenda, he would have been the only tool to win the siege for Straff.</p>
<p>The worst offenders in this regard are Cett and Yomen, however. Cett joins forces with Elend despite Vin murdering basically his entire entourage in front of him. Is this a rational decision? Yes, from the point of view that Cett has his back to the wall and this is his best bet for coming out of the siege alive. However, I think this would be a perfect time for someone to behave <em>irrationally</em> having just witnessed hundreds of his best soldiers slaughtered before his very eyes and coming very close to being assassinated himself and yet Cett doesn't even beg for his life or get angry. I don't think he should have suicided or something ridiculous just for the point of spectacle, but maybe he would plot revenge on Elend, or Vin, or maybe he would backstab them at a crucial point, or maybe he's just a bit more of a dick to everyone in light of his humiliation. Anything but just accepting his fate as a willing tool of his foe for the next book, even if all that changes is a bit of angry dialogue.</p>
<p>Yomen, the religious zealot that took over Cett's capitol, Fadrex City, while Cett marched on Luthadel is also frustratingly rational. In <em>Hero of Ages</em>, he's in disbelief that his God (the Lord Ruler deposed in the first book) is actually dead and is keeping the faith by trying to maintain The Final Empire's culture in Fadrex. That's all well and good, but when he finally comes to grips with the fact that his God is dead he... abandons that religion and culture and joins forces with Elend like Cett before him. Once again, this is a rational decision (especially since it's the literal End of the World) but again we have someone who has just had his core beliefs shattered acting with the same cool and logical approach as everyone else. Now, in Yomen's defense it's easy to have a logical belief in God when he's a real person, but his belief was already relying on hand waving after the Lord Ruler's death so when his religion is proved false it seems more realistic that Yomen would react poorly.</p>
<p>It feels weird to me that I'm effectively complaining that the books were <em>too logical</em>, but in the end it does feel sterile and constructed when everyone behaves this rationally, even under extreme duress, or when their beliefs are utterly destroyed. </p>
<p>Along the same lines, in the Mistborn trilogy, Sanderson has a lot of trouble making the characters' voices seem distinct after Kelsier dies at the end of the first book. To some extent, the dialogue between Elend, Vin, Sazed, and a lot of the Crew are interchangeable. When they expound on topics, or devise plans, which happens <em>alot</em> throughout the books, you could strip away the attributions of most of the dialogue and you'd never be able to tell who's speaking except when they reference what they've been up to. Dialogue amounts to stating facts or assumptions, tying them together and then agreeing on a plan. The characters are too well aligned. Everyone is equally rational, everyone has roughly equal priorities. Even the occasional argument is taken in stride and everyone proceeds to do their duties without further incident. It's as if dialogue only exists to convey information, where a more stylistic or character driven author would use more evocative language or even illuminate the character's state of mind.</p>
<p>One of the best examples of this is when Yomen and Elend are speaking when Elend has infiltrated the first ball in Fadrex. These two are natural enemies and when Elend contrives to sit and talk they... debate the finer points of various books. Okay. Elend leaves the conversation with a greater respect for Yomen. Okay. I mean, there's nothing <em>wrong</em> with that, if you can suspend disbelief far enough to get Elend and Yomen to sit down at a table at a ball during a siege, but it seems like a missed opportunity to inject a bit of venom into the dialogue, even if it requires a character to be a bit irrational, or prideful, or spiteful.</p>
<p>And that's the crux of the issue. There are very few flawed characters in Mistborn. There are characters that believe wrong things, or make bad gambles, but there are no characters that are just... assholes, or cowards, or brutes, or just underhanded schemers - which is quite a feat considering the story begins with a crew of criminals. Every main character seems to have "with a heart of gold" tacked onto their descriptions. Vin, Elend, and Sazed are basically paragons, and considering Sazed literally becomes God that's not so bad, but the other characters chief failing amount to... what? Breeze has a drink sometimes? Even Kelsier, who's portrayed as something of rogue, legendary thief master, is good to a fault down to completing the mandatory Christ-like sacrifice to start the Church of the Survivor.</p>
<p>The most flawed character I can think of is obviously Zane, but his flaw comes in the form of a literal voice in his head, which is extremely ham handed. Zane still pursues his own agenda by wooing Vin to rule with him but Zane is mostly just a story dead end. He serves the purpose of keeping the action filled Mistborn chases in a book that's mostly political (<em>Well of Ascension</em>). Otherwise there's Camon, the leader of Vin's initial thieving crew that beat her, or maybe Marsh who gave up on the Rebellion (before saving it), or Yeden who leads the rebel forces to slaughter, but all of these characters were relatively minor (2/3 gone by the second half of the first book the other played a small part).</p>
<p>It's always good for characters to have solid motives, but without some flaws or contrasting priorities to differentiate the characters it starts to feel like all of the main characters are really just aspects of Sanderson, each applying the same logic and the same reasoning to achieve the same goal as any of the other characters would given the information at hand. Which is a shame because Sanderson does a great job developing each character's plot everywhere else, but even the bad guys feel like they are the same aspects of Sanderson with different goals. The two Big Bads of the trilogy, the Lord Ruler and Ruin, are shown to have cold logic behind their actions. The Lord Ruler brutally prepared his Empire to combat Ruin and survive, while Ruin was fulfilling his part of the bargain with Preservation.</p>
<p>This is why Mistborn fails to produce something that all truly iconic fantasy series need: a good villain. Sanderson is so wrapped up in logic and characters behaving rationally that there is no Lord Voldemort who wants to kill half the world for being impure. There is no King Joffrey that tortures prostitutes for a laugh. There is no Sauron bent on dominion. There's the Lord Ruler, who's not such a bad guy once you get to know him, and Ruin that wants to destroy the world because... that's what Ruin does. These books desperately needed some objective, human scale, pure evil baddie to be defeated in addition to the more ambiguous Lord Ruler and the abstract Ruin.</p>
<p>In the end, despite my criticism I did thoroughly enjoy reading all three books because the world is fantastic and the plot was interesting, even if the characters, no matter how much fondness I have for them, and their dialogue takes a backseat to it. The only thing keeping this trilogy from being truly classic is that it's so well crafted that it's impossible to escape the evidence of its creation. True classics, like the Lord of Rings trilogy, give the feeling that the world existed long before the story was told, and will exist long after it has ended. Unfortunately, that requires a story that's more organic and less constructed, more flawed and less rational than these books delivered. That said, I wouldn't turn down another jaunt through the world of Mistborn even if I can see behind the curtain.</p>
On Anathem2017-10-28T00:00:00+00:002017-10-28T00:00:00+00:00Unknownhttps://blog.codezen.org/posts/on-anathem/<p>At the half way point I was completely in love with the setting of this book, I couldn't put it down, and then towards the end it becomes truly mind blowing. The only reason that this isn't a 5/5 for me is that I feel like the ending was satisfying, but it left a lot of things implied without delving into the consequences enough after the fact.<br/><br/>Still a great work of fiction and absolutely recommended.<br/><br/><spoiler><br/>To elaborate, we spend all of this time building a great world and dealing with the reactions to a sudden alien visitation, and like 90% of the way through we find Rhetors and Incanters are real, which is incredible and yet believable in this completely non-magical world... then after the Convox is evacuated and everyone splits into cells, and the space mission, and Fraa Jad obviously altering the worldtrack into one of the rare ones in which Arbre and the Geometers make peace... but after all of this takes place, there's virtually no discussion of the consequences of these people existing.<br/><br/>Erasmas et. al. all know that their perception of what happened doesn't line up with what everyone else perceived, and perhaps we're supposed to assume that their brains slowly altered to come into agreement with everyone else but I don't think that was directly stated and since the book itself is implied to exist in world (Erasmas having "started this record" when he was being punished I believe) that might not even be internally consistent.<br/><br/>I just would have preferred for this information to be gone over a bit more in dialog with the other avout, because the existence of these hyper powerful avout is pretty world breaking.<br/><br/>Instead, the Everything Killer situation kind of became a dead end and we get this very sweet, movie-like (which Stephenson even lampshades in the final sentence) ending to the book.<br/></spoiler></p>
On Leaving IBM2017-01-26T19:34:54+00:002017-01-26T19:34:54+00:00Unknownhttps://blog.codezen.org/posts/on-leaving-ibm/<p>After working with IBM for over 8 years, this week marks my last with Big Blue. Next week, I'll start my new job with AMD.</p>
<p>Since I've been spending a lot of time over the last month or so reflecting on my time at IBM, I figured I could use this post to collect some thoughts on why I'm leaving.</p>
<p>[toc]</p>
<h2 id="why-i-m-leaving-ibm">Why I'm Leaving IBM</h2>
<p>My biggest reason for leaving IBM is that I've grown weary of being isolated from the people that are important to my work. I've worked tangentially with people across the US, Germany, Brazil, Ireland and India, but IBM's Linux and free software expertise is focused in Australia, namely <a href="http://ozlabs.org/about.html">OzLabs</a>.</p>
<p>Since its acquisition in 2001, OzLabs has been the center of PowerPC Linux. Now, with OpenPower (the leaner, meaner PowerPC), OzLabs controls the Linux port, most of the firmware, and the main bootloader for the platform. In other words, every project in IBM that I was interested in or worked on.</p>
<p>This, in and of itself, was no problem. OzLabs is transparent and fanatically open source. Even non-Linux development is done on public mailing lists with a bevy of git trees. It's easy to observe or even participate if you've got changes in mind.</p>
<p>My problem was that working with OzLabs was simultaneously unavoidable with my interests in IBM, and really really difficult thanks to my being 8000 miles away and outnumbered 10 to 1. Over the course of my IBM career I attempted to bridge that distance, but in the end I found that I need what OzLabs already enjoys and nowhere else in IBM could provide me - a critical mass of local developers to work with.</p>
<p>Let me provide a little context for how this happened, and how I reached that conclusion.</p>
<h3 id="early-history">Early History</h3>
<p>I spent the first half of my time in IBM (2008-2011) doing the best that I could supporting embedded PowerPC from here in Austin. I learned the architecture from the point of view of weird devices like <a href="https://en.wikipedia.org/wiki/Cell_(microprocessor)">Cell</a>, Prism (<a href="https://en.wikipedia.org/wiki/IBM_A2#PowerEN">WSP</a>), Chroma (a PCIE card variant of Prism) and <a href="https://en.wikipedia.org/wiki/Espresso_(microprocessor)">Espresso</a> but aside from a brief couple of weeks in 2010 doing Prism bring up with OzLabbers in Raleigh none of this gave me any opportunity to actually learn to be a kernel hacker.</p>
<p>That's a pretty loaded statement, so let me clarify. I had <em>plenty</em> of opportunities to read and write Linux kernel code. What I didn't have was any experience actually finding work before coding, or getting work included in Linux after coding. Both of these tasks are critically important, but in those early days work was dropped into my lap and, when I thought I was done, it was handed off to someone else to upstream, or it wasn't upstreamed at all. For example, the small amount of Prism work I did ended up in Linux years later without my involvement and was subsequently stripped out of Linux without my involvement either.</p>
<p>When there's a lot of work to do and it's easy to come by, this arrangement isn't so bad. At the time my tasks almost universally came from people in Austin, were intended to support people in Austin, and in return I was supported by people in Austin. Even though OzLabs was still the center of PowerPC Linux and my early code was reviewed and submitted by OzLabs, when I needed help or new work I didn't call them, I talked to people that were a few doors down from my office in Austin.</p>
<p>Unfortunately, embedded PowerPC dried up after Espresso, and that all changed.</p>
<h3 id="bml">BML</h3>
<p>Remembering my wonderful experience bringing up Prism and Chroma in 2010, I joined the Bare Metal Linux team with hopes that their reputation for hardcore bring up and CPU enablement work would directly translate into Linux commits.</p>
<p>Circa 2012, the BML team was small and mostly local to Austin, although still led by an OzLabber. POWER 7 was still pretty new and POWER 8 was waiting in the wings.</p>
<p>My first task was actually testing and writing proof of concept support for a new P8 feature called "accelerated switchboard" that included a new instruction PBT (Push Block to Thread). I felt like I was on the right track, I had a new chip feature to bang on and I was in the simulation and lab environment for the main POWER line of server processors instead of the weird embedded devices I cut my teeth on. I was even excited that my team was directly connected to OzLabs.</p>
<p>BML's reputation was an old one though, and it was earned when getting Linux to run on a new chip required a lot of hypervisor support that didn't exist when your chip was a simulation or a prototype fresh out of the fab. Linux without a hypervisor (and potentially running on glacially slow hardware simulators) required a lot of custom patches, custom stub firmware, on top of a set of lab tools to actually generate a device tree and load various artifacts into memory on a variety of platforms.</p>
<p>When I joined BML, the codebase was geared around this level of deep involvement. It had a directory full of bit-rotting Linux patches, a rickety build system based on snapshots instead of git trees, as well as a pile of awful Perl hacks used to interface with lab infrastructure. That may sound harsh, but I doubt any of my former teammates would disagree. It was clear that BML evolved from a minor miracle into a useful lab debug tool rather than being designed with that goal in mind.</p>
<p>Meanwhile, back in OzLabs, work was being done to effectively turn hypervisor-less Linux on Power into a fully supported platform (OpenPower). This wasn't a bad thing. In fact, from my perspective, OpenPower is not only a great step for PowerPC but also the ultimate validation of BML's purpose. However, as OpenPower started to gain traction, "bare metal Linux" went from a complex feat of hackery that could justify four or five hardcore engineers working in concert, to being a thin layer of scripts around a platform that was being professionally supported by Australia.</p>
<p>This shrinkage explains two things that I didn't understand until later.</p>
<p>First, why I never actually worked <em>with</em> my teammates on anything long term. Almost all of us were being loaned out to other projects because there wasn't enough work to do on BML itself to require the headcount. We were all working on line items that were, at best, tangentially related to BML. Writing drivers, working with research, debugging simulators, integrating the lab with system testing and so on. Having to stop and hack on the BML lab infrastructure we were technically attached to was often an annoying and inconvenient distraction from the other tasks on which we had been focused.</p>
<p>Second, how in that same time period I ended up with exactly zero Linux patches. BML itself didn't require kernel support anymore (beyond providing builds) thanks to OpenPower. Even the CPU enablement stuff I did get was either dropped from the final release (AS), taken out of my hands (64 bit decrementer, although that was because I was loaned out again), or both (load monitor).</p>
<p>BML was less a team and more a holding zone for kernel level engineers to be assigned wherever needed. I get how this had utility for IBM, and maybe even OzLabs sometimes, but it was a real shit situation to be in for someone like me. In my perspective, bouncing from project to project was just a way to never make a significant difference anywhere. To make matters worse, it was apparent that a lot of interesting work was being done during my time in BML, work that I desperately wanted to do, but had been absorbed by OzLabs while I was unwittingly wasting my time doing shit like implementing merge sorts on FPGA devices or trying to debug ancient Perl scripts.</p>
<p>When I finally looked up long enough to get some context, I felt like I was busy scarfing down dog food while OzLabs was just finishing up the filet mignon. By the time I got a crack at their leftovers the competition for that work was fierce and still dominated by other OzLabbers that could divvy up work and help each other while chatting over coffee instead of contending with a 17 hour time difference and tedious emails.</p>
<p>This is why I wish that I had learned to work more closely with OzLabs, or work more independently earlier in my career when it wasn't mandatory and the stakes were lower. Having done only inconsequential work, I was still an unknown quantity to OzLabs on top of operating with a severe handicap compared to other options. Certainly not the first person you'd think of when you needed work done with a minimum of hassle. Because of this and the fact that I didn't know how to find alternative work myself, I started to feel hopelessly mired in low priority, dead end tasks. Whether that was an accurate perception or not, I viewed my lack of kernel work and the stopgap nature of my BML work as evidence that it was true and lost faith that I would ever accomplish something meaningful.</p>
<p>I became despondent.</p>
<p>It didn't help that while I was on BML there were multiple rounds of layoffs, we were all forced to take a week of furlough (unpaid time off), and my friend and team/officemate Ryan Grimm left Austin so I was telecommuting all of the time. Morale was at rock bottom. I actively pursued other jobs, stopped taking my work seriously, stopped tuning in to weekly Oz synchronization calls in favor of family dinner, the news, or bedtime stories. I spent weeks on my own rewriting BML's infrastructure from scratch in Python for vague reasons that amounted to keeping myself busy beyond whatever nebulous line items I was actually supposed to be pinning down on the budget.</p>
<h3 id="softlayer">SoftLayer</h3>
<p>Underscoring the fact that BML members were almost always focused elsewhere, my entire 2015 was dominated by supporting <a href="http://softlayer.com">SoftLayer</a>, a cloud company IBM acquired in 2013 that still ran x86 chips almost exclusively. This had <em>nothing</em> to do with BML, and I was only tapped because I was in the right area (SoftLayer is based in nearby Dallas), had low level experience, and basically nothing else to do.</p>
<p>SoftLayer was a transformative experience for me. On one hand, even in a totally different role, I was still mopping up after OzLabbers that absorbed all of the main firmware/kernel work before I arrived. On the other hand, I was shoulder to shoulder with a small team for the first time since Prism five years earlier and it felt great.</p>
<p>It was our job to convince SoftLayer developers and execs who were openly hostile to our architecture that our systems could hang in their highly automated data centers. It was a tough sell. In fact, the first time I went to Dallas to work with SoftLayer, they were throwing a fit and wouldn't even communicate with IBM enough to sit down to lunch with me until the 4th day when the cavalry had arrived.</p>
<p>Thankfully, things went smoothly afterwards. In the following months I worked closely with my fellow IBMers as well as SoftLayer's team, I had multiple daily phone calls that <em>weren't</em> complete wastes of time, I had VP level visibility in both companies, and daily status notes with the Director of my organization. Most importantly, it was up to me to re-implement all the parts of SoftLayer's infrastructure that were Windows only, culminating in converting roughly 6,000 lines of C++ (with 15,000 more in templates and random dependencies grafted in) into a tight 250 lines of Python that I actually got to demo for execs. I'm not saying I'm a miracle worker, but it felt good to prove under pressure that I was a competent Linux developer that wasn't going to let some "copy and paste from Stack Overflow" Windows types scare me off with a Visual Studio project that looked like byzantine dogshit but was actually just implementing a simple (idiosyncratic, undocumented) JSON API in the wrong language for the job.</p>
<p>For so long I'd felt worthless, doomed to work as a member of a team that was mostly management fiction, cursed with dead end tasks that only landed on me after every OzLabber available had passed on them, or there was nothing left but scutwork. I'd even become aware that fresh hires at OzLabs had become far more productive than I was with years of supposed experience and started to wonder if I just sucked and nobody had the balls to say it to my face.</p>
<p>After SoftLayer it was like waking up from a trance, or fitting the last piece into a puzzle. Something clicked. I no longer felt despondent, I felt confident. I realized that those fresh hires weren't prodigies or supermen, they were benefiting from the same sort of close quarters team collaboration and effortless communication that I hadn't felt in the years between Prism and SoftLayer.</p>
<p>It was at this point that I developed a creeping suspicion that my time at IBM was drawing to a close.</p>
<h3 id="pulling-the-trigger">Pulling the Trigger</h3>
<p>I returned to BML early in 2016 and attempted to keep working.</p>
<p>Sure enough I was assigned some P9 kernel work, and sure enough as soon as there was an issue with it, the patch was no longer mine because it was easier to fix ASAP than it was to spend another 24 hours sending messages back and forth. To add further frustration, that code also got reverted when support was dropped from the chip so even if I hadn't screwed up I <em>still</em> wouldn't have had a patch in anyway.</p>
<p>I became confrontational. The next time there was a thread about the future of the team, I let everyone know what I thought about the current state of the team, how the project was being obsoleted by OpenPower, how its remaining functionality didn't take nearly as many developers, and how BML should either be refocused on my rewritten version or destroyed. I kept it professional, but I assume I still came off heated. Regardless, nobody gave a shit about my opinions. In retrospect I think I was expressing my frustration with the team more than I was expecting anything to change, but it would have been nice if someone had stepped up to defend BML from my criticisms even if my vision for the future of the team was weak.</p>
<p>I left BML shortly thereafter and was placed on the OpenPower team. Once again led by an OzLabber, isolated from everyone making decisions, bouncing between projects. Not having the BML infrastructure to worry about was a step in the right direction, and my team lead did the best he could to keep me busy, but at this point I was longing for a local team with a project where I could be self-driven instead of relying on others to mete out my weekly portion.</p>
<p>Ironically, this is where, after eight years, I finally got my one, single, solitary <a href="https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/arch/powerpc/platforms/powernv?id=9e4f51bdaf880208869aa001ee94a49de4b28d27">upstream Linux commit</a> that was actually my own work, even if it was only a simple cleanup.</p>
<p>Anyway, 2016 was just a long series of confirmations that, barring a relocation to Canberra, IBM didn't have the capability to provide what I wanted in an area I was interested in.</p>
<h2 id="blame-or-lack-thereof">Blame, or lack thereof</h2>
<p>So who do I ultimately blame for leaving? Well... nobody.</p>
<p>Despite my feeling overshadowed, OzLabbers didn't do anything to wrong me. On the contrary, I learned practically everything I know about writing good C and assembly from reading theirs. They had never been anything but friendly to me and understanding when I fucked up. What should they have done differently to keep me at IBM? Not revitalized the platform so I wouldn't be envious of their good work? Should they have ignored local talent to give me an even playing field? Should they have given me bigger chunks of work when I never proved I could handle the smaller ones? No, of course not.</p>
<p>I do wish that I had the opportunity to visit OzLabs to learn their workflow in their natural habitat. I think I would have made a better impression trying to work with them, rather than only meeting in Austin when they were dashing between meetings instead of kernel hacking. Perhaps then I would have gained insight on how to better work with them from Austin, or work more effectively on my own but I'm doubtful it would have mattered.</p>
<p>As for IBM overall, I can't say there was much they could do either, short of keeping embedded PowerPC going with an Austin team.</p>
<p>For myself, I know I could have done better. There are other foreign developers that work just fine kernel hacking PowerPC, and maybe with a bit more skill, patience, experience, or even just flexibility to work on something outside of the base chip I could've been one of them. I certainly could have been more aware of what was going on, and less prone to spells of depression. I could have been more communicative, or more pro-active.</p>
<p>In my defense, most of the time I did the best I could with the information I had. Yes, I made dumb choices, I made naive mistakes, but a lot of this is only clear to me now with years of hindsight. It should be no surprise that 31-year-old-seasoned-programmer me would do 100x better than 22-year-old-college-grad me given the chance, so I try not to dwell on my failures after I've learned from them.</p>
<p>The bottom line is that as I matured as a programmer and employee, what I wanted from my team and employer changed drastically enough that I couldn't be accommodated. There is no fault, just greater understanding, so while I very well could be making a huge mistake, I'm reminded of this recent xkcd:</p>
<p><a href="https://imgs.xkcd.com/comics/settling.png"><img src="https://imgs.xkcd.com/comics/settling.png" alt="xkcd: Settling" /></a></p>
<h2 id="some-shout-outs">Some shout outs</h2>
<p>At this point, all I can say is that I firmly believe OzLabs is filled with the best, most professional and accomplished engineers I've ever worked with. OpenPower is a huge leap for PowerPC and a major achievement for IBM's server business. As it has been for more than 15 years, the architecture is in good Australian hands.</p>
<p>I also want to bid my North American BML peeps and SoftLayer invasion force brothers in arms farewell.</p>
<p>Oh and, hopefully for the last time, I just want to say "Fuck Lotus Notes."</p>
Steam Link + Generic Gamepad + Linux Host2016-11-26T18:56:48+00:002016-11-26T18:56:48+00:00Unknownhttps://blog.codezen.org/posts/steam-link-generic-gamepad-linux-host/<p>Like a lot of people this week, I picked up a Steam Link for $20 from Amazon and it arrived yesterday.</p>
<p>Previously, I've used Steam home streaming to and from Linux hosts and I've been very pleased with its performance, especially over a wired connection. I streamed Skyrim from a Windows partition elsewhere to my media box running Arch and it even worked on the nouveau driver, so it seemed like a safe bet to invest $20 in a Steam Link to function as a sort of bluetooth KVM switch, so I could stream games and movies from any of the hosts in the house. This post isn't to review the Link, however, it's to clear up exactly how generic controllers (i.e. not the Steam Controller) work in Big Picture Mode (BPM) and how to resolve a couple of Linux configuration snafus.</p>
<p>[toc]</p>
<h2 id="a-note-on-generic-controllers">A note on generic controllers</h2>
<p>When I bought the Steam Link, I read that it supports the Wii U Pro Controller. I've got a couple of those laying around since we have a Wii U and they're pretty nice controllers. Supported, in this case though, just means that the Link will properly pair with the controller and it has a good mapping between the Wii U Pro Controller's buttons and the X-Box 360 controller it's emulating. That's it. It's enough to get the Link interface and the BPM interface to work well, and nothing else.</p>
<p>What that means is that you should <strong>ignore Big Picture Mode's controller mapping config</strong>. Seriously, the most confusing part of this whole experience was discovering that all the neat mapping functionality is <strong>Steam Controller only</strong>. I mean, I knew I couldn't do all the cool stuff a Steam controller can like profiles and mode shifting etc. but I thought I could at least change simple button presses. I guess I should have taken the hint that the mapping controller is a picture of a Steam Controller and the descriptions all mention "Steam Controller" by name, but it convincingly allowed me to mess with settings it knew would never take.</p>
<p>Despite that, the <strong>bindings are still active and will still change on context</strong>. Even though you can't actually change the bindings yourself in the interface, BPM will still alter the bindings based on whether you're in Desktop Mode (normal Steam), BPM, or a game. This means <strong>it's crucial when you setup bindings in a game that it was launched via Steam and not any other way</strong>.</p>
<p>This threw me off quite a bit because I thought it'd either be "Steam can configure this device" or "Steam won't touch this device", not "Steam will pretend to configure this device, fail, but then configure it implicitly when you do something anyway." The latest Steam betas will warn you that you're configuring a different controller, but will still frustratingly pretend that it's actually going to try to make it work. It'd be nice if Valve made this more explicit by forbidding you to change the mapping, instead of it silently reverting to defaults.</p>
<h2 id="fix-constant-display-video-flickering-on-nvidia-cards">Fix constant display/video flickering on NVIDIA cards</h2>
<p>The first real problem I faced was that connecting the Link to my Arch Linux system worked, but Steam in BPM would incessantly flicker. Not occasional frame tearing, but headache inducing strobe flickering. [<strong>UPDATE</strong>: Now that I've tested on better hardware, I've found that this option is necessary to fix the more subtle flickering of full motion video too. ] I'm not sure how to fix this on nouveau, but I switched to the proprietary driver and after invoking this command:</p>
<pre style="background-color:#2b303b;color:#c0c5ce;"><code><span>
</span><span>nvidia-settings --assign CurrentMetaMode="HDMI-0:1920x1080\_60 +0+0 { ForceFullCompositionPipeline = On }"
</span><span>
</span></code></pre>
<p>the flickering stopped. <strong>Note that you'll need to customize the mode definition</strong>. HDMI-0 is the adapter, 1920x1080_60 is the mode (resolution and refresh rate) and screen offset. All of this information you can query from "xrandr -q" if you're unsure. For example, here's the xrandr output on this computer:</p>
<pre style="background-color:#2b303b;color:#c0c5ce;"><code><span>
</span><span>HDMI-0 connected 1920x1080+0+0 (normal left inverted right x axis y axis) 698mm x 392mm
</span><span> 1920x1080 60.00*+ 59.94 23.97 60.05 60.00
</span><span> 1440x480 60.05
</span><span> 1280x720 60.00 59.94
</span><span> 720x480 59.94
</span><span> 640x480 59.93
</span><span>
</span></code></pre>
<p>You can see the adapter name, the resolution, the offset (+0+0), and the refresh rate is listed in the current mode (60.00*).</p>
<p>You could automate this either by using nvidia-settings to write your Xorg conf, or you can just invoke this command once before you start steam on the host. Personally, using an XDG autostart compatible WM (like Cinnamon, or Openbox), I just have it in an autostart script so my xorg.conf is still (mostly) auto-generated.</p>
<pre style="background-color:#2b303b;color:#c0c5ce;"><code><span>
</span><span>[Desktop Entry]
</span><span>Type=Application
</span><span>Exec=nvidia-settings --assign CurrentMetaMode="HDMI-0:1920x1080\_60 +0+0 { ForceFullCompositionPipeline = On }"
</span><span>X-GNOME-Autostart-enabled=true
</span><span>NoDisplay=false
</span><span>Hidden=false
</span><span>Name[en\_US]=fix-nvidia
</span><span>Comment[en\_US]=
</span><span>X-GNOME-Autostart-Delay=10
</span><span>
</span></code></pre>
<h2 id="fix-big-picture-mode-cursor-confusion">Fix Big Picture Mode cursor confusion</h2>
<p>The next problem that I faced was that Big Picture Mode had a big blue mouse cursor on it, a Linux desktop cursor, in addition to it's highlight cursor and all of them were out of sync. It made it very hard to tell just what exactly you're doing in the interface. Initially, I thought it was Steam's bindings getting confused but it's actually Xorg trying to be helpful. When you connect a generic controller to the Steam Link, it forwards the traffic over the network as a virtual X-Box 360 controller. Xorg sees that device and says "oh hey, a joystick device, I know what to do with that!" and attaches the mouse.</p>
<p>If we were plugging a controller into a standard Linux desktop, this would be a lifesaver, but since our interface is specialized to use the controller it's just confusing. So, the solution here is to tell Xorg to stop.</p>
<pre style="background-color:#2b303b;color:#c0c5ce;"><code><span>
</span><span>Section "InputClass"
</span><span> Identifier "joystick catchall"
</span><span> MatchIsJoystick "on"
</span><span> MatchDevicePath "/dev/input/event*"
</span><span> Driver "joystick"
</span><span> Option "StartKeysEnabled" "False" #Disable mouse
</span><span> Option "StartMouseEnabled" "False" #support
</span><span>EndSection
</span><span>
</span></code></pre>
<p>After restarting X, this will keep Xorg from automatically connecting the mouse cursor to your gamepad stick and leave Steam alone.</p>
<p>That's pretty much all I had to do to get basic Link functionality up and running when connecting to a Linux host.</p>
Trumpocalypse 20162016-11-09T22:30:02+00:002016-11-09T22:30:02+00:00Unknownhttps://blog.codezen.org/posts/trumpocalypse-2016/<p>It happened. It actually happened. Trump is going to be the next President of the United States and I'm pretty sure the entire American public is sitting around looking at each other and feeling completely <em>numb</em>. Unless you voted for him, then you're probably ecstatic that he overcame what appeared to be insurmountable odds.</p>
<p>Personally, I voted Hillary. Not because I think she's a good person, or would be a good President, but because I thought an oligarch would be a better choice than a racist psychopath. That said, as someone that supported Bernie vehemently until long after it was obvious he'd lost the primary, I can't help but think that Hillary and the DNC did this to themselves.</p>
<p>It was obvious during the primary, and in the email aftermath, that the DNC wasn't interested in giving Bernie Sanders a fair shake. Not only were all of the rules and resources of the DNC focused on putting Hillary in the general, but also the travesty of superdelegates that honestly believed she was the best the party could offer despite the history of scandal, the appearance of corruption via the Clinton Foundation and just generally her lack of inspiration. Hell, her platform was an assortment of continuing Obama's policies and adopting Bernie's in an attempt to pander to the dissatisfied progressive wing of the party.</p>
<p>Even I could see a lot of problems with Hillary's primary performance before she was the nominee. For example, Hillary absolutely dominated primaries in the south where, lo and behold, votes didn't matter one bit yesterday. She didn't carry a single southern state, not even Florida which was demographically in reach. She won many closed primaries that excluded anybody that didn't identify as a Democrat (or didn't identify <em>in time</em>). Those independents that were excluded went for Trump (<a href="http://www.cnn.com/election/results/exit-polls">CNN</a>: 48% to 42%). Time and time again during the primaries, we saw the older contingent of those self identified Democrats carry Clinton to victory, but older people skew conservative (one reason they liked Clinton over Bernie in the first place) and appealing to Boomers isn't a winning strategy for a Democrat.</p>
<p>After the primary, she failed to reach out to the young Bernie supporters and minorities of all stripes who are a lot of the same demographics that put Obama in the White House twice. The assumption was that they'd fall inline through fear of Trump and that ultimately proved fatal. The youth picked Hillary still (44 and under went Hillary 52% to 40%) but the minority vote didn't split for Hillary like they did for Obama, and a lot of that is squarely on Hillary. She spent too much time trying to target white voters, particularly white women, to erode Trump's base while completely ignoring her own. What happened to <em>abuelita</em> after she'd won the Nevada, Florida, and California primaries? Where was civil rights activist, Bible thumping Clinton after the South Carolina primary? Nowhere. Instead her campaign defined itself as not Trump.</p>
<p>Watching the general election debates, it was obvious that Trump didn't really have a platform leg to stand on. He failed to give details about anything he promised to accomplish. Even now that he's President-elect I don't think anybody has the first clue of what an actual Trump administration is going to look like on day one. Clinton could have capitalized on this, but instead of inspiring people to vote for her by dismantling Trump piece by piece, she effectively looked at the screen and said "c'mon, seriously?"</p>
<p>And this is where everyone failed. Clinton, the media, most of of the populace completely underestimated just how much the American public is sick of establishment politics. This is why Hillary failed to win yesterday. She wasn't fighting the fight she was prepared for... one based on policy and parties, like the one Obama fought against McCain or Romney and how Democrats have fought against Republicans in a hundred other races. She was fighting a battle for the status quo against an uncontrollable tide of destruction. She kept expecting to defend her policies and ideas from her opponent's policies and ideas when in reality she needed to be arguing why the establishment shouldn't be burnt to the ground as a whole.</p>
<p>In the most bizarre way possible, Trump played this masterfully. He understood, in a way that I think Bernie understood but articulated much differently, that this fight didn't have anything to do with concrete policy as much as harnessing American rage to destroy a system that everyone (even Clinton) acknowledges is broken.</p>
<p>The next four years are going to be rough. Trump has it within his power to strip away Obama's legacy, turn the Supreme Court into a conservative bastion for decades, and just generally ruin the American reputation on the international stage.</p>
On Bernie Sanders vs. Hillary Clinton - without talking about financing2016-02-06T05:16:32+00:002016-02-06T05:16:32+00:00Unknownhttps://blog.codezen.org/posts/on-bernie-sanders-vs-hillary-clinton-without-talking-about-financing/<p>It won't come as any surprise to people that know me personally that I'm a Bernie Sanders supporter. I'm pretty far left and I have absolutely no problem looking toward Europe for examples of good government taking care of its people better than the US. I don't think twice about labels like "socialist" because I know what that actually means and that Democratic Socialism been a successful model elsewhere.</p>
<p>However, in this write up, I wanted to give <strong>concrete</strong> reasons to choose Sanders over Clinton for someone that <strong>doesn't want to predicate this decision solely on whether Hillary Clinton has been bought and paid for by the Washington machine</strong> because even though it's obvious that money and lobbyists are corrupting our politics in general, it's hard to prove that Clinton specifically is corrupt. The closest I've come is <a href="https://t.co/IKF5sgpg1m">Elizabeth Warren calling out Clinton in 2004</a> about reversing course on bankruptcy legislation which stinks of corruption but is still just conjecture about Clinton's own motivations. In essence, I'll give her the benefit of the doubt that she's a woman of honor and the fact that she takes corporate money and gives paid speeches to Goldman Sachs doesn't compromise her integrity.</p>
<p>[toc]</p>
<h3 id="judgment-vs-experience-in-foreign-policy">Judgment vs. Experience in Foreign Policy</h3>
<p>Bernie Sanders voted against invading Iraq - twice.</p>
<p>It's a bit annoying how much he flogs this point in the foreign policy debates, but it <em>is</em> important to me. Why? Because in 2003 I was a 17 year old boy and over the course of that war I saw men just like me go to Iraq and Afghanistan and come back broken, or not at all. Issues tend to hold more influence when it causes people that are just like you come back in flag draped coffins from an unjust war. This was a big reason I voted Kerry in 2004, and Obama in 2008/2012.</p>
<p>In the end though, it's not even directly about the Iraq War as much as it is the difference between <strong>experience</strong> and <strong>judgment</strong> as Bernie mentioned in last night's debate. Hillary has the foreign policy bona fides of being Secretary of State but that amounts to <em>experience</em> where her vote on the Iraq War showed a <em>lack of judgment</em> that was extremely costly for this country both in terms of dead soldiers and wasted money that all went to toppling a dictator that was the only thing holding back the factional warring we now see with ISIS. We traded lawful evil for chaotic evil.</p>
<p>Bernie, having no foreign policy experience but great judgment, voted against the Gulf War in 1991 on moral grounds only days after taking his first national office. Then, in 2002, when he had access to the same information as Hillary, he not only voted against the Iraq War, but also <a href="https://youtu.be/NdFw1btbkLM">predicted the disastrous results</a> including the fight with ISIS (the whole thing is good but his list of unanswered questions begins at <a href="https://youtu.be/NdFw1btbkLM?t=166">2:46</a> and his fifth question is "Who will govern Iraq when Saddam Hussein is removed, and what role will the US play in an ensuing <a href="https://en.wikipedia.org/wiki/Iraqi_Civil_War_(2014%E2%80%93present)">civil war</a> that could develop in that country?" at <a href="https://youtu.be/NdFw1btbkLM?t=270">4:30</a>).</p>
<p>Now it could be argued that her 4 years as Secretary of State make just that big a difference. After all, this was 2002 when she had no foreign policy experience, and as Hillary rightly pointed out in the debate, one vote in 2002 doesn't give you a strategy against ISIS 14 years later. Yet Clinton certainly didn't think it was an issue when <em>she</em> was running for President in 2007 and 2008 with no foreign policy experience, and less experience in government than Bernie Sanders has now. And she certainly doesn't have anything bad to say about Obama's foreign policy (because it was hers) even though <em>he</em> didn't have any experience.</p>
<p>Bernie has excellent <em>judgment</em> despite lacking foreign policy <em>experience</em> (just like Obama and Clinton in 2008). As President, Sanders will have the best advisers and intelligence in the world, but he still has to make the right choices, even if it's in regard to something he's not an expert on (like new threats, or unprecedented world events). I just don't buy that having a ton of experience outweighs having the <em>judgment</em> to make the right call, and the <em>judgment</em> to surround yourself with people that do have experience.</p>
<h3 id="the-patriot-act">The PATRIOT Act</h3>
<p>In a similar vein, Hillary voted consistently to support the PATRIOT Act. When it first came up in 2001, and then again in 2006, and then again in 2015 when it resurfaced as the USA FREEDOM Act (which was just the PATRIOT Act without NSA surveillance because we found out).</p>
<p>Bernie, unsurprisingly, voted against it all three times.</p>
<p>I believe that this is another instance in which Sanders showed better judgment despite the mania of the time. Regardless of the size of the terrorist threat, there are certain freedoms that should not be infringed upon, like the 4th Amendment in the Bill of Rights (against illegal search and seizure). Ultimately, all the PATRIOT Act did was give the government license to monitor all of your communications with the barest hint of reasoning and without even a modicum of true oversight.</p>
<p>On top of that, it was rammed through Congress without enough discussion and debate. It was introduced on October 23rd, passing the House on the 24th (without Sanders' support), and passing the Senate on the 25th (with Hillary's support). The bill was 350 pages long and quite complex, I believe it's highly likely that Clinton (like the 97 other senators that voted for it) rubber stamped the PATRIOT Act without even reading it, based solely on the prevailing fear of the day - again failing to exercise good judgment.</p>
<h3 id="capital-punishment">Capital Punishment</h3>
<p>Capital punishment is utterly barbaric and has no place in an enlightened society. You can't kill people to show that killing people is wrong. There's too much opportunity for miscarriages of justice to occur because there's no such thing as 100% certainty. Even "slam dunk" cases can always have new light shed on them, as we saw with the advancement of DNA technology in the last century, and as such we should always leave room for error.</p>
<p>A list of <a href="https://en.wikipedia.org/wiki/List_of_exonerated_death_row_inmates">exonerated death row inmates</a> shows that we exonerated <strong>seven</strong> death row inmates just <strong>last year</strong> who were convicted between 1985 and <em>2013</em>. Each one of these people was wrongly locked up, which is bad enough, but it would have been immeasurably worse if their sentences had been carried out.</p>
<p>Hillary, at last night's debate, said that capital punishment has its place, even if reluctantly, based on some draconian idea that really bad people deserve it. As if spending the rest of your life in a prison cell wasn't an awful (and more just, and cheaper) punishment already.</p>
<p>Bernie Sanders is against capital punishment entirely, and his home state of Vermont has banned it since 1965.</p>
<h3 id="healthcare">Healthcare</h3>
<p>The Affordable Care Act (ACA or Obamacare) is a disappointment. I've defended it in the past for only one reason: it's a foot in the door. It gets everyone into the system and when everyone has a stake people are a lot more likely to care when opportunities for reform arise. In my view, the ACA ceased being a complete solution the moment the public option was dead because at that point it was just a way to force everyone into the for-profit insurance industry.</p>
<p>To be clear, Sanders voted <strong>for</strong> the ACA as an incremental improvement to a flawed system. However, he believed that it didn't go far enough, wanting to supply Medicare-For-All in a single payer model. This is a proven model elsewhere in the industrialized world (like Canada, the UK, Australia) and would provide us with truly universal and free healthcare at the overall cost of a slight bump in taxes which would be offset by the savings from not paying for insurance.</p>
<p>When Sanders was helping to draft the ACA, he <a href="http://thehill.com/blogs/blog-briefing-room/news/72569-sanders-withdraws-single-payer-amendment-">attempted to pass an amendment that would have converted the ACA into Medicare-For-All</a> but was forced to withdraw it because Tom Coburn (R-Oklahoma) threatened to destroy the entire bill. Sanders vote for the ACA was merely not letting perfect (single payer) be the enemy of good (the ACA's improvements).</p>
<p>Hillary's only real argument against it (other than the "he's dismantling Obamacare" which was hopefully debunked last night) is that it would force us into another politically contentious debate with Republicans... well what issue in either of these camps <em>wouldn't?</em> Who believes that anything that they <em>agree</em> on, from gun control, to education, to infrastructure, to bank regulation would go through Congress without a fight? Nobody. So if we're going to fight about everything, why not aim for the system we want instead of calling it good enough to avoid the heat?</p>
<p>More to the point, Hillary's desire to incrementally improve the ACA is admirable, but incremental change will never transform the ACA into government run, non-profit, cost controlled, and free healthcare like we see elsewhere in the world. At best it would add further restrictions to the insurance companies, but as long as those same companies are out to make a buck it's going to be impossible to get them to stop cutting corners, stop finding ways to exclude costly patients, and overall stop finding ways to screw the American public.</p>
<h3 id="marijuana">Marijuana</h3>
<p>It's 2016. There are states in this country that have legalized <em>recreational</em> marijuana and have seen <em>positive</em> effects from that legalization. Even more states have decriminalized marijuana or authorized medicinal marijuana. The time for Hillary's approach - moving it to Schedule II (which includes drugs with "high potential for abuse, with use potentially leading to severe psychological or physical dependence" like Adderall or Vicodin, which is far more harmful and addictive than marijuana) and doing research for another 20 years - is long over. Moving marijuana to Schedule II merely opens the door for national medicinal marijuana rather than actually dealing with any of the real issues.</p>
<p>Even if she won't commit to fully legalize marijuana it's well past time to recognize that locking people up for marijuana is a travesty and decriminalize it. The idea that we should ruin someone's life by locking them up and giving them a police record to keep them from ruining their life by smoking marijuana is absurd, especially when it clearly hasn't worked as a deterrent.</p>
<p>In the end, legalization of marijuana is a win for everyone. Not only does it legalize activity people are taking part in anyway (fueling black markets with unregulated access to all other drugs), but legalization means that Americans can start making money on marijuana instead of the <em>Mexican cartels</em> that are happy to live like warlords on American dollars.</p>
<p>With government taxation, and the reduction of the load on the justice and penal systems, it would even be a net gain for the government itself (as it has been in CO, AK, WA, and OR). It's rare that libertarians and liberals can agree on an issue, but there is wide agreement on this from everyone that can look past the War on Drugs rhetoric.</p>
<p>Now Bernie hasn't come out and said "I will legalize marijuana" but he supports ending the federal prohibition on marijuana (legalizing it without overriding the states) which would make it a lot easier for marijuana based businesses to use federally backed services like banks and operate without the fear that the DEA will come knocking. Not to mention it would remove one more concern for states that want to legalize. I would prefer it if he was totally pro-legalization, but his position is still miles ahead of Hillary's.</p>
<h3 id="other-concerns">Other Concerns</h3>
<p>Again, without bringing up Wall Street or campaign finance, there are some other concerns where the margins are a little slimmer between the two candidates.</p>
<h5 id="gay-marriage">Gay Marriage</h5>
<p>In 2004, Senator Clinton <a href="https://www.youtube.com/watch?v=6I1-r1YgK9I">defended the Defense of Marriage Act (DOMA)</a> arguing that marriage was between a man and a woman and only served to raise children. In 2007, candidate Clinton <a href="https://www.youtube.com/watch?v=Y3huRVrckY8">supported civil unions and marriage was a states issue</a>. In 2016, as a candidate again, she supports marriage equality... now that it's overwhelmingly popular, has been upheld by the Supreme Court and requires no <strong>action</strong> only continued defense of the status quo.</p>
<p>Sanders voted against Don't Ask Don't Tell (DADT) in 1993. Defended <a href="https://youtu.be/-GcC34iRNjc">gay soldiers</a> in 1995. Voted against DOMA in 1996. Supported Vermont civil unions in 2000, and Vermont gay marriage in 2009 before it was legal nationally. The only blip in his support was in 2006 (while in the House) when he suggested that it wasn't time to push for marriage equality because of the contentious nature of the 2000 civil union decision that proved extremely divisive in his home state. I'm inclined to let that pass considering it was pragmatically motivated rather than any sort of prejudice, there wasn't any legislation actually on the table at the time, and the state politics of Vermont were outside of his arena as a member of (the obviously national) Congress.</p>
<p>The reason I don't put much weight on this point is that both candidates are pro-gay at this point. Yet I think it's worth bringing up because either Hillary truly evolved on gay rights (in an arc suspiciously matching public opinion year by year) while Sanders was pretty consistent over 20 years... or she was willing to support legislation she didn't believe in (DOMA) to back injustice. Neither of these possibilities are particularly flattering to Clinton.</p>
<h5 id="establishment">"Establishment"</h5>
<p>Clinton is 100%, totally unarguably an establishment candidate. There's a reason that, before even one vote had been cast, she had collected 320 super-delegates and was considered the inevitable nominee the instant she announced. Personally, I don't care about the "establishment" label, but her insinuation in last night's debate that she can't be an establishment candidate because of her sex was indefensibly sexist and completely irrelevant to the issues.</p>
<h5 id="scandal">Scandal</h5>
<p>I also don't get this argument that somehow Clinton's high profile career means that she's had all of her dirty laundry aired and that gives her an advantage over Bernie. Not only is there currently a minor scandal on her end that has taken too much time out of this campaign (emails), but Bernie has been in public office in various forms since 1981. Sure, he wasn't in the White House but over the last 35 years hasn't he faced a lot of public scrutiny? Wouldn't every person he ever faced from being mayor of Burlington, to Representative, to Senator want to find some dirt on their idealistic and high minded opponent?</p>
<h3 id="conclusion">Conclusion</h3>
<p>In the end I believe I've laid out a case for Bernie Sanders to be my choice for President, without touching on nebulous claims of corruption through campaign finance. If you agree, disagree, or have corrections feel free to use the comments.</p>
On Bspwm Tweaking2015-03-13T19:08:54+00:002015-03-13T19:08:54+00:00Unknownhttps://blog.codezen.org/posts/on-bspwm-tweaking/<p>I've written before on my travels through the tiling WM landscape. It's been <a href="http://blog.codezen.org/2012/10/18/on-qtile/">awhile</a> though.</p>
<p>My most recent discovery is <a href="https://github.com/baskerville/bspwm">bspwm</a>, which is a tiling WM that mixes automatic (think Xmonad) and manual (think ion3/notion) tiling as well as a hands off, but play nice approach to other desktop necessities like status bars and trays.</p>
<p>[toc]</p>
<h3 id="why-bspwm">Why bspwm?</h3>
<ul>
<li>
<p><strong>It's Minimal</strong>. Similar to Xmonad, bspwm does exactly one thing, but does it extremely well. It places windows. It doesn't have a built-in anything. No trays. No status bars. No menus. It doesn't even directly handle keybinds thanks to a companion program by the same author (Bastien Dejean) call <code>sxhkd</code> or Simple X HotKey Daemon which is a flexible tool to map keybinds to simple command execution similar to <code>xbindkeys</code> but better. In my experience, built-in extra-features of WMs are often lacking the amount of flexibility I want, so no loss there.</p>
</li>
<li>
<p><strong>It's Scriptable</strong>. Bspwm has a companion program, <code>bspc</code> that can be used from the command line, or a script, to accomplish any action bspwm is capable of. In fact, <code>bspc</code>'s so complete that all of the default <code>sxhkd</code> binds are <code>bspc</code> commands and the <code>bspwmrc</code> is nothing but a shell script calling <code>bspc</code> to set configuration options, along with whatever other startup stuff you wish.</p>
</li>
<li>
<p><strong>It Communicates</strong>. It's a simple affair to extract information from bspwm, both via <code>bspc</code> and via the status FIFO that can be used to receive notification of bspwm internal events.</p>
</li>
</ul>
<p>To summarize, <code>bspwm</code> fits into the sweet spot where it has the minimalism of Xmonad, trading out the Haskell for shell scripts and a whole lot of scripting potential.</p>
<h3 id="my-setup">My Setup</h3>
<p>First an obligatory double-wide screenshot.</p>
<p><a href="/2015-03-12-000528_3840x1080_scrot.png"><img src="/2015-03-12-000528_3840x1080_scrot.png" alt="2015-03-12-000528_3840x1080_scrot" /></a></p>
<p>Very simple, but there are a few upgrades from the <a href="https://github.com/baskerville/bspwm/tree/master/examples">examples</a> in the git repo, despite the fact that the color scheme is the same.</p>
<ul>
<li>
<p><strong>Easy Named Desktops</strong>. I've written a couple of helper scripts around <code>bspc</code> and <code>dmenu</code> that make it simple to create, switch to, rename, or destroy named desktops.</p>
</li>
<li>
<p><strong>Enumerated Desktops</strong>. They're also numbered along so that bspwm's default keybinds are more easily used along with their descriptive names.</p>
</li>
<li>
<p><strong>Double Monitor Status Bar</strong>. I've split the monitor/desktop output of the status bar so that each monitor's information is displayed on it, rather than all on the left side of the bar.</p>
</li>
<li>
<p><strong>Keybinds for Focusing/Sending to Monitors</strong>. A simple job for <code>bspc</code>, I was surprised there was no default bind for it, but these binds allow you to shift windows and focus from one screen to another without knowing which desktop is on which.</p>
</li>
<li>
<p><strong>Battery Monitor</strong>. I added a simple battery monitor on my laptop host.</p>
</li>
<li>
<p><strong>A Tray</strong>. I've configured stalonetray to blend into my status bar.</p>
</li>
<li>
<p><strong>Simplified Files</strong>. I much preferred having the panel configuration all in one file, instead of three (or four, if you count tweaking your <code>.profile</code>).</p>
</li>
<li>
<p><strong>Hostname Tweaks</strong>. Tweaks to make my single config work identically between my desktop and laptop.</p>
</li>
</ul>
<h3 id="named-desktops">Named Desktops</h3>
<p>Bspwm natively supports named desktops, but they're cumbersome to use since you have to use <code>bspc</code> from somewhere. The example config spawns 10 desktops by number and calls it good. Well, coming from notion (a fork of ion3), I got used to the ability to name desktops something useful to remember what the hell I was doing on them, and then shift between them easily.</p>
<p>As such, I've added two scripts, which are trivial wrappers around <code>dmenu</code> and <code>bspc</code></p>
<pre style="background-color:#2b303b;color:#c0c5ce;"><code><span>
</span><span>#!/bin/bash
</span><span>
</span><span>DMENU\_NF="#A3A6AB"
</span><span>DMENU\_NB="#34322E"
</span><span>DMENU\_SF="#F6F9FF"
</span><span>DMENU\_SB="#5C5955"
</span><span>
</span><span>DESKTOP\_NAME=`bspc query -D | dmenu -b -nf "$DMENU\_NF" -nb "$DMENU\_NB" -sf "$DMENU\_SF" -sb "$DMENU\_SB" -p 'Desktop:'`
</span><span>
</span><span>if [ -z $DESKTOP\_NAME ]; then
</span><span> exit 0
</span><span>fi
</span><span>
</span><span>for existing\_desktop in `bspc query -D`; do
</span><span> if [ "$DESKTOP\_NAME" == "$existing\_desktop" ]; then
</span><span> bspc desktop "$DESKTOP\_NAME" -m `bspc query -M -m focused`
</span><span> bspc desktop -f "$DESKTOP\_NAME"
</span><span> exit 0
</span><span> fi
</span><span>done
</span><span>
</span><span>bspc monitor -a "$DESKTOP\_NAME"
</span><span>bspc desktop -f "$DESKTOP\_NAME"
</span><span>
</span></code></pre>
<pre style="background-color:#2b303b;color:#c0c5ce;"><code><span>
</span><span>#!/bin/bash
</span><span>
</span><span>DMENU\_NF="#A3A6AB"
</span><span>DMENU\_NB="#34322E"
</span><span>DMENU\_SF="#F6F9FF"
</span><span>DMENU\_SB="#5C5955"
</span><span>
</span><span>DESKTOP\_NAME=`echo '' | dmenu -b -nf "$DMENU\_NF" -nb "$DMENU\_NB" -sf "$DMENU\_SF" -sb "$DMENU\_SB" -p 'Rename:'`
</span><span>if [ -z $DESKTOP\_NAME ]; then
</span><span> exit 0
</span><span>fi
</span><span>
</span><span>bspc desktop -n "$DESKTOP\_NAME"
</span><span>
</span></code></pre>
<p>I put these into my <code>$PATH</code> someplace, I use <code>~/bin</code> for all of my custom scripts.</p>
<p>Then, in <code>sxhkdrc</code>:</p>
<pre style="background-color:#2b303b;color:#c0c5ce;"><code><span>
</span><span>super + {\_,ctrl} + d
</span><span> /home/jack/bin/bspwm\_{\_,re}name\_desktop
</span><span>
</span><span>super + alt + d
</span><span> bspc desktop focused -r
</span><span>
</span></code></pre>
<p>This allows you to use <code>Super + d</code> to create a new named desktop, or switch to it if it already exists. <code>Super + ctrl + d</code> will rename the currently focused desktop. Finally, <code>Super + alt + d</code> will destroy the focused desktop (but only if it's empty and not the only desktop on its monitor, which is a restriction of bspwm).</p>
<h3 id="panel-improvements">Panel Improvements</h3>
<p>I've combined the various panel example files into a custom single file that's still run from <code>bspwmrc</code>.</p>
<p>This covers the <strong>enumerated desktops, split monitor status, tray, and hostname tweaks</strong> I mentioned above.</p>
<p>Here's the full panel script, commented with improvements:</p>
<pre style="background-color:#2b303b;color:#c0c5ce;"><code><span>
</span><span>#! /bin/sh
</span><span>#
</span><span>
</span><span># Absorb all of the rote variable setting to make our panel self-contained
</span><span>
</span><span># From example .profile changes
</span><span>
</span><span>PANEL\_FIFO="$HOME/.config/bspwm/panfifo"
</span><span>PANEL\_HEIGHT="16"
</span><span>PANEL\_FONT\_FAMILY="-*-terminus-medium-r-normal-*-12-*-*-*-c-*-*-1"
</span><span>
</span><span># From panel\_colors file
</span><span>
</span><span>COLOR\_FOREGROUND='#FFA3A6AB'
</span><span>COLOR\_BACKGROUND='#FF34322E'
</span><span>COLOR\_ACTIVE\_MONITOR\_FG='#FF34322E'
</span><span>COLOR\_ACTIVE\_MONITOR\_BG='#FF58C5F1'
</span><span>COLOR\_INACTIVE\_MONITOR\_FG='#FF58C5F1'
</span><span>COLOR\_INACTIVE\_MONITOR\_BG='#FF34322E'
</span><span>COLOR\_FOCUSED\_OCCUPIED\_FG='#FFF6F9FF'
</span><span>COLOR\_FOCUSED\_OCCUPIED\_BG='#FF5C5955'
</span><span>COLOR\_FOCUSED\_FREE\_FG='#FFF6F9FF'
</span><span>COLOR\_FOCUSED\_FREE\_BG='#FF6D561C'
</span><span>COLOR\_FOCUSED\_URGENT\_FG='#FF34322E'
</span><span>COLOR\_FOCUSED\_URGENT\_BG='#FFF9A299'
</span><span>COLOR\_OCCUPIED\_FG='#FFA3A6AB'
</span><span>COLOR\_OCCUPIED\_BG='#FF34322E'
</span><span>COLOR\_FREE\_FG='#FF6F7277'
</span><span>COLOR\_FREE\_BG='#FF34322E'
</span><span>COLOR\_URGENT\_FG='#FFF9A299'
</span><span>COLOR\_URGENT\_BG='#FF34322E'
</span><span>COLOR\_LAYOUT\_FG='#FFA3A6AB'
</span><span>COLOR\_LAYOUT\_BG='#FF34322E'
</span><span>COLOR\_TITLE\_FG='#FFA3A6AB'
</span><span>COLOR\_TITLE\_BG='#FF34322E'
</span><span>COLOR\_STATUS\_FG='#FFA3A6AB'
</span><span>COLOR\_STATUS\_BG='#FF34322E'
</span><span>
</span><span># Kill any panel processes older than us, instead of bailing like the example
</span><span># does. That caused one too many panel-less boots for me.
</span><span>
</span><span>while [ $(pgrep -cx panel) -gt 1 ] ; do
</span><span> pkill -ox -9 panel
</span><span>done
</span><span>
</span><span># Kill any remaining trays / xtitle instances so we don't have multiples.
</span><span>
</span><span>killall -9 stalonetray
</span><span>killall -9 xtitle
</span><span>
</span><span># Setup taken from example, tell bspwm to avoid our status/tray and to start
</span><span># sending status updates to a FIFO
</span><span>
</span><span>trap 'trap - TERM; kill 0' INT TERM QUIT EXIT
</span><span>
</span><span>[ -e "$PANEL\_FIFO" ] && rm "$PANEL\_FIFO"
</span><span>mkfifo "$PANEL\_FIFO"
</span><span>
</span><span>bspc config top\_padding $PANEL\_HEIGHT
</span><span>bspc control --subscribe > "$PANEL\_FIFO" &
</span><span>
</span><span># Here are the subprograms that add information to the status FIFO which are
</span><span># interpreted by panel\_bar, below. Each output is detected by its first
</span><span># character, which is how the bspwm internal information is presented.
</span><span>
</span><span># T - xtitle output
</span><span># S - date output (same as example)
</span><span># B - battery output
</span><span>
</span><span># Title
</span><span>
</span><span>xtitle -sf 'T%s' > "$PANEL\_FIFO" &
</span><span>
</span><span># Simple date
</span><span>
</span><span>function clock {
</span><span> while true; do
</span><span> date +"S%m/%d %H:%M"
</span><span> sleep 1
</span><span> done
</span><span>}
</span><span>
</span><span>clock > "$PANEL\_FIFO" &
</span><span>
</span><span># No frills battery monitor (Linux specific, probably)
</span><span># This is only enabled on certain hostnames, at the end of this file.
</span><span>
</span><span>BAT="/sys/class/power\_supply/BAT0"
</span><span>
</span><span>function bat\_percent {
</span><span> while true; do
</span><span> CHARGE\_NOW=`cat $BAT/charge\_now`
</span><span> CHARGE\_FULL=`cat $BAT/charge\_full`
</span><span> PERCENT=`echo "($CHARGE\_NOW * 100)/$CHARGE\_FULL" | bc`
</span><span> STATUS=`cat $BAT/status`
</span><span>
</span><span> if [ $STATUS == "Charging" ]; then
</span><span> STATUS="+"
</span><span> elif [ $STATUS == "Discharging" ]; then
</span><span> STATUS="-"
</span><span> else
</span><span> STATUS=""
</span><span> fi
</span><span>
</span><span> echo "B$STATUS$PERCENT"
</span><span> sleep 1
</span><span> done
</span><span>}
</span><span>
</span><span># Now panel\_bar, which was mostly taken from the example panel\_bar, with a
</span><span># handful of improvements.
</span><span>
</span><span># - functionified, from panel\_bar file of example
</span><span># - the output changes based on the number of monitors, to place a single
</span><span># monitors's information on that same monitor, instead of all in one corner.
</span><span># - added B header for battery
</span><span># - all the desktop indicators are enumerated
</span><span>
</span><span>num\_mon=$(bspc query -M | wc -l)
</span><span>
</span><span>wm\_info\_array=("" "" "" "" "")
</span><span>
</span><span>function panel\_bar {
</span><span> while read line < $PANEL\_FIFO; do
</span><span> case $line in
</span><span> S*)
</span><span> # clock output
</span><span> date="${line#?}"
</span><span> ;;
</span><span> B*)
</span><span> # battery output
</span><span> percent="${line#?}"
</span><span> ;;
</span><span> T*)
</span><span> # xtitle output
</span><span> title="%{F$COLOR\_TITLE\_FG}%{B$COLOR\_TITLE\_BG} ${line#?} %{B-}%{F-}"
</span><span> ;;
</span><span> W*)
</span><span> # bspwm internal state
</span><span> wm\_infos=""
</span><span> cur\_mon=-1
</span><span> desktop\_num=1
</span><span>
</span><span> IFS=':'
</span><span> set -- ${line#?}
</span><span> while [ $# -gt 0 ] ; do
</span><span> item=$1
</span><span> name=${item#?}
</span><span> case $item in
</span><span> M*)
</span><span> # active monitor
</span><span> cur\_mon=$((cur\_mon + 1))
</span><span> wm\_infos=""
</span><span> if [ $num\_mon -gt 1 ] ; then
</span><span> wm\_infos="$wm\_infos %{F$COLOR\_ACTIVE\_MONITOR\_FG}%{B$COLOR\_ACTIVE\_MONITOR\_BG} ${name} %{B-}%{F-} "
</span><span> fi
</span><span> ;;
</span><span> m*)
</span><span> # inactive monitor
</span><span> cur\_mon=$((cur\_mon + 1))
</span><span> wm\_infos=""
</span><span> if [ $num\_mon -gt 1 ] ; then
</span><span> wm\_infos="$wm\_infos %{F$COLOR\_INACTIVE\_MONITOR\_FG}%{B$COLOR\_INACTIVE\_MONITOR\_BG} ${name} %{B-}%{F-} "
</span><span> fi
</span><span> ;;
</span><span> O*)
</span><span> # focused occupied desktop
</span><span> wm\_infos="$wm\_infos%{F$COLOR\_FOCUSED\_OCCUPIED\_FG}%{B$COLOR\_FOCUSED\_OCCUPIED\_BG}%{U$COLOR\_FOREGROUND}%{+u} ${desktop\_num}. ${name} %{-u}%{B-}%{F-}"
</span><span> desktop\_num=$((desktop\_num + 1))
</span><span> ;;
</span><span> F*)
</span><span> # focused free desktop
</span><span> wm\_infos="$wm\_infos%{F$COLOR\_FOCUSED\_FREE\_FG}%{B$COLOR\_FOCUSED\_FREE\_BG}%{U$COLOR\_FOREGROUND}%{+u} ${desktop\_num}. ${name} %{-u}%{B-}%{F-}"
</span><span> desktop\_num=$((desktop\_num + 1))
</span><span> ;;
</span><span> U*)
</span><span> # focused urgent desktop
</span><span> wm\_infos="$wm\_infos%{F$COLOR\_FOCUSED\_URGENT\_FG}%{B$COLOR\_FOCUSED\_URGENT\_BG}%{U$COLOR\_FOREGROUND}%{+u} ${desktop\_num}. ${name} %{-u}%{B-}%{F-}"
</span><span> desktop\_num=$((desktop\_num + 1))
</span><span> ;;
</span><span> o*)
</span><span> # occupied desktop
</span><span> wm\_infos="$wm\_infos%{F$COLOR\_OCCUPIED\_FG}%{B$COLOR\_OCCUPIED\_BG} ${desktop\_num}. ${name} %{B-}%{F-}"
</span><span> desktop\_num=$((desktop\_num + 1))
</span><span> ;;
</span><span> f*)
</span><span> # free desktop
</span><span> wm\_infos="$wm\_infos%{F$COLOR\_FREE\_FG}%{B$COLOR\_FREE\_BG} ${desktop\_num}. ${name} %{B-}%{F-}"
</span><span> desktop\_num=$((desktop\_num + 1))
</span><span> ;;
</span><span> u*)
</span><span> # urgent desktop
</span><span> wm\_infos="$wm\_infos%{F$COLOR\_URGENT\_FG}%{B$COLOR\_URGENT\_BG} ${desktop\_num}. ${name} %{B-}%{F-}"
</span><span> desktop\_num=$((desktop\_num + 1))
</span><span> ;;
</span><span> L*)
</span><span> # layout
</span><span> wm\_infos="$wm\_infos %{F$COLOR\_LAYOUT\_FG}%{B$COLOR\_LAYOUT\_BG} ${name} %{B-}%{F-}"
</span><span> ;;
</span><span> esac
</span><span> shift
</span><span> wm\_info\_array[cur\_mon]="$wm\_infos"
</span><span> done
</span><span> ;;
</span><span> esac
</span><span>
</span><span> if [ $num\_mon -eq 1 ]; then
</span><span> fmt="%{l}${wm\_info\_array[0]}%{c}${title}%{r}${percent} ${date}"
</span><span> elif [ $num\_mon -eq 2 ]; then
</span><span> fmt="%{l}${wm\_info\_array[0]}%{c}${title}%{S+}%{l}${wm\_info\_array[1]}%{r}${percent} ${date}"
</span><span> else
</span><span> # Same as 2 -- needs someone to test
</span><span> fmt="%{l}${wm\_info\_array[0]}%{c}${title}%{S+}%{l}${wm\_info\_array[1]}%{r}${percent} ${date}"
</span><span> fi
</span><span>
</span><span> printf "%s\n" "$fmt"
</span><span> done
</span><span>}
</span><span>
</span><span># Actually invoking the panel and piping to bar
</span><span>
</span><span>panel\_bar | bar -g x$PANEL\_HEIGHT -f "$PANEL\_FONT\_FAMILY" -F "$COLOR\_FOREGROUND" -B "$COLOR\_BACKGROUND" &
</span><span>
</span><span># Hostname tweaks, including forcing stalonetray into a reasonable place, and
</span><span># starting the battery monitor on my laptop
</span><span>
</span><span>HOSTNAME=`hostname`
</span><span>
</span><span># Echelon dual monitor, tray should be upper right corner of left monitor
</span><span>
</span><span>if [ $HOSTNAME == "echelon" ]; then
</span><span> TRAY\_GEOM="1x1-1920"
</span><span>
</span><span># Toadite single monitor, avoid date and battery
</span><span>
</span><span>elif [ $HOSTNAME == "toadite" ]; then
</span><span> bat\_percent > "$PANEL\_FIFO" &
</span><span> TRAY\_GEOM="1x1-100"
</span><span>
</span><span># Good for single monitor, just about enough room to avoid the date output
</span><span>
</span><span>else
</span><span> TRAY\_GEOM="1x1-75"
</span><span>fi
</span><span>
</span><span>stalonetray --geometry $TRAY\_GEOM -i $PANEL\_HEIGHT -bg "#34322e" --grow-gravity NE --kludges force\_icons\_size &
</span><span>
</span><span>wait
</span><span>
</span></code></pre>
<p>I can't really explain any better than the comments, but I think I'm using a decent setup that will allow for future additions to the panel pretty easily just by mimicking the date and battery status functions and their invocations.</p>
<h3 id="monitor-binds">Monitor Binds</h3>
<p>I simply added this to my <code>sxhkdrc</code></p>
<pre style="background-color:#2b303b;color:#c0c5ce;"><code><span>
</span><span>super + {q,w}
</span><span> bspc monitor -f {L,R}
</span><span>
</span><span>super + {shift,alt} + {q,w}
</span><span> bspc {window,desktop} -m {L,R}
</span><span>
</span></code></pre>
<p>This follows the Xmonad convention, where Q and W represent left and right monitors respectively, so <code>super + q</code> focuses the left monitor, <code>super + w</code> the right monitor. If I had three monitors, I would use QWE for Left, Center, Right.</p>
<p>The second set of binds sets up <code>super + shift + q/w</code> to send windows to a specific monitor's desktop, and <code>super + alt + q/w</code> to shift an entire desktop to another monitor. I find bspwm's desktop focus to be a bit wonky with multiple monitors (focusing a desktop will focus it on whatever monitor it's associated with, rather than the current monitor), but I still only rarely have to shift desktops between monitors.</p>
<p>In order for these binds to work correctly on multiple hosts, in <code>bspwmrc</code> I added this block to rename my monitors consistently across machines.</p>
<pre style="background-color:#2b303b;color:#c0c5ce;"><code><span>
</span><span>HOSTNAME=`hostname`
</span><span>
</span><span>if [ $HOSTNAME == "echelon" ]; then
</span><span> bspc monitor HDMI-0 -n R
</span><span> bspc monitor DVI-I-1 -n L
</span><span> bspc monitor R -s L
</span><span> bspc monitor L -d ""
</span><span> bspc monitor R -d ""
</span><span>elif [ $HOSTNAME == "toadite" ]; then
</span><span> bspc monitor LVDS-0 -n L
</span><span> bspc monitor L -d ""
</span><span>fi
</span><span>
</span></code></pre>
<p>This also clears the desktops, down to a single unnamed desktop on each monitor.</p>
<h3 id="download">Download</h3>
<p>You can grab my config files <a href="http://codezen.org/static/bspwm-config.tar.gz">here</a>.</p>
<p>This includes everything you should need to run bspwm with my config. It untars such that the bspwm-config directory is like your HOME, so the config files are in .config, and won't be visible by default.</p>
<p>The only caveat is that you'll need to put the bin files in your $PATH someplace. Like the example config, it also expects that you have <code>xtitle</code> and <code>bar-ain't-recursive</code> installed.</p>
<p>If I end up making any more significant changes, I'll consider putting this up on my Github, but for now I'm pretty content with my setup and don't feel the need to version control it.</p>
On "Use of Weapons"2015-02-03T04:37:35+00:002015-02-03T04:37:35+00:00Unknownhttps://blog.codezen.org/posts/on-use-of-weapons/<p>I have been positively binging on Iain M. Banks' Culture series. I actually wrote about <a href="http://blog.codezen.org/2014/10/01/on-consider-phlebas/">Consider Phlebas</a>, the first book in the series, a few months ago. Since then, I read <em>The Player of Games</em> and now I just completed <em>Use of Weapons</em>.</p>
<p>Spoilers ahead, of course.</p>
<p>First, let me give Banks a posthumous "I see what you did there." The novel makes a point. The title is apt. Zakalwe (which I'll use by convention to refer to the main character) is a great commander and master manipulator, perhaps the ultimate weapon himself. The book did a good job of conveying how he became so tortured, mercenary and ambivalent even while maintaining his drive for redemption.</p>
<p>I also appreciate that the book was very ambitious in its structure, with the reverse chronology of the historical storyline. I found this to be initially extremely confusing, but only because I think confusion is inherent in the execution of such a structure, rather than Banks' execution being flawed. That said, I don't think the unconventional structure helped tell the story effectively. Chapters of the book were sort of shoehorned so that the "twist" could occur on the final page of the work proper, but it left a lot of the flashback chapters deliberately vague, and - on first reading - utterly boring or nonsensical. I understand now, in retrospect, how these chapters related to the theme but as I was reading, and under the impression that Zakalwe was Cheradenine and not Elethiomel, they seemed to drag on and hang there, disconnected from the overall narrative.</p>
<p>For example, let's dissect Zakalwe's chair-phobia. There are three distinct interpretations of it, that develop as you read.</p>
<p>The first reasoning you find is that Zakalwe discovered Elethiomel having sex with Darckense in a chair in the summer house. This barely makes sense with the amount of fear of chairs Zakalwe shows, especially since it's consensual sex and Zakalwe did nothing to stop them. It makes Zakalwe destroying the summer house seem like some gross over-reaction. This interpretation also makes the Chairmaker Darckense, which makes Zakalwe's obsession with the Chairmaker seem a bit half-baked.</p>
<p>The second reasoning, that emerges in the last few chapters, is that Elethiomel made a chair out of Darckense's bones. That definitely backs up the averse reaction to chairs. It also changes the motive for the summer house destruction to being reminded of the incident, a personal betrayal, as Major Zakalwe (Cheradenine pre-bone-chair) fights a war against Elethiomel, the Chairmaker, who we now know explicitly is the enemy they're fighting.</p>
<p>The final reasoning, that drops with the last page of the book proper, is the Zakalwe is Elethiomel and not Cheradenine, Major Zakalwe's (Cheradenine's) actions are not those of the main character, and Zakalwe fears chairs because it's a reminder of what <em>he</em> did to Darckense. Zakalwe is the Chairmaker.</p>
<p>Now, giving credit where credit is due, it's a feat that the novel has three retroactive explanations of a single trait. However, the first explanation, that stood for 75% of the book, was poor - mostly because it's really hard to justify an otherwise normal person having a terrible fear of chairs, and an obsession with his sister, the supposed Chairmaker. It seems clear that Banks designed the scene around the chair to put this interpretation forth (chair sex, plus filling us in on who made the chair which was irrelevant to the other two interpretations), so it's just a kind of lame placeholder for the real reason that comes later.</p>
<p>Banks relates sex and war (a common theme in literature and music) so you could also view the summer house scene as a foreshadowing of Elethiomel's violence against Darckense and the presence of chairs, but in the same chapter in which sex and war are related, nothing bad happens to Shias Engin (the woman that Zakalwe nee Elethiomel has sex with), so you could be forgiven for not jumping to conclusions when trying to determine whether that's just a fanciful metaphor or a hint 100 pages later.</p>
<p>Another side-effect of this story-telling mechanism that I thoroughly disliked is just how many characters are introduced only to be forgotten. When you're warping around time and space, it's hard to give any characters a solid conclusion, much less minor ones added for exposition's sake. The focus is clearly on Zakalwe and his humanity, his inhumanity, his struggle and how that relates to the Culture's use of Zakalwe (war) to achieve its goals. Unfortunately, that focus is all consuming and the other plotlines are discarded entirely. Compared to the previous two Culture novels, in which the geo-political situation was clarified and almost every named character has an end, this was a disappointing departure. We never know the outcome of any number of Zakalwe's exploits, even the one that was an integral part in his present-day storyline. I would have enjoyed more of Zakalwe's back story if the vignettes had been more than just ways to advance information about how they had fucked with his mindset - even if having other meaningful outcomes is contrary to the overall message of bleak moral quandary.</p>
<p>Intellectually, I think I grasp the novel and why he made these choices I disagree with... and yet, as someone that reads for entertainment I have to ask "At what cost?" The narrative was tortured by the structure, and I believe that a better work could have been formulated from the bones of this story and a more conventional approach. <em>Use of Weapons</em> is not, by any stretch of the imagination, a <em>bad</em> book. Ambitious, yes. Flawed, maybe, but not bad. It's hard to call it one-dimensional, but the description feels right. If not one-dimensional then perhaps fatally focused on getting across its heavy message.</p>
On Sons of Anarchy2014-12-11T00:59:47+00:002014-12-11T00:59:47+00:00Unknownhttps://blog.codezen.org/posts/on-sons-of-anarchy/<p>I'm not a huge fan of Sons of Anarchy. I got pulled into it with the young gangster conflicted about the violent life he was born into, trying to move on and make an exit, go legit. While the series was focused around that, it was good. Plenty of crime, violence, drama and internal conflict to spend 45 minutes watching it and be entertained. It effectively jumped the shark when Jax took over the club, and his plans to leave the life of crime ended (which was around the end of season 4).</p>
<p>From there, it's decline wasn't precipitous, but it was steady. Harold Perrineau was interesting and turned in a great performance as Damon Pope, the Lawful Evil businessman and it was great to watch Jax frame Clay for Damon's murder, effectively killing two birds with one stone. Yet the die had been cast, and President Jax was never as strong a character as VP Jax under Clay. Jax failed to extricate the club from crime. Tara began to accept her criminal life, went to jail and became a copy of Gemma who by season 5 was intolerable to watch. Even in a crazy season 6, the lure of getting the kids out of Charming is enough to drive the plot and convince Tara and Jax to betray the club and serve a jail sentence just to break the cycle.</p>
<p>But this season... this season was terrible.</p>
<p>The first problem is that a lot of characters we were invested in are dead before the season even starts. The Jax - Tara dynamic is gone (she's dead). The Jax - Clay dynamic is gone (he's dead). Opie is dead. Juice is discredited. Eli, who was an excellent foil for Jax, is dead. Gemma has already long since become evil. The rest of SAMCRO have become paper cutouts.</p>
<p>The second problem is that Jax apparently has no brain. He burns everyone around him without any proof. He burns Lin, which burns Marks, and burns the Indian Hills charter with nothing but a whisper from Gemma. His mother, yes, but also someone that he knows isn't trustworthy from the get go (anyone else remember Jax convincing Gemma to backstab Clay <em>after</em> she got high and nearly killed the boys in a car crash?).</p>
<p>And honestly, trustworthiness aside, how could you <em>not</em> suspect Gemma being the murderer? She was there and saw "an asian guy" escape. Jax is aware of Tara's plans at the time of her death and knew that Gemma would have a problem with Tara leaving with the kids. Gemma actively encouraged Jax to kill Clay (and is in general a bad bitch), so it's not like murder is somehow out of bounds for her. How does this not instantly cause suspicion in Jax? Well, he's lost quite a few brain cells this season, apparently.</p>
<p>Even if you choose to believe that Jax's loyalty would prevent him from suspecting his own mother killed his wife, why then blow up your whole world to exact vengeance on an a random asian guy without a shred of proof? Sure, Jax can't go to Lin and ask politely if he had Tara killed, but he could definitely tap his police contacts (Unser, Patterson, Jarry - and speaking of tapping, Chibbs' relationship with Jarry is unbelievably dumb) and find out, surprise, that guy was in a Vegas drunk tank, off the official record. He probably could have found this out if he'd taken the time to listen to the asian guy before brutally murdering him too, but I can understand why you wouldn't want the distraction of talking in the middle of your ritual killing (I read that in an etiquette book once). The point is, this information isn't exactly top secret and there are probably a lot of other ways you could debunk Gemma's assertion without going to the Chinese, at which point it either becomes obvious that Gemma is the murderer, or that you at least need to spend more time to find out who is.</p>
<p>I want to make one more thing clear, as a lot of internet comments seem to be under the impression that all of this poor reasoning is due to Jax being destroyed by Tara's death and that vengeance doesn't have to be rational. I'd buy that, if it weren't for the fact that Jax's revenge takes the form of a plot to destroy Lin in retaliation. Plans that are laid out and executed over weeks and months, it's not like Jax rolled out with a shotgun bent on revenge the night he found out Tara was dead. You can't excuse shitty writing with blind vengeance. As it stands, Jax could apparently spend a huge amount of time and effort planning his revenge, put his life and the lives of his crew on the line, but not spend a 20 minute phone call to his police contacts, or some discreet inquiries on the street about whether his revenge made sense. Where is the cunning gangster that required proof of Clay's misdeeds and then so perfectly orchestrated his downfall?</p>
<p>Beginning season 7, everyone knew that the season would hinge on how Jax dealt with the situation and he did poorly. It took more than half the season before Jax even questioned whether Gemma was full of shit. It took Abel overhearing Gemma saying something really dumb to Thomas for Jax to get it right. Seriously, who confesses a murder aloud, in a house full of people, to a toddler? It could've been anyone at that door. Wendy, Jax, a club member. At least Gemma started the show as a dumb spiteful bitch so she didn't have to fall very far for her part in this season.</p>
<p>Which brings me to the finale itself. On the heels of Jax killing Gemma, Unser and indirectly Juice in what probably should have been the first 45 minutes of the finale instead of an independent episode, Jax basically spends all episode abandoning his club, abandoning his children to an ex-gangster and his ex-junkie ex-wife, and throwing his life away for no good reason. The writers desperately tried to shoehorn in some Christ imagery and Shakespeare to fool you into thinking the story has depth, but SOA's finale was DOA.</p>
<p>Okay, okay, so maybe in the process of realizing that he's gotten a lot of people killed and imprisoned pursuing vengeance on the wrong people he's decided that he can't be allowed to live. Somehow, he believes emulating his father's murder makes some sort of point (what point? I have no idea). Yet, how would Jax's life be different if he'd actually been raised by a father? How would the MC be different if JT was still in charge? When Jax destroys his own notes and his father's notes, it's because he doesn't want his children to follow in his footsteps, but he fails to realize that children need good parents more than they need to be insulated from the evils of the past. Jax could be so much more effective if he actually manned up and raised those kids as a loving father. Everyone knew that Jax was going to die in the finale. It's a cliche at this point. A trope. I just find it hard to believe that this hardcore gangster did it to <em>himself</em>. Then again, if I lost 50 points of IQ over the course of an off-season I might off myself too.</p>
<p>The only redeeming feature of Jax in this episode is his murdering Barosky and Marks and killing some of the Irish to set things right. But these are almost entirely independent to the rest of the plot. He walks away from both murders. At this point, a highly connected top level gangster like Jax could just make a bid to disappear. He could go to Nero's farm with his kids. He could do anything yet he's only apprehended when he, like a moron, decides to talk to his dead dad's marker on the side of the road. That's right, a suicidal gangster talks regrettingly to his murdered gangster dad and yet fails to realize that maybe he should allow Abel and Thomas to avoid the same situation by being there instead of being another stop on the Teller Highway Death Tour. I was disappointed with this bridge from Jax's vigilante justice. If it was more intense, in perilous flight from the police, trying to reach a safehouse and eventually the boys I would have felt for him and felt that he was still attempting to honor that initial impulse from way back in season 1. Instead, it's a flaccid and utterly baffling mirror of his dad's accident, starting from it's endpoint (oooh, symbolism).</p>
<p>The final scene is a weak "car chase" that's really just a 30 mile an hour police funeral procession, some really terrible CG crows, and Jax decides to give the grill of an oncoming semi an up close inspection. What. The. Fuck.</p>
<p>To summarize, Jax finally puts someone else in charge of the MC, escapes club justice, tidies up the loose criminal ends, escapes real justice only to allow himself to be caught so... he can have witnesses to his suicide? If he didn't decide to kill himself in the most terrifying painful way possible he could've gotten away with it and moved on with his life. No such luck.</p>
<p>I hated this season and this episode was garbage.</p>
<p>My only consolation is that SOA won't be back and I don't have to hear one more fucking awful Katey Sagal cover, or another butchering of Queen or Nirvana set to slo-mo shots of random gangster shit.</p>
On 'Consider Phlebas'2014-10-02T04:23:51+00:002014-10-02T04:23:51+00:00Unknownhttps://blog.codezen.org/posts/on-consider-phlebas/<p>I've read my fair share of science fiction. I wouldn't consider myself an expert, but when it comes to sci-fi (and most fiction for that matter) I've realized there are two major components. There are the <em>ideas</em> and the <em>execution</em> of them.</p>
<p>For example, Asimov was prolific and his stories were very good, but Asimov was an <em>ideas</em> kind of guy. His plots in <em>The Foundation</em> series, and the Lije Bailey stories in the <em>Robot</em> series were interesting because he envisioned a world that was quite different than ours and intricate enough to hang a good plot on, but when it comes down to it, the man wrote functionally. He conveyed his meaning, and you are interested in that meaning, but in the end I would characterize his style as austere. Very imaginative, but very plainly executed. Dry, even.</p>
<p>There are many titans of science fiction that are similar. In fact, I'd say that if you have great ideas and write sci-fi, it's really not a burden to be lacking in prose. Herbert's <em>Dune</em>, Orwell's <em>1984</em>, Bradbury's <em>Fahrenheit 451</em>. It's not that they're poorly written, it's that they're classics because of their ideas, or their satire rather than their language.</p>
<p>And of course that's not to mention the raft of... lesser works out there. The works of Crichton, for example. <em>Jurassic Park</em> is a classic, but I'd put that more on Spielberg than Crichton. Crichton's work in <em>Congo</em> and <em>Sphere</em> are fun reads, but nothing to write a thesis on. <em>Timeline</em> read like it was a screenplay-in-waiting. Fantasy, which is so often lumped in with sci-fi (and there <em>is</em> a blurry line in between) is rife with successful authors trading on ideas rather than execution. George R. R. Martin's books are well conceived, but you read them to find out what happens next and not for the pleasure of reading them. Tolkien, who is the grandfather of all modern High Fantasy, is one of the worst offenders in this regard but he was a master of epic mythology and linguistics more than an author.</p>
<p>I bring these instances up not to shame these authors, in fact I'm a fan of all of them, but to note just how rare it is to find a really great author outside of "literary fiction" that trades in not just ideas, but also in writing that packs a punch and doesn't shy away from being stylistic.</p>
<p>When I cracked <em>Consider Phlebas</em>, first of Iain M. Banks' <em>Culture</em> novels, I admit it was with trepidation. The term "space opera" gets thrown around a lot in a pejorative light and, quite frankly, I'm not really one to dig novels that are basically episodes of Star Trek or rehashes of Star Wars. I imagined that it would be yet another band of heroes fighting against an evil galactic empire, or some opposing alien (<strong>yawn</strong>) force. In the first chapter, trying to absorb the names alone made me fear that I'd started reading <em>The Lord of the Rings in Space</em>.</p>
<p><strong>But I couldn't have been more wrong.</strong>
<em>Consider Phlebas</em> has everything. A compelling plot, believable relationships, well thought out action, clever (but not trite) dialogue, fantastic locations, realistic tech, vast scale, suspense, surprise, philosophy. I could go on. The best part of it is that Banks' style rings clear and true from the first page to the last.</p>
<p>It's been a long time since a novel has been able to really get me to picture each scene like <em>Consider Phlebas</em> did. The writing was never awkward, never confusing and yet extremely evocative. Amazingly, this includes feats like describing life on a massive Orbital that's inherently beyond the sort of day-to-day experience we have in the 21st century. And it's not just describing its shape or dimension or the people on it well, it's making you feel like it's a real place. That the people that live there are three dimensional and not just background noise of some boring plot point.</p>
<p>It's similar with the technology, where Banks really went above and beyond. A lot of really great work (like Gibson's <em>Neuromancer</em>, another of my stylistic favorites) benefits from the fact that it takes place in the near future. Things are different, but also the same. Banks had no such help, and yet even when detailing things that are literally only in the realm of sci-fi it has that tinge of truth behind it that lets your brain accept that such a thing is not only possible, but even likely. At one stage, he spent a few paragraphs describing just what it would look like looking out of the window of a spacecraft in hyperspace. It's well trod ground between Star Wars' hyperspace (all the stars turn into lines!) and Star Trek's warp speed (the ship disappears into a point!) and likely touched on every single "space opera" between here and Jules Verne. And yet, Banks didn't just cop out with a single sentence ("They went to hyperspace and all the stars turned into lines!"), he crafted a beautiful scene and included details of what would be seen, and how it relates to real space and celestial landmarks.</p>
<p>The final point I'll mention in what should hopefully read as a ringing endorsement of <em>Consider Phlebas</em> is that between all of the wonderful metaphors and descriptive language, there is a lot of action and it is all well written. So often in text the excitement is dulled by awkward phrasing or poorly paced or ordered action sequences so I was pleased to find that even in the midst of battle I was able to easily follow what was going on without getting confused and having to re-read or getting bored with minutiae. The whole book flowed from static scene to dynamic battle and back again without skipping a beat.</p>
<p>If I had to register one complaint about the book it would be that it was too short, but even that criticism would only be a joke to underscore how much I enjoyed it.</p>
<p>If you're a sci-fi reader, like me, that appreciates a little more weight in your worlds then you owe it to yourself to give <em>Consider Phlebas</em> a read. It is a masterpiece.</p>
More D3 - The Fanbase from Hell2014-08-29T18:23:01+00:002014-08-29T18:23:01+00:00Unknownhttps://blog.codezen.org/posts/more-d3-the-fanbase-from-hell/<p>I really didn't intend for this blog to be entirely based on gaming, but considering I keep most of my software updates <a href="http://codezen.org/canto-ng/news/">here</a>, and most of my work and life private, that's what it's turned in to.</p>
<p><strong>Diablo 3 fans suck.</strong></p>
<p>There, I said it.</p>
<p>2.1 came out on Tuesday with the usual myriad of buffs and nerfs and new mechanics, etc. Chief among them, in my mind, is the introduction of "seasons" which is basically a ladder system with a leaderboard, some exclusive items and achievements.</p>
<p>Once again, a major patch has been released and a significant part of the Diablo community is totally butt hurt.</p>
<p>The Blizzard forums, and the comment sections for their releases are just a complete clusterfuck, so let me hash a few things out for such luminaries as <a href="http://us.battle.net/d3/en/profile/cremdelacrem-1654/hero/19084211">cremdelacrem</a> for his brilliant comments on the <a href="http://us.battle.net/d3/en/blog/15198713/patch-210-preview-seasons-8-15-2014">2.1 Season Preview</a>.</p>
<p>[toc]</p>
<h3 id="1-d3-ain-t-d2">1. D3 ain't D2</h3>
<p>This ship has sailed, folks. D3 was not, is not, and will never be D2. You will never have skillpoints and attributes to allocate, you're never going to have chat spam trading, you're not going to be fifteen again and you'll never be able to wile away summer nights doing Mephisto runs while your mom interrupts you with the laundry. It's time to get over it.</p>
<p>This game is different. It's streamlined, and I say this as a hardcore D2 and D3 fan, I'm cool with it. Yes, I have nostalgic thoughts for D2 sometimes. I wish they'd delivered on PvP. I remember trying to turn a dime into a dollar on [Trade], but Blizzard controls Diablo and they decided none of that was worth it. PvP means class competitive balance which is a total nightmare with all of the possible builds, especially when even in D2 it was pointless and achieved nothing. Trading got removed for the same reason the (RM)AH was a thing: the corrupting influence of botters and auction sites. It's hard to argue now that it's easy to self-find upgrades that we'd be better off with it even if it would make compiling sets and niche legendaries easier.</p>
<p>It's easy to think of D2 with rose colored glasses, but I remember a lot of it being a tedious bore punctuated with finding a good item. It's not possible to argue that killing Mephisto or Baal ten million times to find a Windforce is <em>more</em> fun than running a random dungeon filled with random monsters and a random boss, on a selected difficulty. Blizzard has chosen its direction with the franchise and it's focused on the one core, inviolable tenet of Diablo:</p>
<h3 id="2-diablo-is-a-fighting-game">2. Diablo is a <strong>fighting</strong> game</h3>
<p>This isn't a trading game, it isn't a slot machine, or a hoarder simulator, or even really a classical RPG for that matter (ugh the story is still awful). D3 is a fucking fighting game. The core mechanic of Diablo is <em>fighting</em>, finding better shit to <em>fight harder</em>. That's it, and D3 accomplishes this handily. There are many ways to fight, many places to fight, many enemies to fight, but Diablo, at its heart is a fighting game. In a fighting game, you fight. You fight until you get bored of fighting, and then you stop and play something else. Nobody is forcing you to grind. Yes, there are lots of super rare items, but you don't have to find them. There are unabashed grinds like the Infernal Machine rewards, but nobody's forcing you to do those either. I've had fun with D3 since launch and I've never once crafted a Hellfire anything because fuck it, that's not fun for me.</p>
<p>Yet all I read is bitching about grinding and PvP and "who wants to play seasons, you lose all ur shit!" and "DHs are too strong" and "my class sucks!" and "waah, they nerfed my set!"</p>
<p>Which brings me to my next point:</p>
<h3 id="3-blizzard-doesn-t-owe-you-shit">3. Blizzard doesn't owe you <strong>shit</strong></h3>
<p>All of this reads to me like spoiled children. Keeping in mind that this is a <strong>fighting game</strong>, the logic for you to play D3 should look something like this:</p>
<pre style="background-color:#2b303b;color:#c0c5ce;"><code><span>
</span><span>if self.enjoy(D3.fighting) then
</span><span> self.play(D3)
</span><span>else
</span><span> self.play(self.fallback\_game)
</span><span>
</span></code></pre>
<p>It shouldn't look like:</p>
<pre style="background-color:#2b303b;color:#c0c5ce;"><code><span>
</span><span>while not self.has\_item("Leoric's Regret"):
</span><span> self.grind(D3)
</span><span>
</span></code></pre>
<p>Look, if you don't want to grind the answer is simple: <strong>don't</strong>. I find it funny that our friend cremdelacrem is paragon level 400+. Considering most of his criticisms were just as valid day one, it's interesting that someone so vehemently against D3 has probably dumped more than 1000 hours into it. If you're not having fun then <strong>stop</strong>. Or level the other classes that you <em>still</em> haven't touched. Or try manning up to play hardcore.</p>
<p>There is no out of game reward for this shit. You fight, you find better stuff, you fight harder. In short, <strong>you play D3 to get better at playing D3</strong>. This is especially true now that the RMAH failed. None of this translates into the real world. You're not going to get a job based on your paragon levels. It doesn't teach you anything. It doesn't make you think. You don't win anything for being first or best or toughest.</p>
<p>This is why I find this community so frustrating. Any amount of difficulty, any amount of grind is fine, as long as it's not mandatory. Hellfire jewelry, putting together ultra-rare sets, finding all the gear for your niche build - these are all tasks that take a lot of time but aren't necessary to enjoy the base game. You can beat the whole campaign, you can Rift and Grift, do bounties, and find great items all without grinding.</p>
<p>For example, I've played on an off since launch (and more on since the 2.0 patch and RoS made everything so much better). I've easily put a 1000 hours into the game, probably half on Softcore and half on Hardcore (I'm P90 SC, P75 HC or so). The character that I created day one, my softcore main, is facerolling Torment III solo and doing Torment IV in pubs. I'm not bragging, and if you've ever been in a game with a P600 you'll know this. My point is that he's still not endgame. He's still not being limited by gear such that I'm trying to get vanishingly rare legendary items, or that I need a Hellfire Whatever to progress to the higher difficulty and this is with more hours of play time on this character than I've put into some other <strong>entire games <em>total</em></strong>.</p>
<p>Here's the rub. It's <strong>bullshit</strong> that the Diablo community will complain about the grind and in the same breath demand a practically never ending endgame. You can throw weeks of your life into this game before you have to grind to get better, and after that point Blizzard has provided us with ways to keep improving even when our gear is basically perfect. They have stretched this game as far as they can without entering the realm of the absurd.</p>
<p>So next time you think about complaining about drop rates, or grinding, remind yourself that it's just a game and there are ten thousand others you haven't played. If you're not having fun, then stop and play one of them. Making <em>optional</em> endgame stuff easier to get defeats the purpose and after getting thousands of hours of play for a game you paid (at <em>most</em>) $120 for, Blizzard <strong>doesn't owe you shit</strong>.</p>
Diablo Revisited2014-03-01T22:00:23+00:002014-03-01T22:00:23+00:00Unknownhttps://blog.codezen.org/posts/diablo-revisited/<p>I last talked about Diablo 3 <a href="http://blog.codezen.org/2012/07/10/on-diablo/">here</a>.</p>
<p>In short, it was a disappointment. I particularly lamented the lack of social features, because without the ability to compete or show off, or even the incentive to team up due to lack of coordination, the end game becomes a grind for items that will let you grind for items faster. I also briefly mentioned the poor itemization, and the fact that the auction house robbed the game of the rewarding feeling of finding upgrades.</p>
<p>This Tuesday, Blizzard released patch 2.0.1 for the game and it's a great return to form for Diablo. It introduces a modicum of social features - clans and communities and, more importantly to the actual game, completely revamps the loot and difficulty systems.</p>
<h3 id="social">Social</h3>
<p>The social features are surprisingly effective despite being minimal. They've added clans with up to 120 tagged members, and communities with indefinite members both do wonders. Both of these amount to adding channels to the chat window. I've joined the <a href="http://reddit.com/r/diablo">/r/diablo</a> 'reddit' and 'redditHC' communities and it's amazing how just seeing the same names show up in chat makes you feel like you're part of a group. I haven't joined a clan (not my style), but even through the community chats there are a lot of people looking for groups. I do still miss the D2 style lobby with all of the characters lined up at the bottom, but I'll take the communities as a good start.</p>
<p>There are also rumors of a D3 ladder with the expansion, which would be excellent, but I'm counting those as unconfirmed.</p>
<h3 id="loot">Loot</h3>
<p>The more important thing is that they fixed loot. With the AH shutting down, it's important that characters be able to support themselves. Find upgrades, find legendaries that work for them without converting them into gold on the AH. I've played some hours on the new patch and I've already found more legendaries than I had in ~250 hours before the patch, and most of them (but not all) have been upgrades for my current character. <strong>It's <em>so</em> nice to play Diablo without the AH meta-game. This patch has fundamentally fixed the core incentive - to find cool shit</strong>.</p>
<h3 id="difficulty">Difficulty</h3>
<p>I was surprised to see that they removed the D2 style Normal/Nightmare/Hell/Inferno difficulties. Everything is now dynamically scaled to your level and your difficulty setting measures how much harder than that baseline the game becomes. Just like with the pre-patch Monster Power system, you get bonuses to XP/magic find the higher your difficulty.</p>
<p>I can't overstate how much smoother this makes the game. I've started a handful of characters since Tuesday, and it's fun <em>immediately</em>. Even in D2 the first playthrough (Normal difficulty) was mind numbingly easy and it wasn't until you hit Nightmare or Hell that you really had to sweat it. With the new system, you can set the difficulty to maximum (Torment VI) from level 1. Suddenly leveling isn't a mindless chore and you can level quickly based on your skill and the items you have prepped for you character. For example, my hardcore Wizard playing on "Master" difficulty (made easier by having gems and gold from my level 60 Demon Hunter) is already level 20 and just beat the Skeleton King. Before the patch, characters beating the Skeleton King were, at most, level 9 or so. Sure, it's probably taken me twice as long, but I've been challenged and I've had <em>fun</em> instead of breezing through it. It also means that you don't have to play the game three or four times all the way through to get to the endgame content. I can easily see my Wizard being 60 long before I face Diablo for the first time.</p>
<p>As a side effect, it does make hardcore a little less nerve-wracking by allowing you to start an easier game to progress the story. The next time I face Belial (the Act II boss), I'll start a game on "Normal" difficulty and breathe easy.</p>
<h3 id="trade-the-downside">Trade - The Downside</h3>
<p>I see a lot of bitching on the Blizzard forums. What's new, right? People have complained about D3 since release and it's no surprise. However, a lot of the chatter I see now is complaining that trading is broken. It's true, legendary items are BoA (bind on account, so legendary items are tradeable to your other characters, but not between accounts except to other people in the game when it dropped and within two hours).</p>
<p>I am in agreement on this to some extent. In some ways, Blizzard is damned if they do, and damned if they don't. One of the primary reasons they implemented the AH in the first place was that trading in D2 was a pain in the ass. The RMAH (real money auction house) was implemented because in D2 there was a thriving and shady business trading dollars for in game items. By making both of these official, they brought the whole practice out into the sunlight and made it safe and easy. It was a good idea. Theoretically. In practice it was the reason the loot was so warped in the first place. If selling a legendary on the AH can net real money or gold then the most powerful items need to be tightly controlled to keep from flooding the market and thus keep supply low. You also want to encourage people to buy in to the AHs to keep demand high. Basic capitalism with a twist in that Blizzard finely controls the availability of the items.</p>
<p>Removing the AH removes the pressure to maintain that balance and has allowed them to fix the game. This also moves the real money item market back underground (like in D2) and into the hands of shady dealers. Currently, they've solved this problem with BoA legendaries. It's now literally impossible to transfer ownership of legendaries (except in the specific circumstances I mentioned before) and thus impossible to sell them out of game for real money.</p>
<p>The problem is that D2 trading was fun. It was time consuming, it was scammy, it was open to exploit from outside websites, but it was fun. I can see why a lot of people miss it. Honestly, I can't say that I miss it more than I missed getting decent loot, but to each their own. The core difference between D2 trading and the AH was that it was more a barter relationship. Even though Stones of Jordan became the defacto currency, you were mostly trading items and gems and runes that were mutually beneficial. There was also a huge amount of luck involved because the 'bidding' was limited to people in the trade channel at the time. This means that it was possible to make out like a bandit by taking advantage of people's specific needs or their ignorance of what an item was worth, or just the timeframe of the trade (i.e. what an item is worth at Tuesday 2AM when there's no demand, versus Friday at 10PM when everyone's just getting started on the weekend). The AH was so standardized and easy to use that there was never any ignorance of value, and the timeframe of a 'trade' could be days long. It just didn't have the same luck factor and thus lacked the same exhilaration of making a good (for you at least) trade.</p>
<p>I feel for Blizzard because they've failed to find a balance between these two extremes (totally regulated and totally unregulated) in the current patch. Personally, I believe they should return to the D2 model. Don't provide any assistance outside of making a trade channel and don't regulate anything. I understand their need to shutdown people making money from their work (fucking item farmers are the scum of the earth) and there is value in keeping people from getting scammed, but it worked in D2 for two reasons.</p>
<ul>
<li></li>
</ul>
<p>There was a natural barrier to buying items for money and that was having to go to an external site and trust them with your credit card. "Reputable" auction sites showed up, but for the people that just want to play the game and have fun, that's not on their radar. The only people wanting to spend money on digital items are idiots people that are desperate for an edge. It's sad, really.</p>
<ul>
<li></li>
</ul>
<p>In-game scamming is avoidable (sans patchable exploits). There were all manner of tricks to get people to commit to trades that were slanted against them. From the old trade window switcheroo to the just plain out bad trading done by the naive. That's life though. Some people are scammy bastards, some people aren't and it's a valuable skill to be alert and on your toes when dealing with other people.</p>
<p>Especially now that it's possible to play D3 with only found items (and thus there's no pressure to trade), a return to this laissez-faire policy makes a lot of sense.</p>
<h3 id="overall">Overall</h3>
<p>Overall the patch is a gigantic improvement to the core game. Loot feels good, playing is rewarded with juicy items frequently, and you spend no time on the AH (which will officially close on the 18th). The difficulty system is a great improvement to not just D3 but the franchise itself. The trading is a hopefully temporary setback but if Blizzard is insistent that nobody gets screwed trading then so be it. I'd rather have a fun fighting game with great loot you can't trade than a fighting game with shitty loot you have to trade to afford upgrades.</p>
<p>In some ways, I view the patch as a commitment from Blizzard to get the game right. You can see their thought process with the creation of D3 vanilla, and you can also see the thought process that went into this patch.</p>
<p>They created the AH for noble reasons and then designed the game around it. Coming from D2 it made perfect sense to absorb the underground market that grew up around the game and make everyone's lives safer and easier. It was controversial, but it was a bold choice to not just put out a clone. Two years later, the AH experiment has failed and Blizzard had the balls to not only remove it, but also to redesign the rest of the game's systems around the new AH free game.</p>
<p>The difficulty system was also taken directly from D2 (with the addition of the fourth difficulty, Inferno) but it was and always has been repetitive. First, they merged in Monster Power to layer dynamic difficulty on top of the set difficulty but that was clunky and still meant you had to play through the game four times. Now this patch has eschewed the set difficulty and gone entirely dynamic. You can see the evolution of D3's difficulty and how it incrementally improved on D2's.</p>
<p>It's funny because the AH and the difficulty settings were the two major places that D3 tried to learn or borrow from D2. Everything else, the skill system, the attribute system, the game mechanics, and the classes were all solid (eventually) and all original to D3. Even the enemies, items and locations were, for the most part original (barring the mandatory appearance of Tristram and Diablo and legendaries like Windforce). It's almost as if Blizzard designed the game with 2.0 in mind as a radical departure from D2 but then got cold feet and bolted on the AH trading, warped the loot table, and took D2's difficulty system wholesale to seem like it was a proper sequel instead of a similar game with Diablo in the title. Now that D3 is free of these, it's a much better game.</p>
<p>In some fantasy world, D3 borrowed D2's understated story and community PvP/ladder features instead of its repetitive difficulty scheme and 'fixing' its unregulated trading. That world has a perfect D3. But our world's D3 has now unlearned some of the bad lessons of D2 and become a much better game. Who's to say that D3 can't learn some new lessons along the way. After all, D2 had some really great features patched in years after release too (patch 1.10 brought skill synergies and uber-Diablo more than three years after release).</p>
<p>I never thought I'd say this after the vanilla game and taking more than a year off from the game, but I'm really looking forward to the expansion, Reaper of Souls, on the 25th. Its feature set is compelling, but only in the light of the new fixed game. In the meantime, I've got a few weeks to enjoy finding decent loot, playing D3 the way that two years of hindsight tells us it should have been at release.</p>
The Hall of Fame is Crap2014-01-09T01:49:56+00:002014-01-09T01:49:56+00:00Unknownhttps://blog.codezen.org/posts/the-hall-of-fame-is-crap/<p>I've mentioned before that this last season I really put my heart into baseball. True, adult fandom instead of the sort of child nostalgia of the Cardinals in the '90s. This offseason I tried to care about football and basketball and even the laughably elitist Winter Olympics but since those failed to create the same undefinable spark, here I am focused on the Baseball Hall of Fame which today inducted three new members, up from zero last year. Frank Thomas (of whom I was a fan), Greg Maddux, and Tom Glavine. All of them deserve to be recognized for being great baseball players.</p>
<p>But here's the thing. So does Barry Bonds. And so does Roger Clemens.</p>
<h2 id="the-problem-with-performance-enhancing-drugs">The Problem with Performance Enhancing Drugs</h2>
<p>They should be disqualified for steroids, right? After all, would Bonds have hit 73 homeruns in 2003 without bulking up on steroids? Would Roger Clemens get the Cy Young <em>seven</em> times between 1986 and 2004? Maybe not. It's undeniable that they were cheating and their stats got boosted by it. As such, I understand the impulse to punish them retroactively for it.</p>
<p>The problem is that you don't know who did what in any era of baseball. There are so many ways to increase your performance chemically and they've all been around since early in the 20th century. Anabolic steroids first crop up in sports in the 1950s, and in football by the '60s. Why is it inconceivable that baseball legends were also guilty in an age before drug testing? Roger Maris broke the homerun record too, right? Hank Aaron had more homers than anyone until a 'roided up Barry Bonds broke his record. Do we ignore the possibility they cheated because we didn't hear rumors about it? No managers and teammates testified against them for behavior that wasn't illegal by the letter of the law? Or was it because we never saw hitters show up with a suspicious amount of extra muscle one year? Certainly we have to acknowledge that it wasn't <em>impossible</em> in their day and age.</p>
<p>What about drugs for attentiveness and energy, like amphetamines? Bob Gibson and his ilk pitched <em>complete games</em> with razor sharp focus and a disconcerting intensity, how do we know that he wasn't dosing with uppers?</p>
<p>Now, to be clear, I'm not accusing any of these players. I don't believe that they did anything illegal or immoral, but the question is how would we know? Anabolic steroids weren't even illegal until 1990 and it was only then that the MLB made it clear that it was against policy. Random drug testing didn't start until <strong>2001</strong>, long after the problem came onto the radar.</p>
<p>There's very little <em>hard proof</em> the players used steroids outside of testimony of others. I can believe the testimony, but it's going to be necessarily incomplete. No one person knew every other person using PEDs and as such there are likely players that got away with using PEDs. They might not be Hall of Fame caliber players, but nonetheless their stats will be recorded in the Annals of Baseball without asterisks or footnotes.</p>
<p>In addition, how do we punish a player like Barry Bonds who had a hall of fame career for a decade <em>before</em> anyone accuses him of starting to use steroids? If we take the common wisdom that Bonds started juicing in 1999 and ignore his entire career from that season on, the man would still have 3 MVPs, 7 Gold Gloves, and 7 Silver Sluggers as well as league high records in a lot of stats like homeruns, RBIs, and OBP. He consistently put up 9 WAR seasons without PEDs. If he had been permanently injured after 1998 and never played baseball again, he would still be a hall of fame caliber player clocking in with a cumulative 95 WAR. So how do we classify him? Does his later steroid use wipe out his phenomenal playing before that? How do we take into account that he looked at McGwire and Sosa and suspected they were juicing and it went totally unpunished while they shattered the homerun record and made headlines across the country?</p>
<p>The bottom line is that we can't disqualify only PED seasons, we can't even be sure we know a comprehensive list of PED users since the beginning of baseball, and we can't even enumerate every possible PED and show that they were against the MLB drug policy. In fact, a lot of the drugs, like McGwire's Androstenedione <em>weren't</em>. This is why we have to take a more pragmatic approach and look at the stats and the stats alone. We can't base who gets to be enshrined in the Hall on what rumors the BBWAA believes and which it doesn't believe.</p>
<h2 id="stats-are-inherently-unfair">Stats are Inherently Unfair</h2>
<p>The argument against this, of course, is that PEDs boost these stats and could take a good player and make them great. This is true, but so can a lot of other changes to the game over the years. Science has revolutionized the game in legal ways as much as it has the world around it.</p>
<p>Babe Ruth didn't have a nutritionist. He didn't have a physical therapist and a personal trainer and video archives of pitchers and hitters to examine. The pitchers and hitters he faced didn't have those advantages either, but that doesn't make it an even exchange.</p>
<p>Sandy Koufax didn't have the advantage of modern medicines and surgeries that could have persuaded him to continue pitching instead of saving his arm.</p>
<p>Teams of yesterday didn't have the ability to scout every high school and college in the country, or import players from the Caribbean and Japan.</p>
<p>There's a generation of negro league players that never even got to have their stats recorded consistently and will consequently never have the numbers they should have.</p>
<p>Hall of Famers like Stan Musial, Joe Dimaggio, Yogi Berra, and Ted Williams lost seasons at a time to military service, how is that fair compared to the players that came before and after the war and didn't have seasons taken from them in their primes?</p>
<p>What about hitters in the dead ball era? And what about all the other equipment changes like sunglasses and batting helmets and pitching machines? And what about the "traditional" kind of cheating that doesn't show up on drug tests like corked bats or pitchers junking up the ball?</p>
<p>The fact is, it isn't fair. Stats don't tell the whole story. They don't account for the changes in the game, they don't account for better training, medicine, or equipment and they don't account for cheating in any form. Stats are already useless for comparing players of different eras in any truly meaningful way. You can say Ty Cobb was a better hitter than Ted Williams because of their lifetime batting averages but it's not true unless you couch it with 'in their own eras'. It certainly doesn't mean that Ty Cobb in his prime would've had nearly the same numbers facing teams that Williams did 20 years after he retired.</p>
<p>Because of this, I believe players like Clemens and Bonds should be inducted to the hall based on the strength of their numbers. No matter what, in their own eras, they were the best at what they did. Inducting them doesn't take away from the players of yesterday or from the players of tomorrow (that hopefully won't be juiced up) because they'll be competing against a whole new crop of talent with all new advances in science and medicine and changes to the game (like instant replay coming next season).</p>
<h2 id="the-popularity-contest-is-stupid">The Popularity Contest is Stupid</h2>
<p>The way the BBWAA votes on the Hall is absolutely ridiculous and divorced from stats. The Writers are likely to vote for players that, while good, aren't Hall of Fame material. This year Kevin Gurnick voted for one player out of a possible ten. Jack Morris. Now Morris isn't a bad pitcher but he's not a hall of famer. He accumulated 43 WAR over 18 seasons. He was an all star a few times, but never got a gold glove, Cy Young Award or an MVP.</p>
<p>Gurnick's reasoning, which is braindead, is that Morris didn't play in the steroid era. Fair enough, except that he played until 1994 which is well into the steroid era. Not to mention that the three automatic slam dunk inductees this year were all not connected to PED use whatsoever. I could understand not voting for Bonds or Clemens, but to not cast a single vote for anyone but Morris is a total joke. Gurnick was using his ballot as a political statement and that's a really fucking dumb reason to keep someone like Craig Biggio (who was two votes away) out of the Hall.</p>
<p>In addition, there are some players that are <strong>in</strong> the Hall for poor reasons too. Look at Bill Mazerowski. Had 8 Gold Gloves, but only accumulated 36 WAR over 17 seasons, averaging about 2 WAR a season. That's good, but not great. His lifetime batting average was a meager .260 and he never once led the league in anything of consequence. Certainly not enough to be in the Hall. The only reason he made it was that he got a Game 7 walk-off home run for the Pirates. That's all. One lucky at bat and a slightly above average career.</p>
<p>The point is that the writers that are in charge of the Hall aren't doing a good job. They're casting ballots against players in protest or for players that just don't belong when all the Hall should be concerned with his a player's accomplishments on the field, encapsulated nicely in their recorded stats.</p>
<h2 id="what-i-d-like-to-see">What I'd Like To See</h2>
<p>I'd like to see a milestone based Hall that is unconcerned with PEDs. It's not the Hall's duty to punish PED players on admittance, it's the MLB's duty to catch and punish them harshly enough that it's not worth it in the first place - which will hopefully be reflected in their stats. Reaching a particular milestone, like 3000 hits, 500 home runs, etc. is an automatic ticket to the Hall. This means players like Bonds, Clemens, and Pete Rose would be immediately inducted regardless of their conduct off the field.</p>
<p>I don't believe that it should be entirely objective either. If the Writers want to argue <em>for</em> a player, perhaps one with a value that's hard to quantify, they should be able to rally support for them despite not reaching any of the hard milestones. Yeah, maybe players like Mazerowski still get in for a single at bat, but I'd rather have some false positives than false negatives.</p>
<p>As for PEDs, I think the MLB should still attempt to keep players from using them with stricter testing and more severe monetary and gametime punishments. Jhonny Peralta, then a Tiger now a Cardinal, only had a 50 game suspension last year for getting caught in the Biogenesis scandal. That's 1/3 of a season, barely a slap on the wrist in terms of statistics. You want to get players to stop using PEDs to blow up their contracts and extend their careers for millions of dollars? Hit them where it hurts, in the wallet. Drop 'em back to the league minimum for a season or let their teams get out of contracts scot-free. Yeah, someone might have to sell a mansion and scale back to half a million a year, but I'm sorry if I can't cry about them only making 10x the median household income in the US when they get caught cheating. I'll guarantee you one thing: if getting caught using steroids ended up costing you $15 million instead of making $15 million more, players at all levels would rethink it.</p>
<p>Anyway, this is my line of thinking now. I realize that the PED issue isn't as clear cut as I'd like it to be, and that players are flawed human beings like us all and that shouldn't keep them from being put in the Hall of Fame regardless of what a bunch of snobby baseball writers think because they let politics and anecdotes get in the way of honoring the best baseball players of a generation.</p>
Biostar z87x 3D on Linux2013-12-29T21:27:11+00:002013-12-29T21:27:11+00:00Unknownhttps://blog.codezen.org/posts/biostar-z87x-3d-on-linux/<p><strong>UPDATE: This has been fixed with a BIOS microcode update.</strong>.</p>
<p>I've been having trouble with a system that I built a month or two ago. Up until this winter break I'd been using it mostly like a Wintendo, only booting into Windows to play Steam games. Seeing as I'm spending a little more time at home, I decided to finally get comfortable in the Arch install which - to my surprise - began to hard lock every time I turned around.</p>
<h2 id="the-short-version">The Short Version</h2>
<p>If you've got a Biostar z87x 3D that crashes in Linux all the time, add the following to your kernel commandline:</p>
<blockquote>
<p><strong>nolapic</strong></p>
</blockquote>
<p>Please note the l, it's <code>nolapic</code>, not another option, <code>noapic</code> (although they're related).</p>
<p>You can usually add these flags in your grub configuration, either through <code>/etc/default/grub</code> with <code>GRUB\_CMDLINE\_LINUX</code> or, failing that, in the <code>/boot/grub/grub.cfg</code> directly.</p>
<p>For reference, and in case I'm wrong, I also have <code>clocksource=hpet</code> in there because <a href="https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/kernel/sched?id=9dbdb155532395ba000c5d5d187658b0e17e529f">TSC worries me a bit</a>, but I don't think that's relevant to the bug.</p>
<h2 id="the-long-version">The Long Version</h2>
<p>The symptoms of this crash were varied. It mostly just hard locked the system, no input, no output, not responsive to SSH/ping. It actually only crashed occasionally, and usually after I finished running a Minecraft server or playing Dwarf Fortress.</p>
<p>First things first, I built a kernel from git and started to use it. My hardware is relatively new (this year's Haswell + z87 chipset) so it's not out of the question that there would be some kernel patches in flight between Arch's 3.12 and 3.13-rc5 in git. No dice though, the problem was just as prevalent on git so I moved on to narrowing down the malfunctioning devices.</p>
<p>I eliminated the USB wireless device that I only suspected because it was throwing warnings all over my dmesg output. It's a WiPi device that I had laying around with the rt2800usb driver that was complaining about transmission timeouts. Surprisingly, with the <code>nolapic</code> fix, this driver has shut up so it was likely a symptom of the same problem.</p>
<p>Then I eliminated the video card by running in a nouveau console without ever starting X. I would have reverted to the board's internal Intel device but running from the hardware console and provoking the crash actually let me get a glimpse of the kernel debug output and running MOC seemed to agitate it enough that I could reproduce in about half an hour. With the messages the kernel was dumping to the hardware console I was able to find the pattern in the crashes.</p>
<p>They were all in an interrupt context, which is serious bad news for the kernel. They were all in <em>different</em> interrupt contexts as well, meaning that - unless there's multiple, board wide failures - then something with interrupts is wrong. So, clearly, I began to tweak knobs with the APIC (the Advanced Programmable <em>Interrupt</em> Controller). <code>noapic</code>, <code>noapictimer</code>, and <code>nolapic\_timer</code> were all insufficient to fix it, but <em>nolapic</em> did the trick.</p>
<h2 id="why-did-this-work">Why Did This Work?</h2>
<p>This is definitely a question going forward and one that I'll give more attention in the future when I'm not on winter break. However, my first theory is that there's a problem with the Intel idle driver expecting the LAPIC timer to be reliable when it actually isn't so when the core is idle, and the processor has been put into a low(er) power state, the lapic wakeup either comes late or doesn't come at all. This would explain why the scheduler craps itself (I don't think it responds well to starvation or bad timing) in an interrupt context, as well as why I could use the system for literally hours with no problem and then it would fail shortly after I was <em>done</em>.</p>
<p>I also think this is true because Googling some LAPIC quirks I discovered a handful of Intel Atom chips that have to be similarly gimped in the <code>intel\_idle</code> driver because of unreliable LAPICs. The associated bugs were about random hangs.</p>
<p>What this theory doesn't explain is why running MOC would agitate it, although the sound drivers likely make use of precision timing as well and it seems likely that MOC wouldn't have to keep the process <em>too</em> busy just to keep the audio buffer full.</p>
<p>Anyway, there might be a quirk patch in here if I can get around to pinning it down.</p>
On EVE2013-12-03T00:43:01+00:002013-12-03T00:43:01+00:00Unknownhttps://blog.codezen.org/posts/on-eve/<p>The holiday season is MMO season for me it seems. Last year I dusted off a six-year dormant World of Warcraft account to see what was up. I played for two months and got bored.</p>
<p>A week or so ago, I got an Elder Scrolls Online beta invite, and that was interesting but obviously beta so it's hard to judge. It seemed to be very much in the WoW vein and as such I can't say I'm really interested (although I would definitely play another round of the beta to give it a fair shake).</p>
<p>Then I played EVE.</p>
<p>EVE is a ten year old MMO and every time I heard of it I thought "Wow, that sounds pretty neat," and went about my business. I did a similar shuffle with Dwarf Fortress and Minecraft, hearing bits and pieces of <em>neat</em> stuff until I eventually took the hint and started to play them. Now they're two of my favorite games ever. When I caught wind of CCP's <a href="http://trial.eveonline.com">14 day free trial</a> of EVE and just so happened to have most of the week off for Thanksgiving, I decided to give it a whirl.</p>
<p>Once again, I'm glad I did.</p>
<p>EVE has discovered a core feature of MMOs that I think is starting to catch on: being low maintenance. Warcraft and its many clones have done all they could to make the game easy and less time consuming, but when you play these games you're still actively clicking around, grouping up, fighting monsters. While playing they require not only a time commitment but also an <em>attention</em> commitment.</p>
<p>EVE, on the other hand, is all about long term planning. Its skill system operates in real time, taking minutes, hours, or even days of real time to train a skill but you don't have to be logged on or active in that time. You also don't need to do content to train them, there is no XP, you have no level, you just buy a book from the market. Of course, that requires money you have to earn but you can do that in a million different ways from mining, which can be safe and hands off for almost an hour but has little return, to piracy which requires your full attention but can be most lucrative.</p>
<p>Initially, when I heard that people usually surf Reddit or watch Netflix while playing EVE, I thought it was a criticism. Now I realize it's genius. In WoW to advance you have to kill mobs and get loot. That's the entire game. Sometimes, like the first time through an area, that's fun but a lot of the time that descends into repetitive and boring gameplay. There's a reason that it's called "grinding" when a player is out killing an endless stream of boars for their leather. EVE has repetition too (mining is basically the same thing over and over), but it doesn't require you to <em>participate</em> in it, only to set it up and then go do something else for awhile. In short, EVE is perfectly happy to let you automate the grindy parts, where WoW and ilk force you to manually slaughter a thousand boar in shifts of ten even if it's the last thing in the game you'd like to be doing.</p>
<p>I believe that this core difference, high vs. low maintenance, is why WoW has started to hemorrhage subscribers (7.7 million in 2013 down from a peak of 12 million in 2010 - <a href="http://www.powerwordgold.net/2013/07/world-of-warcraft-subscribers-2005-2013.html">Source</a>) where EVE has been on a <a href="http://en.wikipedia.org/wiki/Eve_Online#Subscribers">steady uptick for a decade</a>. To be fair EVE only has 500k subscribers, but considering that pretty much all new MMO titles are falling back on some form of free to play, having half a million subs is still impressive. Being high maintenance, requiring the player's full attention, makes it very easy to get bored with repetitive content. WoW has released many expansion packs (although not even half as many as EVE) that add lots of content and streamline the gameplay but <em>fundamentally</em> it's the same game. If you're bored with killing mobs for loot then more levels, zones, skills, gear, race, and class options all focused on killing mobs for loot aren't going to make you any less bored.</p>
<p>EVE takes a more organic approach to the problem of player fatigue by not forcing you to do anything but when you do decide on what you want to do, EVE lets you take it to its logical conclusion. For example, crafting. In WoW you can craft a very select set of items, you craft enough of them, you skill up and get more items you can craft. 99% of your gear, however, is all from mob drops or quest/dungeon/PvP system rewards. In EVE not only can you <del>craft</del> manufacture <em>every single useful item in the game from battleships to ammo</em>, you can also jump in at any point in the process as long as you have the skill (again, leveled in real time rather than by grinding) and the blueprint. WoW lets you craft trinkets to enhance your ability to craft trinkets. EVE lets you become a one man monopoly, a wealthy industrialist with factory capacity and long chains of players supplying them and distributing from them.</p>
<p>EVE's PvP interaction is also a natural extension of the game. WoW lets you grief other players in zones, or face off in structured arenas for sport but it's all consequence free fun. The WoW community would be up in arms if PvPers could destroy each other's gear or really cause anything but the mildest of setbacks. In EVE this is a <a href="http://eve-kill.net/">matter of course</a>. You can be part of a roving band of pirates (or just one really opportunistic businessman) preying on other players or you can be the victim and lose your ship, its fittings, its cargo, your implants and even your skills (if you're not careful) while those that attack you make a profit on your corpse. Death hurts in EVE because it has real consequences, which seems to be a unique feature among MMOs.</p>
<p>Importantly, player interaction isn't limited to co-op or opposing combat. EVE deaths and ship losses hurt, but they also benefit the game because they make a lot of other industries work. Battle and piracy means a lot of dead ships for salvage and a lot of people that need to buy ships and gear to replace their losses. In this way, EVE is much closer to being a real ecosystem than any other game I've played. Each trade hub has buyers and sellers and manufacturers. Supply and demand fluctuate based on reality rather than artificial drop chances. Playing as a trader buying and selling goods, there's a fair chance that the commodities you're ferrying around were produced by players with resources gathered by players, were sold by players, and will be bought by real human players. External factors, like warfare in a region, jump prices not because of some algorithm but because real people there need replacements and are willing to pay higher prices rather than having to travel for ten minutes round trip to get them marginally cheaper. Instead, you can do that for them and make a tidy profit in the meantime. Low security systems have higher prices because the dangerous space surrounding them is teeming with pirates. High security, well positioned starbases naturally become trading posts. When you simulate a world at a high level, details like this just sort of shake out of the system.</p>
<p>Now, of course, EVE is still a game. There's a progression to it that the developer enforces. Ships, modules, skills all form a distinct hierarchy. The asteroids you mine still magically respawn. NPC corporations and enemies still go about their routine. Nobody's ever going to independently develop a ship that didn't already exist (yet). Within the limitations and bare requirements of the MMO genre, EVE does quite a lot by sketching the universe and letting players fill in the details.</p>
<p>Which leads me to another facet of the game I find fascinating: it is surprisingly fertile ground for immersion. The EVE universe is undoubtedly minimalistic. After all, most systems are just open space with a pretty backdrop and some landmarks strewn about. Yet this doesn't alter that fact the setting is immaculately well realized. Space is beautiful and empty and space travel is long. You find yourself existing in the world very easily. There is nothing you would wish to do, within the context of a spaceship game, that you can't do. There are no doors that can't be opened, there are no ships you can't control or destroy, no products you can't produce. When you trade commodities that other players have put up and other players are buying, you are no longer roleplaying a trader, you are a trader. You're not shipping things back and forth for some AIs that really couldn't care less, you're helping another player achieve his goals and making a buck in the meantime, just like a real trader. When you decide to attack another player's ship or ransom it, you're no longer roleplaying a pirate, you are a pirate. Even when you've backgrounded EVE to mine and you're watching Netflix... what do you think the captain of an automated mining ship is going to be doing while his ore hold is being filled up? That's right, you're no longer roleplaying a miner, you are a miner. Nothing is symbolic. You don't do just do pirate missions to be a pirate. You don't get a pirate costume or a class designation or a special ship or title. You just <em>are</em> a pirate, just like a moment later you could just <em>be</em> an explorer or even a powerful CEO. You roleplay in the universe by virtue of existing in the universe.</p>
<p>Compare this to WoW. The universe is baroque and well articulated, but it's still false. You can't live in Stormwind, you just log out. You can't open all the doors. You can't produce items that match up with the best epic gear. You can't even really affect other players except to give them a hard time for awhile or defeat them in consequence free PvP. Everything is merely symbolic. One player "killed" another, nevermind he's respawned and is going about his business without missing a beat, buying new gear, or even giving it a second thought. The players rise up and fight the big boss, but the tide is never turned, the war is never won, the story never moves on until Blizzard releases another expansion pack.</p>
<p>I can't say that I'm going to be a long term EVE subscriber. I'll get busy, get distracted by other games, etc. I've never played an MMO for more than a couple of months before moving on. However, between having the capability to queue up days of real time skill training in less than a minute and being able to play the game in short bursts of interaction, I don't feel obligated to spend hours actively playing the game to get my money's worth. If you keep your skill queue going, whenever you have time to actually sit and play for awhile you'll still have gained as many skill points as someone that logged on every day. Combine this with the fact that CCP releases two <a href="https://en.wikipedia.org/wiki/Expansions_of_Eve_Online">expansions</a> a year that are <em>free</em> to current owners instead of a biennial shake down for the price of a full game and there's really no reason to unsubscribe unless you're confident you don't want to ever play again. Even being broke isn't an excuse since you can buy game time with in game currency (although I'm betting it takes awhile to be able to general almost a billion ISK in a month and not get wiped out).</p>
<p>What I can say is that, for someone completely bored with WoW-alike theme park MMOs, playing EVE over the last week has been refreshing.</p>
On 'The Road'2013-10-28T18:41:39+00:002013-10-28T18:41:39+00:00Unknownhttps://blog.codezen.org/posts/on-the-road/<p><strong>Spoilers Ahead</strong></p>
<p>I read Cormac McCarthy's <em>The Road</em> in two days. Tears were shed.</p>
<p>I started reading <em>The Road</em> because I have a new policy where I shift regularly between high fantasy / sci-fi / comedy type books and more serious fare, literary fiction, non-fiction, etc. I just finished reading all five books of <em>A Song of Ice and Fire</em>, which was about 5 kilopages of complete plot driven fluff. <em>The Road</em> weighs in at not even 300 pages, and yet packs such a hard punch that I feel like every scene has imprinted itself on my memory.</p>
<p>I read McCarthy's <em>Blood Meridian</em> a year or so ago and I'll admit that even though his prose was impressive, the story didn't really capture my imagination. It was a violent, brutal, beautiful journey but in the end I put it down and didn't think too hard about it. I've read analysis of that book that dealt with symbolism, but I'm a firm believer that symbolism only serves literature if it's woven into the fabric of the story such that the reader gains knowledge of it by <em>reading</em> rather than <em>dissecting</em>. Good fiction is entertainment wrapped around enlightenment, not the other way around.</p>
<p>After reading <em>The Road</em>, I feel indefinably changed. The novel was an easy read. Simple, but brilliant. McCarthy's prose is, again, taut with meaning. Not one word is wasted. He breathes an ashen, hostile, and frightening life into the world of the post-apocalypse and still makes you feel the loving connection of the main characters, a father and his son. Their story grips you from page one. McCarthy takes you from desperation to delight, from famine to feast, and all the while there is the undertow of ever present danger. There is something here that resonates for every father, son, mother, or daughter.</p>
<p>The internet warns that <em>The Road</em> is a sad, depressing novel. Despite the dark past and the hellish setting, I don't think I can agree. The boy's mother commits suicide years into their ordeal because her will has been crushed. The world is a wasteland, where the only animals are cannibal scavengers, and it rains down ash as often as water or snow onto fields of dead grass and forests of dead trees. Any novel of the post-apocalypse forces you to question its end game but McCarthy's vision is particularly bleak. There are no heroes to save the day, there are no glimmers of hope or restoration. The father himself, upon finding food, questions whether it is a blessing or whether it would be better to just die and be done with it. Yet he persists. He will not be crushed. They will not submit. The world has turned into cold, dark place but they carry <em>the fire</em> as old as civilization itself.</p>
<p>In the final encounter, the boy and the shotgun wielding man that takes him under his protection, the man claims to carry the fire as well. If we take him at his word, and we have no reason not to thanks to the fulfilled promise of covering the boy's dead father, there is a family that still remains. The good in the world has not burned out, and the father has achieved his ancient goal of ensuring that his son did not perish. Where once there were three, and then two, and then one, now there are five bearers of the torch of civilization.</p>
<p>The final paragraph of the novel is a disconnected scene and, in a fine tradition of literary fiction, is open to wide interpretation.</p>
<blockquote>
<p>"Once there were brook trout in the streams in the mountains. You could see them standing in the amber current where the white edges of their fins wimpled softly in the flow. They smelled of moss in your hand. Polished and muscular and torsional. On their backs were vermiculate patterns that were maps of the world in its becoming. Maps and mazes. Of a thing which could not be put back. Not be made right again. In the deep glens where they lived all things were older than man and they hummed of mystery."</p>
</blockquote>
<p>One might interpret this as saying that the world is over and cannot be set right again, the fish being some forgotten treasure of earth that we squandered in our destruction. Others might interpret just the very existence of this passage being a hopeful indication that these fish live on someplace. I find that unlikely considering even brook trout need the sun to live.</p>
<p>Perhaps being contrary, I believe that the final line is the most important. These fish are from a time before man, they hummed of mystery, yet they are being discovered by a man. They are seen, they are grasped in the hand, touched, they are smelled and - soon, I imagine - tasted. The mystery of the fish, and the greater world, has started to unravel. I believe this negates the message of the fish's appearance since it was generated in a time before we had understanding of the the mystery it represents. Now, with that understanding - or perhaps with <em>greater</em> understanding - we can indeed make the world right again.</p>
<p>My wife, Juliette, had an interesting - and positive - take on it as well, even if it was a little far afield from my usual thought pattern. She hasn't read the book, but the last paragraph was just too good for me not to share and, again, it's disconnected from the rest of the story. She interpreted the fish as the world itself. In terms of literary symbolism I think that's a valid first step (that map of a thing representing the thing itself), and it has some interesting implications. First, the world is in the hand of a man but it is dying (indicated the fact that it feels <em>torsional</em>, as if it's trying to escape the hand holding it out of water). Second, the implied existence of multiple fish which in this interpretation would be multiple worlds. So, perhaps we have broken the world and perhaps it can't be set right, but there are other worlds. The glen where the fish all live, then, is the universe humming with mystery. A neat thought, if it gets a little science fiction-y on expansion.</p>
<p>I greatly enjoyed <em>The Road</em>. It's hard to distill such a great and potent brew of imagery. McCarthy is a master, and <em>The Road</em> is a masterpiece.</p>
On Breaking Bad2013-09-30T15:54:08+00:002013-09-30T15:54:08+00:00Unknownhttps://blog.codezen.org/posts/on-breaking-bad/<p><em>Breaking Bad</em> ended last night. Spoilers ahead, naturally.</p>
<p>With last night's episode, <em>Breaking</em> Bad is basically neck and neck with <em>The Sopranos</em> in the easy list of Best Television of All Time. The only reason that I can't give <em>Breaking Bad</em> the crown alone is that the two series were trying to accomplish very different things. Both of them are violent, rise and fall type shows, but where <em>The Sopranos</em> attempted to juxtapose Tony's criminality with the very common issues and problems of American life, <em>Breaking Bad</em> was purely about pushing Walter White to the limit.</p>
<p>This was the genius of <em>Breaking Bad</em>. At every turn there was escalation, but it was also believable, and there were dire consequences for every one of Walt's actions. We've seen a lot of the new wave of dramatic TV shows end poorly because the writers find themselves incapable of providing a believable progression and then wrapping things up. <em>Lost</em> is a canonical example of a show that promised the world and failed to deliver. Every season was wilder and more mysterious than the last, but the end was ultimately a complete cop out. <em>Dexter</em>, which just ended a week ago was, was such a show as well. The first few seasons were great TV but it ran off the rails and the finale was gutless in its failure generate suspense as well as its failure to make its protagonist come to his end. I could elaborate on quite a few others like <em>Battlestar Galactica</em>, <em>Weeds</em>, or <em>Heroes</em>. Even the laudable Sopranos had an ending that was, for all intents and purposes, a disappointment - although you can applaud David Chase's artsy execution of blue balls by failing to explicitly show us Tony's death.</p>
<p>But it was not so with <em>Breaking Bad</em>. The ending wrapped up the entire story. It gave us everything we wanted. It touched on every character still breathing. It provided the long awaited payoff and, in the end, Walter White wins. The show could have ended in any number of ways, and in some ways <em>Breaking Bad</em> chose the most predictable (i.e. Walt achieves his goal of providing for his kids after his death and dies on his own terms), but just the fact that there were options other than the foregone conclusion indicates how well the show was written. Speculation was rampant. Some thought he'd be brought to justice. Some thought there would be the anti-ending where he'd die of cancer before his work was complete. Some thought he'd finish his work and ride off into the sunset with a couple million in tow. Some even thought that he'd go on a rampage to kill everyone that had ever wronged him (I guess the ricin and the machine gun really worked them up). All were possible in the first minutes of last night's finale.</p>
<p>Best of all, despite the fact that the "predictable" conclusion was reached, each scene still offered suspense. When he showed up in Gretchen and Elliot's house the viewer has no idea whether he's there to brutally murder them, get something off his chest, surreptitiously poison their food or what. Same thing when it's revealed that he's standing in the kitchen with Skyler. We don't know why he's there. If he's there to threaten or cajole her into playing some part in his plans, if he's there asking forgiveness, offering money, telling more lies, or if - as it turns out - he's there to come clean, to admit that the whole thing was ego and avarice, and to catch one last glimpse of the kids. Even in the final scenes of confrontation Jesse and Walt's relationship, frayed to the point of enmity, evoked the same level of intensity as being intimidated by the gang of neo-nazis just moments before.</p>
<p>There was not a single flagging scene in the Breaking Bad finale, just as there was never a flagging episode in the show overall. It showed the same brilliant writing and imaginative cinematography we'd come to expect from the show and, in the end, provided us with a great contrary example to the failures of modern TV drama. It ended when it needed to end, it ended how it needed to end, and it ended with such sweet resolution that it will go down in TV history as one of the most iconic shows of a generation.</p>
On "The Art of Fielding"2013-08-02T15:25:34+00:002013-08-02T15:25:34+00:00Unknownhttps://blog.codezen.org/posts/on-the-art-of-fielding/<p>Last night I finished Chad Harbach's "The Art of Fielding." It's a literary fiction book that's ostensibly about a rising baseball star competing in a small college to get drafted by the St. Louis Cardinals. You can see my obvious attraction, being a Cards baseball fan, but I'm also an avid reader and it had been awhile since I'd read something that takes place in our universe - even if it is fictionalized.</p>
<p>I found the book to be quite well written. There are the physical descriptions of Henry, the main character, playing baseball evoking images of the sort of otherworldly perfection that gets you low draft numbers but the well-crafted adjectives used for the game are matched by the great sort of introspection, motive and doubt that make the characters seem real. The whole story fits together with interlocking pieces so tightly coupled that you can range from baseball to Melville to rising homosexuality to setting description without it ever feeling unnatural. No topic is disconnected, no metaphor unnecessary, no simile unpolished. It was a joy to read pretty much from cover to cover.</p>
<p>As I stated, I'm a baseball fan and there is a certain romanticism about the game that's soaked into this book. I'm curious as to how a non-fan would take to the use of the games as a cornerstone of the book because baseball is one of the primary methods of creating tension and driving the plot. There are a lot of other factors running in the story, and with some work (or a different sport) the book could stand alone, but those other factors are much more subtle and much less likely to create the kind of grip that makes you reluctant to put a book down. In addition, I was pleased that - and I'm not giving up much of a spoiler here - there is no cliched bottom of the 9th go-ahead home run syrupy ending that one might expect from the structure of the story. It only takes a few chapters before you realize that this book is a lot more than just fantasy wish fulfillment.</p>
<p>In short, "The Art of Fielding" is a great piece of fiction and it's quite evident that Chad Harbach is both a baseball fan and an excellent writer. It's clear that this novel was an epic undertaking for him - having spent nine years crafting its immaculate prose. I'm looking forward to seeing if he creates another masterpiece or if this is the sort of one-off story that's born of intimate personal knowledge that is impossible to reproduce twice in a lifetime.</p>
On Round Rock Express2013-06-29T00:54:06+00:002013-06-29T00:54:06+00:00Unknownhttps://blog.codezen.org/posts/on-round-rock-express/<p>A week ago I went to my first AAA ballgame between the Round Rock Express and the Memphis Redbirds. Round Rock is a wealthy suburb of Austin, so the park is only 20-30 minutes away and with my recent baseball obsession I decided to check them out.</p>
<h2 id="the-dell-diamond">The Dell Diamond</h2>
<p>The Round Rock Express' home field is the Dell Diamond, which is a relatively recent facility built in 2000 with ample help from the city of Round Rock. Now, I've never been in a AAA park, but I've visited the old (90s style) Busch Stadium back in St. Louis so I feel like I have a basis for comparison between the leagues at least.</p>
<p>I have to say, the stadium is <strong>very nice</strong>. It was clean. It was small. Plenty of parking. Looks like there were a lot of very nice skyboxes up top. I was floored by how close I was able to get to the action for a paltry $7 (half-price) admission. Considering in a major league park the nosebleeds easily run $25 a pop, that's a bargain. Here's where I sat:</p>
<p><img src="/IMG_20130618_203858.jpg" alt="" /></p>
<p>Pretty sweet for $7. I got to see a few Cardinals prospects (playing for the farm team Redbirds) right up close and personal. Kolten Wong, Oscar Taveras, and Michael Wacha were all within spitting distance. The Redbirds didn't play so well, but who can blame them? AAA is full of MLB hopefuls and washouts. The composition of their teams is constantly shifting, and they don't get the same sort of support or consistency they would receive in the MLB. A single star, or even three future stars, don't make a great team by themselves.</p>
<p>Anyway, I was very surprised when I got there because there really weren't any bad seats in the house. In an MLB stadium that seats almost 50000, that isn't and can't possibly be true. At the Dell Diamond, which has a maximum capacity of 8700, even the outfield seats are pretty good. I was happy that I brought my glove because taking a foul ball to the face was one of my chief fears sitting through the game. They were dropping around me on all sides. It was a far cry from the second deck level seats I remember from old Busch.</p>
<p>There are also a number of other amenities I found interesting, including the kid's play area. Apparently there's a pool as well. Unfortunately, I didn't have my daughter with me (I bought three tickets, but my wife and daughter were both called back to St. Louis for a family emergency) so I can't comment on their quality, but I did see them in outfield. If your kid is the impatient type, or just bored of mediocre baseball, then I'm sure it's a godsend.</p>
<p>Unfortunately there is one place that the Dell Diamond and Busch are identical: the concessions are where they really make their money. I brought some cash, and I foolishly planned to eat there but when slices are $5 and beers are $7 (or $9 if you don't want swill) I made a meal in the first inning and didn't go back. I brought my own water bottle and contented myself with that afterwards. I know that I paid half price and parking was $5, but even so the night's entertainment ended up costing a little over $30. Not too terrible, but do yourself a favor and have a nice meal out before hand. You don't have to stand in line, sit in a plastic seat, watch your beer and for $19 a person you could do way better. As some Yelp users pointed out, the ballpark shares a parking lot with a Salt Lick satellite location so if you're a fan of BBQ you don't even need to get in your car.</p>
<p>The staff of the Dell Diamond also seemed to be rather surly. The ticket guy got annoyed when he couldn't find my tickets and I had to bring out my phone to lookup the reservation number. Look man, it's not my problem your shitty software can't figure out my name. People don't always sign up for things with their proper ID full name (I go by Jack, my ID says John and there are ten thousand variations of the same problem Pat/Patrick/Patricia Liz/Beth/Elizabeth they're all the same effing name). Since the Minor League ticketing is all handled by the same firm, they should make it clearer that your profile name needs to be what's on your ID <strong>or</strong> the staff should stop being so rigid. Look me up by last name and figure it out. I have a common last name but there are maybe 2-3000 people with tickets. How many Millers can there be? Anyway, on the way in with my backpack (containing my glove, a water bottle, my sunglasses etc.) the guy seemed pissed off when it took me a second to realize that his gruff pig voice had said "Open it." Contrary to what the online reviews said, the only time these folks were friendly to me was when I was on my way out the door.</p>
<p>The fans were assholes as well, but I guess that's what I get for rooting against the home team. Still, some of the shit that came out of the drunken pricks behind home base in the last third of the game were just totally inappropriate. There was some good natured razzing, of course (like "maybe you're actually a lefty!" to a right handed batter) but there were also some blue streaks in the language and I was glad I hadn't brought any little ears. Less because of the cursing and more because they were just so goddam negative. Dude, you're at a AAA game, these guys don't need you to remind them they don't measure up and they sure don't need to hear you talk shit on their mothers. I'd like to see some of the drunken white trash get out of the stands and play some baseball - if they could do better there'd probably be a contract in it for them.</p>
<p>To sum up my visit: The stadium was clean, the tickets were cheap, the food was expensive, the staff was hit and miss, and the home fans were dicks. Most importantly the baseball just wasn't that good. I won't say that I'll never go again, but if I do I'll eat beforehand and I won't feel like I should stick around for the whole game because, frankly, it's not MLB and it shows painfully. The caliber of play just isn't there.</p>
<h3 id="notes">Notes</h3>
<p>Here are a few things that I couldn't find on the internet and wish I could.</p>
<ol>
<li><strong>Parking is cash only.</strong> I should've known better, but from all the hype about the stadium online I thought it was going to be a chick in a booth with a little fan and a credit card reader. Instead, it was just a friendly old man with a wad of cash and some paper tickets. Also, Lexus drivers get in free thanks to some dealership in Round Rock. There is an ATM across the street, but it's in a convenience store so I hope you get the $2.50 convenience fee refunded by your bank (I love my credit union, Amplify, for this reason).</li>
<li><strong>Wear your affiliate team gear.</strong> At first I thought that wearing a Cardinals hat to the game might be a tool move. After all, it's not the Cardinals that were playing. I was glad to see that nobody else thought that way and there was a lot of Cardinals gear in the stands. Surprisingly, there was quite a bit of Round Rock Express gear there too.</li>
<li><strong>Bring sunglasses.</strong> Especially on the first base line in the evening, the sun was really a pain in the ass. I only used mine for the first inning or two but I was glad to have them.</li>
<li><strong>Prepare for awkwardness.</strong> I didn't mind so much that there were between inning games for the kids, or that we all sang "Take Me Out to the Ballgame" together at the stretch, but at some point they started trying to get us to do the Chicken Dance and I drew the line. This white boy doesn't dance. The stadium is just so tiny that you're bound to get a camera pointed at you or have a face to face encounter with a mascot. If my seven year old had been there, she would've loved it, but there by myself it was just weird.</li>
</ol>
Quick Notes: Crusader Kings 22013-06-24T03:49:39+00:002013-06-24T03:49:39+00:00Unknownhttps://blog.codezen.org/posts/quick-notes-crusader-kings-2/<p>Here's a set of things that I've found out about CK2 that I don't think were covered well enough elsewhere. It's mostly nitshit, but I thought it'd be worth writing down.</p>
<p>[toc]</p>
<h3 id="ruler-designer-pros-and-cons">Ruler Designer Pros and Cons</h3>
<p>I bought the big DLC pack on Steam and it came with the Ruler Designer which allows you to alter your starting leader. It sounds great on one hand - you get to change you appearance, your coat of arms, and (most importantly) your various traits, but it does have a harsh downside.</p>
<p><strong>Pros</strong></p>
<p>Again, you get to customize your initial leader so you can have traits that favor your situation. Be a genius, or a brilliant strategist. Be young, be old. Have a wife and kids when you enter the game. It does a decent job of forcing you to choose a combination of good and bad traits because they're all tied to your age. So, for example, you could be a genius level master strategist but you'll start the game in your late 40s. Add some gluttony and lust, maybe some physical disfigurement and you can still be a genius strategist in your 20s. Important traits can then be passed to children that you educate because you get expanded options when situations arise during their upbringing.</p>
<p><strong>Cons</strong></p>
<p>I can't stress this enough. When you're using the Ruler Designer you <strong>are not editing your leader, you are replacing him</strong>. In fact, the leader you replace even shows up in your court. This is an extremely important distinction. When you use the default leader, you start without taking penalties for short reigns, you probably have high relationships with your vassals, you don't start over your demesne size and you may even have powerful family in the area. For example, starting in Sweden with the Old Gods DLC, you have brothers and sisters all over with alliances. Or in Ireland 1066, starting in Dublin as the Earl, you are already the heir to Leinster and will inherit it shortly after your elderly father dies. Without that relationship you'll have to take it by force or intrigue.</p>
<p><strong>Summary</strong></p>
<p>Don't use the Ruler Designer if you're going to take over a large kingdom. Or, at least consider the relationships you already have in place and expect to spend awhile smoothing out relations with your vassals. Instead, take the leader that's in place and try to mold the heirs (if they're kids) into the sort of person you want to be next. This approach will take until your death, or even your first heir's death, but it'll be easier along the way.</p>
<p>I'd use the Ruler Designer if you are going to start as a vassal, or as the ruler of a very small area, like a count with no inheritance and no worthwhile allies.</p>
<h3 id="watch-your-heirs-traits">Watch your Heirs' Traits</h3>
<p>Even if you're able to hand over all of your titles on death to a single heir (which can be rough to accomplish) do yourself a favor and make sure your heir is someone worth playing as.</p>
<p>I just recently had a play through where I was trying to reform the Norse Pagan religion. I had already united almost all of Sweden under my banner as King and I was working on getting a claim to the third Holy Site that I'd need to reform my religion. I had a truckload of piety and prestige when I died. Dying wasn't too big an ordeal ... at first. I lost a few titles to my half brother but I was expecting that (and had no choice, being unreformed pagan). What I wasn't expecting was that - oops - my heir was arbitrary, cruel, cynical, and gluttonous. His prestige was negative from day one. He was a brilliant strategist, but every single vassal hated him for his bad traits. This, in addition to the usual trouble with succession, was lethal to my plans and my game. The first year after this heir took over there were three dangerous factions, a civil war that cut my kingdom into tiny pieces and ... well, I didn't stick around too much after that. I wanted to assassinate myself.</p>
<p>So, it's not enough to be cognizant of having an heir, getting him married, and determining how titles are going to split on your death. You have to make sure that your heir isn't an asshole too. If I had been watching I could've plotted his destruction or just had him assassinated. If I had been paying closer attention when he was born, and raised him myself, I could've made sure he didn't grow up with these crappy traits in the first place.</p>
<h3 id="know-your-long-term-casus-bellis">Know your Long Term Casus Bellis</h3>
<p>One thing that wasn't clear to me when I started was that your Chancellor's "Fabricate Claims" is really a specialized tool rather than a central mechanic as the tutorial sort of implied.</p>
<p>There are a lot of CBs that are a lot more useful and give you a lot more scale and freedom to fight than Fabricate Claims. Fighting on grounds of religion, pushing de jure claims, inheriting or pushing claims on behalf of others you've brought into your court - these all give you a lot more leverage and are a lot less trouble to procure than waiting for your Chancellor. Especially if you're non-pagan and can't raid in the meantime.</p>
<h3 id="you-don-t-control-all-holdings-in-your-counties">You Don't Control all Holdings in your Counties</h3>
<p>This is something that took me too long to understand. You already know that you're not in direct control over every county in your kingdom (unless it's a very small kingdom or you're a great steward). However, even in counties you do directly control, the holdings there are controlled by barons (landless property owners) who are vassals as well.</p>
<p>I knew all that, but what wasn't clear was that when you make improvements, say, to a city that's controlled by a baron level mayor that's still just improving his lot in life and not yours (directly).</p>
<p>Look at this window (screenshot from lparchive.org):</p>
<p><img src="/countywindow.png" alt="countywindow" /></p>
<p>Thomond has a castle, the big picture to the right of the player's face. That's your holding in the area, that's where you click to make improvements. The city and bishopric are just like any other vassal holdings, even though they're on your land.</p>
<h3 id="money-vs-timescale">Money vs. Timescale</h3>
<p>Money is extremely important in this game. Improvements are expensive, as are new holdings, and titles (which, as mentioned above are useful for persistent de jure claims). Mercenaries can get you out of a jam, but they're costly. Money is even useful as a political tool for manipulating the opinions of greedy vassals.</p>
<p>The thing that sets CK2 apart from other games though is that you have to think on an epic timescale for this stuff to pay off. The buildings themselves take years to construct and upgrade and each step of the way only adds a tiny fraction to the payoff. It's very similar to calculating the payoff for city improvements in Civ, you have to factor in how long you'll be able to reap these small benefits to determine if it's worth it.</p>
<p>In addition, you have to take quick advantage of any mechanics that work in your favor monetarily. Being a Norse pagan, for example, means that you can pillage coastal counties. Early on in the game you should basically be constantly raiding. In fact, as a Viking you get a penalty if you're at peace for too long which encourages you to raid just so you don't take the prestige hit. By raiding you can easily make enough money to create some big titles for those later de jure claims, or to build up some infrastructure that later you'll use to consolidate power. In the later game, however, you're much more likely to get tossed back into your longboats by a sizable force you don't want to face (after all, you're just raiding not conquering).</p>
On "Let's Play"2013-06-23T20:57:58+00:002013-06-23T20:57:58+00:00Unknownhttps://blog.codezen.org/posts/on-let-s-play/<p>I'm stuck in an age where I prefer my information to be conveyed in text. That's just the way I feel. 90% of the instructional videos on the internet are twenty minutes too long and executed by kids that stumble over their words, get confused, and even waste time figuring out what I'm trying to learn. Minecraft videos are the perfect example. It's a perfect storm of complexity and the fact that the players are pre-pubescent. Most of the time a simple blueprint or a set of screenshots would do just fine and would let you examine what you're looking at without fiddling with a Youtube scrubber.</p>
<p>Recently, I started playing Crusader Kings II, which is a very engrossing but very complex game, and for the first time I found benefit in a Let's Play. I was scouring Reddit, Google, the CK2 wiki, and there was a lot of information and I learned quite a bit, but I still wasn't really grasping the game. Partially because it's got a huge amount of DLC that's vastly changed the game since it was released so there's a lot of conflicting or half right information out there. There are a few hundred buttons in the interface, a lot of game mechanics in play, and even though there's (now) a tutorial, it just wasn't clicking. There are so many different scenarios and little hidden pieces of information that it was hard to just read and put it together.</p>
<p>That's why watching a Let's Play on Youtube was so enlightening. I feel like I had all of this information packed into my brain over the last two days, but hardly any information about how to really put it to use. What parts of the game were important, and what parts can be ignored for awhile, etc. Actually watching someone that had a lot more experience than I do use the information I already had was awesome.</p>
<p>So here's my new position: Let's Plays are great when</p>
<ol>
<li>The person doing them already knows (mostly) what they're doing</li>
<li>They don't waste your time covering extreme basics (unless that's what you're looking for)</li>
<li>When you have a lot of information that needs to be tied together into action OR</li>
<li>When you want to know the <em>thought process</em> behind decisions made</li>
</ol>
<p>In other words, deep strategy games are perfect for Let's Plays because you can watch and listen as a more experienced player gets himself into situations you wouldn't know how to handle. If nothing else, it saves you a lot of trial and error (or save and load).</p>
<p>I can't even imagine how different my gaming life would be if I could've watched them when I was learning Civilization II for the first time. In fact, next time I want to fire up Civ V I'll probably watch some deity level players Let's Play before I even open Steam.</p>
<p>EDIT: Just as a shout out. I formed this opinion while watching a number of videos on Youtube, but <a href="http://youtube.com/user/quill18">quill18</a> was the one that made the new Norse raiding mechanic make sense to me. Thanks.</p>
On "Proof of Heaven"2013-06-18T08:36:20+00:002013-06-18T08:36:20+00:00Unknownhttps://blog.codezen.org/posts/on-proof-of-heaven/<p>This hasn't been an extant fact on my blog, but I am an atheist. My parents are (and now pretty much <em>were</em>) Catholic, and I went to a couple of Catholic schools as a kid so I'm extremely familiar with the machinery of Christianity. My wife (who's a deist) was raised as a free-thinker and we've had some quite lively healthy debate over the years. Her mother, however, is now a born-again Pentecostal (last time I checked).</p>
<p>Last Christmas Day, while decorating gingerbread men, we got into a bit of a verbal disagreement about the existence of God and she didn't really have a leg to stand on. The first, and most viscerally relatable weapon in my arsenal was the <a href="https://en.wikipedia.org/wiki/The_problem_of_evil">Problem of Evil</a> which I further parlayed into the contradictory positions of free will, omniscience, and sin. I was probably in poor form for an early Christmas morning, but I've recited these arguments to myself often when I try to re-evaluate my positions on God.</p>
<p>She never really answered my questions, which <strong>were</strong> answerable (if a bit pointed and more than a little rhetorical), they just force you to redefine the concepts of evil in ways I find dubious and unverifiable or admit that either God doesn't know everything or we are machine-like automatons with no choice but our destiny.</p>
<p>In the course of that conversation she mentioned a neurosurgeon with a raft of degrees that had come to believe in God - or more directly the afterlife - after having a near death experience. How this was relevant, I don't know, but I guess it was that there was a man of science (the sort of man I consider myself to be) that had a crisis and came to believe. At the time I dismissed the claim out of hand.</p>
<p>In the meantime, however, she sent me his book. It's called "Proof of Heaven" by Eben Alexander III, MD.</p>
<h2 id="praise">Praise</h2>
<p>There are a few positive things I can say about this work. The first is that his writing style was clear and well thought out purely from an execution-of-a-story point of view. It's apparent that he's very smart from his training as a neurosurgeon and his obvious familiarity with medicine. I say this without having checked on his degrees or anything because on this stuff I'm willing to give him the benefit of the doubt. Why? Because if someone really has "proof of heaven" it doesn't matter if he's a genius or a vagrant. Proof is proof is proof.</p>
<h2 id="criticism">Criticism</h2>
<p>There is no proof.</p>
<hr />
<h3 id="proof-pru-f-n">proof /pɹuːf/ n.</h3>
<p>...
2. (uncountable) The degree of evidence which convinces the mind of any truth or fact, and produces belief; a test by facts or arguments which induce, or tend to induce, certainty of the judgment; conclusive evidence; demonstration.
...</p>
<hr />
<p>The key words here being "evidence" and "certainty". This book has only anecdotal evidence and thus conveys no certainty whatsoever.</p>
<p>In addition, I think that the author, Eben Alexander, frequently uses the <a href="https://en.wikipedia.org/wiki/Appeal_to_authority">appeal to authority</a> logical fallacy to great effect. The first ten or twenty pages of the book are just filled with irrelevant details of his education and his unique insight into the human brain. I will grant that he knows a lot more about the brain than I do and he can rattle off the various possible causes for a grand mal seizure in a white man in his 50s a lot quicker than I can, but none of this makes any difference whatsoever for some sort of <em>proof</em>. I kept getting the feeling while reading his opening pages that he was including so much detail (like the names of the drugs he was on, the Latin derivation of <em>cortex</em>, the full name and apparent age of <em>E. coli</em>, the shifts of the nurses and staff, even the Einstein and Kierkegaard type quotes that start a few chapters) that he was including them with the sole intent of saying "Yes, I am smart. I'm a doctor!" and then using that authority to argue his other, totally unrelated claim.</p>
<p>Another facet of the book that I disliked was that it was tacitly and admittedly fiction. The protagonist is in a coma for most of the book so all of the detail he's added about his family and his appearance during that time is entirely fictionalized (or, at best, hearsay) to weave the personal experiences he had while in this coma into the dramatic story going on in the real world. It's extremely easy to forget this fact when he's narrating the story as if he knows exactly what happened. He's taken quite a bit of artistic license with the story that went on outside of his head and I would be totally fine with that if this book didn't purport to be "proof" because he's intentionally blurring the lines between what he knows is real, what he's heard from others, and this mystical experience that he uses as the basis of this "proof."</p>
<p>The rest of the book is either rather dry biography (sure, I'll believe it) or part of this world that he experienced while his body was essentially brain dead. This world, which he gives several rather fanciful names as he progresses through it, is intended to be the "proof" but it reads like an acid trip and falls drastically short of what anyone in the rational world would call proof.</p>
<p>The kicker is that you can believe that every word of this book is true and it's still not a proof (in the deductive reasoning, mathematical sense) in any way shape or form. I believe that he had a serious illness. I believe that the story he told about his family, his childhood, his adoption, and education is true. I also believe that he made a rare full recovery. I even have no reason not to believe that he hallucinated an entire episode that convinced him that there is an afterlife. For him, that proof must be especially strong because he was supposedly there and experienced it for himself.</p>
<p>Looking at it from the outside, however, there's nothing here but an anecdote with one huge, enormous, glaringly obvious flaw. Dr. Alexander doesn't have proof that there's an afterlife <em>because he isn't dead</em>. No amount of degrees, dramatic stories, or fantastical journeys through inner space will change the fact that he was most definitely alive the entire time. People who were "dead" for minutes before being brought back weren't really dead. Why? Because you don't come back from death, by definition (Christian theology aside).</p>
<p>So, what we have here is yet another book that attempts to build a proof on the foundation of personal experience and, unsurprisingly, it fails to convince.</p>
<h2 id="the-real-lesson">The Real Lesson</h2>
<p>This book has an accidentally scary part to it, I'll admit. It had nothing to do with the immediate content, but with the trimmings of the book.</p>
<p>First, the praise listed is uniformly from religious folk (who, let's just say have a horse in this race) or from MD PhD types that <em>are also hawking this sort of book on their own</em>.</p>
<p>Second, the first section after the end of the story (and an unnecessarily long acknowledgements section) is the "reading list" which is just a long list of other semi-related works that (surprise!) include all of the authors that wrote praise for this book. There's a smattering of real work in there about death and grief and magic mushrooms (see last point), the Dalai Lama even gets a shout out, but at least 50% of them are just more of the same pseudo-science "astral travel" and Native American wisdom.</p>
<p>After that, there's a statement from an MD that examined him that boils down to "Eben Alexander's recovery is truly remarkable" which can't be argued but low probability events happen all the time. For every Eben Alexander there are a few hundred others that, yep, kicked the bucket as expected.</p>
<p>Lastly, there's a list of theories he considered when trying to debunk his own irrational experience. This is yet another place where he tries to strengthen his fallacious argument. He drags up a lot of facts that I assume are true (because it's irrelevant) about the effects of hallucinogens, brain chemistry, brain structure, and whether the operational parts of his brain could handle the "ultra-reality" he experienced during his coma. It's a real shocker that he comes up with various reasons each one can't possibly explain it. It's funny coming from a neurosurgeon that acknowledged in the beginning of the book that we can't explain how the brain works. It's the height of foolishness to debug a system you don't understand and, when faced with something you can't explain, insert divine intervention or miraculous events. Not to mention that some of the arguments rely on "well the parts of my brain that could make this seem so real weren't working at the time" which is something that couldn't possibly be ascertained. He admits that he has absolutely no sense of time while in this fantasy world and, as such, how does he know that it didn't all occur a millisecond before he "woke up" when his brain was 99% of the way back to consciousness? The chapters where he's in this fantasy are spliced with the story in the real world such that it seems like he spent days of real time there, but that's totally unknowable and inadmissible in refuting the theory that it was just a hallucination.</p>
<p>In the end, there's only one thing that I can take from this book. It's a lesson that I've learned before and I'll probably learn again: smart people can believe some pretty stupid things without any logical underpinning.</p>
On Baseball2013-06-09T02:43:44+00:002013-06-09T02:43:44+00:00Unknownhttps://blog.codezen.org/posts/on-baseball/<p>Alternatively, this is why baseball is the greatest American sport.</p>
<h3 id="1-it-s-a-true-team-sport">1. It's a True Team Sport</h3>
<p>Oddly enough, baseball is one of the few games where you have to assemble a team of good players instead of being carried by one or two star players. This is a direct result of the fact that baseball is a long term <strong>endurance</strong> sport. The current regular season in the MLB is 162 games long, which is very near to a game a day for the entire six month season. There's a rotation from game to game, and each lineup is different. An ace pitcher, for example - even one that could throw a perfect game every time - could only at best hold a .200 average (which is crap) by himself. Even a more realistic pitcher that occasionally allows runs can be betrayed by bad hitting or bad fielding. Routine plays turn into errors and wins turn into losses. The lineup is all important and it's tough to keep a consistent set of fresh players when you hardly ever have a day you don't play. There's a reason that a team's main roster has 25 men on it: you can't count on a player playing every game or even for full games.</p>
<p>The endurance aspect creeps up again with the disabled list. While there aren't a lot of collisions in baseball (though there are a few), there is a lot of repetitive damage. Imagine throwing a baseball at 90mph 100 times in a single game. Then do it every five days, thirty times over a regular season. Imagine being in an outfield making diving plays, or even just sprinting to make a catch. Then do it almost every day for three hours at a time. It's not that each game is that taxing (although I wouldn't want to make 100 pitches in a day) it's that the season all together just wears your body down. And that's not even counting the fact that <em>each game</em> has no clock! If a game has to go on for <a href="http://en.wikipedia.org/wiki/Longest_professional_baseball_game">33 innings</a> it will!</p>
<p>The bottom line is that between exhaustion and just plain bodily wear and tear, a baseball team's talent pool has to be deep in order to keep a consistent record.</p>
<p>Compare this to football where you have a few really key players that carry the team to victory. The hits are harder, but the games are shorter and the regular season is <em>1/10th</em> as long. Each player also has about a week to recover between games. There are a lot of offensive and defensive players that are completely unknown because in the end their job is to hold the line while these key figures (think Quarterback, Wide Receiver, Running Back) make the actual plays. Not that the rest of the line doesn't do their jobs, but their performance is aggregate. If the QB gets sacked often, it's the offense's fault, but not a single player. Likewise if the opponents score often, it's the defense's fault, but no one individual is at fault. There are no errors and no accountability except for that well known core of star players. Don't believe me? Ask any hardcore football fan to list their team's entire active roster - they <em>can't</em>. How do I know? Because a football team active roster has 80-90 players on it, most of which are basically interchangeable. I bet the average fan might not even be able to get past three or four of them. It's funny, football games (especially in the playoffs) are characterized as these great battles between titan quarterbacks and the two "titans" aren't even on the field at the same time.</p>
<p>Basketball should get an honorable mention here, however, as the NBA players play an impressive 80 games in the regular season and it's actually possible to distinguish each individual player's actions and errors. You still have powerful players that can carry teams, but at least the other members can't be ignored as integral parts of the whole.</p>
<h3 id="2-rivalry">2. Rivalry</h3>
<p>Rivalry is part of all team sports, but none of them do it better than baseball. Partially this is just because baseball has the longest history to draw upon. Teams like my hometown Cardinals and the Chicago Cubs have been mortal enemies since the dawn of time (or so I heard growing up in St. Louis). But aside from just history, baseball offers quite a lot of opportunity to flesh out the rivalries. In the 162 game regular season, your team will face any one of its (likely multiple) division rivals in five or even six <em>series</em> of 2-4 games apiece. That's a lot of games and is especially important because each series in and of itself has its own quirks and flavor instead of being a one-off match.</p>
<p>To give an example. This week, facing the Diamondbacks, in a 14 inning drag out fight, the D-bagsbacks beaned one of our best hitters <em>three times</em> in one game. Now, it didn't seem to be intentional and fortunately our man shrugged it off and kept playing but the next game retaliation was called for. Or right before that, this weird rain shifted series against the Giants with an unexpected double header. Or this current series with the Reds where they boo our catcher, Yadier Molina (best in the game), for a "brawl" he started with their second base Brandon Phillips <em>three years ago</em>.</p>
<p>Really, there isn't an opposing team in the division, or even the league, that your team doesn't have some layered past with and it adds an interesting context to each match up.</p>
<p>Again, compare this to football. Your team will play every other team exactly once, except for one that you'll play twice in the entire regular season. Sure, there's bad blood between teams but there's hardly any new information in each season and these rivalries are generally spawned by playoff snubs or flukes rather than any real long running enmity.</p>
<p>Similarly, in basketball you'll face a division rival four times for single games across the entire season, in soccer (MLS) it's three single games in the 35 game season.</p>
<p>Quite simply, none of them can hold up a legitimate rivalry the same way baseball can - to the point where the context of the game is almost as important as the content.</p>
<h3 id="3-stats">3. Stats</h3>
<p>A lot of folks complain that watching baseball is like getting stats thrown at you for a few hours. It's true, the commentators are constantly talking about it and displaying tables of stats. Truly absurd amounts of detail are recorded about each game and numbers like "Batting average on a day with less than an inch of rainfall, two outs, against a lefty" emerge. Okay, maybe it's not that bad, but stats exist in all games because they're the way you judge past, current, and predict future performance. The only difference is that baseball attempts to predict what a particular match up will yield instead of just using stats as a performance metric.</p>
<p>In football, you can judge your star players by things like touchdowns, interceptions, completions, and yards, but these only measure personal performance. These type of stats can tell if your team or player is improving, slipping or staying consistent but they <em>can't</em> predict performance versus another team or player. Knowing your player ran for 1000 yards and got 30 touchdowns last season only tells you that he's a strong player, it doesn't give you any hints about how he, or your team, will do against your opponent other than a vague sense that your players are doing better than their players. Admittedly, keeping detailed records to allow competitive stats doesn't make sense for a game where a lot of the grunt work is done by a wall of basically anonymous men rather than an individual with definable one on one match ups.</p>
<p>Basketball (points, rebounds, assists, steals, blocks) falls similarly into the personal stats, and soccer barely tracks player stats at all (goals, appearances).</p>
<p>Baseball, on the other hand, attempts to go much farther than that and give stats to predict performance specifically rather than just tally each player's records. Because just two men, the pitcher and the batter, are the focus of every play you can collect and analyze a much more relevant data set in determining how one will perform against the other. In turn that means that your predictions can be more accurate and your expectations for each at bat are grounded in reality.</p>
<p>So? Who cares? Well having a realistic prediction for a player means that you know when they're having a great day or a bad night. It means that you can find hope in a tough situation or find amazement when a player pulls off an unlikely feat. Miguel Cabrera's Triple Crown doesn't mean anything unless you realize how ridiculously unlikely it is. Seeing your players start a streak, or end a slump, or get a homer in a pitcher's park, or strike out the best hitter in the league all lose their luster when you don't acknowledge their probability.</p>
<p>Baseball, if you watch it mechanically, only occasionally replicates the visceral punch or athletic spectacle of the competing sports. But mere observation doesn't do the game of baseball justice. Baseball rewards <em>understanding</em> instead of observation. Context and probability is an integral part of enjoying the game. This is why baseball may not be the most accessible sport but also why once you wrap your head around the stats you start hanging on every at bat.</p>
<p>All in all, baseball is a sport with a subtle appeal spread over an epic scale. There is no game that offers more to those willing to appreciate its complexity. There is no game more steeped in history or the American experience. There is no game greater than baseball.</p>
On e-books2013-04-17T21:45:37+00:002013-04-17T21:45:37+00:00Unknownhttps://blog.codezen.org/posts/on-e-books/<p>I'll admit, at least when it comes to books, I'm an extreme Luddite. There's just something that I find comforting about the feel of a book in my hands, the sweet smell emanating from the aging pages of a paperback, or the excitement of getting a crisp new book.</p>
<p>For the past five or six years, I've kept an eye on the ebook industry but I failed to find a compelling reason to switch. Even now, the domain of the ebook reader is a weird back alley of tech. The technology looks and feels antiquated. E-ink readers are nice, power efficient, easily read in broad daylight, but for $140 (current Kindle Paperwhite) you get a device whose major selling point is the fact that it has a backlight. Others, like the Nook Glowlight advertise things like "fast page turn" for $120. All of them uniformly espouse power savings with a 6" screen that reminded me of an old Palm Pilot and a refresh rate reminiscent of scraping a clay tablet.</p>
<p>Also, ebooks are bullshit from a consumer freedom point of view. Look, I know that publishers are out to make money and I don't expect them to receive, filter, edit, and publish books for nothing but at the same time I see my public library with a wait list and a two week time limit on what amounts to a floppy disk (yeah, those 3.5 inch suckers in the days of yore) worth of data. Maybe a couple of floppies if there are lots of pretty pictures or the author has a problem with going on long irrelevant tangents (Stephenson, damn you). It doesn't make sense to me, the consumer, that there would be people waiting in line for copies of something that can be copied instantly, perfectly and at no cost.</p>
<p>There has to be a better way that combines the strength of the library (free public service with loads of media) with the strengths of the ebook (ease of duplication and transmission) that still gets the publishers a fair share. Publishers have only traditionally allowed libraries to operate because they posed no threat to sales. If a library buys three copies of a hit new book, then only three of its members can read that book at a time and everyone else either has to be patient or buy a copy and we all know how great the human race is at being patient. Now that actual physical scarcity no longer exists in the world of media, I'm not sure if there <em>is</em> a solution that doesn't screw at least one of the interested parties (publisher, library, member). Either the publisher takes a loss because the library eliminates scarcity, the library takes the hit because publishers switch to some model where they feel like they get compensated for lost sales, or - as it is now - the member gets screwed because an archaic system is being used to create artificial scarcity.</p>
<p>The library conundrum aside, the fact is that once you "own" an ebook you have fewer rights than owning a physical book. You can't lend books, for example, or if you can you can only lend them for short periods of time to other registered users. You can't resell ebooks, or exchange them. You can't do anything with them but read them (which is admittedly the primary purpose of a book, but nonetheless).</p>
<p>That said, I recently became a somewhat reluctant convert to the ebook.</p>
<p>There are a few salient points that have come into focus over the past year or so.</p>
<p>First, tablets make great ereaders. They don't go for 28 hours of reading on a single charge, but they also have sharp color screens and are capable of doing a thousand other things. For $60 more than the aforementioned ad-free Kindle Paperwhite you can get a Nexus 7 that will blow it away on all fronts other than power usage and the mythical "I'm using my electronic device on the beach because I'm not afraid of sand or water" usecase. Oh yeah, and the screen is lit and the pages turn fast too. This observation hasn't been lost on Amazon or Barnes and Noble either since they followed the release of the iPad with the Kindle Fire and Nook HD which are both full fledged tablets rather than ereaders.</p>
<p>Second, I started reading Terry Pratchett's Discworld series and immediately fell in love. The series is <strong>40 books long</strong>. At a brick and mortar book store, new paperbacks of Discworld are $10 apiece. That's roughly on par with Amazon (+ shipping). Doing the easy math, that's $400 to assemble a collection of all the Discworld books, assuming that they're all roughly the same price. Austin is a great town for used books too, but none of the various used book stores have a great number of Discworld books and none of them had any of the first four. In the end, to do used I'd have to go online where used copies range from $3 to $5 a pop so I'd have to spend let's say $160 (+ shipping) and wait weeks to get the books from a variety of sellers that probably have no issues calling a coffee stained paperback "like new". Alternatively, I could spend $5 a pop, get untarnished ebooks <em>instantly</em> and spend about half as much. For the $400 I'd spend on a complete collection I could get every ebook <em>and</em> buy a tablet to read them on. Economically both in time and money there's no contest.</p>
<p>What about the library I was ranting about earlier? Well, the Austin Public Library only had the second Discworld novel (the one I was looking for at the time I made this decision) in <em>ebook form</em>. Some of the other Discworld novels are around, mostly the later ones, but not consistently and it seems like they're almost all out of copies. For someone that can finish the comparatively short Discworld novels in two or three delicious sittings, the weeks of waiting in between books just isn't going to work. There's that artificial scarcity I mentioned working for the publisher.</p>
<p>Lastly, despite the fact that I value my rights as a consumer, it's impossible to argue that the ebooks don't have a lot of advantages. I bought <em>Mort</em>, the fourth Discworld novel, after I finished the third, <em>Equal Rites</em>. It was simple, instantaneous, and the ebook looks great. I can read the ebook anywhere (laptop, phone, tablet, random computers), there's an in-reader dictionary lookup, I can change the font sizes and spacing. In short, there's a lot more freedom in the acquisition of the books and the act of reading them which, considering I think I've lent out two or three books to friends in my entire life and virtually never resell recreational books, vastly outweighs the loss of rights to lend or resell them.</p>
<p>Now... if only I could get my tablet to smell like old paper...</p>
Creativity In, Creativity Out2013-02-11T18:15:17+00:002013-02-11T18:15:17+00:00Unknownhttps://blog.codezen.org/posts/creativity-in-creativity-out/<p>I have never wanted to write a novel as bad as when I was reading a good one. I have never wanted to code as much as when I've just discovered a brilliant piece of engineering. I have never wanted to throw down on canvas or clay than when I've watched an artist in fugue make masterpieces out of brute ingredients. Architecture, design, poetry, it's all the same. I cannot help but relay admiration for craftsmanship into abstract effort.</p>
<p>This is the core difference between mastery and competence. A master can use art to inspire.</p>
Android App: Memoires2013-01-30T20:45:27+00:002013-01-30T20:45:27+00:00Unknownhttps://blog.codezen.org/posts/android-app-memoires/<p>I've journaled off an on for my entire life. It seems natural to me, but I never seem to get around to it as often as I should. I almost always think about journaling when there's some great weight on my mind (like moving, switching jobs, Scarlett growing up, parents growing old - you know, the classics) and these topics always require a lot of context, a lot of back and forth and I can never seem to hand write more than two pages before my hand begins to cramp. I guess it's been too long since I've had to do written essays in school =).</p>
<p>So, in a flash of inspiration, I decided that I should look into audio journals. It's so much easier to capture the spirit of what you're conveying in words. You get all sorts of extra clues about the state of mind of the speaker. Most importantly, it's easier to talk for half an hour and hash out your thoughts than it is to write pages and pages.</p>
<p>I wish I could say that I did an exhaustive audit of Android audio recording apps and made a conscious decision but this flash of inspiration I had came at 1:30 in the morning on a night when I had a lot on my mind so I found a well-reviewed app and - so far - it's been awesome.</p>
<p><a href="https://play.google.com/store/apps/details?id=net.nakvic.dromoris&feature=nav_result#?t=W251bGwsMSwyLDNd"><img src="/memoires.png" alt="Memoires Logo" /></a></p>
<h3 id="memoires">Memoires</h3>
<p>The app in question is "Memoires: The Diary" written by Victor Nakonechny. The title seems a little pompous, is misspelled, and more than a little redundant, but it's a really nice all purpose journal app. It's free and it's on the <a href="https://play.google.com/store/apps/details?id=net.nakvic.dromoris&feature=nav_result#?t=W251bGwsMSwyLDNd">market</a>.</p>
<p>This is one solid app. You can keep audio snippets, pictures, and text in reverse chronological order. It amends each entry with the GPS location you made it in (which would be especially cool if you were traveling), the weather at the time, any tags you want, and of course the time and date. I can't personally imagine writing a standard text journal with it, but that's more because a phone's keyboard is tedious for long entries - a tablet might make that a lot more feasible.</p>
<p>The best part is the app will occasionally prompt you to backup which is extremely important if you don't want your journal to be reset by something stupid like phone failure, wipe, or thievery. I only tested the "backup to SD card" option because the other options seem less appropriate for a private, mostly audio journal but there are a lot of other options, like exporting to HTML, RTF, and various Google services. I decided to examine the .zip backup it created to make sure that it wasn't in some stupid format that might disappear if Memoires ever becomes unmaintained or broken, etc. and I found that it was pretty straightforward: a SQLite 3 database, and a directory including the raw recordings I had made. In short, nothing that couldn't be reconstructed if need be.</p>
<p>In addition to the backup settings, there are a number of other basic settings like a password - which immediately made me think of those flimsy diary locks I used to see as a kid. There are also themes and other appearance things (font size, etc.) that are just the icing on the cake.</p>
<p>All in all, I've been happy with it the few times I've had a reason to record in the last couple of weeks and I believe it deserves the high rating it gets on Google Play. If audio journaling is something that interests you, I'd highly recommend it.</p>
Fun with Roguelike Generators2013-01-23T23:02:36+00:002013-01-23T23:02:36+00:00Unknownhttps://blog.codezen.org/posts/fun-with-roguelike-generators/<p>I may or may not be tooling around with a roguelike. Not because I think the genre is dead (it most certainly isn't) but because some programming tasks are made fun just by their subject matter. I haven't quite gotten to the point where I'm using "mana" and "damage" and etc. as variable names, but that's not the first fun part. The first fun part is generating a rogue dungeon level.</p>
<p>Now, anybody that's ever even thought about developing a roguelike should know about <a href="http://roguelikedeveloper.blogspot.com/">ASCII Dreams</a> written by the developer of Unangband, Andrew Doull. I especially found his series on <a href="http://roguelikedeveloper.blogspot.com/2007/11/unangband-dungeon-generation-part-one.html">Unangband Dungeon Generation</a> to provide a lot of insight into generating dungeons that are interesting a long with a lot of interesting history and philosophizing.</p>
<p>In the end, though, I wanted to try my own, naive, hand at the dungeon generation problem. I did take a few major things away from Andrew's discussion however. Mostly that there are a lot of nice rooms that can be generating procedurally with simple tricks and, failing that, having a system for "vaults" (which are various, hand-designed rooms with interesting features) can be interspersed for extra flavor. Also, various features added to rooms, like water, lava, ice, minerals, rubble, etc. compel players to explore.</p>
<p>Most of this I'll get to later, if ever, with my toy generator. The first problem is generating the topology of the dungeon itself.</p>
<h3 id="my-approach">My Approach</h3>
<p>Now, one thing that I've found annoying about classic generation algorithms is that they tend to have a lot of really long tunnels. This is because rooms are generated at random across the static map and then, if they haven't merged together, are connected by tunnels. This has never felt right to me. I understand that - in universe - a dungeon might not have the most sensible design, but having long winding tunnels are boring. Doing connectivity checks on the rooms is boring as well. While we're at it, I don't want to have a predefined playing field (array) to work with. I'll put a limit on the area of the dungeon level, but if it's a whole bunch of tiny rooms in a very long line, so be it. Unfortunately, I also want the level to be consistent (i.e. no physics violating overlapping inconsistent geometry) so it seems inevitable that the level will eventually be represented on a global grid, but at least that grid will be bounded and reasonably shaped to the level. If necessary, after the level is fully generated the excess grid could be eliminated just by noting where one room enters into another.</p>
<p>So, what I wanted to do was generate a dungeon level that is both tunnel free (for the most part), consistent and connected a priori. Interesting stuff like themed-features, rivers, lava flows, etc. could then be painted over the level geometry in broad strokes.</p>
<h3 id="problems-vs-classical">Problems vs. Classical</h3>
<p>There are some troubles with this approach. The first of which is that it makes multiple level consistency really hard with multiple staircases. For a classical generator, you can randomly place down staircases on one level, and then replicate that pattern with up staircases on the next level and ensure that you have rooms to encompass them. This works when you're going to manually connect all the rooms in the end, but it doesn't work so well when you're building a pre-connected level. As such, either there has to be only a single up and down staircase per level (not a bad idea, really) or you have to throw that level of consistency out the window and just match arbitrary up and down staircases. This means that you could have two down staircases right next to each other that would teleport you to different ends of the next level, but in a gametype that traditionally promotes save scumming (i.e. if you go down the same staircase twice, the level is different each time you descend) I think that's acceptable.</p>
<p>Another problem is that, without tunnels, the dungeons are more likely to be dense. That's a good thing in the fact that it gives a lot more interesting rooms close by and the player spends a lot of time in an environment. It's also a dangerous thing because it means there's a lot fewer twisty places to get out of sight of pursuing monsters. I think that's acceptable as well, although it'll be something to account for if I ever get around to generating monsters.</p>
<h3 id="implementation">Implementation</h3>
<p>I decided to bang out a proof of concept in an evening. Breaking down the logic, the easiest way to generate in this fashion is to generate one room, which will be the root. Then, generate another room. Connect these two rooms with a doorway, then that whole complex becomes the root "room". Rinse and repeat until the dungeon is of a certain size.</p>
<p>In order to encompass this, I came up with a class for <code>Space</code>. A Space is any arbitrary portion of the dungeon level. It includes a 2-dimensional array <code>geometry</code> that describes what's in that space. One Space's geometry can be added to another Space's geometry with a set overlapping point. A <code>Room</code> is just a space with a name and whose geometry is likely a single room, but is arbitrary. Then, special types of rooms, like one mentioned in Unangband as the core type, two overlapping rectangles (which results in single rooms, crosses, T-shapes, L-shapes, etc.) are just Rooms with special geometry generation.</p>
<p>[expand title="Expand Code"]</p>
<pre data-lang="python" style="background-color:#2b303b;color:#c0c5ce;" class="language-python "><code class="language-python" data-lang="python"><span style="color:#65737e;">#!/usr/bin/python
</span><span>
</span><span style="color:#b48ead;">import </span><span>random
</span><span style="color:#b48ead;">import </span><span>sys
</span><span>
</span><span style="color:#b48ead;">def </span><span style="color:#8fa1b3;">chance</span><span>(</span><span style="color:#bf616a;">c</span><span>):
</span><span> </span><span style="color:#b48ead;">if </span><span>random.</span><span style="color:#bf616a;">randint</span><span>(</span><span style="color:#d08770;">1</span><span>, </span><span style="color:#d08770;">100</span><span>) <= c:
</span><span> </span><span style="color:#b48ead;">return </span><span style="color:#d08770;">True
</span><span> </span><span style="color:#b48ead;">return </span><span style="color:#d08770;">False
</span><span>
</span><span style="color:#b48ead;">def </span><span style="color:#8fa1b3;">rand_element</span><span>(</span><span style="color:#bf616a;">l</span><span>):
</span><span> </span><span style="color:#b48ead;">return </span><span>l[random.</span><span style="color:#bf616a;">randint</span><span>(</span><span style="color:#d08770;">0</span><span>, </span><span style="color:#96b5b4;">len</span><span>(l) - </span><span style="color:#d08770;">1</span><span>)]
</span><span>
</span><span style="color:#b48ead;">def </span><span style="color:#8fa1b3;">rand_block</span><span>(</span><span style="color:#bf616a;">max_x</span><span>, </span><span style="color:#bf616a;">max_y</span><span>):
</span><span> </span><span style="color:#b48ead;">return </span><span>(random.</span><span style="color:#bf616a;">randint</span><span>(</span><span style="color:#d08770;">0</span><span>, max_x), random.</span><span style="color:#bf616a;">randint</span><span>(</span><span style="color:#d08770;">0</span><span>, max_y))
</span><span>
</span><span style="color:#b48ead;">class </span><span style="color:#ebcb8b;">Space</span><span style="color:#eff1f5;">(</span><span style="color:#a3be8c;">object</span><span style="color:#eff1f5;">):
</span><span> </span><span style="color:#b48ead;">def </span><span style="color:#96b5b4;">__init__</span><span>(</span><span style="color:#bf616a;">self</span><span>, </span><span style="color:#bf616a;">geom </span><span>= []):
</span><span> </span><span style="color:#bf616a;">self</span><span>.global_x = </span><span style="color:#d08770;">0
</span><span> </span><span style="color:#bf616a;">self</span><span>.global_y = </span><span style="color:#d08770;">0
</span><span> </span><span style="color:#bf616a;">self</span><span>.geometry = geom
</span><span>
</span><span> </span><span style="color:#b48ead;">def </span><span style="color:#8fa1b3;">point</span><span>(</span><span style="color:#bf616a;">self</span><span>, </span><span style="color:#bf616a;">x</span><span>, </span><span style="color:#bf616a;">y</span><span>):
</span><span> </span><span style="color:#b48ead;">return </span><span>(</span><span style="color:#bf616a;">self</span><span>.global_x + x, </span><span style="color:#bf616a;">self</span><span>.global_y + y)
</span><span>
</span><span> </span><span style="color:#b48ead;">def </span><span style="color:#8fa1b3;">adjust_x</span><span>(</span><span style="color:#bf616a;">self</span><span>, </span><span style="color:#bf616a;">x</span><span>):
</span><span> </span><span style="color:#bf616a;">self</span><span>.global_x = x
</span><span>
</span><span> </span><span style="color:#b48ead;">def </span><span style="color:#8fa1b3;">adjust_y</span><span>(</span><span style="color:#bf616a;">self</span><span>, </span><span style="color:#bf616a;">y</span><span>):
</span><span> </span><span style="color:#bf616a;">self</span><span>.global_y = y
</span><span>
</span><span> </span><span style="color:#b48ead;">def </span><span style="color:#8fa1b3;">area</span><span>(</span><span style="color:#bf616a;">self</span><span>):
</span><span> area = </span><span style="color:#d08770;">0
</span><span> </span><span style="color:#b48ead;">for </span><span>row </span><span style="color:#b48ead;">in </span><span style="color:#bf616a;">self</span><span>.geometry:
</span><span> </span><span style="color:#b48ead;">for </span><span>x </span><span style="color:#b48ead;">in </span><span>row:
</span><span> </span><span style="color:#b48ead;">if </span><span>x:
</span><span> area += </span><span style="color:#d08770;">1
</span><span> </span><span style="color:#b48ead;">return </span><span>area
</span><span>
</span><span> </span><span style="color:#65737e;"># Create an initialized array for a space with dimensions. we can't just do
</span><span> </span><span style="color:#65737e;"># [[0] * x] * y because then the sublists are all just instances of the same
</span><span> </span><span style="color:#65737e;"># list.
</span><span>
</span><span> </span><span style="color:#b48ead;">def </span><span style="color:#8fa1b3;">space</span><span>(</span><span style="color:#bf616a;">self</span><span>, </span><span style="color:#bf616a;">x</span><span>, </span><span style="color:#bf616a;">y</span><span>, </span><span style="color:#bf616a;">val </span><span>= </span><span style="color:#d08770;">0</span><span>):
</span><span> geom = []
</span><span> </span><span style="color:#b48ead;">for </span><span>y </span><span style="color:#b48ead;">in </span><span style="color:#96b5b4;">range</span><span>(</span><span style="color:#d08770;">0</span><span>, y):
</span><span> geom.</span><span style="color:#bf616a;">append</span><span>([val] * x)
</span><span> </span><span style="color:#b48ead;">return </span><span style="color:#bf616a;">Space</span><span>(geom)
</span><span>
</span><span> </span><span style="color:#65737e;"># Add space takes two arbitrary spaces and merges together, using points
</span><span> </span><span style="color:#65737e;"># s1p and s2p as the same points in the resulting form.
</span><span>
</span><span> </span><span style="color:#65737e;"># If kwargs["chicken"] is True, it will return False (i.e. fail), if any of s1's
</span><span> </span><span style="color:#65737e;"># points are overwritten by s2 except for the intersection point.
</span><span>
</span><span> </span><span style="color:#b48ead;">def </span><span style="color:#8fa1b3;">add_space</span><span>(</span><span style="color:#bf616a;">self</span><span>, </span><span style="color:#bf616a;">sq</span><span>, </span><span style="color:#bf616a;">s1p</span><span>, </span><span style="color:#bf616a;">s2p</span><span>, **</span><span style="color:#bf616a;">kwargs</span><span>):
</span><span>
</span><span> chicken = </span><span style="color:#d08770;">False
</span><span> </span><span style="color:#b48ead;">if </span><span>"</span><span style="color:#a3be8c;">chicken</span><span>" in kwargs and kwargs["</span><span style="color:#a3be8c;">chicken</span><span>"]:
</span><span> chicken = </span><span style="color:#d08770;">True
</span><span>
</span><span> s1 = </span><span style="color:#bf616a;">self</span><span>.geometry
</span><span> s2 = sq.geometry
</span><span>
</span><span> s1_dim_y = </span><span style="color:#96b5b4;">len</span><span>(s1)
</span><span> s1_dim_x = </span><span style="color:#96b5b4;">len</span><span>(s1[</span><span style="color:#d08770;">0</span><span>])
</span><span>
</span><span> s1_o_x, s1_o_y = s1p
</span><span>
</span><span> s2_dim_y = </span><span style="color:#96b5b4;">len</span><span>(s2)
</span><span> s2_dim_x = </span><span style="color:#96b5b4;">len</span><span>(s2[</span><span style="color:#d08770;">0</span><span>])
</span><span>
</span><span> s2_o_x, s2_o_y = s2p
</span><span>
</span><span> g_max_x = s1_dim_x
</span><span>
</span><span> </span><span style="color:#65737e;"># Account for s2's width going farther to left
</span><span> </span><span style="color:#b48ead;">if </span><span>(s1_o_x < s2_o_x):
</span><span> s1_start_x = (s2_o_x - s1_o_x)
</span><span> s2_start_x = </span><span style="color:#d08770;">0
</span><span> g_max_x += s1_start_x
</span><span> </span><span style="color:#b48ead;">else</span><span>:
</span><span> s1_start_x = </span><span style="color:#d08770;">0
</span><span> s2_start_x = (s1_o_x - s2_o_x)
</span><span>
</span><span> </span><span style="color:#65737e;"># Account for s2's width going farther to right
</span><span> </span><span style="color:#b48ead;">if </span><span>((s1_dim_x - s1_o_x) < (s2_dim_x - s2_o_x)):
</span><span> g_max_x += (s2_dim_x - s2_o_x) - (s1_dim_x - s1_o_x)
</span><span>
</span><span> g_max_y = s1_dim_y
</span><span>
</span><span> </span><span style="color:#65737e;"># Account for s2's height going higher
</span><span> </span><span style="color:#b48ead;">if </span><span>(s1_o_y < s2_o_y):
</span><span> s1_start_y = (s2_o_y - s1_o_y)
</span><span> g_max_y += s1_start_y
</span><span> s2_start_y = </span><span style="color:#d08770;">0
</span><span> </span><span style="color:#b48ead;">else</span><span>:
</span><span> s1_start_y = </span><span style="color:#d08770;">0
</span><span> s2_start_y = (s1_o_y - s2_o_y)
</span><span>
</span><span> </span><span style="color:#65737e;"># Account for s2's depth going lower
</span><span> </span><span style="color:#b48ead;">if </span><span>((s1_dim_y - s1_o_y) < (s2_dim_y - s2_o_y)):
</span><span> g_max_y += (s2_dim_y - s2_o_y) - (s1_dim_y - s1_o_y)
</span><span>
</span><span> geom = </span><span style="color:#bf616a;">self</span><span>.</span><span style="color:#bf616a;">space</span><span>(g_max_x, g_max_y)
</span><span>
</span><span> </span><span style="color:#65737e;"># Draw both into geometry:
</span><span>
</span><span> </span><span style="color:#b48ead;">for </span><span>y </span><span style="color:#b48ead;">in </span><span style="color:#96b5b4;">range</span><span>(</span><span style="color:#d08770;">0</span><span>, s1_dim_y):
</span><span> </span><span style="color:#b48ead;">for </span><span>x </span><span style="color:#b48ead;">in </span><span style="color:#96b5b4;">range</span><span>(</span><span style="color:#d08770;">0</span><span>, s1_dim_x):
</span><span> geom.geometry[y + s1_start_y][x + s1_start_x] = s1[y][x]
</span><span>
</span><span> </span><span style="color:#b48ead;">for </span><span>y </span><span style="color:#b48ead;">in </span><span style="color:#96b5b4;">range</span><span>(</span><span style="color:#d08770;">0</span><span>, s2_dim_y):
</span><span> </span><span style="color:#b48ead;">for </span><span>x </span><span style="color:#b48ead;">in </span><span style="color:#96b5b4;">range</span><span>(</span><span style="color:#d08770;">0</span><span>, s2_dim_x):
</span><span> </span><span style="color:#b48ead;">if </span><span>s2[y][x]:
</span><span> </span><span style="color:#b48ead;">if </span><span>chicken and (x, y) != s2p and\
</span><span> geom.geometry[y + s2_start_y][x + s2_start_x]:
</span><span> </span><span style="color:#b48ead;">return </span><span style="color:#d08770;">False
</span><span> geom.geometry[y + s2_start_y][x + s2_start_x] = s2[y][x]
</span><span>
</span><span> </span><span style="color:#bf616a;">self</span><span>.</span><span style="color:#bf616a;">adjust_x</span><span>(s1_start_x)
</span><span> sq.</span><span style="color:#bf616a;">adjust_x</span><span>(s2_start_x)
</span><span>
</span><span> </span><span style="color:#bf616a;">self</span><span>.</span><span style="color:#bf616a;">adjust_y</span><span>(s1_start_y)
</span><span> sq.</span><span style="color:#bf616a;">adjust_y</span><span>(s2_start_y)
</span><span>
</span><span> </span><span style="color:#bf616a;">self</span><span>.geometry = geom.geometry
</span><span> </span><span style="color:#b48ead;">return </span><span style="color:#d08770;">True
</span><span>
</span><span> </span><span style="color:#65737e;"># Sort out surrounding used and unused coordinates.
</span><span>
</span><span> </span><span style="color:#b48ead;">def </span><span style="color:#8fa1b3;">_cardinal_sort</span><span>(</span><span style="color:#bf616a;">self</span><span>, </span><span style="color:#bf616a;">x</span><span>, </span><span style="color:#bf616a;">y</span><span>):
</span><span> unused = []
</span><span> used = []
</span><span> pairs = [(-</span><span style="color:#d08770;">1</span><span>, </span><span style="color:#d08770;">0</span><span>, </span><span style="color:#d08770;">0</span><span>),(</span><span style="color:#d08770;">0</span><span>, -</span><span style="color:#d08770;">1</span><span>, </span><span style="color:#d08770;">3</span><span>),(</span><span style="color:#d08770;">0</span><span>, </span><span style="color:#d08770;">1</span><span>, </span><span style="color:#d08770;">1</span><span>),(</span><span style="color:#d08770;">1</span><span>, </span><span style="color:#d08770;">0</span><span>, </span><span style="color:#d08770;">2</span><span>)]
</span><span>
</span><span> </span><span style="color:#b48ead;">for </span><span>off_y, off_x, direction </span><span style="color:#b48ead;">in </span><span>pairs:
</span><span> b = (x + off_x, y + off_y, direction)
</span><span> </span><span style="color:#65737e;"># Count out of bounds as unused.
</span><span> </span><span style="color:#b48ead;">if </span><span>(y + off_y) < </span><span style="color:#d08770;">0 </span><span>or\
</span><span> (y + off_y) >= </span><span style="color:#96b5b4;">len</span><span>(</span><span style="color:#bf616a;">self</span><span>.geometry) or\
</span><span> (x + off_x) < </span><span style="color:#d08770;">0 </span><span>or\
</span><span> (x + off_x) >= </span><span style="color:#96b5b4;">len</span><span>(</span><span style="color:#bf616a;">self</span><span>.geometry[y + off_y]) or\
</span><span> </span><span style="color:#bf616a;">self</span><span>.geometry[y + off_y][x + off_x] == </span><span style="color:#d08770;">0</span><span>:
</span><span> unused.</span><span style="color:#bf616a;">append</span><span>(b)
</span><span> </span><span style="color:#b48ead;">else</span><span>:
</span><span> used.</span><span style="color:#bf616a;">append</span><span>(b)
</span><span>
</span><span> </span><span style="color:#b48ead;">return </span><span>(used, unused)
</span><span>
</span><span> </span><span style="color:#65737e;"># Return a list of coordinates of used squares that have at least one
</span><span> </span><span style="color:#65737e;"># unused square (four-way) adjacent that, if used, would have no other used
</span><span> </span><span style="color:#65737e;"># neighbors but the first one. So, in summary
</span><span>
</span><span> </span><span style="color:#65737e;"># 1|
</span><span> </span><span style="color:#65737e;"># 2| <- all perimeter blocks
</span><span> </span><span style="color:#65737e;"># 3|
</span><span> </span><span style="color:#65737e;">#
</span><span> </span><span style="color:#65737e;"># 1|_ <-- neither are perimeter blocks
</span><span> </span><span style="color:#65737e;"># 2
</span><span>
</span><span> </span><span style="color:#65737e;"># The intent here is to find blocks where it's appropriate to attach a
</span><span> </span><span style="color:#65737e;"># doorway. For now, this only list blocks that are pressing against the
</span><span> </span><span style="color:#65737e;"># outside boundary of the geometry. There are some neat cases that could be
</span><span> </span><span style="color:#65737e;"># generated with finer granularity, but I'm not sure if that's better done
</span><span> </span><span style="color:#65737e;"># with specific generators.
</span><span>
</span><span> </span><span style="color:#b48ead;">def </span><span style="color:#8fa1b3;">connectable_coords</span><span>(</span><span style="color:#bf616a;">self</span><span>):
</span><span> r = []
</span><span> </span><span style="color:#b48ead;">for </span><span>i, y </span><span style="color:#b48ead;">in </span><span style="color:#96b5b4;">enumerate</span><span>(</span><span style="color:#bf616a;">self</span><span>.geometry):
</span><span> </span><span style="color:#b48ead;">for </span><span>j, x </span><span style="color:#b48ead;">in </span><span style="color:#96b5b4;">enumerate</span><span>(y):
</span><span>
</span><span> </span><span style="color:#65737e;"># Skip unused blocks
</span><span> </span><span style="color:#b48ead;">if </span><span>not x:
</span><span> </span><span style="color:#b48ead;">continue
</span><span>
</span><span> used, unused = </span><span style="color:#bf616a;">self</span><span>.</span><span style="color:#bf616a;">_cardinal_sort</span><span>(j, i)
</span><span> </span><span style="color:#b48ead;">for </span><span>s_x, s_y, s_d </span><span style="color:#b48ead;">in </span><span>unused:
</span><span> sub_used, sub_unused = </span><span style="color:#bf616a;">self</span><span>.</span><span style="color:#bf616a;">_cardinal_sort</span><span>(s_x, s_y)
</span><span> </span><span style="color:#b48ead;">if </span><span style="color:#96b5b4;">len</span><span>(sub_used) == </span><span style="color:#d08770;">1</span><span>:
</span><span> r.</span><span style="color:#bf616a;">append</span><span>((j, i, s_d))
</span><span> </span><span style="color:#b48ead;">return </span><span>r
</span><span>
</span><span> </span><span style="color:#b48ead;">def </span><span style="color:#8fa1b3;">print_geom</span><span>(</span><span style="color:#bf616a;">self</span><span>):
</span><span> </span><span style="color:#b48ead;">for </span><span>row </span><span style="color:#b48ead;">in </span><span style="color:#bf616a;">self</span><span>.geometry:
</span><span> p = ""
</span><span> </span><span style="color:#b48ead;">for </span><span>x </span><span style="color:#b48ead;">in </span><span>row:
</span><span> </span><span style="color:#b48ead;">if </span><span>x:
</span><span> p += ("</span><span style="color:#d08770;">%s</span><span>" % (</span><span style="color:#96b5b4;">chr</span><span>(x),))
</span><span> </span><span style="color:#b48ead;">else</span><span>:
</span><span> p += " "
</span><span> </span><span style="color:#96b5b4;">print</span><span>(p)
</span><span>
</span><span> </span><span style="color:#b48ead;">def </span><span style="color:#8fa1b3;">gen</span><span>(</span><span style="color:#bf616a;">self</span><span>):
</span><span> </span><span style="color:#b48ead;">pass
</span><span>
</span><span>
</span><span style="color:#b48ead;">class </span><span style="color:#ebcb8b;">Room</span><span style="color:#eff1f5;">(</span><span style="color:#a3be8c;">Space</span><span style="color:#eff1f5;">):
</span><span> </span><span style="color:#b48ead;">def </span><span style="color:#96b5b4;">__init__</span><span>(</span><span style="color:#bf616a;">self</span><span>):
</span><span> Space.</span><span style="color:#96b5b4;">__init__</span><span>(</span><span style="color:#bf616a;">self</span><span>)
</span><span> </span><span style="color:#bf616a;">self</span><span>.name = ""
</span><span>
</span><span> </span><span style="color:#bf616a;">self</span><span>.name_prefixes = [ "</span><span style="color:#a3be8c;">Beautiful</span><span>", "</span><span style="color:#a3be8c;">Evil</span><span>", "</span><span style="color:#a3be8c;">Corrupted</span><span>", "</span><span style="color:#a3be8c;">Pristine</span><span>" ]
</span><span> </span><span style="color:#bf616a;">self</span><span>.name_suffixes = [ "</span><span style="color:#a3be8c;">of Doom</span><span>", "</span><span style="color:#a3be8c;">of Dancing</span><span>", "</span><span style="color:#a3be8c;">of Flowers</span><span>", "</span><span style="color:#a3be8c;">of Blood</span><span>" ]
</span><span> </span><span style="color:#bf616a;">self</span><span>.name_bases = [ "</span><span style="color:#a3be8c;">Room</span><span>" ]
</span><span>
</span><span> </span><span style="color:#bf616a;">self</span><span>.name_prefix_chance = </span><span style="color:#d08770;">25
</span><span> </span><span style="color:#bf616a;">self</span><span>.name_suffix_chance = </span><span style="color:#d08770;">25
</span><span>
</span><span> </span><span style="color:#b48ead;">def </span><span style="color:#8fa1b3;">give_name</span><span>(</span><span style="color:#bf616a;">self</span><span>):
</span><span> n = ""
</span><span> </span><span style="color:#b48ead;">if </span><span style="color:#bf616a;">chance</span><span>(</span><span style="color:#bf616a;">self</span><span>.name_prefix_chance):
</span><span> n += </span><span style="color:#bf616a;">rand_element</span><span>(</span><span style="color:#bf616a;">self</span><span>.name_prefixes) + " "
</span><span> n += </span><span style="color:#bf616a;">rand_element</span><span>(</span><span style="color:#bf616a;">self</span><span>.name_bases)
</span><span> </span><span style="color:#b48ead;">if </span><span style="color:#bf616a;">chance</span><span>(</span><span style="color:#bf616a;">self</span><span>.name_suffix_chance):
</span><span> n += " " + </span><span style="color:#bf616a;">rand_element</span><span>(</span><span style="color:#bf616a;">self</span><span>.name_suffixes)
</span><span> </span><span style="color:#bf616a;">self</span><span>.name = n
</span><span>
</span><span> </span><span style="color:#b48ead;">def </span><span style="color:#8fa1b3;">gen</span><span>(</span><span style="color:#bf616a;">self</span><span>):
</span><span> </span><span style="color:#bf616a;">self</span><span>.</span><span style="color:#bf616a;">give_name</span><span>()
</span><span>
</span><span style="color:#b48ead;">class </span><span style="color:#ebcb8b;">SimpleRoom</span><span style="color:#eff1f5;">(</span><span style="color:#a3be8c;">Room</span><span style="color:#eff1f5;">):
</span><span> </span><span style="color:#b48ead;">def </span><span style="color:#8fa1b3;">gen</span><span>(</span><span style="color:#bf616a;">self</span><span>, </span><span style="color:#bf616a;">x</span><span>, </span><span style="color:#bf616a;">y</span><span>, </span><span style="color:#bf616a;">val</span><span>):
</span><span> Room.</span><span style="color:#bf616a;">gen</span><span>(</span><span style="color:#bf616a;">self</span><span>)
</span><span> </span><span style="color:#bf616a;">self</span><span>.geometry = </span><span style="color:#bf616a;">self</span><span>.</span><span style="color:#bf616a;">space</span><span>(x, y, val).geometry
</span><span>
</span><span style="color:#b48ead;">class </span><span style="color:#ebcb8b;">SimpleAdditiveRoom</span><span style="color:#eff1f5;">(</span><span style="color:#a3be8c;">Room</span><span style="color:#eff1f5;">):
</span><span> </span><span style="color:#b48ead;">def </span><span style="color:#8fa1b3;">gen</span><span>(</span><span style="color:#bf616a;">self</span><span>, </span><span style="color:#bf616a;">min_x</span><span>, </span><span style="color:#bf616a;">max_x</span><span>, </span><span style="color:#bf616a;">min_y</span><span>, </span><span style="color:#bf616a;">max_y</span><span>, </span><span style="color:#bf616a;">val</span><span>):
</span><span> Room.</span><span style="color:#bf616a;">gen</span><span>(</span><span style="color:#bf616a;">self</span><span>)
</span><span>
</span><span> </span><span style="color:#65737e;"># Get section 1 dimensions
</span><span> r1_dim_x = random.</span><span style="color:#bf616a;">randint</span><span>(min_x, max_x)
</span><span> r1_dim_y = random.</span><span style="color:#bf616a;">randint</span><span>(min_y, max_y)
</span><span>
</span><span> </span><span style="color:#65737e;"># Section 2 dimensions
</span><span> r2_dim_x = random.</span><span style="color:#bf616a;">randint</span><span>(min_x, max_x)
</span><span> r2_dim_y = random.</span><span style="color:#bf616a;">randint</span><span>(min_y, max_y)
</span><span>
</span><span> </span><span style="color:#65737e;"># Random overlapping points
</span><span> r1p = </span><span style="color:#bf616a;">rand_block</span><span>(r1_dim_x, r1_dim_y)
</span><span> r2p = </span><span style="color:#bf616a;">rand_block</span><span>(r2_dim_x, r2_dim_y)
</span><span>
</span><span> r1 = </span><span style="color:#bf616a;">self</span><span>.</span><span style="color:#bf616a;">space</span><span>(r1_dim_x, r1_dim_y, val)
</span><span> r2 = </span><span style="color:#bf616a;">self</span><span>.</span><span style="color:#bf616a;">space</span><span>(r2_dim_x, r2_dim_y, val)
</span><span>
</span><span> </span><span style="color:#bf616a;">self</span><span>.geometry = r1.geometry
</span><span> </span><span style="color:#bf616a;">self</span><span>.</span><span style="color:#bf616a;">add_space</span><span>(r2, r1p, r2p)
</span><span>
</span><span style="color:#b48ead;">class </span><span style="color:#ebcb8b;">Hallway</span><span style="color:#eff1f5;">(</span><span style="color:#a3be8c;">Space</span><span style="color:#eff1f5;">):
</span><span> </span><span style="color:#b48ead;">def </span><span style="color:#8fa1b3;">gen</span><span>(</span><span style="color:#bf616a;">self</span><span>, </span><span style="color:#bf616a;">x</span><span>, </span><span style="color:#bf616a;">y</span><span>, </span><span style="color:#bf616a;">val</span><span>):
</span><span> Space.</span><span style="color:#bf616a;">gen</span><span>(</span><span style="color:#bf616a;">self</span><span>)
</span><span> </span><span style="color:#bf616a;">self</span><span>.geometry = </span><span style="color:#bf616a;">self</span><span>.</span><span style="color:#bf616a;">space</span><span>(x, y, val).geometry
</span><span>
</span><span style="color:#b48ead;">if </span><span>__name__ == "</span><span style="color:#a3be8c;">__main__</span><span>":
</span><span> root = </span><span style="color:#bf616a;">SimpleAdditiveRoom</span><span>()
</span><span> root.</span><span style="color:#bf616a;">gen</span><span>(</span><span style="color:#d08770;">3</span><span>, </span><span style="color:#d08770;">10</span><span>, </span><span style="color:#d08770;">3</span><span>, </span><span style="color:#d08770;">10</span><span>, </span><span style="color:#96b5b4;">ord</span><span>('</span><span style="color:#a3be8c;">A</span><span>'))
</span><span>
</span><span> val = </span><span style="color:#96b5b4;">ord</span><span>('</span><span style="color:#a3be8c;">B</span><span>')
</span><span>
</span><span> </span><span style="color:#b48ead;">while </span><span>root.</span><span style="color:#bf616a;">area</span><span>() < </span><span style="color:#d08770;">2000</span><span>:
</span><span> sr2 = </span><span style="color:#bf616a;">SimpleAdditiveRoom</span><span>()
</span><span> sr2.</span><span style="color:#bf616a;">gen</span><span>(</span><span style="color:#d08770;">3</span><span>, </span><span style="color:#d08770;">10</span><span>, </span><span style="color:#d08770;">3</span><span>, </span><span style="color:#d08770;">10</span><span>, val)
</span><span>
</span><span> c1 = </span><span style="color:#bf616a;">rand_element</span><span>(root.</span><span style="color:#bf616a;">connectable_coords</span><span>())
</span><span>
</span><span> m = [ </span><span style="color:#d08770;">2</span><span>, </span><span style="color:#d08770;">3</span><span>, </span><span style="color:#d08770;">0</span><span>, </span><span style="color:#d08770;">1 </span><span>]
</span><span> c2 = </span><span style="color:#bf616a;">rand_element</span><span>([ x </span><span style="color:#b48ead;">for </span><span>x </span><span style="color:#b48ead;">in </span><span>sr2.</span><span style="color:#bf616a;">connectable_coords</span><span>() </span><span style="color:#b48ead;">if </span><span>x[</span><span style="color:#d08770;">2</span><span>] == m[c1[</span><span style="color:#d08770;">2</span><span>]]])
</span><span>
</span><span> hall = </span><span style="color:#bf616a;">Hallway</span><span>()
</span><span>
</span><span> </span><span style="color:#b48ead;">if </span><span>c1[</span><span style="color:#d08770;">2</span><span>] == </span><span style="color:#d08770;">0</span><span>:
</span><span> hall.</span><span style="color:#bf616a;">gen</span><span>(</span><span style="color:#d08770;">1</span><span>, </span><span style="color:#d08770;">3</span><span>, </span><span style="color:#96b5b4;">ord</span><span>('</span><span style="color:#a3be8c;">+</span><span>'))
</span><span> hall.</span><span style="color:#bf616a;">add_space</span><span>(root, hall.</span><span style="color:#bf616a;">point</span><span>(</span><span style="color:#d08770;">0</span><span>,</span><span style="color:#d08770;">2</span><span>), c1[:</span><span style="color:#d08770;">2</span><span>])
</span><span> r = hall.</span><span style="color:#bf616a;">add_space</span><span>(sr2, hall.</span><span style="color:#bf616a;">point</span><span>(</span><span style="color:#d08770;">0</span><span>,</span><span style="color:#d08770;">0</span><span>), c2[:</span><span style="color:#d08770;">2</span><span>], </span><span style="color:#bf616a;">chicken </span><span>= </span><span style="color:#d08770;">True</span><span>)
</span><span> </span><span style="color:#b48ead;">elif </span><span>c1[</span><span style="color:#d08770;">2</span><span>] == </span><span style="color:#d08770;">2</span><span>:
</span><span> hall.</span><span style="color:#bf616a;">gen</span><span>(</span><span style="color:#d08770;">1</span><span>, </span><span style="color:#d08770;">3</span><span>, </span><span style="color:#96b5b4;">ord</span><span>('</span><span style="color:#a3be8c;">+</span><span>'))
</span><span> hall.</span><span style="color:#bf616a;">add_space</span><span>(root, hall.</span><span style="color:#bf616a;">point</span><span>(</span><span style="color:#d08770;">0</span><span>,</span><span style="color:#d08770;">0</span><span>), c1[:</span><span style="color:#d08770;">2</span><span>])
</span><span> r = hall.</span><span style="color:#bf616a;">add_space</span><span>(sr2, hall.</span><span style="color:#bf616a;">point</span><span>(</span><span style="color:#d08770;">0</span><span>,</span><span style="color:#d08770;">2</span><span>), c2[:</span><span style="color:#d08770;">2</span><span>], </span><span style="color:#bf616a;">chicken </span><span>= </span><span style="color:#d08770;">True</span><span>)
</span><span> </span><span style="color:#b48ead;">elif </span><span>c1[</span><span style="color:#d08770;">2</span><span>] == </span><span style="color:#d08770;">1</span><span>:
</span><span> hall.</span><span style="color:#bf616a;">gen</span><span>(</span><span style="color:#d08770;">3</span><span>, </span><span style="color:#d08770;">1</span><span>, </span><span style="color:#96b5b4;">ord</span><span>('</span><span style="color:#a3be8c;">+</span><span>'))
</span><span> hall.</span><span style="color:#bf616a;">add_space</span><span>(root, hall.</span><span style="color:#bf616a;">point</span><span>(</span><span style="color:#d08770;">0</span><span>,</span><span style="color:#d08770;">0</span><span>), c1[:</span><span style="color:#d08770;">2</span><span>])
</span><span> r = hall.</span><span style="color:#bf616a;">add_space</span><span>(sr2, hall.</span><span style="color:#bf616a;">point</span><span>(</span><span style="color:#d08770;">2</span><span>,</span><span style="color:#d08770;">0</span><span>), c2[:</span><span style="color:#d08770;">2</span><span>], </span><span style="color:#bf616a;">chicken </span><span>= </span><span style="color:#d08770;">True</span><span>)
</span><span> </span><span style="color:#b48ead;">elif </span><span>c1[</span><span style="color:#d08770;">2</span><span>] == </span><span style="color:#d08770;">3</span><span>:
</span><span> hall.</span><span style="color:#bf616a;">gen</span><span>(</span><span style="color:#d08770;">3</span><span>, </span><span style="color:#d08770;">1</span><span>, </span><span style="color:#96b5b4;">ord</span><span>('</span><span style="color:#a3be8c;">+</span><span>'))
</span><span> hall.</span><span style="color:#bf616a;">add_space</span><span>(root, hall.</span><span style="color:#bf616a;">point</span><span>(</span><span style="color:#d08770;">2</span><span>,</span><span style="color:#d08770;">0</span><span>), c1[:</span><span style="color:#d08770;">2</span><span>])
</span><span> r = hall.</span><span style="color:#bf616a;">add_space</span><span>(sr2, hall.</span><span style="color:#bf616a;">point</span><span>(</span><span style="color:#d08770;">0</span><span>,</span><span style="color:#d08770;">0</span><span>), c2[:</span><span style="color:#d08770;">2</span><span>], </span><span style="color:#bf616a;">chicken </span><span>= </span><span style="color:#d08770;">True</span><span>)
</span><span>
</span><span> </span><span style="color:#b48ead;">if </span><span>r:
</span><span> root = hall
</span><span> val += </span><span style="color:#d08770;">1
</span><span>
</span><span> root.</span><span style="color:#bf616a;">print_geom</span><span>()
</span></code></pre>
<p>[/expand]</p>
<p>I got a little lazy with the execution of <code>__main__</code>. There's a cleaner way to deal with matching up the direction end-points (hell, just take a random one and rotate the entire room to match, really) but for an evening's playing around I think the results are actually pretty nice.</p>
<p>[expand title="Expand Example"]</p>
<pre style="background-color:#2b303b;color:#c0c5ce;"><code><span>
</span><span>
</span><span> ]]]]]]
</span><span> ]]]]]]
</span><span> ]]]]]]]]]]]
</span><span> ]]]]]]]]]]]
</span><span> ]]]]]]]]]]]
</span><span> ]]]]]]]]]]]
</span><span> ]]]]]]]]]]]
</span><span> ]]]]]]]]]]] UUUUUUUU
</span><span> ]]]]]] UUUUUUUU
</span><span> + UUUUUUUUUU
</span><span> ZZZZ UUUUUUUUUU
</span><span> ZZZZ UUUUUUUUUU
</span><span> ZZZZ UUUUUUUUUU
</span><span> ZZZZ UUUUUUUU MMMMMMMMM
</span><span> ZZZZZZZZ UUUUUUUU+MMMMMMMMM
</span><span> ZZZZZZZZ UUUUUUUU MMMMMMMMM
</span><span> ZZZZZZZZ UUUUUUUU MMMMMMMMM
</span><span> ZZZZZZZZ MMMMMM
</span><span> ZZZZZZZZ MMMMMM
</span><span> ZZZZZZZZ JJJJJJJ MMMMMM
</span><span> ZZZZZZZZ JJJJJJJ MMMMMM
</span><span> + JJJJJJJ +
</span><span> WWWWWWW JJJJJJJJJJJJJJ
</span><span> WWWWWWWWWW NNNNNN JJJJJJJJJJJJJJ
</span><span> WWWWWWWWWW NNNNNN JJJJJJJJJJJJJJ
</span><span> WWWWWWWWWW+NNNNNN JJJJJJJJJJJJJJ
</span><span> WWWWWWWWWW NNNNNN +
</span><span> WWWWWWWWWW NNNNNNBBBBBBBB
</span><span> WWWWWWWWWW NNNNNNBBBBBBBBBB
</span><span> WWWWWWWWWW NNNNNNBBBBBBBBBB
</span><span> WWWWWWW NNNN BBBBBBBBBB
</span><span> WWWWWWW NNNN BBBBBBBBBB
</span><span> OOOOOOOOOONNNN BBBB
</span><span> OOOOOOOOOO + BBBB
</span><span> OOOOOOOOOO FFFFFFF BBBB
</span><span> OOOOOOOOOO FFFFFFF BBBB
</span><span> OOOOOOOOOO FFFFFFF +
</span><span> OOOOOOOOOO FFFFFFF AAAAAAAAAAA
</span><span> OOOOOOOOOO FFFFFFF+AAAAAAAAAAA
</span><span> OOOOOOOOOO FFFFFFF AAAAAAAAAAA
</span><span> OOOOOOOOOO FFFFFFF AAAAA
</span><span> OOOOOOOOOO+FFFFFFF AAAAA PPPPPPPPP
</span><span> OOOOO FFFFFFF AAAAA PPPPPPPPP
</span><span> OOOOO LLL FFFFFFF AAAAA PPPPPPPPP TTTT
</span><span> LLL + + PPPPPPPPP TTTT
</span><span> LLLLLLL CCCCC PPPPPPPPP+TTTT
</span><span> LLLLLLL CCCCC PPPP + TTTTT
</span><span> LLLLLLL CCCCC HHHHHHHHHH TTTTT
</span><span> [[[[[[[[[ CCCCCCCCCC HHHHHHHHHH TTTTT XXXXXXXXXX
</span><span> [[[[[[[[[ CCCCCCCCCC HHHHHHHHHHHHTTTTT XXXXXXXXXXX
</span><span> [[[[[[[[[ GGGGGGGGGG CCCCCCCCCC HHHHHHHHHHHHTTTTT+XXXXXXXXXXX
</span><span> [[[[[[[[[ GGGGGGGGGG EEEEE+CCCCCCCCCC HHHHHHHHHHHH XXXXXXXXXX
</span><span> [[[[[[[[[ GGGGGGGGGG EEEEE CCCCCCCCCC+HHHHHHHHHH XXXXXXXXXX
</span><span> [[[[[[[[[ GGGGGGGGGG EEEEEE CCCCCCCCCC XXXXXXXXXX
</span><span> [[[[[[[[[+GGGGGGGGGG EEEEEE CCCCCCCCCC XXXXXXXXXX
</span><span> [[[[[[[[[[[ GGGGGGGGGG EEEEEE + XXXXXXXXXX
</span><span> [[[[[[[[[[[ GGGGGGGGGG EEE DDD
</span><span> [[[[[[[[[[[ GGGGGGGGGG+EEE DDD
</span><span> [[[[[[[[ GGGGGGGGGG EEE III DDD
</span><span> [[[[[[[[ GGGGGGGGGG EEE IIII DDD
</span><span> [[[[[[[[ + EEE IIII DDD
</span><span> [[[[[[[[ KKK EEE IIII DDD
</span><span> KKK IIII DDD
</span><span> KKK IIII+DDDQQQQ
</span><span> KKK IIII QQQQQQQQQQ
</span><span> KKKKKKK IIII+QQQQQQQQQQ
</span><span> KKKKKKK IIII QQQQQQQQQQ
</span><span> KKKKKKK IIII QQQQQQQQQQ
</span><span> KKKKKKK +
</span><span> KKKKKKK SSS
</span><span>\\\\\\\\\ KKKKKKK SSSSSSSS
</span><span>\\\\\\\\\ KKKKKKK SSSSSSSS
</span><span>\\\\\\\\\ KKKKKKK SSSSSSSS
</span><span>\\\\\\\\\ KKKKKKK SSSSSSSS
</span><span>\\\\\\\\\\\\\\ KKKKKKK SSSSSSSS
</span><span>\\\\\\\\\\\\\\ + SSSSSSSS
</span><span>\\\\\\\\\\\\\\RRRRRRRRR SSSSSSSS
</span><span> \\\\\\\\RRRRRRRRR SSS
</span><span> \\\\\\\\RRRRRRRRR
</span><span> \\\\\\\\RRRRRRRRR
</span><span> + RRRRRRRRR
</span><span> VVVVV RRRRRRRRR
</span><span> VVVVVVV RRRRRRRRR
</span><span> VVVVVVV+RRRRRRRRR
</span><span> VVVVVVV RRRRRRRRR
</span><span> + RRRRRRRRR
</span><span> YYYYY
</span><span> YYYYY
</span><span> YYYYY
</span><span> YYYYY
</span><span> YYYYYYYYYY
</span><span> YYYYYYYYYY
</span><span> YYYYYYYYYY
</span><span> YYYYYYYYYY
</span><span>
</span></code></pre>
<p>[/expand]</p>
<p>Not many long tunnels, and a large number of rooms (which are indicated by different letters. Doorways are +s. There are still, of course, some places the geometry doesn't make sense. Usually when two joined rooms have a doorway and also have adjacent open blocks (like P and H in the above). However, all in all, not bad for an evening's screwing around.</p>
On the Steam Box2012-12-11T08:52:13+00:002012-12-11T08:52:13+00:00Unknownhttps://blog.codezen.org/posts/on-the-steam-box/<p>The <a href="http://www.cnet.com.au/gabe-newell-says-steam-box-is-a-go-339342744.htm">Steam Box</a> has been making the news lately, most recently with a confirmation from the venerable Gabe that it's a thing that may exist in our plane of reality. There's also been a lot of talk lately about the Steam Linux beta (that I got in to, hooray!) and the release of Steam's Big Picture which is a console like controller interface intended for big screens (i.e. TVs).</p>
<p>Because of the timing, a lot of these Steam Box announcements, and a lot of the buzz around it has been that this box will run Linux. As such, in the gaming community there's a lot of "whoa, Linux... what does that mean for us?" and in the Linux community there's a lot of "finally Linux games!" I love Steam, I own a handful of titles in it, and I'm extremely pleased that they've put out a native Linux client (even in beta form). However, I am totally unconvinced that this is going to be a Linux based Steam machine, despite the timing. Here's my logic.</p>
<p>[toc]</p>
<h3 id="why-not-linux">Why Not Linux?</h3>
<p>I think that it's likely that a Valve console would take advantage of the huge Steam library. They've put almost a decade of effort into turning Steam into a slick, painless, even fun experience and they've sold millions of games. Steam is now a big release platform for a lot of AAA publishers (Bethesda, id, Eidos, Firaxis, Gearbox, etc.) as well as a load of indie publishers that wouldn't have found nearly the following if it wasn't as painless to find out about them and pay them.</p>
<p>It seems to me that Valve would be making a huge mistake if they're not parlaying that massive, successful library directly into their prospective console. Bringing a handful of AAA launch titles into your living room on day one makes the Steam Box just another console that differentiates itself with maybe a handful of Valve exclusives (Half-life 3, anybody?). Bringing 2000 mature, well-loved and <em>already purchased</em> games into your living room with a cheap box and promising all the future PC releases would be <em>killer</em>. In addition, a Steam Box that was just a Windows machine with a slick interface would suddenly become the defacto PC spec - solving an issue that game devs have struggled with since the very beginning of PC gaming, namely how to deal with the thousands of different hardware and resource configurations. Finally, it would have the added benefit that literally any game that runs on Windows would effectively work out of the box (perhaps with a little tweaking for the spec, or any novel input devices, but without the pain of a full port).</p>
<p>There is a whole lot of greatness in bringing a cheap, well configured and standardized PC into the living room with a giant library of already working and popular games.</p>
<p>Unfortunately, with a Linux based OS on it, this is impossible. Valve titles would be ported, of course (and in fact that seems like it will happen regardless thanks to the Steam Linux beta) and a fair number of indie games already have ports, but what about the library titles that would strengthen a console release? How many developers can Valve convince into doing a free port of an older game? I believe the answer is very few because for most of these old games there's no profit in it. Technology like Wine could be used, but if your focus is on solid gaming experience that's a whole new set of problems. As such, using a Linux based OS would almost completely obviate the advantage of the Steam library.</p>
<h3 id="why-i-could-be-and-hope-i-am-wrong">Why I Could Be (And Hope I Am) Wrong</h3>
<p>First of all, perhaps I'm overstating the likelihood of the Steam library coming to the living room. A lot of the older, unportable games would not be controller friendly and if they're aiming for a more traditional controller oriented approach (instead of controller, mouse, and keyboard) they'd be worthless and hard to play even if they ran perfectly. Not to mention the fact that, by definition, the entire existing library already runs elsewhere which doesn't really give the Steam Box any draw over a gaming PC except perhaps to those without the cash for an expensive pre-built or the know-how to build their own.</p>
<p>In essence, maybe losing compatibility wouldn't be the worst thing in the world and if that's the case Linux starts making a whole lot more sense. You get a very mature stack from kernel through display and because you're targeting a single hardware configuration you can create a stable, well-tested release on top of open source components fairly easily. Compared to the amount of time it would take to custom develop the entire stack, the bugfixing would take a trivial amount of time and effort.</p>
<p>Second, Linux is free as in freedom. What other console developer would be able to glean fixes and features from unpaid volunteers?</p>
<p>Third, Linux is free as in beer. A Steam library compatible approach would have to come packaged with a Windows license which easily adds $100 to the unsubsidized price tag of the device. Ideally, if they chose to go this route, they could get a deal from Microsoft. The Dreamcast, for example, ran a version of WinCE developed by Microsoft that was seamless. That was before the Xbox hit the scene however and I highly doubt Microsoft would be so amenable these days. On the other hand, if the alternative is to have a Linux box running AAA games, they might be better served by giving Valve a deal to maintain their edge in the desktop space. Either way, though the box becomes more expensive and they lose the advantage of the open source stack.</p>
<p>The final, and best fact for the possibility of Linux on the console is that, if they chose to ignore compatibility, and went the more traditional console route with a release in 2014 / 2015, they'd have plenty of time to rally support for Linux titles, get the already existing Linux ports lined up and polished, and - in the end - come to the table with a more extensive library than any of the competitors.</p>
<h3 id="tl-dr">tl;dr</h3>
<table><thead><tr><th></th><th></th><th></th></tr></thead><tbody>
<tr><td>Base</td><td>PROS</td><td>CONS</td></tr>
<tr><td>Windows</td><td>* Massive Steam library already polished and working</td><td></td></tr>
</tbody></table>
<ul>
<li>Easy to productize fast</li>
<li>Already mature
.
| * Take a price hit on licensing / packaging Windows</li>
<li>Less fine grain control of software stack
|
| Linux | * Free (as in beer) - lower end price</li>
<li>Open source - get fixes from volunteers</li>
<li>Already mature
| * Not many existing ports in the catalog</li>
<li>Brand new platform without much industry expertise
|</li>
</ul>
<p>I'm still not convinced that this isn't going to end up being Valve's effort to further monetize their work on the existing Steam library, but if they are willing to start a serious console from scratch then Linux is cleary the way to go. None of the information we already know about the device seems to indicate which approach Valve is favoring and as such I think it's premature to make assumptions.</p>
On Intermediate Dwarf Fortress2012-11-25T19:59:24+00:002012-11-25T19:59:24+00:00Unknownhttps://blog.codezen.org/posts/on-intermediate-dwarf-fortress/<p>I've been playing Dwarf Fortress a lot these days, after a hiatus and I finally managed to get my first Barony (i.e. a stable fortress that's got enough imports, exports, and population to get a noble - the first step to a monarchy). This fortress is about five years old, which is a feat in and of itself, but it's survived four good sieges, a minotaur attack and initially I thought it was cursed and doomed to be a failure (I had a failed strange mood dwarf turn out to be a vampire that went berserk and lost 5 dwarves and damn near tantrum spiralling the remaining 10 and then had some migrants show up pissed off and some dwarven babies die mysteriously and a vampire fishery worker that got elected mayor... I could go on).</p>
<p>I thought I'd take advantage of this milestone to write a few things that I've realized in my last year or two of Dwarf Fortress that may not be obvious to even players that have been at it for while and had their share of FUN. As such I won't be covering basics like food production or embark, but leaning more toward intermediate strategy and surprises.</p>
<p>The first tidbit I have is that <strong>Dwarf Fortress is all about supply</strong>. Half of your game is spent supplying masons with stone, smelters with ore, forges with bars, food, fuel, water, furniture. You have to look at optimizing the speed at which your supply chains work in order to avoid getting bogged down.</p>
<p>This starts with specialization. First, of the stockpile. General stockpiles have their uses (like keeping all of your workshops uncluttered), but general stone stockpiles will get choked quickly. Even general metal ore stockpiles will get bogged down in tetrahedrite and galena. You need to specialize them even more. For example, getting steel production started. You're going to need to smelt quite a bit, first iron, then pig iron, then steel. The stockpile around your smelters then should allow just your most common iron ore (i.e. magnetite), and bars of pig iron and iron. Nothing else. If you are going to switch from steel to copper (say to bash out a bunch of copper bolts or bins) then either start a new smelter/stockpile, or change the stockpile settings and mark everything currently in it for dumping.</p>
<p>Why does this make such a difference? Because - especially with the 0.34 hauling changes - you want your haulers to do the hauling and your artisans to do the crafting. If the stockpiles around your workshops are inefficiently loaded, you've got your legendary armorer walking up ten flights of stairs and hauling materials back to his shop to get his task done when any idle Urist getting drunk in the hall can do it. Higher skilled workers craft way faster than novices, but if they're wasting their time hauling it doesn't matter at all.</p>
<p>Which brings me to the other specialization: of workers. The higher skill a worker the better their output and the faster they produce it. A legendary artisan, mason, smith, carpenter can blink through a full order of items in no time and they'll be great quality. Once you've reached that level, you're pretty much no longer bound by how fast you can produce the items, but how fast you can supply the craftsman with materials. By ensuring that you're always focusing on leveling a single dwarf, you'll reach that point faster than if you throw 10 novice dwarves at it. You take a hit initially (if you're unlucky and don't get a decent migrant for the job) but after that single dwarf you drafted gains a few levels, he'll be moving much faster than the handful of dwarves with less experience would be.</p>
<p>Unfortunately, the basic UI makes this a huge pain in the ass. There's no good way to get a decent overview of the skills of your fortress and as such it's too easy to have high level crafters languishing as novices in other fields. As such, I recommend Dwarf Therapist for anyone that wants to have any level of control over their dwarves (and yes, it works on Linux). With Dwarf Therapist when I get a migrant wave, I group by squad (so I can use the "no squad" group) and then sort by skill in each labor ensuring that I have the highest dwarf in each skill assigned and only one or two related skills enabled at a time. For example, I usually only have one or two masons and now, five years in, both of them are "accomplished" (level 10) and they can build walls, bridges, coffins, etc. as fast as I can get them stone. My single legendary + 3 carpenter can make a new brace of 30 beds in no time. My single weaponsmith is also "accomplished" and I started him from nothing - he's just made literally every weapon and bolt ever produced at the fortress (arming military, hunters, weapon traps, some trade orders). In short <strong>throwing dwarves at the problem is almost never the answer</strong>.</p>
<p>That said, some labors - like stone smoothing or woodcutting - respond well to having dwarves thrown at them because they are no supply (or one-time supply) and have no workshop. This is why I have 4 wood cutters and 8 detailers (5 of which are legendary).</p>
<p>With this knowledge in hand, I've gone from having a massive list of managed jobs that seemed to take forever, to having short bursts of jobs that disappear quickly and it's made all of the difference not only to my fortress but to my frustration level. I lost many a fortress to not being able to get weapons or ammo out fast enough, or produce coffins, beds, etc.</p>
<p>The next bit of knowledge is that <strong>the manager isn't perfect</strong>. Playing DF would really suck without the ability to manage jobs on a higher level than the workshop and the manager does a good job of providing that interface. I almost always have a standing meal and brew order and it's great for handling bedrooms (queuing beds, rock cabinets, rock doors) and smelting wouldn't be nearly as painless without it.</p>
<p>However, the longer than chain of actions, the worse the manager performs. I used to draft a half-squad, then queue up a huge amount of jobs for iron then steel, then crafting weapons, armor, and leather clothing. The problem is that the forge jobs get queued at the same time as smelter jobs so that even though you list the squad's weapons as top priority, those jobs are getting cancelled constantly until you've got the supplies to complete them. The result is the first random job that's queued and has materials gets done so that even though you clearly gave the weapons top billing, you could get a squad that has two weapons, four breastplates, one gauntlet and a mail shirt when you could've had them all at least armed and training with the same amount of metal and time.</p>
<p>There are two ways to deal with this. The first is that you queue up chunks of tasks. For example, queueing the fuel creation jobs and waiting, then the smelting jobs, and waiting, then the actual jobs you want done. This works, and because it takes advantage of the manager's ability to track the items and notify you on completion, it's the best for large tasks (like outfitting a squad).</p>
<p>The second way is to take manual control of part of the process. The manager blindly queues jobs up in a sort of round-robin manner between workshops, but it will never cancel jobs unless the overall task has been cancelled. That means, if you need something made quickly it's often better to just go to the workshop, cancel the inactive manager tasks, and insert your own. The manager won't override you, you don't have to wait for them to validate the job, and you don't have to wait for the already queued jobs at the workshop to be completed. This is best for on the fly jobs, like creating more bolts in the middle of a siege, or anything else you want to rush to the front of the line.</p>
<p>Another tidbit is that <strong>the military is never enough</strong>. Military dwarves are great because they can become mobile killing machines capable of putting down sieges like no other. That takes a long time though, and a lot of hard experience. Even getting decent marksdwarves takes quite awhile even though you can get pretty experienced hunters. In the meantime, it's perfectly possible to bottle up your fortress - but being forbidden from the surface means your pastures are destroyed, you have no access to huge amounts of trees, or fish (unless you had enough time to get them underground), or hunted meat. Traders will get slaughtered, diplomats leave unhappy. No, you need to be able to capture or kill an onslaught outright.</p>
<p>Personally, I like a two story entry way, with a trap hallway and entrance on the first level, and open space on the second level with fortifications bordering one side. The entrances and fortifications are all behind bridges that can be raised and the whole entry way can then be flooded. This way I can bite off a certain number of invaders by toggling the entrance bridges, deal with them (cage and pit, eviscerate, headshot from above or - worst case - seal off and drown). After they're dealt with, pit the captured invaders, reset the cage traps, and take another bite.</p>
<p>This automated system works pretty but it's very rigid as well. A military is still necessary for handling the unexpected forgotten beast that flies up by accident into your lower levels and suddenly appears in your dining room breathing fire. Or for clearing out goblin stragglers, thieves, snatchers etc. In addition to berserk dwarves of which there will be many.</p>
<p>Another brief tidbit is <strong>read the magmawiki page on <a href="http://dwarffortresswiki.org/index.php/DF2012:Armor">Armor</a></strong>. For a long time I thought that military dwarves only needed one piece of chest, leg, foot, arm, head armor but in the end they need way more than that to be decked out. The difference is staggering.</p>
<p>Last military one is be aware that <strong>you can have standing active and inactive orders</strong>. I was ignorant of the fact that you can actually have "inactive" squads training and guarding and "active" squads be in position for a siege. This makes calling everyone to battle stations as easy as setting everyone to active on the military alert screen. You switch between active and inactive orders with /. Before, I had my training and guarding on the "active" schedule, and then when a siege came I'd manually position my squads but that's not nearly as useful because you can't easily burrow them and you can't easily control their numbers.</p>
<p>Last bit of knowledge: <strong>quality easily trumps quantity</strong>. Setting up a great hall with tables, chairs, food, and booze is a necessity that all DFers are familiar with. Maybe you've even seen dwarves griping about the lack of chairs if you haven't gotten to it yet. If you have to choose between 30 rock tables and thrones versus a couple of nice metal (gold, silver, platinum - even lead) go for the nicest ones you can provide. The lack of chairs thought will be easily outweighed by just being in the presence of these nice objects. My current fortress (whose inhabitants are mostly ecstatic) had literally four gold tables and chairs in the hall with 150 dwarves for awhile and not once did I catch a sad dwarf complaining about lack of chairs, but a lot of my others always had "admired a fine seat" in their thoughts.</p>
<p>The same thing is true with other furniture, meals, booze, and virtually all trade goods. Try to put out the best product rather than the most product. This dovetails with the worker specialization I mention above.</p>
<p>Anyway, these are my notes after receiving my first Barony. Hope they help you with your FUN.</p>
On Election 20122012-11-07T21:28:24+00:002012-11-07T21:28:24+00:00Unknownhttps://blog.codezen.org/posts/on-election-2012/<p>I, like many of my colleagues, took a breath of relief last night when Obama won his second term. In addition, a lot of the other interesting races went Democrat as well, Elizabeth Warren most notably, but also Donnelly and McCaskill (seems like the Republicans got bit pretty hard over their rape insanity). The only thing that would've made me happier (aside from the entirely unlikely possibility of the Democrats taking the House) is if Jim Graves put Bachmann out to pasture once and for all.</p>
<p>Not all of my colleagues are relieved today, however. Since I started coming in to the office more (new team) in August, and as the pressures of the race started to make it daily conversation, I heard a lot of crazy things coming from engineers that I would otherwise respect. I can't be sure, but I don't think that they make 250k a year either. I guess Texas is Texas even in Austin.</p>
<p>We had a lot of nice propositions on the ballot for Austin too and most of them passed which hopefully translates into a lot of new funding for great projects like libraries, museums and - most controversially if you judge by yard signs - a new medical school for UT.</p>
<p>However, returning to the national level, the picture is almost resoundingly positive for we progressives.</p>
<h3 id="the-supreme-court">The Supreme Court</h3>
<p>At least one, if not more of the justices will be replaced in the next 4 years due to death or retirement. Ginsburg is likely who would've been replaced by a conservative judge in a Romney universe. Instead a younger liberal judge will be put in place. Other's like Kennedy or Scalia would be wins for the Democrats, and for sanity, as things like Citizens United, Roe v. Wade, and hopefully new reforms are challenged in our highest court.</p>
<p>The life term limit for the judges makes their influence long reaching and for Obama to get another one or two appointments to the bench would go a long way to avoiding future conflict for major progressive reforms (if we get that far). For the record I don't advocate violating the Constitution for these reforms, but I do believe that the Constitution was written 200 years ago and must be interpreted to be relevant today.</p>
<h3 id="the-punishment-of-liars">The Punishment of Liars</h3>
<p>The GOP is full of lies and misinformation. There's no way that you can deny that they've been involved in some of the most vapid and factless campaigns in history. From Romney's 2010 <a href="http://www.politifact.com/truth-o-meter/article/2010/dec/16/lie-year-government-takeover-health-care/">Lie of the Year</a> coming up in a debate two years after it had been thoroughly debunked, to the fact that the Romney campaign <a href="http://www.huffingtonpost.com/2012/08/23/mitt-romney-_n_1836139.html">"won't be dictated to by fact checkers"</a> to the bold-faced, consistent and totally idiotic lies from day one of the Obama presidency (i.e. Obama is a muslim/socialist/fascist/anti-christ/gay/communist/Kenyan).</p>
<p>On top of it, Mitt Romney's campaign promises were many and details were few. While I can't say he <em>didn't</em> have a brilliant set of tax deduction eliminations and plugged loopholes to offset his tax cut agenda, I can say that if he <em>did</em> he's an idiot for not being specific and that lack of details likely means he was bullshitting us all in an attempt to get elected on a mound of empty promises.</p>
<p>If the GOP had been rewarded this cycle with the Presidency or a new majority in the Senate, it would cause them to view lying and empty promises as a valid tactic. Thankfully, that didn't happen, and in fact the Democrats made gains at every level nationally. I'd be surprised if the GOP does some soul searching and realizes that they need to come up with concrete solutions instead of promises next time around, and I fully expect the next round of utter bullshit is already being cooked up, but if we can establish a pattern over a few more cycles of "crazy and/or liars = unelectable" maybe the Democrats can take the House in 2014 and the Presidency again in 2016 and <em>then</em> after so many cycles of failure, they'll get the point. Maybe they'll realize that pandering to the extreme right for the primary and then tacking hard back to center for the general election is a losing strategy. Then perhaps we'll get a real alternative party or, even better, a party that is willing to cross the aisle and compromise when the American people universally realize that we need progression instead of regression.</p>
On the DS9 / Babylon 5 Controversy2012-10-19T18:49:21+00:002012-10-19T18:49:21+00:00Unknownhttps://blog.codezen.org/posts/on-the-ds9-babylon-5-controversy/<p><strong>Note: It's been a long time since I've watched B5, and I'm keeping an open mind. If you want to nitpick or bring up new evidence, please do so in the comments, I'd be happy to edit and expand the discussion.</strong></p>
<p>On Reddit recently, I was defending my favorite of the Treks, DS9, against a horde of Babylon 5 fans that argued that Paramount ripped the entire premise of DS9 from material that J. Michael Straczynski (JMS) tried to sell to them long before DS9 was ever announced.</p>
<p>Do I believe that Paramount would be that unscrupulous? Absolutely. They're a studio, and in the history of movies and TV I'm sure you can find plenty of other examples of assholish behavior. Personally, that seems like legal grounds to sue the shit out of Paramount, but JMS apparently didn't want to taint either show with legal action. That doesn't seem very businesslike, but hey. I can't fault the guy for wanting to have more sci-fi on TV rather than less.</p>
<p>I've watched Babylon 5. I enjoyed it. I am not a conspiracy theorist however so I decided to look at the supposed mirror-like similarities between the shows and determine what I thought myself.</p>
<p>[toc]</p>
<h2 id="summary">Summary</h2>
<p>The first thing I wanted was a concise list of the similarities. It's been quite awhile since I've watched B5 so while I remember the grand sweep of things, the details are little hazy. The best summation is a list I found in the IMDB FAQ for B5 and it goes a little something like this.</p>
<ul>
<li>Babylon 5 involves a space station beside an artificial hyperspace jumpgate. Deep Space Nine involves a space station beside an artificial wormhole.</li>
<li>Both shows had human captains who would end up becoming figures of religious significance to a local race. Benjamin Sisko would become the Bajoran Emissary while Sinclair was Valen.</li>
<li>Both shows involved humans working alongside a recent enemy race: the Minbari in Babylon 5 and the Klingons in Deep Space Nine (although the friendly nature of the Klingons was established in Star Trek: The Next Generation)</li>
<li>Both shows would introduce a small, powerful, first of its kind warship at similar points in their third season: The Defiant on Deep Space Nine and the White Star on Babylon 5</li>
<li>Both shows featured female seconds in command who were hot tempered: Kira Nerys on Deep Space Nine and Susan Ivanova on Babylon 5</li>
<li>Both shows featured doctors who had strained relations with their fathers and who were hiding secrets: Julian Bashir's genetic modification on Deep Space Nine and Stephen Franklin's involvement with the underground and his stim addiction on Babylon 5</li>
<li>Both shows involved combat against mysterious foes who seemed much more powerful than the protagonists: The Dominion on Deep Space Nine and the Shadows on Babylon 5</li>
<li>In addition there are several names which appear in both shows such as Lyta/Leeta and Dukhat/Dukat..</li>
</ul>
<p>Let's get cracking.</p>
<h2 id="the-premise">The premise</h2>
<p><strong>Babylon 5 involves a space station beside an artificial hyperspace jumpgate. Deep Space Nine involves a space station beside an artificial wormhole.</strong></p>
<p>This seems to be the most damning evidence that the premise of DS9 was ripped off. On the face of it, these are very similar. However, if you break it down, I'd argue that these are genre pieces.</p>
<p><strong>Set on a space station.</strong> It seems suspicious that JMS would pitch B5 to Paramount and then, 4 years later, when B5 got the greenlight elsewhere, suddenly there would be a new Trek set on a space station. However, this ignores one fact and that's that not only are space stations totally average in sci-fi and in fact are mentioned endlessly in TOS and TNG, but also that the human race has actually (in <em>reality</em>) put a number of space stations in orbit around earth. The Russian Mir space station was put up in 1986, three years before JMS's pitch, and 7 years before DS9 started to air. It's unsurprising then that TV sci-fi, especially in two franchises set in our future rather than in some alternate reality like Star Wars, would choose a space station. JMS chose it for B5 because it acts as a semi-neutral diplomatic area, DS9 chose it because it was a different take on a universe that had already had two shows about cruising the galaxy.</p>
<p><strong>Set by a [transportation device]</strong>. This seems like a stronger argument than it's base setting. Jump gates and worm holes? Basically the same thing, right? No... not really. In B5 jump gates are the mechanism for ships to enter hyperspace. They're like highway on and off ramps and standard ships have to use the jump gate <em>network</em> to cross vast distances. Trek already had something like this, warp speed. The wormhole is different, it's a one-of-a-kind link between two points in space that are vast distances apart.</p>
<p>This doesn't address the core issues though. Regardless of technology, there's still some transit feature next to the space station. But really, isn't that an obvious device for both shows? B5 <em>requires</em> a jumpgate because otherwise it wouldn't be very useful as a space station in a world where ships have to use them to cross large distances. In the same way, DS9's <strong>story</strong> <em>requires</em> the wormhole because without it, it's just one of a hundred different Federation space stations and not a very integral or interesting one at that. It's one of the oldest literary devices in the book to have a trade point, a port, a bridge, a mountain pass in the setting because it gives a reason for exotic people and items to show up. In military stories, it gives a tactical weight to the setting. In short, nobody should be surprised that this is part of the base setting for either show.</p>
<p><strong>What's being left out</strong>. There are a lot of omissions in the setting that are left out of this argument as well. Like the fact that B5 was constructed by and for Earth, where DS9 was taken after the occupation of Bajor. Or that B5 is a node on an already known (locally, at least) network, where the wormhole basically puts DS9 on the frontier of an entire new and unexplored quadrant.</p>
<p>Most importantly though, the premise of DS9 from episode one is still exploration, albeit in a different way than previous Trek. It explores philosophy (Distant Voices, Life Support et. al) religion (Bajoran episodes, of which there are many) in addition to planets (ala Meridian, Paradise, Children of Time, etc. as well as introducing Trill, Ferenginar and New Sydney on screen). It takes two full seasons before the main antagonist, the Dominion, is even seen and almost another three seasons before the main conflict begins. At it's core DS9 is still solidly in the one-off paradigm of TNG for its first 5 seasons, and even the longest Dominion War arc is only a handful of episodes long.</p>
<p>To B5's credit, it's the origin of the highly serialized sci-fi that would fit right in today, in the age of the DVR when all modern drama is serial as well. The story, as such, is also serial and has much more to do with the continuing machinations between the races on B5, Earth, Mars, Earthforce, Psi Corps and eventually the Shadows than it does with any sort of exploration. That's not a criticism, it's a fact. Where DS9 is more like a collection of short stories with the same characters but vastly different topics and tones, B5 is closer to a coherent novel with complex factions and subterfuge.</p>
<p>It's here in the <em>story</em>, not the setting, is where the premise of shows must differentiate themselves. If you don't believe that, then every modern hospital drama is a rip-off of ER, every cop show is a rip off of Hill Street Blues, etc. etc.</p>
<h2 id="the-religious-undertone">The religious undertone</h2>
<p><strong>Both shows had human captains who would end up becoming figures of religious significance to a local race. Benjamin Sisko would become the Bajoran Emissary while Sinclair was Valen.</strong></p>
<p>First of all, the Minbari are not a "local race" except in the fact that they have residents on B5 - a human station -, but I'll ignore that part.</p>
<p>Second, while Sisko as The Emissary is definitely religious, I don't remember Valen ever being established as anything but a badass historical figure. I suppose the "Minbari not of Minbari" metamorphosis thing can be interpreted as miraculous, and there is the time travel but that could be equally attributed to science fiction as divinity. I won't hinge my argument on that though, especially since I might just not remember.</p>
<p>The real crux here is that, while B5 does make use of religion occasionally, it's not a consistent component of the overall story. The example that's given here (Sinclair being Valen) isn't even <em>hinted</em> at until the third season of B5 (episode 3x16, War Without End pt 1.) at which point Sinclair is not the (or even a) main character. It also didn't air until May 13th, 1996. DS9 established Sisko as the Emissary in <em>the first episode</em>, which aired almost 3.5 years before then on January 3rd, 1993.</p>
<p>B5 fans might argue that JMS is just a genius and that this was his plan all along and part of his foolish disclosure to evil Paramount but I find that highly unlikely.</p>
<p>Even if the above doesn't sway your opinion</p>
<p>It's clear that each series has a vastly different approach to religion and again, that's what matters more than a silly bullet point. DS9 is constantly expounding on Bajoran religion, Sisko being the Emissary is an <em>integral</em> part of the show. What with the orbs, the festivals, the vedics, the kais, virtually all of Kira's back story, the Prophets and their role in the Dominion War, the Pah Wraiths and their cult. Even Dax's death at the hands of a Wraith. DS9 spends a lot of on-screen time getting into the minutiae of Bajoran religion. In B5, religion takes a pivotal role by weaving it through the plot through Sinclair/Valen and prophecy as motivation instead of persistent set dressing, as exodist points out in the comments.</p>
<h2 id="working-with-former-enemies">Working with former enemies</h2>
<p><strong>Both shows involved humans working alongside a recent enemy race: the Minbari in Babylon 5 and the Klingons in Deep Space Nine (although the friendly nature of the Klingons was established in Star Trek: The Next Generation)</strong></p>
<p>Personally I don't think this holds water for the same reason the bullet states. When DS9 started, the Klingons had been established as an ally for 5 years of TNG (and closer to 25 in-universe). If we take into account that the Klingons don't start playing a major role until Season 4, then it's even longer. The previous state of enmity isn't even referenced in DS9 because it's unnecessary.</p>
<p>Later, there's a time when the Klingons and the Federation are at war again (thanks to the Founders), but that's the nature of politics in drama and a separate case than working with a long-established enemy.</p>
<h2 id="new-armaments">New armaments</h2>
<p><strong>Both shows would introduce a small, powerful, first of its kind warship at similar points in their third season: The Defiant on Deep Space Nine and the White Star on Babylon 5</strong></p>
<p>First, the "third season" is misleading. DS9's Defiant showed up in the third season premiere, on September 26th, 1994. The White Star class showed up (as far as I can tell from the wiki and the bullet) in the B5 third season premiere a year later on November 6th, 1995 although I guess the B5 fans can argue once again about JMS's possible omniscience and subsequent foolhardiness in the Paramount office.</p>
<p>Anyway, a <em>year</em> after the Defiant, the White Star comes out with the ability to create a jumpgate at any point to get to hyperspace... sounds a bit like warp speed to me. Who's copying who again? =P</p>
<p>In all seriousness this argument doesn't hold weight for one reason: it's an obvious necessity. Both shows are set on (relatively) stationary space stations, both shows have a looming threat (we'll discuss farther down) so is it really a surprise that both shows introduce a new badass heavy fighter-type ship? Absolutely not. The main characters have to leave the station and do some ass kicking. It's as simple as that.</p>
<p>But why a new ship, in either case? Because there's a new threat that has to be answered with better, more agile hardware. In B5 human ships were a joke compared to the massive Minbari ships which in turn were a joke compared to the massive Shadows. In DS9, sure they could've used a Galaxy class ship but those were exploration, science and defense ships with massive crews. The Defiant, as Sisko says, is a ship with one purpose: war. It's fast and it packs a punch.</p>
<h2 id="female-first-officer">Female First Officer</h2>
<p><strong>Both shows featured female seconds in command who were hot tempered: Kira Nerys on Deep Space Nine and Susan Ivanova on Babylon 5</strong></p>
<p>No way! A 90s show with a strong female that doesn't take any shit? And she's close to the top of the hierarchy? Amazing. Forget the fact that Kira was essentially a guerilla terrorist shortly before the show began, and Ivanova was a figher pilot because, you know, that might actually differentiate them. This is more a result of out-of-universe culture shifting than anything in-universe in my opinion.</p>
<h2 id="dr-daddy-issues">Dr. daddy issues</h2>
<p><strong>Both shows featured doctors who had strained relations with their fathers and who were hiding secrets: Julian Bashir's genetic modification on Deep Space Nine and Stephen Franklin's involvement with the underground and his stim addiction on Babylon 5</strong></p>
<p>Seriously? Let's break it down.</p>
<p>Both stations have doctors. That should have obvious reasoning on both sides.</p>
<p>Both characters have issues with their fathers... okay, but not only is that tangential to their overall story, it's not uncommon in reality and it's quite common in TV. Franklin's father was a strict general, Bashir's parents illegally genetically modified him as a child, Ivanova has an issue with her telepathic mother that committed suicide, Kira has an issue with her mom who was a traitorous comfort girl to the Cardassians, Quark has an issue with his mother because she's so progressive, it goes on and on. The reason that people on TV have a lot of family issues is that it's a familiar dynamic to every person in the human race. As such, I'm ignoring the father issues as too common.</p>
<p>Both characters have secrets. That is so vague as to be meaningless. Especially since on B5 practically everyone has secrets, that's the sort of show it is. Again, not a criticism, in fact having flawed characters instead of Trek-ish ideologues is to it's credit. However, if Bashir didn't have a secret, then Kira would and the previous bullet would've been "tough female second in command <em>with secrets</em>" because Ivanova's mom's telepathy secret. If not Kira, then Worf would have secret and then it would be a parallel to Garibaldi's secret Italian food addiction (or his dark period). The point is that two analogous characters having secrets isn't a big deal. You know what other doctor has daddy issues and secrets? Dr. House. If I watched a lot of the other medical shows I could probably come up with other characters too but I basically despise them.</p>
<p>Now, if the secrets were in any way similar perhaps there'd be more to this argument but they're totally different. Bashir's secret is his genetic status, given to him against his will, that nonetheless allows him to perform superhuman feats of intellect. Franklin's secret is his underground dealings and stim addiction. They're completely unrelated and, on top of it, form episodes in the series that are vastly different. Bashir gets discovered and it brings up classic Trek philosophy of how we'd deal with genetic engineered humans, whether he deserves to retain his commission, who gets punished. Later, his genetically modified state is used when Section 31 shows interest in him, and also in a couple of (rather tiresome) episodes where he attempts to communicate with some genetically engineered misfits. Franklin's secret stim usage causes him to resign the medlab, go on "walkabout" and return with new insight, a clear disgrace and redemption arc, a self-discovery.</p>
<h2 id="the-primary-foes">The primary foes</h2>
<p><strong>Both shows involved combat against mysterious foes who seemed much more powerful than the protagonists: The Dominion on Deep Space Nine and the Shadows on Babylon 5</strong></p>
<p>Once again, this is such a common trope throughout all literature that it's almost not worth discussing. An existential threat to you and your way of life is the <em>essence</em> of drama. That's why you watch 300, or Battlestar Galactica, or disaster movies like Armageddon, or Aliens, or Independence Day, or a slew of other shows and movies. You want to see the underdog defeat the big bad guy, especially when the underdog is your planet or species. This same sort of conflict shows up in each of the previous Trek series (the Borg, the Q, the Armageddon Machine). More generically, this sort of story shows up everywhere from Animal House (misfits band together to save their frat house from being destroyed) to Rocky.</p>
<p>As I've tried to point out in many of the previous blocks, it's the execution that matters, not the surface trope level similarities and the Dominion and the Shadows are not similar at all except in their relative power to the protagonists.</p>
<p>The Dominion is much more straightforward foe. They have a massive standing force of ships and soldiers. They have an empire on the other side of the wormhole with a strict and known hierarchy. They encompass hundreds of worlds and races. In many ways the Dominion is a despotic version of the Federation, a parallel that I don't think was used enough in DS9. Their great power comes from sheer resources rather than ultra-advanced technology beyond that of their enemy. Their motivation to attack the protagonists comes from the desire for conquest.</p>
<p>The Shadows, on the other hand, are an ancient race of beings that emerge every 1000 years to cull the weak races through bloodshed and thus form a sort of natural selection pressure. They have bizarre organic advanced technology but are somehow vulnerable to telepathy. They are the flip side to the Vorlon, a race with the goal of nurturing races to survive the shadow wars.</p>
<p>There are some similarities in their execution. Like their unsurprising use of cunning to undermine their foes, or their intense desire to exterminate the protagonists and... I guess their ability to cloak themselves? But none of these are specific enough to call one a copy of the other.</p>
<h2 id="names">Names</h2>
<p><strong>In addition there are several names which appear in both shows such as Lyta/Leeta and Dukhat/Dukat..</strong></p>
<p>Give me a break. Ask yourself this. If DS9 was really going to rip off B5, don't you think they'd have the smarts to change the names?</p>
<p>Ugh. Leeta (DS9) and Dukhat (B5) are minor characters, in vastly different roles from their counterparts. In a context in which we're not trying to paint DS9 as a rip-off, these might even be considered homage but as evidence of plagiarism they're about as weak as it gets.</p>
<h2 id="conclusion">Conclusion</h2>
<p>Look, I'm a fan of both series. None of the above should seem like a criticism of B5 itself. It's a solid show and it was well written for the most part. It's also got a totally different dynamic, arc, and execution than DS9.</p>
<p>I'll admit that DS9 is my favorite Trek and thus it might seem like I have a dog in this fight, and I do, but I'm not trying to make the argument that DS9 is better, just that it's not a rip-off. There are too many good writers that worked on the show and wrote too many good episodes (without analogues in the whole of B5) to dismiss them as plagiarists.</p>
<p>I'm all for fan theories, but this one just seems petty. Perhaps it's the ultimate expression of the disappointment that B5 fans (myself included) feel about the fact that it got jerked around during production. I could see some people creating this theory because there is a seed of truth (JMS presenting B5 to Paramount before DS9 was in the works) and, if it were true, it would mean that Babylon 5 would've been just as successful as DS9 if it had the same level of backing.</p>
<p>In the end, I've found no argument that this theory is true except for some <a href="http://tvtropes.org">TVTropes</a> level generic similarities. Even if I admit that it's <em>possible</em> that Paramount guided the creation of DS9 with JMS' manuscript in its back pocket, there's no evidence (even JMS can't tell for sure), and that's still no reason each show can't be original where it really matters: the story. The actual execution.</p>
<p>That said, maybe I'm missing some key point or piece of evidence. Maybe I've ignored parts of the show that are relevant. If that's true, put it in the comments and we can continue discussion! I am open minded and convinceable if given the proof.</p>
On Qtile2012-10-18T20:31:36+00:002012-10-18T20:31:36+00:00Unknownhttps://blog.codezen.org/posts/on-qtile/<p>Anyone that knows my open source predilection also knows that I have a lot of obscure and elitist taste in software. The only thing that could make me more tech hipster is if my kernel/OS of choice was a BSD instead of <em>mainstream</em> Linux.</p>
<p>Case in point, my primary environment is a tiling WM written in Haskell, <a href="http://xmonad.org">Xmonad</a>. However, lately, I've been wishing for a bit more ease of use and a bit more flexibility in my whole base setup. With FOSS, whenever I have an itch, I try to scratch it one way or another.</p>
<p>Lately I've tried popular tiling WMs, like awesome and dwm. A couple of serious in-development ones as well, like subtle, i3, and musca. I still have a few to try, like spectrwm. However, for the past few days I've been really enjoying one called <a href="http://qtile.org">Qtile</a>.</p>
<p>It's written in Python, which is a major plus for me because it's my dynamic language of choice. In the 21st century, window management isn't even close to "intensive" and as such I think trading speed (from C) for flexibility (from Python) is clearly the way to go.</p>
<p>The configuration for Qtile is done in it's native language. Xmonad is configured in its native language too, it just happens to be Haskell and my days of pure functional programming are long gone so I appreciate the ability to mess with code, configuration and plugins without having to re-learn a set of enigmatic operators. Tangentially, I also experimented with native config in the last major version of my own software (<a href="http://codezen.org/canto-ng">Canto</a>) and it's an extremely powerful configuration strategy. In part because the interpreter for your dynamic language is very powerful and (hopefully) well-designed and also because obviously the structures created in the configuration are simple to then manipulate in the code itself. In the end I started to migrate away from it because it's hard to programmatically alter a configuration whether to convert to another version, or to save configuration done via a software interface. Qtile, and other tiling window managers, generally have no need to do either of these things if their initial interface is complete enough so I'm glad to see that I can execute arbitrary Python in the config and look forward to being able to construct my own layout capabilities.</p>
<p>Another advantage of Qtile is that it takes a more circumspect view of window management. Each piece of software doing one thing and doing it well is a great facet of the Unix philosophy but the lines drawn between functionality are arbitrary. Xmonad, for example, does literally nothing except manage windows (as you would expect). It does it very well, but it only has a bit of functionality to play nice with the other tools that most modern users would consider necessary (it's capable of reserving space for bars / trays and it has capability to output text based on internal status). Qtile includes window management, but it also includes a configurable bar with status output, focused window titles, a clock and a tray. With Xmonad, achieving a similar setup to this requires setting up a loghook (interfacing with Haskell), and using two or three different programs in tandem (i.e. stalonetray for the tray, dzen2 for the bar, and that's not counting any other status info like battery, memory, or cpu - all of which come with Qtile out of the box - which would inevitably require an app like conky to do in one place). Subtle, and to some extent i3 take this approach as well, but Qtile's implementation is nicer, in my opinion. In effect you get more than the bare minimum of functionality which means you have less effort to integrate secondary components for the basic. Also, the Qtile widgets actually include a lot of the same default options which are passed through Python kwargs to each widget so it's easy to keep your widgets' behavior consistent and tweaked to your liking.</p>
<p>One really cool thing about Qtile is <code>qsh</code>, which provides a shell+filesystem like interface to your WM. It allows you to query what windows are on what screens, information about your configured bar, switch layouts, close windows etc. This sort of thing is very handy if you ever want to interact or squeeze some functionality out of your WM with a simple script instead of Python.</p>
<p>At this stage I have no criticisms of Qtile, which is saying something. I will however state that I haven't been using it long and I'm still trying to learn the default keybinds (instead of porting my Xmonad configuration keys over -- for the most part). One aspect I'm curious about is the multiple monitor support, but from the documentation it seems like even that usually neglected area, has good support even for things such as separate bars. We'll see. My dual monitor usecase has faded in recent times.</p>
<p>All in all, it's definitely worth a try. Especially if you're looking a tiling WM that doesn't force you to find other programs to get basic information.</p>
On Why Tekkit isn't as good as vanilla Minecraft2012-10-08T21:50:48+00:002012-10-08T21:50:48+00:00Unknownhttps://blog.codezen.org/posts/on-why-tekkit-isnt-as-good-as-vanilla-minecraft/<p>I was, admittedly, late to the game on picking up Minecraft, and only started with 1.2.5, but it doesn't take very long for you to "get" it and see that it's a very persuasive game. It's simple in mechanics, yet deep in possibility. You harvest various things to make tools, to make buildings, to defend yourself from the native mobs and other players (if that's how you play). As this very well known <a href="http://www.penny-arcade.com/comic/2010/9/17/">Penny Arcade</a> comic (and it's follow up) suggests, it's a concept that will immediately click with a large subsection of gamers. It's a game that takes a very minimal amount of training to pick up and play, but will reward those that learn a bit more. It's even something I can play with (or just around) my six year old daughter and not have to worry about it showing up negatively in her subconscious years later too - a major bonus for a gamer dad used to the fare of killing demons with increasingly powerful weaponry or headshotting virtual human beings.</p>
<p>However, being an engineer, when I see some sort of technical complexity - like Minecraft's brilliant crafting system - I can't help but wonder what it would be like to take it to the next level.</p>
<p>Enter <a href="http://technicpack.net/Tekkit">Tekkit</a>, a collection of mods designed around adding a huge amount of technical complexity to Minecraft by integrating a huge number of machines and components, new concepts and recipes. From simple electric circuits, improved redstone, to computer blocks and nuclear reactors.</p>
<h3 id="where-tekkit-succeeds">Where tekkit succeeds</h3>
<p>When I first got going with Tekkit, I thought I was in nirvana. There are so many conveniences. The macerator to grind up ore and get double the ingots from a block. The electric appliances powered by wind or solar or geothermal devices connected with wires. The lovely amount of complexity of the electrical systems. The improved redstone. The automation potentials. This basic improvement in minecraft life is great and addicting. New ore and gems to tantalize you when you're deep in the earth. New plants, new crops. New gadgets like automatic miners and jetpacks. New weapons and armor. There isn't a single area of vanilla that <em>isn't</em> expanded on.</p>
<h3 id="where-tekkit-fails">Where tekkit fails</h3>
<p>Unfortunately, it doesn't take long for you to reach a point where the resources you're going to need for your planned projects are going to be insanely vast. For example, my first goal was going to be to setup a force field to defend my little area. The recipe to create a force field doesn't look too bad but its energy requirements are steep (as you would expect) when you're protecting a large area. So, instead of tackling the complexity, or following a blueprint for a nuclear plant, I decided I'd just craft a HV (high voltage) solar array which would power my force field and charge a battery to keep the power up at night. Simple enough, this was all based on theorycrafting.</p>
<p>However, to create a single HV array would require 512 (8x8x8) solar panels. Each solar panel requires a generator, two circuits and some other easier to get components. Each circuit require copper wire, iron, and redstone. Copper wires require rubber. Generators require batteries, furnaces, and machine blocks (8 iron). The recipes aren't hard, but for a single HV solar array I'd need something like 5000 iron and 3000 copper, 1500 rubber. These are rough, the tekkit wiki probably has real numbers, but the point is that it was clear from the get-go I wasn't going to be harvesting these myself. To get 5000 iron I'd probably spend days of play time in mines.</p>
<p>And so I discovered the Equivalent Exchange (EE) part of Tekkit. It's mod that, at its core, lets you echange many lesser valued items for one higher valued item. It's a great concept because it means that all of that extra garbage you get from mining you can convert, losslessly, into another type of item. I can't tell you how many stacks of cobblestone I've had from mining that just sit in a large chest waiting for me to use them because I can't bare to let them go. With EE I'd be able to convert them into something I actually need. Sounds fair. After all, it's in the title: equivalent exchange.</p>
<p>But EE also comes with energy collectors that are able to absorb EMC (the "currency" of items) from sunlight. It becomes clear that when you can absorb enough EMC to basically replicate an iron ingot in a couple of seconds that this is probably the best way to get 5000 iron ingots without strip mining the planet.</p>
<p>So it seems all right then. Sure you've got uber expensive items, but you've also got a way to convert time spent doing anything into items. Just be patient and you'll have enough EMC to pay for your ingredients. Problem solved, right? Sure, but at what cost? What reason do you now have to play the game if resources are meaningless with a little effort?</p>
<p>Why explore? Why face danger? Why delve into the caverns and discover underground strongholds and dungeons if you will never return with anything that you couldn't have replicated? Why spend more than two minutes in the nether if you only have to get one glowstone dust forever?</p>
<p>You know what the most efficient strategy for playing Tekkit is, after you've got an energy collector and a condenser up to a certain efficiency? Go do something else and leave your character to idle nearby. Zero effort, guaranteed reward. I generated more diamonds in my sleep this way than I would've ever mined in days of gameplay otherwise.</p>
<p>I'm sure that I can afford the reagents to make that HV solar array now, but what's the point? There's no achievement left in creating it except for building a machine to crank out solar panels so I don't have to put up with the tedium of thousands of steps I'd have to take by hand to create one myself. And I understand that designing such a machine is pleasurable, but if creating the components of the machine is just a waiting game for ingredients, why not go to creative mode and design it there? Similarly, if having 1000 diamond blocks is your goal for building your mansion of unparalleled wealth, why not just skip the few days of waiting (or less, likely, if you have a better collector/relay/condenser setup) and just do it in creative mode? Because you want to be "challenged" by sitting around waiting doing anything else for long enough? Because it's an achievement to have replicated a mansion?</p>
<p>In short, by forcing us to get around resource gathering by making end-game level items insanely expensive, Tekkit has obviated the whole point of playing the game in survival mode.</p>
<p>Perhaps I'm unfortunate in being too obsessed with efficiency. Tekkit has a lot of great additions to vanilla, but I can't bring myself to ignore the gamebreaking ones. If I can have access to unlimited resources, I can't help but take advantage of them and, eventually, it makes more sense to keep upgrading your replicator setup than it does doing pretty much anything else. Perhaps I can just remove the EE mod (I am running a personal server after all), but then I don't know how I'd deal with the insane amounts of material I need to pursue my grand plans. Maybe I could just force myself to ignore collectors, and only convert "honest" items into more useful ones? I don't know. All I know is that, right now, the simplicity of vanilla looks a lot more challenging, rewarding and, thus, appealing.</p>
On TNG 25th Anniversary2012-07-23T20:58:15+00:002012-07-23T20:58:15+00:00Unknownhttps://blog.codezen.org/posts/on-tng-25th-anniversary/<p>There's an event tonight that I'm looking forward to in the utmost: <a href="http://subspacecommunique.com/content/2012/07/22/dont-forget-star-trek-next-generation-25th-anniversary-event-theaters-tomorrow-0#.UAzGdgfuHWA.reddit">TNG 25th Anniversary</a> in theaters.</p>
<p>It's a couple of episodes, some behind the scenes footage, a sneak peak, and most importantly the chance to geek out to some classic TNG on the big screen in newly remastered high def.</p>
<p>The event, and the accompanying blu-ray releases over the next several years underline the desire that we trekkies have for a new series. After all, Enterprise has been off the air for 7 years now. The 2009 movie and its forthcoming sequels are enough to sate us, for now, but their glitz and sleek action don't scratch the fundamental itch of a Star Trek at its best. I am not one that hates the new films, but I recognize that Trek movies in general have always been about trading some of the series' best attributes (it's willingness to approach philosophy with sci-fi, it's vision of humanity and the Federation as benevolent keepers of a utopian society) for attributes that attract the laymen of Trek canon, the casual summer blockbuster ticket.</p>
<p>No, what Trekkies are thirsting for is another series. One with a set of characters we can grow to know well, like we feel we know Picard or Data or Riker or Geordie. One that takes us to new places with new challenges and, certainly, new foes. But what we have to remember is that 7 years of no series isn't anything. There was a full decade between the end of TOS and the release of the first movie, almost another decade on top of that before TNG started. 20 years separates the series.</p>
<p>Now, 7 years from the truncated end of Enterprise, we hear rumors. We salivate over premises that, frankly, aren't very strong. We are so desperate for a new series that we cling to these rumors and draw hope from them. Personally, though, I can wait. If we want to return to the halcyon days of Trek (like the 90s, which started and ended without ever knowing a day without a new Trek episode on the schedule) the first series to break the ice has to be <em>phenomenal</em>. It has to explode on the scene.</p>
<p>In this light, it's easy to find a new respect for TNG. After a 20 year drought, 10 of which were filled with movies featuring the old cast, they had to come on, pay homage but, more importantly, find their own niche. They did this by advancing the timeline 100 years to a more mature, more organized Federation that focused more on a peaceful exploration with strict rules about non-interference. Simultaneously though, conflicts were bigger and badder, the stakes higher. TNG came in after 20 years of the same characters off and on and managed to up the ante on practically every front. Then, given 100 more episodes (more than twice as many) they managed to turn Trek from a series into a franchise that dominated TV sci-fi for another 15 years afterwards.</p>
<p>This is what I want. I don't want another series. I want another <em>era</em>. If we have to wait for another 13 years to get the chance at having another 15 year age of Trek then I'll wait. One good series is worth 10 <a href="http://startrekcardinal.com/Home_Page.html">ST: Cardinal</a>s or other <a href="http://en.memory-alpha.org/wiki/Undeveloped_Star_Trek_projects#Live-action_television_series">proposed series</a>.</p>
<h3 id="speculation">Speculation</h3>
<p>Taking the above to heart, what would a new series have to look like? First let's try to distill what makes Trek Trek. Here's my barest definition.</p>
<ol>
<li><strong>The Future</strong>. This should be pretty obvious. I don't think there's much Trek in a modern day series.</li>
<li><strong>Human</strong>. Trek is inherently about humanity. Our journey through the stars and our trials and tribulations.</li>
<li><strong>Federation</strong>. Inasmuch as Trek is human, it's also about a future in which we are banded together with many other species with similar ideals. Watching Trek without the Federation would be just watching sci-fi that happens to be in the Trek universe. Enterprise gets a pass because it was a prequel, but I think that ground has been trod.</li>
</ol>
<p>Elaborating on the above, this is what I'd like to see in a new series.</p>
<p><strong>Prime Universe</strong>. Abrams' films are fine and exist handily in another universe which allows them to be considered wholly separate from every bit of Trek 'til now. Let's take advantage of that fact and stick to the prime universe that's already so well established.</p>
<hr />
<p><strong>Expand the Timeline... but not too far</strong>. Enterprise set a pretty firm range of dates for time travel becoming trivial enough that it's regulated. Personally, I believe that once we get too much temporal flexibility, the premise will become too stretched. If time travel is an easy tool it means that you get infinite retries on the best outcome and nobody has to live with unintended consequences as long as they are in control of a time machine. Fortunately there's about 600 years between the end of VOY (2378) and the temporal police of the 31st century in Enterprise, although I think time travel would've likely become a tool sometime before that.</p>
<hr />
<p><strong>Enterprise</strong>. DS9 is my favorite Trek even though it's close with TNG and TOS, however I believe that DS9 was able to drastically change the core premise of Trek (by being on a space station rather than roving the galaxy) because TNG had given the series a good lead in. A new series should return to the Trek fundamental of exploration and diplomacy on the Enterprise to start on solid ground before considering a more studious (if rewarding) approach.</p>
<p>Another aspect of this point, and why it's "Enterprise" and not "On a Ship" is that I want the core cast to be good at what they do, the best even. There's a trend in TV and movies lately to have anti-hero or flawed characters. This was part of the ST: Cardinal premise that I thought was terrible. I want to see shining examples of logic, efficiency, and compassion. The traits that make us, as a species, great. I don't want the same tired and conflicted main characters that you can find in every modern drama or sci-fi. I want to see my captain struggle to maintain or restore order in the galaxy, not struggle to get out of bed in the morning.</p>
<hr />
<p><strong>Crew Diversity</strong>. One of the great aspects of TNG was the ability to bring many viewpoints to bear. The TNG crew had plenty of humans, but also Troi, Worf, Data, and even Barclay to bring viewpoints other than human Elite Starfleet officers. TOS struggles with this in universe (Spock being the only non-human) but excelled in it out of universe (having a black woman, an asian man, and a Russian on the bridge in the late 60s). DS9 focuses on the Federation vs. Bajor contrast with Kira and various semi-regular Bajorans, but also includes Worf, Dax, Odo and Quark providing outside influences (coincidentally being on a space station instead of a ship is a definite plus in the diversity). VOY and ENT made attempts but were unsuccessful at accomplishing this, despite the seeds of possibility.</p>
<hr />
<p><strong>Screen Time</strong>. The final thing I'd like to see in a Trek series is a lot of screen time. These days, there's been a definite trend toward short seasons. For the most part, this is good. If <em>Game of Thrones</em> has only 12 episodes to tell you a compelling arc, then you know each episode is going to be packed with content. Same thing with <em>Breaking Bad</em>, or <em>Mad Men</em>. The source of entertainment is the drama and the 12 episode season is very conducive to having drama dripping from every episode. But drama is not what Trek is about, at least not all the time.</p>
<p>Imagine cutting TNG down to twelve episodes a season. You have to ditch a full 92 episodes. Sure, you could start easily enough, forgetting bad episodes like <em><a href="http://en.memory-alpha.org/wiki/Sub_Rosa_(episode)">Sub Rosa</a></em> (my personal least favorite) but pretty soon you're going to be cutting into episodes that are great, but not great enough. For example, <em><a href="http://en.memory-alpha.org/wiki/The_Measure_Of_A_Man_(episode)">The Measure of a Man</a></em>. That episode would never get made if all 12 episodes had to be action packed drama fests. It's too wordy and plodding. Yet it's a great exploration into the topic of whether Data is human or deserves rights and, more generally, whether a human creation can ever have the same rights as humans themselves. Trek philosophy via sci-fi at its greatest would've never made it in a short season.</p>
<p>Now, I'm not saying that it has to be a full 26 episode season either, but whatever number, there needs to be plenty of time to ponder alongside the time for tension and drama. This is especially true if the new Trek follows the modern drama formula where each episode relies on the last. A Trek show has never been done like this (DS9 comes the closest toward the end), but this is not incompatible with having occasional one-offs and philosophical episodes that are woven into that framework.</p>
<hr />
<p>This is roughly what I'd like to see, not only because it would please me, but also because I think it would provide a solid base for subsequent series and, therefore, another era of Trek on the airwaves. This is just a base however. I mentioned above that TNG upped the ante on virtually every aspect of TOS. While a modern series would obviously have the effects and make-up in the bag (even over 2005 Enterprise), it'd be tough to up the ante on TNG/DS9 era Trek. The story is going to be the deciding factor and that's wide open for interpretation. This is why I can be patient. Anyone can make a show that fulfills the above criteria but it's going to take a special someone to really make it awesome. </p>
On Diablo2012-07-10T21:42:31+00:002012-07-10T21:42:31+00:00Unknownhttps://blog.codezen.org/posts/on-diablo/<p>I really didn't intend for this to be a gaming blog, but it's all I want to talk about at the moment. Life is rough recently, so escapism is always on my mind =P.</p>
<p>I played D2 when I was in high school. I played it to death. Single player and on realms. I played it vanilla, LoD, and then, over the subsequent decade, I played it a number of times on the higher (1.10 - 1.13) patches with my wife because it was an easy game to play on laptops on wireless and have a blast.</p>
<p>It's no secret that I was excited for Diablo 3. I had it pre-ordered, I followed the news on /r/diablo for months before release. I tried every trick in the book to get into the beta, and participated gladly in the open beta weekend. I ate it up. I leveled every class, tried for every achievement.</p>
<p>Two months out I feel disappointed like so many gamers out there. Everyone from D2 wanted D3 to be a lifestyle rather than just a game (as one redditor put it). We wanted a game that we could dump hours into and be rewarded handsomely with that great feeling of finding a truly awesome item. We wanted that feeling of being decked out in the best gear and after such a struggle, cakewalking through the hardest difficulty or the toughest PvPers.</p>
<p>I was frothing at the mouth because I remember having so much fun with D2, but it was a different time for me and for gaming in general. AAA titles, indie games, mobile gaming, lo-fi hits mean that there is a steady stream of fun games out there that we don't need to rely on mindless repetition to continue to have fun.</p>
<p>In 2000 there were a large number of really great games, AAA titles like <em>Baldur's Gate 2</em>, <em>Thief 2</em>, and my absolute favorite game of all time <em>Deus Ex</em>. But these were finite affairs to me, you played them, you beat them (sometimes multiple times) and none of them were very multiplayer friendly (DX multiplayer added later notwithstanding). D2 was a strong game in its own right and its repetitive although rewarding formula with PvP and a real economy were perfect to fill the gaps. 5 character classes, 99 character levels, three difficulties and, to top it off a major expansion almost exactly a year later. This combined with the fact that I was 14, with a whole summer stretching out before me, no car and few friends meant that I could not only plow through the other titles, but also dump hours and hours in to D2 to fill the time. It was the perfect storm.</p>
<p>Fast forward 12 years. I've got a wife, a kid, a job, a mountain of bills and I still manage to put in more hours on gaming than the average 9-5er. But the difference isn't just age, or means, the difference is that there are no longer any gaps. As gamers our attention is highly sought after. For reference, look at the wikipedia page for <a href="http://en.wikipedia.org/wiki/2000_in_video_gaming">2000 in videogaming</a> versus the page for <a href="http://en.wikipedia.org/wiki/2011_in_video_gaming">2011</a>. The criteria for inclusion on this list isn't clear but if we condense the multi-platform titles and use them as a list of notable releases, it's obvious that there are at least twice as many notable titles vying for our attention and that's ignoring the vast amount of cheap but fun indie games that would further weight 2011 in comparison. The point is that now, in 2012, no gamer can honestly complain about having nothing to play. AAA titles abound. $2-$5 fun games show up on Steam every day and don't even require decent PCs to play. Free to play MMORPGs are everywhere. That's not even counting the huge backlog of video games from the past decade that you can pick up for a song (although in 2000 you had the entire 90s canon to fallback on too). Together with the fact we're all older and have less time, there's no need for a Diablo game to fill in your time between releases because there <em>is no time between releases</em> anymore</p>
<p>Without the need for an endless game to return to there is one thing that would hold a player's attention in this cascade of games and that's community. The reason that MMOs are so popular and have such a devoted player base is that you join and play with hundreds of other people, form guilds/factions/organizations as well as digital friendships. The same applies for FPS games with their clans. This social aspect is what makes players consider returning even after getting tempted away to another game for awhile. Ironically, social features - the very thing that might've redeemed D3 in face of a rocky start and its many other problems - are practically non-existent. The entire experience is isolating and many player actually complain that working with a group makes the game more of a boring grind rather than less because of the tendency for public players to be undergeared and uncoordinated. MMOs are now where people go to socialize, meet up, quest and battle. D3 offers none of those things compellingly. In fact, the lack of social features blows a hole in the end game that's larger than just poor itemization. Without the ability to show off, get ranked, or PvP, what's the point in continuing to optimize your gear? After all, you beat all of the story content before you even hit the half-way mark to level 60. Even if you want to beat it on the highest difficulty, that doesn't take the best items with the best rolls in the game. Nobody grinds for hours and hours solely to beat end mobs just a little bit faster.</p>
<p>So, stripped of the role as a fallback game (because we don't need them anymore), and stripped of the social features that entice players to return, what's left? The answer is a pretty mediocre game. The gameplay and graphics are brilliant, but the story is a joke and the auction house has replaced the greatest feeling in Diablo (finding a great item) with the chore of gathering gold and going shopping.</p>
On Star Trek Online2012-03-16T18:17:36+00:002012-03-16T18:17:36+00:00Unknownhttps://blog.codezen.org/posts/on-star-trek-online/<p>I'm a huge Trek fan, if you didn't know. I've watched every episode and movie. I know trivia. I have posters in my office, models, and even toys. Yep, I'm a trekkie and proud of it.</p>
<p>I'm also a gamer, but I'm resistant to the idea of playing an MMORPG. I played WoW back in the 2005-2006 timeframe when I had buckets of freetime in college and even then I started playing to the exclusion of all else. I was going through some tough times, what with becoming a father at 20, so I was more than happy to escape my regular existence (I feel I should note that I still managed to get middling good grades and graduate before all of my friends, but I could've done better). Anyway, a year or so of WoW addiction has put me off of MMORPGs because in the end I found the experience hollow, not to mention expensive.</p>
<p>So when Star Trek Online came out, my reluctance to give it a shot as an MMORPG vastly outweighed my desire to play a game in the Star Trek universe. I need another monthly bill like I need a hole in my head, really. Not to mention I had (and still have) a girlfriend and I had only one game-capable computer at the time. Juliette's down with some game playing, but only if she gets equal time, or can play with me.</p>
<p>All of that changed. I built another desktop, and upgraded my first so they're capable of gaming (we played Skyrim with high detail simultaneously). Then, two months ago, ST:O went free to play.</p>
<p>I'm still resistant. The idea of Korean MMORPG players letting their children starve to death in another room is a powerful reminder of the depth of game addiction and I definitely don't have the time to devote to it now that I have a career and a family. But at the same time, the life of a parent can get pretty boring when you don't have the time (or the money) to go out on a regular basis. Finding escape in media (Juliette and I have watched a large amount of Trek, as well as loads of other stuff), or at the gym is all well and good but both of those things can feel repetitive and unrewarding. Games are a good way to get around that, even if their rewards are fake. So, last night, Juliette and I installed ST:O and gave it a shot.</p>
<p>I can already feel the grip of it. I had trouble sleeping last night because of it. It was a lot of fun, and even though I'm only a couple of missions out of the tutorial and still only have a basic grip on the gameplay or strategy, I'm obsessing over it.</p>
<p>I never understood the free-to-play business model, but I do now. The reminders are all over in the game, from the people commanding massive starships, to the unlockable character customization that costs real money, to the Cardassian Lockboxes that require purchased keys to open. It would be so easy to lose track of how much real money you've spent. And yet, looking through the store, the items seem interesting and compelling and the prices don't seem unreasonable when you consider what you're getting. Most of the nitshit improvements are less than the price of a fancy coffee. Some of the smaller ships are $10-$15. The capital ships are $25 (or $50 for a pack of them, one for each class). They're all transferrable to different characters on the account. And even though I'm wary of spending $25 on virtual property that's only good as long as I play the game, I remember that I'm playing the entire game, legally, for free. That's half of what I paid just to buy WoW 6-7 years ago, not even including the subscription fees. Now, clearly, this could spiral out of control. There are some things they charge for that I'd never consider, like customizing your bridge crew characters, or opening those Lockboxes, or expanding my inventory etc.. I'm not here to micropay myself into oblivion, but if I reach a high enough rank and I've gotten $25 of entertainment from the game (which seems likely after one night's playing), I'll probably be rolling in an Odyssey.</p>
<p>Overall, I think the game has channeled Trek fairly well. The space vs. ground event / skill set is pretty much how a Trek RPG should work I think and the style is dead on. The ships and environment look great, even two years out from launch. The ship controls take a little to get used to, but it's managed to relate the universe well with stuff like setting the impulse level, the different attacks, and parlaying crew expertise into special techniques - all things we've seen on screen. It's easy to pretend I'm Kirk or Picard at the helm of my ship with my trusty bridge crew.</p>
<p>That said, I've yet to get very far into the game and I obviously haven't even touched the Klingon side of the universe, so I'll have to reserve final judgment until I know how much fun I can have with it. I'm hoping that the separation between core gameplay and extra content is as well defined as it appears to me now, but I could be wrong as I get farther from basic levels.</p>
<p><strong>Massive Edit</strong></p>
<p>I now have a deeper understanding of the game, and have stopped playing. Some things I wanted to touch on since this is my space for reviewing things that cross my mind.</p>
<p>The Duty Officer dynamic (you obtain sets of duty officers like items, each one has certain attributes, you then send a number of these officers on offscreen missions that take a duration of real time to get various rewards and special XP) was really cool. It rounded out the game as a simulation of being a real captain because in the series you always see characters going to or returning from various competitions and conferences, or having special duty to optimize the warp core, or going on leave to Risa. It was a nice way for your characters to be working even while you weren't playing the game and it was a draw to return so you could check on how your duty officers performed. It's perverse how much I enjoyed sending my little figurine duty officers to settle trade disputes or help colonists, just like in the series. However, it could definitely use a tweak. I was disappointed that the duty officers never progress. They're like a deck of trading cards, you can play them different ways but they never change, you have to trade up or find better ones to improve. I understand that this makes them a commodity for the player trading system (the Exchange), but I would've really liked it if the missions you sent them on changed their effectiveness somehow. Each task has certain requirements to even attempt and each comes with a chance of critical success, success, failure, or disaster. If the officers you assign have certain traits, you can improve your changes for any of the four. For example, if you send a Diplomat with the Telepathic trait, you increase your chance of critical success. Alternatively, if you send your crew on leave with just a bunch of stick in the mud Starfleet types you increase your chance of failure (apparently the rigid officers don't have much fun alone - imagine a crew full of Worfs on leave). Now, that's pretty neat alone, but I wish that some of these traits were more flexible. For example, you already gain a bonus for sending "Tactful" security officers with your Diplomats, because they don't offend the relevant parties. It would be nice if you sent an officer without "Tactful" on the mission and, if it was a critical success (or some other criterion) he would learn something about tact and return with the trait. Of course there are some caveats, you could never gain the trait "Telepathic", that wouldn't make sense, and you'd have to add some chance of getting negative traits too. Overall it would shift the focus from passing around officers like trade commodities to molding an untested fresh crew into a great crew. That's where you get your satisfaction. That's when you're officially role-playing Picard.</p>
<p>Another thing worth mentioning is the crafting system that seems to be compulsory in modern RPGs. I don't envy the task having to somehow wedge a crafting system into a universe that's built around mutual advancement and practically limitless energy, but the STO guys did a great job. The fundamental element of crafting in STO is exploration. To craft items you spend things like "Unknown Alloys" and "Tetryon Particles" that you gather from scanning unknown anomalies. To make a really great item you need a rare particle trace. You have Research Points that represent your skill at building these various craftables (ship weapons, ground weapons, hypos, deflectors, etc.). None of this really makes sense in the broader universe in which sharing research and effort for mutual gain is basically the cornerstone but what they accomplished is rewarding the sort of curiosity that you see in all Trek captains. Now when Kirk scans an anomaly he's not trying to build a phaser array, but in the MMO world where no <em>real</em> exploration can exist, it's a nice way to incentivize giving a nod to Starfleet's scientific mandate by at least feigning curiosity. That said the whole thing is a fucking grindfest, which is basically what all crafting systems boil down to if there's a need to farm reagents. You can certainly just do missions and scan any anomalies that you come across but that's never going to be enough. You need 10 Radiation Samples (or other items) alone just to build the schematic for your end goal. Random chance isn't enough to make all of the craftable items you want to make, and trading low level commodities is pretty much miserable. That means that you're going to head to one of the unexplored sectors of the galaxy and sit around scanning anomalies for ages until you have enough of data sample XYZ and that's flat out boring. Even getting your research points is a grind as you end up having to make items you don't want or need just to get enough points to start making items of your class (this might be avoidable if you start crafting everything and scanning anomalies from day one).</p>
<p>That's the problem I have with STO. It's all to repetitive. I cranked up the difficulty to Elite and the ships and enemies successfully posed a threat to me, but the missions just blurred together into a paste. In the initial Klingon storyline there are some nice piece of writing - like meeting McCoy and Scotty in a past starbase that's rendered just like TOS to defeat phase shifting beings that are exploiting a passing comet to prey on us - but the end result is that basically all the missions are [Space Combat][Ground Combat][Space Combat] with a wall of samey enemies and a linear set of objects to interact with between you and the end. It's all phrased differently, the settings are all trivially different, but there wasn't enough differentiation to hold my attention. Grinding mobs is where I think MMOs in general fall down, but MMOs like WoW have the advantage that if you're going to churn through enemies they're usually different from the last place. You move from undead to snake people to evil gnomes to ghosts to trolls etc. all in their own different setting, and all with their own skills and threats to your character. In STO, it was an interminable stream of Birds of Prey with basically the same attack, maybe a bigger one with Plasma Torpedoes or another minor variation. On the ground it was a stream of the same Klingon characters in worlds that looked too much alike. I will give STO points for the fact that combat is fun, and that it's much more based on abilities you get from bridge officers or weapons than from your character alone (which gives you more leeway to experiment), but when I'm on the surface clearing out my hundredth group of identical Klingons, I'm looking for a little more variety.</p>
<p>This is especially true with the exploration quests. These are almost mandatory because you can get 1440 dilithium (which is a fair sum, not a fortune) every real-time day doing them and there aren't that many opportunities to get dilithium (at least not at my level). The quest is easy, you go to one of the fringe places (the same places you grind for craftables) and you explore or aid three systems. The problem is that you only have to do it a couple of times before you see the pattern that exists in every one of these quests. There are the clear out missions, the missions where you replicate 10 of some commodity the planet needs, the collect 5 data samples missions, and the final and most tedious type: the away team aid mission. These away team aid missions sound like they'd be fun, they come with various different stories, like helping to investigate a murder, or dispelling a ghost story, but in the end it comes down to the same fucking thing. You land, you interact with a set of objects, possibly fighting off others in the way. Now you might think I'm being overly abstract because games are really just interacting with various things in various ways but when I say "interact with a set of objects" I mean you literally walk from one point to another scanning. Some missions that's literally it. You walk from one giant mushroom plant to another until you've scanned 5. Done. Others are you walk from one monolith to another killing Klingons in between. There's no drama. No dialogue. It's just another theme on the same goddam template. Look, I'm not trying to say that STO has to procedurally generate actual alien worlds with civilizations and stories, but at least add some more entries to the cycle.</p>
<p>I'm not trying to condemn all of the writing content. I particularly enjoyed the DS9 arc (the Dominion fleet diverted in the end of the series shows up 30 years late and takes DS9), but even that was tainted but one too many step and fetch quests on Bajor to get the base running and suffered from a rather weak ending (getting a Founder out of Federation prison when - surprise - there's a prison break). The TOS cameos were delightful as well, but that's pretty low hanging fruit to impress a Trekkie.</p>
<p>In the end, I stopped playing. The thrill of space combat, the Trek references, the well done game mechanics and even the great job they did styling the game couldn't make up for the repetitive nature of the game. Maybe there's an explosion of good content later as the writers explored the boundaries of the engine, and maybe the PvP that I frankly couldn't care less about redeems it for some players, but at level 21 I have lost the compulsion to continue. Perhaps MMOs really just aren't for me in the end, and I've been permanently spoiled by rich single player games like Fallout and Deus Ex that are basically impossible to replicate in an MMO.</p>
On Wayland, systemd and Convergence2012-02-09T23:08:59+00:002012-02-09T23:08:59+00:00Unknownhttps://blog.codezen.org/posts/on-wayland-systemd-and-convergence/<p>One of the reasons the Linux desktop is making strides is that we are beginning to converge. One might look at the Unity/gnome-shell split, or the vast differences between GNOME/KDE/Xfce/Xmonad/etc. and think that that statement is a complete load. But look at the tech running our Linux desktops today:</p>
<ul>
<li>IPC: DBus, very important as the foundation</li>
<li>Sound output management: PulseAudio, love it or hate it</li>
<li>Chat/messaging: Telepathy</li>
<li>Network management: NetworkManager</li>
<li>Notifications: DBus notifications</li>
</ul>
<p>This isn't even counting the defacto libraries that handle a lot of the less glamorous tasks on virtually every desktop Linux machine, like poppler for PDF display, or freetype2 for fonts, or components of the non-graphical GNU userland. And also not counting the various standards we almost universally adhere to, like EWMH (where possible).</p>
<p>Convergence provides us with great benefits. You might not like NetworkManager, you may prefer another, but it's because of NetworkManager that major distribution installs all operate identically. Loading Ubuntu / Mint / Debian / Arch / Fedora with GNOME or KDE and immediately you'll see what I mean. It fires up an applet, and the user just knows what to do. It's got permissions, it just works. Compare this to the days before when each distro had its own crazy script crap with varying levels of interfaces and it's the difference between night and day. Today I can hand my girlfriend - not a Linux expert by any stretch - her laptop with a default install of Arch w/ GNOME and she can hit the network. Not so long ago, I had a collection of bash scripts I tried to teach her to use.</p>
<p>Same with PulseAudio. You may believe that using straight ALSA is a better solution, but only until you have multiple sound devices you want to use. Or bluetooth headphones. Or want to do network sound. Or UPnP. Because the major desktop environments have converged around PulseAudio, they all operate similarly and have the same features. Settings in GNOME affect settings in KDE. Media applications can take advantage of PulseAudio's features and not have to worry about fallbacks.</p>
<p>You may argue that Telepathy applications aren't as mature or full featured as Pidgin, the classic IM client, but it's getting there and has several interfaces across toolkits (or lack thereof), and integrated with greater flexibility. Clients written to use it get so much for free that it's compelling.</p>
<p>Applications can be more featureful, stable, and interoperable when most of their functionality is shared in a backend. This was enshrined in the Unix Philosophy and forgotten somewhere along the way: separation of capabilities and presentation. These technologies aren't perfect, they may not eclipse alternatives yet, but the important thing is that they're agnostic of toolkit, window manager, or desktop environment. If you were to start another desktop environment today, there would be far less work to have a functional system today than 10 years ago because of them and that's a win for every person that's ever been unhappy with the state of their desktop. </p>
<h2 id="the-controversial-part">The controversial part</h2>
<p>I haven't yet mentioned the two pieces of software in the title of this piece for good reason. Wayland and systemd are, almost by definition, not about convergence. If anything they're about divergence as we, the open source community, have already converged on Xorg and sysvinit pretty definitively. However, these components are outdated and flawed. They form the basis of all the open source desktops, but we cannot allow that to force us into using them forever.</p>
<p>In the larger scheme of things, replacing these two pieces of software are part of what I perceive as a new push to converge on another component. The Linux kernel. These pieces are software are tightly coupled to it. This is the philosophy of their authors:</p>
<hr />
<h3 id="kristian-hogsberg-creator-of-wayland">Kristian Høgsberg, creator of Wayland</h3>
<p><a href="http://fosdem.org/2012/interview/kristian-hogsberg">FOSDEM 2012 Interview, February 2012</a>
<strong>FOSDEM</strong>: Wayland requires Linux-specific features such as KMS and udev. Would it be much work to port Wayland to other free operating systems such as the BSDs? Do you know of any efforts or interest in this domain?</p>
<p><strong>Kristian</strong>: It's certainly possible to port Wayland to other operating systems, but they'll have to provide the same level of infrastructure as Linux does. One of the things that went wrong with X was that we tried to pull too much of the OS into X so that we could run on every old platform out there. Or to put it more bluntly, bending over backwards for fringe platforms. There's a real cost to that; the code gets encrusted in #ifdefs, codepaths that never get tested and bad architecture decisions such as userspace PCI bus enumeration and writing your own dynamic linker.</p>
<p>I also find that the Linux kernel has a lot of cool features that can make applications faster, safer and simpler, and we often don't use those in the name of portability. There is an accept4 syscall that lets you accept a connection on a socket and sets O_CLOEXEC atomically. The epoll mechanism with timerfd and signalfd does most of what many complex userspace event loops do in many thousands of lines of code. We need to embrace all the new features the kernel offers and not insist on some outdated lowest common denominator.</p>
<h3 id="lennart-poettering-creator-of-systemd">Lennart Poettering, creator of systemd</h3>
<p><a href="http://linuxfr.org/nodes/86687/comments/1249943">Linux.fr Interview, June 2011</a>
<strong>LinuxFr.org</strong> : Systemd use a lot of Linux only technologies (cgroups, udev, fanotify, timerfd, signalfd, etc). Do you really think the Linux API has been taking the role of the POSIX API and the other systems are irrelevant ?</p>
<p><strong>Lennart</strong> : Yes, I don't think BSD is really too relevant anymore, and I think that this implied requirement for compatibility with those systems when somebody hacks software for the free desktop or ecosystem is a burden, and holds us back for little benefit.</p>
<p>I am pretty sure those other systems are not irrelevant for everbody, after all there are people hacking on them. I just don't think it's really in our interest to let us being held back by them if we want to make sure Linux enters the mainstream all across the board (and not just on servers and mobile phones, and not in reduced ways like Android). They are irrelevant to get Free Software into everybody's hand, and I think that is and should be our goal.</p>
<p>But hey, that's just me saying this. I am sure people do Free Software for a number of reasons. I have mine, and others have others.</p>
<hr />
<p>To me, this is exactly the attitude we need. FreeBSD and same-kernel variants are the only open kernels with any sort of desktop presence other than Linux<a href="https://blog.codezen.org/posts/on-wayland-systemd-and-convergence/#footnote1">[1]</a> and it has a tiny fraction the number of desktop users. OpenBSD is still relevant in its own ultra-secure niche, but the desktop is a completely secondary goal. NetBSD is... well, NetBSD. The point is that the Linux kernel has quite a lot of relevant features, and many times the number of users such that it doesn't make sense to warp the codebase of two of our most important components to function on them.</p>
<p>Wayland is a major win for the open desktop because it's dead simple, performant, and in it's 4 year life has already acquired features that are completely lacking in Xorg. It's shed years of X11 cruft in favor of a solution that makes sense on modern open source desktops. We no longer live in a world in which it makes sense to optimize your entire display server for the off chance that the window is going to be remotely connected over a network when 99.99% of the time the application is going to be a local window <a href="https://blog.codezen.org/posts/on-wayland-systemd-and-convergence/#footnote2">[2]</a>. The simplicity of this approach lends itself to leaner, faster software built on top of it. But the simplicity Wayland has achieved is from leveraging technology that isn't present in non-Linux kernels. Apart from the tech that Kristian mentions in the quote above, FreeBSD (again - the most advanced w/r/t desktop capabilities BSD) lacks even rudimentary support for kernel mode setting (KMS) and other technology for this lightweight rendering in released code (although there are out-of-tree patches for Intel chips only).</p>
<p>Systemd too, taking advantage of the more featureful Linux-only u* tools and interfaces, shouldn't have to be warped to support tiny tiny fractions of the community. If it did, and the device hotplug or cgroup functionality it provided couldn't be relied upon, the higher level graphical applications would have to compensate, most likely by ignoring features or using messy fallbacks.</p>
<p>Pieces of the modern open source stack should be written to take full advantage of current technology (Linux<a href="https://blog.codezen.org/posts/on-wayland-systemd-and-convergence/#footnote3">[3]</a>) and damn the rest. Not because I don't like BSD, not just because it has so few desktop users, but because open source, at its heart, is a do-it-ocracy. In no other software ecosystem in the world do independent developers feel beholden to support ancient and rare configurations of infrastructure or to hold of on adoption until support can be universal. In no other software ecosystem in the world does it make less sense to do so. If BSD users want Wayland and systemd, the code is right there, waiting for them to start a patch set against them.</p>
<p>And for those that would say that I'm impugning the open source grail, the freedom of choice, I ask you what you are choosing? Why choose one piece of software over another? Because one does what you want how you want it done, and another does not<a href="https://blog.codezen.org/posts/on-wayland-systemd-and-convergence/#footnote4">[4]</a>. I want to live in a world where the way my software works is completely separate from the way I work with my software. How it works (sending messages, emails, making sounds, connecting to networks, displaying images or webpages etc.) should be solid, featureful and, most importantly, independent from how I work with it (CLI, graphical, integrated into this or that, windows here, buttons there, flashing icons, popups and notifications etc.). I think that you'll find that most of your choice has nothing to do with underlying technology and only with <strong>capabilities</strong> and <strong>presentation</strong>. Lets agree on capabilities and then we are free to choose presentation.</p>
<p>The time has come to take the final steps of convergence at the low level and the high level. To choose the best tech to standardize the underpinning technologies of our systems. Let's drop the harmful pretense of equality and instead usher in an age in which we can all count on a modern kernel, a modern init, a modern display server and functionality that is separated from interface. Then, and only then, will we have created not just the Year of the Linux Desktop, but the Year of the <strong>Ultimate</strong> Desktop.</p>
<ul>
<li>Jack</li>
</ul>
<h1 id="footnote1"></h1>
<p>[1] (Open)Solaris and kin could be considered challengers here, I see murmurs of better graphical support on the internet, but they're incomplete in terms of driver support, and the number of desktop users is minscule even compared to BSD.</p>
<h1 id="footnote2"></h1>
<p>[2] Which isn't to say that we don't want or need the capability of using graphical apps over a network, just that we don't need to cause crippling performance or design problems to accomodate it. That sort of functionality belongs in a plugin or a library. If anything, having it separated from the display manager just means it would be easier to tweak and perfect.</p>
<h1 id="footnote3"></h1>
<p>[3] And yes, this includes moving elsewhere in the exceedingly rare likelihood that Linux would ever be supplanted. It's the year 2012, Linux has the greatest number of developers and users, has faced down all of its (prospective though bullshit) legal problems and has gained widespread support in markets outside of the desktop. As of yet there are no open contenders other than OpenSolaris and BSD, unless you want to count HURD, hahahahaha.</p>
<h1 id="footnote4"></h1>
<p>[4] Licensing is also a factor, but I consider that part of "how I want it done."</p>
On Skyrim2011-11-30T18:19:38+00:002011-11-30T18:19:38+00:00Unknownhttps://blog.codezen.org/posts/on-skyrim/<p>I don't really want to spend much time talking about Skyrim. I've already written this post as a review, but in all I'm still forming my opinion so anything I say has to be tempered at this point. Instead of a review, I'd like to collect various points of thought.</p>
<h2 id="skyrim-s-strengths">Skyrim's Strengths</h2>
<h4 id="level-scaling">Level Scaling</h4>
<p>I never thought I'd say this about a TES game after Oblivion so royally fucked up on level scaling, but this is one (of many, as we'll see in the next few points) where Skyrim learns much from Bethesda's work on Fallout 3.</p>
<p>Like Fallout 3, the level scaling is appropriately tailored to quests leaving random encounters at a standard level. This means that, unlike Oblivion, there are no road bandits wearing daedric armor, but the main questline will provide challenge for you at whatever point you decide to pursue it.</p>
<h4 id="level-mechanics">Level Mechanics</h4>
<p>The core reason that level scaling didn't work in Oblivion was that the traditional TES leveling scheme didn't fit with it. As a refresher for those of you that didn't play Oblivion for awhile to get ramped up for Skyrim, in Oblivion you chose 5 major skills (in Morrowind it was 5 major, 5 minor) and your advancement through those skills determined your character level. In theory, this means that as your knight character hacks and slashes (advancing Blade, Block, etc.) he levels as he becomes more effective.</p>
<p>The reality of the fact was that it was possible to exploit the game with what amounts to the converse of the above. By "poorly" choosing your major skills (i.e. choosing magic skills for a character that will never cast a spell), you could artificially keep your character level low and the enemies would be (in)appropriately weak. This was a functional strategy because <strong>in Oblivion, character levels didn't mean anything</strong>. Sure, you got to dump some points in attributes and skills, but if the alternative means enemies don't get any stronger, you're no worse off for foregoing character levels all together.</p>
<p>Well, Skyrim puts an end to that. You no longer choose your major skills, it levels you up based on your advancement through skills overall.</p>
<h4 id="perks">Perks</h4>
<p>As part of the level mechanic updates, the addition of Fallout 3 style explicit perks was great. TES has always had perks, but previously they were always very subtle to the point of being useless and they were associated with reaching a new skill plateau, so there were only 4 for each skill and you just got them automatically. For magical skills, the perks were always the ability to cast higher level spells... which is nice, but aside from having marginally more powerful spells in your arsenal, it doesn't really affect your gameplay.</p>
<p>With Skyrim's system, you get a perk point each level, and each of the 18 skill trees has around 10 different perks. Like Fallout, these perks have certain requirements (either skill levels, or previous perks), but - most importantly - they can obviously affect your gameplay. Suddenly you can craft better stuff, or you hit 25% harder, or have new moves, or your shield blocks elemental damage, or spells cost half as much. These are significant changes and, because you spend finite points to get them, there are significant choices to be made as you level up.</p>
<p>The result is that a level in Skyrim is something that you don't want to skip, even if you could, which is a marked change from Oblivion, and even Morrowind, where leveling was almost completely irrelevant in the face of skill levels.</p>
<h4 id="character-level-and-performance">Character Level and Performance</h4>
<p>These basic improvements (overall skill level focus and perks) mean that character level is now a rough approximation of effectiveness... if you're playing right. This relationship is the cornerstone of a level scaling system that works, but it also has some flaws that we'll talk about with craft grinding.</p>
<h4 id="skills">Skills</h4>
<p>In addition to the perks mentioned above, the skills have been streamlined as well. Morrowind had 27, Oblivion 21, and now Skyrim has 18 individual skills. The changes are mostly positive, like having One-handed and Two-handed skills separated instead of Blade and Blunt (which in turn were great improvements from Morrowind having a skill for every weapon type). The previous game's questionably useful mysticism magic school has had its effects merged into other trees (conjuration and alteration, I believe). Mercantile seemed useful before, but having to level it through bartering was boring and the differentiation from plain old Speechcraft was tenuous at best. They've been wisely merged into a unified Speech tree. Lastly, the separation of sneak/security into sneak/lockpick/pickpocket is interesting.</p>
<p>I haven't explored all of the skills, but the perks for them appear to be useful. </p>
<h4 id="smithing">Smithing</h4>
<p>I was really happy that they added in a smithing craft. The previous games included the "Armorer" skill, which allowed you to repair armor, but that's clearly not the same. Being a melee character, it's nice to run around in armor you create, swinging weapons you create. That's more vanity than anything as you can pretty much find basic armor and weapons anywhere. The nice part is being able to further improve these items as your smithing skill improves to give you a bit of extra edge.</p>
<h4 id="procedural-generation">Procedural Generation</h4>
<p>Skyrim incorporates a fair amount of randomness into the game, particularly with loot from bodies and chests. That dates back to Oblivion in TES (I believe), but it seems more prevalent now and it's typically an antidote to quests being identical between play throughs.</p>
<p>Procedural generation is new, as far as I know, and it goes much farther to decrease repetition between play throughs. It doesn't effect the main quests or some of the richer scripted events, but for things like bandit raids and thief missions, or assassin missions it's trivial to set up and it adds a whole new level to the game. You could effectively play for hours after completing every quest line without doing the exact same quest twice.</p>
<p>Of course, in execution, these are a little dry. Especially when compared to the richness of the game proper. Some of them are... questionably difficult as well. For example, a procedural thief mission I got, I literally walked into the target house retrieved a conspicuous item and walked out... all while the owner was pleasantly chatting. He didn't seem to mind that this item, which probably hadn't existed in his home until I got the quest, was being "stolen". I'm not sure if he was bugged or what, but the other missions were essentially adding rewards for shit I'd already be doing. Procedural bandit quests just mean you get an extra sum of gold for killing everyone in a randomly chosen local dungeon. I imagine it's similar with procedural assassin quests, but I haven't done any yet.</p>
<p>More interesting are the subtly procedural quests. Particularly quests that have a little more story to them but can take place in a number of different locations. Getting the Helm of Winterhold was subtly procedural. The quest text was spoken and rich, but the place I had to go to reclaim it changed and, most interestingly, the type of enemies I was retrieving it from changed too. Bandits the first time, necromancers the second.</p>
<p>Both examples are definite wins for replayability.</p>
<h4 id="it-s-tes">...It's TES</h4>
<p>The rest of Skyrim's strengths flow directly from its parentage. TES games always have a huge scope and a plethora of things to do and items to obtain. Alchemy, enchanting, buying property, moral choices, many character types and playable builds. Skyrim is a solid entry in the TES lore and I haven't even come close to finishing the game.</p>
<h2 id="skyrim-s-weaknesses">Skyrim's Weaknesses</h2>
<h4 id="the-interface">The Interface</h4>
<p>Bethesda went the minimalist route with Skyrim's interface and aesthetically they hit the mark. Functionally... not so much. There are already mods to correct the PC interface, particularly the inventory interface, but like Oblivion Skyrim seems to suffer from consolitis.</p>
<p>Nowhere is this more evident than in the character creation screen. The row of options at the top of the very first interface screen should function like tabs, but instead function like a slider. I theorize that this is due to the fact that it was designed with using shoulder buttons on a controller to navigate, instead of a mouse.</p>
<p>Similarly, there are a number of places, particularly in dialogue and crafting screens, where the interface appears to lose track of the mouse. Clicking seems to activate whatever is selected, but moving the mouse doesn't necessarily change selections. The result is that you don't really know what you're clicking on which is doubly frustrating because the mouse makes it extremely clear what you want. I'm hoping this is what they're fixing in 1.2 with "Mouse sensitivity issues", although that could also be the atrociously low mouse sensitivity by default.</p>
<p>There are other oddities, like clicking outside of the black left sidebar inexplicably closes the interface, so you have to be very careful when selecting things there.</p>
<p>Overall, Bethesda also missed opportunities to use screen real estate wisely because they were designing for you to be 10 feet away on a couch instead of sitting right in front of a monitor. For example, the dearth of information in the inventory screen. 50% of the screen is taken up by a picture of the item you're currently selected, but all you see about the other 1000 items you're carrying is their name and some symbols regarding whether they're equipped or more powerful than what you have equipped. In Oblivion, and the UI mods for Skyrim, you at least got a brief summary of the item from the list view. This makes it much easier to make choices about, for example, what you're going to drop when you're overencumbered, because you don't have to select each individual item to see how much it weighs.</p>
<p>The last little nit is that when you pickup/drop/purchase/sell items from a big stack, it prompts you with a slider to ask how many. Why I can't type a number here is annoying. Sliders are also used in the character creation screen to choose between presets. Sliders are probably the worst possible idea for mouse users, but the only controls that makes sense for console users.</p>
<h4 id="the-craft-grind">The Craft Grind</h4>
<p>Crafting, especially the new smithing craft, is hard to level without grinding. Part of the problem here is that, in previous games, the crafts were much less skill dependent. Alchemy, for example, was more effected by your intelligence attribute and the apparatus you used to create the potions than it was by the skill level. Without an intelligence attribute (or attributes at all), and no apparatus, alchemy effects are entirely based around perks (and thus skill and character level).</p>
<p>The problem is, with the focus on perks instead of getting gear or souls, you are forced to get your crafting skill level up to improve. Makes sense, but it's not a smooth slope like it is with other skills. You have to go out of your way to craft. To some extent alchemy doesn't suffer from this flaw as you're creating potions that are disposable and there are reagent everywhere. If you experiment to find the reagents' properties, and otherwise just craft potions for yourself or to expend reagents, you can build alchemy fairly easily -- especially if you're not afraid to use potions.</p>
<p>Enchanting has a similar flow if you just gain levels by disenchanting or charging enchanted weaponry with soul gems.</p>
<p>Smithing has absolutely no flow whatsoever. There's no way to level it with any reasonable speed making only items for personal use. It's also hard enough to find the reagents (ore) in large enough quantities just by adventuring, so you're likely to be going out of your way to mine, which isn't too much fun. The point is that if you plan on creating yourself a set of armor and a new set of weapons at every tier of smithing, and upgrading them every time you can, you're not going to have enough smithing tasks to make it from one tier to another. The solution? Make iron daggers over and over. Almost the definition of boring.</p>
<p>For smithing, and even for the other crafts that have some semblance of skill, you're probably going to end up creating items for no other purpose than to up your level. It's possible to pace yourself by forcing yourself not to buy the reagents to do so, but nonetheless you're going to be cranking out daggers, potions, and enchantments you don't need if you want to get those levels. That sucks.</p>
<p>This is a persistent problem with TES, but it was previously been mitigated by equipment and by the fact that when you level you got to dump points into skills. In Oblivion you could theoretically get to 100 Enchant without ever enchanting an item or filling a soul gem. It makes no sense, and people would most definitely grind in that game, but you could do it. Here you're forced to grind, to some extent.</p>
<p>Because I'm a fan of the new level system, I would've liked to have seen these problems addressed with crafting quest lines. To introduce you to smithing, the Whiterun smith has a basic quest to show you the ropes. Why couldn't that continue? There should be quests to mine ingredients (tangentially I think you should get some smithing experience from mining and smelting in addition to the proper crafting), or forge so many X for the war effort. That would not only allow you to do quests to smoothly gain levels, it would also give you a reason to make things more interesting than iron daggers. If you were given special ingredients to fetch from hostile areas it would even mix leveling your smithing with your other skills.</p>
<h4 id="bugginess">Bugginess</h4>
<p>Bugs have plagued every release Bethesda has put out since Arena and Skyrim is no different. I've seen items floating in the sky, people in sitting positions slide into their chairs from across the room. A friend of mine saw a mammoth fall out of the sky and die right in front of him. I've had fetch quests that had to be done twice, inexplicably. There are texture issues and crashes too. Going to the internet, there are apparently some other bad bugs that I've had the good fortune to avoid.</p>
<h2 id="overall">Overall</h2>
<p>Overall Skyrim is a great game. Out of the gate, it's a bit rough around the edges, but much less so than Oblivion was. Bethesda's greatest strength is its mod friendliness. It extends the life of every game by being open to new content and allows players to correct (real or perceived) problems. The upshot of Skyrim is that it's a solid release, but every single one of the complaints and bugs will eventually be addressed. Whether it's by Bethesda or the players is irrelevant.</p>
<p>Right now, the game has its flaws. A year from now (or, rather, a year from when the "Creation Kit" is released), the game will be verging on perfect.</p>
On Brewing2011-09-30T19:34:13+00:002011-09-30T19:34:13+00:00Unknownhttps://blog.codezen.org/posts/on-brewing/<p>A couple of friends of mine, David and Otto, came down from their various corners of the world this past weekend. It was great to reconnect with them. It'd been years (since I got out of college almost 4 years ago) since we'd been in one place. It was a good time to be sure. Juliette and I tried to take them around Austin, to check out some of the local flavor. Otto had been here before for a festival (a common claim for many music and tech fans), but we largely stayed out of downtown. The appeal of 6th street is somewhat lessened now that school is back in session and we weren't exactly looking to hang out with college age <del>douches</del> students out to get drunk fast and cheap. We hit places like Freddie's, Dolce Vita, South Congress, Mount Bonnell and a cool little brew pup co-op called Blackstar (which I will probably return to, even if I don't become a member).</p>
<p>Tangentially, I've been playing a lot of Dwarf Fortress of late (I'll talk about that in another post, perhaps) and drinking a lot of beer and those two things have turned my brain to homebrewing, with a little inspiration from <a href="http://wilwheaton.typepad.com/wwdnbackup/2011/09/notes-on-the-making-of-my-polymorph-porter.html">Wil Wheaton</a>'s adventures with his son. I was planning on getting a basic equipment set for myself (via Juliette) for Christmas, but it just so happens my two friends are homebrewers as well so I decided to advance my plans. Besides, when it takes about a month to turn around a batch of beer (give or take depending on style), it's better to get started early. This way, I can have a batch ready for the three major holidays (Halloween, <del>Skyrim</del> Thanksgiving, and <del>Diablo 3</del> Christmas).</p>
<p>So with my friends to help me, particularly Otto who's been doing this in one form or another since college, we went to <a href="http://www.austinhomebrew.com/">Austin Homebrew</a> a local brick and mortar store that, you guessed it, sells all you could ever want for homebrewing beer, wine, and even soda. Judging from some <a href="http://www.homebrewtalk.com/vendors/">vendor lists online</a>, this type of place isn't exactly unheard of, but it is a rare convenience. Especially considering that it's literally 10 minutes away from my house. Sometimes it's nice to be reminded what a cool city this place is and homebrewing definitely seems to fit the Austin character. This is probably the most beer friendly city I've ever been in and I'm from <em>St. Louis</em> the erstwhile home of Anheuser-Busch.</p>
<p>I was really surprised with how dead simple brewing ends up being. It's basically like making tea, then making soup, then letting your yeasty minions turn that sugary soup into tasty alcohol. It's really just like any other food recipe, albeit one that takes longer and requires ingredients you don't find in a grocery store. The process is also extremely variable. You can be pretty much as involved in the process as you want. They actually sell "canned" beer kits (which I initially thought was some sort of way to end up with cans of beer) in which you literally just mix some buckets of premade ingredients into the fermenter. No cooking (aside from boiling the water) required, and a bit less special equipment (no huge stock pot, no hydrometer). Sounds kinda boring, but it's literally one step up from just buying your beer at the corner store. In the process we used, the grains were already malted and the yeast was ready, but we still created the wort ourselves. It is possible to malt your own grains though and even culture your own yeast. Hell, you could become entirely self sufficient and grow your own grains and hops too although you'd probably still have to rely on others for any special flavor ingredients. Anyway, the point is that the level of control you have over your personal involvement is great.</p>
<p>On top of that varying level of time commitment, there's also a huge variety of equipment. Even one half brew in, I can see that people's setups are vastly different. Reading through the <a href="http://homebrewtalk.com">Homebrew Talk</a> forums, it becomes evident that a lot of these folks have very complex (and very <em>expensive</em>) setups. Kegging, kegerators, burners, wort chillers, fancy fermenters, carboys, parallel sets of equipment for "pipelining", bench cappers, taps etc.. I got started for about $150 (a fermenter, a carboy, an auto-siphon, tubing, bottle wand, some caps, a hand capper, a manual, an airlock, some sanitizer, a huge steel stock pot, a thermometer, and a hydrometer), not including the first batch ingredients. But virtually every step of the process can be improved and simplified. Some people will stick with the basic investment. Others will spend thousands of dollars. Me, I'm waiting to see how my first batch turns out before thinking of improvement, but there's definitely room for it.</p>
<p>The last thing I'll mention is the economical point of view. Each five gallon batch turns into roughly 50 bottles (not equivalent to 5 gallons, you do end up losing some volume). Taking everything into account, the ingredient kit, the water (I didn't use tap water, even though the helpful dude at the supply shop said Austin water was okay), the ice, even the caps, my first batch cost about $36. Roughly speaking, and not counting your time investment (that's the fun part), or nitshit like stove gas, that's 72 cents a beer. This batch is Belgian White, which is like a Blue Moon, which costs about $17 / 12 or $1.42 per beer. The cheapest, worst beer I would ever drink in a that-or-nothing situation, Lone Star, is about $9 for 12 or about 75 cents a beer. So there are basically three possible scenarios:</p>
<ul>
<li><strong>Best case scenario:</strong> The homebrews are as good as people say they are and I didn't fuck it up. The price of a homebrew bottle is half that of its store bought counterpart.</li>
<li><strong>Mid case scenario:</strong> The recipe sucks or I made a critical mistake. As long as it's drinkable it's still cheaper than Lone Star.</li>
<li><strong>Worst case scenario:</strong> It's undrinkable crap that even time won't fix. I'm out $36 but hopefully I learned something in the process.</li>
</ul>
<p>It's hard to think of in pure economic terms for a hobby, but I take two things from this. First is that it will take about 5 good batches (214 beers, assuming similar quality) before the cost of the basic equipment is overcome by the savings on beer. One more batch to pay off the bottles if they're kept in rotation. Not half bad considering you can brew for years with the same equipment provided you keep it clean (and don't break your hydrometers). Second, it means that it makes financial sense to be constantly brewing. If a homebrew beer was more expensive than its counterpart then brewing would be a special occasion thing. As it is I've already got plans to buy two batches of bottles and another ingredient kit as soon as my first batch is out of the fermenter. Of course, this is all in rough numbers and it assumes that I'll be cranking out the same beer (I won't be) and I'll never fail a batch. Really, as with any hobby, it's hard to quantify the enjoyment or the reward of actually doing it. I'm just glad the math seems to be in my favor.</p>
<p>All in all, I'm looking forward to partaking in homebrewed beer in a couple of weeks. It definitely isn't for the impatient (or the broke) but so far it seems like a fun, economical, low maintenance and hopefully delicious hobby.</p>
A fan's review of Deus Ex: Human Revolution2011-08-29T18:27:05+00:002011-08-29T18:27:05+00:00Unknownhttps://blog.codezen.org/posts/a-fans-review-of-deus-ex-human-revolution/<p>I just completed my first play through of the new Deus Ex game, Human Revolution or DX:HR for short. I guess you could also call it DX3, but that might confuse some of the folks that disavow that Invisible War ever existed.</p>
<p>I was, and am, a huge fan of the original Deus Ex. In 2001 it was a truly original game and I consider it, easily, my favorite videogame of all time. I've played it through maybe five times all together (and a few times I didn't finish) with strategies varying from soldier, to hacker, to spy, to pacifist, to knife only psychopath (although I had to upgrade to the Dragon's Tooth towards the end, and I didn't count a couple of the "boss" type characters which had to be taken down with LAMs or GEP rockets). I can remember some of the original Deus Ex levels so well I could probably reproduce them faithfully from memory.</p>
<p>Invisible War was a forgettable sequel. I remember virtually nothing of the storyline, the character, or the mechanics thereof. I just know that when I finished it, I decided to erase it from my memory and pretend, as a lot of other internet gamers, that it never happened. It was less a Deus Ex game and more a botched product of the then dying Ion Storm (RIP). However, I was encouraged when the pre-release buzz was building for Human Revolution started and the developers seems to have their heads screwed on right, and they acknowledged that Invisible War was a failure. To see my favorite franchise fall short again would be enough to make me lose hope that it could ever be done right again.</p>
<p>So, with that bit of history and personal opinion out of the way, here's what I thought of the most recent volume of Deus Ex.</p>
<p>[toc]</p>
<h2 id="gameplay">Gameplay</h2>
<p>As I mentioned, a lot of the pre-release hype convinced me there was hope for the game. Admittedly, some of it made me question the future, but overall I believe most of their choices came off better than I expected.</p>
<h3 id="augmentations">Augmentations</h3>
<p>The first thing I was disappointed in in pre-release was that there were going to be no skills. In the original, you had skills, which were upgraded with experience, and augs, which were found and upgraded using various canisters you had to find throughout the game. Skills included things that you or I could accomplish, stuff like weapons accuracy, melee skill, swimming, hacking, medicine, etc. Augs, just like in the new game, practically gave you super powers.</p>
<p>All in all, I think they combined the two systems well, although they accomplished it partially by stripping the need for a lot of the skills. For example, swimming is moot because there is no water. Medicine is pointless because you regen. Melee is done away with as there are no melee weapons. The remainder of the skills were rolled into augmentations. Lockpicking (although mechanical locks are now unheard of and lockpicks don't exist), computers, and electronics were all rolled into hacking which is very well represented in the tree with three separate branches. "Environmental Training" was condensed into a rebreather augmentation that lets you resist toxic gas. Weapons skills are now handled all together with an augmentation that increases accuracy while moving.</p>
<p>A lot of the old favorite augmentations came back too, like cloak, and silent running. Dermal armor has taken the place of the shield. Regen is now a built-in augment you have from the start (bolstering the no-health approach of the game, which also rendered the medicine skill moot). I didn't get the chance to use any of the advanced retinal augments but they sound similar in concept to the original as well.</p>
<p>There were also some cool additions to the augmentations too. The Icarus Landing System lets you jump from any height and take no damage. High enough and you get a neat bubble effect and you can optionally stun everyone around you -- although I never got to use that feature. The social augmentation sounded neat to open more dialogue options. You can gain the ability to punch through (some) walls too which is definitely a plus for path finding. Then there's the neat offensive augmentation, the Typhoon, that allows you to expend Typhoon ammo and cause a shockwave of death. Very cool, although it sucks when used against you =).</p>
<p>Really, I didn't end up missing skills and the game does fine with just the augmentations.</p>
<h4 id="the-xp-problem">The XP Problem</h4>
<p>I really didn't like the fact that XP got you augments though. I know they rationalized it in game with the fact that you were somehow "awakening" your augments with experience, but that doesn't make much sense to me. How does me doing an arbitrary action like finishing a mission suddenly entitle me to the ability to cloak? I understand it's just a mechanic, but perhaps it would've made more sense to have canister-esque items for the baseline augmentations (the things you have to spend two "praxis points" to open up), and then XP would allow you to upgrade within the tree the baseline augments open up? (If you haven't played the game, this essentially means that you'd have to find a canister to get cloak, but you could upgrade your cloak's efficiency through XP points).</p>
<p>The core of the problem here is that XP is too easy to get. My first (and only for now) play through was non-lethal stealth. I got XP left and right, hacking systems, completing sidequests, getting bonuses for finding secret ways in. Every takedown (we'll get to those later) was easy XP. Then you get a massive bonus for getting through a level without triggering an alarm, or getting noticed. To top it off, you can even buy these points for credits!</p>
<p>By the end of the game, my stealth Gandhi had more "praxis points" than I knew what to do with. I ended up spending my last 5 points maxing dermal implants that reduced damage 45% and made me immune to EMP. This on a character that almost never got shot... only because I had literally nothing else worthwhile to spend the points on. I had maxed hacking (the capture and stealth trees, fortify was pointless then), maxed my batteries, maxed cloak, maxed my storage capacity and lifting strength, could run silently and jump nine feet into the air... I can't count the number of times I've gone to the augmentation screen and found, oh wait, I have <em>three</em> points waiting to be spent.</p>
<p>This abundance of augmentations also factors into the game because you no longer have to make any tough choices. In the original game, the canisters each contained two augmentations and you had to choose between the two irrevocably and they had to be installed by a bot so you couldn't just hang on to the canisters until you decided which was more useful. Some were easy choices just based on your play style (Combat Strength probably isn't important if you're going to be shooting people up, for example), but others were very tough. Do I want my augmentations to all take less power (Power Recirculator) or the ability to upgrade one aug on the fly (Synthetic Heart)? Do I want regeneration (energy expensive, but useful for all damage after the fact) or the ability to absorb fire/plasma/energy attacks? In either case you can't have both. DX:HR doesn't force you to make these choices. Every augmentation is open for you and you can just carry around three of these praxis points to use at any time. Get to an area with EMP? Oh I guess I'll just "awaken" my augmentation for EMP immunity. Thanks!</p>
<h4 id="the-pointless-augs">The Pointless Augs</h4>
<p>There was also an entire stealth tree that seemed pretty much pointless too, which was disappointing. Mind you, I was playing on the hardest difficulty (although I'm sure some would say I was cheating at it because I turned on the reticle) and it was never an issue to "mark and track" my enemies. You can see them all on the radar, so who cares? I don't need to know how much noise I'm making... if I'm crouch walking I'm being quiet enough. I don't need to see the visual range of my enemies because I can see what way they're facing on radar. It's saying something that my stealth character made it all the way through the game without a single point in the general stealth tree. There are also some others that seem a bit pointless... like the HUD telling you how long until enemies' alarmed status ends. Doesn't really help you at all, since you can see when it ends anyway, it just tells you how long you're going to have to wait. It's not like it's ever more than 30 seconds anyway. I feel like I should point out that the original had some questionable augs too, like Aqualung, Environmental Resistance, Radar Transparency (unless you suck) etc.</p>
<p>Still, the above gripes aside, the augs -- although too easy to get and the XP system makes 0 sense -- were fun to use and enhanced the gameplay as they should. I would've liked to see most of the same augment technologies just with fewer opportunities to get them to add to the challenge. Maybe a sliding XP scale instead of getting praxis points so regularly.</p>
<h3 id="no-health">No Health</h3>
<p>Probably the most controversial of the additions to the new game was the fact that there is no health. Well, there is, but you regenerate constantly by default which means that, like a lot of newer FPS games, if you get shot you just have to hide for a bit to get better. Initially I didn't have a problem with this system. In fact, considering the setting of human augmentation it seems to make more sense in DX than anywhere else. However, in retrospect I can say it removed a lot of the urgency from situations. If I was feeling lazy and there was a single enemy, I'd just sneak up as close as a I could and then charge to do a take down, fully cognizant of the fact that if he gets a shot off, all I have to do is sit on my ass for 20 seconds. That is unless he head shots me or has a powerful enough weapon...</p>
<p>In the original DX, you had all sorts of fun because you were damaged. Getting through the next scenario might not be difficult but if you were out of medkits and had 10 health, getting through suddenly becomes a lot more challenging. There's nothing like sneaking up on an enemy knowing that if he turns around it doesn't matter if he's armed with a feather duster, you're fucked. Then there was fun stuff like, if you were hit in the arm enough, your aim got all wonky. If you were hit in the legs, you were slowed to a crawl. None of that happens in the new game, and it's difficulty shows it.</p>
<h3 id="cover-system">Cover System</h3>
<p>Another change was the addition of a third person cover system. Honestly, this change was very well done and a welcome modification of the original game play. In the original game, you had the ability to lean around a corner to scope out what was there, but the cover system allows you to have a much better idea of what's going on around you. On one hand, it's kinda bullshit because you can see over walls that you're crouched behind, but on the other hand I imagine it as sort of an extension of the main character's intuition. The ability to see a room, see the enemies, crouch and still piece together what's going on based on sound. Besides, you're equipped with a radar system that can "see" practically everything, so why not?</p>
<p>The bottom line is that the cover system is just a formalization of the techniques you'd use in the first game if you were any good at it, and the ability to move quickly between cover is a definite improvement over the first game in which you'd crouch walk instead of doing a leaping somersault.</p>
<h3 id="take-downs">Take Downs</h3>
<p>Related to the cover system you also have a third-person take downs. As a melee aficionado, I was disappointed that the game eliminated melee weapons. However, I'm still conflicted about it. The take downs were nice, very cinematic and also very useful. I would've have been able to complete a non-lethal stealth play through without them. Really I'm only apprehensive because they were so easy to achieve. Walk up to one (or two with an augmentation) guys and, provided you have enough energy, it's light's out. No finesse required, other than getting close to them without getting your head blown off.</p>
<p>In the original game, it was difficult to make it through with a knife or a baton. I can't count the number of reloads I've had to do because I snuck up on someone, uncrouched and then fucked up the execution of a melee "take down" in the original.</p>
<p>I also don't get why a takedown takes the same sort of energy as your augmentations. I mean, does it take as much energy to punch two dudes out as it does to turn invisible for 3/5/7 seconds? Maybe, but I think if they needed to limit the amount of take downs you could do (they did), then I think a cooldown period would've done the job better. Particularly because it's tough to gauge how much energy you're going to need in situations. For example, if you wanted to cloak and take someone down you need to make damn sure that you've got a full energy bar left by the time you reach your target or you're just going to stand there.</p>
<p>All in all, I could take them or leave them. The take downs were fun to execute, even if they were too easy, and I suppose it makes sense that a consummate badass would be able to snap your neck or choke you out pretty much on a whim. </p>
<h3 id="boss-fights">Boss Fights</h3>
<p>This is also the first time DX has had true boss fights. In the original you had climactic moments, and you killed a lot of important NPCs who were tough and armed like bosses, but there were no true bosses. Personally, I'm of the opinion that boss fights are contrived and this was no exception. Perhaps it makes a bit more sense considering the story line and the whole idea of augmented super warriors, but if they would've stayed true to the original and just integrated them into a level it would've been a lot more fun and a lot less frustrating than a true boss "arena" complete with ammunition and usually a novel way to destroy your foe. Not to mention it would've probably been a lot more challenging if they just showed up in the middle of a level and fucked you up instead of having the whole cliched cut scene.</p>
<p>The other point I'll make here is that while the game did a good job making sure that the rest of the game was doable without killing anyone, when it came to the bosses you were forced to be lethal. I don't really have a problem killing the bosses and sparing their lesser guards, but it was a huge pain in the ass to arm myself with lethal weapons at the beginning of each boss fight. For the second boss in particular it was extremely annoying that I had to find lockers, drop non-lethal items and ammo out of my inventory so I could pick up a machine pistol and some ammo ... all while being chased. I guess that's what I get for being non-lethal and having to kill someone.</p>
<h3 id="hacking">Hacking</h3>
<p>Hacking is one gameplay addition that I think the designers did right and better than the original. The hacking minigame was a challenge and different each time. It added a level of difficulty to opening a door that wasn't present in the first game (where all you had to think about was "do I have enough skill/lockpicks/multitools to do this?"). It was nice that sometimes I could break a level 5 system without an alarm, and sometimes a level 2 system would alarm right off the bat and make you sweat. I enjoyed all of the hacking in the stealth play through.</p>
<h3 id="omissions">Omissions</h3>
<p>There were some other, minor, gameplay elements that I would've like to have seen in the new game, although I can forgive their omissions. I would've really liked to have seen ammo types, although since ammo is now an inventory item and you're always at a loss for space that might've been annoying. Melee weapons would've been a plus as I mentioned before although similarly an inventory problem. Weapon mods were sufficiently scarce, but didn't apply to enough weapons. With my non-lethal play through virtually none of the mods would apply to my tranquilizer rifle so I put them all on my reserve pistol. Some wouldn't make any sense (damage, silencer), and it came with a scope, but why can't I have a laser sight? I think the only mods I could actually apply to it were the reload speed mods.</p>
<p>None of these are that important however.</p>
<h2 id="the-world">The World</h2>
<p>First off, let me say unequivocally that the level design was great. The levels provided numerous paths to take for virtually every scenario. The city hubs were atmospheric and suitably dirty and complicated. The facilities were well thought out and believable. The game seems to do squalor and sophistication with the same ease. This was a hallmark of the original Deus Ex, although the original seemed to tend toward the dingy post-apocalyptic side of the spectrum for the majority of the time. Perhaps I am just unaccustomed to the current state of PC gaming, but I was very impressed with the look and feel of the game.</p>
<p>The world told of through the various scattered e-books (not datacubes yet, I guess), newspapers, emails etc. seems realistic and, importantly, it seemed to connect well with the world of the original. There are a lot of juicy references for old players, like Manderley, TTong (who you actually get to see at one point), and the NSF.</p>
<p>That said, the immediate world that you play in seems much smaller. You globe trot, which is important for a Deus Ex game considering the original took you all across the world, but three of these locations you only see as a singular level. Albeit a singular, <em>well-designed</em> level, you still don't get a chance to venture out before being choppered elsewhere. That's similar to the first game where the only <em>cities</em> you truly explore are New York and Hong Kong, (I guess you might be able to count Paris, although it's different) but there were many many many peripheral locations in those cities and between your visits to them. The original had much more content and had many more levels without a lot of time being spent doing pointless side-quests. I guess I shouldn't be surprised in the age of DLC.</p>
<p>To make things worse, it seems like most of the places you visit don't have any real secrets to find. The original had many little nooks and crannies to explore unrelated to the advancement of the storyline. To give an example: In the original Deus Ex, there was actually a very small secret MJ12 facility beneath the streets very early on in the game. You don't encounter MJ12 as part of the story until <em>much</em> later, but if you find it you raise questions like "who the hell were those dudes with Roman numerals on their helmets carrying combat rifles in the sewers?" They weren't part of any quest at that point. No one ever directs you to the facility, you just have to find them on your own. Now, I could be making an ass out of myself because there very well could be secrets like this in the new game. In fact, it could be rife with them <em>but</em> I can say that I didn't find anything that surprising and <em>I was looking</em>.</p>
<p>The core issue I have with the immediate world is that it was too efficiently designed. There are different paths and doors to hack, storage units to break into, etc. but almost everything is there for a purpose. Every ladder, every vent, every corridor is there as part of some type of quest. Too many times I was called back to a room I had already broken into (the hacker in my character can't stand a locked door) for some scripted event to happen. Without the reward of finding new places and secrets, I almost felt as though it was pointless to explore since the game would effectively take me to every place worth going. That's not a good feeling in a Deus Ex game.</p>
<h2 id="the-story">The Story</h2>
<p><strong>This part has spoilers for both Deus Ex and DX:HR <a href="http://blog.codezen.org/2011/08/29/a-fans-review-of-deus-ex-human-revolution/#Conclusion">[skip]</a></strong></p>
<p>Finally, the story. Deus Ex had a lot of strong points, but its story was the strongest. It was vast in its scope. Your point of view shifted wildly as you played through the game. You were surprised and betrayed and truly felt the effect of your choices.</p>
<p>DX:HR tries to pull off the same feat. It does a much better job than the sequel-that-shall-not-be-named, but I still ended the game disappointed. I feel like I anticipated every twist and turn. The first time we heard of Pan... Pan... Panchaea? However you spell the arctic research facility, I knew I was going to be visiting it. The LIMB clinic biochip replacement because of the glitches? I <em>knew</em> that I should avoid it. The instant that it was revealed that Dr. Reed was "dead" I knew she wasn't (although I admit I doubted myself when reading her autopsy).</p>
<p>I'm not sure why. Maybe it's because I can never play a Deus Ex game for the first time again. Maybe I'm just not 15 anymore, but I've convinced myself that it's more than mere experience that's made the difference.</p>
<p>I felt that the choices that I made were of much less consequence than in the first game. This might be another place where I'm making an ass out of myself because I've only done one play through so I haven't really seen how things <em>could've</em> turned out, however I feel that I have a grasp on the scope of the choices. On re-evaluating the choices in the first game I guess that they didn't really have much effect on the overall story, but they had a psychological effect and they weren't always obvious. The best example from the original is that I didn't know, until my third play through (or so) that you could stay back (despite his urging) and save your brother, Paul. I always just assumed that I was supposed to run and he was supposed to die. Admittedly if you save him or he dies it has little effect in the long run (in one mission you have to recover his body if he's dead, otherwise you don't that's about it -- other than having him around your home base) but it's psychological. I saved my brother, that's important. Another big choice in the original was to kill Agent Navarre in the airplane. Basically you're choosing whether you defect from UNATCO now or later, and the difference is very slight in the overarching storyline, but psychologically at the time of making the choice you feel like you have reached a giant fork and that feeling is all that's important. DX:HR evoked no such feelings and each choice was obviously presented. The choice whether or not to frame Taggart is fun, but it's effect is immediate and you never feel like it's going to change the next steps of the game in any important way. Same with the biochip replacement.</p>
<p>I also mentioned betrayal. In the original Deus Ex, there was <em>nothing</em> more mind-blowing than escaping a prison complex full of secret police only to realize it's in the basement of the department you used to work for. Yep, this super secret prison is actually right there where you happily and obliviously worked for the first couple of missions. It was totally shocking. That's not a twist you can anticipate just by being aware of common cultural tropes.</p>
<p>The story suffers from the same fatal flaw that the level design did though. It's effective and not much more. I can say that the story left me in the dark in terms of what I was going to be doing next, up until the very end. I didn't know I was going to Shanghai until I was two minutes from being there. When I woke up in a cargo pod in Singapore, it was news to me. The story does have that going for it: it got me from one place to another with a purpose. If this was <em>any other game</em> that would be enough, Half-life even made its name doing this. But this isn't just any game, this is Deus Ex.</p>
<p>The original story dealt with the Illuminati, the world government, secessionists. Conspiracy on an unknown number of levels that you had been thrust into as a wildcard. This story attempted to weave those elements into it (the Illuminati are mentioned, the crazy radio DJ ranting about the Bilderbergs, etc.) but failed to really make me feel like I was taking part until the last minute. In essence, the new storyline was attempting to weave conspiracy and corporate espionage into the main story, which was the most basic and utterly over done classic save-the-girl storyline. Here's the true problem: JC Denton was a government operative that felt betrayed by the system that created him. JC was out for Truth with a capital T. The Truth to destroy those that had made and subsequently deceived him. Adam Jensen, as much as I loved playing him, was a bodyguard trying to get his woman back.</p>
<h2 id="conclusion">Conclusion</h2>
<p>Don't get me wrong, this game was a lot of fun. I'm already planning another play through because, despite the fact that the choices were obvious and anemic, I'm interested in how the game changed and how it would play if I couldn't open literally every door and hack every computer I found. It'll also be nice to try out some of the more aggressive augmentations. Perhaps on this run through I'll discover secrets and realize my previous statements are false or come to a greater appreciation of the game in general.</p>
<p>All in all, it's worth it to check out, even if it isn't as good as the original. This is definitely not a game that will be forgotten and it gives me hope that the next iteration will be even better. Hopefully, with strong reviews and sales, we won't have to wait another 10 years either.</p>
Taking Personal Notes2011-08-24T17:01:01+00:002011-08-24T17:01:01+00:00Unknownhttps://blog.codezen.org/posts/taking-personal-notes/<p>I've just started on a new team at work, which essentially means I have a clean slate for the first time since I got out of college and moved to Austin for IBM three years ago. Of course, since then, I've had a good three years of work experience which, while certainly not <em>impressive</em>, means that I can avoid all sorts of newbie mistakes that I made when coming into my first project.</p>
<p>One of those mistakes, I believe, was not taking proper notes. And by "proper" I mean digital, searchable, and accessible from anywhere. There are probably five or six notebooks of various dimensions that I've alternatingly filled with doodles and cryptic notes taken on phone calls. Paper notes seemed like a good idea at the time -- especially coming out of a college classroom -- but, as the project stretched on and I couldn't find that damned random IP address or URL I scrawled on a piece of paper (<em>I was sure was around here somewhere!</em>), it was clear I had failed.</p>
<h2 id="desktop-software">Desktop Software</h2>
<p>There are a lot of neat programs out there that I discovered looking for a good solution. GNOME actually comes with <a href="http://projects.gnome.org/tomboy/index.html">Tomboy</a> (or <a href="https://live.gnome.org/Gnote">gnote</a> if you're not down with the whole mono thing) which has the right idea with a wiki-ish syntax, but having to keep things synced with rsync or something doesn't appeal. If I was going to hand synchronize I might as well use Vim. To wit, there's actually <a href="http://code.google.com/p/vimwiki/">Vimwiki</a> which seems a bit anemic although it does a good job of keeping in the Vim spirit. There's also <a href="http://www.jhorman.org/wikidPad/">Wikidpad</a>, a notepad-esque wiki with a bunch of fun icons and settings, that looked neat as cross-platform solution -- I haven't actually used a Windows box in years, but I still have a lingering fear that I'll be in the improbable situation in which I need to look something up from one. Not a cold sweat kind of fear, but it's still something that I'd like to be able to do.</p>
<p>All of these solutions require a client though and either it's Linux only and ubiquitous or cross-platform and a bit of trouble. None of them sync either. Also, what about my phone? Notebooks are great because they're portable, so I'd like to be able to access notes from a coffee shop or hotel without lugging my laptop or counting on laughable "business centers". These solutions would probably be better suited to someone that wants to take notes in them instead of using a static text file on one machine. I'm sure there are lots of users out there like this, but I'm not one of them.</p>
<h2 id="the-cloud">The Cloud?</h2>
<p>There are some well known cloud solutions that run on Android and the desktop, like Evernote, which would get the job done but as some of my <a href="http://blog.codezen.org/2011/06/29/android-mediatomb-upnplay-music-anywhere/">previous work</a> attests, I really prefer to keep my data out of the cloud and on my home servers if at all possible and, even better, using open source. In the case of work notes, I have to be very careful with security. I can't have unknowns looking at my notes when they include stuff like phone numbers and passcodes, hostnames and passwords, potentially confidential attachments in the future. Even (or maybe especially) if they double super secret swear not to look, they <em>can</em>.</p>
<p>Since I have no desire to write any sort of synchronization script, or an Android app, or to keep my data on someone else's machines, I narrowed my choices down to browser based solutions. Every platform has a browser, right?</p>
<h2 id="pocket-wikis">Pocket Wikis</h2>
<p>There are a number of browser wiki implementations (like <a href="http://stickwiki.sourceforge.net/index.html">Wiki on a Stick</a>, or <a href="http://www.tiddlywiki.com/">TiddlyWiki</a>) that are predicated on simplicity such that you can toss them on a USB key and read them almost anywhere and usually write them too, with browser support. However these are minimal to the point of ugliness and I'm not the kind of person that carries a USB key in my pocket. Seems like a useful thing to have on hand, but I have some sort of psychological aversion to it because I'm deadly afraid of breaking it in half. $400 phone? No problem. $30 USB stick? Oh no! What if I break it!? Of course, you can apparently use these single-file wikis from your Android phone (i.e. using <a href="http://mgsimon.de/android/andtidwiki">AndTidWiki</a>), which is definitely cool considering you don't need to have any connectivity and you're much more likely to be carrying your phone than having your laptop out, but then to actually read on a different screen (or use a real keyboard to edit it) you have to be carrying your USB cable or use another transfer method at which point you're back to hand synchronization. Having the cable when you want to edit probably isn't too bad -- it is part of your charger after all -- and small notes like addresses and phone numbers can be input easily enough on a phone keyboard.</p>
<p>The pocket wikis might be great if you've got a companion USB key on you all the time, or you're cool using it on your phone 100% of the time. Offline access is definitely a bonus and you don't get more cross-platform than HTML/Javascript these days. I was close to using this solution, but I'm hardly ever without internet (thankfully) and it's also very theoretically dangerous to be walking about with all of your important / confidential information on an easy to lose device. Add the minor annoyance of having to make major edits to the wiki with the phone plugged into a desktop and I wasn't sold.</p>
<p>At this point, I'm basically down to using a web server with a real, honest to $DEITY wiki. That lets me use it from my phone or an arbitrary computer with a browser. There are a ton of real wikis out there. Wikipedia's servers run Mediawiki which is entirely open source, but then again I'm not exactly going to be serving 100,000 articles to millions of users with this thing so that seemed like overkill. Enter MoinMoin.</p>
<h2 id="moinmoin">MoinMoin</h2>
<p><a href="http://moinmo.in">MoinMoin</a> is essentially the perfect solution. It's a very well known and widely used piece of software. It's written in Python so if I ever needed to screw with it, I could. As I mentioned before it's a <em>real</em> wiki with all that that entails (stuff like templating, history, a real interface for editing, markup, etc.) but as the true coup de grace to the other solutions, it has a self-contained "Desktop Edition" which means that it's got a low-performance low-resource built-in webserver that just works, pre-configured for localhost:8080. That's <em>perfect</em> for a wiki that will essentially only have one user.</p>
<p>For added security, I left the Desktop Edition webserver running on localhost:8080 and use my favorite encryption method - SSH port forwarding - to forward the port to any machine that I'm using. Even my phone with ConnectBot, or to the spectre of an unknown Windows machine with PuTTY.</p>
<p>Digital? Check. Searchable? Check. Accessible anywhere? Check. We have a winner.</p>
<p>I've been using MoinMoin for about two weeks now and I've put everything in it. Passcodes, bug links, TODOs for work and home, lists of helpful resources, server lists, even detailed instructions for doing PowerPC netboots from an internal server. I feel better already.</p>
<p>For anyone interested in doing the same thing, MoinMoin includes <a href="http://moinmo.in/DesktopEdition">instructions</a> for a basic self-contained install. You can even keep it upgraded just by untarring over your current directory structure and restarting the web server script.</p>
The Dungeons of Dredmor2011-07-17T08:02:16+00:002011-07-17T08:02:16+00:00Unknownhttps://blog.codezen.org/posts/the-dungeons-of-dredmor/<p>I grabbed "Dungeons of Dredmor" today on Steam. Gaslamp Games, the publisher, is promising Linux binaries, but I really wanted to crack into it, so I spent the $4.50 on it and fired it up in Wine.</p>
<p>Let me say, for less than the price of a latte at Starbucks, it's a whole lot of fun. It definitely calls forth the memories of Nethack and all of its other rogue-like brethren. It also is a bit reminiscent of Diablo (a similarity given a nod with the Horadric Lutefisk Cube), but in true rogue like fashion, it's less about story and more about trying to squeeze the most out of a character before you die.</p>
<p>Yes. Permadeath. I was pleased to see that it's on by default - although even having an option is further evidence that it's walking the fine line between Nethack and Diablo 2 (which implemented permadeath as optional "hardcore mode" after beating the game once through). As always it's both a blessing and a curse. Blessing because it makes you feel the fear of real death, a feature lacking in many modern games where a death means hitting F9 and restarting from where you were two minutes previously. Permadeath adds to the tension which is why it's the hallmark of a rogue-like. It's a curse because, obviously, it can mean that you just spent 5 hours and have nothing to show for it except another run at your high score.</p>
<p>My top score is about 12k. It's not impressive, but after maybe 10 characters I'm finally getting the hang of it. Unfortunately there is no manual, so it seems that, aside from a very basic tutorial that covers the barest essentials (and will be old hat for rogue veterans), you're basically on your own to figure out what everything means.</p>
<p>There's a good selection of (34!) base skills, each with a linear progression between three and eight feats/skills/spells you can add beyond the initial one granted just by choosing the base skill. You get one point per level. Now, a linear tree in a game like Dragon Age was very disappointing (and indeed I was kinda disappointed with Dragon Age from a mechanics point of view), but this is a perfect optimization for a rogue like with permadeath. A broad set of base skills with shallow skill trees following just means you don't spend much time playing an identical character if you die a couple of times. Each base skill gets you started off right so you can tell the difference in play style immediately. Very important when you may be starting over dozens of times.</p>
<p>A fresh character can choose 7 base skills to build upon. 7 skills is plenty to make sure your character is broad enough to survive the game. There's also a good mix between wizard, rogue, warrior and crafting skills so there's plenty there for characters of all stripes. As an added bonus, they added a "last choice" option (in case your previous build didn't get as far as you thought it should have) and a "random" option which I'm sure will be the basis for a lot of fun for gamers seeking a new challenge. Unfortunately, the only way to view the skills in a tree is to start a character and look at the sKills (sic) menu. On one hand this encourages experimentation but on the other hand I'd like to know what I'm getting into. What does "Necronomiconomics" mean? Or "Viking Wizardry"? You have no clue until you start a character.</p>
<p>Aside from skills, you have a huge amount of character attributes. These aren't your normal D&D traits either. Your primary attributes are "Burliness", "Sagacity", "Nimbleness", "Caddishness", "Savvy", and "Stubborness". In addition there are many other stats, like magic resistance, chance to block, resistances, etc. It's a nice level of complexity. Your character also has your typical "slots" : melee weapon, ranged weapon, torso, head, feet, shield, a couple of magic rings and a necklace all of which can be filled with all manner of magical and cursed trinkets.</p>
<p>Battle is pretty straightforward turn based. Lots of different damage types. Plenty offensive and defensive skills to use. It's possible to block, dodge and counter as well as other skill specific extras automatically employed in combat (like blackjack). Some monsters seem to be immune to some skills. I haven't gotten far enough to see if there are any real nasties (like physical immunes or ranged casters), but I haven't been disappointed so far. The set of templates seems a bit small, but again I've only gotten to level 2 so I can't judge.</p>
<p>Crafting is also neat and sufficiently complex. If you choose a crafting skill, you usually start with some device to activate and a set of basic, though useful, recipes. As you go through the game you can expand your repertoire by finding bookcases which teach you new ones. It's especially useful for keeping a ranged character equipped with ammunition or a mage stocked with <del>booze</del> mana (yes they are equivalent). Turning ingots into 9 bolts can be very helpful when luck hasn't provided you with enough. Traps are also craftable, but since the dungeons are absolutely rife with the things, I've found that they're more useful to just pick up and reuse (that is, if you have the skill to do that).</p>
<p>Honestly, the menus and interface are the weakest part of the game. Icons in general are all too small. It's very difficult to tell the difference between different wands / bolts / food items in your belt. The inventory management had the right idea (set # of squares like Diablo, each item takes one square and some are stackable) and even a much-needed "sort" function that I quickly became a fan of, but it's a bit too clicky for me. For example, as far as I can tell, there's no way to just "pick-up" an item... you need to pick it up and place it in your inventory. It doesn't matter if you've got enough space you have to click move click to get it done <strong>Correction:</strong> <em>Commenter eselyoutee notes that you can shift + click to automatically place it in your inventory. I also discovered you can just drag to your person.</em>.</p>
<p>Attributes, and stats (and other things like damage types and resistances) are symbolized by very small and incomprehensible icons. I'm starting to get the down pat, but when you're comparing two different swords and it's not obvious what their attributes are because it just shows "-weird icon- 2" or something, it's a pain to try and decipher.</p>
<p>As mentioned, crafting is a well-done mechanic but the interface is kludgy too. For some crafting it's simple. Take some "native gold", put it in the ingot press, smelt, and there you are: two ingots of gold. But for some recipes that you actually have to look up, it's a pain to look at the recipe, select it (at which point the game puts its red outline in the crafting slots) and then try and figure out what goes in there. The killer thing here is that the recipe interface knows if you've got the ingredients so why on earth doesn't it just take them out of your inventory and get them ready for you to hit 'smelt' or whatever verb it is? I don't have eidetic memory, friends. <strong>Correction:</strong> <em>I've also discovered the "autofill" button under the boxes that blends in with the decor a bit. I still don't get why it wouldn't just automatically do that and return them to the inventory if you close without activating, but nonetheless it makes crafting easier.</em>.</p>
<p>Likewise the whole belt / active spell thing is harder to use than it needs to be. Like Diablo before it you have a left and a right click attack. Unlike Diablo it seems that the left click is always your melee attack, and your right click has to function as your ranged and all of your spells/skills. That in itself isn't so bad (you're going to want a melee attack no matter what kind of character you are), but in order to, for example, switch to your ranged attack instead of a skill, you have to either go into your inventory or hit SHIFT + # for your belt. I can't say how many times I've been trying to use the hotkeys and gotten that reversed. Trying to switch to a skill and thinking I needed shift at which point I do something stupid like eat a piece of fruit and proceed to take a round of beatings from the enemies standing around me. In my opinion Diablo did this perfectly. Have some inventory you can quick switch to, but allow a set of keys (like number keys, or F keys) be assigned to any item / skill for either left or right click. That way I can setup the hotkeys any way that my brain wants to. I can make F1, F2, and F3 my favorite bolts / wands and then F5 and F6 my primary skills, etc. (I particularly like the F keys because on most keyboard they have built in groupings). The whole shift thing doesn't work for my brain.</p>
<p>Of course, all of this interface griping is minimized if for no other reason than Dredmor is a turn-based game (again, in true rogue-like fashion). I can take the time to dick around in the inventory box and drag ingredients hither and yon because I have an infinite amount of time before anything else is going to happen to me. Even in battle, making a quick selection is unnecessary because (if I'm still alive) I could take ten minutes to make my next move. That said, it breaks the flow of the game, and making a mistake taking your turn will lead to (one of) your deaths.</p>
<p>Interface griping notwithstanding, there's a lot of fun material in Dredmor. I haven't gotten very far into it, but there are myriad items, a bunch of damage types, a massive number of different spell effects (both negative and positive), tons of skills, and a whole lot of crafts. The game is a very light-hearted romp from its items and skills to its art direction and monster utterances. Combine that depth and irreverence with randomly generated dungeons and you've got quite a time sink on your hands.</p>
<p>All in all, I'm looking forward to playing it more and I'm hoping that some of the interface improvements can be made in subsequent patches. And c'mon... at $5 even those that aren't pre-established rogue-like fans are practically guaranteed to get their money's worth and more.</p>
Android + Mediatomb + UPnPlay = Music Anywhere2011-06-30T04:31:02+00:002011-06-30T04:31:02+00:00Unknownhttps://blog.codezen.org/posts/android-mediatomb-upnplay-music-anywhere/<p><strong>To be clear, this post is about hitting a UPnP (streaming media) server securely from outside of the LAN. If you just want LAN access, all you need is MediaTomb and UPnPlay. No special config.</strong></p>
<p><strong>In addition, as some Redditors pointed out, you can use Subsonic for an easier open source solution. I already had MediaTomb and I wanted to use it. In addition, this solution should work with all other UPnP devices (which Subsonic / Google Music don't run on) and for video streaming (with vPlayer, or another app UPnPlay can talk to) as well.</strong></p>
<p><strong>NO ROOT REQUIRED</strong></p>
<p>[toc]</p>
<h2 id="introduction">Introduction</h2>
<p>So Juliette and I ditched our respective cellphones (hers the aging dumbphone LG Lotus, mine the hard fighting but obsolete HTC Hero) with EVO3Ds, or 3VOs as the internet has nicknamed them. The phones are really cool, but I also noted that HTC advertised them as DLNA capable. This support <strong>isn't required</strong> for these steps, they should work anywhere that UPnPlay works (Android 1.6+ AFAICT), but it was the inspiration for the idea.</p>
<p>DLNA is a collection of companies agreeing on standards, and UPnP (Universal Plug 'n Play) is their set of standards for device cooperation. A lot of devices have come out in the past couple of years that interoperate. Very cool, although my first tangle with UPnP was with my PS3 a couple of years ago and it was very frustrating because the PS3 is a mis-mash of bad formats and pointless restrictions. Fortunately, though, that meant that when I started to experiment with the UPnP capabilities of the 3VO, I had a good starting knowledge. It still took me a bit of time to figure out how to be as remote as I wanted to be though. MediaTomb and the HTC Sense music player work pretty well together over WiFi but the Sense player has some drawbacks.</p>
<ul>
<li><strong>Can't play Oggs</strong>. This was a major WTF. I couldn't figure out why it wasn't listing my music. One of the reasons I bought Android (among many) was that it had better support for open formats, particularly Ogg Vorbis, which is shown to have better quality at lower bitrates (very important when streaming) and, even better, it's a totally free and unencumbered format. For an interim, in the house solution I settled on MP3 which the Sense player picked up immediately.</li>
<li><strong>No built-in WAN support</strong>. This is typical of a lot of players, and the HTC player (along with a lot of them in the Market) won't even let you try to hit a remote server unless you're on a WiFi connection. That's all well and good, but sucks if you're planning on streaming while driving or any other place outside of your home.</li>
</ul>
<p>Given those disappointments, I tried a lot of approaches to solve the problem. One approach that was suggested in various forums was to setup a VPN, which would allow the Sense player to think it's on your home network and make things like UPnP server discovery work out of the box. That's a huge pain in the ass to setup, especially if you're security minded, and most importantly it <strong>didn't work</strong>. I'm not a networking expert so it's possible that my VPN setup was screwed up (although my Android was able to connect), but it was hard enough in the end that I didn't want to maintain the solution anyway. Another solution I thought of would just be to run an NFS server, or another remote filesystem but those require root, which 3VOs don't currently have despite a promise from HTC to unlock soon.</p>
<p>So, without further ado, the <strong>rootless</strong> way to stream your media anywhere securely.</p>
<blockquote>
<p><strong>NOTE:</strong> Non-Linux users can get a bit of strategy from this post, but not very many details. There are Windows UPnP servers that will work insecurely in this manner, just not MediaTomb, and there are some Windows SSH servers, but I don't know anything about them. Unless you think you're confident enough to translate the instructions, turn back now.</p>
</blockquote>
<h2 id="mediatomb">MediaTomb</h2>
<p>The first thing you have to do is setup a server to serve your content UPnP style. My favorite piece of software for this is <a href="http://mediatomb.cc">MediaTomb</a>. It's free, it's open source, and I already had familiarity with it getting the aforementioned PS3 to work with it. It also has a lot of neat transcoding options, which were invaluable for the PS3, but fortunately aren't necessary for streaming Oggs and MP3s this way. If you're serving FLACs (which are pretty high bitrate for streaming over 3G/4G) or another exotic format that your phone won't play then I refer you to the <a href="http://mediatomb.cc/dokuwiki/transcoding:transcoding">MediaTomb wiki article on transcoding</a> and suggest that you judiciously use Google.</p>
<h3 id="installation">Installation</h3>
<p>Most modern Linux distros have a mediatomb package. Throughout this post I'll assume Arch Linux, but the translation between pacman and apt-get or yum should be pretty straightforward. From the terminal:</p>
<p><code>$ sudo pacman -S mediatomb</code></p>
<h3 id="configuration">Configuration</h3>
<p>I chose to run MediaTomb as my user because it's better practice than having root daemons opening ports, even if they're secure. Just running mediatomb from the command line will make it generate the default user config <code>(~/.mediatomb/config.xml)</code> along with an empty database file. The output of the daemon is quite useful and the default config is basically going to be right for our purposes. There are just two suggested tweaks to modify the default config:</p>
<h4 id="port-and-interface">Port and Interface</h4>
<p>You're going to need to specify a port, because Mediatomb will use one randomly if you don't. That's usually not a problem because generally these servers are "discovered" by the streaming device, but in our case (usage from WAN) we have to do the discovery step for the application and you don't want the port to change. In addition, you want to be serving this content to your external network device, in my case (and most cases for wired connections) <code>eth0</code>. I added the following to my config <code>(~/.mediatomb/config.xml)</code>:</p>
<pre style="background-color:#2b303b;color:#c0c5ce;"><code><span><?xml ...>
</span><span> <config ...>
</span><span> <server>**<port>49153</port>
</span><span> <interface>eth0</interface>**
</span><span>...
</span></code></pre>
<p>That's pretty much it for the <code>config.xml</code>. If you're shy of opening an editor or messing with XML, both of these settings can be changed with command line switches when you start the server as well. You'd just use the <code>-e <interface></code> and <code>-p <port></code> options on invoking in the next step. Being familiar with the XML config is only really necessary for more advanced options, like transcoding.</p>
<h3 id="starting-the-server">Starting the server</h3>
<p>Starting the server is as easy as invoking MediaTomb from a terminal:</p>
<pre style="background-color:#2b303b;color:#c0c5ce;"><code><span>$ mediatomb
</span><span>
</span></code></pre>
<p>It will output some useful information. In particular you want to see:</p>
<pre style="background-color:#2b303b;color:#c0c5ce;"><code><span>INFO: Configuration check succeeded.
</span><span>INFO: Initialized port: 49153
</span><span>INFO: Server bound to: [interface IP]
</span><span>INFO: MediaTomb Web UI can be reached by following this link:
</span><span>INFO: http://[interface IP]:49153/
</span><span>
</span></code></pre>
<p>Where interface IP is most likely your LAN IP. Mine is <code>192.168.1.25</code> for example.</p>
<h3 id="adding-media">Adding media</h3>
<p>Now for the most important (and fortunately easiest) part: getting MediaTomb to serve up some content. MediaTomb has a nice and simple web interface that runs on the same port as the server. As it says in the above output you can hit the interface with the link <code>http://[interface IP]:49153</code>. Just paste that into the address bar of your favorite (Javascript capable, sorry lynx) browser and you should be greeted with a screen like this:</p>
<p><a href="/mediatomb2-e1309299281572.png"><img src="/mediatomb2-e1309299281572-300x72.png" alt="Example MediaTomb interface" /></a>Example MediaTomb interface</p>
<p>I won't break down the details very much (this post is only tangentially about MediaTomb), but you initially go to the Filesystem section (the one I'm on in the screenshot), browse to your media using the lefthand tree, select the root directory you want to serve up (in my case <code>music-ogg</code>) and then you hit the add button (looks like a plus in the upper right corner), and optionally tell MediaTomb to watch it (show autosync options with the plus with the circle of arrows around it). After setting that up, you can see the files that are being served in the Database section. The Database section is occasionally useful as it can give you details about how MediaTomb is using a file. In particular it's MIME-type which is how UPnP clients figure out which files they can play.</p>
<p>I setup mine such that it recursively monitors my music directory with inotify, which means I can drop files into the directory and they'll automatically be served. This is probably the best way, unless you want to be more selective about what you're serving up.</p>
<p>It may take a bit to add your whole directory to the database, but the server is actually operational as it adds the directory, so don't let that deter you from continuing.</p>
<h2 id="ssh">SSH</h2>
<p>The next step is all about security when you connect to MediaTomb. You should install an OpenSSH server. Most likely your install already has it, but it might not be running. If it doesn't have it, then you should install it and start it:</p>
<pre style="background-color:#2b303b;color:#c0c5ce;"><code><span>$ sudo pacman -S openssh
</span><span>$ sudo /etc/rc.d/sshd start
</span><span>
</span></code></pre>
<p>If you're running pretty much any distro other than Arch, you'd install <code>openssh</code> or <code>openssh-server</code> and use another <code>/etc/init.d/</code> script instead. Look for <code>sshd</code> or <code>openssh-server</code>. Check your distro's wiki or Google if you need help starting the SSH daemon.</p>
<p>By default, the SSH server runs on port 22.</p>
<p>We'll connect to MediaTomb via SSH later in the post.</p>
<h3 id="keepalive">KeepAlive</h3>
<p>There is one foible with SSH that should be ironed out now too. We're going to setup a long term connection to the server over SSH, but a lot of routers and hardware will terminate a connection if it's idle for too long. That's not a problem if you're going to be streaming over the connection the whole time, but what if you stop and start again? The answer is KeepAlive which, as the name implies, keeps the connection alive by sending empty traffic every so often to inform hardware that the connection is still necessary.</p>
<p><strong>UPDATE</strong>: I believe I got this wrong on the initial posting. In order to enforce this from the server side, instead of the client side (which is what <code>~/.ssh/config</code> affects), you need to add the following to <code>/etc/ssh/sshd\_config</code></p>
<pre style="background-color:#2b303b;color:#c0c5ce;"><code><span>ClientAliveInterval 60
</span><span>ClientAliveCountMax 3
</span><span>
</span></code></pre>
<p>This will send the client some traffic every minute to keep the connection alive, and will timeout the connection on the server side after 3 packets have been lost, for a total of 3 minutes of the client not responding (i.e. not returning the packets which is different than just sitting idle).</p>
<h2 id="external-connection-setup">External Connection Setup</h2>
<p>If you're already familiar with opening ports on your router and addressing your LAN from outside the house, just forward your SSH port to the right machine and skip this part.</p>
<p>The first is that you're going to need a way to address your home computers. I use <a href="http://dyndns.org">DynDNS</a> for a free dynamic hostname, and <a href="http://ddclient.sf.net">ddclient</a> to keep the dynamic hostname up to date automatically.</p>
<p>You also need to setup your router to automatically forward traffic it receives on the SSH port (22 unless you changed it) to your server. Look for options in your router config like "Applications and Gaming" (which is a stupid name for it, but that was it on my Linksys) or, more simply, "Port Forwarding". Setup TCP forwarding to your machine running MediaTomb and SSH. This is made much easier if you either have your computer setup for a static LAN IP, or configure the router to hand out a consistent IP with DHCP to the server's MAC Address so that the port forwards are always to the right machine.</p>
<p>This is pretty standard fare for home servers, but if this isn't enough to figure out what you need to do, DynDNS has a little <a href="http://www.dyndns.com/support/kb/dyndns.html">walkthrough</a> that should help get you setup. They point you to portforward.com which will try to sell you some BS tool to do it automagically, but once you skip their advertisements they actually have decent information on a lot of router models. For all of these steps the only thing you should need is a browser, so don't despair at the IE screenshots =).</p>
<h2 id="upnplay">UPnPlay</h2>
<p>I searched for a long time for an app that supported WAN connections to MediaTomb and <a href="http://bebopfreak.wordpress.com/upnplayer/">UPnPlay</a> is the only option that I've found. It's interface is a bit clunky, but it's functional. You can grab it by searching for UPnPlay in the market or using this QR code via Appbrain:</p>
<p><a href="/upnplay-qr.png"><img src="/upnplay-qr.png" alt="UPnPlay QR Code" /></a>UPnPlay QR Code</p>
<h3 id="test-mediatomb-over-lan">Test MediaTomb over LAN</h3>
<p><strong>This is optional, but getting UPnPlay to detect over LAN will make the WAN configuration much easier</strong></p>
<p>The first thing you should do when you get UPnPlay installed is test that your MediaTomb setup works via LAN. Get on to your WiFi, fire up UPnPlay and it should automatically detect MediaTomb. Under it, you should be able to access your media in various forms, either by file path or by a number of pre-defined groups (like Audio > Album, etc.). If UPnPlay doesn't recognize MediaTomb, you're in trouble, I would suggest checking the <code>mediatomb</code> output, or running <code>mediatomb --debug</code> and seeing if the server even recognizes that it's being connected to. If not, then your first step is to figure that out.</p>
<p>If you have to debug this step, I suggest quitting (hit back on the library list and it will confirm quit) and restarting UPnPlay each time you test a change. Supposedly you can refresh the devices from the menu, but I've had no luck with it.</p>
<h4 id="directories-but-no-media">Directories, but no media</h4>
<p>If you can browse your directories, but none of the directories have any files, then UPnPlay most likely isn't recognizing the media format. As I mentioned above, MediaTomb has a lot of nice transcoding options that I won't cover here, but they can be used to present any sort of weird file as one that your phone can play, and transcode that file on the fly when requested. Just to test everything else is working I'd suggest getting some vanilla MP3s/Oggs and adding them to MediaTomb. Those should show up without any special settings.</p>
<h3 id="setting-up-a-wan-server">Setting up a WAN server</h3>
<p>If everything above was hunky dory and you can access all of your media over WiFi, excellent. At this point, we're going to prepare a WAN server definition for UPnPlay that won't be used immediately but will make your life easier in a couple of steps.</p>
<p>First, enable WAN server:</p>
<pre style="background-color:#2b303b;color:#c0c5ce;"><code><span>Menu > Settings > Media Sources > WAN Server
</span><span>
</span></code></pre>
<p>Then, while UPnPlay has your MediaTomb server detected, long press the MediaTomb item in the library list and select "<strong>Clone WAN Server</strong>" You needn't make any changes except changing the first box after "Host" to "localhost" or "127.0.0.1" instead of the IP that's there. Hit OK and we'll save that for later. Go ahead and quit UPnPlay too (hit back on the main screen, it will prompt you to quit).</p>
<h2 id="secure-connection-via-ssh-with-connectbot">Secure Connection via SSH with ConnectBot</h2>
<p>At this point, you should have a functional MediaTomb installation and UPnPlay working (over WiFi for now). Now we're going to <strong>turn off WiFi</strong> and use Android's excellent SSH client, <a href="http://code.google.com/p/connectbot/">ConnectBot</a> to securely connect to the server. First things first, install ConnectBot by searching for it on the Market or using the following QR code:</p>
<p><a href="/connectbot-qr.png"><img src="/connectbot-qr.png" alt="ConnectBot QR code" /></a>ConnectBot QR code</p>
<p>Using ConnectBot you should be able to access your server, <strong>with WiFi off</strong> using the dynamic hostname or IP you setup above. From the initial screen, 'ssh' should be selected in the combobox and you specify <code>user@external-hostname</code> for the connection. When you input that it should attempt to connect, prompt you for your user's password, and drop you in a shell. You don't need to do anything with the shell.</p>
<p>If you're unable to connect, most likely your hostname/IP is wrong (or not setup), or the port forward from your router to your server is messed up.</p>
<h3 id="setup-a-port-forward">Setup a Port Forward</h3>
<p>Here's the cool part. We're going to forward the server's MediaTomb traffic (port 49153 in my example) directly to your phone. The traffic will be encrypted well, and obviously you have to authenticate to get it setup so it's <strong>much</strong> more secure than just letting MediaTomb accept anybody's connection. Not to mention that leaving MediaTomb unencrypted and accessible to all is most likely illegal, depending on your country's view of file sharing.</p>
<p>To do this, while you're looking at your home server's shell, hit:</p>
<pre style="background-color:#2b303b;color:#c0c5ce;"><code><span>Menu > Port Forwards
</span><span>
</span></code></pre>
<p>And then, to add one:</p>
<pre style="background-color:#2b303b;color:#c0c5ce;"><code><span>Menu > Add Port Forward
</span><span>
</span></code></pre>
<p>The nickname doesn't matter. The type of port forward is "<strong>Local</strong>" (i.e. on the phone), and the source port should be <strong>49153</strong>. The destination is a bit trickier. It needs to be how the <strong>server</strong> would refer to the port if you were logged into it. Basically you want to set it to "[Server's LAN IP]:49153", where that IP should correspond with the IP in the MediaTomb output when you invoked it. In my case the value is "192.168.1.25:49153". If you've got your /etc/hosts setup correctly it could also be "hostname:49153".</p>
<p>Once you have the port forward setup, from your phone's browser you should be able to access the MediaTomb media screen without WiFi by going to <code>http://localhost:49153</code>. That translates to "this device (localhost, the phone) port 49153" and will work if the forward is active. <strong>NOTE:</strong> Make sure you include the "http://"! If you just put "localhost:49153" the browser will interpret this as a Google search!</p>
<h2 id="finally-upnplay-wan">Finally, UPnPlay WAN</h2>
<p>To double check, at this point you should be able to:</p>
<ul>
<li>Use UPnPlay over the LAN</li>
<li>Setup an SSH port forward to your server, with no WiFi</li>
<li>See the MediaTomb web interface by going to "http://localhost:49153" (with the http part!)</li>
</ul>
<p>If you can do all of those things, you've basically got it! Now you just need to fire up UPnPlay when you're not on the WiFi. In the library list you won't see your MediaTomb server. If you did the clone step above, you'll see "MediaTomb (WAN)". Hit that, it should connect, and cause a "MediaTomb" item to appear. Then you just access your music through that normal "MediaTomb" item. Golden!</p>
<h3 id="if-you-didn-t-couldn-t-clone">If you didn't / couldn't clone</h3>
<p>If you're trying to setup the WAN server option, but for some reason you're away from the LAN and couldn't do the clone step above, then you can manually add the WAN server.</p>
<p>First enable the WAN Server (this was covered in the clone step too):</p>
<pre style="background-color:#2b303b;color:#c0c5ce;"><code><span>Menu > Settings > Media Source > WAN Server
</span><span>
</span></code></pre>
<p>And then, from the library list (the initial screen):</p>
<pre style="background-color:#2b303b;color:#c0c5ce;"><code><span>Menu > WAN Server
</span><span>
</span></code></pre>
<p>Then fill out the fields:</p>
<pre style="background-color:#2b303b;color:#c0c5ce;"><code><span>**Name** Should be the same as the LAN server (MediaTomb by default)
</span><span>**Host** localhost : 49153
</span><span>**Description** /description.xml
</span><span>**UDN** uuid:XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
</span><span>
</span></code></pre>
<p>Description is a path to the XML description of the server, so that's the same for all MediaTomb servers. The UDN is the real pain in the ass and why cloning is so much more convenient. You can find the value for your server in the MediaTomb <code>config.xml</code> where it's <strong>everything</strong> between the UDB tags <strong>including</strong> the uuid: part.</p>
<h3 id="upnplay-troubleshooting">UPnPlay Troubleshooting</h3>
<p>UPnPlay is a bit finicky. As I mentioned before, the interface is clunky but functional. Here are some tips:</p>
<ul>
<li><strong>UPnPlay seems to be unaware of network changes.</strong> If your connection changes (i.e. WiFi to 3G, 4G to 3G etc.), quit UPnPlay (hit back until it prompts to quit) and restart. Device refresh seems a bit odd and I spent a bit of time trying to connect over 3G only to realize that when I hit "MediaTomb" is was still trying to hit the LAN version. Tangentially, having the WAN server variant just spawn something that looks just just the LAN variant which you actually use is very confusing.</li>
<li><strong>If you can see your media files remotely you're all set.</strong> Starting a song may take a bit to actually get traction (i.e. it fails to play the first five seconds a couple of times), but be patient. After the first song plays though I usually don't have trouble moving on to the next track. Also, I haven't tested the "Near Gapless Playback" option, but this might help between tracks.</li>
<li><strong>If you do lose connection without switching networks</strong>, check to make sure that your ConnectBot session is still active. If it's closed, the port forward obviously won't work.</li>
</ul>
<h2 id="concluding-notes">Concluding Notes</h2>
<p>I didn't cover automatically starting these up on boot. Currently, I start SSH with Arch's <code>/etc/rc.conf</code>. Then, from <code>/etc/rc.local</code> I use <code>sudo jack -c mediatomb</code> to run the MediaTomb server as my user. <code>rc.local</code> is universal, as far as I know, but for starting daemons check your distro's wiki.</p>
<p>I've tested this a bit around Austin. I haven't had much luck (in general on Sprint) with 4G, but 3G seems to work consistently and stream Ogg files without taking too much of my upload bandwidth or stuttering. I've also tested it connecting from foreign WiFi and UPnPlay seems smart enough to use the WAN definition even if you're hooked to WiFi (thankfully).</p>
<p>Clearly this is going to be highly contingent on your bandwidth on the server. If you're in a low bandwidth situation, you can try transcoding into a lower quality stream but you might be better off with buying a bigger SD card =).</p>
<p>I haven't attempted to get cover art to work. I also haven't attempted videos, although UPnP (and UPnPlayer with some third-party video apps) supports it. I can't see a reason it wouldn't work however. I can say that streaming remotely, the Amazon cover art lookup doesn't seem to work. I don't have a problem with this as I'm more concerned with bandwidth and performance, but don't expect it to work out of the box.</p>
<p>Lastly, Bebopfreak, UPnPlay's developer, will not take support requests on this feature. I, on the other hand, would be happy to attempt to give pointers in the comments and update this little walkthrough with any finer points.</p>
<p>Good luck!</p>
Nerd Do Well: I met Simon Pegg2011-06-16T19:00:32+00:002011-06-16T19:00:32+00:00Unknownhttps://blog.codezen.org/posts/nerd-do-well-i-met-simon-pegg/<p>I managed to catch Simon at his Bookpeople (local Austin independent bookstore) signing his humorous biography "Nerd Do Well" last night. I was completely starstruck. If you don't count kernel hackers, I've never met anyone honestly famous before. I tried not to be too embarrassing, but he seemed cool. I also finally got a chance to actually crack into the book while standing in line and I can at least say it's a promising start.</p>
<p>Here's another obligatory picture I got snapped ( crappy phone camera strikes again - looking forward to grabbing the EVO 3D on the 24th). Maybe someday I'll post a scan the signature. Clearly I was a blur of excitement. n't bother enlarging =(.</p>
<p><a href="/IMG_20110615_201121.jpg"><img src="/IMG_20110615_201121-300x225.jpg" alt="Simon Pegg signs my copy of Nerd Do Well." title="Simon Pegg signs my copy of Nerd Do Well." /></a></p>
Das Keyboard: Awesome2011-06-14T20:55:30+00:002011-06-14T20:55:30+00:00Unknownhttps://blog.codezen.org/posts/das-keyboard-awesome/<p>From the last post you'd probably guess that I'd been playing through videogames and have completely exited the world of software, but it's not true. I've been hard at work, on (unfortunately) real work. The day job. I can't lie that it's pretty satisfying, but it does absorb my time. Especially when I get owned for having bad test methodology and miss a deadline. Whoops.</p>
<p>Anyway, I'm not here to talk about anything so mundane as work. I'm here to say that I made a mistake. Eight or nine months ago, I built my dream desktop. I went all out. Dual 24"s, kickass processor, top of the line graphics, a decent amount of RAM. However, in my salivation sessions on Newegg, I totally forgot two key elements... the human interface. Mouse and keyboard. So, despite spending a small fortune on hardware, I ended up running to Fry's and grabbing a shitty $10 keyboard and a Microsoft mouse. The mouse ended up being fine (at least for as much as I use a mouse - not much), and I can credit Microsoft with making decent hardware. The keyboard, on the other hand, was a total piece of shit. I guess I shouldn't expect any different for that price, but in its defense, I did manage to get this far with it and my previous self didn't really think twice about something as trivial as a keyboard. Hell, I damn near went to Goodwill and picked up a used one for 99 cents.</p>
<p>Big mistake. Not only are the keys on the $10 monstrosity annoyingly flimsy and flat, but also it has the ACPI control buttons directly over the arrow keys. Possibly the worst design ever. Using arrows to scroll a webpage or something, make a bit of a mistake hitting the 'up' key and suddenly your computer is shutting down. What the fuck. Of course, I was able to disable that functionality in Linux (and honestly, I was sort of surprised it worked out of the box in the first place), but nonetheless. Scarlett's now using it as a toy, I didn't even hoard the thing like I usually do with keyboards.</p>
<p>I was complaining about it once and my friend Scott turned me on to the world of elite keyboards. I admit, I was skeptical. The shitty keyboard was bad, but I also didn't really want to spend a hundred bucks on a keyboard, and I honestly don't care about wireless bullshit or LED screens (although OLED keys would be cool, those boards also cost more than my whole desktop). Mechanical keys meant something to me though, I've had a number of Model Ms all in various states of repair over my college career, but they're loud and bulky and the only functional one I have has to be connected with serial -> PS2 -> USB which is just ridiculous. Anyway, talking with Scott and reading about Cherry mechanical keys and all of this stuff, he finally pointed me to <a href="http://www.daskeyboard.com/">Das Keyboard</a>, a spiritual successor to the Model M, with mechanical keys and a no-BS approach. No wireless. No LED screen (although it has lights for the typical stuff, like Caps Lock) just a solid, no-frills keyboard, with comfortable keys. It's even made by a local Austin company too, which is pretty sweet.</p>
<p>It was still hard to pull the trigger though, the $10 thing was serving its purpose, it wasn't really getting in the way now that I had learned to avoid those damn ACPI keys. I did tell my wife about it though and despite the fact that I don't think I'd ever spend three figures on a keyboard for myself, today I answered the door and the UPS who handed me a number of packages. One of which was a keyboard shaped box from Metadot. It arrived two days early (probably because their shipping department is basically down the street). Now here I sit, typing on a Model S Professional Silent keyboard. This thing rocks. I can't even really identify what it is about it, I mean consciously I know it's the mechanical keys, but the whole thing just feels... right. It feels solid. I feel like I'll be typing on this bad boy 30 years from now. Juliette even got the Tux keys to replace the Windows keys, very thoughtful and definitely puts the final touches on it.</p>
<p>It was a Father's Day gift that arrived early and I happened to notice, but I'll be damned if I'm going to do the rest of my week of work on the old keyboard when I know that this masterpiece is in the house =). Here's a shot of it on my desk, taken with my crappy phone camera and then conveniently uploaded through its built-in USB 2.0 hub.</p>
<p><a href="/IMG_20110614_135835.jpg"><img src="/IMG_20110614_135835-1024x768.jpg" alt="Obligatory keyboard shot" title="Obligatory keyboard shot" /></a></p>
Entering the 21st Century2011-04-25T22:01:52+00:002011-04-25T22:01:52+00:00Unknownhttps://blog.codezen.org/posts/entering-the-21st-century/<p>I decided, after all of the hype and excitement and the collective Redditgasm over Portal 2, I would break down, install Steam, and play the original (in Wine, of course). Obviously, I decided to pick up the Orange Box because you can't really beat $20 for a bunch of "new" games. I think that now that I'm officially 4 years behind the curve of PC games, I'll keep a $20 limit.</p>
<p>Back in 2004, when I bought HL2, I had an account under my usual pseudonym but I couldn't remember the password, the client was unable to recover my information (despite having the recovery code and the secret question answer) so I decided to become: jack_codezen. Fortunately, the Orange Box already includes the only game I had purchased so no big deal, although I was hoping that I'd be able to recover without taking 3-5 days with Steam support. From what I hear about Steam thesedays, I guess I might've gotten a discount for buying a bundle that includes a game I already owned, but I guess that's a penalty I'm willing to pay for my impatience and forgetfulness.</p>
<p>Anyway, I'm really looking forward to playing HL2 again, and all of it's episodic content for the first time. It'll be nice especially now that I have a machine that should absolutely <em>destroy</em> the requirements even with the extra Wine overhead. I'm especially looking forward to Portal. I'm not sure what to think about TF2. We'll see.</p>
GNOME 3.0 Final Verdict2011-04-19T18:54:31+00:002011-04-19T18:54:31+00:00Unknownhttps://blog.codezen.org/posts/gnome-3-0-final-verdict/<p>After GNOME 3.0 was released, I gave in and decided to take the plunge. I packed up my <code>.xinitrc</code> and <code>.xmonad/</code> and decided to give it a fair shake. I used it for about a week of real work, as well as the usual recreational activities (surfing, coding, wine).</p>
<h2 id="the-good">The Good</h2>
<p>Overall I was impressed at how effective I became with GNOME 3.0, although it's a far cry from Xmonad (as I've mentioned in the past, but I'll try not to get into tiling evangelism here). I'm not as keyboard-centric as I'd like to be, so already I have my hands on the mouse more than necessary. Getting back into the drag and drop paradigm wasn't hard. I will admit I used the drag-to-side half vertical tile functionality built into mutter a <em>lot</em> and, for the most part, I was content with it. Vertical tiles are by far the most common layout I use, and even though it was restricted to a 50/50 split (and sometimes I like a 70/30), it was nice.</p>
<p>The gnome-shell bar took a little getting used to (it's hard not looking at the top right corner for a time), but the status icons contained in it were very sleek and their menu options were very useful. These little icons were one of my favorite changes in 3.0. Particularly on my laptop where the network manager icon is very useful.</p>
<p>As I've mentioned before, I love the keyboard friendly additions. Like the built-in run dialog with completion, and the ability to type two letters of a program name from the activities view and see it pop up in the icons. I like that even more than I like my Xmonad dmenu, which is saying something. I haven't figured out whether you can easily address the "favorites" on the left hand sidebar, but the new use case is very nice. Also, I was able to make the transition a bit easier from Xmonad by binding some keys from the keyboard controls (like Alt+F2 to open a terminal, Alt+F3 to open the run dialog, Alt+1,2,3 to switch desktops). These worked well, although I would have liked the ability to Alt+Shift+1 to send a window to a desktop.</p>
<p>Everything with my usual work went fine (with some caveats in the next section), surfing was no problem. Multimedia worked just fine, sound with pulseaudio was no issue (although I've been using pulse for awhile even outside of GNOME). I was pleased that running things like smplayer fullscreen on my TV was handled just fine and didn't interfere with working on the other monitor. I guess problems with using 3D and video at the same time have been worked out long ago, but I was concerned with the new desktop. My only qualm with that was that when someone switched to the activity view on the main screen, the full screen movie was shrunken a bit and enumerated like all the others (so it's hard to use the main desktop without jarring the people watching the movie on the other screen. At least it's consistent though and, because the movie was still playing in the slightly smaller window and with sound this is only a minor nitpick.</p>
<p>My wife actually really likes the new interface. She's running it on her netbook and also on our "family" machine (RAID box), which is where I did the movie testing. GNOME is more her style of usage, being the type that uses a web browser and the media players most often. I was pleased that her little netbook had no trouble with the graphics either (it's by far the lowest spec machine we have, unless you count phones).</p>
<p>Lastly, our Wine Diablo 2 sessions went very well. I found that if we run in a desktop, GNOME properly treats it like any other window, and it smart enough to full screen it on restore and hide its window bar. I attempted to run in unmanaged, full screen mode and it works. The bar was still shown for some reason, but that appears to have been fixed in the interim as I can't reproduce now. The one issue that I had was that running unmanaged, if I accidentally hit the windows key, I had no idea how to get back to the Diablo 2 screen. If I hit windows key again, it would automatically take me back, but if I had focused another window it was a mystery.</p>
<p>All in all, I was happy with what amounts to the initial rough cut of the 3.0 interface. I'm really looking forward to seeing where it goes. I think that if I'm ever able to finish up my current side project, I might start taking a look at contributing some improvements. However, for now, I have some definite WTFs.</p>
<h2 id="the-bad">The Bad</h2>
<h4 id="multiple-monitor-desktops">Multiple Monitor Desktops</h4>
<p>GNOME 3.0 has pretty decent support for taking advantage of more than one screen. As I mentioned above, playing a movie on one and working on the other works fine. The main problem is that, by default, your secondary screen can only have one desktop on it. Now this might be a sane default (i.e. switch tasks on the primary screen, keep static things like IMs / email / multimedia on the second screen), but it's not how I want to use my monitors.</p>
<p>There is a <strong>gconf</strong> setting to allow the desktop to basically span both screens (so switching to desktop 2 changes both monitors) but after I enabled it, support was buggy. Things like closing empathy would cause windows to warp onto my primary desktop for no apparent reason. I guess there's a reason this is hidden in gconf. Although I have no clue why it would still be a gconf key, as I though they were switching to dconf, but I could be wrong.</p>
<p>Anyway, ideally I'd like to see Xmonad style multiple monitor support. I.e. you have one desktop apiece and can change them independently. Xmonad enumerates them all and allows you to show any two, but I'd settle for having a per-screen desktop stack since that seems like it would fit the GNOME 3.0 paradigm.</p>
<h4 id="empathy-integrated-messaging">Empathy / Integrated Messaging</h4>
<p>I'll admit, I was excited about the integrated messaging. It seems so useful and one of my nits about XMonad is that I always have to switch back to my IM windows, or send them to the desktop I'm working on.</p>
<p>This feature is entirely broken on release though. Empathy is just not ready, and neither was the integration. For example, you get a nice notification on a new message (or, configurably, on contacts going online / offline). You can even click that message and respond inline. Cool! But what you can't do is focus another window and keep that inline chat window open. I want to hold a conversation while surfing Reddit with the inline window hovering on my desktop. I like to be able to read the last four or five lines of my conversation, not just see the next response show up for an instant in a notification and decide whether I want to respond.</p>
<p>In addition, the interaction between the integrated bar and the "traditional" empathy chat is absolutely bizarre. For example, if you have a real empathy chat window open (which you almost always will because of the inability to keep the integrated window open), and you receive a new message, you get a notification and a little chat blurb on your notification bar, but no new chat window in the actual empathy window. Some sort of foibling is required to get it to open there, and I'm not quite sure what.</p>
<p>The "traditional" empathy contact list is also underfeatured, like not being able to change the order of contact groups. It also doesn't remember your status setting on return (just setting you to "Available", whereas pidgin will automatically reuse that last status). Finally, because it supports some form of LAN messaging that never seems to connect the contact interface is constantly spinning as if it's loading.</p>
<p>The last thing, and the true deal breaker for me using GNOME 3.0 is that the notification bar fails to show you urgent flashing notifications. I walked out of the room for a moment and missed a message. I had <em>no idea</em> I had missed anything until I randomly displayed the notification bar and say the empathy icon flashing and a two-hour-old message from my boss asking for an email. That doesn't work ladies and gentlemen. I can't take two hours to respond to a message. That's ridiculous. Especially since I was sitting at my computer the whole time. Hell, I've even missed notifications because I was looking at my other screen.</p>
<p>I thought GNOME 3.0 was designed specifically for this workflow. I guess I was wrong.</p>
<h2 id="conclusions">Conclusions</h2>
<p>Nobody argues with the fact that the GNOME 3.0 interface needs work. I was pleased with using it for awhile, but it's sorely in need of improvement with a handful of things. Especially the chat and notification features, which are effectively broken.</p>
<p>The upshot though is that nothing is so wrong with the concept or the execution that these bugs couldn't be fixed very quickly. These are not problems that should require heaps and heaps of code to fix. In fact, I wouldn't be surprised if distros officially packaging GNOME 3 have already addressed and patched some of them.</p>
<p>NOTE: All of the above judgments were made using the current (as of 19 April) Arch GNOME 3.0 packages from gnome-unstable and testing. Particularly the gnome, gnome-extra, and telepathy meta-packages. Arch is great, but I'm assuming these packages are basically packages as-is, with only minimal distro integration patches.</p>
Evince: So close, yet so far.2011-04-08T01:18:33+00:002011-04-08T01:18:33+00:00Unknownhttps://blog.codezen.org/posts/evince-so-close-yet-so-far/<p><strong>EDIT: Suddenly my Evince 3.0.0 (according to Arch 3.0.0-3) has started naming bookmarks with the current / first new section on the page. Kudos to whoever fixed that, although the help still claims there's no such thing as a bookmark =). <em>7 May 2011</em></strong></p>
<p>Let it be known that I'm a bit of a PDF power user. Not because I wanted to be, but because my job suddenly started entailing reading 1000 page specs that are held together with nothing but blinding seas of jargon. Being that they're usually new CPU user manuals and SoC programming references, they're also extremely useful... when you can <em>find</em> the information that you need.</p>
<p>So, it was with open arms that I embraced Evince's new 3.0 feature: bookmarks. It's only been recently that I've started to need this feature, but a quick Google indicates people have been WTFing over Evince not supporting bookmarks since it was created. The F1 help (which as of this writing on Arch Linux still says that bookmarking isn't supported) notes that you can use annotations as bookmarks, but it seems to me that they're fundamentally different things and, even if they weren't, the PDFs I'm reading seem to have hundreds of blank annotations. I'm not sure if that's Evince's fault (not all PDFs have it), if the annotations are real, or if the person generating the PDFs is just using a crappy PDF generator.</p>
<p>After installing Evince 3.0, I decided to give bookmarks a spin. I scrolled to a useful page in one of my specs (a page describing the minutiae of some bits in a hardware table that I've been using recently). Seeing the new "Bookmarks" menu, I simply clicked "Add Bookmark" (Ctrl+D would've sufficed as well). Then, clicking the same menu, I got a bookmark listed: "Page 250". Right clicking it had no abilities, there was no apparent way to edit the bookmark. Gah. "Page 250" is almost worthless as a bookmark, especially since I had like 10-15 other bookmarks I wanted to make. Bookmarks shouldn't force a user to shuffle through them all just to figure out what they are.</p>
<p><img src="/evince-bad-bookmark.png" alt="Bad Bookmark" /></p>
<h3 id="but-wait">But wait!</h3>
<p>But I didn't give up there. The "Bookmarks" menu makes it totally non-obvious, but in the Evince sidepane (hit F9 or View->Sidepane) you can now select a "Bookmarks" selection from the pull down. From <em>that</em> list of bookmarks, you can right click and actually rename / remove your bookmarks.</p>
<p><img src="/evince-menu.png" alt="Menu with real options" /></p>
<p>After renaming, they then show up properly in the "Bookmarks" menu.</p>
<p>For shits I decided to try it out on some other, non-work PDFs from random places on the internet. No dice for the bookmarks. Not that it tells you why it can't create bookmarks, but from the look of it, Evince can only bookmark PDFs that support embedding them. I can't be too disappointed because it doesn't look like FoxIt or Acroread can do it either. Both of them seem to think "bookmarks" are chapter and section headings which is stupid. Nonetheless, I was hoping for a [gd]conf / <code>~/.config/evince</code> solution that would work generically with all PDFs and versions.</p>
<p>So, in the end, the new feature is nice ... after you learn to use the sidepane for it, and only if the PDF you're using happens to support it.</p>
<p>For reference, the failing PDFs were (for some reason) all PDF 1.4, optimized, with no security and the work PDFs were 1.6, optimized, no security. I'm guessing that it comes down to the PDF version, but I could be wrong.</p>
Xmonad backed by GNOME 3.02011-03-30T00:47:59+00:002011-03-30T00:47:59+00:00Unknownhttps://blog.codezen.org/posts/xmonad-backed-by-gnome-3-0/<p>My previous post criticized modern desktop environments (like gnome-shell and KDE 4.6) because they lack anything resembling efficient window management. It's not a surprising view coming from someone that's been spoiled by Xmonad's beautifully easy mouse-free window management and dynamic layouts.</p>
<p>I'm not going to talk about window management today though. I installed a fresh copy of the libraries from Arch's <code>gnome-unstable</code> repository and, instead of giving gnome-shell another whirl (not yet at least), I merely restarted Xmonad with the usual suspects running in the background (<code>gnome-settings-daemon</code>, <code>gnome-keyring-daemon</code>) and continued to use my typical GTK apps.</p>
<p>I have to say that I was pleasantly surprised that the GNOME beta functioned well as a drop-in replacement and, aside from the different theme and widget style everything worked identically. The VNC client still remembered my passwords too, so I interpret that as the keyring being intact. I even like the new default font and anti-aliasing choices. I'm sure some people will complain that it looks muddy (as critics of anti-aliasing almost always do), but to each their own.</p>
<p>Overall I've been pleased with some of the non-shell improvements of GNOME 3. The control center is a good replacement for the system menu of traditional GNOME and on par with Windows and KDE. I probably appreciate it a little more than average considering that I don't have the system menu under Xmonad and it's easier to remember to invoke <code>gnome-control-center</code> than it is to remember which little GNOME subapp to use to tweak some behavior of the GNOME applications.</p>
<p>One thing that surprised me was <code>dconf-editor</code>. I've heard throughout the GNOME 3 bashing blogs, that a lot of the configuration was hidden in dconf-editor and that really sucks because it's basically regedit. That may be true, but GNOME has always essentially had a registry (gconf) and <code>dconf-editor</code> has to be the nicest registry editor I've ever used. Not that it's a passable replacement for a control center option, but as a developer and desktop explorer it's nice to see a full on description of each possible toggle and tweak in the registry.</p>
<p>I understand that this is a very small subset of GNOME that I'm using, but it's nice to know that even if the GNOME desktop's next full release is the Linux desktop apocalypse, everything will still just work.</p>
The Sad State of Mainstream Window Management2011-03-01T19:13:21+00:002011-03-01T19:13:21+00:00Unknownhttps://blog.codezen.org/posts/the-sad-state-of-mainstream-window-management/<p>No doubt you've all been keeping (or have been kept depending on how you read the news) up on the GNOME 3.0 / gnome-shell / Unity stuff that's been going on. In short, the new major version of the typical GNOME desktop, 3.0, has reinvented the way that you interact with your desktop.</p>
<p>Initially I was excited to hear the news because the new release is supposed to be much more keyboard friendly than "classic" GNOME, and I am all about efficiently using the keyboard. That said, I am wary of any sort of broad scale change like this because I haven't been fully convinced this is a good idea. Gnome-shell takes some good ideas, like the concept of per-task workspaces and the aforementioned keyboard friendliness, but it falls short. I've been trying to compose this entry for awhile since I compiled the gnome-shell ecosystem and even tried the <a href="http://gnome3.org">gnome3.org</a> liveCD, but it wasn't until I read <a href="http://paste.pocoo.org/show/346477/">this post</a> about <strong>eliminating minimize/maximize</strong> that it finally struck me. What the mainstream DEs are missing now is decent window management.</p>
<p>I've been an <a href="http://xmonad.org">Xmonad</a> user for years now and that one fact has really kept me away from using GNOME or KDE (in it's vanilla form) for about as long. It's just unwieldy to move windows with the mouse and painstakingly arrange windows to be productive. It's this sort of task that software should make simple. For the uninitiated, Xmonad arranges all windows on a workspace in a dynamic layout. If you have one window, it takes up the whole screen. Two, and it's divided between the two, three and it's divided between the three and so on. The layouts are very advanced, ranging from simple splits to spirals, to circles. Sending windows to another workspace, switching workspaces, switching layouts, all of these can be accomplished with simple keystrokes. I don't know how I'd survive without it anymore, I just have too many active terminals and applications to juggle with a mouse.</p>
<p>To be clear, I'm not advocating that GNOME start using Xmonad (although Xmonad integrates beautifully with GNOME 2.x). Also, I am aware the latest gnome-shell builds support a rudimentary tiling by dragging a window to the left or right edge of the screen, but it's just not enough. KWin (KDE's window manager) recently added basic tiling support as well but its efforts are just as primitive and laughable.</p>
<p>If the GNOME devs want to improve the way we interact with our windows, like gnome-shell purports to do, we need way more control over them both automatically (like dynamic layouts) and with user interaction. Basic concepts like "maximize" and "minimize" cease to make sense when the user has so much more power over how windows are shown by default. Want to work with your windows like a stack of papers (all fullscreen)? There's a layout for that. Want to have a desktop with a browser and a news reader split 70/30? There's a layout for that. Floating desktop for something like GIMP? There's a layout for that. Decide the current layout no longer works for your workflow? Change it and the windows are automatically rearranged. Any conceivable, efficient way to view your windows can be chosen and dynamically used by a window manager. Using layouts makes dragging windows with a mouse feel like stone age technology or a child's puzzle.</p>
<p>Additionally, the technology is entirely backwards compatible. If developers are worried about scaring new users with their layouts (although since gnome-shell is already a radical departure that doesn't make too much sense) then just make the default layout behave like the current default (floating). Meanwhile, the rest of us looking for a better way can benefit. Perhaps best of all for the GNOME community, the people looking for that level of efficiency are also usually developers.</p>
<p>In short, there needs to be a powerful set of keybinds with a powerful set of window actions (send to desktop n, switch to desktop n, change layout, give window layout focus, etc.). If a major DE like GNOME got behind the tiling/dynamic layout paradigm, that would truly be a leap forward. Until then gnome-shell will be, at best, a marginal improvement over 2.x or, at worst, a KDE 4 style debacle. For now, all of us Linux users have to choose between a desktop with A+ integration (like GNOME 2.x -- although in reality it's probably more in the B-/B range) and a desktop that gets out of your way and lets you manage your tasks efficiently.</p>
New Machine2010-09-10T21:16:12+00:002010-09-10T21:16:12+00:00Unknownhttps://blog.codezen.org/posts/new-machine/<p>This is my first post for a topic not intended for a larger audience =). I'm building a new machine. I ordered the parts from Newegg and they should be here on Monday. Although... they are here in TX already (yes, I have the tracking number stats open in my browser right now, did you think I wouldn't?), so I might be making a roadtrip this weekend just to have something to do other than dream about hardware.</p>
<p>Needless to say, I'm looking forward to it. The last computer I built in 2008 was primarily for media (our RAID box), so disk read performance was paramount over any sort of gaming etc. Juliette uses it as a Sims 3 box (via PlayOnLinux), and Scarlett plays her PBS/Disney/Nickelodeon flash games on it, so it works pretty well for that and serving up media to the PS3. But it's an unorganized mess and even Juliette playing the Sims beats the shit out of the video card (a 7300 SE / 7200 GS I picked up for $30 just to be able to attach a monitor to the machine), so I decided to pick up an identical 460 GTX for it as well. I can't tell you how hard I wanted to keep it a secret and SLI my box, but the Sims stop cranking the box and being able to use the HDMI output to the TV might cut the PS3 transcoding step out of watching media if I can figure out sound.</p>
<p>Just for shits though, I decided to lookup the benchmarks. Ouch. According to <a href="http://videocardbenchmark.net">videocardbenchmark.net</a> which is run by "Passmark" who I've never heard of (but also have no reason to doubt their relative numbers) the card that's in there (7300 SE / 7200 GT -- according to lspci) got a <strong>66</strong>, and is ranked <strong>656</strong> of all of the cards they ranked. To put that in context, the Geforce TI 4400 I bought when I was... geez... a sophomore in high school (2002) got a <strong>216</strong> and is ranked <strong>349</strong>. I couldn't believe it. I mean, I knew it was a $30 card and it wasn't going to impress anybody by any stretch of the imagination, but <em>damn</em>, being a <strong>third</strong> as powerful as a card I bought 6 years previously. Goddam. Now, I'm not sure how this benchmark really works, nor do I really care, but the 460 GTXs got <strong>2296</strong> for an overall rank of <strong>7</strong>. And that's vanilla (mine are overclocked) and with an unspecified amount of RAM (either 768M or 1G, mine are 1G).</p>
<p>So, quite a hefty upgrade for the RAID box. Assuming that the benchmark scales linearly (which might be a bad assumption), that means the card I'm putting into it is 35x better than the POS I'm taking out. Hope you enjoy actually being able to play the Sims, honey =).</p>
<p>Anyway, the stats: 3.0Ghz Core i7-950 (Bloomfield), 4GB of Kingston DDR3 1800 RAM, an overclocked Gigabyte GTX 460 video card, a Western Digital 1TB SATA 3Gb/s drive, a USB 3.0 compatible ASUS Sabretooth motherboard, a 750W Corsair PSU and a full size heavy-as-balls Antec case. Topped off with dual ASUS 24" 1920x1080 widescreen LCDs.</p>