Ron Toland
About Canada Writing Updates Recently Read Photos Also on Micro.blog
  • 1913: In Search of the World Before the Great War by Charles Emmerson

    Wonderfully written re-discovery of the world of 1913 via a tour of its major cities. Manages to give a feel for each without dwelling too long on any one city.

    Ends on a haunting note, with the assurances and questions of 1913 obliterated by the war of 1914. 1913 comes to seem an extension of the 19th century, rather than the beginning of the 20th, a different world that had a different future, once. Final chapter quotes a German intellectual returning home after the war to see everything preserved as if 1913 had been frozen in time: the British books, the Persian cigars from French friends, the Russian plays, all transformed, all changed now that the internationalism of 1913 had been dismantled by four years of war.

    Three of the many things I learned about the state of the world in 1913:

    • The Ottoman Empire was still in the midst of the reforms and changes brought about by the Young Turks and the new parliamentary government they had brought back
    • Woodrow Wilson originally ran on a platform of domestic reform, and hoped that his presidency would leave him free from foreign policy crises so he could focus on it.
    • Non-European Algerians were french subjects, not citizens. They could become citizens only by renouncing Islam and applying for citizenship
    → 2:00 PM, May 4
  • Encouraging News

    First reader review of the novel draft is in! And it’s generally positive!

    True, it’s from a good friend of mine, who’s definitely biased. And yes, he had a list of suggested edits for me, from grammar mistakes to confusing descriptions to scenes that dragged on too long (all of which he’s right about). But overall he liked it, and he wants to read more.

    Maybe it’s not as bad as I feared, after all.

    Or perhaps it is, and he’s seeing past the mistakes to how good the novel could be, if edited into shape.

    Either way, it’s encouraging for me to hear. If I can entertain one person with the first draft, I can entertain more with the second, and even more with the third. It’ll take work to get there, but this kind of validation, however biased it may be, makes me feel like it’ll be worth it.

    → 2:16 PM, May 1
  • Clojure/West 2015: Notes from Day Three

    Everything Will Flow

    • Zach Tellman, Factual
    • queues: didn't deal with directly in clojure until core.async
    • queues are everywhere: even software threads have queues for their execution, and correspond to hardware threads that have their own buffers (queues)
    • queueing theory: a lot of math, ignore most
    • performance modeling and design of computer systems: queueing theory in action
    • closed systems: when produce something, must wait for consumer to deal with it before we can produce something else
      • ex: repl, web browser
    • open systems: requests come in without regard for how fast the consumer is using them
      • adding consumers makes the open systems we build more robust
    • but: because we're often adding producers and consumers, our systems may respond well for a good while, but then suddenly fall over (can keep up better for longer, but when gets unstable, does so rapidly)
    • lesson: unbounded queues are fundamentally broken
    • three responses to too much incoming data:
      • drop: valid if new data overrides old data, or if don't care
      • reject: often the only choice for an application
      • pause (backpressure): often the only choice for a closed system, or sub-system (can't be sure that dropping or rejecting would be the right choice for the system as a whole)
      • this is why core.async has the puts buffer in front of their normal channel buffer
    • in fact, queues don't need buffer, so much as they need the puts and takes buffers; which is the default channel you get from core.async

    Clojure At Scale

    • Anthony Moocar, Walmart Labs
    • redis and cassandra plus clojure
    • 20 services, 70 lein projects, 50K lines of code
    • prefer component over global state
    → 2:00 PM, Apr 29
  • Clojure/West 2015: Notes from Day Two

    Data Science in Clojure

    • Soren Macbeth; yieldbot
    • yieldbot: similar to how adwords works, but not google and not on search results
    • 1 billion pageviews per week: lots of data
    • end up using almost all of the big data tools out there
    • EXCEPT HADOOP: no more hadoop for them
    • lots of machine learning
    • always used clojure, never had or used anything else
    • why clojure?
      • most of the large distributed processing systems run on the jvm
      • repl great for data exploration
      • no delta between prototyping and production code
    • cascalog: was great, enabled them to write hadoop code without hating it the whole time, but still grew to hate hadoop (running hadoop) over time
    • december: finally got rid of last hadoop job, now life is great
    • replaced with: storm
    • marceline: clojure dsl (open-source) on top of the trident java library
    • writing trident in clojure much better than using the java examples
    • flambo: clojure dsl on top of spark's java api
      • renamed, expanded version of climate corp's clj-spark

    Pattern Matching in Clojure

    • Sean Johnson; path.com
    • runs remote engineering team at Path
    • history of pattern matching
      • SNOBOL: 60s and 70s, pattern matching around strings
      • Prolog: 1972; unification at its core
      • lots of functional and pattern matching work in the 70s and 80s
      • 87: Erlang -> from prolog to telecoms; functional
      • 90s: standard ml, haskell...
      • clojure?
    • prolog: unification does spooky things
      • bound match unbound
      • unbound match bound
      • unbound match unbound
    • clojurific ways: core.logic, miniKanren, Learn Prolog Now
    • erlang: one way pattern matching: bound match unbound, unbound match bound
    • what about us? macros!
    • pattern matching all around us
      • destructuring is a mini pattern matching language
      • multimethods dispatch based on pattern matching
      • case: simple pattern matching macro
    • but: we have macros, we can use them to create the language that we want
    • core.match
    • dennis' library defun: macros all the way down: a macro that wraps the core.match macro
      • pattern matching macro for defining functions just like erlang
      • (defun say-hi (["Dennis"] "Hi Dennis!") ([:catty] "Morning, Catty!"))
      • can also use the :guard syntax from core.match in defining your functions' pattern matching
      • not in clojurescript yet...
    • but: how well does this work in practice?
      • falkland CMS, SEACAT -> incidental use
      • POSThere.io -> deliberate use (the sweet spot)
      • clj-json-ld, filter-map -> maximal use
    • does it hurt? ever?
    • limitations
      • guards only accept one argument, workaround with tuples
    • best practices
      • use to eliminate conditionals at the top of a function
      • use to eliminate nested conditionals
      • handle multiple function inputs (think map that might have different keys in it?)
      • recursive function pattern: one def for the start, one def for the work, one def for the finish
        • used all over erlang
        • not as explicit in idiomatic clojure
    → 2:00 PM, Apr 28
  • Clojure/West 2015: Notes from Day One

    Life of a Clojure Expression

    • John Hume, duelinmarkers.com (DRW trading)
    • a quick tour of clojure internals
    • giving the talk in org mode (!)
    • disclaimers: no expert, internals can change, excerpts have been mangled for readability
    • most code will be java, not clojure
    • (defn m [v] {:foo "bar" :baz v})
    • minor differences: calculated key, constant values, more than 8 key/value pairs
    • MapReader called from static array of IFns used to track macros; triggered by '{' character
    • PersistentArrayMap used for less than 8 objects in map
    • eval treats forms wrapped in (do..) as a special case
    • if form is non-def bit of code, eval will wrap it in a 0-arity function and invoke it
    • eval's macroexpand will turn our form into (def m (fn [v] {:foo "bar :baz v}))
    • checks for duplicate keys twice: once on read, once on analyze, since forms for keys might have been evaluated into duplicates
    • java class emitted at the end with name of our fn tacked on, like: class a_map$m
    • intelli-j will report a lot of unused methods in the java compiler code, but what's happening is the methods are getting invoked, but at load time via some asm method strings
    • no supported api for creating small maps with compile-time constant keys; array-map is slow and does a lot of work it doesn't need to do

    Clojure Parallelism: Beyond Futures

    • Leon Barrett, the climate corporation
    • climate corp: model weather and plants, give advice to farmers
    • wrote Claypoole, a parallelism library
    • map/reduce to compute average: might use future to shove computation of the average divisor (inverse of # of items) off at the beginning, then do the map work, then deref the future at the end
    • future -> future-call: sends fn-wrapped body to an Agent/soloExecutor
    • concurrency vs parallelism: concurrency means things could be re-ordered arbitrarily, parallelism means multiple things happen at once
    • thread pool: recycle a set number of threads to avoid constantly incurring the overhead of creating a new thread
    • agent thread pool: used for agents and futures; program will not exit while threads are there; lifetime of 60 sec
    • future limitations
      • tasks too small for the overhead
      • exceptions get wrapped in ExecutionException, so your try/catches won't work normally anymore
    • pmap: just a parallel map; lazy; runs N-cpu + 3 tasks in futures
      • generates threads as needed; could have problems if you're creating multiple pmaps at once
      • slow task can stall it, since it waits for the first task in the sequence to complete for each trip through
      • also wraps exceptions just like future
    • laziness and parallelism: don't mix
    • core.async
      • channels and coroutines
      • reads like go
      • fixed-size thread pool
      • handy when you've got a lot of callbacks in your code
      • mostly for concurrency, not parallelism
      • can use pipeline for some parallelism; it's like a pmap across a channel
      • exceptions can kill coroutines
    • claypoole
      • pmap that uses a fixed-size thread pool
      • with-shutdown! will clean up thread pool when done
      • eager by default
      • output is an eagerly streaming sequence
      • also get pfor (parallel for)
      • lazy versions are available; can be better for chaining (fast pmap into slow pmap would have speed mismatch with eagerness)
      • exceptions are re-thrown properly
      • no chunking worries
      • can have priorities on your tasks
    • reducers
      • uses fork/join pool
      • good for cpu-bound tasks
      • gives you a parallel reduce
    • tesser
      • distributable on hadoop
      • designed to max out cpu
      • gives parallel reduce as well (fold)
    • tools for working with parallelism:
      • promises to block the state of the world and check things
      • yorkit (?) for jvm profiling

    Boot Can Build It

    • Alan Dipert and Micha Niskin, adzerk
    • why a new build tool?
      • build tooling hasn't kept up with the complexity of deploys
      • especially for web applications
      • builds are processes, not specifications
      • most tools: maven, ant, oriented around configuration instead of programming
    • boot
      • many independent parts that do one thing well
      • composition left to the user
      • maven for dependency resolution
      • builds clojure and clojurescript
      • sample boot project has main method (they used java project for demo)
      • uses '--' for piping tasks together (instead of the real |)
      • filesets are generated and passed to a task, then output of task is gathered up and sent to the next task in the chain (like ring middleware)
    • boot has a repl
      • can do most boot tasks from the repl as well
      • can define new build tasks via deftask macro
      • (deftask build ...)
      • (boot (watch) (build))
    • make build script: (build.boot)
      • #!/usr/bin/env boot
      • write in the clojure code defining and using your boot tasks
      • if it's in build.boot, boot will find it on command line for help and automatically write the main fn for you
    • FileSet: immutable snapshot of the current files; passed to task, new one created and returned by that task to be given to the next one; task must call commit! to commit changes to it (a la git)
    • dealing with dependency hell (conflicting dependencies)
      • pods
      • isolated runtimes, with own dependencies
      • some things can't be passed between pods (such as the things clojure runtime creates for itself when it starts up)
      • example: define pod with env that uses clojure 1.5.1 as a dependency, can then run code inside that pod and it'll only see clojure 1.5.1

    One Binder to Rule Them All: Introduction to Trapperkeeper

    • Ruth Linehan and Nathaniel Smith; puppetlabs
    • back-end service engineers at puppetlabs
    • service framework for long-running applications
    • basis for all back-end services at puppetlabs
    • service framework:
      • code generalization
      • component reuse
      • state management
      • lifecycle
      • dependencies
    • why trapperkeeper?
      • influenced by clojure reloaded pattern
      • similar to component and jake
      • puppetlabs ships on-prem software
      • need something for users to configure, may not have any clojure experience
      • needs to be lightweight: don't want to ship jboss everywhere
    • features
      • turn on and off services via config
      • multiple web apps on a single web server
      • unified logging and config
      • simple config
    • existing services that can be used
      • config service: for parsing config files
      • web server service: easily add ring handler
      • nrepl service: for debugging
      • rpc server service: nathaniel wrote
    • demo app: github -> trapperkeeper-demo
    • anatomy of service
      • protocol: specifies the api contract that that service will have
      • can have any number of implementations of the contract
      • can choose between implementations at runtime
    • defservice: like defining a protocol implementation, one big series of defs of fns: (init [this context] (let ...)))
      • handle dependencies in defservice by vector after service name: [[:ConfigService get-in-config] [:MeowService meow]]
      • lifecycle of the service: what happens when initialized, started, stopped
      • don't have to implement every part of the lifecycle
    • config for the service: pulled from file
      • supports .json, .edn, .conf, .ini, .properties, .yaml
      • can specify single file or an entire directory on startup
      • they prefer .conf (HOCON)
      • have to use the config service to get the config values
      • bootstrap.cfg: the config file that controls which services get picked up and loaded into app
      • order is irrelevant: will be decided based on parsing of the dependencies
    • context: way for service to store and access state locally not globally
    • testing
      • should write code as plain clojure
      • pass in context/config as plain maps
      • trapperkeeper provides helper utilities for starting and stopping services via code
      • with-app-with-config macro: offers symbol to bind the app to, plus define config as a map, code will be executed with that app binding and that config
    • there's a lein template for trapperkeeper that stubs out working application with web server + test suite + repl
    • repl utils:
      • start, stop, inspect TK apps from the repl: (go); (stop)
      • don't need to restart whole jvm to see changes: (reset)
      • can print out the context: (:MeowService (context))
    • trapperkeeper-rpc
      • macro for generating RPC versions of existing trapperkeeper protocols
      • supports https
      • defremoteservice
      • with web server on one jvm and core logic on a different one, can scale them independently; can keep web server up even while swapping out or starting/stopping the core logic server
      • future: rpc over ssl websockets (using message-pack in transit for data transmission); metrics, function retrying; load balancing

    Domain-Specific Type Systems

    • Nathan Sorenson, sparkfund
    • you can type-check your dsls
    • libraries are often examples of dsls: not necessarily macros involved, but have opinionated way of working within a domain
    • many examples pulled from "How to Design Programs"
    • domain represented as data, interpreted as information
    • type structure: syntactic means of enforcing abstraction
    • abstraction is a map to help a user navigate a domain
      • audience is important: would give different map to pedestrian than to bus driver
    • can also think of abstraction as specification, as dictating what should be built or how many things should be built to be similar
    • showing inception to programmers is like showing jaws to a shark
    • fable: parent trap over complex analysis
    • moral: types are not data structures
    • static vs dynamic specs
      • static: types; things as they are at compile time; definitions and derivations
      • dynamic: things as they are at runtime; unit tests and integration tests; expressed as falsifiable conjectures
    • types not always about enforcing correctness, so much as describing abstractions
    • simon peyton jones: types are the UML of functional programming
    • valuable habit: think of the types involved when designing functions
    • spec-tacular: more structure for datomic schemas
      • from sparkfund
      • the type system they wanted for datomic
      • open source but not quite ready for public consumption just yet
      • datomic too flexible: attributes can be attached to any entity, relationships can happen between any two entities, no constraints
      • use specs to articulate the constraints
      • (defspec Lease [lesse :is-a Corp] [clauses :is-many String] [status :is-a Status])
      • (defenum Status ...)
      • wrote query language that's aware of the defined types
      • uses bi-directional type checking: github.com/takeoutweight/bidirectional
      • can write sensical error messages: Lease has no field 'lesee'
      • can pull type info from their type checker and feed it into core.typed and let core.typed check use of that data in other code (enforce types)
      • does handle recursive types
      • no polymorphism
    • resources
      • practical foundations for programming languages: robert harper
      • types and programming languages: benjamin c pierce
      • study haskell or ocaml; they've had a lot of time to work through the problems of types and type theory
    • they're using spec-tacular in production now, even using it to generate type docs that are useful for non-technical folks to refer to and discuss; but don't feel the code is at the point where other teams could pull it in and use it easily

    ClojureScript Update

    • David Nolen
    • ambly: cljs compiled for iOS
    • uses bonjour and webdav to target ios devices
    • creator already has app in app store that was written entirely in clojurescript
    • can connect to device and use repl to write directly on it (!)

    Clojure Update

    • Alex Miller
    • clojure 1.7 is at 1.7.0-beta1 -> final release approaching
    • transducers coming
    • define a transducer as a set of operations on a sequence/stream
      • (def xf (comp (filter? odd) (map inc) (take 5)))
    • then apply transducer to different streams
      • (into [] xf (range 1000))
      • (transduce xf + 0 (range 1000))
      • (sequence xf (range 1000))
    • reader conditionals
      • portable code across clj platforms
      • new extension: .cljc
      • use to select out different expressions based on platform (clj vs cljs)
      • #?(:clj (java.util.Date.) :cljs (js/Date.))
      • can fall through the conditionals and emit nothing (not nil, but literally don't emit anything to be read by the reader)
    • performance has also been a big focus
      • reduced class lookups for faster compile times
      • iterator-seq is now chunked
      • multimethod default value dispatch is now cached
    → 2:00 PM, Apr 27
  • Back to the Outline of the Future

    The presentation’s done, the conference is over. I can start turning my attention back to writing.

    But writing what? The book I’m outlining now is near-future science fiction, something that’s usually difficult to pin down. It’ll almost certainly be thought of as a prediction of what’s to come, instead of what it really is: an excuse to indulge some of my programming daydreams without moving too far away from the known and familiar.

    So how do I balance the whimsy I want to put in there and the reality-grounding I know it’ll need? How do I gel a coherent story out of all the ideas bubbling around in my head for such a setting?

    There’s no way to know except to write it, to set something down and then work with it until it reaches the shape I want. So I’m outlining, sketching characters and situations out, building up the scaffolding I’ll need before starting to write in earnest.

    Here we go again.

    → 2:06 PM, Apr 24
  • Rewatching: The Matrix Trilogy

    I was happy to find that the first movie still holds up. I think part of why it works is because it is largely set in a 1999 that is frozen in time. It also helps that the basic structure of the movie is classic: naive youngster is shown a wider world, told of a prophecy where they will save the world, then begins to fulfill that prophecy.

    The relative roles of the other main characters in the story bothered me this time, though, where they didn’t before. Morpheus is still amazing, but step back a bit and he’s one more wise black man guiding a white kid to a greatness that he can’t achieve. Trinity kicks ass, but squint and she’s a kung-fu wielding female who’s only there to fall in love with and support the male hero. For a film set in the future with a nominal theme of breaking down mental boundaries, these elements feel distinctly old and out of place.

    The second and third movies are still complete failures, though. I enjoyed the second movie at the time, and remember hating the third one along with everyone else. But rewatching them showed me how much the two final films are really one film, and it’s not a good one.

    I think a large part of the problem with the last two movies is that they violate the narrative expectations set by the first movie. The trilogy sequence setup in The Matrix was: a nobody becomes special (first film), then learns more about their specialness (second film), then pursues and achieves the mission for which they became special (third film).

    But they skipped the second step, and padded the third step out over two movies. Mistake.

    There’s a whole chunk of story missing, where we’d normally see Neo rescuing people from the Matrix – maybe getting frustrated that he can’t convince more people it’s fake? – and learning about what he can and can’t do. For example, he can’t do the Keymaker’s trick with doors: if we saw other people do it for an entire movie, but didn’t know how they were doing it, the Keymaker reveal would have a lot more punch.

    Skipping that piece of the story prevents us from watching Neo learn and grow, and drops an opportunity to deepen the characterization of the crew of the Nebuchadnezzar along the way.

    Given the current structure – and the large narrative hole in it – the last 2 movies should have been compressed into one. Cut out Zion, the attack on Zion subplot, the scenes with the last stand on the docks, etc. Stick to the thread of Neo and his crew chasing down the Keymaker and getting to the Source, then Neo taking a ship to the Machine City and ending the war.

    Everything else – the machines attacking the docks, the sabotage of the ships by the Smith-infested human – can come to us as reports that Morpheus relays to the crew. This lets us keep the focus on Neo’s story, since we don’t have time to give the other plots and characters their due. Trying to squeeze them in – like the second and third films do – weakens Neo’s plot and doesn’t deliver any emotional heft. There’s simply not enough screen time.

    The best course would have been to make the second bridging movie that’s missing, and then made the trimmed down third movie to wrap it up. Instead, we get one and a half good movies: the original Matrix, and the half a movie buried inside the latter two.

    → 2:00 PM, Apr 20
  • Feeling the Itch

    Not writing is starting to get under my skin.

    The two weeks I was going to take off has turned into a month.

    At first it was so I could catch up on all the house work I’ve been putting off: hardscaping the front yard in response to the drought, cleaning up the back yard, fixing both fences.

    More recently I’ve held off writing because of a talk I’m giving at a conference for work next week. I knew starting on any novel would quickly occupy whatever spare head space I have, and I wanted to keep that free to work on the presentation.

    Both good reasons. But it doesn’t stop me from missing it. When I was working on the novel, I felt like I had a purpose, a mission to fulfill. Without another novel to work on, I feel more relaxed, true, but also a little empty, a little directionless, a little smaller now that I don’t have any characters spouting dialogue into my head.

    I’m trying to be patient, to keep notes on the books I’m debating working on, to stay focused on the other goals I’ve set for myself for this month. But I miss the work, and need to get back to it.

    → 2:05 PM, Apr 17
  • Wednesday Grab Bag: Sad Puppies

    Background:

    terribleminds.com/ramble/20…

    whatever.scalzi.com/2015/04/0…

    grrm.livejournal.com/420090.ht…

    I think if these tactics had been used to ensure that only women got nominated for the Hugos this year, or that only PoC did, the Sad Puppies wouldn’t see that as right or fair.

    I also think that they had – still have, I guess – a chance to act on their feelings of rejection in a positive way, by starting their own convention. No one could fault them if they started a Con that promoted the authors they prefer, nor would anyone be this mad if they’d launched their own awards at that Con.

    → 2:00 PM, Apr 15
  • But who will read it?

    First draft of novel’s done, writing vacation is winding down.

    I’ve got an urge to start editing the novel now, to go back and fix the mistakes I know are there, and find the ones I don’t yet know about.

    But I’m holding off. I’m not ready to treat it objectively yet. While printing it off for my wife to read I read a few pages, and liked it a little too much.

    I need fresh eyes on it, eyes that haven’t seen anything but the words on the page, and so will notice if something’s missing or inconsistent or out of tune. Thus the printing run for my wife, so she can read it while soaking in the tub. And thus my new search for beta readers, for those willing to slog through the mess that is the first draft.

    Wish me luck.

    → 3:00 PM, Apr 10
  • The Rule of Nobody by Philip K Howard

    A short book that’s long on emotional arguments. The author seems to believe that merely repeating the phrase “American government is broken” often enough will substitute for producing evidence that over-specification of rules in law has harmed American business or society.

    Not that I think our laws are perfect, or aren’t in need of simplification (I’m looking at you, tax code). But I don’t need to read 200 pages of someone repeating that phrase to me, and telling me that other countries do it better. I need specific examples and evidence of how a different approach has saved countries time or money or boosted their GDP or – anything, really, to back up the claim that our government is mired in too much red tape to be effective, and the author’s principles-based laws would solve the problem.

    Despite the general lack of facts, I did manage to learn a few things from the book:

    • President Clinton had a line-item veto -- granted by Congress via law -- for two years, until the Supreme Court ruled that it was unconstitutional.
    • Presidents used to be able to hold back money for programs they felt were wasteful or inefficient, till that power was specifically outlawed by Congress.
    • Iraqis who worked for the US Army after the invasion were supposed to be given special visas to immigrate to the US (because of the death threats they received), but the Immigration Service delayed their processing over rules so long that some died after waiting more than a year
    → 2:00 PM, Apr 6
  • The Lexicographer's Dilemma by Jack Lynch

    Very readable history of how the rules of spelling and grammar in English have evolved over time, often despite the efforts of those who attempted to set those rules in stone. Makes a great companion book for Shady Characters.

    Three things I learned:

    • No one cared about English grammar or spelling until the 18th century. I'd always heard that Shakespeare was a bad speller, or a rebellious speller, but that wasn't it at all: no one in his era cared about spelling very much, so however he wrote the words down, so long as their meaning was clear, was fine.
    • At least part of our spelling problems come from using a 23-sound alphabet (the Latin one) to write a 40-phoneme language. The original runic script for writing English had 33 letters, which made it much easier to distinguish the blended th in thing from the separated th of masthead.
    • Many of the differences in spelling between American English and British English (e.g., color vs colour) come from Noah Webster, who, in a spate of linguistic patriotism, wanted to give the new country its own English.
    → 2:00 PM, Mar 30
  • Brain is Out to Lunch

    Decided to take two weeks off of writing. I’m one week in, and it’s only now that those writing muscles are starting to relax.

    First few days I didn’t know what to do with myself. For five months now, all my free time has been given over to the novel. For the last two months, I’ve been spending half of each Saturday and Sunday on it as well.

    So when I woke up on Saturday with nothing to do, I didn’t quite believe it. It’s like when you lost a tooth as a kid, and you kept sticking your tongue in the hole, even though the tooth’s gone and you know it’s gone. My mind kept wanting to remind me to get in there and write, but there was nothing to write, so it was just egging me on for nothing. Had to tell myself each time that I was done, that I’d finished the book, and I’d earned some time off.

    Took me several days of repeating that to finally believe it. And only one day after that for my brain to start churning out ideas for the next book.

    I’m not going to fight it, though. I’m going to gather the ideas as they come, jot them down, while taking at least one more week off. When my vacation’s over, I should have enough to start outlining the next book, and then we’ll start everything all over again.

    I can’t wait.

    → 2:02 PM, Mar 27
  • Passage by Connie Willis

    A frustrating book, in multiple ways.

    Frustrating because it’s good, it’s really good, for about 2/3 of the book. Like her novel Bellweather, Willis really nails the feeling of trying to get something meaningful done while working inside a vast uncaring bureaucracy. By putting me through the minutiae of the main character’s days – including her thoughts on trying to decide what to eat – Willis pulled me into that character’s head, and gave me just as much emotional stake in her research as she had.

    Frustrating, too, because the payoff kept getting pushed out. All that daily minutiae means it takes a few hundred pages before anything really happens in the book, and another few hundred pages before the next event, and so on. The last hundred pages of the second third of the book I couldn’t stop reading, I had to find out what was going to happen. This was partly because of how involved in the character’s life I’d become, but also because it took those hundred pages for something to occur.

    I can’t decide if that technique is completely unfair to the reader – certainly felt unfair to me at the time – or a master stroke of writing something so addicting it kept me reading long past the point of where I’d have dropped something else.

    I did drop it, though. The main storyline basically ends with Part 2. Part 3 is just other characters scrambling to duplicate the main character’s research from Parts 1 & 2, and by that point I’d gotten so frustrated with the pacing that I just skimmed the rest to confirm my suspicions about the plot, and moved on.

    So I’m taking this book as a warning for my own writing. I think my novel has grown to the length it has partly because of how much time I’ve spent in my main characters' heads, writing out their hopes and fears and internal debates. Looking at Passage, it’s a very powerful technique, but its use has to be balanced carefully against the action and dialogue that moves the story forward. Too much of it, and my story will become one long crawl upwards, with few drops or twists and turns to provide some release.

    → 2:00 PM, Mar 23
  • Achievement Unlocked

    The novel’s done! It’s done it’s done it’s done it’s done!

    Wrote the last 8,000 words or so in a white heat. Actually cried and shook at some of the things I was writing, at some of the pain the characters had to go through to get to the end.

    But they made it, and so did I.

    Going to take some time off writing and let my brain decompress…

    Final word count: 139,528

    → 2:00 PM, Mar 20
  • Can't Talk Now; Writing!

    No real blog post today as I focus on the novel.

    Our intrepid protagonists are sharing a last meal together before they go to face the evil that’s been haunting Skallfast, and I can’t just leave them there :)

    I need to see them, and this, through.

    → 2:00 PM, Mar 16
  • Grinding Toward The End

    126,154 words.

    One of the characters surprised me again this week, committing an act I didn’t think they’d get to in this book, and triggering the start of the climax in the bargain.

    For two full days (and 4,000 words) of writing after that point, it was smooth sailing. Words poured out of me, and I felt like I could do it, I could finish, I knew where things were going and every step of the way there.

    That momentum slowed on Monday, died completely on Tuesday, and hasn’t come back yet. I continue to churn out words, and I still know exactly where things are going as it starts the final climb toward the climax, but I feel like I’m pushing the narrative uphill for each step of that climb, word by word.

    I know that I’ll get there. It’s only a matter of time now, of sitting down and writing each days 1,000 words until I reach that point. That doesn’t make the work any easier, or give me any confidence that the final product will be worth reading.

    But I am going to finish, dammit. If it turns out to be crap, well, that’s what the second draft is for, right?

    → 2:15 PM, Mar 13
  • How to Fix Superman Returns

    Having watched Superman and Superman II: The Donner Cut last year, and enjoyed them, my wife and I decided to skip over Superman III and IV and go straight to Superman Returns (which itself ignores the last two movies, and is set five years after Superman II).

    I remember seeing it in 2006, when it came out, and thinking it was a terrible movie. Rewatching it now, I think I missed what Bryan Singer was trying to do: this is a 1970s movie made with 21st-century special effects, an attempt to capture the mood and feel of the first two movies that mostly succeeds.

    I definitely prefer its version of Superman – who, while flying by to rescue someone during the climax, casually uses his heat vision to melt shards of falling glass, keeping them from hurting people on the sidewalk – to Man of Steel’s destructive hobo.

    And in adopting the deliberate pacing of the earlier movies, it gives itself plenty of time to set up the relationships between Lois, Superman, Richard, and their son Jason that might have defined and deepened the sequels that (unfortunately) didn’t get made.

    When Superman discovers he has a son, he’s presented with a unique challenge: he wants to be in his son’s life, and he needs to give his son guidance in the use of his growing powers, but he cannot reveal that he’s the boy’s father without destroying the life that Lois has built for herself while he was gone. That’s a great source of dramatic tension, and I wish we’d gotten to see more of it.

    Much as I like it better this time around, two huge flaws still stood out to me: Lex Luthor’s evil plan, and the movie’s treatment of Kitty Kowalski (Luthor’s female companion).

    Kitty is pulled right from the earlier films, a soft-hearted ditzy blonde that has no place in reality or in a modern movie. In some ways, she’s worse in this one, since the 70s version actually showed up Luthor a time or two, and her conscience led her to betray Luthor and save Superman. This Kitty is all tears and no action, a throwback to a more misogynistic period that should have been either updated or left out.

    And Luthor’s plan – to destroy the Eastern seaboard to make room for his new continent – is simply ridiculous. I understand that Singer wanted to echo Luthor’s real-estate plan from the first movie, but they concocted something that was – frankly – dumb, and unworthy of a supposedly brilliant supervillain.

    Instead, they should have had Luthor build his new islands somewhere in the Pacific, in the tropics, and set them up as new luxury vacation spots. Then the movie could have started after the islands were complete, and about to open for business. We drop in news stories in the background talking about the islands' opening, about Luthor’s reform story, about how world leaders are showing up to get a personal tour of his creation, and possibly license the technology themselves to solve their own land shortages. Then, we get Lois assigned to cover the opening ceremony (against her will), with her family going along for the “vacation” part of the experience.

    Once everyone’s on the island and the ceremonies start, Luthor unveils the evil part of his plan: he holds the world leaders hostage, shows them how destructive his island tech can be, then tells them he’s got seed pods scattered offshore of New York, Hong Kong, St Petersburg, Tokyo, etc. He demands a large payment, lucrative contracts, and sovereignty over all the land that he might create. He threatens to detonate the seed pods if his demands are not met.

    This gives us the same basic setup for the final sequence of the movie – Superman arrives at the islands only to find he’s powerless because they’re Kryptonite, his child can discover his strength by defending his mom against kidnappers, Lois can save Superman, who in return lifts the islands out in to space before Luthor can detonate the seed pods – but now Luthor is threatening worldwide destruction in order to get what he wants, instead of causing destruction in order to get nothing.

    It’s a smarter plan, and it gives us dramatic possibilities the other doesn’t, like Luthor setting off two seed pods at once, both to show the world leaders what they can do and to make Superman choose which one to save. It also helps drive home how long Superman has been gone, if Luthor’s had time to get out of prison, discover the Fortress of Solitude, create the islands, and rehabilitate himself as a purveyor of luxury.

    → 3:00 PM, Mar 9
  • Ooh, shiny!

    The novel’s grown to 118,051 words.

    Where last week felt like plummeting down the tracks in a mining cart, this week has felt like the slow climb upwards that follows. I keep thinking of new projects I could be working on instead of this one, shiny objects to distract me from finishing.

    Just these past few days I’ve thought of two new novels to write and an iOS game to build. I’ve even caught myself starting to write dialogue in the voice of the narrator from a third novel (also as yet unwritten) while daydreaming.

    I have to keep forcing my attention back to the novel I’ve got, the novel that every day gets longer and every day I feel like I have less grasp of.

    Telling myself its okay for the first draft to suck is dangerous now, because my other projects come rushing in, tempting me with their promise of perfection. I know none of them will be perfect in the end, but I want it, I want to write something brilliant and moving that people will remember when I’m gone. I feel like I can see the flaws in my current work all too clearly, and I these distractions are my unconscious way of doubting that it’s worth finishing.

    → 3:05 PM, Mar 6
  • Cubed by Nikil Saval

    Weaves together a history of the architecture, interior design, politics, and sociology of the office, from its rise in the countinghouses of the 19th century to the co-working spaces of the present. Made me want to re-watch Mad Men, this time to appreciate all the historical detail in the architecture and furniture that I missed before.

    Out of the many things I learned from this book, three surprised me the most:

    • Human Resources as a discipline was invented by Lillian Gilbreth, the wife of the couple Cheaper by the Dozen was based on. It's original name was Personnel Management, and it was based on the efficient workplace theories of Frederick Taylor.
    • The Larkin Building in Buffalo, NY, one of the first office buildings designed by Frank Lloyd Wright (in 1904), set all the precedents for Google's offices a hundred years later: rec areas, open floor plans, libraries, and outdoor spaces for employee relaxation.
    • The cubicle farm came out of a 1968 design that was intended by its inventor (Robert Propst) to be a more flexible, individualized, office. In seeking to make something more human than the offices of the past, he inadvertently created the inhuman office of the future.
    → 3:00 PM, Mar 2
  • Hold on to Your Butts

    www.youtube.com/watch

    That’s how I feel, like I’ve turned a corner in one of those old mining carts and found the tracks plunge down into the darkness. At the bottom, the climax is there, waiting for me. I couldn’t stop it happening now even if I tried.

    So I’m holding on as best I can, gripping the sides of the cart as we hurtle down together, my characters and I. I only hope I can type fast enough to capture everything before we hit the bottom, and it’s all over.

    → 5:30 PM, Feb 27
  • You by Austin Grossman

    Another novel that makes staring at a computer screen, thinking, seem more exciting than physical combat. But where Egan took me deep inside the protagonists' heads to generate that excitement, Grossman goes one level deeper, using second-person narration from the perspective of video game characters to take me down past the narrator playing the game and into the game itself. It’s a genius trick, and the fact that Grossman manages the transition between first and second person without jilting me out of the story is impressive.

    To me, it’s an example of second-person done right. It contrasts with novels – such as Charles Stross' Halting State – that start out in second person, creating immediate dissonance between me and the story. I’ve never been able to get past the first few pages of Stross' novel, but devoured Grossman’s in a few days.

    It also made me miss working in video games. Which is strange, considering how much time it spends describing game developers as ill-fed slobs that don’t have lives outside of work. But that feeling of belonging that the narrator talks about, of discovering where he was meant to be after years spent away from gaming, really hit home for me. The narrator’s descriptions of his childhood in the 80s, even though the character is 10 years older than me, still resonated.

    That sense of something important happening when he first sat down in front of a computer, of being on the threshold of the future, didn’t happen to me at the time (I was 6, and not very self-aware), but it could have: I used our Commodore-128 to teach myself how to program, and spent many hours typing in machine language instructions from the back of Compute! magazine in the hopes of being able to play a new game. It didn’t feel like something that was only mine, and not for the adults, but it did feel natural, more so than almost anything else I’ve done, and it still does.

    Despite everything it does right, You’s ending is unsatisfying for me. The climax of the book happens off-screen, and in the final few pages – that I tore through the rest of the book in desperation to reach – don’t resolve anything. Perhaps that makes the ending more realistic, but the lesson for me is twofold: first, show your climax. The reader’s earned it. Second, tie up most of the plot threads you weave into the novel by the end. Leave some of them, sure, but after so much time invested, the reader’s going to want to have some of the tension you’ve built up released. Ideally, showing your climax also releases the tension and resolves multiple conflicts – internal or external – at the same time.

    → 3:00 PM, Feb 23
  • Did Not Know That About Myself

    107,187 words in.

    I’ve heard other writers talk about how issues they didn’t know they had can show up in their writing, unbidden, like notes from an intimate therapy session suddenly posted on a public bulletin board. But I didn’t think that was happening to me until this morning, when I realized that my treatment of two of the male characters in the novel I’m working on echoes a pattern of behavior from my youth, which itself stems from how my father treated me when I was little.

    It shocked me, to think that something I wrote pointed so directly to emotions and expectations that I didn’t know I had. I felt – I feel – very vulnerable now, as if when I finish the novel and hand it over to its first readers, they’ll be able to decode everything about my personality, know all the parts of my self I try to keep hidden in everyday life.

    I don’t think I can stop feeling vulnerable, but I tell myself that being vulnerable is part of the writing, that putting these parts of myself down on the page is what makes the characters come alive, that any book that didn’t have more of me in it than I’m comfortable with probably isn’t worth writing. I could be lying to myself, but I hope it’s true.

    → 3:00 PM, Feb 20
  • Keynes Hayek: The Clash that Defined Modern Economics by Nicholas Wapshott

    A remarkable book. Covers not just the development of Keynes' and Hayek’s positions, but also how they developed in opposition to each other, then moves on to how their followers (both politicians and economists) have continued the argument over the past 70 years.

    I’m not sure how balanced the book is. After reading it, my opinion of Keynes is much higher than it was before, and my opinion of Hayek is lower.

    Hayek’s economic ideas come across as an obscure version of classical economics, neither very original or very influential. Hayek’s politics, the idea that any government intervention in the economy inevitably leads to fascism, has the whole of recorded history against it, with the last 70 years as a comprehensive refutation.

    Keynes, on the other hand, invented the Bretton Woods system, and laid the foundation for the IMF and World Bank. His criticisms of the Paris Treaty that ended World War I led to the US policy of rebuilding Germany and Japan after World War II instead of trying to hold them down. Despite politician’s rhetoric, his economic and political ideas are the dominant ones in Western society, and have been since his death.

    However, this interpretation of mine could be a result of my natural tendency toward Keynesian thinking, and not a result of any bias in the book. After all, followers of classical economics have been looking at exactly the same world as the Keynesians and coming to different conclusions for decades; perhaps from a Hayekian perspective this book proves just how prophetic he was?

    In any case, it did show me the massive gaps in my understanding of the history of both men:

    • Keynes pioneered the now-conservative idea that decreasing taxes is the same as spending money to stimulate the economy. In the US, it was first proposed as policy by Kennedy in 1962 to overcome a mini-recession, and the economic data support Keynes.
    • Keynes invented the discipline of macroeconomics, which is partly to blame for why he and Hayek disagreed so violently: they were really working in different disciplines.
    • Milton Friedman, Hayek's biggest supporter, actually first adopted Keynesian economics, only rejecting them after his study of the causes of the Great Depression in the US. It was Hayek's politics, not his economics, that Friedman and the conservative establishment of the UK and US adopted.
    → 4:00 PM, Feb 16
  • Still Surprising

    You’d think that after 97,867 words I’d have things pretty well plotted out by now, that I’d know everything the characters are going to say and what they’re going to do.

    Far from it. Instead, this far in I find myself knowing what my characters want, and what situations they’re going to have to deal with next. But I don’t know how they’re going to deal with it, or how things will play out, until after it’s written.

    Early on, this terrified me. What if what I write is terrible? What if I contradict myself? What if I set them free and they totally derail my plot and everything ends up in shambles?

    This past week, though, it’s actually helped me relax and just write. How will they get out of this problem? I dunno, let them solve it. How will they convince this character to help them out? No idea, let’s see if they find a way.

    It sounds creepy and weird to say it, like I’ve got multiple personalities crawling around in my brain. But I swear to you, earlier this week one of the characters turned to the other and said the solution to a problem that I’d been wrestling with since November, and it was better than anything I’d come up with. Gave me chills to write it out.

    I hope it keeps happening, all the way to the end. It makes the act of writing a little more like an act of discovery, something akin to an improv performance, with me both on the stage saying lines and standing on the sidelines watching.

    It’s fun, and I don’t know how long this feeling will last, but I’m going to enjoy it while it does.

    → 3:30 PM, Feb 13
← Newer Posts Page 26 of 33 Older Posts →
  • RSS
  • JSON Feed