[go: up one dir, main page]

Viriconium nights M. John Harrison

This is the Ace original paperback from the early 1980s.

There are 2 books called Viriconium nights. This is the one that includes a novelette called ‘In Viriconium’, which is a shorter version of the novel of the same name. It’s my favourite piece in the book, which I guess is good because it’s the longest. The two Viriconium nightses overlap substantially, but each has pieces missing from the other, so to speak. What that means for assembling a ‘complete’ Var-ecomium sequence, should you feel the drive (keeping in mind that feeling such a drive is in some ways antithetical to the author’s approach) I guess depends on whether you care to try. What do I mean?

Well, first, Harrison is resolutely against rigorous world building. Viriconium changes geography, land marks, governments and even names from story to story. Thus, it is entirely possible that there are ‘Viriconium stories’ that never mention Viriconiom because the city’s name has drifted so far even from Uroconium or Vira ko or whatever that the links have become so tangential as to be unnoticeable; thus, even defining what stories ought to be in such an assemblage is, I suspect, intentionally problematic. (Case in point: one of the stories in this book mentions the machine in shaft 10, a story that does not appear in most lists of what’s in the Varyconium sequence.) If Varoconia is indeed set in the very far future when reality is exhausted and unable to keep its shape, let alone remember its orthography, then this world could be the future of every other piece the author has ever written. Maybe it all fits!

Well, second, Harrison is resolutely against rigorous world building, and seemingly for ambiguity. (It’s not like our world is terribly rigorous in operation.) So I find it hard to believe he would be keen on cutting the Viriconium mob out from the rest of his flock of words and penning it. Clear definitions wrapped up in neat bows are not what this is all about.

I’ve read a few things by Christopher Priest, and there are commonalities with the Dream Archipelago, though Uracotherium came first.

Harrison’s work is stylish. The earlier pieces have the British new wave SF vibe, especially ‘Lamia mutable’ from Again, dangerous visions, ‘Lamia and Lord Cromis’ (from one of the New Worlds anthologies that succeeded the magazine) and ‘Events witnessed from a city’, none of which I fully understood. They are full of symbolism that I don’t get, and ennui, and that end-of-time vibe reminiscent of Moorcock’s Dancers at the End of Time, and of sword and sorcery full of weirdly ill people, like Moorcock’s Elric. Can’t say they are really to my taste. I fail to grasp the logic of the story and end up flicking back through the story looking for some explicative (or even explanatory) pages that were stuck together. In practice I guess I’m just too ignorant to get the allusions and recognise the intertexts and suchlike. I suspect I’m expecting things the stories never were meant to deliver — expecting plot when there is no reason a story and its reading experience cannot be a series of striking images and the responses they evoke; — and Harrison excels at striking images. I shall not forget the astronomer in his horse-faced disguise. (Skulls recur, as do anemones [the flowers, not the sea creatures, though sugared anemones … no, it’s too disgusting] and artists as protagonists, the last of which would ordinarily put me off but here did not.) (I tend to dislike books with writers as protagonists on the grounds of incest, and by policy suspect a painter-protagonist of being a writer in disguise.)

The further from sword and sorcery the stories get, the better I like them. Whether inhabiting the cloying (everything is always damp and plaster is always sloughing away) streets of Viriconium (or Uroconium, or Viri ko, or whatever the city is called this week), or the outlying regions, where Viruconium is the centre of gravity (however far away), the cast of coping, quietly desperate citizens is more interesting than any number of sword-wielding would-be (or trying-not-to-be) heroes. These stories make up the bulk of the book, and are definitely worth a read.

A lot of books are a lot like a lot of other books. M. John Harrison’s books are not like other books. That’s a good thing.and that alone is reason to read them.

ZMC in 2026

ZMC is my old program for harmonic modelling of crystals. I used it to do some science once upon a time. Nobody uses it, but it was bugging me that the program would not compile on modern gfortran.

Now it does. See https://github.com/DJGoossens/ZMC.

Yay. Below are 2 pictures, the first a crude diagram of the contact vectors used to cause the displacements of adjacent molecules to become correlated and below that the diffuse component of the diffraction pattern, viewed in the h0l plane.

 

An ASCII fishtank in your terminal

https://github.com/cmatsuoka/asciiquarium

a sea monster and some fish, drawn in ascii characters

Here is what I did  to install it on Cygwin. The same would work for most POSIX systems. It also worked on Debian GNU/Linux, for example. Obviously with apt rather than setup.

First, used setup.exe to install these (prob. only needed the devel one).

libncurses++w10
libncurses-devel
libncusrsesw10
ncurses

In terminal, ran:

