15 books read in January! Tue, 31 Jan 2023 @ 4:46 pm

15 books read in January!


My not-first FORTRAN code Sun, 29 Jan 2023 @ 7:07 pm

Back in 2001, for a challenge, I taught myself part of the Python programming language and wrote a program based on the idea of a FORTRAN program I wrote decades ago. Now, for another challenge, I’ve written the same program – in FORTRAN! I had to dig out a free compiler from the Internet (FORTRAN90). Things have developed and changed since I was a programmer and I have had to learn new things in the language. Back then I think I used FORTRAN 66 and FORTRAN 77.

It’s been fun coding in FORTRAN, again! For the record, I downloaded and used two free products, Code::Blocks and Strawberry Perl, which I’ve found to be successful. (I’m not clear on where Strawberry Perl fits into this!). I also found this YouTube video to explain configuring of Code::Blocks.

! ===================================================================
! Program REMINDER
!
! Decades ago I wrote a FORTRAN program to take a file of reminders 
! and to display the records in a sorted and pretty format.
! In March 2021, for fun, I wrote a Python version of the program.
! Now, in January 2023, for fun, I have again written a FORTRAN version.
!
! Version 0.1 20-Jan-2023 Start of conversion of the Python code
! Version 1.0 29-Jan-2023 Final version.....?
!
! ===================================================================
program Reminder

use ReminderModule ! All the functions/subroutines are in this module.
implicit none
type (rec_data) ReminderTable(100)
character myfile*100
integer Nreminders

myFile = "C:\Users\Mike\Documents\Documents\MyFortranCode\MyReminderProject\Reminder.dat"

call GetReminderData(myFile,ReminderTable,Nreminders)
call SortList (ReminderTable,Nreminders)
call PrintList(ReminderTable,Nreminders)
end program Reminder
!
!==========================================================
! Module REMINDERMODULE containing all the functions and subroutines.
!==========================================================
module ReminderModule
!
implicit none
type rec_data !Structure to hold the reminder records
    character*11  rec_date      !reminder date
    character*50  rec_event     !reminder event
    integer  rec_numdays        !Calculate days between date and today's date
end type rec_data
contains

!============================================================
!Subroutine GETREMINDERDATA to get the reminder records
!Records are of the form dd-mmm-yyyy,"Event description" and are unordered
!============================================================
subroutine GetReminderData(filename,ReminderTable,N)
implicit none
integer mystatus,N,ans,ans_today
character filename*(*), mystatusmessage*200,mydate*11,mytext*50,today*8
character monthchar*3,months*36
integer d,m,y
type (rec_data) ReminderTable(*)
data months/"JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC"/

open (unit=1,file=filename,action='read', &
      form='formatted',iostat=mystatus,iomsg=mystatusmessage)
if (myStatus /= 0) then
    write (*,'(///2a)') "OOPS! ", mystatusmessage
    stop
endif
!
! Calculate the number of days between today and a base date
!
call date_and_time(date=today) ! Inbuilt procedure
read(unit=today,fmt='(i4,i2,i2)')y,m,d ! This used to be done using an ENCODE statement!
call getDays(d,m,y,ans_today) !Get the number of days between today and a base date
!
! Get the reminder records
!
N = 0
do
    read (unit=1,fmt=*,iostat=mystatus,iomsg=mystatusmessage)mydate,mytext
    if (mystatus /= 0) then
        exit
    else
        N=N+1
        ReminderTable(N)%rec_date = mydate
        ReminderTable(N)%rec_event = mytext
        read (unit=mydate,fmt='(i2,1x,a3,1x,i4)')d,monthchar,y ! Get the date components
        m = index(months,uppercase(monthchar))/3+1 ! Lookup the month number using the month text
        call getDays(d,m,y,ans) !Get the number of days between the date and a base date
        ReminderTable(N)%rec_numdays = ans - ans_today !Number of days between date and today's date
    end if
end do
close (unit=1)
end subroutine

