Rear Lights

I drive a 1998 Toyota Corolla. For reference, here is a guide to the rear lights.

 text added with annotately.com
text added with annotately.com

Note that the brake light also serves as a tail light, which makes it easy to tell if it's out even solo.

To test the backup/reverse light, you need to put the car in reverse (but can keep the brake down). This needs a second person.

All the rear lights are easy and cheap to replace. (The front lights, only cheap.)

Tagged ,

Zorchpad Prototype Roadmap

It's me, and I'm back working on the Zorchpad. This is the brainchild of one Kragen. We have somewhat different, but related ideas for where to take the project. The idea is to make a computer that will continue to work as long as the human using it.

It's been a while (9 months) since I've posted about the Zorchpad. Basically, I developed an ugh field* around the case. I had been designing it in CAD and trying to print 3D versions of it, for approaching 2 or 3 months, and I just got sick of it. I kept getting stuck, and delayed, and etc. The problem was that I was just emotionally burnt out on the whole subject, and unwilling to look at the case, let alone try to make it yet again. (Even though there are probably some pretty easy ways to do it, like cardboard or clay.)

Adam Simonyi to the rescue! I sat down with Adam and woefully begged him to take care of the case for me. And he did!

 this case took me 2 months
this case took me 2 months
 this case took him 2 days. top half designed but not printed
this case took him 2 days. top half designed but not printed

Blame any aesthetic shortcomings on me -- I pushed him pretty hard on "we're just testing electronics! It should look like shit!

Now I am feeling much better and mostly unstuck. I'm ready to start work on the pad again. <3 Thanks Adam!

Even though no big milestones have been accomplished recently, this seems like a good time to summarize the state of the project.

tl;dr: The power budget is 1 milli-watt. As a bit of context, Kragen's approach to making a computer that lasts a long time is to avoid parts that fail. In his experience (he walks around with pocket computers a lot), this seems to include dead batteries. They're out of charge, or need replaced, or there's no power outlet, or he forgot his charger. So his design does not include a battery. Instead, the whole thing is designed to run on solar cells indoors, and hide any power failures from the user. Think an old-school pocket calculator. So, because we want to run on indoor solar, we have a REALLY small power budget (1 milli-watt). Personally, I think even if you have to run on battery, low power use will still be cool.

This heavily influences our hardware choices. We're experimenting and seeing how it works in practice!

Okay, on to the prototype. Where is it at? Get ready for a dump of how my brain works.

v0.1 Roadmap

  • CPU:
    • Priority: (Done)
    • Design notes: Apollo3 system-on-a-chip (on an Adafruit breakout board)
    • Hardware State: Working.
    • Software State: Working.
    • Power: Not tested.
  • Keyboard:
    • Priority: Blocking
    • Design notes: We need a low-power keyboard. I'm making a "matrix" keyboard (zero power usage, needs outside electronics). You can buy these premade up to numpad size.
    • Hardware State: Not working. I have a 12x5 plate to put keyswitches into, I have switches, and I have keycaps. I should be able to assemble the hardware. Then I will hand-solder them, following instructions from the custom mechanical keyboard community.
    • Software State: Partially working. Tested with 4x4 keyboard.
    • Power: Not tested.
    • Next step: 3D Print
  • Video (Screen):
    • Priority: (Done)
    • Design notes: We need a low-power screen. We selected the SHARP memory-in-pixel display.
    • Hardware State: Working.
    • Software State: Working.
    • Power: Not tested.
    • Next step blocker: Power measurement
  • Audio Out:
    • Priority: (Done for v0.1)
    • Design notes: Audio is low-power enough that we can do it for headphones. We are adding an audio jack. This also has the advantage that earbuds are easier to replace than speakers.
    • Hardware State: Working.
    • Software State: Beeps only (with PWM)
    • Power: Not tested.
    • Next step blocker: Power measurement
  • Persistent Storage:
    • Priority: High
    • Hardware State: Working (built-in to apollo3)
    • Software State: Working.
    • Power: Not tested.
    • Next step blocker: Power measurement
  • Power Switch:
    • Priority: Blocking
    • Hardware State: Trivial
    • Next step: Do it
  • Wire reduction:
    • Priority: Blocking
    • Design notes: A 12x5 matrix keyboard needs not (12+5) wires, but 9 wires. Combined with all the other peripherals, that's too many, so we need something like a shift register to reduce the wire count.
    • Hardware State: Not working. Have not found a low-power shift register or alternative.
    • Software State: (Blocked on hardware)
    • Next step: Order parts OR Do it with high-power shifter for v0.1
  • Wiring, General:
    • Priority: Blocking
    • Hardware State: Not working. (Plan is jumpers or connectors, with wire ends soldered to boards)
    • Next step: Draw wiring diagram, Order parts
  • Power Supply:
    • Priority: Blocking
    • Design notes: The first version will probably just be a AA battery (not solar)
    • Hardware State: Not working
    • Next step: Order parts (AA holder), Check required voltages for all parts, Design schematic

