psplague
Inspired by Julian Oliver's psworld, psplague further explores the links between environment (simulation) and code. Rather than mapping a computer's internal processes onto visual features in the world (as in the case of psworld), in this instance (psplague) UNIX-like processes are attached to medieval villagers within a simple SIR (susceptible, infected, recovered) model of plague infection.
When a villager becomes infected and dies after a period of time, the attached process running on the computer is terminated or killed.
Warning: psplague can result in a more or less instantaneous hard crash.
Code:
import sys, random, os, time, signal countd=0 infected=10 # of which 10 infected recovery = 10 # days to recover Iprob = 0.4 # probability of transmission Dprob = 0.1 # probability of death # SuscIinfectedRecoveredDead S = 0 I = 1 # (days) R = -1 D = 1024 # dead pop = dict() def checkos(pop): newpop=dict() for pid in os.listdir('/proc'): if pid.isdigit(): newpop[pid]=S for key in newpop.keys(): if key in pop: newpop[key]=pop[key] return newpop def init_pop(pop, inf): for pid in os.listdir('/proc'): if pid.isdigit(): pop[pid]=S for z in range(inf): x=random.choice(pop.keys()) pop[x]=I def isinfected(pop,procid): x=1 count=0 popp=pop.items() for key in pop.keys(): if key == procid: ind = popp[x-1] if ind>=1 and ind!=D: count=count+1 ind = popp[(x+1)%len(pop)] if ind>=1 and ind!=D: count=count+1 return count x=x+1 return 0 def do_plague(pop): global countd pop_temp = dict() for procid, ind in pop.items(): if ind>0 and ind!=D: ind=ind+1 if random.random()<=Dprob: ind=D countd=countd+1 print "killed process ID:", procid, open(os.path.join('/proc', procid, 'cmdline'), 'rb').read() del pop[procid] # kill the process (for testing just print process ID) try: os.kill(int(procid), signal.SIGKILL) except OSError: continue if ind>=recovery and ind!=D: ind=R if ind==0: if isinfected(pop,procid)>0 and random.random()<=Iprob: ind=I pop_temp[procid]=ind return pop_temp def draw_pop(pop): counts=0 counti=0 countr=0 for procid, state in pop.items(): if state==0: counts=counts+1 if state>0: counti=counti+1 if state==-1: countr=countr+1 print '\nDay: %d Susceptible: %d Infected: %d Recovered: %d Dead: %d\n' % (days, counts,counti,countr, countd) days=0 random.seed() init_pop(pop, infected) while 1: days=days+1 draw_pop(pop) pop=dict.copy(do_plague(pop)) time.sleep(1) pop=dict.copy(checkos(pop))
Date: 2011-11-12 00:48:39 GMT
HTML generated by org-mode 6.31trans in emacs 23