!============================================================
! Subroutine GETDAYS to calculate the number of days between
! the supplied date and an arbitrary base date (01/01/2000)
!============================================================
subroutine getDays( day,month,year ,ans)
implicit none
integer ans,i,daysPerMonth(1:12),daysPerMonthLeapYear(1:12)
integer day,month,year
data daysPerMonth         / 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 /
data daysPerMonthLeapYear / 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 /

ans=0
do  i = 2000, year-1 ! Add up the days in the preceding years of the supplied date
    ans=ans +365
    if (isLeap(i)) ans=ans + 1
end do
!
do i =1,month-1,1 ! Add up the days in the preceding months in the year of the supplied date
    if (isLeap(year)) then
        ans = ans + daysPerMonthLeapYear(i)
    else
        ans=ans + daysPerMonth(i)
    end if
end do
!
ans = ans + day - 1 ! Finally add in the number of days (less 1) of the month of the supplied date
!
end subroutine getdays



!=============================================================
! Function ISLEAP to determine if a year is a leap year
!=============================================================
logical function isLeap(Y)
!
integer Y
!
! A leap year is divisible by 400 or, is divisible by 4 but not by 100
!
isLeap = (mod(Y,400) .EQ. 0) .OR. (mod(Y,4) .EQ. 0 .AND. mod(Y,100) .NE. 0)

end function isleap
!
!=============================================================
! Subroutine SORTLIST to sort the data in date order.
!=============================================================
subroutine SortList (ReminderTable,N)
type (rec_data) :: ReminderTable(*),temp
integer :: N,i,j
logical :: Swapped

DO j = N-1, 1, -1
    swapped = .FALSE.
    DO i = 1, j
      IF (ReminderTable(i)%rec_numdays > ReminderTable(i+1)%rec_numdays) THEN
        temp = ReminderTable(i)
        ReminderTable(i) = ReminderTable(i+1)
        ReminderTable(i+1) = temp
        swapped = .TRUE.
      END IF
    END DO
    IF (.NOT. swapped) EXIT
END DO

end subroutine
!
!=============================================================
! Function UPPERCASE to convert text to upper case.
!=============================================================
function uppercase(string)
character(len=*), intent(in) :: string
character(len=len(string)) :: uppercase
integer :: j
do j = 1,len(string)
  if(string(j:j) >= "a" .and. string(j:j) <= "z") then
       uppercase(j:j) = achar(iachar(string(j:j)) - 32)
  else
       uppercase(j:j) = string(j:j)
  end if
end do
end function uppercase
!
!====================================================
! Function PRINTLIST to nicely print the data
!====================================================
subroutine PrintList (ReminderTable,N)
type (rec_data) :: ReminderTable(*)
integer :: N, nDays, i
logical :: tChange
character*16 t1
character*75,parameter :: mySectionSeparator="---------------------------------------------------"

tChange = .TRUE.

write (*,'(/////)')
write (*,'(2x,a)')mySectionSeparator
write (*,'(2x,a)')"         Welcome to my FORTRAN Reminder program!"
write (*,'(2x,a)')mySectionSeparator
do i = 1, N
    nDays = ReminderTable(i)%rec_numdays
    if (tChange .eqv. .TRUE. .and. nDays > 0) then
        tChange = .False.
        write (*,'(2x,a)') mySectionSeparator
    end if
    if (nDays == 0) then
        t1 = "     Today    "
    else if (nDays == -1) then
        t1 = "   Yesterday  "
    else if (nDays == 1) then
        t1 = "    Tomorrow  "
    else if (nDays < 0) then
            write(unit=t1,fmt='(i4,a)')-ndays," days since" !In my days it was the ENCODE statement
    else
            write(unit=t1,fmt='(i4,a)')ndays," days until"
    end if

    write (*,'(2x,a,1x,a,1x,a,a)')ReminderTable(i)%rec_date,t1,ReminderTable(i)%rec_event

end do
write (*,'(2x,a///)')mySectionSeparator
end subroutine

end module

And the output is….


Emsworth station, bus-replacement service Wed, 25 Jan 2023 @ 12:03 pm

Emsworth station bus-replacement service

