275 karma · joined June 12, 2017
Every time something is updated or deleted, the entire previous record is inserted into its corresponding _A table with who did it and when (and optionally for what transaction number)
so delete from foo results in an insert into foo_A before the delete occurs. so update to bar results in an insert into bar_A before the update occurs and rolling back a delete results in picking the old values out of the _A table and rolling back an update results in picking the old values out of the _A table and inserting the current values into the _A table before the updating the main table.
It is that lack of information, which prevents hardware drivers from entering the Linux Kernel main tree; which along with Tivoization are the leading drivers of e-waste and unsecured systems.
Try you only have a single bootloader and a little bit of source code and building all the way up to a complete linux distro
https://github.com/fosslinux/live-bootstrap
(checkout the builder-hex0/fiwix work)
Just wish I could have typed half as well as Hugh Jackman in Swordfish; then I wouldn't feel so sorry for all of the bugs I introduced into production because of her.
Not to mention the absolutely bad design for handling merge conflicts (punt to human if more than 1 person touched a file seriously???)
Heck the cryptocurrency community has repeatedly sent death threats to the very people working on their root of trust.
People just plain suck
https://github.com/oriansj/stage0/blob/master/High_level_pro...
It'll dehex any non-humanly used ASCII characters
Turns out not compromising your principals and being zealots works.
If you don't believe me, look at cc_x86
https://github.com/oriansj/stage0/blob/master/stage2/High_le...
not cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null 2>&1
with a matching popd at the end
Otherwise it can screw up parent scripts
or how to use that C compiler to bootstrap the rest of the software: https://guix.gnu.org/
https://github.com/oriansj/mescc-tools-seed/blob/master/x86/...
pop rx -> sp--; rx := mem[sp]
push rx -> mem[sp] := rx; sp++
sub rx ry -> rx := rx - ry
jmp rx $I -> if rx is zero jump $I bytes from end of instruction.
One might also argue: call rx -> mem[sp] := IP; sp++; IP := rx
ret -> sp--; IP := mem[sp]
nand rx ry -> rx := rx nand ry
but those are just optimizationsOberon doesn't provide much advantage over that.
It even works if you start from zero: https://github.com/oriansj/mescc-tools-seed