Saturday Review Two. On Monday…
Where to start? This is the second of my reviews for NetGalley. Unfortunately it’s book three of a series that is a continuation of another three-book series. Quite the place to start…talk about in media res. Still we soldier on, noblesse oblige and all that…or is it just contractual obligation? Whatever…
The Origin of Storms
Elizabeth Bear
Book 3 of The Lotus Kingdoms
Elizabeth Bear is probably one of the most versatile authors I know. I first met her way back in 2005 with her Jenny Casey books and have been following along ever since. Sometimes she thrills me and sometimes I find her prose/subject mater just a tad intimidating, but I have never failed to finish a book of hers other than satisfied. Which is quite the accomplishment given the massively disparate subject matter (from Norse mythology to AI-driven space opera and pretty much working away on everything between) she tackles.
The Origin of Storms is book 3 of The Lotus Kingdoms series, which itself is the second trilogy that takes place in the worlds of the Eternal Sky. As in a lot of the fantasy of this genre, Bear uses the first two books to set up the final conflict between “good” and “evil” (although it’s, thank goodness, much much more nuanced than that), and starts this third and final volume with the minor villains disposed of, the armies arrayed, heroes/heroines girded and final conflict looming. And then off the story goes, upsetting the form, exploring motherhood, “stewardship” and the real meanings of power and responsibility. At least that’s what I took from it. The great thing about Bear is when she’s in top form, the story’s pretty darn dense and there’s always lots and lots you can take away. I think The Origin of Storms is pretty high up in the Bear canon.

