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 :

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

http://jkx.larsen-b.com/photos/blog/winupdate_secure.gif

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 !!!