al

Emotional Manipulation In Fundraising

BethDunn just wrote a great post about mail fundraisng appeals and two schools of thought that are applied to them throughout the industry.

On the one hand there is the practical appeal to a donor's sense of logic and decency. On the other hand, there are the emotional appeals dripping with manipulation sent out to shock or shame a donor into action.

While On Fundraising's primary focus is telephone fundraising, this subject matter is relevant to On Fundraising for two reasons.

Mail appeals and phone appeals are generally part of the same campaign. Sometimes a donor is called first, other times they'll get a mailer and then a follow up call.

Increasingly donors are savvy enough and self-aware enough to take strong offense at the manipulative tone of fundraising letters. We live in an age where almost any information is available to those who want to find it. Todays activist donors do just that.

Donor's often know more about a subject than the front line people raising money for it. As well they should. So sending out these mail broadsides is certainly no good way to show respect for a donor's intellect or for their prior support.

The second reason this issue applies to On Fundraising, is that many telefundraisers mirror or amplify the sentiments expressed by these letters in a misguided attempt to manipulate donors into reactionary giving based solely on emotion. This works for now, however donors are self-aware and savvy enough to know when they're being manipulated. Surprisingly enough, they don't like it.

Todays donors aren't simply tithing blindly in the hopes that some good will come of it. More and more, donors support organizations as active participants in an effort to improve our world. How does a person like this feel when they receive a dunning letter dripping with sensationalized woe? Like a patsy.

All in all, these medieval scare tactics don't belong in modern fundraising. Yes psychology has its place in fundraising, but too often psychology is a euphemism for manipulation. Fundraisers who are good at their jobs are masters of speech, language, and persuasion. Its better to convince someone to give than to trick them into it .

http://smalldots.wordpress.com/2008/05/12/the-model-of-a-modern-major-fundraising-letter/




al

The Future of Fundraising is Local.

With the economy finally starting to gain some traction, few people are thinking about those whom society is le aving behind. These are the working poor, the sick and the elderly. As the wars in Iraq and Afghanistan wind down, we will see more soldiers and their families in need.

Sometimes fundraising calls for a national effort. The only way to gather money and resources quickly is by calling or mailing into every state for support. This is a proven method of soliciting money. This isn't the case for every fundraising effort however.

There are some issues that could just as well be taken care of locally. Additionally, some causes are actually better served by using local fundraisers. Local has a number of benefits; we'll name a few below.

More of the money goes to the cause.
Some national fundraising companies can take as much as 80% of what they raise for an organization. Millions of dollars are wasted in this way. Local groups just can't afford to pay these prices. A local campaign, whether staffed by volunteers or local professionals, ensures that more of the donated dollars go to work immediately.

No one knows local issues like local people.
Using locals to fund raise means having a team that understands the issue and is passionate about it. The more knowledgeable and interested in an issue a fundraiser is, the more likely they are to secure donations.

As a nation, a number of important issues are affecting Americans;
children going to bed hungry, seniors and veterans not getting the care that they deserve and homelessness are just a few of these issues. What all of these issues all have in common is that they begin and end locally.

We can choose to wait for a solution from Washington, but President Obama's job forces him to look at the big issues, not the small ones. National organizations face similar problems; they have the money and resources, but not the organization to implement relief locally. Local fundraisers raising and spending money locally have an immediate effect on communities.

Bringing the idea of raising money in the community and solving problems locally is one whose time has come. More local groups are starting to see the power of collecting donations at home. As the idea spreads, the benefits will only become greater.




al

What does it mean to "wane philosophical"?

"To what extent is science a strong-link problem?", Sauropod Vertebra Picture of the Week, 10/30/2024 [emphasis added]: Here’s a fascinating and worrying news story in Science: a top US researcher apparently falsified a lot of images (at least) in papers that helped get experimental drugs on the market — papers that were published in top […]



  • Words words words

al

The etymologies of ballot and bigot

That's all I've got, so far, for linguistic commentary on the U.S. election results. According to the OED, the etymology of ballot is < (i) Middle French ballotte (French †ballotte) small ball (beginning of the 15th cent. as †balote), small coloured ball placed in a container to register a secret vote (1498) or its etymon […]




al

Whimsical surnames, part 2 (again mostly German)

[This is a guest post by Michael Witzel] A few months ago you published a discussion of whimsical surnames. Since then I have paid attention and have found new ones in  almost every news broadcast. It is said that there are 1 million (!) surnames in the German speaking area of some 95 million people […]




al

Biblical and Budai Taiwanese: vernacular, literary; oral, written

[This is a guest post by Denis Mair]      Cai Xutie was a Taiwanese woman who ran a family farm with her husband in a village near Jiayi in central Taiwan. She was a rice farmer and had never attended a public school. After her husband died in middle age, she sold some of the land, […]




al

USGL annual report for fiscal year 2022 published

The U.S. Grand Lodge O.T.O. annual report for fiscal year 2022 has been published. This and all previous annual reports can be found here.




al

From now on, the title of the post is allowed to just be "January 2024" (only when it is January 2024, however)

Hello again,

This month I've been plugging away on the project I mentioned in the previous post which involves among other things a PDF generator and now an implementation of ML (as in Standard ML, but also the other one). This is probably the 10th "compiler" I've written in my life, and it's kind of fun to revisit these problems that you've done many times and try out different approaches, although this time one of the approaches is "Use C++" (for reasons of making good on a joke, but also for reasons of mlton doesn't work on my computer any more). And although C++ is a fine tool for many applications, it does have some deficiencies for the task of writing a compiler (one of the most irritating: a very modest limit on the stack depth? Like my computer has 256 Gigabytes of RAM and 2^64 virtual addresses and somehow it can only manage 1 megabyte for the stack and there's no standard way to increase it? Get off my lawn). But then you can also experience new ways of struggling with C++, like: A middle of the night power failure wrecked my computer's GPT (as in GUID Partition Table, but also the other one) and I was deep in the depths of taking the computer apart to reset its parts, its BIOS (its Basic In/Out System, which is where it stores its biography) and its hard drives were everywhere on the floor, and it could not be saved, and this after I already broke my computer this year by trying to put the world's biggest video card in it, too hard. And I could not merely perform recovery because of Unknown Error, so I had to begin anew again and restore from backups. But when you restore from backup and you're in the mood of "why is this so complicated and I don't understand how computers work any more?" it occurs to you (me) to also change your underlying development environment instead of reinstalling the devil you know. So I ended my friendship with Cygwin64 and switched to new best friend MSYS2. Both of these things are different ways of wishing that you were using Linux while you're using Windows. The main reason I tried this new way of struggling is that Cygwin is very behind on its version of x86_64 clang (C++ compiler), which I wanted to try because it supports AddressSanitizer and clangd on Windows, and I wanted to give LSP in emacs a shot (it's finally good!). There were a few growing pains, but I think MSYS2 is what I would recommend now. One of the nice things they did was create multiple different environments depending on what you want to do (e.g. "I want to use clang to compile x86_64 code" or "I want to do 32-bit cross compilation for ARM") and in that environment, you just say "g++" and it invokes the compiler you want, instead of the weird contortions I've been doing for years with manually invoking x86_64-w64-mingw32-g++. I was also able to get clblast working before being too filled with rage to continue, so that is nice for the ML inference on the world's biggest graphics card. I made these graphics to help me tune the correct settings of GPU layers (y axis) and number of threads (x axis):


tune-single

