In 1990, I wrote (what you might call) my first social software program when I started college / was introduced to a VAX mainframe for the first time. In MAP.COM, I used VMS DCL to draw a plan view of the computer room in the UCG Engineering Building, but with the names of users superimposed on the terminals they were logged into. You could be in a computer room, see that user ELEBRESLIN was seated two terminals away, and if you were brave enough, strike up a conversation (and if not with real words, maybe using VMS PHONE!). I didn’t realise it at the time, but Anthony Kelly had written nearly the same thing two years previously in BASIC - his TERM.BAS showed logged-in terminal IDs in bold, and you could then type in a specific terminal ID to find out which user was logged onto it. My own MAP.COM was horrible looking code but it worked and became pretty popular (see V2 at the end of this post)…
In fact, I found yet a third version of this utility (written by Peter Muldoon in FORTRAN, and called PLANT.FOR), which I adopted as my own and kept modifying for another four years. During this time, PLANT»> grew to about 700 lines long, could do multiple room views, supported timed / continuous refreshes, allowed people to create personal display aliases for the users being shown on screen, and even had a baby brother called SAPLING (groan!). In its heyday, there were about 180 people who regularly used the program… In essence, PLANT»> was just a search-and-replace utility, which I reduced to two lines of code in a 1995 cgi-bin version (see previous blog entry on WebPLANT»>).
The point of this reminiscing is that the reason PLANT»> and its predecessors were so regularly used on the UCG undergraduate VAX mainframe is because many people are either (partial) extroverts or simply curious about others (i.e. nosy!). The extroverts will set their process names to something like Gandalf or Johnny B. (*cough*) in the hope that other inquisitive people will be requesting a list of all logged-in users and wonder who they are… It’s much the same motivation that makes people blog or set up social network profiles today!
$ ! USERS.COM Version 2.0, 25 October 1991, John Breslin
$ NOBROADCAST = F$GETDVI("TT","TT_NOBRDCST")
$ PROCESS = F$PROCESS()
$ VERIFY = F$VERIFY()
$ ON CONTROL_Y THEN GOTO END_LOOP
$ ON SEVERE_ERROR THEN GOTO END_LOOP
$ SET TERMINAL /NOBROADCAST
$ SET PROCESS /NAME = "USERS>''F$GETJPI(0,"PID")'"
$ SET NOVERIFY
$ SET MESSAGE /NOFACILITY /NOIDENTIFICATION /NOSEVERITY /NOTEXT
$ TYPE SYS$INPUT
[2J[H)0lqqqqqqqqqqqqqqqqqqqqqqqqqqk [1mTTB3 TTA2 TTA7 TTB1 TXA7 TTB6[0m
x[1mUSERS> Version 2.0 [0m)0x x x x x x x x x x x x x
x x mqqj mqqj mqqj mqqj mqqj mqqj
mqqqqqqqqqqqqqqqqqqqqqqqqqqj
[1mTTA3 TTC3 TTB0 TXA4 TTD4 TTC4 TTC2[0m
x x x x x x x x x x x x x x
mqqj mqqj mqqj mqqj mqqj mqqj mqqj
[1mTTB5 TTB4 TTB7 TTD1[0m
x x x x x x x x
mqqj mqqj mqqj mqqj
[1mTTA6 TTD6 TTA4 TTD2[0m
x x x x x x x x
mqqj mqqj mqqj mqqj
[1mTTA1 TXA3 TTC0 TTC1 TTB2[0m[0m
x x x x x x x x x x
mqqj mqqj mqqj mqqj mqqj
$ SHOW USERS /FULL /OUTPUT = SYS$LOGIN:USERS.TMP
$ OPEN /READ FILE SYS$LOGIN:USERS.TMP
$ COUNTER = 0
$ BEGIN_LOOP:
$ COUNTER = COUNTER + 1
$ READ /END_OF_FILE = END_LOOP FILE RECORD
$ TIME = F$EXTRACT(32,23,RECORD)
$ IF COUNTER .EQ. 1 THEN WRITE SYS$OUTPUT "[?25l[7m[3;2H''TIME'[0m"
$ USERNAME = F$EXTRACT(1,12,RECORD)
$ LOCATE = F$LOCATE(" ",USERNAME)
$ LOCATE = F$LOCATE(" ",USERNAME)
$ USERNAME = F$EXTRACT(0,''LOCATE',USERNAME)
$ TERMINAL = F$EXTRACT(30,40,RECORD)
$ LOCATE = F$LOCATE(":",TERMINAL)
$ TERMINAL = F$EXTRACT(''LOCATE'-9,10,TERMINAL)
$ LOCATE = F$LOCATE(" ",TERMINAL)
$ LOCATE2 = F$LOCATE(":",TERMINAL)
$ LENGTH = LOCATE2-LOCATE-1
$ TERMINAL = F$EXTRACT(''LOCATE''+2,''LENGTH',TERMINAL)
$ IF TERMINAL .EQS. "TTB3:" THEN $ WRITE SYS$OUTPUT "[7m[3;29H''USERNAME'[0m"
$ IF TERMINAL .EQS. "TTA2:" THEN $ WRITE SYS$OUTPUT "[7m[2;37H''USERNAME'[0m"
$ IF TERMINAL .EQS. "TTA7:" THEN $ WRITE SYS$OUTPUT "[7m[3;45H''USERNAME'[0m"
$ IF TERMINAL .EQS. "TTB1:" THEN $ WRITE SYS$OUTPUT "[7m[2;53H''USERNAME'[0m"
$ IF TERMINAL .EQS. "TXA7:" THEN $ WRITE SYS$OUTPUT "[7m[3;61H''USERNAME'[0m"
$ IF TERMINAL .EQS. "TTB6:" THEN $ WRITE SYS$OUTPUT "[7m[2;69H''USERNAME'[0m"
$ IF TERMINAL .EQS. "TTA3:" THEN $ WRITE SYS$OUTPUT "[7m[6;1H''USERNAME'[0m"
$ IF TERMINAL .EQS. "TTC3:" THEN $ WRITE SYS$OUTPUT "[7m[7;9H''USERNAME'[0m"
$ IF TERMINAL .EQS. "TTB0:" THEN $ WRITE SYS$OUTPUT "[7m[6;17H''USERNAME'[0m"
$ IF TERMINAL .EQS. "TXA4:" THEN $ WRITE SYS$OUTPUT "[7m[6;37H''USERNAME'[0m"
$ IF TERMINAL .EQS. "TTD4:" THEN $ WRITE SYS$OUTPUT "[7m[7;45H''USERNAME'[0m"
$ IF TERMINAL .EQS. "TTC4:" THEN $ WRITE SYS$OUTPUT "[7m[7;61H''USERNAME'[0m"
$ IF TERMINAL .EQS. "TTC2:" THEN $ WRITE SYS$OUTPUT "[7m[6;69H''USERNAME'[0m"
$ IF TERMINAL .EQS. "TTB5:" THEN $ WRITE SYS$OUTPUT "[7m[10;37H''USERNAME'[0m"
$ IF TERMINAL .EQS. "TTB4:" THEN $ WRITE SYS$OUTPUT "[7m[11;45H''USERNAME'[0m"
$ IF TERMINAL .EQS. "TTB7:" THEN $ WRITE SYS$OUTPUT "[7m[11;61H''USERNAME'[0m"
$ IF TERMINAL .EQS. "TTD1:" THEN $ WRITE SYS$OUTPUT "[7m[10;69H''USERNAME'[0m"
$ IF TERMINAL .EQS. "TTA6:" THEN $ WRITE SYS$OUTPUT "[7m[14;37H''USERNAME'[0m"
$ IF TERMINAL .EQS. "TTD6:" THEN $ WRITE SYS$OUTPUT "[7m[15;45H''USERNAME'[0m"
$ IF TERMINAL .EQS. "TTA4:" THEN $ WRITE SYS$OUTPUT "[7m[15;61H''USERNAME'[0m"
$ IF TERMINAL .EQS. "TTD2:" THEN $ WRITE SYS$OUTPUT "[7m[14;69H''USERNAME'[0m"
$ IF TERMINAL .EQS. "TTA1:" THEN $ WRITE SYS$OUTPUT "[7m[18;21H''USERNAME'[0m"
$ IF TERMINAL .EQS. "TXA3:" THEN $ WRITE SYS$OUTPUT "[7m[19;29H''USERNAME'[0m"
$ IF TERMINAL .EQS. "TTC0:" THEN $ WRITE SYS$OUTPUT "[7m[18;37H''USERNAME'[0m"
$ IF TERMINAL .EQS. "TTC1:" THEN $ WRITE SYS$OUTPUT "[7m[19;53H''USERNAME'[0m"
$ IF TERMINAL .EQS. "TTB2:" THEN $ WRITE SYS$OUTPUT "[7m[18;61H''USERNAME'[0m"
$ GOTO BEGIN_LOOP
$ END_LOOP:
$ CLOSE FILE
$ DELETE /NOCONFIRM /NOLOG SYS$LOGIN:USERS.TMP;*
$ WRITE SYS$OUTPUT "[0m[19;1H[?25h"
$ IF NOBROADCAST .EQS. "FALSE" THEN SET TERMINAL /BROADCAST
$ SET PROCESS /NAME = "''PROCESS'"
$ IF VERIFY .EQ. 1 THEN SET VERIFY
$ SET MESSAGE /FACILITY /IDENTIFICATION /SEVERITY /TEXT
$ EXIT



Wow — guess who wrote a very similar perl4 script for the Maths Dept. terminal servers in TCD
Ooh let’s see!
Just goes to show, John - you can never do anything ever any more without it coming back to haunt you.
BW sent me a copy of that Plant.for [for some reason I had "lost" it], and I’d have to say, it’s fairly cringeworthy at this stage.