Salesforce Lightning Component – Strange Input Behaviour

Visits: 495

I was a bit astonished by one reaction of a lightning:input field: whatever I typed in there, nothing appeared in the field. It wasn’t any event handler that I added, but a mistake on my side.

The component was very simple:

<aura:component access="global" controller="MyController">
<lightning:input value="{!v.filterText}"
label="Filter"
name="myFilter"
placeholder="Filter here...!" /> </aura:component>

The issue was, that the aura:attribute with the name “filterText” was not defined.

Okay, sure, that’s a mistake, but: really? No reaction at all? Not even an error message, only pure silence.

Salesforce – Assets with or without Contact and/or Account

Visits: 1566

In test classes it is always a good thing if you are not just going through your code, but also to actually test if it is working according to design. To make your test shine, you would test both kinds of cases, working examples as well as those where you expect an error to occur.

To test a trigger, that ensures Contact and Account to be set on an Asset (as long as certain parameters are fulfilled), I added a test case where the trigger could not work properly.

According to the Apex documentation, an Asset must have Contact and/or Account set, otherwise you will run into an Exception (FIELD_INTEGRITY_EXCEPTION: Every asset needs an account, a contact or both).

Screenshot of Asset Object Reference - AccountId must be set

So, my Test class includes

Asset a = new Asset (Name = 'Test asset');
try {
    insert a;
    System.assert (false, 'Should not reach this, an Asset needs an Account or Contact');
}
catch (Exception e) {
}

However, in the project I work at currrently, this assertion fails, as our Assets can exist without neither Contact nor Account.

And this is where the documentation is plainly wrong, as it depends on the Organization-Wide Defaults for sharing. If you set access to anything except the default (Controlled by Parent), you can create Assets without Account or Contact. So the documentation is wrong 75% of the time, as a setting of “Private”, “Public Read Only” and “Public Read/Write” allows Assets without.

This was a pitfall for me, as my test class worked on one box, but not on another. And soometimes failing tests hint at an issue with the org itself. But only sometimes, most times it is because a developer did not set up the test correctly.

Salesforce API documentation could be better with API versions

Visits: 418

Once again I found a nice, no, necessary feature. When searching for RecordType-IDs in Apex, you could either query for them with SOQL (burning away the precious number of statements) OR you could just ask the schema.

With List<RecordTypeInfo> contactRTs = Schema.SObjectType.Contact.getRecordTypeInfos() you can get all available RecordTypes for this Object. With contactRTs[0].getName() you can get the label of the record type.

The label. This may be dependent on the language of the user, so it’s utterly useless in code. But there is also contactRTs[0].getDeveloperName() – yay! However, the documentation never states which is the minimum API needed for a function call, and this is absolute crap. Why not just add a line with the API-version? Otherwise you may get errors, which contradict the documentation.

