Initial commit: HPR Knowledge Base MCP Server
- MCP server with stdio transport for local use - Search episodes, transcripts, hosts, and series - 4,511 episodes with metadata and transcripts - Data loader with in-memory JSON storage 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
211
hpr_transcripts/hpr2469.txt
Normal file
211
hpr_transcripts/hpr2469.txt
Normal file
@@ -0,0 +1,211 @@
|
||||
Episode: 2469
|
||||
Title: HPR2469: A flight itinerary in Bash
|
||||
Source: https://hub.hackerpublicradio.org/ccdn.php?filename=/eps/hpr2469/hpr2469.mp3
|
||||
Transcribed: 2025-10-19 03:45:14
|
||||
|
||||
---
|
||||
|
||||
This is HPR episode 2004 and 169 entitled, A Flight Itinerary in Bash and in part of the series
|
||||
Bash Cripting.
|
||||
It is hosted by Dave Morris and in about 18 minutes long and can in the next visit flag.
|
||||
The summer is working out mates and time in a Bash Cript.
|
||||
This episode of HPR is brought to you by An Honesthost.com.
|
||||
Get 15% discount on all shared hosting with the offer code HPR15, that's HPR15.
|
||||
Better web hosting that's honest and fair at An Honesthost.com.
|
||||
Hello everyone, this is Dave Morris for Hacker Public Radio.
|
||||
I'm going to do another Bash related show today.
|
||||
It's fairly brief.
|
||||
It's probably a bit silly, but I thought since I've done the thing I'm going to talk
|
||||
about, somebody might find it useful and interesting, so bear with me.
|
||||
It's first of January today and my daughter flew out to New Zealand before Christmas Eve
|
||||
she went.
|
||||
She's gone there with her mum, my ex-wife, to hang out with her brother.
|
||||
She's been there since around November with his girlfriend, they're on a bit of a travel
|
||||
binge moment.
|
||||
Anyway, I was interested in her flights and times and stuff and I saw her itinerary that
|
||||
came in from the airline, but the times on those things are all local times, which is
|
||||
what you want when you're flying places, you want to know what time your next plane's
|
||||
going on whatever as you arrive in a place.
|
||||
But I was interested in tracking where she was at on her journey using local time.
|
||||
So I took this itinerary and turned it into a little bash script, which allowed me to
|
||||
calculate times in my local time zone, which is GMT or UTC.
|
||||
Both of my kids are fairly frequent travellers, I've got the wanderlust both of them I think.
|
||||
And I like just to have an idea of where they are, not at the point of view of monitoring
|
||||
them or anything, but just how they're progressing through their journeys.
|
||||
Because I tend to worry otherwise, I don't know where they are and stuff.
|
||||
So it's just a parental thing, maybe this parent, I don't know.
|
||||
This was a fairly simple journey, two flights, one from Edinburgh to Doha in Qatar and then
|
||||
another one out to Auckland, not a long way in between in Doha.
|
||||
Of course the overall journey is incredibly long, it's hard to believe that people are
|
||||
doing these such things on a regular basis, but that's just me showing my age probably.
|
||||
It's simple in comparison to many into this flight, when she flew out to Indonesia in 2015
|
||||
and I did an HBR show chatting to her when she came back by what she'd been up to
|
||||
and stuff.
|
||||
She was learning to dive and being an assistant with people who were doing research in remote
|
||||
Ireland in the Indonesian archipelago.
|
||||
Anyway, she took four flights and a boat trip and it took her over 38 hours.
|
||||
There was a break along the way to get out there and I made a spreadsheet for that.
|
||||
She's an okay way of doing this, but it was good to do, I found it gave me relief from
|
||||
worrying.
|
||||
This time I chose the different means of distracting my brain.
|
||||
So let's talk about the script.
|
||||
The basic algorithm was that I had the start and arrival times of each flight as well
|
||||
as each flight duration and I also had the connection time, the time in the linking airport
|
||||
waiting for the next plane.
|
||||
I decided to use the date command to perform date and time calculations and I've known
|
||||
that you can do some reasonably sophisticated things of date for a number of years but
|
||||
I've not really, I always forget how to do it so I was keen to get back into remembering
|
||||
learning how to do this properly and finding all the ins and outs of it and that's why
|
||||
I'm doing this show of course because I'm sharing what I found with you.
|
||||
The date command can take a date specification with an offset.
|
||||
So when you just type date you get back the current date and time and time zone.
|
||||
If you give it an offset, if you give it a base date which you do by giving it a hyphen
|
||||
D option followed by date specification.
|
||||
People who wrote this have actually gone to a lot of trouble to provide a piezo which
|
||||
can handle all sorts of wonderful date formats.
|
||||
So my example here is if you typed date space hyphen D space then in quotes doesn't matter
|
||||
which quotes.
|
||||
Today plus one week with spaces where you'd expect them to be.
|
||||
Then you get back and I did this on the 30th of December 11th 13, I got back the answer
|
||||
and I couldn't bother about the format, I just let it default it.
|
||||
Sadly the 6th of January 11th 13 and 12 second as GMT 2018, that's what I got back.
|
||||
So that was just added a week.
|
||||
It has problems if you give it things like a month because what is the length of a month
|
||||
because they're all well a lot of them are different.
|
||||
Dates and times are so horrible to fiddle with.
|
||||
But anyway if you give it a start date and time in the form that you might expect so
|
||||
I had to start date of my cat in the background.
|
||||
The start date of in ISO format 2017 hyphen 12 hyphen 24 space 144 coal on 55.
|
||||
So that was the date that the first flight started and then I put plus 415 minutes which
|
||||
actually the flight duration.
|
||||
And I got back Sunday the 24th of December at 1041.
|
||||
So the answer was before the time I was actually trying to calculate from adding 415 minutes
|
||||
which is 6 hours 55 minutes to 1455 should result in 2150.
|
||||
So something's broken here.
|
||||
The problem I believe is caused by the date and time being separated by a space.
|
||||
So the parser has only read the date not the time.
|
||||
So they started midnight on the 24th and added the appropriate time to that.
|
||||
Does that work?
|
||||
They should have worked as a.
|
||||
I don't know what I know if it was doing.
|
||||
That's strange actually.
|
||||
I never thought about that until just now.
|
||||
I don't know where I got that date from.
|
||||
But so my next attempt was to see what is the universal date format that you can use to
|
||||
manipulate dates, add stuff to dates or indeed subtract stuff from dates.
|
||||
And I tried another approach where the example I don't want to read this out because it's
|
||||
complicated.
|
||||
But basically there's after the hyphen D option there is a quoted string in it and in it
|
||||
there is another command substitution with another date.
|
||||
What this other in the inner date does is it takes the nicely formatted date the one
|
||||
I was using before.
|
||||
And it converts it to ISO 8601 format.
|
||||
You have to put in there hyphen capital I followed immediately by the word minutes.
|
||||
There are different formats that you can get and there's some that's got fractional
|
||||
seconds and stuff which this one just gives you an hour and minutes format thing as well
|
||||
as the date.
|
||||
So I've given an example here of feeding in this two date and the answer I get back is
|
||||
an ISO 8601 date which is the 2017-1224 and then a capital T 14 colon 55 plus 00 colon
|
||||
00.
|
||||
In other words it's the UTC time zone which is where I am at and it splits up the date
|
||||
and the time and so forth.
|
||||
I mean I could have put the T in between the two fields originally but I wanted to be
|
||||
able to potentially at least learn how to convert from one date format to another and find
|
||||
a consistent format that I could do stuff to.
|
||||
So going back to the command within a command thing having computed that and adding 415 minutes
|
||||
to it the answer I get back is the correct one Sunday the 24th December at 2150.
|
||||
So that's fine that works that's how to do it.
|
||||
I did actually I didn't put this in the notes discovered that you can say you can produce
|
||||
epoch times out of date and you can use that as your sort of base and epoch times the number
|
||||
of seconds since is it first of January 1970 I've forgotten what epoch date is but you
|
||||
get a big integer number anyway and you can then feed that into date and produce a more
|
||||
readable date.
|
||||
I also discovered that instead of giving it plus 415 minutes which means you've got to
|
||||
have converted the hours and minutes into minutes you could give it a plus 6 hours plus
|
||||
55 minutes so you can do that you couldn't put in that date string plus 6 colon 5.5 that's
|
||||
not accepted which is a shame there you go.
|
||||
So that was some of the stuff that led up to what I was doing.
|
||||
What I've done is I've included the script itself it's 52 lines including a big comment
|
||||
so it's not particularly big it's got a function as well just for the convenience.
|
||||
So talking about the function first of all there's a function called minutes whose purpose
|
||||
was to take a formatted time in the format hours colon minutes and convert it into a number
|
||||
of minutes.
|
||||
I'm not going to talk much about it I've covered up most of these points before in other
|
||||
shows just whizz through it briefly the key element of it is that it takes that time
|
||||
in and it also has a second argument, a mandatory argument which is the name of variable
|
||||
to put the minutes into it calls it ref but it uses a method called a name ref.
|
||||
I've got another show pending which I'm in the process of writing I write my notes
|
||||
first and then talk to the notes as you are probably well aware and it's talking more
|
||||
about name ref and I plan to go into even more detail on this yeah the further show
|
||||
I talk about functions but this is a piece of bash magic if you like which allows you
|
||||
inner function to hand an answer back to the caller but instead of handing it back as
|
||||
you would in more normal languages as Mike Ray would probably put it it can hand it back
|
||||
as a variable.
|
||||
So basically what the minutes thing does it splits the time up into two pieces there
|
||||
are no checks approved to check that it really is this format so it's just a rough and
|
||||
ready type of function then it takes the values it gets and multiply the hours by 60 and
|
||||
adds in the minutes in a what's it called an arithmetic substitution expression that's
|
||||
what it does so the main script works on the principle that it generates times and saves
|
||||
them into variables and these times are then printed out in a nice format so I get a
|
||||
little report of the different flight times and stuff so it's not not a very complex thing
|
||||
but basically I start with a variable which I call DEP underscore eddy I've just used
|
||||
the terminology that you find on flight itineraries DEP mean to part a double R meaning arrive
|
||||
and then a three letter airport key EDI's Edinburgh DOH which will come to the minute is
|
||||
doer Auckland is a KL and stuff like just seemed logical you might not agree.
|
||||
Anyway DEP eddy sad silly when I say it is converted into an ISO 8601 I then compute
|
||||
the flight time in minutes which is 6 hours 55 then I compute the arrival time in Doha as
|
||||
the departure time plus the flight time again all in ISO 8601 format then I put a couple of
|
||||
print state print F statements straight after that just to print them out rather than save them
|
||||
all up to the end. Print F's I've not talked much about print F in bash thought Clackier was
|
||||
going to do a show on it but he's a busy guy but anyway just in very very brief print F takes
|
||||
format string and then it takes a list of arguments and the format string has got specifiers same
|
||||
as we have talked a little bit about this in the org theory it takes things that says I want you
|
||||
to treat each of the arguments in the following way the first one is percent hyphen 20s what that
|
||||
means is take the first argument print it as a string inner field of 20 spaces and make sure
|
||||
it's left justified because the default is to right justify it so the first print F the text
|
||||
is leave Edinburgh at so it does that then it does another percent S field which is the date
|
||||
on time the departure occurs and that argument consists of another command substitution which is
|
||||
date hyphen D and then in quotes dollar depth edd so that's that ISO-860 one time then the format
|
||||
specification for date is plus percent capital F space percent capital R space percent Z and
|
||||
that what that does is generate a date to shorthand wave of specifying a sort of natural format date
|
||||
ISO sort of format date which is to me very logical the y-y-y-y-m-m-dd with hyphen's in between
|
||||
24 hour time and then followed by the time zone and of course it's the local time zone because
|
||||
I'm interested in knowing what the times are in my time zone as a whole point so the rest of the
|
||||
script is sort of the similar sort of thing I then compute the time in doha in minutes which
|
||||
one hour 40 and then that's used in the next calculation compute the duration of the flight from
|
||||
doha to Auckland which is 16 hours and 10 minutes whoa and then compute the arrival time in Auckland
|
||||
print those out then I thought oh I'll see if I can print it out as a New Zealand time
|
||||
which gets a little convoluted there are several ways of doing it but the one I found
|
||||
was successful probably because I messed up the other one was to create a time command substitution
|
||||
which starts with capital T capital Z equals and then the name of the time zone region
|
||||
now various ways you can specify this I believe I think you can put in there plus 13 000 and possibly
|
||||
others which specifies the the Pacific Auckland time zone but I use the actual name of it as
|
||||
you'll see from that from the notes and then I computed that arrival date in New Zealand time
|
||||
I also threw in a duration calculation because I knew the durations of each flight and the waiting
|
||||
in between to work out how long the overall journey was so you can the these are arithmetic
|
||||
substitutions and just add together the three things and then we print that print out a little
|
||||
calculation of that duration divided by 60 that's the number of hours because it doesn't
|
||||
integer division and then it modulo 60 which gives you the minutes so that's it really so the
|
||||
output and it's always produced the same output forever and ever because it's just a one-off I think
|
||||
I said in the notes it's just a throw away script more for my amusement and to keep me busy
|
||||
should have done some mining I don't think but now anyway this this exercise my brain a bit more
|
||||
it prints stuff out in a reasonably pleasant way and you can see the New Zealand time has got a
|
||||
plus 13 time zone spec it was 440 in the morning there they arrived on the 26 they started
|
||||
24 but there you go that's time zones for you and it took 24 hours and 45 minutes so I don't
|
||||
I don't envy I don't envy them at all I'm not very good at long flights anymore anyway so in
|
||||
conclusion writing this was was interesting and it get me distracted and I also watched the flight
|
||||
progress said flight numbers on one of the the flight monitoring sites I use flight radar 24
|
||||
I'm sure you will have done this I'm sure everybody's far more sophisticated in this area than I am
|
||||
learned stuff about the date command and it was pretty good my kids come back in mid-January
|
||||
and of course I've written the script for the return flight and the script is there for download if
|
||||
you want it's obviously listed in the in the notes I called it EDI underscore AKL and I thought I
|
||||
better explain why because that's the name of the two airports so make sense eh okay well that's
|
||||
it I hope you found it interesting bye now
|
||||
you've been listening to Hacker Public Radio at Hacker Public Radio dot org we are a community
|
||||
podcast network that releases shows every weekday Monday through Friday today's show like all our
|
||||
shows was contributed by an HBR listener like yourself if you ever thought of recording a
|
||||
podcast then click on our contributing to find out how easy it really is Hacker Public Radio was
|
||||
founded by the digital dog pound and the infonomicum computer club and it's part of the binary revolution
|
||||
at binrev.com if you have comments on today's show please email the host directly leave a comment on
|
||||
the website or record a follow-up episode yourself unless otherwise status today's show is released
|
||||
under creative comments attribution share a light 3.0 license
|
||||
Reference in New Issue
Block a user