$ cd installs
$ git clone https://github.com/cmatsuoka/asciiquarium.git
chmod +x asciiquarium

(May not have been needed; forgot to check attributes before doing it.) Then ran:

cpan

and agreed to the defaults for everything. Then exited the terminal and restarted it. Could have just run the bit of code that was added to ~/.bashrc, which looks like this:

PATH="/home/Darren/perl5/bin${PATH:+:${PATH}}"; export PATH;
PERL5LIB="/home/Darren/perl5/lib/perl5${PERL5LIB:+:${PERL5LIB}}"; export PERL5LIB;
PERL_LOCAL_LIB_ROOT="/home/Darren/perl5${PERL_LOCAL_LIB_ROOT:+:${PERL_LOCAL_LIB_ROOT}}"; export PERL_LOCAL_LIB_ROOT;
PERL_MB_OPT="--install_base \"/home/Darren/perl5\""; export PERL_MB_OPT;
PERL_MM_OPT="INSTALL_BASE=/home/Darren/perl5"; export PERL_MM_OPT;

Then

$ cpan Curses::Window

Did not install. crypt.h is missing. What provides it?

Used Cygwin setup to add libcrypt-devel; then:

$ find /usr/ -name crypt.h
/usr/include/crypt.h

OK. Trioed again:

$ cpan Curses::Window

OK, no errors. Then.

$ cpan Term::Animation

ok.

$ ln -s /home/Darren/installs/asciiquarium/asciiquarium /home/Darren/bin/fishtank

And now fishtank runs it. Good.

And as you can see, it is ASCII, so it varies with the font you have in your terminal. Above is some modern monospace font, my system default on MATE desktop, below is MZTERM, which uses a chunky font from a 1980s style microcomputer.

chunky old microcomputer font

Windows — shutdown and turn on is different from restart

My laptop installed some kind of update to the media drivers. I generally turn it off at the end of a day, so when it wanted me to restart, I just turned it off, and turned it on the next day.

Dell support assist dialog

And the audio did not work.

I don’t like to use restart because I use the laptop with an external mouse and keyboard, but when I restart I have to enter the password using the laptop keyboard — it does not talk to the external keyboard (connected via a docking station) until the desktop arrives. And the laptop is stowed away, so that is inconvenient. Shutdown in software then turn on via the button on the docking station fixes that and is more convenient.

But shutdown and then turn on does not trigger the completion of the installation of the updates, only restart does that.

So restart is sometimes essential…

aboot.conf

Note to self.

Something funky about aboot.conf (booting Linux on Alpha AXP).

A line in the file might look like this:

0:4/vmlinuz-etc-generic ro root=/dev/sdd2 initrd.img

and it seems to boot. This is a generic kernel (not SMP).  When I changed it to SMP, the same line would not find the root, and had to be reorganised:

0:4/vmlinuz-etc-smp ro initrd=initrd-smp.img root=/dev/sdd2

and then it would boot.

 

Handy utilities: cpuid2cpuflags

Now, we can use lscpu to get the CPU flags, but not all of them are in general relevant for compiling stuff. Let’s try this utility.

Here’s some bits of the session.

Welcome to OpenBSD: The proactively secure Unix-like operating system.

$ mkdir installs
$ cd installs
$ git --version
ksh: git: not found
$ doas pkg_add git
$ git clone https://github.com/gentoo/cpuid2cpuflags.git
$ cd cpuid2cpuflags/ 
$ autoreconf -vi
ksh: autoreconf: not found
$ doas pkg_add autoconf
quirks-7.147 signed on 2026-01-21T21:43:17Z
Ambiguous: choose package for autoconf
a 0: <None>
1: autoconf-2.13p4

... [etc] ...

18: autoconf-2.72p0
Your choice: 18
autoconf-2.72p0:metaauto-1.0p4: ok
autoconf-2.72p0: ok
$ autoreconf -vi 
Provide an AUTOCONF_VERSION environment variable, please
$ export AUTOCONF_VERSION=2.72
$ autoreconf -vi 
Provide an AUTOMAKE_VERSION environment variable, please
autoreconf-2.72: error: aclocal failed with exit status: 127
$ doas pkg_add automake
quirks-7.147 signed on 2026-01-21T21:43:17Z
Ambiguous: choose package for automake
a 0: <None>
1: automake-1.4.6p5

... [etc] ...

11: automake-1.17
12: automake-1.18
Your choice: 12
automake-1.18: ok
$ export AUTOMAKE_VERSION=1.18 
$ autoreconf -vi 
configure.ac:13: You should run autoupdate.
$ autoupdate
$ autoreconf -vi 
$ ./configure
checking for a BSD-compatible install... /usr/bin/install -c

