• Data 2020 Summit

    The Data 2020 Summit is an annual one day event bringing together the most innovative minds, enterprise practitioners, and technology providers, working with Enterprise Information , Master Data Management, Data Governance and Data Architecture. With domestic and international speakers on stage , workshops, roundtable discussion and plenty of learning and networking activities in the exhibition area, the Data 2020 summit is the place to be for all professionals and organisations working with managing data as a strategic asset in today’s digital economy. More info at #Data2020Summit 

    When? 14th September 2017 – Where? Scandic Continental, Stockholm

  • ARIS 25th Birthday Celebrations

    On May 30 in Saarbrücken, Software AG celebrated 25 year anniversary of ARIS. Software AG were particularly proud and happy that Minister President, Annegret Kramp-Karrenbauer gave her greetings to the success story starting in Saarland.

    First Wolfram Jost, Member of Executive Board from Software AG, gave a speech in which he looked at 25 years of ARIS. It started as a standalone PC application and has evolved into a functionally broad and stable platform. The partnership with SAP and the international partner community were instrumental for becoming the worldwide number 1 tool for Business Process Management recognized by Gartner and other analysts. Many of the early developers are still part of the team. In fact, the ARIS team has the lowest staff turnover in Software AG. Wolfram made clear that “after a child is born, the challenge is to let it grow into an adult”. Currently, ARIS is a key product of Software AG’s Digital Business Platform.

    The Minister President of Saarland, Annegret Kramp-Karrenbauer, expressed her appreciation for the all jobs created in Saarland through ARIS. She recognized that ARIS is essential for any organisation that wants to manage and analyze business processes in a digital world. Furthermore, she made clear that the future of ARIS is in our own hands. Many believe she will actually be the next Chancellor of Germany after Merkel.

    Next on the stage was Gert Ottosson from Ferrologic in Sweden representing the partner community. Gert joined the community 17 years ago as part of the international expansion of ARIS. He gave his view on the development throughout those years: “Early on we had to educate the market in the Nordics about how to organize a successful and value-driven systematic strategy execution approach supported by ARIS. Today, such value-driven methodology is a must-have for all companies that wants to maximize business value fast and at low risk, e.g. in their digital & business transformation, process improvement, business/IT alignment or compliance initiatives“.

    After the presentations, there was a huge cake to celebrate the anniversary with all employees.

    Agenda for the celebrations in Saarbrücken
    – Welcome speech Wolfram Jost, CTO, Member of the Management Board of Software AG
    – Opening speech Annegret Kramp-Karrenbauer, Minister President of Saarland
    – Partner speech Gert Ottosson, Business Development Director of Ferrologic
    – ARIS Hall of Fame and exhibition
    – Let’s get the party started: Big ARIS birthday celebration 🙂

  • A silent (and deadly) error in Webmethods

    Nothing causes me more distress as a developer than libraries which silently fails. Unfortunately this is exactly what I experienced a few weeks ago, although this time the culprit was not a shady library in alpha status, fetched from the back alley of the net, but the framework I based my work on.

    Some background

    I was doing work for a client, who had a set of commodity functions in their own “utilities” folder. Among these commodity functions was their own wrapper for Hashtable. Since none of the other projects utilized the Hashtable located in the public package (provided by Software AG),  I decided to use the client’s. From this point on, whenever I mention Hashtable, I’m referring to the client’s version.

    At some point in my work I was utilizing this Hashtable, which was populated with strings as both the keys and objects being mapped. The data in the Hashtable was later consumed by  extracting the keys, and iterating over them in a loop.

    1) Extracting the keys from the Hashtable.

    1) Extracting the keys from the Hashtable.

    2) Renaming the keys

    2) Renaming the keys.

    As seen in picture 1, which illustrates the pipeline at the step where the keys are extracted, the legend tells us it returns an Array of Strings. For clarity I decided to rename these keys (as seen in picture 2), by mapping them into another Array of Strings with a more proper name. Since the original Array was now redundant I also dropped it in the same mapping.

    Problem arises

    A call from a coworker of mine lead to a bizarre situation, apparently that particular piece of code was misbehaving. A calculation which was supposed to occur inside a loop (which iterated over the keys), was returning nothing but a default value, as if the calculation never happened.

    I went back to the code and just could not see anything wrong with it. There was just no room for error, specially since no Exceptions were being caught. It took me far longer than I would like to admit to find the source of the erroneous behaviour, since I immediately proceeded to look for the culprit somewhere else.

    3) The fetched keys, debugging mode.

    3) The fetched keys, debugging mode.

    4) The keys renamed (?!), pipeline while debugging.

    4) The keys renamed (?!), pipeline while debugging.

    Once my denial phase was over, I decided to finally debug that particular piece of code.

    What I saw shocked me. The mapping step which was supposed to rename the keys silently failed. One detail from the debugging session caught my eye; as seen in picture 3 the keys were not an Array of Strings (as described in the pipeline legend), but an Array of Objects. Picture 4 shows what happens on the mapping (renaming) step, webMethods fails to cast the Object array into a String array without throwing an Exception.

    Finding the culprit

    5) Hashmap.keys (the clients implementation).

    5) Hashmap.keys (the clients implementation).

    The source of the problem was found inside the Hashtable.keys function, which was a Java function. As seen in the picture 5, the result placed in the pipeline is created with Javas Set.toArray(). A quick search on the Java API tells us Set.toArray() returns an array of Objects, which were never casted to Strings, a miss by the developer who wrote the commodity function.

    Final words

    I would very much like to present a way to catch these kind of mapping-induced casting exceptions. Unfortunately my research has been fruitless. The only word of advice I can offer to you, my reader, is to never trust what the designer tells you should be in the pipeline, but instead double check it in debug mode.

     

  • Deep cloning in Angular

    On our latest project written in Angular, a co-worker of mine was faced with a problem which caught my attention. I decided to dive a bit deeper into it, as well as researching the reasons behind this behaviour and possible solutions.

    The problem

    On a certain part of the application the user was presented with data on a table. The table was constructed by utilizing an ng-repeat, which iterated over a list of elements consisting of a somewhat complicated nested structure. I don’t want to go deeper behind this choice, but to put it in a few words; It was simply not worth it to transform the data, specially since it was already neatly packaged and fed to us by our ORM, in this case Sequelize.

    Problems arose when the user wanted to clone a row in this table. My first though was to simply encode and decode this row into Json back and forth, to later slice it into the array. This did however not work; ng-repeat did not like this newly cloned row. The error message told me the repeater couldn’t handle duplicated elements in the array, this was a major clue.

    Some research showed me that in order for the ng-repeat to handle identical elements, Angular  adds some key-value pairs of its own, preceded by two dollar signs. The problem was due to the fact that Json.stringify didn’t take this Angular-specific values into consideration, happily cloning these as well thus creating completely identical elements.

    The solution

    The solution lay within Angular itself. By utilizing angular.toJson and angular.fromJson this problem was easily avoided. Taking a look behind the hood reveals the magic, angular.toJson strips off any Angular specific values. Once the newly created element was sliced into the array it automagically received a new set of fresh $$-led values which ng-repeat happily accepted.

    Some last words

    Even though this approach worked for this specific case, it should be taken with a pinch of salt. Deep cloning in Javascript is a far more complicated beast as shown in this thread.

    For more complicated use cases consider Angulars method for deep cloning.