Comics Daze

It’s such a lovely day today…

But I’ve got chocolates, so let’s read comics.

Yukihiro Takahashi: Blue Moon Blue

13:58: Beta Testing The Ongoing Apocalypse by Tom Kaczynski (Fantagraphics)

I assumed that this was new work from Kaczynski, but instead it’s a collection of things I’ve already read — mostly things from Mome.

And some of these things I’ve read a number of times before.

So that’s disappointing, but it’s a really good book anyway. The stories mostly have the same sort of mood, so it feels much more cohesive than collections like this usually are. It reads really well — each individual story is great, of course, but they have a cumulative effect when printed like this.

Fantastic book.

Zazou Bikaye: Mr. Manager

15:04: Life of Che by Oesterheld/Breccia/Breccia (Fantagraphics)

I’ve sworn never to buy another comics biography… But this is Alberto Breccia, and I need to read everything he’s done.

And this is, indeed, very good. It’s a bit vague here and there as to the particulars of Che Guevara’s biography, which suits me fine.

But it’s quite wordy in places. I think the mixture works really well — this is definitely not a Wikipedia Infodump Biography (and not just because Wikipedia didn’t exist in 1969), but it’s also not just a poetical hand-wavey thing. It’s just the right sort of mix.

The artwork is a bit more photo-referenced than I’d expected with Breccia, but there’s several really lovely pages.

Rocketnumbernine: Meyouweyou

15:55: Otherworld Barbara 2 by Moto Hagio (Fantagraphics)

Amazingly enough, I remember who all these dozens of characters are from when I read the first book a couple weeks ago.

16:24: Nap Time

I’m so tired.

Kapotte Muziek: Mort Aux Vaches

18:52: I’m awake! I’m awake!

That was too much napping.

I had to go down and move my car, so I got pizza at the same time… and… I don’t know what I expected, exactly (never bought pizza from that place before), but this wasn’t it.

And it tasted like it looks.

Felix Da Housecat: Kittenz and The Glitz

Otherworld Barbara is engrossing — there’s so much drama on every page, and we piece together what’s been happening slowly, over hundreds of pages. It’s fun! But then she goes and does this massive infodump section where the (nominally sorta) bad guy explains everything we’ve already understood from beyond the grave. It feels like a betrayal? We’ve spent all this energy trying to understand everything, and then she just goes ahead and tells us anyway?

Meh.

But it’s still pretty good. All the play with identity — shared identities, doubled and tripled identities, etc etc.

And I had no idea how she was going to pull off a good ending to this thing, but she totally did.

Various: Fabric Presents: Octo Octa & Eris Drew

21:39: Alanzo Sneak by Nate Garcia

This is totally insane and hugely enjoyable. Love it. It’s got real heart.

Various: Fabric Presents: Octo Octa & Eris Drew

21:48: Swan Song 1 & 2 by Babouche/Dorison/Herzet (Cinebook)

Hm… another French comic from the Great War… I kinda like the colours.

But the storytelling… oy vey… it’s like they’ve read that book — “How to write a damn good novel” — and applied it directly: Every scene has to have a primary and a secondary conflict, etc, and the result is that it’s all So Much Drama.

I was bored out of my gourd by page 20, so I ditched it.

But I had a peek at the end of the second volume, and it looks like it’s just as awful.

22:01: World War 3 Illustrated #14

I’ve now managed to score (and read) a sizeable number of the issues of WW3… perhaps two thirds of them? It’s like mining a secret seam of comics… These books are rarely mentioned in comics circles, but there’s so much good and original material in these books. It’s like over five thousand pages in total?

This is a really strong issue. It’s got all the regulars, like Peter Kuper…

James Romberger…

Eric Drooker…

… and Sabrina Jones.

And ads from Stanley Cohen, of course.

But also plenty of pieces from less familiar names, like Scott Cunningham, who does a really odd and intriguing thing.

Boris with Merzbow: 2R0I2P0

22:34: The City of Belgium by Brecht Evens (Drawn & Quarterly)

Hm… this is from last year? Odd that I missed it. I feel that I sometimes order comics and then I never get them? On the other hand, my memory is pretty bad in general, so perhaps not.

Oh! I checked my mail:

I forget that I’m not as forgetful as I think.

Evens’ colours are so gorgeous.

This is more chatty than Evans’ earlier books, I think? And hefty.

