Sunday, January 13, 2008

NetworkX: This I might actually find time to play with



Just ran across NetworkX tonight:


NetworkX (NX) is a Python package for the creation, manipulation, and study of the structure, dynamics, and functions of complex networks. Features: Includes standard graph-theoretic and statistical physics functions, Easy exchange of network algorithms between applications, disciplines, and platforms, Includes many classic graphs and synthetic networks, Nodes and edges can be "anything" (e.g. time-series, text, images, XML records)

Friday, January 4, 2008

A Better Python Cmd Library

The Python cmd module has always been been better than the Ruby imitation (after all like most things about Ruby, it is cheap copy of the original, distinctive feel?) but cmd2 turns this into a real ass-kicking with the following features:


* Searchable command history (commands: "hi", "li", "run")
* Load commands from file, save to file, edit commands in file
* Multi-line commands
* Case-insensitive commands
* Special-character shortcut commands (beyond cmd's "@" and "!")
* Settable environment parameters
* Parsing commands with flags

Django on Jython?

I previously whined about the non-progress of Jython (especially relative to JRuby) but this is great news.

The most important thing to know about Django on Jython is that we are almost there, and with clean code. End-to-end functionality is demonstrated by the admin tool running in full CRUD, along with a substantial number of unit tests and syncdb.

Wednesday, January 2, 2008

Maybe someday I'll have time to read on Python Bytecode

Maybe someday I'll get a chance to fully digestExploring Python Bytecode.


For the past month or so, I’ve been trying to understand what appears to be a black art mostly because of lacking documentation - Python bytecode generation and peephole optimization. Some notes from the study for the benefit of IRC-mate ‘jstatm’ and anyone else living on similar planes of insanity.

Although bytecode applies to objects other than functions such as tracebacks, dictionaries and strings, I am only interested in optimization and flow analysis of class methods, functions and lambdas. Lets get to the action straight away with an example. Here is a small python program to disassemble and display the bytecode of a function in human readable form.

Tuesday, January 1, 2008

Decorators, Python Black Magic and the Residue of Past Programming

While trying to figure out decorators I ran across a really cool presentation called Python Black Magic (or how I learned to stop writing Java in Python). I understand this, since much of the Python I've written over the years, was even worse -- I was writing Perl in Python. For the longest time Python OO conventions seemed strange compared to Java/C# and I refused to use them sticking to horrific Perl-like hash of a hash of a hash data structures. On the one hand if you are sort of programming-ADD-like-me, I definitely see the advantage of developing a set of crisp clean, language agnostic design patters. Who cares if your code isn't completely Pythonic or if you aren't exploiting all the Ruby functional programming fu, your code will be accessible to the largest possible audience.

Friday, December 28, 2007

Web Scripting with Twill (I wish I had this when I used to do WebApp Assessments)

A few weeks ago I thought I had the need to script (for the life of my I can't remember why I wanted to do this, I should have blogged on it) Firefox. Well I didn't any Python or Ruby tools for taking control of the browser (I remember seeing how to do this with Python and IE a loooong time ago) but tonight I ran across Twill which looks pretty cool and I assume uses the cmd module

mfranz@gutsy61:~$ twill-sh

-= Welcome to twill! =-

current page: *empty page*

>> go http://www.threatmind.net/secwiki
==> at http://www.threatmind.net/secwiki
current page: http://www.threatmind.net/secwiki
>> showforms

Form #1
## ## __Name__________________ __Type___ __ID________ __Value__________________
1 action hidden (None) fullsearch
2 context hidden (None) 180



3 value text searchinput
4 1 titlesearch submit titlesearch Titles
5 2 fullsearch submit fullsearch Text


Form #2
## ## __Name__________________ __Type___ __ID________ __Value__________________
1 action select (None) ['raw'] of ['raw', 'print', 'refresh ...
2 1 None submit (None) Do


Form #3
## ## __Name__________________ __Type___ __ID________ __Value__________________
1 action select (None) ['raw'] of ['raw', 'print', 'refresh ...
2 1 None submit (None) Do



current page: http://www.threatmind.net/secwiki
>> help

Undocumented commands:
======================
add_auth fa info save_html title
add_extra_header find load_cookies setglobal url
agent follow notfind setlocal
back formaction redirect_error show
clear_cookies formclear redirect_output show_cookies
clear_extra_headers formfile reload show_extra_headers
code formvalue reset_browser showforms
config fv reset_error showhistory
debug get_browser reset_output showlinks
echo getinput run sleep
exit getpassword runfile submit
extend_with go save_cookies tidy_ok

Thursday, December 27, 2007

Obviously I'm not Even an Intermediate Level Python Programmer

While a thread on regex performance revealed how much I've forgotten (or never knew) even though I started coding in Python (1.5.x) back in 1999. My confusion didn't have really anything to do with regexes but the two different approaches, one which was more peculiar to my only-coding-in-Ruby-recently brain:

Class Approach
import re
class Searcher(object):
def __init__(self, rex):
self.crex = re.compile(rex)
def __call__(self, txt):
return self.crex.search(txt)

s = Searcher("dog")
print s("dog").string

After I remembered what the __call__ was used for (which I actually like) and got used to the __'s (which I don't like) and I've never liked the self's in Python method arguments -- this made sense.

Function Returning a Function
import re
def searcher(rex):
crex = re.compile(rex)
def _(txt):
return crex.search(txt)
return _
s = searcher("dog")
print s("dog").string


At first this didn't make much sense and I got tricked by the underscore (thinking it was some sort of Perl-like special function name or something, it isn't though!). Wny would I call a function returning another function that I would use over and over again. Why would you do that? What is interesting though is if that s("dog")("dog") also produces identical results although I have no idea why (except that the first nested function within a function always executes the second parameter).