v0.2 Roadmap

  • E-ink Screen:
    • Priority: Mid
    • Design notes: I'm testing adding an e-ink display as well, because the memory-in-pixel display goes up to around 3-4 inches diagonal only.
    • Hardware State: Not spec'ed. I have two around the house.
    • Software State: Large screen working on RPi but not apollo3, small screen not working.
    • Power: Probably uses too much power. Looking around for different screens that use less.
    • Next step: Research
  • PC Communicator:
    • Priority: High.
    • Design notes: How do we talk to the apollo3 from a normal computer? With the larger apollo3 breakout board, we get a UBS programmer, which solves this for early versions. But we can't measure power usage with USB plugged in, it uses some GPIO pins, and it won't work for the final prototypes with the small breakout board. The main goal is to reprogram the software, not to "talk" and send internet traffic.
    • Power: Not tested (could be net power gain!)
    • Next step blocker: GPIO pins
  • Audio In:
    • Priority: Very Low
    • Design notes: (none)
    • Hardware State: The apollo3 may have an integrated microphone, I wasn't clear.
    • Software State: Not working.
    • Power: Not tested.
    • Next step: Research
  • Hard Disk:
    • Priority: Low
    • Design notes: First version will use a microsd.
    • Hardware: Not working. If we want a slot (as opposed to soldering to the pads), also not ordered.
    • Software: Not working.
    • Power: Not tested.
    • Next step: Buy parts
  • Audio Out:
    • Priority: Mid
    • Design notes: Improve to support voices
    • Hardware State: ?
    • Software State: No voice/music yet. Unclear whether that will need a hardware upgrade.
    • Power: Not tested.
    • Next step: Programming, Testing
  • GPIO:
    • Priority: Mid
    • Design notes: To let us hook up new peripherals and/or talk to a computer
    • Hardware State: Not working
    • Software State: Not working
    • Next step blocker: Wire reduction
  • Power supply v2: Capacitor buffer:
    • Priority: Low
    • Design notes: The actual power source is solar power or a battery. We want a buffer so that when the power dies, we have enough time to hibernate.
    • Next step: Ask for help
  • Power supply v3: Solar power:
    • Priority: Low
    • Design notes: Testing solar panels is high priority to make sure they can supply the right amounts of power, but not actually using them.
    • Next step: Buy panels, Test panels
  • Power Use Measurement:
    • Priority: Mid
    • Next step: Ask for help (in progress)
  • Battery Level Measurement:
    • Priority: Mid
    • Design notes: Monitor the current battery %/runtime, capacitor %/runtime. Optional: trigger an alert when the battery/solar panel is removed, so we can know to hibernate.
    • Next step: Ask for help
  • Clock:
    • Priority: Very Low
    • Design notes: Is this needed for power monitors? If so becomes a high priority.
    • Next step: Research
  • Connectors + Sockets:
    • Priority: Low
    • Design notes: I'd like to learn how to make sockets. This enables to use better connectors than jumper wires, slot in more expensive chips like the apollo3 to re-use them across builds, and use displays with flex ribbon cables. It also allows end-user servicability.
    • Next step: Requirements, Research, Order parts
  • Circuitboarding:
    • Priority: Low
    • Design notes: We're wiring together a bunch of floating parts with hot glue and jumper wires. Switch to having circuitboards instead at some point. Could be perfboard or traditional printed circuits. Printed circuits could be done with a service or at home.
    • Next step: Design in KiCAD, Print
    • Next step blocker: Connectors + Sockets
  • Persistence on Power Loss:
    • Design notes: We're planning to run on solar (maybe also battery). If it's dark, you shouldn't lose state. We should just "pause" until the light comes back.
    • Hardware notes: Blocked
    • Software notes: Difficult. This is an OS-level software problem.
    • Next step blockers: Capacitor buffer, Battery level measurement
  • OS / VM:
    • Design notes: We want an OS that stops badly-written software from locking up your machine in unfixable ways.
    • Software notes: Not designed
    • Next step: Write software
  • Software:
    • Design notes: We need some test software! Text editor, text reader, software editor/compiler.
    • Software notes: Not written
    • Next step: Write software
Tagged

The Go Programming Language

I recently read "The Go Programming Language" by Alan A. A. Donovan and Brian W. Kernighan. (I like to imagine Mr. Donovan's full name is Alan Alan Alan Donovan--please don't correct me.) So far I have read the book cover to cover, but not programmed any significant Go.

While reading, I wrote myself a list of questions to look up after I finished. Here are the questions (together with answers).

Q20: Go came out in 2012 with version 1.0. The book was published in 2016 and uses Go 1.5. As of writing it is 2025, and the latest version is 1.24. What has changed in Go since the book came out and now? (Note: Language changes only, no library or tooling changes mentioned)

  • 1.6 (2016) - No changes
  • 1.7 - No changes*
  • 1.8 (2017) - No changes*
  • 1.9
    • Introduced type aliases
  • 1.10 (2018) - No changes*
  • 1.11 - No changes
  • 1.12 (2019) - No changes
  • 1.13
    • New number literal syntax.
    • Shift count can be signed now.
  • 1.14 (2020)
    • Allow overlapping methods for embedded interfaces (solves the diamond problem for interfaces)
  • 1.15 - None
  • 1.16 (2021) - No changes
  • 1.17
    • Allows conversion from slice to fixed-size array pointer (can panic)
  • 1.18 (2022)
    • Generics--type parameters can be used in type definitions as well as function definitions.
    • Added type any as a shorter name for interface{}
    • Added type comparable: == works
    • Added union types: A or B or C
    • Added type ~T : ~int is any type whose underlying type is int
  • 1.19 - None*
  • 1.20 (2023)
    • Allow conversion from slice to fixed-size array.
    • Broading of 'comparable' to include interfaces that might panic at runtime.
  • 1.21
    • New built-ins (min, max)
    • New built-in (clear) -- applies or slice or map
    • Type inference improvements which went a bit over my head.
    • Fixed an edge case around panic(nil).
  • 1.22 (2024)
    • Fixes the loop iteration gotcha caused by lexical scoping inside loops. (Previously, there was one loop index which was updated -- now a new variable is created and assigned each loop).
    • For loops can range over integers.
  • 1.23
    • Added iterator ranges (iterations are functions).
  • 1.24 (2025)
    • Type aliases can be parameterized.

