Annotation of 43BSD/contrib/news/misc/arbitron, revision 1.1.1.1

1.1       root        1: From [email protected] (Brian Reid) Sat Mar  8 14:46:58 1986
                      2: Path: seismo!ut-sally!pyramid!decwrl!glacier!reid
                      3: From: [email protected] (Brian Reid)
                      4: Newsgroups: net.news.adm,net.news.group
                      5: Subject: who reads USENET, anyhow? Worldwide survey.
                      6: Message-ID: <[email protected]>
                      7: Date: 8 Mar 86 19:46:58 GMT
                      8: Organization: Stanford University, Computer Systems Lab
                      9: Lines: 169
                     10: Keywords: please run this program on your site
                     11: 
                     12: 
                     13: I'm tired of speculation about how many people read USENET, and how big the
                     14: audiences are. Here is a program that does a pretty good job of determining
                     15: that information. Please install this program on your site, and run it with
                     16: the -m option that will mail the results back to glacier. I will tally and
                     17: total the results and post them.  We've been running this program at about
                     18: 20 sites in the San Francisco area for 6 months now, and the results are
                     19: remarkably counterintuitive.
                     20: 
                     21: This shell script is named "arbitron". Edit the "configuration information"
                     22: to work at your site, then type
                     23:        arbitron -m [email protected]
                     24: to mail the results to me. If you want to keep a copy of the results, type
                     25:        arbitron -m "netsurvey@glacier myname"
                     26: where "myname" is your login name.
                     27: 
                     28: On Glacier, which is a Vax 750 with 250 user accounts, this program takes
                     29: about 5 minutes to run on a lightly-loaded system.
                     30: 
                     31: #! /bin/sh
                     32: # arbitron -- this program produces rating sweeps for USENET.
                     33: #
                     34: # Usage: arbitron > filename   for local data
                     35: #       arbitron -p net.foo    to post to USENET
                     36: #       arbitron -m person     to mail results to an accumulator
                     37: #
                     38: # Run "arbitron -p" at the end of each month, which will post your site's
                     39: # arbitron report.
                     40: # To participate in the international monthly ratings sweeps, 
                     41: # run "arbitron -m net-survey@glacier" every month. I combine the results
                     42: # and post the information to net.news.
                     43: #
                     44: # The names of users reading individual groups are not posted to the network,
                     45: # only the summary counts. Whether or not somebody reads a group is private
                     46: # information.
                     47: #
                     48: # By Brian Reid, Stanford. 
                     49: #      v1.2    September 18, 1985
                     50: #      v1.3    March 8, 1986
                     51: #
                     52: # copied to a certain extent from the "subscribers"
                     53: # script posted by Blonder, McCreery, and Herron. The awk script to format
                     54: # the report was especially stolen from them.
                     55: ############################################################################
                     56: # Configuration information:
                     57: tmpdir=/tmp
                     58: news=/usr/lib/news
                     59: 
                     60: # For uucp, try {sun, pyramid, decwrl, hplabs, bellcore}!glacier
                     61: summarypath="[email protected]"
                     62: hostname=`hostname`
                     63: PATH=$news:/usr/local/bin:/usr/ucb:/usr/bin:/bin
                     64: ############################################################################
                     65: export PATH
                     66: # ---------------------------------------------------------------------------
                     67: trap "rm -f $tmpdir/arb.sel.$$ $tmpdir/arb.fmt.$$ $tmpdir/arb.tmp.$$" 0 1 2 15
                     68: opt1=${1-0}
                     69: case $opt1 in
                     70:     -p) opt2=${2-ba.news.ratings};;
                     71:     -m) opt2=${2-netsurvey@glacier};;
                     72: esac
                     73: set `date`
                     74: dat="$2 $6"
                     75: moption=0
                     76: case $opt1 in
                     77:     -p) destination="$news/inews -t Monthly arbitron ratings for $hostname ($dat) -n $opt2"
                     78:          poption=1;;
                     79: 
                     80:     -m)  destination="mail $opt2"
                     81:         moption=1;
                     82:         poption=1;;
                     83:     *)   destination="cat"
                     84:          poption=0
                     85: esac
                     86: ################################
                     87: # Here are several expressions, each of which figures out approximately how
                     88: # many people use this machine. Comment out all but 1 of them; pick the one
                     89: # you like best
                     90: ########## fast but usually returns too big a number
                     91: lowUID=5
                     92: highUID=999
                     93: nusers=`awk -F: "BEGIN {N=0}\\$3>=$lowUID && \\$3<=$highUID{N=N+1}END{print N}" </etc/passwd`
                     94: ########## slow but accurate if /usr/adm/wtmp has enough data
                     95: ## wc is a Berkeley-ism, I think. We just want to count the lines in the
                     96: ## standard output of sort -u
                     97: # set `last | colrm 9 | sort -u | wc`
                     98: # nusers=$1
                     99: ################################
                    100: cat > $tmpdir/arb.sel.$$ << 'CAT'
                    101: /^net\..*: *[0-9].*$/  { nn=split($0,n,":"); print n[1], n[2] }
                    102: /^mod\..*: *[0-9].*$/  { nn=split($0,n,":"); print n[1], n[2] }
                    103: NF == 1        && $1 ~ /^[a-z]*$/{ print $1 }
                    104: CAT
                    105: sed -e "s/POPTION/$poption/" -e "s/MOPTION/$moption/" -e "s/NUSERS/$nusers/" -e "s/HOSTNAME/$hostname/" > $tmpdir/arb.fmt.$$ << 'DOG'
                    106: # makereport -- utility for "arbitron". Shamelessly copied from the
                    107: # similar script distributed with "subscribers.sh" by Blonder, McCreery, and
                    108: # Herron.
                    109: # 
                    110: BEGIN  { rdrcount = 0 ; reader = "" ; grpcount = 0 ; realusers = 0}
                    111: 
                    112: NF == 4        {               # 4 fields means it is a /usr/lib/news/active entry
                    113:          grpcount++
                    114:          grpname[grpcount] = $1
                    115:          grpnumber[$1] = grpcount
                    116:          grplast[grpcount] = $2
                    117:          grpfirst[grpcount] = $3
                    118:          grpcounts[grpcount] = 0
                    119:          grpreaders[grpcount] = ""
                    120:        }
                    121:                        # 1 field means it's a user name
                    122: NF == 1 { rdrcount++; rdrname[rdrcount] = $1; rdrnumber[$1] = rdrcount
                    123:          reader = $1}
                    124: 
                    125:                        # 2 fields means it's a .newsrc line
                    126: NF == 2 { gnum = grpnumber[$1] 
                    127:          n1 = split($2, n2, "-")
                    128:          n3 = split(n2[n1], n4, ",")
                    129:          lastread = n4[n3]
                    130:          if (lastread >= grpfirst[gnum]) {
                    131:                  grpcounts[gnum]++
                    132:                  grpreaders[gnum] = (grpreaders[gnum] " " reader)
                    133:                  if (realuser[rdrcount] == 0) {
                    134:                      realuser[rdrcount]=1
                    135:                      realusers++
                    136:                  }
                    137:          }
                    138:        } 
                    139: 
                    140: END    {bigblanks = "                                                  "
                    141:         printf("9999 Host\t\t%s\n","HOSTNAME")
                    142:         printf("9998 Users\t\t%d\n",NUSERS)
                    143:         printf("9997 NetReaders\t%d\n",realusers)
                    144:         if (0 == MOPTION) printf("9996 \n9995 rdrs rating share traffic   M/R  newsgroup\n")
                    145:         for (i=0; i < grpcount; i++) {
                    146:            if (grpcounts[i] > 0) {
                    147:                rating = (100*grpcounts[i])/NUSERS
                    148:                share = (100*grpcounts[i])/realusers
                    149:                traffic = grplast[i]-grpfirst[i]
                    150:                if (grpcounts[i] != 0) ratio = traffic/grpcounts[i]
                    151:                   else ratio = 0
                    152:                if (0 == POPTION) {
                    153:                    obuf = sprintf("%4d %5d %s", grpcounts[i], traffic, grpname[i])
                    154:                    nf = split(grpreaders[i], rdrs, " ")
                    155:                    obuf = substr ((obuf bigblanks),1,35)
                    156:                    width = 35
                    157:                    for (j=1; j <= nf; j++) {
                    158:                            nwidth = length(rdrs[j])
                    159:                            obuf = (obuf rdrs[j] " ")
                    160:                            width = length(obuf)
                    161:                    }
                    162:                } else if (0 == MOPTION) {
                    163:                    obuf = sprintf("%4d %5.1f%% %4d%%  %5d  %5.1f  %s", grpcounts[i], rating, share, traffic, ratio, grpname[i])
                    164:                } else {
                    165:                    obuf = sprintf("%d %s\n",grpcounts[i], grpname[i])
                    166:                }
                    167:                printf("%s\n",obuf)
                    168:            }
                    169:        }
                    170:     }
                    171: DOG
                    172: 
                    173: awk -F: '{printf "echo %s\negrep : %s/.newsrc\n",$1,$6}' \
                    174:        </etc/passwd | sh 2>/dev/null | awk  -f $tmpdir/arb.sel.$$ >$tmpdir/arb.tmp.$$
                    175: egrep '^net\.|^mod\.' $news/active | sort | \
                    176:        awk -f $tmpdir/arb.fmt.$$ - $tmpdir/arb.tmp.$$ | sort -nr | \
                    177:        sed -e 's/^999[0-9] //' | $destination
                    178: -- 
                    179:        Brian Reid      decwrl!glacier!reid
                    180:        Stanford        [email protected]
                    181: 
                    182: 

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.