.... [etc] ....

checking that generated files are newer than configure... done
configure: creating ./config.status
config.status: creating Makefile
config.status: creating config.h
config.status: executing depfiles commands
$ make
$ ./cpuid2cpuflags 
CPU_FLAGS_X86: mmx mmxext sse sse2

Compare with:

$ lscpu
Architecture: i386
Byte Order: Little Endian
Active CPU(s): 1
Total CPU(s): 1
Vendor: GenuineIntel
CPU family: 15
Model: 2
Model name: Intel(R) Celeron(R) CPU 2.60GHz ("GenuineIntel" 686-class)
Stepping: 9
CPU MHz: 2601
L1d cache: 8K
L2 cache: 128K
Flags: fpu vme de pse tsc msr pae mce cx8 sep mtrr pge mca cmov pat pse36 cflsh ds acpi mmx fxsr sse sse2 ss htt tm pbe cnxt-id xtpr

SSE2 is actually really important. Lot’s of stuff won’t run without it. For example, a Pentium III lacks SSE2, and I am not sure there’s a web browser beyond links, lynx, netsurf and dillo.

telnet to Debian

First, telnet is bad, ok? Debian knows this. They don’t want you to use it.

Here is what you should do if despite the advice to the contrary you want to set up a Debian box as a telnet server/host that you can connect to from another machine, which you should not do because telnet is insecure.

BUT if you monkey around with retrocomputing, you may find that ssh2dos is no longer working to get you into your Linux from your DOS.

Now, this is just what worked for me. I could not get inetutils-inetd to work (probably user error on my part), but openbsd-inetd did work after a little soft linking.

$ sudo apt install telnetd openbsd-inetd

Now, this caused uninstall of inetutils-inetd, but ok.

Then needed to uncomment telnet in the config file:

$ sudo vim /etc/inetd.conf

(the line is

telnet stream tcp nowait root /usr/sbin/tcpd /usr/sbin/telnetd

instead of

## telnet stream tcp nowait root /usr/sbin/tcpd /usr/sbin/telnetd

)

And poked a hole in the firewall(!):

$ sudo ufw allow 23/tcp
Rule added
Rule added (v6)

But even then:

$ sudo systemctl restart inetd
Failed to restart inetd.service: Unit inetd.service not found.

But it is there:

ls /etc/system/system/inetd.service
inetd.service

But it’s not really there! It’s a link:

$ ls -l /etc/system/system/inetd.service
lrwxrwxrwx 1 root root 47 Feb 20 13:37 inetd.service -> /usr/lib/systemd/system/inetutils-inetd.service

And if you look at

/usr/lib/systemd/system/inetutils-inetd.service

it’s empty/not there:

$ cat /usr/lib/systemd/system/inetutils-inetd.service
cat: /usr/lib/systemd/system/inetutils-inetd.service: No such file or directory

Now, this is probably where user error came in, because that may well be the result of my installing openbsd-inetd. Be that as it may, if I link the filer in /etc to the working file that comes with the openbsd-inetd, then all is well — there’s a working inetd.service elsewhere, so I made a link to that:

$ sudo rm /etc/systemd/system/inetd.service
$ sudo ln -s /usr/lib/systemd/system/inetd.service /etc/systemd/system/inetd.service

$ sudo systemctl status inetd.service
○ inetd.service - Internet superserver
Loaded: loaded (/usr/lib/systemd/system/inetd.service; bad; preset: enabled)
Active: inactive (dead)
Docs: man:inetd(8)

$ sudo systemctl restart inetd
$ sudo systemctl status inetd.service
● inetd.service - Internet superserver
Loaded: loaded (/usr/lib/systemd/system/inetd.service; bad; preset: enabled)
Active: active (running) since Fri 2026-02-20 16:15:03 AEDT; 2min 3s ago
Invocation: 8hfkshdkfhskdhfskdhfsdkjf676f7sf6s
Docs: man:inetd(8)
Main PID: 16345 (inetd)
Tasks: 1 (limit: 18996)
Memory: 776K (peak: 1.7M)
CPU: 15ms
CGroup: /system.slice/inetd.service
└─16345 /usr/sbin/inetd

Feb 20 16:15:03 t1650 systemd[1]: Starting inetd.service - Internet superserver...
Feb 20 16:15:03 t1650 systemd[1]: Started inetd.service - Internet superserver.

And all is clear. Now you can telnet into your Debian box — but recall how insecure telnet is. Only enable it on a well-protected LAN behind a good router and do not enable by default or on boot or anything like that. Turn it on, use it, turn it off, and maybe close the firewall hole too.

