While I was playing around with Python for Andoid, I was using the webViewShow method to load an interactive html page and set up message passing both from

html/js -> python

and from

python -> html/js

Part of this requires that I knock out and hack some html/js code. However, I am using the Remote method with a public server on my android device, since I am too lazy to set up eclipse and a full blown android dev env. The example code they show, uses an html file located on the sdcard of the device. Of course this brings its own problems, since now I have to mount, edit, unmount between each hack cycle. Ick. Well I could just tell it to load the html from an off device server, but being lazy ( I think I mentioned that already. ) I didn’t want to rsync back and forth to my remote server, set up directories, etc. Also, I didn’t want to set up a Django install just to serve a hacky html script.

So I think to myself, man there has to be some light-weight way to serve this up locally while I’m hacking. So I think, hey CherryPy, but then I remember Edna and it hits me, I can serve static pages out of a directory with just python. A little google-fu and this page appears, giving just the needed incantation.

 python -m SimpleHTTPServer 8080

Which happily serves everything out of the directories below it on the specified port (8080 in this case). I make a little adjustment in to my webViewShow and change it from file:/// to http://my-dev-ip:8080/thefile.html and all is good with the world. As I hack, changes to the html are pulled and served immediately.

Did I mention, Python Rocks!

App Engine is a pretty dramatic thought departure for lots of programmers who are used to writing an app that runs on a single server and access a single database.  Case in point, there has been a recurring topic of auto-increment fields on the  App Engine list — people trying to implement their own version of it since it is not a native datastore type.

Using an auto-increment field is not the way to go.  It is viable when you only have 1 database but the datastore for your app is going to/can be replicated out to other machines.  This would mean that their exists times, when datastore’ != datastore” — over time datastore’ would be sync’d with datastore” so that datastore’ == datastore”   — this would lead one to believe that there will be times when the idea of an auto-increment field will not be synchronizable or that the result of the synchronization would be less than satisfactory.  My belief that auto-increment fields are the wrong idea in this environment is strengthened by the fact that they are not offered as an intrinsic datatype.

The way to go, in my opinion, is to use UUIDs. (see links below)
http://docs.python.org/lib/module-uuid.html
http://www.faqs.org/rfcs/rfc4122.html

Other Thoughts on the topic:

• data access is very expensive, using a UUID should be faster
• UUID1 or UUID4 would be the types to consider
• UUID1 is preferable as it would introduce some machine significance which should make the chances for a collision to be even more remote than for a UUID4 (random)

Noah Gift over on O’Reilly OnLamp Blog has an article on building a greedy coin changer. That is, given a value, say 71 cents, calculate the fewest coins needed to make the amount. He had listed a number of solutions, but I felt I could do it a bit more pythonic. ðŸ˜‰

#!/usr/bin/env python
"""implement a greedy coin changer, returning the
fewest coins to make the change requested."""
#coin_list can be expanded to include silver dollars
# and 50 cent pieces by just expanding the coin list
# to [100,50,25,10,5,1] the reulting answer
#structure will modify itself to reflect

coin_list = [25,10,5,1]
change_requested = .71
remaining = change_requested * 100
change_returned = []    #result structure

for coin in coin_list:
num_coins,remaining =  divmod(remaining,coin)
change_returned.append(int(num_coins))

print change_returned
print remaining


The benefits of this version, are no conditional logic is needed, the coin structure can be modified and the answer will modify itself accordingly.

Now this is truly an interesting development. Google’s just announced App Engine is sure to super-charge the Python community and convert a number of disillusioned developers of other languages in to Pythonistas. There have been lots of interesting comments floating in the blogosphere about what this could mean.

I think it is a great opportunity on a smaller scale than anyone might imagine. Sure, this could serve as the platform for the next YouTube type social-2.x site, but what I think this really means, is that Google is rounding out the Google Apps for Domains by giving the ability to create something more than a brochure-ware style site offered by their current Sites for Google Apps.

Many are looking for Google to use this as an opportunity to expand advertising revenue, and that is certainly possible for widely popular webX.x sites but what they really needed is another tool/knife to hold to the competition’s throats. Looking at the tea leaves in the bottom of my glass, I see something more akin to a SharePoint attack; Going after the S in SMB market.

App Engine allows for authenticating users via Google system, how much longer until we can interact with other Google services in a similar fashion?? Calendaring, GTalk, etc — I’m not talking mashups, something much more refined.

There is a great article over on SnapLogic,  SnapLogic Blog Squishy design with Python: Designing in code

The gist of the article is that when developing APIs are never as complete as we want them when we are developing a new system and if you are using a static language you’ve got lots of ramifications to consider and code to rework when you have to expand an API.  However, dynamic languages have a real advantage here and they go on to give a very real example and how they dealt with it.

