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
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.

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
- Walk 1: Milford on Sea ⇒ Lymington (9 miles) (✓ 4th July 2019)
- Walk 2: Lymington ⇒ Beaulieu (10 miles) (✓ 4th May 2022)
- Walk 3: Beaulieu ⇒ Hythe (6 miles) (✓ 10th May 2022)
- Walk 4: Hythe ⇒ Hamble (10 miles) (✓ 27th May 2022)
- Walk 5: Hamble/Warsash ⇒ Lee On Solent (7 miles) (✓ 7th July 2022)
- Walk 6: Lee on Solent ⇒ Portsmouth (7 miles) (✓ 15th July 2022)
- Walk 7: Portsmouth ⇒ Hilsea (10 miles) (✓ 12th November 2022)
- Walk 8: Hilsea ⇒ Emsworth (12.4 miles) (✓ 21st January 2023)
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.]
Battersea Power Station
A brief visit to the newly opened Battersea Power Station, now a huge shopping mall.









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
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.

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!






The 60 miles of the Solent Way
- Walk 1: Milford on Sea ⇒ Lymington (9 miles) (✓ 4th July 2019)
- Walk 2: Lymington ⇒ Beaulieu (10 miles) (✓ 4th May 2022)
- Walk 3: Beaulieu ⇒ Hythe (6 miles) (✓ 10th May 2022)
- Walk 4: Hythe ⇒ Hamble (10 miles) (✓ 27th May 2022)
- Walk 5: Hamble/Warsash ⇒ Lee On Solent (7 miles) (✓ 7th July 2022)
- Walk 6: Lee on Solent ⇒ Portsmouth (7 miles) (✓ 15th July 2022)
- Walk 7: Portsmouth ⇒ Hilsea (10 miles) (✓ 12th November 2022)
- Walk 8: Hilsea ⇒ Emsworth (8 miles)
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.












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!

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
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!