So, when you’re done:

$ sudo systemctl stop inetd

(Assuming telnet is the only service inetd provides — check /etc/inetd.conf)

$ sudo ufw deny 23/tcp

You could even re-comment the telnet line in /etc/inetd.conf, whatever.

Well, I think that’s right.

TINY — a remote desktop host for your DOS computer

What if you have an old MSDOS computer that is running a piece of equipment or monitoring some data loggers or something? How would you go about watching it and controlling it from a distance?

That is what TINY enables. This makes it great for many things, including debugging stuff on DOS, because you can have a window to your DOS machine open on a modern computer with fully featured browsers and other tools for searching up how to do things.

Some connectivity is already possible. You can use FreeDOS as a VNC client using DOSVNC (or the VNC application that comes with FreeDOS) to access  a modern computer, though AFAIK there is no way to tunnel via SSH, so you are stuck with an insecure connection that you would definitely only use within a LAN.

I do not know of an X windows server that would let you forward an X11 connection to a DOS box. There are some old, unmaintained proprietary ones, like DesqView/X. At present you can use telnet and SSH to go from the DOS box to some other machine, depending on the security required. (SSH2DOS may need some adjustment to the sshd config on the host computer.)

But all that is reaching out from the DOS machine. Now, what about tunnelling in to you DOS box? What could you run on it? There is a telnetd somewhere out there, I think, that would let you telnet into it. Kermit? Dunno. I’ll have to look into it.

Anyway, as noted, there’s also a newer option called TINY…

https://josh.com/tiny/

OK, so I downloaded the host and copied it into my DOS computer. It is compiled into 2 versions, one of which uses Novell’s DOS networking interface, whereas the other uses a packet driver via something called PCTCP. I already have a working connection using a packet driver, which works with WATTCP and mTCP and the other things I use on the box, so I wanted to go with PCTCP. First, I had to find it.

I am unsure of the legal status of it. The archive containing it can be found on the web and is PCTCP41.ZIP, which is/was a commercial product. I am not using it commercially, but perhaps legal grounds would point to using the Novell stuff, which I am pretty sure was properly publicly released. Well, I’ll look into that if I find a use case for TINY. This is really just an experiment.

PCTCP is useful because if you are using a packet driver for your DOS network — almost certainly if you are using FreeDOS — you need the PCTCP ETHDRV.EXE TSR.

So then I had to set up the INI file for ETHDRV. Some resources include the material in the PCTCP zip archive, and:

Here is the INI file:

[pctcp ifcust 0]
ip-address=192.168.10.240
subnet-mask=255.255.255.0
router=192.168.10.1
broadcast-address=192.168.10.255
interface-type=PKTDRV

[pctcp kernel]
interface=ifcust 0

[pctcpgeneral]
host-name=myfreedos
domain=lan

[pctcpdhcp]

[pctcpaddresses]
domain-name-server=192.168.10.1
domain-name-server=8.8.8.8

If it asks for a serial number and authentication, check in the PCTCP ZIP file.

After getting the INI file to be ok, I could connect. On the DOS host:

CD \NET2\TINY
SET PCTCP=C:\NET2\TINY\pctcp.ini 
ethdrv.exe
tinyhg_f.exe tinypass tinypass

tinyhg_f.exe is the (h)ost for a (g)graphical connection using (F)TP Software’s PCTCP interface.

Then on the client you install the client-side software from the website. It is a Java application, so runs on Windows, Linux, wherever. You may need to install the JDK.

java -jar TinyClient.jar 192.168.10.240 tinypass

And there it is:

Pegasus mail running on DOS viewed over TINY

What you see above is Pegasus mail. I can get mail, send mail and all while using the TINY interface to the box — that is to say, I can use the networking on the DOS machine while tunnelling in using TINY. I can also, of course, use local programs. That means you could notionally use an email program to get files on and off the machine from a distance. (I could not get FTPSRV to work while TINY was attached — connection refused — but it may be possible.) ETHFLOP or EtherDFS might be the thing.

Gopherus also worked very well.

These are text programs.

If you want to run a graphical piece of software, you use the ‘g’ versions of TINY, and you make sure your software runs in one of the graphical modes that TINY can provide. For example, here is a website viewed using the LINKS browser in graphical mode. (But with only a few — 16 — colours…)

To do this, you run LINKS with:

links -g -mode 800x600x16

And then choose the right mode from the TINY options.

Thus, graphical applications work if thy can be launched in a mode supported by the viewer, and there are some 800×600 modes, which is pretty handy for DOS.

Also, most DOS software is text-based, so there’s no problem there.

Impressive.

 

