From 1900b7b7a3fd1d390eb2722aa0bf31f069d61170 Mon Sep 17 00:00:00 2001 From: Dominic Ricottone Date: Mon, 8 Jan 2024 05:41:19 +0000 Subject: [PATCH] Content updates --- content/posts/bug_in_spss_excel_writer.md | 111 +++++++++++++++++ content/posts/salazar_slytherin_is_a_druid.md | 115 ++++++++++++++++++ scripts/openring.sh | 2 + 3 files changed, 228 insertions(+) create mode 100644 content/posts/bug_in_spss_excel_writer.md create mode 100644 content/posts/salazar_slytherin_is_a_druid.md diff --git a/content/posts/bug_in_spss_excel_writer.md b/content/posts/bug_in_spss_excel_writer.md new file mode 100644 index 0000000..5203e60 --- /dev/null +++ b/content/posts/bug_in_spss_excel_writer.md @@ -0,0 +1,111 @@ +--- +title: Bug in SPSS's Excel Writer +date: "2024-01-08T05:39:23+00:00" +draft: false +--- + +I was unpleasantly surprised to discover a corrupted Excel data file this week. +Luckily I was fully prepared to rebuild it with my pipeline in SPSS, but rather +puzzlingly, rebuilding did *not* cure the problem. +I was returned the exact same corruption error in the new file. + +The first, and typically only, investigation for such issues is into the input +data files. +*Surely the corruption came from elsewhere.* +But after a few minutes of poking and prodding, I found nothing wrong there. +(No ASCII control characters, no embedded case delimiters, no unescaped value +delimiters, etc., etc.) + +My next step was the excessive insertion of debug commands in my pipeline, +trying to determine where and when the issue first appears. +(Sadly SPSS lacks useful debug commands; LIST and some personal macros are the +best available tools.) +But the frustration continued, as everything seemed perfect up to the very end. + +I tried to re-import the corrupted spreadsheet and, strangely, I had no issues +doing so. +Whatever issue Excel identified in the file, SPSS was content to work with. +This prompted me to do some comparisons, to see if any differences existed +before and after the Excel round-trip. +And finally I had a culprit: +my data was magically mutating when written to an Excel file. +Before, a string read like "Phase 2B: \_x0001\_". +After, it was "Phase 2B: □". + +Now I export the mutated data into a text file for closer inspection of the +byte literals. +I found the ASCII control character for start of header. +Surely it isn't a coincidence that SOH corresponds to `01`, which I suppose +you can creatively write as `0001`? +But I've never heard of an escape scheme like "\_xHHHH\_". +Googling "\_x0001\_" gave me nothing of value. + +I used a simple data list to test all of the first 10 codepoints (`00`-`09`). +These were all exported to an Excel file, read back into SPSS, and written to a +text file. +Interestingly the null byte turned into a space character. +Aside from that, I got exactly what I expected; a series of ASCII control +characters. +So "\_x0001\_" clearly isn't a special case. + +The next thing I tested is whether the leading and trailing underscores were +important. +Indeed they are. +Now I am convinced this is a scheme for encoding data. + +Finally I try "\_x0030\_", to be sure that this was a hexadecimal encoding. +The decimal `30` codepoint refers to another control character, while the hex +`30` codepoint refers to the zero character. +And yes, when I saw the "0" upon re-importing, this confirmed that I was +dealing with some sort of hexadecimal escape scheme. + +---- + +The issue can perhaps best be demonstrated by trying to reconstruct the issue +within a first-party, fully supported, WYSIWYG editor. +I of course mean Microsoft Excel. + +I create a new Excel file containing just "foo \_x0001\_ bar" in the first cell, +save, and exit. +I can immediately re-open the file, so clearly Excel has not written a corrupt +file. +What did Excel do with that value? + +It requires some further digging, because modern Excel writes string values to +a separate `sharedStrings.xml` file in an effort to be more efficient. +But because I kept the reconstruction short and simple, it's a quick detour. +Excel took "foo \_x0001\_ bar" and actually wrote "foo \_x005F\_x0001\_ bar". +In case you don't have your handy ASCII codepage available, `5F` represents +the underscore character. + +This is the neat parallel for the escaping strategy used on the web, +e.g. `&lt;`. +`<` wants to be read as "<" by any browser. +That behavior is effectively 'deferred' by encoding the leading character +instead, +so that the first pass of the interpreter renders the intended result. + +---- + +It occurred to me much later that SOH is a very rare and unhelpful control +character. +`09`, the tab character, was far more likely to give me a useful Google search. +And in fact "\_x0009\_" was a much more informative search page. +I was lead down a rabbit hole of the XML 1.0 spec, Microsoft's documentation +for `DocumentFormat.OpenXml.Spreadsheet.CellValue` of the OpenXml API, and the +`ST\_Xstring` type from ECMA-376. + +ASCII control characters must be escaped in an XML document like "\_xHHHH\_". +In other words, when SPSS wrote an unencoded "\_x0001\_" into an XML file, +it was inevitable that any spec-compliant XML parser would substitute that +literal with SOH. +SPSS should have written "\_x005F\_x0001\_" instead. + +---- + +I had to jump through a variety of hoops to report this bug. +I wasn't surprised by this; +I certainly didn't expect any more from IBM. +But I decided it was worthwhile anyway. +This seems like a highly technical bug that could net me some 'internet cred'. + diff --git a/content/posts/salazar_slytherin_is_a_druid.md b/content/posts/salazar_slytherin_is_a_druid.md new file mode 100644 index 0000000..06250da --- /dev/null +++ b/content/posts/salazar_slytherin_is_a_druid.md @@ -0,0 +1,115 @@ +--- +title: Salazar Slytherin is a Druid +date: "2023-12-29T06:18:06+00:00" +draft: false +--- + +And now for something completely different. + +---- + +A common method for teaching Dungeons & Dragons mechanics is to place them in +cultural context. +This is especially true for teaching races and classes. +Human fighters are self-explanatory, +but it's not obvious if elves are the *Santa's workshop* sort or the *JRPG* +sort. +Rogues can sound like an evil profile, +but remember Robin Hood who gave to the poor. + +I personally believe that the druid class can be particularly challenging to +teach. +There are few druids in pop culture. +I've mostly seen new players advised to think about 'the brown wizard in the +Hobbit movies' (read: Radagast) for circumlocution. +Many people come away thinking that druids are the ugly duckling of magic +users. +Others come away fixating on the 'animal' thing, +with no respect to the intended philosophy of druids. + +I have a novel proposal: +Salazar Slytherin from the Harry Potter universe is a prototypical druid. + +---- + +One of core traits of the druid class, +and indeed the trait that attracts the most interest from new players, +is their connection to animals. +Druids can use magic to speak with animals and shapeshift into animal forms. +They partner with an animal familiar. +Personality-wise, they are pet parents. + +Salazar was obviously a snake person. +They are the mascot and motif of his Hogwarts house. + +His most well-known ability was Parseltongue, +to the point that the Gaunts +(up to and including Tom Riddle) +only had to demonstrate that ability to make a claim on Slytherin's legacy. +This is the clearest link to druidity for Salazar. +And the ability to talk with animals is rather frequently the *entire reason* +players pick that class. +Salazar will effectively communicate these details, +whereas Radagast's best parallel is having a rabbit-drawn sled. + +Salazar's basilisk is also one of the most prominent familiars in the +Harry Potter universe. +I'd argue the only competition is Hedwig and Fawkes. +The basilisk and the chamber that Salazar built for it are the titular topics +of an entire book, after all. + +And what a familiar it is! +Basilisks have a range of abilities that are both role-play and combat oriented, +while also being balanced by lore-derived weaknesses (i.e. roosters' crowing). +This could go a long way to preparing new players for the choice of a familiar. + +Needless to say, +the fact that Salazar made that labyrinth inside the school further emphasizes +his care for the animal. +There can be little doubt that he was a *bit obsessed*. +While it can be unfortunate (as alluded to above), +*this* is what many new players fixate on for thinking about druid. +But surely Salazar's template could not make the misunderstanding *worse*. + +---- + +Druids are also deeply connected to nature. +In D&D, this largely means elemental magics +(as opposed to god-derived magics; +or unnatural, evil magics). +The Harry Potter universe does not divide magic into elemental disciplines, +instead preferring categories like Transfiguration and Divination. + +Let's leave aside the Dark Arts. + +Let's instead consider Hogwarts for what it is. +A stone castle of traditional construction. +Located in Middle Of Nowhere, Scotland with just a small commercial town +nearby. +Beset by by merpeople-inhabited lakes and forbidden forests. +Isolated *not just* from the trappings of modern urbanism, +but also from the *(unnatural?)* distractions of government and press and the +consumer economy. +Salazar and the co-founders certainly seem to have a disposition towards +*nature*. + +---- + +Druids are also devoted to a philosophy of balance that is colored by their +worldview. +Again, in D&D, this largely has to do with nature as elemental magics. +They are motivated to action in defence of this balance. + +Salazar certainly had opinions about the balance of magical society. +Unfortunately, his worldview was colored by racism and bigotry. +He and his basilisk were happy to 'defend' that balance, too. + +This is a stretch, I know, +but perhaps could demonstrate how an evil-aligned druid could be written? + +---- + +In summary, while Radagast is an *option* for relaying the concept of druids in +Dungeons and Dragons, +I believe Salazar Slytherin is the *superior choice*. + diff --git a/scripts/openring.sh b/scripts/openring.sh index b4eb376..f47bcbb 100755 --- a/scripts/openring.sh +++ b/scripts/openring.sh @@ -13,5 +13,7 @@ openring \ -s https://andreabergia.com/post/index.xml \ -s https://ludic.mataroa.blog/rss/ \ -s https://tradediversion.net/feed/ \ + -s https://vincent.bernat.ch/en/blog/atom.xml \ + -s https://blog.cr.yp.to/feed.application=xml \ < scripts/openring.html -- 2.43.4