If you ever find yourself at Emsworth train station and there is a bus-replacement service, here is a map of where to catch the bus. Don’t make the mistakes that I made of either expecting it to leave from the station or from the bus stops just outside the station. I waited outside the station – no bus came. I waited at the bus stop just outside the station on the main road – no bus came. Interestingly a man in one of the houses by the bus stop came out to point out that on several occasions he had told people that the bus replacement service didn’t leave from the bus stop! He told me where he thought they left from – he was quite correct though I actually ended up catching a local bus service from the town centre.

See also www.nationalrail.co.uk/posters/EMS.pdf for related maps and information.


Solent Way (part 8) Hilsea to Emsworth Sun, 22 Jan 2023 @ 10:24 pm

It was an eventful final section of the Solent Way that I walked on a sunny but sub-zero, January day. Starting at Hilsea and ending at Emsworth, the walk is supposed to be just 8 miles, but my 12.4 miles also included the stretch from Hilsea train station to the actual Solent Way path as well as extra miles caused by some unexpected backtracking (see below).

From what I saw of Emsworth I would hope to return to explore what looked to be an attractive, small town. Lots of small pubs and independent shops, a bookshop, a Victorian cafe on platform 2 of the station (charming), and a large harbour which I’m sure would be more interesting when the tide is in.

An eventful day had began with a fallen tree blocking part of my route, threatening a cancellation of the whole day. Fortunately, using my wonderful phone app, I found an alternative route. Whilst on the walk, flooding had swept away part of the Solent Way, requiring some backtracking and rerouting across fields leading to lots of mud as well as a face-off with cattle (one with horns) blocking my way. I couldn’t face more backtracking so by making a lot of noise I managed to create sufficient space to be able to dash past the now rear-facing cattle. Phew.

To top it all, my return journey home began with a train bus-replacement service from Emsworth station. It didn’t turn up, neither did the next one 30 minutes later. I was almost certain that I was waiting in the wrong place – it clearly wasn’t the station.

In the end I found a bus stop where I could pick up a local bus service, though not the rail replacement. The rest of the journey happily went to plan.

What a day to finish off the Solent Way, long-distance path. Now I need another challenge…..

The 60 (actually 71!) miles of the Solent Way


2022 recommended books Sat, 31 Dec 2022 @ 8:54 pm

My favourite books of 2022

2022 was a good year for books, both in terms of number read (95) and in the pleasure given.

Below are the 18 fiction and 15 non-fiction that I gave the highly recommended award, with the best of the best highlighted in bold.

The 18 fiction delights

  • About the Author – John Colapinto [Accidently re-purchased 8 years after I first read it! As good the second time around. A book about a book, it’s a clever psychological thriller.]
  • The Last Thing to Burn – Will Dean [Extremely tense abduction tale. Terrific.]
  • Those Who Walk Away – Patricia Highsmith [Wife commits suicide and father challenges husband in psychological thriller set in Venice. Absolutely brilliant.]
  • Under Your Skin – Sabine Durrant [TV presenter finds a body whilst running and becomes a suspect. Superior whodunnit.]

    • The Gravediggers’ Bread – Frédéric Dard [An undertaker, his unhappy wife and an opportunist. Fabulous, little tale.]
    • Bird in a Cage – Frédéric Dard [Man returns to his home town and meets a mysterious woman. Another short, 1950s, French, suspense novel.]
    • The Executioner Weeps – Frédéric Dard [An artist, a violin and a car accident. A French love story and thriller. Another fine, short tale by FD.]
    • Crush – Frédéric Dard [17-year-old Louise escapes her dull life and moves in with an American couple. A short, 1950s, French, suspense novel.]
    • The King of Fools – Frédéric Dard [A mere 160 pages, a delightful 1950s tale of obsession from a prolific, French writer. ]

  • The House Uptown – Melissa Ginsburg [Carefully woven tale of an artist and granddaughter and the past.]
  • My Phantoms – Gwendoline Riley [A wonderful tale of an appalling father and a dreadful mother.]
  • Seasonal Work – Laura Lippman [Superb collection of short stories.]
  • How to Measure a Cow – Margaret Forster [Woman with a past tries to move on. Superb.]
  • Heaven My Home – Attica Locke [Superb tale about race and a missing child in rural Texas.]
  • The Standing Chandelier – Lionel Shriver [A mere 120 pages but a hilarious tale of male/female friendship.]
  • My Policeman – Bethan Roberts [Fabulous love story set in 1950’s Brighton.]
  • Idaho – Emily Ruskovich [Superb tale of family and tragedy set in rural America.]
  • The System – Ryan Gattis [Superb tale about the American justice system as experienced by all of those involved.]