Yes, I know that the Summer`18 release is not far now, so in this case it means that it was a bit more than a week before I can use this needed feature. But it cost me quite some time – checking if I had a typo, if I misread … and then finally a search for the release notes with this function. With the API version in the docs, this would have been a matter of minutes…

git – Übersicht über den Stand von Branches

Visits: 323

Da ich es auch immer wieder vergesse, schreibe ich es mir hier auf…

git for-each-ref --sort=committerdate refs/heads/ --format='%(HEAD) %(color:yellow)%(refname:short)%(color:reset) - %(color:red)%(objectname:short)%(color:reset) - %(contents:subject) - %(authorname) (%(color:green)%(committerdate:relative)%(color:reset))'

Damit zeigt git alle bekannten Branches an, mit dem letzten Kommentar, sowie, wann der erfolgt ist. Das ist gerade dann nützlich, wenn man eine Übersicht über den Stand braucht, in dem man nicht regelmäßig arbeitet.

Die Originalbeschreibung gibt es bei Stackoverflow: How can I get a list of git branches, ordered by most recent commit?

Raspberry Pi und die Mirrors

Visits: 693

Ich habe meine Resourcen für Raspberry Pi zur Verfügung gestellt, auch hier ist ein Mirror der Files verfügbar. Eigentlich sogar 2, ein weiterer liegt noch auf meiner JiffyBox. Jetzt am Donnerstag sollen ja die Tests der ersten Charge über die Bühne sein.

Leider steht vor dem Erfolg der Schweiß, oder so ähnlich. Aus diesem Grund konnte das mit dem Mirror auch nicht ‘einfach so’ klappen. Zum einen wollte ich auf meinem virtuellen Server keinen FTP-Zugang einrichten und zum andern lässt der Tarif, den ich hier für meine Webseiten gebucht habe, Directory listing nicht zu. Ich wollte auch nicht unnötig viel Arbeit für die R-Pi-Leute machen, also musste mal eben eine eigene Lösung her. Bestimmt gibt’s dafür eine Lösung auch fertig irgendwo her, aber wo ist dann der Spaß?

Also die Aufgabenstellung: synchronisiere 2 Server mit einem 3. Server und erzeuge ein Directory Listing ohne das Apache-Modul. Meine Lösung sieht vor:

  1. rsync vom raspberry-pi Server auf meinen virtuellen Server
  2. index.html erstellen für jedes Verzeichnis, mit Auflistung aller Unterverzeichnisse und Dateien
  3. Alle Dateien (inklusive der erstellten index.html) vom virtuellen Server auf den Webhosting-Server synchronisieren.

Ist alles ja gar nicht so schwer. Zu 1. wird auf dem virtuellen Server rsync ausgeführt:

rsync -azPv rsync://rsync-source/ /var/www/mirror/

Ich weiß jetzt nicht so wirklich, ob die Leute von Raspberry Pi es so gut fänden, wenn ich die Serveradresse verrate, deshalb lasse ich die hier mal weg.

Zu 2. habe ich dann ein PHP-Skript geschrieben, dass rekursiv durch die Verzeichnisse geht und entsprechende Dateien schreibt. Ja, es ist Quick & Dirty…:

<?php
function createIndex($folderName,$displayRoot) {
    $output = "<html><head><title>$folderName</title></head><body><h1>Index of $displayRoot</h1><table>";
    $i=0;
    $allEntries = null;
    $currHandle = opendir($folderName);
    if ($currHandle !== FALSE) {
        $currEntry = readdir($currHandle);
        while ($currEntry !== FALSE) {
            $allEntries[$i++] = $currEntry;
            $currEntry = readdir($currHandle);
        }
        sort($allEntries);
        foreach ($allEntries as $currEntry) {
            $procThis = $folderName . '/' . $currEntry;
            if (is_dir($procThis)) {
                if ($currEntry != '.' && $currEntry != '..') {
                    createIndex($procThis, $displayRoot . '/' . $currEntry);
                }
                $fsize = 0;
            }
            else {
                $fsize = filesize ($procThis);
            }
            if ($currEntry != '.' && $currEntry != 'index.html') {
                $output .= "\n<tr><td><a href=\"$currEntry\">$currEntry</a></td>";
                if ($fsize > 0) {
                    $output .= '<td>' . $fsize . ' bytes</td><td>' . date ("Y-m-d H:i:s.", filemtime($procThis)) . '</td>';
                }
                else {
                    $output .= '<td></td><td></td>';
                }
            }
            $output .= '</tr>';
        }
    }
    $output .="</table></body></html>";
    $handle = fopen($folderName . '/index.html','w');
    fwrite($handle,$output);
    fflush($handle);
    fclose($handle);
}
createIndex("/var/www/mirror", "/mirror");
?>

Das ganze Verzeichnis wird dann zu 3. per lftp mit dem Webhosting-Server synchronisiert:

open ftp://user:password@ftp.loco-toys.de
mirror -R -v --only-newer /var/www/mirror/ /

Diese 2 Zeilen in eine Datei geschrieben (z.B. synch.lftp) und der Aufruf erfolgt dann mit

lftp -f synch.lftp

Diese 3 Schritte werden dann noch sinnvoll in der crontab eingetragen, und schon haben wir 2 weitere Mirrors für Raspberry Pi.

Bleibt nur noch zu hoffen, dass ich überhaupt einen der Dinger aus der ersten Charge bekomme, und dass meine Mirrors nicht so beliebt sind, dass mir die Domains geperrt werden.

Java mp3info Bibliothek zu vergeben

Visits: 736

Ich habe vor längerer Zeit die Java-Bibliothek mp3info geschrieben. Damit ist es möglich, in weiten Teilen ID3v2-Tags zu lesen, manipulieren und schreiben. Ich komme leider einfach nicht mehr dazu, mich um diesen Code zu kümmern. Wenn jemand Interesse daran hat, dieses Projekt zu übernehmen und es wieder auferstehen zu lassen, würde ich mich sehr freuen.

Die Implementierung ist zugegebenermaßen nicht das beste Beispiel für Javacode, ist aber recht fortgeschritten. Alle Funktionen zum Lesen und Schreiben der Tags funktionieren stabil, eine weitreichende Unterstützung von ID3-Frames ist eingebaut, eine Möglichkeit zum Erweitern außerhalb des Codes ist auch vorhanden. Die Library wurde in einigen Projekten genutzt und ist auch einigermaßen dokumentiert. Damals zumindest war es die vollständigste Implementierung des Standards, die in Java existierte.

Die Lizenz ist LGPL und wenn jemand ernstes Interesse an der Weiterentwicklung des Projekts hat, würde ich mich freuen, die Kontrolle abzugeben.

Der derzeitige Zustand kann auf SourceForge begutachtet werden.

FrOSCon 2011 Tag 2

Visits: 649

Wie ich es mir schon dachte, 10:00h ist nicht die Zeit für mich, um an einem Sonntag sowas wie Arbeit zu machen. Dank des Streamings konnte ich mir beim Kaffee Kristian Köhntopps Eight rollouts a day keeping downtime away (Hier die Folien) ansehen. Sehr interessant, genauso wie auch Redaktionelle Hochlast -Webseiten am Beispiel von Stern.de.

Frau Andresen muss ich besonders danken für Das perfekte Team – bestehend aus lauter klugen Köpfen, hat sie mir doch damit sehr genau vor Augen geführt, was eigentlich das Problem in meinem jetzigen Job ist. Weitere aufschlussreiche Präsentationen von ihr sind bei Slideshare zu finden.

Dann ging es weiter mit PHPopstars, ein sehr unterhaltsam gemachter Vortrag zum Thema Vorträge. Dank Kristian wissen wir jetzt endlich, warum Elefanten keine guten Haustiere sind, und Tobias hat mich auf Zeta Components aufmerksam gemacht. Während die Aufräumarbeiten bereits begannen folgte dann noch Drupal – breaching our way in. Vielen Dank auch dafür, wie allerdings bemerkt wurde, war der Rahmen eines Vortrags für das Thema etwas knapp. Aber eine schöne Einführung in Drupal, nächstes Mal wird das eher ein Workshop… oder ein 2 Stundenvortrag.

FrOSCon 2011

Visits: 641

Ich bin gerade von der FrOSCon wieder nach hause gekommen. Wie immer war es sehr informativ. Ich danke den Veranstaltern und Vorträgern für ein gelungenes Programm. Sehr schade ist nur, dass vieles, was mich interessiert, parallel läuft. Wenn es nach meinen Interessen ginge, würde die Veranstaltung aber ewig dauern.

Recht interessant am Rande fand ich freedroidz, spielerisch programmieren lernen.

Morgen geht’s weiter, jeder Vortrag wieder eine Entscheidung zwischen 2 oder 3 Themen, die mich interessieren. Am schlimmsten ist fast schon, dass um 10:00h direkt 4 Sachen sind, die ich gerne besuchen würde, aber ehrlich gesagt, es ist Sonntag… um die Zeit trinke ich gerade meinen ersten Kaffee.