We follow three different groups of people on a night at the town, and it’s just fascinating. Well, OK, at the start I felt like I was reading a comics adaptation of Jersey Shore, but then things grew weirder and deeper and more interesting.

It’s a gorgeous book, and has such a great flow. There’s a lot of conversations, but they’re done so inventively and feel so real, and with all this gorgeous artwork… it feels like such a complete work? It’s really satisfying.

So I figured it had to land on everybody’s Best Comics of 2021 lists, but nope — it’s only on six of them.

Various: Scarred For Life 2

00:31: Department of Art & Habitat #2 by Dunja Jankovik (Sparkplug)

Yes yes art.

These are really cool. They’re kinda-sorta narrative, and with interesting artwork. Nice.

Various: Scarred For Life 2

00:39: Aya: Love in Yop Cito by Marguerite Abouet & Clément Oubrerie (Drawn & Quarterly)

This is the second Aya omnibus. I read the first one a couple of weeks ago, and it collected the Aya albums I’ve read a long time ago. But this one collects three further albums which I haven’t read?

I probably shouldn’t be starting this now, because it’s getting late, but then again, I had that really long nap, so let’s see how that goes…

The storylines continue directly from the first omnibus (even if that had a kind of resolution to many of the plots). But one of the storylines is about Innocent going to Paris, so that takes us away from the warm earth colours a bit.

But most of it’s still set on the Ivory Coast, and it’s still a comfortable read. I mean, it’s a soap opera, and has soap opera dynamics, but it’s so charming and … nice.

Various: Planet Mu 25

02:09: Sleep

I couldn’t finish it tonight; I’ve gotta get some sleep.

But that was a good batch of comics? Some great stuff, and the only bad comics were those Swan Song thingies.

Eclipse 1936: Le roman d’un tricheur

This is very meta and witty.

Hang on… these screenshots are in the wrong aspect ratio? I just upgraded mpv, and everything was going so swimmingly, but these are definitely wrong. They’re 1.5:1, while what’s on the screen is 1.37:1. How annoying.

That’s better.

This is totally wild. It’s perhaps not a very technically proficient movie (I’m assuming it was made on a very small budget? it’s an 80% silent movie with just a voiceover), and the shots are frequently out of focus, but it’s just… kinda amazing?

It seems incredible that it’s from 1936.

This is such a fascinating, witty movie. I’m not sure that it’s actually… “good”? But it’s great.

The Story of a Cheat. Sacha Guitry. 1936.

This blog post is part of the Eclipse series.

More vtable fun

I was inspired by a bug report on tabulated-list-mode to do more work on vtable. (Funny how that works.)

As you probably won’t remember, vtable is a new library in Emacs 29 that aims at being a replacement for tabulated-list-mode, but with a much easier interface. For instance, the following is a toy replacement for C-x C-b:

(make-vtable
 :columns '((:name "Name" :width 20) "Size" "File")
 :objects (buffer-list)
 :actions '("k" kill-buffer
            "RET" display-buffer)
 :getter (lambda (object column vtable)
           (pcase (vtable-column vtable column)
             ("Name" (buffer-name object))
             ("Size" (buffer-size object))
             ("File" (or (buffer-file-name object) "")))))

And results in the following buffer:

The bug report pointed out that tabular displays might be more readable if columns had alternating colours, especially if they are very dense. This example doesn’t really have that problem, but it’s a nice test, anyway. So I’ve now made it possible to say:

:column-colors '("#202020" "#404040")

And then you get:

Conversely, the readability problem might be with the rows instead of the columns, so:

:row-colors '("#202020" "#404040")

A kind of a line printer vibe, eh?

And what if you combine both of them like so?

:row-colors '("#202020" "#404040")
:column-colors '("#202020" "#404040")

Well, of course:

Hey, that’s not so bad…

:row-colors '("red" "green")
:column-colors '("blue" "purple")

That, on the other hand, is pretty bad. Heh heh. I’m pretty sure I got the colour blending algo totally wrong.

And while I was poking at this, I also added a divider thing, so you
can say:

:divider-width "2px"

And get:

Or, well, anything:

:divider " 🍉 "

I think that’s the optimal table design, right? Right.

15×10%

Time for another one of these posts about Emacs development, I guess? It’s been two months since the last one, and I’ve basically been slacking off, mostly dealing with new bug reports instead of going dumpster diving. I mean, bug triage.

