flak rss random

regexp/o

Perl has a regex option /o, which pretends to optimize your code, but actually introduces bugs. Go has been missing out. Until now.

We need regexp of course, but also text/template for interpolation. Add in runtime to get the pc, and we have all the elements for a cache of only once regex.

func Compile(s string, vals any) (*regexp.Regexp, error) {
        cacheMtx.Lock()
        defer cacheMtx.Unlock()
        pc, _, _, _ := runtime.Caller(1)
        k := key{s: s, pc: pc}
        re := cache[k]
        if re != nil {
                return re, nil
        }
        t := template.New("regex")
        t, err := t.Parse(s)
        if err != nil {
                return nil, err
        }
        var sb strings.Builder
        err = t.Execute(&sb, vals)
        if err != nil {
                return nil, err
        }
        re, err = regexp.Compile(sb.String())
        if err != nil {
                return nil, err
        }
        cache[k] = re
        return re, nil
}

type key struct {
        s  string
        pc uintptr
}

var cacheMtx sync.Mutex
var cache = make(map[key]*regexp.Regexp)

And a test program.

func main() {
        fmt.Printf("starting\n")
        inputs := []string{"Apple", "bananas", "42"}
        for i := 0; i < 3; i++ {
                re, err := regexpo.Compile("{{ call .Letters }}", map[string]any{
                        "Letters": func() string {
                                time.Sleep(1 * time.Second)
                                fmt.Printf("substitute\n")
                                return "[a-z]"
                        },
                })
                if err != nil {
                        fmt.Printf("failure: %s\n", err)
                        return
                }
                ok := re.MatchString(inputs[i])
                fmt.Printf("match: %v\n", ok)
        }
        fmt.Printf("done.\n")
}

The substitution is only done once.

Posted 04 Aug 2025 20:18 by tedu Updated: 04 Aug 2025 20:18
Tagged: go programming

polarizing parsers

The web as we know it will soon crash and burn in a fiery death. 12 days. There’s even a countdown. This is apparently a redux of request smuggling reborn. Request research reborn redux.

more...

Posted 25 Jul 2025 19:40 by tedu Updated: 26 Jul 2025 00:31
Tagged: security web

OpenZFS Bug Ported to C

There was an (almost) catastrophic OpenZFS bug. If they had used zig, the bug would be easily detected. But the question remains, could we detect this bug in C?

more...

Posted 15 Jul 2025 02:34 by tedu Updated: 15 Jul 2025 02:34
Tagged: c rants

can an email go 500 miles in 2025?

Once upon a time, there was a university president who couldn’t send an email more than 500 miles, and the wise sysadmin said that’s not possible, so the president said come to my office, and lo and behold, the emails stopped before going 500 miles. Has technology improved? Can we send an email farther than 500 miles in 2025?

more...

Posted 04 Jul 2025 15:49 by tedu Updated: 04 Jul 2025 15:49
Tagged: software web

writing a little gosh

I had the idea to write a little shell in go. Called gosh, of course. There’s a few people playing with the same theme, but nothing exactly the same.

more...

Posted 30 Jun 2025 16:33 by tedu Updated: 30 Jun 2025 16:33
Tagged: go programming

forbidden secrets of ancient X11 scaling technology revealed

People keep telling me that X11 doesn’t support DPI scaling, or fractional scaling, or multiple monitors, or something. There’s nothing you can do to make it work. I find this surprising. Why doesn’t it work? I figure the best way to find out is try the impossible and see how far we get.

more...

Posted 24 Jun 2025 17:59 by tedu Updated: 24 Jun 2025 17:59
Tagged: programming x11

vulgar gestures

I like to go on the internet and click on links, but some of the links are bad, so then I swipe right to make it go away. The problem is that when I’m running chrome on OpenBSD, the swipe gesture doesn’t seem to work like it does on other platforms. We’re not going to fix it, but we are going to make it work. (Although, I hear the younglings say they swipe right when they like something. Explains a lot, actually.)

more...

Posted 20 Jun 2025 15:37 by tedu Updated: 20 Jun 2025 15:37
Tagged: openbsd programming

pipelined state machine corruption

There are a number of network protocols that we might refer to as text protocols, where we send a line of text to the server and it sends back a response. Perhaps I should call them CRLF protocols, to distinguish from protocols where we’re blasting JSON back and forth. To speed things up, it can be tempting to have the client send multiple requests without waiting for individual responses.

more...

Posted 17 Jun 2025 03:52 by tedu Updated: 17 Jun 2025 07:56
Tagged: software

slog is aptly named

I used to use the go log package, then I switched to the slog package, and it’s been a bumpy ride.

more...

Posted 13 Jun 2025 08:10 by tedu Updated: 13 Jun 2025 08:10
Tagged: go programming

wobbly letters

Apple released “Liquid Glass” which looks a lot like a revival of UI fashion from two decades. Everything is transparent. But I doubt Apple has the courage to bring back wobbly windows. No matter, I hardly move my windows around anyway, but what does move is the text inside. So why not wobbly letters? Wobbletters. Definitely in the category of felt cute might delete later.

My original idea was to add a little spin to each letter as it scrolls. Like the letters are hanging on a backboard, and as it bounces up and down, momentum is transferred to the letters. Didn’t quite make it that far, but maybe next time.

To start, I just wanted to check I could shift the vertices around a bit. The same wobble for every vertex, no distortion.

        var wobblex, wobbley float32
        if smoothAmt != 0.0 {
            wobblex = (rand.Float32() -0.5) / 50.0
            wobbley = (rand.Float32() -0.5) / 50.0
        }
        for k := 0; k < 6; k++ {
                base := &baseverts[x+k]
                base.adj[0] += wobblex
                base.adj[1] += smoothAmt + wobbley
        }

This ended up looking much cooler than I thought. Like a faceted glass privacy screen. Apple should totally add this now. It fits with the glass theme. The sequel to liquid glass, solid glass!

Unfortunately, this renders the text unreadable while scrolling.

Video is at 30 fps, but the illusion is more complete at 90 fps. You no longer see individual letters, just transient edges as they pass by.

<video playsinline controls poster="/images/wobble.jpg">
<source type="video/mp4" src="/images/wobble.mp4">
</video>

Accidentally rebooted after installing this, so I guess it’s wacky week for a while.

Posted 10 Jun 2025 19:28 by tedu Updated: 10 Jun 2025 19:28
Tagged: software
V
V