-
-
Notifications
You must be signed in to change notification settings - Fork 9
/
computer.bigb
2881 lines (2098 loc) · 96.4 KB
/
computer.bigb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
= Computer
{tag=Good}
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=KmuP8gsgWb8]
{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 standard 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
= Princeton Application Repository for Shared-Memory Computers
{c}
{parent=Computer benchmark}
= PARSEC
{disambiguate=benchmark}
{synonym}
{title2}
Widely used in <academia> in the 2010s and beyond. Countless <papers> must have been published with it.
The website went down in 2023, and <Ciro Santilli> added a data backup to <cirosantilli parsec-benchmark>
= cirosantilli/parsec-benchmark
{parent=Princeton Application Repository for Shared-Memory Computers }
{tag=Ciro Santilli's minor projects}
https://github.com/cirosantilli/parsec-benchmark
<Ciro Santilli>'s fork of <PARSEC (benchmark)>. This fork was made to improve the build system and better support newer targets, including newer <Ubuntu> and <Buildroot>.
After the PARSEC website died in 2023, <Ciro Santilli> also uploaded the test data to <GitHub>.
= 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 physical layer
{c}
{parent=Ethernet}
{wiki}
= Ethernet cable
{c}
{parent=Ethernet physical layer}
When non-specialists say "Ethernet cable", they usually mean <twisted pair> for <Ethernet over twisted pair>.
But of course, this term is much more generic to a more specialized person, since notably <fiber optics> are also extensively used in <Ethernet over fiber>.
https://en.wikipedia.org/wiki/Category:Ethernet_cables
= Ethernet over twisted pair
{parent=Ethernet cable}
{tag=Twisted pair}
{wiki}
= Category 5 cable
{parent=Ethernet over twisted pair}
{title2=4 twisted pairs}
{wiki}
= Cat 5e
{parent=Category 5 cable}
{title2=2.5 Gbit/s}
= Cat 5e cable
{synonym}
This is the most common home "ethernet cable" as of 2024. It is essentially ubiquitous. According to the existing <Ethernet physical layer>, the maximum speed supported is 2.5 Gbit/s.
\Video[https://upload.wikimedia.org/wikipedia/commons/d/d1/CAT5e_Cable.jpg]
{title=<Cat 5e cable> stripped}
= Ethernet over fiber
{c}
{parent=Ethernet cable}
{wiki}
= 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}
= HTTPS
{c}
{parent=HTTP}
{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