tag:blogger.com,1999:blog-108112012024-03-14T10:56:14.657+01:00Squobble BlogA blog dedicated to my side projects in <a href="http://gtas.unican.es/people/steven">research</a> and <a href="https://github.com/steven2358">development</a>.Steven Van Vaerenberghhttp://www.blogger.com/profile/06370501234218207306noreply@blogger.comBlogger44125tag:blogger.com,1999:blog-10811201.post-46157004991428312762021-07-08T20:57:00.001+02:002021-07-08T21:26:21.389+02:00Oposiciones y probabilidades<p> [The following is a guest post by my Spanish alter ego, Steven, who writes in Spanish.]</p><p>Son fechas de oposiciones de secundaria en España, y en este post voy a describir un cálculo que cada opositor debería hacer.</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgLs6ttJIVj6mrDV8loTsoskMM0C28F3Pvza5eytQUwgH9ZxcRR_G5e2UZ17kLQEBt8_Ndy3A6ilpbGTcQcRdO1a50ab3kJcn-t7GjVG8d_hWiam1lloZF5tw7OQNLmx4eltYUO/s1200/elijah-hail-yLpbSjxMpCU-unsplash3.jpg" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="704" data-original-width="1200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgLs6ttJIVj6mrDV8loTsoskMM0C28F3Pvza5eytQUwgH9ZxcRR_G5e2UZ17kLQEBt8_Ndy3A6ilpbGTcQcRdO1a50ab3kJcn-t7GjVG8d_hWiam1lloZF5tw7OQNLmx4eltYUO/w640-h376/elijah-hail-yLpbSjxMpCU-unsplash3.jpg" width="90%" /></a></div><p style="text-align: center;"><span style="font-size: x-small;">Foto por <a href="https://unsplash.com/@elijahhail?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText">Elijah Hail</a> en <a href="https://unsplash.com/s/photos/studying?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText">Unsplash</a></span></p><p>La primera prueba de la mayoría de las oposiciones consiste en desarrollar un tema completo del temario de la oposición. Este temario puede contener fácilmente más de 70 temas, cada uno con su complejidad correspondiente, lo cual hace que su memorización sea una hazaña importante o incluso imposible. Afortunadamente, no es necesario estudiarse todos los temas, puesto el opositor puede elegir un tema de una selección pequeña. En particular, la dinámica típica es la siguiente: De todos los temas disponibles se sacan al azar 5, y de esos 5 el opositor elige uno para desarrollar. De ese modo, si el temario contiene 70 temas, no tiene sentido estudiarse todos esos temas, ni 69 ni 68, porque claramente el número mínimo que hay que estudiar para que sea seguro que salga uno de los estudiados es 66, o bien 70 - 4. Incluso no es descabellado estudiarse alguno menos, porque estudiando por ejemplo 60 temas, sigue siendo muy probable de que entre los 5 seleccionados salga uno de los estudiados. Lo cual nos lleva al maravilloso mundo de las probabilidades, la combinatoria, y en particular la siguiente pregunta:</p><p>"Si estudio 20 temas de un temario de 70 temas, ¿cuál es la probabilidad de que cuando se escogen 5 salga por lo menos uno de los que he estudiado?"</p><p>Esta pregunta es bien importante, porque nos permitirá definir una cantidad de temas a estudiar con suficiente rigor. Por ejemplo, si resulta que dicha probabilidad es de 95%, seguramente valdrá la pena estudiarse solo esos 20 temas, en mucha profundidad. Por otro lado, si esta probabilidad es baja, por ejemplo 30%, deberíamos estudiar más temas para incrementarla, aunque como el tiempo disponible es fijo esto también significará que el tiempo dedicado a cada tema será menos que con esos 20 temas.</p><p>En el caso del ejemplo el cálculo no es muy complicado:</p><p style="text-align: center;">P(cae por lo menos 1) = 1 - P(no cae ninguno)</p><p style="text-align: left;">Aquí, P(no cae ninguno) es la probabilidad de que en el sorteo de los 5 números no caiga ninguno de los estudiados, y se obtiene como </p><p style="text-align: center;">P(no cae ninguno) = P(ninguno en 1º sorteo)·P(ninguno en 2º sorteo)· ... · P(ninguno en 5º sorteo)</p><p style="text-align: left;">Las probabilidades de la mano derecha no son independientes, puesto que al sacar el primer número ya no se puede sacar este número en el segundo sorteo. (Se forman lo que se conoce como "combinaciones sin reemplazo".) Tenemos las siguientes probabilidades:</p><p style="text-align: center;">P(ninguno en 1º sorteo) = 50/70</p><p style="text-align: left;">porque hay 50 posibilidades de sacar un número que no pertenece a los 20 estudiados, de un total de 70. Como no hay reemplazo, obtenemos las otras probabilidades de la siguiente forma:</p><p style="text-align: center;">P(ninguno en 2º sorteo) = 49/69</p><p style="text-align: center;">P(ninguno en 3º sorteo) = 48/68</p><p style="text-align: center;">P(ninguno en 4º sorteo) = 47/67</p><p style="text-align: center;">P(ninguno en 5º sorteo) = 46/66</p><p style="text-align: left;">Juntando todo, obtenemos la probabilidad que buscábamos:</p><p style="text-align: center;">P(cae por lo menos 1) = 1-50/70·49/69·48/68·47/67·46/66 = 82%</p><p style="text-align: left;"><span style="text-align: center;">Resulta que estudiando solo 20 temas de un total de 70 la probabilidad es del 82%, lo cual es bastante alto. Esta probabilidad es aproximadamente 4/5, lo cual significa que si nos presentásemos 5 veces que solo 1 vez tendríamos la suerte de no haber estudiado ningún tema de los sacados, en promedio.</span></p><p style="text-align: left;"><span style="text-align: center;">Pero aunque 82% es una probabilidad razonablemente alta, el tema de la oposición es lo suficientemente importante para intentar garantizar el éxito algo más. Podríamos dar la vuelta a la pregunta y preguntarnos, ¿cuál es el número mínimo de temas que debería estudiar para que la probabilidad de que caiga por lo menos uno de los estudiados sea por lo menos el 95%? La forma más rápida de obtener este número es calcular la probabilidad para 21 temas, 22 temas, etc. por ejemplo con una hoja de cálculo, e identificar en qué caso alcanzamos la probabilidad buscada. En este caso, los números que salen son los siguientes:</span></p><p style="text-align: left;"></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjzp6ijhdbgGK0stEDiiUjIVDXHeWvrDTCoyZ9zfXTxu3RuV5ebtkCqMqywb4zBDW5Lf-CRpme5JXa7atOQY4QUNE5YFYAD_gZ68MWi8qrKI_XfQ-rN2iVOnHX96jARF7Qau51z/s509/probabilidades_numeros.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="509" data-original-width="253" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjzp6ijhdbgGK0stEDiiUjIVDXHeWvrDTCoyZ9zfXTxu3RuV5ebtkCqMqywb4zBDW5Lf-CRpme5JXa7atOQY4QUNE5YFYAD_gZ68MWi8qrKI_XfQ-rN2iVOnHX96jARF7Qau51z/w199-h400/probabilidades_numeros.png" width="199" /></a></div><div class="separator" style="clear: both; text-align: center;"><br /></div><div class="separator" style="clear: both; text-align: left;">O, gráficamente:</div><div class="separator" style="clear: both; text-align: center;"><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi1Ngbe-9wUlm5hYqlvRwnz8QIrVLlNDv1h2k2YXb0hSxQ5e3uBM2CIOfE87zew3nQn_O_Ug_wWyzmtQIjQtP_-mxIDJnw7CiHeBQBrETVu-HtJLRM3QbAtiV7uOK0qRmT4EDsc/s923/probabilidades.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="525" data-original-width="923" height="365" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi1Ngbe-9wUlm5hYqlvRwnz8QIrVLlNDv1h2k2YXb0hSxQ5e3uBM2CIOfE87zew3nQn_O_Ug_wWyzmtQIjQtP_-mxIDJnw7CiHeBQBrETVu-HtJLRM3QbAtiV7uOK0qRmT4EDsc/w640-h365/probabilidades.png" width="640" /></a></div>En otras palabras, para que la probabilidad de que caiga por lo menos un tema de los estudiados sea del 95% hay que estudiarse 31 temas. Curiosamente, si por ejemplo solo nos estudiamos 9 temas esa probabilidad ya es del 50%. Esto resulta poco intuitivo, y enfatiza la necesidad de hacer un buen cálculo de probabilidades al hacer este tipo de decisiones. No confiemos en nuestra intuición cuando se trata de probabilidades.<br /><div class="separator" style="clear: both; text-align: center;"><br /></div><br /><span style="text-align: center;"><br /></span><p></p><p><br /></p>Steven Van Vaerenberghhttp://www.blogger.com/profile/06370501234218207306noreply@blogger.com0tag:blogger.com,1999:blog-10811201.post-49345713014975430372021-01-19T14:32:00.003+01:002021-01-19T16:49:44.253+01:00There was a bug...<p>... in the latest update of my Chrome extension, RevEye v1.5.0, which went live today. Thanks to the alertness of several users, the bug is fixed now and the new, corrected version v1.5.1 will be rolled out soon.</p><p>In any case, if you need to perform reverse image searches right now and are stuck with the buggy version, you can follow the next steps to fix the bug until the extension updates on your machine:</p><p></p><ol style="text-align: left;"><li>Go to the options screen (right click on icon > options)</li><li>Open DevTools (F12 on Windows, Command+Option+I on Mac).</li><li>In the tab "Console", write the following code and press enter:<br /><br /><span style="font-family: courier;">localStorage.services = ['google', 'bing', 'yandex', 'tineye'];<br /><br /></span></li><li>Visit the page <span style="font-family: courier;">chrome://extensions/</span>, disable the extension and enable it again.</li></ol><div>Now it should work correctly, including the new options introduced in v1.5.0.</div><p></p>Steven Van Vaerenberghhttp://www.blogger.com/profile/06370501234218207306noreply@blogger.com0tag:blogger.com,1999:blog-10811201.post-81339479749047612212014-05-27T10:18:00.001+02:002014-05-28T10:26:33.603+02:00Desaturation bookmarkletI recently needed to protect my eyes from a web site whose editors just love saturation. I figured there should be an easy fix for that, so I quickly found the <a href="https://chrome.google.com/webstore/detail/desaturate/nkjkbbbjkbaddfcfbdakknhodgpcdhfa?hl=en">Desaturate extension</a> for Chrome. Nevertheless, nowadays I prefer to install as few extensions as possible since <a href="http://arstechnica.com/security/2014/01/malware-vendors-buy-chrome-extensions-to-send-adware-filled-updates/">malicious parties figured out how to exploit Chrome extensions</a> for profit. Luckily, many extensions are simple Javascripts that can be replaced by a bookmarklet. So here it goes, a bookmarklet to desaturate a page:<br />
<div>
<br /></div>
<div style="text-align: center;">
<a href="javascript:(function(){if(document.body.parentNode.style.webkitFilter==='grayscale(1)'){document.body.parentNode.style.webkitFilter='grayscale(0)'}else{document.body.parentNode.style.webkitFilter='grayscale(1)';}})();" style="border: 1px solid #CCCCCC; padding: 10px 20px;">Desaturate</a></div>
<br />
<div>
Just drag it to your bookmarks bar and you're done.<br />
<br />
Update: clicking the button a second time now returns the page to full color.</div>
Steven Van Vaerenberghhttp://www.blogger.com/profile/06370501234218207306noreply@blogger.com4tag:blogger.com,1999:blog-10811201.post-13311341582258537962014-03-19T16:30:00.000+01:002020-06-03T12:44:38.517+02:00Machine learning and cryptocurrenciesHere's a thought on cryptocurrencies. It's fairly well known that the <a href="http://en.wikipedia.org/wiki/Proof-of-work_system">proof-of-work</a> required to discover new blocks is actually just a bunch of calculations that typically don't serve any other purpose than producing a <a href="https://en.bitcoin.it/wiki/Block_hashing_algorithm">hash</a>. And it is a lot of computation power, <a href="https://blockchain.info/charts/hash-rate">check for yourself</a>. Some cryptocurrencies like <a href="http://riecoin.org/">Riecoin</a> try to make block discovery useful outside of the cryptocurrency world as well by making it solve an additional purpose, like finding prime numbers.<br />
<br />
Discovering a block is basically done by solving a problem that is hard to solve, but easy to check (think a really hard sudoku). There are still a myriad of problems that fit this description but that are not used in cryptocurrency hashing.<br />
<br />
So here's the thought. Why not use the proof-of-work calculations to solve a problem in machine learning? Many problems in machine learning are hard to solve but easy to check. One such problem is training a machine, e.g. a big neural network. Discovering a block would be mean producing a set of weights that allow the network to validate a test data set correctly. (I'm leaving out many practical details here, such as how to treat hashes.)<br />
<br />
Another approach may be to treat the entire network of crypto miners as the machine itself, and use it e.g. to detect interesting instances, such as in <a href="http://www.seti.org/">SETI</a>, though that example may be too esoteric.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjtFm1Xd30mEipY7kck44UCJvD77xUVsXEA50Elk9lthPkmh0EtH9EogUEzKoryPwgt9A6lpBIQWGPOENQYODAZ7ygWVIhEZczW7I3LxVM8qRbUVsXSUN_WsevcMvk4MwC6FI-g/s1600/bitcoin_machine_learning.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjtFm1Xd30mEipY7kck44UCJvD77xUVsXEA50Elk9lthPkmh0EtH9EogUEzKoryPwgt9A6lpBIQWGPOENQYODAZ7ygWVIhEZczW7I3LxVM8qRbUVsXSUN_WsevcMvk4MwC6FI-g/s1600/bitcoin_machine_learning.png" width="640" /></a></div>
<br />
[Update 2014/07/29: I'll be pasting some remarks here that have appeared on other social networks in an effort to centralize ideas.]<br />
<br />
Specific properties of the computations in typical proof-of-work:<br />
<br />
<ul>
<li>Solution is hard to obtain but easy to verify;</li>
<li>Input data for the computation depends on the block / transaction data;</li>
<li>A small change in the input data triggers a big change in the solution.</li>
</ul>
A meta-remark by <a href="https://plus.google.com/u/0/112866912340204511245">Kevin Peno</a>:<br />
<blockquote class="tr_bq">
"Block-finding is like winning the lottery and mining throughput is proportional to the number of tickets bought."</blockquote>
<div>
So how about formulating a problem that rewards intelligence instead of computational power, possibly maintaining some of the properties listed above?</div>
Steven Van Vaerenberghhttp://www.blogger.com/profile/06370501234218207306noreply@blogger.com2tag:blogger.com,1999:blog-10811201.post-46260258066268287702014-02-25T19:11:00.001+01:002014-02-25T19:11:11.120+01:00New Chrome extension: 'Nuff TabsI wrote a Chrome extension to limit the amount of tabs in Google Chrome. It's called <a href="https://chrome.google.com/webstore/detail/kemeihccgedidlokcbfhdekcfojpjjmp">'Nuff tabs</a>. There were already some extensions in the wild that do something similar, but none with the properties I was looking for (lightweight, specific options, etc.).<br />
<br />
It works as follows. In the options you can specify the maximum number of open tabs. When you open one more tab, the extension will automatically close a previous tab. In the options you can also specify which rule it must follow to determine which tab to close: either close the oldest tab, the least recently used tab, the least frequently used tab, or a random tab. My current favorite setting is the "least recently used" tab, as this way I don't have to worry about losing older tabs that are still relevant.<br />
<br />
You can also choose to display the number of open tabs in the extension icon.<br />
<br />
Install it and let me know what you think.<br />
<br />
Chrome store link: <a href="https://chrome.google.com/webstore/detail/nuff-tabs/kemeihccgedidlokcbfhdekcfojpjjmp">https://chrome.google.com/webstore/detail/nuff-tabs/kemeihccgedidlokcbfhdekcfojpjjmp</a><br />
<br />
Source code: <a href="https://github.com/steven2358/NuffTabs">https://github.com/steven2358/NuffTabs</a><br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://chrome.google.com/webstore/detail/nuff-tabs/kemeihccgedidlokcbfhdekcfojpjjmp"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjZP8CMQc45Brvxk9-4P5tcSa5Wfkk2GgqLaj7rNHZzlO5zZ1Y9NOHbX7ei7ANVnx978MmaJ2ky7xcV-cvmRDfzdTVMn40zvEbmRb97qEhyTyx4HcOsZ1-4JlShK9nj2c7TzZId/s1600/nufftabs.png" /></a></div>
<br />Steven Van Vaerenberghhttp://www.blogger.com/profile/06370501234218207306noreply@blogger.com0tag:blogger.com,1999:blog-10811201.post-18923466496957545302013-09-18T13:12:00.000+02:002014-10-13T11:20:19.818+02:00New Drupal web site for our research groupA few months ago we finished installing a new web site for <a href="http://gtas.unican.es/">our research group</a>. The previous site was in Drupal 5, and we made an improved version in <a href="https://drupal.org/drupal-7.0">Drupal 7</a>. You can visit the site <a href="http://gtas.unican.es/">here</a>.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEivamcBcuNPaqszp47gUV15HM4hqJpVD6V8LOXexTQSwG_vLfT2KwoKb61wNuP1to9zc-oEO1ZafjWAHk5gfQNbQxmDGQCC6kRPJJlCHmpQUT6aLbandjo7O5qCIxhGOFkGS4Vg/s1600/gtas_front_slice.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEivamcBcuNPaqszp47gUV15HM4hqJpVD6V8LOXexTQSwG_vLfT2KwoKb61wNuP1to9zc-oEO1ZafjWAHk5gfQNbQxmDGQCC6kRPJJlCHmpQUT6aLbandjo7O5qCIxhGOFkGS4Vg/s640/gtas_front_slice.png" height="252" width="640" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<h4>
Overview</h4>
These are the most important parts of the site:<br />
<ol>
<li>Personal profiles for each researcher and professor</li>
<li>A <a href="http://gtas.unican.es/publications">general list of publications</a> and individual listings for each researcher</li>
<li>Information pages for courses</li>
<li>A news section</li>
</ol>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgDKRhaGn7cU8YFJiUyZSOgOv1jLuhrgILFzFH1QE9BaaL7azKdjVucM0-tqbHquBTsBHwBSRo8tWLniY2BZftuW8KPMtmZROr2RGYSyjLzwi3baXdCIJ_tEuB9xSDzYo-5-tN2/s1600/gtas_news_slice.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgDKRhaGn7cU8YFJiUyZSOgOv1jLuhrgILFzFH1QE9BaaL7azKdjVucM0-tqbHquBTsBHwBSRo8tWLniY2BZftuW8KPMtmZROr2RGYSyjLzwi3baXdCIJ_tEuB9xSDzYo-5-tN2/s640/gtas_news_slice.png" height="284" width="640" /></a></div>
<br />
<br />
With respect to the previous version, we made several big changes:<br />
<ul>
<li>We went back to a single language. Previous versions were in English and in Spanish (as we're located in Spain) but we decided to go English-only as this is the language of research. That removed the hassle of having to update profiles in two languages. We still have Spanish-only pages for the courses though, but we are not using the internationalization system anymore.</li>
<li>We removed any anonymous user input. There is still a contact form, but we removed the guestbook and comments on announcements.</li>
<li>Previously we used a custom-made publication management system. We now changed to the Drupal module Biblio. Biblio has some great out-of-the-box features like publication listings per author and several types of sorting.</li>
<li>We made more use of the views module and added some tighter interaction between the different content types on the site. We now have</li>
<ul>
<li><a href="http://gtas.unican.es/news">news pages</a> and news blocks showing up in several parts of the site;</li>
<li>a <a href="http://gtas.unican.es/projects">page for research projects</a>, with links to related Biblio publications on each project and vice-versa;</li>
<li>an area dedicated to <a href="http://gtas.unican.es/open-research">reproducible research / open science</a> in which we post code to reproduce experiments from our papers (with links back from the paper pages) and several tools we are building.</li>
</ul>
</ul>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiVg6VoEByJ_xby44XJYD8wRGArPfeB28Ybf1cz3qh_EfY7Nktw_amWWULpA8GzjiNUdyxGFVgfhc6fwjkoK5e4RqKxJNuSzDv3txeMGzKgvwU3X60eij3KqkvrQdivkDqYAI-s/s1600/gtas_publications_slice.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiVg6VoEByJ_xby44XJYD8wRGArPfeB28Ybf1cz3qh_EfY7Nktw_amWWULpA8GzjiNUdyxGFVgfhc6fwjkoK5e4RqKxJNuSzDv3txeMGzKgvwU3X60eij3KqkvrQdivkDqYAI-s/s640/gtas_publications_slice.png" height="198" width="640" /></a></div>
<br />
<br />
Here's a short rundown of how we built the site.<br />
<h4>
Modules</h4>
The non-core module footprint was relatively small, since Drupal 7 comes standard with many features. The major non-core extensions we used are the following:<br />
<ul>
<li><a href="https://drupal.org/project/ajax_markup">Ajax markup</a> for our custom scripting</li>
<li><a href="https://drupal.org/project/better_formats">Better formats</a> to force formatting per content type</li>
<li><a href="https://drupal.org/project/biblio">Biblio</a> for our publication management</li>
<li><a href="https://drupal.org/project/BUEDITOR">BUEditor</a> for text markup. So much better than wysiwyg.</li>
<li><a href="https://drupal.org/project/content_access">Content Access</a> for private contents</li>
<li><a href="https://drupal.org/project/crumbs">Crumbs</a> for url-based breadcrumbs</li>
<li><a href="https://drupal.org/project/flag">Flag</a> for marking selected publications</li>
<li><a href="https://drupal.org/project/profile2">Profile2</a> for fancy user profiles</li>
<li><a href="https://drupal.org/project/realname">Real name</a></li>
<li><a href="https://drupal.org/project/securelogin">Secure login</a></li>
<li><a href="https://drupal.org/project/spamspan">Spamspan</a></li>
<li><a href="https://drupal.org/project/views">Views</a></li>
<li><a href="https://drupal.org/project/zen">Zen</a></li>
</ul>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="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/AVvXsEhA1bpL4gceTloVupiqPXj_wNNPSfo1-5JGGjdpNhRPUBHRb-3arGvoZlM-ZKttTdv7MGBB-wP90cLNSf0LQAuniQGBvA-yOQlMDameUAtgujBLaukg9V4A8JbXP6XlcQthrT4X/s1600/sticky_footer.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhA1bpL4gceTloVupiqPXj_wNNPSfo1-5JGGjdpNhRPUBHRb-3arGvoZlM-ZKttTdv7MGBB-wP90cLNSf0LQAuniQGBvA-yOQlMDameUAtgujBLaukg9V4A8JbXP6XlcQthrT4X/s1600/sticky_footer.png" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;"><i>Sticky footer!</i></td></tr>
</tbody></table>
<div>
<br /></div>
<h4>
Customizations</h4>
Apart from configuring the modules, there has been some getting our hands dirty in 3 areas:<br />
<ol>
<li>We had to hack the Biblio module as it doesn't allow for hooking / theming properly. Mainly, this was for sorting the publications by type with a custom order (not alphabetic) and some aesthetic aspects.</li>
<li>The theme is a zen subtheme. The user profiles are built with Profile2 and some additional fields, and on top of that they have some CSS but no theming templates.</li>
<li>Some of the views are using complex combinations of contextual filters and relationships, e.g. to show selected publications in our member profiles.</li>
</ol>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhpEnOw6f7zWtaXOcxJVhBTa0eSG_RtdH_a4Gnb1bS-4cCbWYQd-QxM3DbsGXhlgKV20qaA4yBLEsg7NobLbo0_6uh6MfE-l1ynTIF1Tz-6P2UrVczyVyMktUsm3pIwOvWEerHO/s1600/gtas_selected_publications_slice.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhpEnOw6f7zWtaXOcxJVhBTa0eSG_RtdH_a4Gnb1bS-4cCbWYQd-QxM3DbsGXhlgKV20qaA4yBLEsg7NobLbo0_6uh6MfE-l1ynTIF1Tz-6P2UrVczyVyMktUsm3pIwOvWEerHO/s1600/gtas_selected_publications_slice.png" /></a></div>
<div>
<br /></div>
<br />
<h4>
Conclusion</h4>
<div>
Drupal 7 was a good choice for our research group web site:</div>
<div>
<ol>
<li>The core of this web site is content management, and our content management requirements which were nicely met by Drupal.</li>
<li>We kept the back-end clean and simple, and we didn't bother with any additional graphics or fancy buttons. For instance, text markup is done code-like with BUEditor which is perfect for us technical people.</li>
<li>Drupal has some great extensibility in whatever direction, which meant that we could find almost any component we needed as a contributed module. It also came in handy for linking external services and doing experimental stuff.</li>
</ol>
</div>
<div>
The development took a few months, as this is something we did besides our normal research tasks, but we're very glad with the results. Now let's see if it lasts another 5 years.</div>
Steven Van Vaerenberghhttp://www.blogger.com/profile/06370501234218207306noreply@blogger.com3tag:blogger.com,1999:blog-10811201.post-60111265615528291042013-05-21T12:46:00.001+02:002013-05-21T12:46:18.629+02:00Matlab code and demo for kernel density estimation<br />
I've made it a habit to release the source code publicly every time somebody asks me for help with a publicly available algorithm. Having my source code in public actually also showed to improve its readability, and it helps me find it back (because, let's face it, everybody knows it is easier to find a file on Google than on your own computer).<br />
<br />
So today I am releasing some Matlab code to perform Parzen's kernel density estimation of one-dimensional data. It's included in the <a href="https://sourceforge.net/projects/kmbox">KMBOX toolbox</a> now, and you can download a standalone version with a demo from here: <a href="https://sourceforge.net/projects/kmbox/files/packs/">https://sourceforge.net/projects/kmbox/files/packs/</a><br />
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhwH8a9zWPbPmzWIIX2fen5G2AeYOXAplF2WLiF39VheMawxmn5wBy3xfqcxpzSqpt8tdmcT9JuMJDbq16glgLFepxFXwQ3gKtm05KM1wQErST0b-FHLftxzjjFFlxLv7ovuWtZ/s1600/kde.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhwH8a9zWPbPmzWIIX2fen5G2AeYOXAplF2WLiF39VheMawxmn5wBy3xfqcxpzSqpt8tdmcT9JuMJDbq16glgLFepxFXwQ3gKtm05KM1wQErST0b-FHLftxzjjFFlxLv7ovuWtZ/s1600/kde.png" /></a></div>
The image shows the output of the included demo.Steven Van Vaerenberghhttp://www.blogger.com/profile/06370501234218207306noreply@blogger.com2tag:blogger.com,1999:blog-10811201.post-58919433760279196422013-05-17T11:17:00.003+02:002013-05-17T11:19:10.820+02:00Logos in vector formatI started a small github repo to organize all the logos I've been using in my work lately, mainly in conference posters. As it takes a few minutes to extract a vector logo from a pdf, I though other people might benefit too from the result.<br />
<br />
You can find them here: <a href="https://github.com/steven2358/vectorlogos">https://github.com/steven2358/vectorlogos</a><br />
<br />
As an example, here goes the <a href="http://www.icassp2013.com/">ICASSP 2013</a> logo in vector format. Click the image for the SVG file, use <a href="http://inkscape.org/">Inkscape</a> or any other software to edit/convert.
<br />
<a href="https://raw.github.com/steven2358/vectorlogos/master/logos/icassp2013_logo.svg" imageanchor="1"><img border="0" src="https://raw.github.com/steven2358/vectorlogos/master/logos/icassp2013_logo.png" width="560" /></a>Steven Van Vaerenberghhttp://www.blogger.com/profile/06370501234218207306noreply@blogger.com0tag:blogger.com,1999:blog-10811201.post-6895496901007080942013-03-06T18:29:00.001+01:002013-03-08T18:25:45.147+01:00Graphic-design competitions for electrical engineers<div style="text-align: center;">
<img alt="Nature-Inspired Problem Solving" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhCfyilW4XiUQa7GdVk9WhO1lF0u0dzrfcK6qjqYiNznOnok0ib5VZmvZrq3zGiZekWbw-z-ztCGvFxEdnwv-sAQ5w8CWLmuYB9uu46GA7HOa9IZ4nVtlcuIo9ua9Xwi4fSbNUA/s1600/nature_inspired_problem_solving_steven2358.png" title="Nature-Inspired Problem Solving" /></div>
Last year I made this drawing. It was my submission to the t-shirt design competition of the <a href="http://cis.ieee.org/">IEEE Computational Intelligence Society</a>. The goal was to make a drawing inspired by the scientific field of "computational intelligence". It also had to feature the slogan "Nature-Inspired Problem Solving".<br />
<br />
The idea and drawing took me a few hours in Inkscape, but these turned out to be hours well invested, as I won the competition. So, the IEEE CIS will be handing out shirts with this design at their conferences. Awesome. And besides, I got an iPad for it, so I'm pretty happy to confirm that I'm still living <a href="http://www.youtube.com/watch?v=MelKblYBN3M">Maurice Moss' dream</a>.<br />
<br />
<iframe allowfullscreen="" frameborder="0" height="315" src="http://www.youtube.com/embed/MelKblYBN3M" width="560"></iframe><br />
<br />
The funny thing is, it's the second time I participate in an IEEE drawing competition and I won both times. Last time I drew the logo for the <a href="http://www.ieeer8.org/">IEEE region 8</a>. That's a pretty good success rate. But how is it possible?<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiSyUE3EmwAe5B7ivZWh4wed2cfhS7NpnxsRnIWQggzIrztqwAcg-XhKrDSf3_4FCv1ElMK7Lih2sTanv1REkXKpaUxtW9-Wo0ITBYdYlokMCck6EIvQe1wXye6hnpeZI2l0JRT/s1600/r8logo240.png" /></div>
<br />
Maybe it has to do with the fact that the IEEE respresents electrical engineers all around the world, and not graphic designers. And I am lucky enough to know a thing or two about drawing lines. So if that's the reason, the equivalent would be an electrical-engineering contest for graphic designers. I'd love to see that. At the very least it would produce interesting results.Steven Van Vaerenberghhttp://www.blogger.com/profile/06370501234218207306noreply@blogger.com10tag:blogger.com,1999:blog-10811201.post-10334794395547761932012-03-31T19:56:00.003+02:002012-05-24T13:04:06.581+02:00Kernel Canonical Correlation Analysis code for Matlab<div class="separator" style="clear: both; text-align: center;"><a href="http://sourceforge.net/projects/kmbox/files/packs/" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiWLKe9grWxJcql0ncFJfm8k3Lu02GsJZVyNXUMaaoScaa4HBTMvUalYy7J7DLcD2BK272rEz7CB86ipbgN4OoJjrdBNqSPYpiyykUBKGtr8WwGBR8Ilu_2HDOhZ_pg4uEIwdZh/s200/logo_red.png" width="200" /></a></div>I've made a package with <a href="http://sourceforge.net/projects/kmbox/files/packs/">kernel canonical correlation analysis (KCCA) code for Matlab</a>, as part of the experiments I did for a <a href="http://www.gtas.dicom.unican.es/members/steven">paper</a>. While there are some other packages out there, most notably <a href="http://www.davidroihardoon.com/Professional/Code.html">David Hardoon's KCCA code</a> [1] and <a href="http://www.di.ens.fr/~fbach/kernel-ica/">Francis Bach's kernel ICA code</a> [2], I wanted a KCCA implementation that included a demo file in addition to the KCCA functions, and I wanted it to be very fast.<br />
<br />
The code performs standard regularized KCCA and it includes a demonstration on some synthetically generated data. It can be modified easily to work on external data sets and to use custom kernel functions. The KCCA implementation decomposes the kernel matrices using incomplete Cholesky decomposition, which does not require to calculate the entire kernel matrix (see [2] for more details). The code contains different forms of the generalized eigenvalue problem, all of which yield very similar results. A demo that performs full KCCA without decomposing the kernel matrices is also included.<br />
<br />
Download the KCCA code here:<br />
<a href="http://sourceforge.net/projects/kmbox/files/packs/">http://sourceforge.net/projects/kmbox/files/packs/</a><br />
<br />
The package is part of my <a href="http://sourceforge.net/p/kmbox">Kernel Methods toolbox</a>, which is still very much in beta. Suggestions are welcome.<br />
<br />
References:<br />
[1] D. R. Hardoon, S. Szedmak and J. Shawe-Taylor, "Canonical Correlation Analysis: An Overview with Application to Learning Methods", Neural Computation, Volume 16 (12), Pages 2639--2664, 2004.<br />
[2] F. R. Bach and Michael I. Jordan. "Kernel Independent Component Analysis", Journal of Machine Learning Research, volume 3, pages 1-48, 2002.Steven Van Vaerenberghhttp://www.blogger.com/profile/06370501234218207306noreply@blogger.com1tag:blogger.com,1999:blog-10811201.post-25623271780088398322011-11-15T12:29:00.005+01:002011-11-15T17:42:56.663+01:00Comparing the weather forecast for two citiesGoing out for the weekend but can't make up your mind between two great places? Wolfram Alpha to the rescue! I found out you can compare weather forecasts with it too. Just use their weather forecast with the "versus" operator, like in <a href="http://www.wolframalpha.com/input/?i=weather+miami+beach+vs.+weather+anchorage+alaska">this recent query of mine</a><br />
<div class="separator" style="clear: both; text-align: center;"></div><div class="separator" style="clear: both; text-align: center;"><a href="http://www.wolframalpha.com/input/?i=weather+miami+beach+vs.+weather+anchorage+alaska" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg_4BUVWHw_9aixPlYwsMBhh7wnz3XaqDdwwD4zgh4oBTKbm3YSiXKVWXcLF4Q_Xfg0GhkdSZHbTlxeqAwN74yGRsQyyMMhsVJw8CiiBaPvg9uwcVDIoHdggjgCuDKF9krO-8_k/s1600/wolfram0.png" /></a></div><br />
and up pop the results:<br />
<div class="separator" style="clear: both; text-align: center;"><a href="http://www.wolframalpha.com/input/?i=weather+miami+beach+vs.+weather+anchorage+alaska"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjIFAPV3B92N4ySM9d7UrAu6rj5tP9E_9Nbj425UKVxggcMa0dZSaWF3b_h1gAFFBUqn_tbd5mtNfs69TC8S8ka3ESWTYUmRTVNMHNu42eRAz8-gFzVcOG66YzqXoSexlC1fXni/s1600/wolfram2.png" /></a></div><br />
<br />
For less well-known cities you might give Wolfram Alpha a hand by adding some parentheses etc.:<br />
<div class="separator" style="clear: both; text-align: center;"><a href="http://www.wolframalpha.com/input/?i=%28weather+miami+beach%2C+florida%2C+usa%29+versus+%28weather+anchorage%2C+alaska%2C+usa%29"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhV12-dVsR1tHbTbgGhymzjurL9yDUYx06i63f6X-eZSPwFYGYfF6NOdjsizDwlv2Ko7y-mmeIh1cK8H5pyAKonOEqIwXQb0B9tao8ZjuzW_3HQh5ld-yeYW2bQBoS2LgcKnryh/s1600/wolfram1.png" /></a></div><br />
Happy walphing!<span id="goog_893180027"></span><span id="goog_893180028"></span><a href="http://www.blogger.com/"></a>Steven Van Vaerenberghhttp://www.blogger.com/profile/06370501234218207306noreply@blogger.com0tag:blogger.com,1999:blog-10811201.post-31295368406136215172011-10-04T00:17:00.001+02:002011-10-04T00:18:43.456+02:00An exquisit blank HTML pageFancy hacking together a quick single-page web site? No? Well I do. Just in case you change your mind, here's <a href="http://www.squobble.com/util/blank.html">a high-quality blank HTML page</a> you can use as a starting point. It's transitional XHTML and has utf-8 encoding, so that should allow for doing quite a few crazy things.Steven Van Vaerenberghhttp://www.blogger.com/profile/06370501234218207306noreply@blogger.com0tag:blogger.com,1999:blog-10811201.post-87727027390552473782011-09-29T14:03:00.000+02:002011-09-29T14:03:30.335+02:00Spanish DNI and NIE letter calculatorAs I couldn't find this really well done anywhere online, I made a small tool to calculate the letter of the Spanish DNI. For expats living in Spain, you can use it to calculate the letter of a NIE too.<br />
<br />
Here it is: <a href="http://www.squobble.com/util/dni.html">Calculadora de letra de DNI y de NIE</a>.Steven Van Vaerenberghhttp://www.blogger.com/profile/06370501234218207306noreply@blogger.com5tag:blogger.com,1999:blog-10811201.post-12827625091494711262011-06-17T10:27:00.002+02:002020-06-01T15:58:20.026+02:00Google reverse image search on desktopGoogle finally adjusted their Goggles service for the desktop, so we can now also add their service to list of reverse image search tools, which already included the algorithms of TinEye, Cydral and GazoPa among others. First results show it's a winner, returning more identical results, more visually similar images, and interesting context information. Go to <a href="http://images.google.com/">images.google.com</a> to see if it's available in your region.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhgcXoL2pQlG4sc-MFiFZZ314By_G-VOa2zpyeN_dH7_pz99_I4ziG926TjgrO5a1stwrVt3DJlBRc99GRTVQkmgJqZSpYoVGOFXQ_rgEaRDfzXorNWlxyYcu91hKKGoVCDJQG6/s1600/1004.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" height="220" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhgcXoL2pQlG4sc-MFiFZZ314By_G-VOa2zpyeN_dH7_pz99_I4ziG926TjgrO5a1stwrVt3DJlBRc99GRTVQkmgJqZSpYoVGOFXQ_rgEaRDfzXorNWlxyYcu91hKKGoVCDJQG6/s320/1004.jpg" width="320" /></a></div>
To commemorate the occasion, I released a new version of <a href="https://chrome.google.com/webstore/detail/keaaclcjhehbbapnphnmpiklalfhelgf">RevEye, the Chrome plugin to perform reverse image searches</a>. It now includes searches by Google, TinEye, Cydral, and I've added <a href="http://images.yandex.ru/">Yandex</a> and <a href="http://stu.baidu.com/">Baidu</a> to the list since they also do pretty well.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://chrome.google.com/webstore/detail/keaaclcjhehbbapnphnmpiklalfhelgf" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhFEIhhFN-o2IhUyDw6dj04XSTBoCgG7sXxbCSqAT6vPmJT0lhmR1YgtVYHKMbMGrKc2U8TZ4sSNjhmK87lfO2R7aYz4FwT1B50t6uNxlj4WsDq5ZkxUQjVy030WVNXOgLFQLNK/s1600/chromeeye64.jpg" /></a></div>
<a href="https://chrome.google.com/webstore/detail/keaaclcjhehbbapnphnmpiklalfhelgf">RevEye v1.3</a> is a free download available from the chrome web store.Steven Van Vaerenberghhttp://www.blogger.com/profile/06370501234218207306noreply@blogger.com4tag:blogger.com,1999:blog-10811201.post-22033707415462208432011-06-01T12:15:00.007+02:002020-06-26T22:36:31.906+02:00RevEye: Even more reverse image searchGoogle asked me to change the name of my Chrome plugin "ChromeEye" into something that did not violate their terms. Fair enough. I changed it to "<a href="https://chrome.google.com/webstore/detail/keaaclcjhehbbapnphnmpiklalfhelgf">RevEye</a>", and took the opportunity to make some changes to the user interface as well.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiP_q0ChhKrI6u_yCixgU_iC9zLPLr4uJj5E2kyC98aRV2uNmhNwOvGaWyFt01x9W1QMEl2_j3qjzfdjgRK_1APbNjnU874xkgkid605N6t2uPb9K37z10KY43M5aZBEMgcGBiC/s1600/1002.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" height="220" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiP_q0ChhKrI6u_yCixgU_iC9zLPLr4uJj5E2kyC98aRV2uNmhNwOvGaWyFt01x9W1QMEl2_j3qjzfdjgRK_1APbNjnU874xkgkid605N6t2uPb9K37z10KY43M5aZBEMgcGBiC/s320/1002.jpg" width="320" /></a></div>
First, I added the <a href="http://www.cydral.com/">Cydral</a> engine to the list of reverse image search services included, since it has been producing some very nice results lately.<br />
<br />
Second, I added an option to change the context menu: You can now choose either to use one default search engine, or to have a cascaded menu with all options on every search. My favorite option is the one that opens all services in different tabs.<br />
<br />
These changes basically make RevEye a "meta reverse image search tool", since it now includes the complete functionalities by the <a href="http://www.tineye.com/">TinEye</a>, <a href="http://www.gazopa.com/">GaZoPa</a> or Cydral plugins. So off you go then! Install it and have fun tracking images.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://chrome.google.com/webstore/detail/keaaclcjhehbbapnphnmpiklalfhelgf" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhFEIhhFN-o2IhUyDw6dj04XSTBoCgG7sXxbCSqAT6vPmJT0lhmR1YgtVYHKMbMGrKc2U8TZ4sSNjhmK87lfO2R7aYz4FwT1B50t6uNxlj4WsDq5ZkxUQjVy030WVNXOgLFQLNK/s1600/chromeeye64.jpg" /></a></div>
RevEye v1.2 is a free download available from the <a href="https://chrome.google.com/webstore/detail/keaaclcjhehbbapnphnmpiklalfhelgf">chrome web store</a>.Steven Van Vaerenberghhttp://www.blogger.com/profile/06370501234218207306noreply@blogger.com2tag:blogger.com,1999:blog-10811201.post-31749828970260590292011-03-02T11:39:00.001+01:002011-03-02T11:40:25.411+01:00More reverse image search: ChromeEye v1.0<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgB_Bl5nBUEY7ocN-DNqmAP8Viweo_J67xixhJ5GDSjTEZI7gX-wLw6Vckj0T97RODUOkEN7Y6usUiuwHjtFsA4xTzEmS_7bEA6YwCwgLV6rCADJSQIxsMl7eH2CtOcnwNZnRZZ/s1600/renaissance.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" height="219" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgB_Bl5nBUEY7ocN-DNqmAP8Viweo_J67xixhJ5GDSjTEZI7gX-wLw6Vckj0T97RODUOkEN7Y6usUiuwHjtFsA4xTzEmS_7bEA6YwCwgLV6rCADJSQIxsMl7eH2CtOcnwNZnRZZ/s320/renaissance.jpg" width="320" /></a></div>Yesterday I released a new version of my <a href="https://chrome.google.com/extensions/detail/keaaclcjhehbbapnphnmpiklalfhelgf">reverse image search extension "ChromeEye"</a> for Google Chrome. While the <a href="http://squobble.blogspot.com/2009/12/chromeeye-tineye-extension-for-google.html">first version</a> was simply a bridge to the reverse image search engine TinEye, the new version 1.0 includes the option to use different search engines. At the moment that means images can be sent either to TinEye or to GazoPa. <a href="http://www.tineye.com/">TinEye</a>, which seems to be most popular reverse image search engine these days, looks mainly for exact matches. <a href="http://www.gazopa.com/">GazoPa</a> uses a very different algorithm, based on visual features, with sometimes surprising results. Both are still improving their algorithms, obviously, so we´ll keep an eye on them.<br />
<br />
That said, ChromeEye is now a plugin for reverse image search in general, and I will be including more search engines in the future. Note also that it is using the right click context menu for image searches. This was a much asked for option in the previous version, but technically not possible (due to Chrome restrictions) when I released it.<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://chrome.google.com/webstore/detail/keaaclcjhehbbapnphnmpiklalfhelgf" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhFEIhhFN-o2IhUyDw6dj04XSTBoCgG7sXxbCSqAT6vPmJT0lhmR1YgtVYHKMbMGrKc2U8TZ4sSNjhmK87lfO2R7aYz4FwT1B50t6uNxlj4WsDq5ZkxUQjVy030WVNXOgLFQLNK/s1600/chromeeye64.jpg" /></a></div>ChromeEye v1.0 is a free download available from the <a href="https://chrome.google.com/extensions/detail/keaaclcjhehbbapnphnmpiklalfhelgf">chrome extensions directory</a> and from the <a href="https://chrome.google.com/webstore/detail/keaaclcjhehbbapnphnmpiklalfhelgf">chrome web store</a>.Steven Van Vaerenberghhttp://www.blogger.com/profile/06370501234218207306noreply@blogger.com0tag:blogger.com,1999:blog-10811201.post-85716397730932418572010-03-17T19:07:00.002+01:002010-08-19T12:59:33.536+02:00Fixed-Budget Kernel RLS at ICASSP 2010My paper titled "Fixed-Budget Kernel Recursive Least-Squares" will be presented this afternoon at the <a href="http://www.icassp2010.com/">IEEE International Conference on Acoustics, Speech, and Signal Processing (ICASSP 2010)</a>. It was written in collaboration with <a href="http://www.cnel.ufl.edu/~weifeng/">Weifeng Liu</a> and <a href="http://www.cnel.ufl.edu/principe/principe.html">Jose C. Principe</a> of the <a href="http://www.cnel.ufl.edu/">Computational NeuroEngineering Laboratory (CNEL)</a> at the University of Florida. I couldn't be there to present the paper myself, but luckily my former supervisor <a href="http://www.gtas.dicom.unican.es/members/nacho">Ignacio Santamaría</a> is attending and will be giving the talk. If you are interested in learning methods or online kernel methods, be sure to attend. It's the first paper of the "Learning Theory and Models I" session (MLSP-L2.1), which is held on Wednesday, March 17, 13:30 - 15:30.<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjdn-pw0aQvWfVT6VM3t_YuRXyC_TfW_HUJgEJ5KSvgCot6c72Rzumx33RH_0fROa0zY-z6xaV44SfrMmvSs82EAUkzf2SgMuLmW1R7ze0mTrvowjo0ghd3FRPC8xi8ESePW8vp/s1600-h/algorithm.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" height="235" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjdn-pw0aQvWfVT6VM3t_YuRXyC_TfW_HUJgEJ5KSvgCot6c72Rzumx33RH_0fROa0zY-z6xaV44SfrMmvSs82EAUkzf2SgMuLmW1R7ze0mTrvowjo0ghd3FRPC8xi8ESePW8vp/s320/algorithm.png" width="320" /></a></div>The basic idea behind this learning algorithm is pretty simple. First of all, it is an RLS method in kernel feature space, which means it is capable of learning a nonlinear regression in an online manner. Kernel RLS methods usually face memory and computational problems, since their solutions require to invert a large kernel matrix that incorporates information about all processed data. As new data patterns (x,y) arrive (remember this is set in an online environment), this matrix grows and the computation of the regression output becomes more costly in each step. The typical approach to avoid these memory and computational problems is to restrict the data patterns to a minimum number that allows to approximate the solution sufficiently well. Each time a newly arrived pattern is found to be sufficiently interesting, it is added to a "dictionary".<br />
<br />
In contrast to these techniques, which make the dictionary expand (albeit slowly), the technique of this paper <i>fixes</i> the size of the dictionary. As a consequence, apart from adding patterns to the dictionary, we also have to prune patterns. While the pruning itself involves only simple algebra, the criterion to determine what data to prune is more interesting. We chose to use a relevance-based criterion in this paper, motivated by the good results it yielded. More specifically, in each time step we calculate how relevant each stored pattern is with respect to the regression, and subsequently prune the least relevant pattern. (Details and references are in the paper itself.) As a result, after running a number of iterations of this algorithm, it obtains a compact set of patterns that summarizes the observed patterns pretty well.<br />
<br />
I particularly like the interpretation of this algorithm as a simple learning method that deals with memory restrictions. Every time this method receives a new data pattern, it must determine actively what pattern to "forget" in order to maintain its memory size. So it's a way of "optimal forgetting". And as the results in the paper point out, it is also pretty efficient in doing so.<br />
<br />
Figures: The previous figure is one of the slides. The below figure is an illustration of the "label update" procedure that can be introduced to equip the algorithm with tracking capability. I.e., in a time-varying environment the regression surface can be changing, as indicated by the new data pattern (xn,yn). The proposed procedure updates the labels in the vicinity of this point to reflect those changes.<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEicjkDNIBPfVynCEZPsCB3ZNc0wpl0lg_fpQYpbCn4RtvQ4wBmm8MBbiKPEOazuBb4eMiI4V5eH3S8XZxnyQfhyk14q0iD9vXMUw7CxJebmAjiO0idMcspwWBST8O0QExZft5N8/s1600-h/relabeling2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEicjkDNIBPfVynCEZPsCB3ZNc0wpl0lg_fpQYpbCn4RtvQ4wBmm8MBbiKPEOazuBb4eMiI4V5eH3S8XZxnyQfhyk14q0iD9vXMUw7CxJebmAjiO0idMcspwWBST8O0QExZft5N8/s320/relabeling2.png" /></a></div>But enough talking about this paper. My friends and colleagues are also presenting theirs, so if you are at the ICASSP be sure to check them out:<br />
<ul><li><a href="http://www.cnel.ufl.edu/~memming/">Il Park</a> and Jose Principe, "Quantification of Inter-trial Non-stationarity in Spike Trains from Periodically Stimulated Neural Cultures" (Multivariate and Multimodal Analysis of Brain Signals, Tuesday, March 16, 13:50 - 14:10).</li>
<li><a href="http://sites.google.com/site/sohanseth/">Sohan Seth</a>, Jose C. Principe. A conditional distribution function based approach to design nonparametric tests of independence and conditional independence (Learning Theory and Models III, Wednesday, March 17, 16:00 – 18:00).</li>
<li><a href="http://www.gtas.dicom.unican.es/en/members/ramirezgd">David Ramirez</a>, <a href="http://www.gtas.dicom.unican.es/en/members/jvia">Javier Via</a>, Ignacio Santamaria, Roberto Lopez-Valcarce, Louis L. Scharf, "Multiantenna Spectrum Sensing: Detection Of Spatial Correlation Among Time-Series With Unknown Spectra" (SPCOM-L1: Spectrum Sensing for Cognitive Radio I, Tuesday, March 16, 14:10 - 14:30).</li>
<li>Javier Vía, David Ramírez, Ignacio Santamaría, <a href="http://www.gtas.dicom.unican.es/en/members/luis">Luis Vielva</a>, "Widely And Semi-Widely Linear Processing Of Quaternion Vectors" (Detection and Estimation Techniques - II, Thursday, March 18, 13:30 - 15:30).</li>
<li>Luis Vielva, Javier Vía, <a href="http://www.gtas.dicom.unican.es/en/members/jesusgt">Jesús Gutiérrez</a>, Óscar González, <a href="http://www.gtas.dicom.unican.es/en/members/jesus">Jesús Ibáñez</a>, Ignacio Santamaría, "Building A Web Platform For Learning Advanced Digital Communications Using A Mimo Testbed" (Signal Processing Education: Signal Processing Education, Tuesday, March 16, 14:30 - 14:50)</li>
<li><a href="http://plaza.ufl.edu/abhisheksingh/">Abhishek Singh</a>, Jose Principe. Kernel width adaptation in information theoretic cost functions (Learning Theory and Models III, Wednesday, March 17, 16:00 – 18:00).</li>
<li>Abhishek Singh, Jose Principe. A closed form recursive solution for maximum correntropy training (Learning Theory and Models III, Time: Wednesday, March 17, 16:00 – 18:00).</li>
<li>Abhishek Singh, Tejaswi Tamminedi, Guy Yosiphon, Anurag Ganguli, Jacob Yadegar. Hidden markov models for modeling blood pressure data to predict acute hypotension (Bioinformatics and Biomedical Signal Processing, Tuesday, March 16, 16:00 – 18:00).</li>
</ul>Thanks to <a href="http://memming.wordpress.com/">Memming</a> for the blog post idea!<br />
<br />
PS: The paper <s>will be available in short on my </s><a href="http://www.gtas.dicom.unican.es/members/steven"><s>academic web page</s></a> [update:] can be downloaded from <a href="http://www.gtas.dicom.unican.es/en/members/steven/publications">my publications page</a>, and I also plan to release the Matlab code either there or here in the near future. Be sure to ask me about it if you can't find it.Steven Van Vaerenberghhttp://www.blogger.com/profile/06370501234218207306noreply@blogger.com2tag:blogger.com,1999:blog-10811201.post-43681631429749012092009-12-13T23:09:00.010+01:002011-06-29T23:48:30.346+02:00ChromeEye, a TinEye extension for Google Chrome<img alt="chromeeye" border="0" id="BLOGGER_PHOTO_ID_5414847365992270258" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgSj9XGuUKN414KviK5Gi1W-ChxFklUD6eNcGAgY8YMzbd8ElUsFpi5cpgqOIUD2Ek36UmZtjPs5740UwjsvoKzOiolSPYszNhhP_eXOouEeGmJQpRhJ8R0VnvoKuecWHMwz6Ih/s320/chromeeye256.png" style="float: right; height: 256px; margin: 0 0 10px 10px; width: 256px;" title="chromeeye" />I made a simple reverse image search extension for Google Chrome. <i>Reverse what?</i> Reverse image search. Think Google, but instead of text you enter an image. <i>Ah okay. Please continue.</i><br />
<br />
The ChromeEye extension uses the image search engine <a href="http://www.tineye.com/">TinEye</a>, whose technology allows you to find exact copies of images (including scalings and slight distortions).<br />
<br />
<a href="http://cloud.github.com/downloads/steven2358/chromeeye/chromeeye-0.2.crx">Version 0.1 of ChromeEye (updated: now latest version)</a> basically mimics the TinEye bookmarklet behavior, i.e. it lists all images of the current page with links to TinEye results. Let's hope Google Chrome allows for editing the browser context menu soon, so you can right click and select a "Search Image on TinEye".<br />
<br />
Meanwhile, you can download the latest version of ChromeEye directly from <a href="http://cloud.github.com/downloads/steven2358/chromeeye/chromeeye-0.2.crx">this link</a>, while the complete <a href="http://github.com/steven2358/chromeeye">source code is available on GitHub</a>. So until the oficial TinEye plugin gets released, have fun with this easy solution.<br />
<br />
Update 14 December 2009: ChromeEye now has <a href="https://chrome.google.com/extensions/detail/keaaclcjhehbbapnphnmpiklalfhelgf">a page on the google chrome extensions site</a>. Version 0.2 was also released, with a nicer logo.<br />
<br />
Update 17 June 2011: <a href="https://chrome.google.com/webstore/detail/keaaclcjhehbbapnphnmpiklalfhelgf">ChromeEye is now called Reveye</a> and it includes different search engines, such as Google, Tineye and Cydral.Steven Van Vaerenberghhttp://www.blogger.com/profile/06370501234218207306noreply@blogger.com12tag:blogger.com,1999:blog-10811201.post-51492397386578465132009-12-04T14:15:00.009+01:002009-12-06T19:52:35.069+01:00Drawing beautiful block diagrams in LaTeXI used to put together the illustrations in my publications with a mixture of Inkscape, CorelDraw and psfrag, but obviously this couldn't continue for a long time without becoming an insult to graphic design.<br /><br />For my latest writings I am returning to the basics: PSTricks. (I know there are lots of other programs to draw block diagrams, but I didn't find any that allowed enough customization). To avoid starting from zero, I am using the <a href="http://www.ctan.org/tex-archive/graphics/pstricks/contrib/pst-sigsys/">PSTricks Signals and Systems package (pst-sigsys)</a>, which is easy to customize if you keep the <a href="http://www.ctan.org/tex-archive/graphics/pstricks/base/doc/pst-user.pdf" target="_blank">PSTricks user guide (pdf)</a> at hand.<br /><br />Here's a simple example:<pre class="brush: latex"><br />\documentclass{article}<br />\usepackage{pst-sigsys}<br /><br />\pagestyle{empty}<br /><br />\begin{document}<br /><br />\begin{figure}[ht]<br />\centering %<br />\begin{pspicture}[showgrid=false](0.5,-1.2)(9,1.55)<br />%--- Define blocks ---<br />\rput(0.5,0){\rnode{s}{$s[n]$}}<br />\dotnode[dotstyle=square*,dotscale=0.001](1.7,0){dot}<br />\psblock(3,.75){H1}{$H_1(z)$}<br />\psblock(3,-.75){H2}{$H_2(z)$}<br />\psblock(5.8,.75){B2}{$\hat H_2(z)$}<br />\psblock(5.8,-.75){B1}{$\hat H_1(z)$}<br />\pscircleop(7.7,0){ominus}<br />\rput(9,0){\rnode{e}{$e[n]$}}<br /><br />%--- Connect blocks ---<br />\psset{style=Arrow}<br />\ncline[nodesepA=.15]{-}{s}{dot}<br />\ncangle[angleA=90,angleB=180]{dot}{H1}<br />\ncangle[angleA=-90,angleB=180]{dot}{H2}<br />\ncline{H1}{B2} \naput[npos=.5]{$x_1[n]$}<br />\ncline{H2}{B1} \naput[npos=.5]{$x_2[n]$}<br />\ncangle[angleB=90]{B2}{ominus} \naput[npos=.5]{$z_1[n]$}<br />\ncangle[angleB=-90]{B1}{ominus} \naput[npos=.5]{$z_2[n]$}<br />\ncline[nodesepB=.15]{ominus}{e}<br />\end{pspicture}<br />\end{figure}<br /><br />\end{document}<br /></pre>which, after some retouching of the .sty file produces this pretty diagram:<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgZv0ycL83NNpF4UtoDYV-UtLX1EvENLBCfvK5gDw0i1XeAQUIP6ZbgN_7atBLD7tSlhNCzTO1oobw_HYUZrHbPCuX3oAngft2F_oQ6gTqyLpNIj0xXa09SxMztS2o7mRr0IM_4/s1600-h/tong_simo.png"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 117px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgZv0ycL83NNpF4UtoDYV-UtLX1EvENLBCfvK5gDw0i1XeAQUIP6ZbgN_7atBLD7tSlhNCzTO1oobw_HYUZrHbPCuX3oAngft2F_oQ6gTqyLpNIj0xXa09SxMztS2o7mRr0IM_4/s400/tong_simo.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5411362218157956370" /></a><br /><br />Update 6th December 2009: Here's a slightly more complicated diagram, based on the same codes as the above example.<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiosNgm6GDJBcCeanwevWD-ChFLoAZxooQ2oCJxGCvjFMHJkSlGa1IRIEQKaYyPQxR5n0kNQYzOKD5XNzLkbkq8nN21v-L85fhSSTjsD-gmk_depm7AvBqpifKlBSBjINnvJkk2/s1600-h/wsimo_eq.PNG"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 111px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiosNgm6GDJBcCeanwevWD-ChFLoAZxooQ2oCJxGCvjFMHJkSlGa1IRIEQKaYyPQxR5n0kNQYzOKD5XNzLkbkq8nN21v-L85fhSSTjsD-gmk_depm7AvBqpifKlBSBjINnvJkk2/s400/wsimo_eq.PNG" border="0" alt=""id="BLOGGER_PHOTO_ID_5412197148961998082" /></a>Steven Van Vaerenberghhttp://www.blogger.com/profile/06370501234218207306noreply@blogger.com16tag:blogger.com,1999:blog-10811201.post-87869786777567946132009-05-08T08:27:00.006+02:002009-05-08T19:21:20.244+02:00Kindle DX for Scientific Papers?<img style="float:right; margin:0 0 10px 10px" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiNQ3YwUQro2HmBZ_PzD4fGrhLHyaRBVgdBfb-rvJYacFaYkRm9sE2euESaeb27zrpluiT7-Z62tCD7K_s0gzO2FXa66OdpKDwd__3hTepNP52VGOXhuashZ_eiFqfQ-a6Jekx1/s200/kindle_dx.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5333374159712793282" /><div>Just out of curiosity, I wondered what scientific papers look like on the <a href="http://www.amazon.com/dp/B0015TCML0">Kindle DX</a>'s 1200 x 824 pixel resolution. The native PDF support is great, but exactly how readable are those tiny little subscripts in mathematical formula?<br /></div><div><br /></div><div>Although it will probably take some time until I can lay my hands on a real device, I did the test by scaling a page of one of my own papers to the Kindle's resolution. Check for yourself by clicking on the thumbnails below.</div><br /><table style="clear:both" width="100%"><thead><tr><td style="text-align:center; font-weight: bold" width="150" bgcolor="#ddd">mode</td><td style="text-align:center; font-weight: bold" bgcolor="#ddd">original version<br />(vectorial)</td><td style="text-align:center; font-weight: bold" bgcolor="#ddd">scanned version<br />(IEEE archive)</td></tr></thead><tbody></tbody><tbody><tr><td style="text-align:center"><img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiIRVEhrBOggyIGGDFVn8wpYlNyZtlsUR444pvR6H4rgLvMjKetrtj2I65mA8H3uNooSiK4sbU9F4Zh81KNT2USw2mIB3qzuvfbhcwFkou7LSuRUmmyMCJMRMxLXXWShG1xtXPG/s200/kindle_portrait_small.jpg" border="0" alt="kindle portrait" id="BLOGGER_PHOTO_ID_5333378910372880978" /><br />portrait<br />(full page zoom: page fits within 824 x 1200 pixels)</td><td style="text-align:center"><a target="_blank" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiXU4TxiKfL4CopT3_ZEQD2yBiTp8EODnz6D1DYw5cXJItXxzxdsQ1ArFVraYWzTord9P0dqbIJYeWNT8PPFzTyGJJAgx43otivrTnpGFQHw3pi5wRQmUVyb6nlErjEQEaJ2Q5z/s1600-h/paper_original_824x1167.png"><img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiXU4TxiKfL4CopT3_ZEQD2yBiTp8EODnz6D1DYw5cXJItXxzxdsQ1ArFVraYWzTord9P0dqbIJYeWNT8PPFzTyGJJAgx43otivrTnpGFQHw3pi5wRQmUVyb6nlErjEQEaJ2Q5z/s200/paper_original_824x1167.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5333380952573285346" style="cursor: pointer; width: 141px; height: 200px; " /></a><br /></td><td style="text-align:center"><a target="_blank" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhxEpC2TE9olY6pdhjOg-D2Vl792v4V7wFgl0n9PEHDfrcCu7MN2_IOBknPfFB-TImC9sQYzoOfnHI34pTBsAUU9_rSJaSj7kFcJD8mMyGYIs7T-3_pNDE5hwT5uxkoeCWzzRkN/s1600-h/paper_downloaded_824x1066.png"><img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhxEpC2TE9olY6pdhjOg-D2Vl792v4V7wFgl0n9PEHDfrcCu7MN2_IOBknPfFB-TImC9sQYzoOfnHI34pTBsAUU9_rSJaSj7kFcJD8mMyGYIs7T-3_pNDE5hwT5uxkoeCWzzRkN/s200/paper_downloaded_824x1066.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5333381213126762754" style="cursor: pointer; width: 154px; height: 200px; " /></a></td></tr><tr><td style="text-align:center"><br /><img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEif8umUVNuc4-hyHPC6zbYOft82cNfizH53iA5SMDNbGxzaUkm4sCPyN-yhPPzqqniMh38GNhdQhSPK9dVsH2BMacj0unWCGUi6uCkNZaRzAlTQlaREtaeOtJoRDl13ZvDvMxRp/s200/kindle_landscape_small.jpg" border="0" alt="kindle landscape" id="BLOGGER_PHOTO_ID_5333379019046472450" /><br />landscape<br />(width rescaled to 1200 pixels)</td><td style="text-align:center"><a target="_blank" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgYEkuW3gALczrxqddJQG5EQ18B888g3qEH71cuWlmBSlYCHW0zdr6QAbfOn4cGClaM6W8Df2XC25CVCLaEMF_Rx_YZUPVAqFweiVg9dDKCYOLEDY0iQWbx9f1L3ksNkl7bC622/s1600-h/paper_original_1200x1699.png"><img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgYEkuW3gALczrxqddJQG5EQ18B888g3qEH71cuWlmBSlYCHW0zdr6QAbfOn4cGClaM6W8Df2XC25CVCLaEMF_Rx_YZUPVAqFweiVg9dDKCYOLEDY0iQWbx9f1L3ksNkl7bC622/s200/paper_original_1200x1699.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5333381108430620034" style="cursor: pointer; width: 141px; height: 200px; " /></a></td><td style="text-align:center"><a target="_blank" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjcatKbVG1jq_l5wnyztIWFWCiWku_GWeLl1GFWPlcsLsHMz_lpOqYrgK-Qw3yu9hAt72JacdZAAYVtRrVAqiiCsOuKF-XAho3GCiXUijXjsDdbU-rNEJE9ME0MPZwi3ZPBo_59/s1600-h/paper_downloaded_1200x1553.png"><img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjcatKbVG1jq_l5wnyztIWFWCiWku_GWeLl1GFWPlcsLsHMz_lpOqYrgK-Qw3yu9hAt72JacdZAAYVtRrVAqiiCsOuKF-XAho3GCiXUijXjsDdbU-rNEJE9ME0MPZwi3ZPBo_59/s200/paper_downloaded_1200x1553.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5333381300468610082" style="cursor: pointer; width: 154px; height: 200px; " /></a></td></tr></tbody></table><br /><div style="text-align: left;">(The original PDFs can be found <a href="http://www.gtas.dicom.unican.es/files/Publicaciones/Congresos/MLSP_2008_pub.pdf">here</a> and <a href="http://ieeexplore.ieee.org/xpls/abs_all.jsp?arnumber=4685449">here</a>.)</div><div><br /></div><div>In portrait mode, some details might be difficult to distinguish, especially when the PDF is generated from a scanned image. Check for instance this formula, from the scanned version in portrait mode:</div><div style="text-align: center;"><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiHHaJu8n1YnFTUzQyzQyYrGVEXqo-HCZeT6W_YYob3jlABaZ_Wfpu7zY6hbfYXDbh4CaUWRdFKdaB3r4mq71S2oK46amnuggA85vvzLChX-D92Li4P6-PQtAgtUccy7TBp6m2R/s1600-h/scanned_formula_fullpage.png"><img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiHHaJu8n1YnFTUzQyzQyYrGVEXqo-HCZeT6W_YYob3jlABaZ_Wfpu7zY6hbfYXDbh4CaUWRdFKdaB3r4mq71S2oK46amnuggA85vvzLChX-D92Li4P6-PQtAgtUccy7TBp6m2R/s200/scanned_formula_fullpage.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5333440494740381954" style="cursor: pointer; width: 200px; height: 46px; " /></a></div><div>But in landscape mode everything looks perfectly readable (at least in this probably very unrealistic experiment). This is the same formula, as it appears in landscape mode:</div><div style="text-align:center"><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgXjCSgFpDJ60PdAn3sGSOuT9B9MYoWBSrDd5tkB0w7bE2xtmyjpd2IhzfkDAe9Cfl7AQOtkstQkTTYmNlxZ6zmR0cvKu6jDtJkrBgnZXXtVGqGmIqIbQXbOiAyNPn0lHv70LL6/s1600-h/formula_scanned.png"><img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgXjCSgFpDJ60PdAn3sGSOuT9B9MYoWBSrDd5tkB0w7bE2xtmyjpd2IhzfkDAe9Cfl7AQOtkstQkTTYmNlxZ6zmR0cvKu6jDtJkrBgnZXXtVGqGmIqIbQXbOiAyNPn0lHv70LL6/s400/formula_scanned.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5333386369852609714" style="cursor: pointer; width: 334px; height: 79px; " /></a></div><div>So I might buy one when it's launched in Europe. But the price needs to be slightly lower. $300 (or its equivalent in €) would be fine. And it needs an SD slot. And Wifi. Apart from that it seems to be fine.</div>Steven Van Vaerenberghhttp://www.blogger.com/profile/06370501234218207306noreply@blogger.com6tag:blogger.com,1999:blog-10811201.post-67884647618017165662009-04-24T19:48:00.006+02:002009-04-25T10:06:15.306+02:00Pictures on ClusterShot<div>Time to boost my picture sales!</div><div><br /></div><div>I am putting some of my pictures for sale on <a href="http://www.clustershot.com/">ClusterShot</a>, a new photo marketplace I found this week. Until now I only had <a href="http://www.flickr.com/photos/steven2358">my pictures sitting on flickr</a>, and every time somebody wanted to buy one that meant paperwork.</div><div><br /></div><div>ClusterShot seems to make the process pretty easy, for buyer and seller. And apart from that, their design is very neat. There are still a lot of features missing and issues to work on, but let's give them some time. In the meantime, I invite you to go check out my page and haggle on my pictures: <a href="http://www.clustershot.com/steven2358">clustershot.com/steven2358</a></div><div><br /></div><a href="http://www.clustershot.com/steven2358/photo228585"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 241px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjS5l8CjKudQcLGqRcH2DBCu489k6zWy6zPCGVDj-lPmBICGyc76HDiBG_7b8frLaS5SyfTKxXEkV4IogSplRm2v5Qz18KY1BF5eAQwloFycoQwSb9Lwf86R-sCpSLPX0f-cK-1/s400/cows_clustershot.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5328320727877800962" /></a><div style="text-align: center;">Illustration: some Spanish lolcows<br /></div>Steven Van Vaerenberghhttp://www.blogger.com/profile/06370501234218207306noreply@blogger.com3tag:blogger.com,1999:blog-10811201.post-49345984956563291112009-02-17T18:42:00.000+01:002009-03-06T18:04:04.671+01:00The Love Injections web sites<div>Now that Valentine is over, can we please proceed with the serious matter?</div><div><br /></div><img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEixexCyDSZro6Q3HsoK9qdyVP0OUk4ShneooDFCuUkqTSw5Bengzobm50W_j3Ah7SbqqhHZvhMWVE1HvsUJRKy2lKswrF7ztKkU_4mR9HbSzOKLB6riPZX-KQuI5xqDL1Ff2H5k/s400/book.jpg" style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;width: 283px; height: 340px;" border="0" alt="" id="BLOGGER_PHOTO_ID_5303788963128788930" /><div>I programmed the websites for the release of the Love Injections book, written by Kim Brusselmans. Here are the English version (<a href="http://loveinjectionsbook.com/">Love Injections</a>) and the Spanish version (<a href="http://inyeccionesdeamor.com/">Inyecciones de Amor</a>). This book might be described as "an original attempt to inspire people to boost their relationships", but to get a better idea of what that means you should check this page: <a href="http://loveinjectionsbook.com/example">Example pages</a>.</div><div><br /></div><div>The book is on sale in a few shops in Spain and Belgium, and after the crazily successful book presentations in <a href="http://inyeccionesdeamor.com/noticias/2009/01/15/presentacion-del-libro-todos-invitados">Barcelona</a> and <a href="http://loveinjectionsbook.com/news/2009/01/26/presentation-love-injections-gent-belgium">Ghent</a>, we also opened online shops for both countries.</div><div><br /></div><div>The sites were done in <a href="http://drupal.org/">Drupal</a>, with a fairly simple <a href="http://www.ubercart.org/">Ubercar</a>t setup to deal with the shopping part. The minimalist graphic design was done by <a href="http://luxoa.com/">Luxoa</a> and programmed as a subtheme of the <a href="http://drupal.org/project/zen">Zen theme</a>.</div>Steven Van Vaerenberghhttp://www.blogger.com/profile/06370501234218207306noreply@blogger.com0tag:blogger.com,1999:blog-10811201.post-4123583847454020202008-03-11T18:56:00.005+01:002012-03-14T11:21:09.189+01:00The silent MP3: To bed with the iPod Shuffle or Zen StoneFlaws in products call for hacks, so that's why I tried to solve the following annoyingness.<br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjfiNl6XPJ0NXkN36shbKBGUkPrOk7ev6h4Mi6lZF5ycTYX26okh81Sfv7vjirhpTM9myQMR0THRFQkKUgTIZxEcAB4UOjVurddfcozR5fPMdUNtFzdFyrcRxXvstHHdIh5D378/s1600-h/new-ipod-shuffle-lg.png"><img alt="" border="0" id="BLOGGER_PHOTO_ID_5176284716915641794" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjfiNl6XPJ0NXkN36shbKBGUkPrOk7ev6h4Mi6lZF5ycTYX26okh81Sfv7vjirhpTM9myQMR0THRFQkKUgTIZxEcAB4UOjVurddfcozR5fPMdUNtFzdFyrcRxXvstHHdIh5D378/s200/new-ipod-shuffle-lg.png" style="cursor: pointer; float: right; margin: 0pt 0pt 10px 10px;" /></a> Lots of people listen to their mp3 player in bed and fall asleep with the music still on. "Shuffle" players like the iPod Shuffle and Zen Stone don't have a "do not repeat" option, so they just continue playing songs until the battery dies. That will most probably disturb your good night's rest, and apart from that you will wake up with an empty battery. And we don't want either of these, do we.<br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh8ks8wwpAgugCcyB7J_U2dWpYbA6_lRZIsEaV8ZunkoCMCrZFBPs79bgYGx_RBic5QBv1sgxs5cgPMO4RR1iHXTDFCdJW7Q-VhR1-8xlDCkxncyquGMAlBglCiTuq7hGZNqpt4/s1600-h/Zen_stone.jpg"><img alt="" border="0" id="BLOGGER_PHOTO_ID_5176284996088516050" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh8ks8wwpAgugCcyB7J_U2dWpYbA6_lRZIsEaV8ZunkoCMCrZFBPs79bgYGx_RBic5QBv1sgxs5cgPMO4RR1iHXTDFCdJW7Q-VhR1-8xlDCkxncyquGMAlBglCiTuq7hGZNqpt4/s200/Zen_stone.jpg" style="cursor: pointer; float: left; margin: 0pt 10px 10px 0pt;" /></a> I figured that a small hack could solve both problems: put a very long silent MP3 in your playlist. You could peacefully sleep over it and it wouldn't drain your player's power either. So I generated a set of MP3 files that occupy just 3.5 MBytes per hour of true quality silence. They are encoded at 8 bits, mono and 8 KHz (the minimum sound quality playable by most players). The links are at the bottom of this post, packed as .rar archives. This is how it works:<br />
<ol><li>Determine how long you want to sleep, e.g. 7 hours.</li>
<li>Download the corresponding silent mp3 file and put it in your playlist just after the track by which you will likely fall asleep. If you don't have a playlist, simply rename the mp3 so that it is played after the last music track you want.</li>
<li>Go to bed with your favorite music, fall asleep and enjoy the silence.</li>
<li>Get up, switch off your mp3 player, and have a croissant.<br />
</li>
</ol>Suggestions are open for other uses of these silent MP3s. So onto the next problem now: avoiding being strangled by the headphone chord while sleeping.<br />
<br />
Files (compressed with RAR):<br />
<ul><li><a href="http://www.squobble.com/pub/audio/sleeper1.rar">sleeper1.mp3</a> (1 hour of silence: 3.5 MB unpacked, 2.83 KB packed)</li>
<li><a href="http://www.squobble.com/pub/audio/sleeper2.rar">sleeper2.mp3</a> (2 hours of silence)</li>
<li><a href="http://www.squobble.com/pub/audio/sleeper3.rar">sleeper3.mp3</a> (3 hours of silence)</li>
<li><a href="http://www.squobble.com/pub/audio/sleeper4.rar">sleeper4.mp3</a> (4 hours of silence)</li>
<li><a href="http://www.squobble.com/pub/audio/sleeper5.rar">sleeper5.mp3</a> (5 hours of silence)</li>
<li><a href="http://www.squobble.com/pub/audio/sleeper6.rar">sleeper6.mp3</a> (6 hours of silence)</li>
<li><a href="http://www.squobble.com/pub/audio/sleeper7.rar">sleeper7.mp3</a> (7 hours of silence)</li>
<li><a href="http://www.squobble.com/pub/audio/sleeper8.rar">sleeper8.mp3</a> (8 hours of silence: 28.1 MB unpacked, 17.7 KB packed)</li>
</ul><div>Update 16th April 2009: Due to popular demand I'm adding a complementary set of shorter MP3s, for all you sleephackers out there. This should cover your napping needs.</div><div><ul><li><a href="http://www.squobble.com/pub/audio/sleeper.01.rar">sleeper.01.mp3</a> (1 minute of silence: 58.9 KB unpacked, 239 B packed)<br />
</li>
<li><a href="http://www.squobble.com/pub/audio/sleeper.03.rar">sleeper.03.mp3</a> (3 minutes of silence)<br />
</li>
<li><a href="http://www.squobble.com/pub/audio/sleeper.10.rar">sleeper.10.mp3</a> (10 minutes of silence)<br />
</li>
<li><a href="http://www.squobble.com/pub/audio/sleeper.30.rar">sleeper.30.mp3</a> (30 minutes of silence: 1.7 MB unpacked, 1.26 KB packed)<br />
</li>
</ul><div>License: <a href="http://creativecommons.org/licenses/by/3.0/" rel="license"><img alt="Creative Commons License" src="http://i.creativecommons.org/l/by/3.0/80x15.png" style="border-width: 0; vertical-align: middle;" /></a> <span href="http://purl.org/dc/dcmitype/Sound" property="dct:title" rel="dct:type" xmlns:dct="http://purl.org/dc/terms/">Silent MP3</span> by <a href="http://squobble.blogspot.com/2008/03/silent-mp3-to-bed-with-ipod-shuffle-or.html" property="cc:attributionName" rel="cc:attributionURL" xmlns:cc="http://creativecommons.org/ns#">Steven Van Vaerenbergh</a> is licensed under a <a href="http://creativecommons.org/licenses/by/3.0/" rel="license">Creative Commons Attribution 3.0 Unported License</a>.</div></div>Steven Van Vaerenberghhttp://www.blogger.com/profile/06370501234218207306noreply@blogger.com39tag:blogger.com,1999:blog-10811201.post-82863962357141575692008-02-18T01:27:00.008+01:002009-05-08T12:19:45.302+02:00Hosting Uptime/Downtime CalculationWhile searching for hosting companies for a number of websites I'm working on, I noticed that a lot companies in Spain try to sell 99.5% guaranteed uptime as being very little downtime. Since this seemed like less than the average to me, I figured I might do a little calculation.<br /><br /><table width="100%" border="1" cellpadding="5" cellspacing="0"> <tbody><tr> <th>guaranteed uptime</th> <th>max downtime</th> <th>downtime / week</th> <th>downtime / month</th> <th>downtime / year</th> </tr> <tr> <td>99%</td> <td>1%</td> <td>1.68 hours</td> <td>7.2 hours</td> <td>3.65 days</td> </tr> <tr> <td>99.5%</td> <td>0.5%</td> <td>50.4 minutes</td> <td>3.6 hours</td> <td>1.825 days</td> </tr> <tr> <td>99.9%</td> <td>0.1%</td> <td>10.08 minutes</td> <td>43.2 minutes</td> <td>8.76 hours</td> </tr> <tr> <td>99.99%</td> <td>0.01%</td> <td>1.008 minutes</td> <td>4.32 minutes</td> <td>52.56 minutes</td> </tr> <tr> <td>99.999%</td> <td>0.001%</td> <td>6.048 seconds</td> <td>25.92 seconds</td> <td>5.256 minutes</td> </tr> <tr> <td>99.9999%</td> <td>0.0001%</td> <td>0.6048 seconds</td> <td>2.592 seconds</td> <td>31.536 seconds</td> </tr> <tr> <td>99.99999%</td> <td>0.00001%</td> <td>0.06048 seconds</td> <td>0.2592 seconds</td> <td>3.1536 seconds</td> </tr> </tbody></table><br />While most of these scenarios are not really realistic, it is interesting to see what companies are really offering. Reading about the recent <a title="Amazon S3 outage" href="http://www.centernetworks.com/amazon-s3-down-error" id="pses">Amazon S3 outage</a> makes one want to place things into context. Amazon's goal is to offer 99.9% uptime, which means a maximum of 0.1% downtime and therefore not more than 43.2 minutes of downtime per month. The outage took little more than 2 hours which qualifies it as a 99.5% host this month. That's a long way from the 99.999% they should be offering for cloud computing indeed.Steven Van Vaerenberghhttp://www.blogger.com/profile/06370501234218207306noreply@blogger.com2tag:blogger.com,1999:blog-10811201.post-80926872691379731312007-10-30T15:51:00.001+01:002007-10-30T15:52:35.474+01:00Photo tricks pt.2: Fun with Escher and Droste<div style="float: right; margin-left: 10px; margin-bottom: 10px;"> <a href="http://www.flickr.com/photos/steven2358/1797751165/" title="photo sharing"><img src="http://farm3.static.flickr.com/2112/1797751165_dcf1a855a2_m.jpg" alt="" style="border: solid 2px #000000;" /></a> <br /> <span style="font-size: 0.9em; margin-top: 0px;"> <a href="http://www.flickr.com/photos/steven2358/1797751165/">un excès de bricolage</a> <br /> Originally uploaded by <a href="http://www.flickr.com/people/steven2358/">Steven2358</a> </span></div>Last weekend I dropped <a href="http://flickr.com/photos/steven2358/tags/droste/">some of my pictures</a> in the weirdly whirling image manipulation device that is the <a href="http://en.wikipedia.org/wiki/Droste_effect">Droste effect</a>. It looks fun, it is fun, and it isn't that hard to achieve at all. Just follow the steps in <a href="http://flickr.com/photos/joshsommers/sets/72157594515046947/">this fine Droste effect tutorial</a> and get confused faces in no time.<br clear="all" />Steven Van Vaerenberghhttp://www.blogger.com/profile/06370501234218207306noreply@blogger.com1