Tuesday, 22 July 2025

Vibe Coding with Cursor

Recently we hear all the time about how AI is going to replace nearly all jobs, and in particular how nobody will need software engineers any more because AI can write all the code. I don’t believe that for a moment, any more than I believed the same thing of ICL’s much-hyped “The Last One” in 1981.

People talk a lot of about “vibe coding”, which means getting AI to write code that you have absolutely no idea how to do yourself. When it inevitably doesn’t work, you tell the AI thing what’s wrong, and it fixes it. It sounds too good to be true - and I suspect is. But AI can certainly simplify and accelerate a lot of routine coding for things like web interfaces, which probably make up well over half of all the software out there. For sure there will be job losses. 

A few weeks ago I downloaded the new AI-focussed editor and IDE, Cursor. I’d heard a lot about it from a friend of mine who in addition to being a high-powered investment banker and private pilot, also spends a lot of time writing code just for fun.

I’d just been finally getting my head around the finer points of Shor’s algorithm for factoring huge numbers using quantum computing, including an optimized implementation of all the underlying non-quantum math. I asked Cursor to write the same thing, in Kotlin. It did a respectable job, though for production use, even pre-quantum, it would have taken a lot more work. Just for fun I also got it to write what must surely be the only implementation of a quantum algorithm in Cobol, too. I’ve thankfully never written any Cobol in my life, but I remember it from the Danial McCracken book that I read when I was about 16. The code looked convincing.

Then my friend wrote to me in amazement at the latest thing he had got Cursor to do. There is some pretty amazing stuff in there. His program scrapes PDF documents describing airports and other aviation stuff. It’s all completely unstructured, and varies greatly between countries. Yet with a lot of help from Cursor he has built a complete, structured database of this information and - his latest effort that amazed him - a powerful web front-end to access it.

It was time for me to do something myself. A while back I wrote a program to help solve and investigate Wordle puzzles. It started in Kotlin, but I rewrote it in C++, taking advantage of the highly parallel AVX instructions available on the latest CPUs. The user interface is a classic CLI, just as it would have been 50 years ago.

I’d often thought it would be nice to have a web front-end, that would look like the Wordle phone app plus a bunch of extra features. But I have no idea how to write a modern web GUI, using the current tools like React, and no enthusiasm at all to spend weeks getting my head around them. So nothing happened.

But this was the perfect opportunity to see what Cursor could really do. Could I just tell it to write a web front-end to my existing 25,000 or so lines of highly optimized C++?

Before I dive into the details, here’s a summary of how it went. Sometimes you tell it to create something which seems pretty complicated, and it writes a bunch of code that works first or maybe second time. That really is amazing. Other times it just goes round in circles, generating something that doesn’t work, and the correcting it based on feedback - into something that doesn’t work for a completely different reason. One item took me a whole afternoon of going round in circles like this before it finally worked.

After a couple of days of not very intensive work, I have a working front-end and the necessary back-end support. If I’d done it myself, the actual coding might not have taken much longer than that, but it would have taken weeks to learn enough about React, even with the usual help from Google and StackOverflow. And I would have gone mad with frustration trying to find a working package to interface a Rest API to C++. (Ironically, I created a very powerful interface that does exactly that for my day-job software, but the solution is way too heavyweight for what I had in mind here).

It’s surprising how often Cursor creates something which doesn’t work, then when you tell it what hasn’t worked, it says, “oh yes, to make that work you need to do such-and-such - would you like me to do it?” Typing “yes” does the trick, and the it runs into another thing that doesn’t work but which it knows how to fix. And so on and so on, utnil eventually you get something that does work. But you can’t help wondering, if it knew all that, why it didn’t get it right in the first place.

When I had got it all working I asked my son, who works with React all day long, to take a look at the React code it had generated. His verdict: “It's sort of the right shape for React but quite brutally ugly”.

Now for the Details

I started by running Cursor in the directory containing all my C++ code, which it obligingly listed in a pane on the left side of the screen. Then I said something like “create a web front-end that accesses the functionality of my Wordle program here”.

It hummed and whirred for a bit and then produced some React code for the front-end. Then it said, “would you like me to create the back-end too?” Well, yes, that was the whole point. Over the next few days I got really good at typing “yes”.

The result was a bit of a surprise. It used a package called Crow to build a Rest API to its very own, very basic Wordle implementation, completely ignoring my code. That didn’t bother me too much - I expected to have to figure out an interface to the real back-end code that understands Wordle and all the complex algorithms involved. It took a couple of hours of refactoring my C++ code and inserting appropriate hooks in my new Cursor-created web_server.cpp file.

Then followed a seriously frustrating session. From the browser I could create a new game, but every attempt to interact with it just completely blocked at the browser end. It took a while to figure out that this was due to an arcanity called Cross-Object Resource Scripting (CORS). I confess to not fully understanding what this is, but the way Cursor had used React meant that it had to work. And it didn’t.

I spent ages googling, and trying to get Cursor to understand the problem and fix it. But it just kept going round in circles, telling about all kinds of completely irrelevant possible solutions. When a browser sees that a CORS interaction is about to happen, it sends a special OPTIONS request to find out whether the target is willing to support it. It’s just a question of adding a couple of text lines to the HTTP header. But whatever I did, these magic lines absolutely would not appear in my server’s HTTP response.

Finally, after a couple of hours, I discovered why, in the Crow documentation (which of course I hadn’t read before). Turns out that Crow refuses to let you modify the response to an OPTION request. I’ve no idea what the logic behind this is, but it makes it useless for this particular use case.

So… I said to Cursor, “generate the server for me using a package other than Crow”. It hit upon another package called Pistache, and generated the code to use that instead. The next hour or so gave me my best “typing yes” practice. The initial implementation wouldn’t build. Cursor identified an incompatibility between the code it had written and the version of Pistache it had installed. It then alternated between fixing its own code, and trying different versions and builds of Pistache. We went round that loop about 20 times before finally getting Pistache to work.

It turns out that Pistache is perpetually at version 0.99.xx, with the 'xx' varying on a daily basis and with an advertised total absence of backward compatibility. But in the end, it did work. I have absolutely no idea what I would have to do if I wanted to re-create the build environment.

Very quickly after that I had a rudimentary Wordle page that worked the way I expected it to, which was a pleasant surprise. I had spent maybe four hours of actual work, including the frustrating session with the useless Crow library.

Extensions

Now it was time to add all the extra functionality I wanted. The first things I added were how many possible words remain, and some suggestions for the best next word to try. Both can be turned on or off via respective checkboxes. Cursor did a great job here. It generated both the front-end and the back-end code and it took only a couple of iterations to get it to work properly. I was duly impressed.