tune-batch


In some sense the results are obvious (more threads and more layers is faster) but it was interesting to me how the cliff of performance drops off at a different number of layers for single and batch mode (I guess because the batch needs some memory itself?) and how it's clearly better to use fewer threads than cores for batch as well. I was not surprised to see performance drop off for >32 threads (everybody knows that hyper-threads kinda suck) but I was very surprised to see performance pick up again when it gets back up to 64? And only for single mode? I wish I understood that better. But mostly I'm a sucker for the custom visualizations.

Right but when writing this compiler I realized that I wanted to use some Greek letters, and I can't handle it when some characters are in a different font in my source code, so I finally made some space for those in my programming font FixederSys. These certainly still need some tweaks, but it's already better than just being in some other weird font:


{{{caption}}}


You can also see that I have been adding some "useful" emoji at the top. It is an interesting puzzle to try to make these things recognizable (especially for the 1x version, whose charboxes are 8x16 pixels). I am pretty sure I will not try to do all of the emoji (like, the flags are totally hopeless at 8x16), but it is tempting to round out the Unicode support somewhat. Like I was trying to make a ¯\_(ツ)_/¯ today and had to settle for ~\_( :) )_/~ which is pretty much (ノಠ益ಠ)ノ彡┻━┻.

Also: Adam revived our old game jam game Headcat, which I described in post 927, now over 16 years ago. You can play it online at Headcat.org. It is harder than I remember, perhaps explaining why it did not reach #1 on the One Appstore Per Child charts.

Also: I started and finished (true ending, but just with one character) Slay the Spire. Good game, but you don't need me to tell you that. Same for Alwa's Legacy, which is the sequel to Alwa's Awakening. Both of these are very true-to-form "8-bit" and "16-bit" platformers that I enjoyed and would recommend for genre fans, though I did not try to 100% them. The graphics are the highlight and I thought it was very cute how these could easily have been a pair of games from the NES and SNES. The good old days. And speaking of good-old days, I am now playing Katamari Damacy, which I had played at a friend's house many years ago, and always wanted to spend more time with. It totally holds up (aside from stuff like: You have to play through the tutorial and first level before you can access the menus at all, like to make the game fullscreen?) and it's honestly inspiring how unhinged the game design and writing are, and how fun it manages to be. What an accomplishment!




al

Of all homonymic months, August is the most majestic

I’m traveling for the long weekend. Either I’m having bad luck with the epic heat waves or there have been a lot of epic heat waves, because again the short road trip threatens to be tyrannized by the hot air. It did at least touch 100°F this time, so at least it is a proper respectable heat wave. We are in a place called Hocking Hills, whose AirBnB has these OBX-style stickers that say “HHO”, which could either be confusingly “Hills, HOcking,” or perhaps “Hocking Hills, Ohio”, but not “Hocking hills OHio” as one might expect. I plan to stick the sticker upside-down for “OHH”, as in “Ohh yeah, I need to write a post on Tom 7 Radar for the month of August, and I need to do it on this mediocre wi-fi which Google Internet Speed Test describes as ‘fine’ while everyone else drinks beers outside.” Fair enough: This is a self-imposed curse and one that’s easily tended to at any time during the month.

During the month: I worked again on making my own video codec, which is a very bad way to spend one’s time, but I don’t think there are any modern lossless codecs that would be suitable for my use case. And I do like a data compression project because of the inherent benchmarkability. The use case is for the increasingly common situation where I have a program generating a series of video frames (e.g. BoVeX is making an animation), which I usually do by writing a sequence of PNG files to disk. I’m way ahead of PNG files so far even without doing any inter-frame stuff, which is not impressive, but does make me feel like it’s at least not totally pointless. (Still, it’s quite pointless: Sure I can make these files smaller at significant cost of complexity and encoding times, but these animations typically use space similar to like one second of 4K 60fps XF-AVC footage.)

Sometimes programming your own lossless video codec is a bit too fast-paced so you need to write a Wikipedia article from scratch about Clairton Coke Works by digging through newspaper archives. I haven't even gotten to the last 30 years of its history yet! I also rounded out the Cyrillic in FixederSys though I don't think I've uploaded a new version of that yet. As usual I did some hacking on secret projects.

UHH, elsewise, I did finish off Animal Well which I liked very much. My spoilerless advice to you is: Don't try to 100% this game without at least looking at a spoiler-controlled guide! But I did have fun once I felt like I was stuck-ish finishing the remaining postgame puzzles. I have also been playing Chippy, a bullet-hell twin-stick shooter that is quite hard (I usually feel good at this genre) and has several new good ideas in it. It's essentially all boss fights, and the chief innovation is that you fight the giant bosses by disconnecting pieces of them. I'm on the last boss so I will probably finish that one soon. As I have confessed many times, I like dumb first-person shooter games, and I played through Trepang 2 this month as well. It does have a few moments, but it was mostly pretty dumb, like I wanted. And then I started Touhou Luna Nights, which is a "Metroidvania" fan-game with great pixel art and music.

OK, I should get back to this vacation!




al

This halloween I am dressed as a withered husk, who was made this way by: Satisfactory 1.0

OMG. I can't believe October is over already. I blame Satisfactory which, okay, I do get it now, and it did destroy my body and mind. I am inches from being done now; I just want to make sure that I finish it with enough force that I do actually put it away, as I could imagine tinkering with my saddest factory forever.

The game isn't without flaw, but I think most of those flaws are not interesting to talk about. I do have one petty but important criticism, which is mildly spoilerful and anyway will only be interesting if you played the game. There is an object called the Somersloop ("cool S") which allows you to double the output of a machine. Canonically this item is some kind of "loop" and the flavor text talks about how it is able to create more energy than you put into it. So when I'm out hunting for Korok seeds I have this thought that maybe I could create a loop of factories whereby it would create infinite resources by repeatedly doubling. And I'm thinking about it but the crafting tree doesn't have any notable loops in it, but I remember the "packager" which allows you to put a fluid in a container or the converse, and I'm like: Yes, that's great! So I get back to base and I am doing this, just for fun to create an infinite fuel factory or whatever, and I realize that the packager just doesn't have a slot for a Somersloop. They must just hate fun, elegant twists. It would not break the game to allow this (you can always get infinite resources lots of other ways) or cause any other problem I can think of. Hmph!

The thing about constructing a factory and watching it churn is that it's basically the same thing as a programming project that you invented for yourself, and it's probably better to do the programming project. Here's progress on my mysterious rectangle:


Minusweeper 2


It's good progress if I do say so myself! Anything but black here is a Satisfactory result, which is 90.55% of them at this point. I may need heavy machinery for the remaining 9.45%, but that is part of the fun.

I think that's really it for this month! Please vote in the US Elections if you can (but I guess also vote in any important elections. And obviously, vote for the good guys???). And happy Halloween!




al

Suppressio Veri, Suggestio Falsi

In the aftermath of the appalling murder of an MP some commentators are looking at the occasionally poisonous comments made about politicians. The received wisdom of the public is that politicians are dishonest, but that is almost invariably a misreading. If MPs and others had to answer every question frankly, life would be impossible. Most of the usual questions would have to be answered with "I don't know" or "well, I hope that A happens but it might well be B for all I know." The Paxman figure would then rip the interviewee to shreds. So let's give them a break shall we?




al

Enough, Already!