We started at 2460 open bugs in this stretch, and we’re now at 2402, so that’s not too bad. It’s been unusually quiet in the bug tracker, actually, and I’m not sure how to interpret that. Did we finally perfect Emacs so that there’s nothing to report, or did the war against Ukraine make people less apt to poke at Emacs, or did finally everybody start using TextPad Pro?

On the other other other hand, the bug tracker has been unusually active the preceding months, so perhaps it’s just a regression towards the mean.

And Emacs 28.1 has been released, so I’d expected a bump in the bug inflows from that, but nothing huge.

So instead of digging into the bug data more, let’s just look at some of the new stuff in Emacs 29 since the last blog post.

Less Recursive GC

I think the most important fix these past couple of months on the trunk has been the GC fixes courtesy of Mattias Engdegård. It’s been a long-standing er embarrassment that you can segfault Emacs by just consing up some structures. Since basically forever (at least the 80s, I think?) Emacs’ garbage collection has been implemented in a pretty recursive way. Not for normal lists, but there’s nothing, in principle, stopping anybody from creating lists that have the “rest” in the car cell. This makes the GC recurse, and if it recurses sufficiently, Emacs would just segfault.

*poof*

Now, people learned to Just Not Do That, so these segfaults are rare in practice, but still… yuck.

Mattias has now fixed this for Emacs 29, and the resulting GC is even slightly faster to boot.

Drag and Drop

Emacs has long had some basic support for dragging and dropping things into Emacs, but not really much support for dragging things out of Emacs.

Courtesy of Po Lu, you can now drag files from Dired to other programs, and of course, drag text from Emacs to other programs. This requires support on all the different operating systems and different window systems, so it’s a pretty daunting task implementing it across the board.

Animated webp support

There was a bug report about some webp images not working in Emacs 29. Emacs got native support (via libwebp courtesy of Stefan Kangas) earlier this year, and it mostly worked fine — except with animated webp images, which didn’t display at all. (As an aside, it’s kinda amusing that the webp format was developed from the VP8 video format… and now there’s animated webp images, which aren’t VP8 videos.) It turns out that parsing those files requires using the demux interface in libwebp, which is in a separate library file.

I thought that sounded like a fun little project, so I started reading the libwebp documentation, and a couple of days later:

Easy peasy lemon squeezy — the resulting code is short and nice, because the libwebp interface functions here are sane and well thought out. However, it took me several nights poking at this to actually find what interface to use, because the documentation doesn’t give any guidance on this.

If you look at the demux documentation, it starts with the WebPIterator iterator, so that was what I tried to use. After some head scratching, I had this:

Freddy is displayed fine, because his webp file is all “complete” frames, but the more advanced nyan cat is all garbled. That’s because this interface is the low-level interface that requires you to do the blending between frames yourself. What you’re supposed to do is use WebPAnimInfo instead, which does all the heavy lifting for you.

I’m not the only one confused by this. Here’s how ImageMagick displays the nyan cat:

I’m guessing the ImageMagick people implemented this with a test file that has only complete frames (like the Freddy webp file), so they didn’t catch the problem.

So: Good documentation, but it would have been helpful with some implementation guidance as a preamble, mm-kay?

Anyway, after poking away at the webp animation code, I realised that it would be pretty easy to finally fix the GIF animation code, too. I mean, it’s functionally OK, but it’s dog slow. After putting in the same sort of animation cache mechanism here, displaying an animated GIF is… a lot faster? Here’s the display from top while displaying the same GIF in Emacs 28.1 and in Emacs 29:

So it’s not fabulously fast or anything, but it’s 10x faster than before. (And more importantly, doesn’t slow down quadratically with the length of the GIF, which made looking at long GIFs in Emacs impossible.)

Hm… this reminds me… wasn’t there some other issue with the image cache when doing animated images? Yes! We were stashing data in the image object and that made display-level caching fail!

So with that fixed, we’re down to:

OK, now it’s really starting to help. 🙃 With a torture test page, containing dozens of animated GIFs:

100% in Emacs 28.1 (which means that it doesn’t have a chance to actually animate all the GIFs) and 14% in Emacs 29.

Nice!

Open Closures

A more internal new thing is the “open closure” concept, courtesy of Stefan Monnier. It’s like a struct that you can funcall? Or like a function object that you can interrogate about various data and metadata.

So — a closure that’s open, so it has the best name ever.

Variable Pitch Tables