The next item went much less well. The Wordle guesses are shown in a grid, with one word on each line, each cell coloured appropriately based on whether the letter is in the right place, the wrong place, or doesn’t appear at all. On the New York Times phone app, you type directly into the next, empty line in the grid. But Cursor had created a separate text box where you type, which then gets copied into the grid based on the result delivered by the back-end.

That’s functional, but not very pretty. I told it to make letters appear directly in the grid. It thought for a while, and generated a bunch of code. Nothing worked. You typed, and nothing appeared anywhere. It had explained that the text box was still there, and you’re still typing into it, but it’s hidden, and there’s code to move the letters into the right place as they are typed. Fair enough, if it works - but it didn’t.

It took a lot of iterations to get this to work as it should. But still, the letters weren’t being coloured based on the result, which defeats the whole purpose. And in the middle of trying to fix this, Cursor got stuck, running at 100% CPU and doing nothing. It often takes a while to figure stuff out, but this lasted for over an hour. I terminated it and restarted it. Coincidentally or not, soon afterwards it said that the log was too long and I would have to delete it to continue.

Left with no choice I did exactly that. But it wasn’t a good move. All the prior context of what it had done was lost. When I now said that the colouring wasn’t happening. it went off on several tangents to do with the code that colours CLI output, which is completely irrelevant to the web version. That was a very frustrating 10 minutes of saying “it’s your code that’s broken, nothing to do with this other class.”

Finally, in an oops moment, it realised it had changed the front-end code to expect a vector of guess results, but hadn’t changed the back-end accordingly. Once discovered, it was easy to fix. But it had taken most of an afternoon to get that far.

I once had a colleague a bit like that. He was a smart engineer and most of his work was good, but he would invariably break something, somewhere. When I pointed that out, he was very apologetic and rushed off to fix it - promptly breaking something completely unrelated. After he had left our company, his legacy included the most subtle, complex Heisen-bug I have ever experienced. It took over a week to find, finally done by reading every single line of every commit he had made in his final year with us. And even then it wasn’t obvious. Working with Cursor gives me a similar feeling.

After that unpleasant interval, though, things went amazingly well. I wanted to add a picture of a keyboard, with letters known to be inapplicable greyed out. I told it exactly that, no more, and it got it right first time. Even the aesthetics were good. Then I asked it to make the keyboard clickable, as a way to enter letters instead of typing them on the keyboard. That also worked perfectly first time.

Having got that far, I decided to pause and write about what I’d down, before I forgot it all. There is still plenty left to do. My first experience of vibe coding has been pretty positive. In a couple of days I’ve done something that would have taken weeks, and which in practice I would just never have done.

Saturday, 24 May 2025

The Kingdom of Two Sicilies

We were recently in and around Naples. Inevitably you learn about local history, and not only Pompei and Herculaneum. And so you learn that in the first part of the 19th century, Naples was the capital of the Kingdom of Two Sicilies.

A quick look at the map will confirm two facts you probably already knew: Naples isn't in Sicily (either of them), and there is only one Sicily. So, why was there a Kingdom of Two Sicilies, and why was Naples the capital?

And thus begins a long descent into Wikipedia and Italian history - although Italy, as a country, didn't exist until 1861. Which, not by coincidence, was the end of the Kingdom, whose existence lasted just 34 years from 1816.

It all started in the year 999, when Norman pilgrims returning from Jerusalem happened to be staying with Prince Guaimar III in Salerno, south of Naples. While they were there, the city was attacked by Saracens. The Normans, who were made of tougher stuff than the locals, ridiculed and attacked the besiegers, in an episode reminiscent of John Cleese in Monty Python and the Holy Grail.

Yes, this is the same Normans who a few years later invaded England, winning the Battle of Hastings in 1066 and placing England under Norman control for the next couple of centuries. They were evidently a pretty convincing bunch in battle. It's a long way from Normandy to Sicily, but they got about a lot.

After their help to the Prince of Salerno, the Normans were welcome back any time. Comparing Sicily - lovely weather, great food - to Normandy, it's understandable that plenty of Normans fancied a visit to see for themselves. Mediterranean tourism is nothing new, even before Ryanair.

The history of the period immediately following is very confused. There were a lot of battles, during which the Normans gradually accumulated more power and territory. What is certain is that in 1061, Robert and Roger Guiscard took control of Sicily from a bunch of feuding fiefdoms. With Sicily as a base, they gradually moved the boundaries of their local empire eastwards and northwards. In 1077 they reached Naples and took control of it. In 1130, the Kingdom of Sicily was formally established with the blessing of Pope Innocent II. Its capital was Palermo, which is definitely in Sicily.

The Normans evidently got fed up with Sicily. In 1198 the throne passed to Frederick II of the House of Hohenstaufen. As you may guess, he wasn't Sicilian. Their base was in Swabia, their capital near present-day Stuttgart. They were in turn replaced by Charles I of Anjou in France in 1266.

Things came to a head in 1282, when the Sicilian population got fed up with all this remote rule and threw them all out in the War of the Sicilian Vespers (Lambrettas were still a few centuries away). The throne of Sicily passed to Frederick III of Barcelona. Remote working is nothing new.

It took a while for the dust to settle, at the Peace of Caltabelotta in 1302. The Kingdom of Sicily was divided into two parts, the island itself and the mainland part. But the subsequent naming was surreal. The island part became officially the Kingdom of Trinacria, though still generally referred to as the Kingdom of Sicily. The mainland part was officially called... the Kingdom of Sicily, though generally referred to as the Kingdom of Naples. Makes perfect sense, n'est-ce pas?

This odd state of affairs had a very long life. In 1759, the King of Sicily (meaning Naples not including Sicily) was Charles VII of the House of Bourbon, which is to say French. But then he got king-hunted, and decided to take the offered new job as King of Spain. That left a vacancy in Naples, which Charles filled with his son Ferdinand. One of Charles' last acts as King of Naples was to start the construction of the largest monument to megalomania in Europe, the Palace of Caserta, just north of Naples. The building itself is vast, with over 1200 rooms, while the Versailles-like garden stretches over 3 kilometres.

In 1799, Napoleon attacked Naples and briefly took control of it. Ferdinand was forced to flee to Sicily (the island), which was protected by the British under Nelson. Sicily was a British protectorate from 1806 to 1814, which I suspect not many people in Britain know.