While the first series had an Asian steppes flavour, this one moves the action to a south-Asian milieu with more rajahs and fewer horses. The conflicts are rooted in a fallen empire and the struggles of the multiple heirs to secure their own borders and destinies. As we start The Origin of Storms we realize perhaps the conflict is bigger than simple, mortal jealousies and ambitions — that perhaps these children of empire have inherited something much larger and more dangerous than they expected.
One think I liked, and this is a tad provocative, is Bear’s handling of oft-touchy issues like race, gender, sexuality and equality, etc. that are slowly (or quickly, depending on your viewpoint) coming to the forefront in SciFi/Fantasy publishing. To me, Bear delivers a smooth story chock full of diversity without really making a big deal of it—it just is, as it should be. Integral to the story, unremarkable except when it’s not and delivered with a smooth touch that leaves very little for anyone to get their shorts in a knot about.
Anyway, it’s a great book, a great conclusion to a great series and leaves me both wondering and keen to find out where Bear will take us next.
Poem Day: Her Day
Animal Friends on a Hop-Happy Day
Tim is a scruffy rabbit
who nibbles on the ratty lawn.
And he’s got special, special friend
by the sunny name of Dawn.
And Dawn’s got another friend,
a clever grey squirrel named Anne.
From high atop the biggest tree,
she’s Dawn’s second biggest fan.
And far, far, far overhead,
flies a daffy mallard named Alexander.
He’ll often say nice things about Dawn
but it’s usually a back-hander.
And as she’s just a tiny fawn,
Dawn is generally quite shy.
Sooo quiet, and timid, and wary,
that brash Tim will often sigh:
Come out, come out from that shrub!
It’s time for us to play!
Let’s romp though the grassy fields
because it’s your special, special day.
And sometimes on those special days,
shyly, slyly smiling, out she’ll come.
And Anne and Tim and Alex and Dawn,
through the world they’ll run.
But sometime she won’t,
and that’s also okay,
because they all know
there’ll always be another day.
And that day,
will be
Dawn’s
special, special day.
Wordle burn
I thought I would give Wordle a try and by guess two I had declared myself a genius…
Turns out, not so much…
Sunday: Dogs a’ barkin’
Bark bark
Bark bark bark,
Bark bark bark
Bark bark bark, bark bark bark
Bark bark bark
bark
Dog code
Secret mode
Fence line toed
Stranger near
Have no fear
Dog is here
Bark
Saturday’s Python Lesson
I have been dabbling more and more with Python. Python is a programming language (that, FWIW, comes pre-installed on a Mac) that is used by a lot of data scientists. As programming languages go it isn’t too hard to learn and is really versatile. One of the things that makes it so versatile is that it can use outside modules and libraries easily and there seems to be a module that will do just about anything you can want.
Why
A few years back I tried to convince L to use the import function built into Blackboard (MacEwan’s LMS [Learning Management System]) to import quiz questions and move from paper-based marking to a more automated workflow. It didn’t work, but in the process I did build a php module to build quizzes.
Then COVID happened.
But, no, before you jump to conclusions, I didn’t manage to convince her to use the bulk import even though she started to use the quiz modules to deliver and mark the quiz. Baby steps.
Then Moodle happened.
MacEwan is in the process of giving up on Blackboard and transitioning to Moodle — which is an open-source LMS. As it happens L has another, temporary, teaching gig at a different institution that also uses Moodle — this was a lot of additional work and learning, so she was starting to come around to the idea I might be able to help.
As a result, eventually, with great sighs and heaving shoulders, she gave in to my pestering and allowed me to upload one of her quizzes… and lo and behold she was impressed at the ease! Minus a few technical glitches.
My End
What I had done was use the format info from my previous php project. Then I used her docx file and by saving it as a text file I was able to do a few search and replaces via regex to create an upload compatible file. Blackboard wants files to look like:
TF True or false? For Niklas Luhmann, the individual agent is not integral to society. TRUE
MC In the sentence "Maybe I got mine, but you'll all get yours.", what part of speech is "yours"? pronoun CORRECT adjective INCORRECT preposition INCORRECT noun INCORRECT
Version One
…of my process was simply to build the regex. Luckily she used a pretty standard format to write the questions so I just had to find the pattern and use it to change it to the proper format.
TRUE/FALSE
True or false? For Niklas Luhmann, the individual agent is not integral to society.
True
FalsePRONOUNS
In the sentence “Maybe I got mine, but you’ll all get yours.”, what part of speech is “yours”?
pronoun
preposition
noun
adjective
Find:
(.*?)\n\n(.*?)\n(.*?)\n(.*?)\n(.*?)\n\n
Replace with:
MC\t\1\t\2\tCORRECT\t\3\tINCORRECT\t\4\tINCORRECT\t\5\tINCORRECT\n
In English this says find: anything (group1) followed by 2 line breaks followed by anything (group2) followed by 1 line break followed by anything (group3) followed by 1 line break followed by anything (group4) followed by 1 line break followed by anything (group5) followed by 2 line breaks
Replace it with: MC tab Group1 tab Group2 tab CORRECT tab Group3 tab INCORRECT tab Group4 tab INCORRECT tab Group5 tab INCORRECT line break
Easy, right? It was slightly different for the True/False questions as there was only two answers but followed the same principles.
Version Two
…added a python script that looked for the ALL CAPS and split the file into two separate files. At which point I also wrote in a search and replace of ‘’ and “” into ' and " since Blackboard didn’t like the special characters.
Version Three
…combined the original regexes with the python script and did it all in one pass. Success! I also added a randomization bit so she could leave the first Multiple Choice answer as the Correct one and the script would randomize them before upload.
Of course when I went to demo the speed and efficiency of my “wondrous creation” to L I forgot to convert the docx to a txt file and it failed. But I soldiered on, did the necessary step and then proceeded — but the “burning shame” of failure remained and so…
Version Four
…added a docx import module and that’s where I am now.
Given an Word docx file with sections delineated by titles in ALL CAPS, this script will divided it into several text files named after the sections, convert curly quotes , format the questions in Multiple Choice or True/False format, and randomize the MC answers.
The resulting files can be uploaded to Blackboard’s question pool for use in multiple quizzes. Of course now I have to do it all over agin for Moodle as it uses a completely different import format 🙂
# import necessary modules
import os
import random
import re
import pypandoc
# NOTE Sections must be in ALL CAPS. They must be named TRUE FALSE (or TRUE / FALSE)
# or else be in the Multiple Choice format.
# set directory to current path of python file
directory_path = os.path.dirname(__file__)
# get file name
print('Enter the filename (without.docx):')
filename = input()
# set docx file and output file
docxFilename = directory_path + "/" + filename + ".docx"
outputfilename = directory_path + "/" + filename + ".txt"
# use pandoc to convert docx to txt
output = pypandoc.convert_file(
docxFilename, 'plain', outputfile=outputfilename,
extra_args=['--wrap=preserve'])
assert output == ""
# Open the converted file
filecontents = open(
directory_path + "/" + filename + ".txt", "r")
# Assigns the variable filecontents the contents of filename.txt, not just the location of the file
filecontents = str(filecontents.read())
# Finds all the ALL CAPS in the file and makes a list (section) of all the sections
sectionname = re.compile(
r'\n(?=[A-Z])([/A-Z\s]+)\n')
section = re.split(sectionname, filecontents)
# Removes the preamble in list and starts with first ALL CAPS section
section.pop(0)
# Loops for the number of sections in the file, starting at the first split
# looking for every 2nd section (the contents rather than the title)
for i in range(0, len(section)+1, 2):
# Set section name and strip out extra characters
sectionname = section[i-2][:-1]
sectionname = re.sub("[/|\s]", "", sectionname)
# Opens a file with the name of ALL CAPS sections; if it does not exist, it creates one
writeFile = open(
directory_path + "/" + "split-files/"+sectionname+".txt", "w+")
# sets text to item (contents) in the list after ALL CAPS delimiter
text = section[i-1]
# strips out curly quotes
text = text.replace('“', '"').replace(
'‘', "'").replace('”', '"').replace('’', "'")
# if the sectionname is TRUEFALSE then...
# then use regex to format questions as TF otherwise format as MC
if sectionname == "TRUEFALSE":
# Substitute all patterns in one go
text = re.sub(r'(.*?)\n\n(.*?)\n\n(.*?)(\n\n|\n\Z|\Z)',
lambda x: 'TF \t' + x.group(1) + '\t' + x.group(2).upper() + '\n', text)
writeFile.write(text)
else:
# else loop though text, match pattern and name capture groups. Uses ?P<name> to name groups
for m in re.finditer(r'(?P<qq>.*?)\n\n(?P<one>.*?)\n\n(?P<two>.*?)\n\n(?P<three>.*?)\n\n(?P<four>.*?)(\n\n|\n\Z|\Z)', text):
question = m.group('qq')
# write capture groups of answer into a list so we can randomize it
qlist = [m.group('one') + "\tCORRECT", m.group(
'two') + "\tINCORRECT", m.group('three') + "\tINCORRECT", m.group('four') + "\tINCORRECT"]
# randomize list
random.shuffle(qlist)
# construct question and answers
text = "MC\t" + question + "\t" + qlist[0] + "\t" + qlist[1] + "\t" + \
qlist[2] + "\t" + qlist[3] + "\t\n"
# Write to file
writeFile.write(text)
writeFile.close() # Finally, it closes the text file
Instagram Since Last Time


