tag:blogger.com,1999:blog-56621486293469755592023-11-16T11:55:34.577+01:00~mhr3mhr3http://www.blogger.com/profile/05059602092762087621noreply@blogger.comBlogger32125tag:blogger.com,1999:blog-5662148629346975559.post-26165925445293092652013-06-02T20:03:00.000+02:002013-06-02T20:03:35.388+02:00OpenCL on Ubuntu 13.04Unfortunately two years after my post about getting Intel's OpenCL to work on Ubuntu, the out-of-box situation for using OpenCL isn't much better - you can install the OpenCL library/headers/package config files with a nice and quick `<span style="font-size: x-small;"><span style="font-family: "Courier New",Courier,monospace;">apt-get install ocl-icd-opencl-dev</span></span>`, but doing that will probably just get you to CL_PLATFORM_NOT_FOUND_KHR (-1001) error from clGetPlatformIDs. That's because you do have the dispatcher, but no actual OpenCL drivers. Therefore I decided to play with the three major OpenCL implementations (Intel, AMD, NVidia).<br />
<br />
The reason why one can do the simple apt-get install is a free software project called <a href="https://forge.imag.fr/projects/ocl-icd/">ocl-icd</a> - this provides libOpenCL.so and implements the dispatcher so that every icd-compatible OpenCL implementation can use it and therefore provides nice basis for using OpenCL, but to get to building and running CL kernels you need to have at least one driver, so let's look at them.<br />
<br />
<h3>
Intel's OpenCL</h3>
<br />
Intel recently released <a href="http://software.intel.com/en-us/vcsource/tools/opencl">Intel SDK for OpenCL Applications XE 2013</a> - but Ubuntu/Debain users are out of luck, you won't find an official .deb on Intel's web. Fortunately that is not a deal breaker and with a few commands you can turn the rpm into a deb package (and it is what I recommended in my <a href="http://mhr3.blogspot.co.uk/2011/05/opencl-on-ubuntu.html">old post</a>). But since we have ocl-icd these days, I'd go for a different approach this time - install just the bare minimum to have ocl-icd pick up the Intel driver (and add proper dependencies on ocl-icd-libopencl1 and libnuma1), so I created the debs manually this time.<br />
<br />
So, what I did was:<br />
<ol>
<li>Grab the tgz from Intel's web.</li>
<li>Extract it into a temporary location where you'll find license, readme file, a bunch of scripts and five rpms:</li>
<ul>
<li>opencl-1.2-base-[version] - contains the libOpenCL.so, which we don't need cause we have ocl-icd-libopencl1</li>
<li>opencl-1.2-devel-[version] - contains OpenCL headers, which also aren't needed, as those are in opencl-headers package which is a dependency of ocl-icd-opencl-dev</li>
<li>opencl-1.2-intel-cpu-[version] - bingo, the ICD</li>
<li>opencl-1.2-intel-devel-[version] - a few development tools - offline compiler and Qt-based KernelBuilder application</li>
<li>opencl-1.2-intel-mic-[version] - additional libraries to support also Xeon Phi coprocessor besides Core processors - I ignored this one, cause I don't have access to such processor.</li>
</ul>
<li>Now, lets make binary debian packages from the unzipped files (note that only the intel-cpu package is required to use OpenCL apps, the devel tools are optional), this is pretty easy, following a <a href="http://tldp.org/HOWTO/html_single/Debian-Binary-Package-Building-HOWTO/">simple debian package building HOWTO</a>, I put the files from the intel-cpu and intel-devel rpms into the following directory structure:<br /><blockquote class="tr_bq">
<span style="font-family: "Courier New",Courier,monospace;"> |-opencl-driver-intel-cpu<br /> | \-DEBIAN<br /> | \-etc<br /> | \-OpenCL<br /> | \-vendors<br /> | \-usr<br /> | \-lib<br /> | \-x86_64-linux-gnu<br /> | \-OpenCL<br /> | \-vendors<br /> | \-intel<br /> | \-share<br /> | \-doc<br /> | \-opencl-driver-intel-cpu<br /> |-opencl-driver-intel-tools<br /> | \-bin<br /> | \-DEBIAN<br /> | \-usr<br /> | \-lib<br /> | \-x86_64-linux-gnu<br /> | \-intel<br /> | \-opencl-1.2-3.0.67279<br /> | \-share<br /> | \-doc<br /> | \-opencl-driver-intel-tools</span></blockquote>
<br />The DEBIAN directories contain the control files:<br /><blockquote class="tr_bq">
<span style="font-family: "Courier New",Courier,monospace;"><span style="font-family: "Courier New",Courier,monospace;">$ opencl-driver-intel-cpu/DEBIAN/control:<br /></span>Package: opencl-driver-intel-cpu<br />Version: 3.0.67279-1<br />Section: libs<br />Priority: optional<br />Architecture: amd64<br />Depends: ocl-icd-libopencl1 (>= 2.0), libnuma1<br />Maintainer: Your Name <your_email><br />Description: Intel OpenCL CPU implementation<br /> This package provides Intel OpenCL implementation which can utilize Intel Core processors.<br /><br />$ opencl-driver-intel-tools/DEBIAN/control:<br /><br />Package: opencl-driver-intel-tools<br />Version: 3.0.67279-1<br />Section: libs<br />Priority: optional<br />Architecture: amd64<br />Depends: ocl-icd-libopencl1 (>= 2.0)<br />Maintainer: Your Name <your_email><br />Description: Intel SDK for OpenCL Applications development tools<br /> This package contains the following tools:<br /> - Intel SDK for OpenCL - Kernel Builder, which enables building and analyzing OpenCL kernels and provides full offline OpenCL language compilation.<br /> - Intel SDK for OpenCL - Offline Compiler, a command-line utility, which enables offline compilation and building of OpenCL kernels.</your_email></your_email></span></blockquote>
The leaf directory opencl-driver-intel-cpu/usr/lib/x86_64-linux-gnu/OpenCL/vendors/intel contains all the object files from the intel-cpu rpm, and opencl-driver-intel-tools/usr/lib/x86_64-linux-gnu/intel/opencl-1.2-3.0.67279/ contains the binaries from intel-devel rpm with tiny changes so the bash scripts point to a correct location.<br /><br />Once this is done, the only remaining file to tamper with is the actual .icd in opencl-driver-intel-cpu/etc/OpenCL/vendors/intel64.icd, which contains just one line with path to the library: <br /><span style="font-family: "Courier New",Courier,monospace;">/usr/lib/x86_64-linux-gnu/OpenCL/vendors/intel/libintelocl.so</span></li>
<li>Now just run `<span style="font-size: x-small;"><span style="font-family: "Courier New",Courier,monospace;">dpkg-deb --build opencl-driver-intel-cpu</span></span>` and `<span style="font-size: x-small;"><span style="font-family: "Courier New",Courier,monospace;">dpkg-deb --build opencl-driver-intel-tools</span></span>` and voila your debs with Intel's OpenCL are ready.</li>
</ol>
You can also download my <a href="http://ubuntuone.com/0TQe45evEJRLjXVTscEGtE">opencl-driver-intel-cpu.deb</a> and <a href="http://ubuntuone.com/42k6bKNMEvDUB3qlU72c5p">opencl-driver-intel-tools.deb</a>.<br />
<br />
Note that these are here just for reference, you should delete them after making sure that your package looks the same - ie I'm not redistributing these.<br />
<br />
Once installed, a simple OpenCL app that lists the available platforms should output something like this:<br />
<blockquote class="tr_bq">
<span style="font-size: x-small;"><span style="font-family: "Courier New",Courier,monospace;">PLATFORM_NAME: Intel(R) OpenCL<br /> VERSION: OpenCL 1.2 LINUX<br /> VENDOR: Intel(R) Corporation<br /> PROFILE: FULL_PROFILE<br /> DEVICE: Intel(R) Core(TM) i7-3632QM CPU @ 2.20GHz<br /> DEVICE VENDOR: Intel(R) Corporation<br /> MAX COMPUTE UNITS: 8<br /> DEVICE VERSION: OpenCL 1.2 (Build 67279)<br /> DRIVER VERSION: 1.2</span></span></blockquote>
<br />
<h3>
NVidia's OpenCL</h3>
<br />
In Ubuntu 13.04 there are now multiple nvidia packages which contain various versions of nvidia's driver, but I couldn't find anywhere a package with the icd file and therefore even if all the nvidia-3* packages do have the driver, the ICD loader isn't able to find it. Nonetheless, the fix for that is easy:<br />
<br />
Run `<span style="font-family: "Courier New",Courier,monospace;">locate libnvidia-opencl.so</span>`, this will probably find a few files, in my case these are found:<br />
<blockquote class="tr_bq">
<span style="font-size: x-small;"><span style="font-family: "Courier New",Courier,monospace;">/usr/lib/nvidia-304/libnvidia-opencl.so.304.88<br />/usr/lib/nvidia-current/libnvidia-opencl.so.1<br />/usr/lib32/nvidia-304/libnvidia-opencl.so.304.88<br />/usr/lib32/nvidia-current/libnvidia-opencl.so.1</span></span></blockquote>
For some reason though, the *.so.1 are broken symlinks in my case (maybe because I have Optimus laptop), therefore I created the .icd in the following manner:<br />
<br />
<span style="font-family: "Courier New",Courier,monospace;">echo /usr/lib/nvidia-304/libnvidia-opencl.so.304.88 > /etc/OpenCL/vendors/nvidia64.icd</span><br />
<br />
The problem with this is that if the driver gets updated, you'll have to modify the .icd again, so if your *.so.1 symlink is not broken, you should use that instead.<br />
<br />
Note that the driver also contains the OpenCL loader library (libOpenCL.so) and depending on your LD_LIBRARY_PATH settings, it might get used instead of the one provided by ocl-icd. That is not necessarily terrible, but keep in mind that NVidia's implementation is OpenCL 1.1, so even if other ICDs support 1.2, you'll be stuck with 1.1. Solution? Just remove the extra libOpenCL.so* from /usr/lib/nvidia-*/<br />
<br />
Once done, listing CL platforms and devices should also list NVidia:<br />
<blockquote class="tr_bq">
<span style="font-family: "Courier New",Courier,monospace;"><span style="font-size: x-small;">PLATFORM_NAME: NVIDIA CUDA<br /> VERSION: OpenCL 1.1 CUDA 4.2.1<br /> VENDOR: NVIDIA Corporation<br /> PROFILE: FULL_PROFILE<br /> DEVICE: GeForce GT 635M<br /> DEVICE VENDOR: NVIDIA Corporation<br /> MAX COMPUTE UNITS: 2<br /> DEVICE VERSION: OpenCL 1.1 CUDA<br /> DRIVER VERSION: 304.88</span></span></blockquote>
<br />
<h3>
OpenCL and Bumblebee</h3>
<br />
As previously mentioned, I have an Optimus laptop (with integrated Intel GPU as well as NVidia which is used for more demanding applications). If the NVidia GPU is shut down, you won't see the NVidia platform as available (which I find a bit strange, should be a platform with 0 available devices, no?), but once turned on with a `<span style="font-family: "Courier New",Courier,monospace;">optirun bash</span>`, things should be working properly, although I haven't tried for example CL-GL interop, I can imagine that might not work with Bumblebee.<br />
<br />
One issue I noticed though is that if you have both NVidia and Intel's drivers, Intel's driver will crash any OpenCL app run <b>inside the optirun shell</b>, which seems to be caused by the LD_PRELOAD libraries that VirtualGL uses. So either run your apps inside the shell with `<span style="font-family: "Courier New",Courier,monospace;">LD_PRELOAD= ./myApp</span>`, or just don't run them inside the optirun shell, use a regular one. As long as the GPU is active it is perfectly able to perform calculations even without VirtualGL set up.<br />
<br />
<h3>
AMD's driver</h3>
<br />
AMD enables to use both CPU and GPU devices with <a href="http://developer.amd.com/tools-and-sdks/heterogeneous-computing/amd-accelerated-parallel-processing-app-sdk/downloads/">their driver</a>. I don't have a GPU by AMD, so I only got to try the CPU implementation (luckily Intel's and AMD's CPUs are still compatible enough). The installer that they provide installs the whole SDK into /opt/AMDAPP, changes your /etc/profile to include the directories in LD_LIBRARY_PATH, and installs the icd to /etc/OpenCL/vendors.<br />
<br />
What I don't like about this is that their SDK also contains libOpenCL.so, so it will be used instead of ocl-icd's. In this case this is less of a problem than in NVidia's case, cause AMD's implementation isn't limited to just OpenCL 1.1, but if you want to use ocl-icd, just remove the libOpenCL.so* from /opt/AMDAPP/lib/x86_64.<br />
<br />
It would be nice to have a similar deb package for the AMD's CL driver, but I didn't get to that, maybe someone else wants to? ;) Anyway:<br />
<blockquote class="tr_bq">
<span style="font-size: x-small;"><span style="font-family: "Courier New",Courier,monospace;">PLATFORM_NAME: AMD Accelerated Parallel Processing<br /> VERSION: OpenCL 1.2 AMD-APP (1113.2)<br /> VENDOR: Advanced Micro Devices, Inc.<br /> PROFILE: FULL_PROFILE<br /> DEVICE: Intel(R) Core(TM) i7-3632QM CPU @ 2.20GHz<br /> DEVICE VENDOR: GenuineIntel<br /> MAX COMPUTE UNITS: 8<br /> DEVICE VERSION: OpenCL 1.2 AMD-APP (1113.2)<br /> DRIVER VERSION: 1113.2 (sse2,avx)</span></span> </blockquote>
<br />
<h3>
Conclusion </h3>
<br />
As I was testing the various drivers I encountered quite a few issues - Intel's implementation crashes on <a href="http://www.ratgpu.com/">ratGPU</a> tests, AMD's pretends to work with my <a href="http://mhr3.blogspot.co.uk/2012/03/face-detection-with-opencl.html">OpenCL face detection</a> but doesn't detect anything (Intel's and NVidia's work fine), on top of that the crashes with Intel and Bumblebee/VirtualGL LD_PRELOAD shell. Samples from AMD's SDK crash when used with ocl-icd ICD loader because they call clReleaseContext(NULL), works with AMD's loader though. But in the end there is also a lot more that actually is working - for example a year ago my face detection didn't work at all with Intel's implementation, now it's fine, many of the SDK samples did work with all three drivers. I'd say there was some good progress.<br />
<br />
So that's about the current OpenCL state, it's usable, just not out-of-the-box, I do hope that a year from now at least this post will be just saying "To use OpenCL just run `apt-get install opencl-driver-*`".mhr3http://www.blogger.com/profile/05059602092762087621noreply@blogger.com16tag:blogger.com,1999:blog-5662148629346975559.post-27026645066038382992012-08-03T11:17:00.001+02:002012-08-03T11:17:48.215+02:00GUADEC 2012 and Zeitgeist hackfestAs many others, I've been to great La Coruna to meet up with fellow gnomies and zeitgeistians, and even though I arrived on Sunday, I still managed to make it to a couple of interesting talks and on Monday we started Zeitgeist hackfest which lasted till Wednesday.<br />
<br />
The biggest chunk of work I managed to do was to review RainCT's libzeitgeist2 branch (with more than 3 thousand line vala-diff), which extracts the datamodel and dbus interface bits from the not-that-long-ago-rewritten-in-vala zeitgeist-daemon and puts those bits in a library which will supersede the current version of libzeitgeist. The old version was conceived during my GSoC (in 2010) and was purely C-based and since at that point the daemon was written in python it had no connection to the current sources, and currently this was more of a maintenance burden for us - you can imagine that it's easier to keep the lib up-to-date when the daemon itself is built with it. By the end of the hackfest the branch was merged into master, and even though there are still some small pieces missing (like documentation and syntax sugaring), we should finish those in a couple of days. The API is currently very similar to the old libzeitgeist, although we did change the stealing behaviour that was used, therefore now it's not as convenient to use in C as it used to be. On the other hand though, it's straightforward to use it from introspected languages as well as Vala itself.<br />
<br />
Other than reviews of huge and small branches, we were brainstorming about Zeitgeist's FTS extension (which does textual search of the log for us, but has issues). Unfortunately it seems that all the open source search engine libraries have some issues, be it <a href="http://mhr3.blogspot.co.at/2012/04/fts-engines-memory-usage.html">memory balooning problems</a>, fact that they're written in Java (which I think is pretty unusable on desktop), limbo state of commits to them, or lack of features. Currently the best option seems to be <a href="https://github.com/luceneplusplus/LucenePlusPlus">LucenePlusPlus</a>, but it falls into the "limbo state of commits" category. That being said, perhaps proclaiming our interest in it could change that? Pretty please? :)<br />
<br />
Besides Zeitgeist, I also managed to stop by at the PyGObject hackfest and bother Pitti with memory leaks we're seeing when using <a href="https://launchpad.net/dee">libdee</a>. Although we didn't manage to tackle them, I have high hopes that we do. I also discussed ways to make a library as optional as possible with Ryan, and will apply that to the instrumentation lib I'm currently working on.<br />
<br />
One of the things that pleasantly surprised me was an increased general interest in Zeitgeist from the community (at least when compared to last year's GUADEC) and big number of smaller contributions, which are of course great and integrating with Zeitgeist is the way to improve the general user experience. Plus overall it's nice to see this after pushing for it for the past couple of years. Hopefully we will even see direct support for Zeitgeist in GTK soon. ;)<br />
<br />
Last but not least, I want to thank GNOME foundation for sponsoring my stay.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiirRhGKMvlV6etJJo19OtmCrmIlyk2EeCtbX7rtJ1zuaKIBzLMp8wIw0Kqv9_V8QoYZ9Zk_NJ-2hv-LeCxZZI8f4pwH_WBd7cqWfHtyorW4rELWrX0K5BV4TeouERDjCY1UJzvLglauzJE/s1600/sponsored-badge-shadow.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img alt="Sponsored by GNOME foundation" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiirRhGKMvlV6etJJo19OtmCrmIlyk2EeCtbX7rtJ1zuaKIBzLMp8wIw0Kqv9_V8QoYZ9Zk_NJ-2hv-LeCxZZI8f4pwH_WBd7cqWfHtyorW4rELWrX0K5BV4TeouERDjCY1UJzvLglauzJE/s1600/sponsored-badge-shadow.png" style="border: 0px;" title="" /></a></div>
<br />mhr3http://www.blogger.com/profile/05059602092762087621noreply@blogger.com0tag:blogger.com,1999:blog-5662148629346975559.post-37748430548693757332012-04-21T23:12:00.001+02:002012-04-22T15:43:02.496+02:00FTS engines - memory usageFollowing up on Mathias's great <a href="http://taschenorakel.de/mathias/2012/04/18/fulltext-search-benchmarks/">post on Full Text Search engines</a>, I decided to take a look at the memory usage of some of the engines while performing queries. Mathias looked at Lucene++, SQLite, QtCLucene, Tracker and Xapian, I focused only on three of them - Lucene++, SQLite and Xapian (version numbers match those that Mathias used as I'm also testing on Ubuntu 12.04).<br />
<br />
The procedure was simple - I grabbed the benchmark repo (<a href="https://gitorious.org/openismus-playground/fts-benchmark">https://gitorious.org/openismus-playground/fts-benchmark</a>), used it to built two sets of the databases with 17251 and 121587 movies and then just ran valgrind's massif while only performing queries on the already built databases. Here are the values of peak memory usage:<br />
<br />
<table border="1" cellpadding="2" cellspacing="0" style="width: 100%;">
<tbody>
<tr>
<th><br /></th>
<th>Lucene++</th>
<th>SQLite</th>
<th>Xapian</th>
</tr>
<tr>
<td>17251</td>
<td>1.4 MiB</td>
<td>2.5 MiB</td>
<td>1.2 MiB</td>
</tr>
<tr>
<td>121587</td>
<td>3.1 MiB</td>
<td>2.6 MiB</td>
<td>5.2 MiB</td>
</tr>
</tbody>
</table>
<br />
Of course, the peak memory usage by itself isn't terribly interesting value, what matters is also how does the engine work with memory over time, so let's look at that as well (images are courtesy of <a href="https://projects.kde.org/massif-visualizer">Milian's fantastic massif-visualizer</a>, note that their scale is not relative to each other):<br />
<br />
<div style="overflow-x: auto;">
<table border="1" cellpadding="2" cellspacing="0" style="width: 100%;">
<tbody>
<tr>
<th><br /></th>
<th>Lucene++</th>
<th>SQLite</th>
<th>Xapian</th>
</tr>
<tr>
<td>17251</td>
<td><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEia0iMdezh047ekSBYSeMmbPVS4cagqMkSg4xJb9pjbv7Zl06F4Hiywk8dAr-qhGXPhLPEEt7o6zJPb5WvEm2EWqv2KMCXjB6sQXIw_yMfYk-7w2jS9O5Q0Sh_1ApCtEpWqRbEgRwXYqZPx/s1600/lucene-small-db.png" imageanchor="1"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEia0iMdezh047ekSBYSeMmbPVS4cagqMkSg4xJb9pjbv7Zl06F4Hiywk8dAr-qhGXPhLPEEt7o6zJPb5WvEm2EWqv2KMCXjB6sQXIw_yMfYk-7w2jS9O5Q0Sh_1ApCtEpWqRbEgRwXYqZPx/s200/lucene-small-db.png" /></a></td>
<td><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj622qm8AvqrdGzGrpe02DVansw48NLy7bKmLHdM72abitpEKeK1SqKGSw-4s04EwkfSzDCuydCSIOdDjrm0n12Qn5vJKoU5g7QTevoCQv6HaTDUp6JHAH93RdLP928eaAbqBfhmQv-ojx4/s1600/sqlite-small-db.png" imageanchor="1"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj622qm8AvqrdGzGrpe02DVansw48NLy7bKmLHdM72abitpEKeK1SqKGSw-4s04EwkfSzDCuydCSIOdDjrm0n12Qn5vJKoU5g7QTevoCQv6HaTDUp6JHAH93RdLP928eaAbqBfhmQv-ojx4/s200/sqlite-small-db.png" /></a></td>
<td><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEigSYoJuT_hZqNa1t8OTSfk4YUnwD_SJuR0MRDV4Uo7ANSnUIvuacPOHffQrU-dmDvQPyzr-yUtiXHAUAKzi2uFQlrPN8ZnmqDpskUb7x-roKso2x5sdfwvFXaEecnFWr-RWuQychXdULmJ/s1600/xapian-small-db.png" imageanchor="1"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEigSYoJuT_hZqNa1t8OTSfk4YUnwD_SJuR0MRDV4Uo7ANSnUIvuacPOHffQrU-dmDvQPyzr-yUtiXHAUAKzi2uFQlrPN8ZnmqDpskUb7x-roKso2x5sdfwvFXaEecnFWr-RWuQychXdULmJ/s200/xapian-small-db.png" /></a></td>
</tr>
<tr>
<td>121587</td>
<td><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjTKu3uAhAijZHpsE3Q_TygIhd9pK_EUk57x7-dR8geamFym8YzGGWCFZ41hGW8jlx6Om6KZin3ZplOK_uCgVA41K72JmJKOstwhXVoJIIOcj_aPEFHu9XSf2Z2eyPqsYmDWlx-5QNClBEe/s1600/lucene-large-db.png" imageanchor="1"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjTKu3uAhAijZHpsE3Q_TygIhd9pK_EUk57x7-dR8geamFym8YzGGWCFZ41hGW8jlx6Om6KZin3ZplOK_uCgVA41K72JmJKOstwhXVoJIIOcj_aPEFHu9XSf2Z2eyPqsYmDWlx-5QNClBEe/s200/lucene-large-db.png" /></a>
</td>
<td><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiHxzi79SXMKvT7P6xG6YkznVJm_RDsaHQVHDvPP7Nqo8mR0Lq4sZWxcu9iZNzEjMCwG_HQs51L5GBOQldnSzSSTGU5mxNjCQH2o0UnB3NWdGaa4C9HU5VlFULT0wnuXyiv2UcxaDW8lEfO/s1600/sqlite-large-db.png" imageanchor="1"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiHxzi79SXMKvT7P6xG6YkznVJm_RDsaHQVHDvPP7Nqo8mR0Lq4sZWxcu9iZNzEjMCwG_HQs51L5GBOQldnSzSSTGU5mxNjCQH2o0UnB3NWdGaa4C9HU5VlFULT0wnuXyiv2UcxaDW8lEfO/s200/sqlite-large-db.png" /></a></td>
<td><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj1u_xNNDV8FT-RSicAvDbAZamlH0MrKP_n2U5sKEMCqfR9FMC-jUgREPC0uKuecYQ4BXhtm7JMQnAWBVJDydbeG0vm1v2E6MNboOsIfd6vPbHOlZMXw9UUvs2fQE-C2vaBKpCLDoTxuDS-/s1600/xapian-large-db.png" imageanchor="1"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj1u_xNNDV8FT-RSicAvDbAZamlH0MrKP_n2U5sKEMCqfR9FMC-jUgREPC0uKuecYQ4BXhtm7JMQnAWBVJDydbeG0vm1v2E6MNboOsIfd6vPbHOlZMXw9UUvs2fQE-C2vaBKpCLDoTxuDS-/s200/xapian-large-db.png" /></a></td>
</tr>
</tbody>
</table>
</div>
<br />
We can see that both Lucene and SQLite seem to build a cache on the first query and then use it, Xapian on the other hand doesn't seem to be keeping a cache, as the rapid drops in mem usage suggest, but maybe there's different explanation to that.<br />
<br />
So that's it for memory usage while performing standard queries, but what I was particularly interested in was memory usage when performing wildcard queries (as I saw some strange behaviour here and there with Xapian). Therefore I added one simple wildcard query "T*" to the list of executed queries and ran it on the largest DBs (ones with 121587 movies). As you can imagine the "T*" query is really generic and it matches around 110 thousand documents from the dataset, that's why I also added a limit of 10k results per query to each backend (although that shouldn't make much difference).<br />
<br />
Let's look at the results:<br />
<br />
<div style="overflow-x: auto;">
<table border="1" cellpadding="2" cellspacing="0" style="width: 100%;">
<tbody>
<tr>
<th><br /></th>
<th>Lucene++</th>
<th>SQLite</th>
<th>Xapian</th>
</tr>
<tr>
<td>Peak mem usage</td>
<td>4.6 MiB</td>
<td>7.3 MiB</td>
<td>442.2 MiB</td>
</tr>
<tr>
<td>Visualization</td>
<td><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEixrZwgJdMaKVSdPD22REy17RaQSrCrWlow_R2vrVwDhA6HcdalwjPQlwSNMB8dSlQDTN4QVyJYNHPll4MTKDUvzOq91bOL7Lyi4W-OWIgwIGJA-L0AX-MPb8OYoC5cMK6WspUTrj-QV5ux/s1600/lucene-wildcard.png" imageanchor="1"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEixrZwgJdMaKVSdPD22REy17RaQSrCrWlow_R2vrVwDhA6HcdalwjPQlwSNMB8dSlQDTN4QVyJYNHPll4MTKDUvzOq91bOL7Lyi4W-OWIgwIGJA-L0AX-MPb8OYoC5cMK6WspUTrj-QV5ux/s200/lucene-wildcard.png" /></a></td>
<td><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjBmgxpLl6bUhpeB_DSUHeZNoMJMX2XVLv7pXLpg4NO88d3hjGRW0tqcp3PuhDvzZ60JVD0YRAhJMqoAQJY2mT8C62q1fovCuk1IIcDt3UQucqdpWBrMjOY0YL39tKADavdTWFoqdLce3Ir/s1600/sqlite-wildcard.png" imageanchor="1"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjBmgxpLl6bUhpeB_DSUHeZNoMJMX2XVLv7pXLpg4NO88d3hjGRW0tqcp3PuhDvzZ60JVD0YRAhJMqoAQJY2mT8C62q1fovCuk1IIcDt3UQucqdpWBrMjOY0YL39tKADavdTWFoqdLce3Ir/s200/sqlite-wildcard.png" /></a></td>
<td><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEghZqybLhjPEMMjN4PdXa7SjO1LMuzwHTdXmQ9N7A9YG9QeB4iw9Gf1fbrYW4AA0ydOCjUw1SgTZBVdG2amyu3C34GZCRej1ddzv9CiEjfr17IatHciznQdKqoqofRFtTQool1Ca-yWLhBq/s1600/xapian-wildcard.png" imageanchor="1"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEghZqybLhjPEMMjN4PdXa7SjO1LMuzwHTdXmQ9N7A9YG9QeB4iw9Gf1fbrYW4AA0ydOCjUw1SgTZBVdG2amyu3C34GZCRej1ddzv9CiEjfr17IatHciznQdKqoqofRFtTQool1Ca-yWLhBq/s200/xapian-wildcard.png" /></a></td>
</tr>
</tbody>
</table>
</div>
<br />
Now we can clearly see that Xapian uses huge amount of memory during expansion of the wildcard query (can this be considered a bug report? :)), SQLite has a couple of peaks there, but nothing to be worried too much about, and Lucene++ shines with its fairly constant (and really low) mem usage.<br />
<br />
You saw the data, so I'll leave any conclusions up to you. ;)<br />
<br />
The small number of changes I had to do to the original benchmark repository is available as <a href="http://ubuntuone.com/4RQduB4ay3ocbxhz3ZXVYC">a simple diff here</a>.mhr3http://www.blogger.com/profile/05059602092762087621noreply@blogger.com1tag:blogger.com,1999:blog-5662148629346975559.post-33587239022089697132012-03-04T16:23:00.001+01:002012-03-06T20:29:59.858+01:00Face detection with OpenCLI've been meaning to write about the topic of my thesis for quite some time, but didn't really get to it until now, so even though it's almost a year late, here we go.<br />
<br />
Before I get into some technical details, here's a <a href="http://www.youtube.com/watch?feature=player_embedded&v=aTErTqOIkss">youtube video</a> where you can see the OpenCL implementation of my detector in action:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<iframe allowfullscreen='allowfullscreen' webkitallowfullscreen='webkitallowfullscreen' mozallowfullscreen='mozallowfullscreen' width='320' height='266' src='https://www.youtube.com/embed/aTErTqOIkss?feature=player_embedded' frameborder='0'></iframe></div>
<br />
Pretty neat, right? :) So what you just saw was an implementation of a detector based on the WaldBoost algorithm (a variant of <a href="http://en.wikipedia.org/wiki/AdaBoost">AdaBoost</a>) that had as its input a classifier trained for detecting frontal faces (and an awesome video of course) running on a GPU.<br />
<br />
If you know anything about boosting algorithms, you'll know that one strong classifier is usually composed of lots of weak classifiers (which are usually very simple and computationally inexpensive functions) - in my case there are 1000 weak classifiers where each uses <a href="http://en.wikipedia.org/wiki/Local_binary_patterns">Local Binary Patterns</a> to extract a feature from the input texture. Unfortunately such strong classifier is resolution dependent, and to be able to detect objects of various sizes in the input image, we need a pre-processing step.<br />
<br />
During pre-processing we create a pyramid of images by gradually down-scaling the input (oh and we don't need colors, so we also convert it to greyscale). This way the detector can still detect only faces with resolution of 24x24, but using a mapping function we will know when it actually detected something in any of the downscaled versions of the image and there we have resolution independent detector. Interesting tidbit: it turned out that creating the pyramid texture by putting the downscaled images horizontally instead of vertically (which you can see on the image below) slightly improved performance of the detector - simply because the texture cache unit had higher hit ratio in such setup, but since the pyramid texture is approximately 3.6 times larger than the width of the original image, the detector wouldn't be able to process HD (1280x720) nor Full-HD (1920x1080) videos, because maximum texture size for OpenCL image is 4096 pixels (when using vertical layout though 1080 x 3.6 ~= 3900, so even Full-HD videos can be processed).<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="border: 0px; margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhuVhW3DgzWvVIsZliNXGhz_DnjocC3Zr63usYWPesXKppkyGDovrMpiGs5Ehv3QjJVR5OwVuJYzGTj-JboFlxZ28wRQpeq_lApCHFKjcUJfTScZeLEIbl09AxTdhv00PCbgo9c531bcx-3/s1600/pyramid2.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="305" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhuVhW3DgzWvVIsZliNXGhz_DnjocC3Zr63usYWPesXKppkyGDovrMpiGs5Ehv3QjJVR5OwVuJYzGTj-JboFlxZ28wRQpeq_lApCHFKjcUJfTScZeLEIbl09AxTdhv00PCbgo9c531bcx-3/s320/pyramid2.png" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Left - original image, right - pyramid of downscaled images (real pyramid texture also has the original on top)</td></tr>
</tbody></table>
<br />
Once we have our pyramid image, it's divided into small blocks, which are processed by the GPU cores and each work item (or thread if you wish) in this block is evaluating the strong classifier at a particular window position of the pyramid image. Overall we'll evaluate every window position - think of every pixel. (in reality it's more complicated than that - the detector is using multiple kernels and each is evaluating only a part of the strong classifier - that's because WaldBoost can preliminary reject a window without evaluating all weak classifiers, so when a kernel finishes it just reduces the number of candidate windows and next kernel continues to evaluate only windows that survived the previous steps - this also ensures that we keep most of the work items in the work groups busy).<br />
<br />
Once the detector finishes, we have a couple of window positions in the pyramid image and response value of the strong classifier in these windows, and these are sent back to the host. The CPU can then finish the detection (by simply thresholding the response values) and map the coordinates back to the input image. If you watched the video carefully you'd have noticed that there are multiple positive responses around a face, so this would be also a good place to do some post-processing and merge these. Plus there's a false detection from time to time, so again good place to get rid of them.<br />
<br />
You're surely asking how does this compare to a pure CPU implementation and as you can imagine having to evaluate every window position in the pyramid image is very costly and even optimized SSE implementations can't get close to performance of a GPU (even though you need to copy a lot of data between the host and the GPU). So a simple graph to answer that (note the logarithmic scale):<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="border: 0px; margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiG-R7f3Q0X8Y7ONFR7u4z8XwoKE70qbqMOEqSQxbfIG_citcph4hSMasxqu3DIyGtcGjpwCxMAJJH2CKjkxev6smzhyphenhyphenfYh2xE6D4ThKpXyZHBwJ1c_JRKSURmm-EnZG4SUi5FDDs9MYfMQ/s1600/fps.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="250" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiG-R7f3Q0X8Y7ONFR7u4z8XwoKE70qbqMOEqSQxbfIG_citcph4hSMasxqu3DIyGtcGjpwCxMAJJH2CKjkxev6smzhyphenhyphenfYh2xE6D4ThKpXyZHBwJ1c_JRKSURmm-EnZG4SUi5FDDs9MYfMQ/s400/fps.png" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Processed video frames per second (CPU: Core2 Duo E8200 @ 2.66GHz; GPU: GeForce GTX 285 - driver ver 270)</td></tr>
</tbody></table>
So why do I talk about all this on my free software related blog? Well of course I'm making the source available for anyone to play with it, optimize it further (there's still plenty of room for that) or do whatever you feel like doing with it. But I need to warn you first - the implementation is heavily optimized for nvidia's hardware and was never really tested on anything else (the AMD CPU implementation of OpenCL doesn't support images, the Intel CPU implementation does support images, but not the image formats I'm using, so that basically leaves only AMD GPU implementation, but I didn't have such hardware available). I'm also making assumptions that are true only on nvidia's hardware - like that there are 32 work items running at a given time (which is true for nvidia's warp). There are even some helper methods that allowed this to be run on hardware without local atomic operations (so even OpenCL 1.0 was enough), but I see now that I can no longer run it on my old GeForce 9300 with latest nvidia's driver (although it did work with version 270). So I don't even know if it works at all with the compiler in the latest driver... you've been warned.<br />
<br />
Grab the code branch from Launchpad (bzr branch <a href="https://code.launchpad.net/%7Emhr3/+junk/ocl-detector">lp:~mhr3/+junk/ocl-detector</a>), or get the <a href="http://ubuntuone.com/5HfCfcX3t81yP00Q8TZCcg">tarball</a> (the only dependencies are glib, opencv plus libOpenCL.so somewhere where the linker can find it). Run it with `<span style="font-family: 'Courier New',Courier,monospace; font-size: x-small;">./oclDetector -s CAM</span>` (and if that doesn't seem to detect anything try `<span style="font-family: 'Courier New',Courier,monospace; font-size: x-small;">./oclDetector -r -20 -s CAM</span>`).mhr3http://www.blogger.com/profile/05059602092762087621noreply@blogger.com38tag:blogger.com,1999:blog-5662148629346975559.post-10277531805850139672011-11-03T16:57:00.000+01:002011-11-03T17:30:10.496+01:00News from the Zeitgeist landHey everyone,<br />
<br />
on behalf of the Zeitgeist team I'd like to announce that today we're releasing the latest version of Zeitgeist (0.8.99-alpha1). It's quite unusual for Zeitgeist to do alpha releases, but this one is special - the entire daemon was rewritten from Python to Vala, which most likely brings a couple of new bugs, but also fixes another bunch of old bugs. Therefore we'd need people to test the release to see if there are some outstanding issues we missed.<br />
<br />
As usual, the <a href="http://launchpad.net/zeitgeist/0.9/0.9.0/+download/zeitgeist-0.8.99%7Ealpha1.tar.bz2">tarball is available on Launchpad</a>. Of course we'll be also pushing the package into <a href="https://launchpad.net/%7Ezeitgeist/+archive/ppa">our PPA</a> soon (although the alpha release may be only available for Oneiric users). Please report any bugs you encounter to either <a href="https://bugs.freedesktop.org/describecomponents.cgi?product=Zeitgeist">Zeitgeist's freedesktop.org bugzilla</a> or to <a href="https://bugs.launchpad.net/zeitgeist/+filebug">our Launchpad bug page</a>.<br />
<br />
The biggest difference you'll be able to see at this point is much faster startup time, other than that the changes will be minimal - we're still using the same database, as well as the same DBus API, so everything should be working as before. One thing we did break is the API for the Activity Journal extension, so if you want to continue using it with this and further releases, you need to update also Activity Journal.<br />
<br />
What's still missing is rewrite of our FTS extension (which provides search capabilities), so for the time being we're still using the old one written in python which is included in the tarball.<br />
<br />
Before I wrap up, I'd like to say huge thank you to Collabora and Canonical, who sponsored the development, and of course to the whole team: <a href="http://seilo.geekyogre.com/">Seif</a> (seiflotfy), <a href="http://bloc.eurion.net/">Siegfried</a> (RainCT), <a href="http://grillbar.org/">Mikkel</a> (kamstrup) and <a href="http://milky.manishsinha.net/">Manish</a> (m4n1sh).<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="http://www.collabora.co.uk/logos/collabora-logo-small.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="116" src="http://www.collabora.co.uk/logos/collabora-logo-small.png" style="border: 0;" width="354" /></a></div><div class="separator" style="clear: both; text-align: center;"></div><div class="separator" style="clear: both; text-align: center;"><a href="http://aruiz.synaptia.net/.a/6a00d8341fa10a53ef014e8c4fc502970d-pi" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="42" src="http://aruiz.synaptia.net/.a/6a00d8341fa10a53ef014e8c4fc502970d-pi" style="border: 0;" width="320" /></a></div>mhr3http://www.blogger.com/profile/05059602092762087621noreply@blogger.com2tag:blogger.com,1999:blog-5662148629346975559.post-58372685539027454602011-08-03T16:08:00.000+02:002011-08-03T16:08:55.906+02:00Desktop Summit 2011To make sure I don't forget: I'll be also at this year's <a href="https://www.desktopsummit.org/">Desktop Summit</a> in Berlin, and it'll be my first time on such huge conference, so I'm quite excited. If you have any <a href="https://launchpad.net/synapse-project">Synapse</a> / <a href="http://zeitgeist-project.com/">Zeitgeist</a> questions feel free to ask. :) Last, but not least, we'll also have a <a href="http://wiki.desktopsummit.org/Workshops_%26_BoFs/2011/GtkRecent_and_Zeitgeist">BOF about GtkRecent</a>.<br />
<br />
See you there!<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjSvoir1gHg0cbnUMx7VhwkOk5mBTnmN46qEEm4TNif_ERlXVtY9-cK5vBFjJOtKHsmfAlqa-rttVefg01IsL8t-jRJYwVSCprrpWseoKNTbD_RR7_kPPiwxyzbQCq5U3kT2y5TtlNkTjhD/s1600/DS2011banner.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" style="border: 0;" height="105" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjSvoir1gHg0cbnUMx7VhwkOk5mBTnmN46qEEm4TNif_ERlXVtY9-cK5vBFjJOtKHsmfAlqa-rttVefg01IsL8t-jRJYwVSCprrpWseoKNTbD_RR7_kPPiwxyzbQCq5U3kT2y5TtlNkTjhD/s320/DS2011banner.png" width="320" /></a></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiirRhGKMvlV6etJJo19OtmCrmIlyk2EeCtbX7rtJ1zuaKIBzLMp8wIw0Kqv9_V8QoYZ9Zk_NJ-2hv-LeCxZZI8f4pwH_WBd7cqWfHtyorW4rELWrX0K5BV4TeouERDjCY1UJzvLglauzJE/s1600/sponsored-badge-shadow.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" style="border: 0;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiirRhGKMvlV6etJJo19OtmCrmIlyk2EeCtbX7rtJ1zuaKIBzLMp8wIw0Kqv9_V8QoYZ9Zk_NJ-2hv-LeCxZZI8f4pwH_WBd7cqWfHtyorW4rELWrX0K5BV4TeouERDjCY1UJzvLglauzJE/s1600/sponsored-badge-shadow.png" /></a></div><div class="separator" style="clear: both; text-align: center;"><br />
</div>mhr3http://www.blogger.com/profile/05059602092762087621noreply@blogger.com2tag:blogger.com,1999:blog-5662148629346975559.post-25880392957366133012011-05-17T14:44:00.000+02:002013-06-03T21:08:24.726+02:00Intel's OpenCL on UbuntuSince I work with OpenCL a lot and yesterday I found out that Intel's OpenCL is now finally available for Linux, I thought I'd share a few words of how to get it to work on Ubuntu (even though Intel currently provides only a rpm package for RHEL and Suse).<br />
<br />
First of all, I'm testing all of this on Lucid 64bit, but I suppose it'd work also on newer Ubuntu releases (though you need to be using 64bit version, cause the Intel package is for 64).<br />
<br />
So let's get to it.<br />
<br />
<ol>
<li>First of all grab the rpm package from <a href="http://software.intel.com/en-us/articles/download-intel-opencl-sdk/">http://software.intel.com/en-us/articles/download-intel-opencl-sdk/</a>.</li>
<li>Install the rpm and alien packages (`sudo apt-get install rpm alien`).</li>
<li>Convert the rpm package to deb using alien - `fakeroot alien --to-deb <intel's rpm package filename>`. The conversion spits some warnings, I wouldn't pay any attention to them.</li>
<li>Install the newly created deb package. `sudo dpkg -i intel-ocl-sdk-suse+11.1_1.1-2_amd64.deb`</li>
<li>One extra package you need to install for the library to work is libnuma. `sudo apt-get install libnuma1`</li>
<li>Make sure the ICD is installed. `sudo echo "libintelocl.so" > /etc/OpenCL/vendors/intelocl64.icd`</li>
<li>The package is nice and also installs OpenCL headers in /usr/include/CL. Also the main binary (libOpenCL.so) is installed in /usr/lib64 - if you don't have any other OpenCL platform installed on your system, I suggest moving it to /usr/lib (run `sudo ldconfig` afterwards), if you do have this library already (for example nvidia driver also contains it) just leave it there.</li>
<li>Since the libraries are installed in non-standard location for Ubuntu (/usr/lib64/OpenCL/vendors/intel), you'll need to adjust your LD_LIBRARY_PATH. I usually do this using a script, but you can just run:<br />
<span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;">export LD_LIBRARY_PATH=/usr/lib64/OpenCL/vendors/intel:$LD_LIBRARY_PATH</span></li>
</ol>
<div>
<div>
<span class="Apple-style-span" style="font-family: inherit;">Running a OpenCL program that just lists available platforms should return now at least one platform. Or if you have multiple platforms including their ICDs installed you'd get something like:</span></div>
<div>
<pre>There are 3 platforms available
PLATFORM_NAME: Intel(R) OpenCL
VERSION: OpenCL 1.1 LINUX
VENDOR: Intel(R) Corporation
PROFILE: FULL_PROFILE
DEVICE: Intel(R) Core(TM)2 Duo CPU P7370 @ 2.00GHz
MAX COMPUTE UNITS: 2
DEVICE VERSION: OpenCL 1.1
DRIVER VERSION: 1.1
PLATFORM_NAME: ATI Stream
VERSION: OpenCL 1.1 ATI-Stream-v2.3 (451)
VENDOR: Advanced Micro Devices, Inc.
PROFILE: FULL_PROFILE
DEVICE: Intel(R) Core(TM)2 Duo CPU P7370 @ 2.00GHz
MAX COMPUTE UNITS: 2
DEVICE VERSION: OpenCL 1.1 ATI-Stream-v2.3 (451)
DRIVER VERSION: 2.0
PLATFORM_NAME: NVIDIA CUDA
VERSION: OpenCL 1.0 CUDA 3.2.1
VENDOR: NVIDIA Corporation
PROFILE: FULL_PROFILE
DEVICE: GeForce 9300M GS
MAX COMPUTE UNITS: 1
DEVICE VERSION: OpenCL 1.0 CUDA
DRIVER VERSION: 260.19.29
</pre>
</div>
</div>
<br />
Good luck implementing your OpenCL kernels. :)mhr3http://www.blogger.com/profile/05059602092762087621noreply@blogger.com7tag:blogger.com,1999:blog-5662148629346975559.post-44377327034518062132011-04-07T18:43:00.000+02:002011-04-07T18:43:54.951+02:00New Synapse again!In the release-often spirit, we prepared Synapse 0.2.6, which, as opposed to last release, contains lots of user interface tweaks, changes and additions (drag and drop, new theme, improved focus grabbing). This time you can read all about it <a href="http://codingyourdreams.net/2011/04/07/synapse-aspartate-0-2-6/">at Alberto's blog</a>.<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="http://codingyourdreams.net/wp-content/uploads/2011/04/synapse-0.2.6.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="http://codingyourdreams.net/wp-content/uploads/2011/04/synapse-0.2.6.png" width="320" /></a></div>mhr3http://www.blogger.com/profile/05059602092762087621noreply@blogger.com3tag:blogger.com,1999:blog-5662148629346975559.post-67793499466137810262011-02-23T00:41:00.003+01:002011-11-03T17:30:41.280+01:00Synapse: AnandamideJust a quick shout about new release of Synapse - 0.2.4! There aren't too many user visible changes in this release, besides a few new plugins. Mostly polishing and more polishing.<br />
<br />
Anyhow here's the changelog:<br />
<ul><li> added Calculator plugin</li>
<li>multiple fixes to Zeitgeist searches</li>
<li>add plugin descriptions (links to wiki)</li>
<li>added simple Launchpad plugin</li>
<li>added Pastebin plugin</li>
<li>added Copy to clipboard action</li>
<li>added Imgur plugin (uploads images to imgur)</li>
<li>added Selection plugin (execute actions on currently selected text)</li>
<li>small UI fixes and speedups</li>
<li>multiple smaller bug fixes</li>
</ul>If you like Synapse, you can help out by writing plugin descriptions on our <a href="http://synapse.zeitgeist-project.com/wiki/index.php?title=Main_Page">wiki</a>, just click the help button in Synapse's preferences window (in the plugin tab) and you'll be taken to a wiki page (most likely empty right now) where all other users will then be able to read this.<br />
<br />
Tarballs are at the usual <a href="http://launchpad.net/synapse-project/0.2/0.2.4.2/+download/synapse-0.2.4.2.tar.gz">place</a>. Ubuntu users using our bleeding edge PPA (ppa:synapse-core/testing) could have been enjoying most of these improvements for quite some time, but the new packages have now been built also on our stable PPA (<b>ppa:synapse-core/ppa</b>).mhr3http://www.blogger.com/profile/05059602092762087621noreply@blogger.com6tag:blogger.com,1999:blog-5662148629346975559.post-44303203590929885482011-02-14T19:39:00.000+01:002011-02-14T19:39:57.277+01:00My work @ Zeitgeist hackfest 2011As many of you probably noticed, last week there was Zeitgeist hackfest happening at Aarhus, and here's a short summary of what I've done (you probably already read <a href="http://www.grillbar.org/wordpress/?p=536">Mikkel's</a> and <a href="http://seilo.geekyogre.com/2011/02/zeitgeist-hackfest-day-1-3/">Seif's posts</a> about it).<br />
<br />
My overall mantra was to get the necessary bits for proper Zeitgeist integration upstream, and I dare to say that this worked out quite well:<br />
<ul><li>the Gio patch which provides us with extra information about application launches is now part of official GLib 2.28 (https://bugzilla.gnome.org/show_bug.cgi?id=641395)</li>
<ul><li>this allowed us to remove the non-standard Gio module from libzeitgeist, and its job will be now done by zeitgeist-datahub</li>
</ul><li>zeitgeist-datahub received a couple of updates - I ported it to use GDBus (which was a nice experience in Vala) and added the module that listens for application launches</li>
<li>for quite some time we have had plugins for many applications in <a href="https://launchpad.net/zeitgeist-dataproviders">Zeitgeist Data Sources project</a>, but to make it easier for users to get these, I ported a few of them to use libpeas and requested merging them to their upstream projects, therefore in the next GNOME release the Zeitgeist integration plugins for Totem, gedit, and Rhythmbox will be just a click away.</li>
<li>libzeitgeist also received many bug fixes, and I hope the new GDBus series will now be as stable as the older dbus-glib powered one (and maybe even more), now the only thing that's missing there is GObject introspection annotations and making the API a bit more friendly for non-C uses.</li>
<li>Seif also implemented the grid plugin based on my idea :) and hopefully this work will continue in some form, preferably something usable by multiple applications - a zeitgeist-gtk library comes to mind :)</li>
</ul>I also feel obliged to thank the #gedit guys, who have been very helpful, and let me tell you that they have a very nice plugin architecture now ;)<br />
<br />
Ultimately a thank you goes also to our sponsors:<br />
<div class="separator" style="clear: both; text-align: center;"><a href="http://live.gnome.org/Travel/Policy?action=AttachFile&do=get&target=sponsored-badge-shadow.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://live.gnome.org/Travel/Policy?action=AttachFile&do=get&target=sponsored-badge-shadow.png" style="border: 0px none;" /></a></div><div class="separator" style="clear: both; text-align: center;"><a href="http://www.collabora.co.uk/logos/collabora-logo-small.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="104" src="http://www.collabora.co.uk/logos/collabora-logo-small.png" style="border: 0px none;" width="320" /></a></div><div class="separator" style="clear: both; text-align: center;"><a href="http://enhed.au.dk/5150/png/en" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="56" src="http://enhed.au.dk/5150/png/en" style="border: 0px none;" width="320" /></a></div><div class="separator" style="clear: both; text-align: center;"><a href="http://www.incuba-sp.dk/ajrgfx/gfx/incuba_logo.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://www.incuba-sp.dk/ajrgfx/gfx/incuba_logo.gif" style="border: 0px none;" /></a></div>mhr3http://www.blogger.com/profile/05059602092762087621noreply@blogger.com0tag:blogger.com,1999:blog-5662148629346975559.post-63712592543851358982010-12-13T19:42:00.002+01:002010-12-16T01:32:09.286+01:00More Synapse newsTwo weeks passed since the first official Synapse release, and we've prepared another one! As common with first releases, there were quite a few issues which we worked on and fixed in 0.2.2. But besides fixed bugs we also added a bunch of stuff... So what's new?<br />
<ul><li>implemented relevancy service, which makes sure that applications you use often end up among the first results of a search - this is done using Zeitgeist, so you can also track the popularity also in other Zeitgeist clients</li>
<li>support for basic transliteration when searching for applications - therefore you shouldn't need to type accents (if your language has them)</li>
<li>three new plugins: OpenSearch (used to start a web search from Synapse, currently comes with Google and Google Maps plugins), Locate (runs locate to find files on your filesystem), Gnome screensaver (adds lock screen action)</li>
<li>pressing Shift+Enter on an item now executes the action without closing Synapse (unless you run an application which takes focus)</li>
<li>ability to override gtk theme using custom gtkrc file (see screenshot)</li>
<li>added notification-area icon (which can be disabled)</li>
</ul><br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhYsg2PuyNRyOweh-Ecb5OC1_cCYuNxn5hX4XU2oekaY5Vn2AaJUqPKTM_eDJNiANzKJY1-OEWOZfHsQ6mmwHBkQWfJSCGHfB1UJPeM4DEu5R_xW2J5i8pG6V-U_M0dNNOI1DVWKjSTZODh/s1600/dark-default.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="204" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhYsg2PuyNRyOweh-Ecb5OC1_cCYuNxn5hX4XU2oekaY5Vn2AaJUqPKTM_eDJNiANzKJY1-OEWOZfHsQ6mmwHBkQWfJSCGHfB1UJPeM4DEu5R_xW2J5i8pG6V-U_M0dNNOI1DVWKjSTZODh/s320/dark-default.png" width="320" /></a></div><br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgYbO4l1IQiBx0lmlI5vYDDar7L7snnHUzZuamVACICGOByzagKh5vnLWuqUtde-OzTHKiMHiJbF16hdgE_JmU0_O7nfbTFXEg4YD1-6i-S-X2S4sX8BUfCTkLXGb-u-R-fQDnsZ9-APScG/s1600/dark-virgilio.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="199" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgYbO4l1IQiBx0lmlI5vYDDar7L7snnHUzZuamVACICGOByzagKh5vnLWuqUtde-OzTHKiMHiJbF16hdgE_JmU0_O7nfbTFXEg4YD1-6i-S-X2S4sX8BUfCTkLXGb-u-R-fQDnsZ9-APScG/s320/dark-virgilio.png" width="320" /></a></div><br />
<br />
<br />
If you're using a light Gtk theme and would like Synapse dark, just copy <a href="https://bugs.launchpad.net/synapse-project/+bug/688813/+attachment/1764962/+files/gtkrc">https://bugs.launchpad.net/synapse-project/+bug/688813/+attachment/1764962/+files/gtkrc</a> to your "~/.config/synapse".<br />
<br />
We also set up a wiki @ <a href="http://synapse.zeitgeist-project.com/wiki/">http://synapse.zeitgeist-project.com/wiki/</a>, feel free to head over there to learn about advanced/hidden configuration options and hopefully soon there'll be even some content on plugin creation.<br />
<br />
You can find the release tarball of <i>Adenosine triphosphate</i> here: <a href="http://launchpad.net/synapse-project/0.2/0.2.2/+download/synapse-0.2.2.2.tar.gz">http://launchpad.net/synapse-project/0.2/0.2.2/+download/synapse-0.2.2.2.tar.gz</a> (you'll need valac 0.10 to compile it, and zeitgeist 0.6 is highly recommended to run it), Ubuntu users will find an update in <b>ppa:synapse-core/ppa</b>. (please note that the maverick package says that it's 0.2.1, but it's in fact 0.2.2, sorry about that).<br />
<br />
What's next? By now we're pretty happy with the core functionality (except maybe the missing ability to configure plugins using some kind of UI), so further releases will see this fixed, and besides that there'll be mostly new and updated plugins.<br />
<ul></ul>mhr3http://www.blogger.com/profile/05059602092762087621noreply@blogger.com12tag:blogger.com,1999:blog-5662148629346975559.post-2518080819582422492010-11-30T19:53:00.001+01:002010-12-02T18:32:59.173+01:00Introducing Synapse: Acetylcholine<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgoPFRObAxpa2Ur4ud-hM3TTUmA4JYTpmn9Fx-ZsMRqHT7ggFuh340xitaVBGYQnIf-2aWy68BzJv15fAin1Qz2PEM5VCEaQQnHmxnicIDI0ujGgSCqBobHKwO6V4GOnPv1-Regq2j-Z49x/s1600/synapse-128.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgoPFRObAxpa2Ur4ud-hM3TTUmA4JYTpmn9Fx-ZsMRqHT7ggFuh340xitaVBGYQnIf-2aWy68BzJv15fAin1Qz2PEM5VCEaQQnHmxnicIDI0ujGgSCqBobHKwO6V4GOnPv1-Regq2j-Z49x/s1600/synapse-128.png" style="border: 0px none;" /></a></div>As some of you know, during the summer I was working on a few Zeitgeist-related projects, one of them was Sezen and the panel-applet inspired by Sezen which allowed you to search Zeitgeist log conveniently from your panel. But I was never particularly happy with these solutions, and as a Gnome Do user, I was always disappointed that it is unable to find files the same way Sezen can, while the interface is pretty much a perfect fit for it. And that's when Synapse was born...<br />
<br />
<b><i>So what does Synapse do?</i></b><br />
It well... searches stuff... If you ever used Gnome Do / Quicksilver / Gnome Launch Box, you'll feel right at home with Synapse, if not, the only thing you need to do is run Synapse (or press Ctrl+Space to summon it), type what you're looking for, and Synapse will present you a list of items that match your query. Once you found the item you were looking for, you can perform an action on it (and these are defined by the plugins you're using). If you don't like the default action, just press Tab and search appropriate action.<br />
And besides this primary use-case, you can also browse recent items which were logged by Zeitgeist, in case you close a document by mistake or just want to hear again the music track that played a few minutes ago.<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi7ILM7clPjAFRr_cmVGodONIAuyYwwhe2_x7RTITsRm_7NPxOBmoauCHi8vcqnt9GdZsuFeykBz1KZ_4GdFDtwvmJkst26cNoQOaO1a2r2UaSd7z_5xVGA-g7r5h6iqmS6mz1ViY9rlDjC/s1600/Screenshot-synapse-1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="215" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi7ILM7clPjAFRr_cmVGodONIAuyYwwhe2_x7RTITsRm_7NPxOBmoauCHi8vcqnt9GdZsuFeykBz1KZ_4GdFDtwvmJkst26cNoQOaO1a2r2UaSd7z_5xVGA-g7r5h6iqmS6mz1ViY9rlDjC/s320/Screenshot-synapse-1.png" width="320" /></a></div><br />
<b><i>Acetyl... what?</i></b><br />
I'm glad you agree that the release codename is just awesome, and besides that it's also a name of a neurotransmitter which transmits signals across synapse. But other than that it's an alias for Synapse 0.2.0.<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjMFxxrDaubV-q1g5Y3hr0e57349DwYmXGJi69Eg0s3PZ97Oc11yFa8TTbdWE9iDw-YXDXJJjdE5o47hRBSrJeFa55YNYve6ixsuyhjb6_BZKH1Pw7fxRb3gx2hmWqdASZnTQqhLRNFmEpI/s1600/Screenshot-synapse.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="197" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjMFxxrDaubV-q1g5Y3hr0e57349DwYmXGJi69Eg0s3PZ97Oc11yFa8TTbdWE9iDw-YXDXJJjdE5o47hRBSrJeFa55YNYve6ixsuyhjb6_BZKH1Pw7fxRb3gx2hmWqdASZnTQqhLRNFmEpI/s320/Screenshot-synapse.png" width="320" /></a></div><br />
<br />
<b><i>How does it find stuff?</i></b><br />
Using plugins of course - currently the development was focused primarily around using Zeitgeist for the searches, and there are even plugins that process the output from the Zeitgeist plugin and either try to improve the results, or find similar files on the filesystem (for example the Hybrid search plugin).<br />
Still, all of the functionality is based on plugins, so further development can lead anywhere.<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi9NC0U7efj1YgC3o8MzBb2xkZ-4l4vVBlOm3Qg84Mp9lXdbllF0VHzfbdigaU6mSInADQab3_aXzaw-gxBlfmkmzyfzi011OonsHGDIktb2DKoEGXDAoeqJx88QWy8YUvIzQrk8IHn9kQJ/s1600/Screenshot-Synapse+-+Settings.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="288" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi9NC0U7efj1YgC3o8MzBb2xkZ-4l4vVBlOm3Qg84Mp9lXdbllF0VHzfbdigaU6mSInADQab3_aXzaw-gxBlfmkmzyfzi011OonsHGDIktb2DKoEGXDAoeqJx88QWy8YUvIzQrk8IHn9kQJ/s320/Screenshot-Synapse+-+Settings.png" width="320" /></a></div><br />
<br />
<b><i>What plugins are available in </i></b><i>Acetylcholine</i><b><i>?</i></b><br />
Current version ships with these plugins:<br />
<ul><li>Applications - searches your desktop files</li>
<li>Banshee - allows you to play/enqueue music files in Banshee</li>
<li>Commands - runs any command (ie. "sudo apt-get update")</li>
<li>Devhelp - search documentation using Devhelp</li>
<li>Dictionary - find definitions of words</li>
<li>Directory search - allows opening of commonly used directories</li>
<li>Gnome session - log out, shut down, restart</li>
<li>Hybrid search - complete Zeitgeist results by searching for similar files</li>
<li>Rhytmbox - play/enqueue music files in Rhythmbox</li>
<li>UPower - suspend & hibernate your computer</li>
<li>Zeitgeist - search anything logged by Zeitgeist</li>
</ul><i><b>How to get it?</b></i><br />
You can either download <a href="http://launchpad.net/synapse-project/0.2/0.2.0/+download/synapse-0.2.0.tar.gz">the tarball</a> from Launchpad. Or if using Ubuntu (Lucid/Maverick) add <b>ppa:synapse-core/ppa</b> to your sources and install "synapse" via the package manager. Please note that you need "zeitgeist-fts-extension" (and of course zeitgeist itself - preferably with as many dataproviders as possible) to experience it the way it was meant to be. :)<br />
<br />
Please feel free to <a href="https://bugs.launchpad.net/synapse-project/+filebug">report bugs</a>, <a href="https://answers.launchpad.net/synapse-project">ask questions</a>, or talk to us in #synapse on freenode.<br />
<br />
<i><b>I want my app to provide results for Synapse!</b></i><br />
The easiest way to do that would be to push data to Zeitgeist (or at least to recently-used) and you've got Synapse integration for free. If you need something more complex, we'll welcome your plugin. ;)<br />
<br />
And before I wrap this post up, I want to thank everyone involved in the development - especially <a href="https://launchpad.net/%7Ealbyrock87">Alberto</a>, who implemented the beautiful UI and designed most of the themes; then <a href="http://seilo.geekyogre.com/">Seif</a>, who (after finding out about the project, despite me trying to keep it a secret from him) helped a lot to steer it in the right direction and also came up with this great name; <a href="http://www.design-by-izo.com/">Izo</a> who contributed us the icon and logo; and also all of our early beta testers (especially <a href="http://www.grillbar.org/wordpress/">Mikkel</a>, who had multiple good points and <a href="http://anotherugly.wordpress.com/">Ketilwaa</a>, great idea with the codenames).mhr3http://www.blogger.com/profile/05059602092762087621noreply@blogger.com22tag:blogger.com,1999:blog-5662148629346975559.post-37402738221854430422010-11-16T17:53:00.001+01:002010-11-16T18:10:35.781+01:00Did you ever wonder...?how does a certain application do it's widget hierarchy in Gtk? Well lately I did, and therefore I wrote a little class that visualizes the allocation of the widget under your mouse (plus it's container). Add a little hacking with the dynamic linker and you get a small utility to inspect the widgets in (almost) any application. Take a look:<br />
<br />
<iframe src="http://player.vimeo.com/video/16891813" width="400" height="300" frameborder="0"></iframe><p><a href="http://vimeo.com/16891813">Gtk+ Inspector</a> from <a href="http://vimeo.com/user3758959">Michal Hruby</a> on <a href="http://vimeo.com">Vimeo</a>.</p><br />
Unfortunately it's not perfect - atm it doesn't handle inner GdkWindows very well (as you can see in the video when I hover the GtkScrolledWindow), but maybe it could be easily fixed, I didn't really try as I didn't need that.<br />
Also it doesn't work on just any application, I hooked the instantiation of my highlighting class to gtk_init(), so if your application doesn't call gtk_init(), it won't work (I'm afraid that also applies to all pygtk apps). Still, you can just compile your app with the Inspector class and instantiate it yourself.<br />
<br />
Hopefully this will be useful for more people, so to see/grab the code, go to <a href="https://code.launchpad.net/%7Emhr3/+junk/inspector">https://code.launchpad.net/~mhr3/+junk/inspector</a>. And once you compile the .so file, run your favourite app using "LD_PRELOAD=./inspector.so [your_app]".mhr3http://www.blogger.com/profile/05059602092762087621noreply@blogger.com6tag:blogger.com,1999:blog-5662148629346975559.post-60280118493814164162010-08-01T22:34:00.002+02:002010-08-01T23:02:54.513+02:00Experimenting NL-style...For the past few days I was (besides watching GUADEC talks) experimenting a little with Zeitgeist and natural language processing... or sort of anyway. Having no real prior knowledge in NL field and not using any of the existing NLP libraries (as I couldn't find anything in C), definitely made it interesting, but also made me realize that NLP is really hard (even though I only wanted to get a very specific app to work) and taking this path most likely isn't a way to get somewhere.<br />
<br />
But anyway, the original idea was to make an algorithm which would take a natural language query and "compile" a Zeitgeist event template from it. This would make it possible to basically ask questions about stuff you did on your computer (not necessarily in a question-form) and get results back from Zeitgeist. The way I did the algorithm was very easily pluggable into any ZG application, so of course I tried it with our lovely Sezen search applet, and on the following screenshots you can see it in action:<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjnxBPKBTqKlVoCNHyfsJYLvcSXkMvYJWrfAhJ2orCUeTc922l2L43yRmw8lOdGpPn-7jb7mEUECcmzuNP0uqDvG9AgoprhPHAaRUCcsOM6cL2aXtZqJu1AIX0wBxlSIBhtgRFOaEg-iaDp/s1600/sezen-modified-week-ago.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjnxBPKBTqKlVoCNHyfsJYLvcSXkMvYJWrfAhJ2orCUeTc922l2L43yRmw8lOdGpPn-7jb7mEUECcmzuNP0uqDvG9AgoprhPHAaRUCcsOM6cL2aXtZqJu1AIX0wBxlSIBhtgRFOaEg-iaDp/s320/sezen-modified-week-ago.png" /></a><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhRB-a_Z0kpzTR6rADFTvYFAlqVwR18zqko15qjWC_ZuIotL20M-dON9NY3LIt64MDe0VvtqlcFClbymd8DBl1f_XQ1S5-DGLjHG6OB5chgQk0cBMJTF8W99Mp5VxZj46THXzXXIzVfklnh/s1600/sezen-web-wednesday.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhRB-a_Z0kpzTR6rADFTvYFAlqVwR18zqko15qjWC_ZuIotL20M-dON9NY3LIt64MDe0VvtqlcFClbymd8DBl1f_XQ1S5-DGLjHG6OB5chgQk0cBMJTF8W99Mp5VxZj46THXzXXIzVfklnh/s320/sezen-web-wednesday.png" /></a><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgHNuAeDTw-gV5bka-4It4IE4TDD8PSpoGHEfFJtPbg5tz5ZzG-dasIZoqYurWpwDbjBVnDdOTzs0I331b5Dzt7bfjMJA7G9Ip4NzYakMushUmuQSrq5ZkGoQXLmVTsMW_gTVNGjH49kpRw/s1600/sezen-music-today.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgHNuAeDTw-gV5bka-4It4IE4TDD8PSpoGHEfFJtPbg5tz5ZzG-dasIZoqYurWpwDbjBVnDdOTzs0I331b5Dzt7bfjMJA7G9Ip4NzYakMushUmuQSrq5ZkGoQXLmVTsMW_gTVNGjH49kpRw/s320/sezen-music-today.png" /></a></div><br />
If you for some reason don't see the images, there are queries like "music played today", "web pages accessed on wednesday" and "files modified 1 week ago". Those are basically types of strings that my simple engine is able to process right now (besides simple queries like "movies", "vector images", etc.)<br />
<br />
I won't deny that all this work got inspired by seeing screenshots for the "Storage" project which Siegfried dug out from somewhere. And even though it seems to be long abandoned and dead, I'd still love to see its sources, but unfortunately I couldn't find them anywhere... But if you know about an URL where it still lives, please give me a shout. ;)<br />
<br />
Also, if nothing else, this work led to a patch for Vala which fixes up bindings for N-ary trees, so soon one will be able to finally use the N-ary trees' datatypes present in glib, without having to reimplement it in Vala.mhr3http://www.blogger.com/profile/05059602092762087621noreply@blogger.com3tag:blogger.com,1999:blog-5662148629346975559.post-73702523446911225242010-07-18T17:05:00.000+02:002010-07-19T10:44:32.190+02:00More on Sezen panel appletThere has been quite some work on both Sezen and the panel applet since my last post, and here's what's new on that front:<br />
<br />
We went through quite a few design iterations of the applet, here is the evolution:<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh6VuHLN9S0v43urGWCvRARYx20aSgfIXT368lF6PMssO_Ua-dt7p_gKXkmd8HWj50a1eZXp9DMocXeoEmOL4OWIgTKMkDmHe-i04nudJq4ik7busDjNvarWzngMeNOQoBYC5KldJmLTbld/s1600/Screenshot-3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh6VuHLN9S0v43urGWCvRARYx20aSgfIXT368lF6PMssO_Ua-dt7p_gKXkmd8HWj50a1eZXp9DMocXeoEmOL4OWIgTKMkDmHe-i04nudJq4ik7busDjNvarWzngMeNOQoBYC5KldJmLTbld/s320/Screenshot-3.png" /></a><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgoVzOAnliLbWHxoy5lZBPRUT3GIgcnHtOv1_W17K0k_bhXLdYQiWxjmis9IBKgX34DiuXTdA-2zsYT7j0mz2VJJEMWJOqv5qJE3BEhb0nUcEbnHLoSBfAYaGKFXoGfw3UppuEu_pN0gB-r/s1600/Screenshot-4.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgoVzOAnliLbWHxoy5lZBPRUT3GIgcnHtOv1_W17K0k_bhXLdYQiWxjmis9IBKgX34DiuXTdA-2zsYT7j0mz2VJJEMWJOqv5qJE3BEhb0nUcEbnHLoSBfAYaGKFXoGfw3UppuEu_pN0gB-r/s320/Screenshot-4.png" /></a><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg7C1mmQLW9Xs4VV-Gou6m-Bbd6Pu62wIIjLFdUhaZ4ijJEvDH-vfrkXbaMTc1q0IzKb9BSEYYGrTWYUfuj5MC9KDZKb2oX1Vt1sur1LLWkrCSVYX22ahh6fRf_krEzCDjVWzWcpQntQvXF/s1600/Screenshot-6.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg7C1mmQLW9Xs4VV-Gou6m-Bbd6Pu62wIIjLFdUhaZ4ijJEvDH-vfrkXbaMTc1q0IzKb9BSEYYGrTWYUfuj5MC9KDZKb2oX1Vt1sur1LLWkrCSVYX22ahh6fRf_krEzCDjVWzWcpQntQvXF/s320/Screenshot-6.png" /></a><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiPiIiFBC81T06bkJZXYwPV6Tv1IeUBSrJ1XlowEeh5RqkFM8BHlYODKks08onuCynb372XXPO5BAmfcBkPFDTkUA2ricdk10C4EcdzHsKWZIDFBDTfalwiqkbtOcSYiW_v6F31a59TK0Sr/s1600/Screenshot-8.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiPiIiFBC81T06bkJZXYwPV6Tv1IeUBSrJ1XlowEeh5RqkFM8BHlYODKks08onuCynb372XXPO5BAmfcBkPFDTkUA2ricdk10C4EcdzHsKWZIDFBDTfalwiqkbtOcSYiW_v6F31a59TK0Sr/s320/Screenshot-8.png" /></a><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjc-4SEH9vGbUMH07YH8XEoTvzTZrxn8aQDAXQKfE4kSS8Y5A1gdRQ-DbKCCn474a_e6evarNzGREdsm_pMnusEEzSAgB-TKIyFv0RvqEhMM-2jnyF-mKo8u-dQHrJtsPJ81FUf-vQLAnci/s1600/Screenshot-9.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjc-4SEH9vGbUMH07YH8XEoTvzTZrxn8aQDAXQKfE4kSS8Y5A1gdRQ-DbKCCn474a_e6evarNzGREdsm_pMnusEEzSAgB-TKIyFv0RvqEhMM-2jnyF-mKo8u-dQHrJtsPJ81FUf-vQLAnci/s320/Screenshot-9.png" /></a><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj7QNEjhWC7aLnsSmOqJKp2Y3K8bchJt1bz44D8j1KqXRklipiSZIEQqtWQFQy5XeaMA5HNEcjq9OkxNSSoPZiKHaRth_cLClsl4r7FT1m4OUwt8q3DU4UZckyRBbDbgLl8PNCXObIjCwOj/s1600/Screenshot-11.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj7QNEjhWC7aLnsSmOqJKp2Y3K8bchJt1bz44D8j1KqXRklipiSZIEQqtWQFQy5XeaMA5HNEcjq9OkxNSSoPZiKHaRth_cLClsl4r7FT1m4OUwt8q3DU4UZckyRBbDbgLl8PNCXObIjCwOj/s320/Screenshot-11.png" /></a></div>At first, we had the main Sezen widget which was stuffed in a menu, but as I mentioned in my previous post, I found this sub-optimal, as navigating in menu is not the same as doing so in a standalone window, and therefore I wanted the browser-like menu, which came to life in the third iteration, but the problem with it was that even though we had thumbnails (though not in the image), they were totally unhelpful, as they were too small. So the fourth iteration introduced three rows of text per each item, which allowed a big thumbnail on the right, but then some items had only one icon on the left, some had one on left and one on the right, and this just felt weird, so I tried to remove the icons from the left and have all of them on the right, but as you can see in the fifth image, this also doesn't look right, so the idea of thumbnails on the right was abandonded, and we ended up with medium-sized thumbnails on the left as you can see in the last image.<br />
<br />
There are still a few loose ends in the applet (clicking on the scroll bar doesn't work most of the time, since scrollbar was never meant to be inside menu, and therefore isn't trivial to fix), and it could also use a global hotkey to popup the search. But even now I find it very usable if one has enough stuff logged by Zeitgeist.<br />
<br />
Since Seif still thought that standard Sezen window is the way to go (with which I obviously don't agree), there's also another version of the applet, which just opens undecorated Sezen under the menu item position:<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgqibhTDd2QVkT2_U3hF7vT_plazCtoBrlmxN7aDRO7U9LAeZ3dJO6wIM25MUPHI8MsH8Wbxp8XmhPeRb1AJ726iGNz3ccYTMCwrPqx4HEJSQfEO95nuRdEsYA786fSRITtOjC3YuC2yS6d/s1600/4ax.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgqibhTDd2QVkT2_U3hF7vT_plazCtoBrlmxN7aDRO7U9LAeZ3dJO6wIM25MUPHI8MsH8Wbxp8XmhPeRb1AJ726iGNz3ccYTMCwrPqx4HEJSQfEO95nuRdEsYA786fSRITtOjC3YuC2yS6d/s320/4ax.png" /></a></div>And yea, I agree that it looks nice (especially with elementary theme), but is practically unusable only with keyboard, which I find a deal breaker (also it doesn't close if you click some other window... though this could be implemented, standard menu does it automatically).<br />
<br />
Now I wonder about the future of the applet, should we try to fix the issues it has and push it upstream, or turn it into a widget which any app can use (it'd just tell us which mimetypes it's interested in and it would augment the "Open file" function). Also which version is really better? (but please judge by using them, not by looking at the screenshots)<br />
<br />
Links to get the code:<br />
<a href="https://code.launchpad.net/%7Eelementaryart/gnome-applets/sezen">https://code.launchpad.net/~elementaryart/gnome-applets/sezen</a><br />
<a href="https://code.launchpad.net/%7Eelementaryart/gnome-applets/sezen2">https://code.launchpad.net/~elementaryart/gnome-applets/sezen2</a><br />
<br />
To install you need to get the branch, its dependencies and run:<br />
<div style="font-family: "Courier New",Courier,monospace;"><span class="status-body"><span class="status-content"><span class="entry-content">./autogen --prefix=/usr && cd sezen && make && sudo make install</span></span></span></div><div style="font-family: inherit;">Of course you should substitute the "sudo make install" with your distro's equivalent.</div><div style="font-family: inherit;"><br />
</div><div style="font-family: inherit;">PS. For those interested here's my GSoC report for this week: <a href="http://mail.gnome.org/archives/gnome-soc-list/2010-July/msg00050.html">http://mail.gnome.org/archives/gnome-soc-list/2010-July/msg00050.html</a></div>mhr3http://www.blogger.com/profile/05059602092762087621noreply@blogger.com7tag:blogger.com,1999:blog-5662148629346975559.post-26779313818322239562010-07-04T03:00:00.001+02:002010-07-04T03:41:29.686+02:00Sezen in your panel aka GSoC report #6As the reports themselves are quite boring for many people, I'll try to post on the blog more interesting stuff, so it will no longer be a direct copy of the message sent to gnome-soc-list. So let's give it a try...<br />
<br />
People who read my reports know that lately I've been working on Sezen (if you haven't heard about this awesome piece of software using Zeitgeist go see a couple of videos at <a href="http://seilo.geekyogre.com/">Seif's blog</a>), where both Seif's python version and mine Vala version is receiving lots of love - Seif started to use Mikkel's FTS extension for the search, I didn't do this yet (as the FTS extension might not be installed), but I improved the search we had and now it's no longer that stupid (ie doesn't treat everything as exact phrase search, instead supports "quoted phrase search").<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiwBVXeMME43xyFvODePSr6Vr4ioA7oWe-ImyxSQ08uNy2QlUXYeWb_dJUhNBcxS392ZPBmdzYJro_7CB2_YuyQv3xsLE5AkLgKOI4HL-XmSJTUCO_DXCuxtFnBbcRZf72X6TDyEW1wAopV/s1600/sezen2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiwBVXeMME43xyFvODePSr6Vr4ioA7oWe-ImyxSQ08uNy2QlUXYeWb_dJUhNBcxS392ZPBmdzYJro_7CB2_YuyQv3xsLE5AkLgKOI4HL-XmSJTUCO_DXCuxtFnBbcRZf72X6TDyEW1wAopV/s320/sezen2.png" style="border: 0px none;" /></a></div><br />
But as you could notice from the title of this post, we went further and tried to integrate sezen into gnome-panel via an applet, and this is how far I got:<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEicpe8UXAOx2GpM3dCjIHrGA8njnQpS-hAeucz8I9rYmh8hyphenhyphenPO6dnhfNtxUQGNVqzpn-hxGeE1BqSSV-zzSqYAT3l2_zeJPeXJEpUCpMJc7wehqOuzM4poxVnGCN-FhquTK0KO-xOLMyxS4/s1600/sezen-panel-applet.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEicpe8UXAOx2GpM3dCjIHrGA8njnQpS-hAeucz8I9rYmh8hyphenhyphenPO6dnhfNtxUQGNVqzpn-hxGeE1BqSSV-zzSqYAT3l2_zeJPeXJEpUCpMJc7wehqOuzM4poxVnGCN-FhquTK0KO-xOLMyxS4/s320/sezen-panel-applet.png" /></a></div>At first Seif wanted to show the full sezen window also in the panel applet, but I wanted to try more "panely" look and feel and therefore went this way. Not to mention the challenge it was to get the Entry and the scrollable IconView widgets to work inside a menu (thank you Gtk for this unforgettable experience, you won a few battles, but I gotcha anyway).<br />
If you're thinking now that it doesn't look as blingy as standalone Sezen I have to agree, but I still think that it has more integrated look with the rest of the panel and is already quite usable. I've been thinking where we could take this and I keep looking at this:<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgsfwaJDHv8s_zYDD25P7D6nZJjMRwOcfmqzvWjs54J4j5eM0mKRvjxuh098gScDa8KLSbY7C9-sBwv9YVrZgVbgCVynMqzKdEvKcO8fcT3ub9CLw6Hh6WdY0u_g1oR6G73slddpkdgKAxt/s1600/omnibar.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgsfwaJDHv8s_zYDD25P7D6nZJjMRwOcfmqzvWjs54J4j5eM0mKRvjxuh098gScDa8KLSbY7C9-sBwv9YVrZgVbgCVynMqzKdEvKcO8fcT3ub9CLw6Hh6WdY0u_g1oR6G73slddpkdgKAxt/s320/omnibar.png" style="border: 0px none;" /></a></div><br />
Wouldn't it be cool to have this kind of widget on your panel allowing you to start working with anything ZG knows about? What do you think?<br />
<br />
For those who are interested, you can also read <a href="http://mail.gnome.org/archives/gnome-soc-list/2010-July/msg00007.html">my official GSoC report #6</a>.mhr3http://www.blogger.com/profile/05059602092762087621noreply@blogger.com8tag:blogger.com,1999:blog-5662148629346975559.post-27689752637404012252010-06-27T18:22:00.000+02:002010-06-27T18:23:33.447+02:00GSoC: Zeitgeist weekly report #5Hey there!<br />
<br />
Another report here with a look-back at what I did this week and what is planned for the next week, so here we go:<br />
<ul><li>I started to write a Totem plugin which allows searching for recent media logged in Zeitgeist, so far it's very similar to the Youtube plugin (probably because I borrowed the UI from there), but it indeed does search Zeitgeist. There were a few pecularities with the plugin, so I'll rant here a bit about the documentation - if TotemVideoList requires a reference to TotemObject, it'd be nice to mention this in the documentation - it's far from obvious that one needs to call g_object_set (video_list, "totem", totem_obj, NULL) for it to not crash when one clicks on an item in the widget. Then there were some other crashes when I didn't set "tooltip-column" property, but ok, that one wasn't that hard to figure out.<br />
The plugin was pushed to zeitgeist-dataproviders[1], but as Seif said, it's not a dataprovider, so he removed it from there, and so far I do not know where we'll push these non-logging plugins. Anyway it's there but you have to revert to revision 78.</li>
<li>I helped Seif with Sezen, cause I got quite different data and it was loading very slowly for me - so I tried to use everywhere async gio calls, and after some tweaking it was working much better. <span class="fn">Btw. Siegfried just pushed Sezen to Zeitgeist PPA [2], so feel free to check it out.</span></li>
<li><span class="fn">I was still quite unhappy with the responsiveness of Sezen, so I ported it to Vala [3], but to my surprise the thumbnail fetching in the Vala version is *much* slower than in the python version and I don't really know why. In both python and Vala, I'm trying to load all the thumbnails at once, and while in python this works fine, I was getting "too many open files" error in Vala, so I introduced an async method which limits how many thumbnails can be being fetched at one time (while the others are waiting) and that seems to work quite well, but I still have a feeling that the python version is faster.</span></li>
</ul><span class="fn">For next week the plan is to implement also "related media" into the new Totem plugin, take a look on the vim logger, which I noticed is sitting on LP without being "official" part of zeitgeist-dataproviders. And talk to Seif what to do about Sezen / Sezen-vala.</span><br />
<br />
<span class="fn">[1] https://code.launchpad.net/~zeitgeist-dataproviders/zeitgeist-dataproviders/trunk</span><br />
<span class="fn">[2] https://launchpad.net/~zeitgeist/+archive/ppa</span><br />
<span class="fn">[3] https://code.launchpad.net/~mhr3/sezen/sezen-vala</span>mhr3http://www.blogger.com/profile/05059602092762087621noreply@blogger.com2tag:blogger.com,1999:blog-5662148629346975559.post-66530372989037558822010-06-19T11:15:00.000+02:002010-06-20T23:53:52.910+02:00GSoC: Zeitgeist weekly report #4Hey everyone, this week the report will be very short, cause as I mentioned in last week's report I was (and still am) travelling, and in the little spare time I had, the internet connection was very flaky, so unfortunatelly I wasn't able to do much.<br />
<br />
I updated the existing plugins to work with libzg 0.2 (as there were some API breaks) and I started to write a totem plugin which will show media grabbed from Zeitgeist, but in the process I encountered a very strange bug in (by that time latest) libzeitgeist, where the timestamps were truncated to 32 bits even though everything was correctly declared as gint64. This of course caused that no results were fetched from Zeitgeist - as the timestamp limited the results till the end of 1970s, and of course I don't have any such events in my DB. Anyway I wrote Mikkel about this bug with a gdb trace and he was able to hunt it down and fix it (fixed in libzg 0.2.1).<br />
<br />
For next week I plan to finish the totem plugin and as planned for this week, I'll stop by in #rhythmbox and try to polish and fix the strange bugs in our new Rhythmbox plugin.mhr3http://www.blogger.com/profile/05059602092762087621noreply@blogger.com0tag:blogger.com,1999:blog-5662148629346975559.post-74921261276895775192010-06-11T00:41:00.000+02:002010-06-17T17:08:25.039+02:00GSoC: Zeitgeist weekly report #3Hello,<br />
<br />
I'll be also a bit early this week, as I'll be traveling starting tomorrow, so here we go:<br />
<br />
This week I finished moving the build system in zeitgeist-dataproviders[1] to autotools, and even though it's not perfect yet (can't install properly firefox and chrome extensions, mostly because I don't know where to put them in the filesystem for it to just work), it's good enough to build all dataproviders. Also if anyone wants to make a package of the dataproviders, please contact me, I think it's time to do it.<br />
<br />
Further I had planned to write a totem extension, which would add some Zeitgeist goodness into it, but in the end this was postponed and instead I wrote a Rhythmbox plugin that adds a few smart playlists to Rhythmbox. This effort was slightly hindered by incomplete Rhythmbox bindings for Vala, but I decided to fix this and auto-generated the Vala bindings for pretty much the entire Rhythmbox, which really wasn't as easy as I expected, but it's now available on bugzilla[2].<br />
Unfortunately I'm seeing some issues with the plugin - for example first time it's loaded it doesn't show anything, even though I am getting the data from Zeitgeist and calling RB's method to add them. I'll have to ask someone who knows the internals of RB why is that...<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjfMnCkBdbXDdLjSTkgMlIbxgSzkiMoaR5o982V8BxruHV_FPUFlhXYYFZVO1y1yZsRWxnQqKtAf5pLLOUetV1BIKzBZN-aYGlCfi7clRRMrw-aBn1aydJqAH-FgMH4DyeQQugLpqdxC5Jk/s1600/Screenshot-Rhythmbox.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjfMnCkBdbXDdLjSTkgMlIbxgSzkiMoaR5o982V8BxruHV_FPUFlhXYYFZVO1y1yZsRWxnQqKtAf5pLLOUetV1BIKzBZN-aYGlCfi7clRRMrw-aBn1aydJqAH-FgMH4DyeQQugLpqdxC5Jk/s320/Screenshot-Rhythmbox.png" /></a></div><br />
<br />
Also today Mikkel pushed some changes to libzeitgeist[3], so while looking at it, I discovered a little patch which was forgotten in my tree, and besides that I was trying to push some Vala goodness for the new API (foreach support), but I wasn't successful at convincing Mikkel that he needs to change the API a bit... yet :)<br />
<br />
So that's about it, for the next week I don't plan much, as I'll be still traveling, but I hope to find some time to polish the new RB plugin, and if I find more time I'll take a stab at the Totem plugin.<br />
<br />
Cheers.<br />
<br />
[1] <a href="https://code.launchpad.net/zeitgeist-dataproviders">https://code.launchpad.net/zeitgeist-dataproviders</a><br />
[2] <a href="https://bugzilla.gnome.org/show_bug.cgi?id=621246">https://bugzilla.gnome.org/show_bug.cgi?id=621246</a><br />
[3] <a href="https://code.launchpad.net/libzeitgeist">https://code.launchpad.net/libzeitgeist</a>mhr3http://www.blogger.com/profile/05059602092762087621noreply@blogger.com0tag:blogger.com,1999:blog-5662148629346975559.post-5527836567705161462010-06-05T12:58:00.002+02:002010-06-06T21:03:18.645+02:00GSoC: Zeitgeist weekly report #2Hey!<br />
<br />
As planned, this week I finished our new Chrome extension together with the NPAPI plugin. In the end the javascript part of the extension didn't turn out to be as straightforward as I expected, but using some not-so-nice hacks it does what it's supposed to do. After I finished the Chrome extension I tried to make our new totem plugin using libzeitgeist build out of totem's tree, and fortunately this was easier than I thought it would, so it's done now and I also got some time to start to revamp the build system in zeitgeist-dataproviders [1], and even though now it's a strange mix of autotools in the top source directory and our own Makefiles in the plugin dirs, it works and currently provides the ability to detect which plugins can be build and it builds only those (note that it's incomplete, but the framework is there).<br />
<br />
Plan for the next week is to move the whole build system to autotools, with the ultimate goal of making it possible to build packages of the dataproviders. Once that is done, I'll start to write another totem plugin, this time one which will pull data from ZG and therefore will add some UI elements to totem. Stay tuned ;)<br />
<br />
Note to self: maybe I'm too spoiled by python, but this just doesn't work in JS (at least not when writing Chrome extension), even though there's no warning/error:<br />
<pre class="javascript" name="code">if (condition) {
function callback () {
console.log("You'll never see this");
}
document.addEventListener("event", callback, false);
}</pre><br />
[1] <a href="https://code.launchpad.net/zeitgeist-dataproviders">https://code.launchpad.net/zeitgeist-dataproviders</a><br />
<span style="font-family: "Courier New",Courier,monospace;"><br />
</span>mhr3http://www.blogger.com/profile/05059602092762087621noreply@blogger.com3tag:blogger.com,1999:blog-5662148629346975559.post-8511421472398694252010-05-28T22:41:00.001+02:002010-05-29T13:18:23.259+02:00GSoC: Zeitgeist weekly report #1Hey everyone!<br />
<br />
This week I've been busy with traveling and moving, but during the past few days I finally managed to work, so here's what I did:<br />
<br />
I started implementing Zeitgeist dataprovider for Chrome (using NPAPI), but this turned out to be quite hard, as after the initial implementation the plugin was working fine in Firefox, but didn't want to show up in Chrome, there weren't any error messages and strace didn't even show Chrome trying to open the dynamic library (and strace -f was hanging)... So it was quite "fun"! Anyway today I managed to make it work and now we have a first version of Chrome extension!<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEib8AMp_eL7iKw9SbH_Z0k5HLda0qsI8iB5xylTO5MZkNNVErSKTIP0p2fNM_thvHfd0HGoLmLSz_BcWpH38t54vdfQmH3PKRTDQZmxlqepZYcxznEKHIn6Yf9pGvV0AOmWmOLXtffqxiYz/s1600/Screenshot-Extension.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEib8AMp_eL7iKw9SbH_Z0k5HLda0qsI8iB5xylTO5MZkNNVErSKTIP0p2fNM_thvHfd0HGoLmLSz_BcWpH38t54vdfQmH3PKRTDQZmxlqepZYcxznEKHIn6Yf9pGvV0AOmWmOLXtffqxiYz/s320/Screenshot-Extension.png" /></a></div><br />
Plan for next week is:<br />
<ul><li>finish the Chrome extension, so it doesn't send multiple events for one website visit as it does now... Also does anyone know how to get document mime-type in Chrome?</li>
<li>if time allows, I'll try to make our new Totem extension to build out of totem tree, which might not be that easy to do (actually I'm not sure it's even possible)</li>
</ul>mhr3http://www.blogger.com/profile/05059602092762087621noreply@blogger.com5tag:blogger.com,1999:blog-5662148629346975559.post-89687488925242922462010-05-24T00:06:00.001+02:002010-05-24T00:08:35.949+02:00Let's make users' lives easier!Zeitgeist can already make users lives really easy (see my last Awn + Zeitgeist post), but we don't have to stop there, one of things I'd really like to see would be if applications helped us with this - if the apps expose which URI they are currently working with (which file is currently open / web page currently viewed / ...) we can make very precise queries as to which other files (or contacts, web pages, applications etc.) are related to this URI.<br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEivRW2EobYGwN0iGUaPi5WwjkG9SfD9mVx4J-gwJGSwsxm6ZPJ71PZOTpqIDCdMEMT8vaCfocuGiVb3gLjjpLVThdkGr7WX6n2AWOzYKpdekjZ-x56Yb3oUhL0n29K3QFGl1b7ruZG81_Ks/s1600/zeitgeist-logo.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" style="border: 0px none" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEivRW2EobYGwN0iGUaPi5WwjkG9SfD9mVx4J-gwJGSwsxm6ZPJ71PZOTpqIDCdMEMT8vaCfocuGiVb3gLjjpLVThdkGr7WX6n2AWOzYKpdekjZ-x56Yb3oUhL0n29K3QFGl1b7ruZG81_Ks/s320/zeitgeist-logo.png" /></a>As everyone likes examples imagine that you're working with a spreadsheet and zeitgeist knows that the last time you were working with it you were checking <i>www.sitewithstats.com</i>, had <i>last_years_report.pdf</i> open and were talking to <i>xyz</i>. Therefore it will provide you these options in some kind of menu (or dock / indicator / windicator). Wouldn't it be great?<br />
<br />
To make this possible I suggest new X property for windows (let's say it'd be "<i>_NET_WM_CURRENT_URI</i>") and the only thing required by the apps is to set this property when a file is opened and update it when appropriate. If people like this idea I can prepare a patch for gdk (adding <i>gdk_window_set_current_uri_hint</i>) and libwnck (which would expose the property for pagers). Or perhaps there is already something similar what I missed?<br />
<br />
Comments?mhr3http://www.blogger.com/profile/05059602092762087621noreply@blogger.com9tag:blogger.com,1999:blog-5662148629346975559.post-90617182818925469852010-05-06T23:09:00.005+02:002010-05-07T09:41:57.240+02:00Awn + Zeitgeist = enhance your workflowPeople say that image is worth thousand words, so take a look at this video instead of me saying all those words:<br />
<br />
<object height="300" width="400"><param name="allowfullscreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=11534414&server=vimeo.com&show_title=1&show_byline=1&show_portrait=0&color=&fullscreen=1" /><embed src="http://vimeo.com/moogaloop.swf?clip_id=11534414&server=vimeo.com&show_title=1&show_byline=1&show_portrait=0&color=&fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="400" height="300"></embed></object><br />
<br />
Under the hood there's Awn's window to desktop file matching backed by <a href="https://launchpad.net/wncksync">wncksync</a> (if available). And of course Zeitgeist with a couple of extensions which I'm currently working on.<br />
<br />
Before anyone asks, this <strike>isn't yet pushed anywhere</strike> is now available in a separate awn-extras branch (<a href="https://code.launchpad.net/%7Emhr3/awn-extras/zeitgeist-applet">https://code.launchpad.net/~mhr3/awn-extras/zeitgeist-applet</a>), and will be merged to awn-extras trunk once there's an official release of libzeitgeist and everyone (read awn-testing PPA users) will be able to play with it.mhr3http://www.blogger.com/profile/05059602092762087621noreply@blogger.com18tag:blogger.com,1999:blog-5662148629346975559.post-35225903002078802042010-04-27T23:28:00.002+02:002010-04-27T23:53:43.453+02:00Accepted to GSoC!I was looking at interesting projects where I could participate in Google Summer of Code, and the project that caught my attention was libzeitgeist - a C-based library (with Vala bindings!) wrapping the quite complex DBus interface of Zeitgeist, so I wrote a proposal and even though there were some complications and modifications, it was accepted!<br />
Therefore this summer I'll be spending lots of time making sure that the apps that you regularly use in GNOME will have plugins which talk to Zeitgeist, so it can gather as much context of your activities as possible.<br />
<br />
Thanks to Mikkel and Seif for loads of help already, but be aware guys that it was just the beginning :Dmhr3http://www.blogger.com/profile/05059602092762087621noreply@blogger.com1tag:blogger.com,1999:blog-5662148629346975559.post-27568359813443377632010-04-11T14:35:00.020+02:002010-04-12T12:58:19.100+02:00Awn & Awn-Extras 0.4.0 are out!It's been over 14 months the Awn and Awn Extras teams had interesting news, but the time has come to introduce our latest and so far greatest release. For the past year we've been busy with rewriting our precious dock and making it even more awesome, and today you can see the results of this work. Take a look at this screencast of various Awn settings done by moonbeam - one of our developers:<br /><br /><object height="385" width="480"><param name="movie" value="http://www.youtube.com/v/mHDL4dIH10I&hl=cs_CZ&fs=1&rel=0"><param name="allowFullScreen" value="true"><param name="allowscriptaccess" value="always"><embed src="http://www.youtube.com/v/mHDL4dIH10I&hl=cs_CZ&fs=1&rel=0" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" height="385" width="480"></embed></object><br /><br />Avant Window Navigator is a dock for the Free Desktop which shows your launchers and open applications. It also contains support for extensions, via plugins for third-party applications, which communicate with the dock with DBus, and via applets, which allows for workspace switchers, system trays, clocks, etc., to be embedded in the dock. These applets can be written in Vala, Python or C.<br /><br />Awn Extras is a catch-all project which houses mainly third-party applets for use with Avant Window Navigator.<br /><br />I'm sure you're curious about what's new in this version, so here we go:<ul><li>Awn can be finally positioned on any edge of the screen.</li><li>You can now pick among these background styles: Flat, Edgy, 3D, Curved, Floaty.</li><li>Expanded mode (Awn will cover whole screen width).</li><li>Autohide was completely revamped and Awn now supports Intellihide and Window Dodge modes.</li><li>Loading and crash indicators - no more white lines!<br /><iframe allowfullscreen='allowfullscreen' webkitallowfullscreen='webkitallowfullscreen' mozallowfullscreen='mozallowfullscreen' width='600' height='155' src='https://www.blogger.com/video.g?token=AD6v5dwM6056AvT7IcizP9B_nWhEmORnLJEGU9Qa0IEzpOtL0MesIHZlRxypbdJPwmI_fDnnsMfehTTMtHXuILZqrA' class='b-hbp-video b-uploaded' frameborder='0'></iframe><br /></li><li>Added possibility to change Awn's alignment - you don't have to have it centered.</li><li>Awn tries to blend in with your theme colors by default.</li><li>Added four beautiful themes.<a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEitNGDXtAmhaW3AxABzgguSR5rzDFfAf-LVT07UMCIY-UZTJHDGG_cpev4Ra0ehwEcykaZH7qwhjt_TzprAnurwSCbtoSUWTShOKV3gNSUq_mLWDyutgagBlpRkYlJWNikBBRgx_pWW33qi/s1600/awn-themes.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 182px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEitNGDXtAmhaW3AxABzgguSR5rzDFfAf-LVT07UMCIY-UZTJHDGG_cpev4Ra0ehwEcykaZH7qwhjt_TzprAnurwSCbtoSUWTShOKV3gNSUq_mLWDyutgagBlpRkYlJWNikBBRgx_pWW33qi/s320/awn-themes.png" alt="" id="BLOGGER_PHOTO_ID_5458985985259272338" border="0" /></a></li><li>Most of the icons can be changed by simply dragging an icon file onto them.</li><li>Basic support for environments without compositing (desktop-effects).</li><li>Added simple Preferences applet (drag it to screen edges / different monitors to quickly change Awn orientation).</li><li>Task manager applet now supports grouping of windows.</li></ul><span style="font-style: italic;">For developers we have the following news:</span><ul><li>Awn deprecated its old DBus interface (com.google.<wbr>code.Awn) and uses now new DBus interface (org.freedeskto<wbr>p.DockManager)<wbr>. This new interface should be soon supported by other dock applications and therefore you no longer need to worry that you're writing your plugin for a specific dock.</li><li>For applet developers we have new API, check out the documentation to see what's available (usually libawn-doc package).</li></ul><span style="font-style: italic;">News for packagers:</span><br /><ul><li> Awn now depends on the new <a href="https://launchpad.net/libdesktop-agnostic">libdesktop-anostic</a> library, which provides extensible configuration API, a unified virtual file system API, and a desktop item editor (all with pluggable backends).</li></ul> <span style="font-style: italic;"> Known issues:</span><br /><ul><li>Location of user settings were changed, therefore you'll need to set-up all your preferences again if you're upgrading.</li><li>Themes which were made for previous Awn versions are not compatible.</li></ul><br /><span style="font-weight: bold;font-size:130%;" >Notable changes in Awn Extras:</span><br /><br /><span style="font-style: italic;">New applets:</span><ul><li>YAMA: Yet Another Menu Applet that uses a Gtk+ menu for applications and preferences, has support for places, recent documents, and can lock the screen, logout or shutdown </li><li> Garbage - replaces old Trash applet </li><li> Hardware Sensors </li><li> System Monitor</li><li> Dialect Applet - Keyboard indicator </li><li> SlickSwitcher - a compiz-oriented workspace switcher<br /></li><li>Feeds - fetches data from RSS/Atom / Google reader / Google Wave / Reedit Inbox / Twitter<br /></li></ul><span style="font-style: italic;">Significant changes to existing applets:</span><ul><li> Cairo Clock: loads locations search window much faster </li><li> Mount Applet: rewritten </li><li> Quit Applet: clicking can now either lock the screen, log you out, or shut down the system. You can configure the applet to display a docklet, presenting the 3 actions (lock screen, log out, shut down)<br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjTWKyT4ciA1y8ZopQxygjzvxheu7a-I0XgOvkS8QBjPSMHw6z-JALd70sKjGEMii6J708saCz53Vb9byuMxV0oTQsgVURjoCTf6DMLB2mWjJZnrjJJm96oJISxfZsp6rEU5wyL2JXe3XwB/s1600/quit-docklet.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 50px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjTWKyT4ciA1y8ZopQxygjzvxheu7a-I0XgOvkS8QBjPSMHw6z-JALd70sKjGEMii6J708saCz53Vb9byuMxV0oTQsgVURjoCTf6DMLB2mWjJZnrjJJm96oJISxfZsp6rEU5wyL2JXe3XwB/s320/quit-docklet.png" alt="" id="BLOGGER_PHOTO_ID_5458972431212708626" border="0" /></a></li><li>File-browser-launcher: can display multiple icons<a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiLdD2Q2NO5knlIpsDbAftUzv5vhyphenhyphenxo0OnMBuHf2JCyp-anG5F0MzGAFuoBnfwfLNrd_flKarkiIsijTCy0Ikr5NplUuXHZoXnP79Ml3IRzXOKH5jeYyCZFwG8-chPzvHFlcKXi2Ei_z8wO/s1600/fbl-docklet.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 46px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiLdD2Q2NO5knlIpsDbAftUzv5vhyphenhyphenxo0OnMBuHf2JCyp-anG5F0MzGAFuoBnfwfLNrd_flKarkiIsijTCy0Ikr5NplUuXHZoXnP79Ml3IRzXOKH5jeYyCZFwG8-chPzvHFlcKXi2Ei_z8wO/s320/fbl-docklet.png" alt="" id="BLOGGER_PHOTO_ID_5458972776664457298" border="0" /></a></li><li>Volume Control: uses GStreamer instead of pyalsaaudio </li><li> Weather: support for more icon themes, improvement of the preferences window, and reworked network code (improving the responsiveness of the applet)</li><li>ThinkHDAPS, Volume Control, Weather now use system theme by default and automatically respond to system theme change. </li><li>Cairo menu: rewritten, now allows adding icons for arbitrary menus.<br /></li><li>Media Control: displays album art if available (can be set to use docklet mode)<a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh1XRFLoLay2KXAHQYtLEt-_igC4P0xrFcqkjUcL-5lL2g9O6SUC7yHL_EKSxq1vFg3ameBw3HuHcaUZpYpFEegGnRWE3-32s3UWM346HJ54UrUyTWsb3lA39BQhE66fj2vwuqyFN5HZK5r/s1600/media-control-docklet.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 54px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh1XRFLoLay2KXAHQYtLEt-_igC4P0xrFcqkjUcL-5lL2g9O6SUC7yHL_EKSxq1vFg3ameBw3HuHcaUZpYpFEegGnRWE3-32s3UWM346HJ54UrUyTWsb3lA39BQhE66fj2vwuqyFN5HZK5r/s320/media-control-docklet.png" alt="" id="BLOGGER_PHOTO_ID_5458973193064886418" border="0" /></a></li></ul><br /><span style="font-weight: bold;">How to get these goodies?</span><br /><br />If you're running Ubuntu Lucid, you can just use the software center to get it (search for "avant window navigator"). Packages for older Ubuntu versions should appear within a day or so in <a href="https://launchpad.net/%7Eawn-core/+archive/ppa">awn-core PPA</a>. Packages for other distros will likely appear in a couple of days. Of course you can also <a href="https://launchpad.net/awn/+download">download the release tarballs</a> (<a href="https://launchpad.net/awn-extras/+download">awn-extras</a>, <a href="https://launchpad.net/libdesktop-agnostic/+download">libdesktop-agnostic</a>) and try to <a href="http://wiki.awn-project.org/InstallingFromSource">install from source</a>.<br /><br />And now some screenshots from Awn users:<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh45STA6p1MEXvr2Nc2jPLbXzA_BXfhvs9dKRMD9DFoCNAvinVbHU8PCn-aHEup5yNh5Lu3RKcI8bToLWZjwFKv79UEh8P_qR_kg6aQA6vpvLUPfWbpi9Bb3h78n8dK956QQAaNWSTkBtGt/s1600/EspressoPreivew.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 30px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh45STA6p1MEXvr2Nc2jPLbXzA_BXfhvs9dKRMD9DFoCNAvinVbHU8PCn-aHEup5yNh5Lu3RKcI8bToLWZjwFKv79UEh8P_qR_kg6aQA6vpvLUPfWbpi9Bb3h78n8dK956QQAaNWSTkBtGt/s320/EspressoPreivew.png" alt="" id="BLOGGER_PHOTO_ID_5458982893312591122" title="Espresso theme (available on our forums)" border="0" /></a><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhW2gnkRlBHJ5sEaI5N7qJIEt9UkUgcw3gKypG6FpivFLiUuFy_JDt32M1V-mggAAApjNMKpm5wt2MB-obef58X41dTcCqPcMZRT3pCYjjNBD4ejfN3FeJbeyDgvVc8mfgVA-bHL8mV9sRc/s1600/h4writer.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 215px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhW2gnkRlBHJ5sEaI5N7qJIEt9UkUgcw3gKypG6FpivFLiUuFy_JDt32M1V-mggAAApjNMKpm5wt2MB-obef58X41dTcCqPcMZRT3pCYjjNBD4ejfN3FeJbeyDgvVc8mfgVA-bHL8mV9sRc/s320/h4writer.png" alt="" id="BLOGGER_PHOTO_ID_5458983012883885682" title="Dust theme with customized launcher icons" border="0" /></a><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi_GtxvTpaovopq_rvL58wqL5OgzoSwccCMvBwxXyKYLxo759Lq7gLg7MqYE7gpgdIHQ-jwW7vUygFUgYRzl5rsunHcJEiZtdpta4HBkXYYbiRMyO71KNzUgiFf493pQJIO5kB-gDd0YdH_/s1600/Screenshot.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi_GtxvTpaovopq_rvL58wqL5OgzoSwccCMvBwxXyKYLxo759Lq7gLg7MqYE7gpgdIHQ-jwW7vUygFUgYRzl5rsunHcJEiZtdpta4HBkXYYbiRMyO71KNzUgiFf493pQJIO5kB-gDd0YdH_/s320/Screenshot.png" alt="" id="BLOGGER_PHOTO_ID_5459006981272157938" title="Right-oriented Edgy panel" border="0" /></a><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjv4zB3hMfQzMh2hxIR9Iwg1XO-F-18hevCTNsyyYSrPoVhd0Rl79zv6ecrPvdq_e4_SeSZzYTLQoIbT7cq5paktMzQ0rqhyphenhyphenVcTWxBcUvpL4_cv9NSX4TFqCFc77GFA21IEnzL6n0ZkAY-u/s1600/kylehuff.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjv4zB3hMfQzMh2hxIR9Iwg1XO-F-18hevCTNsyyYSrPoVhd0Rl79zv6ecrPvdq_e4_SeSZzYTLQoIbT7cq5paktMzQ0rqhyphenhyphenVcTWxBcUvpL4_cv9NSX4TFqCFc77GFA21IEnzL6n0ZkAY-u/s320/kylehuff.png" alt="" id="BLOGGER_PHOTO_ID_5458983142486143778" title="Using Awn on top of standard panel" border="0" /></a><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiLID909Tm8cU-B2i4d2n-MqXALxnrE6rdxw2txCr9p_eznqfcb-SN1E5RejLkrrToITUnM-2csR_QlQ0h8Nq66UgSXywk2nFbkfMl70gTzUiGHkJla-WTpQUCDDOG90zYPGS3f1Po9AOQQ/s1600/metal.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 33px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiLID909Tm8cU-B2i4d2n-MqXALxnrE6rdxw2txCr9p_eznqfcb-SN1E5RejLkrrToITUnM-2csR_QlQ0h8Nq66UgSXywk2nFbkfMl70gTzUiGHkJla-WTpQUCDDOG90zYPGS3f1Po9AOQQ/s320/metal.png" alt="" id="BLOGGER_PHOTO_ID_5458983284078274146" title="Metal theme available on our forums" border="0" /></a><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjE0qKrE8lxzoUG_8RP0q3OiuHM4utDY7BWSc5ZxYhSr5NgwurnIwc_vG6cw84yDlGTcB3nTuuy2CdfVQwYVgWwcRECYvNJRFjBo4wi4N1MiA8pwsW-8bCqiCAoHvCFYblHe7O3ujCtGXCU/s1600/moonbeam-apr11-2010.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjE0qKrE8lxzoUG_8RP0q3OiuHM4utDY7BWSc5ZxYhSr5NgwurnIwc_vG6cw84yDlGTcB3nTuuy2CdfVQwYVgWwcRECYvNJRFjBo4wi4N1MiA8pwsW-8bCqiCAoHvCFYblHe7O3ujCtGXCU/s320/moonbeam-apr11-2010.png" alt="" id="BLOGGER_PHOTO_ID_5458983436455288610" title="Expanded floaty panel" border="0" /></a><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhwG7ZCc-QArwsIX-a-XKvxnYCuU96NI48uogeT1jh59mAN_7QfLbkAC8QHv-zQyn3bDxmYTdw4K5y3bm1tBVZb7YUmUwk_ZMc9P-MCwFyfaKQ_cCVFrPYPIdCAXDPqY5Jqogv_epfGRis-/s1600/screenshot_awn_cropped.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 42px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhwG7ZCc-QArwsIX-a-XKvxnYCuU96NI48uogeT1jh59mAN_7QfLbkAC8QHv-zQyn3bDxmYTdw4K5y3bm1tBVZb7YUmUwk_ZMc9P-MCwFyfaKQ_cCVFrPYPIdCAXDPqY5Jqogv_epfGRis-/s320/screenshot_awn_cropped.png" alt="" id="BLOGGER_PHOTO_ID_5458983558269531666" title="Obscura theme available on our forums" border="0" /></a>mhr3http://www.blogger.com/profile/05059602092762087621noreply@blogger.com13