In 1815 Napoleon was defeated and the British lost interest in Sicily. Ferdinand took control again. His stay on the island evidently hadn't endeared it to him, because he took the opportunity to wipe out the other Kingdom of Sicily and to take control of both of them. The resulting joint venture he renamed (as you may have guessed) the Kingdom of the Two Sicilies. The islanders understandably weren't keen on this and revolted, but this and subsequent rebellions were brutally suppressed by Ferdinand and again by his son, Ferdinand II with support from Austria.

The Kingdom of the Two Sicilies only had a short life, though. In 1860 Garibaldi, as the head of the new united country of Italy, attacked and conquered Sicily. In 1861, everything became part of the Kingdom of Italy. If you'd like to know more, I suggest starting with the Wikipedia article. You will soon find yourself drawn into the complete history, as I was.

Thursday, 15 May 2025

Quantum Computing and Navigation - the State of the Art

I was fortunate to get tickets to the Economist's "Commercialising Quantum" conference on 13/14th May 2025. Over two days there were presentations and panels from people from manufacturers, researchers and other industry figures. Like all conferences, it was a bit of a mixed bag. But here are the main points that struck me.

When Will it be Useful?

Realistically, "quantum superiority" for a limited class of applications is probably 3-5 years away. IBM said 3, they're probably being optimistic though. "Q-Moore's Law" seems to hold - the number of qubits roughly doubles each year.

Strong consensus that the likely first application is chemistry and materials science (which is just a special case of chemistry anyway). For this you don't need anything spectacular, as soon as you have enough reliable ("logical") qubits to do more than conventional computers can (say 30-40), you have something you can use.

Error Correction

Raw physical qubits are extremely unreliable - error rates of 10-2 or worse. To make it useful, you need very powerful error correction. Masses of effort in this right now. The problem is that first, it takes a lot of physical qubits to create a single usefully-reliable logical qubit, and second, error correction is (relatively) slow. That matters, because for some technologies you only have microseconds before the whole thing turns to mush due to decoherence.

People talked about "logical qubits" without saying what they meant in terms of physical per logical. You can build a logical qubit (lqubit) with nine physical qubits, but it won't get you anywhere close to the reliability you need. Current estimates are that it will take 100-1000 physical qubits to make one useful logical qubit. So if your problem needs 100 logical qubits, you need at least 10,000 physical qubits. It's worse than that. To achieve an overall say 10-2 reliability, the reliability you need from each logical qubit increases with the number of them. So the number of physical qubits you need increases with the square of the complexity of the problem.

One company (Riverlane) has built an off-line error correction box, a 1U package using lots of FPGAs for speed. It sounds improbable, but they claim it works. You still have to program all the guard-bits in your quantum program, which is non-trivial, but they take care of the decoding.

How - Quantum Technologies

There are several competing raw physics approaches to building a quantum computer: superconducting, neutral atom, photonic, topological, trapped ion, quantum dot. There is a good survey article here . They all have been made to work at "toy" scale, and they all have $Bs of investment and serious companies (MS, Google, IBM, ...) behind them. They all have serious drawbacks, and none have been made to work at useful scale.

Clearly there will eventually be a winner, maybe two. I think it's fair to say that at this point nobody (who doesn't have a dog in the race) has the faintest idea which. It's not even certain that ANY of them can be made to work at scale, though given the $$$ and sheer number of quantum physics PhDs being thrown at them, something will probably emerge.

Crypto

THE talked-about QC application is cryptography, or rather breaking it. The nirvana is (relatively) rapid factorization of 2048-bit RSA public keys. It's still a long way off. Right now the estimate is that it will take about 10 million physical qubits. Assuming Q-Moore's Law, that is 15 years away. Supposing improvements in algorithms and error correction reduce that by a factor 10, call it 10 years. Still a long way off. (And "rapid" means in several hours, not seconds or microseconds).

Even so, there has been a lot of work on "post quantum cryptography" (PQC), i.e. cryptography which is resilient to attack using quantum techniques. NIST in the US has blessed several techniques. My guess is that the world will move fairly rapidly to using these, say within the next 3 years. That matters because for really critical stuff (like defence designs), state actors are already storing encrypted data hoping they'll be able to decode it "one day".

QC and AI

There were several sessions claiming to talk about this, but all the ones I attended were content free. Everyone agrees that QC will be part of the AI toolbox, but beyond that nobody had much to say.

Deployment

There were several companies proposing different kinds of "make QC usable for you" services and techniques. I'm 100% sure that this is the only way any "normal" software engineers will ever be able to use it, so this will be a big market. One day. 

Non-Computing Stuff - Quantum Navigation

Several sessions were about quantum-based navigation, i.e. getting GPS-like benefits without needing external radio signals. This is a huge deal because there are large parts of the world where GPS is unusable due to jamming and spoofing. There are two techniques, both dependent on fairly miraculous quantum technology. One is quantum INS - building accelerometers and gyroscopes that are orders of magnitude more stable than you get with classical techniques. The other is quantum gravimetry - measuring the local strength of the earth's magnetic field. Using that, you can relate your position to a map (which are available) and have a position accurate to within a few hundred metres.

The technology of quantum gravimetry is really mind-boggling, but a bit long to fit in the margin here. Basically it involves measuring the difference in position between two superposed quantum states of the same atom. If that seems reasonable to you, you have your head around quantum stuff a lot better than I do.


Thursday, 19 December 2024

Rediscovering the PDP-8


During my second summer at university, when I was 20, I worked for a local company that owned a DEC PDP-8 computer - in fact, two of them. The PDP-8 was the original minicomputer, sitting in just a single 19-inch rack as opposed to the whole building that our university ICL 1905 mainframe required. By today’s standards it was unimaginably constrained, with just 12K bytes of memory. Yet the company produced complex documents such as bills of materials on their PDP-8, for the architecture outfit that owned them.

They had started with a PDP8/I, and when I was there they had just acquired a newer PDP8/E, primarily as a way to get high-capacity disk storage using the RK05 removable disk. High capacity is a relative term. The disks held 2.5 megabytes of data - about a millionth of a modern hard disk, on a huge removable cartridge about 45 cm across.

My first job was to rewrite their existing sort program to use these new disks, which improved performance by a factor of about 100 due also to some moderately clever programming. My second job was my first taste of system level programming. DEC had supplied an interface between the two machines, allowing data to be passed both ways, but it came with no software at all. I wrote drivers allowing each machine to see the other’s peripherals as if they were directly attached. This meant that a program could access the new disks as well as the older peripherals on the PDP8/I, such as the lineprinter and high speed paper tape reader and punch.

