Showing posts with label code. Show all posts
Showing posts with label code. Show all posts

Tuesday, October 20, 2009

overloading SEL_KEYPRESS

Or something like that...

The idea is to get some widget to do not only what it's supposed to, but also something else. For example, I would really want to hear the buzzing sound of a fly whenever I press Ctrl-z in some FXText.
  1. require 'fox16'
  2. require 'fox16/responder'
  3. include Fox

  4. class BuzzingText < FXText

  5.   include Responder

  6.   def initialize p
  7.     super p
  8.     FXMAPFUNC(SEL_KEYPRESS, 0, :onKeyPress)
  9.   end

  10.   def onKeyPress sender, sel, event
  11.     super sender, sel, event
  12. if (event.state & CONTROLMASK != 0) and (event.code == KEY_z)
  13.       # buzz
  14. end
  15.   end

  16. end

Thursday, October 8, 2009

require 'that'

$LOAD_PATH.unshift(
  File.join(
    File.expand_path(File.dirname(__FILE__)), 'lib'
  )
)

refs: http://blog.8thlight.com/articles/2007/10/08/micahs-general-guidelines-on-ruby-require, http://stuff.lilleaas.net/load_path

Sunday, September 27, 2009

Ordonner l'union ou unir l'ordre?

Disons que nous avons une table "yo" comportant les colonnes "meh" et "mih". Disons aussi que nous voulons avoir le premier et le dernier record de cette table, ordonné par "meh".

Séparément, en sqlite3, on aurait
select * from yo order by meh asc limit 1;
pour le premier, et
select * from yo order by meh desc limit 1;
pour le dernier.

Bon, il ne reste plus qu'à faire une union alors:
select * from yo order by meh asc limit 1 union all select * from yo order by meh desc limit 1;
Et bien non. Sur sqlite3, on reçoit l'erreur:
SQL error: ORDER BY clause should come after UNION ALL not before
D'abord, joli manque de ponctuation, mais ensuite, pourquoi cela?, se dit-on. Quand on y pense purement du côté de l'union, il ne fait effectivement aucun sens d'ordonner les éléments des 2 tables dès le début --- on ordonnerait plutôt après l'union. Le problème ici est que je ne veux pas ordonner le résultat de mon union, mais plutôt unir 2 résultats ordonnés. Aussi, on ne saurait dire si le dernier "order by" servirait à ordonner la deuxième table, ou bien à ordonner le résultat de l'union.

Et non, on ne peut pas faire:
(select * from yo order by meh asc limit 1) union all (select * from yo order by meh desc limit  1);
Ça serait trop facile. Si j'ai pensé à mettre ces parenthèses, c'est peut-être parce que je m'obstine à penser que SQL est un langage simple à utiliser...

Un compagnon de travail m'a fait part du blog de Pinal Dave, http://blog.sqlauthority.com où un de ses posts il parle justement de ce problème. La solution rapide de Pinal ressemblait à:
  1. select * from yo where meh in(
  2.   select min(meh) from yo union all
  3.   select max(meh) from yo
  4. );
Je ne trouve pas que c'est très élégant, en plus de peut-être donner plus de 2 lignes de résultats si les valeurs de "meh" ne sont pas distinctes.

Je suis déjà nostalgique envers ma solution avec des parenthèses, et je vois un commentaire de Dave Arthur au post de Pinal utilisant cette solution, mais d'un moyen correct, soit:
  1. select a.* from (
  2.   select * from yo order by meh asc limit 1
  3. ) a
  4. union all
  5. select b.* from (
  6.   select * from yo order by meh desc limit 1
  7. ) b
C'est la joie. Je trouve cela complètement stupide et redondant, mais ça colle déjà mieux avec l'idée initiale. De plus, on peut facilement changer le nombre de lignes des 2 queries, séparément.