Q1: If you try to take the address &map, the compiler prevents you, because the address of a map is its backing store, which can silently change. How is this done? Can I do it for my own types?

Note: You can take the address of &map, just not &map[2].

"It just does that". Map is a built-in type, not an implementation, so it just does stuff you can't. No you can't do it for your own types. There are garbage collection reasons they made it work this way but they're not interesting.

Q2: Can you take the address of a slice? Can the same problem happen?

You can take the address of both &slice and &slice[2].

If append(slice, 599) re-allocates the backing store, the second points to the original backing store, and prevents it from being garbage collected. Also, any changes to it are not affected in the slice returned by append, so you probably shouldn't.

Q3: What are all the forms of for loops?

  • for INITIALIZER; CONDITION; POST {} - C for loop
  • for {} - Loop forever
  • for CONDITION - C while loop
  • for index, value := range THING {} or for index := range THING {} or for range THING {}. Range can iterate over:
    • array/slice (index, value)
    • string (index, value) - this is unicode code points ("runes") and not bytes
    • map (key, value) - this is in random order
    • channel (e, N/A) - received elements of a channel
    • Since 1.22: int (index, N/A) - from 0 to N-1
    • Since 1.23: function (T1, T2) - function is called with a "loop body" function, which can be called once with each value, and returns whether to keep iterating
  • Note that break and continue affect loops

Q4: What are the signatures of range, if it's a function?

No, it's a keyword (p27, for Go 1.4 see also p141 gotchas). See Q3 for all the range variants, and Q18 for general function overloading.

Q5: Why does Go say -0 is not equal to 0 in the following code?

var z float64
fmt.Println(-z) // Prints -0

IEEE 754 defines a negative zero. Positive and negative compare equal, so code will generally work as you expect. Go chooses to print "-0" rather than "0" for this value in format strings, while other languages print "0" for both.

Additional discoveries:

  • int(-z) is 0
  • the constant -0.0 is positive zero (!)

Q6: (p98) Why does ReadRune() in invalid unicode return a replacement char with length 1 ? The replacement char has byte length 2. Is this a deliberate signal value?

Yes (no citation)

Q7: What happens if you convert Inf, -Inf, NaN, or a float too large to fit into an int, to an int? Book claims conversions don't panic.

All of them are converted to

  • uint/uint64: 2^63 = 9223372036854775808
  • int/int64: -2^63 = -9223372036854775808 (even +Inf and 1e200)

I don't know why these particular values. I have asked on Stack Overflow

Q8: In Go, can you marshal functions or closures?

No.

Reflect does not support it (and so neither does json.Marshal, etc). I couldn't immediately come up with a way even to distinguish closures and non-closures, or get the name of a function. You can get a function pointer and then do some heuristics to get the name, maybe.

Q9.1: How do map literals work for non-strings?

map[Point]string{Point{0, 0}: "orig"}
    or
map[Point]string{{0, 0}: "orig"} // Names can be left out of keys or values in map literals

Q9.2: Can I make user types with this mechanism? (ex. my own literal initialization)

No. Literals are only for built-in types, and the mechanism is not extensible. (But you can have the underlying type be a map an initialize your type with one.)

Q10: Struct fields can have metadata ("struct tags"). Can whole types?

No.

Q11: How does ... variadic notation fail if the slice can be too short to fill all arguments? Is it only allowed for the variadic argument or can it span multiple?

Yeah, you have to match it with the variadic argument.

Q12: Thomson, Pike, Kernighan, Richie -- fill in a Venn Diagram of what they made/wrote.

  • Ken Thompson: B, Unix, Plan 9, Go, regexes, UTF8, QED, ed, chess endgames, Inferno, "Reflections on Trusting Trust"
  • Dennis Richie: B, C, Unix (inc. man pages?), Plan 9, Inferno, Limbo, "The C Programming Language"
  • Brian Kernighan: awk, "The C Programming Language" (including "Hello, world!"), "The Go Programming Language", "The Elements of Programming Style", "The Practice of Programming", "The Unix Programming Environment"
  • Rob Pike: Plan 9, Go , Inferno, Limbo, Newsqueak, sam, acme, Sawsall, "The Unix Programming Environment", "The Practice of Programming"

Q13: What order are deferreds called in?

Last in, first out. Then exit the function, and so on up the stack.

Q14: What happens if a panic happens, a deferred is called, and the deferred panics?

It prints nested panics informationally, but continues to pop the deferreds

Q15: map[x] = y panics if map is a nil map, but slice = append(slice, 1) works fine if slice is a nil slice. Why? I feel like I'm being nickle-and-dimed by Go that the zero value panics.

Both slice and map suck if they're nil. It's just that slice is so bad (normal use case of append panics even for non-nil values) that they added a library append function, which happened to deal with the nil case too.

You can write a map_set which returns a new map much like append. You can't write a better map, because there's no operator overloading (see also Q17)

Q16: Why is the *p vs p method consistency principle a thing?

Because a.Method() notation sugars between the two, but interfaces don't. You want at least one of *p and p to support an interface.

Q17: Is there operator overloading?

No.

And Go has a broader principle that none of the core language calls any specific method name (String(), Error(), etc), which came up in the 1.23 iterator design.

Q18: Is there function overloading? (range, map.get, json.Marshal, type assertion)

Map lookup, type assertion, and channel receive are keyword-level overloading, not functions. They are special cases.

In general, a function has to take the same number of inputs and return the same number of outputs, of the same types. There is one exception, which is that one of the inputs can be variadic--for example, the built-in function make.