Back at university, there was another PDP8/I, with a graphics display built around a Tektronix storage tube (the KV8I). I took advantage of that to implement Conway’s Game of Life, squeezing as much functionality and capacity as I could into the machine’s 8K 12-bit words. That became my final year project for my Computer Science degree. It really pushed to the limit what could be done with such a tiny machine. Many years later I rewrote my program in C++ for Windows as Winlife32, still available on the web and downloaded from time to time.

A Career at DEC

My summer vacation job turned out to have a big influence on my career and the rest of my life. I really enjoyed working with the DEC machines, and when it came time to look for a job a year later I applied to them. I had no idea what jobs might be available, so I pretty much said, “Do you have any jobs for a new graduate?”. As it turned out, the senior programmer at the vacation job had moved to DEC in the meantime, and gave me (I suppose) a glowing reference. DEC offered me a job, in their small European software development in Reading. It had the highest salary of the various jobs I’d applied for, and on that basis I went to work for them. I spent the following 20 years working at DEC, on the IAS operating system and several network products, and enjoyed nearly every day I worked there.

But the PDP-8 was at the end of its life. It had been replaced by the larger and much more capable PDP-11, and all my work was for that until it was in turn replaced by the VAX a few years later. We didn’t even have a PDP-8 in Reading. So that was the last I saw of it.

The PDP-8 had a very clever architecture. With a 12-bit word it could only find space for 6 different memory-access instructions. The two most basic memory-access instructions, from the 1950s until now, are LOAD and STORE, to move a value between memory and a register. The PDP-8 had neither. LOAD was replaced by ADD, which added the memory value to the accumulator. To load a value, you first had to make sure the accumulator was already zero. There was an instruction to do that, but the STORE instruction was replaced by DCA (Deposit and Clear Accumulator), which also left the accumulator clear. This substantially reduced the number of instructions which would otherwise be needed to clear it explicitly, though it can catch you out.

In addition to the 6 memory-access instructions, it had a bewildering variety of “microcoded” instructions, where setting various bits would do things in a well defined sequence. For example the sequence “CLA CLL CMA RAL” would clear the accumulator, complement it, and rotate it left without introducing a low order bit, leaving the octal value 7776, or -2. Others would skip the next instruction based on some condition, so for example to jump somewhere if the accumulator is zero, you would write SNA (skip if non zero) followed by an unconditional jump.

My project to connect the two PDP-8s led to an interesting discovery. The hardware involved wasn’t a standard product. It had been specially built for us by DEC’s custom hardware group (CSS) in Reading. Sometimes my code worked perfectly. Other times it would hang in mysterious ways. Finally I attacked the hardware itself, with the only equipment we had - an old-fashioned, huge Avo multimeter. Carefully following the schematics that had been supplied with it, I attached a probe to a pin to see whether it was on (5V) or off (0V). It showed about 3.5V, halfway in between. In a digital circuit, this is impossible. Further probing showed that the “5V” power supply rail was in fact at 3.5V. With a bit more tracing, I discovered that the unit had been built for 220V, but had been connected to the internal 110V transformer.

That explained why it worked sometimes and not others. If the mains voltage was high, for example mid-afternoon, then the “5V” supply reached just high enough to make things work. But at lunchtime or late afternoon, when the power demand was higher and the voltage was a bit lower, the poor thing just couldn’t quite get its logic circuits to work.

A call to DEC, and a visit from their very apologetic engineer, fixed things. After that my software worked perfectly.

A New PDP-8

My PDP-8 knowledge remained lurking in a back corner of my mind for 50 years. A few years ago someone produced the PiDP8, emulating the PDP-8 hardware on a Raspberry Pi and completing that with a 2/3 scale replica of a real PDP-8/I front panel, all 92 lamps and 21 switches of it. Later they did the same for the PDP-11/70, and just recently for the 36-bit PDP-10. A friend of mine has a PiDP11 running the IAS operating system that I worked on soon after joining DEC.

The emulation uses Bob Supnik’s SIMH system. He has been maintaining and extending this ever since long before demise of DEC in around 2000. It can emulate every system ever made by DEC, and dozens of others too. It also understands all the common peripherals, so you can connect simulated disks, tapes and paper tape.

And then a week ago, completely unexpectedly, a friend gave me a PiDP8. The panel comes in kit form, so every one of those 92 lamps and 21 switches has to be soldered into a board, along with a few auxiliary components. That took a couple of days to complete. Meanwhile, I already had a Raspberry Pi4 left over from another project. Amazingly, after 4 years in a cardboard box, it booted up and after a couple of hours was updated with all the latest software.

Installing the PiDP8 software package on the Pi was straightforward, and I got it running - without the unfinished front panel - with no difficulties. Later, though, when I did connect the panel, I ran into a problem. All the lights worked perfectly, but the switches showed a bogus value. This is mentioned in the instructions, which explain that a patch needs to be applied when using the Pi4. So far, so good.

However finding the patch was another story. A quick search found the instructions, but they involved a mysterious source management package called Fossil. Trying to run it showed that the PiDP8 software distribution includes all the sources, but not structured as a Fossil repository - so Fossil won’t run. I have no idea how to use Fossil, and zero interest in learning yet another alternative to Git. Luckily, more searching found the one file that needs to be updated, and it was easy enough to rebuild with the new file.

That done, I had a working PiDP8. The package includes not only the emulator, but also the OS/8 operating system and all associated utilities. Everything worked. But now the question was, what to do with it?  It comes with a few simple games written in Basic. They’re fun for a few minutes but the retro-novelty quickly wears off. The PDP-11 operating systems I worked on all rotated lights on the front panel to make a familiar pattern when the machine was idle, so in a bout of PDP-11 nostalgia I decided to make my PDP-8 do the same thing. (OS/8’s null job is a two-instruction loop that does nothing at all. Memory was much too precious to waste on frivolities).

Rediscovering PDP-8 Assembler

It has been a long time - well over 20 years - since I have written more than the odd line of assembler, for any machine, though I’m familiar with reading it for the x86. The first step was to figure out the logistics of programming the machine. Full nostalgia would have required me to use OS/8’s very primitive text editor. In the 1960s that was an enormous improvement on editing paper type using the ASR33, as we did for the computer I used at school. But that was a step too far

I would create code on the host Raspberry Pi using my regular editor, Emacs - itself pretty retro but I’m used to it and haven’t yet found anything significantly better. I could also assemble it there, using the Palabert port of the PDP-8 assembler. But then I had to move the binary file to the PiDP-8.

