<?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'><id>tag:blogger.com,1999:blog-32054652</id><updated>2009-11-08T11:22:40.188-08:00</updated><title type='text'>Thoughts about computer technologies</title><subtitle type='html'>I'm Luca, an Italian (a programmer?) who love computers.&lt;br&gt;
This blog contains mostly &lt;b&gt;Smalltalk/GNOME/Debian&lt;/b&gt; related posts, but also life and other technologies posts.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://lethalman.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32054652/posts/default'/><link rel='alternate' type='text/html' href='http://lethalman.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/32054652/posts/default?start-index=26&amp;max-results=25'/><author><name>Luca Bruno aka Lethalman</name><uri>http://www.blogger.com/profile/06329046616630750783</uri><email>lethalman88@gmail.com</email></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>82</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-32054652.post-8066161228636694587</id><published>2009-10-09T06:08:00.001-07:00</published><updated>2009-10-09T06:27:06.013-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='unical'/><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='development'/><category scheme='http://www.blogger.com/atom/ns#' term='web services'/><category scheme='http://www.blogger.com/atom/ns#' term='axis'/><category scheme='http://www.blogger.com/atom/ns#' term='apache'/><category scheme='http://www.blogger.com/atom/ns#' term='tomcat'/><title type='text'>Debian+Apache+Tomcat+Axis</title><content type='html'>Hello,&lt;br /&gt;one of the courses I'm following at the university is "Laboratorio di reti&lt;br /&gt;di calcolatori" which uses the technologies (really technologies?????)&lt;br /&gt;listed in the post title. This is a little tutorial for making them works,&lt;br /&gt;with a little script for registering .wsdd files.&lt;br /&gt;&lt;br /&gt;- aptitude install apache2 tomcat6&lt;br /&gt;- download the &lt;span style="font-weight: bold;"&gt;binaries&lt;/span&gt; of axis 1.x (latest is 2.x, it's not used in our course) and xerces then unpack them.&lt;br /&gt;- copy *.jar of xerces into the "lib" dir of axis.&lt;br /&gt;- create &lt;span style="font-style: italic;"&gt;"/etc/tomcat6/policy.d/99axis.policy"&lt;/span&gt; with:&lt;br /&gt;&lt;blockquote&gt;grant codeBase "file:/var/lib/tomcat6/webapps/-" {&lt;br /&gt;permission java.security.AllPermission;&lt;br /&gt;};&lt;/blockquote&gt;&lt;br /&gt;- copy the "axis" directory found under webapps of the axis binaries into /var/lib/tomcat6/webapps&lt;br /&gt;- invoke-rc.d apache2 restart&lt;br /&gt;- invoke-rc.d tomcat6 restart&lt;br /&gt;&lt;br /&gt;Now go to http://localhost:8080 to make sure that Apache-Axis works.&lt;br /&gt;&lt;br /&gt;Finally, this is the script for deploying web services (call it deploy.sh):&lt;br /&gt;&lt;blockquote&gt;export AXIS_HOME="/home/lethal/ingegneria/reti/axis/axis-1_4"&lt;br /&gt;export AXIS_LIB="$AXIS_HOME/lib"&lt;br /&gt;export AXISCLASSPATH="$AXIS_LIB/axis.jar:$AXIS_LIB/commons-discovery-0.2.jar:$AXIS_LIB/commons-logging-1.0.4.jar:$AXIS_LIB/jaxrpc.jar:$AXIS_LIB/saaj.jar:$AXIS_LIB/log4j-1.2.8.jar:$AXIS_LIB/xml-apis.jar:$AXIS_LIB/xercesImpl.jar"&lt;br /&gt;java -cp "$AXISCLASSPATH" org.apache.axis.client.AdminClient -lhttp://localhost:8080/axis/services/AdminService "$1"&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;In the script, you &lt;span style="font-weight: bold;"&gt;must&lt;/span&gt; tweak the AXIS_HOME variable to point to the unpacked axis binaries: &lt;span style="font-weight: bold; font-style: italic;"&gt;avoid using spaces&lt;/span&gt; in this variable or you'll encounter several errors in terms of classpath.&lt;br /&gt;Usage of the script:&lt;br /&gt;&lt;blockquote&gt;sh deploy.sh file.wsdd&lt;/blockquote&gt;&lt;br /&gt;We're done!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32054652-8066161228636694587?l=lethalman.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lethalman.blogspot.com/feeds/8066161228636694587/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=32054652&amp;postID=8066161228636694587' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32054652/posts/default/8066161228636694587'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32054652/posts/default/8066161228636694587'/><link rel='alternate' type='text/html' href='http://lethalman.blogspot.com/2009/10/debianapachetomcataxis.html' title='Debian+Apache+Tomcat+Axis'/><author><name>Luca Bruno aka Lethalman</name><uri>http://www.blogger.com/profile/06329046616630750783</uri><email>lethalman88@gmail.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='07412890738869959260'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32054652.post-8316153411634213543</id><published>2009-10-07T14:23:00.001-07:00</published><updated>2009-10-07T14:30:37.094-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='performance'/><category scheme='http://www.blogger.com/atom/ns#' term='zsh'/><category scheme='http://www.blogger.com/atom/ns#' term='completion'/><title type='text'>Speeding up zsh completion</title><content type='html'>Hello,&lt;div&gt;since I've started using &lt;a href="http://www.zsh.org/"&gt;zsh&lt;/a&gt;, a great shell with great out of the box completion, one of the most boring issues was having a really slow completion. I can understand it could be slow to get a list of packages, remote files or command line options, but also paths were often slow to be completed. After lots of searches I've ended up in adding this magic line to my ~/.zshrc:&lt;/div&gt;&lt;div&gt;&lt;blockquote&gt;zstyle ':completion:*' accept-exact '*(N)'&lt;/blockquote&gt;This way you tell zsh comp to take the first part of the path to be exact, and to avoid partial globs. Now path completions became nearly immediate.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Another important speed up is using the cache for packages and other stuff:&lt;/div&gt;&lt;div&gt;&lt;blockquote&gt;&lt;div&gt;zstyle ':completion:*' use-cache on&lt;/div&gt;&lt;div&gt;zstyle ':completion:*' cache-path ~/.zsh/cache&lt;/div&gt;&lt;/blockquote&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;If you know how to boost up options/remote files, please share :)&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/32054652-8316153411634213543?l=lethalman.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lethalman.blogspot.com/feeds/8316153411634213543/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=32054652&amp;postID=8316153411634213543' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32054652/posts/default/8316153411634213543'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32054652/posts/default/8316153411634213543'/><link rel='alternate' type='text/html' href='http://lethalman.blogspot.com/2009/10/speeding-up-zsh-completion.html' title='Speeding up zsh completion'/><author><name>Luca Bruno aka Lethalman</name><uri>http://www.blogger.com/profile/06329046616630750783</uri><email>lethalman88@gmail.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='07412890738869959260'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32054652.post-6570085153262641673</id><published>2009-08-29T05:46:00.000-07:00</published><updated>2009-08-29T05:58:46.760-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='gpg'/><category scheme='http://www.blogger.com/atom/ns#' term='debian'/><title type='text'>New GPG key</title><content type='html'>Hello,&lt;br /&gt;due to some synchronization problems between my desktop and laptop, unfortunately I've lost my GPG secret key. I was planning to renew my key after the SHA issues, but this way I can't neither revoke the old key nor sign the new key. So I please anybody having my pubkey to delete it:&lt;br /&gt;gpg --delete-key &lt;a href="http://pgp.mit.edu:11371/pks/lookup?op=get&amp;amp;search=0xC3D423FBC29A9371"&gt;C29A9371&lt;br /&gt;&lt;/a&gt;&lt;br /&gt;I've uploaded my new key as usual so you can get it:&lt;br /&gt;gpg --keyserver pgp.mit.edu --recv-keys &lt;a href="http://pgp.mit.edu:11371/pks/lookup?op=get&amp;amp;search=0x44EB1667D2C27B6B"&gt;D2C27B6B&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32054652-6570085153262641673?l=lethalman.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lethalman.blogspot.com/feeds/6570085153262641673/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=32054652&amp;postID=6570085153262641673' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32054652/posts/default/6570085153262641673'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32054652/posts/default/6570085153262641673'/><link rel='alternate' type='text/html' href='http://lethalman.blogspot.com/2009/08/new-gpg-key.html' title='New GPG key'/><author><name>Luca Bruno aka Lethalman</name><uri>http://www.blogger.com/profile/06329046616630750783</uri><email>lethalman88@gmail.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='07412890738869959260'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32054652.post-1878233625883463565</id><published>2009-08-09T11:10:00.000-07:00</published><updated>2009-08-09T11:14:17.011-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='corraza'/><category scheme='http://www.blogger.com/atom/ns#' term='archicad'/><category scheme='http://www.blogger.com/atom/ns#' term='spadi'/><category scheme='http://www.blogger.com/atom/ns#' term='gtk'/><category scheme='http://www.blogger.com/atom/ns#' term='development'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='opengl'/><title type='text'>Spadi source code</title><content type='html'>Hello,&lt;br /&gt;after I've written really a few docs, and cleaned up some stuff, I've published the code of both Spadi and Corraza on &lt;a href="http://gitorious.org/spadi"&gt;gitorious here&lt;/a&gt;. In the while, I've added support for floors and closeable views.&lt;br /&gt;Help... help is needed.&lt;br /&gt;&lt;br /&gt;Stay tuned.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32054652-1878233625883463565?l=lethalman.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lethalman.blogspot.com/feeds/1878233625883463565/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=32054652&amp;postID=1878233625883463565' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32054652/posts/default/1878233625883463565'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32054652/posts/default/1878233625883463565'/><link rel='alternate' type='text/html' href='http://lethalman.blogspot.com/2009/08/spadi-source-code.html' title='Spadi source code'/><author><name>Luca Bruno aka Lethalman</name><uri>http://www.blogger.com/profile/06329046616630750783</uri><email>lethalman88@gmail.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='07412890738869959260'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32054652.post-7728548381498384666</id><published>2009-08-06T04:02:00.000-07:00</published><updated>2009-08-06T04:12:32.345-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='corraza'/><category scheme='http://www.blogger.com/atom/ns#' term='archicad'/><category scheme='http://www.blogger.com/atom/ns#' term='spadi'/><category scheme='http://www.blogger.com/atom/ns#' term='gtk'/><category scheme='http://www.blogger.com/atom/ns#' term='development'/><category scheme='http://www.blogger.com/atom/ns#' term='ray tracing'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='opengl'/><title type='text'>Constructing a free ArchiCAD alternative</title><content type='html'>Hello,&lt;br /&gt;together a couple of university mates we talked about a possible free (as in freedom) ArchiCAD alternative. There are several free CAD out there but none is free for architects/engineers. The project is too big and ambitious, but I wanted to give OpenGL a shot with this excuse to learn something new.&lt;br /&gt;&lt;br /&gt;I've started two projects:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Corraza, the OpenGL framework for editing 3d objects and exporting the scene graph to ray tracing software... think about a very very &lt;span style="font-weight: bold;"&gt;very&lt;/span&gt; minimal blender but as library&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Spadi, the GTK+ application that runs on top of Corraza&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;You can find a &lt;a href="http://www.youtube.com/watch?v=i3D7CLdhvuk"&gt;video here&lt;/a&gt; to see what it can do now, after a week of development.&lt;br /&gt;There's no code published at the moment, contact me if you would like to join the development.&lt;br /&gt;&lt;br /&gt;Stay tuned.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32054652-7728548381498384666?l=lethalman.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lethalman.blogspot.com/feeds/7728548381498384666/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=32054652&amp;postID=7728548381498384666' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32054652/posts/default/7728548381498384666'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32054652/posts/default/7728548381498384666'/><link rel='alternate' type='text/html' href='http://lethalman.blogspot.com/2009/08/constructing-free-archicad-alternative.html' title='Constructing a free ArchiCAD alternative'/><author><name>Luca Bruno aka Lethalman</name><uri>http://www.blogger.com/profile/06329046616630750783</uri><email>lethalman88@gmail.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='07412890738869959260'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32054652.post-2169367714044073210</id><published>2009-07-21T23:34:00.000-07:00</published><updated>2009-07-21T23:43:40.903-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='aruanne'/><category scheme='http://www.blogger.com/atom/ns#' term='pango'/><category scheme='http://www.blogger.com/atom/ns#' term='development'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='pdf'/><category scheme='http://www.blogger.com/atom/ns#' term='cairo'/><category scheme='http://www.blogger.com/atom/ns#' term='report'/><category scheme='http://www.blogger.com/atom/ns#' term='gnome'/><title type='text'>Aruanne, pdf reporting framework</title><content type='html'>Hello,&lt;br /&gt;a while ago I've been talking about pango cairo and how to generate pdf with a couple of tables.&lt;br /&gt;In the meantime I've worked on it, improving and enhancing new kinds of elements. This has lead to the creation of a small project, a library providing a simple framework for generating mostly PDF reports (I haven't tried to generate SVG or something else yet).&lt;br /&gt;&lt;br /&gt;After a couple of release requests, I've found finally the time to publish a sort of working code.&lt;br /&gt;&lt;br /&gt;Here's the &lt;a href="http://gitorious.org/aruanne"&gt;git repository&lt;/a&gt; and &lt;a href="http://gitorious.org/aruanne/aruanne/archive-tarball/master"&gt;here you can download the snapshot tarball&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Any patches welcome.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32054652-2169367714044073210?l=lethalman.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lethalman.blogspot.com/feeds/2169367714044073210/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=32054652&amp;postID=2169367714044073210' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32054652/posts/default/2169367714044073210'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32054652/posts/default/2169367714044073210'/><link rel='alternate' type='text/html' href='http://lethalman.blogspot.com/2009/07/aruanne-pdf-reporting-framework.html' title='Aruanne, pdf reporting framework'/><author><name>Luca Bruno aka Lethalman</name><uri>http://www.blogger.com/profile/06329046616630750783</uri><email>lethalman88@gmail.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='07412890738869959260'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32054652.post-6193530327052850732</id><published>2009-06-20T13:10:00.000-07:00</published><updated>2009-06-21T00:59:28.328-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='performance'/><category scheme='http://www.blogger.com/atom/ns#' term='gstreamer'/><category scheme='http://www.blogger.com/atom/ns#' term='media'/><category scheme='http://www.blogger.com/atom/ns#' term='gnome'/><title type='text'>The less consuming radio player ever</title><content type='html'>Hello,&lt;br /&gt;multimedia always killed desktop performance, also audio with all such effect-based players out there. I've been using &lt;a href="http://www.deezer.org"&gt;deezer&lt;/a&gt; for a long time, but sometimes I'm tired to see my desktop lagging.&lt;br /&gt;I don't need that, I need random music from internet while I'm either programming or studying, and my computer has only 512mb ram and 2.4ghz amd64 (onLY??? yes nowadays it's a little amount).&lt;br /&gt;&lt;br /&gt;Let's see what we can do using gst-launch:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;while [ 1 ]; do wget -q -O - http://66.250.45.112:80/hard.ogg|gst-launch fdsrc fd=0 ! decodebin ! audioconvert ! alsasink; done&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;The URL above is a hard rock station :) The &lt;b&gt;while&lt;/b&gt; ensures re-connection. I think performances are great, 6% cpu and 2% ram.&lt;br /&gt;&lt;br /&gt;But there's yet a bettere solution (see comments):&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;mplayer http://66.250.45.112:80/hard.ogg&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/32054652-6193530327052850732?l=lethalman.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lethalman.blogspot.com/feeds/6193530327052850732/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=32054652&amp;postID=6193530327052850732' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32054652/posts/default/6193530327052850732'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32054652/posts/default/6193530327052850732'/><link rel='alternate' type='text/html' href='http://lethalman.blogspot.com/2009/06/less-consuming-radio-player-ever.html' title='The less consuming radio player ever'/><author><name>Luca Bruno aka Lethalman</name><uri>http://www.blogger.com/profile/06329046616630750783</uri><email>lethalman88@gmail.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='07412890738869959260'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32054652.post-4269526809163930587</id><published>2009-05-29T15:45:00.000-07:00</published><updated>2009-05-29T16:10:31.884-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='smalltalk'/><category scheme='http://www.blogger.com/atom/ns#' term='development'/><category scheme='http://www.blogger.com/atom/ns#' term='syx'/><title type='text'>Syx changes web and git hosting</title><content type='html'>&lt;em&gt;&lt;div&gt;Hello,&lt;/div&gt;&lt;div&gt;I'm officializing the change of web hosting and git hosting from googlecode to berlios:&lt;/div&gt;&lt;div&gt;&lt;/em&gt;&lt;br /&gt;&lt;img align="right" border="0" src="http://syx.berlios.de/images/syx-logo.png" /&gt;&lt;/div&gt;&lt;div&gt;The new &lt;a href="http://syx.berlios.de/"&gt;website&lt;/a&gt; is up!&lt;/div&gt;&lt;div&gt;For &lt;a href="http://groups.google.com/group/syx-discuss/t/eac3bb648bec6dfa"&gt;several&lt;/a&gt; &lt;a href="http://groups.google.com/group/syx-discuss/t/aa7cfd76fbd77e11"&gt;reasons&lt;/a&gt;, including &lt;a href="http://groups.google.com/group/syx-discuss/browse_thread/thread/ab71093a2f69e1de/c89f23195d40a871?lnk=gst&amp;amp;q=svn#c89f23195d40a871"&gt;reliability&lt;/a&gt;, we switched both the website and git hosting to berlios. Also the purpose of this change is to rewrite the website backend using Syx.&lt;/div&gt;&lt;div&gt;The mailing list and the bug tracker are still hosted at &lt;a href="http://syx.googlecode.com/"&gt;googlecode&lt;/a&gt;.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Some progress news in the while&lt;/b&gt; &lt;/div&gt;&lt;div&gt;We're working on a new memory management, object representation and garbage collector. On the other side the lack of time is making things harder for releasing the new version. Together with the above changes, new Smalltalk standard pieces will implemented as usual. I remind you the new code is in&lt;/div&gt;&lt;div&gt;the &lt;a href="http://git.berlios.de/cgi-bin/gitweb.cgi?p=syx;a=shortlog;h=refs/heads/object"&gt;&lt;b&gt;object&lt;/b&gt;&lt;/a&gt; branch.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Website: &lt;a href="http://syx.berlios.de/"&gt;http://syx.berlios.de&lt;/a&gt;&lt;/div&gt;&lt;div&gt;GIT: &lt;a href="git://git.berlios.de/syx"&gt;git://git.berlios.de/syx&lt;/a&gt;&lt;/div&gt;&lt;div&gt;Project page: &lt;a href="https://developer.berlios.de/projects/syx/"&gt;https://developer.berlios.de/projects/syx/&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&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/32054652-4269526809163930587?l=lethalman.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lethalman.blogspot.com/feeds/4269526809163930587/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=32054652&amp;postID=4269526809163930587' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32054652/posts/default/4269526809163930587'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32054652/posts/default/4269526809163930587'/><link rel='alternate' type='text/html' href='http://lethalman.blogspot.com/2009/05/syx-changes-web-and-git-hosting.html' title='Syx changes web and git hosting'/><author><name>Luca Bruno aka Lethalman</name><uri>http://www.blogger.com/profile/06329046616630750783</uri><email>lethalman88@gmail.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='07412890738869959260'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32054652.post-8734694823229845657</id><published>2009-05-27T14:22:00.000-07:00</published><updated>2009-05-27T14:46:55.421-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='pango'/><category scheme='http://www.blogger.com/atom/ns#' term='pdf'/><category scheme='http://www.blogger.com/atom/ns#' term='cairo'/><category scheme='http://www.blogger.com/atom/ns#' term='gnome'/><title type='text'>Render tables with pangocairo like reportlab</title><content type='html'>Hello,&lt;br /&gt;lately I was wondering if there was any alternative to the well known &lt;a href="http://www.reportlab.org/"&gt;reportlab&lt;/a&gt; python software for creating PDF reports. I immediately thought about &lt;a href="http://cairographics.org/"&gt;Cairo&lt;/a&gt;. The only two problems are:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Cairo doesn't create multiple pages&lt;/li&gt;&lt;li&gt;No support for creating tables containing text, necessary for table-based reports&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;I still can't realize how to achieve the first feature, but the second one could be solved using &lt;a href="http://www.pango.org/"&gt;Pango&lt;/a&gt; layouts.&lt;/div&gt;&lt;div&gt;The idea is to create the cells of the table using such layouts, so that the text get wrapped etc.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;Here's the &lt;a href="https://developer.berlios.de/snippet/detail.php?type=snippet&amp;amp;id=100049"&gt;Pango tables code snippet&lt;/a&gt; containing the necessary classes for achieving the job. Notice that the methods in the snippet often make use of Pango units instead of pixels.&lt;div&gt;Now let's use the Table class as follows: &lt;b&gt;create a table with two rows and two columns, then show it twice with different background colors&lt;/b&gt;.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;code&gt;surface = cairo.&lt;span style="color:black;"&gt;PDFSurface&lt;/span&gt; &lt;span style="color:black;"&gt;(&lt;/span&gt;&lt;span style="color:#483d8b;"&gt;"test.pdf"&lt;/span&gt;, &lt;span style="color:#ff4500;"&gt;300&lt;/span&gt;, &lt;span style="color:#ff4500;"&gt;400&lt;/span&gt;&lt;span style="color:black;"&gt;)&lt;/span&gt;&lt;br /&gt;cr = cairo.&lt;span style="color:black;"&gt;Context&lt;/span&gt; &lt;span style="color:black;"&gt;(&lt;/span&gt;surface&lt;span style="color:black;"&gt;)&lt;/span&gt;&lt;br /&gt;cr = pangocairo.&lt;span style="color:black;"&gt;CairoContext&lt;/span&gt; &lt;span style="color:black;"&gt;(&lt;/span&gt;cairo.&lt;span style="color:black;"&gt;Context&lt;/span&gt; &lt;span style="color:black;"&gt;(&lt;/span&gt;surface&lt;span style="color:black;"&gt;)&lt;/span&gt;&lt;span style="color:black;"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;sizes = &lt;span style="color:black;"&gt;[&lt;/span&gt;pango.&lt;span style="color:black;"&gt;SCALE*&lt;/span&gt;&lt;span style="color:#ff4500;"&gt;12&lt;/span&gt;&lt;span style="color:#66cc66;"&gt;*&lt;/span&gt;&lt;span style="color:#ff4500;"&gt;10&lt;/span&gt;, pango.&lt;span style="color:black;"&gt;SCALE*&lt;/span&gt;&lt;span style="color:#ff4500;"&gt;12&lt;/span&gt;&lt;span style="color:#66cc66;"&gt;*&lt;/span&gt;&lt;span style="color:#ff4500;"&gt;10&lt;/span&gt;&lt;span style="color:black;"&gt;]&lt;/span&gt;&lt;br /&gt;data = &lt;span style="color:black;"&gt;[&lt;/span&gt;&lt;span style="color:black;"&gt;[&lt;/span&gt;&lt;span style="color:#483d8b;"&gt;"first test with pango tables"&lt;/span&gt;, &lt;span style="color:#483d8b;"&gt;"seems to work correctly"&lt;/span&gt;&lt;span style="color:black;"&gt;]&lt;/span&gt;,&lt;br /&gt;   &lt;span style="color:black;"&gt;[&lt;/span&gt;&lt;span style="color:#483d8b;"&gt;"though it needs"&lt;/span&gt;, &lt;span style="color:#483d8b;"&gt;"support for borders and spans"&lt;/span&gt;&lt;span style="color:black;"&gt;]&lt;/span&gt;&lt;span style="color:black;"&gt;]&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;table = Table &lt;span style="color:black;"&gt;(&lt;/span&gt;cr, sizes, data, pango.&lt;span style="color:black;"&gt;FontDescription&lt;/span&gt; &lt;span style="color:black;"&gt;(&lt;/span&gt;&lt;span style="color:#483d8b;"&gt;"Sans 12"&lt;/span&gt;&lt;span style="color:black;"&gt;)&lt;/span&gt;&lt;span style="color:black;"&gt;)&lt;/span&gt;&lt;br /&gt;cr.&lt;span style="color:black;"&gt;rectangle&lt;/span&gt; &lt;span style="color:black;"&gt;(&lt;/span&gt;&lt;span style="color:#ff4500;"&gt;0&lt;/span&gt;, &lt;span style="color:#ff4500;"&gt;0&lt;/span&gt;, pango.&lt;span style="color:black;"&gt;PIXELS&lt;/span&gt;&lt;span style="color:black;"&gt;(&lt;/span&gt;table.&lt;span style="color:black;"&gt;get_width&lt;/span&gt; &lt;span style="color:black;"&gt;(&lt;/span&gt;&lt;span style="color:black;"&gt;)&lt;/span&gt;&lt;span style="color:black;"&gt;)&lt;/span&gt;, pango.&lt;span style="color:black;"&gt;PIXELS&lt;/span&gt;&lt;span style="color:black;"&gt;(&lt;/span&gt;table.&lt;span style="color:black;"&gt;get_height&lt;/span&gt;&lt;span style="color:black;"&gt;(&lt;/span&gt;&lt;span style="color:black;"&gt;)&lt;/span&gt;&lt;span style="color:black;"&gt;)&lt;/span&gt;&lt;span style="color:black;"&gt;)&lt;/span&gt;&lt;br /&gt;cr.&lt;span style="color:black;"&gt;set_source_rgb&lt;/span&gt; &lt;span style="color:black;"&gt;(&lt;/span&gt;&lt;span style="color:#ff4500;"&gt;0.8&lt;/span&gt;, &lt;span style="color:#ff4500;"&gt;0.8&lt;/span&gt;, &lt;span style="color:#ff4500;"&gt;0.8&lt;/span&gt;&lt;span style="color:black;"&gt;)&lt;/span&gt;&lt;br /&gt;cr.&lt;span style="color:black;"&gt;fill&lt;/span&gt; &lt;span style="color:black;"&gt;(&lt;/span&gt;&lt;span style="color:black;"&gt;)&lt;/span&gt;&lt;br /&gt;cr.&lt;span style="color:black;"&gt;set_source_rgb&lt;/span&gt; &lt;span style="color:black;"&gt;(&lt;/span&gt;&lt;span style="color:#ff4500;"&gt;0&lt;/span&gt;, &lt;span style="color:#ff4500;"&gt;0&lt;/span&gt;, &lt;span style="color:#ff4500;"&gt;0&lt;/span&gt;&lt;span style="color:black;"&gt;)&lt;/span&gt;&lt;br /&gt;table.&lt;span style="color:black;"&gt;show_table&lt;/span&gt; &lt;span style="color:black;"&gt;(&lt;/span&gt;cr&lt;span style="color:black;"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;cr.&lt;span style="color:black;"&gt;translate&lt;/span&gt; &lt;span style="color:black;"&gt;(&lt;/span&gt;&lt;span style="color:#ff4500;"&gt;0&lt;/span&gt;, &lt;span style="color:#ff4500;"&gt;200&lt;/span&gt;&lt;span style="color:black;"&gt;)&lt;/span&gt;&lt;br /&gt;cr.&lt;span style="color:black;"&gt;rectangle&lt;/span&gt; &lt;span style="color:black;"&gt;(&lt;/span&gt;&lt;span style="color:#ff4500;"&gt;0&lt;/span&gt;, &lt;span style="color:#ff4500;"&gt;0&lt;/span&gt;, pango.&lt;span style="color:black;"&gt;PIXELS&lt;/span&gt;&lt;span style="color:black;"&gt;(&lt;/span&gt;table.&lt;span style="color:black;"&gt;get_width&lt;/span&gt; &lt;span style="color:black;"&gt;(&lt;/span&gt;&lt;span style="color:black;"&gt;)&lt;/span&gt;&lt;span style="color:black;"&gt;)&lt;/span&gt;, pango.&lt;span style="color:black;"&gt;PIXELS&lt;/span&gt;&lt;span style="color:black;"&gt;(&lt;/span&gt;table.&lt;span style="color:black;"&gt;get_height&lt;/span&gt;&lt;span style="color:black;"&gt;(&lt;/span&gt;&lt;span style="color:black;"&gt;)&lt;/span&gt;&lt;span style="color:black;"&gt;)&lt;/span&gt;&lt;span style="color:black;"&gt;)&lt;/span&gt;&lt;br /&gt;cr.&lt;span style="color:black;"&gt;set_source_rgb&lt;/span&gt; &lt;span style="color:black;"&gt;(&lt;/span&gt;&lt;span style="color:#ff4500;"&gt;0.4&lt;/span&gt;, &lt;span style="color:#ff4500;"&gt;0.5&lt;/span&gt;, &lt;span style="color:#ff4500;"&gt;0.7&lt;/span&gt;&lt;span style="color:black;"&gt;)&lt;/span&gt;&lt;br /&gt;cr.&lt;span style="color:black;"&gt;fill&lt;/span&gt; &lt;span style="color:black;"&gt;(&lt;/span&gt;&lt;span style="color:black;"&gt;)&lt;/span&gt;&lt;br /&gt;cr.&lt;span style="color:black;"&gt;set_source_rgb&lt;/span&gt; &lt;span style="color:black;"&gt;(&lt;/span&gt;&lt;span style="color:#ff4500;"&gt;0&lt;/span&gt;, &lt;span style="color:#ff4500;"&gt;0&lt;/span&gt;, &lt;span style="color:#ff4500;"&gt;0&lt;/span&gt;&lt;span style="color:black;"&gt;)&lt;/span&gt;&lt;br /&gt;table.&lt;span style="color:black;"&gt;show_table&lt;/span&gt; &lt;span style="color:black;"&gt;(&lt;/span&gt;cr&lt;span style="color:black;"&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/div&gt;&lt;br /&gt;Here's the result &lt;b&gt;test.pdf&lt;/b&gt;:&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;center&gt;&lt;img src="http://lh3.ggpht.com/_E0EaaGGWB9c/Sh2zsrcXtQI/AAAAAAAAAJ8/kvUTyh-hLcw/s800/Screenshot.png" /&gt;&lt;br /&gt;&lt;/center&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32054652-8734694823229845657?l=lethalman.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lethalman.blogspot.com/feeds/8734694823229845657/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=32054652&amp;postID=8734694823229845657' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32054652/posts/default/8734694823229845657'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32054652/posts/default/8734694823229845657'/><link rel='alternate' type='text/html' href='http://lethalman.blogspot.com/2009/05/render-tables-with-pangocairo-like.html' title='Render tables with pangocairo like reportlab'/><author><name>Luca Bruno aka Lethalman</name><uri>http://www.blogger.com/profile/06329046616630750783</uri><email>lethalman88@gmail.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='07412890738869959260'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh3.ggpht.com/_E0EaaGGWB9c/Sh2zsrcXtQI/AAAAAAAAAJ8/kvUTyh-hLcw/s72-c/Screenshot.png' height='72' width='72'/><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32054652.post-3744281542261398799</id><published>2009-05-18T11:33:00.000-07:00</published><updated>2009-05-23T01:23:37.159-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='webkit'/><category scheme='http://www.blogger.com/atom/ns#' term='gtk'/><category scheme='http://www.blogger.com/atom/ns#' term='gnome'/><title type='text'>Blogging from Epiphany WebKit</title><content type='html'>Hello,&lt;br /&gt;I've been using Midori for a while. It's a great browser: innovative and light. However all my bookmarks and data are in Epiphany. Last week the new epiphany-webkit version has been uploaded in Debian Sid and I couldn't wait to test it. I'm currently using it instead of gecko; it has still some issues but I begun living without it.&lt;br /&gt;&lt;a href="http://picasaweb.google.it/lethalman88/GNOME?feat=embedwebsite#5337233358166681346"&gt;&lt;img src="http://lh3.ggpht.com/_E0EaaGGWB9c/ShGpdhzj5wI/AAAAAAAAAJg/y0N8am7oZIQ/s288/Screenshot.png" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32054652-3744281542261398799?l=lethalman.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lethalman.blogspot.com/feeds/3744281542261398799/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=32054652&amp;postID=3744281542261398799' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32054652/posts/default/3744281542261398799'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32054652/posts/default/3744281542261398799'/><link rel='alternate' type='text/html' href='http://lethalman.blogspot.com/2009/05/blogging-from-epiphany-webkit.html' title='Blogging from Epiphany WebKit'/><author><name>Luca Bruno aka Lethalman</name><uri>http://www.blogger.com/profile/06329046616630750783</uri><email>lethalman88@gmail.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='07412890738869959260'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh3.ggpht.com/_E0EaaGGWB9c/ShGpdhzj5wI/AAAAAAAAAJg/y0N8am7oZIQ/s72-c/Screenshot.png' height='72' width='72'/><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32054652.post-2299766947964491164</id><published>2009-04-26T10:40:00.000-07:00</published><updated>2009-04-26T10:49:26.580-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='gtk'/><category scheme='http://www.blogger.com/atom/ns#' term='cairo'/><category scheme='http://www.blogger.com/atom/ns#' term='gnome'/><title type='text'>Create a GdkPixbuf from cairo surface</title><content type='html'>Hello,&lt;br /&gt;here's the inverted code snippet of the previous post.&lt;br /&gt;&lt;br /&gt;&lt;code&gt;w, h = surface.&lt;span style="color: black;"&gt;get_width&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;#41;&lt;/span&gt;, surface.&lt;span style="color: black;"&gt;get_height&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;#41;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;pixmap = gtk.&lt;span style="color: black;"&gt;gdk&lt;/span&gt;.&lt;span style="color: black;"&gt;Pixmap&lt;/span&gt; &lt;span style="color: black;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #008000;"&gt;None&lt;/span&gt;, w, h, &lt;span style="color: #ff4500;"&gt;24&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;#41;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;cr = pixmap.&lt;span style="color: black;"&gt;cairo_create&lt;/span&gt; &lt;span style="color: black;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;#41;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;cr.&lt;span style="color: black;"&gt;set_source_surface&lt;/span&gt; &lt;span style="color: black;"&gt;&amp;#40;&lt;/span&gt;surface, &lt;span style="color: #ff4500;"&gt;0&lt;/span&gt;, &lt;span style="color: #ff4500;"&gt;0&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;#41;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;cr.&lt;span style="color: black;"&gt;paint&lt;/span&gt; &lt;span style="color: black;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;#41;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;pixbuf = gtk.&lt;span style="color: black;"&gt;gdk&lt;/span&gt;.&lt;span style="color: black;"&gt;Pixbuf&lt;/span&gt; &lt;span style="color: black;"&gt;&amp;#40;&lt;/span&gt;gtk.&lt;span style="color: black;"&gt;gdk&lt;/span&gt;.&lt;span style="color: black;"&gt;COLORSPACE_RGB&lt;/span&gt;, &lt;span style="color: #008000;"&gt;True&lt;/span&gt;, &lt;span style="color: #ff4500;"&gt;8&lt;/span&gt;, w, h&lt;span style="color: black;"&gt;&amp;#41;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;pixbuf = pixbuf.&lt;span style="color: black;"&gt;get_from_drawable&lt;/span&gt; &lt;span style="color: black;"&gt;&amp;#40;&lt;/span&gt;pixmap, gtk.&lt;span style="color: black;"&gt;gdk&lt;/span&gt;.&lt;span style="color: black;"&gt;colormap_get_system&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;#41;&lt;/span&gt;, &lt;span style="color: #ff4500;"&gt;0&lt;/span&gt;, &lt;span style="color: #ff4500;"&gt;0&lt;/span&gt;, &lt;span style="color: #ff4500;"&gt;0&lt;/span&gt;, &lt;span style="color: #ff4500;"&gt;0&lt;/span&gt;, w, h&lt;span style="color: black;"&gt;&amp;#41;&lt;/span&gt;&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32054652-2299766947964491164?l=lethalman.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lethalman.blogspot.com/feeds/2299766947964491164/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=32054652&amp;postID=2299766947964491164' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32054652/posts/default/2299766947964491164'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32054652/posts/default/2299766947964491164'/><link rel='alternate' type='text/html' href='http://lethalman.blogspot.com/2009/04/create-pixbuf-from-cairo-surface.html' title='Create a GdkPixbuf from cairo surface'/><author><name>Luca Bruno aka Lethalman</name><uri>http://www.blogger.com/profile/06329046616630750783</uri><email>lethalman88@gmail.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='07412890738869959260'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32054652.post-9209519921234896024</id><published>2009-04-25T02:03:00.000-07:00</published><updated>2009-04-25T02:13:01.462-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='cairo'/><category scheme='http://www.blogger.com/atom/ns#' term='gnome'/><category scheme='http://www.blogger.com/atom/ns#' term='clutter'/><title type='text'>Create a cairo surface from a pixbuf</title><content type='html'>Hello,&lt;br /&gt;sometimes in the code of a couple of projects I see some hard algorithms to transform a pixbuf in a cairo surface.&lt;br /&gt;Maybe most of people don't know that GdkCairoContext, contrarily to cairo_t, is created against a cairo context not a cairo surface:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;surface = cairo.&lt;span style="color: black;"&gt;ImageSurface&lt;/span&gt; &lt;span style="color: black;"&gt;&amp;#40;&lt;/span&gt;cairo.&lt;span style="color: black;"&gt;FORMAT_ARGB32&lt;/span&gt;, pixbuf.&lt;span style="color: black;"&gt;get_width&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;#41;&lt;/span&gt;, pixbuf.&lt;span style="color: black;"&gt;get_height&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;#41;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;cr = cairo.&lt;span style="color: black;"&gt;Context&lt;/span&gt; &lt;span style="color: black;"&gt;&amp;#40;&lt;/span&gt;surface&lt;span style="color: black;"&gt;&amp;#41;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;gdkcr = gtk.&lt;span style="color: black;"&gt;gdk&lt;/span&gt;.&lt;span style="color: black;"&gt;CairoContext&lt;/span&gt; &lt;span style="color: black;"&gt;&amp;#40;&lt;/span&gt;cr&lt;span style="color: black;"&gt;&amp;#41;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;gdkcr.&lt;span style="color: black;"&gt;set_source_pixbuf&lt;/span&gt; &lt;span style="color: black;"&gt;&amp;#40;&lt;/span&gt;pixbuf&lt;span style="color: black;"&gt;&amp;#41;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;gdkcr.&lt;span style="color: black;"&gt;paint&lt;/span&gt; &lt;span style="color: black;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;#41;&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Notice &lt;span style="font-weight:bold;"&gt;gtk.gdk.CairoContext (cr)&lt;/span&gt;, which cr is not the surface. That's the key of the code snippet.&lt;br /&gt;&lt;br /&gt;For instance this can be applied on a ClutterCairoTexture to render pixbufs in the canvas.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32054652-9209519921234896024?l=lethalman.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lethalman.blogspot.com/feeds/9209519921234896024/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=32054652&amp;postID=9209519921234896024' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32054652/posts/default/9209519921234896024'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32054652/posts/default/9209519921234896024'/><link rel='alternate' type='text/html' href='http://lethalman.blogspot.com/2009/04/create-cairo-surface-from-pixbuf.html' title='Create a cairo surface from a pixbuf'/><author><name>Luca Bruno aka Lethalman</name><uri>http://www.blogger.com/profile/06329046616630750783</uri><email>lethalman88@gmail.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='07412890738869959260'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32054652.post-4754270548907203342</id><published>2009-02-27T15:12:00.001-08:00</published><updated>2009-02-27T15:50:59.366-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='debian'/><category scheme='http://www.blogger.com/atom/ns#' term='awesome'/><category scheme='http://www.blogger.com/atom/ns#' term='gnome'/><title type='text'>Awesome/other wrong keyboard layout</title><content type='html'>Hello,&lt;br /&gt;&lt;span style="font-style:italic;"&gt;due to the high resource usage by Eclipse (I have to use that unfortunately because of my professor) I've temporarly dropped GNOME and now I'm using &lt;a href="http://awesome.naquadah.org/"&gt;Awesome&lt;/a&gt; for a while.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Ok let's say the problem: the keyboard. Do you have different languages, layouts and so on among several configurations (GNOME, X, ...) and your keyboard layout is messed up with awesome?&lt;br /&gt;Just do it:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;setxkbmap -layout YOURLAYOUT&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Where YOURLAYOUT for me is &lt;span style="font-weight:bold;"&gt;it&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;I've found this utility in &lt;a href="http://www.mail-archive.com/awesome-devel@naquadah.org/msg00059.html"&gt;this mailing thread&lt;/a&gt;. Yet you can read that awesome is still too young and lacks some keyboard configuration features.&lt;br /&gt;&lt;br /&gt;Have fun!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32054652-4754270548907203342?l=lethalman.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lethalman.blogspot.com/feeds/4754270548907203342/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=32054652&amp;postID=4754270548907203342' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32054652/posts/default/4754270548907203342'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32054652/posts/default/4754270548907203342'/><link rel='alternate' type='text/html' href='http://lethalman.blogspot.com/2009/02/awesomeother-wrong-keyboard-layout.html' title='Awesome/other wrong keyboard layout'/><author><name>Luca Bruno aka Lethalman</name><uri>http://www.blogger.com/profile/06329046616630750783</uri><email>lethalman88@gmail.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='07412890738869959260'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32054652.post-7911908120576053539</id><published>2009-02-24T14:11:00.000-08:00</published><updated>2009-02-24T14:22:46.526-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='development'/><category scheme='http://www.blogger.com/atom/ns#' term='media'/><title type='text'>JMF and MPEG</title><content type='html'>Hello,&lt;br /&gt;I'm recently writing a game with Java AWT/Swing/SwingX/JMF for a university exam.&lt;br /&gt;If you are using the Java Media Framework and most of the formats (all the well known and used formats) can't be handled by the library here's your definitive solution to the problem.&lt;br /&gt;You will usually get "&lt;span style="font-weight:bold;"&gt;Unable to handle format: MPEG&lt;/span&gt;" or something like that.&lt;br /&gt;&lt;br /&gt;How do you get rid of that and make things work? There's a great plugin named &lt;span style="font-weight:bold;"&gt;&lt;a href="http://jffmpeg.sourceforge.net/"&gt;jffmpeg&lt;/a&gt;&lt;/span&gt; which handles a huge number of audio and video formats (including ogg/vob).&lt;br /&gt;Just follow the instructions on the project website to install the plugins.&lt;br /&gt;&lt;br /&gt;Alternatively you can register only the codec and demux you use from within your application code as follows (e.g. only handle MPEG video format on input):&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;span style="color: #aaaadd; font-weight: bold;"&gt;Format&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;&amp;#91;&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;&amp;#93;&lt;/span&gt; inFormats = &lt;span style="color: #66cc66;"&gt;&amp;#123;&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold;"&gt;new&lt;/span&gt; VideoFormat &lt;span style="color: #66cc66;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;&amp;quot;MPEG&amp;quot;&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;&amp;#41;&lt;/span&gt; &lt;span style="color: #66cc66;"&gt;&amp;#125;&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;PlugInManager.&lt;span style="color: #006600;"&gt;addPlugIn&lt;/span&gt; &lt;span style="color: #66cc66;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;&amp;quot;net.sourceforge.jffmpeg.VideoDecoder&amp;quot;&lt;/span&gt;, inFormats, &lt;span style="color: #000000; font-weight: bold;"&gt;null&lt;/span&gt;, PlugInManager.&lt;span style="color: #006600;"&gt;CODEC&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;PlugInManager.&lt;span style="color: #006600;"&gt;commit&lt;/span&gt; &lt;span style="color: #66cc66;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;;&lt;/span&gt;&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32054652-7911908120576053539?l=lethalman.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lethalman.blogspot.com/feeds/7911908120576053539/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=32054652&amp;postID=7911908120576053539' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32054652/posts/default/7911908120576053539'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32054652/posts/default/7911908120576053539'/><link rel='alternate' type='text/html' href='http://lethalman.blogspot.com/2009/02/jmf-and-mpeg.html' title='JMF and MPEG'/><author><name>Luca Bruno aka Lethalman</name><uri>http://www.blogger.com/profile/06329046616630750783</uri><email>lethalman88@gmail.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='07412890738869959260'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32054652.post-8431320876871924221</id><published>2009-01-10T02:42:00.000-08:00</published><updated>2009-01-10T02:48:11.333-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='development'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='freespeak'/><category scheme='http://www.blogger.com/atom/ns#' term='gnome'/><title type='text'>FreeSpeak 0.3.0 has been released</title><content type='html'>&lt;span style="font-weight:bold;"&gt;&lt;a href="http://freespeak.berlios.de"&gt;FreeSpeak&lt;/a&gt; is a free (as in freedom, developed and released under the terms of GPL) frontend to online translator engines (such as Google, Yahoo, etc.). It is written in Python, it uses the GTK toolkit and some GNOME infrastructure features.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;This is a major enhancemenfts release.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://freespeak.berlios.de/screenshots/main_window-20090109.png"&gt;&lt;img style="margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 160px; height: auto;" src="http://freespeak.berlios.de/screenshots/main_window-20090109.png" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Overview of Changes from FreeSpeak 0.2.0 to FreeSpeak 0.3.0&lt;br /&gt;===========================================================&lt;br /&gt;&lt;br /&gt;* Project is now hosted at BerliOS.de: http://freespeak.berlios.de&lt;br /&gt;&lt;br /&gt;* Support for cancellating operations has been added&lt;br /&gt;&lt;br /&gt;* Translation suggestions (open-tran) have been added&lt;br /&gt;&lt;br /&gt;* A menubar has been added and the toolbar has been cleaned up&lt;br /&gt;&lt;br /&gt;* The behavior of language/translation selection has been fixed and improved&lt;br /&gt;&lt;br /&gt;* GNOME documentation has been added&lt;br /&gt;&lt;br /&gt;* Dependencies in the configuration have been cleaned up&lt;br /&gt;&lt;br /&gt;* Support for global keybindings has been added through python-xlib&lt;br /&gt;&lt;br /&gt;* An introduction widget for the main window has been created&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32054652-8431320876871924221?l=lethalman.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lethalman.blogspot.com/feeds/8431320876871924221/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=32054652&amp;postID=8431320876871924221' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32054652/posts/default/8431320876871924221'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32054652/posts/default/8431320876871924221'/><link rel='alternate' type='text/html' href='http://lethalman.blogspot.com/2009/01/freespeak-030-has-been-released.html' title='FreeSpeak 0.3.0 has been released'/><author><name>Luca Bruno aka Lethalman</name><uri>http://www.blogger.com/profile/06329046616630750783</uri><email>lethalman88@gmail.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='07412890738869959260'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32054652.post-3176138976220639485</id><published>2008-12-26T10:54:00.000-08:00</published><updated>2008-12-26T11:21:28.742-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mutt'/><category scheme='http://www.blogger.com/atom/ns#' term='debian'/><category scheme='http://www.blogger.com/atom/ns#' term='mail'/><title type='text'>Mailbox-to-mbox</title><content type='html'>Hello,&lt;br /&gt;lately I've been looking for a way to convert a &lt;a href="http://www.list.org/"&gt;mailman&lt;/a&gt; &lt;a href="http://www.mail-archive.com/"&gt;archive&lt;/a&gt; to an mbox format so that I could open with &lt;a href="http://www.mutt.org/"&gt;mutt&lt;/a&gt;.&lt;br /&gt;I then found a couple of scripts, but the one I've found simpler and working for my needs is &lt;a href="http://svn.rot13.org/index.cgi/perl/view/trunk/mailman2mbox.pl"&gt;mailbox2mbox.pl&lt;/a&gt;.&lt;br /&gt;Sample usage:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;$ gunzip YourArchive.txt.gz&lt;br /&gt;$ perl mailbox2mbox.pl &lt; YourArchive.txt &gt; mbox&lt;br /&gt;$ mutt -f mbox&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;And it simply works!&lt;br /&gt;Does anybody know a method as simple as the above one but more powerful?&lt;br /&gt;&lt;br /&gt;PS: Happy holidays!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32054652-3176138976220639485?l=lethalman.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lethalman.blogspot.com/feeds/3176138976220639485/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=32054652&amp;postID=3176138976220639485' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32054652/posts/default/3176138976220639485'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32054652/posts/default/3176138976220639485'/><link rel='alternate' type='text/html' href='http://lethalman.blogspot.com/2008/12/mailmbox-to-mbox.html' title='Mailbox-to-mbox'/><author><name>Luca Bruno aka Lethalman</name><uri>http://www.blogger.com/profile/06329046616630750783</uri><email>lethalman88@gmail.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='07412890738869959260'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32054652.post-6407685883656922877</id><published>2008-12-21T01:52:00.000-08:00</published><updated>2008-12-21T02:11:51.965-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='gtk'/><category scheme='http://www.blogger.com/atom/ns#' term='development'/><category scheme='http://www.blogger.com/atom/ns#' term='xlib'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='gnome'/><title type='text'>Global keybinding on X</title><content type='html'>Hello,&lt;br /&gt;lately I've been looking for a way to create a desktop-wide keybinding for &lt;a href="http://freespeak.berlios.de/"&gt;FreeSpeak&lt;/a&gt;.&lt;br /&gt;I first looked into Tomboy and Deskbar source codes but the egg was too huge to be adopted, and it would have brought C dependency which isn't always nice for a Python project.&lt;br /&gt;Then fargiolas pointed me to a &lt;a href="http://blogs.gnome.org/brunobol/2008/12/14/global-keybindings-in-gtk/"&gt;blog post&lt;/a&gt; where I could find about &lt;a href="http://live.gnome.org/ControlCenter/ApplicationDefinedKeybindings"&gt;gnome keybindings&lt;/a&gt; owned by gnome control center. Well that was only a mirage as it doesn't really grab the key but it's only a visual entry in the keyboard shortcuts preferences.&lt;br /&gt;After a few days I've finally found a not-so-hackish solution in about one hundred lines of Python code.&lt;br /&gt;&lt;br /&gt;Here is the &lt;a href="https://www.siafoo.net/snippet/239"&gt;snippet&lt;/a&gt; (&lt;a href="https://www.siafoo.net/snippet/239/download/globalkeybinding.py"&gt;download&lt;/a&gt;), only using &lt;a href="http://python-xlib.sourceforge.net/"&gt;Xlib&lt;/a&gt; and GTK+ Python bindings.&lt;br /&gt;&lt;br /&gt;Sample usage:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;def callback (keybinding):&lt;br /&gt;   print 'Callback!'&lt;br /&gt;   gtk.main_quit ()&lt;br /&gt;&lt;br /&gt;gtk.gdk.threads_init ()&lt;br /&gt;keybinding = GlobalKeyBinding ("/apps/appdir", "key_binding")&lt;br /&gt;keybinding.connect ('activate', callback)&lt;br /&gt;keybinding.grab ()&lt;br /&gt;keybinding.start ()&lt;br /&gt;gtk.main ()&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;The only problem is that it doesn't make use of GDK filters because PyGTK doesn't provide such function wrappers and there's no GDK-to-Xlib mapping available.&lt;br /&gt;But yes, it works very good.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32054652-6407685883656922877?l=lethalman.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lethalman.blogspot.com/feeds/6407685883656922877/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=32054652&amp;postID=6407685883656922877' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32054652/posts/default/6407685883656922877'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32054652/posts/default/6407685883656922877'/><link rel='alternate' type='text/html' href='http://lethalman.blogspot.com/2008/12/global-keybinding-on-x.html' title='Global keybinding on X'/><author><name>Luca Bruno aka Lethalman</name><uri>http://www.blogger.com/profile/06329046616630750783</uri><email>lethalman88@gmail.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='07412890738869959260'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32054652.post-7925744698182884264</id><published>2008-12-01T14:58:00.001-08:00</published><updated>2008-12-01T15:06:19.469-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='gtk'/><category scheme='http://www.blogger.com/atom/ns#' term='development'/><category scheme='http://www.blogger.com/atom/ns#' term='debian'/><category scheme='http://www.blogger.com/atom/ns#' term='gnome'/><category scheme='http://www.blogger.com/atom/ns#' term='aptitude'/><title type='text'>Aptitude-gtk progress</title><content type='html'>Hello,&lt;br /&gt;I was curious to see if aptitude-gtk was making some progress. I haven't followed the project since it's been merged into aptitude.&lt;br /&gt;Well, I found it more functional and complete. Here's a screenshot showing pending packages for upgrade after an update:&lt;br /&gt;&lt;table style="width:auto;"&gt;&lt;tr&gt;&lt;td&gt;&lt;a href="http://picasaweb.google.it/lh/photo/IvMGBbNHUKMJqmH-yYN31Q"&gt;&lt;img src="http://lh5.ggpht.com/_E0EaaGGWB9c/STRsYre6I3I/AAAAAAAAAG4/5OkitUMe9l8/s288/Screenshot-aptitude.png" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="font-family:arial,sans-serif; font-size:11px; text-align:right"&gt;From &lt;a href="http://picasaweb.google.it/lethalman88/GNOME"&gt;GNOME&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;The team is definitely doing a good job. Hopefully I'll find the time to give some help as I'm really interested in such full-featured GUI frontend.&lt;br /&gt;Keep going on!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32054652-7925744698182884264?l=lethalman.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lethalman.blogspot.com/feeds/7925744698182884264/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=32054652&amp;postID=7925744698182884264' title='16 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32054652/posts/default/7925744698182884264'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32054652/posts/default/7925744698182884264'/><link rel='alternate' type='text/html' href='http://lethalman.blogspot.com/2008/12/aptitude-gtk-progress.html' title='Aptitude-gtk progress'/><author><name>Luca Bruno aka Lethalman</name><uri>http://www.blogger.com/profile/06329046616630750783</uri><email>lethalman88@gmail.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='07412890738869959260'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh5.ggpht.com/_E0EaaGGWB9c/STRsYre6I3I/AAAAAAAAAG4/5OkitUMe9l8/s72-c/Screenshot-aptitude.png' height='72' width='72'/><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>16</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32054652.post-3181292721040009284</id><published>2008-11-30T03:47:00.000-08:00</published><updated>2008-11-30T03:59:40.383-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='gtk'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='freespeak'/><category scheme='http://www.blogger.com/atom/ns#' term='gnome'/><title type='text'>FreeSpeak gains translation suggestions</title><content type='html'>Hello,&lt;br /&gt;it hasn't been a long time since &lt;a href="http://freespeak.berlios.de/"&gt;FreeSpeak&lt;/a&gt; &lt;a href="http://lethalman.blogspot.com/2008/11/freespeak-020-has-been-released.html"&gt;0.2.0&lt;/a&gt; has been released. One of the &lt;a href="http://git.berlios.de/cgi-bin/gitweb.cgi?p=freespeak;a=blob_plain;f=TODO;h=03e80a7cd82ab56d177b25d9d0335717528d93ab;hb=HEAD"&gt;TODO&lt;/a&gt;s for the next release was to support &lt;a href="http://open-tran.eu/"&gt;open-tran&lt;/a&gt;, and more over translation suggestions for development.&lt;br /&gt;This is a screenshot of what's been included in the repository today:&lt;br /&gt;&lt;table style="width: auto;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;a href="http://picasaweb.google.it/lh/photo/k7lJRoox_f8Tx8Hb1PdHVw"&gt;&lt;img src="http://lh5.ggpht.com/_E0EaaGGWB9c/STJ80bolYbI/AAAAAAAAAGs/pQAeECpUf98/s288/Screenshot.png" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="font-family: arial,sans-serif; font-size: 11px; text-align: right;"&gt;From &lt;a href="http://picasaweb.google.it/lethalman88/GNOME"&gt;GNOME&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;FreeSpeak is a GNOME frontend to online translator engines.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32054652-3181292721040009284?l=lethalman.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lethalman.blogspot.com/feeds/3181292721040009284/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=32054652&amp;postID=3181292721040009284' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32054652/posts/default/3181292721040009284'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32054652/posts/default/3181292721040009284'/><link rel='alternate' type='text/html' href='http://lethalman.blogspot.com/2008/11/freespeak-gains-translation-suggestions.html' title='FreeSpeak gains translation suggestions'/><author><name>Luca Bruno aka Lethalman</name><uri>http://www.blogger.com/profile/06329046616630750783</uri><email>lethalman88@gmail.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='07412890738869959260'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh5.ggpht.com/_E0EaaGGWB9c/STJ80bolYbI/AAAAAAAAAGs/pQAeECpUf98/s72-c/Screenshot.png' height='72' width='72'/><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32054652.post-3067777568285553030</id><published>2008-11-28T03:57:00.000-08:00</published><updated>2008-11-28T04:11:27.741-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='gtk'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='freespeak'/><category scheme='http://www.blogger.com/atom/ns#' term='gnome'/><title type='text'>FreeSpeak 0.2.0 has been released</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://freespeak.berlios.de/screenshots/web_translation-20081123-sm.png"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 260px; height: 195px;" src="http://freespeak.berlios.de/screenshots/web_translation-20081123-sm.png" alt="" border="0" /&gt;&lt;/a&gt;Hello,&lt;br /&gt;after some work in these weeks now I have released a new version of &lt;a href="http://freespeak.berlios.de/"&gt;FreeSpeak&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;blockquote style="font-style: italic;"&gt;&lt;div style="text-align: justify;"&gt;FreeSpeak is a free (as in freedom, developed and released under the terms of GPL) frontend to online translator engines (such as Google, Yahoo, etc.). It is written in Python, it uses the GTK toolkit and some GNOME infrastructure features&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;.&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://freespeak.berlios.de/screenshots/text_translation-20081123-sm.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 260px; height: 195px;" src="http://freespeak.berlios.de/screenshots/text_translation-20081123-sm.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/blockquote&gt;It's been rewritten almost from scratch so I think there's no need to post release notes here. Anyway you can always read what changed from the old version released a couple of years ago &lt;a href="https://developer.berlios.de/project/shownotes.php?group_id=10396&amp;amp;release_id=15471"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Notice that the project homepage has been changed. The project has now moved to &lt;/span&gt;&lt;a style="font-style: italic;" href="https://developer.berlios.de/projects/freespeak/"&gt;BerliOS.de&lt;/a&gt;&lt;span style="font-style: italic;"&gt;.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32054652-3067777568285553030?l=lethalman.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lethalman.blogspot.com/feeds/3067777568285553030/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=32054652&amp;postID=3067777568285553030' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32054652/posts/default/3067777568285553030'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32054652/posts/default/3067777568285553030'/><link rel='alternate' type='text/html' href='http://lethalman.blogspot.com/2008/11/freespeak-020-has-been-released.html' title='FreeSpeak 0.2.0 has been released'/><author><name>Luca Bruno aka Lethalman</name><uri>http://www.blogger.com/profile/06329046616630750783</uri><email>lethalman88@gmail.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='07412890738869959260'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32054652.post-1236964852296838360</id><published>2008-11-23T12:38:00.000-08:00</published><updated>2008-11-23T13:02:44.592-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='gtk'/><category scheme='http://www.blogger.com/atom/ns#' term='development'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='clutter'/><title type='text'>Replace GTK+ with Clutter for fun</title><content type='html'>Hello,&lt;br /&gt;lately I was having fun with &lt;a href="http://clutter-project.org"&gt;Clutter&lt;/a&gt; and Python. I've started by creating some Gtk-like widgets (such as GtkWindow, GtkBox, and GtkButton) in Clutter.&lt;br /&gt;Well, this is the result... it's a simple example of a very poor toolkit, but it works:&lt;br /&gt;&lt;table style="width: auto;" cellspacing="10"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;a href="http://picasaweb.google.it/lh/photo/YjGKbSfgr4abDzfp1kbVMA"&gt;&lt;img src="http://lh4.ggpht.com/_E0EaaGGWB9c/SSm-4RThGlI/AAAAAAAAAFU/usOXqp4X4rE/s288/Screenshot-Untitled%20Window.png" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;Try it, it's only &lt;a href="http://docs.google.com/View?docid=dhf97f7b_2z6s6sshk"&gt;one .py file source code&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32054652-1236964852296838360?l=lethalman.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lethalman.blogspot.com/feeds/1236964852296838360/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=32054652&amp;postID=1236964852296838360' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32054652/posts/default/1236964852296838360'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32054652/posts/default/1236964852296838360'/><link rel='alternate' type='text/html' href='http://lethalman.blogspot.com/2008/11/replace-gtk-with-clutter-for-fun.html' title='Replace GTK+ with Clutter for fun'/><author><name>Luca Bruno aka Lethalman</name><uri>http://www.blogger.com/profile/06329046616630750783</uri><email>lethalman88@gmail.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='07412890738869959260'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/_E0EaaGGWB9c/SSm-4RThGlI/AAAAAAAAAFU/usOXqp4X4rE/s72-c/Screenshot-Untitled%20Window.png' height='72' width='72'/><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32054652.post-9029596304426955337</id><published>2008-11-16T10:01:00.000-08:00</published><updated>2008-11-16T10:33:21.098-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='gtk'/><category scheme='http://www.blogger.com/atom/ns#' term='development'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='dbus'/><category scheme='http://www.blogger.com/atom/ns#' term='gnome'/><title type='text'>Single app instances, Python and DBus</title><content type='html'>Hello,&lt;br /&gt;&lt;a href="http://lethalman.blogspot.com/2008/10/freespeak-gtkgnome-translator.html"&gt;I'm working on&lt;/a&gt;  &lt;a href="http://home.gna.org/freespeak"&gt;FreeSpeak&lt;/a&gt; lately and I needed to run the application once per session, as it's got a trayicon and a notebook (maybe windows with an applet is better?)&lt;br /&gt;I decided to use &lt;a href="http://dbus.freedesktop.org/"&gt;DBus&lt;/a&gt; for making the application run only a single instance; when you try to open it again it won't start another process, instead it will use the already running one.&lt;br /&gt;&lt;br /&gt;This is how I would create a generic single app instance with dbus-python:&lt;br /&gt;&lt;pre style="overflow: scroll"&gt;import dbus&lt;br /&gt;import dbus.bus&lt;br /&gt;import dbus.service&lt;br /&gt;import dbus.mainloop.glib&lt;br /&gt;import gobject&lt;br /&gt;&lt;br /&gt;class Application (dbus.service.Object):&lt;br /&gt;  def __init__ (self, bus, path, name):&lt;br /&gt;    dbus.service.Object.__init__ (self, bus, path, name)&lt;br /&gt;    self.loop = gobject.MainLoop ()&lt;br /&gt;&lt;br /&gt; @dbus.service.method ("org.domain.YourApplication",&lt;br /&gt;                       in_signature='a{sv}', out_signature='')&lt;br /&gt; def start (self, options={}):&lt;br /&gt;   if self.loop.is_running ():&lt;br /&gt;     print 'instance already running'&lt;br /&gt;   else:&lt;br /&gt;     self.loop.run ()&lt;br /&gt;&lt;br /&gt;dbus.mainloop.glib.DBusGMainLoop (set_as_default=True)&lt;br /&gt;bus = dbus.SessionBus ()&lt;br /&gt;request = bus.request_name ("org.domain.YourApplication", dbus.bus.NAME_FLAG_DO_NOT_QUEUE)&lt;br /&gt;if request != dbus.bus.REQUEST_NAME_REPLY_EXISTS:&lt;br /&gt; app = Application (bus, '/', "org.domain.YourApplication")&lt;br /&gt;else:&lt;br /&gt; object = bus.get_object ("org.domain.YourApplication", "/")&lt;br /&gt; app = dbus.Interface (object, "org.domain.YourApplication")&lt;br /&gt;&lt;br /&gt;# Get your options from the command line, e.g. with OptionParser&lt;br /&gt;options = {'option1': 'value1'}&lt;br /&gt;app.start (options)&lt;/pre&gt;&lt;span style="font-weight: bold;"&gt;How it works?&lt;/span&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Setup the mainloop for dbus&lt;/li&gt;&lt;li&gt;Request a session bus name, so that other applications (in our case another instance of the same application) can connect to it&lt;/li&gt;&lt;li&gt;Create a new instance at path / if the bus name doesn't exist (so we are the primary owner). If it exists, then obtain the object from dbus and call the method on the remote Application object using the known interface.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;The Application.start method checks if it's already running then decide what to do in both situations.&lt;/li&gt;&lt;/ol&gt;Creating a GTK+ application this way is really easy. It only needs to use the GTK+ mainloop.&lt;br /&gt;Let's suppose we want to present() the GtkWindow when the user tries to open another instance of the application:&lt;br /&gt;&lt;pre style="overflow: scroll"&gt;import dbus&lt;br /&gt;import dbus.bus&lt;br /&gt;import dbus.service&lt;br /&gt;import dbus.mainloop.glib&lt;br /&gt;import gobject&lt;br /&gt;import gtk&lt;br /&gt;import gtk.gdk&lt;br /&gt;import time&lt;br /&gt;&lt;br /&gt;class Application (dbus.service.Object):&lt;br /&gt; def __init__ (self, bus, path, name):&lt;br /&gt;   dbus.service.Object.__init__ (self, bus, path, name)&lt;br /&gt;   self.running = False&lt;br /&gt;   self.main_window = gtk.Window ()&lt;br /&gt;   self.main_window.show_all ()&lt;br /&gt;&lt;br /&gt; @dbus.service.method ("org.domain.YourApplication",&lt;br /&gt;                       in_signature='', out_signature='b')&lt;br /&gt; def is_running (self):&lt;br /&gt;   return self.running&lt;br /&gt;&lt;br /&gt; @dbus.service.method ("org.domain.YourApplication",&lt;br /&gt;                       in_signature='a{sv}i', out_signature='')&lt;br /&gt; def start (self, options, timestamp):&lt;br /&gt;   if self.is_running ():&lt;br /&gt;     self.main_window.present_with_time (timestamp)&lt;br /&gt;   else:&lt;br /&gt;     self.running = True&lt;br /&gt;     gtk.main ()&lt;br /&gt;     self.running = False&lt;br /&gt;&lt;br /&gt;dbus.mainloop.glib.DBusGMainLoop (set_as_default=True)&lt;br /&gt;bus = dbus.SessionBus ()&lt;br /&gt;request = bus.request_name ("org.domain.YourApplication", dbus.bus.NAME_FLAG_DO_NOT_QUEUE)&lt;br /&gt;if request != dbus.bus.REQUEST_NAME_REPLY_EXISTS:&lt;br /&gt; app = Application (bus, '/', "org.domain.YourApplication")&lt;br /&gt;else:&lt;br /&gt; object = bus.get_object ("org.domain.YourApplication", "/")&lt;br /&gt; app = dbus.Interface (object, "org.domain.YourApplication")&lt;br /&gt;&lt;br /&gt;# Get your options from the command line, e.g. with OptionParser&lt;br /&gt;options = {'option1': 'value1'}&lt;br /&gt;app.start (options, int (time.time ()))&lt;br /&gt;if app.is_running ():&lt;br /&gt; gtk.gdk.notify_startup_complete ()&lt;/pre&gt;&lt;span style="font-weight: bold;"&gt;How it works?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Let's say we're running the Application for the first time, the loop begins and when it ends &lt;span style="font-weight: bold;"&gt;running&lt;/span&gt; is set to False, so gtk.gdk.notify_startup_complete() won't be called. Instead, if the application is already running, start() will be called on the remote object running the loop. The method then returns immediately so gtk.gdk.notify_startup_complete() will be called.&lt;br /&gt;If you don't notify to the launcher that the startup is complete... guess what happens to your mouse and to your taskbar panel...&lt;br /&gt;&lt;br /&gt;If the loop is running, the window is presented to the user with a little delay. If you don't use any timestamp, the UI interaction won't let the window have the time to be presented.&lt;br /&gt;&lt;br /&gt;Of course, you can use DBus for many more things, like both setting options from the command line, as explained in the above code, and let other applications communicate with yours and viceversa.&lt;br /&gt;Nowadays almost all systems use DBus, so it won't be a pain to add such dependency. In my opinion, it would be much more painful to use lock files, FIFO, unix sockets or whatever. FreeSpeak used such old technologies and it was a very poor emulation of what DBus already offers.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32054652-9029596304426955337?l=lethalman.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lethalman.blogspot.com/feeds/9029596304426955337/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=32054652&amp;postID=9029596304426955337' title='12 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32054652/posts/default/9029596304426955337'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32054652/posts/default/9029596304426955337'/><link rel='alternate' type='text/html' href='http://lethalman.blogspot.com/2008/11/single-app-instances-python-and-dbus.html' title='Single app instances, Python and DBus'/><author><name>Luca Bruno aka Lethalman</name><uri>http://www.blogger.com/profile/06329046616630750783</uri><email>lethalman88@gmail.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='07412890738869959260'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>12</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32054652.post-1392655129808782703</id><published>2008-10-20T13:39:00.000-07:00</published><updated>2008-10-20T13:43:41.082-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='social'/><title type='text'>ping.fm is dead</title><content type='html'>Hello,&lt;br /&gt;lately I've been using &lt;a href="http://ping.fm"&gt;ping.fm&lt;/a&gt; for a couple of weeks because I've found it really useful.&lt;br /&gt;Today I've tried to update my status through sending a mail but I received delivery failures... I then discovered that ping.fm is dead!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32054652-1392655129808782703?l=lethalman.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lethalman.blogspot.com/feeds/1392655129808782703/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=32054652&amp;postID=1392655129808782703' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32054652/posts/default/1392655129808782703'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32054652/posts/default/1392655129808782703'/><link rel='alternate' type='text/html' href='http://lethalman.blogspot.com/2008/10/pingfm-is-dead.html' title='ping.fm is dead'/><author><name>Luca Bruno aka Lethalman</name><uri>http://www.blogger.com/profile/06329046616630750783</uri><email>lethalman88@gmail.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='07412890738869959260'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32054652.post-2402047531148597923</id><published>2008-10-14T14:31:00.001-07:00</published><updated>2008-10-14T14:53:14.614-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='gtk'/><category scheme='http://www.blogger.com/atom/ns#' term='development'/><category scheme='http://www.blogger.com/atom/ns#' term='gnome'/><title type='text'>FreeSpeak, a GTK+/GNOME translator</title><content type='html'>Hello,&lt;br /&gt;I've worked on &lt;a href="http://home.gna.org/freespeak"&gt;FreeSpeak&lt;/a&gt; a couple of years ago, a Python/GTK+/GNOME project to translate text and web pages by querying already existing online translation tools.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;PRO&lt;/span&gt;: It has been packed for Ubuntu and it has been publicized by a journal in Italy.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;CONS&lt;/span&gt;: It has been discontinued until now. In fact I restarted the project and I'm doing a huge refactoring because of the ugly code I wrote in the past.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://farm4.static.flickr.com/3201/2942062117_d9a5d6f7a9_o.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px;" src="http://farm4.static.flickr.com/3201/2942062117_d9a5d6f7a9_o.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;It's already working, but some features are still missing.&lt;br /&gt;The new approach will allow applications to use FreeSpeak as a Python library to embed the translation widgets.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://farm4.static.flickr.com/3218/2942062119_876e3eea9d_o.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px;" src="http://farm4.static.flickr.com/3218/2942062119_876e3eea9d_o.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Contact me if you intend to &lt;span style="font-weight: bold;"&gt;help the proje&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;ct&lt;/span&gt; with suggestions, bug reports, critiques and coding.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32054652-2402047531148597923?l=lethalman.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lethalman.blogspot.com/feeds/2402047531148597923/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=32054652&amp;postID=2402047531148597923' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32054652/posts/default/2402047531148597923'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32054652/posts/default/2402047531148597923'/><link rel='alternate' type='text/html' href='http://lethalman.blogspot.com/2008/10/freespeak-gtkgnome-translator.html' title='FreeSpeak, a GTK+/GNOME translator'/><author><name>Luca Bruno aka Lethalman</name><uri>http://www.blogger.com/profile/06329046616630750783</uri><email>lethalman88@gmail.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='07412890738869959260'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32054652.post-6900186416222043353</id><published>2008-10-10T09:12:00.000-07:00</published><updated>2008-10-10T09:13:09.115-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='development'/><category scheme='http://www.blogger.com/atom/ns#' term='debian'/><title type='text'>How to contribute to APT</title><content type='html'>&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32054652-6900186416222043353?l=lethalman.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='related' href='http://wiki.debian.org/Teams/Apt' title='How to contribute to APT'/><link rel='replies' type='application/atom+xml' href='http://lethalman.blogspot.com/feeds/6900186416222043353/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=32054652&amp;postID=6900186416222043353' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32054652/posts/default/6900186416222043353'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32054652/posts/default/6900186416222043353'/><link rel='alternate' type='text/html' href='http://lethalman.blogspot.com/2008/10/how-to-contribute-to-apt.html' title='How to contribute to APT'/><author><name>Luca Bruno aka Lethalman</name><uri>http://www.blogger.com/profile/06329046616630750783</uri><email>lethalman88@gmail.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='07412890738869959260'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry></feed>