1.6 (2016) answer: BUT, you can "return" a generic type like interface{} (which the user has to cast unsafely to the right type) or modify one of the inputs (which can be something like interface{}). The latter is how json.Marshal works and knows what type to deserialize. To compliment this, you can do runtime inspect of types through a select statement or the reflect module.

1.18 (2022) answer: Same for number of arguments, but also functions can now be generic (ex. type A -> A). If only the return type varies, you can use named returns to do stuff with the return type. See Q24 also.

Q19: Does Go have parametric polymorphism?

1.6 (2016): No.

1.18 (2022): Yes.

Q21: Can I extend someone else's package after the fact? (ex. add new methods to json, perhaps to make it support some interface)

No. (But you can do type and interface embedding.)

Q22: What happens if I call defer inside a defer function or during a panic?

It works normally, either way.

If you create an infinite loop of deferred functions (with or without infinite panics) it does a stack overflow, and it's not obvious it was mid-panic immediately.

Q23: (p208) Why does .( type assertion return one OR two things depending? Did not seem to cover in multiple return assignments.

See Q18.

Q24: Can type switching do slices, maps, arrays, etc? (p212)

1.6 (2016): No. You need to use reflection.

1.18 (2022): Unsure. Generics were introduced, and I don't know how they interface with type switching. I think type switches only take (fully-specified) concrete types in the case statements?

Q25: Does Go have a preprocessor or macros?

No to both.

Q26: TODO: Read proposal that caused unix pipes

There wasn't a written one, I was misremembering Douglas McIlroy's suggestions as being a formal memo. The v3 vs v4 pipeline description seems interesting to compare, however. See v3, 1973 notation (p121-123, 3 pages) vs v4, 1973 (p98, one paragraph).

Q27: Is 'make' a keyword? What args does it take for each type? (Can I change what it takes for my types)

Both make and new are built-in functions, not keywords. make takes a type, and optionally size parameters, and returns that type. new takes a type and returns a pointer to a new variable of that type.

  • make(CHANNEL\_TYPE, size) - size defaults to 0
  • make(SLICE\_TYPE, size, capacity) - capacity defaults to size. (no default for size?)
  • make(MAP, starting size) - starting size defaults to something reasonable
  • new(TYPE) - only one form

Q28: Can you write 'map' in Go? (or something to join two channels)

1.6 (2016): Only awkwardly, using reflection (see Q19). Map could have the signature: map(in_list interface{}, f interface{}, out_list interface{})

1.18 (2022): Yes, both. Generics got added.

Q29: Are CSP in Go + Erlang basically the same model?

Not sure, didn't look this one up. But basically no, even if the deeper model is the same.

  • Erlang has out-of-order reading, indefinitely growing channel size, one unidirection 'channel' per process, and the notion of 'links' between processes to cause cascading failure.
  • Go has channel closing, and the notion of a specific channel size (which defaults to 0), so it's more synchronous by default.

Q30: Why is there a & in memo := &Memo{request: make(chan request)} on p278, when I thought you couldn't address constants (p159)?

It's a special case for & and new only. From Stack Overflow:

Calling the built-in function new or taking the address of a composite literal allocates storage for a variable at run time. Such an anonymous variable is referred to via a (possibly implicit) pointer indirection.

Suggested exerciae 31: (p280) Test # of goroutines and stack sizes before crash

Knock yourself out.

Suggested exercise 32: Test # of bits in an int/uint

^uint(0) >> 63 == 1

Q33: How do you detect int overlow (signed or unsigned) in Go?

You can't. There is a library for it


While reading the book, I noticed three big problems in Go that popped out to me.

  • The gotchas around for-loop scoping (fixed in 2024)
  • The lack of generics looked really painful (fixed in 2022). Functional programming looked pretty impossible (annoying, since Go lets you pass around functions and even closures), and it looked hard to glue together channels at a high level. The book's example of memoization code was pretty bad. This mostly seems all fixed (although I'm not sure how to test "A is a B" for non-concrete B at runtime).
  • The number of built-in panics looked bad. In particular, I though the default value for map being nil, which panics when you try to insert something, was a dumb default. Now that I learned more, I think it's a dumb default and the default slice is dumb too.

Adding generics to the language made me much more likely to give it a whirl.

References:

[1]: https://go.dev/play/ "The Go Playground"

[2]: https://go.dev/doc/#references "The Go Documentation"

[3]: The Go Programming Language, by Alan A. A. Donovan and Brian W. Kernighan

Tagged ,

Multi-user Text Editor

I finished the text editor I was working on to learn OCaml.

 three people editing one document
three people editing one document

It's (tentatively) called textmu. The selling point is that it's designed for multiple users, all SSH-ed into the same machine, to edit a document collaboratively. Otherwise, I basically made it a simplified knockoff of nano.

Source code is on github.

If you'd like to try it out (and don't want to compile it locally), feel free to get an account on my public server, tilde.

Also, an update. The OCaml folks said it's fine to publish their book, so you can now get your own copy if you want one (link goes to updated blog post with photos).

Tagged ,

OCaml Manual

Update: the book is available for sale on Lulu to the public. Volume 1 and Volume 2.

Recently I've been teaching myself new programming languages with books. I got one for D, Elixir, Erlang, and Go.

