Caluga
Rund um Java, coding und Hacking

Caluga - der Java Blog

Dieses Blog wird sich insbesondere mit Java und allen verwandten Themen beschäftigen, dabei besonders auch mit Morphium DEM Java POJO-Mapper für Mongodb


Suchergebnis: 61

<< 1 ... 2 ... 3 ... >>


Kategorie: Computer --> Programmierung --> MongoDB-POJO Mapper morphium --> morphium

Morphium V4.0.0-RC5

Fr, 19. 10. 2018 - Tags: mongodb java morphium

Das war ein langer weg, aber so langsam wird es...

wir haben viel Zeit und Arbeit in die neue Version von Morphium gesteckt. Mit dem aktuelle Release Candidate #5 nähern wir uns endlich dem Major release!

Was war noch mal Morphium?

Morphium startete damals als reiner Object-Mapper für Mongodb 1.0 welcher sich mit einer fluent api die queries stark vereinfacht hat. Dazu kamen Features wie automatisches De-Referenzieren und lazy loading. Features wie die Caching, Cluster Awareness Cache Synchronization, etc müssen ja schon gar nicht mehr erwähnt werden.

Messaging entwickelte sich immer mehr zu einem zentralen Feature von Morphium. Gestartet, um die Cluster-Caches synchron zu halten hat es jetzt sehr viel mehr Aufmerksamkeit bekommen.

Morphium V4.0.0

Mit der V4.0.0 von Morphium kommen eine Menge neuer Features und Verbesserungen. Diese gilt es noch vernünftig zu dokumentieren. Und dann kommt das release - versprochen emoji people:smirk.

Zu Erinnerung, was alles in der 4.0.0 neu ist:

  • stark verbessertes Messaging! Unterstützung von watch um eine Art "Push" der Messages zum Client hin zu bekommen. Maximale Performance, minimale Last (nur im ReplicaSet)
  • Prioritäten in messages - damit können Nachrichten höher priorisiert werden und werden entsprechend eher abgearbeitet
  • stark verbesserter und schnellerer Object Mapper welcher jetzt auf Jackson basiert
  • vereinfachte API, ungenutzte Teile (incl. kaum genutzte Features) wurden entfernt.
  • Volle Unterstützung der Transaktionen von Mongodb 4.0.0

Die Codebase ist momentan schon sehr gut getestet und läuft auch bei einigen testweise schon in Produktivumgebungen.

Verfügbarkeit

Morphium ist ein OpenSource Projekt und man kann sich den Code oder aktuelle Releases/Release Candidates von github herunterladen.

Morphium ist aber auch über Maven Central verfügbar:

<dependency>
    <groupId>de.caluga</groupId>
    <artifactId>morphium</artifactId>
    <version>4.0.0-RC5</version>
</dependency>


Kategorie: Computer --> Programmierung --> MongoDB-POJO Mapper morphium --> morphium

Morphium 4.0.0 - Die Arbeit schreitet voran

Mi, 15. 08. 2018 - Tags: java mongodb morphium

Wir sind immer noch dabei, morphium 4.0.0 fertig zu stellen. Wir sind etwas hinter dem Zeitplan, aber wir möchten auf diesem Wege noch mal klar machen, was momentan alles passiert:

  • neuer ObjectMapper basieren auf Jackson. Damit sind wir im Schnitt ca. 30% schneller, in manchen Fällen auch gut doppelt so schnell und setzen auf einen Standard.
  • neue Messaging Funktionalitäten. Das ist das neue Kernstück von Morphium - das Messaging. Wir haben sehr viel Arbeit in diesen Teil gesteckt, vieles deutlich verbessert und beschleunigt
  • "entschlackung" der API und des codes an vielen Stellen

Leider ist die V4.0.0 nicht 100% kompatibel mit den Vorgänger Versionen! Es kann nötig sein, dass Daten migriert werden müssen (in eingen seltenen Fällen). Falls ihr Hilfe bei der Migration braucht, kontaktiert uns doch auf google-groups oder direkt auf github.

Das alles kostet Zeit. Die Aktuelle BETA4 ist verfügbar und kann auch über MavenCentral bezogen werden

 <dependency>
            <groupId>de.caluga</groupId>
            <artifactId>morphium</artifactId>
            <version>4.0.0-BETA4</version>
        </dependency>

damit Morphium funktioniert, muss aber noch ein Mongo-Treiber ausgewählt werden. Getestet wurde mit 3.8.0, es dürften aber auch spätere Versionen problemlos funktionieren... (das ist auch der Grund, warum morphium keine direkte Dependency zum Treiber hat, man kann den Treiber nutzen, der auch im Projekt evtl. schon zum Einsatz kommt)

  <dependency>
            <groupId>org.mongodb</groupId>
            <artifactId>bson</artifactId>
            <version>3.8.0</version>
        </dependency>
        <dependency>
            <groupId>org.mongodb</groupId>
            <artifactId>mongodb-driver-core</artifactId>
            <version>3.8.0</version>
        </dependency>
        <dependency>
            <groupId>org.mongodb</groupId>
            <artifactId>mongodb-driver</artifactId>
            <version>3.8.0</version>
        </dependency>

Happy hacking!


Kategorie: Allgemeines

Wir arbeiten an Morphium 4.0

Di, 17. 07. 2018 - Tags: morphium java mongo

MongoDB hat in der letzten Woche die neueste und lang ersehnte Version 4.0 veröffentlicht. Da sind natürlich eine Menge Features verbaut, aber das, welches das meiste Aufsehen erregt hat ist eindeutig die Unterstützung von ACID-konformen Transaktionen!

