Saturday, June 27, 2026

DCI Warlow - Druid's Moor

This is the 18th installment of books by Rhys Dylan, and as far as I am concerned, it is his best so far. I wouldn't say that his previous books were perfunctory but they don't achieve the richness of this one. In the 17th book, I guessed the identity of the murderer fairly early on: not because of what was written in the book but because I have assimilated the style of the author and know what to look for. On the other hand, I didn't expect the direction that the novel took in the final chapters. In this respect, there is a similarity to the late, great, Peter Robinson (DCI Banks) whose books started slowly and gradually built up pace towards the end.

This book, however, is not in the same mould as the other books. At first, it wasn't even clear what the book was about and who the murdered person was. Before I get further into a discussion of the book, I will note that like J. K. Rowling, every scene, almost every word, is important. If we are shown something, then that something will later appear (aka Chekov's gun). So the opening chapters, apparently unconnected, are not simply there for colour. On the other hand, the hospitalisation of Evan Warlow with a bad case of pneumonia (which I diagnosed before the book) doesn't seem to contribute too much although it does allow the other characters to shine.

Talking of which, in 'the future', DCI Warlow and his second in command, DI Jess Allanby (a couple, from about book 10) are supposed to take a joint holiday in Australia, probably by the time of the next book, so I was wondering who would take charge of their unit. By chance, one of the sub-plots - and indeed, the only murders - takes place near Weston Super Mare (near Bristol) and one of those murdered has connections to Wales. So the investigating DI comes to Wales to see what's happening, and as she is Welsh also, I suspect that she will take control of the next book. I have just discovered that the author wrote a trilogy about this character several years ago, the events of which are partially recalled here by some of the characters.

Back to 'Druid's Moor': this book neatly ties together threads from several books in a way that none of the cast nor the reader could have expected. Even though I started and finished reading the book in a few hours yesterday, this is the first in this series that I want to read all the way through again. Due to the resolution of this book, however, it would not be the best place to start reading the series; it is not self-supporting.

There's a nice self-refential joke in chapter 3: Talking of cures and doctors, did I tell you I bumped into an old friend of mine… a doctor who retired and turned crime writer? His books aren’t half bad, actually. Though they could do with a bit more sex.’ "Rhys Dylan" is actually a pseudonym for Dylan Jones, a retired NHS ophthalmologist.

I forgot to add that there are some nice musical touches from one of the characters with early 70s  Genesis, Alan Parsons, Yes and Led Zeppelin amongst others being mentioned. Jess only knows the references from Evan.

Homonym mistakes that hint that maybe the book was dictated and not written:
  • "You're like my mate Ed's K9, Moley, when you get your teeth into something" (Chapter 3)
  • There's a place where a "they're" is written as "their" (I can't find this - maybe it's in the previous book)
  • In probably the first book, Crewe is written as Crew.


This day in blog history:

Blog #Date TitleTags
25727/06/2010LASIK surgeryHealth
60627/06/2013New mobile computerComputers
86827/06/2015Vinyl log 16 - 24 JuneVan der Graaf Generator, Vinyl log, City Boy
163527/06/2023Lessons in ChemistryLiterature

Wednesday, June 24, 2026

45 years married

 




This day in blog history:

Blog #Date TitleTags
37224/06/2011Having an author sign her workPsychology, Blodwyn Pig, Fairport Convention, Canterbury sound, Economics, Dan Ariely
49224/06/2012Korcula (Dubrovnik log 8)Holiday, Dubrovnik
60424/06/2013Once and foreverYoni Rechter
73024/06/2014The heat! (Sicily log 5)Holiday, Sicily, Italy
104624/06/2017BumpersNice enough to eat, 1970
140224/06/2021It was 40 years ago todayPersonal
163424/06/2023Nutrition as religionNon-fiction books, Nutrition

Monday, June 22, 2026

Neurologist (2)

