Per a qui són els ous?

Blog
21/3/16
Lluís Turró Cutiller
12.359
0
independencia

Potser no hauríem de tenir tantes manies.

Mireu, l'actual presidenta del Parlament deia, el 2013, que havíem d'exigir la independència, que volia una declaració unilateral perquè "ens ho mereixem". No ha pas canviat res, oi? Tret que llavors també deia que mai no es dedicaria a la política. D'acord, sí, per ella han canviat les coses. Se li ha passat la pressa a la "presi".

Però... per nosaltres no ha canviat res, oi? Bé prou que vam votar el 27S per aconseguir una majoria parlamentaria independentista que declarés la independència, no? Perquè aquest era el motiu de les plebiscitàries, no era pas pactar un referèndum amb l'estat espanyol.

I mira que van arribar tard les plebiscitàries. Havien de ser després del 9N, el març del 2015, si l'estat espanyol no ens deixava decidir. I de decidir, el que es diu decidir, res de res. Això sí, en vam treure una festa de la democràcia, un president imputat i poder retrasar les plebiscitàries.

On era? Ah sí, no hauríem de tenir tantes manies.

Potser ja toca tornar a prendre els carrers. I tornar a exigir. I anar carregats d'ous.

I quan la colla del no-he-fotut-mai-ni-brot, la que porta des del 2013 dient que fa estructures d'estat, ens digui que l'enemic és allà, en terres estrangeres, dir-los ben fort i clar perquè ho entenguin:

"No nois, no us equivoqueu. Els ous són per a vosaltres".

Podré tan sols pensar-hi... tot el temps que calgui?

Blog
14/11/15
Lluís Turró Cutiller
9.398
0

En un malson (no pregunteu perquè ho recordo) sóc dins una classe. Sona música celestial i entra la professora. Em somriu. No puc més que pensar que la felicitat existeix i que els àngels tenen gènere.

Per millorar encara més les coses, a la taula hi trobo una tablet. Però quan vaig per agafar-la, tot pensant en impressionar, una ma més ràpida l'arreplega. "Vols jugar o aprendre?"

Enlloc de deixar-ho, allargo la ma per recuperar el dispositiu i mostrar què pensava fer, però em surt un gest matusser, brusc, i m'acaba comportant l'expulsió de classe.

Tossut encara, intento entrar i explicar-me, però el somriure de cortesia ja no hi és i prenc consciència de no haver après res per estar massa embadalit. "Fora! Expulsat!"

Tot intent de corregir-ho es capgira. Veig la porta, hi camino, però cada cop és més lluny.

"Va... desperta!"

El programari obert és coneixement

Blog
3/9/15
Lluís Turró Cutiller
15.624
0
brightside elephant fundacioTiC turro.org

El primer cop que vam obrir el codi va ser el 2002. En aquell moment Blai Capdevila i jo mateix ens barallàvem per trobar una solució a la comptabilitat sense assentaments. Comptabilitat documental basada en models. El projecte es deia XMLVocabulary, s'allotjava al domini xmlportal.net i va assolir la mitjana de 30 mil descàrregues mensuals. Mentre ens deixàvem els ulls en la creació de models, a altres llocs del mon desenvolupadors trobaven utilitats ben diferents a allò que estàvem fent. Una de les sorpreses més grans va ser quan una empresa de telecomunicacions a Taiwan va començar a usar el codi dins el seu seguiment d'incidències, afegint suport LDAP, i passant-nos el resultat traduït al xinés. Aquell dia no vaig dormir.

Entenent el risc, acceptant la ignorància

Tinc que dir que sóc poc ortodox. La metodologia utilitzada en aquells moments per vendre desenvolupament de software em semblava escandalosa, poc responsable i gens productiva. Encara ara hi ha gent que continua fent el mateix. I segueixo escandalitzant-me. Primer, no sempre s'entrega el codi. Segon, se li demana al usuari que accepti el disseny de formularis on breument es descriu la operativa. Tercer, es comença el desenvolupament pels formularis. Els supòsits de semblant metodologia són, que l'analista ha entès perfectament què vol el client i que aquest ha sabut explicar què vol a la perfecció. Es comença per la taulada perquè es suposa una bona fonamentació. Això no és cert, mai pot ser-ho.

El desenvolupament de software no s'hauria de vendre, simplement perquè comprar-lo és una ruïna. Entenem-nos, comprar el desenvolupament d'una solució completa no és recomanable. Desenvolupar és una inversió, no una despesa. Desenvolupar és car i no sempre surt bé. Segons les noves tendències, el software està en una constant fase beta on cada incidència és tractada amb màxima cura. El software està en constant millora, s'adapta i creix.