This is not a political blog, although politics inevitably creep in to discussions of matters legal. I have followed politics since I was at school, although I was never elected to anything. The current situation beggars belief, and I imagine that today's crop of journalists will shake their heads in their old age, and say "but you should have been there in the summer of 2016; everything seemed to happen at once. " I am now even more convinced that my belief in the iron Law of Unintended consequences is the right one.

I have had to cut back on my sittings of late, as I am awaiting an operation to give me a new knee joint, and although I can get around in the courthouse it isn't always easy. As I am due to retire from the Bench in late October I have excused myself from getting to grips with some of the more complex innovations that have recently been introduced, such as iPads on the bench. I own a couple of iPads and I am comfortable with using them, but inevitably any government-issued software is over-engineered and the last thing from user-friendly.

My court has a few boxes that contain the iPads as well as charging them overnight, but those JPs who wish to use them have to submit to training as well as an elaborate procedure to keep them secure. It is worse for judges of course, but then they are paid £130k and more to cope.

Given my impending retirement, I cannot summon up the enthusiasm to get stuck in to this 21st century stuff  (albeit the technology is a decade old).

I am trying to avoid becoming what old Army types call demob-happy so I shall concentrate on justice before bureaucracy.






al

Money, Money, Money (or private affluence and public squalor)

I sat in my crumbling courthouse a couple of months ago, having edged past the permanently-stuck gate on the justices' car park, and made my way up the nearly-new lift to the assembly room. It is a handsome room, built in 1907 but has sadly not seen a lick of paint in the last decade-and-a-half and more.

Everywhere are signs of decay and neglect - but no matter. I understand the desperate need for the government to bring expenditure under control, even if that means denying resources to the public service that I have served unpaid these thirty years. There are still biscuits (amazingly) and most of the lights come on when you press a switch. There is some mysterious  kit that we think might be for use in the new all-electronic courthouse. It still bears the protective film that we see on expensive audio visual stuff to protect it on its long journey from a Chinese sweatshop.

I have recently received an email from  www.gov.uk/annual-tax-summary setting out the tax that I paid in the last fiscal year setting out the tax that I paid (direct tax only, so forget the taxes on consumption such as liquor duties and Council Tax (fifty quid a week on my modest Thames Valley bungalow).

Much more interesting is the breakdown of where it went, revealing how little our fellow citizens know of what is done with the country's collective cash.

Not that much goes on the justice system.




al

Gillings finishes sixth in Italy

British number one Zoe Gillings finishes sixth at the penultimate round of the boarder-cross World Cup in Valmalenco.




al

GB ice hockey get financial boost

Great Britain's men's ice hockey team receives a grant from the IOC to help in its bid to qualify for the 2014 Winter Olympics




al

Mississippi Book Festival

Last weekend I had the pleasure of being a panelist at the first annual Mississippi Book Festival at the State Capitol in Jackson, Mississippi!


For me, the weekend started with the plane flight out on Friday and a lovely reception that evening at the Eudora Welty House. Representatives of the Eudora Welty Foundation were on hand to provide tours and answer any and all questions about Jackson's favorite daughter.  It was a great chance to talk to the organizers and volunteers, as well as other authors.

The next morning was breakfast at the Winter Archives Building, where the staff gave us a tour and showed us the forthcoming Museum of Civil Rights and Mississippi History Museum.

Then we were off to opening ceremonies, where the Jackson State University Marching Band performed on the Capitol steps, and then the panels!  The Harper Lee Reconsidered panel, held in the old Supreme Court chamber, was lively and fascinating (and also covered by C-SPAN).  I wasn't able to make it to the picture books panel due to the long line, but hear it went well, and I'd had the chance to talk with the presenters the night before :-).

My panel was the Young Readers panel, and featured moderator Margaret McMullan, and panelists Kimberly Willis Holt, Taylor Kitchings, Deborah Wiles, Carolyn Brown, and Cassie Beasley.  Margaret did a great job as moderator and kept the conversation going and on track. :-).

Many thanks to all the organizers, volunteers, sponsors, and attendees for making the event such a success!

Altogether, it was a fantastic event, with standing-room-only crowds and a terrific venue!  Here's a report on the festival from the Clarion-Ledger: Book Festival Attendance Outpaces Projections.

And here are some pics from out and about festival weekend:

My duffel bag leaves the jetway in Houston
Art deco Greyhound Station, downtown Jackson
Kerry Madden, Susan Eaddy, Hester Bass, Chris Barton in the Eudora Welty House Garden

Deborah Wiles, Kerry Madden on the Eudora Welty House lawn
In front of the Eudora Welty House
MS State Capitol
Kerry Madden, Kimberly Willis Holt
W. Ralph Eubanks, Margaret McMullan
Jackson State University Marching Band

View from the Capitol steps
Capitol interior and dome
Dome in House of Representative Chamber
Dome of Senate Chamber
Mayflower Cafe
Kimberly, Taylor, Deborah, Margaret, Me, Cassie, Carolyn




al

Pizza a Day Diet: Maggiano's Little Italy

Today's Pizza a Day Diet pizza is technically not a pizza.  It's a flatbread. NB: All pizzas are flatbreads but not all flatbreads are pizzas (A flatbread has an unleavened crust).

I happened to be up north during rush hour so I decided to find the closest Italian place and see what they had that resembled a pizza. :-). This happened to be the Maggiano's in the Domain.  The place has sort of a Disney-fied feel of a downtown Italian restaurant, which is not surprising since the first Maggiano's was founded in Chicago by the Lettuce Entertain You chain whose specialty is theme restaurants. 

Anyway, I took a table in the bar and ordered a Caesar salad and the sausage flatbread.  The sausage was removed from the casing but still distributed in large chunks and had that good Italian-sausage flavor.  The cheese was also abundant and flavorful.  And the crust? Nice and crispy at first and then steamed through. 

Here are a couple pics:







  • pizza a day
  • Pizza a Day Diet

al

Lone Star Book Festival!

This past weekend, I had the pleasure of being one of the authors at the inaugural Lone Star Book Festival in Kingwood, Texas (just outside Houston)!

Here are some pics:

Edward Carey, Emma Virjan, Jennifer Ziegler, Bethany Hegedus, Carmen Oliver, and me
Carmen Oliver presents BEARS MAKE THE BEST READING BUDDIES
Jennifer Ziegler and Jo Whittemore discuss encouraging reading
I present CHRONAL ENGINE and BORROWED TIME
 Thanks to all the organizers, sponsors, and attendees! It's on its way to becoming a grand, annual tradition!




al

Austin Distance Challenge!

The famous Distance Challenge fridge magnets
It's been a few months, but I finally have some time to sit down and blog my having completed the Austin Distance Challenge (long course), sponsored by the Austin Runners Club.  I'd done most of the events before, but decided to do the challenge itself (six races, culminating in the Austin Marathon), because I wanted to put more structure into my training for the marathon. I'd done several in the 90s, but this was my second of the century and I wanted to do better than my last one (2013).

The first race was the Run Free Texas 80s 8k (for those who don't think in metric, that's about five miles) up in Cedar Park.  Naturally enough, there were a couple of DeLoreans, each outfitted with a flux capacitor.  Time travel being what it is, they were obviously the same car but from different time periods. :-).  The course was through residential neighborhoods and parks and had some rolling hills -- nice for a beginning of the season race.

