The Big Idea: Mike Allen

2025-04-23 15:25
[syndicated profile] scalziwhatever_feed

Posted by Athena Scalzi

Music. magic. and undead creatures; The Black Fire Concerto has really got it all. Read on to see how metal music paved the way for author Mike Allen’s newest novel.

MIKE ALLEN:

Whatever could have possessed me to write The Black Fire Concerto, a post-apocalyptic secondary world body horror novel in which a pair of heroines who cast spells through their music face off against hordes of undead monstrosities?

My heroines, warrior-sorceress Olyssa and her teenage apprentice Erzelle, draw inspiration from the likes of Fafhrd and the Gray Mouser, Elric and Moonglum, Roland the Gunslinger and his sidekicks, and more. They are musicians traveling through a world overrun with ghouls. 

Many scenes from the book, if a painter chose to illustrate them, could serve as death metal album covers. (Hint, hint, to any horror-loving artists out there.)

I’m not a musician, but music with a dash of darkness has been central to my life since my middle school explorations of my parents’ collection of symphonies by classical composers. Much of it did little for me — I tend to find soft, gentle music boring and irritating rather than relaxing. But some conveyed power, momentum, menace, like Grieg’s “In the Hall of the Mountain King” from the “Peer Gynt” suite. I especially fell head over heels for Stravinsky’s “The Rite of Spring” — I loved its energy and its rebellious atonality (the very qualities that caused the audience to riot at its 1913 premiere.)

At my mother’s insistence I sang in church choirs until I grew old enough to be allowed to say no. At about the same time I stopped going to choir practice I discovered that —somewhat to my parents’ dismay — the qualities of classical music that energized me could be mainlined in concentrate from heavy metal. The point of no return arrived when I used my dishwashing allowance to purchase Defenders of the Faith by Judas Priest, an album packed with science fiction, fantasy, and horror imagery, paced at an adrenalized frenzy.

Beyond just listening, all those years in choir proved to have a startling side effect: I had the lung power of a lion and could produce ear-shattering screams at will, leading to some delightful years as a garage- (or really, basement-) band singer, and hours and hours spent writing and recording songs with friends who were (and still are) excellent musicians. A special shout out here to my lifelong brothers-in-the-arts Mike Berkeley and John Morris. Our band was called She’s Dead, a phrase lifted from one of the stories in Clive Barker’s Books of Blood.

Now, I’ve been a huge horror fan for decades, but that wasn’t always so. As a child, I wanted nothing to do with horror tales or movies. A third grade reading of Edgar Allan Poe’s “The Tell-Tale Heart” traumatized me for years. 

Yet hanging out with those same musician friends as a teen led to my first horror movies seen in theaters, and the discovery of a lifelong love of over the top, beyond the pale body horror, both humorous and ghastly serious: “Return of the Living Dead,” “Re-Animator,” “Evil Dead,” “Day of the Dead,” “From Beyond,” “Aliens,” “The Fly,” “Hellraiser.”

“Return of the Living Dead,” Dan O’Bannon’s blackly humorous unofficial sequel to “Night of the Living Dead,” deserves special attention. Everyone remembers how those zombies craved brains in their diet. What’s less remembered is that those zombies from 1985 ran fast, and shooting or slicing them did no good. Nothing short of incineration got rid of them. My ghouls, fueled by a magical curse, totally belong to the O’Bannon school.

With all these movies and metal, I’ve surely dated myself as a creature that reached my first creative bloom in the 1980s. I would not have dared to make my heroines classically trained musicians, though, were it not for a surprise return to the world of classical music in mid-2009, when I became the arts columnist for my home city’s newspaper.

In October of that year, I landed a National Endowment for the Arts fellowship that sent me to review world class orchestra performances in New York. I am still no expert on the topic, but I learned enough to describe these performances, and my appreciation for them, with at least a dash of eloquence.

In truth, my duo would not sound much like a metal band if you heard them play. Search the web for videos of harp and pan pipe duets to hear an approximation of their harmonies. The way they fight with musical notes, on the other hand, comes straight from the iconography of heavy metal.

As do undead fiends. (Hello, Eddie from Iron Maiden!)

Both elements have the potential to send the blood racing. I intend The Black Fire Concerto to serve as a double jolt.

A fair question: Is there truly any overlap between the world of classical music and the armies of the dead? I say it depends on the choice of music.

