summary refs log tree commit diff stats
path: root/random
diff options
context:
space:
mode:
authorAndrew Yu <andrew@andrewyu.org>2022-07-26 01:17:29 +0800
committerAndrew Yu <andrew@andrewyu.org>2022-07-26 01:17:29 +0800
commita519e5320bec2f2df42b7356740e33189dd13d29 (patch)
treeee4847a608d3d61973622406fba1e8909ba68112 /random
parent5aadb780755d21be9f1c2050c841a18a2a6ff9b6 (diff)
downloadwww-a519e5320bec2f2df42b7356740e33189dd13d29.tar.gz
backup public domain
Diffstat (limited to 'random')
-rw-r--r--random/eax.txt452
-rw-r--r--random/lispos.html597
-rw-r--r--random/nh.html94
3 files changed, 1143 insertions, 0 deletions
diff --git a/random/eax.txt b/random/eax.txt
new file mode 100644
index 0000000..b4f2cfb
--- /dev/null
+++ b/random/eax.txt
@@ -0,0 +1,452 @@
+; General way to do syscalls:
+
+mov eax, <syscall number as below>
+mov ebx, arg
+mov ecx, arg
+mov edx, arg
+mov esx, arg
+mov edi, arg
+int 0x80
+
+; man 2 <syscall name> will tell you arguments and extra information of
+; the syscalls
+
+; syscall name                syscall number
+restart_syscall               0
+exit                          1
+fork                          2
+read                          3
+write                         4
+open                          5
+close                         6
+waitpid                       7
+creat                         8
+link                          9
+unlink                        10
+execve                        11
+chdir                         12
+time                          13
+mknod                         14
+chmod                         15
+lchown                        16
+break                         17
+oldstat                       18
+lseek                         19
+getpid                        20
+mount                         21
+umount                        22
+setuid                        23
+getuid                        24
+stime                         25
+ptrace                        26
+alarm                         27
+oldfstat                      28
+pause                         29
+utime                         30
+stty                          31
+gtty                          32
+access                        33
+nice                          34
+ftime                         35
+sync                          36
+kill                          37
+rename                        38
+mkdir                         39
+rmdir                         40
+dup                           41
+pipe                          42
+times                         43
+prof                          44
+brk                           45
+setgid                        46
+getgid                        47
+signal                        48
+geteuid                       49
+getegid                       50
+acct                          51
+umount2                       52
+lock                          53
+ioctl                         54
+fcntl                         55
+mpx                           56
+setpgid                       57
+ulimit                        58
+oldolduname                   59
+umask                         60
+chroot                        61
+ustat                         62
+dup2                          63
+getppid                       64
+getpgrp                       65
+setsid                        66
+sigaction                     67
+sgetmask                      68
+ssetmask                      69
+setreuid                      70
+setregid                      71
+sigsuspend                    72
+sigpending                    73
+sethostname                   74
+setrlimit                     75
+getrlimit                     76
+getrusage                     77
+gettimeofday                  78
+settimeofday                  79
+getgroups                     80
+setgroups                     81
+select                        82
+symlink                       83
+oldlstat                      84
+readlink                      85
+uselib                        86
+swapon                        87
+reboot                        88
+readdir                       89
+mmap                          90
+munmap                        91
+truncate                      92
+ftruncate                     93
+fchmod                        94
+fchown                        95
+getpriority                   96
+setpriority                   97
+profil                        98
+statfs                        99
+fstatfs                       100
+ioperm                        101
+socketcall                    102
+syslog                        103
+setitimer                     104
+getitimer                     105
+stat                          106
+lstat                         107
+fstat                         108
+olduname                      109
+iopl                          110
+vhangup                       111
+idle                          112
+vm86old                       113
+wait4                         114
+swapoff                       115
+sysinfo                       116
+ipc                           117
+fsync                         118
+sigreturn                     119
+clone                         120
+setdomainname                 121
+uname                         122
+modify_ldt                    123
+adjtimex                      124
+mprotect                      125
+sigprocmask                   126
+create_module                 127
+init_module                   128
+delete_module                 129
+get_kernel_syms               130
+quotactl                      131
+getpgid                       132
+fchdir                        133
+bdflush                       134
+sysfs                         135
+personality                   136
+afs_syscall                   137
+setfsuid                      138
+setfsgid                      139
+_llseek                       140
+getdents                      141
+_newselect                    142
+flock                         143
+msync                         144
+readv                         145
+writev                        146
+getsid                        147
+fdatasync                     148
+_sysctl                       149
+mlock                         150
+munlock                       151
+mlockall                      152
+munlockall                    153
+sched_setparam                154
+sched_getparam                155
+sched_setscheduler            156
+sched_getscheduler            157
+sched_yield                   158
+sched_get_priority_max        159
+sched_get_priority_min        160
+sched_rr_get_interval         161
+nanosleep                     162
+mremap                        163
+setresuid                     164
+getresuid                     165
+vm86                          166
+query_module                  167
+poll                          168
+nfsservctl                    169
+setresgid                     170
+getresgid                     171
+prctl                         172
+rt_sigreturn                  173
+rt_sigaction                  174
+rt_sigprocmask                175
+rt_sigpending                 176
+rt_sigtimedwait               177
+rt_sigqueueinfo               178
+rt_sigsuspend                 179
+pread64                       180
+pwrite64                      181
+chown                         182
+getcwd                        183
+capget                        184
+capset                        185
+sigaltstack                   186
+sendfile                      187
+getpmsg                       188
+putpmsg                       189
+vfork                         190
+ugetrlimit                    191
+mmap2                         192
+truncate64                    193
+ftruncate64                   194
+stat64                        195
+lstat64                       196
+fstat64                       197
+lchown32                      198
+getuid32                      199
+getgid32                      200
+geteuid32                     201
+getegid32                     202
+setreuid32                    203
+setregid32                    204
+getgroups32                   205
+setgroups32                   206
+fchown32                      207
+setresuid32                   208
+getresuid32                   209
+setresgid32                   210
+getresgid32                   211
+chown32                       212
+setuid32                      213
+setgid32                      214
+setfsuid32                    215
+setfsgid32                    216
+pivot_root                    217
+mincore                       218
+madvise                       219
+getdents64                    220
+fcntl64                       221
+gettid                        224
+readahead                     225
+setxattr                      226
+lsetxattr                     227
+fsetxattr                     228
+getxattr                      229
+lgetxattr                     230
+fgetxattr                     231
+listxattr                     232
+llistxattr                    233
+flistxattr                    234
+removexattr                   235
+lremovexattr                  236
+fremovexattr                  237
+tkill                         238
+sendfile64                    239
+futex                         240
+sched_setaffinity             241
+sched_getaffinity             242
+set_thread_area               243
+get_thread_area               244
+io_setup                      245
+io_destroy                    246
+io_getevents                  247
+io_submit                     248
+io_cancel                     249
+fadvise64                     250
+exit_group                    252
+lookup_dcookie                253
+epoll_create                  254
+epoll_ctl                     255
+epoll_wait                    256
+remap_file_pages              257
+set_tid_address               258
+timer_create                  259
+timer_settime                 260
+timer_gettime                 261
+timer_getoverrun              262
+timer_delete                  263
+clock_settime                 264
+clock_gettime                 265
+clock_getres                  266
+clock_nanosleep               267
+statfs64                      268
+fstatfs64                     269
+tgkill                        270
+utimes                        271
+fadvise64_64                  272
+vserver                       273
+mbind                         274
+get_mempolicy                 275
+set_mempolicy                 276
+mq_open                       277
+mq_unlink                     278
+mq_timedsend                  279
+mq_timedreceive               280
+mq_notify                     281
+mq_getsetattr                 282
+kexec_load                    283
+waitid                        284
+add_key                       286
+request_key                   287
+keyctl                        288
+ioprio_set                    289
+ioprio_get                    290
+inotify_init                  291
+inotify_add_watch             292
+inotify_rm_watch              293
+migrate_pages                 294
+openat                        295
+mkdirat                       296
+mknodat                       297
+fchownat                      298
+futimesat                     299
+fstatat64                     300
+unlinkat                      301
+renameat                      302
+linkat                        303
+symlinkat                     304
+readlinkat                    305
+fchmodat                      306
+faccessat                     307
+pselect6                      308
+ppoll                         309
+unshare                       310
+set_robust_list               311
+get_robust_list               312
+splice                        313
+sync_file_range               314
+tee                           315
+vmsplice                      316
+move_pages                    317
+getcpu                        318
+epoll_pwait                   319
+utimensat                     320
+signalfd                      321
+timerfd_create                322
+eventfd                       323
+fallocate                     324
+timerfd_settime               325
+timerfd_gettime               326
+signalfd4                     327
+eventfd2                      328
+epoll_create1                 329
+dup3                          330
+pipe2                         331
+inotify_init1                 332
+preadv                        333
+pwritev                       334
+rt_tgsigqueueinfo             335
+perf_event_open               336
+recvmmsg                      337
+fanotify_init                 338
+fanotify_mark                 339
+prlimit64                     340
+name_to_handle_at             341
+open_by_handle_at             342
+clock_adjtime                 343
+syncfs                        344
+sendmmsg                      345
+setns                         346
+process_vm_readv              347
+process_vm_writev             348
+kcmp                          349
+finit_module                  350
+sched_setattr                 351
+sched_getattr                 352
+renameat2                     353
+seccomp                       354
+getrandom                     355
+memfd_create                  356
+bpf                           357
+execveat                      358
+socket                        359
+socketpair                    360
+bind                          361
+connect                       362
+listen                        363
+accept4                       364
+getsockopt                    365
+setsockopt                    366
+getsockname                   367
+getpeername                   368
+sendto                        369
+sendmsg                       370
+recvfrom                      371
+recvmsg                       372
+shutdown                      373
+userfaultfd                   374
+membarrier                    375
+mlock2                        376
+copy_file_range               377
+preadv2                       378
+pwritev2                      379
+pkey_mprotect                 380
+pkey_alloc                    381
+pkey_free                     382
+statx                         383
+arch_prctl                    384
+io_pgetevents                 385
+rseq                          386
+semget                        393
+semctl                        394
+shmget                        395
+shmctl                        396
+shmat                         397
+shmdt                         398
+msgget                        399
+msgsnd                        400
+msgrcv                        401
+msgctl                        402
+clock_gettime64               403
+clock_settime64               404
+clock_adjtime64               405
+clock_getres_time64           406
+clock_nanosleep_time64        407
+timer_gettime64               408
+timer_settime64               409
+timerfd_gettime64             410
+timerfd_settime64             411
+utimensat_time64              412
+pselect6_time64               413
+ppoll_time64                  414
+io_pgetevents_time64          416
+recvmmsg_time64               417
+mq_timedsend_time64           418
+mq_timedreceive_time64        419
+semtimedop_time64             420
+rt_sigtimedwait_time64        421
+futex_time64                  422
+sched_rr_get_interval_time64  423
+pidfd_send_signal             424
+io_uring_setup                425
+io_uring_enter                426
+io_uring_register             427
+open_tree                     428
+move_mount                    429
+fsopen                        430
+fsconfig                      431
+fsmount                       432
+fspick                        433
+pidfd_open                    434
+clone3                        435
+close_range                   436
+openat2                       437
+pidfd_getfd                   438
+faccessat2                    439
+process_madvise               440
+epoll_pwait2                  441
+mount_setattr                 442
+quotactl_fd                   443
+landlock_create_ruleset       444
+landlock_add_rule             445
+landlock_restrict_self        446
+memfd_secret                  447
+process_mrelease              448
diff --git a/random/lispos.html b/random/lispos.html
new file mode 100644
index 0000000..cd114fa
--- /dev/null
+++ b/random/lispos.html
@@ -0,0 +1,597 @@
+<HTML>
+<HEAD>
+<TITLE>Lisp Operating System</TITLE>
+<LINK rel="stylesheet" type="text/css" href="../mm.css">
+</HEAD>
+<BODY>
+<H1>Lisp Operating System</H1>
+
+<p>
+  A Lisp Operating System (LispOS for short) is not just another
+  operating system that happens to be written in Lisp (although that
+  would be a good thing in itself).  A LispOS is also an operating
+  system that uses the Lisp interactive environment as an inspiration
+  for the interface between the user and the system, and between
+  applications and the system.
+</p>
+
+<p>
+  Below, we give some ideas on what a LispOS might contain, how it
+  would be different from existing operating systems, and how such a
+  system might be created.
+</p>
+
+<H2>The problem with existing systems</H2>
+
+<H3>The concept of a <i>process</i></H3>
+
+<p>
+  Most popular existing operating systems are derived from Unix which
+  was written in the 1970s.  The computers for which Unix was intended
+  has a very small address space; too small for most usable end-user
+  applications.  To solve this problem, the creators of Unix used the
+  concept of a <i>process</i>.  A large application was written so
+  that it consisted of several smaller programs, each of which ran in
+  its own address space.  These smaller programs would communicate by
+  having one application write text to its output stream for another
+  application to read.  This method of communication was called
+  a <i>pipe</i> and a sequence of small applications was called
+  a <i>pipeline</i>.  As a typical example of a chain of applications,
+  consider the pipeline for producing a typeset document (one of the
+  main applications for which Unix was designed).  This chain had a
+  program for creating tables (called <tt>tbl</tt>), a program for
+  generating pictures (called <tt>pic</tt>), a program for generating
+  equations (called <tt>eqn</tt>), and of course the typesetting program
+  itself (called <tt>troff</tt>).
+</p>
+
+<p>
+  Using pipes to communicate between different components of an
+  application has several disadvantages:
+  <ul>
+    <li>
+      To communicate complex data structures (such as trees or
+      graphs), they must be converted to a stream of bytes by the
+      creating component, and it must be analyzed and parsed into an
+      equivalent data structure by the using component.  Not only is
+      this unparsing/parsing inefficient in terms of computing
+      resources, but it is also problematic from a
+      software-engineering point of view, because the external format
+      must be specified and maintained as a separate aspect of each
+      component.
+    </li>
+    <li>
+      An artificial <i>order</i> between the different components is
+      imposed, so that components can not work as libraries that other
+      components can use in any order.  Sometimes (as in the example
+      of the <tt>troff</tt> chain) the end result of a computation
+      depends in subtle ways on the order between the components of
+      the chain.  Introducing a new component may require other
+      components to be modified.  
+    </li>
+  </ul>
+</p>
+
+<p>
+  It is an interesting observation that in most text books on
+  operating systems, the concept of a process is presented as playing
+  a central role in operating-system design, whereas it ought to be
+  presented as an unfortunate necessity due to the limited address
+  space of existing minicomputers in the 1970s.  It is also presented
+  as <i>the</i> method for obtaining some kind of <i>security</i>,
+  preventing one application from intentionally or accidentally
+  modifying the data of some other application.  In reality, there are
+  several ways of obtaining such security, and separate address spaces
+  should be considered to be a method with too many disadvantages. 
+</p>
+
+<p>
+  Nowadays, computers have addresses that are 64 bit wide, making it
+  possible to address almost 20 exabytes of data.  To get an idea of
+  the order of magnitude of such a number, consider a fairly large
+  disc that can hold a terabyte of data.  Then 20 million such discs
+  can be directly addressed by the processor.  We can thus consider
+  the problem of too small an address space to be solved.  
+</p>
+
+<H3>Hierarchical file systems</H3>
+
+<p>
+  Existing operating system come with a <i>hierarchical file
+  system</i>.  There are two significant problems,
+  namely <i>hierarchical</i> and <i>file</i>.
+</p>
+
+<p>
+  The <i> hierarchy</i> is also a concept that dates back to the
+  1970s, and it was considered a vast improvement on flat file
+  systems.  However,
+  as <a href="http://www.shirky.com/writings/ontology_overrated.html">this
+  article</a> clearly explains, most things are not naturally
+  hierarchical.  A hierarchical organization imposes an artificial
+  order between names.  Whether a document is called
+  Lisp/Programs/2013/stuff, Programs/Lisp/2013/stuff,
+  2013/Programs/Lisp/stuff, etc, is usually not important.
+</p>
+
+<p>
+  The problem with a <i>file</i> is that it is only a sequence of
+  bytes with no structure.  This lack of structure fits the Unix pipe
+  model very well, because intermediate steps between individual
+  software components can be saved to a file without changing the
+  result.  But it also means that in order for complex data structures
+  to be stored in the file system, they have to be transformed into a
+  sequence of bytes.  And whenever such a structure needs to be
+  modified by some application, it must again be parsed and
+  transformed into an in-memory structure.
+</p>
+
+<H3>Distinction between primary and secondary memory</H3>
+
+<p>
+  Current system (at least for desktop computers) make a very clear
+  distinction between primary and secondary memory.  Not only are the
+  two not the same, but they also have totally different semantics:
+  <ul>
+    <li> Primary memory is <i>volatile</i>.  When power is turned off,
+      whatever was in primary memory is lost.
+    </li>
+    <li> Secondary memory is <i>permanent</i>.  Stored data will not
+      disappear when power is turned off.
+  </ul>
+  This distinction coupled with the semantics of the two memories
+  creates a permanent conundrum for the user of most applications, in
+  that if current application data is <i>not</i> saved, then it will
+  be lost in case of power loss, and if it <i>is</i> saved, then
+  previously saved data is forever lost. 
+</p>
+
+<p>
+  Techniques were developed as early in the 1960s for presenting
+  primary and secondary memory as a single abstraction to the user.
+  For example, the Multics system had a single hierarchy of fixed-size
+  byte arrays (called segments) that served as permanent storage, but
+  that could also be treated as any in-memory array by applications.
+  As operating systems derived from Unix became widespread, these
+  techniques were largely forgotten. 
+</p>
+
+<H3>The concept of a kernel</H3>
+
+<p>
+  The <i>kernel</i> of an operating system is a fairly large,
+  monolithic program that is started when the computer is powered on.
+  The kernel is not an ordinary program of the computer.  It executes
+  in a privileged state so that it has direct access to devices and to
+  data structures that must be protected from direct use by user-level
+  programs.
+</p>
+
+<p>
+  The very existence of a kernel is problematic because the computer
+  needs to be restarted whenever the kernel is updated, and then all
+  existing state is lost, including open files and data structures
+  that reside in volatile memory.  Some programs, such as web
+  browsers, compensate somewhat for this problem by remembering the
+  open windows and the links that were associated with each window.
+</p>
+
+<p>
+  The fact that the kernel is monolithic poses a problem because when
+  code needs to be added to the kernel in the form of <i>a kernel
+  module</i>, such code has full access to the entire computer
+  system.  This universal access represents a security risk, of
+  course, but more commonly, it can be <i>defective</i> and then it
+  will <i>fail</i> often by crashing the entire computer.
+</p>
+
+<p>
+  We have had solutions to this problem for many decades.  The Multics
+  system, for example, did not have a kernel at all.  An interrupt or
+  a system call was executed by the user-level process that issued the
+  system call or that happened to be executing when the interrupt
+  arrived.  The code that executed then was not part of a monolithic
+  kernel, but existed as independent programs that could be added or
+  replaced without restarting the system.  The system could still
+  crash, of course, if some essential system-wide data structure was
+  corrupted, but most of the time, only the user-level process that
+  issued the request would crash.
+</p>
+
+<H3>Monolithic applications</H3>
+
+<p>
+  Applications in current operating systems are written in low-level
+  languages such as C or C++.  An application is built using
+  techniques from more than half a century ago where source code is
+  compiled to <i>object code</i> and then <i>linked</i> to produce
+  an <i>executable file</i> meant to run in its own
+  dedicated <i>address space</i>.
+</p>
+
+<p>
+  Aside from system calls, all code in an application is run in one
+  single address space.  Together with the fact that low-level
+  languages are used, this organization makes the application
+  vulnerable to <i>viruses</i> and other security-related attacks.  A
+  typical attack exploits the vulnerability to <i>buffer overflow</i>
+  which is due to the fact that the programming language used to write
+  the application does not insert boundary checks for arrays,
+  requiring the programmer to do that with explicit code, which is
+  therefore frequently not done.
+</p>
+
+<p>
+  A buffer overflow in such an application can be exploited in order
+  to modify the execution of the program so that code that was not
+  intended by the application writer is executed in place of the
+  intended application code.  Such modification is possible because
+  the execution stack is part of the application address space, and
+  the execution stack contains addresses of code to be executed later,
+  so that the application has direct access to these code addresses.
+</p>
+
+<p>
+  In a Lisp operating system, the stack is not accessible to
+  application code.  It is therefore not possible to alter addresses
+  on the stack representing code to be executed later.  Furthermore,
+  the programming language automatically checks boundaries of arrays,
+  so that buffer overflows are not possible.
+</p>
+
+<p>
+  An application in a Lisp operating system is not built as a
+  monolithic executable meant to execute in its own address space.
+  Instead, an application consists of a large number of objects whose
+  addresses are protected by the system and not directly accessible to
+  application code.  The most common techniques for security attacks
+  are therefore not possible in such a system.
+</p>
+
+<H2>Objectives for a Lisp operating system</H2>
+
+<p>
+  The three main objectives of a Lisp operating system correspond to
+  solutions to the two main problems with exiting systems as indicated
+  in the previous section.
+</p>
+
+<H3>Single address space</H3>
+
+<p>
+  Instead of each application having its own address space, we propose
+  that all applications share a single large address space.  This way,
+  applications can share data simply by passing pointers around,
+  because a pointer is globally valid, unlike pointers in current
+  operating systems.
+</p> 
+
+<p>
+  Clearly, if there is a single address space shared by all
+  applications, there needs to be a different mechanism to
+  ensure <i>protection</i> between them so that one application can
+  not intentionally or accidentally destroy the data of another
+  application.  Most high-level programming languages (in particular
+  Lisp, but also Java, and many more) propose a solution to this
+  problem by simply not allowing users to execute arbitrary machine
+  code.  Instead, they allow only code that has been produced from the
+  high-level notation of the language and which excludes arbitrary
+  pointer arithmetic so that the application can only address its own
+  data.  This technique is sometimes called "trusted compiler".  
+</p>
+
+<p>
+  It might sometimes be desirable to write an application in a
+  low-level language like C or even assembler, or it might be
+  necessary to run applications that have been written for other
+  systems.  Such applications could co-exist with the normal ones, but
+  they would have to work in their own address space as with current
+  operating systems, and with the same difficulties of communicating
+  with other applications.  
+</p>
+
+<H3>Object store based on tags</H3>
+
+<p>
+  Instead of a hierarchical file system, we propose an <i>object
+    store</i> which can contain any objects.  If a file (i.e. a
+  sequence of bytes) is desired, it would be stored as an array of
+  bytes.
+</p>
+
+<p>
+  Instead of organizing the objects into a hierarchy, objects in the
+  store can optionally be associated with an arbitrary number
+  of <i>tags</i>.  These tags are <i>key/value</i> pairs, such as for
+  example the date of creation of the archive entry, the creator (a
+  user) of the archive entry, and the <i>access permissions</i> for
+  the entry.  Notice that tags are not properties of the objects
+  themselves, but only of the archive entry that allows an object to
+  be accessed.  Some tags might be derived from the contents of the
+  object being stored such as the <i>sender</i> or the <i>date</i> of
+  an email message.  It should be possible to accomplish most searches
+  of the store without accessing the objects themselves, but only the
+  tags.  Occasionally, contents must be accessed such as when a raw
+  search of the contents of a text is wanted. 
+</p>
+
+<p>
+  It is sometimes desirable to group related objects together as
+  with <i>directories</i> of current operating systems.  Should a user
+  want such a group, it would simply be another object (say instances
+  of the class <tt>directory</tt>) in the store.  Users who can not
+  adapt to a non-hierarchical organization can even store such
+  directories as one of the objects inside another directory.
+</p>
+
+<p>Here are some examples of possible keyword/value pairs, how they
+  might be used, and what kinds of values are permitted:</p>
+
+<table border="1">
+  <tr>
+    <td>
+      Keyword
+    </td>
+    <td>
+      Possible values
+    </td>
+  </tr>
+  <tr>
+    <td>
+      <b>category</b>
+    </td>
+    <td>
+      The nature of the object such
+      as <b>movie</b>, <b>music</b>, <b>article</b>, <b>book</b>, <b>user
+      manual</b>, <b>dictionary</b>, <b>course</b>, <b>lecture</b>,
+      <b>recipe</b>, <b>program</b>, <b>bank statement</b>,
+      <b>email</b>.  These would be chosen from an
+      editable set that is defined per user.
+    </td>
+  </tr>
+  <tr>
+    <td>
+      <b>name</b>
+    </td>
+    <td>
+      A string that is displayed with the object, such as "A Dramatic
+      Turn of Events", "Three seasons", "Alternative energy".
+    </td>
+  </tr>
+  <tr>
+    <td>
+      <b>author</b>
+    </td>
+    <td>
+      An object identifying a person, an organization, a company,
+      etc. 
+    </td>
+  </tr>
+  <tr>
+    <td>
+      <b>genre</b>.  Can be used for movies, music albums, programs,
+      articles, etc. 
+    </td>
+    <td>
+      <b>progressive
+      metal</b>, <b>science</b>, <b>algorithms</b>, <b>garbage
+      collection</b>, <b>game</b>, <b>programming language
+      implementation</b>, <b>operating system</b>.  These would be
+      chosen from an editable set that is defined per user.
+    </td>
+  </tr>
+  <tr>
+    <td>
+      <b>format</b>
+    </td>
+    <td>
+      This tag can be used to identify the file type of documents such
+      as <b>PDF</b>, <b>ogg/vorbis</b>, <b>MPEG4</b> <b>PNG</b>, in
+      which case the tag can be assigned automatically, but also to
+      identify the source format of files in a directory containing
+      things like articles or user manuals, for
+      example <b>LaTeX</b>, <b>Texinfo</b>, <b>HTML</b>.  These would
+      be chosen from an editable set that is defined per user.
+    </td>
+  </tr>
+  <tr>
+    <td>
+      <b>date of creation</b>
+    </td>
+    <td>
+      A date interval.
+    </td>
+  </tr>
+  <tr>
+    <td>
+      <b>composer</b>.  Used for music.
+    </td>
+    <td>
+      An object representing a person.  On a compilation album there
+      can be more than one tag of this kind.
+    </td>
+  </tr>
+  <tr>
+    <td>
+      <b>language</b>.
+    </td>
+    <td>
+      An object representing a natural language such
+      as <b>English</b>, <b>Vietnamese</b>, or a programming languages
+      such as <b>Lisp</b>, <b>Python</b>. These would
+      be chosen from an editable set that is defined per user.  If
+      appropriate, a document can have several of these tags, for
+      instance if some program uses multiple programming languages, or
+      if a document is written using several languages, such as a
+      dictionary. 
+    </td>
+  </tr>
+  <tr>
+    <td>
+      <b>duration</b>. Can be used for things like movies or music
+      albums. 
+    </td>
+    <td>
+      An object representing a duration. 
+    </td>
+  </tr>
+  <tr>
+    <td>
+      <b>source control</b>.  Can be used for any documents that use
+      source control such a programs, etc.
+    </td>
+    <td>
+      <b>GIT</b>, <b>SVN</b>, <b>CVS</b>, <b>darks</b>, etc.  These
+      would be chosen from an editable set that is defined per user.
+    </td>
+  </tr>
+  <tr>
+  </tr>
+</table>
+
+<p>
+  When (a pointer to) an object is returned to a user as a result of a
+  search of the object store, it is actually similar to what is called
+  a "capability" in the operating-system literature.  Such a
+  capability is essentially only a pointer with a few bits indicating
+  what <i>access rights</i> the user has to the objects.  Each creator
+  may interpret the contents of those bits as he or she likes, but
+  typically they would be used to restrict access, so that for
+  instance executing a <i>reader</i> method is allowed, but executing
+  a <i>writer</i> method is not.
+</p>
+
+<H3>Single memory abstraction</H3>
+
+<p>
+  Instead of two different memory abstractions (primary and
+  secondary), the Lisp operating system would contain a single
+  abstraction which looks like any interactive Lisp system, except
+  that data is permanent.
+</p>
+
+<p>
+  Since data is permanent, application writers are encouraged to
+  provide a sophisticated <i>undo</i> facility.  
+</p>
+
+<p>
+  The physical main (semiconductor) memory of the computer simply acts
+  as a <i>cache</i> for the disk(s), so that the address of an object
+  uniquely determines where on the disk it is stored.  The cache is
+  managed as an ordinary <i>virtual memory</i> with existing
+  algorithms. 
+</p>
+
+<H3>Other features</H3>
+
+<H4>Crash proof (maybe)</H4>
+
+<p>
+  There is extensive work on crash-proof systems, be it operating
+  systems or data base systems.  In our opinion, this work is
+  confusing in that the objective is not clearly stated.
+</p>
+
+<p>
+  Sometimes the objective is stated as the desire that no data be lost
+  when power is lost.  But the solution to that problem already exists
+  in every laptop computer; it simply provides a <i>battery</i> that
+  allow the system to continue to work, or to be <i>shut down</i> in a
+  controlled way. 
+</p>
+
+<p>
+  Other times, the objective is stated as a protection against
+  defective software, so that data is stored at regular intervals
+  (checkpointing) perhaps combined with a <i>transaction log</i> so
+  that the state of the system immediately before a crash can always
+  be recovered.  But it is very hard to protect oneself against
+  defective software.  There can be defects in the checkpointing code
+  or in the code for logging transactions, and there can be defects in
+  the underlying file system.  We believe that it is a better use of
+  developer time to find and eliminate defects than to aim for a
+  recovery as a result of existing defects.
+</p>
+
+<H4>Multiple simultaneous environments</H4>
+
+<p>
+  To allow for a user to add methods to standard generic functions
+  (such as <tt>print-object</tt>) without interfering with other
+  users, we suggest that each user gets a different <i>global
+  environment</i>.  The environment maps <i>names</i>
+  to <i>objects</i> such as functions, classes, types, packages, and
+  more.  Immutable objects (such as the <tt>common-lisp</tt> package)
+  can exist in several different environments simultaneously, but
+  objects (such as the generic function <tt>print-object</tt> would be
+  different in different environments.
+</p>
+
+<p>
+  Multiple environments would also provide more safety for users in
+  that if a user inadvertently removes some system feature, then it
+  can be recovered from a default environment, and in the worst case a
+  fresh default environment could be installed for a user who
+  inadvertently destroyed large parts of his or her environment. 
+</p>
+
+<p>
+  Finally, multiple environments would simplify experimentation with
+  new features without running the risk of destroying the entire
+  system.  Different versions of a single package could exist in
+  different environments. 
+</p>
+
+<H2>How to accomplish it</H2>
+
+<p>
+  The most important aspect of a Lisp operating system is not that all
+  the code be written in Lisp, but rather to present a Lisp-like
+  interface between users and the system and between applications and
+  the system.  It is therefore legitimate to take advantage of some
+  existing system (probably Linux or some BSD version) in order to
+  provide services such as device drivers, network communication,
+  thread scheduling, etc. 
+</p>
+
+<H3>Create a Lisp system to be used as basis</H3>
+
+<p>
+  The first step is to create a Common Lisp system that can be used as
+  a basis for the Lisp operating system.  It should already allow for
+  multiple environments, and it should be available on 64-bit
+  platforms.  Preferably, this system should use as little C code as
+  possible and interact directly with the system calls of the
+  underlying kernel.
+</p>
+
+<H3>Create a single-user system as a Unix process</H3>
+
+<p>
+  The next step is to transform the Common Lisp system into an
+  operating system in the sense of the API for users and
+  applications.  This system would contain the object store, but
+  perhaps not access control functionality.
+</p>
+
+<p>
+  When this step is accomplished, it is possible to write or adapt
+  applications such as text editors, inspectors, debuggers, GUI
+  interface libraries, etc. for the system.
+</p>
+
+<H3>Create device drivers</H3>
+
+<p>
+  The final step is to replace the temporary Unix kernel with native
+  device drivers for the new system and to turn the system into a full
+  multi-user operating system.
+</p>
+
+<HR>
+<address>
+robert.strandh@gmail.com
+</address>
+</BODY>
+</HTML>
diff --git a/random/nh.html b/random/nh.html
new file mode 100644
index 0000000..652e591
--- /dev/null
+++ b/random/nh.html
@@ -0,0 +1,94 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" lang="en">
+	<head>
+		<title>New Hampshire's Software Freedom Legislation</title>
+		<link rel="stylesheet" href="/favor.css" />
+	</head>
+	<body>
+		<div id="main">
+			<h1>Please support the Free Software Movement.  The state of New Hampshire may be incorporating software freedom into its law.</h1>
+			<p>Jan 13, 2022.</p>
+			<p>This article is incomplete.  The original article which I based this off is at <a href="https://libreboot.org/news/usa-libre.html">https://libreboot.org/news/usa-libre.html</a> by Leah Rowe.  This article is a "fork" of that article and contains parts of it.  Thanks to everybody who contributed to this event and supports software freedom.  I'd recommend reading the original one, too.</p>
+			<div id="majornote">	
+				<p>For the general public:  In this article, I explain what's happening in New Hampshire, why software freedom matters to you and the society in general, and what you could do to help us in this battle.</p>
+				<p>For supporters of the free software movement:  Please read this.  As far as I know, this is the first time software freedom as we know it is proposed as a bill for law.  Thank you so much.</p>
+			</div>
+			<p><a href="https://www.fsf.org/about/what-is-free-software">Free software</a> is software that gives you the user the freedom to share (original or modified), study and modify it.  Copyleft is a copyright-based method at preventing people from turning free software into proprietary software.</p>
+			<p>Since the beginning of the free software movement, we've been advocating for the use of free software.  Showing people the freedom (and power) they have in GNU/Linux and the BSDs, many power users replaced nonfree software with free software.  Now, at least 90% of servers worldwide run <a href="https://gnu.org">GNU/Linux</a>.  My personal one runs <a href="https://OpenBSD.org">OpenBSD</a>.</p>
+			<p>But ultimately, it's <em>the people</em> who use software.  Not every user knows how to fiddle around with computers, not every user can take individual advantage of the freedom to study and change the software.  Along with the lack of advertising, we've been alive&mdash;but invisible to the public.</p>
+			<p>The use of proprietary software in government and social activities, especially mandatory tasks, by law or social, such as <a href="https://lists.libreplanet.org/archive/html/libreplanet-discuss/2021-10/msg00011.html">educatioon</a> and medical services, including <a href="https://lists.libreplanet.org/archive/html/libreplanet-discuss/2021-08/msg00008.html">COVID vaccination</a>, and especially <a href="https://www.fsf.org/bulletin/2020/spring/trial-by-proprietary-software">trial in courts with proprietary software</a>, are unjust because by fulfilling these responsibilities, as defined by law, we are giving up essential freedoms, defined but unprotected by law, which can be avoided.</p>
+			<p>If you live in New Hampshire or in one of the neighbouring states, especially Massachusetts, please listen up! If you are further away and unable to reach New Hampshire all that easily, please spread the following news anyway. It's important. As alien as it may seem to many of the readers, I'm actually writing parts of this article as though someone who has never heard of Free Software is reading it, because I expect precisely that such people <em>will</em> read this particular article.</p>
+			<div class="h"><h2 id="whats-happening-in-new-hampshire">What's happening in New Hampshire?</h2></div>
+			<p>An important bill is being proposed in New Hampshire, which would enshrine much of what we know as Free Software <em>into law</em>. Here is the proposed bill, technically named "HB1273":<br />
+				<a href="https://gencourt.state.nh.us/bill_status/legacy/bs2016/billText.aspx?sy=2022&amp;id=1363&amp;txtFormat=html" class="uri">https://gencourt.state.nh.us/bill_status/legacy/bs2016/billText.aspx?sy=2022&amp;id=1363&amp;txtFormat=html</a></p>
+			<p>You can read it for yourself, but here is a paraphrasing of what it proposes:</p>
+			<ul>
+				<li><em>Specifically</em> bans state-run websites from serving non-free javascript to clients</li>
+				<li>Creates a commission to provide oversight, watching the use of Free Software by state agencies</li>
+				<li>Bans state agencies from using proprietary software - maybe this could include schools, in the future!</li>
+				<li>If a person is tried in a criminal case, they have the right to audit the source code of any proprietary software that collects evidence against them</li>
+				<li>Encourages data portability (able to transfer data from one program to another)</li>
+				<li>Bans certain non-compete clauses and NDAs (non-disclosure agreements) pertaining to Free Software projects</li>
+				<li>Bans state/local law enforcement from assisting with the enforcement of copyright claims against Free Software projects</li>
+				<li>Bans state agencies from purchasing non-free software if free software exists, for a given task</li>
+			</ul>
+			<p>However, this is only a short summary. You are advised to read the bill in detail. It's not very long.</p>
+			<p>At first glance, it may not seem that the bill affects individuals, but don't be fooled; this is a hugely positive step forward for everyone! If the state is using Free Software, that most likely means it'll be used in education aswell.</p>
+			<p>Although perhaps not immediately and readily apparent, this is a stake in the heart of proprietary software's current dominance, because it would remove one key element of its attack against us; its abuse of education services.</p>
+			<p>If education services are using Free Software, that means they'll probably have children (the ones being educated) using it too. This is a <em>huge</em> step, and it will result in more Free Software developers in the future. Free Software will become more and more mainstream to the masses, which can surely only be a good thing!</p>
+			<p>Freedom is always superior. The more people that have it, the better off we all are, because freedom is also collective; it relies on others around us also having it, so that we can defend each other. We fought for our rights before, when we founded modern nations&mdash;democracies&mdash;so that we the people have inalienable rights of our own, our basic human rights, and not to have dictatorships and monarchs who may violate them.  Slowly, subtlely, but very effectively, proprietary software is taking away the freedoms we always fought for.  What we fought for, for seven centuries, would be gone in the matter of decades.  If more people have it, especially if it results in more Free Software developers in the future, that's one thing, but imagine if <em>more</em> states like what they see and start to copy the new legislation.</p>
+			<p>Now imagine that countries besides the US start doing it, inspired by the US's success (and I think it will be a resounding success).</p>
+			<p>Imagine a world where <a href="https://www.gnu.org/philosophy/free-sw.html">Free Software</a>, free as in freedom, is the default everywhere. Imagine a world where <a href="https://www.gnu.org/licenses/license-list.html">Free Software licensing</a> is required reading material in schools. <em>Imagine a world where any five year old can install a free operating system such as GNU+Linux, and Computer Science is mandatory in schools from a young age. Imagine filing your tax returns with Free Software, exclusively. Imagine not even thinking about that, because it became the norm.</em></p>
+			<p><em>Imagine a world where proprietary software doesn't exist, because it is obsolete; entire generations of people are taught to value freedom, and to staunchly defend it, helping each other learn and grow (and produce better software in the process, with less bugs, because people are now free to do that, without relying on some evil company).</em></p>
+			<p>Imagine a world where you're no longer being spied on because NSA, Apple and Microsoft no longer have backdoor access to your computer. <em>Imagine having the ability to say no, because that's what freedom is. Try to imagine it!</em></p>
+			<p>Free Software is a revolution that we in the Free Software movement have rigorously upheld and fought for, over many years, but we still face an uphill battle because children are not taught in schools about free computing, nor are they encouraged to learn; they are taught to view computers as <em>products</em> to throw away every 1-2 years, that they can run a few <em>apps</em> on but otherwise are not allowed to do anything with. The <em>concept</em> of a <em>general purpose, fully reprogrammable computer</em> is heavily suppressed in mainstream culture. <em>Most</em> people in the world do not run a free operating system; the idea of a computer being a mere <em>appliance</em> is normalized (as opposed to the idea of it being a highly liberating tool for development and the expansion of human knowledge).</p>
+			<p><em>This</em> is what we in the Free Software movement have fought for over the years. We believe that knowledge is a human right, that the ability to share, study, learn, adapt and modify the software is an inalienable right that everyone must have. <a href="https://www.gnu.org/philosophy/free-sw.html">The four freedoms are absolute.</a></p>
+			<p>One of our biggest problem has been simply that schools and governments do not teach people about free computing. The right to learn, the right to read and the right to hack. Our governments are made up of human beings just like you or me, and they can be bought/corrupted; Microsoft, Apple and many others (such as IBM) have done this for years, having the national infrastructures governing us run on their proprietary systems, instead of systems that respect freedom; it is essential that these systems run free software, because a free and democratic society should expect nothing less. Those companies buy influence <em>and they own your politicians</em>.</p>
+			<p>All of this could change very soon. Something is happening in New Hampshire, which could redefine our movement and give <em>free software</em> real power instead.</p>
+			<div class="h"><h2 id="how-to-help">HOW TO HELP</h2></div>
+			<div class="h"><h3 id="testify-in-support-of-the-bill">TESTIFY IN SUPPORT OF THE BILL</h3></div>
+			<p><strong>The reading of the bill is happening on 11 January 2022. This is when you should go to New Hampshire.</strong></p>
+			<p><strong>Location of hearing: Legislative Office Building in Concord, New Hampshire:<br />
+					<a href="https://en.wikipedia.org/wiki/New_Hampshire_Legislative_Office_Building" class="uri">https://en.wikipedia.org/wiki/New_Hampshire_Legislative_Office_Building</a></strong></p>
+			<p>The organizer of the proposed bill, <em>Eric Gallager</em>, has left instructions on Twitter. The following is a <em>nitter</em> link, which lets you view the relevant Twitter thread without running non-free Javascript in your browser:<br />
+				<a href="https://nitter.net/cooljeanius/status/1479663133207764992" class="uri">https://nitter.net/cooljeanius/status/1479663133207764992</a></p>
+			<p>The original Twitter URL is:<br />
+				<a href="https://twitter.com/cooljeanius/status/1479663133207764992" class="uri">https://twitter.com/cooljeanius/status/1479663133207764992</a></p>
+			<p>Further instructions for what room to go to, when you get there:<br />
+			</p>
+			<p>See Nitter link:<br />
+				<a href="https://nitter.net/cooljeanius/status/1479062316532604930" class="uri">https://nitter.net/cooljeanius/status/1479062316532604930</a></p>
+			<p>(original twitter link: <a href="https://twitter.com/cooljeanius/status/1479062316532604930" class="uri">https://twitter.com/cooljeanius/status/1479062316532604930</a>)</p>
+			<p><strong>Please read both threads very carefully!</strong></p>
+			<p><strong>YOU NEED TO GO TO NEW HAMPSHIRE IN PERSON!</strong></p>
+			<p>If you're able to go to New Hampshire to attend the reading of the bill, please do so! Voice your support of the bill, and say why you think it's important.</p>
+			<p>Tell the lawmakers that you demand freedom!</p>
+			<p>This thread on Twitter is where Eric announced that the reading of the bill is to proceed (original Twitter URL):<br />
+				<a href="https://twitter.com/cooljeanius/status/1479555737223413760" class="uri">https://twitter.com/cooljeanius/status/1479555737223413760</a></p>
+			<div class="h"><h3 id="more-statescountries-will-follow">More states/countries will follow</h3></div>
+			<p>If this bill is passed in New Hampshire, more states will likely follow. It will lead to a massively renewed drive to liberate all computer users, and US laws tend to be copied/pasted around the world too.</p>
+			<p>This bill, if passed, will have a hugely positive impact on Free Software at a global level.</p>
+			<p>You <em>must</em> support this bill. If you want to see it pass, please go to New Hampshire on 11 January 2022 to make sure your voice is heard.</p>
+			<div class="h"><h3 id="our-enemies-will-be-there">OUR ENEMIES WILL BE THERE</h3></div>
+			<p>The <em>proprietary</em> software companies like Microsoft and Apple will also be there, trying to argue the case <em>against</em> the use of Free Software.</p>
+			<p>There is already precedent; please watch this video, which shows how Microsoft (for example) might behave in the reading of the bill. This video is from a discussion within the European Union, several years ago:<br />
+				<a href="https://vid.puffyan.us/watch?v=W_S0k1sx8EM" class="uri">https://vid.puffyan.us/watch?v=W_S0k1sx8EM</a> (invidious link. works without javascript enabled, if you wish)</p>
+			<p>They will try to trick the law makers by claiming things such as:</p>
+			<ul>
+				<li><strong>"Free software is insecure / you will get hacked"</strong> - nothing could be further from the truth! Free operating systems such as GNU+Linux, FreeBSD and especially OpenBSD, are among the most secure operating systems available.</li>
+				<li><strong>"Free software is used by criminal hackers"</strong> - here, they use the term <em>hacker</em> to describe someone who illegally gains access to someone elses computer. Don't fall for it. Maintainers of free operating systems like GNU+Linux distros or the BSDs are actively working to make the internet and computers in general <em>more secure</em></li>
+				<li><strong>"Software authors deserve to be paid!"</strong> - In fact, many free software devs are <em>paid</em> to work on Free Software! Many companies, including big ones, work on it. There are also hobbyists or otherwise unpaid people, who might work on Free Software for a number of reasons (wanting to make the world a better place, wanting the glory of recognition for solving a major problem, and more often than not, simply because <em>it is fun to do so and you make a lot of friends too!</em>) - No, these companies (e.g. Microsoft) are only arguing in reality for the ability to pay their <em>shareholders</em>, and they control the software exclusively. In fact, free software has repeatedly and consistently over the years <em>defined</em> the computing industry, creating all kinds of new employment opportunities; for example, docker is widely used today and it is free software, used by millions of companies for commercial gain, and the apache web server revolutionized the web back in the day, enabling lots of ISPs to easily host websites - many of the common protocols that we depend upon today, that businesses depend upon (and get paid to maintain or provide services/support for) are in fact free as in freedom!</li>
+				<li><strong>"Developers should get recognition for their work"</strong> - in free software, you can easily make a name for yourself with relatively few resources except your own computer and an internet connection, plus some cheap hosting. When most developers work on <em>proprietary</em> software such as Windows, they don't get recognition; their copyright is assigned to their employer (e.g. Microsoft) who will take all the credit!</li>
+				<li><strong>"Free software is unreliable / costly to maintain"</strong> - actually, it has been well known for years that free software is generally more stable and reliable than proprietary. In cases where it isn't, it is quickly improved, and in complete freedom. Free software has a lower cost to maintain and service, and you have a free market where you can choose who you hire to write/maintain it for you (if you won't do that yourself); meanwhile, proprietary software such as Windows is often full of bugs, crashes often and there is only one provider of support most of the time, who will charge a heavy price, while also charging a lot of money for the software itself - free software is <em>free as in freedom</em>, but also usually <em>free as in zero price</em>.</li>
+				<li><strong>"Free software comes from potentially untrustworthy sources"</strong> - This is pure nonsense, because the very freedoms provided by free software (access to source code, ability to work on it yourself, and see what others did) means that people generally do not add malware to public software sources, because they'd be discovered instantly. <em>Distributions</em> of GNU+Linux and other free operating systems are often maintained by many people, who verify the safety of each software package that they provide; they are also usually provided by each <em>distro</em>, in a central repository unlike with, say, Windows where you really <em>are</em> randomly executing binaries from all kinds of locations (often even without checking the cryptographic checksums of those files, to verify their integrity). It's very hard to become infected with malware on a free system, precisely because security is handled much better; the design of unix-like operating systems in particular is also naturally more secure, due to better separation of root/user privileges.</li>
+				<li><strong>"Free software isn't controlled, and is unknown."</strong> - this is completely false. These non-free software companies are only talking about <em>their</em> control, and it's quite telling that they completely disregard yours, in this very sentence. In fact, Free Software <em>is</em> controlled, but it's not controlled by some external entity; <em>your</em> installation of free software is controlled by <em>you</em>.</li>
+			</ul>
+			<p>If you're familiar with the <em>Matrix</em> films, proprietary operating systems like Windows/MacOS are basically like the Matrix; bland, no individuality, no independent thought, everything tightly controlled. By contrast, free operating systems (such as GNU+Linux distributions or the BSDs) are like zion/io; vibrant, full of life, buzzing with activity, everything loose and free, and everyone is different (a highly diverse culture of people from all walks of life, acting in common cause but nonetheless individuals).</p>
+			<p>Meanwhile, Windows is known to have backdoors. Microsoft actively informs the NSA about how to exploit them, so that it can break into people's computers and steal private data.</p>
+			<p>Proprietary software companies are evil, and must be opposed. They know that if this bill passes, their days are numbered.</p>
+			<p>Defend freedom! Don't listen to any of the arguments against it by proprietary software companies; they don't care about you, and instead only care about profit. They fundamentally do not want you to have any sort of freedom over your own computer, and they actively pursue tactics (such as DRM) to thwart you.</p>
+			<p>Microsoft and Apple are not your friends. There is no such thing as the Windows community. When you use proprietary systems, you are isolated from everyone around you, and so are they. <em>You</em> are the product, for the non-free software to exploit at the behest of their developers who only care about <em>money</em>.</p>
+			<p>However, there <em>is</em> such a thing as the Free Software community. It is a vibrant community, consisting of millions of people collectively all over the world, and they are all free to work with each other infinitely. It gave us most of the technology that we take for granted today, including <em>the modern internet, where ISPs run free software almost exclusively!</em></p>
+		</div>
+	</body>
+</html>