Back to the Future!
The second race of the Challenge was the Run for the Water Ten Miler.  The course was along Lady Bird Lake and up through Tarrytown and then back downtown, There were some great hills on this course and let me know I needed more hill work...And, ironically enough, it was raining. :-)
Rain and hills
Race three was the Decker Challenge, a half marathon in early December with a course around Decker Lake.  It's notorious for hills and really bad weather.  (The last time I ran it, it was in the 40s and pouring rain).  If anything, last year, it was a bit too warm.  The hills were pretty brutal, though. 
My face when attacking the hills
But Santa was there!
After that, we had a month break until the Rogue Distance Festival 30k (about 18.6 miles) in early January.  This one was fairly cold and probably my least favorite of the events.  It was up in Cedar Park again and ran through residential neighborhoods which was fine.  There was an issue with marking the course, though, so most of us got off track, which meant the mile markers were out of order so it was impossible to figure out a pace. (I think at some point, we were going in circles -- and ended up going about a mile farther than we should've.).  Still, it was my longest run before the marathon and I was kind of glad it happened that way. 
Yay!  I'm done! :-)
With four events done, it was all downhill from there.  Literally.  The 3M Half Marathon starts up in the Great Hills area and runs a straight line down to downtown. It also has a swag bag filled with useful (and not so useful) 3M products.:-)
Leo checks out the swag bag
This one also started out pretty cold and way too early :-). 

Before dawn, in the warm car before the cold race.
I really enjoyed this one, though, and it was a nice preview of many of the neighborhoods on the marathon route.
Finisher!
The piece de resistance, of course, was the Austin Marathon in mid-February.  I like the course, but the first time I ran the Austin Marathon, it was all downhill, starting up north and snaking its way downtown.  Now, there's a good bit of uphill until around mile 18.  I still like the course, though, and it's not like the hills from the Decker Challenge or the Run for the Water races.

I was pretty happy with my time -- my second fastest of the century!  I did it in under 4 hours, which had been my goal.  Next year, I'll work more on speed, but this time, I just wanted to not have my quads seize up in the last two miles :-).

Running through UT campus
Made it! Best time of the century!
Anyway, thanks to everyone involved in putting on the races and the challenge itself: organizers, volunteers, emergency personnel, and all the rest!  You keep Austin running!




al

Capital of Texas Triathlon Preview

Monday I'm going to be running in the 25th Capital of Texas Triathlon!  It's my first triathlon (Olympic distance) in twenty years and I'm pretty jazzed.

Steely-eyed determination 20 years ago. :-)

One of the great things about triathlons (and running races in general) is that you get to occupy unusual spaces: the last ones I did were Leon's Triathlon in Hammond, Indiana, a couple of Bud Light triathlons and others in Chicago. Leon's had a swim in Wolf Lake (shudder), followed by a cycle leg on an elevated highway that ran past the old U.S. Steel plant, and a run leg through an industrial downtown.  The Chicago ones were on the lakefront, just north of Navy Pier, with a bike on Lake Shore Drive and a run along the lake.

2013 CapTexTri
The CapTexTri also has a great location in downtown Austin, with a 1.5k swim in Lady Bird Lake; a 40k (24.8 mile) bike on a quadruple loop through downtown Austin, including Congress Avenue and Cesar Chavez; and a 10k (6.2 mile) run through Zilker Park.

The only thing I'm not too keen on is the bike route, since it requires you to do the same loop four times with a bunch of corresponding hairpin turns.  I don't like loop routes because I always think of how many more times I have to do the thing...Still, going up and down Congress Avenue without any cars is going to be pretty cool. As long as there are no poles in the middle of the road, I should be okay. :-).

Don't ask.

I feel fairly good about my training.  I've maintained good running mileage after the Austin Marathon and Austin Distance Festival and got some good workouts in even while traveling doing school visits.
On Stone Arch Bridge in Minneapolis
The swim is probably my weakest event -- I could stand to do more work on technique and probably do more open water swimming, but the distance won't be an issue.  Also, Lady Bird Lake isn't going to have waves (I seem to recall a couple of triathlons in Chicago with 3-4 foot waves on Lake Michigan (and this was on the near side of the breakwater).  Also, I won't have to deal with a wet suit.  My biggest concern is to not get kicked in the face. :-).
Lady Bird Lake during 2013 CapTexTri
The bike I'm feeling good about as well.  I'll be using the bike I used for my triathlons back in the day - a Trek 1000 I bought when I was in grad school for $450 (a guy at one bicycle shop here tried to sell me a new one, asking if I had a "nostalgic attachment" to it.). I do, but I also don't think a new bike is going to drastically transform my performance.  At least not $2000 worth :-). (A guy at another bike shop told me the Trek 1000 was his first road bike and he wished he still had it.  It's possible he was being kind :-)).

Tomorrow is packet pick-up, bike drop-off, and a chance to scope out the transition area, which I'll need because I can't see without my glasses...:-)

Oh, well.  Qapla!















al

Capital of Texas Triathlon/Duathlon/10K/5K

So my plan to do my first triathlon in twenty years on Monday didn't turn out so well.

It rained.

A lot. But not so much in town.

At Camp Mabry, just north of central Austin, we got less than an inch of rain last Thursday. At Bergstrom Airport, just south and east of downtown, they got about nine inches.  And it was much worse farther east, along the Colorado River (which also runs through Austin).

On Friday and Saturday, it rained in the Hill Country.  West of Austin.  Upriver.

On Sunday, there was the CapTexTri expo and packet pickup and bike dropoff.

Swag!  My first cowboy hat since I was around seven.
Bike drop off.  I got there early.
Packet pickup
Coveting my neighbor's bike, Part I.
It was clear and sunny.  But because of all the rain, the LCRA opened at least one floodgate from the Tom Miller Dam, releasing water into Lady Bird Lake.  Which was where the swim portion of the CapTexTri was supposed to take place.

At the course talk at the expo, they announced that there was a flow of about 3 mph and they were considering changing the course so that it ran point to point (downriver).
Course talk.  Could've used a projector.


Later that day, they announced the swim was canceled.  Which was disappointing, but I've weathered a couple of triathlons in Chicago where that had happened and one when it probably should've.

Monday, race day, I awoke at 5 AM, fed the cats, ate breakfast and drank coffee, and then I heard rain.  Lots of rain.

Nevertheless (discovering, to my chagrin, that I am apparently an optimist), I headed out.  When I arrived at the transition area, I was told it was closed, and that we should shelter at Palmer Events Center or its garage.  This was around 6-620.

In the garage and on the deck of the Palmer Events Center, folks seemed to take things in stride and with humor.  Some people were concerned about hairpin turns on a wet course, but were generally willing to take it slow.
Sheltering in the garage

We heard a tentative plan to cut short the bike portion to 20k, but the rain and lightning continued. Finally, at around 830, race officials called off the bike portion entirely because of flooding on the course. 
Still a bit lightning-y
They announced that Olympic distance participants could do a 10k, while sprint participants could do a 5k and that start time would be at 10 am. Most folks removed their bikes and went home or back to their hotels. There was some grumbling -- last year the event had been cut short due to flooding, as well, and I gather there had been similar problems in 2014, too.
Athletes clearing out the transition area
 
I took my bike back to my car, but decided that I'd gotten up at five that morning to run a race and so, I was going to do one.  Besides, I didn't want to waste all those carbs I'd eaten in the past few days. :-).

At ten o'clock, the rain pretty much stopped.  And then we were off!  By 10:15, the sun came out.  No, really. 
Everyone who's still there seems in good humor :-)
And we're off!