and the 15 non-fiction delights

  • Licence to be Bad – Jonathan Aldred [Terrific critique of “How Economics Corrupted Us”. Will need to re-read to do it justice.]
  • Outraged – Ashley ‘Dotty’ Charles [Internet outrage – why we shouldn’t.]
  • Why the Germans Do It Better – John Kampfner [20th/21st century history, politics, people.]
  • Wayfinding – Michael Bond [“The Art and Science of How We Find and Lose Our Way!” Brilliant.]
  • Dancing with the Octopus – Debora Harding [An assault, a horrible mother and how a daughter copes. Brilliant.]
  • The Moth and the Mountain – Ed Caesar [“A true story of love, war and Everest”. A fascinating, well-written read.]
  • Another Day in the Death of America – Gary Young [In America, ten violent deaths of children on the same day. Shocking. ]
  • The Life of an MP – Jess Phillips [Superb and honest account of what it’s like to be an MP.]
  • Four Thousand Weeks – Oliver Burkeman [“Time Management for Mortals”. Superb.]
  • In the Wars – Dr Waheed Arian [Inspirational bio of an Afghan refugee who fought to become an eminent doctor.]
  • The Weather Machine – Andrew Blum [The global weather forecasting system. Fascinating.]
  • In Control – Jane Monkton Smith [“Dangerous Relationships and How They End in Murder”. A brilliant study. A must-read.]
  • Batavia’s Graveyard – Mike Dash [17th century, Dutch shipping disaster and mutiny off coast of Australia. Brilliant.]
  • And Away… – Bob Mortimer [Bob’s wonderful and funny autobiography.]
  • Working on the Edge – Spike Walker [Crab fishing off Alaska. Fabulous tales of the dangers and of the fishermen.]


Kingston upon Thames Tue, 27 Dec 2022 @ 4:03 pm

Things that caught my eye on a short, filling-in-time walk along the river at Kingston upon Thames.


Snow (with modifications) Wed, 14 Dec 2022 @ 4:39 pm


Snow is where I’ll go Mon, 12 Dec 2022 @ 5:20 pm

How wonderful to have snow! These pictures were taken in Nonsuch Park.

This one was taken out the window.


Snow! Sun, 11 Dec 2022 @ 10:50 pm

First snow!


Battersea Power Station Fri, 2 Dec 2022 @ 5:22 pm

Battersea Power Station

A brief visit to the newly opened Battersea Power Station, now a huge shopping mall.


Bad luck in Matlock! Sat, 26 Nov 2022 @ 12:10 pm

Bad luck in Matlock!

A 2-day stay in Matlock in Derbyshire to see family and friends showed considerable promise when I spotted the Oxfam bookshop directly opposite our Airbnb! And just a few shops down there was another second hand bookshop, too!

Picked up from the station, we had a light lunch at the home of our relations for the first reunion. But it was downhill from there onwards as a violent sickness bug took hold at the end of the day. Earlier in the week little Iris had been unwell and it looks as if I had picked up her bug. The next fifteen hours were the worst of the worst and we were unsure whether I would be able to travel home the following morning. Fortunately I was.

St Pancras looked magnificent – the photo below was taken on the way up.

However I never got to see much of Matlock or get to visit the bookshops or participate in the main, family reunion. Next time….

The magnificent St Pancras Station


Sutton 1 Rochdale 0 Sat, 19 Nov 2022 @ 6:49 pm

Sutton 1 Rochdale 0