OCaml was also on my list of languages to learn, but there is no good OCaml book available. I started reading an online course textbook (for Cornell's CS 3110), only to find it painfully slow, beginner-level, and aimed at course tools besides. Eventually, I found the official OCaml manual to be the best source of information.

Unforunately, there is no published version of the manual. It is available online as HTML, PDF, or even a text file, but that's all. So, I went to Lulu and published my own copy of their PDF.

 front cover of volume 1
 spine view of both volumes
 interior view of the table of contents in one book, and a random page in the other

The PDF is so long I split it into two volumes. I'm pleased by how the manual turned out, though I haven't actually used it much for reference -- I've already spent two weeks programming OCaml before it arrived (Lulu is not fast).

 I've been working on a text editor
I've been working on a text editor

I've been working on a terminal text editor in OCaml for two weeks. I'll post about that in more detail if and when I finish it.

Tagged ,

2024 Books

Here’s a list of books I read in 2024. The ones in bold I recommend.

Fiction:

  • (Aether's Revival, Book 1) Aether's Blessing by Daniel Schinhofen
  • Agartha Loop 1 by RavensDagger
  • Agartha Loop 2 by RavensDagger
  • All the Skills 3 by Honour Rae
  • All the Skills 4 by Honour Rae
  • Among Others by Jo Dalton
  • Assistant to the Villain (Book 1) by Hannah Nicole Maehrer
  • (Androne, Book 1) Androne by Dwain Worrell
  • (Androne, Book 2) Alliance by Dwain Worrell
  • (Arcane Ascension, Book 4) The Silence of Unworthy Gods by Andrew Rowe
  • (Arcane Ascension, Book 5) When Wizards Follow Fools by Andrew Rowe
  • Astral Odyssey by Virgil Knightley, Jay Aury
  • (Babel, Book 1) Senlin Ascends by Josiah Bancroft
  • (Babel, Book 2) Arm of the Sphinx by Josiah Bancroft
  • (Babel, Book 3) The Hod King by Josiah Bancroft
  • (Babel, Book 4) The Fall of Babel by Josiah Bancroft
  • Beware of Chicken by Casualfarmer
  • Blood for Power 1 by Scott W. James
  • Book of the Dead: Awakening by RinoZ
  • (Budding Scientist in a Fantasy World, Book 1) A Small Town in Southern Illvaria by Acaswell
  • (Budding Scientist in a Fantasy World, Book 2) Society of Starry Eyes by Acaswell
  • The Coworker by Freida McFadden
  • Cultination Begins with Generosity by Plutus
  • Dead Tired 1 by RavensDagger
  • Dead Tired 2 by RavensDagger
  • Delve by SenescentSoul
  • Discovery of Witches by Deborah Harness
  • (Discworld) Science of Discworld by Terry Pratchett et al
  • (Discworld) Night Watch by Terry Pratchett
  • (Disinherited Prince, Book 1) The Disinherited Prince by Guy Antibes
  • (Disinherited Prince, Book 2) The Monk's Habit by Guy Antibes
  • (Disinherited Prince, Book 3) A Sip of Magic by Guy Antibes
  • (Disinherited Prince, Book 4) The Sleeping God by Guy Antibes
  • (Disinherited Prince, Book 5) The Emperor's Pet by Guy Antibes
  • (Disinherited Prince, Book 6) The Misplaced Prince by Guy Antibes
  • (Dumb Luck and Dead Heroes, Book 1) The Worst Ship in the Fleet by Skyler Ramirez
  • (Dumb Luck and Dead Heroes, Book 1) The Worst Spies in the Sector by Skyler Ramirez
  • Dungeon Devotee by Nixia
  • (Dungeon Crawler Carl, Book 7) This Inevitable Ruin by Matt Dinniman
  • Eight by Samer Rabadi
  • Eight 2 by Samer Rabadi
  • Eight 3 by Samer Rabadi
  • (God of Density, Book 1) Dawn of the Density God by ToraAKR
  • (Gods of the Game, Book 1) Krieg Chess by Phil Tucker
  • (Gods of the Game, Book 2) Gods of the Game by Phil Tucker
  • (Grand Game, Book 5) Wolf in the Void by Tom Elliot
  • (Grand Game, Book 6) A Scion's Duty by Tom Elliot
  • (Grand Game, Book 7) Ancient Debts by Tom Elliot
  • Grimmwald by Jay Aury
  • Heavenly Shae by daneislazy
  • Hell Difficulty Tutorial by Cerim
  • Heretical Fishing by Haylock Jobson
  • (Immortal Great Souls, Book 3) LastRock by Phil Tucker
  • (Industrial Strength Magic, Book 1) Industrial Strength Magic by Macronomicon
  • (Industrial Strength Magic, Book 2) Sequel.exe by Macronomicon
  • (Industrial Strength Magic, Book 3) Rival.EXE by Macronomicon
  • The Kaiju Preservation Society by John Scalzi
  • Law of the Jungle 1 by Vasily Mahanenko
  • Law of the Jungle 2 by Vasily Mahanenko
  • Law of the Jungle 3 by Vasily Mahanenko
  • Law of the Jungle 4 by Vasily Mahanenko
  • Law of the Jungle 5 by Vasily Mahanenko
  • Law of the Jungle 6 by Vasily Mahanenko
  • Law of the Jungle 7 by Vasily Mahanenko
  • Law of the Jungle 8 by Vasily Mahanenko
  • Library System Reset (Book 1): Overdue by K.T. Hanna
  • Library System Reset (Book 2): Damaged by K.T. Hanna
  • Library System Reset (Book 3): Rebound by K.T. Hanna
  • Machine of Death edited by Matthew Bennardo and Ryan North
  • Magic's Mantle by Bruce Sentar
  • Mercy of Gods by James S.A. Corey
  • (Millenial Mage, Book 7) Eskau by J.L. Mullins
  • (Millienial Mage, Book 8) Ironbound by J.L. Mullins
  • Minute Mage 1 by Reg Rome
  • Minute Mage 2 by Reg Rome
  • Morning Glory Milking Farm by C.M. Nascosta
  • Murder Your Employer by Rupert Holmes
  • (Murderbot, Book 2) Artificial Condition by Martha Wells
  • (Murderbot, Book 3) Rogue Protocol by Martha Wells
  • Never Die Twice by Maxime J. Durand (Void Herald)
  • Newt and Demon by Edwin M. Griffiths
  • (Nothing Mage, Book 3) Syzygy by J. P. Valentine
  • Orconomics by J. Zachary Pike
  • Pale by wildbow
  • Path of Ascension 1 by C. Mantis
  • Path of Ascension 2 by C. Mantis
  • Path of Ascension 3 by C. Mantis
  • Path of Ascension 4 by C. Mantis
  • Path of Ascension 5 by C. Mantis
  • Path of Ascension 6 by C. Mantis
  • Path of Ascension 7 by C. Mantis
  • Press Start to Play edited by Daniel H. Wilson and John Joseph Adams
  • The Primal Hunter 1 by Zogarth
  • The Primal Hunter 2 by Zogarth
  • Quest Academy (Book 1): Silvers by Brian J. Nordon
  • Quest Academy (Book 2): Scavengers by Brian J. Nordon
  • Quest Academy (Book 3): Saviors by Brian J. Nordon
  • (Revelation Space) The Prefect by Alastair Reynolds
  • (Revelation Space) Elysium Fire by Alastair Reynolds
  • (Revelation Space) Machine Vendetta by Alastair Reynolds
  • (Revelation Space) Revelation Space by Alastair Reynolds
  • Royals of Villain Academy 1-4 by Eva Chase
  • Seek by wildbow
  • (Shades of Magic, Book 2) A Gathering of Shadows by V.E. Schwab
  • She of Many Dragons by Honour Rae
  • (Stargazers War, Book 1) To Flail Against Infinity by J.P. Valentine
  • (Stargazers War, Book 2) To Catch a Falling Leaf by J.P. Valentine
  • (Mortal Techniques, Book 3) Spirits of Vengeance by Rob J. Hayes
  • (Steerswoman, Book 4) Words of Power by Rosemary Kirstein
  • (Strings of Empire, Book 1) The Wizard Corps by Guy Antibes
  • (Strings of Empire, Book 2) The Cloister Wizard by Guy Antibes
  • Three Kinds of Lucky by Kim Harrison
  • Translation State by Ann Leckie
  • (Undying Magician, Book 3) The Undying Caverns by Shane Purdy
  • (Unbound, Book 1) Dissonance by Nicoli Gonnella
  • (Unbound, Book 1) Silence by Nicoli Gonnella
  • (Unbound, Book 1) Hunger by Nicoli Gonnella
  • (Unbound, Book 1) Fury by Nicoli Gonnella
  • (Unbound, Book 1) Threshold by Nicoli Gonnella
  • (Unbound, Book 1) Expanse by Nicoli Gonnella
  • Villain for Hire (Book 1): Bad Girls Abound by Jay Aury
  • Villain for Hire (Book 2): Damsels and Deathrays by Jay Aury
  • Villain for Hire (Book 3): Maidens and Master Minds by Jay Aury
  • Villain for Hire (Book 4): Hell on High Heels by Jay Aury
  • Villain for Hire (Book 5): Fembots with Benefits by Jay Aury
  • The Villainess Is An SS+ Rank Adventurer 1 by Kaye Ng
  • The Way of Shadows by Brent Weeks

Nonfiction:

  • Coders at Work by Peter Seibel
  • The Madman's Library by Edward Brooke-Hitching
  • To-Do List Formula by Damon Zahariades
  • Veneering Made Easy by Herman Hjorth
Tagged , , ,

2023 Books

Here’s a list of books I read in 2023 (a year later!). The ones in bold I recommend.

  • All the Skills 1 by Honour Rae
  • All The Skills 2 by Honour Rae
  • (Alpha Physics, Book 1) Wagga by Alex Kozlowski
  • (Alpha Physics, Book 2) Delay by Mr Alex Kozlowski
  • (Alpha Physics, Book 3) Disquiet by Mr Alex Kozlowski
  • (Alpha Physics, Book 4) Albury by Alex Kozlowski
  • (Alpha Physics, Book 5) Dungeon by Alex Kozlowski
  • (Alpha Physics, Book 6) Home Bound by Alex Kozlowski
  • The Amber Project by J.N. Chaney
  • Amelia The Level Zero Hero 1 by V.A. Lewis, Melas Delta
  • Among Strangers by Robert Silverberg
  • (Arcane Ascension, Book 1) Sufficiently Advanced Magic by Andrew Rowe
  • (Arcane Ascension, Book 2) On the Shoulders of Titans by Andrew Rowe
  • (Arcane Ascension, Book 2) The Torch that Ignites the Stars by Andrew Rowe
  • (Arcane Awakening, Book 1) Imperial Wizard by J Parsons
  • (Arcane Awakening, Book 2) Imperial Wizard 2: Ambitions by J Parsons, Niki Prince
  • Armada by Ernest Cline
  • (Astra Academy, Book 1) Academy Arcanist by Shami Stovall
  • (Astra Academy, Book 2) Mimic Arcanist by Shami Stovall
  • The Atlantis Gene by A.G. Riddle
  • (Body Electric, Book 3) Hardware by Electra Shepherd
  • Bridge of Birds by Barry Hughart
  • (Brightest Shadow, Book 1) The Brightest Shadow by Sarah Lin
  • (Brightest Shadow, Book 3) The Unnecessary Victory by Sarah Lin
  • (Budding Scientist in a Fantasy World, Book 1) Small Town in Southern Illvaria by Acaswell
  • Brute Force by Scott Meyer
  • The Chemist By Stephanie Meyer
  • Clear (Comixology Originals) by Scott Snyder, Will Dennis, Francis Manapul, AndWorld Design
  • (Completionist Chronicles, Book 1) Ritualist by Dakota Krout
  • (Completionist Chronicles, Book 2) Regicide by Dakota Krout
  • (Completionist Chronicles, Book 3) Rexus, Side Quest by Dakota Krout
  • (Completionist Chronicles, Book 4) Raze by Dakota Krout
  • (Completionist Chronicles, Book 5) Ruthless by Dakota Krout
  • (Completionist Chronicles, Book 6) Inflame by Dakota Krout
  • (Completionist Chronicles, Book 7) Invent by Dakota Krout
  • (Completionist Chronicles, Book 8) Implode by Dakota Krout
  • (Completionist Chronicles, Book 9) Tenacity by Dakota Krout
  • (Completionist Chronicles, Book 10) Thesaurize by Dakota Krout
  • Conspiracy of Truths by Alexandra Rowland
  • (Cradle, Book 12) Waybound by Will Wight
  • Dawn of the Void 1 by Phil Tucker
  • Dawn of the Void 2 by Phil Tucker
  • Dawn of the Void 3 by Phil Tucker
  • Dead Tired 1 by RavensDagger
  • (Divine Dungeon, Book 1) Dungeon Born by Dakota Krout
  • (Dungeon Crawler Carl, Book 1) Dungeon Crawler Carl by Matt Dinniman
  • (Dungeon Crawler Carl, Book 2) Carl's Doomsday Scenario by Matt Dinniman
  • (Dungeon Crawler Carl, Book 3) The Dungeon Anarchist's Cookbook by Matt Dinniman
  • (Dungeon Crawler Carl, Book 4) The Butcher's Masquerade by Matt Dinniman
  • (Dungeon Crawler Carl, Book 4) The Gate of the Feral Gods by Matt Dinniman
  • (Dungeon Crawler Carl, Book 6) The Eye of the Bedlam Bride by Matt Dinniman
  • (Dungeon from the Void, Book 1) The Void Dungeon by Shane Purdy
  • (Dungeon from the Void, Book 2) The Dungeon Delve by Shane Purdy
  • (Dungeon from the Void, Book 3) The Dungeon Assault by Shane Purdy
  • (Dungeon from the Void, Book 4) The Neutral Nation by Shane Purdy
  • (Elemental Magic, Book 1) SORCERER by Michael Nowotny, Mark Woodhouse, Trent Landt
  • Ella Minnow Pea by Mark Dunn
  • Emergency Skin by N. K. Jemisin
  • Enter System (Natural Laws Apocalypse Book 1) by Tom Larcombe
  • (Evander Tailer, Book 1) The Enchanter by Tobias Begley
  • (Evander Tailer, Book 2) The Diviner by Tobias Begley
  • The Extractionist by Kimberly Unger
  • The Final Decree by Shami Stovall
  • First Contact by D. L. Harrison
  • (Galactogon, Book 1) Start the Game by Vasily Mahanenko
  • (Gild, Book 1) Gild by Raven Kennedy
  • (Gild, Book 2) Glint by Raven Kennedy
  • (Gild, Book 3) Gleam by Raven Kennedy
  • (Good Guys, Book 1) One More Last Time by Eric Ugland
  • The Good Samaritan by John Marrs
  • (Grand Game, Book 1) The Grand Game by Tom Elliot
  • (Grand Game, Book 2) Way of the Wolf by Tom Elliot
  • (Grand Game, Book 3) World Nexus by Tom Elliot
  • (Grand Game, Book 4) House Wolf by Tom Elliot
  • (Heavenly Throne, Book 1) Force Cultivation by Yuri Ajin
  • The Hedge Wizard by Alex Maher
  • The Housemaid by Freida McFadden
  • How Long Til Black Future Month by NK Jemisin
  • Hunter x Hunter by Yoshihiro Togashi
  • (Immortal Great Souls, Book 1) Bastion by Phil Tucker
  • (Immortal Great Souls, book 2) The Rascor Plains by Phil Tucker
  • (Iron Widow, Book 1) Iron Widow by Xiran Jay Zhao
  • The Killing Moon by NK Jemisin
  • The Last Conversation by Paul Tremblay
  • (Last Horizon, Book 1) The Captain by Will Wight
  • Ledge by Stacey McEwan
  • Machine of Death, edited by Matthew Bennardo and Ryan North
  • (Mage Errant, Book 1) Into the Labyrinth by John Bierce
  • Mage Stones: Part 1 by D.J. Dammeyer
  • (Magic 2.0, Book 1) Off to Be the Wizard by Scott Meyer, Liz Pulido
  • (Menocht Loop, Book 2) The False Ascendant by Lorne Ryburn, caerulex, Silas Sontag
  • (Menochy Loop, Book 1) The Menocht Loop by Lorne Ryburn, caerulex, Silas Sontag
  • Mickey 7 by Edward Ashton
  • (Millenial Mage, Book 1) Mageling by J.L. Mullins
  • (Millenial Mage, Book 2) Mage by J.L. Mullins
  • (Millenial Mage, Book 3) Binding by J.L. Mullins
  • (Millenial Mage, Book 5) Bound by J.L. Mullins
  • (Millenial Mage, Book 5) Fusing by J.L. Mullins
  • (Millenial Mage, Book 6) Fused by J.L. Mullins
  • (Monarch, Book 1) Monarch: A Prince Out of Time by J. McCoy, Eligos
  • (Murderbot, Book 1) All Systems Red by Martha Wells
  • (Naga Brides, Book 1) Viper by Naomi Lucas
  • Natural History of Hell by Jeffrey Ford
  • Nettle & Bone by T Kingfisher
  • Never Lie by Freida McFadden
  • (Nexus Games, Book 2) The Nexus Gamesby Shami Stovall
  • (Nexus Games, Book 2) The Nexus Knight by Shami Stovall
  • (Nexus Games, Book 3) The Nexus Challenge by Shami Stovall
  • (Nothing Mage, Book 1) The Nothing Mage by J. P. Valentine
  • (Nothing Mage, Book 2) Untolled by J. P. Valentine
  • The One by John Marrs
  • One Piece by Eiichiro Oda
  • Page Keeper 1 by Dante King
  • (Paranoid Mage, Book 1) Paranoid Mage 1 by Inadvisably Compelled
  • (Paranoid Mage, Book 2) Renegade Mage 2 by Inadvisably Compelled
  • (Paranoid Mage, Book 3) Heretic Mage 3 by Inadvisably Compelled
  • The Perfect Run by Maxime J. Durand
  • Poor Man's Fight by Elliott Kay
  • Quantum Radio by A.G. Riddle
  • Randomize by Andy Weir
  • (Reckoners, Book 1) Steelheart by Brandon Sanderson
  • (Reckoners, Book 2) Firefight by Brandon Sanderson
  • (Reckoners, Book 3) Calamity by Brandin Sanderson
  • (Resonance Cycle, Book 1) Divine Invasion by Aaron Renfroe
  • Rueberry Orchard by Michele Notaro
  • (Selection, Book 1) The Selection by Kiera Cass
  • (Selection, Book 2) The Elite by Kiera Cass
  • (Selection, Book 3) The One by Kiera Cass
  • The Silent Patient by Alex Michaelides
  • The Silver Queendom by Dan Koboldt
  • (Solar Clipper, Book 1) Quarter Share by Nathan Lowell
  • (Solar Clipper, Book 2) Half Share by Nathan Lowell
  • (Solar Clipper, Book 3) Full Share by Nathan Lowell
  • Spell Thief: A Deck Building LitRPG Adventure (Tower of Cards Book 1) by J Pal
  • Starter Villain by John Scalzi
  • (Sybil, Book 1) Primordial Ascension by Azrie
  • (System Universe, Book 1) System Change by SunriseCV
  • (System Universe, Book 2) Torith by SunriseCV
  • (System Universe, Book 3) Savannah by SunriseCV
  • Teleport by Joshua T. Calvert
  • The Thinking Machine by Jaques Futrelle
  • (This Trilogy is Broken, Book 1) This Quest is Bullshit! by J. P. Valentine
  • (This Trilogy is Broken, Book 2) This Class is Bonkers! by J. P. Valentine
  • (This Trilogy is Broken, Book 3) This Guild is Batty! by J. P. Valentine
  • (This Trilogy is Broken, Book 4) This Plot is Bananas! by J. P. Valentine
  • (Thomas Covenant, Book 1) Lord Foul's Bane by Stephen R. Donaldson
  • (Titan, Book 1) Nova Terra: Titan by Seth Ring
  • (Titan, Book 2) Nova Terra: Greymane by Seth Ring
  • (Undying Magician, Book 1) The Arcane Academy by Shane Purdy
  • (Undying Magician, Book 2) Kingdom of the Fallen by Shane Purdy
  • (Warformed, Book 1) Iron Prince by Bryce O'Connor, Luke Chmilenko
  • (Warformed, Book 2) Fire and Ice by ?
  • The Watchmaker of Filigree Street by Natasha Pulley
  • (Weirdest Noob, Book 1) The Weirdest Noob by Arthur Stone, Mark Berelekhis, Mikhail Yagupov
  • (Weirkey, Book 2) Rainhorn by Sarah Lin
  • (Weirkey, Book 3) Archcrafter by Sarah Lin
  • (Weirkey, Book 4) Chasmfall by Sarah Lin
  • (Weirkey, Book 5) Bondsfungi by Sarah Lin
  • (Weirkey, Book 6) Bloodcrete by Sarah Lin
  • (Whimbrel House, Book 1) Keeper of Enchanted Rooms by Charlie N. Holmberg
  • (Whimbrel House, Book 2) Heir of Uncertain Magic by Charlie N. Holmberg
  • The Wizard's Butler by Nathan Lowell
  • You Have Arrived at Your Destination by Amor Towles

Non-Fiction

  • Be Slightly Evil by Venkatesh Rao (of Ribbonfarm)
  • Toki Pona: The Language of Good by Sonja Lang
  • The Ultimate Micro-RPG Book edited by James D'Amato
Tagged , , ,

Flash media longevity testing -- 5 years later

  • Year 0 – I filled 10 32-GB Kingston flash drives with random data.
  • Year 1 – Tested drive 1, zero bit rot. Re-wrote drive 1 with the same data.
  • Year 2 – Tested drive 2, zero bit rot. Re-tested drive 1, zero bit rot. Re-wrote drives 1-2 with the same data.
  • Year 3 – Tested drive 3, zero bit rot. Re-tested drives 1-2, zero bit rot. Re-wrote drives 1-3 with the same data.
  • Year 4 – Tested drive 4, zero bit rot. Re-tested drives 1-3, zero bit rot. Re-wrote drives 1-4 with the same data.
  • Year 5 - Re-tested drives 1-3, zero bit rot. Re-wrote drives 1-3 with the same data.

Will report back in 1 more year when I test drive 5.

The full test plan is available in the year 4 blog post

FAQ: https://blog.za3k.com/usb-flash-longevity-testing-year-2/

Tagged , , ,