xbindkeys giving JIT errors

Said things like “JIT failed to initialize”.

$ xbindkeys_show
Error in startup script: "xbindkeys_show"
Control+Shift + q
JIT failed to initialize
disabling automatic JIT compilation
JIT failed due to resource exhaustion
disabling automatic JIT compilation
while executing
"exec "xbindkeys" "--show" "
invoked from within
"if { $arg1 != "" && $file_option != "" } {
set list [ exec "xbindkeys" "--show" "$file_option" "$arg1" ]
} else {
set list [ exec "xbindkeys" "-..."
(file "/usr/bin/xbindkeys_show" line 45)
$ xbindkeys
JIT failed to initialize

Even though installed from Debian, some dependency was missing (guile). Instead, I compiled it from course source and left out the problematic dependency, which I do not use because I only use a pretty basic set of xbindkeys functions:

cd installs/
git clone git://git.savannah.nongnu.org/xbindkeys.git/
cd xbindkeys/
./configure --help | grep guile
./configure --disable-guile
make
sudo make install

Problem is gone. Reduced capability, apparently, but I never use its more powerful components anyway.

watchdog0: watchdog did not stop!

It gets to this image — the log in background — and stops, uncommunicative.

Often on boot my Linux box (Debian stable)  hangs on the Debian splash image/ background, never gives me a log-in prompt and I cannot use Ctrl+Alt+F1 to get to a TTY — I have to do Ctrl+Alt+Del or use the power button to try again. And that does not always work… when I do reboot, I get a glimpse of some console output about a watchdog0.

Here is output of:

$ sudo journalctl | grep watchdog0
Feb 11 20:26:25 t1650 systemd[1]: Using hardware watchdog 'iTCO_wdt', version 2, device /dev/watchdog0
Feb 11 20:26:25 t1650 kernel: watchdog: watchdog0: watchdog did not stop!
Feb 11 20:26:25 t1650 systemd-shutdown[1]: Using hardware watchdog 'iTCO_wdt', version 2, device /dev/watchdog0

It most often happens when I shutdown from a XRDP session into the box by going into a terminal and typing sudo poweroff. (There’s no shutdown option in the GUI menu when you use XRDP to tunnel into the box; maybe that’s telling me something…) But it sometimes happens when logging in locally, so it’s no exactly that.

Sometimes the box refuses to boot even after a series of reboots and so I boot into a recovery mode and it does a fsck. But I think it needs the fsck because of the hanging, not the other way around.

After some googling, and finally getting it to boot:

$ lsmod | grep TCO
sudo vim /etc/modprobe.d/iTCO_wdt.conf
$ sudo vim /etc/modprobe.d/iTCO_vendor_support.conf
$ cd /etc/default/grub.d/
$ ls
$ cd
$ sudo vim /etc/default/grub
$ sudo update-grub
$ sudo depmod -ae
$ sudo update-initramfs -u

Note:

$ cat /etc/modprobe.d/iTCO_vendor_support.conf
blacklist iTCO_vendor_support

$ cat /etc/modprobe.d/iTCO_wdt.conf
blacklist iTCO_wdt

Also:

# If you change this file, run 'update-grub' afterwards to update
# /boot/grub/grub.cfg.
# For full documentation of the options in this file, see:
# info -f grub -n 'Simple configuration'

GRUB_DEFAULT=0
GRUB_TIMEOUT=5
GRUB_DISTRIBUTOR=`lsb_release -i -s 2> /dev/null || echo Debian`
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash resume=UUID=f0b82c7e-f1db-484c-b11c-b14bb0d58487 nowatchdog"
GRUB_CMDLINE_LINUX=""

[etc]

Note — nowatchdog is the kernel flag. nmi_watchdog is apparently something different and need not be blocked.

I noticed there was a watchdog module in lsmod output, but the googlings referred only to TCO stuff.

OK, a few days of observation… shutdown and boot are now noticeably faster. Not sure if there’s any difference once it’s up and running, but there’s a definite speed improvement on boot and shutdown. Have not notices any other changes, and it is much better behaved as far as failing to boot is concerned. Now, I don’t need the computer to restart itself automagically, it’s an interactive desktop, so my reading suggests to me that watchdog is redundant.

Disclaimer: I am not an expert!

Note: whatever watchdog is, it is not the watchdog package on Debian. I can tell, because:

sudo apt remove watchdog

Reading package lists...
Building dependency tree...
Reading state information...
Package 'watchdog' is not installed, so not removed
Summary:
Upgrading: 0, Installing: 0, Removing: 0, Not Upgrading: 0

So that’s worth what it is worth.

Design a site like this with WordPress.com
Get started