A fortunate goal scored direct from a corner was the difference between two poor teams. Pressure from Rochdale in the second half might have given them at least a draw, but it wasn’t to be. Without the goal it would have been a dire game, but instead it was just poor.

Still, it was good to be at a game again.


Solent Way (part 7) Portsmouth to Hilsea Sat, 12 Nov 2022 @ 9:00 pm

The 7th of the 8 sections of the Solent Way walk was, on a lovely, sunny and warm November day, uninteresting and tiring . Starting at Portsmouth and ending at Hilsea, the almost 10 miles was mainly along the seafront.

Nothing of interest once I had left Portsmouth other than a Hovercraft service to the Isle of Wight – I didn’t realise hovercrafts were still ferrying passengers. Sadly I missed out on taking a picture.

I’ll be glad when this walk, the Solent Way, is finished – only one section to go!

Picnic on the Southsea beach

The 60 miles of the Solent Way


Chartwell Wed, 9 Nov 2022 @ 7:34 pm

Last year we visited Chartwell, Churchill’s home, on a day when it was entry-free to everyone not just National Trust members. It was packed, the car park was full and we and others were driving around looking for a space to park. We gave up! Today was completely different and it was almost empty despite the glorious, late Spring day. Churchill was a keen, self-taught painter and his studio is well worth a look. We had a lovely day.


Polesden Lacey Wed, 2 Nov 2022 @ 3:42 pm

Polesden Lacey on a miserable morning.


Partido de Tenis Sat, 29 Oct 2022 @ 8:06 pm

Partido de Tenis

This creases me up!


Fireworks out the window Thu, 27 Oct 2022 @ 11:10 pm


Wells-Next-The-Sea Sun, 23 Oct 2022 @ 4:02 pm

A busy month – two funerals, flu and covid jabs, dentist and optician appointments, a car breakdown followed by scrapping and replacing the car. For a change of scenery we made a last-minute decision to visit the Norfolk town of Wells-Next-The-Sea. We always planned to travel there by public transport which took over 6 hours, involving a train, tube, two more trains and a bus!

A Monday to Friday stay in a rented house gave us three full days to explore and get in a couple of decent length walks. Wells-Next-The-Sea is a charming fishing and holiday town with magnificent sands (when the tide is out).

We managed long walks on two of the three days. The first day was sunny as we walked westwards from Wells to Holkham, catching a bus back to Wells. The second day was extremely windy and we caught the bus to Blakeney, walking eastwards to Cley before catching the bus back.

On the third day it rained but we were still able to revisit the magnificent sandy beach.

Fish and chips in the evening!


Kites with the kids Sat, 1 Oct 2022 @ 10:33 pm

Kites with the kids

A great time with the kites and the little ones.
Kite flying is such fun for both kids and adults.


GPS – how odd! Mon, 26 Sep 2022 @ 3:15 pm

GPS – how odd!

Tracking my activity (walk) into the village, my iPhone’s GPS put me in some odd locations.

The red block is where I shopped in Waitrose – I never went to the left as would be suggested by GPS. The red circle is where I stopped to make a longish phone call.

All very odd, though perhaps explained by the accuracy of GPS, the strength of the GPS signal and the quality of my iPhone’s GPS receiver,

Update: I came across the following at Why-is-GPS-data-sometimes-inaccurate

When signals from the GPS satellites bounce off buildings, the GPS receiver can be confused by the extra time the signal took to reach it. In these cases, you may observe sudden large errors in position. There is not much that can be done to reduce the effects of multipath errors – GPS is simply less accurate in canyons, whether they are made of buildings or natural formations.


Sutton 1 Salford 2 Sat, 24 Sep 2022 @ 7:19 pm

Sutton 1 Salford 2

A disappointing result after a fascinatingly competitive match for the first hour. Sutton took a deserved lead in the 62nd minute but ruined their prospects with a player being red-carded 5 minutes later. Hanging on lasted until two goals from Salford, 10 and 3 minutes from full-time, ruined the party – it seemed inevitable with a one man advantage.

Sutton nearly nicked a point in the last minute of extra-time, but it wasn’t to be. Disappointing!