There is an interesting write up on plugin architecture — g :: A Simple Plugin Framework

A project that I’m working on is going to require a plugin framework for a number of things: Logic, Data Storage, Reporting and I’ve been keeping my eyes open for papers/articles on plugin frameworks.  Do you know of any resources/articles?

Who would have guessed that MS would be the first to really put python in the browser? I know you can jump through hoops to make a browser support python but it was not something you could do for a public website.

There have been a bunch of announcements in the past couple of days about IronPython and SilverLight — will they beat firefox?
Personally, I’m giddy about the prospect of using Python instead of javascript.  John Udell’s blog entry tonight specifically mentions
that exact combination.
http://blog.jonudell.net/2007/05/01/watching-anders-hejlsberg-reinvent-the-relationship-between-programs-and-data/

Finally, things are starting to get exciting again.

Ned Batchelder blogged some good PyCon advice tonight, “Talk to people.” I completely agree with him on that point.

This was my second PyCon and I spoke to a vastly larger group of people than I did when I attend PyCon 2002. While I did say Hello to a number, the one real conversation I had was with Tim Peters. This year I wasn’t the least bit shy about introducing myself and talking to others. I met a number of great people who just happen to be excellent pythonistas. There was Chris and Ted from ChiPy, Alvin from San Francisco, Christian Tismer, Mark Ramm, Michael Foord, Alex, Ben, Doug (nice job on the pycon schedule) and many, many more. I’ll be blogging about a number of these conversations as time goes on.

After listening to the wonderful things being said about SQLAlchemy at PyCon, I wondered if the following idiom could be implemented as a Domain Object with SQLAlchemy.

Often we have legacy data that we have read only access, to which we need to associate additional meta information. Before this has always meant that the application had to be aware of the relationship of the meta data record in the ExoTagging DB and how to map it to the legacy read-only data. If we could map the two into a single Domain Object it would make are apps a lot cleaner. I spoke to Mark Ramm and he believed that it would be possible and in fact it might even be easy although he hadn’t attempted it before.

I call the idiom ExoTagging because it is logically quite like the idea of Tags, except that tags are kept in a table that resides in a database that is separate from the data that is being tagged. Hence Exo-Tag.

Has anyone else already implemented something like this with SQLAlchemy, if so would you mind sharing your experiences?

2 Questions that I wished that were asked of the Panel:

1) Why PyChecker given PyLint? Could you contrast the two tools?

2) For those utilities that test user facing web applications, twill, mechanize, etc, Why are they better than Selenium?

I believe that it is time to resurrect the Omaha Python Users Group. I attended that Python Advocacy meeting on Day 1 of PyCon and listened to Jeff Rush and then talked to the leader of ChiPy, Chris McAvoy. There is an advocacy open session tonight @9pm after the OLPC show and tell session. I am hoping to work with others there to set up a system to share web resources, mailing list, website, etc between users groups. People should be able to go to the python site and “Find a local users Group”. The users groups could video tape speakers, and then share those videos for use at other user group meetings and for advocacy in general. A central point for available speakers and a centralized place for companies like O’Reilly, to offer products, books, and other give-aways that could be requested and used by the different users groups.

Of late there has been much to do about the crop of Python based web frameworks. Is one superior to another? Currently, I don’t believe so they all have strengths and weaknesses and I could make a good argument for most of them. However, in the midst of this current genesis there are some shining stars that I think are setting the way forward. These stars are not the frameworks themselves but components that are written to be framework agnostic. For example, Paste, WSGI, SQLAlchemy and ToscaWidgets. By supplying these fundamental and highly useful tools, they are empowering the current and future web frameworks.

I think that all of the frameworks should look for commonality that can be shared, that can be improved for the benefit of all. Even if you want to have a full single source stack as opposed to a best of breed stack plugin architectures should be the standard. So advancements can spread between the frameworks.

What about the frameworks? I believe that in the end their will be two major web frameworks, Django and TurboGears/Pylons. Twisted won’t go away and neither will Nevow but they won’t match the popularity of the two majors. However, I firmly believe that all of the frameworks will have similar traits and in time will tend to a center balance point using different toolkits as the “preferred”.

ref: http://us.pycon.org/TX2007/TutorialsPM#PM2

AJAX ~ JSON
is the communication protocol between the client and server

• @expose(allow_json=True) … JSONifies the return results(dictionary or string)

Widgets ~

• Widget Browser
• how widgets are written/disecting ala the AutoComplete widget
• current form widgets vs. toscawidgets — when that time comes, it shouldn’t even cause a bump unless you are using nested forms, — that api will change (for the better)
• setting form widgets to default values

Break