Mixing fonts, images and text size in tabular displays has always been a pain in Emacs, so I’ve now written a new package for that: vtable. The thing I’ve been using to test it is the ewp package, which I’m writing this very blog post from:

All nice and lined up.

Emacs has had tabulated-list-mode for quite a while, but in addition to not dealing with proportional fonts, it’s also just awkward interface-wise: It expects to own the entire buffer it lives in, so you can’t have a table in the middle of some other text, and it stores all the data in buffer-local variables, so you can’t have several tables in the same buffer. And interacting with the table always seems to happen via setting some obscure variable and then calling some other obscure function, so I wanted to make an interface that fixes all of that, in addition to making it trivial to create simple tables, and easy to create complex tables.

My inspiration for the interface design was originally the Common Lisp/LispWorks table library developed for my former employer by Espen Vestre, but it diverged quite a bit in the end. The idea is basically still the same: You have data, you have the formatted data, and then you have the data that’s being presented, and you can alter these things at several levels. (Which is important when resizing a column and you also want to resize images shown in a column, for instance.)

Here’s the simplest table possible, I guess:

(make-vtable
 :objects '(("Foo" 1034)
            ("Gazonk" 45)))

This displays as:

You’d want a header, though, so:

(make-vtable
 :columns '("Name" "ID")
 :objects '(("Foo" 1034)
            ("Gazonk" 45)))

Which is:

And here’s how simple a very simple version of C-x C-b could be implemented:

(make-vtable
 :columns '("Name" "Size" "File")
 :objects (buffer-list)
 :actions '("k" kill-buffer
            "RET" display-buffer)
 :getter (lambda (object column vtable)
           (pcase (vtable-column vtable column)
             ("Name" (buffer-name object))
             ("Size" (buffer-size object))
             ("File" (or (buffer-file-name object) "")))))

Which gives us:

Finally, here’s a very simple image browser which displays most of the significant features:

(make-vtable
 :columns `(( :name "Thumb" :width "500px"
              :displayer
              ,(lambda (value max-width table)
                 (propertize "*" 'display
                             (create-image value nil nil
                                           :max-width max-width))))
            (:name "Size" :width 10
                   :formatter file-size-human-readable)
            (:name "Time" :width 10 :primary ascend)
            "Name")
 :objects-function (lambda ()
                     (directory-files "/tmp/" t "\\.jpg\\'"))
 :actions '("RET" find-file)
 :getter (lambda (object column table)
           (pcase (vtable-column table column)
             ("Name" (file-name-nondirectory object))
             ("Thumb" object)
             ("Size" (file-attribute-size (file-attributes object)))
             ("Time" (format-time-string
                      "%F" (file-attribute-modification-time
                            (file-attributes object))))))
 :separator-width 5
 :keymap (define-keymap
           "q" #'kill-buffer))

This results in (if you’ve been watching Japanese 60s movies):

And increasing the size of the first column allows the displayer to resize the thumbnails:

And so on.

Make Commands Query

You can now make any command query you before it’s executed. For instance, if you want to be queried before doing C-x C-c, you can just say

(command-query 'save-buffers-kill-terminal)

in your init file.

More Electric Completion

M-<down> and M-<up> can now be used to navigate completions directly, which makes for quicker selection between candidates. This, and many other user interface improvements in completion is courtesy of Juri Linkov and Jimmy Aguilar Mena.

Clean CI

After fixing some obscure bugs (only appearing in a few configurations) and a couple of not-so-obscure bugs (along with some judicious disabling of some tests that were timing out on EMBA), we now have a green board:

Whoho! That means that we hopefully can start to send out nagging mails to people that commit something that makes things go red.

(We should, of course, refactor the tests that take too long and re-enable them on EMBA, but having those timing-out (that were only triggering on EMBA) wasn’t productive.)

This is how things used to look:

Which was sad.

Eclipse 1945: The Wicked Lady

Whoho!

Nice hats.

And doilies.

She’s so wicked!

This is a lot of fun. It’s totally over the top and delighting in its own absurdeties. This was released just after WWII, and was the highest-grossing movie in the UK of the year, and I can totally see why.

(They had to reshoot scenes like this for the US release because of the excessive Margaret Lockwood boobage on display.)

George Harrison!?

It’s a bitch-off!

I feel like I should love this, but I just don’t. The performances are great, and the plot is a lot of fun, but I’m not really feeling it.

It might just be me.

The Wicked Lady. Leslie Arliss. 1945.

This blog post is part of the Eclipse series.