A bit of searching showed that the simulator allows you to turn a host file into a simulated paper tape. The PDP-8 PIP program can be used then to read the “paper tape” into a file. (PIP was the standard file management utility on all the DEC systems until VAX). But, as I quickly discovered, it will only transfer text files, not binary. The obvious solution was to transfer the text file, then assemble it with the native PAL assembler.

That still left one problem. In an age when Unicode can represent every known alphabet, thousands of emojis and other weird stuff like ⨔, it’s easy to forget that not so long ago even lower case letters were a rare luxury. The PDP-8’s 12-bit word could hold two 6-bit characters, permitting only upper-case letters. Writing code in upper case is painful, so instead I wrote a little Python program to convert to from lower case, and also to change the line ending to CR-LF. In the days of ASR33 teletypes, these characters physically instructed the machine to move the carriage and roll the paper up, and the PDP-8 utilities expect them.

Finally I could try my code out. It was surprisingly hard to get it to work correctly. Programming the PDP-8 requires a special mindset, which in my case had evaporated over the last 50 years. Numerous times I forgot to clear the accumulator before loading it with TAD, or tried to reuse it after a DCA. I had to re-learn use of the so-called microcoded instructions. For example, to negate the accumulator (often needed since there is no subtract instruction) requires CMA IAC - complement and then increment the accumulator, forming the twos-complement. The CLA element clears the accumulator at the start of one group, but at the end of another group. There’s a good reason for this - the PDP-8 instruction set is truly ingenious. But you have to get your head round it.

Surprisingly, I found my 1970 Small Computer Handbook, which was helpful. Despite the very generic name, it was a complete manual for the PDP-8, describing not only the instruction set in great detail, but also every single one of the numerous available peripherals.

Modern debuggers and IDEs are extremely powerful. The PDP-8 just had ODT (for Octal Debugging Technique), a simplification of the PDP-10's symbolic debugger DDT (a backronym for Decimal Debugging Technique, but really named after the then-universal insecticide, for getting rid of bugs). ODT lets you set a single breakpoint, and requires you to do everything using octal addresses, with an assembler listing in front of you. But for my simple light-twirler it was perfectly adequate.

There was one bug that took me a long time to track down, which turned out to be a function that returned to the wrong place. I’d completely forgotten that there are 8 memory locations (0010-0017) that autoincrement when you use them as index registers for an indirect memory access.  And I was using one to store the return address from a complicated function. So when it executed the usual return instruction - JMP I XXX - it first incremented the return address, then returned, thereby skipping the first instruction after the call. The fix was simple enough, don’t use those autoincrement locations for anything else. They’re there to reduce the amount of code needed to do, for example, a block memory copy - another ingenuity of the PDP-8.

A Working PiDP8/I

I couldn’t stop myself tweaking the program, to twirl the lights in various randomly chosen ways. That done, all I had to do was finish the assembly of the physical machine. Normally the Raspberry Pi is accessed through SSH or, if graphics are required, VNC. But it seems a good idea to be able to access it directly - networks are never to be trusted! So I added tails to the USB, HDMI and power connectors, bringing them out through a slot in the base of the case.

Indispensible tools: Panavise board vice, Antex
temperature controlled soldering iron, desoldering tool

I should add that the PiDP8 kit is really excellent. The instructions are very comprehensive, all the parts were present with even some spares, and everything is very high quality. It's a lot of soldering, 92 LEDs, 21 switches, and various other bits. It is much easier if you have a suitable board vice, and a powerful temperature-controlled soldering iron.

Now my PiDP8 sits on the corner of my desk, next to my 1950s-vintage Olivetti Divisumma and my Nixie tube clock. Its simulated incandescent light bulbs twirl gently in a constant reminder of a nearly-forgotten era of computing.

If you have a PiDP8 and want to see your own lights twirling, the program is available on github.

A retro-collection: my Nixie tube clock, the PiDP8, and my Olivetti Divisumma

Thursday, 3 October 2024

Learning the Georgian Alphabet

Many years ago, in an English-language bookshop in Tokyo, I bought a book called Writing Systems of the World. It’s still one of my favourite books. It has a two-page spread for every writing system still in significant use. One that struck me most was the Georgian script. It looks like nothing else - it is completely unrelated to the Latin alphabet, or to the Cyrillic alphabet used for Russian, or indeed to anything else. Neighbouring Armenia also has a unique script, but the two are unrelated.

The Georgian script is particularly beautiful, with complicated, elegantly shaped letters like ლ. It has intrigued me ever since I discovered it, but it is a lot of work to learn an alphabet for which you have no use, so I never got round to it.

Getting Started

Georgia is an interesting country for many reasons. It has managed to retain a unique language and culture despite having been invaded repeatedly over the centuries, from all sides. It is one of the oldest civilizations in the world, and it is the birthplace of winemaking. It still has a unique technique for making wine, resulting in wines different from anything else in the world, in Europe or elsewhere. For all these reasons, I have been tempted to visit for several years. Finally, now that the Covid crisis is over, we were able to organise a trip there, which I’ve described here.

This at last gave me a reason to learn the Georgian alphabet. I find it really unpleasant if I can’t decipher signs and so on, even if they don’t mean anything to me.


The Georgian Mkhedruli Alphabet

The alphabet contains 33 letters. Faced with just a list of letters, it’s very hard to know where to start. Fortunately I found an excellent website which presents them in groups of 3 or 4, with exercises for each group. Using this, and working through each group three or four times, it took just a couple of days to memorise the letters to the point of being able to decipher and to write Georgian text.

The word “decipher” is important. A fluent reader, in any language, reads a whole sentence at a single glance. At the other extreme, when you first learn an alphabet, you go through letter by letter, decoding them individually. It’s slow and very frustrating, especially when you’re in a car or bus and you only manage the first few letters before you can no longer see what you are trying to read. It takes lots of practice, and knowledge of the language, to read faster than that.

One nice thing about Georgian is that the writing system is completely phonetic. Every letter is pronounced, and pronounced as written. Conversely, if you hear a word, you know exactly how to write it. This is very different from English, whose spelling is notoriously and horribly irregular, or French, where you never know how many letters at the end of a word not to pronounce.

On the other hand, several of the letters have variant shapes, some of which are not well documented. More on that later.

A lot of the letters are confusingly similar. For example კ and პ (/k’/ and /p’/ respectively) differ only in the presence of the tiny top bar of პ. This is true of the Latin alphabet too, but we get completely used to it and don’t notice for example the similarity between ’h’ and ‘b’ or ‘O’ and ‘Q’.

