Let’s take a look at http://www.babysimon.co.uk/khtml2png/ :)
Author Archives: admin
Last PPP Ip .
#!/usr/bin/python """ A really simple piece of code that i use to track down my dynamics IP (assigned by my isp while using ppp). """ filename = '/home/soif/Perso/Data/lastIp.sqlite' import sys,os,time try: import sqlite except ImportError: print "Please install python sqlite binding first" sys.exit(0) def createTables(cursor): schema = "CREATE TABLE connect ( id INTEGER PRIMARY KEY, ip VARCHAR(27), date VARCHAR );" cursor.execute(schema) print "Database creation: Done" def printLastIps(cursor): cursor.execute('SELECT * FROM connect ORDER BY id DESC LIMIT 15') results = cursor.fetchall() print "=" * 78 print " Last Ips " print "=" * 78 for r in results: print '- %-15s %s' % ( r[1],r[2] ) def getLastIp(cursor): cursor.execute('SELECT * FROM connect ORDER BY id DESC LIMIT 1') r = cursor.fetchall() if len(r) > 0: return r[0][1] return def insertCurrentIp(cursor,ip): sql = 'INSERT INTO connect values(NULL,"%s","%s") ' % (ip,time.ctime()) cursor.execute(sql) print "Inserting of %s: Done" % ip def usage(): print sys.argv[0] print " Arguments:" print " -c : create the database" print " -a ip : add the ip to the db" print " -l : list the last ips" #import pdb;pdb.set_trace() db = sqlite.connect(filename) cursor = db.cursor() if len(sys.argv) == 2 and sys.argv[1] == '-c': createTables(cursor) elif len(sys.argv) == 2 and sys.argv[1] == '-l': printLastIps(cursor) elif len(sys.argv) == 3 and sys.argv[1] == '-a': newIp = sys.argv[2] lastIp = getLastIp(cursor) insertCurrentIp(cursor,newIp) if lastIp != newIp: print "Sending Email" os.system('echo Changing Ip of gateway from %s to: %s | mail -s 'New Ip %s ' -a 'From: jkx@club-internet.fr' jkx@wanadoo.fr' % (lastIp,newIp,newIp)) else: usage() db.commit()
Sample output
============================================================================== Last Ips ============================================================================== - 217.128.96.43 Thu Aug 28 21:33:40 2003 - 193.252.3.209 Wed Aug 27 21:33:43 2003 - 217.128.96.95 Tue Aug 26 21:33:47 2003 - 80.15.151.254 Tue Aug 26 18:53:18 2003 - 80.15.151.107 Tue Aug 26 07:34:39 2003 - 81.48.168.91 Mon Aug 25 07:34:36 2003 - 80.15.151.40 Sun Aug 24 07:34:38 2003 - 81.48.168.41 Sat Aug 23 07:54:41 2003 - 80.15.151.125 Fri Aug 22 07:34:44 2003 - 80.15.151.169 Thu Aug 21 07:34:46 2003 - 193.251.14.187 Wed Aug 20 07:34:49 2003 - 193.251.14.36 Tue Aug 19 07:35:07 2003 - 81.48.168.47 Mon Aug 18 07:35:01 2003 - 80.15.151.187 Sun Aug 17 07:34:58 2003 - 81.48.168.75 Sat Aug 16 07:35:01 2003
AutoMatic cache for Modeling FrameWork in WebWare
This is my first hack over ZPTPage and Modeling to enable regerating of ZPTPage only when Modeling objects changed .. check out class A: (which is a sample fake Modeling Object)
import os,time from ZPTPage import ZPTPage class A: def __init__(self): self.a = 'B' * 50 self.willChange() def getA(self): self.willRead() return self.a def setA(self,value): self.a=value self.willChange() def willRead(self): #print "Read %s" % self pass def willChange(self): self.lastChange = time.time() class HereProxy(dict): def __init__(self,orig): print "New Here" self.orig = orig def __getitem__(self,key): result=getattr(self.orig,key) print "*** %-10s : %s " % ( key,result) cache = self.orig.application().cache[self.orig.hashCache()] if result not in cache: cache.update( {result:result.lastChange }) return result class Main(ZPTPage): def __init__(self): self.a = A() ZPTPage.__init__(self) self.here = HereProxy(self) self.validCache = False def writeHTML(self): if self.request().hasField('A'): self.a.setA(self.request().value('A') ) cachedFileName=os.path.join('/tmp/w/',self.hashCache() +'.html') try: cache = self.application().cache[self.hashCache()] except KeyError: self.application().cache[self.hashCache()] = {} cache = self.application().cache[self.hashCache()] needUpdate = 0 #import pdb;pdb.set_trace() for obj in cache.keys(): try: print obj.lastChange if obj.lastChange != cache[obj]: needUpdate = 1 break except AttributeError: needUpdate = 1 break if needUpdate == 0: print "*** Serving cache %s ***" % self.hashCache() try: data = open(cachedFileName,'r').read() except IOError: needUpdate = 1 if needUpdate: print "*** Regerating %s ***" % self.hashCache() self.buildContext() data = self.template.render() open(cachedFileName,'w').write(data) self.response().setHeader('Content-type', 'text/html; charset=UTF-8') self.writeln(data) def buildContext(self): self.updateContext('text','Toto') def getTime(self): import time return time.time() def getHere(self): #return {'a':A()} return self.here def sleep(self,context): print self.application().cache ZPTPage.sleep(self,context) ### cache ### def hashCache(self): return "MainTemplate"
Garbage Collector statistics
Have you ever wondering what is in the gabarge collector ? This little piece
of code may help :)
import string,gc def debugGC(threshold=10): d = {} print "*" * 80 for o in gc.get_objects(): try: s = str(o.__class__) try: d[s] = d[s] + 1 except KeyError: d[s] = 1 except AttributeError: pass # this is not a str_able object l = d.keys() l.sort() for key in l: if d[key] > threshold: print "%70s -> %d " % (key,d[key]) print "*" * 80
Python sous l’eclipse
Différentes initiatives commencent à naitre sur les IDE python. Un relativement récente consiste à utiliser eclipse, l’IDE java.
http://www.xored.com/products.php
L’installation du plugin se fait directement via eclipse via Window -> Open Perspective -> Other resource -> Install or Update. Puis ajout de http://www.trustudio.org la fenètre en bas à gauche et c fini :)
Screenshot :