Remember my explorations of my parents’ classical music records? In sixth grade, I drove classmates nuts by constantly humming the “Dies Irae” passage from the fifth movement of Berlioz’ “Symphonie Fantastique.” Entirely unbeknownst to me, that very same year, Stanley Kubrick’s The Shining used a synthesizer version of that same musical segment as its opening theme.

In hindsight, considering the influences which inspired this novel, that sure seems like foreshadowing.


The Black Fire Concerto: Amazon|Barnes & Noble|Bookshop|Powell’s|Kobo

Author socials: Website|Facebook|Instagram|Bluesky|Threads

[syndicated profile] scalziwhatever_feed

Posted by John Scalzi

Any author can tell you that events in their own life can have an impact on their fiction. As we learn in Heather Tracy’s Big Idea for Only a Chapter, sometimes those events have a bigger impact than we might have expected.

HEATHER TRACY:

When I began writing what would become Only a Chapter back in 2015, the working title I had then was “Faceless Man.” I knew I wasn’t going to call the book that, but I couldn’t come up with anything better. I still have several drafts of the original version saved with that name on my computer.

The big idea for the original version of the book came from dreams I had in high school through college of a faceless man who would do huge romantic things like fly me on a private jet to New York City to see Phantom of the Opera on Broadway with the original cast, then he proposed. The dreams were always very vivid, and I could always tell the man was wearing a tuxedo, but I could never see his face. Sometime after dating my now-husband for a while, I realized that when he and I originally met at my senior prom, he was wearing a tux. In different ways, a lot of the things in my dreams did happen, but much less sensationally. For instance, before he proposed, he took me to see a local production of A Chorus Line.

In “Faceless Man,” Clare had these dreams, they pointed her to this dream guy, and that was about it. The story was fun, but pretty flat. There wasn’t enough heart. There wasn’t enough tension. I put the book to the side for almost nine years.

Then, after completing breast cancer treatment in early 2023, big idea number two hit me (seriously, I can never have just one big idea for these things): What would happen if Clare had breast cancer, but also, what would happen if she didn’t? What if the story had two timelines with the ways her life could go if that dreaded phone call went two different ways? I had obviously been contemplating this scenario in my own life and thought it would be therapeutic to work it out through my fiction.

The final version of the book still has the faceless-person dreams, but this time, they’re different depending on the timeline. Clare’s bisexual, and in one timeline the dreams start pointing her toward a male, and in the other a female. In the timeline where she has breast cancer, the cancer diagnosis and story are my own, though fictionalized slightly to work within the confines of the narrative.

Oh, and the title? When I announced on social media that I had breast cancer back in 2022, I said on social media that “Cancer is only going to be a chapter in my life, and not the whole story.” Thus, Only a Chapter was born.


Only a Chapter: Amazon|Space Wizard

Author Socials: Bluesky|Facebook|Goodreads|Instagram

[syndicated profile] scalziwhatever_feed

Posted by John Scalzi

1. Whoops2. It's fine, I'm fine, I'm going to the dentist literally right now to have it fixed3. When you lose a crown and put it under your pillow, the tooth fairy does not leave you so much as a nickel, in what world is this even remotely fair

John Scalzi (@scalzi.com) 2025-04-22T12:26:48.222Z

Ever have that dream where your teeth fall out? Well, it’s not a dream in my case; last night, while chewing, one of my crowns tried to escape. Fortunately I realized what was happening before I bit down, and therefore saved the thing for the appointment my accommodating dentist arranged for me this morning.

The good news is the crown is now safely back in my head; the less great news is now this formerly-permanent crown is a temporary, and I have to go back in a couple of weeks to get a new permanent crown. Dentistry is confusing, y’all.

Anyway, that’s been my last 15 hours. How are you?

— JS

Letter to my MP

2025-04-22 13:41
lnr: Halloween 2023 (Default)
[personal profile] lnr

A letter to Pippa Heylings, Lib Dem MP for South Cambs, about the Supreme Court trans ruling

Attn: Pippa Heylings MP
South Cambridgeshire

Tuesday 22 April 2025

Eleanor Blair
[Address redacted]
CB22 5AE

eleanorb@gmail.com

Dear Pippa Heylings,

I'm afraid I think this message may be a little incoherent at times, but I needed to write now, while it is still fresh.