Turned out, there were only about 200 of us who stuck around for the 10k, with another 150 for the 5k (out of around 3000 original participants), but everyone seemed to be having a good time.  I was pretty happy with my race -- I'm not sure it was exactly 10k, but I still did one of my better overall times and paces. At least this century :-).
The view from the Biergarten.  Note the utter absence of rain.
Sunny skies.
On the whole, it was a bit surreal but fun, although in the moment sometimes frustrating.  And, in retrospect, kind of funny.  I think the organizers did a good job under trying conditions and kept us pretty well informed via social media.  So, thanks (And I am really glad I wasn't in charge :-)).  Thanks also to all the volunteers who stuck around to the bitter end.

 Oh, and I actually ended up getting a bit of a tan.

Coveting my neighbor's bike, Part II
Epilogue: Late Monday, the Austin Fire Department closed Lady Bird Lake and Lake Austin to all boat traffic.

And they're giving us a discount for the 2017 race. :-).

Here's what the lake looked like Tuesday morning (Normally, there is no current at all):

















 




al

Austin Distance Challenge 2016-17

 
This past year, I signed up for the Austin Distance Challenge again, because it was intrinsically fun, but also to ensure that I would get enough running in for the Austin Marathon. The Distance Challenge, sponsored by the Austin Runners Club, involved five races: The Run Free 8k, the Run for the Water 10 miler, the Decker Challenge half marathon, the 3M Half Marathon, and the Austin Marathon.

The Run Free 8K is out in Cedar Park, a considerable distance from downtown.  It leaves from one of the high school football stadiums and winds through residential neighborhoods before returning to the starting line. It's a nice start to the fall training season.


The first piece of the puzzle
Run for the Water goes through downtown and along the lakefront. It's one of the prettiest routes in the challenge and much of it is along routes I train on.

Starting line on Cesar Chavez
The drum group at the finish line
A friend got this shot of me at the starting line.
After that came the Decker Challenge -- a hilly route just east of Austin in Decker, and notorious for terrible weather.  This year, it wasn't bad --- a bit misty with a steady drizzle. By the finish line, my glasses were so fogged up I had to take them off to see anything at all. Which made it difficult to see things like potholes...

Glasses fogging up as I climb the hills
Blindly crossing the finish line

 Not on the Challenge, but still an Austin staple was the Turkey Trot!  One of the more fun races, it usually features a good number of costumes and a large helping of whimsy.



After the holidays, the next race was the 3M Half Marathon. It's almost the exact opposite to the Decker Challenge, because it's all downhill. It starts up in the Great Hills area and winds its way downtown. This year it was a particularly fast run because there was an incredible wind out of the north. Several folks, including myself, were nearly blown over as we ran past the UT football stadium.

A selfie at the starting line
the 3M photographer got a shot of me taking my selfie
After the finish in sight of the Capitol

And the last race was the Austin Marathon!

But. About three weeks before the race, in the middle of the night, I slipped and came down on the edge of my entertainment console and tile floors. Result? A nice set of bruised ribs and a strangely linear scar on my right side.

By race day, I could still feel it a bit but had gone on short runs with only minor discomfort, so I decided to go for it.  The first half went pretty well, but the second was less pleasant.  But I'm still glad I did it...

Looking all chipper and optimistic before the race starts
Vulcan salute for the photographer
Gritting it out with a hundred yards to go
Finished!

So my time for the marathon ended up being a personal worst, although I did make it under five hours :-).

Anyway, thanks to all the organizers, volunteers, emergency personnel, and everyone else involved in putting on these races! You keep Austin running!

Next up? The Capital of Texas Triathlon! Hopefully there won't be rain...




al

Texas Ironman 70.3 (Galveston)!


I just completed my second Ironman 70.3 ("half-Ironman") in Galveston, Texas!

It was different, but not too different than the first. In some ways it was more challenging than Austin, although I did manage to eke out a personal best, so I count myself pleased, although I've identified several areas where I can improve :-).


The Galveston site presented a couple more difficulties than the Austin one, viz., transportation of people and bicycles, as well as housing therefor.  The race site was at Moody Gardens, which has its own resort hotel, which we might have done if we had planned on going on Friday and staying until Monday.  Ultimately, we decided to drive down the morning before the race with our bikes, rent a house via Airbnb, and drive back the evening of the race.

Leaving Austin at 7 AM...
With two bikes on the back, three people (and one bike) in the car, and all our gear, we were pretty packed, but the drive only took about three and a half hours, even accounting for coffee breaks.

We drove directly to Moody Gardens to pick up our race packets and drop off our bikes.  The first thing we discovered when we arrived was that it was cold and rainy and the swim venue (Offats Bayou) was a bit choppy...

Under the triumphal arch the day before the race...
Registration/packet pickup was in a big white tent overlooking the bayou (the same big white tent Moody Gardens had used for a cool dinosaur thing a couple years back).

The white tent with dinosaurs five years ago...
The pickup and registration and dropoff were strangely inefficient: You wait in line at a first table to show your ID and USA Triathlon membership; then you go to a second table to pick up your waiver and other forms. Next, you go to a third table to fill in and sign your waiver and forms, and go to a fourth table to drop off your signed waiver and forms. Thereafter, you go to a fifth table to pick up your wristband and swim cap and bike and helmet stickers; go to a sixth table to pick up your backpack/goodie bag and T-shirt; and finally, go to a seventh table to pick up your timing chip.

Then you exit via the Ironman store and vendor village where you can wait in line to buy stuff.


Inside the big white tent
The course talk was outside and the rain had died down enough so that it wasn't all that unpleasant. Behind us was the paddlewheeler Colonel and a whole lot of choppy water with whitecaps. We were assured that the weather could be better the next day, however. No rain and significantly less wind, although there would be a headwind on the return portion of the bike route.

The paddlewheeler Colonel.
The swim course, with the finish right by the paddlehweeler
The Airbnb was a nice little three-bedroom cottage about five miles from the event site and across from a large cemetery.  It had a complete kitchen that would come in useful later that night when we couldn't get into any of the nearby Italian restaurants without reservations.


The house we rented
Cemetery across street.

Making spaghetti dinner
That evening, we gathered all of our gear and made dinner and looked forward to the race. I went for a three mile run around the nieghborhood to loosen up a bit, and then we made dinner.

I managed to get around five or six hours of sleep and only hit the snooze button once when the alarm went off at 4:30 in the morning. After a couple cups of coffee, a banana, and a bagel, we were off!

The temperature felt good: low fifties, not too much of a breeze. I decided I didn't need gloves, but would take along my arm warmers for the bike just in case. We arrived at Moody Gardens a little after six and discovered we had had to park about a fifteen minute walk from the actual transition area.  A remarkably long line greeted us to enter transition (for body marking), but since we had already done so, we were able to get in with only a brief wait and some judicious weaving through the crowd.

Testing out the wetsuit when I first got it.
There was then the ritual of putting on the wetsuit and pumping the bike tires and then transition closed! (We might have cut the timing a little close).

We then made our way separately to the swim start: they did a wave start by age group. You jump off the pier (see above map), hang around in the water for a couple minutes, and then swim like the wind when you hear the starter's horn.

The water was a nice 72 degrees, about twenty degrees warmer than the outside temperature. The water felt good, although it took a few minutes to get used to the waves and occasional mouthful of salt water. I felt pretty good, though, and noticed myself passing a lot of people.  More importantly, I managed to beat my swim time from last fall's Austin Ironman 70.3.


 Once I was out of the water, the wetsuit strippers were efficient and I had no problem getting to my bike (even without my glasses), stowing my wetsuit and taking off. Because it was relatively warm, I decided not to bother with my sleeves, and I wouldn't have worn gloves even if I had brought them.