Der Mongo-Treiber unterstützt das ab der Version 3.8.0 - und Morphium eben ab der Version 4.0.0. Die aktuelle V4.0.0-BETA1 sollte ab sofort via Maven Central (oder über github.com verfügbar sein.

Neue Features in Morphium 4.0.0

Transaction Support

Natürlich mussten wir dieses neue Feature auch in Morphium 4.0 einbauen. Der Support ist denkbar einfach:

//starten einer Transaction via
morphium.startTransaction();
//alle darauf folgenden Anfragen in diesem Thread sind im Transaktionskontext

morphium.commitTransaction()//commit
morphium.abortTransaction()//abort

MorphiumTransactionContext ctx=morphium.getTransaction();

//um aufrufe in einem anderen Thread an diese Transaktion zu "hängen" muss der Transaktionskontext in den thread übergeben werden
//Transaktionen sind aktuell ThreadLocal, also in einem anderen Thread muss dann der richtige Kontext gesetzt werden
morphium.setTransaction(ctx);

Achtung: die Transaktionen oder der Aufruf davon führt zu einem Fehler, wenn die Mongo nicht entsprechend konfiguriert ist.

verbessertes Messaging.

Wir haben viele Verbesserungen im Messaging gemacht, die Api an einigen stellen verschlankt, an anderen dafür mehr Features eingebaut. Auch die Unterstützung von "Push"-Messaging, wenn man mit einem Replicaset verbunden ist, wurde stark verbessert

Verbessertes Cluster-Aware Caching

Mit Hilfe der neuen watch-Funktion der MongoDB, welche ja eigentlich nichts weiter ist als eine neue Version des OpLog-Monitors, haben wir jetzt ein neues Feature in die Cache Synchronisation eingebaut: Push notification von der Datenbank und automatisches Aktualisieren der Cache Einträge.

Das funktioniert genauso, wie es via Messaging funktioniert hat, jedoch ohne den Umweg über Nachrichten zu gehen und berücksichtigt genauso die @Cache Annotation. Dazu wurde ein neuer Synchronizer eingeführt:

WatchingCacheSynchronizer sync = new WatchingCacheSynchronizer(morphium);
sync.start();

inMemoryDriver

Der inMemoryDriver macht es möglich, jeden Zugriff der sonst auf die Mongo ginge, in Mem auszuprobieren. Insbesondere im Umfeld von Tests ist das sehr praktisch.

MorphiumConfig cfg = new MorphiumConfig();
        cfg.addHostToSeed("inMem");
        cfg.setDatabase("test");
        cfg.setDriverClass(InMemoryDriver.class.getName());
        cfg.setReplicasetMonitoring(false);

Transaktionen funktionieren aktuell (noch) nicht mit dem InMem-Driver und Aggregation wird vermutlich erst in einer der nächsten Versionen eingebaut. Aber die anderen Funktionalitäten lassen sich mit dem Treiber wunderbar testen.


Kategorie: Allgemeines

Worauf es beim Homepage-Layout ankommt

Di, 17. 07. 2018 - Tags:

Ursprünglich veröffentlicht auf: https://boesebeck.name

Anm.: Dieser Text wurde zur Verfügung gestellt von homepage-erstellen.de

Worauf es beim Homepage-Layout ankommt

Hat man erst einmal die ersten Hürden bei der Erstellung einer Homepage gemeistert, muss man sich um ein passendes Layout kümmern. Ein übersichtliches und ansprechendes Layout sorgt dafür, dass relevante Inhalte leichter gefunden werden können und Seitenbesucher eher zurückkehren.

Was ein gutes Layout auszeichnet

Beim Layout einer Homepage gilt es zunächst darauf zu achten, welchem Zweck die Homepage dienen soll. Soll ein Produkt vorgestellt werden? Möchte man über die Dienstleistung einer Firma informieren? Oder nutzt man die Homepage, um über ein persönliches Anliegen aufzuklären? Wichtig ist, dass alle relevanten Informationen jederzeit gefunden werden können. Ein gutes Layout besteht aus Überschriften, Bildern, Fußzeilen und Spalten. So werden Informationen sinnvoll vorgefiltert und können schon mit wenigen Blicken erfasst werden. Das erhöht für den Besucher der Seite den Bedienkomfort und die Wahrscheinlichkeit, dass man zu einem späteren Zeitpunkt die Seite nochmal aufsuchen wird. Zuerst werden beim Layout Farben und Formen wahrgenommen. Ein farbenfrohes Layout kann sich zum Beispiel für ein Portfolio eignen, das Kreativität ausdrücken soll, passt aber kaum zu bestimmten Firmen oder Dienstleistern. Bei diesen ist es wichtig, dass man die Informationen zu jedem Produkt sofort finden kann.

Seitenleiste zum Teil sehr nützlich

Laut www.homepage-erstellen.de kann sich eine Seitenleiste als sehr nützlich für Besucher der Seite erweisen. Dort sollten aber nicht die wichtigsten Inhalte, sondern hauptsächlich ergänzende Informationen zusammengefasst werden. Die Ausrichtung spielt dabei keine große Rolle und die Seitenleiste kann sowohl auf der rechten als auch auf der linken Seite angebracht werden. In der oberen linken Ecke sollte sich ein Logo befinden. Bei E-Commerce-Seiten ist der Warenkorb meist in der rechten Ecke angebracht. Das Suchfeld befindet sich oftmals direkt neben dem oder in direkter Nähe zum Warenkorb.


Kategorie: Computer --> Programmierung --> MongoDB-POJO Mapper morphium --> morphium

Custom Caching in Morphium

So, 20. 05. 2018 - Tags: java mongodb morphium cache

Seit eine der ersten Versionen hat Morphium einen Cache eingebaut, der durch Annotations (Cache) konfiguriert wird.

Dieser Cache wurde in vielen Projekten genutzt und hat gezeigt, dass er gut funktioniert, auch das Synchronisieren des Caches über das Morphium Messaging System funktioniert tadellos.

Jedoch gibt es einige Implementierungen da draußen, die viele neue Features bieten. Und es macht wirklich nur bedingt Sinn, den alle diese Features auch in Morphium einzubauen. Stattdessen haben wir uns entschlossen, mit der aktuellen Betaversion den JCache-Standard (JSR107) zu unterstützen.

Dazu mussten einige Dinge angepasst werden, insbesondere das MorphiumCache-Interface.

Morphium selbst besitzt ja schon immer die möglichkeit, eine eigene Custom-Cache Implementierung zu nutzen. Jedoch ist so was natürlich nicht wirklich einfach machbar. Jedoch nutzen wir diesen Umstand um jetzt beide Cache Implementierungen integrieren zu können:

  1. Die Default Cache implementierung, die sich seit Jahren bewährt hat
  2. Eine JCache-Implementierung, welche auf eine beliebige JCache-Library (z.B. ehcache) zugreifen kann

Damit Morphium, wie immer schon, out of the Box lauffähig ist, haben wir auch noch eine JCache-Implementierung des bewährten Caches gebaut.

How to use

Mit der neuen V3.2.2BETA (via maven central oder auf github )wird Morphium per default die JCache-IMplementierung verwenden. Möchte man stattdessen lieber die neue Jcache-IMplementierung nutzen, muss man dies in der Configuration nur eintragen:

    MorphiumConfig cfg=new MorphiumConfig();
    cfg.setCache(new MorphiumCacheImpl());

für die json oder property file Konfiguration, muss nur die klasse gesetzt werden:

  cacheClassName=de.caluga.morphium.cache.MorphiumCacheImpl

JCache Unterstützung

Wenn man alles auf Default lässt,wird die JCache API genutzt. Standardmäßig wird zunächst die Default-Cache implementierung via Caching.getCachingProvider().getCacheManager() genutzt.

Möchte man lieber seine eigenen Caches eintragen, so ist dies problemlos möglich. Dei Morphium JCache-Implementierung benötigt "nur" einen CacheManager. Die Caches selbst werden von Morphium angelegt und verwaltet.

  CachingProvider provider = Caching.getCachingProvider();
   morphium.getCache.setCacheManager(provider.getCacheManager());

natürlich kann man via code hier noch eigene Einstellungen vornehmen.

BTW: möchte man die Morphium eigene JCache-IMplementierung auch anderswo nutzen, so kann man dies tun, indem man die JCache Implementierung über -Djavax.cache.spi.CachingProvider=de.caluga.morphium.cache.jcache.CachingProviderImpl setzen.

Hinweis:

Alle JCache-Implementierungen unterstützen ein automatisches löschen von älteren / nicht genutzten Einträgen. Leider lässt sich die Morphium Policy nicht so ohne weiteres auf die Caches abbilden, weshalb Morphium ein eigenes Housekeeping implementiert, welches alte Elemente aus dem Cache entfernt.

  • Zusatzinfo*

die Cache Synchronisierung funktioniert auch mit der JCache kompatiblen Version. Und da dieser Cache auch außerhalb von Morphium genutzt werden kann, würden dann eben auch diese Caches synchronisiert werden.

Maven settings

    <groupId>de.caluga</groupId>
    <artifactId>morphium</artifactId>
    <version>3.2.2BETA1</version>

known bugs

Es gibt ein paar kleinere Bugs mit der aktuellen Beta:

  • die CacheListener Callbacks funktionieren wohl nicht mehr zu 100% mit JCache. Zumindest im Zusammenspiel mit EHCache scheint es da Probleme zu geben. Mit der Morphium eigenen JCache Implementierung funktioniert es
  • Es gibt einen Bug mit den Globalen Cache Einstellungen, welche nicht immer sauber an die Caches weiter gegeben werden.
  • Das Messaging Subsystem scheint auch betroffen zu sein.


Kategorie: Computer --> Programmierung --> MongoDB-POJO Mapper morphium --> morphium

MongoDB Messaging via Morphium

So, 06. 05. 2018 - Tags: java programming morphium

Einer der vielen Vorteile von Morphium ist das integrierte Messagingsystem, welches z.B. auch für die Synchronisierung der Caches benutzt wird. Das funktioniert schon so seit mit einer der erste Versionen von Morphium.

Das Messaging setzt dabei auf ein ausgeklügeltes "Locking", damit Nachrichten, die nur für einen Empfänger bestimmt sind, auch nur dort ankommen. Leider kann man so etwas im Normalfall nur durch Polling, d.h. immer wieder die selbe Anfrage an die DB senden, realisieren. Aber seit der V3.2.0 wird im Falle der Verwendung eines Replicasets der OplogMonitor genutzt, um Messaging auf eine art "Push" aufzusetzen. D.h. die DB informiert die Clients, wenn es neue Nachrichten gibt.

Das reduziert die Last und erhöht die Reaktionszeit. Schauen wir uns das im Detail mal an...

Messaging mit Morphium - Funktionsweise

Wie einleitend schon erwähnt, muss man ab der V3.2.0 2 Fälle unterscheiden: ist Morphium mit einem ReplicaSet verbunden oder nicht.

Kein Replicaset => Polling

Das gitl im übrigen auch, für einen Sharded Cluster! D.h. wenn man mit dem MongoS verbunden ist, funktioniert das Messaging via Polling. Das Polling kann konfiguriert werden, d.h. wie oft pro Minute soll denn gefragt werden. Sollen die Nachrichten einzeln bearbeitet werden, oder alle auf ein mal etc.

Im Endeffekt läuft alles auf das Locking raus. Der Algorithmus sieht in etwa so aus (und kann in Messaging.java nachgelesen werden):

  1. ein Kommando an die Mongo senden, welches eine Nachricht die entweder direkt für dieses MessagingSystem oder für alle bestimmt ist und exklusiv (also nur ein mal bearbeitet werden darf) markiert ist, für dieses System lockt! Das geschieht mit Hilfe einer UUID die beim Start des Messaging erzeugt wird. Entweder eine oder alle passenden locken, je nach Einstellung.
  2. lesen ob es von mir (=dieses System) gelockte bzw. Nachrichten für alle gibt.
  3. jede dieser Nachrichten bearbeiten.
  4. die Nachricht als bearbeitet markieren (UUID->processed_by)
  5. kurz pausieren und zurück zu 1

Replicaset => OpLogMonitor bzw. ChangeStream

der OpLogMonitor ist ja schon eine Weile teil von Morphium. Mit dem OpLogMonitor wird ein TailableCursor, also ein stets geöffneter Curser, ans OpLog "gehängt". Damit bekommt man eine Nachricht, sobald eine Änderung im OpLog geschieht. Was im Replicaset immer dann der Fall ist, wenn es einen schreibzugriff auf die MongoDB gibt.

Ab Morphium 4.0 wird in diesem Fall auch der ChangeStream dieser Collection genutzt. Damit ist man nicht mehr auf den Zugriff des OpLog angewiesen.

Warum dann nicht einen TailableCursor direkt an die Msg-Collection hängen? Ja, das haben wir uns auch überlegt, leider funktioniert das aus folgenden Gründen nicht wirklich:

  1. tailableCursor funktionieren nur auf Capped Collections. Das ist zwar nicht tragisch in unserem Fall, aber etwas unschön
  2. man bekommt nur "neue" einträge übertragen, nicht jedoch updates. Das ist insbesondere für das Locking exklusiver Nachrichten nötig. Das würde dazu fürhren, dass man diesen Fall eh durch Polling lösen muss. Also kein Gewinn...

Die Verarbeitung der Messages ist im endeffect identisch zu oben, nur kann man sich das Locking vereinfachen. Bei einer eingehenden neuen Nachricht, passiert das:

  1. ist die eingehende Nachricht exklusiv markiert, findet das locking von oben statt aber nur für diese eine Nachricht (die ID hat man ja). Ist somit natürlich effizienter...
  2. ist die eingehende Nachricht nicht exklusiv markiert (und nicht von mir selbst), dann einfach bearbeiten
  3. ist die eingehende Nachricht exklusiv und direkt an mich adressiert, dann bearbeiten

im Falle von Updates einer Nachricht muss ja eigentlich erst mal gar nicht so viel passieren. Dennoch wird in diesem Fall die Nachricht noch mal kurz gelesen und geprüft, ob sie bearbeitet werden muss.

Messaging nutzen

Die Nutzung von Messaging in Morphium ist ziemlich einfach, man erstellt eine Instanz der Klasse Messaging und legt los:

   Messaging messaging=new Messaging(morphium, 500, true);
   messaging.start();

im Idealfall sollte man das Messaging system z.B. über Spring oder so initialisieren.

Nachricht senden

Und dann kann man eigentlich schon loslegen. Eine Nachricht wird wie folgt gesendet:

    messaging.storeMessage(new Msg("Testmessage", "A message", "the value - for now", 5000));

hier wird eine Nachricht mit einer TTL (time to live) von 5 sek gespeichert. Die Default TTL ist 30sek. Ältere Nachrichten werden automatisch gelöscht (aber nicht zwingend genau nach nach 30sek...)

Nachrichten sind per default broadcast, d.h. sie werden von allen verbundenen Clients gelesen und bearbeitet. Würde man die Nachricht auf "Exclusiv" setzen, könnten alle sie lesen, aber nur einer soll sie bearbeiten.

        Msg m = new Msg();
        m.setExclusive(true);
        m.setName("A message");

Diese Nachricht wird nur von einem einzigen empfänger bearbeitet!

Grundsätzlich werden Nachrichten übrigens vom Sender selbst nicht gelesen.

Und zu guter Letzt, man kann nachrichten natürlich auch direkt an einen Empfänger senden. Das passiert z.B. wenn Antworten gesendet werden. Die sollen ja nur vom Sender der ursprünglichen Nachricht bearbeitet werden.

Um eine Nachricht direkt an einen bestimmten Empfänger zu senden, muss man die ID des senders kennen. Das kann einfach durch eine eingehende Nachricht passieren oder man implementiert so eine Art discovery...

        Msg m = new Msg("testmsg1", "The message from M1", "Value");
        m.addRecipient(recipientId);
        m1.storeMessage(m);
storeMessage vs queueMessage

in den Integration-Tests in Morphium werden beide Methoden verwendet. Der Unterschied ist relativ einfach: storeMessage schreibt die Nachricht direkt in die Mongo wohingegen queueMessage asynchron funktioniert. D.h. die Nachricht wird erst entgegengenommen und im Hintergrund geschrieben. Evtl. der bessere Weg für Performance.

Nachrichten Emfpangen

Empfang von Nachrichten ist genauso einfach. im Messaging wird einfach ein MessageListener registriert:

           messaging.addMessageListener((messaging, message) -> {
            log.info("Got Message: " + message.toString());
            gotMessage = true;
            return null;
        });

Dabei ist message die Message und messaging das MessagingSystem. Der listener liefert hier als Ergebnis null zurück, könnte aber auch eine Nachricht als Antwort zurückgeben. Diese würde dann automatisch direkt an den Sender zurückgeschickt.

Mit Hilfe von messaging kann der listener auch auf das MessagingSystem zugreifen und bei Bedarf z.B. selbst Nachrichten versenden, die keine direkte Antwort sein sollten.

Des Weiteren kann der Listener die Bearbeitung "verweigern" indem er eine MessageRejectedException wirft. Der Sender kann auch darüber informiert werden, jedoch wird die Nachricht einfach wieder in den "Pool" zurückgeworfen und kann dann von anderen bearbeitet werden.

Das ist natürlich nur dann wirklich ein Problem, wenn es sich um eine exklusive Nachricht gehandelt hat. Denn dann sollte ein anderer Listener die Nachricht bearbeiten können.

Messaging im Einsatz - Synchronisierung der Caches

Innerhalb von Morphium setzt der CacheSynchronizer auf Messaging auf. Er benötigt im Constructor auch ein Messaging System.

Die Implementierun ist eigentlich recht einfach. Der CacheSynchronizer registriert sich als MorphiumStorageListener in Morphium und wird so über jeden Schreibzugriff informiert (denn nur dann muss ja auch der Cache synchronisiert werden).

public class CacheSynchronizer implements MessageListener, MorphiumStorageListener {

}

Kommt ein Schreibzugriff rein, wird geprüft ob es sich um ein gecachtes Entity handelt und wenn ja, wird eine ClearCache-Message über das Messaging gesendet. Diese beinhaltet, was zu tun ist abhängig von der gewählten Strategie (siehe auch Cache-Annotation in Morphium).

Außerdem bearbeitet der CacheListener natürlich auch eingehende Nachrichten. Kommt eine Nachricht an, wird einfach der in der Message beschriebene Cache gelöscht, das element geändert oder der Cache anderweitig angepasst.

Diese Clear-Nachrichten lassen sich auch über den CacheSynchronizer direkt versenden.

und es sollte auch nicht unerwähnt bleiben, dass man natürlich auch hier einen Listener registrieren kann, um sich über die Synchronisation der Caches informieren zu lassen.

Fazit

das Messaging feature von Morphium führt zu Unrecht ein Schattendasein. Es kann in vielen Fällen als einfacher Ersatz für full-blown MessagingSysteme dienen und kann super einfach eingesetzt werden. Mit der neuen Basis auf OpLogMonitor ist ein wichtiges neues Feature hinzugekommen um Messaging noch häufiger einsetzen zu können.


Kategorie: Computer --> Programmierung --> MongoDB-POJO Mapper morphium --> morphium

Neues Release Morphium 3.2.0Beta2 - Java Mongo Pojo Mapper

Mi, 02. 05. 2018 - Tags: morphium java mongodb mongo POJO

Hi,

wir haben eine neue Beta-Version von Morphium V3.2.0 veröffentlicht. Diese beinhaltet einige kleinere bugfixes aber auch eine große Verbesserung: durch die Verwendung des Oplogmonitors wenn man mit einem Replicaset verbunden ist, kann das Messaging jetzt quasi auf Push-Messages der Datenbank reagieren. Damit ist kein Polling mehr nötig.

Das wird auch für die Synchronisierung der Caches genutzt.

Die Aktuelle Version kann von github runter geladen werden: https://github.com/sboesebeck/morphium

Die Beta V2 gibt es auch via maven central.

Das finale Release wird sicherlich bald verfügbar sein, also "stay tuned" emoji people:smirk


Kategorie: Computer --> Programmierung --> MongoDB-POJO Mapper morphium --> morphium

Neues Release Morphium V3.1.7

Di, 21. 11. 2017 - Tags: java mongo

Wir haben gerade die Version V3.1.7 von Morphium - Caching Mongodb POJO-Mapper - released.

  • performance increase insert vs upsert
  • update handling of non-mongoid ID-fields (bugfix)
  • updated Tests
  • new strategy for buffered writer: WAIT
  • setting maxwait / timeout for waitstrategy in bufferedwriter
  • moving id creation to morphium, implementing proper inserts, fixing bugs
  • fixing buffered writing on sharded environments
  • performance increase
  • mongodb driver version update, checkfornew default fix

Details gibt es auf github. Einbidung erfolgt am einfachsten über Maven Central:

 <dependency>
            <groupId>de.caluga</groupId>
            <artifactId>morphium</artifactId>
            <version>3.1.7</version>
 </dependency>


Kategorie: Computer --> Programmierung --> MongoDB-POJO Mapper morphium --> morphium

Release Morphium 3.1.5

Fr, 29. 09. 2017 - Tags: morphium

Es wurde gerade eine Neue Version 3.1.5 von Morphium released und sollte auch über Maven Central verfügbar sein:

  • bugfix bei den Statistiken
  • alle Treiber sind in ein eigenes Project verschoben
  • verbesserung beim speichern von binary data (byte arrays)
  • korrektur einiger Tests
  • checkForNew bei @CreationTime hat nun ein einleuchtenderes Verhalten: ist es global enabled kann es auch in der Annotation enabled werden. Ist es global disabled wird kein Check durchgeführt!

A


Kategorie: Allgemeines

git und optware kaputt after Qnap Update auf 4.3.3

Mo, 21. 08. 2017 - Tags: git qnap storage

Seit geraumer Zeit habe ich eine Qnap bei mir im Keller stehen, die so ziemlich alles speichert, was die Rechner und Server hier im Haushalt so an Daten produzieren oder was gebackupt werden soll.

Die Qnap wird von mir auch als git server genutzt. Das hat bisher auch völlig problemlos (naja, fast) funktioniert. Jetzt klemmt das allerdings...

Nach dem Update - nix mehr

ich hab letztens gesehen, dass es ein neues Update für die TS gibt und dass das wohl mehr oder minder das letzte sein wird. Ja, die Qnap ist schon etwas betagt, aber sooo alt doch nun auch wieder nicht (3 Jahre?). Es war auch eine Warnung in den Releasenotes, dass der Wechsel auf 64bit dazu führen kann, dass einige Apps nicht mehr gehen...

So weit so wenig spektakulär. Und nach dem update ging auch alles noch, der ganze nutzlose Mist läuft. Aber Optware ging nicht mehr, das war nur 32bittig.

Leider bekommt man das nur "hintenrum" mit, denn wenn man auf die Seite geht, läuft's einfach nicht mehr... Fehler... oder 404 Page not found oder noch besser Permission denied.

In der Shell (wenn man sich dann per ssh einloggt) ist dann beim versuch irgendwas manuell zu installieren ein file not found-Error die Folge. Was natürlich eher blöd ist, denn die Datei existiert ja und wurde aufgerufen.

Der Erfahrende Linuxer weiß dann, dass irgendeine lib nicht gefunden wird, und das zum Crash führt - und dann erinnert man sich siedentheiß and die Warnung vor der Installation.

Erst mal ist das ja nicht schlimm, aber leider funktioniert auch keines der über ipkg installierten Programme mehr: d.h. bei mir insbesondere kein git!

die lösung...

... heißt: entware und kann man hier runterladen. Installiert werden muss es über den Installer in der Web-GUI der Qnap, und leider hat entware keine "schöne" (denn hübsch war die von optware wirklich nicht) GUI im Angebot, sondern nach der installation hat man in der Shell "nur" das kommando opkg (man beachte die Änderung von i zu o).

Und das funktioniert dann... Einziges noch zu erledigendes ist (das schon eingeübte gewusel mit dem SSH-Daemon funktioniert erst, nach der installation von openssh via opkg install openssh-server), den symlink zu den einzelnen Git-commands anzulegen, da sh die sonst nicht findet:

cd  /bin
for in $(/opt/bin/git*); do
   ln  -s $i
done

Und wie immer - fröhliches hacken!


Kategorie: Sicherheit

Virenscanner am Mac / Iphone

Mo, 29. 05. 2017 - Tags: virus security

Ursprünglich veröffentlicht auf: https://boesebeck.name

Virenscanner auf dem Mac / iPhone?

Die Virus-Angst geht um - auch am Mac... braucht man also einen Virenscanner auf dem Mac oder ist der überflüssig? Zumindest wird mir in letzter Zeit diese Frage des öfteren gestellt.

Grundsätzlich ist die Frage nach einem Virenscanner für den Mac oder das iPhone natürlich gerechtfertigt und jeder sollte seinen Rechner so absichern, dass er sich sicher fühlt - denn recht viel mehr als ein Gefühl bringen die Anti-Viren-Programme am Mac momentan eh nicht. Im Moment sind, soweit ich weiß, eine Handvoll Schadprogramme für den Mac bekannt, die alle von den OSX eigenen Mechanismen erkannt werden und sich somit nicht weiter verbreiten können.

Momentan ist der Mac verschont - aber bald…

"Aber bald, da wird es ganz schlimm kommen.“

Ja, das höre ich auch jedes Jahr. Immer, wenn der Marktantail von OSX steigt, höre ich, dass jetzt bald die Grenze überschritten ist und alle Virenhersteller sich auf den Mac stürzen würden.

Natürlich ist der Marktanteil ein Argument, aber es kommt noch der Aufwand für die Entwicklung dazu. Und der Nutzen…

Vermutlich muss man beides in Betracht ziehen: wird ein System extrem leicht kompromittiert, wird das jemand tun, selbst wenn der Marktanteil verschwindend gering ist. Ist der Marktanteil nicht so hoch, aber das System lässt sich relativ simpel knacken, wir auch das passieren:

Beispiel: der Microsoft Internet Information Server (IIS) wird weit häufiger angegriffen, als der Marktführer Apache

Ist das System allerdings recht schwer zu knacken, muss der Anreiz schon recht groß sein, dass sich jemand die Mühe macht.

Es ist also wohl mehr so was wie ein Produkt aus Marktanteil und Machbarkeit, was die Anfälligkeit eines Systems für Malware bestimmt. Und nicht nur auf OSX gibt es nur wenig bis gar keine Schadsoftware, auch linux ist, obwohl es einen recht großen Marktanteil insbesondere bei Servern hat, immer noch recht verschont geblieben. Marktanteil an Servern.

Wichtig ist dabei auch zu unterscheiden zwischen Viren und Angriffen durch Hacker - vor letzterem ist kein System so wirklich sicher. Und wenn jemand in einen Rechner einbrechen will, gelingt ihm das auch - genügend kriminelle Energie und Motivation vorausgesetzt (siehe NSA & Co).

Linux-Server werden natürlich von Hackern angegrifen, aber entgegen der Bedrohung durch Viren ist das nicht etwas, das „automatisch“ und millionenfach passiert. Da sitzt eine Gruppe von Menschen, die sich entschließen den Server dieser oder jener Firma / Organisation zu hacken um dieses oder jenes zu machen.

Außerdem: „Jeden Rechner, den ich anfassen kann, kann ich auch hacken“.

Bestes Beispiel: das iPhone mit dem Jailbreak. Es ist eigentlich nur eine Frage des Aufwandes… den Rechner eines Schülers zu knacken ist sicherlich nicht so „interessant“ wie den von einem Vorstandsvorsitzenden einer Firma oder einem Politiker.

Gleiches gilt für Viren: die Viren werden nicht „zum Spass“ entwickelt - zumindest meistens nicht. Sondern damit soll auch Geld verdient werden - das ist der einzige Sinn und Zweck davon.

Deswegen hält sich auch immer noch hartnäckig das Gerücht, dass zumindest einige Viren, von den Anti-Viren-Software Herstellern selbst in Umlauf gebracht werden. Wer weiß… 100% ausschließen kann ich das nicht - zumindest habe ich einige Leute kennengelernt, die das wohl bestätigen können.

Wenn das so ist, frage ich mich allerdings, warum es noch keine nennenswerten Viren für Linux oder Mac OSX gibt. Das wäre doch ein gefundenes Fressen für die Antivirenhersteller. Ein komplett neues Marktsegment…

Ich gehe momentan eher davon aus, dass die Viren wirklich nur entwickelt werden, um damit direkt (durch Datendiebstahl, Kreditkarten etc) oder indirekt (durch Spammen, einsetzen als Zwischenstation auf dem Weg zum richtigen Ziel) Geld zu verdienen. Und dann sind wir wieder bei dem Produkt aus Marktanteil und Machbarkeit…

Schadsoftware grundsätzlich

Man muss ja mal grundsätzlich zwischen den verschiedenen Arten von Schadsoftware unterscheiden. In den Medien und den Köpfen der nicht-IT'ler wird das alles gerne als "Virus" bezeichnet. Allerdings ist es für einen sinnvollen Schutz vor diesen Schädlingen durchaus wichtig zu wissen, wovor ich mich genau schützen muss.

Man unterscheidet 3 Arten: Viren, Trojaner und Würmer (wobei natürlich auch viele Mischversionen dieser drei existieren - deswegen Allgemein: Schadsoftware):

  • Viren sind kleine Programme, die sich auf dem System selbst verbreiten und dort Schindluder treiben. Meistens nutzen diese irgendwelche Sicherheitslöcher aus, um dann etwas zu tun, was der Benutzer eigentlich nicht will (DDOS-Attacken gegen dritte, Passwörter ausspähen etc) Wikipedia Definition. Heutzutage sind das meistens Link-Viren. D.h. sie hängen sich an ein Programm oder eine Datei quasi „huckepack“ an. Früher auch sehr weit verbreitet sogenannte Bootsector-Viren wie der berühmt berüchtigte parity B.
  • Würmer sind Schadprogramme, die sich über das Netz weiter verbreiten und Netzwerksicherheitslücken ausnutzen um neue Rechner zu infizieren. Wikipedia. Vor Würmern kann man sich also ganz einfach schützen, indem man kein Netzwerk benutzt - oder zumindest kein Internet. So unpraktisch das klingt, ich war bei einigen Behörden und Abteilungen vor Ort, die sich genau so schützen. Allerdings nicht nur vor Würmern, sondern auch vor Datendiebstahl. Da kann der Zugriff auf das Internet nur durch einen abgeschotteten Rechner erfolgen, der keinen Zugriff ins lokale Netz hat.
  • Trojaner sind meisten als normale "Programme" oder "Werkzeuge" getarnt und machen im Hintergrund etwas, das der Benutzer normalerweise nicht will, oder zumindest von dem er nicht weiß, dass dieses Werkzeugt das tut. Hier wird der User meistens gefragt, ob z. B. der Taschenrechner, den er grad aus dem Netz gesaugt hat, denn die Berechtigung bekommt, auf die Kontakte zuzugreifen etc. Wikipedia zumindest unter OSX wird man in den häufigsten Fällen davor gewarnt.
  • ein neuer Typ an Schadsoftware hat es mit wannacry gerade zu trauriger Berühmtheit gebracht: Ransomware dabei wird meist ein Trojaner genutzt um sich auf dem System einzunisten und sämtliche Daten auf den Platten zu verschlüsseln. Entschlüsseln geht nur, wenn man an den Autor eine gewissen Anzahl bitcoins sendet.
  • natürlich tritt Schadsoftware nicht nur in diesen Reinformen auf, meistens sind es eher Mischungen (wie z.B. auch wannacry eine ist): Trojaner um sich einzunisten, Virus, weil es das system weiter infiziert und systemrechte erlangt, Wurm weil er sich weiter über das Netzwerk verbreitet.

am Mac?

Solche "Warnmeldungen" tauchen am Mac eigentlich fast immer auf, wenn eine Schadsoftware irgendwas tun will - so geschehen auch bei dem Trojaner, der sich über Java in das System eingebettet hat. Da wurden die User auch gefragt, ob sie der Software dies oder jenes erlabuen und es wurde einfach abgenickt.

Versteht mich bitte richtig, ich will die Gefahr von Schadsoftware gar nicht runterspielen, die ist sicherlich vorhanden. Vor Trojanern schützt einen eigentlich nur der gesunde Menschenverstand:

  • Warum muss der Taschenrechner meine Kontakte lesen?
  • Warum will meine neue Notizzettelapp Admin Rechte haben?
  • Warum will Software XY dies oder jenes tun?
  • Ist es clever ein Tool von einer Seite herunterzuladen, die zwielichtige Angebote (cracks, Exploits, raubkopien oder serials) anpreist?

Schwierig wird es, wenn der Trojaner sich auch noch (wie ein Virus) ins System hackt und dort Sicherheitslücken ausnutzt, so dass der User eben nicht mehr gefragt wird. Da ist eine Sichere Betriebssystemarchitektur von Nöten, die das nach Möglichkeit verhindert - bei allen Unixen ist das normalerweise der Fall.

Viren und Würmern kann man nicht so leicht verhindern, denn diese nutzen ja Bugs und Fehler im System aus. Aber auch da sind die Unix Betriebssysteme (und OSX ist eines) durch ihre Architektur wesentlich besser aufgestellt als andere.

Das liegt zum einen an der saubereren Trennung zwischen dem "System" und den "Userprozessen" also auch an der saubereren Trennung zwischen den Usern untereinander bzw deren Prozessen selbst. Und zu Guter Letzt wurde ja auch noch das Sandboxing eingeführt. Auch die grafische Oberfläche ist nicht so eng an den Betriebssystemkern geknüpft wie es z.B. in Windows seit NT der Fall ist.

Es hängt aber immer noch ganz besonders von dem Admin des Systems ab, wie sicher es denn unterm Strich wirklich ist.

Schadsoftware auf dem mobilen Endgerät

Wenn wir schon über die Gefahren von schädlicher Software reden, sollten wir auch mal die momentan oft und viel verwendeten mobilen Endgeräte nicht außer Acht lassen. Gerade Smarphones & Co sind beliebte Angriffsziele, weil sie zum einen eine Menge interessanter Daten beinhalten und es sich mit ihnen leicht Geld machen lässt (z.B. durch versenden von SMS).

Der "Einbruch" in solch abgeschlossene Systeme funktioniert oft über Sicherheitslöcher in dem zugrunde liegenden Betriebssystem, aber auch Angriffe mit sog. social engeneering passieren. Dabei wird der Benutzer irgendwie dazu gebracht, irgendeine Aktion durchzuführen, um einen Trojaner zu installieren oder das System so zu öffnen, dass ein Angreifer eben alles machen kann. Oder der Trojaner gibt sich einfach als eine andere App aus (zum Beispiel in dem die App kopiert und verändert wird).

Trojaner auf Smartphones kommen meist getarnt als kleine nützliche Anwendungen daher - z.b. als Taschenlampe - und lesen dann das Adressbuch aus oder versenden kostenpflichtige SMS, schalten Video und Audio Aufnahme an und überwachen so den Besitzer oder oder oder. Dem kann man nur schwer begegnen, weil man ja im Vorhinein nicht weiß, ob die App die man sich grad installieren will, etwas böses tut. Apple begegnet dem mit dem Review Prozess. Jede App muss, bevor sie im Appstore von irgendjemandem runtergeladen werden kann, sowohl automatisch als auch von einem Apple-Mitarbeiter geprüft werden. Dabei wird sicher gestellt, dass die App keine APIs nutzt, die nicht öffentlich genutzt werden sollen (z.B. Zugriff auf Interna des Systems, Änderungen von Einstellungen etc) und das die App genau das tut, was sie behauptet zu tun - und nicht mehr! Auch das ist kein 100%iger Schutz, aber bringt schon eine Menge (zumindest gibt es momentan keine nennenswerte Malware für iOS). Wobei ich gerne auch WhatsApp, Viber & Co als Malware bezeichnen würde! Diese machen eigentlich genau das, was ein Virus tun würde: Daten abgreifen und auf einen Server hochladen. Nur da stimmt der User noch freudig zu und findet es gut... Aber das ist ein anderes Thema. iOS ist damit etwas besser dran als Android (solange man sein iPhone nicht jailbreaked - dann ist es schnell ein Sicherheitsrisiko). Auf dem offenen Betriebssystem hat man gleich mehrere Probleme. Android basiert zwar auf Unix, allerdings wurden einige Securityfeatures, die Unixe von Haus aus mitbringen, "pervertiert". So wird eine "Art" Sandbox erzeugt, indem man einfach für jede App auf dem Gerät einen neuen User anlegt. So werden die Prozesse sauber voneinander getrennt. An sich eine gute Idee. Leider erzeugt das gleich viele Probleme mit dem Zugriff auf z.B. die SD-Card, die dann für alle lesbar sein muss.

Auch die Sicherheitseinstellungen der Apps kann man momentan nur nach dem Motto "all or nothing" nutzen. Und tut sich auch schwer, die Berechtigungen nachträglich zu ändern. (Das hat sich bei aktuelleren Versionen von Android schon geändert - allerdings nur marginal). Problematisch ist dabei, dass man die Berechtigung im "Vorhinein" bei der Installation der App statisch vergeben muss und sie später nicht mehr anpassen kann. Dieses "All or nothing"-Prinzip macht es Malware Herstellern natürlich ein leichtes, auch da sich die Leute angewöhnt haben, die Berechtigungswünsche einer App einfach abzunicken.

Außerdem haben Andoid apps von Haus aus die Möglichkeit, Code über das Netz nachzuladen - etwas was unter iOS verboten ist. Aus gutem Grund. Wie kann ich denn herausfinden, ob wenn heute die App Wetterdaten lädt, sie morgen nicht eine Schadroutine herunterlädt, die kostenpflichtige SMS verschickt?

Ein weiteres Problem ist, dass es für Android keinen "einzigen" Store gibt, sondern man kann Software aus nahezu jeder beliebigen Quelle installieren.

Natürlich hat auch ein Betriebssystem selbst Fehler, die man evtl. ausnutzen kann, um beliebig guten oder bösen Code auf dem Gerät auszuführen. Deswegen gibt es ja in regelmäßigen Abständen Updates für sowohl iOS als auch Android. Diese sollen die Probleme beheben und das System so sicherer machen. Bei iOS hat man die Gewissheit, dass man ein paar Jahre mit aktueller Software fahren kann (iOS 7 läuft auch auf einem 3 Jahre alten iPhone 4). Bei Android ist das stark vom Hersteller abhängig, da kommt es schon mal vor, dass die Updates für ein Gerät nach 1,5 Jahren eingestellt werden. Insbesondere Android phones aus der Billig-Fraktion werden heute noch mit Android 2.x ausgeliefert. Mit allen darin befindlichen Fehlern und Sicherheitslücken - was es den Bösen Jungs natürlich auch wieder leichter macht.

Die Kombination des etwas unsichereren Ansatzes des System mit den unsicheren Quellen von Software, machen Andoid deutlich anfälliger für Schadsoftware und dadurch auch besonders interessant für Bösewichte. Was zu so grotesken Dingen führt, wie Virenscanner und Firewalls für Smartphones. (Sicherheit von Android: nachlesen)

Man kann von Apple halten was man will, der Ansatz der ausnahmslosen Kontrolle ist für den Endverbraucher zumindest besser. Man muss sich im Normalfall keine Sorgen machen, wenn man Software aus Apples App-Store installiert. Auch wenn man durch die Regeln des Appstore nicht "alles" mit seinem Telefon machen kann... der Normaluser benötigt das eh nicht und merkt nix davon.

Der Poweruser kann sich ja sein Telefon jailbreaken - wenn er weiß was er tut. Denn dann ist ein iPhone auch unsicher - wenn man nicht aufpasst viel unsicherer als Android.

Einfallstor Software

Dummerweise können Viren auch Fehler in auf dem System (egal ob Computer oder Smartphone) befindlicher Software nutzen. Das muss also nicht immer das sein, was man gemeinhin als Betriebssystem bezeichnet. Der Einbruch kann auch über eine Software von einem Drittanbieter kommen, wie es z.B. mit der über Java verteilten Schadsoftware letztes Jahr der Fall war - Einfallstor war Java, nicht OSX (auch wenn die Meldung mal wieder war, dass OSX doch so unsicher sei)! Da ist wieder der gesunde Menschenverstand gefragt, denn auch in diesem Fall wurden die User gebeten dem Java-Plugin auf irgendeiner Webseite, mehr oder minder admin-Rechte zu gewähren. Und auch das wurde abgenickt...

Natürlich kann OSX oder irgend ein Betriebssystem nichts dagegen tun, wenn eine Drittsoftware Unsinn treibt - vor allem, da der User ja zugestimmt hat. Allerdings kann eine so eingedrungene Schadsoftware ja "nur" das tun, was auch die zum Einbruch benutzte App tun kann. Und um die Auswirkungen dessen noch weiter zu beschränken, laufen auf OSX und iOs alle Anwendungen in einer sog. Sandbox. In dieser Sandbox kann man eben nur das machen, was eine "normale" App eben so machen kann. Wenn diese keine Adminrechte hat, hat die Schadsoftware die natürlich zunächst auch nicht.

Wenn also alle Software, die man so laufen hat, mit minimalen Rechten läuft, kann auch eine evtl. darüber kommende Schadsoftware nicht viel schlimmes anstellen - zumindest nicht den Rechner karpern und als Spamschleuder verwenden oder auf andere Prozesse zugreifen oder oder. Allerdings ist es ja nicht das Ziel, eine Software dazu zu bringen, irgend einen Mist zu machen (da ist ja kein Nutzen für den Virenentwickler dahinter), sondern den Rechner dazu zu bringen, z.B. bei einer DDOS-Attacke mitzumachen oder ihn als Spambot zu missbrauchen.

Vor allem aber will man es schwer machen, den Schädling wieder loszuwerden. D.h. der (Schad-)Prozess und die zugehörigen Dateien sollten entsprechend im System "verankert" werden. Das geht im Normalfall aber nur, wenn der Schädling mehr Rechte bekommt, als er momentan hat. Stichwort "Privilege Escalation" - wie kann ein Prozess mehr Rechte erlangen, als ihm beim Start zugebilligt wurden - am besten ohne Zutun und ohne Wissen des Users. Im Normalfall sollte bei solch einem Versuch der User gefragt werden und der kann das erlauben, oder eben auch nicht (kann man einfach daran erkennen, dass ein Zugriff die Sandbox verlässt - sofern das OS Sandboxing unterstützt). Natürlich versuchen die Schadsoftwareentwickler das irgendwie zu umgehen. Das ist unter Unix allerdings etwas schwieriger, als es unter z.B. Windows der Fall ist. (das liegt unter anderem an der anderen Architektur, siehe hier oder hier oder hier. In den meisten Fällen unter OSX wird der User darüber informiert, dass die Software irgendwas komisches machen will.

Aber etwas sollte uns dabei noch viel mehr zu denken geben: wenn ich beliebige Software auf dem Mac als Einfallstor verwenden kann, dann sollte ich die Zahl der Programme ja reduzieren. Insbesondere die Zahl der Programme, die die ganze Zeit laufen und/oder die mit externen Quellen zu tun haben (Browser/Extensions) oder Adminrechte benötigen (wie z.B. Virenscanner). Damit Virenscanner ihre Arbeit verrichten können, benötigen sie Zugriff auf alles und jeden auf dem Rechner. Das geht nur mit Adminrechten. Nicht nur deswegen sind die Virenscanner häufig auch Ziel von Angriffen von Viren und werden selbst als Virenschleuder misbraucht. (Zumindest so was ist schon unter Windows passiert)

Wenn man dann noch hinzurechnet, dass eine Anti-Viren-Software ja "nur" die Viren erkennen kann, die schon eine Weile im Umlauf sind, wird der Virenschutz nicht wirklich stark erhöht, wenn man sich eine solche Software auf den Rechner packt.

Virenscanner auf dem Server

Das spricht gegen einen Virenscanner auf meinem Desktop - ganz anders wird die Sache aber auf dem Server. Nutze ich den z.B. als Mailserver, so muss ich schon dafür sorgen, dass meine Windows-User nicht mit Viren bombardiert werden. Da ist ein Virenscanner quasi ein Muss... was vermutlich auch der Grund ist, warum standardmäßig bei MacOS-Server ein Virenscanner dabei ist.

Das ganze kann man natürlich auch weiter treiben: arbeite ich mit vielen Windows Usern zusammen, die mir evtl. Viren-Mail senden, so sollte ich die auf keinen Fall weiter leiten (sonst wird ja noch jemand infiziert). Dazu muss ich diese Mails aber erkennen. Das ist im Deutschsprachigen Raum noch recht leicht, bisher bekam ich als Virenmail nur irgendwelches Kauderwelsch was schnell als Unsinn zu erkennen war. Arbeitet man international ist die Sache schon schwieriger zu durchschauen. Da ist ein Virenscanner sicherlich nett -für die anderen.

Man darf aber auch nicht vergessen, dass die Virenscanner natürlich auch Ressourcen auf der Maschine benötigen... Und das zum Teil nicht zu knapp (sie schalten sich z.B. bei jedem Dateizugriff dazwischen, oft auch bei Netzwerkkommunikation - das bremst).

Sicherheit ist nicht umsonst

Egal, was man nun macht. Sicherheit in der IT gibts nicht umsonst. Im günstigsten fall wird es umständlich, Dinge zu benutzen, da man Aktionen z.b. Nur durch komplexe Authentifizierungen durchführen kann oder ständig irgendwas bestätigen muss. Im ungünstigen fall kommt es zu Fehlern, weil zu komplex, wird es sehr teuer (Hardware) und eben zudem noch umständlich. Man muss sich überlegen, wo ist welches Maß an Sicherheit sinnvoll. Wo nicht. Ein Irisscanner vor dem Klo hat vermutlich nur bedingt seine Berechtugung...

Gesunder Menschenverstand

Die beste Waffe gegen Malware ist immer noch das Ding was zwischen den Ohren sitzt! Den Kopf einschalten ist wichtig und kann von keiner noch so ausgeklügelten Software ersetzt werden. Deswegen ist es auch nicht ungefährlich, sich auf Unix Systemen einfach zu sicher zu fühlen, so was führt zu Schlampereien etc. Insbesondere wenn man keine vernünftigen Passwörter vergibt, ist man gefährdet. Dann muss ein Virus gar nix mehr „hacken“ - er errät das Passwort und gut ist bzw. nicht gut! Ich will hier gar nicht zu Paranoia aufrufen. Man sollte einfach mit offenen Augen durchs Netz surfen. Software nur von vertrauenswürdigen Quellen installieren und dann diese auch mal hinterfragen. Überhaupt sollte man überlegen, welche App man benutzt, und ob man damit „leben“ kann. Bei Viber und WhatsApp sollte man wirklich mal hinterfragen, was da passiert.

If the product is for free, then YOU are the product

Fazit

Ich habe versucht das hier wenig Anti-Microsoft’sch zu schreiben, was nicht leicht fällt. Viele Sicherheitsprobleme treten momentan nur auf Windows-Systemen auf. Dummerweise ist man bei Windows selbst derjenige, der das System absichern muss und etwaige Sicherheitlücken durch sinnvollen Umgang mit dem Medium Internet und durch vorsichtiges Handeln zu umgehen. Mal abgesehen davon, dass Anti-Virensoftware auch auf Windows nur einen begrenzten Schutz liefert (einige Antivirenprogramme haben eine echt schlechte Erkennungsrate und wenn die Viren aktuell sind, erkennt es gar keiner).

Sollte man auf dem Mac nun eine Antivirensoftware installieren? Ich tendiere eher zu nein, aber es gibt auch gute Gründe das anders zu sehen (und ich bin nicht der einzige: hier und hier. Insbesondere sollte man zwischen Desktop und Server Einsatz unterscheiden. Und das nicht nur für osx - auch auf Linux Servern ist ein Virenscanner sicherlich sinnvoll, wenn Dienste auch für Windows System angeboten werden.

Fast alles, was ich hier geschrieben habe, gilt insbesondere auch für Linux / Unix - oder allgemein für Unix-Betriebssysteme. Auch da gibt es keine oder kaum relevante Schädlinge in freier Wildbahn.


Kategorie: Computer --> Programmierung

Markdown - DER neue coole Weg, Texte zu schreiben?

Fr, 26. 05. 2017 - Tags: markdown

Worum gehts?

Wir schreiben unheimlich viele Texte. Jeder von uns, der am Computer arbeitet tut das, bzw muss das tun. Und wir alle kämpfen immer wieder mit den Formatierungen. Text, ohne irgendwelche Einrückungen, Überschriften, hervorhebungen oder fettdruck liest sich langweilig und es fehlt einem auch ein zusätzliches Ausdrucksmittel.

Klar, die meisten Editoren bieten ein WYSIWYG: "What you see is what you get" (du bekommst, was du siehst). Das ist zwar nett, aber kompliziert zu bedienen. Also mich hat das immer genervt. Insbesondere wenn man den Text editiert ist dann danach eben nicht mehr alles richtig fett oder kursiv gedruckt.

Also, wenn man alles tippen will, warum nicht einfach Steuersequenzen in den Text einfügen und in einem zusätzlichen Schritt nachher rendern lassen?

Die Idee ist alles andere als "neu": Früher gab es das auch schon, dass man Texte mit Steuersequenzen anreichern konnte, um damit Formatierungen oder einfach mehr zu ermöglichen. Das, was alle benutzen ohne es zu wissen ist vermutlich HTML - Hypertext Markup Language. Dort kann man (auch heute noch) recht einfach in einen Text einfach etwas kursiv oder fett drucken. Allerdings hat sich das ganze dann doch gewandelt und HTML ist ebe nicht mehr nur "Hypertext".

Ein anderer (unter nerds) bekannter Vertreter dieser Gattung ist sicherlich LaTeX - das hat sich als Textsatzsystem darauf konzentriert, einen guten Ausdruck zu produzieren. Deswegen vermutlich ist es besonders für Diplomarbeiten so beliebt.

Diese "Sprachen" sind aber allesamt viel zu kompliziert um z.B. einfach mal eine Email zu schreiben oder sonst was... Und genau da hilft uns Markdown

Warum?

Aber warum will man überhaupt seinen Text mit so was anreichern, wenn es doch eh anders, und zudem noch mit der Maus geht?

Ja, mit der Maus kann es funktionieren. Aber diejenigen unter uns, die schnell tippen (da zähle ich mich mal dazu) wollen nicht beim tippen andauernd zwischen Maus und Tastatur wechseln, das bremst. Und das schöne an Markdown ist ja, dass es als Steuerzeichen, mehr oder minder normale Zeichen benutzt, wodurch man gaaanz simpel die Steuersequenzen unterm tippen einfügen kann.

Beispiel: ich würde gerne eine Wort oder Absatz hervorheben (kursiv), dann hänge ich einfach einen _ vorne und hinten dran - fertig.

oder ich benötige eine Aufzählungsliste.... ich beginne einen Absatz mit 1. und dann wird er entsprechend eingerückt und so weiter.

Eine genauere Beschreibung davon, was man alles in Markdown machen kann, bekommt man hier.

Insbesondere schreibe ich alle JBlog-Einträge mit Markdown! Dadurch spare ich mir in der Entwicklung einen WYSIWYG-Editor fürs Frontend. Außerdem speichert sich text viel einfacher, als irgend ein propriäteres XML-Gedöns.

Gerade für Entwickler hat markdown einen großen Vorteil, es kann nämlich (vorausgesetzt es ist richtig konfiguriert) Sourcecode entsprechend formatiert darstellen:

Beispiel Java Code
public static void main(String args[]){
     System.out.println("Markdown kann auch bunt");
}
Beispiel Bash-Shell script

#!/bin/bash                              
echo "und spricht verschiedenen Sprachen"
                                         
for in $(ls); do                       
   echo "This is rocking $i"             
done                                     

Dazu werde ich noch mal einen Post hier veröffentlichen, denn um das Syntax-Highlighting hin zu bekommen, musste ich den Markdown-Renderer etwas erweitern.

cool, und jetzt?

Klar, man muss das ein wenig üben und sich die Kürzel merken. Dennoch, lohnt es sich, das zu tun. Die Tools sind da und man kann damit auf einfache Art und Weise, ansprechende Texte erzeugen.

Das schöne ist auch, dass es da eine große Community gibt, die immer wieder mit Neuerungen und Erweiterungen den Wortschatz erweitert. So gibt es z.B. Erweiterungen der reinen Markdown Syntax wie CriticsMarkup, oder noch allgemeiner die Erweiterungen in multimarkdown

Alles in allem ist das wirklich mächtig und konzentriert sich auf das, um dass es geht: Den Text!

Eine Übersicht der Standardfunktionen gibt es hier

Markdown auf dem Mac

Auf dem Mac gibt es auch schon sehr guten support. Einen Haufen Editoren mit Preview, die dann gleich PDF oder HTML erzeugen können (oder RTF, was wiederum z.B. Pages oder Word lesen können). Ich werde mal ein paar Test of Tools - Beiträge zu den verschiedenen Editoren machen. Aber hier schon mal eine Liste (ohen Anspruch auf Vollständigkeit)

Auch in den Entwicklungsumgebungen wie XCode, IntelliJ und co wird markdown unterstützt. Also um Documentation mit in das Projekt aufzunehmen, ist Markdown sicherlich eine Variante.

Leider ist der Support in Mail noch ein kleines Manko. Apple Mail kann kein Markdown. Da muss man sich mit ein paar Tricks behelfen, am besten mit markdown-here. (s.o.)

Das ist aber zugegeben etwas umständlich. Besser sind Mailer, die Markdown nativ unterstützen. Wie z.B. MailMate oder auch AirMail2 (letzterer hat andere Mankos, insbesondere im Bezug auf Sicherheit, aber das ist ein anderes Thema).

Fazit

Markdown hat eine Menge Vorteile, die vor allem durch die mittlerweile excellenten Tools so richtig zum Tragen kommen. Man kann ganz einfach seinen Text runterschreiben und bekommt ein schön gerendertes Dokument, dass z.B. einfach als PDF abgelegt, versendet oder sonst wie genutzt werden kann.

Also, nicht nur für Entwickler empfiehlt es sich, mal einen Blick auf Markdown zu werfen. Auch für Vieltipper von Emails, Texten, Berichten, Büchern was auch immer ist es sicher einen Blick wert. Allerdings wird man sich an die Werkzeuge anpassen müssen und man hat einen zusätzlichen Schritt, bevor man ein druckfertiges Dokument hat.


Kategorie: Allgemeines

ErgodoxLayoutGenerator

Sa, 20. 05. 2017 - Tags: english ergodox-ez

I was a little bit bored of always creating the layout by "hand" and I have to admit that I never got the Massdrop Configurator to work properly. And I never managed it to get the Overview PNG up to date with all of my changes. Hence I decided to create a little tool, to help me with that.

  • it should create the keymap.c file
  • it might also read it - no need for an own filetype
  • it should have support for Macros - there are only a couple of macro types that are useful. Like type that sequence of keys or if pressed, press these keys, if typed, type this sequence
  • it should create a GUI that could be used as documentation for it

So... The first milestone is finished, I created a little java application that can read my keymap.c and is able to show the layout graphically. Yes I know, it does not look that good, but it is ok...

Here is the first Screenshot of this simple tool, showing my current osx_de layout:

Things still to be done:

  • proper C-file export
  • macro support
  • sorting of layers
  • KeyMapping
  • UI improvements...

so for now, this tool actually helps with documenting of keymaps. It reads in a keymap.c file and shows it in a more graphical way. This is an example:

The tool is available on Github: https://github.com/sboesebeck/ErgodoxLayoutGenerator

Disclaimer: This is in prototype phase. Not really more than a proof of concept. So use it at own risk. Same for the code - it works, but there are some ugly parts in it...

Here is the documentation PNG of all layers put together. Creation of this took 5 mins.

update

Although some people thought this would be an April's fool prank - it isn't. This tool really exists and really works! It is now capable of creating overview PNGs with a click of a button. This is the overview PNG for my own layout osx_de:

But it works with all other layouts so far as well. Like the default one:

This is an example, where the parsing worked fine, but the file lacks some information. The layers do not have descriptive names. And there you also see that there are a lot of macros being called. Here most of them are just unicode output of special letters, but the ELG does not show them properly:

Things still to be done:

  • create a release, executable jar file, so that everybody can just test it.
  • fix didplay of keys - EXCLM should be a !.
  • fix parsing of macros. especially the dealing with unicode keys
  • if the display is correct, deal further with the input of keycodes
  • store as proper keymap.c

First BETA Release available Go have a look here here. This is a BETA Release, not all functionality is implemented yet. But you can create your documentation overview PNG file...

should run on all machines having java installed (current JDK8!)


Kategorie: Allgemeines

Tweet: got the first version of editing ready. Only Macro...

Sa, 20. 05. 2017 - Tags: tweet

got the first version of editing ready. Only Macros missing for now. Next: keymap.c creation... https://t.co/Ftc4bUl5Fp


Kategorie: Allgemeines

Tweet: New documentation PNG for the @ErgoDoxEZ layout os...

Sa, 20. 05. 2017 - Tags: tweet

New documentation PNG for the @ErgoDoxEZ layout osx_de. was super easy to create now... https://t.co/UsOtVoEYdk


Kategorie: Computer --> Programmierung --> Java

ErgodoxLayoutGenerator Documentation

Sa, 20. 05. 2017 - Tags: english ergodox ergodox-ez java-2

If you read my blog, you might have noticed, that I'm fond of cool keyboards. We IT-guys use them the whole day, but most keyboards are just awful to work with. So I'm glad I found a "proper" ergonomic one, my ErgodoxEZ (look at http://ergodox-ez.com for more information or read my review here).

One of the greatest things about the ErgodoxEZ is its programmability. But you actually need to know how to code, in order to get it to run easily. And even if you do, it is not very intuitive to create a c-program that runs on your keyboard and is showing your layout.

There is a WYSIWYG-Editor at massdrop.com, but unfortunately I never got it to work properly - and it is somewhat limited in functionality (like Macro support etc).

Hence, I started creating my own little tool for creating my layouts and optimizing them...

The ErgodoxLayoutGenerator

The ErgodoxLayoutGenerator (very clumsy name, but I could not think of something more better for now - lets just call it ELG for short) is programmed in Java, so it should work on all machines and OSs java is available for. You need to have the latest version of the Java8 installed... As I got some feedback already: It needs to be the latest official Oracle JDK or JRE, it does not work with OpenJDK out of the box. If you need any help using OpenJDK, just contact me...

The idea is pretty much similar to the one in massdrop, but the ErgodoxLayoutGenerator is built around the qmk firmware, and it generates a keymap.c file for your local installation!

Prerequisites and remarks

  1. you need a current version of Oracle Java installed on your system
  2. you should have a current version of the QMK-Firmware repository cloned to your machine for the LayoutGenerator to make any sense. It will still generate keymap.c files for you, but you cannot flash them to your keyboard.
  3. Although the qmk-firmware is available for a bunch of keyboards, the ErgodoxLayoutGenerator is only covering the Ergodox and ErgodoxEZ (hence the name).
  4. keep in mind, that the ErgodoxLayoutGenerator is still in development and was not heavily tested on different environments or OS's.
  5. If you have any feature requests or ideas you want to share, please visit the github project page here
  6. The ELG cannot reach the flexibility of a c-program of course. It is limited to the most basic functionalities. For example it lacks support for UTF-Characters and the GUI definitely needs to be refurbished. But I never wanted to win a desgin price with that - it should just work.
  7. The ELG does read the keymap.c file and parses it to some extend. But that means, it is very relying on the structure of the file to be more or less similar to the "official" ergodox layouts that come with the qmk-firmware. If you want to use the ELG to work with your layout, you should make sure, that your keymap file does follow this lead
  8. There is support for custom macros, where you can just add c-code to your layout. There is no checking if that is correct or highlighting or whatever.
  9. The support for non-us keyboard layouts is a bit... clumsy. You can use the proper keycodes in most cases, but especially when creating macros, the automatic generation of macro strings, is not working. It will create macros for the US layout. This is limited due to the fact that there is no regulation on how to name the keycode definitions. For example, there could be a KC_ACUT, DE_ACCENT, DE_OSX_ACT all "meaning" the same key.
  10. As the ELG is reading in your keymap.c file, things might get messy. If you use one of the standard keymaps, all should go fine. But if you use some of the advanced stuff, things will go wrong. It will probably parse the keymap and most of the functions will show up fine, but some things might go missing. At the moment there is no support for the FN[1-9]-keys! So, if your keyboard uses those, please make sure, that you replace the functionality with a macro.

The parsing of the C-Files does have its drawbacks, but the great advantage is the possibility to have ELG read in existing keymaps! That does work most of the time.

Getting Started

Usually it should be ok to get the latest release from the gitub page. Download the JAR-File attached to the release and double click it. If java is installed properly, it should start up fine and you should see a screen with an empty layout:

starting it from commandline

If the above does not work, you can try to run the jar file from commandline with java -jar ergodoxgenerator-1.0BETA2.jar - or whatever file you downloaded. If it still does not work, you'd get a proper errormessage then. On the github page you can create an issue for that.

Sometimes it might be helping, to not use the JAR-Start funktionality of java, but run it manually: java -cp ergodoxgenerator-1.0BETA2.jar de.caluga.ergodox.Main. If you get the same error as above, please create an issue at github.

compiling it yourself

If you're a java-guy, you can compile it yourself (and hopefully contribute to the project). The project is a standard maven project. So if you cloned the repository to your local machine, running mvn install should compile everything. Your executeable will then be in the directory target and called ergodoxgenerator-1.0-SNAPSHOT-shaded.jar. This one should be executeable...

Defining the QMK-Sourcedir

At the bottom of the main window, there is a button called set qmk sourcedir. Here you should set the root directory of the qmk sources. This is necessary for putting the layout at the proper position at the end. If you did not specify this directory, you always need to navigate there manually.

Opening a keymap

If you defined the QMK-Sourcedir, the open dialog will start in the correct directory for the ergodox layouts. You choose the directory of the keymap, as all keymap files actually are called keymap.c.

When the keymap was parsed successfully you should get a display of the base layer of this layout.

UI explanation

Layer chooser

Usually an ergodox layout consists of several different layers. Like when hitting ALT on a keyboard, all keys do something else. But here you are more or less free to define as many layers as you want (not really, your keyboard has limited memory). To switch to the different layers, you need to press or hold a key (see below). when changing the layer in this combobox, the layout will be shown accordingly.

Adding, renaming, deleting layers

When creating a layer, you only have one layer called base defined. The buttons on the top let you create new layers, rename them or delete them. Attention: Deleting layers and still having layer toggles or macros referencing them, will cause unexpected behavior. Also you should not rename the base layer, as this might also cause problems later.

LED indicators

on the top right of the window, you can see the 3 LEDs the ergodox does have. You can switch them on and off by clicking for the selected layer. This reflects the behaviour of the LEDs when flashed on your keyboard.

the keys

the main portion of the screen is filled with keys. These represent the corresponding key on the ergodox keyobard. If you select a key, it will be marked (green border) and a more detailed description of the key is shown in the lower part of the window. Assigning functionality to a specific key can be done via the context menu. Just right click on a key, it will be marked and then you can

  • clear: well, this usually means, that the keycode KC_TRNS is assigned to that key. This code states, that this key should behave as defined in the "previous" layer (usually base). This can of course not work in the base layer!
  • assign a key: well, you assign a keycode to that specific key. The keycode is represented in Text. All keycodes starting with KC_ are the "default" ones. There are also different keycodes for different locales or OS, like DE_OSX_. You can also assign here a combination of keys. Like "Shift-A" or "CMD-S". If you specify more than one modifier, a macro will be created for you!
  • assign layertoggle: This will create a key that can toggle a certain layer on and off.
  • assign layertoggle/type: this is temporarily toggling to a specific layer as long as the corresponding key is held. When the key is released, you return to the layer before. If you just type that key, it will issue a different keycode. For Example, y does issue CTRL when held in my layout
  • Assign macro: This is the most feature rich thing, see below. Attention: The macro functionality is not 100% implemented yet!

the legend

At the lower part of the window there are representations of some colors and keys. Those state, that a green marked key would be of type Layertoggle / type, and hence shows two informations: first line is the key being typed, 2nd line is the layer to switch to as long as the key is held

Save Button

There you will be asked for the file to store the keymap to. This file should always be named keymap.c and should be stored in the QMK-Sourcedir at keyboards/ergodox-ez/keymaps/YOUR_KEYMAP, where YOUR_KEYMAP needs to be replaced with the name of your keymap.

When you want to store a completely new keymap, you need to create this directory yourself. You can do that from within the save dialog.

Save Img

This will create a PNG showing all layers. This is useful to add to your layouts, if you want to publish them and have them merged to the official qmk repository as it makes it easier for others to use your layout. like this one:

open

Open a keymap. You need to choose the directory, not the file!

reopen last

If you are a bit like me, you usually work on your own layout again and again. The button "reopen last" will open the file you last opened or saved!

create

Creates a completely new layout - Attention There is no "are you sure"-Question yet! IF you hit that button now, you'll end up with a new empty layout!

Assigning keys

When assigning keys, you first need to choose the "prefix" of the keycode names. Usually the prefix is related to the locale. Like "DE_OSX" is the German OSX version of some keycodes. all keycodes starting with "KC_" are the default (US-layout) keycodes.

You can add a modifier to the key if you want. And there are 2 different ways these modifiers might work: all at once (like SHIFT-A for a capital A) or the modifier when held, the key when typed! Like when holding the key Y, you hold CTRL, when typing it, it is just a plain old y.

assigning a layer toggle

For this functionality you only need to define the layer you want to switch to. Quite simple. When flashed to your keyboard, the corresponding key will switch on a specific layer when hit, and switch it off again when hit again. If you switch to such a layer in that way, it is probably a good idea, to set the leds properly.

assigning layer toggle / type

as already mentioned above, this will create a key, that will temporarily switch to a layer as long as the key is pressed. If you only type the key (= pressing it shortly), you will just type a normal key.

assigning a macro

The assignment of macros is quite easy, you can just choose one from the dropdown and then hit "assign macro". This works only like that, if the file you opened has some macros defined.

If you hit the "new Macro" or "edit macro" button, the Macro editor is shown. You can create, delete, or edit the macros in this layout.

The ErgodoxLayoutGenerator supports these kind of macros:

  • TypeMacro: This is a typing macro. Which means, it will send a series of keystrokes when the key is pressed
  • HoldKeyMacro: this is very similar to the above, but there is a different set of actions that can be defined, when the key is released. Example: When the key is pressed, CMD+SHIFT is pressed, A is typed. When released, CMD+Shift are also released.
  • LongPressTypeMacro: Different behavior is the key is pressed and held or only typed shortly
  • layer toggle macro: well, use a macro to toggle a layer
  • Custom macro: custom c-code

ATTENTION The Macros only support keycodes that do not represent a combination of keys. For example the keycode DE_OSX_QUOT is actually a replacement for LSFT(DE_OSX_HASH). This will not work in a macro, it will only send the keycode DE_OSX_HASH without the modifier. If you want your macro to work in your locale you need to be aware if this key is typed with a modifier or not.

All actions a macro can do, are the following:

  • DOWN(KEYCODE). press down a key
  • UP(KEYCODE). release the key
  • TYPE(KEYCODE). Type this key
  • W(199) . Wait some milliseconds, 199 in this case
  • I(1). Change the Interval and set it to 1 in this case

you just add these together, separated by comma, and you have your macro actions for the specified case.

Additional notes

This little project was first of all only built to run on my machine and make it more easy for myself to tweak with the layout. So it is only tested on a Mac OSX machine, not sure how it will work on windows or linux.

There are still a lot of things missing:

  • gui layout could be improved a lot. Especially in the Macro-Workflow
  • Errorhandling is completely missing
  • some "are you sure"-Dialogs need to be added.
  • store if you changed something on the layout, if so, ask before quitting, erasing...
  • code quality is... prototype grade!

Compiling it

the latest versions of the ELG do have a "compile" button. When you have your keymap saved and the qmk-sourcedir is set, you can compile it. This is done by running the commands make clean and make in the qmk directory of the ergodox-ez.

This can only work, if your system is capable of compiling it. Please ensure that you have everything installed and is in your path. Take a look at the qmk-github page for more information on how to prepare your system.

When the compilation finished successfully, you can read the log output. USually that is not very interesting, if everything worked fine. On errors you can check closely what went wrong.

When this dialog is dismissed, you will be asked if you want to copy the .hex file - which is the result of the compilation - to the keymap directory. This is useful, if you want to submit your code to the official github project. When your keymap does also have a .hex file, everybody can just download an use it without having to deal with compilation and stuff.

If you just compile for yourself, hit "no" there...

little Update:

The release Candidate is here... completely with support for a new Type of Macro called ToggleLayerAndHold which will toggle a layer as long as the key is pressed, or, if the key is only typed, toggle the layer as with the TG() function call.

Also, the latest version will add a list of all Macros to the PNG file and a short description... helpful for documenting things.

And now there is a compile button, which will compile your layout if everything is set correctly! The resulting .hex file can then be uploaded to your Ergodox or Ergodox-EZ!

Bugs and issues

If you find anything not properly working and you think it is a bug in the ELG, do not hesitate and create an issue at the github page. Please provide the following:

  • the log output (for compiling and such). If it is related to the ELG, the log is not shown by default. If you want to see the output, you need to start the ELG in the shell / commandline using java -jar ergodoxgenerator-VERSION.jar
  • what happened
  • what did you want to happen
  • what did you try to accomplish
  • maybe the resulting keymap


Kategorie: Allgemeines

Jblog-Downtimes

Sa, 20. 05. 2017 - Tags: jblog

Hallo zusammen,

wie ihr ja wisst, ist die Software hier recht neu, und natürlich gab es so einige Fehler, die ich übersehen habe...

dummerweise kann ich (noch) nicht ohne downtime deployen... sorry dafür

ich werde aber versuchen es dann zu machen, wenn möglichst wenig leute online sind...


Kategorie: Computer --> Programmierung --> Java

Jblog - Java Blogging Software

Sa, 20. 05. 2017 - Tags: java blog

Ich hab ja hier schon erwähnt, das mich PHP und Wordpress ein wenig geärgert hat in den letzten Monaten und ich kurzer Hand selbst eine für mich passende Blogging-Software geschrieben habe.

Da ich ja als einziger User dieses Teil nutzen sollte, musste ich mir auch keine Gedanken zum Thema Multi-User-Berechtigungen oder so machen. Ich brauchte auch kein Theming oder Plugins oder so was... Es sollte einfach nur eine Straght-Forweward-Webanwendung sein. Mit einigen technischen Hintergedanken:

  • Java als Basis. Die Sprache kann ich halt am besten
  • Freemarker als Templating-Engine.
  • Es sollte Markdown beherrschen. Das hat wordpress auch nie so richtig hinbekommen. Ich nutze da eine Library namens Flexmark - gibt’s auf github.
  • Mongodb als Storage Engine.
  • und natürlich Morphium als POJO Mapper (gibt es hier)
  • Spring Web und Spring MVC um es leichter zu machen
  • mehrsprachen Unterstützung (naja, 2... deutsch und englisch)
  • einfache Whitelabelfähigkeit

Tja, und ähm... das war es eigentlich schon. Alles ziemlich simpel. Ich habe im Fronend dann noch auf Bootstrap 4 gesetzt. Ich weiß, ist noch nicht wirklich offiziell. Aber bisher läuft es noch ganz gut.

Die Anwendung läuft in einem Tomcat, davor ist ein Nginx geschaltet, der die SSL-Termination übernimmt. Also so weit auch alles Standard.

Das teil wird sich auch im Laufe der Zeit anpassen an neue Begebenheiten, so viel ist klar. so einige Kleinigkeiten nerven da schon... aber für den ersten Wurf ist es gar nicht so übel... emoji people:smirk


Kategorie: Computer --> Programmierung --> Java

Neue Morphium-Version V3.1.3

Mi, 17. 05. 2017 - Tags: java morphium mongodb

Dieses Release beinhaltet einige kleinere Fixes und Verbesserungen:

  • einige Tests wurde korrigiert, einige neue hinzugefügt
  • bug in storelist korrigiert, bei dem disableBufferedWriterForThread nicht ausgewertet wurd
  • Verbesserungen im Aggregator, ist jetzt leichter zu nutzen, da kein end()- Aufruf auf der Gruppe mehr nötig ist.
  • neue Aggregator-Funktionen $stdDevPop und $stdDevSamp
  • Bug im ID-Caching korrigiert, wenn mit Projektion gearbeitet wurde.
  • Bugfix cache, projection funktioniert jetzt wie erwartet
  • keine ConcurrentModificationException beim flushen des BufferedWriter mehr
  • kleinere Verbesserungen in Performance und Codequalität...

Die aktuelle Version gibt’s entweder auf github oder via maven central:

    <dependency>
	<groupId>de.caluga</groupId>
	<artifactId>morphium</artifactId>
	<version>3.1.3</version>
   </dependency>


Kategorie: Computer

Neue Blogging Software

Di, 16. 05. 2017 - Tags: java jblog security

Ursprünglich veröffentlicht auf: https://boesebeck.name

ich habe mich ja schon so einige Male über Wordpress beschwert (z.B. hier). Und das habe ich zum Anlass genommen, mal meine Software-Development-Skills zusammenzukratzen und übers Wochenende eine neue Blogging-Software zusammenzustopseln.

Raus gekommen ist diese wunderschöne (naja...ich finds ok) Seite hier. Aber zunächst mal wie es dazu kam...

PHP Sucks

naja.. nicht wieder gleich losheulen. Ich mag PHP nicht besonders, weil ich es nicht gut kenne. Und deswegen ist mir Wordpress auch ein Mysterium. Die Konfiguration ist mehr oder minder "gut Glück" und PHP an sich ist ja schon schwierig, sicher hin zu bekommen.

Dummerweise wurde mein Blog auch mehrmals gehackt und das hat mich schon genervt. Also, wollte ich was mit Java machen, aber leider gibt’s da keine echte gute / einfache Bloggingsoftware.

warum also nicht selbst machen?

Dachte ich so bei mir. So schwer kann das ja nicht sein. Also wollte ich mal ein Blog schreiben, das mit einem

  • einfachen Technology stack auskommt
  • keine komplexe Plugin-Technologie braucht, wenn es Funktionalität braucht, schreib ich die selbst emoji people:smile
  • themes oder desings... öhm... ja, das könnte besser sein, aber ich denke, das ist ok so.
  • Security... ja das leidige Thema. Ich hab die Blogging-Software (ich hab sie nicht sehr kreativ jblog getauft) ja selbst geschrieben. Eigentlich sollte es einigermassen passen, aber wer weiß das schon. Sicher ist nur: die Einfachen exploits für PHP und / oder wordpress laufen nicht mehr! Ätsch!
  • Internationalisierung war auch so ein Thema. Mit Wordpress nicht so einfach machbar. in Jblog ziemlich simpel: es kann Deutsch und Englisch. Mehr sprachen, spreche ich auch nicht, insofern ist das ok.
  • Whitelabeling: Ich hatte ja noch so ein paar andere Domains rumfliegen: boesebeck.biz aus der Zeit als ich selbständig war, caluga.de unter der meine ganzen opensource-projekte laufen und eben diese hier. Ich dachte mir, ich könnte das blog aufteilen und so die ganzen "alten" domains auch wieder zum leben erwecken.
  • eine Admin-Oberfläche: es sind jetzt zwar 3 blogs, aber ich hab keine lust, alles 3x zu administrieren. Alle nutzen die selbe DB, alle werden gleich administriert. Zeigen halt nur was anders an und sehen twas anders aus.

Jblog

ich bin ganz zufrieden damit, ehrlich gesagt und endlich sind wir live! Es hat dann doch etwas länger gedauert als ein Wochenende, aber so richtig lange dann auch nicht. ging doch erstaunlich flott...

Aber wenn jetzt so einige Links nicht mehr sauber funktionieren, oder Bilder nicht richtig angezeigt werden, seht es mir nach - ich werde das alles nachkorrigieren.

die verschiedenen Blogs

Boesebeck.name - dieses Blog hier

Das wird mein privates hauptblog sein. Da kommt der ganze hobbykram rein, Drohnentechnik, Games, Gadgets etc.

Caluga.de - das Java blog

ich möchte, da mein ganzes Opensource Zeuch, wie z.B. morphium auch dort beheimatet ist, den ganzen PRogrammierung / Java / sonstige Sprachen ja, wo ich das jetzt so schreibe, ist Java Blog wohl nicht ganz so passend

boesebeck.biz

Naja, dem Namen nach sollte es ja eh eine business Site sein, also will ich da so Dinge aus der Arbeitswelt posten. Z.B. Scrum, Vorgehensweisen etc. Mal sehen, was mir da so einfallen wird.

Updates

Ja, das wird, wie üblich, spannend werden, denn ich habe auch nicht so viel Zeit, jeden Tag neuen Content zu produzieren. Ich werde aber versuchen, jedes Blog regelmäßig mit ein wenig Content zu versorgen... mal sehen, in wie weit das klappt...

technisches

Wie oben schon erwähnt, der ganze Technikkram kommt dann auf caluga.de emoji people:smirk


Kategorie: Java --> Programmierung --> Computer

new release of Morphium V3.1.0

Mi, 02. 11. 2016 - Tags:

Hi guys,

there is a new version of morphium available V3.1.0. This one includes lots of fixes and some new features:

  • introduces logger registry
  • introduced some cachings for increased performance
  • introduced tailable cursors
  • introduced map-reduce suport
  • fixed: morphium ID lowercase support for backward compatibility
  • some code quality improvements

This should be a drop-in replacement for all 3.x versions of morphium.

you can download it here https://github.com/sboesebeck/morphium/releases or via maven central.


Kategorie: Computer

First Beta release of Morphium 3.0

Do, 07. 04. 2016 - Tags: java-2 mongodb morphium-2

Morphium 3.0 is available in a beta stage. You can download it here.

Have a look at the updated documentation, especially regarding the drivers, new iterators and such... also look here and here for more information about the changes in morphium 3.0!

happy hacking!


Kategorie: Java --> Programmierung --> Computer

Logging in Java - example in Morphium

Mi, 02. 03. 2016 - Tags:

Whatever programming language you use, the first thing you learn is how to write something to the console - you create a log output in a sense. This is very important, as you need to read through your logs in order to find out what exactly went wrong when you encounter problems.

Since a couple of JDK-Versions ago, java did not offer a real, configurable way of creating log output. So, everybody created their own logging mechanism. That worked fine to an extent...

Someone came to the conclusion, that logging is so fundamental, we need a framework for it! For creating a line of text on the console, you need a framework... And that's when things get ugly.

Right now, there are several logging frameworks available, all of those behave totally differently.

There is the jdk standard in the package java.util.logging (the cool kids say JUL), then there's log4j (or logback as it is called now) which is kind of a quasi standard right now, and there is slf4j which is more or less kind of a meta framework for logging frameworks. That can configure most of the other logging frameworks out there.

All fine, choose the framework that suits you most...NOT

You might think "cool, I go for JUL" but then you start configuring it, start up your application, use some libraries and you will learn quite fast, that those libraries use their own favorite logging framework, probably different from your choice. This is causing so much trouble in some cases, as things get mixed up and in bigger application you end up needing to configure just every logging framework out there.

The "best" libraries are the ones like the mongodb java diver. These tiny little thingies use some kind of logging gate! The code checks, if log4j is available, than use that. And if not, use JUL. So, if you want to have everything using JUL, you will end up having problems with the mongodb driver, as soon as for some reason you end up with log4j being in your classpath.

Thanks to problems like this, you need to configure at least two logging frameworks in order to be able to get rid of unwanted output or get it to produce the correct output you want. And to be honest: We did not manage to get rid of the annoying debug output of the mongodb java driver yet.

one word about log4j and performance

Just to mention something. We were using log4j originally. But we endet up with huge performance problems.

Usually, when using log4j you create a static logger instance in your class and use it. This one stays in Memory as long as the class is in Memory.

Problem is: the access has to be synchronized in some way as several therads access the same instance of a logger. This was killing us. In our tests we saw that when getting a bit load on the machines, log4j was blocking most of the threads in order to be able to do its job.

This was inacceptable. We were thinking about a solution, especially as morphium was using log4j as well.

As all other frameworks were kind of having similar issues (or at least could have) and we had the configuration issues, we decided to create our own, simple logger. We also included it in Morphium, because we wanted morphium to have as few dependencies as possible.

So, morphium now uses a simple logger, called logger...

logging in morphium

The logger class is called de.caluga.morphium.Logger and needs to be instanciated with new. The logger is not threadsafe, that means it should not be used by many threads simultaneously (although that should not be a problem, as the logger does not have much logic in it, but it might cause things to become mixed up in your logfile).

The configuration is also rather simple, you have several options:

  • add an option to your jvm, like -Dmorphium.log.level=2
  • add some environment variable, like morphium_log_file=/var/log/morphium.log
  • or set it in your logger instance, like Logger l=new Logger(this.getClass().getName()); l.setLevel(5);

alls configurations can be prefixed, that means if you want to change the setting for a specific class or package, you just need to add the setting to the name of the option, like -Dmorphium.log.level.de.caluga.morphium.driver=4

Available settings are:

  • log.level: well, self explanatory. level can be between 0 (no logging) and 5 (debugging)
  • log.file: define a log file, can also be STDERR, STDOUT or - . The dash is a synonym for STDOUT
  • log.synced: do a synced write. If set to false, log output will be buffered (recommended for production environment)
  • log.delegate: can be either jul, log4j or an own classname (FQN). If not set, it will use morphiums own logger implementation. IF you want to use your own logger implementation, you need to implement the LoggerDelegate-Interface.

Since we used the simple morphium implementation of the logger, we increased performance by about 50%! Just for the logging output.

Logging is more important than most engineers think, and it may have a bigger impact on performance than people realize. This way presented above of including a simple logger might not be the best solution for everybody (especially when you need to be able to configure the output or more complex output rules e.g. to several destinations), but it certainly was a very good solution in our case.


Kategorie: Java --> Programmierung --> Computer

Update on Morphium 3.0

Do, 25. 02. 2016 - Tags: english java-2 morphium-2

Just wanted to give a short update on how the development for Morphium 3.0 is progressing.

  • it seems like the performance is increased by the update. We’re now running some load tests, but the first results are quite promising.
  • The Morphium Mongo Driver will be brought to a production ready stage. Right now, it is still not as performant as it could and has some issues with load balancing and failover. But most of the time it is running stable and quite fast.
  • We want to use the new Morphium 3.0 including the MorphiumDriver on http://holidays.hrs.de. there we learned that the code migration is not as hard as expected, it’s harder to move to jdk1.8
  • making it possible to switch of automatic index creation (which causes a query to mongo in order to see, if the collection exists) looks as if it will increase write performance a lot * still hoping that the new driver will deal with the occasionally happening problem regarding read timeouts from mongodb, although the mongo is not really busy.
  • the in MemoryDriver is great for testing business logic
  • the SingleConnectDriver is great for singlethreadded applications!

In total it is a worthy update, bringing a lot new features and improvements. Stay tunedMovie Carol (2015)


Kategorie: Computer

It happened - this site was hacked... partly.

Mo, 15. 02. 2016 - Tags:

you might have noticed, that this site was down for some days due to some hacking.This is a bit embarrassing, actually. Have to admit, that I did not really see this coming.

The system was not affected, but the wordpress installation here was. It was very strange... I keep wordpress installation up to date, always install the latest releases. Wordpress itself does not have write access to any of the installation directories except the upload dir.

And there were the first files, that should not be there...

 ./2014/09/odbc_cursor.php 
./2014/09/Morphium-Documentation-13964d.php 
./2014/09/odbc_cursor1525.php 
./2014/09/MorphiumDoku-147b.php 
./2014/09/odbc_cursor432.php 
./2013/02/mt_srand46419c.php 
./2013/02/mt_srand464.php 
./2013/02/mt_srand.php

These were in the upload dir of wordpress and there is actually no php allowed! should not be there at all! The content of those files look very similar, obfuscated php code,contained in some *eval code... easily to detect as malware... But that is not all... there was more.

Judging from the timestamp it seems like the first infection came using si-captcha-for-wordpress. Isn't that ironic! A captcha that actually should increase security now is the reason for being hacked it seems.

This plugin contained several additional files called like Readmy384.php. This contained again those obfuscated php crap.

I did not investigate further, disabled user registration for now (you can still comment though), did a clean re-install of wordpress, checked the database for infections of malicious code and removed the affected plugins...

it does not seem, there was any unauthorized access to the database, it also does not seem that there was some access to the system itself. All seems secure so far. I really hope, I fixed everything. If you have any suggestions regarding this - don't hesitate to contact me. Thanks in advance.

I also created some monitoring for wordpress. Usually there should never be a write access to the installation directory, only to uploads maybe, but nothing else. If some write access or change will happen, I will be informed. This should prevent those things to happen again unseen.

I did some hardening on the wordpress installation. Seems like I played a bit with permissions in order to get some things updated easier. Now, as before, no plugin (or the httpd) is allowed to write into the wordpress installation directory... this should help, hopefully...

It does also not seem like there was any malicious code broadcast through the webserver, it was also not used as a spam relay. My machine was only used for doing brute force attacks on other machines... well "only" is relative.

I think this is the worst thing about modern internet - everything is being misused if possible. There is a war going on, not only between countries, but actually between all and everybody - most of the users are just not aware of this.

See also removing malware from wordpress - interesting read...


Kategorie: Java --> Programmierung --> Computer

Morphium V3.0ALPHA

Mo, 18. 01. 2016 - Tags:

We're working on a completely new Version of Morphium.This version is actually already in Alpha stage and you can download it from github, if you like.

I already wrote in the release notes something about the intention behind it here:

V3.0 is a huge refactoring and is probably not source compatible with code that was written for 2.2.x!

Motivation

Morphium 3.0 brings a lot improvements and changes, most of them are not really visible to the user, but unfortunately some of them make V3.x incompatible to V2.x.

The changes were triggered by the recent mongodb java driver update to also 3.0, which brings a whole new API. This API is (unfortunately also) not backward compatible[^not quite true, the driver contains both versions actually, but old API is usually marked deprecated]. This made it hard to add the changes in the official driver into morphium. Some of the changes made it also impossible to implement some features in morphium as it was before. So - the current implementation of morphium uses both old and new API - wich will break eventually.

The next step was, to be more independent from the driver, as those changes caused problems almost throughout the whole code of morphium. So, introducing with V3.0 of morphium, the driver is encapsulated deep within morphium.

Unfortunately, even the basic document representation changed[^old version used BasicDBObject, new version uses Document`], which are very similar, but unfortunately represented in a whole new implementation of BSON (binary json - details can be found here).

Also, we had some problems with dependencies in maven, causing to be several version of the mongodb driver being installed on production - which then caused some weird effects, most of them not really good ones ;-)

This made us reduce all dependency to the mongodb driver to a minimum - actually it is only used in the MorphiumDriver implementation for the official mongodb driver. But that also meant, we needed to get rid of all usages of ObjectID and BasicDBDocument and reduce usages of that into the driver implementation within morphium.

The question was - do we need to introduces some new object type for representing a Map<String,Object>? We thought no, so we changed the whole code in morphium, to internally use only standard Java8 API.

Yes, that is one feature also, since Morphium 3.0 we‘re running on java 8.

Changes

As you know the motivation now, these are the changes.

Driver encapsulated and configurable - you can now implement your own driver for usage with morphium no usage of MongoDb classes, replaced by type MorphiumId and simple Map<String,Object> - this might actually break your code! (soon) MongoDB Dependency in maven will be set to be provided, so that you can decide, which Version of the driver you want to use (or none...) Morphium 3.0 includes some own implementation of drivers (mainly for testing purpose): - Driver: This is the Implementation of MorphiumDriver using the official Mongodb driver (V3.x) - InMemoryDriver: Not connecting to any mongo instance, just storing into memory. Good for testing. Does not support Aggregation! - SingleConnectDirectDriver: Just connecting to a master node, no failover. Useful if you do not have a replicaset - SingleConnectThreaddedDriver: Same as above, but uses a thread for reading the answers - slightly better performance in multithreaded environments, but only useful if you don't run a replicaSet - MetaDriver: A full featured implementation of the MorphiumDriver Interface, can be used as replacement for the mondogdb driver implementation. It uses a pool of SingleConnectThreaddedDriver to connect to mongodb. Many changes in the internals in references you can now specify the collection the reference should point to. improvements in the internal caches, using the new improved features and performance of Java8 (see also here) complete rewrite of the bulk operation handling code improvements on many places, including some public interfaces (might break your code!)

We're now working performance tuning everything. Thanks to the different drivers, we can exactly tell, what morphium is sending to Mongo and whether that is good or not. And - we can compare times and load! This will be a huge boost for performance, stability and flexibility.

Stay tuned for more updates on Morphium 3.0.0

And yes: there will be releases for the 2.2.x verson of Morphium as well, 2.2.24BETA1 is already available for testing on github.


Kategorie: Computer

Java8 and Vector - yes, you can use it again!

Mo, 23. 11. 2015 - Tags:

I collegue of mine came to me today and mentionend, that the use of ArrayList would cause problems in multithreadded environments - and he's right! At this very occasion it is discussing some internal cache of our application, where a lacking object here and there is not ab big deal. BUT: What we found out with his help is the following:

We were experimenting with lock and synchronized a bit, and found, that locks are way slower than using synchronized - in java 8 that is. There seems to be siginficant performance optimization in the synchonization in the VM itself. So, we wanted to compare the access to a list in a multithreadded environment and measure the timings. Here is the method, we used:

 private void testIt(final List lst) {
    long start = System.currentTimeMillis();
    int threads = 300;
    threadCount = 0;
    for (int i = 0; i < threads; i++) {
        final int j = i;
        new Thread() {
            public void run() {
                for (int k = 0; k < 1000; k++) {
//                        synchronized (lst) {
                    try {
                        lst.add("hello " + j + " - " + k);
                    } catch (Exception e) {
                        //ignore
                    }
//                        }
                }
                threadCount++;
            }
        }.start();
    }

    while (threadCount < threads) {
        Thread.yield();
    }
    long dur = System.currentTimeMillis() - start;
    System.out.println("write took : " + dur);
    System.out.println("Counting   : " + lst.size() + " missing: " + ((threads * 1000) - lst.size()));
    threadCount = 0;
    start = System.currentTimeMillis();
    for (int i = 0; i < threads; i++) {
        final int j = i;
        new Thread() {
            public void run() {
                for (int k = 0; k < 1000; k++) {
//                        synchronized (lst) {
                    try {
                        if (j * 1000 + k < lst.size())
                            lst.get(j * 1000 + k);
                    } catch (Exception e) {
                        //ignore
                    }
//                        }
                }
                threadCount++;
            }
        }.start();
    }

    while (threadCount < threads) {
        Thread.yield();
    }
    dur = System.currentTimeMillis() - start;
    System.out.println("read took : " + dur);
}

The code does not do much: creates 300 Threads, each of those storing data into a shared List of certain type. And after that, we create 300 threads reading those values (if they are there, that is - when using non-threadsafe datastructures, you will end up with data missing!).

Here is the result:

Testing with ArraList
write took : 83
Counting   : 255210 missing: 44790
read took : 22

Testing with Vector
write took : 64
Counting   : 300000 missing: 0
read took : 89

Testing with LinkedList
write took : 38
Counting   : 249998 missing: 50002
read took : 13367

Everybody knows, it is not a good idea to use Vector - it’s old and sluggish, slow and not useful. Do your own synchronization... This has been true obvously till JDK 1.7 - We ran the same test with JDK1.7 and Vector was at least 3 as slow as ArrayList or Linkedlist (only faster in reading).

We were shocked to see, that Vector ist actually faster than ArrayList! Significantly! And Thread-Safe! And it is even faster than using the same code with a synchronized block when accessing the list (see the commented out synchronized statements in the code above):

Testing with ArraList (synchronized block)
write took : 191
Counting   : 300000 missing: 0
read took : 80

Testing with Vector
write took : 68
Counting   : 300000 missing: 0
read took : 79

Testing with LinkedList (synchronized block)
write took : 178
Counting   : 300000 missing: 0

Of course, this is not a total in depth analysis as we actually don’t know for sure, what is causing this performance increase. But it really is reassuring - love to see, that Vector got some love a gain ;-) So - in an Java8 environment, you could actually use Vector without having to think about performance issues...

Update: I just compared the creation times (Default constructor) of the different types also, these are the timings:

Duration vector    : 31ms
Duration ArrayList : 2ms
Duration LinkedList: 3ms

So, what remains is: use Vector, if you do not create too many instances of it 😉

2nd Update: I just want to make things about this test a bit more clear. People tend to tell me that "this is no proper test, no Warmup phase, no proper Threadding... yadda yadda".

you might be surprised, YES I KNOW!

Instead of discussing the Idea, they discuss the toolset... facepalm my fault. Thought, this was clear from the beginning. Sorry for that.

This piece does not try to be the proof of anything. It is just showing, that there is some significant performance increase on Java 8 vs java 7 when it comes to Vector. Also, as already mentioned above, this code was not created like this, it is just a "byproduct".

The rest of this was to put in in perspective. Agreed, this was not very clear. It shows, that when your data structure is not synchornized, you might end up with data being lost. The test quantifies this loss with numbers. Which is also interesting - but for a different topic.

The results of this piece of code are reproduceable. Which means, that the numbers might differ, but comparing everything, the numbers are quite in the same area. Again, this is not a proper micro benchmark! This is better solved with something else, I agree.

So the goal was never to prove something, it is only a hint, that even Vector might be worth trying. It is still around, right? not marked deprecated, and not used as it is "slow". This is maybe not true to the extend it used to be.

But: to make things clear. As it seems in further Tests (those were done with the JMH-Testing framework), that often the Collections.syncrhonizedList(new ArrayList<>()) returns a better performing version than Vector.

But again: this whole thing here just wants to show that the huge performance loss you got when using Vector in JDK1.7 and before is now a bit smaller... and in some cases even gone!


Kategorie: Computer

Stephans Blog wieder online...

Fr, 12. 06. 2015 - Tags: allgemein blog

Ursprünglich veröffentlicht auf: https://boesebeck.name

Das war stressig. Zum Umzug kam noch hinzu, dass mein Server die Grätsche gemacht hat. Ich musste neu installieren. Was ja – dank Backups – eigentlich kein allzu großer Aufwand wäre, hätte ich nicht vergessen, ein Backup von der Datenbank zu machen… Deswegen jetzt der neue Start des alten Blogs ;-)


Kategorie: Computer

Feature Release Morphium 2.2.16

Do, 22. 01. 2015 - Tags: java-2 morphium-2

A new feature release in the new year 2015!

this new release contains several bugfixes, minor changes and one big new feature: Serialization of non-Entities to mongodb.

Usually, if you want to map a POJO to mongo, you need to put the @Entity annotation to the corresponding class. Right now, it's possible to have non-Entities serialized as well. Those will be stored as Bas64Endoced Object Stream into mongodb.

The major advantage is, when you have a list of objects as member of an entity, those can now be stored in mongo as well.

Attention: Objects need to be serializable to be stored!

you can download morphium from here on github or get it via maven central:

<dependency>
     <groupId>de.caluga</groupId>
     <artifactId>morphium</artifactId>
     <version>2.2.16</version>
</dependency>

Spread the word...


Kategorie: MongoDB-POJO Mapper morphium --> Programmierung --> Computer

Additional Feature Release V2.2.10 morphium

Mo, 29. 09. 2014 - Tags:

New Release of Morphium V2.2.10

available at github

background

The last release was reported not to work properly in Tomcat or J2EE-Environments. The reason is the classpath scanning feature added with the last release. For type ids to work properly, morphium needs to scan the whole classpath for entities, in order to be able to determine the type of a db-object upon de-serialization.

This works fine, for applications and a like, but does have it's drawbacks in J2ee-Environments like a servlet engine (e.g. Tomcat, Jetty, Jboss).

In that environment you need to define a filter or some kind of startup hook, so that the additional classpath entries might be added to morphium.

If this does not happen, morphium tries to figure out the type by itself - but might fail, depending on your setup.

howto

It is recommended to make classpath elements known to morphium, using this call:

morphium.getMapper().getEntityCache().addClassPathElement("/opt/tomcat/webapps/myapp/WEB-INF/classes");

you need to add all pathes which might contain entities, pathes might be directories, .class files or jars.

In a webapp / servlet based application, you could easily do that to one of your filters, or other initialization code. Please keep in mind, that this will only work, if classpath is already set correctly.

Morphium already scans the "default" classpath upon startup, but in Webapps, this is changed. You could do something like this in order to get everything to work. In tomcat this might work:

for (Url u:((WebappClassLoader)getClass().getClassLoader()).getUrls()) {
   morphium.getMapper().getEntityCache().addClassPathElement(u.getFile());
}

Attention: This code might load classes, you don't want to be loaded. ;-)

Suchergebnis: 61

<< 1 ... 2 ... 3 ... >>