I am enormously concerned by the recent Supreme Court ruling on the use of the word "woman" in the Equality Act, and rather more so at the disproportionate response to this ruling by various organisations. In particular today both the BBC and the Independent are reporting that the minister for equalities Bridget Phillipson has said that trans people should use the toilets matching their biological sex, rather than their gender identity, and the alarming news last week that the British Transport Police now state that trans women (males) should be search by male police officers in future.

Someone asked me earlier today if I would be happy with males using women's changing rooms, and this was my response:

---

Yes. As a cis woman, a "biological woman" if you insist, I am absolutely happy to share changing rooms with trans women or with young children who are not independent enough to change on their own in the men's changing room.

And I also think *all* changing rooms should have at least some locking cubicles for privacy regardless of this opinion because not everyone can face being naked in front of other people even of the same sex. For all sorts of reasons from embarrassment to periods to colostomy bags to religion to previous trauma.

Stop thinking this is a gotcha, it isn't.

I'm *not* happy that British Transport Police have immediately officially changed their policy to state that trans women must be searched by male police officers. Or that the government are now saying the NHS must reconsider same sex spaces too.

It was *always* possible to exclude trans women from women-only spaces *if there was a legitimate and proportional reason to do so*. It seems that this judgment has shifted the bar considerably as to what is being considered proportional and that worries me, not just for "biological" women who will inevitably be caught in the cross fire (don't tell me it won't happen, it already does) but also for trans women and trans men and non-binary people who just want to get on with their lives in peace and not have to campaign for third spaces which don't currently exist in order to do so.

---

I don't know what you can do here, but I would like to see you speak out against this over-reaction to the Supreme Court ruling.

Yours sincerely,

Eleanor Blair

Quick rec

2025-04-21 14:22
cesy: "Cesy" - An old-fashioned quill and ink (Default)
[personal profile] cesy
I’ve just done basic CPR training in 15 minutes with British Heart Foundation’s free digital tool RevivR. All you need is a smartphone or tablet and a cushion. It's boosted my confidence in first aid, and reminded me of stuff I learned on previous first aid courses.

https://revivr.bhf.org.uk/?shar=1

Sunset 4/20/25

2025-04-21 00:12
[syndicated profile] scalziwhatever_feed

Posted by John Scalzi

I got a new camera (a Nikon Coolpix P1100, review coming at some point), and one of the things it does really well is zoom in real close to far away objects. I tried it on the sunset today, and, yup, it got in real close. Enjoy.

— JS

[syndicated profile] lemire_feed

Posted by Daniel Lemire

In software, we often use key-value data structures, where each key is unique and maps to a specific value. Common examples include dictionaries in Python, hash maps in Java, and objects in JavaScript. If you combine arrays with key-value data structures, you can represent most data.

In C++, we have two standard key-value data structures: the std::map and the std::unordered_map. Typically, the std::map is implemented as a tree (e.g., a red-black tree) with sorted keys, providing logarithmic time complexity O(log n) for lookups, insertions, and deletions, and maintaining keys in sorted order. The std::unordered_map is typically implemented as a hash table with unsorted keys, offering average-case constant time complexity O(1) for lookups, insertions, and deletions. In the std::unordered_map, the hash table uses a hashing function to map keys to indices in an array of buckets. Each bucket is essentially a container that can hold multiple key-value pairs, typically implemented as a linked list. When a key is hashed, the hash function computes an index corresponding to a bucket. If multiple keys hash to the same bucket (a collision), they are stored in that bucket’s linked list.

Quite often, we only need to look at the keys, or look at the values. The C++20 standard makes this convenient through the introduction of ranges (std::ranges::views::keys and std::ranges::views::values). Let us consider two functions using the ‘modern’ functional style. The first function sums the values and the next function counts how many keys (assuming that they are strings) start with a given prefix.

template<typename map_type>
auto sum_values(const map_type& map) {
    auto values = map | std::ranges::views::values;
    return std::accumulate(values.begin(), values.end(), 
                         typename map_type::mapped_type{});
}