It's wrong to talk about the Georgian alphabet, because actually there are three of them. Here I've only talked about Mkhedruli. which is universal for everything written nowadays. There are also two historical alphabets, Asomtavruli and Nuskhuri. The former now appears only in inscriptions in churches, and the latter nowhere at all. There is little visual resemblance between the three. If you wanted to learn the two historical alphabets, it would be starting over. But there's little point anyway.

Phonetics

Most of the sounds in Georgian exist in English also. Those sounds are easy. Some are not so easy for an English speaker:

  • ხ /χ/ - like the ‘ch’ in ‘loch’
  • ღ /ɣ/ or /ʁ/ - similar to the Parisian French pronunciation of ‘r’ or Spanish ‘ll’
  • ყ /q/ - like Arabic ‘q’, similar to a ‘k’ but pronounced at the very back of the mouth

Then there are the so-called glottalized consonants. Many of the plosives have this variant. In the list below, each of the second letter is “glottalized” and the first one isn’t. 

Unglottalized
Glottalized
Sound
/k/
/p/
/t/
/ts/
/ʧ/ (ch)

It’s very hard for a non-native to figure out the difference. I asked a few people to say the two letters, and in isolation they sound very different. The glottalized variant is forced out much harder, and the un-glottalized version sounds softer. In theory, to pronounce the glottalized form you make a glottal stop which you release forcefully as you articulate the plosive - hence the name. But it’s very hard to do this in connected speech, as opposed to a single isolated consonant. Listening carefully to people speaking - even though I didn’t understand anything - I couldn’t hear any distinction. I suspect that for a foreigner, unless you really want to try to sound like a native, you can just ignore the distinction completely.

The letter ვ is glossed as /v/, but I read somewhere that it often degenerates to /β/, the bilabial fricative - similar to /v/ but made by pressing your lips gently together rather than your top teeth and bottom lip. At one place we visited I heard the ვ in qvevri pronounced more like /w/, making it sound like “kwewri”.

When transcribing other languages into Georgian, there is no exact match for the /f/ sound. The letter ფ (/p/) is used in this case. That makes sense because there is very little difference between /p/ and /ɸ/, the voiceless bilabial fricative, which in turn is almost indistinguishable, audibly, from /f/.

Variations

A complication of the Georgian alphabet is that several of the letters have different variant forms. That’s not unique to Georgian - for example in the Latin script, ‘g’ can also be written as ‘g’, and ‘a’ can also be written as ‘ɑ’. We’re so used to this that we don’t even notice it, but to a foreigner learning the Latin alphabet for the first time, these appear as completely different symbols. We also have upper and lower case, meaning that there are actually 52 symbols to learn, not 26. And we have fonts with and without serifs - it’s not at all obvious to our foreigner that ‘I’ and ‘I’ are the same symbol.

Georgian takes variations a bit further, though. First, there are three letters that are generally simplified, and in print do not resemble the characters shown in the picture at the top. These are among the most spectacularly squiggly letters, and in normal type and handwriting are always simplified.

Next, there are letters that are routinely simplified, though not in most fonts. For example ლ (/l/) can be simplified to a single loop, carefully skipping the double-loop ღ which is a completely different letter. 