The first half of the bike portion was glorious. The temperature was perfect and I had no problems staying in aero position almost the whole way.  Unfortunately, at the turnaround, I was made to realize just how much of a tailwind I had been benefitting from. The rest of the ride felt like I was pulling a mobile home...

Grimacing with miles to go...

Also about that time, the temperature dropped by about ten degrees, and it started to rain. And then my back started to hurt from being in aero position for so long.  In short, the ride back was completely miserable...But I managed to break three hours, which had been my goal.

In addition to the lower back pain, I got a pain between my shoulders, and every time I tried to stand up in the pedals to stretch, my legs felt like they wanted to cramp up.  And my hands were so cold I could barely move them to squeeze my water bottles.

Trying to squeeze out the last drop from my water bottle.

By the time I got back to transition, my hands were so numb that I couldn't operate the clip on my helmet. Putting on my shoes and tying my laces was equally an ordeal. It didn't help that my legs and abs kept cramping up when I bent to tie the laces.  After a ridiculously long transition, I made it onto the run course and my watch died.


But my legs felt good and I enjoyed the run a lot more than I thought I was going to on the return bike. :-). My pacing was a bit off and I came in somewhat slower than I would've liked, but it still felt pretty good.

Victory!
Overall, I came in a couple minutes better than the Austin Ironman 70.3, which I'm pleased with (although I think my run could've gone better).

Mugging with the finisher's medal

Using the R8 recovery roller thing...
All in all, it was a great experience and I'd definitely do the race again. A big thanks to all the organizers, volunteers, sponsors, and first responders who made the event a success!










al

U.S. Senate advances their FY 2025 budget proposal for NASA amid deep cuts

An analysis of the U.S. Senate's FY 2025 budget request for NASA.




al

NASA discovers Mars rock with ancient potential for life

A single 3.5 billion-year-old rock shows signs of all the conditions life needs to thrive.




al

A billion dollars short: A progress report on the Planetary Decadal Survey

NASA is underfunding planetary exploration relative to recommendations made by the National Academies Decadal Survey report, resulting in mission delays and cancelations.




al

Why the “habitable zone” doesn’t always mean habitable

The habitable zone is a useful concept in astrobiology, but it can sometimes paint an over-simplified picture of planetary habitability.




al

Extraterrestrial artifacts

Could the Solar System host traces of other intelligent life?




al

Earthlings as aliens

Looking at life on Earth from another perspective.




al

Someone’s aliens

Life thrives on Earth, and we even send evidence of our presence out into the Solar System. Is anyone out there looking for us?




al

Why Taylor-Serrano deserves top billing over Tyson-Paul carnival

How the inclusion of Katie Taylor v Amanda Serrano on the bill legitimises the carnival of Mike Tyson v Jake Paul in Texas




al

Glenmorangie A Tale of Ice Cream Single Malt Scotch Whisky




al

Brabus 1000 All Gray Sedan




al

Actually magical.

Milkweed fluff and magic gold mica — love how these bookends came out. They actually are magical. ????. In the shop!




al

Signed and personalized at request!

We just made the decision to ship the remaining copies of Feast to us. There are about 800 left, out of the original 2000 copy print run. Which is a lot of copies, but given that we were originally scheduled to launch March 2020, and had to cancel an entire summer’s worth of scheduled bookstore […]




al

Dwarf King in the shield wall

A Dwarf king and his elite guard take to the field.

 Amongst the Eagle helms of the shield wall is the kings champion himself. Nothing must get to the king and the champions blue axe, will see that nothing does.

I could use this base for King Balin when he tries to retake Moria. A future project of mine.
The King points out floors in the enemies formation to the chief engineer.
The Dragon standard flies over head echoing the Kings mighty dragon helm.
This base has been created for the upcoming Hobbit battle, replacing Dain's base in the ranks. This allows Dain to roam freely as a character on the field.

 The figures are beautiful old sculpts from Asgard and Citadel. There has been a bit of tweaking on a couple of them, like the axe and the standard.



  • lord Of The Rings
  • lord Of The Rings.

al

Stones, Shrines and Alters of Erin


Here are the finished standing stones from Alternative Armies amongst others.
I've added a few extra skulls to the base once flocked.
A bear hide has been left as an offering too.

Battle shine, again extra weapons have been added to the base. The rocks form a sacred circle in which to knee and offer your items.

Paper ferns were added to this base. I'm not sure how they will last as they are fragile. Being hard up against the stone will help them.
This place must be strong in fey magic because flowers have sprung up around the stones. Flowers are a nice way to show the affinity of a place. Flowers equal a nice holy area, where dead and dying grass says the opposite.


The great fertility rock with it's comfy furs to lie on. I wanted to give this the impression of a giant lady in a fur cloak. The cloak is made from moss and ivy.
Ancient pillar, I added some ivy to this to weather it in. Also putting flock to act as moss up one side helped to age it. Moss normally grows on the north side of trees, so I added this trick to a lot of the stones.



This is a miniature from Reaper Bones, I think it's called 'Evil tower'. I thought it would make a good Fomorian piece or maybe something older and darker. What ever it is, it has been thrust up from the ground and killed the surrounding grass. It must be cursed...


Ivy again helps weather these small stones. This isn't a bad place as flowers grow around the mound, new life from old.

I've rediscovered Celtos as a figure range that might be useful for this growing project.


 


It's time to dig out the old stones and compare them. A lot of these previous models had a greenstuff carving in them.







The two weapon shrines. One is a place of worship, the other, sacrifices.


The two stones of the dead. These could be used for any undead project.






Recently I thought about making more of an effort to photograph my miniatures. I have seen other people use backdrops and so thought I'd play around with the idea. By using a photo from a book as a background, the results can be quite different. Rather than a cluttered work table full of detail taking away from an image, the background actual enhances and compliments it. This simple book set up has really improved these stone pictures and it's something I'll do again for sure.




al

Fomorian Coastal Scenery

Here are some rock pools to add to a coastal game mat. I've added some kelp seaweed to make them a bit more North sea.







There are also a couple of other prints that I plan to use as Fomorian shrines. Places where they honour their dead and stack weapons and armour in tribute.
To save on the greenstuff, I switched to Milliput as it's cheaper for bigger pieces. 

I'll add some more skulls and weapons etc to these bases.
Update: So the Fomorians crawled out of the icy North sea in the night and adorned the pools with their burial goods.
Fomorian skulls and weapons now litter the swallow pools, soon to be covered by the rising tide.


Barnacles were just grit stuck with PVA glue. After the glue was dry I gave the grit another wash of the glue. This should make it stand up to a good dry brushing.
One of the new swirly shields gets placed in the pool. I gave the water a coat of PVA glue just to get rid of the 3D printing texture.
I will add a little more seaweed now the skulls are in.

Update: These models were sprayed black then dry brushed with grey and white. Contrast colours were then painted over the highlighted pools.



To make them look a bit more aquatic and fantasy, I included colours like blue and purple into the palette.



Here we can see a highlighted model before the Contrast paint washes.








Update: started to pick out the barnacles and shields etc.









al

Halfords Mat Lacquer