template<typename map_type>
size_t count_keys_with_prefix(const map_type& map, 
                                     std::string_view prefix) {
    auto keys = map | std::ranges::views::keys;
    return std::ranges::count_if(keys, [prefix](std::string_view key) {
        return key.starts_with(prefix);
    });
}
The code defines two template functions for processing a map-like container. The sum_values function takes a map of any type and computes the sum of its values by extracting them using std::ranges::views::values, then applying std::accumulate to add them up, starting with a default-constructed value of the map’s value type. The count_keys_with_prefix function counts how many keys in the map start with a given prefix by extracting the keys with std::ranges::views::keys and using std::ranges::count_if with a lambda that checks if each key begins with the specified prefix via starts_with. Both functions leverage C++20’s ranges library for concise and expressive manipulation of the map’s keys and values.
If you do not crave the functional style, you can use loops… like so…
template <typename map_type> auto sum_values_daniel(map_type &map) {
  typename map_type::mapped_type sum{};
  for (const auto &value : map | std::ranges::views::values) {
    sum += value;
  }
  return sum;
}

template <typename map_type>
size_t count_keys_with_prefix_daniel(const map_type &map,
                                     std::string_view prefix) {
  size_t count = 0;
  for (const auto &key : map | std::ranges::views::keys) {
    if (key.starts_with(prefix)) {
      ++count;
    }
  }
  return count;
}
I personally find loops more readable than lambda functions, but it might be worth testing both to see which one provides the best performance.

When you do not have C++20, you can write the same functions using a more conventional style:

template<typename map_type>
typename map_type::mapped_type sum_values_cpp11(const map_type& map) {
    typename map_type::mapped_type sum = 
                  typename map_type::mapped_type();
    for (typename map_type::const_iterator it = map.begin(); 
                                    it != map.end(); ++it) {
        sum += it->second;
    }
    return sum;
}

template<typename map_type>
size_t count_keys_with_prefix_cpp11(const map_type& map, 
           const std::string& prefix) {
    size_t count = 0;
    for (typename map_type::const_iterator it = map.begin(); 
                                           it != map.end(); ++it) {
        const std::string& key = it->first;
        if (key.size() >= prefix.size() 
                    && key.compare(0, prefix.size(), prefix) == 0) {
            ++count;
        }
    }
    return count;
}
Prior to C++20, there was no dedicated starts_with function to directly check if a string was a prefix of another, requiring more verbose methods like compare. Of course, you can combine the old-style code with the ‘starts_with’  method. I think that the addition of functions like ‘starts_with’ is an underrated benefit of the recent C++ standards. Small details can be impactful.

Let us compare the performance. I have generated a large key-value map with a thousand keys (as strings) with corresponding integer values. All my keys begin with ‘key_’ and I ask my functions to count how many keys begin with ‘key_’ (that should be all of them). I use both an std::map and std::unordered_map data source. I record how many nanoseconds I need to spend per key checked. I use two machines, one with an Intel Ice Lake processor running at 3.2 GHz with GCC 12 and LLVM 16 as the compilers and one with an Apple M2 processor running at 3.5 GHz with LLVM 15 as the compiler. They do not use the same instruction set, so we cannot directly compare the number of instructions retired: we expect an ARM-based system like the Apple M2 to use a few more instructions.

Using an std::map I get the following timings and instruction counts:

function Apple M2/LLVM15 Intel Ice Lake/GCC12 Intel Ice Lake/LLVM16
C++20 functional 2.2 ns 5.5 ns 5.8 ns
C++20 loop 2.0 ns 5.5 ns 5.8 ns
C++11 4.0 ns 5.5 ns 5.5 ns
C++11 with starts_with 2.0 ns 5.5 ns 5.8 ns
function Apple M2/LLVM15 Intel Ice Lake/GCC12 Intel Ice Lake/LLVM16
C++20 functional 46 instructions 29 instructions 49 instructions
C++20 loop 41 instructions 29 instructions 49 instructions
C++11 58 instructions 30 instructions 30 instructions
C++11 with starts_with 43 instructions 30 instructions 49 instructions

Using an std::unordered_map, I get the following timings and instruction counts:

function Apple M2/LLVM15 Intel Ice Lake/GCC12 Intel Ice Lake/LLVM16
C++20 functional 1.1 ns 3.8 ns 3.8 ns
C++20 loop 0.9 ns 5.4 ns 3.8 ns
C++11 0.9 ns 5.4 ns 3.8 ns
C++11 with starts_with 0.9 ns 5.4 ns 3.8 ns
function Apple M2/LLVM15 Intel Ice Lake/GCC12 Intel Ice Lake/LLVM16
C++20 functional 35 instructions 10 instructions 30 instructions
C++20 loop 30 instructions 13 instructions 30 instructions
C++11 26 instructions 14 instructions 12 instructions
C++11 with starts_with 32 instructions 14 instructions 30 instructions