Sending ad-hoc trackbacks with python
http://roughingit.wari.org/python/tutor/sendingtrackback: Sending ad-hoc trackbacks with python
Various blog system
After a little search on google, i find this
http://radio.weblogs.com/0100490/2003/04/10.html | What do I need in a blogging tool?
Autodafé
- http://www.20six.fr:80/maia/ Maïa, la coureuse de caleçon
- http://www.fleur.net/newdesign/me/ Fleur
- http://www.satanic-kitten.net Satanic Kitten
- http://www.davduf.net DavDuf.net
- http://depensees.crazyfrogs.org Les (de)Pensées
Jamais venin n’aura donné liqueur si douce
Personne n’est duppe, si Manu Chao fait en se moment une tournée française, ce n’est pas parcequ’il aime Chriac, mais plutot tout simplement qu’il a un message à faire passer.. “La vie est belle … le monde est pourri” lance ‘t il à une foule apparament convaincue. Et comme si ca ne suffisait pas il appelle au boycot des produits américains car ces derniers sont “là ou il y a la guerre”. Il faut reconnaitre que son message passe bien, très bien même. Je me vois mal arréter le Coca demains,( mais bon… cela tiens + à une histoire de drogue qu’à une affiliation politique.) Un vent d’anarchie est passé ce soir là dans la prairie de Landaoudec, qui semble t’il à plutot tendance à s’embougeoisé qu’à rajeunir. Je dis ca .. mais je ne fais que répéter les commentaires que j’ai trouvé sur le forum, et je n’ai pas d’opinion critique sur le sujet.
J’ai rajouté les images de Manu Chao en concert dans mon album perso
A ce qui se demandent .. le concert était tout bonnement génial. Pour ce qui est de l’organisation, la bouffe, les gens .. je ne peux pas répondre car tellement décu des années précédentes je suis arrivé au concert pile à l’heure et reparti ensuite sans demander mon reste (de toute facon les bars étaient fermés) .
Ceci est un message subliminale à l’intention des organisateurs : Faut ‘il attendre que les artistes vous proposent des concerts interessants pour qu’ils soient programmés ?
Sécurité selon Microsoft

Microsoft ne manque pas d’humour, en même temps que le serveur http://windowsupdate.microsoft.com/ est planté pour cause de problème de virus windows, la page d’acceuil de microsoft.com affiche Improving Your Computer’s Security in 3 Steps. Et comble de l’ironie, dans ce fameux document ils expliquent qu’il faut mettre à jour Windows via .. via .. windows update !!!