Alentiment en l'accés a l'aplicació quan l'autenticació es fa via correu electrònic

Customer Relationship
22/9/15
Lluís Turró Cutiller
15.131
0

La darrera actualització feta el passat cap de setmana portava un canvi en els enllaços de temes i dossiers. Aquest enllaç varia el flux d'accés a l'aplicació, fent-lo en ocasions innecessari, al portar a un visor web on ja es pot afegir informació i adjuntar arxius a temes.

La regressió

L'autenticació feta des de l'enllaç encriptat del correu és incompleta i produeix una sobre lectura del contacte autenticat, provocant un alentiment al veure els temes complets o durant l'accés a la pròpia aplicació.

La solució

Aquesta regressió quedarà solucionada avui mateix. En cap moment inhabilita treballar amb l'aplicació i fer les tasques normals. Si noteu l'alentiment podeu sortir de la sessió creada per l'enllaç del correu i tornar a entrar pel sistema habitual, Persona o usuari / clau.

Disculpeu les molèsties.

El programari obert és coneixement

Blog
3/9/15
Lluís Turró Cutiller
15.627
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.480
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.

Actualització dels Cloud BaaS prevista per aquest cap de setmana

Customer Relationship
31/7/15
Lluís Turró Cutiller
14.221
0

Aquest cap de setmana els Clouds BaaS s'actualitzaran a les darreres versions de sistema, base de dades, servidor d'aplicacions JavaEE, màquina virtual Java, Elephant i BrightSide.

El canvi pot durar unes hores i provocar una parada del seu Cloud BaaS per un temps màxim de 20 minuts.

Esperem disculpin les molèsties que això pogués ocasionar.

Versions actualitzades

  1. Kernel Linux de CentOS 6.6 Final
  2. MySQL 5.1.73
  3. Tomcat-BaaS 8.0.24
  4. JavaDK 8u51

Llibreries Elephant i BrightSide

  • bsfinancials-core-1.3
  • bsfinancials-treasury-1.3
  • bsfinancials-www-1.3
  • contacts-2.1
  • contacts-vcard-2.1
  • elephant-1.5
  • elephant-attach-1.5
  • elephant-auth-1.5
  • elephant-calendar-1.5
  • elephant-crm-1.0
  • elephant-dossier-2.0
  • elephant-jpa-1.5
  • elephant-jpa-zkoss-1.5
  • elephant-math-1.5
  • elephant-mobile-1.0
  • elephant-plugins-1.5
  • elephant-publications-1.0
  • elephant-scheduler-1.5
  • elephant-scheduler-www-1.5
  • elephant-wd-common-1.5
  • elephant-www-1.5
  • elephant-zkoss-1.5

Llibreries propietàries

  • amic-util-1.2.1
  • syntaxparser-1.4.2
  • turro-account-1.9.0

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.