Sunday Cats
Toes are many things
Long or short, hairy, or with warts
Unadorned or sporting rings
Often sporting colours of all sorts.
A toe’s big job is to keep you up-right
But when you stub your favourite toe
On that table leg just out of sight
We know that you’ll also scream with woe.
But all in all, your toe’s a friend
Something faithful, loyal
That you can count on in the end
That treats you right royal.
But if you are a ferocious cat
A sharp-toothed predator bursting with fight
When seeking prey, they are all of that,
But in addition,
Toes are
something
to bite
Saturday Review
I noticed the other day that a lot of people on various review sites were getting advanced copies of books from NetGalley and when I mentioned it to L she replied she had an account, but hadn’t used it much.
A quick perusal of the site turned up Scalzi’s new book The Kaiju Preservation Society which is due out in late March. The tile had intrigued me since I first heard it—I am not much of a Godzilla nerd. So I asked her to acquire that (and another) on the promise I would write the requisite review. So here is the review. Maybe I will make this a thing.
The Kaiju Preservation Society
John Scalzi
pub date: March 15, 2022
reviewed from eGalley
This review has been (moved to macblaze.ca/books/reviews/2022/the-kaiju-preservation-society)
Monday Reflections
Uhmmm…
I seemed to have missed Saturday. Speaking of missing things…
Writing progress
Uhmmmmm…
Not so much?
I have a friend who sets out every once in a while to do some sort of challenge… an illustration a day, a painting a week. She inevitably trails off and eventually stops.
A failure?
I think not. Because there are always some lovely drawings left behind to commemorate the attempt. Trying is never a failure. Not trying isn’t either. The idea of failure is an external force… at least that’s my excuse.
And I have some great outlines and background info now so that’s a positive. I am sure I will get back to it. Eventually. Maybe. No drama though…
Old and unfinished
I started this back in 2014. Theres about 2500 words more and then it just trails off. But I kinda like it.
Morning was definitely broken. Henry ‘Hank’ Hagar Jacobs slammed his index finger unerringly down on the cancel button of his alarm clock and buried his face in the remains of his pillow. It had been a life-long dream to hunt down the sonofabitch who’d invented mornings and show him the real meaning of life.
He kicked off the faded purple comforter and rolled his feet to the floor. From the scratched and dented blue and brass trunk at the foot of the futon he dug out a new pair of black cheenos, tags still hanging from the waist. He had a client to see this morning and you never get a second chance to not give a crap about making a good first impression.
Rubbing his eyes with the back of his knuckles, he staggered across the room to the small kitchen, plugged in the dingy electric kettle and sat on the edge of his table while he surveyed the jars and cans piled haphazardly on the counter. Spotting the nearly empty jar of instant coffee, he grabbed his mug from the pile in the sink and opened up 5 sugar packets from his stash, courtesy of corporate coffee, and poured them in. He dumped the last of the coffee in the mug, banging on the bottom of the jar, hoping it would be enough for a caffeine fix. The hot water went into the coffee jar and a few swishes ensured that he’d gotten all he could out of the efforts of Juan and his hardworking ass, before it joined the spoonfuls of sugar in the mug. Just the medicine I need. he thought as the sweet, syrupy liquid flowed down his throat.
As life started to seep back into his brain Hank stared sightlessly at the garishly stained red doors of the wooden cabinets. What in god’s name was that lunatic of a landlord thinking when he did that? For the forty-millionth time he resisted the urge to buy a can of black enamel spraypaint and rectify the situation. But I don’t want to start down that road, do I.
Mug empty, it went back into the sink and he gathered up a chipped but clean Denby bowl acquired recently from the local discount store and a bright yellow box of generic cereal and turned to the single chrome and vinyl chair at the table.
Jacobs brushed the pile of magazines and unopened mail to one side, a couple of them sliding to the already littered linoleum floor. The box of generic toasty Oaty O’s yielded most of a bowl of disgusting circles of dirt-flavoured breakfast before dumping the obligatory hated pile of cereal dust and chunks on top of his breakfast. He blew as much of it away as possible, gave up and glanced around the table.
“Fuck. I knew it. There is no spoon.”
Sunday Salad
Do you like to say arugula?
I do.
Ah-roooo-ga-la!
I also like to say synecdoche,
even though I don’t know how.
Ah-roooo-gala.
There I said it again.
Sin eck doh key
Rhymes with me.
And I like to say arugula.
You should too.
