<?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-1353239644941812755</id><updated>2012-02-02T10:19:54.156+01:00</updated><category term='python gtk pygtk'/><category term='linux'/><category term='python gstreamer soundconverter'/><category term='pygtk'/><category term='gtk'/><category term='python'/><category term='soundconverter'/><category term='gxiso'/><category term='gstreamer'/><category term='gnome'/><category term='dbus glib code'/><title type='text'>kassoulet codelog</title><subtitle type='html'>python | gtk | gnome | ubuntu</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://kassoulet.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1353239644941812755/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://kassoulet.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Gautier Portet</name><uri>http://www.blogger.com/profile/03671907054385598852</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_zh-tyncWHcQ/STlKajD5q2I/AAAAAAAAAlA/Nosshyn5y0c/S220/q625926376_80.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>20</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-1353239644941812755.post-2020480425649695572</id><published>2011-12-05T23:45:00.000+01:00</published><updated>2012-01-29T18:51:27.541+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='soundconverter'/><category scheme='http://www.blogger.com/atom/ns#' term='gtk'/><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='gstreamer'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='pygtk'/><category scheme='http://www.blogger.com/atom/ns#' term='gnome'/><title type='text'>SoundConverter 2.0</title><content type='html'>&lt;div&gt;&lt;div&gt;&lt;br /&gt;&lt;div style="text-align: left;"&gt;&lt;span style="font-size: large;"&gt;Refactoring and Internal Changes&lt;/span&gt;&lt;/div&gt;Time for a new release of SoundConverter. This one was long-delayed because of the changes I made to the code base. I wanted to split the source in several files, and this was long and painful, but I think it was worth it. The loading is faster, and the structure is much more clear now. It's still far from perfect, and more work is needed to totally finish the cleaning, but I'm happy with this release.&amp;nbsp;Another big change is the simplification of many classes.&lt;br /&gt;&lt;br /&gt;OK, enough talking about the internal changes since you don't care, and let's see what's new for &lt;i&gt;you&lt;/i&gt;.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-qMGBvfXF4yY/Tt1RFOyaulI/AAAAAAAABlA/zSeRE1c_v2c/s1600/screenshot-soundconverter.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-qMGBvfXF4yY/Tt1RFOyaulI/AAAAAAAABlA/zSeRE1c_v2c/s1600/screenshot-soundconverter.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;Important problems fixed&lt;/span&gt;&lt;br /&gt;The Vorbis output was badly broken since a few releases, causing snapping in the converted files, this is fixed now.&lt;br /&gt;Several crashes were fixed too.&lt;br /&gt;&lt;span style="font-size: large;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;Faster Adding&lt;/span&gt;&lt;br /&gt;SoundConverter was sometimes slow and unresponsive when adding huge amount of files, because it tried to read tags the earliest it can. Now it reads the tags just before converting. And only if needed by the target filename renaming.&lt;br /&gt;&lt;br /&gt;&lt;table cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;img src="https://docs.google.com/spreadsheet/oimg?key=0AmhvDIHfpKW4dGE2Y0NGSHMzY2RmT3V3elBlcS1TeVE&amp;amp;oid=2&amp;amp;zx=1tvl1epznbug" style="margin-left: auto; margin-right: auto;" /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Adding files speed test. 16x faster!&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;After a seance of profiling, it was clear that adding file by file to the UI was slow, so now files are added only when we are done scanning them.&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-44uYRrLvCdo/TwQu3dfZsKI/AAAAAAAABmc/9NDpk8Mrpac/s1600/chart_2.png" imageanchor="1" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-44uYRrLvCdo/TwQu3dfZsKI/AAAAAAAABmc/9NDpk8Mrpac/s1600/chart_2.png" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Adding files speed test. 3.5x faster!&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;The results speak for themselves, we went from 2 minutes down to 2 seconds. That's 60x faster!&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;New Filename Patterns&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;Speaking of filename,&amp;nbsp;{Ext}, {DiscNumber} and {DiscTotal} were added to filename patterns.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;Interface Changes&lt;/span&gt;&lt;br /&gt;When converting, progress bars now appear next to the files, so you can watch all the parallel processing occurring. That's what you are paying for, so it's important to see it :)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-Gp4FV7xHsN8/Tt1RUrvhFcI/AAAAAAAABlI/MmSiNyWNcWc/s1600/screenshot-converting.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-Gp4FV7xHsN8/Tt1RUrvhFcI/AAAAAAAABlI/MmSiNyWNcWc/s1600/screenshot-converting.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;You can't see it in this early screenshot, but the preferences now have a dedicated toolbar icon. Hopefully this will allow SoundConverter to be usable in Ubuntu Unity...&lt;br /&gt;&lt;span style="font-size: large;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;Speed limiter&lt;/span&gt;&lt;br /&gt;It's a bit ironic, as we were striving to get the maximum speed out of your hardware -and many of you are really happy with this- but alas some users were also complaining about overheating/crashes when SoundConverter used lots of processes for converting. If you were affected, rejoice, you can now limit the number of parallel conversions in the preference dialog.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/--kxcFGYUlXw/Tt1RdjDjIPI/AAAAAAAABlQ/Gctfh-OTrjM/s1600/screenshot-preferences.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/--kxcFGYUlXw/Tt1RdjDjIPI/AAAAAAAABlQ/Gctfh-OTrjM/s1600/screenshot-preferences.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;Other Problems&lt;/span&gt;&lt;br /&gt;We now exclude all files with .iso extension, since we can't read them...&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-size: large;"&gt;Hurrah for Fedora&lt;/span&gt;&lt;/div&gt;&lt;div&gt;I've now to thanks the wonderful Fedora packaging team, for being so nice and patient with me. They fixed a few problems in their packages, but I was slow to integrate them. This is done now. Hopefully now, the Fedora packages should be vanilla SoundConverter packages, and releasing will be easier for everybody.&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;The Future&lt;/span&gt;&lt;br /&gt;After this release I plan to fix the inevitable problems that will emerge, but the next big step is a total rewrite in python3, a brand new gtk3 interface. You guessed it, version 3!&lt;/div&gt;&lt;div&gt;&lt;br /&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/1353239644941812755-2020480425649695572?l=kassoulet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kassoulet.blogspot.com/feeds/2020480425649695572/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1353239644941812755&amp;postID=2020480425649695572' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1353239644941812755/posts/default/2020480425649695572'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1353239644941812755/posts/default/2020480425649695572'/><link rel='alternate' type='text/html' href='http://kassoulet.blogspot.com/2011/12/soundconverter-20.html' title='SoundConverter 2.0'/><author><name>Gautier Portet</name><uri>http://www.blogger.com/profile/03671907054385598852</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_zh-tyncWHcQ/STlKajD5q2I/AAAAAAAAAlA/Nosshyn5y0c/S220/q625926376_80.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-qMGBvfXF4yY/Tt1RFOyaulI/AAAAAAAABlA/zSeRE1c_v2c/s72-c/screenshot-soundconverter.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1353239644941812755.post-6589381505210781975</id><published>2011-02-10T13:43:00.000+01:00</published><updated>2011-02-10T13:43:11.876+01:00</updated><title type='text'>Gnome Thumbnail Cleaner</title><content type='html'>Thumbnail-cleaner is a simple tool I've done a long time ago, time for it to go public :)&lt;br /&gt;&lt;br /&gt;&lt;span id="goog_221262946"&gt;&lt;/span&gt;&lt;span id="goog_221262947"&gt;&lt;/span&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-QDZ_U7z42sE/TVPY4MShoFI/AAAAAAAABaA/QxyWul0ERoc/s1600/thumbnail-scanner-screenshot.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-QDZ_U7z42sE/TVPY4MShoFI/AAAAAAAABaA/QxyWul0ERoc/s1600/thumbnail-scanner-screenshot.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Gnome keeps a&amp;nbsp;cache&amp;nbsp;with all generated thumbnails by Nautilus. There is only one problem: if you delete files with thumbnails without using Nautilus (eg. command line) the thumbnails are not deleted. Recent Gnome versions limit the total size and maximal age of thumbnails in the cache, but this is not enough for&amp;nbsp;perfectionists&amp;nbsp;like you and me.&lt;br /&gt;&lt;br /&gt;So here it is, simple, fast and sexy, as always.&lt;br /&gt;&lt;br /&gt;Yes I know, there are already a few scripts doing the same thing, but mine is just better OK ?&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&lt;a href="https://github.com/kassoulet/thumbnail-cleaner"&gt;https://github.com/kassoulet/thumbnail-cleaner&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1353239644941812755-6589381505210781975?l=kassoulet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kassoulet.blogspot.com/feeds/6589381505210781975/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1353239644941812755&amp;postID=6589381505210781975' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1353239644941812755/posts/default/6589381505210781975'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1353239644941812755/posts/default/6589381505210781975'/><link rel='alternate' type='text/html' href='http://kassoulet.blogspot.com/2011/02/gnome-thumbnail-cleaner.html' title='Gnome Thumbnail Cleaner'/><author><name>Gautier Portet</name><uri>http://www.blogger.com/profile/03671907054385598852</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_zh-tyncWHcQ/STlKajD5q2I/AAAAAAAAAlA/Nosshyn5y0c/S220/q625926376_80.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-QDZ_U7z42sE/TVPY4MShoFI/AAAAAAAABaA/QxyWul0ERoc/s72-c/thumbnail-scanner-screenshot.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1353239644941812755.post-2016166167185375469</id><published>2010-09-09T23:10:00.001+02:00</published><updated>2010-09-10T00:09:50.833+02:00</updated><title type='text'>Jankis Duplicate Finder</title><content type='html'>Jankis is a GTK graphical program to find and delete duplicate files.&lt;br /&gt;It's very fast and designed to be powerful yet easy to use.&lt;br /&gt;&lt;br /&gt;Grab it now: &lt;a href="http://github.com/kassoulet/jankis"&gt;http://github.com/kassoulet/jankis&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;img border="0" height="552" src="http://1.bp.blogspot.com/_zh-tyncWHcQ/TIlLKVCEZHI/AAAAAAAABV0/XaWxd9EEz1M/s1600/Screenshot-Jankis+Duplicate+Finder-1.png" width="532" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;img border="0" height="552" src="http://4.bp.blogspot.com/_zh-tyncWHcQ/TIlLNZTvnrI/AAAAAAAABWE/UYdrH6tTeao/s1600/Screenshot-Jankis+Duplicate+Finder-3.png" width="532" /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1353239644941812755-2016166167185375469?l=kassoulet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kassoulet.blogspot.com/feeds/2016166167185375469/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1353239644941812755&amp;postID=2016166167185375469' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1353239644941812755/posts/default/2016166167185375469'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1353239644941812755/posts/default/2016166167185375469'/><link rel='alternate' type='text/html' href='http://kassoulet.blogspot.com/2010/09/jankis-duplicate-finder.html' title='Jankis Duplicate Finder'/><author><name>Gautier Portet</name><uri>http://www.blogger.com/profile/03671907054385598852</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_zh-tyncWHcQ/STlKajD5q2I/AAAAAAAAAlA/Nosshyn5y0c/S220/q625926376_80.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_zh-tyncWHcQ/TIlLKVCEZHI/AAAAAAAABV0/XaWxd9EEz1M/s72-c/Screenshot-Jankis+Duplicate+Finder-1.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1353239644941812755.post-3397371152985580512</id><published>2010-06-02T16:30:00.001+02:00</published><updated>2010-07-28T16:25:18.519+02:00</updated><title type='text'>Meego 1.0 on the Samsung N150 netbook</title><content type='html'>It works.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1353239644941812755-3397371152985580512?l=kassoulet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kassoulet.blogspot.com/feeds/3397371152985580512/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1353239644941812755&amp;postID=3397371152985580512' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1353239644941812755/posts/default/3397371152985580512'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1353239644941812755/posts/default/3397371152985580512'/><link rel='alternate' type='text/html' href='http://kassoulet.blogspot.com/2010/06/meego-10-on-samsung-n150-netbook.html' title='Meego 1.0 on the Samsung N150 netbook'/><author><name>Gautier Portet</name><uri>http://www.blogger.com/profile/03671907054385598852</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_zh-tyncWHcQ/STlKajD5q2I/AAAAAAAAAlA/Nosshyn5y0c/S220/q625926376_80.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1353239644941812755.post-4469654345065612613</id><published>2010-05-20T00:38:00.006+02:00</published><updated>2010-05-20T01:11:11.226+02:00</updated><title type='text'>SoundConverter 1.5.0</title><content type='html'>Haaaa. Finally a few days of full time work on SoundConverter, so I can launch the 1.5.0 version.&lt;br /&gt;We now have a fully asynchronous core. The old task manager was polling, a reminisent of good old gstreamer 0.8 era, causing tasks faster than 10ms to wait. And the results are awesome, just take a look at my little benchmark bellow:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_zh-tyncWHcQ/S_RjLGIQE-I/AAAAAAAABPs/oZzrztKCswI/s1600/soundconverter-1.5.0.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="160" src="http://3.bp.blogspot.com/_zh-tyncWHcQ/S_RjLGIQE-I/AAAAAAAABPs/oZzrztKCswI/s400/soundconverter-1.5.0.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;And that's only numbers. Try it to see the difference. As a bonus, multithreading is also much faster with the new version. And don't ask for the 1.4.4 results with 16GB of sound files, the test wasn't able to finish without crashing.&lt;br /&gt;&lt;br /&gt;While investigating on a crash with a friendly user, I remarked the huge amount of memory used by SoundConverter. And just to load tags! I never used it with lots of files at the same time, but this had to be fixed. I tracked down every byte allocated to remove all the unnecessary ones. To my surprise, I was storing &lt;i&gt;all&lt;/i&gt; tags passed by gstreamer (even embedded pictures), when we only use a few ones to build filenames, that alone saved a ton of memory. Anyway there it is. Using 3x less memory and 6x faster to load files. Happy converting!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1353239644941812755-4469654345065612613?l=kassoulet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kassoulet.blogspot.com/feeds/4469654345065612613/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1353239644941812755&amp;postID=4469654345065612613' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1353239644941812755/posts/default/4469654345065612613'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1353239644941812755/posts/default/4469654345065612613'/><link rel='alternate' type='text/html' href='http://kassoulet.blogspot.com/2010/05/soundconverter-150.html' title='SoundConverter 1.5.0'/><author><name>Gautier Portet</name><uri>http://www.blogger.com/profile/03671907054385598852</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_zh-tyncWHcQ/STlKajD5q2I/AAAAAAAAAlA/Nosshyn5y0c/S220/q625926376_80.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_zh-tyncWHcQ/S_RjLGIQE-I/AAAAAAAABPs/oZzrztKCswI/s72-c/soundconverter-1.5.0.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1353239644941812755.post-2988359669505444979</id><published>2010-05-12T10:57:00.001+02:00</published><updated>2010-05-12T11:00:18.191+02:00</updated><title type='text'>Pygtk leaks memory when using signals</title><content type='html'>Be careful when using connect(): gobject will keep a reference to the callback,&amp;nbsp; preventing your object to be destroyed. You must call disconnect() to be sure the memory is freed.&lt;br /&gt;It doesn't matter when you have only a few objects, but when you are creating thousands of objects...&lt;br /&gt;&lt;br /&gt;@see: &lt;a href="http://stackoverflow.com/questions/1364923/how-to-connect-to-a-gobject-signal-in-python-without-it-keeping-a-reference-to-t"&gt;http://stackoverflow.com/questions/1364923/how-to-connect-to-a-gobject-signal-in-python-without-it-keeping-a-reference-to-t&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1353239644941812755-2988359669505444979?l=kassoulet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kassoulet.blogspot.com/feeds/2988359669505444979/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1353239644941812755&amp;postID=2988359669505444979' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1353239644941812755/posts/default/2988359669505444979'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1353239644941812755/posts/default/2988359669505444979'/><link rel='alternate' type='text/html' href='http://kassoulet.blogspot.com/2010/05/pygtk-leaks-memory-when-using-signals.html' title='Pygtk leaks memory when using signals'/><author><name>Gautier Portet</name><uri>http://www.blogger.com/profile/03671907054385598852</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_zh-tyncWHcQ/STlKajD5q2I/AAAAAAAAAlA/Nosshyn5y0c/S220/q625926376_80.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1353239644941812755.post-6320705707136349011</id><published>2009-05-20T23:01:00.004+02:00</published><updated>2009-05-20T23:40:54.143+02:00</updated><title type='text'>How to uninstall a python program, packaged with distutils (setup.py)</title><content type='html'>So you have installed a program by running something like &lt;code&gt;sudo setup.py install&lt;/code&gt; and want to remove it, without forgetting a file or mess with the system ?&lt;br /&gt;It's simple in fact. Install checkinstall. And run &lt;code&gt;sudo checkinstall python setup.py install&lt;/code&gt; to create a package for your system, and remove it with &lt;code&gt;dpkg -r NAME_OF_PACKAGE&lt;/code&gt;.&lt;br /&gt;Checkinstall is an handy tool, it replays the install procedure while inspecting what is being done, and creates a package doing the same thing. With uninstall.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1353239644941812755-6320705707136349011?l=kassoulet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kassoulet.blogspot.com/feeds/6320705707136349011/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1353239644941812755&amp;postID=6320705707136349011' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1353239644941812755/posts/default/6320705707136349011'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1353239644941812755/posts/default/6320705707136349011'/><link rel='alternate' type='text/html' href='http://kassoulet.blogspot.com/2009/05/how-to-uninstall-python-program.html' title='How to uninstall a python program, packaged with distutils (setup.py)'/><author><name>Gautier Portet</name><uri>http://www.blogger.com/profile/03671907054385598852</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_zh-tyncWHcQ/STlKajD5q2I/AAAAAAAAAlA/Nosshyn5y0c/S220/q625926376_80.jpg'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1353239644941812755.post-3877606066202008060</id><published>2009-04-10T20:40:00.004+02:00</published><updated>2009-04-10T21:39:42.968+02:00</updated><title type='text'>Luc Besson contre la Joconde</title><content type='html'>"&lt;span class="texte2"&gt;&lt;span class="texte2"&gt;&lt;i&gt;On ne vole pas les tableaux au Louvre il me semble !&lt;/i&gt;&lt;/span&gt;&lt;/span&gt;" -- Luc Besson&lt;br /&gt;&lt;br /&gt;Non, on n'a pas le droit de voler la Joconde...&lt;br /&gt;Mais on a le droit d'en avoir une photo.&lt;br /&gt;On a le droit de faire une copie de la photo.&lt;br /&gt;Et le droit de faire une copie de la copie de la photo.&lt;br /&gt;Et la Joconde est toujours en place, épatant non ?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1353239644941812755-3877606066202008060?l=kassoulet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kassoulet.blogspot.com/feeds/3877606066202008060/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1353239644941812755&amp;postID=3877606066202008060' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1353239644941812755/posts/default/3877606066202008060'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1353239644941812755/posts/default/3877606066202008060'/><link rel='alternate' type='text/html' href='http://kassoulet.blogspot.com/2009/04/luc-besson-contre-la-joconde.html' title='Luc Besson contre la Joconde'/><author><name>Gautier Portet</name><uri>http://www.blogger.com/profile/03671907054385598852</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_zh-tyncWHcQ/STlKajD5q2I/AAAAAAAAAlA/Nosshyn5y0c/S220/q625926376_80.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1353239644941812755.post-3933758249418793444</id><published>2009-03-01T22:07:00.002+01:00</published><updated>2009-03-01T22:11:22.364+01:00</updated><title type='text'>Nautilus-folder-actions</title><content type='html'>You want to add buttons in the Nautilus toolbar, all read from a custom file in the current view ?&lt;br /&gt;You want to add a button to launch "git gui" from your code folder ?&lt;br /&gt;So &lt;a href="http://github.com/kassoulet/nautilus-folder-actions"&gt;nautilus-folder-action&lt;/a&gt; is for you !&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1353239644941812755-3933758249418793444?l=kassoulet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kassoulet.blogspot.com/feeds/3933758249418793444/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1353239644941812755&amp;postID=3933758249418793444' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1353239644941812755/posts/default/3933758249418793444'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1353239644941812755/posts/default/3933758249418793444'/><link rel='alternate' type='text/html' href='http://kassoulet.blogspot.com/2009/03/nautilus-folder-actions.html' title='Nautilus-folder-actions'/><author><name>Gautier Portet</name><uri>http://www.blogger.com/profile/03671907054385598852</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_zh-tyncWHcQ/STlKajD5q2I/AAAAAAAAAlA/Nosshyn5y0c/S220/q625926376_80.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1353239644941812755.post-3309081433143337720</id><published>2008-06-26T21:41:00.007+02:00</published><updated>2010-09-08T22:43:53.603+02:00</updated><title type='text'>Auto Vectorize Decorator</title><content type='html'>&lt;pre class="brush:python"&gt;def vectorize(f):&lt;br /&gt;"""&lt;br /&gt;Allows a traditionnal python function to be called with&lt;br /&gt;iterables arguments.&lt;br /&gt;&lt;br /&gt;So when you call func([array]) it will do the iteration for you,&lt;br /&gt;call func() for each element in array, and return an array.&lt;br /&gt;&lt;br /&gt;All arguments must be iterable, if you want to pass something else,&lt;br /&gt;use a keyword argument.&lt;br /&gt;&lt;br /&gt;"""&lt;br /&gt;def _vectorize(*args, **kwargs):&lt;br /&gt;    if not isiterable(args[0]):&lt;br /&gt;        return f(*args, **kwargs)&lt;br /&gt;    else:&lt;br /&gt;        return [f(*arg, **kwargs) for arg in zip(*args)]&lt;br /&gt;    return _vectorize&lt;br /&gt;&lt;br /&gt;# to use it:&lt;br /&gt;&lt;br /&gt;@vectorize&lt;br /&gt;def my_func(arguments):&lt;br /&gt;# do something interesting, on ONE element.&lt;br /&gt;&lt;br /&gt;my_func(my_args)&lt;br /&gt;my_func(my_super_list_of_many_values)&lt;br /&gt;&lt;br /&gt;&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/1353239644941812755-3309081433143337720?l=kassoulet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kassoulet.blogspot.com/feeds/3309081433143337720/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1353239644941812755&amp;postID=3309081433143337720' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1353239644941812755/posts/default/3309081433143337720'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1353239644941812755/posts/default/3309081433143337720'/><link rel='alternate' type='text/html' href='http://kassoulet.blogspot.com/2008/06/def-vectorizef-allows-traditionnal.html' title='Auto Vectorize Decorator'/><author><name>Gautier Portet</name><uri>http://www.blogger.com/profile/03671907054385598852</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_zh-tyncWHcQ/STlKajD5q2I/AAAAAAAAAlA/Nosshyn5y0c/S220/q625926376_80.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1353239644941812755.post-8599649486524180946</id><published>2008-03-18T16:53:00.005+01:00</published><updated>2010-09-08T22:46:12.205+02:00</updated><title type='text'>Get a hash of a given module in python</title><content type='html'>This small function use the inspect and sha modules to return you a hash of the given module/class/function.&lt;br /&gt;Note that we only hash the bytecode, so only really modified &lt;span style="font-style: italic;"&gt;code&lt;/span&gt; will change the resulting hash.&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush:python"&gt;import inspect&lt;br /&gt;&lt;br /&gt;def get_module_hash(root, obj=None, hash=None, verbose=False):&lt;br /&gt;if not obj:&lt;br /&gt;obj = root&lt;br /&gt;if verbose:&lt;br /&gt;print obj.__name__&lt;br /&gt;if not hash:&lt;br /&gt;import sha&lt;br /&gt;hash = sha.new()&lt;br /&gt;&lt;br /&gt;for member in inspect.getmembers(obj):&lt;br /&gt;name, child = member&lt;br /&gt;&lt;br /&gt;if inspect.ismodule(child):&lt;br /&gt;if child.__name__.startswith(root.__name__):&lt;br /&gt;if child != root:&lt;br /&gt;if verbose:&lt;br /&gt;print child.__name__&lt;br /&gt;hash = get_module_hash(root, child, hash, verbose)&lt;br /&gt;&lt;br /&gt;if inspect.isclass(child):&lt;br /&gt;if child.__module__.startswith(root.__name__):&lt;br /&gt;if verbose:&lt;br /&gt;print '  ', child.__name__&lt;br /&gt;hash = get_module_hash(root, child, hash, verbose)&lt;br /&gt;&lt;br /&gt;if inspect.ismethod(child):&lt;br /&gt;if verbose:&lt;br /&gt;print '    ', child.__name__&lt;br /&gt;hash.update(child.im_func.func_code.co_code)&lt;br /&gt;&lt;br /&gt;if inspect.isfunction(child):&lt;br /&gt;if root.__name__ in child.func_code.co_filename:&lt;br /&gt;if verbose:&lt;br /&gt;print '  ', child.__name__&lt;br /&gt;hash.update(child.func_code.co_code)&lt;br /&gt;return hash&lt;br /&gt;&lt;br /&gt;hash = get_module_hash(yourmodule)&lt;br /&gt;print 'version hash:', hash.hexdigest()&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/1353239644941812755-8599649486524180946?l=kassoulet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kassoulet.blogspot.com/feeds/8599649486524180946/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1353239644941812755&amp;postID=8599649486524180946' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1353239644941812755/posts/default/8599649486524180946'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1353239644941812755/posts/default/8599649486524180946'/><link rel='alternate' type='text/html' href='http://kassoulet.blogspot.com/2008/03/get-hash-of-given-module-in-python.html' title='Get a hash of a given module in python'/><author><name>Gautier Portet</name><uri>http://www.blogger.com/profile/03671907054385598852</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_zh-tyncWHcQ/STlKajD5q2I/AAAAAAAAAlA/Nosshyn5y0c/S220/q625926376_80.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1353239644941812755.post-3551512555028106576</id><published>2008-02-12T22:55:00.002+01:00</published><updated>2008-05-03T18:26:27.048+02:00</updated><title type='text'>Dose2 - Now in fullscreen splendor</title><content type='html'>I love the Dose2 [1] demo by mfx, but I always wanted it to run in a better resolution, as it is fully vectorial. So here it is, finally you can run it in 1600x1200 if you dare!&lt;br /&gt;&lt;br /&gt;Download the sources [2], compile and run!&lt;br /&gt;&lt;br /&gt;You can try the following command line options:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;-fullscreen : obviously, switch to fullscreen.&lt;/li&gt;&lt;li&gt;-stretch : use the current resolution.&lt;/li&gt;&lt;li&gt;-nofill : do not apply the magic xor - some kind of wireframe, search fillcopy() in main.c to see some f*cking clever code.&lt;/li&gt;&lt;li&gt;-WIDTHxHEIGHT : choose resolution. WIDTH and HEIGHT can be any size.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;[1] &lt;a href="http://pouet.net/prod.php?which=3289"&gt;http://pouet.net/prod.php?which=3289&lt;/a&gt;&lt;br /&gt;[2] &lt;a href="http://kassoulet.free.fr/files/dose2_2008-05-03.tar.gz"&gt;http://kassoulet.free.fr/files/dose2_2008-05-03.tar.gz&lt;/a&gt; (new, 2x faster version!)&lt;br /&gt;&lt;br /&gt;Ed: Now also on &lt;a href="http://github.com/kassoulet/dose2/tree/master"&gt;github&lt;/a&gt;.&lt;br /&gt;Ed2: Backbuffer was blitted two times, new version is 2x faster in big resolutions!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1353239644941812755-3551512555028106576?l=kassoulet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kassoulet.blogspot.com/feeds/3551512555028106576/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1353239644941812755&amp;postID=3551512555028106576' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1353239644941812755/posts/default/3551512555028106576'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1353239644941812755/posts/default/3551512555028106576'/><link rel='alternate' type='text/html' href='http://kassoulet.blogspot.com/2008/02/dose2-now-in-fullscreen-splendor.html' title='Dose2 - Now in fullscreen splendor'/><author><name>Gautier Portet</name><uri>http://www.blogger.com/profile/03671907054385598852</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_zh-tyncWHcQ/STlKajD5q2I/AAAAAAAAAlA/Nosshyn5y0c/S220/q625926376_80.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1353239644941812755.post-1266419014736128454</id><published>2008-01-23T11:43:00.000+01:00</published><updated>2008-01-23T11:55:49.804+01:00</updated><title type='text'>Splitting a mp3 album (mp3+cue) in separate files without recoding</title><content type='html'>So you have &lt;a href="http://www.demovibes.org"&gt;demovibes&lt;/a&gt; and you would like to have it with separate tracks so you can skip one?&lt;br /&gt;&lt;br /&gt;This is really simple, here is the magic command: &lt;span style="font-style: italic;"&gt;(in one line)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;mp3splt -c demovibes3.cue demovibes3-80mn_scene_music_compilation_mixed_by_willbe.mp3 -d demovibes3 -o @n-@p-@t&lt;span style="display: block;" id="formatbar_Buttons"&gt;&lt;span class="down" style="display: block;" id="formatbar_CreateLink" title="Associer" onmouseover="ButtonHoverOn(this);" onmouseout="ButtonHoverOff(this);" onmouseup="" onmousedown="CheckFormatting(event);FormatbarButton('richeditorframe', this, 8);ButtonMouseDown(this);"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;br /&gt;You will need the nice &lt;a href="http://mp3splt.sourceforge.net"&gt;mp3splt&lt;/a&gt; of course, and it works also for ogg vorbis!&lt;br /&gt;If you want tags, you can extract them from filenames, with &lt;a href="http://easytag.sourceforge.net"&gt;easytag&lt;/a&gt; for example.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1353239644941812755-1266419014736128454?l=kassoulet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kassoulet.blogspot.com/feeds/1266419014736128454/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1353239644941812755&amp;postID=1266419014736128454' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1353239644941812755/posts/default/1266419014736128454'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1353239644941812755/posts/default/1266419014736128454'/><link rel='alternate' type='text/html' href='http://kassoulet.blogspot.com/2008/01/splitting-mp3-album-mp3cue-in-separate.html' title='Splitting a mp3 album (mp3+cue) in separate files without recoding'/><author><name>Gautier Portet</name><uri>http://www.blogger.com/profile/03671907054385598852</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_zh-tyncWHcQ/STlKajD5q2I/AAAAAAAAAlA/Nosshyn5y0c/S220/q625926376_80.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1353239644941812755.post-368908017119662271</id><published>2007-12-05T11:37:00.001+01:00</published><updated>2009-03-05T23:53:15.661+01:00</updated><title type='text'>How to clear disk cache in Linux</title><content type='html'>&lt;pre&gt;&lt;br /&gt;sync ; sudo echo 3 | sudo tee /proc/sys/vm/drop_caches&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;small&gt;&lt;em&gt;edit: better safe than sorry: flush caches before, as suggested...&lt;/em&gt;&lt;/small&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1353239644941812755-368908017119662271?l=kassoulet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kassoulet.blogspot.com/feeds/368908017119662271/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1353239644941812755&amp;postID=368908017119662271' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1353239644941812755/posts/default/368908017119662271'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1353239644941812755/posts/default/368908017119662271'/><link rel='alternate' type='text/html' href='http://kassoulet.blogspot.com/2007/12/how-to-clear-disk-cache-in-linux.html' title='How to clear disk cache in Linux'/><author><name>Gautier Portet</name><uri>http://www.blogger.com/profile/03671907054385598852</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_zh-tyncWHcQ/STlKajD5q2I/AAAAAAAAAlA/Nosshyn5y0c/S220/q625926376_80.jpg'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1353239644941812755.post-7173230351393889575</id><published>2007-07-30T15:23:00.001+02:00</published><updated>2008-08-07T00:12:40.230+02:00</updated><title type='text'>Vice Dual Sid patch</title><content type='html'>&lt;a href="http://kassoulet.free.fr/misc/vice-1.21_kassoulet.patch.gz"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;Here&lt;/span&gt;&lt;/a&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;is&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_2"&gt;my&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_3"&gt;crappy&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_4"&gt;patch&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_5"&gt;to&lt;/span&gt; &lt;a href="http://www.viceteam.org/"&gt;Vice&lt;/a&gt; 1.21 &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_6"&gt;to&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_7"&gt;add&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_8"&gt;my&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_9"&gt;special&lt;/span&gt; 6581 + 8580 &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_10"&gt;stereo&lt;/span&gt; &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_11"&gt;output&lt;/span&gt;. &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_12"&gt;You&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_13"&gt;can&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_14"&gt;listen&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_15"&gt;to&lt;/span&gt; &lt;a href="http://kassoulet.free.fr/?/blog/16-C64-Soundtracks"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_16"&gt;some&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_17"&gt;examples&lt;/span&gt;&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_18"&gt;After&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_19"&gt;applying&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_20"&gt;the&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_21"&gt;patch&lt;/span&gt;, &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_22"&gt;you&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_23"&gt;will&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_24"&gt;just&lt;/span&gt; have &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_25"&gt;to&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_26"&gt;select&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_27"&gt;the&lt;/span&gt; dual &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_28"&gt;sid&lt;/span&gt; option (note &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_29"&gt;that&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_30"&gt;this&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_31"&gt;will&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_32"&gt;also disable&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_33"&gt;the&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_34"&gt;previous&lt;/span&gt; dual &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_35"&gt;sid&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_36"&gt;functionality&lt;/span&gt;). &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_37"&gt;You&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_38"&gt;will&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_39"&gt;now&lt;/span&gt; have &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_40"&gt;both&lt;/span&gt; 6581 and 8580 in &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_41"&gt;separate channels&lt;/span&gt;, in &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_42"&gt;real time&lt;/span&gt; and record mode. &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_43"&gt;Enjoy&lt;/span&gt;!&lt;br /&gt;&lt;br /&gt;edit: &lt;a href="http://kassoulet.free.fr/misc/vice-2.0_dual-sid-stereo-by-kassoulet.patch.gz"&gt;updated patch for Vice 2.0&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1353239644941812755-7173230351393889575?l=kassoulet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kassoulet.blogspot.com/feeds/7173230351393889575/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1353239644941812755&amp;postID=7173230351393889575' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1353239644941812755/posts/default/7173230351393889575'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1353239644941812755/posts/default/7173230351393889575'/><link rel='alternate' type='text/html' href='http://kassoulet.blogspot.com/2007/07/vice-dual-sid-patch.html' title='Vice Dual Sid patch'/><author><name>Gautier Portet</name><uri>http://www.blogger.com/profile/03671907054385598852</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_zh-tyncWHcQ/STlKajD5q2I/AAAAAAAAAlA/Nosshyn5y0c/S220/q625926376_80.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1353239644941812755.post-693990049900199162</id><published>2007-07-09T16:43:00.000+02:00</published><updated>2007-07-09T17:01:34.101+02:00</updated><title type='text'>Knights demos on youtube.</title><content type='html'>Yeah I encoded styler2 and schtroumpf2 and uploaded them on &lt;a href="http://www.youtube.com/user/kass0ulet"&gt;youtube&lt;/a&gt;.&lt;br /&gt;The quality is rather bad, I will upload high quality videos somewhere else soon.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1353239644941812755-693990049900199162?l=kassoulet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kassoulet.blogspot.com/feeds/693990049900199162/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1353239644941812755&amp;postID=693990049900199162' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1353239644941812755/posts/default/693990049900199162'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1353239644941812755/posts/default/693990049900199162'/><link rel='alternate' type='text/html' href='http://kassoulet.blogspot.com/2007/07/knights-demos-on-youtube.html' title='Knights demos on youtube.'/><author><name>Gautier Portet</name><uri>http://www.blogger.com/profile/03671907054385598852</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_zh-tyncWHcQ/STlKajD5q2I/AAAAAAAAAlA/Nosshyn5y0c/S220/q625926376_80.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1353239644941812755.post-8831439552601055319</id><published>2007-05-31T01:50:00.000+02:00</published><updated>2007-05-31T01:54:58.154+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='python gtk pygtk'/><title type='text'>Faster ListStore</title><content type='html'>Your are wondering why ListStore.append() is so slow in your code?&lt;br /&gt;No more turtle-soft: disconnect the view and the store by doing TreeView.set_model(None), edit the ListStore, and then reconnect them.&lt;br /&gt;&lt;br /&gt;Tadaaa, this is just &lt;span style="font-style: italic;"&gt;thousands&lt;/span&gt; of time faster here...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1353239644941812755-8831439552601055319?l=kassoulet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kassoulet.blogspot.com/feeds/8831439552601055319/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1353239644941812755&amp;postID=8831439552601055319' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1353239644941812755/posts/default/8831439552601055319'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1353239644941812755/posts/default/8831439552601055319'/><link rel='alternate' type='text/html' href='http://kassoulet.blogspot.com/2007/05/faster-liststore.html' title='Faster ListStore'/><author><name>Gautier Portet</name><uri>http://www.blogger.com/profile/03671907054385598852</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_zh-tyncWHcQ/STlKajD5q2I/AAAAAAAAAlA/Nosshyn5y0c/S220/q625926376_80.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1353239644941812755.post-5895273317740173924</id><published>2007-05-11T18:39:00.000+02:00</published><updated>2007-05-11T19:15:10.395+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='dbus glib code'/><title type='text'>Returning a array of structs with dbus-glib</title><content type='html'>I was looking for an example on how to return an array of struct in a D-Bus program, and I found nothing. So here is a fast note for later reference.&lt;br /&gt;&lt;br /&gt;This is pseudo code, just to show you how to proceed.&lt;br /&gt;&lt;br /&gt;So you want to return a "a(si)", that's it, an array of struct containing each a string and an integer. &lt;br /&gt;&lt;br /&gt;in your example.xml: (process with dbus-binding-tool as usual)&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&amp;lt;node name="/com/example/Example"&amp;gt;&amp;lt;/node&amp;gt;&lt;br /&gt;    &amp;lt;interface name="com.example.Example"&amp;gt;&amp;lt;/interface&amp;gt;&lt;br /&gt;        &amp;lt;method name="getExampleArray"&amp;gt;&amp;lt;/method&amp;gt;&lt;br /&gt;            &amp;lt;arg &lt;strong&gt;type="a(si)"&lt;/strong&gt; name="array" direction="out"&amp;gt;&amp;lt;/arg&amp;gt;&lt;br /&gt;  &amp;lt;/method&amp;gt;&lt;br /&gt; &amp;lt;/interface&amp;gt;&lt;br /&gt;&amp;lt;/node&amp;gt;  &lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;in your example.c:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;em&gt;// you define your structure here by using get_struct &lt;/em&gt;&lt;br /&gt;#define DBUS_STRUCT_STRING_INT (dbus_g_type_get_struct ("GValueArray", G_TYPE_STRING, G_TYPE_INT, G_TYPE_INVALID))&lt;br /&gt;&lt;br /&gt;gboolean desktoptracks_get_example_array(DesktopTracks *obj, GPtrArray **stats_data, GError **error)&lt;br /&gt;{&lt;br /&gt;  &lt;em&gt;for ( each element you want to return )&lt;/em&gt;&lt;br /&gt;  {&lt;br /&gt;      &lt;em&gt;element_string , element_int = the element you want to return&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;      GValue *value;&lt;br /&gt;&lt;br /&gt;      value = g_new0 (GValue, 1);&lt;br /&gt;      g_value_init (value, DBUS_STRUCT_STRING_INT);&lt;br /&gt;      g_value_take_boxed (value, dbus_g_type_specialized_construct (DBUS_STRUCT_STRING_INT));&lt;br /&gt;&lt;br /&gt;      &lt;em&gt;// field number, value, G_MAXUINT at the end&lt;/em&gt;&lt;br /&gt;      dbus_g_type_struct_set (value, 0, element_string, 1, element_int, G_MAXUINT);&lt;br /&gt;      g_ptr_array_add (array, g_value_get_boxed (value));&lt;br /&gt;      g_free (value);&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Easy uh ?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1353239644941812755-5895273317740173924?l=kassoulet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kassoulet.blogspot.com/feeds/5895273317740173924/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1353239644941812755&amp;postID=5895273317740173924' title='8 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1353239644941812755/posts/default/5895273317740173924'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1353239644941812755/posts/default/5895273317740173924'/><link rel='alternate' type='text/html' href='http://kassoulet.blogspot.com/2007/05/returning-complex-array-with-dbus-glib.html' title='Returning a array of structs with dbus-glib'/><author><name>Gautier Portet</name><uri>http://www.blogger.com/profile/03671907054385598852</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_zh-tyncWHcQ/STlKajD5q2I/AAAAAAAAAlA/Nosshyn5y0c/S220/q625926376_80.jpg'/></author><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1353239644941812755.post-4844535577809517244</id><published>2007-04-28T16:20:00.000+02:00</published><updated>2007-04-28T19:39:05.430+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='python gstreamer soundconverter'/><title type='text'>SoundConverter 0.9.6</title><content type='html'>I've just uploaded a version, which fixes a stupid problem in one Makefile.am (No, there is no need for DESTDIR there :) ).&lt;br /&gt;&lt;br /&gt;Previous 0.9.5 version mainly fixed a problem with spaces in filenames when encoding to the same folder (Hell must be filled by escaped characters).&lt;br /&gt;&lt;br /&gt;And website look was updated as well!&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://soundconverter.berlios.de"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; cursor: pointer;" src="http://1.bp.blogspot.com/_zh-tyncWHcQ/RjNik4g4vwI/AAAAAAAAAAs/f8RdDTcPzys/s320/soundconverter.png" alt="" id="BLOGGER_PHOTO_ID_5058495192252333826" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I think we are pretty close of a 1.0, we need more test, more polish and more love and we are done. And after 1.0 we will add some new features.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1353239644941812755-4844535577809517244?l=kassoulet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kassoulet.blogspot.com/feeds/4844535577809517244/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1353239644941812755&amp;postID=4844535577809517244' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1353239644941812755/posts/default/4844535577809517244'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1353239644941812755/posts/default/4844535577809517244'/><link rel='alternate' type='text/html' href='http://kassoulet.blogspot.com/2007/04/soundconverter-096.html' title='SoundConverter 0.9.6'/><author><name>Gautier Portet</name><uri>http://www.blogger.com/profile/03671907054385598852</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_zh-tyncWHcQ/STlKajD5q2I/AAAAAAAAAlA/Nosshyn5y0c/S220/q625926376_80.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_zh-tyncWHcQ/RjNik4g4vwI/AAAAAAAAAAs/f8RdDTcPzys/s72-c/soundconverter.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1353239644941812755.post-3964647038000772695</id><published>2006-12-14T11:44:00.000+01:00</published><updated>2006-12-14T17:03:17.265+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='gtk'/><category scheme='http://www.blogger.com/atom/ns#' term='gxiso'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='pygtk'/><title type='text'>gXiso website updated</title><content type='html'>I just updated the &lt;a href="http://gxiso.berlios.de/"&gt;gXiso website.&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_zh-tyncWHcQ/RYEs9ZX19EI/AAAAAAAAAAM/gej_Vol1al4/s1600-h/gxiso_new_website.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; cursor: pointer;" src="http://2.bp.blogspot.com/_zh-tyncWHcQ/RYEs9ZX19EI/AAAAAAAAAAM/gej_Vol1al4/s400/gxiso_new_website.png" alt="" id="BLOGGER_PHOTO_ID_5008333693907235906" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;I will maybe do some enhancements to this nice program soon, including a port to MacOSX.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1353239644941812755-3964647038000772695?l=kassoulet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kassoulet.blogspot.com/feeds/3964647038000772695/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1353239644941812755&amp;postID=3964647038000772695' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1353239644941812755/posts/default/3964647038000772695'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1353239644941812755/posts/default/3964647038000772695'/><link rel='alternate' type='text/html' href='http://kassoulet.blogspot.com/2006/12/gxiso-website-updated.html' title='gXiso website updated'/><author><name>Gautier Portet</name><uri>http://www.blogger.com/profile/03671907054385598852</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_zh-tyncWHcQ/STlKajD5q2I/AAAAAAAAAlA/Nosshyn5y0c/S220/q625926376_80.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_zh-tyncWHcQ/RYEs9ZX19EI/AAAAAAAAAAM/gej_Vol1al4/s72-c/gxiso_new_website.png' height='72' width='72'/><thr:total>2</thr:total></entry></feed>