En casos reals, quan es decideix iniciar un nou projecte, l'anàlisi i el desenvolupament són només una part del tramat. Cal la plena implicació de l'usuari avançat. Aquell que entén quin és l'objectiu i és capaç de trobar on falla. I tot mitjançant l'ús, sense tocar el codi. Reportant cada incidència amb tots els detalls i donant idees. L'èxit d'un projecte es mesura en la quantitat d'usuaris avançats que reporten incidències i en la rapidesa en que es desenvolupen les solucions. L'usuari coneix i el desenvolupador realitza. L'analista catalitza el procés.

Particularitats, camins al no res

Fa més de deu anys que no desenvolupo codi que no vagi al tronc principal de Elephant i BrightSide. Això vol dir que tots els usuaris usen el mateix tronc. Ja ho dic ara, les dues aplicacions tenen usuaris ben diversos, des d'autònoms a petites i mitjanes empreses. L'ús que en fan és també molt divers. Què passa doncs amb les particularitats?

Quan un usuari demana una particularitat, allò que no serà útil a ningú més, el primer que faig és intentar eliminar-la. Dràstic? No pas. Iniciar una branca de codi per una particularitat només pot acabar malament. Per una banda, la resta de mòduls creix ignorant-la i podem acabar amb una incompatibilitat. Per altre banda, al no estar en el tronc principal, no es millora ni creix al mateix ritme. Amés, eliminar-la no sempre vol dir no fer-la. També pot dir tornar-la genèrica, es a dir, afegir-la al tronc principal i deixar que la resta d'usuaris en gaudeixi.

Tornar una particularitat en una característica general és un mal de cap. Primer cal barallar-se amb els conceptes, de particulars per una funcionalitat concreta a generals per tot. Després cal, per això és genèric, més configuració. El resultat, però, és més funcionalitat pel conjunt. Tothom hi guanya.

Quan és impossible la transformació a genèric cal provar a incorporar-ho sense que es noti. La via més ràpida són les factories de classes o funcionalitat afegida. Reconeixes una interfície però no saps qui la implementa. Un cop fet el reconeixement, implementes la interfície com un mòdul endollable.

Si finalment cap de les solucions anteriors és possible, crees la versió especial per aquella particularitat, sabent que tard o d'hora es transformarà en un malson.

Publicant el coneixement

El programari obert és coneixement aplicat. Al codi s'hi suma tot el que sap l'usuari avançat. La qualitat dependrà de la maduresa del projecte, dels coneixements de les eines que tingui el desenvolupador i del coneixement de l'objectiu que es pretenia assolir per part de l'usuari. El programari obert estalvia feina a tercers i permet integrar projectes. Això afavoreix la col·laboració i resulta en una millora pels elements integrats, converteix projectes sencers en usuaris avançats reportant incidències.

A cadascú el que li toca

Haureu notat que li dono especial importància a l'usuari avançat. Bé, encara pot tenir-ne més, normalment és així.

Els casos pràctics m'han ensenyat que sense un usuari que estigui disposat a implementar el projecte en el mon real, aquest no té masses possibilitats d'èxit. Disposició per anar provant en la mesura que es va fent, en els punts on s'aconsegueixen fites. Això vol dir temps, paciència i molta implicació. Com sigui, crec que cal donar-los el reconeixement que mereixen i traduir-ho en compensacions.

La millora constant afavoreix compensar la dedicació dels usuaris avançats d'una manera ben fàcil: gaudint de les millores que ells mateixos han proposat, més d'aquelles que hagin proposat d'altres. La Fundació TiC rep les contribucions de Turro.Org i les publica sense cap cost, en un intent de convertir el teixit empresarial català en un usuari avançat. Queda molt per fer, però ja hem començat.

Voluntat sotmesa

Blog
23/8/15
Lluís Turró Cutiller
11.478
0
independencia

Fa poc, en una entrevista feta per Ara oMai, Elisenda Paluzie avisava:

"en un context com el nostre, que és no acordat amb l'Estat, el problema de fer la declaració és ser capaços de fer-la efectiva, amb decrets o lleis immediats que suposin el control de la hisenda, territori i infraestructures energètiques. Això implica un grau de força política, cohesió, autoritat i determinació del govern enormes. Dubto que hi sigui."

Poc després, Raül Romeva amenaça l'estat amb una DUI, a l'hora que deixa la porta oberta a:

"parlar de federalisme, a condició que el subjecte a federar sigui una Catalunya sobirana."

Quasi al mateix moment, Jordi Sànchez s'apunta a la festa de la DUI mentre proposa als catalans el dia de la marmota tot dient:

"Un triomf de l'independentisme el 27-S no implica cap declaració unilateral d'independència tot seguit, ni al setembre ni a l'octubre. És més, cal que el govern es torni a dirigir al govern espanyol per pactar el referèndum negat el 9-N, que en un termini raonable permeti discernir de manera inequívoca si Catalunya vol ser independent."

Un problema de voluntat

