El programari obert és coneixement

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

Actualització dels Cloud BaaS prevista per aquest cap de setmana

Customer Relationship
31/7/15
Lluís Turró Cutiller
14.292
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
325
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.

Encaixada de mans, BrightSide fa una primera aproximació al B2B

New & Noteworthy
22/7/15
Lluís Turró Cutiller
12.334
2
financials

BrightSide Financials permet ara fer encaixades de mans entre diferents clouds BaaS. Tal i com el nom apunta, handshake, la relació s'estableix entre dos contractes i cal que els responsables dels mateixos intervinguin en l'acord.

Un cop establert el handshake, el contracte que ha fet la petició pot enviar documents directament al contracte que ha acceptat.

Avantatges del documents rebuts via handshake

Els documents rebuts en aquest format no cal introduir-los, en obrir el document tindrà sempre les línies del document original i la data i numeració correctes. Si el document conté productes, el procés permet donar-los d'alta si no existeixen, o relacionar-los amb productes ja existents.

El resum de benvinguda a BrightSide mostra si hi han documents pendents de confirmar i un enllaç per obrir-los.

Enviant la petició

Obri un contracte de client i premi el botó de handshake . Se li demanarà l'adreça del BaaS del seu client. Un cop confirmada, la petició es guarda a la cua de hanshakes pendent de confirmació.

El botó de handshake mostra sempre l'estat de la relació entre contractes:

  • clicar per conèixer l'estat
  • relació activa
  • pendent de confirmació
  • relació trencada, contracte no actiu

Enviar un document

Quan el contracte permet l'enviament de documents via handshake, es mostra en la barra de botons:


Per enviar el document només cal prémer el botó i aquest mostrarà un missatge amb el resultat de l'acció i canviarà el color per mostrar l'estat de la relació.

Càrrega de la norma 43 per contractes bancaris

Customer Relationship
10/7/15
Lluís Turró Cutiller
11.871
2
brightside

Ja està disponible la darrera versió de Elephant i BrightSide, instal·lada en el seu servei BaaS.

Norma 43 per extractes bancaris

Ara pot carregar el seu extracte bancari en el contracte BS Financials de C.Corrent. Els pasos a seguir són els següents:

  1. Descarregui l'extracte des del seu banc en línia, demanant la opció de format Norma 43.
  2. Obri el contracte de C.Corrent i carregui l'arxiu del seu banc usant el botó de càrrega.


Pot executar aquests pasos sense por de repetir informació o perdre informació ja guardada. BrightSide manté la qualitat de registre del compte corrent. Tampoc cal que recordi quines dates ha importat anteriorment, es manté el saldo per moviment.


Un cop carregada la informació en el contracte, aquesta pot ser usada en els extractes bancaris per quadrar amb el banc. Per veure les dades reals del banc, vagi al l'extracte del compte comptable i premi el botó Afegir moviments bancaris. Aquests es mostraran a continuació dels introduïts a la comptabilitat i ordenats per data.