Persona by Genevieve Valentine

Disappointing.

Starts out well, action pumping and character backstories fleshed out just enough to make you care, but not enough to stop the flow of the story.

But the world around them never congeals for me, and the atmosphere of threat and double-cross the story needs can’t happen without it.

Three things I learned about writing:

  • Switching perspective characters early on is a great opportunity to give more context to what’s happening, since it’s another angle on the world
  • In a modern setting, you really can cut descriptions down to the bone, to put the focus on dialog and action
  • Can do character backstory in a single chapter, covering years of someone’s life, with breaks in-between

My Life as a White Trash Zombie by Diana Rowland

Fantastic. Absolutely nails the smugness and insincerity of the South, along with the surprise of finding help in unexpected places. Protagonist is a perfect mix of insecurity and snark.

Thank the gods it’s a series; can’t wait to read the next one.

Three things I learned about writing:

  • Narrating a character’s internal debate in long-form is fine, so long as it’s in the right place: when the character is away from other people. Don’t do it during dialog.
  • You don’t need dialect to write Southern characters. Getting their facial expressions and hypocrisy right is enough.
  • Finding a real-life struggle that mirrors the fantasy one is a good way to ground it.

Magic for Beginners by Kelly Link

Exasperating. With the exception of The Faery Handbag, none of the supposed stories in this collection actually contain a story at all. Some of them contain multiple stories, nested and incomplete, but most are just character and setting with a complete lack of anything happening. Ever. For page after page.

Possibly the worst short story collection I’ve ever read.

Three things it taught me about writing:

  • Story is supreme. Choose your words well, but make telling a good story your first priority.
  • Deliver on your promises to the reader. If you promise zombies, give them some damn zombies.
  • If your story can be summed up in a single sentence, maybe it doesn’t need to be an entire novel.

The Historian by Elizabeth Kostova

Masterful. Incredibly well-crafted series of nested narratives that simultaneously did a deep dive into Dracula lore and sucked me into a single family’s generations-long saga. Just…wow. So well done.

Three things I learned about writing:

  • You can use flashbacks to cover over narrative time that would otherwise be boring, like train (or plane) travel
  • To make an old myth feel fresh, look for the side that’s not usually given a starring role (like the Turkish side of the Dracula legend), and explore it.
  • Journals and letters are a great way to both nest stories, and keep each story personal, told by the person that lived it

The Shambling Guide to New York City by Mur Lafferty

It’s got an elderly kick-ass demon-assassin, zombies that can think, and a death goddess working at a small press. For that, I can forgive the continuity errors and the occasional odd plot point.

Three things I learned about writing:

  • Watch out for the vague “some”: “something made her”, “something told her”, “some sort of sense”…it gets overused too easily.
  • Where you start your story affects how sympathetic your protagonist seems. Start it when they’re under stress, and readers automatically feel for them. Start it with them relaxed but complaining about how rough they’ve got it, and readers might not be as charmed.
  • Vivid, brief descriptions and snappy dialog can pull a reader through the roughest parts of your story.

Strangely Beautiful, Vol 1 by Leanna Renee Hieber

Gothic” in the overwrought, melodramatic sense.

There’s some fantastic ideas in here, but it was tough one for me to finish.

Three things I learned about writing:

  • People falling love notice everything about their beloved. If writing from the POV of a character falling in love, their thoughts will dwell on even insignificant details about their beloved.
  • Constant repetition of unexplained magical elements makes them annoying and boring. Conserve the magic, to make it interesting.
  • Use a deep dive into a character’s thoughts during conversation sparingly. Dialog should speed the story along, interrupting the flow with paragraphs of thought undercuts momentum and frustrates readers.

Seven More Languages in Seven Weeks: Julia

Julia feels…rough.

There are parts I absolutely love, like the strong typing, the baked-in matrix operations, and the support for multi-type dispatch.

Then there’s the pieces that seem incomplete. Like the documentation, which is very extensive, but proved useless when trying to find out the proper way to build dictionaries in the latest version. Or the package system, which will install things right into a running repl (cool!) but does it without getting your permission for all its dependencies (boo).

All in all, I’d like to build something more extensive in Julia. Preferably something ML-related, that I might normally build in Python.