Tal i com avisa Elisenda Paluzie, sense determinació no anem enlloc. El comportament d'alguns dels nostres líders és més semblant al del nen que protesta, que al de l'adult un cop presa una decisió. Si ja saps on vas, el missatge és inequívoc. Si anem a per un estat independent, les declaracions de Romeva i Sànchez sobren.

Vull recordar que el punt de negociar un referèndum per la independència amb l'estat espanyol no hi era a l'acord de creació de Junts pel Sí. Anant més enllà, en l'acord es deia:

"Procés cap a la creació d'un estat independent. Si els ciutadans de Catalunya escullen, a través de les eleccions del proper 27 de setembre, una majoria de diputats a favor de la independència, s'iniciarà un procés cap a la creació d'un Estat independent."

Aquest text desapareix en la web de la candidatura i en el seu lloc podem trobar un lacònic:

"Si el 27 de setembre aconseguim una majoria clara i àmplia al Parlament de Catalunya començarem l'última etapa del procés per aconseguir la plena sobirania. La candidatura de Junts pel Sí vol construir un país nou perquè les futures generacions puguin gaudir d'un futur millor i més just."

Es a dir, canviem "estat independent" per "plena sobirania". I el que és pitjor, canviem la "majoria de diputats independentistes" per "una majoria clara i àmplia" i, s'entén, sobiranista.

Un malpensat diria que, un cop aconseguit el pacte pel Junts pel Sí, tornem als vells missatges. Retrets al l'estat espanyol, rebequeries i poc més.

Recordeu el "nacionalista és més que independentista"? Doncs sobiranista deu ser encara més. Potser com independentista amb la voluntat sotmesa. Ho haurem de preguntar.

Moving from ZK event thread to the recommended servlet thread. Part I.

Blog
26/7/15
Lluís Turró Cutiller
304
0
zk

As you already imagined, migrating code to the recommended servlet thread is a nightmare. Anyway, since ZK deprecated the event thread, I thought reasonable to start the migration now. Here are some issues I encountered while doing so.

This is not a replacement to ZK migration guide (ZK Event Threads), but an extension taken from a real-world application.

Close without saving?

Are you capturing the onClose event of a container to prevent user from exiting without saving its content?

This piece of code does capture the event, ask user if really want to exit loosing modifications. If user says no, the event method stopPropagation() is called and the tab remains open.

Tab tab = container.getLinkedTab();
tab.addEventListener(9000, Events.ON_CLOSE, new EventListener() {
  @Override
  public void onEvent(Event event) throws Exception {
    if(modified) {
      if(!ZkossUtils.confirmMessage(ElLabel.getLabel("lCloseWithoutSaving"))) {
         event.stopPropagation();
      }
    }
  }
});

...

public static boolean confirmMessage(String message) {
  if(Messagebox.show(message, ElLabel.getLabel("lQuestion"),
           Messagebox.OK | Messagebox.CANCEL, Messagebox.QUESTION) == Messagebox.OK) {
    return true;
  }
  return false;
}

With servlet thread this code no longer works. The method stopPropagation() gets never called. Messagebox.show() returns immediately and there is no chance that confirmMessage() returns true.

We need to make some changes. In the example I choose commons-chain, but Runnable is also a choice.

final Tab tab = container.getLinkedTab();
tab.addEventListener(9000, Events.ON_CLOSE, new EventListener() {
  @Override
  public void onEvent(final Event event) throws Exception {
    if(modified) { // check whether tab content has been changed
      event.stopPropagation();
      ZkossUtils.confirmMessage(ElLabel.getLabel("lCloseWithoutSaving"), new Command() {
        @Override
        public boolean execute(Context context) throws Exception {
          tab.close();
          return Command.PROCESSING_COMPLETE;
        }
      });
    }
  }
});

...

public static void confirmMessage(String message, final Command command) {
  Messagebox.show(message, ElLabel.getLabel("lQuestion"),
            Messagebox.OK | Messagebox.CANCEL, Messagebox.QUESTION,
            new EventListener() {
    @Override
    public void onEvent(Event event) throws Exception {
      Context ctx = new ContextBase();
      switch ((Integer) event.getData()) {
        case Messagebox.OK: command.execute(ctx); break;
      }
    }
  });
}

First modification is to use Messagebox's EventListener. There we put the code we want to execute when the OK button gets clicked.

The onClose event has changed some more. Fist, we call stopPropagation() when modified is true. This ensures the tab will remain open. Then, we close the tab. Doing so programmatically prevents from entering an endless loop. Notice that in real-world applications, the tab may have its own listeners and perform some stuff.

Before you get mad with modal windows

Setting the modal state. With the event thread enabled you could do setMode("modal") before attaching the window to the page. With the servlet thread that's no longer true. It will throw a not attached exception. So, if you set the window mode somewhere before setPage(page), simply remove the call to setMode() and use doModal() once the page has been set.