We find that iterating over an std::map instance is slower than iterating over an std::unordered_map instance.

Performance comparisons between Apple M2/LLVM15 and Intel Ice Lake/GCC12 systems reveal striking differences in C++ code execution. While functional approaches (e.g., C++20 ranges) can outperform traditional loops by up to 40% under GCC 12, using starts_with for string comparisons dramatically halves running time for std::map on Apple/LLVM15.

Despite small input sizes fitting in cache, Intel’s iteration performance is not compute-bound, achieving under 2 instructions per cycle (IPC), while Apple’s exceeds 4 IPC, highlighting its architectural advantage in optimizing data access patterns.

My source code is available.

[syndicated profile] smbc_comics_feed

Posted by Zach Weinersmith



Click here to go see the bonus panel!

Hovertext:
All I'm saying is show me one -- just ONE -- woman who ever dug a 200,000 gallon boner-lake. I'll wait.


Today's News:

Beep boop

Easter Flowers

2025-04-20 14:53
[syndicated profile] scalziwhatever_feed

Posted by John Scalzi

At the local nature preserve. No need to pick them! I brought them to you anyway!

And happy Easter, if it is a holiday you celebrate. And if you do celebrate it, I hope you endeavor to live your life in a manner worthy of the redemption that Christ offered you.

— JS

[syndicated profile] smbc_comics_feed

Posted by Zach Weinersmith



Click here to go see the bonus panel!

Hovertext:
You don't *have* to eat them raw. It's more of a gourmet thing, so you might not get it.


Today's News:

The New Chair Arrives

2025-04-19 17:08
[syndicated profile] scalziwhatever_feed

Posted by John Scalzi

There are not many physical things I actively covet in this world, but for a while now I’ve wanted a classic Eames chair. I couldn’t bring myself to purchase one because they are, in two words, stupidly expensive. There are less costly knock-off versions, of course, but in this particular case the knock-offs don’t do the psychic trick for me. If I was going to ever make the splurge, I wanted the “real thing.” After all, it was going to be my ass in the chair. But I — reasonably! — balked at spending more for a chair than I spent for my first car (even adjusting for inflation, I just checked).

Then three things happened: One, I came into some unexpected money that did not immediately have to go to bills. Two, a friend pointed out that Design Within Reach was having a 25% off sale, which meant the chair new did cost less than that first car. Three, the world is on fire, so, you know what? Fuck it. I checked with the family’s chief financial officer (i.e., Krissy) to make sure there were no objections, and then put in the order. The chair was originally supposed to arrive around my birthday, but they got it out a little early, and now here it is in my office.

And how is it to sit in? Very nice! I’m typing this while plopped down in it, and everything is groovy and it smells great. I suspect I will be sitting in it quite a bit. There was some discussion about whether to have it here or at the church, and I decided I would rather have it here than travel a couple of miles to visit it. The one drawback to having it here, however, is that I have pets, with claws and fur, to scratch and schmutz up the thing. So enjoy this picture of it without the blankets I will be using to cover it when I’m not in fact sitting in it.

(And what about the chair that was previously in the corner the Eames now occupies? It’s likely to go to the church, where there is more than enough space for it and where it will get to play with lots of other chairs. Until it gets moved, it’s residing in the dining room, which itself is undergoing some renovation, and where, as you can see, Smudge has already found it and is happy resuming his practice of napping on it. It’s a nice chair (as you can see by the fact it also has a blanket to keep it from being schmutzed up) and I’m sure it will live a long and happy life in its new environs.)

The only real downside to the Eames chair, for me, the World’s Laziest Person, is that it comes with an actual owner’s manual; apparently I will need to oil the wood on the chair once a year or so, which, ugh, fine, I guess. I do plan to keep the thing, you know, for the rest of my actual life, so I suppose I should take care of it.

Also, this marks the end of my “expensive furniture” habit. I’m too cheap, and we have too many pets and chaos for any more of this stuff. Everything else is bought with the idea it will be colonized by fur-bearing miscreants who will use it for parkour. This is fine. They can enjoy the rest of the furniture. This one thing is for me.

— JS