Today was the day of my followup appointment with the consultant neurologist1. It turns out that I wasn't supposed to take 2 pills of Depalept a day; instead, it should have been 'according to need'. It's not clear to me how a prophylactic medication can be taken in this manner. Anyway, I told him about the good things that have occurred since starting (no headaches, a slight reduction in blood pressure and no apneic events) and the bad things (weight increase, although now it seems to be going down again, dry mouth, mild edema in my feet, and now I've noticed trembling in my hands). The neurologist was not surprised by any of these.

He offered me the option of either a new medication (pills every day) or a self-administered injection once a month. Both of these medications inhibit the CGRP protein, thus preventing a build-up of this protein that activates nerves in the brain, making pain signals worse. For the time being, we compromised on reducing the Depalept dosage to one pill a day; I'll see how that goes.

I have a followup appointment in two months' time, by which I will have decided what to do. At the moment, the pills look the easier option (squeamish me). Another factor is the cost as the injection (and possibly the pills) are expensive; I discovered, however, that the kibbutz covers medical costs for the over-70s (a fact that I need to verify) so either option will be free for me.

Internal links
[1] 2095



This day in blog history:

Blog #Date TitleTags
37022/06/2011President's ConferenceDan Ariely, President's conference
72822/06/2014Open air bus (Sicily log 3)Holiday, Sicily, Italy
86722/06/2015Vinyl log 15 - 22 JuneRichard Thompson, Vinyl log
140122/06/2021Delphi: components array vs controls arrayDelphi
163322/06/2023Remedial swimming lessonsSwimming
178322/06/2024Today's successesSwimming, Home recording

Friday, June 19, 2026

The irony

Four months ago, I wrote1: there is a huge discrepancy in the way that USA President Trump is regarded in his own country and how he is regarded in Israel. For many Israelis, he is extremely popular ... [whereas] his US popularity has declined to about 40% (may be lower) which is very low for an incumbent president.

Now, after a war with Iran that Trump claims that he won although as far as most Israelis are concerned, he lost, the world sees Trump in a much better light whereas 72% of Israelis who were polled in the past few days see Trump as a negative influence.

Everything that he promised back in February did not happen. I sympathise with the Iranian opposition who were promised help in overthrowing a draconian regime but whose situation remains unchanged, if not worsened.

Internal links
[1] 2080



This day in blog history:

Blog #Date TitleTags
36919/06/2011Herpes simplexHealth
48719/06/2012Down to Montenegro (Dubrovnik log 4)Holiday, Dubrovnik
48819/06/2012ERP beats Excel at CRM/2ERP
48919/06/2012Taking things easy (Dubrovnik log 5)Holiday, Dubrovnik
60219/06/2013Edinburgh log (6): Graduation ceremonyHoliday, MBA, Edinburgh
72419/06/2014Modes of transport (Sorrento log 7C)Holiday, Sorrento, Italy
115019/06/2018New arrangement for songMIDI, Song writing
163119/06/2023Two books by Daniel LiebermanHealth, Psychology, Non-fiction books

Sunday, June 14, 2026

DCI Evan Warlow

Over the past week I've been bingeing on the books written by Rhys Dylan about his fictional creation, DCI Evan Warlow. As one might imagine, the author is Welsh and all his books take place in mid-Wales. One does get a smattering of Welsh from some of the characters but it's not overdone.

The books are quite well written with plenty of clues and red herrings scattered about; I don't feel that my time has been wasted, although of course had the first book not been good then I probably wouldn't have bothered with the rest. 

Now for some observations regarding the books from a critical point of view

  • Dylan has been churning out these books - there were four or five published in 2022 and a similar number in 2023. The quantity has not been affecting their quality.
  • That said, there is room for improvement - two parallel story lines makes for more interesting books. Although Warlow's team is fairly small, DS Alan Banks managed two cases with an even smaller team.
  • A map in each book would not go amiss. I've discovered that the author's website purports to have an interactive map showing the location of each book's activity, but the page doesn't load for me.
  • I could have done with a little less levity in the books. I agree that some of it is witty but it's too much. In a similar vein, there is a DC whose naivety is unbelievable. I don't see how someone could have reached that rank without becoming more worldly wise.
  • When looking at the books from a distance, a common structure becomes apparent. The first chapter generally contains two characters who discover a body; these characters disappear afterwards having served their dramatic purpose. The murderer (or antagonist) is someone to whom we have been introduced towards the beginning of the books and generally has impeccable credentials, so is never suspected until it is almost too late.
  • There is a superintendent - not the normal superior of Warlow - who is generally considered to be not very capable at coal face policing. It makes one wonder how she achieved that rank. Whenever she has introduced a new member to the team, that member has proved to be corrupt. I had my suspicions about a character matching this type throughout the ninth book and they were proved to be true.
  • Dare I say it - there appears to be a small amout of shipping between Warlow and his inspector. Time will tell.



This day in blog history:

Blog #Date TitleTags
48314/06/2012Dubrovnik log (0)Holiday, Dubrovnik
59614/06/2013Edinburgh log (1): Touring the cityHoliday, Edinburgh
71814/06/2014Pompeii (Sorrento log 3)Holiday, Sorrento, Italy
86414/06/2015Vinyl log 14 - 14 JuneSandy Denny, Van der Graaf Generator, 1975, Vinyl log, Fairport Convention, The Band
177914/06/2024Master of research (3)DBA

Tuesday, June 09, 2026

Round the bend

This morning I was passing from the bathroom to the lounge via the music room when a song on the radio caught my attention. It sounded like Nick Drake although I knew that it wasn't as I didn't know the song. The vocal sounded like Nick and the arrangement sounded like 'Riverman', so I 'shazamed' the song and was told that I was listening to 'Round the bend' by Beck.

In the past I tried listening to Beck as I had been given the impression that his songs would fit my taste, but obviously the selection to which I listened didn't push my buttons. In short order, I discovered that the song comes from his 2002 album, 'Sea Change'. Reading the comments on YouTube, I saw that I was far from the first who made the connection between this song and 'Riverman'.

Listening to the other songs on this album, I have yet to find another song that sounds so mysterious. It transpires that there is another song on the album that I recognise, 'Lost cause', but it's not a song that gets me excited.

Another song that has caught my attention lately is "It's not just me, it's everybody" by the artist trading under the name Weyes Blood. This is on my wife's playlist, although she doesn't recall how she found it. This song is reminiscent of Joni Mitchell, primarily in the chromatic mediants. From a music theory point of view, this song is very interesting, and the arrangement builds and builds. The vocal starts low but ends up fairly high. The only thing that I find annoying is the staccato piano; although the chords played vary (I don't know what key the song is in, but if we say it's in D, then the chords start as D, D6, D, D6), their rhythm doesn't and I would have preferred some variation - some syncopation or even not playing for a bit. It's a shame as this slightly ruins my enjoyment of the song.

Again, I listened to other songs of the singer, but didn't find anything else that caught my interest.



This day in blog history:

Blog #Date TitleTags
17809/06/2009Inter-program communicationProgramming
25309/06/2010Post mortem on my Economics examMBA, Economics
59209/06/2013Barcelona log (4): In search of DaliHoliday, Barcelona
86109/06/2015LinkedInDBA
86209/06/2015Vinyl log 13 - 9 JuneVinyl log
95409/06/2016An advanced - and possibly useless - technique in PriorityPriority tips
104209/06/2017Rodos log 5: SymiHoliday, Rodos, Greece
114509/06/2018Italy 2018 - The market, Mole AntonellianaHoliday, Torino, Italy
123109/06/2019Crazy weekJewish holidays
151209/06/2022Italy 2022: OstuniHoliday, Italy, Bari

Monday, June 08, 2026

Just like 'old times'

Even though I was taking a day off today*, I got up at 5:30 am and took the dog for her early morning walk. By about 6 am, she had done what she had needed to do, and we were about a third of the way through our walk. At this stage, my phone started emitting a sound that I couldn't place at first: I took it out of my pocket and saw that the home guard were dispaying a warning message about an imminent air raid warning. So I immediately turned and we started walking back home at an increased pace, not stopping for any sniffing around. At about a distance of 100 metres from my home, the air raid warning starting sounding - it's quite frightening to hear it when outside. People from the building neighbouring ours were coming down the stairs and heading for the nearest air raid shelter whereas the dog and I were half running home in order to get to our secure room. There are only a few buildings on my side of the kibbutz that have a secure room so we are quite privileged in this respect.

After the all clear signal had been given (via telephone), we were free to exit the room. I had intended to go swimming this morning at 7 am, and I saw no reason not to go. If the pool was closed then all I would have done was complete my early morning walk. By 7 am, I was at the pool and saw the life guard open up; there was only me and another swimmer there. At that hour, the air temperature is much closer to the water temperature, so the cold water didn't bother me. After swimming a few lengths, I thought that I heard an odd sound, so I treaded water for a bit, then carried on. A few minutes later, the air raid sirens sounded again.

So it was out of the pool and into an air raid shelter that was conveniently close to the pool. When I went down into the main room, I was surprised how many people were there; presumably the odd sound that I had heard before was the early warning. A few people made some comments about my attire, but I wasn't paying attention so I didn't realise that they were talking about me. After about 20 minutes, the all clear sounded and we all exited the shelter. By this time, I had lost interest in swimming, but I had to go back to the pool to pick up my headphones, cap and robe; the other person who had been swimming with me was back in the water.

On the way back home (I live on the opposite side of the kibbutz from the pool), three or four people stopped me and asked if the pool was open. I repeated my story. Later on, a message appeared on the electronic notice pool that all pools in our general area would be closed for the rest of the day.

So it's just like 'old times' of the earlier wars with Iran and Yemen from the past year.

* A few weeks ago, I noticed that I had accumulated many days of holiday. As I will soon be retiring, these days would be turned into money and as a result I would be paying a great deal of income tax for this extra payment. I also receive two days holiday a month, so if I did nothing, I would end up with 36 days of holiday. As a result, I've been taking one day of holiday each week.



This day in blog history:

Blog #Date TitleTags
8208/06/2007Rise up like the sunFairport Convention, Albion Band, Time signatures
59108/06/2013Barcelona log (3): Rain stopped playHoliday, Barcelona
104108/06/2017Rodos log 4: Lindos and the seven springsHoliday, Rodos, Greece
114308/06/2018Italy 2018 - The best chocolate in the worldHoliday, Peppermint, Torino, Italy
114408/06/2018Italy 2018 - Getting to know TorinoHoliday, Torino, Italy
132308/06/2020The background behind another song that is used for Israeli folk dancingKibbutz
139508/06/2021A new Yoni Rechter songbookYoni Rechter
151108/06/2022Italy 2022: Corso Cavour (2)Holiday, Italy, Bari
162708/06/2023Post doctorateNutrition
194808/06/2025Diet, drugs and dopamineNon-fiction books, Nutrition

Wednesday, June 03, 2026

Why zebras don't get ulcers

Over the past week, I've been reading this very interesting (for me) book. In order not to misrepresent the author, I'm going to quote some paragraphs from the opening chapter.

For animals like zebras, the most upsetting things in life are acute physical crises. You are that zebra, a lion has just leapt out and ripped your stomach open, you’ve managed to get away, and now you have to spend the next hour evading the lion as it continues to stalk you. Or, perhaps just as stressfully, you are that lion, half-starved, and you had better be able to sprint across the savanna at top speed and grab something to eat or you won’t survive. These are extremely stressful events, and they demand immediate physiological adaptations if you are going to live. Your body’s responses are brilliantly adapted for handling this sort of emergency.

The half of the autonomic nervous system that is turned on is called the sympathetic nervous system. Originating in the brain, sympathetic projections exit your spine and branch out to nearly every organ, every blood vessel, and every sweat gland in your body. They even project to the scads of tiny little muscles attached to hairs on your body. If you are truly terrified by something and activate those projections, your hair stands on end; gooseflesh results when the parts of your body are activated where those muscles exist but lack hairs attached to them. The sympathetic nervous system kicks into action during emergencies, or what you think are emergencies. It helps mediate vigilance, arousal, activation, mobilization. To generations of first-year medical students, it is described through the obligatory lame joke about the sympathetic nervous system mediating the four F’s of behavior—flight, fight, fright, and sex. It is the archetypal system that is turned on at times when life gets exciting or alarming, such as during stress. The nerve endings of this system release adrenaline. When someone jumps out from behind a door and startles you, it’s your sympathetic nervous system releasing adrenaline that causes your stomach to clutch.

The other half of the autonomic nervous system plays an opposing role. This parasympathetic component mediates calm, vegetative activities—everything but the four F’s. Sprint for your life across the savanna, gasping and trying to control the panic, and you’ve turned the parasympathetic component down. Thus, the autonomic system works in opposition: sympathetic and parasympathetic projections from the brain course their way out to a particular organ where, when activated, they bring about opposite results. The sympathetic system speeds up the heart; the parasympathetic system slows it down.

Another important class of hormones in the response to stress are called glucocorticoids. 

The body synthesizes these glucocorticoids, but we can also be given synthetic glucocorticoids, a good example being Prednisone that is a potent synthetic corticosteroid used to quickly reduce inflammation, suppress an overactive immune system, or replace natural cortisol. It is prescribed for a wide variety of conditions, including severe allergies, asthma, arthritis, and autoimmune diseases like lupus. 

The neurologist1gave me a referral for a head CT, using a contrast dye. In Israel (and probably elsewhere), someone who has a bad reaction to such dyes is considered to be allergic to Iodine, although this is not accurate as iodine is a required micronutient for the thyroid gland. Reactions to intravenous X-ray/CT contrast media are typically caused by the physical properties (e.g., hyperosmolarity) of the solution itself, not the iodine it contains. I am not sure whether I am 'allergic to Iodine'; it is written in my medical history and so everyone has to be careful. I underwent a procedure some 40 years ago to do with my kidneys and had a bad reaction to the 'iodine' although whether that is considered to be severe enough to be an allergy is uncertain. I have an appointment with an allergy doctor in August to settle this once and forever.

The connection between this scan (which was done yesterday) and the glucocorticoids is that I had to undergo a 'preparation protocol' that involved taking prednisone three times at various hours of the day along with another medicine an hour before the test. Everyone at the hospital checked that I had taken the medicines although obviously they had to rely on my answer. 

I am going to go into detail about what I felt from the scan onwards, primarily so that I will have it documented. During the test itself, the only abnormal thing that I felt was as if part of my testicles had been lowered into warm water; the rest of the body felt fine. My hands were shaking slightly but that's something that I've noticed over the past few weeks. After I got home, I took the dog for a walk then had a light supper. I felt slightly warm but I thought that this was due to walking the dog. By the time I came to measure my blood pressure at 9 pm, I was surprised to see that it was high (relatively for me) at 125/82 with a pulse of 102. For comparison, the readings on Sunday evening were 103/78 and pulse 77. When I got into bed, I felt quite warm, despite the air conditioner, and slept for some time uncovered.

Obviously the prednisone had activated the sympathetic nervous system, and the iodine was having its effect.

Going back to zebras and why they don't have ulcers: humans have both external sources of stress and internal souces, or psychological stresses. Unfortunately, the body can't distinguish between the two sources and so the sympathetic nervous system gets unnecessarily mobilised, moving blood to our arms and legs and taking it away from other areas of the body. One familiar source of psychological stress is how much control we feel we have over our lives, otherwise known as locus of control. Those with a low locus of control have more stress than those with a high locus. 

My job affords me with a very high locus of control, but I remember that when I was in the army (compulsory service and reserve duty) I had a very low locus, and I used to say that if something were about to happen and I could think of two alternatives, the army would always choose a third option which would be worse than anything that I could think of. 

Internal links
[1] 2095



This day in blog history:

Blog #Date TitleTags
95203/06/2016Dave Swarbrick, RIPObituary, Fairport Convention
150503/06/2022Italy 2022: pre-flight checkHoliday, Italy, Bari
177103/06/2024Cruise log #2: RodosHoliday, Rodos, Greece
194303/06/2025A cheap source of ErythritolErythritol

Saturday, May 23, 2026

2026 swimming

As I wrote1 last year, as usual, the swimming pool opened at the time of the Harvest festival (known as Whitsun to our Christian friends); this seems to be the earliest date for some time as normally the pool doesn't open until June. For the first two days, the pool opened at 10 am, which is an inconvenient time for me, but today, there was health swimming at 8:30 am, which is much better for me (actually I would have preferred even half an hour earlier). 

Several months earlier, probably after the removal of yet another growth, I considered how I can minimise my exposure to the sun. When I'm swimming, my back is exposed and I've had quite a few growths removed from there. The answer was a Quick-Dry Swim Shirt Short Sleeve that I ordered from Temu about six months ago. I hadn't tried wearing this shirt until this morning so there was a slight worry that it might not fit, but the size was fine. As opposed to the sort of swimming shirt that I would wear 20 years ago that would flap around in the water and slow me down, this one fit snugly (without being too tight) so it was as if it wasn't there. I should note that the colours in the accompanying photograph have been manipulated; the original was too dark.

By 8:30 am, I was at the swimming pool, alone; the lifeguard opened the gate and I went in. I suspected that the water would be cold but I didn't expect it to be so cold! The first step down the ladder where I'm standing had the water cover my ankles; I waited a minute or so to acclimatise. Then another step down the ladder and my calves froze up. One more step and my thighs were covered; then I let go and floated for a bit. The water was freezing! Of course, I paid less attention to the cold once I started swimming. My body remembered was it was supposed to do and the only ache came from my neck (normally my left arm starts aching after a few lengths).

I swam two lengths, had a short rest. swam another two lengths and a rest, etc. In total I swam 10 lengths. That was enough for this year's debut performance. I should note that I was the only swimmer in the pool; my normal pool-opening companions were strangely absent. I sent a WhatsApp message to one of them and received an answer a minute ago: she was at her brother in law's flat in Tel Aviv. She also suffered from the cold when she was in the pool (I don't know when). Two people turned up only as I was preparing to leave and they too were surprised that I had been the only swimmer.

I had dug out my bone conducting headphones2 a few days ago and fully charged them in preparation. The set list for today was two of my songs, 'Night scented stock' by Kate Bush, 'Katie's been gone' by The Band, and 'Stormbringer' by John Martyn. Another song might have started just as I finished but I don't recall. I often find it hard to recognise the songs at first because they play in a completely random order. 

I've been suffering quite a bit from stomach problems over the past few months and there have been the odd hint about them here. As a result, I abandoned my time restricted eating, as I found that eating something in the early evening helped with the aches. I saw a gastro-enterologist about six weeks ago who ordered a gastroscopy; this didn't reveal anything interesting, although a polyp was removed and sent for biopsy. I saw the GE doctor again who wasn't impressed by any of the possible findings of the gastroscopy. The one strong recommendation that he made was that I should double the dosage of omepradex; I always thought that this worked like paracetamol - the effect of each pill would wear off after some hours - but apparently not. I can definitely say that the days when I have 'gastric distress' are becoming fewer, and when they do occur, they are much milder than some of the bad days that I had before. All this is to say that I will be able to resume time restricted eating on the days when I go swimming - and this year I intend to swim frequently. Last year, time restricted eating helped reduce my weight and I don't eat on pool mornings until after swimming.

On the other hand, the new prophylactic medication Depalept3 that I have been taking to prevent migraines has worked well in that respect but seems to have caused my weight to balloon, although this may be water retention as my wife says that I don't look any worse. The medication has also had a very interesting effect on my sleep apnea: the central sleep apnea have almost completely disappeared (I didn't have even one such event in the past week) and obstructive apnea have also almost completely disappeared - two in the past week. Whatever the CPAP measures as deep sleep has also been affected: whereas this used to be in the range 0 - 20 minutes a night, now it's 50 - 120 a night. I shall mention these side effects to the neurologist in the follow-up appointment next month.

Internal links
[1] 1946
[2] 1587
[3] 2095



This day in blog history:

Blog # Date Title Tags
363 23/05/2011 Apology Mobile phone
584 23/05/2013 Doctorate on hold DBA
857 23/05/2015 Venice log 4 - Waiting Holiday, Venice, Italy
1223 23/05/2019 Arriving in Athens (Greece 7) Holiday, Athens, Greece
1224 23/05/2019 Athens hop-on hop-off (Greece 8) Holiday, Athens, Greece

Sunday, May 17, 2026

Jasmine Myra - Where light settles

Two and a half months ago, I wroteJasmine Myra has recorded a new album that will be released in a few months' time (15 May 2026)! Over the past 12 months, there has been silence from her camp and I seriously wondered whether she was continuing with music. As I expected, there was a letter in my mailbox on May 15 giving me access to her new album, "Where light settles", so that I could download it in mp3 format.

I put the songs on continous play via the computer and have been listening to them as I work and read. And ... I don't know what to write. On a visceral level, I don't enjoy listening to this as much as I did the earlier work. I've been trying to figure out what the problem is, and I think that it's because the disc is less of a group performance this time. Drums, for example, are rarely heard. There also don't seem to be tunes that can be recognised as such but rather a collection of notes.

There is much less guitar and fewer harp arpeggios; the piano takes an even more dominant role that it had in the past (eg the opener, 'Opening' seems to be solo piano). There is more flute than bass clarinet. 

I think that my conclusion has to be: if these were the first tunes that I heard from Jasmine Myra then I wouldn't have been so enthusiastic about her work as I was when I first heard her.

Strangely, 'the new piece that does not as yet have a name but was influenced by Kenny Wheeler' that was played in Zurich, October 20242 does not appear here.

Internal links
[1] 2083
[2] 1876



This day in blog history:

Blog #Date TitleTags
85017/05/2015Florence log 3 - Take it easyHoliday, Florence, Italy
121717/05/2019Arriving at Andros (Greece 1)Holiday, Andros, Greece
131817/05/2020HeatwaveIsrael, Weather
150217/05/2022Yesterday's skyWeather
176117/05/2024In silenceSong writing
193717/05/2025Recording "Maeve's song" - production notesHome recording

Friday, May 08, 2026

Horizontal scolling

I haven't blogged much recently, primarily because there hasn't been much to blog about, but also because quite often I get struck by a mysterious malaise that hits at around 2 pm and only dissapates in the evening. I had a gastroscopy test at the beginning of the week whose conclusions were unclear; I don't have anything seriously wrong, but still. On the topic of health, I can report that since starting the new prophylactic medicine1 for migraines, I have been mercifully free of headaches, but there have been other side effects, such as adding 3 kg to my weight! And now for today's topic: horizontal scrolling.

In the OP's management program, there is a very simple form that has exactly one visible component, a TDBGrid. The grid's datasource is a query that has three fields: a date, a subject and a hidden id field. The subject can be very long and so it can be wider than the width of the form. Both the form and the grid have their bidimode set to biRightToLeft, as it should be for a Hebrew form. When one double clicks on the grid in order to open a form that is dependent on the hidden id field, the grid scrolls horizontally all the way to the left, thus effectively hiding the date field. A user complained that she had to scroll all the way to the right in order to overcome this.

I admit that I've seen this problem before but haven't cared enough to fix it. I also didn't know how to repair it. I assume that the solution would be some message that is sent to the grid to make it scroll back to the right. According to CoPilot, When a TDBGrid is in Right‑To‑Left mode: The visual left edge is actually the logical right edge. The scrollbar is reversed. When the grid receives focus again (after your double‑click opens the EditTask form), Windows sends a WM_HSCROLL message. The default handler scrolls the grid to the logical left, which in RTL mode is the visual right. But Delphi’s RTL support is partial, and the grid ends up scrolling to the visual left instead — exactly the opposite of what you want. So after returning from the EditTask form, the grid scrolls to the wrong side.

The fix seems to be to send the WM_HSROLL message to the grid (as I assumed): DBGrid1.Perform (WM_HSCROLL, SB_RIGHT, 0). But this code actually sends the cursor to the left of the grid (as I see it), whereas I want it to go to the right. So the real fix is DBGrid1.Perform (WM_HSCROLL, SB_LEFT, 0). And this does work.

Internal links
[1] 2095



This day in blog history:

Blog #Date TitleTags
7208/05/2007(Welcome to the) Hotel CaliforniaVan der Graaf Generator, Randy Newman, Jackson Browne, CSN, Barney Hoskyns
13008/05/2008Amsterdam diaryProgramming, Holiday, Amsterdam
35708/05/2011More facts your mother never told you about Word automationProgramming, Office automation
58108/05/2013Analysing my sleepCPAP, Gadgets
70408/05/2014Doctoring, researching, samplingDBA, Kindle
150008/05/20221500 blogsMeta-blogging
175708/05/2024Milano: the final dayComputers, Holiday, Italy, Milan

Saturday, May 02, 2026

Chamber music concert

I mentioned in a rather off the cuff manner a few months ago that 'there was supposed to be a chamber concert taking place in the kibbutz in another few hours' but that it was postponed because war with Iran had started that day. Finally, that chamber concert took place today and some of it was wonderful. 

The concert started with a short explanation about the harp as an instrument; this one had been built in the 1840s. The strings of a harp are tuned to a diatonic major scale, begging the question of how sharps and flats are played. It turns out that there are seven pedals at the bottom of the harp, where each pedal has three positions - flat, natural and sharp. This allows all the notes to be played, although sometimes enharmonics have to be employed, eg substituing F# for Gb. I know that Debussy wrote 'La fille aux cheveux de lin' (the girl with the flaxen hair) in the key of Gb which has six flats, so this must be a rather challenging piece to play.

The first piece of music to be played was Gabriel Fauré's 'Sicilienne' (Op. 78); the version that I am familiar with is played by cello and piano. There didn't seem to be much difference to the version played here by violin and harp, but this is always a good solid piece of music.

Next up was a real surprise as it wasn't in the pieces listed in the 'advert' for the concert - Debussy's 'Clair de lune' (the third part of the Suite Bergamasque). I wonder how the harp part was written as the music is notated in Db major with five flats. Surely it would be easier for both instruments simply to transpose the music up a semitone to D major - this would be a good key for the violin as well as two open strings, the D and A, are in this key. This was pure divine magic.

I have a memory of my mother saying that 'Clair de lune' was her favourite piece of music. Of course, I can't check with her as she passed away 24 years ago, and now it seems an odd statement for her to make as I don't have any recollection of her ever passing comment about a piece of music. I can't imagine any context in which she would have made this statement, either. But it is still a beautiful piece of music and the harp makes it more celestial than the piano does.

The other pieces on the set list were not familiar and I didn't enjoy them as much: a piece by Tchaikovsky that I can't name (a section from a violin concerto), Rumanian dances by Bartok, 'Fantasy for violin and harp' by Saint Saens (naturally I enjoyed this more). The final piece was probably part of 'Rapsodie espagnole' by Ravel (I didn't know that he was of Basque origin; I've always considered him to be French). I'm sorry to be so vague on the titles but I don't know the pieces and I'm having to transliteate their original names that were transliterated into Hebrew, so it's hard to be accurate.

The concert took place in a small building that one member turned into an art gallery. I was sitting in the second row on the left (I can recognise the bald patch on my head if I enlarge the picture) so of course the instruments were fairly loud, but they also had a large dynamic range as befitting top professional players.

Internal links
[1] 2083



This day in blog history:

Blog #Date TitleTags
17102/05/2009Heron - River of fortuneHeron
121302/05/2019DietHealth, Anaemia, Diet
175102/05/2024Menaggio in the rainHoliday, Italy, Varenna
193202/05/2025Maeve's songSong writing, Police procedurals

Monday, April 13, 2026

Batch inserts

Yesterday I wrote how it took 3 hours and 13 minutes to migrate a table with slightly over 2M records. I then tried my hand at the 'times' table; I saw that this table contained slightly more than 14 million records and so the migration should take around 21 hours - which it did. At least the program didn't crash. Obviously I had to find a better method - and I did: batch inserts. 

Basically, an array of 2048 records is prepared and then is inserted at one go. This saves multiple commits thus saving time. A 'commit'  permanently saves all changes made during a transaction, making them visible to other users and ensuring data integrity. Naturally this takes a certain amount of time - even if it's a few milliseconds, that adds up when it has to be done 14M times. My batch code needed to do only about 6,900 commits that should save a great deal of time.

I wasn't prepared for how fast migrating a table of 14M would be: four minutes!! That's 315 times faster than the naive method of copying row by row.

The batch inserts were possible in this database because the three large tables are composed solely of integers and there's no need to faff around with codepage conversions.

Here's the code

const batchsize = 2048; procedure Tq400IntMigrate.Button1Click(Sender: TObject); var i, j, k, fieldcount, position: integer; tablename, s: string; begin edit1.Text:= timetostr (time); button1.enabled:= false; for i:= 0 to componentcount - 1 do if components[i] is TCheckBox then if tCheckBox (components[i]).checked then begin tablename:= uppercase (tCheckBox (components[i]).caption); qCount.sql[1]:= tablename; qCount.open; pb.max:= qCount.fields[0].asinteger div batchsize; position:= 0; qDelete.SQL[1]:= tablename; qDelete.Connection:= newcon; qDelete.ExecSQL(); sleep (5000); qBase.sql[1]:= tablename; qBase.open; fieldcount:= qBase.fields.count - 1; s:= 'select '; for j := 0 to fieldcount - 1 do s:= s + qbase.fields[j].fieldname + ', '; s:= s + qBase.fields[fieldcount].fieldname + ' from ' + tablename; SrcQuery.sql.text:= s; srcQuery.open; s:= 'insert into ' + tablename + ' values ('; for j := 0 to fieldcount - 1 do s:= s + ':p' + inttostr (j) + ', '; s:= s + ':p' + inttostr (fieldcount) + ')'; dstquery.sql.text:= s; dstQuery.params.ArraySize:= batchsize; dstQuery.prepare; k:= 0; while not srcquery.eof do begin for j := 0 to fieldcount do case srcquery.fields[j].datatype of ftInteger: dstquery.params[j].asintegers[k]:= srcQuery.fields[j].asinteger; ftLargeInt: dstquery.params[j].aslargeints[k]:= srcQuery.fields[j].asinteger; else dstquery.params[j].asintegers[k]:= srcQuery.fields[j].asinteger; end; inc (k); if k = batchsize then begin dstquery.execute (batchsize); dstquery.connection.Commit; k:= 0; inc (position); pb.position:= position end; srcquery.next end; if k > 0 then begin dstquery.execute (k); dstquery.connection.Commit; end; end; edit2.Text:= timetostr (time); end;

Internal links
[1] 2104



This day in blog history:

Blog #Date TitleTags
34913/04/2011Advanced SQL for me - NULLIFProgramming, SQL
69613/04/2014Fifteen minute mealsCooking
82713/04/2015Vinyl log 3 - 13 AprilDCI Banks, Richard Thompson, Vinyl log
102113/04/2017April thesis updateDBA
160313/04/2023Rain, rain, rainWeather
174213/04/2024Jasmine Myra - KnowingnessJasmine Myra

Sunday, April 12, 2026

Wait states

I migrated another database to unicode over the weekend. Updating the migrator was fairly straight-forward, although there was one problematic table with something like 35,000 that was defined as WIN1251 (Cyrillic) although the characters were actually encoded in WIN1255 (Hebrew). That table took some time to define its migration route. Although this database has fewer tables than the first database that I converted and most of those tables contain only numbers with much less text, it took much longer to migrate the database - because some of the tables are huge (relatively speaking). There are a few tables with over two million rows and one with over ten million rows. 

Let us say that I had problems migrating those tables because of their size. I started the migration program yesterday evening only to discover that it had crashed whilst handling one of those humungous tables. I restarted the program from the table where it had crashed, but I could see that soon it too would crash. So what could I do?

I thought that the crashing might be due to the migration program overwhelming the database manager who simply could not keep up with the pace at which records were being entered. 30 years ago, this would be called 'adding wait states': a wait state is a deliberate, one-or-more clock cycle delay introduced by a processor to synchronize with slower external components, such as RAM or I/O devices. It prevents the CPU from processing data before it is ready, ensuring data integrity at the cost of overall system performance (thank you Chrome AI). 

The first thing that the migrator does for each table is delete any data that may exist in the table; I added the command 'sleep (15000)' after the deletion to allow the data to be deleted; this command stops the migrator for 15 seconds. I then added a command that there would be 10 second breaks after each 2048 records have been read. This was initially 15 seconds and 1024 records, but I could see that this would be too slow. For one table, with just over 2 million records with the sleep time was 10 seconds every 2048 records; it took 3 hours and 13 minutes to migrate the table.

I'm now migrating the really large table and don't expect it to finish within the next few hours - but I do expect it to complete.



This day in blog history:

Blog #Date TitleTags
82612/04/2015How not to display data in graphsStatistics
112112/04/2018Apology to Israel RailwaysTrains
160212/04/2023More bells and whistles for the 'Blog' programProgramming, Delphi, Blog manager program
174112/04/2024Update on our spring performanceMusical group
192112/04/2025Passover begins tonightJewish holidays, Song writing

Tuesday, April 07, 2026

The 'fx pedal to end all pedals' has ended its career

 The musical group had a knock-about session last night, playing anything that came into our collective head (eg 'Hotel California', 'Forever young' (Alphaville) and some Israeli songs - almost nothing that I have played before). Before we started, I checked out my pedal board and the fx pedal. I wrote 1 two months ago that the 'fx pedal to end all pedals'2 issues a fair amount of noise so in order to combat this, I set the noise gate to a level that let loud guitar through but not hiss. This caused the guitar to sound rather 'chunky' and lacking dynamics. Thinking about this on the way home, I realised that all the presets that I defined start with compression; maybe it would be better to create some presets with no compression and see what these sound like.

Before setting off for the rehearsal, I connected my phone to the pedal via bluetooth (and no small amount of bother) and attempted to remove the compression from all the settings. I think that I was partially successful in this. Despite my efforts, once I started playing, the sound from the amplifier was very weak. Exasperated, I disconnected the fx pedal from the system and suddenly my guitar volume increased ten-fold. I'll have to remove the pedal from the board and restore those that I previously removed.

On a completely different topic: yesterday was quite warm but this morning, when I was taking the dog for her morning walk, it started raining. Now that's not such an unusual event, but what makes it stand out is that the barometer in my head didn't give me a migraine. I did have an odd stomach ache in the evening, so this could be my body's new way of reacting, but it could also be due to the odd stomach rumblings from which I suffer now and then. So it looks like the new prophylactic pills3 that I have (that are meant for epileptics) are working.

Internal links
[1] 2074
[2] 2072
[3] 2095



This day in blog history:

Blog #Date TitleTags
56607/04/2013A new technique in Word AutomationProgramming, Office automation, HTML
82207/04/2015I've always kept a unicornSandy Denny, Fotheringay
111907/04/2018Season of the kumquatPersonal
130607/04/2020Statistical methods for EpidemiologistsStatistics, Covid-19, Non-fiction books

Sunday, April 05, 2026

Migration completed; now the debugging begins

At 5pm on Thursday afternoon, I completed the migration of the OP's management program with 354 units from ANSI Hebrew and dbExpress components to Unicode and FireDAC. When I write "completed", I mean that I had gone over every form and unit and replaced the dbExpress components with those of FireDAC. I also had briefly tested each form, but there was no guarantee that the program was free of bugs - in fact, I was fairly sure that the units that were converted first probably would not work correctly.

But before that, there was a topic that I had purposely not worked on, leaving it for the end. Almost all the forms that add data to the database have an autoincrement primary key; this is achieved by having a generator (something that returns a sequence of numbers, such as 1, 2, 3, ... 2001, 2002, etc) and a trigger that gets the next value from a generator and inserts it where needed. I didn't want functional generators when I was populating the new database from the old, but now that the translation had completed, I did need the generators and triggers for testing purposes. 

What I really needed was to drop all the generators and triggers before transferring any data, then to recreate them after all the data had been transferred. CoPilot got the dropping code partially correct - it would work if there was a trigger but wouldn't if there was no trigger. Eventually CP developed some complicated SQL code for a conditional delete. This also had to be done in the correct order: first delete the trigger then the generator; this is because the trigger refers to the generator. Recreating the generators and triggers was easy, at least when done in the correct order. Then the generators had to be seeded with their new starting value. Originally I wrote a small query that would return the maximum value in the key field and used this, but then I noticed that the migrator calculates how many rows are in a table (for a progress bar) so I used this - and shortly discovered that the number of rows is not necessarily the highest value of the key; there might have been deletions from the table. Eventually that was fixed and I migrated the database once more.

On Saturday morning, I started working through the program and found some simple problems to fix, for example queries that weren't attached to the database connection. I found more queries whose fields needed to be redefined, and I found some that were wrong because the columns to which they were connected were not defined correctly. This required a fix to the database and remigration of a single table. 

But there were some significant problems each of which took a few hours to fix. In what is probably the entire program's main form, the 'restore grid widths' routine wasn't working, although in fact, the correct values were returned but the grid 'ignored' them. The solution was to update the grid when all screen painting had finished, and so I added an OnPaint handler that sent a message to another procedure that would load the grid widths. This worked.

Another familiar problem occurred with a query called qSentReports: when certain reports are run, their HTML output is stored in a table so they can be retrieved at any stage. I had had problems when saving new reports in the table then restoring, so I assumed that retrieving reports that had been created in the previous version could be restored in a similar manner. But this was not so. According to CP, I was dealing with double or even triple encoding, involving WIN1255, WIN1252, UTF-16 and UTF-8. Then it struck me that the original data was already in UTF8 format, so the migrator shouldn't encode it and my code shouldn't decode it. After this epiphany, I once again transferred the data for this one table and finally it displayed correctly.

I am sure that there are further traps awaiting me, but I suspect that they will be minor. Now I don't know what to do with myself and all the free time that has suddenly opened up. ðŸ˜‰



This day in blog history:

Blog #Date TitleTags
24005/04/2010HolidayCooking
34605/04/2011Firebird fixed!Computers, Firebird
69205/04/2014PneumoniaHealth, Nick Drake
82105/04/2015Vinyl log 1 - 5 AprilVinyl log
93705/04/2016Sorrento shopping (2016/2)Holiday, Sorrento, Italy
111805/04/2018The sense of an ending (2)Films, Literature
120705/04/2019Excellent music blogBeatles, Song writing
159705/04/2023Passover night, 2023Jewish holidays, Kibbutz
192005/04/2025Slow cooked leg of lambCooking, Slow cooker

Thursday, April 02, 2026

2,100 blogs

Blog #2000 was written on 14/09/25, so that's 6.5 months for 100 blogs, or 15.8 blogs per month. Here is the histogram of blogs per month. The previous 100 blogs were written at an average pace of 14.3 blogs per month so I'm writing more.


I have to admit that I am surprised that 10/25 was such a fruitful month, although looking at what was written that month, I can understand. This was the beginning of the Prolog saga, a topic that would dominate the blog for the next few months - until a different programming project, the migration of a database and program to Unicode, began. Here are the blogs ordered by topic

Position Tag Count Previous position All time position
1 Programming 38 7 1
2 CoPilot 21 - 45
3 Prolog 21 - 39
4 Delphi 13 10 6
5 Personal 13 9 3
6 FireDAC 9 - 102
7 Unicode 8 - 50
8 Obituary 7 12 8
9 D12CE 6 - 142
10 Health 6 4 5
11 Israel 6 8 7
12 Computers 5 18 13
13 Films 5 - 18
14 Grandfather 4 - 37
15 Police procedurals 4 21 21
16 CPAP 3 - 23
17 Guitars 3 19 22
18 Musical group 3 5 27
19 Nick Drake 3 - 91

Of course, the period covered by these 100 blogs do not contain a holiday, so that's two topics off the board immediately. But it does seem that every six/seven months, my interests completely change. Here is the frequency histogram for the past 100 blogs.



Last night was the first night of Passover, and due to the security situation, we are back to the lock-down format1 from the Covid-19 days. At least this time our daughter and grandchildren joined us.

Internal links:
[1] 1307



This day in blog history:

Blog #Date TitleTags
12402/04/2008ERPProgramming, ERP, Maccabi Tel Aviv, Meta-blogging
82002/04/2015Introducing the vinyl log Vinyl log
111702/04/2018DBA updateDBA

Wednesday, April 01, 2026

Overconfident AI gets it wrong again

I wrote1 a few days ago: I would also like to define metadata for the database. For example, if a report uses the field 'name' from the table 'customers' then automatically that field should have the title 'customer name' (in Hebrew) Similarly, 'surname' and 'forename' from table 'people' or 'name' from table 'therapists'. The fact that I want the title in Hebrew is incidental; even in English, the default name for customers.name is 'name', not 'customer name'. I put this to CoPilot who replied that this would be very easy to do: it requires a dictionary that translates between table names and Hebrew titles, and that the source for the dictionary would be a property of each field called 'origin'. The origin propery of a field containing a customer name would be CUSTOMERS.NAME.

I left this idea for a few days while I concentrated on list boxes, but yesterday I returned to continue work on this idea. I linked the 'find dictionary entry' procedure to a simple report and saw ... that it didn't work. The origin of a field CUSTOMERS.NAME was simply NAME and of course I have to distinguish between customer name, therapist name and activities.name, etc. CoPilot said that the table name didn't appear because the query was very simple and didn't invoke a join. So I looked at a more complicated query and saw that the origin property was empty for half of the fields! Only fields from the base table (ie the table after the keyword FROM) had origins, whereas the rest didn't.

OK, said CoPilot, you need the OriginTabName and OriginColName properties. "These do exist and will compile." Except they don't exist. After several rounds of CoPilot offering names of properties that sound plausible but don't exist, I told CoPilot that we were getting nowhere. CP agreed, saying that FireDAC doesn't expose sufficient metadata in order to provide a solution for what I wanted. Thank you very much. It wouldn't hurt to say once in a while that "I got it wrong".

In the end, I suggested and implemented a much simpler - and unfortunately, less automatic - solution: I created a stringlist and populated it with the Hebrew translations of 'customer name', 'contact name', 'person surname', etc. Each value has a specific number attached to it which is simply the offset within the stringlist: stringlist[1] = 'customer name', etc. In the FDQueries and FDMemTables in my code, I assign one of these values to a field's tag propery and then do the lookup on this property. In the extremely complicated form for sending an email, upon which I worked, at one stage it is necessary to display a list of therapists. Instead of having to title each field manually, I simply marked the tags as 56 and 58 and got the displaylabels that I wanted.

In conclusion: there are some things that CoPilot is good at, like seeing that a datasource was not enabled2, or for building an ancestral dual list box dialog3. But for more creative solutions, CP is not particularly good and is even frequently wrong. And it still maintains that "This is reliable, simple, and works with all your existing forms". Yeah, right (the one time that two positives make a negative).

I've been so wrapped up in all this chat coding for the last few days that I didn't notice that this is blog #2100! The next blog will contain the traditional look at the previous 100 blogs.

Internal links
[1] 2097
[2] 2094
[3] 2099



This day in blog history:

Blog #Date TitleTags
138401/04/2021You and your action research projectDBA
191801/04/2025Is this me or a double?Personal