John Cowan:
"Between each" has been part of Standard English for a thousand years, and
still is today.
====
As in between each pair of elements, or between each element?
The latter strikes me rather like the currently-in-vogue phrase
`one of the only': it may have a defined meaning, but it sure
sounds distractingly stupid. (If it's one of the group at all,
it's by definition one of the only members; if what is meant is
one of the few, then say so, dammit.)
It's rather like obfuscated C, or nearly any use of Perl: sure,
you can write it to require extra mental effort to make sense of
it, but there are simpler ways to be rude.
Norman Wilson
Toronto ON
Please, sir, I'd like to join The Few.
I'm sorry, there are far too many.
Apropos of "finding the right exposition"!, consider the cited wiki article:
Separator: There is a symbol between each element.
The more carefully you read this the more it becomes nonsense.
1, "Each element" is an individual. You can't put something between an
individual.
2 The defining sentence states a property of a representation of a
sequence. It fails to indicate that "separator" is the symbol's role.
In fact what's being defined is "separator notation", not the bare
word "separator". This usage appears only later in the article. It
should be employed throughout--most importantly in the title and the
definition. The same goes for "terminator".
Doug
> Doug, if you insist on applying your superb editing skills on wiki material, we will never hear from you again!
Thanks, Bill, for the wise advice. If I'm putting out stuff like this
you shouldn't hear from me again.
Apologies for again(!) posting to the wrong mailing list.
Doug
Hello All,
I am attempting to restore 4.3BSD-Tahoe to a usable state on the VAX. It
appears, based on the work that I have done already, that this is
possible. Starting with stock 4.3BSD I got a source tree into /usr/tahoe
and using it I replaced all of /usr/include and /sys, recompiled and
replaced /bin, /lib, and /etc, recompiled a GENERIC kernel, and from there
I was able to successfully reboot using the new kernel. As far as I can
tell (fingers crossed!) the hardest part is over and I'm in the process of
working on /usr.
My question is: how was this sort of thing done in the real world? If I
was a site running stock 4.3BSD, would I have received (or been able to
request) updated tapes at regular intervals? The replacement process that
I have been using is fairly labor intensive and on a real VAX would have
been very time intensive too. Fortunately two to three years' worth of
changes were not so drastic that I ever found myself in a position where
the existing tools were not able to compile pieces of Tahoe that I needed
to proceed, but I could easily imagine finding myself in such a place.
(This was, by the way, what I ran into when attempting to upgrade from
2.9BSD to 2.10BSD, despite a fully documented contemporary upgrade
procedure).
-Henry
I can't speak to the evolution and use of specific
groups; I suspect it was all ad-hoc early on.
Groups appeared surprisingly late (given how familiar
they seem now): they don't show up in the manual
until the Sixth Edition. Before that, chown took
only two arguments (filename and owner), and
permission modes had three bits fewer.
I forget how it came up, but the late Lee McMahon
once told me an amusing story about their origin:
Ken announced that he was adding groups.
Lee asked what they were for.
Ken replied with a shrug and `I dunno.'
Norman Wilson
Toronto ON
Groups appeared surprisingly late (given how familiar
they seem now): they don't show up in the manual
until the Sixth Edition.
Mea culpa; read too hastily. The change actually
came with the Fourth Edition, at the same time as
several other landmark system changes:
-- Time changing from a 32-bit count of 60Hz clock
ticks (which ran out so quickly that its epoch kept
moving) to the modern 32 bits of whole seconds, based
at 1970-01-01T00:00:00 GMT (which takes much longer
to run out, though the horizon is now visible).
-- The modern super-block. In 4/e, the super-block
began at block 0, not 1 (so bootstrapping was rather
more complicated); the free list was a bitmap rather
than the later list of blocks containing lists of
free block numbers.
-- The super-block contained a bitmap of free
i-numbers too. All told, the free block and free
i-node map made up a 1024-byte super-block.
-- I-numbers 1-40 were device files; the root
directory was i-number 41. The only file-type
indication in the mode word was a single bit to
denote directory.
It was already clear that the lifetime of the
bitmaps was running out: the BUGS section says
two blocks isn't enough for the bitmaps for a
20-megabyte RP02.
Norman Wilson
Toronto ON
Hi all,
I was reading a recent thread, over on the FreeBSD forums about groups that quickly devolved into a discussion on the origin of the operator group:
https://forums.freebsd.org/threads/groups-overview.82303/
I thought y’all would be the best place to ask the questions that arose in me during my read of the thread.
Here they are in no special order:
1. Where did operator come from and what was it intended to solve?
2. How has it evolved.
3. What’s a good place to look/ref to read about groups, generally?
I liked one respondent’s answer about using find, heir, and the files themselves to learn about groups being used in a running system, paying attention to the owner, Audi, etc along the way and this is how I do it now, but this approach doesn’t account for the history and evolution.
Thanks!
Willu
Sent from my iPhone
Greg wrote:
> I guess pipe(2) kind of started this mess, [...] Maybe I'm
> going to far with thinking pipe() could/should have just been a library
> call that used open(2) internally, perhaps connecting the descriptors by
> opening some kind of "cloning" device in the filesystem.
At times I’ve been pondering this as well. All of creat/open/pipe could have been rolled into just open(). It is not clear to me why this synthesis did not happen around the time of 7th edition; although it seems the creat/open merger happened in BSD around that time.
As to pipe(), the very first implementation returned just a single fd where writes echoed to reads. It was backed by a single disk buffer, so could only hold ~500 bytes, which was probably not enough in practice. Then it was reimplemented using an anonymous file as backing store and got the modern two fd system call. The latter probably arose as a convenient hack to store the two file pointers needed.
It would have been possible to implement the anonymous file solution still using a single fd, and storing the second file pointer in the inode. Maybe this felt as a worse hack at the time (the conceptual split in vnode / inode was still a decade into the future.)
With a single fd, it would also have been possible to have a cloning device for pipe’s as you suggest (e.g. /dev/pipe, somewhat analogous to the implementation of /dev/stdin in 10th edition). Arguably, in total code/data size this would not have been much different from pipe().
My guess is that from a 1975 perspective, creat/open/pipe was not perceived as something that needed fixing.
Dan wrote:
> 3BSD and I think 4.1BSD had vread() and vwrite(), which looked like
> regular read() and write() but accessed pages only on demand. I was a
> grad student at Berkeley at the time and remember their genesis. Bill
> and I were eating lunch from Top Dog on the Etcheverry Hall plaza, and
> were talking about memory-mapped I/O. I remember suggesting the actual
> names, perhaps as a parallel to vfork(). I had used both TENEX and
> Multics, which both had page mapping. Multics' memory-mapped segments
> were quite fundamental, of course. I think we were looking for something
> vaguely upward compatible from the existing system calls. We did not
> leap to an mmap() right away just because it would have been a more
> radical shift than continuing the stream orientation of UNIX. I did not
> implement any of this: it was just a brainstorming session.
Thank you for reminding me of these.
On a substrate with a unified buffer cache and copy-on-write, vread/vwrite would have been very close to regular read/write and maybe could have been subsumed into them, using flags to open() as the differentiator. The user discernible effect would have been the alignment requirement on the buffer argument.
John Reiser wrote that he "fretted” over adding a 6 argument system call. Perhaps he was considering something like the above as the alternative, I never asked.
I looked at the archives and vread/vwrite were introduced with 3BSD, present in 4BSD but marked deprecated, and absent from 4.1BSD. This short lifetime suggests that using vread and vwrite wasn’t entirely satisfactory in 1980/81 practice. Maybe the issue was that there was no good way to deallocate the buffer after use.
Hello,
I've recently started to implement a set of helper functions and
procedures for parsing Unix-like command-line interfaces (i.e., POSIX +
GNU-style long options, in this case) in Ada.
While doing that, I learned that there is a better way to approach
this problem – beyond using getopt(s) (which never really made sense to
me) and having to write case statements in loops every time: Define a
grammar, let a pre-built parser do the work, and have the parser
provide the results to the program.
Now, defining such a grammar requires a thoroughly systematic approach
to the design of command-line interfaces. One problem with that is
whether that grammar should allow for sub-commands. And that leads to
the question of how task-specific tool sets should be designed. These
seem to be a relatively new phenomenon in Unix-like systems that POSIX
doesn't say anything about, as far as I can see.
So, I've prepared a bit of a write-up, pondering on the pros and cons
of two different ways of having task-specific tool sets
(non-hierarchical command sets vs. sub-commands) that is available at
https://www.msiism.org/files/doc/unix-like_command-line_interfaces.html
I tend to think the sub-command approach is better. But I'm neither a UI
nor a Unix expert and have no formal training in computer things. So, I
thought this would be a good place to ask for comment (and get some
historical perspective).
This is all just my pro-hobbyist attempt to make some people's lives
easier, especially mine. I mean, currently, the "Unix" command line is
quite a zoo, and not in a positive sense. Also, the number of
well-thought-out command-line interfaces doesn't seem to be a growing
one. But I guess that could be changed by providing truly easy ways to
make good interfaces.
--
Michael