The Burning Babe
Dec. 25th, 2021 07:27 am- Robert Southwell
From Last Poems, Untitled
Nov. 11th, 2021 10:36 am-- A. E. Housman
Product Review
Sep. 25th, 2021 09:03 pmElection Thoughts
Sep. 22nd, 2021 10:08 pmRiffing off a Review of James Nicoll's...
Sep. 15th, 2021 06:32 pmFor the record, I thought it well done and not difficult to follow and would recommend it to anyone looking at the intersection of the fantasy novel and the detective novel.
Metre and Oral Praxis
Sep. 8th, 2021 06:33 pmQuoted from an actual classicist talking about the early CE in a Guardian article:
"Poetry was so important; everyone read Homer and all that sort of thing. But we know that spoken language wasn’t really appropriate to that kind of poetry.. "
Somebody has their wires crossed. If they'd cited, say, Callimachus it would be unexceptionable (except that I doubt everyone read Callimachus). But Homer was, very much, oral poetry. The ghost of Milman Parry is turning in his grave.
The speaker is trying to position accentual-metric verse as more natural than real metre, in Greek. But even in the days of Aristophanes the old-fashioned, pre-Sophist curriculum for the well-off young was mainly oral poetry (including composition) and not written. Metrical poetry.
Stressed poetry came in as the language changed and more syllables became short, and the claim underneath the article's actual text may be that the text being discussed is evidence of this transition earlier than previously thought. Germanic had already gone through that transition, which is why old Germanic poetry does not inherit Indo-European metrics but uses a stress-based alliterative metric.
Latin, by the way, was a different case - Greek metres had been grafted onto Latin and accentual-metric poetry reasserted itself early in the common era.
Anger and The Canadian Election
Sep. 4th, 2021 10:54 amThe Toronto Star had a front-page article with the title "Why is Everyone So Angry?" (well, third page with a massive banner on the front page). Unfortunately, its diagnosis was facile.
It was clearly prompted by the phenomenon of Justin Trudeau being regularly assailed viciously, and in such numbers, that in one case he had to cancel an appearance (as the protestors outnumbered the police).
(As a specific phenomenon this is a little odd. After all, when you think of it, Trudeau is in many ways the Jim Hacker of Canadian politics: appeal to the public, not very bright, steered by his advisors. You may be assured that anything he backs will have come from either the party or the civil service or (most likely) both, without being so extreme to be able to be called "courageous".
Although the Conservative Party condemns the behaviour, it feeds it by running so emphatically against Trudeau, as though the government's policies all sprang from his forehead. The PMO may be at least as dictatorial as it was under Harper - there has been no return to Cabinet government[1] - but it is hardly a hotbed of flourishing originality and exciting ideas.)
But the anti-vax, anti-mask movement in particular is pretty well frothing at the lips. Why?
The article points all of its fingers at pandemic fatigue. It omits noting that Brexit, and the Trump election, and for that matter the Tea Party formation around 2008, were all driven by a similar type of anger. Covid-19 has provided a couple of new presenting issues, and pandemic fatigue is undoubtedly an aggravating factor, but it's hardly the most important one.
(If it were pure pandemic fatigue you'd expect a cadre of vaccinated people who are fed up with the risks posed by unvaccinated people and heckle candidates who are "soft" on vaccine mandates balancing out the anti-vaxxers protesting the Liberals; and you'd expect protestors in the anti-vax, anti-mask camps to protest the federal Conservatives as well, as they have moved to avoid having any significant space between the Liberals and themselves on this issue.)
My interpretation is that it's an effect of cognitive dissonance with transferred anger. People don't want to acknowledge that things will never revert to where they were in (choose one based on your issue) 2019, 2000, 1989, 1981, 1966, or 1958.[2]
If that's something you won't acknowledge, to the level of cognitive dissonance, then displacing the anger at life moving away from where you are convinced it ought to be is a direct effect. (This is also tied up with confronting, or avoiding confronting, the fact that your idea of "rights" does not line up with that of the law.)
Also, naturally, even people with a much milder degree of denial will be attracted to an appeal of return. The natural heirs are parties of the right, as their natural platforms involve either minimizing or denying the necessity of significant change.
All of this feeds into the election dynamic. The Liberals suffer from both kinds of reaction; the CPC benefits. Maxime Bernier's party is showing a small uptick.
A secondary effect is that although climate is a potential wedge issue - the potential wedge issue - between the CPC and the Liberals, it's not being used as such, because to run a campaign on that basis amounts to repeatedly telling people that they haven't seen real disruptive change yet, and that they need to get ready for it and support it. In the current context that is probably not a way to win middle-of-the-road voters, who are the key group in this election.
It is still possible for the CPCs to end up failing to form a government, especially if (as Singh advertised in the spring) the NDP refuses to support the CPC in a minority government. Unless things improve greatly for the Liberals, though, it is probably time to write Trudeau's political obituary, given both the drop in support and the fact that it was ultimately Trudeau's decision to call this particular election in the first place.
[1]I remember Gordon, LaMarsh, Trudeau, Pelletier, and Marchand.
[2] Pre-Covid, pre-9/11, before the fall of the Soviet block, pre-IBM PC, pre-New Left, before the shine came off the suburbs.
Singleton As Band-Aid
Aug. 22nd, 2021 10:30 amIn my last job, there was an internal site on which employees could create their own personal work-related blogs. I had one that dealt with C++ and OO topics that I'd been irritated into writing about in production code: I had to leave it behind when I left, but transferred the site ownership to my team leader so that it at least wouldn't be cleaned out automatically. My current workplace has various ways for teams to share data but nothing comparable for individuals.
This means that anything I'm irritated into will end up being posted here. Any code examples will be generalized enough to be generic and no details of proprietary IP will be shared, although various issues of actual production code quality may be referenced, from this or from prior work contexts, without any specification of where.
For anyone who is not a programmer, these are likely to be TL;DR.
In the nearly thirty years since Design Patterns came out, the Singleton has generally been recognized as an anti-pattern, encouraging the use of global data with a mask on and hiding the flow of control, to say nothing of complicating unit tests.
However, in the context of trying to convert legacy code into well-designed and tested code, the Singleton has a role to play as a Band-Aid (sticking plaster to right-pondians) as a temporary measure, even though its ultimate fate will be un-Singletoning itself.
Consider the case where we are converting a legacy method with some associated data into a proper class. It uses ambient data from the huge source file it is being pulled out of freely, but the data it uses is tightly coupled in a logical sense, and if you group it together it naturally attracts a few existing functions which use that data and little else, to make a nicely encapsulated class. The data tracks state of ene sort or another and notionally has to be unique.
// in file RecordTracker.h
class Record;
class RecordTracker
{
public:
void addRecord(const TransactionId& inId, const Record& inNewRecord);
const Record& getRecord(const TransactionId& inId) const;
};
// In file f.cpp
RecordTracker theRecordTracker;
class RecordUser
{
public:
void processTransactionUpdate(const Transaction& inTransaction)
{
//...
const Record& rec = theRecordTracker.getRecord(inTransaction.getId();
//...
}
};
The data is used in several other compilation units, where it was declared extern. We update all of those locations to use the new class.
Now our legacy method uses one object, which it is still reading from global data. If we extract an interface from the new object, we can pass it in to the object we are now building on construction, as an instance of simple dependency injection. So we do that.
// in file IRecordTracker.h
class Record;
class IRecordTracker
{
public:
virtual ~IRecordTracker();
virtual void addRecord(const TransactionId& inId, const Record& inNewRecord) = 0;
virtual const Record& getRecord(const TransactionId& inId) const; = 0;
};
// in file RecordTracker.h
#include "IRecordTracker.h"
class RecordTracker: public IRecordTracker
{
public:
virtual ~RecordTracker();
virtual void addRecord(const TransactionId& inId, const Record& inNewRecord);
virtual const Record& getRecord(const TransactionId& inId) const;
};
// in file RecordUser.h
class RecordUser
{
public:
RecordUser(const IRecordTracker& inTracker): m_tracker(inTracker) { }
void processTransaction(const Transaction& inTransaction)
{
//...
const Record& rec = m_tracker.getRecord(inTransaction.getId();
//...
}
private:
const IRecordTracker& m_tracker;
};
There is a remaining problem: the object in question is still global data, used in multiple places. In fact, the second class we extracted the function into turns out to be useful in some (but not all) of those cases, so it's getting the value passed in there via interface as well.
The original location might be tolerable - the data is static lifetime data in that place. It could even in theory be moved into the compilation unit for the second class as an implementation detail - but we still have all the other access points to look at.
Some of those access points have very long call chains before they go back to a common source, frequently main(), with narrow interfaces[1]. Many of them have little to do with the area we're working on aside from incidental use of the data in question, and it's not in our scope to do far-flung imperial refactoring beyond the area we're having to touch. So we have two options:
- Leave it as it is; at least the class we're worried about is now functioning in a testable manner.
- Convert the instance of the data into a Singleton and have all the places which currently use the concrete class use the Singleton Instance() method. (Don't actually change the data class: implement the Singleton to use the interface and delegate operations to the original substantive class. This doesn't mess with our testing and prepares for the end of the process when the Singleton goes away.)
#include "RecordTracker.h"
class SingletonRecordTracker: public IRecordTracker
{
public:
static IRecordTracker& Instance();
virtual ~SingletonRecordTracker();
virtual void addRecord(const TransactionId& inId, const Record& inNewRecord)
{
m_delegate.addRecord(inId, inNewRecord);
}
virtual const Record& getRecord(const TransactionId& inId) const
{
return m_delegate.getRecord(inId);
}
private:
SingletonRecordTracker();
RecordTracker m_delegate;
};
If we do the second, we have a clear marker for the issue. We can also push the actual invocation up our call stack for the immediate case we're dealing with, widening interfaces to accept the interface, until we get to the point where the instance "naturally" lives (frequently in main() if it's dependent in any way on program parameters).
In the future, refactorings can push up the calling level from other locations using the interface higher up the call tree. As we go, we may (probably will) end up with more classes which hold a reference to the interface, as well. Eventually, all the calls invoking the Singleton will be in the same context.
At that point, we get rid of the Singleton and replace it with a simple instance of the class. (If the program is resolutely single-threaded, it may even be possible to allocate it on the stack; otherwise it will have to be static or allocated via operator new.)
So the Singleton acts as a temporary way of patching the problem for a period of time, better than the original state, and also as a marker that the problem continues to exist. (The analogy here is not flesh-coloured or clear Band-Aids, but the ones with pictures of Dora the Explorer I used to get for my daughter.) The existence of those Instance() calls is an explicit and deliberate marker of what has to be fixed, and where.
[1]One application I know, originally C but mixed C/C++ for over 20 years, heavily used, passes all execution of transactions through a single function which takes one argument - an enum indicating the type of operation to take. This logic is in shared code and is called in several different applications. Someday this will presumably be refactored, but until then it's a barrier to any attempts to get rid of global data in some form.
On a Probable Election
Aug. 14th, 2021 09:11 am(This does, of course, assume that a government is "about" power rather than achieving ends, and in practice our current structure in which permanent parties form governments pretty well guarantees that that will be the case. You get power first, if necessary by watering down promises to be as little objectionable to middle of the road voters, then govern by introducing measures which will not upset the group's who elected you.
There's a story about that, at least in Canada... In the very early seventies, PET did a media interview in which he expressed the view (uncontroversial to a political scientist, which is what he had been, or to an historian of the Westminster style political systems) that governments were elected on the basis that the representatives would use their best judgement in determining what to legislate, and that democratic feedback comes at the next election cycle. In particular, a government should be guided by good policy rather than immediate popularity of its policies. This was wildly unpopular. Many voters, though living in a representative democracy, want the benefits of direct democracy - immediate feedback. (They usually don't want the drawback of a functional direct democracy, which is that everyone has to take considerable effort in educating themselves on at least the important issues, going well beyond reading the news occasionally.) That's why recall mechanisms are popular with populist platforms, such as that backed by the original Reform Party.
The Liberal Party was reduced to a minority government in the following election, partly as a result of that response. Since then it's been pretty clear that in practice coherent policy will tend to take a back seat to tailoring initiatives to what will not be too unpopular, at least with the Liberals.)
I expect this to be, generally, an election where the Liberals use a front-runner campaign: heavy in accomplishments, with a relatively anodyne platform designed not to drive anyone off who might already be considering voting Liberal. I could be wrong, though. One of the big advantages of the Liberals is that the Conservatives are both divided and, as a whole, unlikely to unite around policies which might appeal to swing voters. O'Toole seems to be trying to move somewhat in that direction, but he has to deal with social Conservatives, libertarians who object to sensible public health measures, and Harperites who want to nail their colours to the mast of Big Oil in the middle of the hottest year on record. (Not that the Liberals are immune on that last point. A recent headline had them saying they needed pipeline revenue to fight climate change, which is really just bonkers.) The NDP has a lukewarm platform - aiming at middle of the road voters - and a personally popular leader, at least compared to Trudeau. (Trudeau retains personal charisma; but he now has a significant block of electors among potential swing voters who wish he'd inherited his father's intelligence as well.)
It's just possible that the Liberals could campaign on a big platform designed to exacerbate the weaknesses of the other two parties - pushing for sweeping new changes to address disparities the pandemic revealed and to take aggressive action on climate change. This would have two advantages: it would heavily differentiate them from the CPC, and it might put them far enough left to weaken the NDP. It has one big disadvantage: medium voters who just want to get back to normal who would reject such a platform in favour of a business as usual approach, which would be O'Toole's platform.
I do expect the Liberals to make strategic announcements designed to both distinguish themselves from the PCs and make the PC response likely to include embarassing reactions from some if the PC candidates. I certainly expect them to talk a lot about climate change, given recent heatwaves, wildfires, and the IPCC report (as well as the upcoming climate conference in Scotland). But I expect those to be secondary elements in what will otherwise be a front-runners race. (Also, if they were inclined to run on a big change platform, the obvious thing to do would be to reconvene Parliament, put the platform in the Speech from the Throne, and then either call an election on its failure or govern aggressively based on its passage, and the passage of all the implementing bills, which would all be votes of confidence... they are not doing this.)
I expect the Conservatives to campaign as though the Liberals had such a platform but were keeping it secret. About the only thing their disparate combination of factions can unite behind is a return to the status quo ante, and they will depict the Liberals as disturbers of that status quo, and as untrustworthy on other grounds (the current fight with the Speaker, the MeToWe controversy, etc.).
I expect the NDP to campaign (as they have recently) as Mackenzie King's "Liberals in a hurry" in an attempt to expand their centrist vote. As recent experience has indicated a hard ceiling on the NDP vote in critical areas I do not think that this will succeed; they might pull some votes away from the Liberals but probably not as many as last election.
The Greens ... what can be said about the Greens other than that they are showing themselves to be at least as good as the Conservatives at stabbing themselves in the foot? Maybe that they are also a reminder of the old fights between splintering factions in the left throughout the Twentieth Century. This is good for the NDP and accordingly a bit of a negative for the Liberals.
On Covid ... there's certainly an argument to be made that given our current vaccination levels we are little more at risk (or less at risk) than we will be at any time in the next two years. (Risk could easily increase if a variant more problematic than Delta arises.) I don't expect anyone to make that argument, because it's part of the unpopular position (based on incontrovertible fact! I see Ontario is backtracking on several opening-up promises, as is Alberta) that there will be no return to the status quo ante. The Liberals and NDP may tacitly rely on that, but they're not going to trumpet it or its implications. There is certainly an argument that voting by mail should not only have resources allocated for a heavier vote than usual but encouraged, and that campaign tours should be curtailed or abolished.
Responses to News
Aug. 5th, 2021 08:20 pm1. Observed as a headline on Google News: "I Was Rejected After a Manager Looked at my LinkedIn Profile" - unlike many other things online, your LinkedIn profile is entirely under your own control. It does not track history. It is meant to be for selling yourself. If you post things which might drive off potential employers, it's your own fault.
2. A CBC article on the movie "The Green Knight" does not inspire confidence in the research skills of its author when, after a reasonable amount about the poem at second hand (interviews with academics) it references The Lord of The Rings in its last paragraph without noting that the standard edition of the poem is co-edited by Tolkien and that he did a translation of the poem into modern English.
3. Multiple stories (notably from Alberta and Ontario, but also refracted from other locations) suggest that politicians (and some people) are focussed with tunnel vision on "returning to normal" (Alberta in general, schools in Ontario). They seem not to have realized that there will be no return, but rather the establishment of a new normal; or, more likely, they are in active denial. (One way of illustrating this is to look at the UK, where opening discotheques became legal a few weeks ago but where the venues are floundering in uprofitability because not enough people are coming out to them. The fact that something becomes legal does not necessarily mean that enough people will start to behave as though it is 2019 for a "return to normal".) I attribute this in part to bias (governments which are conservative/mammonite will be less likely to accept change constraining economic activity), partly to geography (conservative governments have a disproportionate number of rural members, who overwhelmingly want to see the end of restrictions of any sort), and partly to a general propensity for governments of any stripe to want to push a "good news" narrative even when it means getting out in front of the facts.
(Masks are not going away for many people, even if others enthusiastically ditch them. I expect heavy vaccine mandates in the private sector, both for employees and (in places such as indoor restaurants, gyms, and the like) customers. I expect the profitability of running a cinema to become very iffy. I expect workplaces where coming in to work while sick in any way becomes a major social blunder and possible disciplinary issue rather than a signal of dedication to the job. I am sure there are consequences I do not foresee; the current labour market suggests other changes.)
The year has nearly come around again to June 16th.
Stately, plump Buck Mulligan came from the stairhead, bearing a bowl of lather on which a mirror and a razor lay crossed. A yellow dressinggown, ungirdled, was sustained gently behind him on the mild morning air. He held the bowl aloft and intoned:
—Introibo ad altare Dei.
Somebody on the CBC was talking about generalizations that can be made about Canadian literature.
One that can definitely be made is that we have not yet produced an author who is even at a level below Joyce.
So tomorrow, raise a toast to the author who, finding history a nightmare from which he was trying to escape (or did he? that was Stephen, and it is never safe to make an easy identity between Stephen and his creator), has finally emerged as having taken claim of one day a year for a history which never took place.
I almost forgot...
May. 1st, 2021 10:00 pmIronically, this page had an ad put in immediately below it for "Wealthsimple: buy and sell stocks". Google's AI has a long way to go at determining the context of the links it put in...
Torts, Common Law, Social utility
May. 1st, 2021 07:20 pmIf "political" thought is creating a breakdown, perhaps we need to think, instead of political response, of a social, artistic, and literary response. Human nature is malleable (though maybe not as malleable as Leary and Wilson thought): addressing how people think may, in the end, be our best response to the crisis of government which confronts us. We need another population, not simply a set of changes of government.