(These are hand-drawn because it's impossible to be sure of getting the right glyphs otherwise. There is only a single Unicode code-point for each character - which glyph you get depends entirely on the font).

There is no true upper case in Georgian - for example, sentences begin with normal letters. But there is an alphabet variation called Mtavruli that has been proposed as such in the past, and is still widely used in signs, adverts and the like. Mostly, the only difference is that the letters have a constant height, with no ascenders or descenders. Some letters, though, can be greatly simplified, as shown in the sketch above.

Just opposite our hotel was a shop with this sign. The first letter, and the last but two and last but one, don’t look anything like any “official” Georgian letter. In fact they are greatly-simplified versions of ლ რ დ respectively. So the whole name is ლომბარდი, “lombardi” (meaning pawnbroker). These characters very often appear on signs and such, but I’ve yet to find anything that describes them. I did find a font that shows them, below.

\

Conclusion

It was a pleasure to be able to read signs - and especially bus destinations - while we were in Georgia. The next step would be to learn something of the language, but that would be a huge investment for very little reward. I'd like to return there some time, but it will only be for another short visit. So the language will have to be for another lifetime.

Friday, 20 September 2024

A Visit to Georgia - Part 2

 

This is the second part of my blog about our trip to Georgia. For the first part, see here

Mtskheta

Mtskheta, viewed from Jvari Monastery
Samtvaro Monastery, with
Wine Ice Cream
Bas-relief on the Samtvaro Monastery,
with inscription in Georgian
The next day saw us leave Tbilisi in the opposite direction, westwards to the town of Mtskheta. This was the capital of the region (confusingly called Iberia) around the second century AD. It had already been established as a town for a couple of thousand years - it claims to be the oldest continuously-inhabited town in the world, and is certainly way older than Tbilisi. It was the centre of the Christianisation of the country in the fourth century, so inevitably it has no shortage of monasteries and churches.

The most prominent is the Jvari Monastery, on a hilltop dominating the town and the confluence of the Aragvi and Mtkvari rivers, the latter continuing through Tbilisi and eventually draining into the Caspian Sea in Azerbaijan. The view is stunning. The monastery was built in the fourth century but soon proved to be too small. The current building dates from the 7th century. It was badly damaged by invaders - inevitable in Georgia - but survived with major repairs.

After Jvari we descended into town to admire the churches and monasteries to be found in the plain. The Samtvaro Monastery's associated church is huge. One of the striking features of Georgian churches is their bell towers. Unlike European ones, invisible from the interior, these rise high above the main part of the church, at the intersection of the nave and transept, supported by huge pillars integrated into the walls. They are very obvious from the outside, and truly awe-inspiring from the inside, as you gaze up into their heights. This church, being one of the biggest, has one of the most impressive.

As everywhere, this major tourist attraction is surrounded by gift-shops, cafés and so on. Everywhere sells something called wine ice-cream. I really meant to try it before we left, but never quite did.

Between monasteries we visited a very charming and interesting winery, in a private house a few kilometres from the town. We sat on a terrace overlooking the Mktvari river as we sampled the wines. The owner was a very interesting guy, a professor at the Technical University in Tbilisi who, very typically for Georgians, made small amounts of wine at his “country home”, where we were. He spoke good English although since we were supposed to be francophone, the conversation was a mixture of Georgian/French translation and just English.

This was our first taste of wine made using the Kisi grape, another unique Georgian varietal - in a qvevri, of course. The qvevri gives body to any white-grape wine, but Kisi takes it a step further. It has masses of body and mouthfeel, and will stand up cheerfully even to red meat, as we discovered later. Then it was time for the cha-cha. He gave a rather poetic speech about how drinking it daily kept men young, and then it was time to drink. It was 60% alcohol, so the only way to drink it was to pour it down your throat without letting it touch the sides. Even so it was pretty potent.

He asked us to guess his age. I replied 65, and he looked disappointed. So I added, “But if I didn’t know about the cha-cha, I would have said 50”. That got a smile, a big laugh and we were friends again.

There was one more church to go before we returned to Tbilisi. All of the churches were awe-inspiring but it’s impossible to go into the details of each of them, even if they hadn’t all got jumbled up in my head.

Tbilisi Solo

Tbilisi street scene, with
alarming enclosed terrace
It was only mid-afternoon when we got back to Tbilisi, so we had some free time to explore the town alone before dinner. Our hotel was too far from the town to walk, and even the metro station was quite a long way. But I had noticed the constant stream of modern green buses in front of our hotel, and had spent some time studying how they worked. We were dropped off at the central metro station, where we could buy “Metro-Mani” cards to access all public transport. This was also home to Tbilisi’s most upmarket shopping mall, imaginatively called the Tbilisi Mall. It had all the same up-market brands that you would find anywhere in Europe, full of well-dressed Tbilisi natives doing their shopping. It was impressive to see but of limited interest to us.

We walked back to what had become the “Edsel Place” and from there explored the old town. Soon we found ourselves back at the lemonade café, with a couple of glasses to quench our thirst. Then I put my knowledge of the bus system to good use, taking us to the National Gallery. There was an exhibition by Pirosmani, Georgia’s most famous artist. He lived in the late 1800s, completely unheard of - he only became famous, or even known, posthumously. His style was very naive yet captivating in the way it depicts every day scenes. My own personal favourite is a very simple profile of a boar.

Boar, by Pirosmani
Tbilisi street scene by Machavariani
Cat eating our cake at Prospero's bookshop

There were works by other Georgian artists too, some better than others. There was a big display of works by Machavariani, a late-20th century artist with some very vivid pictures of crumbling Tbilisi as it must have been under the Soviet Union. The museum isn’t very big, it just has four large exhibition rooms across two floors. We arrived less than an hour before closing, yet had time to enjoy everything and go back for a second look at our favourites. It’s a lot less overwhelming than the Louvre or London’s art museums.

Somehow I’d discovered that Tbilisi has an English-language bookshop, and that was only a short walk along Rustaveli Avenue, Tbilisi’s version of the Champs Elyses. It was a delightful place, arranged around a courtyard where you could sit and enjoy tea, coffee and pastries from the shop’s café. Inevitably I came out with a bag full of books, including a Georgian language primer which realistically I will never do anything with. But it seemed like a good idea at the time - it’s impossible to resist a language when you are constantly surrounded by it.

The tea was good but the pastry, advertised as a “milk scone”, was dry and unappetizing. Which was just as well because the cat which had been marauding around the courtyard suddenly leapt onto the table and stole it. He didn’t find it unappetizing at all, and steadily munched his way through about half of it before abandoning the resulting pile of crumbs. We supposed it must have really contained milk.

After that another short bus ride took us back to our hotel, and to that evening’s dinner. It was at a restaurant which we were assured was excellent - it was certainly very good - but which strangely was completely deserted when we arrived, and only had a couple of tables occupied when we left an hour later.

Troglodytes

Another westbound departure took us to the world-famous troglodyte village of Ouplistsikhe (just take my word for it and don’t try to pronounce it). But on the way we had to pass through the town of Gori. Gori is famous for exactly one thing: it was Stalin’s birthplace. His real name was Dzhugashvili, an unmistakably Georgian name. In Soviet times a museum to his life was established in the town square, and surprisingly it is still open and quite popular. It shouldn’t be thought that just because he was Georgian, he went out of his way to be nice to his native territory. Over 600,000 Georgians were killed uner his regime, between the war and various purges, getting on for half of the male population.

Georgia can be thoughts of as a rather montainous plain, sandwiched between two mountain ranges. To the north is the Great Caucausus reaching up to 5000 metres with Russian Chechnia on the other side. On the south, the mountains form the border with Armenia. They sound like the perfect natural boundaries, but that is reckoning without the Russians and their love for stirring up messes. Soon after Georgia became independent, the Russians funded separatists in Ossetia on the other side of the Caucasus, who somehow managed to take over a big chunk of Georgia, calling it South Ossetia. Our route to Gori took us within a kilometre or so of the invisible boundary, but it is out of the question to cross it. The only way from Georgia proper into South Ossetia is via Russia, North Ossetia and then across the mountains. The Russians pulled a similar stunt with Abkhazia, on the north-western side of the country, so now a fifth of Georgia’s area is inaccessible and practically speaking, under Russian control.

Huge rooms at Ouplistsikhe hewn from sandstone
Chapel at Ouplistsikhe, with rooms under
Apothecary, with storage shelves
Rooms at Ouplistsikhe

We didn’t stop there, though we did see his armoured railway carriage sitting outside the museum building. We went straight on to Ouplistsikhe. The story is simple enough: about two millennia before Christ, the locals discovered caves in the soft sandstone that overlooks the Mktvari river. Better, they discovered that it was soft enough to excavate with the limited tools available at the time. And excavate they did. At its height, around 0 AD, it had hundreds of rooms, a palace and a theatre, all hewn out of the sandstone. Some of the rooms are truly huge, ten metres or more on each side with correspondingly high ceilings. It must have taken decades to create each of them.

Of the theatre, all that is left now is the stage and the dressing rooms behind it. Originally there was a large tiered auditorium. For once it wasn’t invaders who wrought the destruction, but nature in the form of two serious earthquakes, the worst in 1920 which sent the whole auditorium crashing in to the valley below.

Invaders had played a part in the history of the town, inevitably. It resisted the Muslim attacks in the 8-10th centuries, but was finally abandoned during the Mongol invasions of the 14th century. Since then it has been uninhabited. While much of the sandstone remains, you just have to imagine everything that wasn’t made of stone. You can still the big holes in the cavern walls which supported huge roof beams. Archaeologists have done their best to understand the functions of what remains. For example there is a pharmacy, with little shelves for the potions and medications hewn out of the rock at the back.

To get to it from the car park and visitor centre is a long climb up some modern steel steps, with the original, heavily-worn sandstone steps underneath. The return down into the valley is through a rather daunting tunnel, built in antiquity as an emergency escape route, whose exit is right by the river.

That day we had a “proper” lunch, in a restaurant by the visitor centre. It was completely predictable: salad followed by khachapuri, vegetable stew and fruit. I also has a beef stew, which had the toughest beef I have ever tried to eat in my life. The knife made no impact on it, and neither did chewing, except to flatten it a bit. Truly a dish to remember, but not for the right reasons.

From there we drove into a long, mostly empty mountain valley, to the settlement of Ateni. Now it is a small and very scattered village, but in medieval times it was an important city, surrounded by fortresses. It is still worth visiting because of the church that remains from that time, the Ateni Sioni. Built in the 7th century, it has amazingly remained unchanged ever since. Like all the churches we visited, its exterior is covered in interesting bas-reliefs. The one that caught my attention is a saint who became a curer of animals, extracting a tooth from a lion. I wonder how much he paid for professional insurance? It makes even deep-sea fishing seem safe.

Our final stop was at the most unusual winery of all that we visited. It started with a kilometre hike along the valley from the church, crossing the river on a rickety timber bridge just wide enough to walk across. Cars have to use a ford, a manouevre which would have been tricky in our much-missed Toyota FJ, never mind a normal car.

Ateni Sioni church
Fresco at Ateni Sioni
Lion-healer extracting a tooth, bas-relief
at Ateni Sioni
Wines at Nika Vacheishvili's Marani

 Despite the difficult access, you can go and stay there, at Nika Vacheishvili’s Guest House. In addition to the main house, guests are accomodated in a modern building, with eight rooms on two floors. Our tasting took place in a terrace overlooking the river, with fantastic views into the mountains. The wine came in unlabelled bottles, with just some markings in white ink. The first one, an amber kvevri wine, was extraordinary. Unfortunately we didn’t note the grape varieties, but they weren’t the usual Georgian ones. It was full of body, with masses of fruit yet not “fruity”. The second wine was the same grapes, but a different year. It was good, but not as good as the first.

Once the owner realised we were interested and taking his wines seriously, they came without stopping. We stayed at least an hour longer than we were supposed to, including an interesting chat with a German couple who were staying there for a couple of nights. We bought a bottle of the first wine to bring back with us. Then as we were hiking back to the car, the owner passed us in his car and insisted on giving us another bottle because, he said, he had got the year wrong. We gave the “wrong” bottle to our guide, keeping the one we were supposed to have all along.

Since we had lingered so long, there was no time to go back to our hotel. We went straight to that evening’s dinner, which also included a demonstration of traditional Georgian folk dancing. This was entertaining, as these things go, in a restaurant which evidently did nothing but these “folklore evenings”. Naturally all the guests were foreign, I noticed American, English, Chinese and Russian. We were most impressed by the master of ceremonies, who looked exactly like a bouncer and no doubt doubled as such should it ever be necessary.

Second Tbilisi Solo

On Saturday we were on our own all day. The tour proper had finished on Friday, but we stayed an extra day so we could catch the Air France flight home. We decided to spend the day exploring Tbilisi, which really meant just wandering around. As soon as you get even a few metres from the main tourist streets, it’s a fascinating and delightful place. Buildings are in varying states of disrepair, but mostly evidently in use. One striking feature is the balconies. Nearly every building has several balconies, some of them already collapsing, others that you certainly wouldn’t walk on, and others furnished and in daily use.

We found a quiet place, Gudiashvili Square, with just a few locals walking their dogs or sitting chatting. In the centre is a fountain made from a charming statue of two lovers under an umbrella.

From there our random walkabout led us to the Jvaris Mamas church. Unlike all th eother churches we visited, this one has had its frescoes restored, meaning that they are complete and in vivid colours, covering nearly all of the interior walls.

From there we returned to the baths district, which we’d seen with Lali on our first day. The baths are all fed from a hot spring which also feeds into a stream running down a steep and picturesque valley. In the end we decided just to sit and drink tea watching the valley and the people in it, rather than trying to take a bath. Thanks to the online bus map and guide, I was able to find a bus which took us from there straight back to our hotel.

One very striking thing everywhere in Georgia is the presence of vending machines in the street, selling beer, soft drinks, snacks and so on. The only other place we’ve seen this is in famously crime-free Japan. In France, Britain or the US they would be vandalised and robbed within hours. It tells you a lot about Georgia. During our strolls around Tbilisi, sometimes in narrow, deserted streets, we never felt in any danger.

As we walked the short distance from the bus to our hotel, we passed what seemed to be a combined hotel and up-market shopping mall. We went in to explore, and found a huge courtyard full of people, mostly students. Following the example of someone emerging from a side door, we found a wine bar run, improbably, by a Dane. We spent a very pleasant half hour sitting on the terraced staircase in the cool evening air. Apparently the place used to be a huge printing works, in Soviet times, which has now become a hotel, and art gallery, and some wine bars and restaurants.

For our last dinner we wanted something a bit different from the standard classic Georgian food we’d eaten all week. But we still wanted something with a Georgian touch - it seems silly to visit Georgia to eat pizza or sushi, even though these were readily available. We found a highly-rated restaurant called Shavi Lomi, billed as Georgian/European fusion. Our first impression was not great. We took a Bolt to get there, since the bus ride, though possible, looked a bit adventurous. At first we went along busy streets lined with shops and restaurants, on the north side of the river. But then we turned into a series of deserted back alleys, and in the middle of one the car stopped and the driver made it clear we were there. We saw the sign for the restaurant, but a heavy steel door was firmly closed and locked. Just as we were wondering what to do next, the door opened and a very apologetic woman beckoned us inside. The transition from the deserted, dirty street to the busy, well-lit courtyard was a bit Tardis-like.

The food was excellent. I had a beef stew and Isabelle had a lamb dish. We decided to drink a “white” wine with this, an amber Kisi qvevri wine. It sounds improbable, but they went perfectly together. It made a pleasant complement to all the classic food we had eaten.

Tbilisi Street Scenes
The Romantic Fountain,
Gudiashvili Square
Restored Frescoes, Jvaris Mamas

Return

The next morning, it was time to return. Many years ago we boarded an Air France flight in St Petersburg, with great of relief that we had survived and even enjoyed our week in Russia. We had no such feeling this time. I would happily go back to Georgia any time, and there is still a lot we have to discover - the high mountains of the Caucasus, the Black Sea coast at Batumi, and no doubt others too.

Air France did nothing to make us feel welcome. The crew was interested only in hiding in the galley, and the food was truly awful - such a shame when you consider what Georgia is capable of producing.