Day One

  • can install with brew
  • book written for 0.3, newest version is 0.5
  • has a repl built in 🙂
  • typeof for types
  • “” for strings, ” only for single-chars
  • // when you want to divide and leave it divided (no float, keep the fraction)
  • has symbols
  • arrays are typed, but can contain more than one type (will switch from char to any, for example)
  • commas are required for lists, arrays, etc (boo)
  • tuples: fixed sized bags of values, typed according to what they hold
  • arrays carry around their dimensionality (will be important for matrix-type ops later on)
  • has dictionaries as well
  • hmm: typeof({:foo => 5}) -> vector syntax is discontinued
  • Dicts have to be explicitly built now: Dict(:foo => 5) is the equivalent
  • XOR operator with $
  • bits to see the binary of a value
  • can assign to multiple variables at once with commas (like python)
  • trying to access an undefined key in a dict throws an error
  • in can check membership of arrays or iterators, but not dictionaries
  • but: can check for key and value in dict using in + pair of key, value: in(:a => 1, explicit)
  • book’s syntax of using tuple for the search is incorrect
  • julia docs are really…not helpful :/
  • book’s syntax for set construction is also wrong
  • nothing in the online docs to correct it
  • (of course, nothing in the online docs to correct my Dict construction syntax, either)
  • can construct Set with: Set([1, 2, 3])
  • arrays are typed (Any for multiple types)
  • array indexes start at 1, not 0 (!) [follows math here]
  • array slices include the ending index
  • can mutate index by assigning to existing index, but assigning to non-existing index doesn’t append to the array, throws error
  • array notation is row, column
  • * will do matrix multiplication (means # of rows of first has to match # of columns of second)
  • regular element-wise multiplication needs .*
  • need a transpose? just add ‘
  • very much like linear algebra; baked-in
  • dictionaries are typed, will throw error if you try to add key/value to them that doesn’t match the types it was created with
  • BUT: can merge a dict with a dict with different types, creates a new dict with Any to hold the differing types (keys or values)

Day Two

  • if..elseif…end
  • if check has to be a boolean; won’t coerce strings, non-boolean values to booleans (nice)
  • reference vars inside of strings with $ prefix: println(“$a”)
  • has user-defined types
  • can add type constraints to user-defined type fields
  • automatically gets constructor fn with the same name as the type and arguments, one per field
  • subtype only one level
  • abstract types are just ways to group other types
  • no more super(), use supertype() -> suggested by compiler error message, which is nice
  • functions return value of last expression
  • … to get a collection of args
  • +(1, 2) -> yields 3, operators can be used as prefix functions
  • … will expand collection into arguments for a function
  • will dispatch function calls based on the types of all the arguments
  • type on pg 208: int() doesn’t exist, it’s Int()
  • WARNING: Base.ASCIIString is deprecated, use String instead.
  • no need to extend protocols or objects, classes, etc to add new functions for dispatching on core types: can just define the new functions, wherever you like, julia will dispatch appropriately
  • avoids problem with clojure defmulti’s, where you have to bring in the parent lib all the time
  • julia has erlang-like processes and message-passing to handle concurrency
  • WARNING: remotecall(id::Integer,f::Function,args…) is deprecated, use remotecall(f,id::Integer,args…) instead.
  • (remotecall arg order has changed)
  • randbool -> NOPE, try rand(Bool)
  • looks like there’s some overhead in using processes for the first time; pflip_coins times are double the non-parallel version at first, then are reliably twice as fast
  • julia founders answered the interview questions as one voice, with no distinction between them
  • whole section in the julia manual for parallel computing

Day Three

  • macros are based off of lisp’s (!)
  • quote with :
  • names fn no longer exists (for the Expr type, just fine for the Module type)
  • use fieldnames instead
  • unquote -> $
  • invoke macro with @ followed by the args
  • Pkg.add() will fetch directly into a running repl
  • hmm…installs homebrew without checking if it’s on your system already, or if you have it somewhere else
  • also doesn’t *ask* if it’s ok to install homebrew
  • not cool, julia, not cool
  • even then, not all dependencies installed at the time…still needed QuartzIO to display an image
  • view not defined
  • ImageView.view -> deprecated
  • imgshow does nothing
  • docs don’t help
  • hmm…restarting repl seems to have fixed it…window is hidden behind others
  • img no longer has data attribute, is just the pixels now
  • rounding errors means pixels != pixels2
  • ifloor -> floor(Int64, val) now
  • works!

I Am Providence by Nick Mamatas

Disturbing. Most of the characters are completely unlikable, especially the men: the worst are outright misogynists and racists, even the best act like superior assholes to everyone else.

Mamatas doesn’t pull any punches in exposing the sexism and harassment that happens at fan conventions. It makes for tough reading, both because the female protagonist is constantly experiencing it and because the male narrator, whose death she’s investigating, is one of the superior assholes it’s hard to sympathize with.

Worth reading, though, if nothing else than as a “Do I act like this?” check.

Three things it taught me about writing:

  • – Can get away with very skimpy descriptions — or none at all — if you choose the proper perspective to tell the story from (in this case, a corpse’s).
  • Protagonist’s motivation for pursuing the mystery can be thin, if the reader’s interest is piqued enough for them to want to see it solved
  • Characters will always rationalize their behavior. Even when dead.

Emperor of the Eight Islands by Lian Hearn

Beautiful. Simple, tight prose, telling a deeply moving story.

Can’t wait to read the next one.

Three things I learned about writing:

  • What a society condemns is just as important to making it feel lived-in as what it praises.
  • Characters don’t always have to be imposing their will on the world. They can show their inner character by the opportunities they take advantage of, as well.
  • In a world of bad choices and flawed people, heroes can be cruel and cowardly, and villains can show mercy.

On the Eyeball Floor and Other Stories by Tina Connolly

A strong collection of stories. Connolly moves from near-future sci-fi to alternate world fantasy to present-day witches, populating each story with strong, unique characters.

Will definitely be picking up her novel, Seriously Wicked, which takes place in the same world as one my favorite stories from this collection.

Three things it taught me about writing:

  • The thinner the story, the shorter the work should be. Don’t make the reader wade through lots of background or context just to get to the heart of events.
  • Writing in the present-day relieves you of a lot of world-building duties, lets you focus on creating great characters.
  • Even stories told via journal entries (or texts, or emails) can have a proper buildup to a climax.