Hints:
In Controllers: Just inherit from controllers in your nested controllers, don’t use controllers.RootController everywhere otherwise you’ll end up with name space collisions and CP won’t behave as expected.

SQLAlchemy

• ActiveMapper – SQLAlchemy splits the logical definition from the physical so you can map a logical def back to a backend(s) of your choice (like a legacy db) It implements the “data mapper” method, Domain objects/ mapping layer/ physical data. It has a session mapper that keeps a link between the logical and physical, keeps the identity mapped to the underlying db, plus it caches.
• Hints:
ActiveMapper is pretty much deprecated. Elixir is the upcoming replacement.

Genshi

• Change *.kid to *.html
• Change template engine to Genshi @expose(‘mytemplate’) -> @expose(‘genshi:mytemplate’)
• py:match tags
• if you have python blocks — you’ll need to wait a couple weeks
• you have to wrap your calls to widgets in a function call ET(widget) ET=elementTree you may receive ElementTree references in your output. You can display your widget like \${ET(table.display(data))}
• change sitetemplates.kid -> sitetemplates.htm — more that just a name change
• Why Genshi —

1. Error Handling — kid explodes and gives the line # of the compiled kid template (.pyc) that blew, Genshi gives you the line, column in the original source code/template.
2. Lets you use XML includes and do XML includes in “if” tags

More SQLAlchemy
http://www.sqlalchemy.org/docs/tutorial.myt

More Genshi Mark will post the Ulitimate-Wiki code later today/night

Authentication
TurboGears includes the Identity module. It uses a simple db back end but that can be changed out to an LDAP if desired. There exists an SO provider and an SA provider. There is a page on the old trac, it might be in RoughDocs by now. There is an AD backend too. The LDAP and AD providers only do Authentication, Authorization is handled by the a db local to the app.

Sites Using TurboGears
Sessions
There is a CherryPy (CP) session filter that you just turn on. In the .ini files — dev or app, etc
3 backends: file, memory, postgresql
In the future it will be the CP session Tool instead of Filter
CherryPy.????? is a great place to put thread local stuff

Performance and Filters: Cache Filters – is CP deprecating it? Will CP make it a Tool, or if it is more WSGI friendly, will it turn to beaker?

mark.ramm@gmail.com

MochiKit
Is the most under appreciated js package. Mark prefers it to prototype.js. Bob Ippolito json — mochikit. Is tested on ie, ff and the mac browser — is tested hard. Javascript that Doesn’t make you want to shoot yourself in the head. It has a version of the script.acoul.us but uses mochikit instead of prototype. Bob is said to be a testing task master.

hint:
Don’t get caught in the DOM scripting cess pool. 2 secs to download and 20 secs to render. That is bad. DOM scripting is not evil but too much of it is.

installing pylint is a little more complicated then necessary because it doesn’t specify it’s requirements for easy_install and it also doesn’t list download locations for logilab-common and logilab-astng in it’s cheeshop record

easy_install pylint

wget ftp://ftp.logilab.fr/pub/astng/logilab-astng-0.16.3.tar.gz wget ftp://ftp.logilab.fr/pub/common/logilab-common-0.21.1.tar.gz
then unpack them and install them:
tar -xzvf logilab-common-0.21.1.tar.gz cd logilab-common-0.21.1 python setup.py install cd .. tar -xzvf logilab-astng-0.16.3.tar.gz cd logilab-astng-0.16.3 python setup.py install
now test pylint by calling it from the command line. If all is well you should get no error messages/warnings and the standard help output.

I tried setting up a workingenv for playing with SQLAlchemy today but I ran into a number of problems. First, since I had installed pysqlite2 via Synaptix, easy_install was not finding the package. So I had to uninstall the pysqlite2 that I had installed with Synaptix and then install with easy_setup.

However, there is a bug for pysqlite on cheeseshop and no download is listed. So after inquiring on the TG mailing list, I tried:
easy_install -f http://initd.org/pub/software/pysqlite/releases/2.3/2.3.2/ pysqlite

but that failed because it couldn’t find the sqlite headers.
In file included from src/module.c:24: src/connection.h:33:21: error: sqlite3.h: No such file or directory ... error: Setup script exited with error: command 'gcc' failed with exit status 1

So I installed the libsqlite3-dev package via Synaptix — and finally all was right with the world.

I couldn’t get pysqlite to install fully into the workingenv, so I had to install it on the base system and then when I issued the
easy_install -f http://initd.org/pub/software/pysqlite/releases/2.3/2.3.2/ pysqlite
in the workingenv a proper entry was made pointing back to the package in site-packages
Adding pysqlite 2.3.2 to easy-install.pth file Using /usr/lib/python2.4/site-packages/pysqlite-2.3.2-py2.4-linux-i686.egg