<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-36147732</id><updated>2011-04-21T21:12:31.949+02:00</updated><category term='meta'/><category term='plone'/><category term='iphone'/><category term='pis'/><category term='tools'/><category term='p2p'/><category term='personal'/><category term='python'/><category term='ajax'/><category term='zope'/><category term='programming'/><category term='mac'/><category term='music'/><category term='os x'/><category term='developer'/><category term='skype'/><category term='vudo'/><category term='meta personal sprint'/><category term='projects'/><category term='c'/><title type='text'>Jesses!</title><subtitle type='html'>Jesses! Everyone needs a blog.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://seletz.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36147732/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://seletz.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Stefan Eletzhofer</name><uri>http://www.blogger.com/profile/07549423688451456139</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>30</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-36147732.post-6964092203036283842</id><published>2009-02-12T14:36:00.005+01:00</published><updated>2009-02-12T14:38:49.896+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tools'/><category scheme='http://www.blogger.com/atom/ns#' term='os x'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>Static LXML builds</title><content type='html'>I've built a recipe for building LXML on OSX boxes statically -- w/o dependencies to libxslt and libxml2.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://pypi.python.org/pypi/z3c.recipe.staticlxml"&gt;http://pypi.python.org/pypi/z3c.recipe.staticlxml&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;This works for quite some people -- please report back if it does'nt work for you (and if it works).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36147732-6964092203036283842?l=seletz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://seletz.blogspot.com/feeds/6964092203036283842/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=36147732&amp;postID=6964092203036283842' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36147732/posts/default/6964092203036283842'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36147732/posts/default/6964092203036283842'/><link rel='alternate' type='text/html' href='http://seletz.blogspot.com/2009/02/static-lxml-builds.html' title='Static LXML builds'/><author><name>Stefan Eletzhofer</name><uri>http://www.blogger.com/profile/07549423688451456139</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36147732.post-6059581656104574593</id><published>2008-06-06T19:13:00.001+02:00</published><updated>2008-06-06T19:14:29.347+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='music'/><category scheme='http://www.blogger.com/atom/ns#' term='meta'/><title type='text'>Geek Music</title><content type='html'>&lt;object width="400" height="225"&gt; &lt;param name="allowfullscreen" value="true" /&gt; &lt;param name="allowscriptaccess" value="always" /&gt; &lt;param name="movie" value="http://www.vimeo.com/moogaloop.swf?clip_id=1109226&amp;amp;server=www.vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=&amp;amp;fullscreen=1" /&gt; &lt;embed src="http://www.vimeo.com/moogaloop.swf?clip_id=1109226&amp;amp;server=www.vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=&amp;amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="400" height="225"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;a href="http://www.vimeo.com/1109226?pg=embed&amp;sec=1109226"&gt;Big Ideas (Don't get any)&lt;/a&gt; from &lt;a href="http://www.vimeo.com/user354216?pg=embed&amp;sec=1109226"&gt;1030&lt;/a&gt; on &lt;a href="http://vimeo.com?pg=embed&amp;sec=1109226"&gt;Vimeo&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36147732-6059581656104574593?l=seletz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://seletz.blogspot.com/feeds/6059581656104574593/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=36147732&amp;postID=6059581656104574593' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36147732/posts/default/6059581656104574593'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36147732/posts/default/6059581656104574593'/><link rel='alternate' type='text/html' href='http://seletz.blogspot.com/2008/06/geek-music.html' title='Geek Music'/><author><name>Stefan Eletzhofer</name><uri>http://www.blogger.com/profile/07549423688451456139</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36147732.post-2667711347086139408</id><published>2008-06-05T21:07:00.004+02:00</published><updated>2008-06-05T21:21:45.833+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='vudo'/><category scheme='http://www.blogger.com/atom/ns#' term='developer'/><category scheme='http://www.blogger.com/atom/ns#' term='tools'/><category scheme='http://www.blogger.com/atom/ns#' term='os x'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='plone'/><title type='text'>lxml on OSX -- solved</title><content type='html'>Hi guys. I've been investigating building lxml on OSX for quite some time now.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Here's the scoop so far:&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;I want to use buildout&lt;br /&gt;&lt;/li&gt;&lt;li&gt;I want NOT to use Apple's libraries (libxml, libxslt)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;On OSX there's no "--rpath" option available, thus there's no way to tell an executable on link time where to look for dynamic libraries&lt;br /&gt;&lt;/li&gt;&lt;li&gt;This is disgusting (do we have 2008 or what?)&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;Ok, that's what I've come up with. Note the &lt;span class="Apple-style-span" style="font-weight: bold;"&gt;z3c.recipe.egg&lt;/span&gt;, it allows for arguments to the setup script, which the original &lt;span class="Apple-style-span" style="font-weight: bold;"&gt;zc.recipe.egg&lt;/span&gt; does not. The version &lt;span class="Apple-style-span" style="font-weight: bold;"&gt;2.0.6 &lt;/span&gt;of lxml has a fix for OSX in, which allows to do away with &lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;DYLD_LIBRARY_PATH&lt;/span&gt;, BUT you need a &lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;DYLD_FORCE_FLAT_NAMESPACE=1&lt;/span&gt;. Don't ask. I have no idea.&lt;/div&gt;&lt;pre&gt;[lxml]&lt;br /&gt;parts=&lt;br /&gt;libxml2&lt;br /&gt;libxslt&lt;br /&gt;lxml-download&lt;br /&gt;lxml-build&lt;br /&gt;&lt;br /&gt;[libxml2]&lt;br /&gt;recipe = zc.recipe.cmmi&lt;br /&gt;url = http://ftp.gnome.org/pub/GNOME/sources/libxml2/2.6/libxml2-2.6.26.tar.gz&lt;br /&gt;extra_options = --without-python&lt;br /&gt;&lt;br /&gt;[libxslt]&lt;br /&gt;recipe = zc.recipe.cmmi&lt;br /&gt;url = http://ftp.gnome.org/pub/GNOME/sources/libxslt/1.1/libxslt-1.1.16.tar.bz2&lt;br /&gt;extra_options = --with-libxml-prefix=${buildout:directory}/parts/libxml2/&lt;br /&gt;            --without-python&lt;br /&gt;&lt;br /&gt;[lxml-download]&lt;br /&gt;recipe = plone.recipe.distros&lt;br /&gt;urls = http://codespeak.net/lxml/lxml-2.0.6.tgz&lt;br /&gt;version-suffix-packages = lxml-2.0.6.tgz&lt;br /&gt;&lt;br /&gt;[lxml-build]&lt;br /&gt;recipe = z3c.recipe.egg:setup&lt;br /&gt;setup = ${lxml-download:location}/lxml&lt;br /&gt;args =&lt;br /&gt;clean&lt;br /&gt;build&lt;br /&gt;bdist_egg&lt;br /&gt;--with-xslt-config=${buildout:directory}/parts/libxslt/bin/xslt-config&lt;br /&gt;develop = true&lt;/pre&gt;&lt;br /&gt;You use it like:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;[buildout]&lt;br /&gt;extends=&lt;br /&gt;   lxml.cfg&lt;br /&gt;parts=&lt;br /&gt;   ${lxml:parts}&lt;br /&gt;eggs=&lt;br /&gt;   ${lxml:eggs}&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36147732-2667711347086139408?l=seletz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://seletz.blogspot.com/feeds/2667711347086139408/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=36147732&amp;postID=2667711347086139408' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36147732/posts/default/2667711347086139408'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36147732/posts/default/2667711347086139408'/><link rel='alternate' type='text/html' href='http://seletz.blogspot.com/2008/06/lxml-on-osx-solved.html' title='lxml on OSX -- solved'/><author><name>Stefan Eletzhofer</name><uri>http://www.blogger.com/profile/07549423688451456139</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36147732.post-6142542216089090703</id><published>2008-05-19T20:22:00.009+02:00</published><updated>2008-05-19T20:42:31.874+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='projects'/><category scheme='http://www.blogger.com/atom/ns#' term='tools'/><category scheme='http://www.blogger.com/atom/ns#' term='os x'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>lxml on OSX -- again</title><content type='html'>Hi folks :)&lt;br /&gt;&lt;br /&gt;Today, I've again tried to install lxml on OS X. For a project I do for a customer (migrating &lt;a href="http://www.featurecreep.com/what-we-do/content-management/featurecreep-cms"&gt;featurecreep&lt;/a&gt; CMS sites to &lt;a href="http://www.plone.org"&gt;Plone&lt;/a&gt;), I use the lxml parser. I get regular segfaults, this time using python 2.4 (I use macport for python 2.4).&lt;br /&gt;I investigated again, and came along this &lt;a href="http://codespeak.net/pipermail/lxml-dev/2008-May/003632.html"&gt;post&lt;/a&gt;. The scoop is:&lt;pre&gt;after blood, sweat, and some tears (kidding) this is *all* I needed, it seems:&lt;br /&gt;&lt;br /&gt;export CFLAGS="-flat_namespace"&lt;br /&gt;&lt;br /&gt;...no static builds libxml2 libs, no buildout recipe.  I just set that and ran:&lt;br /&gt;&lt;br /&gt;python setup.py bdist_egg&lt;br /&gt;--with-xml2-config=/opt/local/bin/xml2-config&lt;br /&gt;--with-xslt-config=/opt/local/bin/xslt-config&lt;br /&gt;&lt;br /&gt;which uses the libxml2 and etc. installed by ports.  In fact, as long&lt;br /&gt;as /opt/local/bin is on my path that should work without having to set&lt;br /&gt;paths (i.e. from easy_install).  All my tests that were segfaulting&lt;br /&gt;are now passing.  This appears to be the exact same behavior I got by&lt;br /&gt;setting DYLD_FORCE_FLAT_NAMESPACE at runtime but without the side&lt;br /&gt;affect of applying itself to anything else running in my shell ;)&lt;br /&gt;&lt;br /&gt;so, I'm thinking this is just two lines of code added to cflags() ...&lt;br /&gt;&lt;br /&gt;if sys.platform in ('darwin',):&lt;br /&gt;result.append('-flat_namespace')&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Well. What can I say. Interesting poinst so far for OS X development:&lt;ul&gt;&lt;li&gt;no -rpath supported&lt;/li&gt;&lt;li&gt;no static libraries (Yup! No joke)&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36147732-6142542216089090703?l=seletz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://seletz.blogspot.com/feeds/6142542216089090703/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=36147732&amp;postID=6142542216089090703' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36147732/posts/default/6142542216089090703'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36147732/posts/default/6142542216089090703'/><link rel='alternate' type='text/html' href='http://seletz.blogspot.com/2008/05/lxml-on-osx-again.html' title='lxml on OSX -- again'/><author><name>Stefan Eletzhofer</name><uri>http://www.blogger.com/profile/07549423688451456139</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36147732.post-2787072670868482006</id><published>2008-05-18T12:33:00.000+02:00</published><updated>2008-05-18T12:34:52.350+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>Read This Post!</title><content type='html'>I found this &lt;a href="http://blog.isotoma.com/2008/05/some_thoughts_on_concurrency.html"&gt;post&lt;/a&gt; quite educating.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36147732-2787072670868482006?l=seletz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://seletz.blogspot.com/feeds/2787072670868482006/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=36147732&amp;postID=2787072670868482006' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36147732/posts/default/2787072670868482006'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36147732/posts/default/2787072670868482006'/><link rel='alternate' type='text/html' href='http://seletz.blogspot.com/2008/05/read-this-post.html' title='Read This Post!'/><author><name>Stefan Eletzhofer</name><uri>http://www.blogger.com/profile/07549423688451456139</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36147732.post-1345292266021495415</id><published>2008-05-15T23:02:00.000+02:00</published><updated>2008-05-15T23:03:40.357+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tools'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='mac'/><title type='text'>Aardvark bookmarklet</title><content type='html'>Duh.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;One should &lt;a href="http://karmatics.com/aardvark/bookmarklet.html"&gt;read on&lt;/a&gt;, THEN post.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36147732-1345292266021495415?l=seletz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://seletz.blogspot.com/feeds/1345292266021495415/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=36147732&amp;postID=1345292266021495415' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36147732/posts/default/1345292266021495415'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36147732/posts/default/1345292266021495415'/><link rel='alternate' type='text/html' href='http://seletz.blogspot.com/2008/05/aardvark-bookmarklet.html' title='Aardvark bookmarklet'/><author><name>Stefan Eletzhofer</name><uri>http://www.blogger.com/profile/07549423688451456139</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36147732.post-843746165008438665</id><published>2008-05-15T22:57:00.003+02:00</published><updated>2008-05-15T23:01:01.192+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tools'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='mac'/><title type='text'>Aardvark for Safari --- sort of</title><content type='html'>Well, this might be old news for you, but by dragging the "run demo" link on the&lt;a href="http://karmatics.com/aardvark/"&gt; Aardvark home page &lt;/a&gt;to the Safari bookmark bar actually allows you to inject Aardvark to the page your're currently viewing.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I think that's cool and useful :)&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36147732-843746165008438665?l=seletz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://seletz.blogspot.com/feeds/843746165008438665/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=36147732&amp;postID=843746165008438665' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36147732/posts/default/843746165008438665'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36147732/posts/default/843746165008438665'/><link rel='alternate' type='text/html' href='http://seletz.blogspot.com/2008/05/aardvark-for-safari-sort-of.html' title='Aardvark for Safari --- sort of'/><author><name>Stefan Eletzhofer</name><uri>http://www.blogger.com/profile/07549423688451456139</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36147732.post-4518119023243580452</id><published>2008-05-15T22:25:00.008+02:00</published><updated>2008-05-16T10:18:01.568+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='developer'/><category scheme='http://www.blogger.com/atom/ns#' term='tools'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>incredible stuff</title><content type='html'>I've just found this incredible stuff on the web. I thought I just might blog about it.&lt;br /&gt;&lt;span class="Apple-style-span"  style="font-size:large;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:large;"&gt;git shelves&lt;/span&gt;&lt;pre&gt;import gitshelve&lt;br /&gt;&lt;br /&gt;data = gitshelve.open(repository = '/tmp/data.git')&lt;br /&gt;&lt;br /&gt;data[key] = "Hello, world!"&lt;br /&gt;Data.Sync()&lt;br /&gt;del data[key]&lt;br /&gt;data.close()&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;How cool is this? Distributed CMS someone?&lt;div&gt;Original post &lt;a href="http://www.newartisans.com/blog_files/git.versioned.data.store.php"&gt;here&lt;/a&gt;. Git it &lt;a href="http://github.com/jwiegley/git-issues/tree/master"&gt;here,&lt;/a&gt;&lt;br /&gt;&lt;span class="Apple-style-span"  style="font-size:large;"&gt;processing on **javascript**&lt;/span&gt;&lt;a href="http://ejohn.org/"&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://ejohn.org/"&gt;This guy&lt;/a&gt; actually ported the &lt;a href="http://processing.org/"&gt;processing language&lt;/a&gt; to Javascript.&lt;/div&gt;&lt;div&gt;Thats f***ing awesome!&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36147732-4518119023243580452?l=seletz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://seletz.blogspot.com/feeds/4518119023243580452/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=36147732&amp;postID=4518119023243580452' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36147732/posts/default/4518119023243580452'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36147732/posts/default/4518119023243580452'/><link rel='alternate' type='text/html' href='http://seletz.blogspot.com/2008/05/incredible-stuff.html' title='incredible stuff'/><author><name>Stefan Eletzhofer</name><uri>http://www.blogger.com/profile/07549423688451456139</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36147732.post-4894225866391818791</id><published>2008-05-09T01:08:00.003+02:00</published><updated>2008-05-09T01:21:38.833+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='vudo'/><category scheme='http://www.blogger.com/atom/ns#' term='developer'/><category scheme='http://www.blogger.com/atom/ns#' term='tools'/><category scheme='http://www.blogger.com/atom/ns#' term='os x'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>LXML on OS X (again)</title><content type='html'>It seems that building &lt;a href="http://codespeak.net/lxml/index.html#download"&gt;lxml&lt;/a&gt; on Mac OS X is still a problem. I'm trying to use buildout as in:&lt;pre&gt;[libxslt]&lt;br /&gt;recipe = zc.recipe.cmmi&lt;br /&gt;url = http://ftp.gnome.org/pub/GNOME/sources/libxslt/1.1/libxslt-1.1.16.tar.bz2&lt;br /&gt;extra_options = --with-libxml-prefix=${buildout:directory}/parts/libxml2/&lt;br /&gt;              --without-python&lt;br /&gt;&lt;br /&gt;[lxml]&lt;br /&gt;recipe = zc.recipe.egg:custom&lt;br /&gt;egg = lxml&lt;br /&gt;include-dirs = ${buildout:directory}/parts/libxml2/include/libxml2&lt;br /&gt;             ${buildout:directory}/parts/libxslt/include&lt;br /&gt;library-dirs = ${buildout:directory}/parts/libxml2/lib&lt;br /&gt;             ${buildout:directory}/parts/libxslt/lib&lt;br /&gt;rpath = ${buildout:directory}/parts/libxml2/lib&lt;br /&gt;      ${buildout:directory}/parts/libxslt/lib&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;That fails when buildout tries to build the lxml egg. Looking closely at the error, I discovered that despite pointing it at the libxslt built, it still uses the one found in /usr/lib.&lt;br /&gt;&lt;br /&gt;To be more specific: lxml tries to find &lt;b&gt;xslt-config&lt;/b&gt;, which is in &lt;b&gt;$BO/parts/libxslt/bin/xslt-config&lt;/b&gt;, but of course finds the one in &lt;b&gt;/usr/bin&lt;/b&gt; first.&lt;br /&gt;&lt;br /&gt;What I'd like to do is to add something like:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;# this would be needed but zc.recipe.egg:custom doesn't allow for that&lt;br /&gt;# Doh.&lt;br /&gt;extra_options= --with-xslt-config=${buildout:directory}/parts/libxslt/bin/xslt-config&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;That option is available in &lt;b&gt;zc.recipe.cmmi&lt;/b&gt;, but not in &lt;b&gt;zc.recipe.egg&lt;/b&gt;. Looking at &lt;b&gt;custom.py&lt;/b&gt; there I sadly found no obvious way to add this as it uses some version of &lt;b&gt;easy_install&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;D'oh.&lt;br /&gt;&lt;br /&gt;Possible solutions:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;build egg manually, add to egg cache (yuck-bleah)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;build manually for OS X, add to own egg server (yuck)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;roll-my-own recipe (work)&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36147732-4894225866391818791?l=seletz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://seletz.blogspot.com/feeds/4894225866391818791/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=36147732&amp;postID=4894225866391818791' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36147732/posts/default/4894225866391818791'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36147732/posts/default/4894225866391818791'/><link rel='alternate' type='text/html' href='http://seletz.blogspot.com/2008/05/lxml-on-os-x-again.html' title='LXML on OS X (again)'/><author><name>Stefan Eletzhofer</name><uri>http://www.blogger.com/profile/07549423688451456139</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36147732.post-7252250728904494466</id><published>2008-05-08T10:50:00.003+02:00</published><updated>2008-05-08T11:03:25.902+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='developer'/><category scheme='http://www.blogger.com/atom/ns#' term='tools'/><category scheme='http://www.blogger.com/atom/ns#' term='os x'/><title type='text'>Use git -- have more fun.</title><content type='html'>Following this &lt;a href="http://www.mustap.com/pythonzone_post_240_selfnote--svn-import-with-gi"&gt;post&lt;/a&gt;, I was lured into trying the git svn backend. We're using SVN at our office for hysterical reasons and this seemed a good way to use git locally and svn as a backend.&lt;br /&gt;&lt;br /&gt;So basically what you do is:&lt;br /&gt;&lt;pre&gt;$ mkdir somedir&lt;br /&gt;$ cd somedir&lt;br /&gt;$ git-svn init -s $svnurl&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;That will initialize the git repository. The &lt;span class="Apple-style-span" style="font-family: -webkit-monospace; font-size: 13px; white-space: pre; "&gt;-s &lt;/span&gt;tells git-svn to assume the standard directory scheme for tags and branches, that is, below the svnurl &lt;svnurl&gt; there should be a "tags", "branches", "releases". Now fetch the repo:&lt;br /&gt;&lt;pre&gt;$ git-svn fetch&lt;br /&gt;&lt;/pre&gt;That'll suck all svn revisions to your local git repo.&lt;br /&gt;Now hack away and use the usual git commands to check in locally.&lt;br /&gt;&lt;br /&gt;Use something like &lt;a href="http://groups.google.com/group/gitnub"&gt;gitNub&lt;/a&gt; to view the repository changes.&lt;/svnurl&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Enjoy :)&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36147732-7252250728904494466?l=seletz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://seletz.blogspot.com/feeds/7252250728904494466/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=36147732&amp;postID=7252250728904494466' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36147732/posts/default/7252250728904494466'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36147732/posts/default/7252250728904494466'/><link rel='alternate' type='text/html' href='http://seletz.blogspot.com/2008/05/use-git-have-more-fun.html' title='Use git -- have more fun.'/><author><name>Stefan Eletzhofer</name><uri>http://www.blogger.com/profile/07549423688451456139</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36147732.post-4530180706144526968</id><published>2008-05-07T22:09:00.004+02:00</published><updated>2008-05-07T22:20:26.181+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tools'/><category scheme='http://www.blogger.com/atom/ns#' term='os x'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>git +ssh on a mac using macports</title><content type='html'>To get &lt;a href="http://git.or.cz/"&gt;git&lt;/a&gt; installed with &lt;a href="http://subversion.tigris.org/"&gt;subversion&lt;/a&gt; support using &lt;a href="http://www.macports.org/"&gt;macports&lt;/a&gt; you need to do the following:&lt;pre&gt;$ sudo port install git-core +ssh&lt;/pre&gt;Note the &lt;b&gt;+ssh&lt;/b&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36147732-4530180706144526968?l=seletz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://seletz.blogspot.com/feeds/4530180706144526968/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=36147732&amp;postID=4530180706144526968' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36147732/posts/default/4530180706144526968'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36147732/posts/default/4530180706144526968'/><link rel='alternate' type='text/html' href='http://seletz.blogspot.com/2008/05/git-ssh-on-mac-using-macports.html' title='git +ssh on a mac using macports'/><author><name>Stefan Eletzhofer</name><uri>http://www.blogger.com/profile/07549423688451456139</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36147732.post-5535458426314177280</id><published>2008-05-07T12:02:00.004+02:00</published><updated>2008-05-07T12:15:48.259+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='vudo'/><category scheme='http://www.blogger.com/atom/ns#' term='developer'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='zope'/><title type='text'>Yo! Back from NYC vudo sprint.</title><content type='html'>I'm still a bit exhausted from the coding marathon we did at the NYC &lt;a href="http://groups.google.com/group/vudo"&gt;vudo&lt;/a&gt; sprint.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;We had a great time and I enjoyed pair programming with &lt;a href="http://mockit.blogspot.com/"&gt;Malthe Borch&lt;/a&gt; very much.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;We did some sort of ZODB abstraction using &lt;a href="http://www.sqlalchemy.org/"&gt;SQLAlchemy&lt;/a&gt; called &lt;a href="http://pypi.python.org/pypi/z3c.dobbin"&gt;z3c.dobbin&lt;/a&gt;. That is, z3c.dobbin uses the z3 schemata (interfaces!) to transparently create SQL tables. Each table will map to one single interface, and dobbin will join these tables based on a dynamically created mapper. That means, that every interface is available separately for doing SQL queries. This should allow for pretty fast and intuitive queries.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;We're going to use a relatively new approach to editing web pages -- it'll be more page centric in contrast to being content type centric. There simply will not be any content types in &lt;a href="http://groups.google.com/group/vudo"&gt;vudo&lt;/a&gt;.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Also the skinning will be completely different -- we'll use the designed mock-ups directly, and we'll server them unaltered. That compares a little to deliverance, but only a little. We'll call these mock ups "layouts" and each page in &lt;a href="http://groups.google.com/group/vudo"&gt;vudo&lt;/a&gt; is associated with a lay out. These layouts define "regions", where vudo inserts rendered content at run time. All this is configured using a ZCML directive -- that is w/o touching the mock up, and w/o having the designer be forced to do special markup (e.g. using class prefixes or id prefixes).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I think that's cool :)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;And I can't wait to replace this crappy blogging interface with &lt;a href="http://groups.google.com/group/vudo"&gt;vudo&lt;/a&gt; ...&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36147732-5535458426314177280?l=seletz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://seletz.blogspot.com/feeds/5535458426314177280/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=36147732&amp;postID=5535458426314177280' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36147732/posts/default/5535458426314177280'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36147732/posts/default/5535458426314177280'/><link rel='alternate' type='text/html' href='http://seletz.blogspot.com/2008/05/yo-back-from-nyc-vudo-sprint.html' title='Yo! Back from NYC vudo sprint.'/><author><name>Stefan Eletzhofer</name><uri>http://www.blogger.com/profile/07549423688451456139</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36147732.post-6832952650229856029</id><published>2008-05-07T11:57:00.003+02:00</published><updated>2008-05-07T12:02:23.403+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='vudo'/><category scheme='http://www.blogger.com/atom/ns#' term='developer'/><category scheme='http://www.blogger.com/atom/ns#' term='mac'/><category scheme='http://www.blogger.com/atom/ns#' term='iphone'/><title type='text'>iPhone Developer Program</title><content type='html'>Yes! I've got a mail from Apple that I'm accepted to the &lt;a href="http://developer.apple.com/iphone/"&gt;iPhone developer&lt;/a&gt; program!&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I hope I can make my ideas become real -- I want to have a native front end on my iPhone&lt;/div&gt;&lt;div&gt;to the web &lt;a href="http://groups.google.com/group/vudo"&gt;framework&lt;/a&gt; I'm going to use Really Soon Now (TM).&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36147732-6832952650229856029?l=seletz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://seletz.blogspot.com/feeds/6832952650229856029/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=36147732&amp;postID=6832952650229856029' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36147732/posts/default/6832952650229856029'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36147732/posts/default/6832952650229856029'/><link rel='alternate' type='text/html' href='http://seletz.blogspot.com/2008/05/iphone-developer-program.html' title='iPhone Developer Program'/><author><name>Stefan Eletzhofer</name><uri>http://www.blogger.com/profile/07549423688451456139</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36147732.post-7059592761935526893</id><published>2008-04-22T21:54:00.004+02:00</published><updated>2008-04-22T22:07:49.523+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='meta personal sprint'/><title type='text'>Time passed ....</title><content type='html'>.... and things happened:&lt;div&gt;&lt;ul&gt;&lt;li&gt;I was at the Plone Conference '07&lt;/li&gt;&lt;li&gt;I was at this year's Snow Sprint&lt;/li&gt;&lt;/ul&gt;And most exiting to me, I'll visit NYC the first time in my life to get &lt;a href="http://groups.google.com/group/vudo/web/first-ever-vudo-sprint-in-new-york-city"&gt;hands on&lt;/a&gt; some really cool &lt;a href="http://mockit.blogspot.com/2008/04/yes-theyre-stereotypes.html"&gt;stuff&lt;/a&gt;.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I'm really into python and web programming now, &lt;a href="http://armlinux.simtec.co.uk/kautobuild/2.6.16-rc3-git6/hackkit_defconfig.html#machine_255"&gt;leaving&lt;/a&gt; &lt;a href="http://sourceforge.net/projects/blob"&gt;my&lt;/a&gt; old &lt;a href="http://www.inquant.de/nachrichten/metric_esdk_tum/"&gt;work&lt;/a&gt; &lt;a href="http://www.xenomai.org/index.php/Main_Page"&gt;behind&lt;/a&gt;.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Other than that, I've started (again) to work for zest to help paying bills.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36147732-7059592761935526893?l=seletz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://seletz.blogspot.com/feeds/7059592761935526893/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=36147732&amp;postID=7059592761935526893' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36147732/posts/default/7059592761935526893'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36147732/posts/default/7059592761935526893'/><link rel='alternate' type='text/html' href='http://seletz.blogspot.com/2008/04/time-passed.html' title='Time passed ....'/><author><name>Stefan Eletzhofer</name><uri>http://www.blogger.com/profile/07549423688451456139</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36147732.post-6677054291563867944</id><published>2007-04-25T17:51:00.000+02:00</published><updated>2007-04-25T17:59:08.045+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='plone'/><category scheme='http://www.blogger.com/atom/ns#' term='meta'/><title type='text'>Ahhhh, new post at last.</title><content type='html'>Wohoo. A new post.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Finally we sorted out some issues at my &lt;a href="http://www.inquant.de/"&gt;company&lt;/a&gt;, where I'm partner.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;And I got more into Python and Plone. I visited some Plone sprints:&lt;/div&gt;&lt;div&gt;&lt;ul id=""&gt;&lt;li&gt;the &lt;a href="http://plone.org/events/sprints/past-sprints/toerggelen/"&gt;Toerggelen Sprint&lt;/a&gt;&lt;/li&gt;&lt;li&gt;The &lt;a href="http://plone.org/events/sprints/past-sprints/snow-sprint-2007/"&gt;Snow Sprint 2007&lt;/a&gt;&lt;/li&gt;&lt;li&gt;The &lt;a href="http://plone.org/events/sprints/sorrento-sprint-2007/"&gt;Sorrento Sprint 2007&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I'll try to attend some more, like the sprint in &lt;a href="http://plone.org/events/sprints/potsdam-sprint-2007/"&gt;Potsdam&lt;/a&gt; later this year.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Oh, yes, the &lt;a href="http://plone.org/events/conferences/2007/"&gt;Plone Conference and Sprint&lt;/a&gt;? I'll be there! &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36147732-6677054291563867944?l=seletz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://seletz.blogspot.com/feeds/6677054291563867944/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=36147732&amp;postID=6677054291563867944' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36147732/posts/default/6677054291563867944'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36147732/posts/default/6677054291563867944'/><link rel='alternate' type='text/html' href='http://seletz.blogspot.com/2007/04/ahhhh-new-post-at-last.html' title='Ahhhh, new post at last.'/><author><name>Stefan Eletzhofer</name><uri>http://www.blogger.com/profile/07549423688451456139</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36147732.post-5410917474306711620</id><published>2006-11-01T16:29:00.000+01:00</published><updated>2006-11-03T20:43:41.277+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>Divmod.org AXIOM Ressources.</title><content type='html'>&lt;blockquote&gt;&lt;/blockquote&gt;What is &lt;a href="http://www.divmod.org/trac/wiki/DivmodAxiom"&gt;Axiom&lt;/a&gt;?&lt;br /&gt;&lt;br /&gt;Some quotes:&lt;br /&gt;"Axiom's goal is to provide an efficient, non-SQL interface to an existing relational database." &lt;a href="http://jcalderone.livejournal.com/12221.html"&gt;here&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://divmod.org/trac/wiki/DivmodAxiom/WhyAxiom"&gt;Why&lt;/a&gt; ise it?&lt;br /&gt;&lt;br /&gt;Axiom is &lt;a href="http://william-os4y.livejournal.com/1271.html"&gt;fast&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;The question for me is, how does Axiom differ from SQLObject, SQLAlchemy or TurboEntity?&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36147732-5410917474306711620?l=seletz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://seletz.blogspot.com/feeds/5410917474306711620/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=36147732&amp;postID=5410917474306711620' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36147732/posts/default/5410917474306711620'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36147732/posts/default/5410917474306711620'/><link rel='alternate' type='text/html' href='http://seletz.blogspot.com/2006/11/divmodorg-axiom-ressources.html' title='Divmod.org AXIOM Ressources.'/><author><name>Stefan Eletzhofer</name><uri>http://www.blogger.com/profile/07549423688451456139</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36147732.post-8356820430826271816</id><published>2006-11-01T15:47:00.000+01:00</published><updated>2006-11-03T20:42:39.779+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ajax'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>AJAX links</title><content type='html'>While surfing the web I just found these ressources about AJAX and &lt;a href="http://mochikit.com/"&gt;Mochikit&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Heres the website of "&lt;a href="http://www.theajaxexperience.com/show_view.jsp?showId=59"&gt;The Ajax Exprience&lt;/a&gt;" event.&lt;br /&gt;&lt;br /&gt;Here are some &lt;a href="http://bob.pythonmac.org/archives/2006/05/11/mochikit-intro-ajax-experience-slides/"&gt;slides&lt;/a&gt; for an Mochikt tutorial. These slides are written for &lt;a href="http://www.meyerweb.com/eric/tools/s5/"&gt;S5&lt;/a&gt; using &lt;a href="http://docutils.sourceforge.net/docs/user/slide-shows.html"&gt;rst2s5&lt;/a&gt; from python &lt;a href="http://docutils.sourceforge.net/"&gt;docutils&lt;/a&gt;. Need to investigate!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36147732-8356820430826271816?l=seletz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://seletz.blogspot.com/feeds/8356820430826271816/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=36147732&amp;postID=8356820430826271816' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36147732/posts/default/8356820430826271816'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36147732/posts/default/8356820430826271816'/><link rel='alternate' type='text/html' href='http://seletz.blogspot.com/2006/11/ajax-links.html' title='AJAX links'/><author><name>Stefan Eletzhofer</name><uri>http://www.blogger.com/profile/07549423688451456139</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36147732.post-6323510665505809812</id><published>2006-11-01T15:40:00.000+01:00</published><updated>2006-11-03T20:41:02.913+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>Agile Development</title><content type='html'>In my current search for a development model which works better when working in  a team I have these links to share:&lt;br /&gt;&lt;br /&gt;A review of a the book "Agile Estimating and Planning" by Marc Cohen &lt;a href="http://blog.isotoma.com/2006/05/book_review_agile_estimating_a.html"&gt;here&lt;/a&gt; at &lt;a href="http://blog.isotoma.com/"&gt;isotoma&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;A list of articles &lt;a href="http://www.agilealliancebeta.org/article/articles_by_category/42"&gt;here&lt;/a&gt; at the &lt;a href="http://www.agilealliancebeta.org/home"&gt;Agile Alliance&lt;/a&gt; website.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36147732-6323510665505809812?l=seletz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://seletz.blogspot.com/feeds/6323510665505809812/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=36147732&amp;postID=6323510665505809812' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36147732/posts/default/6323510665505809812'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36147732/posts/default/6323510665505809812'/><link rel='alternate' type='text/html' href='http://seletz.blogspot.com/2006/11/agile-development.html' title='Agile Development'/><author><name>Stefan Eletzhofer</name><uri>http://www.blogger.com/profile/07549423688451456139</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36147732.post-606427976856556420</id><published>2006-10-31T01:19:00.000+01:00</published><updated>2006-10-31T01:34:53.589+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='p2p'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>p2p -&gt; q2q</title><content type='html'>I've been playing around with &lt;a href="http://divmod.org/"&gt;&lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;divmod&lt;/span&gt;.org&lt;/a&gt; &lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;quotiont&lt;/span&gt; 2 quotient protocol implementation called &lt;a href="http://divmod.org/trac/wiki/DivmodVertex"&gt;vertex&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;The q2q protocol is a p2p protocol where you can basically connect to a thing called a "resource".&lt;br /&gt;&lt;br /&gt;The Protocol offers resource &lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-corrected" id="SPELLING_ERROR_2"&gt;look up&lt;/span&gt; (Where is X?) and authentication (Is it X I'm talking to). The most &lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-corrected" id="SPELLING_ERROR_3"&gt;interesting&lt;/span&gt; bit for me is that they implemented STUN and NAT traversal.&lt;br /&gt;&lt;br /&gt;Vertex is a demo and proof-of-concept type implementation of this protocol which uses this protocol to authenticate users and send files through the connection.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36147732-606427976856556420?l=seletz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://seletz.blogspot.com/feeds/606427976856556420/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=36147732&amp;postID=606427976856556420' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36147732/posts/default/606427976856556420'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36147732/posts/default/606427976856556420'/><link rel='alternate' type='text/html' href='http://seletz.blogspot.com/2006/10/p2p-q2q.html' title='p2p -&gt; q2q'/><author><name>Stefan Eletzhofer</name><uri>http://www.blogger.com/profile/07549423688451456139</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36147732.post-4259288362488584481</id><published>2006-10-25T00:59:00.000+02:00</published><updated>2006-10-25T01:09:34.659+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='projects'/><category scheme='http://www.blogger.com/atom/ns#' term='skype'/><category scheme='http://www.blogger.com/atom/ns#' term='os x'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>Success!</title><content type='html'>Yeee-haaa!&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;I've just connected to Skype using Python and the Skype API Framework. I get  notifications, and  can  send commands:&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;seletz@yeti:~/develop/python/pyskype/test $python skypeapi-test-osx.py&lt;br /&gt;2006-10-25 01:05:55.934 Python[14094] running event loop&lt;br /&gt;2006-10-25 01:05:56.935 Python[14094] connecting to skype&lt;br /&gt;2006-10-25 01:05:56.941 Python[14094] waiting ....&lt;br /&gt;2006-10-25 01:06:00.547 Python[14094] skypeAttachResponse: 1&lt;br /&gt;2006-10-25 01:06:00.576 Python[14094] skypeNotificationReceived: CONNSTATUS ONLINE&lt;br /&gt;2006-10-25 01:06:00.578 Python[14094] skypeNotificationReceived: CURRENTUSERHANDLE seletz29&lt;br /&gt;2006-10-25 01:06:00.578 Python[14094] skypeNotificationReceived: USERSTATUS ONLINE&lt;br /&gt;2006-10-25 01:06:06.942 Python[14094] sending&lt;br /&gt;2006-10-25 01:06:06.942 Python[14094] got answer: None&lt;br /&gt;2006-10-25 01:06:06.943 Python[14094] skypeNotificationReceived: PROTOCOL 1&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;I've started a new &lt;a href="http://code.google.com/p/pyskype/source"&gt;project&lt;/a&gt; at &lt;a href="http://code.google.com"&gt;Google Code&lt;/a&gt;, where I try to create a platform-independent Python wrapper for the Skype API.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;The trick was, of course, &lt;span style="font-weight: bold;"&gt;RTFM&lt;/span&gt;. I just needed to use PyObjC to create a informal protocol for the delegate class I use to connect with the Skype API. It's rather byzantine how Apple &lt;a href="http://developer.apple.com/documentation/Cocoa/Conceptual/ObjectiveC/index.html"&gt;encodes&lt;/a&gt; type information.&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36147732-4259288362488584481?l=seletz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://seletz.blogspot.com/feeds/4259288362488584481/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=36147732&amp;postID=4259288362488584481' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36147732/posts/default/4259288362488584481'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36147732/posts/default/4259288362488584481'/><link rel='alternate' type='text/html' href='http://seletz.blogspot.com/2006/10/success.html' title='Success!'/><author><name>Stefan Eletzhofer</name><uri>http://www.blogger.com/profile/07549423688451456139</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36147732.post-921212974261154733</id><published>2006-10-24T11:27:00.000+02:00</published><updated>2006-10-24T11:41:37.187+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='skype'/><category scheme='http://www.blogger.com/atom/ns#' term='os x'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>WiKi entry on Skype Devzone</title><content type='html'>&lt;div style="text-align: justify;"&gt;I've created a &lt;a href="https://developer.skype.com/wiki/CodeSnippets#preview"&gt;&lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;WiKi&lt;/span&gt; entry&lt;/a&gt; over at the &lt;a href="https://developer.skype.com/DevZone"&gt;&lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;Skype&lt;/span&gt; &lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_2"&gt;Devzone&lt;/span&gt;&lt;/a&gt; &lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_3"&gt;WiKi&lt;/span&gt; about code snippets. Unfortunately, you need a &lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_4"&gt;Skype&lt;/span&gt; Account to use that &lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_5"&gt;WiKi&lt;/span&gt;. &lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_6"&gt;Doh&lt;/span&gt;.&lt;span class="" style="display: block;" id="formatbar_CreateLink" title="Link" onmouseover="ButtonHoverOn(this);" onmouseout="ButtonHoverOff(this);" onmouseup="" onmousedown="CheckFormatting(event);FormatbarButton('richeditorframe', this, 8);ButtonMouseDown(this);"&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;I plan to investigate all  available OS  Versions of  the &lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_7"&gt;Skype&lt;/span&gt; API and build a common Python wrapper for it.&lt;a href="http://pyobjc.sourceforge.net/doc/intro.php"&gt;&lt;span class="down" style="display: block;" id="formatbar_CreateLink" title="Link" onmouseover="ButtonHoverOn(this);" onmouseout="ButtonHoverOff(this);" onmouseup="" onmousedown="CheckFormatting(event);FormatbarButton('richeditorframe', this, 8);ButtonMouseDown(this);"&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36147732-921212974261154733?l=seletz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://seletz.blogspot.com/feeds/921212974261154733/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=36147732&amp;postID=921212974261154733' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36147732/posts/default/921212974261154733'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36147732/posts/default/921212974261154733'/><link rel='alternate' type='text/html' href='http://seletz.blogspot.com/2006/10/wiki-entry-on-skype-devzone.html' title='WiKi entry on Skype Devzone'/><author><name>Stefan Eletzhofer</name><uri>http://www.blogger.com/profile/07549423688451456139</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36147732.post-8459659296339186298</id><published>2006-10-23T22:43:00.000+02:00</published><updated>2006-10-24T11:43:45.724+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='skype'/><category scheme='http://www.blogger.com/atom/ns#' term='os x'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>Skype API on OS X</title><content type='html'>&lt;div style="text-align: justify;"&gt;Well here's my code &lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-corrected" id="SPELLING_ERROR_0"&gt;so far&lt;/span&gt;. It uses &lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;pyobjc&lt;/span&gt; to fetch the &lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_2"&gt;Skype&lt;/span&gt; Public API framework and then defines a class to be used as a delegate for the &lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_3"&gt;Skype&lt;/span&gt; API. &lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_4"&gt;Skype&lt;/span&gt; is &lt;span style="font-weight: bold;"&gt;&lt;span style="font-style: italic;"&gt;&lt;span style="font-weight: bold;"&gt;supposed&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; to call the &lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_5"  style="font-family:courier new;"&gt;skypeAttachResponse&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;()&lt;/span&gt; callback, but that does not happen.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;BTW, note the magic in the &lt;span style="font-family:courier new;"&gt;objc.loadBundle() &lt;/span&gt;call ....&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Sending messages to the &lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_6"&gt;Skype&lt;/span&gt; API then results in a log message stating that no client is attached. &lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_7"&gt;Doh&lt;/span&gt;.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Calling &lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_8"  style="font-family:courier new;"&gt;isSkypeRunning()&lt;/span&gt; &lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_9"&gt;et&lt;/span&gt; &lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_10"&gt;al&lt;/span&gt; works, so I'm actually pretty sure that I'm talking to the &lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_11"&gt;Skype&lt;/span&gt; API ;)&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Any pointers would be greatly appreciated ;)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Update: &lt;/span&gt;I noticed that the signature of the callback methods of my Python Delegator class is probably not correct. I'll investigate further. There are pointers to that inside the &lt;a href="http://pyobjc.sourceforge.net/doc/intro.php#accessing-python-objects-from-objective-c"&gt;PyObjC docs&lt;/a&gt;.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;span style="color: rgb(160, 32, 240);"&gt;import&lt;/span&gt; &lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_12"&gt;objc&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(160, 32, 240);"&gt;from&lt;/span&gt; Foundation &lt;span style="color: rgb(160, 32, 240);"&gt;import&lt;/span&gt; *&lt;br /&gt;&lt;br /&gt;&lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_13"&gt;objc&lt;/span&gt;.&lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_14"&gt;loadBundle&lt;/span&gt;( &lt;span style="background-color: rgb(255, 255, 255);"&gt;"&lt;/span&gt;&lt;span style="color: rgb(242, 8, 132);"&gt;&lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_15"&gt;SkypeAPI&lt;/span&gt;&lt;/span&gt;&lt;span style="background-color: rgb(255, 255, 255);"&gt;"&lt;/span&gt;, &lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_16"&gt;globals&lt;/span&gt;(),&lt;br /&gt;bundle_path=&lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_17"&gt;objc&lt;/span&gt;.&lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_18"&gt;pathForFramework&lt;/span&gt;( &lt;span style="background-color: rgb(255, 255, 255);"&gt;\&lt;br /&gt;"&lt;/span&gt;&lt;span style="color: rgb(242, 8, 132);"&gt;~/Library/Frameworks/&lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_19"&gt;Skype&lt;/span&gt;.framework&lt;/span&gt;&lt;span style="background-color: rgb(255, 255, 255);"&gt;"&lt;/span&gt; ) )&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 212);"&gt;#&lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_20"&gt;objc&lt;/span&gt;.&lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_21"&gt;setSignatureForSelector&lt;/span&gt;( "&lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_22"&gt;SkypeAPI&lt;/span&gt;",&lt;br /&gt;#   "&lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_23"&gt;sendSkypeCommand&lt;/span&gt;:", "v@N^@:@" )&lt;/span&gt;&lt;br /&gt;&lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_24"&gt;SkypeAPIDelegate&lt;/span&gt; = &lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_25"&gt;objc&lt;/span&gt;.&lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_26"&gt;protocolNamed&lt;/span&gt;( &lt;span style="background-color: rgb(255, 255, 255);"&gt;"&lt;/span&gt;&lt;span style="color: rgb(242, 8, 132);"&gt;&lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_27"&gt;SkypeAPIDelegate&lt;/span&gt;&lt;/span&gt;&lt;span style="background-color: rgb(255, 255, 255);"&gt;"&lt;/span&gt; )&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(128, 64, 64);"&gt;&lt;b&gt;class&lt;/b&gt;&lt;/span&gt; &lt;span style="color: rgb(0, 128, 128);"&gt;Delegate&lt;/span&gt;(&lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_28"&gt;NSObject&lt;/span&gt;, &lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_29"&gt;SkypeAPIDelegate&lt;/span&gt;):&lt;br /&gt;&lt;span style="color: rgb(128, 64, 64);"&gt;&lt;b&gt;def&lt;/b&gt;&lt;/span&gt; &lt;span style="color: rgb(0, 128, 128);"&gt;&lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_30"&gt;init&lt;/span&gt;&lt;/span&gt;(self, app_name):&lt;br /&gt;  self = super( Delegate, self).&lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_31"&gt;init&lt;/span&gt;()&lt;br /&gt;  &lt;span style="color: rgb(128, 64, 64);"&gt;&lt;b&gt;if&lt;/b&gt;&lt;/span&gt; self &lt;span style="color: rgb(128, 64, 64);"&gt;&lt;b&gt;is&lt;/b&gt;&lt;/span&gt; None:&lt;br /&gt;      &lt;span style="color: rgb(128, 64, 64);"&gt;&lt;b&gt;return&lt;/b&gt;&lt;/span&gt; None&lt;br /&gt;&lt;br /&gt;  self._&lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_32"&gt;appname&lt;/span&gt; = app_name&lt;br /&gt;&lt;br /&gt;  &lt;span style="color: rgb(128, 64, 64);"&gt;&lt;b&gt;return&lt;/b&gt;&lt;/span&gt; self&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(128, 64, 64);"&gt;&lt;b&gt;def&lt;/b&gt;&lt;/span&gt; &lt;span style="color: rgb(0, 128, 128);"&gt;&lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_33"&gt;clientApplicationName&lt;/span&gt;&lt;/span&gt;( self ):&lt;br /&gt;  &lt;span style="color: rgb(128, 64, 64);"&gt;&lt;b&gt;return&lt;/b&gt;&lt;/span&gt; self._&lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_34"&gt;appname&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(128, 64, 64);"&gt;&lt;b&gt;def&lt;/b&gt;&lt;/span&gt; &lt;span style="color: rgb(0, 128, 128);"&gt;&lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_35"&gt;skypeAttachResponse&lt;/span&gt;&lt;/span&gt;( self, code ):&lt;br /&gt;  &lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_36"&gt;NSLog&lt;/span&gt;( &lt;span style="background-color: rgb(255, 255, 255);"&gt;"&lt;/span&gt;&lt;span style="color: rgb(242, 8, 132);"&gt;&lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_37"&gt;skypeAttachResponse&lt;/span&gt;: %d&lt;/span&gt;&lt;span style="background-color: rgb(255, 255, 255);"&gt;"&lt;/span&gt; % ( code ) )&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(128, 64, 64);"&gt;&lt;b&gt;def&lt;/b&gt;&lt;/span&gt; &lt;span style="color: rgb(0, 128, 128);"&gt;&lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_38"&gt;skypeNotificationReceived&lt;/span&gt;&lt;/span&gt;( self, &lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_39"&gt;nsstring&lt;/span&gt; ):&lt;br /&gt;  &lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_40"&gt;NSLog&lt;/span&gt;( &lt;span style="background-color: rgb(255, 255, 255);"&gt;"&lt;/span&gt;&lt;span style="color: rgb(242, 8, 132);"&gt;&lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_41"&gt;skypeNotificationReceivest&lt;/span&gt;: %s&lt;/span&gt;&lt;span style="background-color: rgb(255, 255, 255);"&gt;"&lt;/span&gt; % ( &lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_42"&gt;nsstring&lt;/span&gt; ) )&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(128, 64, 64);"&gt;&lt;b&gt;def&lt;/b&gt;&lt;/span&gt; &lt;span style="color: rgb(0, 128, 128);"&gt;&lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_43"&gt;skypeBecameAvailable&lt;/span&gt;&lt;/span&gt;( self, notification ):&lt;br /&gt;  &lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_44"&gt;NSLog&lt;/span&gt;( &lt;span style="background-color: rgb(255, 255, 255);"&gt;"&lt;/span&gt;&lt;span style="color: rgb(242, 8, 132);"&gt;&lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_45"&gt;skypeBecameAvailable&lt;/span&gt;: %s&lt;/span&gt;&lt;span style="background-color: rgb(255, 255, 255);"&gt;"&lt;/span&gt; % ( notification ) )&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(128, 64, 64);"&gt;&lt;b&gt;def&lt;/b&gt;&lt;/span&gt; &lt;span style="color: rgb(0, 128, 128);"&gt;&lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_46"&gt;skypeBecameUnavailable&lt;/span&gt;&lt;/span&gt;( self, notification ):&lt;br /&gt;  &lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_47"&gt;NSLog&lt;/span&gt;( &lt;span style="background-color: rgb(255, 255, 255);"&gt;"&lt;/span&gt;&lt;span style="color: rgb(242, 8, 132);"&gt;&lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_48"&gt;skypeBecameUnavailable&lt;/span&gt;: %s&lt;/span&gt;&lt;span style="background-color: rgb(255, 255, 255);"&gt;"&lt;/span&gt; % ( notification ) )&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(128, 64, 64);"&gt;&lt;b&gt;def&lt;/b&gt;&lt;/span&gt; &lt;span style="color: rgb(0, 128, 128);"&gt;do_connect&lt;/span&gt;():&lt;br /&gt;delegate = Delegate.alloc().init( &lt;span style="background-color: rgb(255, 255, 255);"&gt;"&lt;/span&gt;&lt;span style="color: rgb(242, 8, 132);"&gt;&lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_49"&gt;testapp&lt;/span&gt;&lt;/span&gt;&lt;span style="background-color: rgb(255, 255, 255);"&gt;"&lt;/span&gt; )&lt;br /&gt;&lt;br /&gt;&lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_50"&gt;NSLog&lt;/span&gt;( &lt;span style="background-color: rgb(255, 255, 255);"&gt;"&lt;/span&gt;&lt;span style="color: rgb(242, 8, 132);"&gt;connecting to &lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_51"&gt;skype&lt;/span&gt;&lt;/span&gt;&lt;span style="background-color: rgb(255, 255, 255);"&gt;"&lt;/span&gt; )&lt;br /&gt;&lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_52"&gt;SkypeAPI&lt;/span&gt;.&lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_53"&gt;setSkypeDelegate&lt;/span&gt;_( delegate )&lt;br /&gt;&lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_54"&gt;SkypeAPI&lt;/span&gt;.connect()&lt;br /&gt;&lt;br /&gt;&lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_55"&gt;NSLog&lt;/span&gt;( &lt;span style="background-color: rgb(255, 255, 255);"&gt;"&lt;/span&gt;&lt;span style="color: rgb(242, 8, 132);"&gt;sending&lt;/span&gt;&lt;span style="background-color: rgb(255, 255, 255);"&gt;"&lt;/span&gt; )&lt;br /&gt;&lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_56"&gt;SkypeAPI&lt;/span&gt;.&lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_57"&gt;sendSkypeCommand&lt;/span&gt;_( &lt;span style="background-color: rgb(255, 255, 255);"&gt;u"&lt;/span&gt;&lt;span style="color: rgb(242, 8, 132);"&gt;PROTOCOL 1&lt;/span&gt;&lt;span style="background-color: rgb(255, 255, 255);"&gt;"&lt;/span&gt; )&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(128, 64, 64);"&gt;&lt;b&gt;def&lt;/b&gt;&lt;/span&gt; &lt;span style="color: rgb(0, 128, 128);"&gt;main&lt;/span&gt;():&lt;br /&gt;&lt;span style="color: rgb(160, 32, 240);"&gt;import&lt;/span&gt; &lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_58"&gt;sys&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(160, 32, 240);"&gt;from&lt;/span&gt; &lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_59"&gt;PyObjCTools&lt;/span&gt; &lt;span style="color: rgb(160, 32, 240);"&gt;import&lt;/span&gt; &lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_60"&gt;AppHelper&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_61"&gt;NSLog&lt;/span&gt;( &lt;span style="background-color: rgb(255, 255, 255);"&gt;"&lt;/span&gt;&lt;span style="color: rgb(242, 8, 132);"&gt;running event loop&lt;/span&gt;&lt;span style="background-color: rgb(255, 255, 255);"&gt;"&lt;/span&gt; )&lt;br /&gt;&lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_62"&gt;AppHelper&lt;/span&gt;.&lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_63"&gt;callLater&lt;/span&gt;( 5, do_connect )&lt;br /&gt;&lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_64"&gt;AppHelper&lt;/span&gt;.&lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_65"&gt;runConsoleEventLoop&lt;/span&gt;( &lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_66"&gt;installInterrupt&lt;/span&gt;=True )&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(128, 64, 64);"&gt;&lt;b&gt;if&lt;/b&gt;&lt;/span&gt; __name__ == &lt;span style="background-color: rgb(255, 255, 255);"&gt;"&lt;/span&gt;&lt;span style="color: rgb(242, 8, 132);"&gt;__main__&lt;/span&gt;&lt;span style="background-color: rgb(255, 255, 255);"&gt;"&lt;/span&gt;:&lt;br /&gt;main()&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 212);"&gt;# vim: set ts=4 &lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_67"&gt;sw&lt;/span&gt;=4 &lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_68"&gt;expandtab&lt;/span&gt; :&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Note: I &lt;span style="font-weight: bold;"&gt;love&lt;/span&gt; &lt;a href="http://www.vim.org/"&gt;Vim&lt;/a&gt; ;)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36147732-8459659296339186298?l=seletz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://seletz.blogspot.com/feeds/8459659296339186298/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=36147732&amp;postID=8459659296339186298' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36147732/posts/default/8459659296339186298'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36147732/posts/default/8459659296339186298'/><link rel='alternate' type='text/html' href='http://seletz.blogspot.com/2006/10/skype-api-on-os-x.html' title='Skype API on OS X'/><author><name>Stefan Eletzhofer</name><uri>http://www.blogger.com/profile/07549423688451456139</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36147732.post-972233454005828453</id><published>2006-10-23T22:27:00.000+02:00</published><updated>2006-10-23T22:43:03.198+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='c'/><title type='text'>Embedding Python and Multithreading</title><content type='html'>&lt;div style="text-align: justify;"&gt;Just found this &lt;a href="http://groups.google.com/group/comp.lang.python/browse_frm/thread/fd93baa856738f1a/f4bb7fcb34a2af9a#f4bb7fcb34a2af9a"&gt;post&lt;/a&gt; on &lt;a href="http://groups.google.com/group/comp.lang.python"&gt;comp.lang.python&lt;/a&gt; about an &lt;a href="http://www.linuxjournal.com/article/3641"&gt;article&lt;/a&gt; detailing the hoops one needs to jump through when it comes to embedding python and you have a multithreaded application.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Note that all that &lt;span style="font-weight: bold;"&gt;still&lt;/span&gt; means that you can't have one Python interpreter running in multiple threads. If I understood things as they are, Python currently needs a 1:1 relationship between Python interpreters and threads. That is, you can have more than one Python interpreter &lt;span style="font-weight: bold;"&gt;per process&lt;/span&gt; but only one per thread. You &lt;span style="font-style: italic;"&gt;can&lt;/span&gt; have more than one interpreter per process if you really want, but these threads then compete against the same &lt;span style="font-weight: bold;"&gt;GIL&lt;/span&gt;.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;This is due to the fact that the standard CPython implementation uses a so-called &lt;span style="font-weight: bold;"&gt;global interpreter lock&lt;/span&gt; (&lt;span style="font-weight: bold;"&gt;GIL&lt;/span&gt;) to serialize access to the internal Python API. There's one GIL per interpreter.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Also note that there's hidden pitfall here: The interpreter periodically (every &lt;span style="font-weight: bold;"&gt;n&lt;/span&gt; byte code instructions) yields execution and releases the GIL. That means if other threads pend on the GIL they might get runnable, which is perhaps not what one might expect.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Calling C extension is another common way to release the GIL, such that a expensive calculation in does not block other threads.&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36147732-972233454005828453?l=seletz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://seletz.blogspot.com/feeds/972233454005828453/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=36147732&amp;postID=972233454005828453' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36147732/posts/default/972233454005828453'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36147732/posts/default/972233454005828453'/><link rel='alternate' type='text/html' href='http://seletz.blogspot.com/2006/10/embedding-python-and-multithreading.html' title='Embedding Python and Multithreading'/><author><name>Stefan Eletzhofer</name><uri>http://www.blogger.com/profile/07549423688451456139</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36147732.post-5262344179607423808</id><published>2006-10-21T22:36:00.000+02:00</published><updated>2006-10-21T23:13:23.678+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='skype'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>Python Skype API</title><content type='html'>&lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;Hrmph&lt;/span&gt;. My Python wrapper using the &lt;a href="http://docs.python.org/lib/module-ctypes.html"&gt;&lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;ctypes&lt;/span&gt;&lt;/a&gt; module which comes with Python 2.5 segfaults. I can &lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-corrected" id="SPELLING_ERROR_2"&gt;check&lt;/span&gt; if &lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_3"&gt;Skype&lt;/span&gt; is running, using the &lt;span style="font-weight: bold;"&gt;&lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_4"&gt;IsSkypeRunning&lt;/span&gt;()&lt;/span&gt; call, but as soon as I try to use &lt;span style="font-weight: bold;"&gt;&lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_5"&gt;SetSkypeDelegate&lt;/span&gt;()&lt;/span&gt; it segfaults. Now I'm downloading &lt;a href="http://sourceforge.net/project/showfiles.php?group_id=71702"&gt;&lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_6"&gt;ctypes&lt;/span&gt; 1.0.1&lt;/a&gt;, perhaps there's more docs and examples there. Especially on how to use the Structure class with Python callbacks.&lt;br /&gt;&lt;br /&gt;Update: No avail. Either SF is down or I don't know what. I'm unable to download the ctypes stuff.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36147732-5262344179607423808?l=seletz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://seletz.blogspot.com/feeds/5262344179607423808/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=36147732&amp;postID=5262344179607423808' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36147732/posts/default/5262344179607423808'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36147732/posts/default/5262344179607423808'/><link rel='alternate' type='text/html' href='http://seletz.blogspot.com/2006/10/python-skype-api.html' title='Python Skype API'/><author><name>Stefan Eletzhofer</name><uri>http://www.blogger.com/profile/07549423688451456139</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36147732.post-4962480636274370836</id><published>2006-10-21T17:42:00.000+02:00</published><updated>2006-10-22T17:26:00.462+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='projects'/><category scheme='http://www.blogger.com/atom/ns#' term='skype'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='pis'/><title type='text'>Skype API</title><content type='html'>&lt;div style="text-align: justify;"&gt;I just discovered the &lt;a href="https://developer.skype.com/Docs"&gt;Skype API&lt;/a&gt;. I know, Skype is not open-source, but hey ...&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;The API is quite cool. Apart from the pretty obvious API access to the voice call and chat stuff, there's an API for &lt;a href="https://developer.skype.com/Docs/ApiDoc/Application_to_application_commands"&gt;&lt;span style="font-weight: bold;"&gt;transparently&lt;/span&gt;&lt;/a&gt; sending raw streams between programs. So, one could use the Skype API to use a pretty nifty transparent channel to send data between applications. They call this the &lt;span style="font-weight: bold;"&gt;Application2Application Protocol.&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;This could be the last building block I need for a pet project I have, the Personal Information Server. There I need a method to communicate with different PIS in a P2P manner, no DNS name resolution and stuff. Transparent "just works" type of communication.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Using the PIS one would mark certain types of information managed by the PIS as "public", and other PIS (those from your friends, co-workers, company , ...) would&lt;br /&gt;&lt;/div&gt;query any "new" stuff and incorporate this new stuff into their own information store.&lt;br /&gt;&lt;br /&gt;Using the Skype API, this could work out pretty nifty:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;You start up your PIS instance&lt;/li&gt;&lt;li&gt;the PIS instance checks whether or not you're online with Skype&lt;/li&gt;&lt;li&gt;if you're online:&lt;/li&gt;&lt;li&gt;check if my buddies are online and have their PIS started&lt;/li&gt;&lt;li&gt;fetch the new stuff (contact info's, phone numbers, events, blogs, ...)&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;So, in theory, if you start up your PIS, it begins to sync with your peer PIS from your friends. That way, contacts and events stay synchronized, even if you're not online all the time, and even if you're behind a firewall.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;You could also have more than one PIS, one on the road on your laptop, one at home, etc.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Nifty.&lt;br /&gt;&lt;br /&gt;I think I'll play around with this stuff a bit. I've found no python bindings yet, but hey, at last we all have &lt;a href="http://docs.python.org/whatsnew/modules.html#SECTION0001410000000000000000"&gt;ctypes&lt;/a&gt; now with python 2.5, don't we ;)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36147732-4962480636274370836?l=seletz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://seletz.blogspot.com/feeds/4962480636274370836/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=36147732&amp;postID=4962480636274370836' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36147732/posts/default/4962480636274370836'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36147732/posts/default/4962480636274370836'/><link rel='alternate' type='text/html' href='http://seletz.blogspot.com/2006/10/skype-api.html' title='Skype API'/><author><name>Stefan Eletzhofer</name><uri>http://www.blogger.com/profile/07549423688451456139</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36147732.post-6480116019374652702</id><published>2006-10-21T15:29:00.000+02:00</published><updated>2006-10-21T19:23:25.522+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='personal'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>Horrible week.</title><content type='html'>Phew, this was a horrible week.&lt;br /&gt;&lt;br /&gt;Really.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;First, I had to boot our old &lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;SGI&lt;/span&gt; Octane machine because a customer wanted a new &lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-corrected" id="SPELLING_ERROR_1"&gt;release&lt;/span&gt; of an CAD Model analysis tool we wrote. Thanks god it booted. And, thanks god again I &lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-corrected" id="SPELLING_ERROR_2"&gt;didn't&lt;/span&gt; threw that pile of old, heavy, bulk and green hardware on the junkyard. Pure &lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-corrected" id="SPELLING_ERROR_3"&gt;laziness&lt;/span&gt;, oh my.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Actually the recompile of our internal C based libs ran very smooth, and the python part of the program ran immediately. Testing took some time, though. That machine is no speed demon, thus analyzing a mere 24&lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_4"&gt;MiB&lt;/span&gt; worth of 3d CAD data took well over an hour. It produced tons of trace, using my &lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_5"&gt;hackery&lt;/span&gt; of &lt;span style="font-family:courier new;"&gt; &lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_6"&gt;sys&lt;/span&gt;.&lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_7"&gt;settrace&lt;/span&gt;()&lt;/span&gt; and my C tracing library. Well, I shipped it.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Then another customer filled &lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-corrected" id="SPELLING_ERROR_8"&gt;their&lt;/span&gt; &lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_9"&gt;trac&lt;/span&gt; with tickets, all assigned to me. They're using a web application we wrote using &lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_10"&gt;Plone&lt;/span&gt; as an base to manage CAD drawings. They have lots of CAD drawings. Unfortunately they use &lt;a href="http://www.plone.org/"&gt;&lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_11"&gt;Plone&lt;/span&gt;&lt;/a&gt; 2.1.1, which we migrated to from 2.0.5, which would well be worth a story of its own. &lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_12"&gt;Plone&lt;/span&gt; 2.1.1 seems to be a bad performer. We ran the profiling  tools and killed the performance hogs, which turned out to have nothing to do with my  application at all. Now they report that the command line tools I wrote to post/update/revoke drawings, which follow some sort of meta &lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-corrected" id="SPELLING_ERROR_13"&gt;work flow&lt;/span&gt; on their own, does not delete drawings which became invalid. Oh well. Of course, on my test system the stuff works. &lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_14"&gt;Grrr&lt;/span&gt;.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;On top of that I try to wrap my head around the new (?) and shiny (??) new python web application frameworks. Currently I'm investigating the possibilities of &lt;a href="http://twistedmatrix.com/trac"&gt;twisted,&lt;/a&gt; &lt;a href="http://www.zope.org/"&gt;&lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_15"&gt;zope&lt;/span&gt; 3&lt;/a&gt;, &lt;a href="http://www.turbogears.org/"&gt;&lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_16"&gt;turbogears&lt;/span&gt;&lt;/a&gt; and the new &lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_17"&gt;WSGI&lt;/span&gt; shipped with python 2.5. Much to learn. It seems I've missed most &lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_18"&gt;of&lt;/span&gt; the new development in that area which happened the last 1 1/2 years or so.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36147732-6480116019374652702?l=seletz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://seletz.blogspot.com/feeds/6480116019374652702/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=36147732&amp;postID=6480116019374652702' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36147732/posts/default/6480116019374652702'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36147732/posts/default/6480116019374652702'/><link rel='alternate' type='text/html' href='http://seletz.blogspot.com/2006/10/horrible-week.html' title='Horrible week.'/><author><name>Stefan Eletzhofer</name><uri>http://www.blogger.com/profile/07549423688451456139</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36147732.post-5459482678128810868</id><published>2006-10-21T15:23:00.000+02:00</published><updated>2006-10-21T19:32:56.374+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='projects'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='plone'/><category scheme='http://www.blogger.com/atom/ns#' term='pis'/><title type='text'>Google's GData API</title><content type='html'>&lt;div style="text-align: justify;"&gt;I'm currently investigating the use of the &lt;a href="http://code.google.com/apis.html"&gt;&lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;GData&lt;/span&gt; API&lt;/a&gt; when it comes to create a &lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-corrected" id="SPELLING_ERROR_1"&gt;command line&lt;/span&gt; blog posting tool written in pure python.&lt;br /&gt;&lt;br /&gt;Well, it seems that there's no Python API for the pure Google Data stuff yet (I know about the Google Base Data API).&lt;br /&gt;&lt;br /&gt;But from what I've understood this is all pure HTML POST and GET using an extended version of the ATOM XML schema. Using urllib and ElementTree in python its just plain simple to actually get your blog feeds. They've even built in some sort of query language.&lt;br /&gt;&lt;br /&gt;Unfortunately, to authenticate with Google using your Google account, there's a bit more involved. The Java guys have it better here: There's a nice high-level API. Doh.&lt;br /&gt;&lt;br /&gt;Authentication is, as far as I understood, needed to post blog entries.&lt;br /&gt;&lt;br /&gt;Note to myself:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Investigate Google Authentication wrt. Plone PAS&lt;/li&gt;&lt;li&gt;provide a pure python script which posts to a blog&lt;/li&gt;&lt;li&gt;hook script into a plone work flow to publish atricles from plone to blogs. Create a new content type for that, track blog post IDs we got back from google inside plone. Use Five and notifiers to update blog if Plone document changes. This would be a PIS module.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36147732-5459482678128810868?l=seletz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://seletz.blogspot.com/feeds/5459482678128810868/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=36147732&amp;postID=5459482678128810868' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36147732/posts/default/5459482678128810868'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36147732/posts/default/5459482678128810868'/><link rel='alternate' type='text/html' href='http://seletz.blogspot.com/2006/10/googles-gdata-api.html' title='Google&apos;s GData API'/><author><name>Stefan Eletzhofer</name><uri>http://www.blogger.com/profile/07549423688451456139</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36147732.post-2629802226727811211</id><published>2006-10-17T02:09:00.000+02:00</published><updated>2006-10-17T02:16:53.451+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='meta'/><title type='text'>My own blog. I'm getting old and weird probably.</title><content type='html'>Oh well. Just playing around. I've started a blog, oh my.&lt;br /&gt;&lt;br /&gt;Well, I've read seome very good posts on blogs recently, specially when it comes &lt;br /&gt;to my current interest in python web development.&lt;br /&gt;&lt;br /&gt;For starters you might try &lt;a href="http://online.effbot.org"&gt;effbot.org&lt;/a&gt;, a very extensive blog from &lt;a href="http://effbot.org/zone/about.htm"&gt;Fredrik Lundh&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36147732-2629802226727811211?l=seletz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://seletz.blogspot.com/feeds/2629802226727811211/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=36147732&amp;postID=2629802226727811211' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36147732/posts/default/2629802226727811211'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36147732/posts/default/2629802226727811211'/><link rel='alternate' type='text/html' href='http://seletz.blogspot.com/2006/10/my-own-blog-im-getting-old-and-weird.html' title='My own blog. I&apos;m getting old and weird probably.'/><author><name>Stefan Eletzhofer</name><uri>http://www.blogger.com/profile/07549423688451456139</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36147732.post-5661595874393796959</id><published>2006-10-17T02:07:00.000+02:00</published><updated>2006-10-17T02:17:35.805+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='meta'/><title type='text'>Black.</title><content type='html'>Yes, This is all black. I love black.&lt;br /&gt;&lt;br /&gt;And courier. I love terminals.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36147732-5661595874393796959?l=seletz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://seletz.blogspot.com/feeds/5661595874393796959/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=36147732&amp;postID=5661595874393796959' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36147732/posts/default/5661595874393796959'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36147732/posts/default/5661595874393796959'/><link rel='alternate' type='text/html' href='http://seletz.blogspot.com/2006/10/yes-this-is-all-black.html' title='Black.'/><author><name>Stefan Eletzhofer</name><uri>http://www.blogger.com/profile/07549423688451456139</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36147732.post-5941527925657863884</id><published>2006-10-17T02:01:00.001+02:00</published><updated>2006-10-21T15:29:11.041+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='meta'/><title type='text'>Hmmm, email-to-blog?</title><content type='html'>Nifty. But I&amp;#39;ll have to remind myself to remove my signature from emails.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36147732-5941527925657863884?l=seletz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://seletz.blogspot.com/feeds/5941527925657863884/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=36147732&amp;postID=5941527925657863884' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36147732/posts/default/5941527925657863884'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36147732/posts/default/5941527925657863884'/><link rel='alternate' type='text/html' href='http://seletz.blogspot.com/2006/10/hmmm-email-to-blog.html' title='Hmmm, email-to-blog?'/><author><name>Stefan Eletzhofer</name><uri>http://www.blogger.com/profile/07549423688451456139</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
