Ciro Santilli OurBigBook.com $£ Sponsor €¥ 中国独裁统治 China Dictatorship 新疆改造中心、六四事件、法轮功、郝海东、709大抓捕、2015巴拿马文件 邓家贵、低端人口、西藏骚乱
computer.bigb
= Computer

The artistic instrument that enables the ultimate <art>: coding, See also: <the art of programming>{full}.

Much more useful than instruments used in inferior arts, such as pianos or paintbrushes.

Unlike other humans, computers are mindless slaves that do exactly what they are told to, except for https://www.youtube.com/watch?v=aNzTUdOHm9A[occasional cosmic ray bit flips]. Until they <artificial general intelligence>[take over the world that is].

\Video[https://www.youtube.com/watch?v=rTRzYjoZhIY]
{title=A <computer> is the equivalent of a bicycle for our minds by <Steve Jobs> (1980)}
{description=Likely an excerpt from an interview done for a documentary in 1980. TODO exact source.}

\Video[https://www.youtube.com/watch?v=8KZdA2O3H1k]
{title=<Steve Jobs> talking about the <Internet> (1995)}
{description=
\Q[[The web is incredibly exciting, because it is the fulfillment of a lot of our dreams, that the computer would ultimately primarily not be a device for computation, but [sic] metamorphisize into a device for communication.]]
also:
\Q[Secondly it exciting because <Microsoft> doesn't own it, and therefore there is a tremendous amount of innovation happening.]
then he talks about the impending role for online sales. <Amazon> incoming.

Computers basically have two applications:
* computation
* communication. Notably, computers through the <Internet> allow for modes of communication where:
  * both people don't have to be on the same phone line at the exact same time, a server can relay your information to other people
  * anyone can broadcast information easily and for almost free, again due to servers being so good at handling that
Generally, the smaller a computer, the more it gets used for communication rather than computing.

The early computers were large and expensive, and basically only used for computing. E.g. <ENIAC> was used for calculating ballistic tables.

Communication only came later, and it was not obvious to people at first how incredibly important that role would be.

This is also well illustrated in the documentary <Glory of the Geeks>. Full interview at: https://www.youtube.com/watch?v=TRZAJY23xio[]. It is apparently known as the "Lost Interview" and it was by Cringely himself: https://www.youtube.com/watch?v=bfgwCFrU7dI[] for his <Triumph of the Nerds> documentary.
}

= How computers work?
{parent=Computer}
{tag=Essays by Ciro Santilli}

= Computer abstraction layer
{synonym}

A computer is a highly layered system, and so you have to decide which layers you are the most interested in studying.

Although the layer are somewhat independent, they also sometimes interact, and when that happens it usually hurts your brain. E.g., if <compilers> were perfect, no one optimizing software would have to know anything about <microarchitecture>. But if you want to go hardcore enough, you might have to learn some lower layer.

It must also be said that like in any industry, certain layers are hidden in commercial secrecy mysteries making it harder to actually learn them. In computing, the lower level you go, the more <closed source> things tend to become.

But as you climb down into the abyss of low level hardcoreness, don't forget that <backward design>[making usefulness is more important than being hardcore]: <image xkcd 378: Real Programmers>.

First, the most important thing you should know about this subject: https://cirosantilli.com/linux-kernel-module-cheat/should-you-waste-your-life-with-systems-programming

Here's a summary from low-level to high-level:
* <semiconductor physical implementation> this level is of course the most closed, but it is fun to try and peek into it from any openings given by commercials and academia:
  * <photolithography>, and notably <photomask> design
* <register transfer level>
  * interactive <verilator> fun: https://stackoverflow.com/questions/38108243/is-it-possible-to-do-interactive-user-input-and-output-simulation-in-vhdl-or-ver/38174654#38174654[Is it possible to do interactive user input and output simulation in VHDL or Verilog?]
  * more importantly, and much harder/maybe impossible with <open source>, would be to try and set up a open source <standard cell library> and supporting software to obtain <power, performance and area> estimates
    * https://www.quora.com/Are-there-good-open-source-standard-cell-libraries-to-learn-IC-synthesis-with-EDA-tools/answer/Ciro-Santilli[Are there good open source standard cell libraries to learn IC synthesis with EDA tools?] on <Quora>
    * the most open source ones are some initiatives targeting FPGAs, e.g. https://symbiflow.github.io/[], http://www.clifford.at/icestorm/[]
    * <qflow> is an initiative targeting actual <integrated circuits>
* <microarchitecture>: a good way to play with this is to try and run some minimal userland examples on <gem5> userland simulation with logging, e.g. see on the <Linux Kernel Module Cheat>:
  * https://cirosantilli.com/linux-kernel-module-cheat/gem5-event-queue-derivo3cpu-syscall-emulation-freestanding-example-analysis
  This should be done at the same time as books/website/courses that explain the microarchitecture basics.

  This is the level of abstraction that <Ciro Santilli> finds the most interesting of the hardware stack. Learning it for actual <CPUs> (which as of 2020 is only partially documented by vendors) could actually be useful in hardcore software optimization use cases.
* <instruction set architecture>: a good approach to learn this is to manually write some userland assembly with assertions as done in the <Linux Kernel Module Cheat> e.g. at:
  * https://github.com/cirosantilli/linux-kernel-module-cheat/blob/9b6552ab6c66cb14d531eff903c4e78f3561e9ca/userland/arch/x86_64/add.S
  * https://cirosantilli.com/linux-kernel-module-cheat/x86-userland-assembly
  * learn a bit about calling conventions, e.g. by calling C standar library functions from assembly: 
    * https://github.com/cirosantilli/linux-kernel-module-cheat/blob/9b6552ab6c66cb14d531eff903c4e78f3561e9ca/userland/arch/aarch64/inline_asm/linux/asm_from_c.c
    * https://stackoverflow.com/questions/16255608/calling-c-functions-from-x86-assembly-language/56328708#56328708[Calling C functions from x86 assembly language]
  * you can also try and understand what some simple <C (programming language)> programs <compile> to. Things can get a bit hard though when `-O3` is used. Some cute examples:
    * https://stackoverflow.com/questions/310974/what-is-tail-call-optimization/55230417#55230417[What is tail call optimization?]
    * https://stackoverflow.com/questions/1345670/stack-smashing-detected/51897264#51897264[What is the "Stack smashing detected" error in GCC and how to solve it?]
    * https://stackoverflow.com/questions/745870/realistic-usage-of-the-c99-restrict-keyword/30827311#30827311[Realistic usage of the C99 'restrict' keyword?]
* <executable file format>, notably <executable and Linkable Format>. Particularly important is to understand the basics of:
  * address relocation:  https://stackoverflow.com/questions/3322911/what-do-linkers-do/33690144#33690144[How do linkers and address relocation work?]
  * position independent code: https://stackoverflow.com/questions/2463150/what-is-the-fpie-option-for-position-independent-executables-in-gcc-and-ld/51308031#51308031[What is the -fPIE option for position-independent executables in GCC and ld?]
  * how to observe which symbols are present in object files, e.g.:
    * how C++ uses name mangling https://stackoverflow.com/questions/1041866/what-is-the-effect-of-extern-c-in-c/30526795#30526795[What is the effect of extern "C" in C++?]
    * how C++ template instantiation can help reduce link time and size: https://stackoverflow.com/questions/2351148/explicit-template-instantiation-when-is-it-used/59614755#59614755[Explicit template instantiation - when is it used?]
* <operating system>. There are two ways to approach this:
  * learn about the Linux kernel <Linux kernel>. A good starting point is to learn about its main interfaces. This is well shown at <Linux Kernel Module Cheat>:
    * system calls
      * write some system calls in
        * pure assembly:
          * https://github.com/cirosantilli/linux-kernel-module-cheat/blob/9b6552ab6c66cb14d531eff903c4e78f3561e9ca/userland/arch/x86_64/freestanding/linux/hello.S
          * https://stackoverflow.com/questions/174942/how-should-strace-be-used/55397255#55397255[How should strace be used?]
        * C GCC inline assembly:
          * https://stackoverflow.com/questions/9506353/how-to-invoke-a-system-call-via-syscall-or-sysenter-in-inline-assembly/54956854#54956854
          * https://github.com/cirosantilli/linux-kernel-module-cheat/blob/9b6552ab6c66cb14d531eff903c4e78f3561e9ca/userland/arch/x86_64/inline_asm/freestanding/linux/hello.c
    * learn about kernel modules and their interfaces. Notably, learn about to demystify special files such `/dev/random` and so on:
      * https://stackoverflow.com/questions/22632713/how-to-write-a-simple-linux-device-driver/44640466#44640466
      * https://github.com/cirosantilli/linux-kernel-module-cheat/tree/9b6552ab6c66cb14d531eff903c4e78f3561e9ca/kernel_modules
    * learn how to do a minimal Linux kernel disk image/boot to userland hello world: https://unix.stackexchange.com/questions/2692/what-is-the-smallest-possible-linux-implementation/203902#203902[What is the smallest possible Linux implementation?]
    * learn how to GDB <Step debug the Linux kernel> itself. Once you know this, you will feel that "given enough patience, I could understand anything that I wanted about the kernel", and you can then proceed to not learn almost anything about it and carry on with your life
  * write your own (mini-) OS, or study a minimal educational OS, e.g. as in:
    * <x86 bare metal examples>
    * https://stackoverflow.com/questions/22054578/how-to-run-a-program-without-an-operating-system/32483545#32483545
* <programming language>

\Image[https://web.archive.org/web/20191222121520if_/http://imgs.xkcd.com/comics/real_programmers.png]
{height=600}
{title=<xkcd> 378: Real Programmers}
{source=https://xkcd.com/378/}

\Video[https://youtube.com/watch?v=_6D05gCWh_I]
{title=How low can you go video by <Ciro Santilli> (2017)}
{description=In this infamous video Ciro has summarized the computer hierarchy.}

= The lower level you go into a computer, the harder it is to observe things
{parent=How computers work?}
{wiki}

This is a general principle of software/hardware design that Ciro feels holds wide applicability.

The most extreme case of this is of course the <integrated circuit> itself, in which it is essentially impossible (?) to observe the specific value of some indidual wire at some point.

Somewhat on the other extreme, we have high level programming languages running on top of an <operating system>: at this point, you can just <GDB step debug> your program, print the value of any variable/memory location, and fully understand anything that you want. Provided that you manage to easily reach that point of interest.

And for anything in between we have various intermediate levels of complication. The most notable perhaps being developing the operating system itself. At this level, you can't so easily step debug (although <Step debug the Linux kernel>[techniques do exist]). For early boot or <bootloaders> for example, you might want to use <JTAG> for example on real hardware.

In parallel to this, there is also another very important pair of closely linked tradeoffs:
* the lower level at which something is implemented, the faster it runs
* <emulation> gives you observability back, at the cost of slower runtime

Emulation also has another potential downside: unless you are very careful at implementing things correctly, your model might not be representative of the real thing. Also, there may be important tradeoffs between how much the model looks like the real thing, and how fast it runs. For example, <QEMU>'s use of <binary translation> allows it to run orders of magnitude faster than <gem5>. However, you are unable to make any predictions about system performance with QEMU, since you are not modelling key elements like the cache or CPU pipeline.

<Instrumentation (computer programming)> is another technique that has can be considered to achieve greater observability.

= Instrumentation
{disambiguate=computer programming}
{parent=The lower level you go into a computer, the harder it is to observe things}

= Instrumentation
{disambiguate=software}
{synonym}

Instrumentation basically means adding loggers/print statements to certain points of interest of your hardware/software.

Instrumentation tends to slow execution down a bit, but way less than <emulation>.

The downside is that if the instrumentation does not provide you the data you need to debug, there's not much you can do, you will need to modify it, i.e. you don't get full visibility from instrumention.

This is unlike emulation that provides full observability.

= Computer architecture
{parent=How computers work?}
{wiki}

The term loosely refers to certain layers of the <computer abstraction layers> hierarchy, usually high level hardware internals like <CPU> pipeline, caching and the memory system. Basically exactly what <gem5> models.

= Computer by operating principle
{parent=Computer}

= Analog and digital computers
{parent=Computer by operating principle}

= Analog computer
{parent=Analog and digital computers}
{wiki}

Some of the earlier computers of the 20th centure were analog computers, not digital.

At some point analog died however, and "computer" basically by default started meaning just "<digital computer>".

As of the 2010's and forward, with the limit of <Moore's law> and the rise of <machine learning>, people have started looking again into analog computing as a possile way forward. A key insight is that huge floating point precision is not that crucial in many <deep learning> applications, e.g. many new digital designs have tried <16-bit floating point> as opposed to the more traditional 32-bit minium. Some papers are even looking into 8-bit: https://dl.acm.org/doi/10.5555/3327757.3327866

As an example, the <Lightmatter> company was trying to implement <silicon photonics>-based matrix multiplication.

A general intuition behind this type of development is that the <human brain>, the holy grail of <machine learning>, is itself an <analog computer>.

= Digital computer
{parent=Analog and digital computers}
{wiki}

= Computer physical principle of operation
{parent=Computer by operating principle}

= Computer
{disambiguate=occupation}
{parent=Computer physical principle of operation}
{wiki}

= Human computer
{synonym}

\Image[https://upload.wikimedia.org/wikipedia/commons/0/06/Human_computers_-_Dryden.jpg]

= Electronic computer
{parent=Computer physical principle of operation}

= Digital electronic computer
{parent=Electronic computer}
{tag=Digital computer}
{wiki}

Unsurprisingly the term "<computer>" became a synonym for this from the 1960s onwards!

= Mechanical computer
{parent=Computer physical principle of operation}
{wiki}

\Image[https://upload.wikimedia.org/wikipedia/commons/9/9b/De-Te-We-mp3h0651.jpg]

= Abacus
{parent=Mechanical computer}
{wiki}

= Computer benchmark
{parent=Computer}
{wiki}

* <CPU> benchmark: https://askubuntu.com/questions/634513/cpu-benchmarking-utility-for-linux/701532#701532
* <GPU> benchmark: https://askubuntu.com/questions/31913/how-to-perform-a-detailed-and-quick-3d-performance-test

= stress-ng
{parent=Computer benchmark}

The interface is a bit annoying, but the tool is really cool.

100 cycles of `matrixprod`:
``
stress-ng -c1 --cpu-ops 100 --cpu-method matrixprod
``
`man stress-ng` gives the list of possible `--cpu-method`. It documents `matrixprod` as:
\Q[<matrix product> of two 128 × 128 matrices of double floats. Testing on 64 bit <x86> hardware shows that this is provides a good mix of memory, cache and floating point operations and is probably the best CPU method to use to make a CPU run hot.]

If you don't specify the `--cpu-method` it apparently loops through every method one by one.

Limit time to 1s instead of limiting cycles:
``
stress-ng -c1 -t1 --cpu-method matrixprod
``

= Computer company
{parent=Computer}
{tag=Company}
{wiki}

This section is about companies that were primarily started as computer makers.

For companies that make <integrated circuits>, see also: <semiconductor company>{full}.

\Include[apple-inc]{parent=Computer company}

= Fujitsu
{c}
{parent=Computer company}
{tag=Japanese company}
{title2=Japanese IBM}
{wiki}

= 富士通
{synonym}
{title2}

The japanese name literally means:
* 富士 fushi, from Mount Fuji, which itself has unknown origin
* 通 tong: telecommunications

= International Computers Limited
{c}
{parent=Computer company}
{tag=European Tower of Babel}
{title2=ICL}
{title2=British IBM}
{wiki}

They died so completely, <Googling> "ICL" now has higher hits such as <Imperial College London>.

\Video[https://www.youtube.com/watch?v=EkTHDgYTh64]
{title=Why the UK's <IBM> Failed by <Asianometry> (2022)}
{description=Main lesson perhaps: don't put national money to fight already established markets. You have to fight for what is coming up next. E.g. that is part of the reason for <TSMC>'s success.}

= IBM
{c}
{parent=Computer company}
{wiki}

As of the 2020's, a slumbering giant.

But the pre-Internet impact of IBM was insane! Including notably:
* some of the most important business computers of the pre-<personal computer> era
* <SQL>
* <IBM Generalized Markup Language>, which is a predecessor to <XML> and <HTML>

= IBM product
{c}
{parent=IBM}

= IBM System/360
{c}
{parent=IBM product}
{title2=1964}
{wiki}

This is a family of computers. It was a big success. It appears that this was a big unification project of previous architectures. And it also gave software portability guarantees with future systems, since writing software was starting to become as expensive as the hardware itself.

Media:
* https://youtu.be/qwocVH3_1Eo?t=841 from <video Inside the WILD Lab of CuriousMarc by Keysight Labs (2022)>.

= IBM 650
{c}
{parent=IBM product}
{title2=1954}
{wiki}

This was the first major commercial computer hit. Stlil <vacuum tube>-based.

\Video[https://www.youtube.com/watch?v=8Il6SkRdZ84]
{title=Learning how to program on the IBM 650 <Donald Knuth> interview by <Web of Stories> (2006)}
{description=It was decimal!}

= IBM 1401
{c}
{parent=IBM product}
{title2=1959}

\Video[https://www.youtube.com/watch?v=uFQ3sajIdaM]
{title=The IBM 1401 compiles and runs <FORTRAN> II by <CuriousMarc> (2018)}

= IBM 700/7000 series
{c}
{parent=IBM product}
{title2=1953-1970}
{wiki}

= IBM 705
{c}
{parent=IBM 700 7000 series}

= IBM Personal Computer
{c}
{parent=IBM}
{wiki}

= IBM PC
{c}
{synonym}

= Computer engineer
{parent=Computer}
{tag=Engineer}
{wiki}

= Gordon Moore
{c}
{parent=Computer engineer}
{wiki}

= Robert Noyce
{c}
{parent=Computer engineer}
{wiki}

= Robert Noyce: The Man Behind the Microchip by Leslie Berlin (2006)
{c}
{parent=Robert Noyce}
{tag=Good book}

Borrow from the <Internet Archive> for free: https://archive.org/details/manbehindmicroc000berl/page/n445/mode/2up

= Seymour Cray
{c}
{parent=Computer engineer}
{wiki}

= Cray
{c}
{parent=Seymour Cray}
{wiki}

= The Supermen: The Story of Seymour Cray by Charles J. Murray (1997)
{c}
{parent=Seymour Cray}
{tag=Good book}

Borrow from the <Internet Archive> for free: https://archive.org/details/supermenstory00murr

Initial chapters put good clarity on the formation of the <military-industrial complex>. Being backed by the military, especially just after <World War II>, was in itself enough credibility to start and foster a company.

It is funny to see how the first computers were very artisanal, made on a one-off basis.

Amazing how Control Data Corporation raised capital IPO style as a startup without a product. The dude was selling shares at dinner parties in his home.

Very interesting mention on page 70 of how <Israel> bought CDC's https://en.wikipedia.org/wiki/UNIVAC_1103[UNIVAC 1103] which Cray contributed greatly to design, and everyone knew that it was to make <thermonuclear weapons>, since that was what the big American labs like this mention should be added to: https://en.wikipedia.org/wiki/Nuclear_weapons_and_Israel but that's Extended Protected... the horrors of <Wikipedia>.

Another interesting insight is how "unintegrated" computers were back then. They were literally building computers out of individual <vacuum tubes>, then individual semiconducting transistors, a gate at a time. Then things got more and more integrated as time went. That is why the now outdated word "microprocessor" existed. When processors start to fit into a single <integrated circuit>, they were truly micro compared to the monstrosities that existed previously.

Also, because integration was so weak initially, it was important to more manually consider the length of wire signals had to travel, and try to put components closer together to reduce the <critical path> to be able to increase clock speeds. These constraints are also of course present in modern computer design, but they were just so much more visible in those days.

The book does unfortunately not give much detail in Crays personal life as mentioned on this book review: https://www.goodreads.com/review/show/1277733185?book_show_action=true[]. His childhood section is brief, and his wedding is described in one paragraph, and divorce in one sentence. Part of this is because he was very private about his family most likely note how Wikipedia had missed his first wedding, and likely misattribute children to the second wedding; https://en.wikipedia.org/wiki/Talk:Seymour_Cray section "Weddings and Children".

Crays work philosophy is is highlighted many times in the book, and it is something worthy to have in mind:
* if a design is not working, start from scratch
* don't be the very first pioneer of a technology, let others work out the problems for you first, and then come second and win

Cray's final downfall was when he opted to try to use a promising but hard to work with material <gallium arsenide> instead of <silicon> as his way to try and speed up computers, see also: <gallium arsenide vs silicon>. Also, he went against the extremely current of the late 80's early 90's pointing rather towards using massively parallel systems based on <silicon> off-the-shelf <Intel> processors, a current that had <DARPA> support, and which by far the path that won very dramatically as of 2020, see: <Intel supercomputer market share>.

= Computer graphics
{parent=Computer}

= 2D computer graphics
{parent=Computer graphics}
{wiki}

= 3D computer graphics
{parent=Computer graphics}
{wiki}

= 3D graphics
{synonym}

= 3D file format
{parent=3D computer graphics}
{tag=File format}

https://www.threekit.com/blog/gltf-everything-you-need-to-know comparision of several formats

= 3D file format viewer
{parent=3D file format}

https://askubuntu.com/questions/1319549/is-there-any-simple-3d-viewer-application

= f3d
{parent=3D file format viewer}

https://github.com/f3d-app/f3d

= List of 3D file formats
{parent=3D file format}

= glTF
{c}
{parent=List of 3D file formats}
{tag=Khronos standard}
{wiki}

Official demos: https://github.com/KhronosGroup/glTF-Sample-Assets These are visible at: https://github.khronos.org/glTF-Sample-Viewer-Release/ with a <JavaScript> viewer present at: https://github.com/KhronosGroup/glTF-Sample-Viewer TODO can you load models on the web?

Supports animations, e.g.:
* https://github.com/KhronosGroup/glTF-Sample-Assets/tree/43380bb399f5c86acb541ee75af4b5905b6926c5/Models/AnimatedCube
* https://github.com/KhronosGroup/glTF-Tutorials/blob/7426e466a5a6a347cd4f810051ed38a1b9791257/gltfTutorial/gltfTutorial_007_Animations.md

https://gltf-viewer.donmccurdy.com/ is based on doesn't work with those examples because they have separate asset files.

<f3d> just worked for it.

= OpenUSD
{c}
{parent=List of 3D file formats}

= Universal Scene Description
{parent=OpenUSD}

= Computer network
{parent=Computer}
{wiki}

= Computer network software
{parent=Computer network}

= iproute2
{c}
{parent=Computer network software}
{wiki}

= `ip` CLI tool
{parent=iproute2}

= Find computer IP with the `ip` CLI tool
{parent=`ip` CLI tool}

= Nmap
{c}
{parent=Computer network software}
{wiki}

= tcpdump
{c}
{parent=Computer network software}
{wiki}

To test it, let's get two computers on the same <local area network>, e.g. connected to <Wi-Fi> on the same home <modem router>.

On computer B:
* <find computer IP with the `ip` CLI tool>. Suppose it is 192.168.1.102
* then run <Ciro's `nc` HTTP test server>

On computer A, run on terminal 1:
``
sudo tcpdump ip src 192.168.1.102 or dst 192.168.1.102
``

Then on terminal 2 make a test request:
``
curl 192.168.1.102:8000
``

Output on terminal 1:
``
17:14:22.017001 IP ciro-p14s.55798 > 192.168.1.102.8000: Flags [S], seq 2563867413, win 64240, options [mss 1460,sackOK,TS val 303966323 ecr 0,nop,wscale 7], length 0
17:14:22.073957 IP 192.168.1.102.8000 > ciro-p14s.55798: Flags [S.], seq 1371418143, ack 2563867414, win 65160, options [mss 1460,sackOK,TS val 171832817 ecr 303966323,nop,wscale 7], length 0
17:14:22.074002 IP ciro-p14s.55798 > 192.168.1.102.8000: Flags [.], ack 1, win 502, options [nop,nop,TS val 303966380 ecr 171832817], length 0
17:14:22.074195 IP ciro-p14s.55798 > 192.168.1.102.8000: Flags [P.], seq 1:82, ack 1, win 502, options [nop,nop,TS val 303966380 ecr 171832817], length 81
17:14:22.076710 IP 192.168.1.102.8000 > ciro-p14s.55798: Flags [P.], seq 1:80, ack 1, win 510, options [nop,nop,TS val 171832821 ecr 303966380], length 79
17:14:22.076710 IP 192.168.1.102.8000 > ciro-p14s.55798: Flags [.], ack 82, win 510, options [nop,nop,TS val 171832821 ecr 303966380], length 0
17:14:22.076727 IP ciro-p14s.55798 > 192.168.1.102.8000: Flags [.], ack 80, win 502, options [nop,nop,TS val 303966383 ecr 171832821], length 0
17:14:22.077006 IP ciro-p14s.55798 > 192.168.1.102.8000: Flags [F.], seq 82, ack 80, win 502, options [nop,nop,TS val 303966383 ecr 171832821], length 0
17:14:22.077564 IP 192.168.1.102.8000 > ciro-p14s.55798: Flags [F.], seq 80, ack 82, win 510, options [nop,nop,TS val 171832821 ecr 303966380], length 0
17:14:22.077578 IP ciro-p14s.55798 > 192.168.1.102.8000: Flags [.], ack 81, win 502, options [nop,nop,TS val 303966384 ecr 171832821], length 0
17:14:22.079429 IP 192.168.1.102.8000 > ciro-p14s.55798: Flags [.], ack 83, win 510, options [nop,nop,TS val 171832824 ecr 303966383], length 0
``
TODO understand them all! Possibly correlate with <Wireshark>, or use `-A` option to dump content.

= Wireshark
{c}
{parent=Computer network software}
{wiki}

Amazing tool that captures packets and disassembles them. Allows you to click an interactive tree that represents <Ethernet>, <TCP IP> and application layer like <HTTP>.

Start capture immediately from CLI, capture packets to/from 192.168.1.102:
``
sudo wireshark -f 'host 192.168.1.102' -k
``

= Wireshark capture filter
{parent=Wireshark}

Capture by instead:
``
sudo wireshark -f http -k
sudo wireshark -f icmp -k
``

Filter by both protocol and host:
``
sudo wireshark -f 'host 192.168.1.102 and icmp' -k
``

For <application layer> capture filtering, the best you can do is by port:
``
sudo wireshark -f 'tcp port 80'
``
There is an `http` filter but only for as a <wireshark display filter>

= Wireshark display filter
{parent=Wireshark}

= tshark
{parent=Wireshark}
{title2=Terminal Wireshark}

Sample usage:
``
sudo tshark -f 'host 192.168.1.102
``
This produces simple one liners for each request.

What you likely want is the `-V` option which fully disassembles each frame much as you can do in the <GUI> <Wireshark>:
``
sudo tshark -V -f 'host 192.168.1.102
``

= Linux networking HOWTO
{c}
{parent=Computer network}
{tag=Linux}

= Linux computer network HOWTO
{c}
{synonym}

= Connect to other computer in LAN by hostname
{parent=Linux networking HOWTO}

= Connect to other computer in LAN by hostname with DHCP
{parent=Linux networking HOWTO}

https://unix.stackexchange.com/questions/16890/how-to-make-a-machine-accessible-from-the-lan-using-its-hostname

TODO didn't manage to get it working with <Ciro Santilli's hardware/TP Link ARCHER VR2800> even though it shows DHCP as enabled and it also shows <MAC addresses> and corresponding hostnames in the router management interface.

= Connect two computers directly without a router with an Ethernet cable
{parent=Linux networking HOWTO}

For <IP (protocol)>-level communication, https://askubuntu.com/questions/22835/how-to-network-two-ubuntu-computers-using-ethernet-without-a-router/116680#116680 just worked between <Ciro Santilli's hardware/P51> and <Ciro Santilli's hardware/P14s> both on <Ubuntu 23.10> connected with a regular <Cat 5e> cable.

On both machines, first we found the <Ethernet cable> interface name with the <ip CLI tool>:
``
ip a
``
which outputs on the P41s:
``
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: enp1s0f0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether fc:5c:ee:24:fb:b4 brd ff:ff:ff:ff:ff:ff
3: wlp2s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether 04:7b:cb:cc:1b:10 brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.123/24 brd 192.168.1.255 scope global dynamic noprefixroute wlp2s0
       valid_lft 61284sec preferred_lft 61284sec
    inet6 fe80::3597:15d8:74ff:e112/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever
``
so the interface was `enp1s0f0`, because `wlp` is wireless and `lo` is localhost.

So on the P14s we assign an IP of 10.0.0.10 to the P51:
``
sudo ip address add 10.0.0.10/24 dev enp1s0f0
``

Then on the P51 analogously, giving IP of 10.0.0.20 to the P14s:
``
sudo ip address add 10.0.0.20/24 dev enp0s31f6
``

And after that, P14s can:
``
ping 10.0.0.10
``
and P51 can:
``
ping 10.0.0.20
``

TODO after a few seconds, the settings appear to be forgotten, and `ping` stops working unless you do `sudo ip address add` on the local machine again. This seems to happen after a popup appears saying "Activation of network connection failed" as it fails to obtain Internet from the cable.

TODO list and delete such manual assignments we've made.

= Find MAC address of a device on the other end of an Ethernet cable
{parent=Connect two computers directly without a router with an Ethernet cable}

* https://stackoverflow.com/questions/35674608/send-message-using-mac-address-on-pc-without-ip-in-lan
* https://gist.github.com/austinmarton/1922600
* https://gist.github.com/austinmarton/2862515

= Find MAC address of a device on the other end of an Ethernet cable without IP
{parent=Find MAC address of a device on the other end of an Ethernet cable}

= Share Internet via Ethernet cable
{parent=Linux networking HOWTO}

E.g. to give Compueter 2 Internet in a setup like:
``
Internet --- Wi-Fi --- Computer 1 --- Ethernet --- Computer 2
``
Can be tested e.g. by turning off Wi-Fi from Computer 2 if it has one.

Got it working: https://askubuntu.com/questions/3063/share-wireless-connection-with-wired-ethernet-port/1502850#1502850

= OSI model
{c}
{parent=Computer network}
{wiki}

= Physical layer
{parent=OSI model}
{wiki}

= OSI layer 1
{c}
{synonym}
{title2}

This one is not generally seen by software, which mostly operates starting from <OSI layer 2>.

= Sneakernet
{parent=Physical layer}
{wiki}

= Universal asynchronous receiver-transmitter
{c}
{parent=Physical layer}
{wiki}

= UART
{c}
{synonym}
{title2}

A good project to see UARTs at work in all their beauty is to connect two <Raspberry Pis> via UART, and then:
* type in one and see characters appear in the other: https://scribles.net/setting-up-uart-serial-communication-between-raspberry-pis/
* send data via a script: https://raspberrypi.stackexchange.com/questions/29027/how-should-i-properly-communicate-2-raspberry-pi-via-uart

Part of the beauty of this is that you can just connect both boards directly manually with a few wire-to-wire connections with simple <jump wire>. Its simplicity is just quite refreshing. Sure, you could do something like that for any physical layer link presumably...

Remember that you can only have one <GNU screen> connected at a time or else they will mess each other up: https://unix.stackexchange.com/questions/93892/why-is-screen-is-terminating-without-root/367549#367549

On <Ubuntu 22.04> you can screen without <sudo> by adding yourself to the `dialout` group with:
``
sudo usermod -a -G dialout $USER
``

= Data link layer
{parent=OSI model}
{wiki}

= OSI layer 2
{c}
{synonym}
{title2}

= Bluetooth
{c}
{parent=Data link layer}
{title2=1997}
{wiki}

= Ethernet
{c}
{parent=Data link layer}
{title2=1980}
{wiki}

= Ethernet cable
{c}
{parent=Ethernet}

https://en.wikipedia.org/wiki/Category:Ethernet_cables

= Category 5 cable
{parent=Ethernet cable}
{wiki}

= Cat 5e
{parent=Category 5 cable}

= Wi-Fi
{c}
{parent=Data link layer}
{title2=2-6 GHz, 1997}
{wiki}

= Wifi
{c}
{synonym}

The frequency range of Wi-Fi, which falls in the <microwave> range, is likely chosen to allow faster data transfer than say, <FM broadcasting>, while still being relatively <transparent> to walls (though not as much).

= Eduroam
{c}
{parent=Wi-Fi}
{wiki}

= Network layer
{parent=OSI model}
{wiki}

= OSI layer 3
{c}
{synonym}
{title2}

= Internet Control Message Protocol
{c}
{parent=Network layer}

= ICMP
{synonym}
{title2}

= ICMP runs on top of IP
{c}
{parent=Internet Control Message Protocol}

This can be seen with <wireshark> very clearly for example, just make a <ping (networking utility)> and disssemble it.

= The Linux kernel responds to ICMP directly
{c}
{parent=Internet Control Message Protocol}

There is no userland process for it, it is handled directly by the <Linux kernel>: https://unix.stackexchange.com/questions/439801/what-linux-process-is-responsible-for-responding-to-pings/768739#768739

= ping
{disambiguate=networking utility}
{parent=Internet Control Message Protocol}
{tag=Computer network software}
{wiki}

= Transport layer
{parent=OSI model}
{wiki}

= OSI layer 4
{c}
{synonym}
{title2}

= Internet
{c}
{parent=Computer network}
{wiki}

\Video[https://www.youtube.com/watch?v=XpZ5STahhPE]
{title=Are YOU Ready for the INTERNET? by <BBC> (1994)}

= Online
{synonym}

= History of the Internet
{parent=Internet}

= ARPANET
{c}
{parent=History of the Internet}
{title2=1970}
{wiki}

Bibliography:
* some good interview excerpts with some of the pioneers on <Glory of the Geeks>

= Interface Message Processor
{c}
{parent=ARPANET}
{title2=IMP}
{wiki}

= The Enshittification of the Internet
{parent=History of the Internet}

* https://www.wired.com/story/tiktok-platforms-cory-doctorow/
* https://www.theguardian.com/commentisfree/2023/mar/11/users-advertisers-we-are-all-trapped-in-the-enshittification-of-the-internet

= URL
{c}
{parent=Internet}
{title2=Uniform Resource Locator}
{wiki}

= data URI scheme
{c}
{parent=URL}
{wiki}

= data URL
{c}
{synonym}
{title2}

This is a standard way to embed images in <HTML> pages with the `img` tag.

https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/Data_URLs

= Internet protocol suite
{c}
{parent=Internet}
{wiki}

= Application layer
{parent=Internet protocol suite}
{wiki}

= HTTP
{c}
{parent=Application layer}
{wiki}

= Secure Shell
{c}
{parent=Application layer}
{wiki}

= SSH
{c}
{synonym}
{title2}

= TCP/IP
{c}
{parent=Internet protocol suite}
{title2}

= MAC address
{c}
{parent=Internet protocol suite}
{wiki}

Hardcoded and unique network addresses for every single device on <Earth>.

Started with 48 bits (6 bytes), usually given as 01:23:45:67:89:AB but people now encouraged to use 64-bit ones.

How they are assigned: https://www.quora.com/How-are-MAC-addresses-assigned Basically <IEEE> gives out the 3 first bytes to device manufacturers that register, this is called the <organizationally unique identifier>, and then each manufacturer keeps their own devices unique.

= Organizationally unique identifier
{parent=MAC address}
{wiki}

= Internet Protocol
{c}
{parent=Internet protocol suite}
{title2=IP}
{wiki}

= IP
{disambiguate=protocol}
{synonym}

= IP address
{c}
{parent=Internet Protocol}

= IP
{c}
{synonym}

\Video[https://www.youtube.com/watch?v=rPoalUa4m8E]
{title=The Internet Protocol by Ben Eater (2014)}

= Transmission Control Protocol
{c}
{parent=Internet protocol suite}
{title2=TCP}
{wiki}

= Domain Name System
{c}
{parent=Internet protocol suite}
{title2=DNS}
{wiki}

= DNS
{synonym}

= DNS database
{c}
{parent=Domain Name System}

As of 2023, working with DNS data is just going through a mish-mash of closed datasets/expensive APIs.

We really need some open data in that area.
* https://opendata.stackexchange.com/questions/1951/dataset-of-domain-names
* https://opendata.stackexchange.com/questions/2110/domain-name-system-record-a-database
* https://webmasters.stackexchange.com/questions/33395/find-the-ip-address-of-expired-domains/142751#142751
* https://superuser.com/questions/686195/how-to-find-the-last-ip-used-for-an-expired-domain-name/1793224#1793224

= Carna botnet
{c}
{parent=DNS database}

= Internet Census 2012
{c}
{synonym}
{title2}

https://census2012.sourceforge.net/paper.html

Some interesting analysis by Parth Shukla https://twitter.com/pparth[] | https://www.linkedin.com/in/parth-shukla-59583b20/[]:
* https://conference.apnic.net/data/36/2013-08-27-apnic-xian-carna-botnet_1377569266.pdf
* https://www.scribd.com/document/516984589/Internet-Census-2012-Parth-Shukla-Thesis TODO pdf?
Apparently most of the routers were <Chinese>. No surprise there.

= ipinf.ru
{c}
{parent=DNS database}

https://ipinf.ru

= DNS Census 2013
{c}
{parent=DNS database}

= 2013 DNS Census
{synonym}

Data format overview: https://opendata.stackexchange.com/questions/1951/dataset-of-domain-names/21077#21077

= CAIDA/commoncrawl-host-ip-mapper
{c}
{parent=DNS database}

https://github.com/CAIDA/commoncrawl-host-ip-mapper

= Domain name
{parent=Domain Name System}
{title2=DNS}
{wiki}

= Domain name speculation
{parent=Domain name}
{wiki}

= Domain name registrar
{parent=Domain name}
{wiki}

= Registrar
{synonym}

= GoDaddy
{c}
{parent=Domain name registrar}
{wiki}

= Domains by Proxy
{c}
{parent=GoDaddy}

= domainsbyproxy.com
{c}
{title2}
{synonym}

https://domainsbyproxy.com

Some interesting usages:
* <CIA usage of Domains by Proxy>

= CIA usage of Domains by Proxy
{parent=Domains by Proxy}

The <CIA> really likes this <registrar>, e.g.:
* <CIA 2010 covert communication websites>
* 2014 https://www.newsweek.com/former-cia-officials-ready-defend-agency-after-torture-reports-release-290383
  \Q[
  A group of former <CIA> officials are gearing up to defend the agency when the Senate releases its long-awaited report investigating "enhanced interrogation" tactics used on prisoners after 9/11. The highlight of their PR push will be a website, "CIASAVEDLIVES.COM," which is set to go live when the report is released on Tuesday, Foreign Policy reported.

  The domain was registered on November 2 under a private registration name, through DomainsByProxy, a company that guards the identity of registrants.
  ]

= Domain hack
{parent=Domain name}
{wiki}

Some cool ones:
* playinside.me

= Parked domain girl
{parent=Domain name}

Archive example: https://web.archive.org/web/20130726224338/http://librarianhelper.com/
* https://web.archive.org/web/20081217024812/http://yousuckatwebsites.com/web-trends/the-most-infamous-girl-in-the-history-of-the-internet
* https://knowyourmeme.com/memes/people/parked-domain-girl
* https://www.quora.com/Whats-the-story-behind-The-Most-Infamous-Girl-in-the-History-of-the-Internet-a-k-a-Parked-Domain-Girl

\Image[https://web.archive.org/web/20230509123836im_/https://i.kym-cdn.com/entries/icons/original/000/033/037/girl.jpg]

= Top-level domain
{parent=Domain name}
{wiki}

= ccTLD
{c}
{parent=Top-level domain}
{wiki}

= Interesting domain name
{parent=Domain name}
{wiki}

* http://cunt.com[]: https://www.reddit.com/r/RandomThoughts/comments/103icty/why_does_typing_cuntcom_lead_to_jeremy_corbyns/

= Virtual private network
{parent=Internet protocol suite}
{wiki}

= VPN
{synonym}
{title2}

= Internet company
{c}
{parent=Internet}
{tag=Company}

https://en.wikipedia.org/wiki/List_of_largest_Internet_companies

\Include[amazon]{parent=Internet company}

= Alibaba
{c}
{parent=Internet company}
{tag=Chinese company}
{wiki}

\Include[google]{parent=Internet company}

= Alibaba product
{parent=Alibaba}

= Netflix
{c}
{parent=Internet company}
{tag=American company}
{wiki}

= Netflix and chill
{c}
{parent=Netflix}

https://www.urbandictionary.com/define.php?term=Netflix%20and%20Chill

= Yahoo!
{c}
{parent=Internet company}
{tag=American company}
{wiki}

= Yahoo! product
{c}
{parent=Yahoo!}

= Yahoo! Groups
{c}
{parent=Yahoo! product}
{wiki}

= Internet service provider
{c}
{parent=Internet}
{wiki}

= ISP
{c}
{synonym}
{title2}

= Computer network by scale
{parent=Computer network}
{wiki}

= Local area network
{parent=Computer network by scale}
{wiki}

= LAN
{synonym}
{title2}

= Networking hardware
{parent=Computer network}
{wiki}

= Network interface controller
{parent=Networking hardware}
{title2=NIC}
{wiki}

= SmartNIC
{c}
{parent=Network interface controller}
{title2=DPU}

A <network interface controller> that does more than just the base <OSI model> protocols, notably in a programmable way.
* https://www.nextplatform.com/2022/05/11/intel-unrolls-dpu-roadmap-with-a-two-year-cadence/
* https://www.trentonsystems.com/blog/what-is-a-smartnic
* https://blogs.nvidia.com/blog/2021/10/29/what-is-a-smartnic/ "Some are using <FPGAs> which promise flexibility"
* https://www.servethehome.com/intel-ipu-exotic-answer-to-industry-dpu/ "Intel IPU is an Exotic Answer to the Industry DPU"
* 2022 https://www.datacenterdynamics.com/en/news/amd-to-buy-smartnic-firm-pensando-for-19-billion/ "<AMD> to buy <SmartNIC> firm Pensando for \$1.9 billion"
  \Q[
  <Nvidia> gets Mellanox, <AMD> gets Pensando.

  The company, which develops programmable packet processors, includes Goldman Sachs, IBM Cloud, Microsoft Azure, and Oracle Cloud among its customers.

  Its processors and SmartNIC offering competes with AWS Nitro, Intel's DPU, and Nvidia's BlueField.
  ]
* https://www.theregister.com/2022/06/14/alibaba_dpu_cloud/ mentions that <Alibaba Cloud> created their own.

\Video[https://www.youtube.com/watch?v=kwroXmFJJf0]
{title=<Hyperscalers> Lead The Way To The Future With <SmartNICs> by The Next Platform (2019)}
{description=
* https://youtu.be/kwroXmFJJf0?t=599 <financial industry> is one of the users, notably <high frequency trading>

Associated article: https://www.nextplatform.com/2019/10/31/hypercalers-lead-the-way-to-the-future-with-smartnics/ mentions that:
\Q[Google is widely believed to be working on its own design.]
}

= Router
{disambiguate=computing}
{parent=Networking hardware}
{wiki}

= Router
{synonym}

= Modem router
{parent=Router (computing)}

= TP Link Archer VR2800 router Virgin Media Hub 3.0 Wifi setup
{parent=Modem router}

Put Hub 3.0 in modem mode on 192.168.0.1. Turn it off. You MUST TURN IT OFF NOW.

TP Link Archer VR2800 192.168.1.1 > "Operation mode" > "Wireless router mode" (was "DSL Modem/Router mode" by default).

Custom configs we had, not sure if mandatory:
* Dynamic DHPC mode
* Unicast DHCP

Wait for TP link to fully reboot.

Connect port 4 of tp link (marked WAN/LAn) to port 1 of VM Hub (unmarked, but it is magic, has to be port 1).

Finally, AFTER everything else is setup, turn on the Hub and wait for a few minutes. It ONY WORKS if you turn it on after everything is setup.

Outcome:
* hub light turns purple: https://www.reddit.com/r/VirginMedia/comments/c703t6/purple_light_on_the_box/
* Archer WAN light turns on white. Not red. Red means error
* you have Wifi. Notably, the 5G Wifi is way way faster and reaches the WAN limit of 256 Mbps.
* Ethernet does not work anymore on either Hub nor Archer, Wifi only. But it doesn't matter because the 5G Wifi already reaches the speed limit.

Bibliography:
* https://community.virginmedia.com/t5/Forum-Archive/Connecting-Tp-link-archer-vr2800-to-Hub-3/td-p/4765927 This was The thread, the only one that clearly explained the fundamental importance of turn on off ordering by "jbrennand".
* https://community.tp-link.com/en/home/forum/topic/269540
* https://community.tp-link.com/en/home/forum/topic/170344
* https://community.virginmedia.com/t5/Gaming-Support/Connecting-Archer-VR2800-to-Hub-4/td-p/5246513

= Network switch
{parent=Networking hardware}
{wiki}

A switch is a box with a bunch of <Ethernet> wires coming into it:
``
+--------------------+
| +-+  +-+  +-+  +-+ |
| |1|  |2|  |3|  |4| |
| +-+  +-+  +-+  +-+ |
+--------------------+
``
Except that it doesn't have to be <Ethernet>, e.g. it would also be a <Wi-Fi>.

What the switch does is:
* an <Ethernet> request came in from wire 1
* decide which wire to send it out on, e.g. wire 2, 3, 4, 5, etc. You likely don't want to send it back through 1 where it came from.
After the destination is found, a confirmation is somehow sent back to the switch, which then learns which wire to send each <MAC address> to.

A switch is a bit like a <router> but it is a bit dumber/operates at a lower level: it basically operates only on <MAC addresses>, not on <IP addresses>.

The <Internet service provider> boxes most people have at home combines a switch for the local network and a <router> for the ISP communication.

= Networking hardware company
{parent=Networking Hardware}

= Cisco
{c}
{parent=Networking hardware company}
{tag=University of Stanford spinout company}
{wiki}

\Video[https://youtu.be/d0ya8DggDYs?t=2621]
{title=<Nerds 2.0.1> excerpt about <Cisco> (1998)}
{description=
* https://youtu.be/mhz24AR3nIc?t=45 the founders both worked at <Stanford University> but because they were in different departments they couldn't send an <email> to one another.
* https://youtu.be/mhz24AR3nIc?t=54 Sandy Lerner is very nice and chilled. She says how she was amazed by Leonard's manners!
* https://youtu.be/mhz24AR3nIc?t=86 "sincerity begins at a little over 100 hours a week". The dude is a robot.
* https://youtu.be/mhz24AR3nIc?t=279 earthquake!!!
* https://youtu.be/d0ya8DggDYs?list=PLn7AqqWS1I_9EHEHy6sw-v6hUMhbeOTRW&t=3268 she bought a manor house, probably in Chawton Hampshire, England, possibly https://en.wikipedia.org/wiki/Chawton_House[Chawton House]
* https://youtu.be/d0ya8DggDYs?list=PLn7AqqWS1I_9EHEHy6sw-v6hUMhbeOTRW&t=3312 he started donating to <search for extraterrestrial intelligence>
}

= Making the Cisco connection
{c}
{parent=Cisco}
{title2=2000}
{wiki}

https://archive.org/details/makingciscoconne0000bunn on the <Internet Archive Open Library>.

Nothing phenomenally new on the early days to add on top of <video Nerds 2.0.1 excerpt about Cisco (1998)>, but a few new good points:
* Cisco at one point became the largest company by market capitalization. This wore off a bit as of 2020.

  They used this overvalued stock in part to buy many other (often also overvalued) up and coming companies. This acquisition spree strategy was apparently not the norm at the time. https://rohitnair.wordpress.com/2011/12/13/cisco-history-cisco-systems-history-and-trivia-brand-history-and-trivia/ mentions they have bought more than 140 companies since, and that they call this strategy "Build, Buy And Partner"
* a big part of what Cisco did was to allow cheap local communication in-campus. At that time, the <ARPANET> was already up and running, but their "routers", called <Interface Message Processors> were very expensive at about \$100,000, and to send data across the campus you had to go through them, which meant expensive bandwidth. The routers sometimes failed, and the fallback was to send students around with disks: "<sneakernet>". They needed new local protocols and hardware to efficiently connect different campus networks.
* <Sandy Lerner nude photo>
* Cisco was a pioneer in having an Internet support forum. Customers could also help one another. This was fundamental in scaling support, as they grew so fast it would be impossible to hire a support team large enough without the help of the forum.
* Cisco gave out source code to some customers who would then implement protocols they cared about, and Cisco would then merge it back

= Sandy Lerner
{c}
{parent=Cisco}
{wiki}

This chick is hardcore.

= Sandy Lerner nude photo
{c}
{parent=Sandy Lerner}
{title2=1997}

She posed naked on horseback for Forbes to promote animal rights in 1997.

A ultra low resolution reproduction of the image can be found at: https://rohitnair.wordpress.com/2011/12/13/cisco-history-cisco-systems-history-and-trivia-brand-history-and-trivia/

She's kind of lying on top of the horse's back, and you can't see much, just some tastefully light erotica. It's not like she's fucking the horse or anything.

= Server
{disambiguate=computing}
{parent=Networking Hardware}
{tag=Computer form factor}
{wiki}

= Server
{synonym}

\Video[https://www.youtube.com/watch?v=CkeY_bm9EK0]
{title=Unpacking 200 servers by Play with Junk (2021)}

\Video[https://www.youtube.com/watch?v=5eo8nz_niiM]
{title=Visiting Hetzner in Falkenstein by der8auer (2022)}

= Test server
{parent=Server (computing)}

= Ciro's `nc` HTTP test server
{parent=Test server}

As per https://stackoverflow.com/a/52351480/895245 our standard test setup is:
``
while true; do
  resp=$"$(date): hello\n"
  len="$(printf '%s' "$resp" | wc -c)"
  printf "HTTP/1.1 200 OK\r\nContent-Length: $len\r\n\r\n${resp}\n" | nc -Nl 8000
done
``

= Node
{disambiguate=server}
{parent=Server (computing)}

It runs one instance of the <Linux kernel> and has one <IP address>. Each node is therefore a complete computer. As such is must also contain <RAM> memory, <disk storage> and a <network interface controller>.

= CPUs per node and nodes per server
{disambiguate=server}
{parent=Server (computing)}

* there can be more than one node per server.
* there can be more than one <CPU> per <node (server)>
E.g.:
* <Frontier (supercomputer)>:
  * 2 <node (server)>[nodes] per <blade (server)>[blade], 1 CPU per node. Therefore 1 CPU per node.

= Server form factor
{parent=Server (computing)}

= Rack server
{parent=Server form factor}

= 19-inch rack
{parent=Rack server}
{wiki}

= Rack unit
{parent=Rack server}
{title2=1U, 2U, 3U, 4U}
{wiki}

= Blade server
{parent=Server form factor}
{wiki}

\Image[https://upload.wikimedia.org/wikipedia/commons/thumb/e/eb/HP_BladeSystem_c7000_Enclosure.jpg/1024px-HP_BladeSystem_c7000_Enclosure.jpg]
{description=Good image from <Wikimedia Commons>. In this one we can see how the blades are put vertically, and you get several of them per horizontal rack space, instead of a tipical single <rack server> going all the way horizontally.}

\Video[https://www.youtube.com/watch?v=RsZjjAqlpJ0]
{title=HP Blade Server by Brian Kirsch (2013)}
{description=
Featuring an HP DL380 blade server, presumably an older model of this series: https://buy.hpe.com/uk/en/servers/proliant-dl-servers/proliant-dl300-servers/proliant-dl380-server/hpe-proliant-dl380-gen10-server/p/1010026818[].

In the video we can see that it contains <RAM>, <disk storage>, we are told about two <CPUs>, and networking interfaces, so it is a complete <computer> on its own. He also explains that unlike typical <rack servers>, each blade unit does not have its own coolers and power supply related hardware, which goes instead on the chassis.
}

= Data center
{parent=Server (computing)}
{wiki}

= Local server
{parent=Server (computing)}

Server run on the current machine. That's how all <websites> are developed and born!

= Client
{disambiguate=computing}
{parent=Server (computing)}
{wiki}

\Include[computer-science]{parent=computer}

= Cybersecurity
{parent=Computer}
{wiki}

= Attack surface
{parent=Cybersecurity}
{wiki}

= Fingerprinting
{parent=Cybersecurity}
{disambiguate=cybersecurity}

= IP stack fingerprinting
{c}
{parent=Fingerprinting (cybersecurity)}
{wiki}

= Security hacker
{parent=Cybersecurity}

= Hacker
{synonym}

= Hacker group
{parent=Security hacker}

= Boitatech
{c}
{parent=Hacker group}
{tag=Brazil}

A <misogenous> <Brazilian> hacking group:
* https://boitatech.com.br/
* https://github.com/boitatech
Just kidding.

Some people from them contacted <Ciro Santilli> after Ciro's initial publishing of <CIA 2010 covert communication websites>.

After a quick <Discord> chat with them, it was apparent that these people were really cool and knowledgeable.

Also many of them seem to think <university is broken> and just go hack straigh away.

A perfect example of a <dojo learning model>.

Also they don't seem to need sleep. Go figure!

With pepole like this, there's hope for <Brazil>: <what poor countries have to do to get richer>{full}.

= Capture the flag
{disambiguate=Cybersecurity}
{parent=cybersecurity}
{wiki}

= Cybercrime
{parent=Cybersecurity}
{wiki}

= Cyber crime
{synonym}

= Darknet market
{c}
{parent=Cybercrime}
{wiki}

= Silk Road
{disambiguate=marketplace}
{c}
{parent=Darknet market}
{title2=2011-2013}
{wiki}

= Silk Road
{c}
{synonym}

<Ciro Santilli> has become slightly obsessed with this story, and the main mastermind <Ross Ulbricht>.

\Image[https://web.archive.org/web/20190629084608if_/https://cdn.arstechnica.net/wp-content/uploads/2015/01/GX-201C-640x853.png]
{title=Ross Ulbricht's open laptop shortly after his arrest at the Francisco Public Library}
{description=He was running some GNOME based distro, could be <Ubuntu> from that photo, and likely is given that Ross once recommended Ubuntu to his flatmate.}
{source=https://arstechnica.com/tech-policy/2015/01/the-incredibly-simple-story-of-how-the-govt-googled-ross-ulbricht}

The best article available so far is: https://www.theregister.co.uk/2019/01/29/how_i_caught_silk_road_mastermind (https://web.archive.org/web/20191008142214/https://www.theregister.co.uk/2019/01/29/how_i_caught_silk_road_mastermind[archive]) which summarizes what one of the investigators said in a 2019 French computer security conference.

The key living posts are:
* https://stackoverflow.com/questions/15445285/how-can-i-connect-to-a-tor-hidden-service-using-curl-in-php (https://web.archive.org/web/20191121133952/https://stackoverflow.com/questions/15445285/how-can-i-connect-to-a-tor-hidden-service-using-curl-in-php[archive]) which was originally asked under the real name, and then the username was changed to "Frosty", which matches one of the server's logins after the laptop was captured
* altoid early Silk Road mention: https://bitcointalk.org/?topic=175.70;wap2 (https://web.archive.org/web/20190628133852/https://bitcointalk.org/?topic=175.70;wap2[archive])

The big question is of course how libertarian free market ideologically motivated the website was, and how purely criminal greed it was.

The magnitude of the early <operational security> mistakes does make Ciro think that Ross did it "because he could" and https://www.urbandictionary.com/define.php?term=i%20did%20it%20for%20the%20lulz["for the lolz"] in a real world <Breaking Bad> way.

The entry in Ross' diary does <Ciro Santilli's selfish desires>[resonate a lot] with Ciro and any entrepreneur, full diary at: https://www.wired.com/2015/01/heres-secret-silk-road-journal-laptop-ross-ulbricht/ (https://web.archive.org/web/20190613011454/https://www.wired.com/2015/01/heres-secret-silk-road-journal-laptop-ross-ulbricht/[archive]).

\Q[
\[i\]n 2011," \[I believe I will be\] "creating a year of prosperity and power beyond what I have ever experienced before,

Silk Road is going to become a phenomenon and at least one person will tell me about it, unknowing that I was its creator."
]

Having this kind of feeling, is the greatest thing any human can have, and what motivates all great things.

Capitalizing in <illegal> things though is a cheat, big things take longer than a few years to reach, but reaching them is that much more satisfying as well.

Other interesting quotes:
\Q[I hated working for someone else and trading my time for money with no investment in myself.]
which Ciro also feels, see <don't be a pussy>, and:
\Q[Everyone knows I am working on a bitcoin exchange. I always thought honesty was the best policy and now I didn't know what to do. I should have just told everyone I am a freelance programmer or something, but I had to tell half truths. It felt wrong to lie completely so I tried to tell the truth without revealing the bad part, but now I am in a jam. Everyone knows too much. Dammit.]

Also very worth reading is the San Francisco flat mate account: https://www.vice.com/en_us/article/ae3q8g/my-roommate-the-darknet-drug-lord (https://web.archive.org/web/20191201090353/https://www.vice.com/en_us/article/ae3q8g/my-roommate-the-darknet-drug-lord[archive]).

The murder for hire allegations are also interesting: https://mashable.com/2013/10/03/silk-road-hits[], he paid 80k dollars to undercover DEA agents!

Except for the fact that Ross was an 80 million <Dollar> <drug lord>, those accounts sound exactly like what you would expect from any other nerdy startup founder! The:
* "just do it" strategy effectively going to a minimal viable product (manual transaction management!), while making many mistakes along the way, including hiring mistakes and successes when scaling is needed
* the hardship of self bootstrapping your own social network (here with some kilos of mushrooms)
* the variety of periods, from relatively calm, to hair pulling stress during big changes

It is also amusing to see very concretely the obvious fact that the FBI can get a https://en.wikipedia.org/wiki/Subpoena[subpoena] for all accounts you ever had, e.g. they knew his <laptop> model from <Amazon> and brought a corresponding power cable to the arrest! If you are going to be a cyber criminal, don't use your real name, ever!

Should justice be blind? Maybe. But it does hurt for mere non-blind men to see it sometimes. Especially when <drug liberalization> is involved.

\Video[https://youtu.be/HBTYVVUBAGs?si=Qjb4x8iXcgvoPK_Z]
{title=One Mistake Took Down a 29-Yr-Old Dark Web Drug Lord by Newsthink (2022)}
{description=Wow nice video, covers most of the interesting annecdotes and the (alledged) investigation procedure.}

= History of Silk Road
{c}
{parent=Silk Road (marketplace)}

= The Underground Website Where You Can Buy Any Drug Imaginable by Adrian Chen
{parent=History of Silk Road}
{title2=2011-06-01}

https://web.archive.org/web/20140903135037/http://gawker.com/the-underground-website-where-you-can-buy-any-drug-imag-30818160

The article that put <Silk Road> on the public map!

= Silk Road bibliography
{c}
{parent=Silk Road (marketplace)}

= Silk Road Rales and Archives by moustache
{parent=Silk Road bibliography}
{tag=History of Silk Road}

https://antilop.cc/sr/

A very good information dump!

= Silk Road 1: Theory & Practice by Gwern Branwen
{parent=Silk Road bibliography}
{tag=Work by Gwern Branwen}

https://gwern.net/silk-road

= Silk Road
{disambiguate=film}
{parent=Silk Road bibliography}
{wiki}

We need a mini-series, this just doesn't have enough time. Notably, too much focus on dob, and not enough on the development of <Silk Road> iteslf. Though it is cool to see what his motivations might have been like. One wonders how realistic the character is. Though him meeting <Ross Ulbricht> personally sounds exceptionally unlikely.

= Ross Ulbricht
{c}
{parent=Silk Road (marketplace)}
{wiki}

\Image[https://web.archive.org/web/20231128134223if_/https://static01.nyt.com/images/2015/05/30/nyregion/30SILKROAD/30SILKROAD-superJumbo.jpg?quality=75&auto=webp]
{title=Ross Ulbricht's <LinkedIn> profile picture}
{description=Still up as of 2023: https://www.linkedin.com/in/rossulbricht/[]}
{source=https://www.linkedin.com/in/rossulbricht/}

= Julia Vie
{c}
{parent=Ross Ulbricht}
{title2=Ross Ulbricht's former girlfriend}

<Ross Ulbricht> told her about <Silk Road>, but then later said he had sold the website to someone else, without really doing that.

* <LinkedIn> profile: https://www.linkedin.com/in/julia-vie-35296959/
* <Twitter> profile: https://twitter.com/destenyrangel

As of 2023, she's apparently a photographer with a porny focus (boudoir photography).

\Image[https://web.archive.org/web/20230714032357im_/https://assets2.cbsnewsstatic.com/hub/i/r/2020/11/10/6955d299-55f5-4b2d-b364-58f2de649d1d/thumbnail/620x437/08cb3d599198c44e59ebeed681c7fcc9/fbi-ross-julia.jpg?v=532947bbe7449b367b963713a282edbc]
{title=<Julia Vie> and <Ross Ulbricht>}
{source=https://www.cbsnews.com/news/ross-ulbricht-dread-pirate-roberts-silk-road-ex-girlfriend-fbi-declassified/}

Some sources:
* https://www.cbsnews.com/news/ross-ulbricht-dread-pirate-roberts-silk-road-ex-girlfriend-fbi-declassified/
* https://www.insideedition.com/ex-girlfriend-of-silk-road-creator-shares-how-creating-the-dark-web-site-changed-her-boyfriend-for
* https://thecinemaholic.com/where-is-julia-vie-now/

= Richard Bates
{c}
{parent=Silk Road (marketplace)}
{disambiguate=Silk Road advisor and Ross' friend}

He testified against Ross: https://arstechnica.com/tech-policy/2015/01/friend-who-helped-ulbricht-build-silk-road-testifies-against-him/

https://youtu.be/HBTYVVUBAGs?t=178 claims to contain a photo of him without source. He has no easy to find online profiles.

\Q[
<Variety Jones>: IRL, is there anyone with a clue at all? A girlfriend, boyfriend, buddy you talk to, etc?

myself: Unfortunately yes, there are two but they think I sold the site and got out, and they're quite convinced of it.
]

His email was published: baronsyntax@gmail.com. They actaully talked on <Google Chat>. OMG.

= Silk Road employee
{c}
{parent=Silk Road (marketplace)}

https://www.vice.com/en/article/pgajmv/these-are-the-two-forgotten-architects-of-the-silk-road

= Smedley
{c}
{parent=Silk Road employee}

= Variety Jones
{c}
{parent=Silk Road employee}
{title2=Ross Ulbricht's mentor}

2023 <Silk Road>'s Second-in-Command Gets 20 Years in Prison https://www.wired.com/story/silk-road-variety-jones-sentencing/

2016 "Exclusive: Our Thai prison interview with the alleged top advisor to <Silk Road>" https://arstechnica.com/tech-policy/2016/09/exclusive-our-thai-prison-interview-with-an-alleged-top-advisor-to-silk-road/

2015 The Variety Show On the trail of the man believed to be Variety Jones, one of the architects of the defunct drug marketplace Silk Road. https://www.vice.com/en/article/wnx5qn/the-variety-show

https://www.justice.gov/usao-sdny/file/797251/download some kind of case file of his trial.

Bibliography:
* https://darknetlive.com/post/variety-jones-trivia-f5bf87ce Variety Jones Trivia
* https://antilop.cc/sr/

The curious thing about VJ is that he actually has some culture and says cool things, e.g.:
\Q[IRL - is there anyone with a clue at all? Girlfriend, boyfriend, bunny you talk to, online buddy's who you've know for years? Gramma, priest, rabbi, stripper?]

\Image[https://web.archive.org/web/20231107154128im_/https://cdn.arstechnica.net/wp-content/uploads/2016/09/Clark-court-300x362.jpg]
{source=https://arstechnica.com/tech-policy/2016/09/exclusive-our-thai-prison-interview-with-an-alleged-top-advisor-to-silk-road/}

= Silk Road investigator
{c}
{parent=Silk Road (marketplace)}

= Carl Mark Force
{c}
{parent=Silk Road investigator}

Full name Carl Mark Force IV, the fourth! As mentioned at https://www.vice.com/en/article/vv7dgj/great-moments-in-shaun-bridges-a-corrupt-silk-road-investigator (this made <Ciro Santilli> laugh quite hard:
\Q[Carl Mark Force IV - the other corrupt cop charged alongside Bridges - is pretty hard to beat, just name-wise.]

https://www.vice.com/en/article/8q845p/dea-agent-who-faked-a-murder-and-took-bitcoins-from-silk-road-explains-himself

= Shaun Bridges
{c}
{parent=Silk Road investigator}

https://www.vice.com/en/article/vv7dgj/great-moments-in-shaun-bridges-a-corrupt-silk-road-investigator

= Domain-specific language
{parent=Computer}
{title2=DSL}
{wiki}

<Evil>. Just use <Python> instead for <software>, and a well known <data file format> for data, please.

= E-book
{parent=Computer}
{wiki}

= E-book file format
{parent=E-book}

= EPUB
{c}
{parent=E-book file format}
{wiki}

This is a good thing. It basically contains an entire <website>, with <HTML> and assets inside a single <ZIP>, and a little bit of metadata.

It is incomprehensible why <browsers> don't just implement it as they already have all the web part, and also <ZIP> stuff:
* https://www.quora.com/What-is-the-reason-that-browsers-cannot-open-epub-files-without-extensions on <Quora>

The situation is so sad. <Ubuntu> 21.04 doesn't come with a reader installed by default:
* https://askubuntu.com/questions/14378/what-software-can-i-use-to-view-epub-documents

= PDF
{c}
{parent=E-book file format}
{wiki}

= Convert PDF to text
{parent=PDF}
{tag=Plaintext file}

* https://superuser.com/questions/207603/how-to-extract-text-from-pdf-in-script-on-linux/1810994#1810994
* https://askubuntu.com/questions/52040/is-there-a-better-pdf-to-text-converter-than-pdftotext/1487946#1487946
* https://unix.stackexchange.com/questions/4759/is-there-some-sort-of-pdf-to-text-converter/758132#758132

= PDF tool
{c}
{parent=PDF}

= pdftk
{c}
{parent=PDF tool}
{wiki}

Extract certain pages of a PDF:
``
pdftk input.pdf cat 2-4 output out1.pdf
``

= E-book viewer
{parent=E-book}

= Calibre
{disambiguate=software}
{c}
{parent=E-book viewer}
{wiki}

Sometimes <Ciro Santilli> says half jokingly that <user interface> does not matter.

This software circa 2010-2020 makes that joke not be funny.

How can a UI feel so clunky!

The most aggravating thing is that it is not immediately obvious why it feels so bad.

= Evince
{parent=E-book viewer}
{wiki}

= Okular
{parent=E-book viewer}
{wiki}

This is generally good, especially compared to how crappy Evince, the default <Ubuntu> one, has been around 2014-2020.

= File format
{parent=Computer}
{wiki}

= Human-readable medium
{parent=File format}
{wiki}

= Human-readable format
{synonym}

= Plaintext file
{synonym}
{title2}

= Human-readable
{synonym}

= Binary data
{parent=Human-readable medium}
{wiki}

= Binary file
{synonym}

The opposite of a <human-readable format>.

= Binary large object
{parent=Binary data}
{wiki}

= BLOB
{c}
{synonym}

Less evil are BLOBs that come from <Reproducible builds>.

= Binary-to-text encoding
{parent=Binary data}
{wiki}

= Base58
{c}
{parent=Binary-to-text encoding}

https://en.bitcoin.it/wiki/Base58Check_encoding

Invented for <Bitcoin>.

= Base64
{c}
{parent=Binary-to-text encoding}
{wiki}

= yEnc
{c}
{parent=Binary-to-text encoding}
{wiki}

= Archive file
{parent=File format}
{wiki}

= ZIP
{disambiguate=file format}
{c}
{parent=Archive file}
{wiki}

= ZIP
{c}
{synonym}

= Info-ZIP
{c}
{parent=ZIP (file format)}
{wiki}

The dominant <Linux> implemenation, e.g. default `zip` command on <Ubuntu 23.04>.

So dominant that it is usualy called just "zip".

= Add diretory prefix to ZIP on Linux CLI
{parent=Info-ZIP}

* https://superuser.com/questions/1750334/create-zip-archive-with-path-prefix
* https://unix.stackexchange.com/questions/628591/zip-files-together-sharing-common-prefix

= Audio file format
{parent=File format}
{wiki}

= Audio editor
{parent=Audio file format}
{wiki}

= Audacity
{disambiguate=audio editor}
{parent=Audio editor}
{wiki}

= Audacity profile-based background noise removal
{parent=Audacity (audio editor)}

You select a sample noise-only area, and it remove noise from the entire video for you:
* https://www.youtube.com/watch?v=AeOjtMOq3EU
* https://www.youtube.com/watch?v=3nMkMn4--5w

= MIDI
{c}
{parent=Audio file format}
{wiki}

In simple terms, represents keystrokes of a piano, but it can likely also represent other effects (TODO confirm: bend, vibrato, slides, attack strength)

Can contain multiple parallel tracks as seen from the <Wikipedia> example: https://en.wikipedia.org/wiki/File:MIDI_sample.mid

You can see what it contains well with <GUI music editor>.

MIDI is fun. It is a basic high level representation of most instrumental music, including beats.

To actually listen to MIDI, you need a <software synthesizer>, which knows what sound to make for each note. One way to specify such instruments is the <SoundFont> file format.

Convert MIDI to more common standalone formats:
* https://stackoverflow.com/questions/16295459/convert-midi-to-mp3/65207296#65207296
* https://softwarerecs.stackexchange.com/questions/10915/automatically-turn-midi-files-into-wav-or-mp3/76955#76955

= SoundFont
{c}
{parent=MIDI}
{wiki}

Contains instructions on how to synthesize MIDI.

Extension: sf2.

Can be imported for example by:
* <vmpk>
* <Csound> with `sfload`: http://www.csounds.com/manual/html/sfload.html

= vmpk
{c}
{parent=MIDI}

https://vmpk.sourceforge.io/

Opens a virtual <MIDI> piano <GUI>. It just works on <Ubuntu> 20.04: https://askubuntu.com/questions/34391/virtual-midi-piano-keyboard-setup/1298026#1298026

VMPK is a virtual device that replicates what you would get by connecting a physical MIDI keyboard to your computer. It is not a <software synthesizer> on its own. But it does connect to a working synthesizer by default (Sonivox EAS) which makes it produce sounds out-of-the box.

TODO: then I messed with my sound settings, and then it stopped working by default on the default "MIDI Connection" > "MIDI Out Driver" > "Network". But it still works on "SonivoxEAS".

A <hello world> of actually connecting it to a specific software synthesizer manually on <Advanced Linux Sound Architecture> with `aconnect` can be found at: https://askubuntu.com/questions/34391/virtual-midi-piano-keyboard-setup/1298026#1298026

Save to a <MIDI> file: https://askubuntu.com/questions/709673/save-as-midi-when-playing-from-vmpk-qsynth/1298231#1298231

Reasonable default key mappings to keyboard covering 2 octaves.

3 multiple simultaneous keys did not work (tested "ZQI"). This might just be a limitation of <ciro santilli s hardware/Lenovo ThinkPad P51 (2017)>[my keyboard] however.

TODO how to save to a `.mid` file? https://askubuntu.com/questions/709673/save-as-midi-when-playing-from-vmpk-qsynth

<SourceForge>.

= Data file format
{parent=File format}
{wiki=Data_file}

= Comma-separated values
{parent=Data file format}
{wiki}

= CSV
{c}
{synonym}
{title2}

= CSV CLI tool
{c}
{parent=Comma-separated values}
{tag=CLI tool}

The generic tool recommendation question: https://unix.stackexchange.com/questions/7425/is-there-a-robust-command-line-tool-for-processing-csv-files

= csvkit
{parent=CSV CLI tool}
{tag=Python library}

Lots of features, but slow because written in <Python>. A faster version may be <csvtools>. Also some annoyances like obtuse header handing and missing features like grep + cut in one go: <csvgrep and select column in csvkit>.

= csvgrep from csvkit
{parent=csvkit}

Simple example:
``
printf '00,11,22\n33,44,55\n' | csvgrep -H -c2 -r '^11$' | tail -n+2
``
output:
```
00,11,22
```

More verbose description:
* https://stackoverflow.com/questions/19711723/awk-to-filter-csv-files/77273608#77273608
* https://unix.stackexchange.com/questions/97070/filter-a-csv-file-based-on-the-5th-column-values-of-a-file-and-print-those-reco/758651#758651

= csvgrep and select column in csvkit
{parent=csvkit}

There seems to be no way without a pipe, you seem to need to reparse the columns, e.g. the tutorial at: https://csvkit.readthedocs.io/en/latest/tutorial/2_examining_the_data.html#csvgrep-find-the-data-you-need does:
``
csvcut -c county,item_name,total_cost data.csv | csvgrep -c county -m LANCASTER
``

Asked at: https://stackoverflow.com/questions/77266699/how-to-fillter-a-csv-file-with-csvgrep-and-print-only-certain-columns

= csvtool
{parent=CSV CLI tool}

A compiled executable under `/usr/bin/csvtool`, has an <Ubuntu 23.04> package: https://manpages.ubuntu.com/manpages/lunar/en/man1/csvtool.1.html

There seems to be no sane filtering mechanism however: https://stackoverflow.com/questions/46540752/using-csvtool-call-to-filter-csv-in-bash

= csvtools
{parent=CSV CLI tool}
{tag=C library}

https://github.com/maroofi/csvtool

A fast version of a somewhat subset of <csvkit>, written in <C (programming language)>.

Build failed with `undefined reference to pcre_config` on <Ubuntu 23.04>: https://github.com/DavyLandman/csvtools/issues/18

Unfortunately it is lacking some basic options, like optional header + selecting column by index on `csvgrep` (though `csvcut` has it). The project seems kind of dead.

Also unclear if it allows to filter + print only selected columns.

= xsv
{parent=CSV CLI tool}
{tag=Rust library}

https://github.com/BurntSushi/xsv

Is this the one?

= JSON
{c}
{parent=Data file format}
{wiki}

= JSON trailing comma
{parent=JSON}

https://stackoverflow.com/questions/201782/can-you-use-a-trailing-comma-in-a-json-object

The fact that you cannot have trailing commans in lists or dicts as in `3,` at:
``
{
  "asdf": [
    1,
    2,
    3,
  ]
}
``
is one of the most infuriating design choices of all time!!!

= jq
{c}
{parent=JSON}
{title2=2012-}
{wiki}

= jq ignore missing attribute
{c}
{parent=jq}

``
echo '[{"a": 1, "b": 2}, {"b": 3}]' | jq '.[] | select(.a) | .a'
``
Output:
``
1
``
and no empty lines as desired.

Bibliography:
* https://stackoverflow.com/questions/42097410/how-to-check-for-presence-of-key-in-jq-before-iterating-over-the-values

= Hierarchical Data Format
{c}
{parent=Data file format}
{title2=HDF}
{wiki}

= Unified Modeling Language
{c}
{parent=Data file format}
{wiki}

= UML
{c}
{synonym}
{title2}

= XML
{c}
{parent=Data file format}
{tag=Markup language}
{title2=Extensible Markup Language}
{wiki}

Do you know what is worse than XML? <HTML>[Pseudo XML]: https://stackoverflow.com/questions/5558502/is-html5-valid-xml/39560454#39560454

= Standard Generalized Markup Language
{c}
{parent=XML}
{wiki}

= SGML
{c}
{synonym}
{title2}

<XML> predecessor.

= IBM Generalized Markup Language
{c}
{parent=Standard Generalized Markup Language}
{wiki}

<SGML> predecessor.

= XPath
{c}
{parent=XML}
{wiki}

XPath kind of died with the rise of <CSS> selectors around the beginnning of the 2010's. But that is a shame. XPath is a good standard, and was generally more powerful than CSS selectors for many many years.

= YAML
{c}
{parent=Data file format}
{wiki}

= Image file format
{parent=File format}
{wiki=Image_file_formats}

= Image metadata format
{parent=Image file format}

= Exif
{c}
{parent=Image metadata format}
{wiki}

= ExifTool
{parent=Exif}
{wiki}

= Exif tag
{parent=Exif}

= Exif `comment` tag
{parent=Exif tag}

= Raster graphics
{parent=Image file format}
{wiki}

Represents image <pixel> by pixel, rather than by mathematical primitives such as done in <vector graphics>:

= Pixel
{parent=Raster graphics}
{wiki}

= Vector graphics
{parent=Image file format}
{wiki}

Smaller files, scalable image size, and editability. Why would you use anything else for programmatically generated images?!?!

= Scalable Vector Graphics
{parent=Vector graphics}
{wiki}

= SVG
{c}
{synonym}
{title2}

<Companies> have been really slow to support SVG features in their browsers, and that is very saddening: https://medium.com/@michaelmangial1/introduction-to-scalable-vector-graphics-6450c03e8d2e

You can't drop SVG support for `canvas` until there's a way to run untrusted <JavaScript> on the browser!

<SVG> does have some compatibility annoyances, notably <SVG fonts>. But we should as a society work to standardize and implement a fix those, the benefits of SVG are just too great!

Examples:
* \a[svg/svg.svg] a minimal somewhat sane SVG:
  * if the `width` and `height` properties were not given, you get the default 300x150, which seems to be set in the SVG standard:
    * https://stackoverflow.com/questions/40156710/why-does-this-svg-image-have-a-height-of-150px
    * https://css-tricks.com/scale-svg
* how to add na SVG image to a <HTML> file:
  * \a[svg/svg.html]: external image. The included file is \a[svg/svg.svg].
  * \a[svg/inline.html]: inline.
* \a[svg/billion-laughs.svg]
* \a[svg/html.svg]
* \a[svg/triangle.svg]
* \a[svg/viewBox.svg]: this attribute allows you to control the default SVG `svg width=` and `height=` while keeping the coordinates of the drawing untouched. If the `viewBox` aspect ratio differs from the width/height ratio, you likely want to play with `preserveAspectRatio`, otherwise you would get white spaces by default on the generated image
* <CSS> with SVG:
  * \a[svg/style.svg]: inline CSS
  * \a[svg/style-external.svg]: external CSS with: `<?xml-stylesheet type="text/css" href="svg.css" ?>`, see also: https://stackoverflow.com/questions/18434094/how-to-style-svg-with-external-css
    * \a[svg/subdir/style-external.html]: is the relative CSS relative to the HTML or to the SVG? Answer: to the SVG... OMG. So how to make it work reliably?
  * \a[svg/current-color.html] and \a[svg/current-color.svg]: illustrates `fill="currentColor"`. Only works for inline SVG however... See also: https://stackoverflow.com/questions/13000682/how-do-i-have-an-svg-image-inherit-colors-from-the-html-document/13002311
* <JavaScript> with SVG:
  * \a[svg/script.svg]
  * \a[svg/external-js.svg]
* \a[svg/defs.html] hows how `defs` works
  * \a[svg/defs-external.html] tries to include external `defs` from \a[svg/defs.svg], but that fails like everything else related to external SVGs

= SVG tutorial
{c}
{parent=Scalable Vector Graphics}

= SVG background color
{c}
{parent=SVG tutorial}

This is a pain point as of <SVG 1.1>...

Examples at \a[svg/background.html] which answers from https://stackoverflow.com/questions/11293026/default-background-color-of-svg-root-element/11293812[]:
* \a[svg/background-rect.svg]
* \a[svg/background-viewport-fill.svg]: was part of <SVG 1.2>, but that whole standard got dropped. Not implemented neither in <Chromium (web-browser)> 85 nor <Firefox> 93 as of 2021.

This pain reflects directly on Inkscape: <set SVG background color in Inkscape>.

= SVG fonts
{c}
{parent=SVG tutorial}

The major problem with SVG is text <computer fonts>. If you make an image with text that depends on one <computer font> and it is not present in the viewer's machine, it will use some other font, which may overlap with other elements of the image. Some libraries <Matplotlib> solve this https://stackoverflow.com/questions/34387893/output-matplotlib-figure-to-svg-with-text-as-text-not-curves[by writing characters as curves], but this produces large files and unsearchable text. The inability of different computer platforms to standardize fonts that must always be present is a major issue.

= Join two SVG side-by-side from the command line
{parent=Scalable Vector Graphics}

TODO:
* https://stackoverflow.com/questions/9612434/how-to-concatenate-svg-files-lengthwise-from-linux-command-line
* https://graphicdesign.stackexchange.com/questions/90844/joining-together-multiple-svg-images
* https://graphicdesign.stackexchange.com/questions/137096/is-there-a-way-to-stack-two-svgs-on-top-of-each-other

= SVG version
{c}
{parent=Scalable Vector Graphics}

= SVG 1.0
{c}
{parent=SVG version}

= SVG 1.1
{c}
{parent=SVG version}

= SVG 1.2
{c}
{parent=SVG version}

Dropped in favor of <SVG 2>.

= SVG 2
{c}
{parent=SVG version}

= List of image file formats
{parent=Image file format}

= GIF
{parent=List of image file formats}
{wiki}

\Video[https://www.youtube.com/watch?v=Nrk8sqZfsgI]
{title=It's pronounced <GIF> by Jehtt (2022)}

= Jacquard machine
{c}
{parent=List of image file formats}
{tag=Punched card}
{title2=1804}
{wiki}

\Image[https://upload.wikimedia.org/wikipedia/commons/thumb/5/55/A_Jacquard_loom_showing_information_punchcards%2C_National_Museum_of_Scotland.jpg/800px-A_Jacquard_loom_showing_information_punchcards%2C_National_Museum_of_Scotland.jpg]

\Video[https://www.youtube.com/watch?v=OlJns3fPItE]
{title=A Jacquard loom in action by NationalMuseumsScotland (2016)}
{description=The lack of audio is unsettling!}

= JPEG
{c}
{parent=List of image file formats}
{wiki}

= JPG
{synonym}
{title2}

= JPEG file signature
{c}
{parent=JPEG}
{tag=File signature}
{title2=FF D8}

= Portable Network Graphics
{parent=List of image file formats}
{wiki}

= PNG
{c}
{synonym}
{title2}

= libpng
{c}
{parent=Portable Network Graphics}

<PNG> reference implementation. Ahh, if feels good to have a dominating open source reference implementation.

Demo of using it by <Ciro Santilli>: https://stackoverflow.com/questions/1362945/how-to-decode-a-png-image-to-raw-bytes-from-c-code-with-libpng/36399711#36399711

\Image[https://i.stack.imgur.com/rfdHr.png]

\Image[https://i.stack.imgur.com/IWBSj.png]

= Image editor
{parent=Image file format}

= GIMP
{c}
{parent=Image editor}
{wiki}

It's not super easy to use at first.

And it sometimes says that the basic drawing thing you want to do is off the project's scope.

But as you learn more about it and further generalize the concepts, there are often reasonable reasons for those design choices.

And the UI looks good :-)

Examples:
* https://superuser.com/questions/167873/how-do-i-draw-a-box-in-gimp you need to go on a top menu to draw a rectangle

Some answers by <Ciro Santilli>:
* https://graphicdesign.stackexchange.com/questions/83446/gimp-how-to-combine-two-images-side-by-side/145543#145543

= Inkscape
{c}
{parent=Image editor}
{wiki}

Inkscape is a a good software for editing/creating <SVG> files.

Its functionality is fundamental for as a <software for drawing geometry diagrams>, as it is a good middle ground between algorithmic generation, and <raster graphics>.

At 1.0.2, its <UI> is a bit terrible:
* the way the menus open on the right with title below the window...
* several defaults are atrocious, e.g. export drawing rather than page

And it crashes from time to time on <Ubuntu> 21.04. And it has some glaring bugs, e.g.:
* https://gitlab.com/inkscape/inbox/-/issues/5794

But still, it is a very good initiative.

What would be really amazing is if they had constraints: https://gitlab.com/inkscape/inbox/-/issues/1465 like proper <CAD> software, it would make it possible to not have to redo entire diagrams when you want to change a small part of them.

= Rotate object around a point in Inkscape
{parent=Inkscape}

There's a tiny little crosshair that you can drag around to set the center of rotation.

And there's a button to make that crosshair snap: https://inkscape.org/forums/questions/can-a-pivotingtransfrom-crosshair-be-moved-and-made-to-snap-to-a-node-or-a-grid-point/#c14432

= Set SVG background color in Inkscape
{parent=Inkscape}

This is related to the underlying SVG pain point of <SVG background color>:
* https://gitlab.com/inkscape/inkscape/-/issues/531
* https://graphicdesign.stackexchange.com/questions/74906/in-inkscape-how-do-i-add-a-white-background/144952#144952

For <PNG> export:
* https://superuser.com/questions/249860/how-can-i-change-inkscapes-default-export-background-color-from-yellow-to-white

= Video file format
{parent=File format}
{wiki=Video_file_formats}

= Video codec
{parent=Video file format}
{wiki}

= Codec acceleration
{parent=Video codec}
{wiki}

= Video editing software
{parent=Video file format}
{wiki}

= Kdenlive
{c}
{parent=Video editing software}
{wiki}

This seems like a decent option, although it has bugs coming in and out all the time! Also it is quite hard to learn to use.

To get started:
* import a clip
* drag it onto the track area

Shortucts:
* Shift + R: cut tracks at current point. You can then select fragments to move around or delete.
* Shift mouse click drag: select multiple clips: https://video.stackexchange.com/questions/21598/select-range-of-clips-in-kdenlive

To set the video length, search for "set outpoint" on "monitor".

Add subtitles:
* Effects
* Dynamic text
then drag on top of the video track. To add only to part of the video, cut it up first.

Preview has no sound on <Ubuntu> 20.10. Fixed as of <Ubuntu 22.04>.

Sound worked on Ubuntu 21.04 though, but it then soon crashed with:

``
 = = SET EFFECT PARAM:  "rect"  =  0=1188 0 732 242
MUTEX LOCK!!!!!!!!!!!! slotactivateeffect:  1
// // // RESULTING REQUIRED SCENE:  1
Object 0x557293592da0 destroyed while one of its QML signal handlers is in progress.
Most likely the object was deleted synchronously (use QObject::deleteLater() instead), or the application is running a nested event loop.
This behavior is NOT supported!
qrc:/qml/EffectToolBar.qml:80: function() { [native code] }
Killed
``
amazing.

On Ubuntu 22.04 haven't crashed yet.

<Ubuntu 23.04> broke the clip drag and drop!
* https://askubuntu.com/questions/1464992/cant-drag-clip-to-timeline-in-kdenlive-in-ubuntu-23-04/1469359#1469359
* https://gitlab.gnome.org/GNOME/mutter/-/issues/2715#note_1753579
* https://www.reddit.com/r/kdenlive/comments/12x0t6s/kdenlive_drag_and_drop_not_working/

= ShotCut
{c}
{parent=Video editing software}
{wiki}

Worked on <Ubuntu> 20.10.

The UI is a bit too buggy to bear.

How to unsplit, can't find on shotcut 21.05.01: https://forum.shotcut.org/t/is-it-possible-to-unsplit/1466/2

Background noise reduction: couldn't easily find out how, especially with automatic profile detected based on a selected region as mentioned at <audacity profile-based background noise removal>:
* https://forum.shotcut.org/t/how-to-apply-filter-reduction-noise-on-audio/12678/2
* https://forum.shotcut.org/t/noise-reduction-filter-request/5348/6

= OpenShot
{c}
{parent=Video editing software}
{wiki}

<Ubuntu> 20.10 crash...:
``
  exceptions:ERROR Unhandled Exception
Traceback (most recent call last):
  File "/usr/bin/openshot-qt", line 11, in <module>
    load_entry_point('openshot-qt==2.5.1', 'gui_scripts', 'openshot-qt')()
  File "/usr/lib/python3/dist-packages/openshot_qt/launch.py", line 97, in main
    app = OpenShotApp(argv)
  File "/usr/lib/python3/dist-packages/openshot_qt/classes/app.py", line 218, in __init__
    from windows.main_window import MainWindow
  File "/usr/lib/python3/dist-packages/openshot_qt/windows/main_window.py", line 45, in <module>
    from windows.views.timeline_webview import TimelineWebView
  File "/usr/lib/python3/dist-packages/openshot_qt/windows/views/timeline_webview.py", line 42, in <module>
    from PyQt5.QtWebKitWidgets import QWebView
ImportError: /usr/lib/x86_64-linux-gnu/libQt5Quick.so.5: undefined symbol: _ZN4QRhi10newSamplerEN11QRhiSampler6FilterES1_S1_NS0_11AddressModeES2_, version Qt_5_PRIVATE_API
``

= Subtitle
{parent=Video file format}

= How to hardcode subtitle into a video with FFmpeg?
{parent=Subtitle}

* https://superuser.com/questions/869248/hardcoding-subs-with-ffmpeg
* https://askubuntu.com/questions/485100/how-may-i-burn-srt-subtitles-to-video-with-avconv

On <Ubuntu> 20.10, just:
``
ffmpeg -i input.mp4 -vf "subtitles=subtitle.srt" output.mp4
``

To change font size: https://stackoverflow.com/questions/21363334/how-to-add-font-size-in-subtitles-in-ffmpeg-video-filter
``
ffmpeg -i input.mp4 -vf "subtitles=subtitle.srt:force_style='Fontsize=64'" output.mp4
``
The default appears to be 24, so just multiply that by whatever seems like a reasonable factor.

Note howver that <.ass subtitle files> can contain style information, which ffmpeg respects. <Aegisub> can produce and preview such styles, making .ass one of the best options.

= Subtitle file format
{parent=Subtitle}

= SubStation Alpha
{c}
{parent=Subtitle file format}
{wiki}

= .ass subtitle file
{synonym}
{title2}

= Subtitle editor
{parent=Subtitle file format}

= Subtitle Edit
{c}
{parent=Subtitle editor}

Written in <c sharp>.

= Aegisub
{c}
{parent=Subtitle editor}

https://github.com/Aegisub/Aegisub

This worked well on 3.2.2 <Ubuntu> 20.10. Recommended.

First import video with:
``
aegisub-3.2 ourbigbook-parent.mkv
``
They don't have an `aegisub` executable without the version number. Amazing.

If you already have a subtitle file that you want to edit, then just pass it on as well:
``
aegisub-3.2 ourbigbook-parent.mkv ourbigbook-parent.ass
``

Ctrl + P: play and pause video.

Ctrl + 3: set current substitle start time.

Ctrl + 4: set current substitle end time.

Enter: finish editing the current entry and start a new one.

= Gaupol
{c}
{parent=Subtitle editor}

https://github.com/otsaloma/gaupol

Good shortcuts and user experience.

No waveform viewer: https://github.com/otsaloma/gaupol/issues/49 so unusable.

= kitone/subtitleeditor
{parent=Subtitle editor}

https://github.com/SubtitleEdit/subtitleedit

Not to be confused with <Subtitle Edit>.

As of 0.54.0 this feels featureful, but extremely buggy or lacking UI obvious enhancements that would be simple to implement, and offer huge value:
* fundamental not defined out of box, e.g. Tiny forward/backwards. You can define them yourself, but they should be provided.
* https://github.com/SubtitleEdit/subtitleedit/issues/4976 can't export <SubRip>?
* can't interact with video on waveform?

It is hard to understand how that project reached this weird featureful but crappy state. Feels like they just gave push permission to a bunch of random people.

= List of subtitle file formats
{parent=Video file format}

= SubRip
{c}
{parent=List of subtitle file formats}
{title2=.srt}
{wiki}

= List of file formats
{parent=File format}
{wiki=Video_file_formats}

= UF2
{c}
{parent=List of file formats}

https://github.com/microsoft/uf2

A <Microsoft> format for flashing <microcontrollers> by copying files to a magic filesystem mounted  on host, e.g. as done on the <Micro Bit> and <Raspberry Pi Pico>.

= Information
{parent=Computer}
{wiki}

= Data
{parent=Information}
{wiki}

= Synthetic data
{parent=Data}
{wiki}

= Procedural generation
{parent=Synthetic data}
{wiki}

= Information theory
{parent=Information}
{wiki}

= Noisy-channel coding theorem
{parent=Information theory}
{title2=Shannon's theorem}
{wiki}

Setting: you are sending bits through a communication channel, each bit has a random probability of getting flipped, and so you use some error correction code to achieve some minimal error, at the expense of longer messages.

This theorem sets an upper bound on how efficient you can be in your encoding, for any encoding.

The next big question, which the theorem does not cover is how to construct codes that reach or approach the limit. Important such codes include:
* <turbo code>
* <low-density parity-check code>

But besides this, there is also the practical consideration of if you can encode/decode fast enough to keep up with the coded bandwidth given your hardware capabilities.

https://news.mit.edu/2010/gallager-codes-0121 explains how turbo codes were first reached without a very good mathematical proof behind them, but were still revolutionary in experimental performance, e.g. turbo codes were used in 3G/4G.

But this motivated researchers to find other such algorithms that they would be able to prove things about, and so they rediscovered the much earlier <low-density parity-check code>, which had been published in the 60's but was forgotten, partially because it was computationally expensive.

= Turbo code
{parent=Noisy-channel coding theorem}
{wiki}

TODO how close does it get to Shannon's limit?

= Low-density parity-check code
{parent=Noisy-channel coding theorem}
{title2=LDPC}
{wiki}

= Signal processing
{parent=Information theory}
{wiki}

= Digital signal processing
{parent=Signal processing}
{wiki}

= Filter
{disambiguate=signal processing}
{parent=Signal processing}
{wiki}

= Bandpass filter
{parent=Filter (signal processing)}
{wiki}

= Signal-to-noise ratio
{parent=Information theory}
{wiki}

= Signal-to-noise
{synonym}

= Quantum information
{parent=Information}
{wiki}

\Include[quantum-computing]{parent=quantum-information}

= Quantum key distribution
{parent=Quantum information}
{tag=Cryptography}
{wiki}

= QKD
{c}
{synonym}
{title2}

Man-in-the-middle attack

https://quantumcomputing.stackexchange.com/questions/142/advantage-of-quantum-key-distribution-over-post-quantum-cryptography/25727#25727 Advantage of quantum key distribution over post-quantum cryptography has <Ciro Santilli>'s comparison to classical encryption.

<BB84> is a good first algorithm to look into.

Long story short:
* QKD allows you to generate shared keys without <public-key cryptography>. You can then use thses shared keys
* QKD requires authentication on a classical channel, exactly like a classical <public-key cryptography> <forward secrecy> would. The simplest way to do this is a with a <pre-shared key>, just like in classical public key cryptography. If that key is compromised at any point, your future messages can get <man-in-the-middle>'d, exactly like in classical cryptography.

QKD uses <quantum mechanics> stuff to allow sharing unsnoopable keys: you can detect any snooping and abort communication. Unsnoopability is guaranteed by the known <laws of physics>, up only to engineering imperfections.

Furthermore, it allows this <key (cryptography)> distribution without having to physically take a box by car somewhere: once the channel is established, e.g. <optical fiber>, you can just keep generating perfect keys from it. Otherwise it would be pointless, as you could just drive your <one-time pad> key every time.

However, the keys likely have a limited rate of generation, so you can't just <one-time pad> the entire message, except for small text messages. What you would then do is to use the shared key with <symmetric encryption>.

Therefore, this setup usually ultimately relies on the idea that we believe that <symmetric encryption> is safer than , even though there aren't mathematical safety proofs of either as of 2020.

= Quantum key distribution protocol
{parent=Quantum key distribution}

= BB84
{c}
{parent=Quantum key distribution protocol}
{wiki}

Does not require <entangled particles>, unlike <E91> which does.

https://en.wikipedia.org/w/index.php?title=Quantum_key_distribution&oldid=1079513227#BB84_protocol:_Charles_H._Bennett_and_Gilles_Brassard_(1984) explains it well. Basically:
* Alice and Bob randomly select a measurement basis of either 90 degrees and 45 degrees for each <photon>
* Alice measures each photon. There are two possible results to either measurement basis: parallel or perpendicular, representing values 0 or 1. TODO understand better: weren't the possible results supposed to be pass or non-pass? She writes down the results, and sends the (now <wave function collapse>[collapsed]) photons forward to Bob.
* Bob measures the photons and writes down the results
* Alice and Bob communicate to one another their randomly chosen measurement bases over the unencrypted classic channel.

  This channel must be authenticated to prevent <man-in-the-middle>. The only way to do this authentication that makes sense is to use a <pre-shared key> to create <message authentication codes>. Using <public-key cryptography> for a <digital signature> would be pointless, since the only advantage of <QKD> is to avoid using <public-key cryptography> in the first place.
* they drop all photons for which they picked different basis. The measurements of those which were in the same basis are the key. Because they are in the same basis, their results must always be the same in an ideal system.
* if there is an eavesdropper on the line, the results of measurements on the same basis can differ.

  Unfortunately, this can also happen due to imperfections in the system.

  Alice and Bob must decide what level of error is above the system's imperfections and implies that an attacker is listening.

= BB86 vs E91
{c}
{parent=BB84}

https://physics.stackexchange.com/questions/441870/bb84-protocol-vs-e91-protocol

= E91
{c}
{parent=Quantum key distribution protocol}

Requires <entangled particles>, unlike <BB84> which does not.

= Markup language
{parent=Computer}
{wiki}

= Lightweight markup language
{parent=Markup language}
{wiki}

= Lightweight markup
{synonym}

= List of markup languages
{parent=Markup language}

= AsciiDoc
{c}
{parent=List of markup languages}
{tag=Lightweight markup language}
{wiki}

= AsciiDoctor
{c}
{parent=AsciiDoc}
{wiki}

= LaTeX
{c}
{parent=List of markup languages}
{wiki}

Revolutionary for its time, and a big part of <ourbigbook com/motivation>[Ciro's Enlightenment].

But too insane, and did not https://tex.stackexchange.com/questions/39309/convert-latex-to-html/196520#196520[keep up with internet age], and so Ciro wants to kill it now.

= LaTeX to HTML
{c}
{parent=LaTeX}

* full document: https://tex.stackexchange.com/questions/39309/convert-latex-to-html/196520#196520
* just the formulas: https://tex.stackexchange.com/questions/23804/how-to-incorporate-tex-mathematics-into-a-website/646504#646504

= KaTeX
{c}
{parent=LaTeX to HTML}

https://github.com/KaTeX/KaTeX

Default mathematics typesetting used in <OurBigBook Markup>.

Key issues:
* https://github.com/KaTeX/KaTeX/issues/2228 `newcommand` did not support optional arguments

= Softcover
{disambiguate=LaTeX}
{parent=LaTeX to HTML}

https://github.com/softcover/softcover

LaTeX subset that output nicely to HTML.

Too insane though due to LaTeX roots, better just move to newer HTML-first markups like <OurBigBook Markup> or <markdown>.

= MathBook XML
{c}
{parent=List of markup languages}

https://github.com/rbeezer/mathbook

<XML>, ain't nobody ever going to write that manually.

= Markdown
{parent=List of markup languages}
{tag=Lightweight markup language}
{wiki}

The questions are: who is this Mark, and why does he have to go down?

= Pandoc
{parent=Markdown}
{wiki}

This is good software.

If it only it were written in <JavaScript> instead of Haskell (!?), then Ciro might have used it as the basis for <OurBigBook Markup>.

= karlcow/markdown-testsuite
{parent=Markdown}

https://github.com/karlcow/markdown-testsuite

<Ciro Santilli> was contributing to this, when <CommonMark> left private mode and killed it, thus wasting many hours of Ciro's time.

See also: <Ciro Santilli's minor projects>.

= CommonMark
{c}
{parent=Markdown}

https://commonmark.org/

CommonMark is a good project. But its initial release method was not very nice, they first developed everything behind closed doors with the big adopters like <GitHub> and <Stack Overflow>, and only later released the thing read, thus wasting the time of people who were working on alternative in the meanwhile, e.g. https://github.com/karlcow/markdown-testsuite which Ciro contributed to: <Ciro Santilli's minor projects>.

= markdownlint/markdownlint
{parent=Markdown}

https://github.com/markdownlint/markdownlint

\Include[machine-learning]{parent=Computer}

= Parallel computing
{parent=Computer}
{wiki}

= Memory semantics
{parent=Parallel computing}
{wiki}

These are the rules which specify what different concurrent read/write memory accesses from different threads/processes can or cannot see.

Notable such set of rules include:
* <C++ memory model>. These are also reflected on the semantics of memory of the corresponding <instruction set architecture>
* <SQL transaction isolation level>

= C++ memory model
{c}
{parent=Memory semantics}

https://stackoverflow.com/questions/6319146/c11-introduced-a-standardized-memory-model-what-does-it-mean-and-how-is-it-g

= Parallel computing library
{parent=Parallel computing}
{wiki}

= Read-modify-write
{parent=Parallel computing}
{wiki=Read–modify–write}

That's what usually fucks up parallel programs.

= Thread
{disambiguate=computing}
{parent=Parallel computing}
{wiki}

= Thread
{synonym}

= Simultaneous multithreading
{parent=Thread (computing)}

= Hyperthreading
{synonym}
{title2}

= Hyperthread
{synonym}

* https://superuser.com/questions/133082/what-is-the-difference-between-hyper-threading-and-multiple-cores/995858#995858
* https://stackoverflow.com/questions/680684/what-are-the-differences-between-multi-cpu-multi-core-and-hyper-thread/73405312#73405312
* https://unix.stackexchange.com/questions/88283/so-what-are-logical-cpu-cores-as-opposed-to-physical-cpu-cores/739296#739296

Hyperthreding is the <Intel> brand-name, TODO generic name.

= History of computers
{parent=Computer}

= ENIAC
{c}
{parent=History of computers}
{title2=ENIAC}
{wiki}

\Include[software]{parent=computer}
\Include[computer-hardware]{parent=computer}

= Vaporware
{parent=Computer}
{wiki}

One of the saving graces of <open source> is that you ship <shit>, but you don't announce <vaporwave>.

= Computer biliography
{parent=Computer}

= Computer YouTube channel
{parent=Computer biliography}

= ExplainingComputers
{parent=Computer YouTube channel}

https://www.youtube.com/@ExplainingComputers

It is hard to say if this channel is good because of the awesome information, or if because of the absolute cutness of that British presenter. Maybe it is both.