I thought I'd give this a go as I had heard good things about it. I thought the scenic rock pools would be the perfect test subject, as if they dried glossy it wouldn't matter.
The results were good. I sprayed the models after I had added some flock, I thought the lacquer would help seal it.
After the scenic pieces I thought I'd try it on the new Irish figures. I consider this a tough, hard coat. Another layer of super mat varnish will be added with a brush when this first coat is dry.
The rock pools got a layer of flock really nail the realistic look.

 The flock and paint work is all sprayed with the new lacquer, seems to be a winner.




al

Joe Marshall: Lisp vs. golang

It's no secret that I'm an aficionado of Lisp. It's my go to language, especially when I don't know what I'm doing. I call it research and prototyping, but it's really just playing around until something works.

We had a need for some auditing of some of our databases at work. They ought to agree with each other and with what GitHub and CircleCI think. It took a couple of weeks part time to prototype a solution in Common Lisp. It showed that the databases were in 99% agreement and found the few points of disagreement and anomalies that we ought to fix or look out for.

I want to integrate this information into a dashboard on one of our tools. I prototyped this by spinning up a Common Lisp microservice that returns the information in JSON format.

But management prefers that new services are written in golang. It would be easier for me to rewrite the service in golang than to try to persuade others to use Common Lisp. It also gives me the opportunity to compare the two languages head to head on a real world problem.

No, this is not a fair comparison. When I wrote the Lisp code I was exploring the problem space and prototyping. I'm much more experienced with Lisp than with golang. The golang version has the advantage that I know what I want to do and how to do it. In theory, I can just translate the Common Lisp code into golang. But then again, this is a “second system” which is not a prototype and has slightly larger scope and fuller requirements. So this cannot be a true head to head comparison.

The first point of comparison is macros (or lack thereof). I generally don't use a lot of macros in Common Lisp, but they come in handy when I do use them. One macro I wrote is called audit-step, which you can wrap around any expresion and it prints out a message before and after the expression is evaluated. The steps are numbered in sequence, and nested steps get nested numbers (like step 2.3.1). If you wrap the major function bodies with this macro, you get a nice trace of the call sequence in the log.

Golang doesn't have macros, but it has first class functions. It's easy enough to write a function that takes a function as an argument and wraps it to output the trace messages. In fact, the macro version in Common Lisp just rewrites the form into such a function call. But the macro version hides a level of indentation and a lambda. In golang, my major functions all start with

func MajorFunction (args) int {
        return AuditStep("MajorFunction", "aux message", func() int {
                // body of MajorFunction
                // Actual code goes here.
        })    
}

The bodies of all my major functions are indented by 16 spaces, which is a little much.

I like higher order functions. I can write one higher order function and parameterize it with functions that handle the specific cases. In my auditing code, one such workhorse function is called collate. It takes a list of objects and creates a table that maps values to all objects in the list that contain that value. To give an example, imaging you have a list of objects that all have a field called foo. The foo field is a string. The collate function can return a table that maps strings to all objects that have that string in the foo field.

collate is very general. It takes a list of objects and four keyword arguments. The :key argument is a function that extracts the value to collate on. The :test argument is a function that compares two keys (it defaults to eql if not specified). The :merger argument is a function to add the mapped object to its appropriate collection in the table (it defaults to adjoin). The :default argument specifies the initial value of a collection in the table (it defaults to nil).

The :merger function is the most interesting. It takes the key and the object and the current value of the table at that key. It returns the new value of the table at that key. The default merger function is adjoin, which adds the object to the collection at the key if it is not already there. But you can specify a different merger function. For example, if you want to count the number of objects at each key, you can specify a merger function that increments a counter.

The functional arguments to the collate function are often the results of other higher order functions. For example, the :key argument is often the result of composing selector functions. The :merger argument is often the result of composing a binary merge function with a unary transformer function. The transformer function is often the result of composing a number of primitive selectors and transformers.

In Common Lisp, it is quite easy to write these higher order functions. We can compose two unary functions with the compose2 function:

(defun compose2 (f g)
  (lambda (x) (funcall f (funcall g x)))

and then compose as many functions as we like by fold-left of compose2 starting with the identity function:

(defun compose (&rest fs)
  (fold-left #'compose2 #'identity fs))

We can compose a binary function with a unary function in three ways: we can pipe the output of the binary function into the unary function, or we can pipe the output of the unary function into one or the other of the inputs of the binary function.

(defun binary-compose-output (f g)
  (lambda (x y) (funcall f (funcall g x y))))

(defun binary-compose-left (f g)
  (lambda (x y) (funcall f (funcall g x) y)))

(defun binary-compose-right (f g)
  (lambda (x y) (funcall f x (funcall g y))))

The collate function can now assume that a lot of the work is done by the :key and :merger functions that are passed in. It simply builds a hash table and fills it:

(defun collate (item &key (key #'identity) (test #'eql) (merger (merge-adjoin #'eql)) (default nil))
  (let ((table (make-hash-table :test test)))
    (dolist (item items table)
      (let ((k (funcall key item)))
        (setf (gethash k table) (funcall merger (gethash k table default) item))))))

(defun merge-adjoin (test)
  (lambda (collection item)
    (adjoin item collection :test test)))

So suppose, for example, that we have a list of records. Each record is a three element list. The third element is a struct that contains a string. We want a table mapping strings to the two element lists you get when you strip out the struct. This is easily done with collate:

(collate records
  :key (compose #'get-string #'third)
  :test #'equal      ; or #'string= if you prefer
  :merger (binary-compose-right (merge-adjoin #'equal) #'butlast))

The audit code reads lists of records from the database and from GitHub and from CircleCI and uses collate to build hash tables we can use to quickly walk and validate the data.

Translating this into golang isn't quite so easy. Golang has first class function, true, but golang is a statically typed language. This causes two problems. First, the signature of the higher order functions includes the types of the arguments and the return value. This means you cannot just slap on the lambda symbol, you have to annotate each argument and the return value. This is far more verbose. Second, higher order functions map onto parameterized (generic) types. Generic type systems come with their own little constraint language so that the computer can figure out what concrete types can correctly match the generic types. This makes higher order functions fairly unweildy.

Consider compose2. The functions f and g each have an input and output type, but the output type of g is the input type of f so only three types are involved

func Compose2[T any, U any, V any](f func(U) V, g func(T) U) func(T) V {
	return func(x T) V {
		return f(g(x))
	}
}

If want to compose three functions, we can write this:

func Compose3[T any, U any, V any, W any](f func(V) W, g func(U) V, h func(T) U) func(T) W {
	return func(x T) W {
		return f(g(h(x)))
	}
}
The generic type specifiers take up as much space as the code itself.

I don't see a way to write an n-ary compose function. It would have to be dynamically parameterized by the intermediate types of all the functions it was composing.

For the collate function, we can write this:

func Collate[R any, K comparable, V any](
	list *Cons[R],
	keyfunc func(R) K,
	merger func(V, R) V,
	defaultValue V) map[K]V {
	answer := make(map[K]V)
	for list != nil {
		key := keyfunc(list.Car)
		probe, ok := answer[key]
		if !ok {
			probe = defaultValue
		}
		answer[key] = merger(probe, list.Car)
		list = list.Cdr
	}
	return answer
}

We have three types to parameterize over: the type of the list elements (i.e. the record type) R, the type of the key K, and the type of the value V. The key type is needs to be constrained to be a valid key in a map, so we use the comparable constraint. Now that we have the types, we can annotate the arguments and return value. The list we are collating is a list of R elements. The key function takes an R and returns a K. The merger takes an existing value of type V and the record of type R and returns a new value of type V.

The magic of type inference means that I do not have to annotate all the variables in the body of the function, but the compiler cannot read my mind and infer the types of the arguments and return value. Golang forces you to think about the types of arguments and return values at every step of the way. Yes, one should be aware of what types are being passed around, but it is a burden to have to formally specify them at every step. I could write the Common Lisp code without worrying too much about types. Of couse the types would have to be consistent at runtime, but I could write the code just by considering what was connected to what. In golang, the types are in your face at every function definition. You not only have to think about what is connected to what, you have to think about what sort of thing is passed through the connection.

I'm sure that many would argue that type safety is worth the trouble of annotation. I don't want to argue that it isn't. But the type system is cumbersome, awkward, and unweildy, especially when you are trying to write higher order functions.

It is taking me longer to write the golang version of the audit service than it did to write the Common Lisp version. There are several reasons. First, I am more experienced with Common Lisp than golang, so the right Common Lisp idioms just come to mind. I have to look up many of the golang idioms. Second, the golang code is trying to do more than the Common Lisp code. But third, golang itself introduces more friction than Common Lisp. Programs have to do more than express the algorithm, they have to satisfy the type system.

There are more points of comparison between the two languages. When I get frustrated enough, I'll probably write another post.




al

Joe Marshall: Don't Try to Program in Lisp

A comment on my previous post said,

The most difficult thing when coming to a different language is to leave the other language behind. The kind of friction experienced here is common when transliterating ideas from one language to another. Go (in this case) is telling you it just doesn't like to work like this.
Try writing simple Go, instead of reaching for Lisp idioms. Then find the ways that work for Go to express the concepts you find.

That's not at all how I approach programming.

A friend of mine once paid me a high compliment. He said, “Even your C code looks like Lisp.”

When I write code, I don't think in terms of the language I'm using, I think in terms of the problem I'm solving. I'm a mostly functional programmer, so I like to think in terms of functions and abstractions. I mostly reason about my code informally, but I draw upon the formal framework of Lambda Calculus. Lambda Calculus is a simple, but powerful (and universal) model of computation.

Programming therefore becomes a matter of expressing the solution to a problem with the syntax and idioms of the language I'm using. Lisp was inspired by Lambda Calculus, so there is little friction in expressing computations in Lisp. Lisp is extensible and customizable, so I can add new syntax and idioms as desired.

Other languages are less accommodating. Some computations are not easily expressable in the syntax of the language, or the semantics of the language are quirky and inconsistent. Essentially, every general purpose fourth generation programming language can be viewed as a poorly-specified, half-assed, incomplete, bug-ridden implementation of half of Common Lisp. The friction comes from working around the limitations of the language.




al

All Souls Night (Part 15 of 31)

.


 




 

CONTINUED TOMORROW.

 

Above: Every Autumn, I write a Halloween story, write it out on leaves (one word per leaf), photograph the leaves, and then leave them where.I found them. The story is then serialized, starting on October 1 and concluding on the 31st--All Souls Day.

 

*




al

One Week E-Book Sale of Vacuum Flowers!!! One Full Week!!!

.

 


Open Road Media, which publishes several of my e-books, has announced a one-week reduction in price of Vacuum Flowers. Starting this October 18 and running through October 25, 2024, it will be available for $1.99. That's in the US only.

So if you're an e-book reader and have been curious about my novel... well, there you are.


And if you don't already know . . .

Vacuum Flowers is what used to be called a Grand Tour of the Solar System. Rebel Elizabeth Mudlark is operating off of stolen wetware and on the run from very dangerous people. She arrives in the inner system on a cometary orbit, which takes her through a great variety of human and post-human societies, including the most dangerous one of all--Earth.

That bit about the cometary orbit is not incidental. Comets enter the Inner System on either a hyperbolic or a parabolic orbit. The one is open, the other closed. I knew that the book would end with Rebel Elizabeth Mudlark standing in the stardocks with a coffin at her feet. But I didn't know if the person within the coffin would be alive or dead or if REM would someday return to the Inner System or was leaving it forever. I only decided that when I came to write the last page.


*




al

All Souls Night (Part 16 of 31)

 .

 


 


 

CONTINUED TOMORROW.

 

Above: Every Autumn, I write a Halloween story, write it out on leaves (one word per leaf), photograph the leaves, and then leave them where.I found them. The story is then serialized, starting on October 1 and concluding on the 31st--All Souls Day.

 

*




al

All Souls Night (Part 17 of 31)

.


 

 

CONTINUED TOMORROW.

 

Above: Every Autumn, I write a Halloween story, write it out on leaves (one word per leaf), photograph the leaves, and then leave them where.I found them. The story is then serialized, starting on October 1 and concluding on the 31st--All Souls Day.

 

*




al

Halcyon Afternoon and Why I Wrote It

.




This is a particularly pleasant time for me. To begin with, I'm at the World Fantasy Convention, where I'll see a lot of old friends and serve as toastmaster. And I have two new Mongolian Wizard stories coming out (I apologize for the delay), one today and one tomorrow at Reactor Magazine.

Today's story, "Halcyon Afternoon," is atypical for the series. It's not as violent as these stories tend to be. That's because I felt that after undergoing so much suffering and loss, Franz-Karl Ritter deserved at least one afternoon of contentment and bliss. Even his wolf, Freki, got the day off.

Of course... Ritter's luck being what it is, and all of Europe being entangled in a wizard war, the afternoon would not prove entirely blissful.

You can read the story here. Or you can find the entire series of Mongolian Wizard stories--ten so far--here. Or you can simply go to Reactor Magazine and wander about happily. It's full of great stories and terrific non-fiction.

And tomorrow . . .

Ritter's luck takes a downturn--along with everyone else's--in "Dragons of Paris." An old friend pops up, a relationship turns difficult, and a battle where victory seems certain goes sour.

(And now, I'm off to the convention!)


Above: Illustration by Dave Palumbo. It's not only beautiful but true to the story. I'm grateful for both of those.

*




al

All Souls Night (Part 18 of 31)

.


 


 

 

 

 

 

 

CONTINUED TOMORROW.

 

Above: Every Autumn, I write a Halloween story, write it out on leaves (one word per leaf), photograph the leaves, and then leave them where. I found them. The story is then serialized, starting on October 1 and concluding on the 31st--All Souls Day.

 

 




al

All Souls Night (Part 19 of 31)

.


 


 

CONTINUED TOMORROW.

 

Above: Every Autumn, I write a Halloween story, write it out on leaves (one word per leaf), photograph the leaves, and then leave them where.I found them. The story is then serialized, starting on October 1 and concluding on the 31st--All Souls Day.

 

*

 

 




al

All Souls Night (Part 20 of 31)

.



 

 

CONTINUED TOMORROW.

 

Above: Every Autumn, I write a Halloween story, write it out on leaves (one word per leaf), photograph the leaves, and then leave them where.I found them. The story is then serialized, starting on October 1 and concluding on the 31st--All Souls Day.

 

*

 




al

All Souls Night (Part 21 of 31)

 

.


 


 

CONTINUED TOMORROW.

 

Above: Every Autumn, I write a Halloween story, write it out on leaves (one word per leaf), photograph the leaves, and then leave them where.I found them. The story is then serialized, starting on October 1 and concluding on the 31st--All Souls Day.

 

*