Saturday, December 3, 2016

FDK - Setup nearly ready...

Hi!

Nun ist es soweit. Das dynamische Installationsprogramm fürs FDK ist in wenigen Tagen online.


Wie immer war "normal" zu "normal". Daher habe ich mich entschlossen, das Setup komplett neu in Firemonkey - natürlich mit dem FDK - selber zu programmieren.

Ggf. wird das Setup per Setup installiert... Oliver hatte da so eine Idee...

Warum dann ein eigenes Setup?

Ganz einfach, ich hatte keine Lust auch noch einen Webshop - Bestellformular - Registrierung  - Trailinstaller usw. für die Webseite zu programmieren... Und natürlich wollte ich kein deinstallieren / installieren Prozess  jedes mal machen müssen, daher verhält sich der Installationsprozess wie ein Update von einem Repository.

Dann wird nach dynamisch entschieden, was überhaupt - per REST - herunter geladen werden muss.

Das Ganze setzt - auf den in Zukunft noch kommenden - Zusatzmodulen:

- REST-AddOn
- MVVM-AddOn
- FDK-REST-Server

auf. Eine enorme Erleichterung, wenn man diese Dinge nicht selber (LOL) programmieren muss.

Das MVVM-AddOn nutzt auch mein eigenes NotVisual-LiveBinding, welches über die RTTI die Komponenten der Views mit den Propertys des ViewModels verbindet...

Ein ganzes Adress-Formular ans ViewModel binden? - piece of cake...
 
Alle die bereits das Early-Bird Paket bestellt haben, erhalten in den nächsten Tagen eine e-Mail mit dem Downloadlink.
 
Alle anderen können es gerne noch bestellen!
 
 
Einfach eine e-Mail mit dem Betreff : "Early-Bird" und den Kontaktdaten an Sysop@delphiprofi.de senden

Saturday, November 19, 2016

FDK: Hat vielleicht den falschen Namen?

Hallo Zusammen!

Böse-Zungen behaupten FDK steht eigentlich nicht für:

Firemonkey-Development-Kit sondern für Frank's-Development-Kit.

Dem ist "natürlich" nicht so... Viele Pattern und Units kommen auch von Sir-Rufo.

Aber aus aktueller Sicht, muss ich vielleicht zugeben, dass die Namensgebung nicht schlau gewählt war, denn

90% oder sogar mehr der Routinen funktionieren
genauso für VCL-Programme.
 
Warum also Firemonkey? Ganz einfach, weil die Pattern und viele Routinen entstanden sind aus der Notwendigkeit unter FMX anders zu programmieren als unter Windows und VCL. Und das ist immer noch der Keypoint. Jede neue Routine, die es ins FDK schafft, wird so programmiert, dass Sie optimal unter FMX und den mobilen Plattformen funktioniert.
 
Also liebe VCL Programmierer - Klar ist das FDK auch etwas für Euch... Und ja, auch um Code aus alten Projekten zu refrakturieren!
 
 

Wednesday, November 2, 2016

Developer Experts Days in Leipzig

Hallo!

Ich freue mich auf die 2 Tage Workshop zusammen mit Olaf in Leipzig.

Wieder mal mein Lieblingsthema Interfaces, DI und Unittests...

Friday, September 30, 2016

FMX & Sony SmartWatch 3

Meine neue SmartWatch 3 ist gerade gekommen...

Ausgepackt - natürlich mit dem iPhone verbunden - eingerichtet -  Developer Modus - Testapp drauf:

Läuft!
 
LowLevel3D Demo aus den Beispielen...
Läuft!
 
Apps deinstallieren - kurz googeln : Stackoverflow ->  per adb.exe uninstall packagename
Läuft!
 
Test abgeschlossen - Timer stoppen 10 Min... :-)
 
So mag ich es...
 
Jetzt beginnt die Arbeit.

Wie alt man ist, stellt man fest wenn:

Ein Raum voller Programmierer... alle jünger ( < 25 )... Die Frage kommt: Und was machst Du?

Dann gibt man die ein oder andere Antwort und muss feststellen... Ich bin alt...

Woran merkt man das? Die haben alle eine völlig andere Sichtweise auf die Technik und  die Programmierung.

den:

  • Man(n) "schwafelt" von Zeiten als es noch kein Internet gab.
  • nicht jeder ein Handy, geschweige den ein Smartphone hatte.
  • Eine 1GB Festplatte 5000 DM kostete.
  • Es keinen Sinn machte größere Festplatten als 30MB zu kaufen, da das Betriebssystem nicht mehr adressieren konnte.
  • Man(n) mit dem Modem sich in eine Mailbox eingewählt hat um stundenlang ein Bild in 320x200 zu laden.
  • Das wenn man "online" war - keiner im Haus mehr telefonieren konnte.
  • Man(n) nach dem kompilieren erst mal die Diskette mit dem Linker einlegen musste
  • Man(n) Programme in Assembler programmierte und 1000Byte Code schon richtig viel war...
  • Ein auf den Druckkopf des Nadeldruckers geklebter Lichtsensor als Scanner funktionierte...

Verwunderte Augen schauen einen an... Und man(n) stellt fest... Ich komme aus der Steinzeit.

Und dann die Antwort die alles verändert. : "Ich wäre froh wenn ich so viel Erfahrung hätte"

Ich bin nicht alt... Ich bin nur schon viel länger dabei...




Wednesday, September 28, 2016

Delphitage 2016 - Nachlese

Die Delphitage 2016 waren sicherlich das Highlight des "Delphijahres".
Es ist zwar noch nicht ganz rum, aber den Spass den Ich/Wir auf dieser Veranstaltung hatten ist schwer zu toppen.

Am besten spiegelt es vielleicht diese Foto von Alexander (c), Olaf (r) und mir (l) wieder:



Interessante Gespräche rund um Delphi sind auf so einer Veranstaltung selbstverständlich, aber es bot sich auch genügend Zeit für private Gespräche.

Für mich immer wieder interessant zu sehen, wie vielschichtig die Umgebungen und Voraussetzung der anderen Developer sind.

Mein persönliches Fazit aus diesen Gesprächen: Viele Firmen und Projekte hängen noch an alten Delphi Versionen. Hierbei geht es um:

1.) Unicode Umstellung
2.) Datenbank-Komponenten (BDE usw.)
3.) Frendkomponenten

Für mich wäre es nicht mehr möglich mit einer Delphiversion vor XE6 - produktiv - zu arbeiten. Ob wohl mein (Monster-)Hauptprojekt auch noch nicht die Unicode-Umstellung vollzogen hat. Ich kenne daher die Probleme.

Bei entsprechendem Interesse würde ich in diesem Zusammenhang auch einen speziellen Workshop zu diesem Thema anbieten.

PS.: Interessant zu sehen... Es gibt einen neuen Menüpunkt auf der EMBT Homepage zu diesem Thema!

Saturday, September 24, 2016

FMX - Textlayout mit verschiedenen Farben (D2D)

Nachdem ich den Font-Free-Fehler aus FMX.TextLayout.pas beseitigt habe, konnte ich die TextLayout Ausgabe aus FMX.Canvas.D2D.pas entsprechend erweitern, sodass es endlich möglich ist Formatieren Text mit verschieden farbigen Paragraphen ausgeben zu können.

Hierfür waren einige Eingriffe in die Grundroutinen nötig.

Das Ergebnis sieht dann - so wie man es eigentlich erwartet - so aus:


Ich werde meine Änderungen mal an EMBT senden...

PS: Die Blocksatzroutine ist kein Feature per D2D mit DWRITE_TEXT_ALIGNMENT_JUSTIFIED  das ist natürlich für Windows nur eine Zeile... "Meine" Blocksatz Routine funktioniert auf allen Plattformen.

Friday, September 23, 2016

FMX & Blocksatz

Hallo!

Leider kann FMX - genau wie die alten RTF Routinen - kein Blocksatz. Da ich aber Texte am liebsten im Blocksatz lese, habe ich einen kleinen Wrapper für das Layout-Rendering programmiert.


 
 
Schriftumschaltungen wie Fett usw. funktionieren schon.. Farbige Texte noch nicht, da die Windows Routine das leider nicht kann. Es gibt auch leider zwischen den Plattformen noch einige unterschiede, aber das wird der Wrapper berücksichtigen.

Thursday, September 22, 2016

FMX - IFDEF oder gibt es etwas besseres.

Warum haben wir IFDEF's in unseren Sourcecode?

Weil wir:
  1. unseren Code mit verschiedenen Delphi Versionen übersetzen wollen und hierfür Änderungen nötig sind.
  2. Funktionalitäten an- und abschalten wollen.
  3. auf die Prozessor Struktur reagieren müssen. (32/64 Bit)
  4. auf unterschiedliche Betriebssystem reagieren müssen...
Das sind doch die wichtigsten Gründe, oder?

Gibe es hier nicht bessere Lösungen?

Na Klar...

Nicht für alle 4 Punkte...

Um es einfach zu sagen: Die RTL macht es vor!

Über die Plattform-Dienste werden die eigentlichen Implementationen je nach Plattform registriert und der Rest linked gegen ein Interface...

Wenn es gut genug ist für dir RTL - sollten wir dieses Designpattern auch in unseren Applications anwenden.

Aber was ist, wenn wir kein IFDEF nehmen können, weil wir zur Laufzeit entscheiden müssen?

Klar nen IF auf eine Variable wird jeder sagen!

Ich mache es so (vereinfacht für das Beispiel! Im eigentlich Code passe ich das Ganze noch an den Text an):


type
  TMyOSPlatform = (Windows, OSX, iOS, Android);
  TOSPlatforms = Set of TMyOSPlatform;
 
 

Procedure InitFMX;
begin
  TGetByID.Default.Register(Windows,
   Function (Const Prop : String) : Single
     begin
       Case TFDKHelper.CaseSelector(Uppercase(Prop),[
        {0} 'WIDTH',
        {1} 'HEIGHT',
        {2} 'MARGINLEFT' ]) of
         0 : Result := 121;
         1 : Result := 22;
         2 : Result := 40;
       end; // of case
     end);

   TGetByID.Default.Register(OSX,
    Function (Const Prop : String) : Single
     begin
       Case TFDKHelper.CaseSelector(Uppercase(Prop),[
        {0} 'WIDTH',
        {1} 'HEIGHT',
        {2} 'MARGINLEFT' ]) of
         0 : Result := 128;
         1 : Result := 24;
         2 : Result := 40;
       end; // of case
     end);

   TGetByID.Default.Register(iOS,
    Function (Const Prop : String) : Single
     begin

       Case TFDKHelper.CaseSelector(Uppercase(Prop),[
        {0} 'WIDTH',
        {1} 'HEIGHT',
        {2} 'MARGINLEFT' ]) of
         0 : Result := 138;
         1 : Result := 24;
         2 : Result := 40;
       end; // of case
     end);

   TGetByID.Default.Register(Android,
    Function (Const Prop : String) : Single    
     begin
       Case TFDKHelper.CaseSelector(Uppercase(Prop),[
        {0} 'WIDTH',
        {1} 'HEIGHT',
        {2} 'MARGINLEFT' ]) of
         0 : Result := 140;
         1 : Result := 28;
         2 : Result := 40;
       end; // of case
    end);
end;

ByPlatform :=
  Function (Prop : String) : Single
   begin
     Result := TGetByID.Default.From(IDAktPlatform,Prop);
   end;

Procedure Whatever;
begin

  Button.Width        := ByPlatform('Width');
  Button.Height       := ByPlatform('Height');  
  Button.Margins.Left := ByPlatform('MarginLeft');
end;



So ist der Zugriff im Code einfacher!

Tuesday, August 23, 2016

Delphi-Tage 2016 Thema meiner Vorträge!

Das Thema meiner diesjährigen Vorträge auf den Delphi Tagen lautet:

1. Vortrag zusammen mit Olaf Monien

Effektives Multithreading – Die einfache Welt des TTask.Run und was kommt danach?

2. Vortrag

Zusammenklicken oder Programmieren?
Die Vorteile von dynamisch erzeugen Komponenten anhand von Firemonkey Beispielen!

Es wird sicherlich wieder eine interessante Veranstaltung.

Thursday, August 18, 2016

FDK - Feature Matrix

Vorab unsere Feature Matrix*.

Was sich genau dahinter "versteckt" folgt in Kürze... *) Diese Zusammenstellung ist auch noch nicht endgültig.

Lite-Version


Delphiprofi.FDK.AnyFactory
Delphiprofi.FDK.Config
Delphiprofi.FDK.Console
Delphiprofi.FDK.Events
Delphiprofi.FDK.Exceptions
Delphiprofi.FDK.FireDAC
Delphiprofi.FDK.FluidCreator
Delphiprofi.FDK.FMXHelpers
Delphiprofi.FDK.Helpers
Delphiprofi.FDK.IdleWorker
Delphiprofi.FDK.IFDEF
Delphiprofi.FDK.IO
Delphiprofi.FDK.KeyValue
Delphiprofi.FDK.Logging.ConsoleLogger
Delphiprofi.FDK.Logging.DebugLogger
Delphiprofi.FDK.Logging.FileLogger
Delphiprofi.FDK.Logging.LogFilter
Delphiprofi.FDK.Logging
Delphiprofi.FDK.MainApplication
Delphiprofi.FDK.Messages
Delphiprofi.FDK.Observer
Delphiprofi.FDK.Pattern
Delphiprofi.FDK.Pattern.Internals
Delphiprofi.FDK.Platform.Utils
Delphiprofi.FDK.Resources
Delphiprofi.FDK.StringConsts
Delphiprofi.FDK.Types
Delphiprofi.FDK.Utils

Full-Version
(zusätzlich zur Lite-Version)

Delphiprofi.FDK.AnyConverter
Delphiprofi.FDK.BackgroundWorker
Delphiprofi.FDK.CallByIDFactory
Delphiprofi.FDK.Compressing
Delphiprofi.FDK.Compressing.ZLib
Delphiprofi.FDK.Converters
Delphiprofi.FDK.Crypting
Delphiprofi.FDK.DataView
Delphiprofi.FDK.DTOWithVersion
Delphiprofi.FDK.Enumerables
Delphiprofi.FDK.EventBus
Delphiprofi.FDK.Fmx.Enumerables
Delphiprofi.FDK.Generics.BlockingCollections
Delphiprofi.FDK.Generics.Collections
Delphiprofi.FDK.HeartbeatWorker
Delphiprofi.FDK.Json
Delphiprofi.FDK.MulticastEvents
Delphiprofi.FDK.Push
Delphiprofi.FDK.Specifications.Dates
Delphiprofi.FDK.Specifications
Delphiprofi.FDK.Specifications.Strings
Delphiprofi.FDK.Stateless
Delphiprofi.FDK.Streams.Hashing
Delphiprofi.FDK.Streams
Delphiprofi.FDK.Tethering
Delphiprofi.FDK.Tethering.Queue
Delphiprofi.FDK.Tethering.TransferObjects
Delphiprofi.FDK.TextLayoutHelper
Delphiprofi.FDK.Threading.AsyncTasks
Delphiprofi.FDK.Threading
Delphiprofi.FDK.Threading.Pipeline
Delphiprofi.FDK.TimeOutWorker
Delphiprofi.FDK.TreeViewWalker
Delphiprofi.FDK.Vcl.Enumerables
Delphiprofi.FDK.Winapi.Windows

Dies Zusammenstellung entspricht der Version 1.0 weitere Units sind in der Queue!

Monday, August 15, 2016

Fortschritt im FDK

Zwischenstand des FDK's

Für alle die sehnsüchtig das Release des FDK's erwarten, hier ein kleiner Zwischenstand.
 
Die Inline-Docu ist fast fertig.
Die Beginners-Docu ist fast fertig.
 
Die Funktionalitäten der Lite-Version sind bis auf 2 Units fertig.
Die Funktionalitäten der Full-Version braucht noch ein bisschen refactoring.
 
Es fehlt noch:
- Erstellung der Installationspakete
- Einrichtung Bugtracker
 
Wir hoffen jedoch bis zu / auf den Delphi-Tagen / die Lite-Version rausgeben zu können.
Rest folgt dann schnellstmöglich...
 
* so ist der Plan....
 
 

Wednesday, August 10, 2016

Delphi-Tage 2016 in Köln

Selbstverständlich bin ich auf den Delphi Tage 2016 auch wieder als Speaker dabei.

Die Delphi-Tage werden jedoch nicht mehr von den drei Delphi-Foren organisiert. Auch Embarcadero hat sich nicht an der Organisation beteiligt.

Trotzdem kommt - so hat er es angekündigt - Marco Cantu.

Um es mit berühmten worten zu sagen: Klingt komisch, is´ aber so.


Was ändert sich? Eigentlich fast nix.
 
  • Es wird wieder ein Workshop vor den Delphi Tagen geben. (Do. & Fr.)
  • Es wird am Abend vor der Hauptveranstaltung einen Community-Abend geben. (Fr.)
  • Es werden wieder zahlreiche Vorträge rund um Delphi gehalten. (Sa.)

Geändert hat sich meine Beteiligung. 

www.delphiprofis.de
 
  • Ich unterstütze Olaf beim Workshop.
  • Ich werde zwei Vorträge halten.

Eine Veranstaltung wie die Delphi-Tage, darf einfach nicht ausfallen. Welche Gründe vorlagen, dass sich die bisherigen Organisatoren zurückgezogen haben, entzieht sich meiner Kenntnis. Spielt aber eigentlich auch keine Rolle. Für mich war es jedoch sofort klar, dass ich meine Hilfe und Beteiligung,  angeboten habe. Jeder der ein bisschen rechnen kann, wird erkennen, dass mit 35,- € pro Person, so eine Veranstaltung nicht zu finanzieren ist. In der Vergangenheit wurde ein großer Teil der Veranstaltung durch die Sponsoren bezahlt. Eine kleine Preiserhöhung auf (43,- €) wird aber jeder "verschmerzen" können.
 
Ein Bestandteil der Delphi-Tage - war schon immer - der Workshop vorher. Hier geht es weiter in die Tiefe, als es ein 60 Minuten Vortrag kann. Wie ich es hier schon in einem früheren Blogpost beschrieben habe: Fortbildung muss für jeden ernsthaften Developer ein fester Bestandteil im Terminkalender sein. Ob es sich hierbei um ein Selbststudium handelt oder die Teilnahme an einem Workshop ist erst mal zweitrangig. Den eigenen Schweinehund zu besiegen und - obwohl man schon seit Jahren programmiert - wieder die "Schulbank" zu drücken ist erst mal das Thema.
 
Seit vielen Jahren, treffen sich 6-12 Entwickler regelmäßig bei unserer Delphi-Frühstücks-Gruppe. Auch wenn sich das Kern-Team immer wieder trifft. Es gab noch kein Treffen bei dem ich und das sagen auch die anderen, nix neues gehört haben. Jedes Treffen hat ein Mosaik-Steinchen für mein Wissen gehabt...
 


Wednesday, August 3, 2016

Refactoring - Der "tägliche" Wahnsinn.

Wer kennt das nicht... Ein Projekt entwickelt sich immer weiter, natürlich kommt man an einen Punkt und stellt fest, XY benötige ich jetzt schon in 2 Units, 3 Units, 4 Units... Ab wann wird es Zeit daraus ein Pattern zu machen?
 
Frühzeitig? Nach Abschluss?
 
Aber was ist, wenn ich dieses Pattern mit nur kleinen Veränderungen auch in 3-5 anderen Units verwenden könnte? Soll ich lieber eine Kopie machen oder die Veränderungen mit einem Parameter steuern? Oder übergebe ich die Funktionalität lieber als interface an das Pattern? Was sieht nicht nur schick im Source-Code aus, sondern ist dann auch praktisch in der Benutzung? Fragen über Fragen.
 
Ich habe mittlerweile eine Klasse, die hat heute zum 2. Mal einen neuen Namen bekommen und die Unit habe ich zum 3. mal renamed. Natürlich nicht ohne die Documentation, das Handbuch und alle Anwendungen die daraufhin geändert werden müssen neu zu kompilieren. War das eine gute Idee?
 
Also vielleicht erstmal ein paar "Rule of Thumbs" generieren.
 
  1. Je mehr Code ich vernichten kann, weil ich eine "zentrale" Routine nutze. Desto weniger Codezeilen können einen Fehler haben.
  2. Wenn meine Anwendung in der Regel "nur" Basis-Routinen aufruft und diese fehlerfrei sind, um so weniger Fehler kann meine Anwendungen haben. Voraussetzung hierfür ist natürlich die Testbarkeit. Da jedoch "zentrale" Routinen einfacher zu testen sind, ist meine Anwendung einfacher zu testen.
  3. Ist die Basis-Routine Threadsave, ist es einfacher meine eigenen Routinen Threadsave zu gestalten (vereinfacht ausgedrückt). // Ach wäre doch nur die VCL/RTL Threadsave.
  4. Bei der Schaffung einen neuen Basis für XY erkaufe ich mir jedoch Zwangs-Verlinkungen ein!
Lohnt es sich also zu Refrakturieren?
 
Auf jeden Fall - am besten immer so schnell wie möglich, wenn ich ein Problem erkenne. Je früher ich es behebe, desto weniger Source-Code baut darauf auf.
 
"Nur das mit der Doku ist lästig, wenn ich eine habe..."
 
 
 

Friday, July 15, 2016

CodeRage 2016 Nachlese!

Vielen Danke für die zahlreichen Nachrichten zu meinem CodeRage Vortrag.

Sowie es die Zeit zulässt, werde ich weitere Video zu diesem Thema veröffentlichen.

Ich nehme auch noch gerne Themenvorschläge unter Info@delphiprofi.de für meinen Vortrag auf den Delphi-Tage in Köln entgegen...

Saturday, July 2, 2016

So viele Begriffe...

Immer neue Begriffe erreichen uns…



Welche dieser Begriffe kennen wir den?

Welche Techniken nutzen wir?

Und die eigentliche Frage: Wofür das ganze überhaupt?

Bestanden früher Programme aus linearablaufendem Code bei dem die Reihenfolge eindeutig war, sind durch Windows und die eventgesteuerte Programmierung viele neue Techniken zum täglichen Programmieralltag hinzu gekommen.

Diese Techniken gilt es zu erlernen und – im besten Fall – fehlerfrei an zu wenden.

Dieses sich immer schneller drehende Hamsterrad in dem wir täglich unsere Software entwickeln, hat durch Firemonkey und die Cross-Plattform Programmierung wieder einmal einen neuen Schub bekommen.

Oder haben wir uns vielleicht mit unserer komfortablen IDE und der einfachen Möglichkeit:

Butten aufs Formular – Doppelclick und code rein. Vielleicht zu lange auf die faule Haut gelegt?

Ist das eigentlich Fremdwort : Weiterbildung?

Für alle die, die sich auf der eigenen Application ausgeruht haben, biete ich selbstverständlich Schulungsmöglichkeiten an.

Tuesday, June 21, 2016

Updating NAS RAID Controller...

Updating NAS RAID Controller Nightmare...


Wer kennt das nicht... Das NAS steht im Keller im 19" Schrank und macht das was ein NAS so machen soll - hält und speichert Daten... Gelegentlich gibt es die Daten auch zurück...

Natürlich hat das NAS auch eine Benachrichtigung Funktion... Per E-Mail.... Diese wurde aber NIE eingerichtet...

Die Jahre vergehen und es gab NIE Problem... Auch nach einem Umzug - alles prima.

Eines Tages (vor ca. 4 Wochen) komme ich in den Keller und schaue auf das NAS... Ein Festplatten LED blinkt...

OK - ist ein Plattenzugriff... Oder? in einem RAID 5 auf nur einer Platte obwohl keine im Büro ist?

An den Rechner - Webbrowser und die Console aufrufen... Zertifikatswarnung ignorieren... Hmm alles in Ordnung...

Also wieder in den Keller und die Festplatte raus ziehen. Sollte ja in einem RAID 5 kein Problem sein. hmm... Platte eiskalt und dreht sich nicht... Normalerweise hat man noch den Kreiseleffekt beim rausziehen...

OK Platte tot... Schnell eine neue Bestellt... 1TB... geliefert wird eine 2TB zum 1TB Preis...

Und nun... Der 2. Menü von der Managment Console bringt immer einen Fehler... Ob ich nach so vielen Jahren noch den Lieferanten kontaktieren kann und Support erhalte?

Geliefert hat das alles die Firma xtivate aus Ilmenau...

Ich stelle meine Frage warum ich nicht in die Console komme und werde mit einem Mitarbeiter verbunden...

Lange Rede kurzer Sinn... HUT AB!!! Das nenne ich Service - Nicht nur das mir jede Frage beantwortet wurde... Auch in einer einstündigen TeamViewer Sitzung wurde mit einem alten Firefox, putty mir der Zugang zu meinem NAS ans laufen gebracht... Vielen Dank noch mal hierfür.

die Platte wurde als 2GB brutto erkannt und das RAID war schon auf dem Weg sich zu rebuilden...

Ich habe dann auch mal den E-MAIL zugang für die Benachrichtigungen eingestellt... War eine Empfehlung des Servicemitarbeiters...

Meine Frage: Kann ich alle Platten gegen 4 TB Platten austauschen - Antwort Nein... Kann der Contoller nicht... (2TB Konnte er noch)
Und ein neuer Contoller...? Geht nicht in diesem Board...
Und ein neues Bord und ein Controller...
Dann ist es in der Regel günstiger ein neues NAS Fertigkonfiguriert mit Platten zu kaufen...

Na toll...

Jetzt nervt mich das NAS andauert mit E-Mails...
- bla dies - bla das -Verify - OK - Verify - OK...

WARNING - Remapping - OK...

hmm defekter Sektor... auf der nächsten Platte... (Jeden Tag einer)
Ich muss wohl etwas unternehmen.

Externe Docking Station mit USB3+ und Controller gekauft... 2x4TB sollte für ein Backup reichen...
Jetzt liegen auf dem NAS aber hunderttausende kleine Dateien... der 1. XCOPY sagt 3 Tage...

Also mal RAR bemühen und nach 2-3 Anläufen sind alles Shares auf der externen Festplatte...
Und jetzt? Neue Platten bestellen ... 12 Stück.... NAS Platten vielleicht zahlt sich der Stromverbrauch ja aus... hmm Aber welche....2TB gingen 4TB sollen nicht gehen...

Bestellen wir 12 x 3TB NAS Platten.  Und schlagen alle Warnungen in den Wind...

Als Erstes mal die defekte Platte tauschen... Und siehe da.. Die neue 3TB Platte wird als 768GB erkannt und kann nicht in das RAID eingefügt werden... Das kommt davon wenn man nicht auf den Servicemitarbeiter hört....

Aber ich bin heute mutig... Controller Update gefunden... Das Update lässt sich nicht installieren... Geht nur als Admin... Umloggen und neuer Versucht...

Die Maus schwebt über den Update Button... (Sind wirklich alle Daten sicher gebackuped?)
Lieber doch nicht und Platten zurück schicken...?

Ach was soll's... Und Go... (Nix passiert)

Plötzlich ein Fenster : Update ist compatible... Haben Sie alle Daten gesichert? Weiter?
Also "Weiter"... Die längsten 30 Sekunden die ich kenne...

Update erfolgreich - System muss neu gestartet werden... Reboot? "JA"

Die Weboberfläche kommt nicht wieder... Reload bring auch nix... 1 Minute ist schon rum...

1:30 - Mist jetzt ist das NAS tot... Oder?

Start -> Ausführen -> CMD
Ping senden... <1ms

OK, Dass geht... und der Browser? Antwort nach 2 Min... Alles wieder da...
Und die neue Platte?

Erkannt mit 3TB und das RAID hat schon begonnen zu rebuilden...

Jetzt muss ich nur mal alle tauschen und das RAID neu aufsetzen... Aber nicht mehr heute....

Und ich kann wieder ruhig schlafen...







Wednesday, June 1, 2016

Erste Deutsche CodeRage am 13.Juli.2016

Selbstverständlich darf auf der deuschen Coderage kein FMX Vortrag von mir/uns fehlen.

Key-Thema ist selbstverständlich das FDK und die Entwicklung von mobilen- und Desktopwendungen mit FMX.

Gerne nehmen wir im Vorfeld Themen auf, die wir in unserem Vortrag näher beleuchten sollen.

Anregungen bitte per e-Mail an Info@delphiprofi.de

Tuesday, May 31, 2016

Firemonkey & Form.KeyPreview

Wer hat nicht in Firemokey schon das Form.KeyPreview vermisst?


Der einfachste Workaround hierfür ist:

type
  TForm1 = class( TForm )
  private
    { Private-Deklarationen }
  protected
   
procedure IsDialogKey(const Key: Word;

                          const KeyChar: WideChar;
                          const Shift: TShiftState;
                          var IsDialog: boolean); override;   
  public
    { Public-Deklarationen }
  end;


Aber nicht den inherited vergessen!

Saturday, May 28, 2016

FDK - E-Mails - Serverfehler!

Leider hatte sich ein Konfigurationsfehler in meinem E-Mail-Server eingeschlichen, daher sind alle mails an Info@delphiprofi.de leider verloren gegangen.

Falls also keine Antwort zurückgekommen ist, bitte nochmal schreiben...

Sorry

Monday, May 23, 2016

MVVM - Oder was ich dafür halte...

Mit diesem Satz beginne ich eigentlich immer, wenn ich über MVVM spreche...

Angefangen hat es hiermit und nun? Natürlich bin ich ein gutes Stück weiter, aber gerade habe ich ein Video von 2014 (Visual Studio Tollbox / channel8.msdn.com / MVVM Best Practices ) gefunden... Die beste Aussage aus dem Video ist zwischen 02:45 - 03:45.

"Egal" wie man es nennt... Es geht um ein Pattern - wie auch immer man es implementiert.

Trotzdem habe ich mich jetzt daran gewöhnt die drei Jungs beim "richtigen" Namen zu nennen.

View -> ViewModel -> Model.

Natürlich habe ich meine Projekt auch entsprechend refrakturiert,  damit bei Vorträgen die Zuhörer sich nicht wundern, warum mein ViewModel nur Model heißt und mein Model -> Datenbankinterface...

Aber wie gesagt, es war schon immer ein MVVM-Pattern.

Für mein Verständnis war eine View ein Form, ein Viewmodel die Formlogic und das Model die Formdatenschicht. Auch wenn es das nicht ganz trifft, sind für einen Delphianer diese Begriffe verständlicher.

Doch spätestens, wenn man feststellt, dass eine Form auch mehrere View's und jede View auch Unterviews haben kann, stellt man doch fest, neue Begrifflichkeiten müssen her.
Also kann man auch direkt die "offiziellen" nehmen.

Aber man braucht nur mal zu googlen... Es gibt viele Leute die nach dem gleichen Motto  programmieren. (Auch wenn es jeder ein bisschen anders macht).

Einfach mal beim nächsten Programmierer Treffen in die Runde Fragen:

- Wer erzeugt die View?
- Wer erzeugt das Viewmodel?
- Darf die View Code enthalten?
- Darf die View das Viewmodel kennen?
- Wer räumt den Speicher wieder auf?
- Wer schließt die Form?

Und schon ist der Ärger vorprogrammiert und die Hartliner (also die Oberschlauen, die mit dem Patternbuch unter dem Kopfkissen schlafen gehen) müssen jedem der es nicht hören will, die einzig richtige Lösung aufschwatzen...

Immer schön geschmeidig bleiben....

Für mich gelten nun folgende Regeln:

1. Form -> also die MainView -> View first -> wenn von der Application erzeugt, wird das MainViewModel drangehängt.

Alle anderen View's sind ViewModel-first... Die View wird über eine Viewlocator erzeugt und das Model wird per Constructor Injection dem ViewModel übergeben (oder holt es sich per Factory aus dem Pool).

Meine View's kennen Ihr Viewmodel. (Property's des Viewmodel werden einem Binder übergeben, damit die View darauf zugreifen kann.

Meine ViewModel kommunizieren per multicast Event mit den Views.

Models sind immer interfaces.

Das ganze Boilerplate-Code ist natürlich im FDK, somit kann ich mich auf das wesentliche konzentrieren.

Wednesday, May 18, 2016

Delphi 10.1 Berlin, Grids and DblClick-Events...

Interessanterweise fehlen einige Events im ObjectInspector.

Zum Beispiel der dblClick Event.

Workaround:

Einfach im Source-Code zuweisen.

procedure TForm1.FormCreate(Sender: TObject);
begin
  Grid1.OnDblClick := Grid1DbkClick; // Kein Eintrag im OI
end;


FDK - Größen und Datumsausgabe!


Ein Auszug aus einem Consolen Testprogramm für Größen und Datumsausgabe!

Var
  lSize: TSizeInBytes;
begin
  lSize := 12345678; // Bytes
  WriteLn( lSize.ToString( ) );
  WriteLn( lSize.ToString( TSizeBase.f1000 ) );
  WriteLn( lSize.ToString( TSizeBase.f1024 ) );
  WriteLn( lSize.ToString( TSizeUnit.Kilo ) );
  WriteLn( lSize.ToString( TSizeBase.f1000, TSizeUnit.Kilo ) );
  WriteLn( lSize.ToString( TSizeBase.f1024, TSizeUnit.Kilo ) );
end;

Erzeugt folgende Ausgabe auf den entsprechenden Plattformen:

Windows / Android
OSX / iOS
11,8 MB
12,3 MB
12,3 MB
12,3 MB
11,8 MB
11,8 MB
12.056,3 KB
12.345,7 KB
12.345,7 KB
12.345,7 KB
12.056,3 KB
12.056,3 KB

 

Var
  lDate: TDateTime;
begin
  lDate := TDateTime // Helper für TDateTime
  {} .ParseISO8601( '2016-04-24', {AsUtc} True )
  {} .AddHours( 4 )
  {} .AddMinutes( 4 )
  {} .AddSeconds( 5 )
  {};

  WriteLn( lDate.ToString( ) );
  WriteLn( lDate.ToShortDateString( ) );
  WriteLn( lDate.ToLongDateString( ) );
end;

Erzeugt folgende Ausgabe:

24.04.2016 04:04:05
24.04.2016
Sonntag, 24. April 2016

Tuesday, May 17, 2016

FDK - Parallel-Multithreading-Pipeline


Ein kleiner Codeauszug aus unser Multithread Pipeline:

TPipeline.Configure( )
  {} .Throttle( 10 ) // max. 10 Items in der OutputCollection
  {} .Stage<Integer>(
    procedure( Output: IBlockingCollection<Integer> )
    var
      i: Integer;
    begin
      for i := 1 to 100 do
        Output.Add( GetDataFromWebservice( i ) )
    end )
  {} .NumTasks( 5 ) // Anzahl der Tasks für die nächste Stage
  {} .Stage(
    procedure( const Input: Integer; out Output: Integer )
    begin
      Output := CalculateData( Input );
    end )
  {} .Stage(
    procedure( Input, Output: IBlockingCollection<Integer> )
    var
      v: Integer;
    begin
      for v in Input do
        begin
          WriteDataInDatabase( v );
        end;
    end )
  {} .Run( );

Der abgebildete Arbeitsprozess holt in diesem Beispiel 100 Daten (hier zu Demonstration Integer-Werte) von einem theoretischen Webserver (Im Thread). Maximal ( 10 ) Werte werden hierbei in die Verarbeitungspipeline eingestellt.  Wenn die nachfolgende Stage ( In 5 Threads ) diese Werte nicht schnell genug abarbeiten kann, werden die Threads die die Daten von Webserver holen, nach Erreichen des Throttlewertes „schlafen“ gelegt. Das „Aufwachen“ passiert natürlich sofort wenn wieder Platz in der Eingangsqueue ist. Dieses Verhalten kontrolliert die BlockingCollection für alle Stages. Falls die Anzahl der Threads nicht angegeben ist, gilt der default Wert.

Monday, May 16, 2016

Android & Application: Wird beendet beim drehen des Devices. (sudden death)

Unerklärlicherweise werden Android Apps - ohne eine Meldung beendet - wenn man das Device dreht.

Grund hierfür ist ein "Fehler" in der "AndroidManifest.template.xml".

Bisher hatte es immer funktioniert mit:

android:configChanges="orientation|keyboard|keyboardHidden|"

Jetzt - warum auch immer - ist es nötig diesen Eintrag ein zu setzen:

android:configChanges="orientation|keyboard|keyboardHidden|screenSize"

Ein Grund hierfür ist mir zur Zeit nicht bekannt... Aber danach funktioniert es wieder.

PS.: Vielen Danke an die Delphi-Praxis User (Rollo62 & DeddyH)

Friday, May 13, 2016

FDK Das Firemonkey-Development-Kit

FDK

Das Firemonkey-Development-Kit!

 

·       Noch eine Komponentensammlung?
Der Firemonkey-Development-Kit kurz FDK ist mehr als nur ein paar Komponenten, die man auf ein Form klicken kann. Eigentlich hat das FDK keine einzige Komponente die man auf ein Formular klicken „muss“.
·   Ist das FDK nur für das Firemonkey Framework oder auch für die VCL Programmierung nützlich?
Die Grundidee basiert auf Firemonkey aber der überwiegende Teil des Kit’s ist auch für VCL-Programmierer eine große Hilfe.
·       Was bietet das FDK?
·      Kurz gesagt: Code den jeder braucht, den jeder immer und immer wieder neu schreibt oder nie benutzt hat, weil es doch auch auf herkömmliche Wege geht, oder zu kompliziert war. Das FDK soll Ihnen einen einfacheren Einstieg in die cross-Plattform-Programmierung ermöglichen. Die Benutzung von Threads, Queues und Pipelines erleichtern. Die Performance Ihrer Software verbessern. Keyfeatures für Ihre Anwendung sind hierbei: Wiederverwendbarer und leicht pflegbareren Code. Der Funktionsumfang wird stetig erweitert. Sie möchten gerne XY verwenden…? Das FDK hat hierfür wahrscheinlich ein Interface welches Ihnen die Benutzung erleichtert. Hinzu kommen Software Pattern, die heutzutage immer öfter zur Anwendung kommen.
·         Welche Bereiche der Programmierung werden von FDK abgedeckt?
o   Decoupled object creation
o   Threads and background execution
o   Easy use of data compression and converting
o   Easy use of databases and datastructures
o   Fluidcreation of objects/controls (less typing, more readable)
o   FMX Application Event handling for mobile platforms
o   Array and enumerables handling
o   Threaded queues and pipelines for dataprocessing
o   File and stream handling
o   Statemachine
o   Observer Pattern
o   Application logging
o   Lots of helpers
o   See feature Matrix for more…

·         Welche Delphi Version wird benötigt?

VCL & FMX Projekte können mit 10.4, 10.3, 10.2, 10.1, 10.0 erstellt werden. (Auch wenn für die mobilen Plattformen eigentlich nur die aktuellste Version in Frage kommt.)

·         Welche Versionen gibt es vom FDK?

Wir bieten zwei verschiedene Pakete in zwei verschiedenen Versionen.

1.               Lite Version.
Enthalten sind die wichtigsten Komponenten um mit dem FDK beginnen zu können, sowie ein Updateservice von Änderungen und Bugfixes.

2.               Full-Featured-Version
Enthalten ist der komplette Funktionsumfang und kostenfreie Updates von Änderungen, Bugfixes und neuen Features.

Beide Versionen gibt es als:

DCU Distribution.
Sie erhalten die DCU’s für Delphi (10 Seattle), 10.1 Berlin, 10.2 Tokio, 10.3 Rio. Mit erscheinen der nächsten Delphi Version endet der Update-Service.

Full-Source-Code-Distribution.
Enthalten ist der komplette Source-Codes inkl. kostenfreien Updates von Änderungen, Bugfixes und neuen Features für 1 Jahr, bezogen auf die gekaufte Version.

·         Was kostet das FDK?

Version
Distribution
Erst Käufer
Update Verlängerung
Lite
DCU
49,- €
19,- €
Full
DCU
99,- €
59,- €
Lite
SOURCE
199,- €
69,- €
Full
SOURCE
399,- €
199,- €

Zur Zeit ist die DCU Version noch nicht im Setup enthalten, da sich bisher keiner dafür interessiert hat. ( Ich arbeite daran )!

*) Der Updatezeitraum beginnt – falls enthalten – mit dem Tag der Auslieferung. Lizenz gilt pro Developer. 2. Developer 30% Rabatt. Company-Licence X 3,5.


Die Bestellung kann einfach über das Setup-Programm ausgeführt werden, da diese einen eigenen Shop integriert hat! Download unter : http://www.delphiprofi.de/FDK/FDKSetup.Zip
Fragen einfach an: Frank@delphiprofi.de

Berlin 10.1 & Android

Das verhalten unter Andoid hat sich mal wieder mit Delphi 10.1 geändert...
Dadurch feuert ggf. der Mouse-Up event erst dann, wenn der Button / das Form schon lange nicht mehr existiert...

Also am besten alle Aktionen besonders Form & Button free's wieder mal in den OnIdle-Event verlegen. Denn da ist die Animation oder der Maus-Up erledigt...

Thursday, May 12, 2016

Code-Camp & Firemonkey

Als Feedback vom Code-Camp musste ich wieder einmal feststellen, dass die Zahl derjenigen, die sich für Firemonkey interessieren verschwindend klein ist.

Für mich zwar unverständlich, aber interessanter Weise war die Zahl derjenigen die sich für FMX-Desktop Anwendungen interessieren im Verhältnis 10:2.

Na gut... Dann sind wir trotzdem mit unserem FDK auf dem richtigen Weg, den:

das FDK ist auch für FMX-Desktop und mindestens 80% - oder mehr - ist auch für VCL-Entwickler geeignet.

Saturday, April 9, 2016

Welches Keyboardcodes in der Delphi IDE?

Immer noch das "Beste" - hier im Original, damit es nicht verloren geht:

Bible, Dijkstra 5:15
"and the clueless shall spend their time reinventing the wheel while the elite merely use the Wordstar key mappings"

Wednesday, January 6, 2016

Logging von anonymen Proceduren...

Anonymen Proceduren...

Anonymen Proceduren nutze ich eigentlich oft, ständig, fast nur noch... :-)

Anonymen Proceduren bringen den Sourcecode an die Stellen "wo" ich "ihn" brauche bzw. wenn ich den Sourcecode nochmal lese, kann ich sofort sehen was an dieser Stelle passiert.

Das macht natürlich nur Sinn, wenn ich den Code nicht an anderer Stelle nochmal brauche, da bietet sich selbstverständlich weiterhin eine "normale" Procedure an.

Jetzt nutze ich natürlich mein FDK und alle darin enthaltenen Funktionen. Das FDK bietet umfangreiche Logging-Funktionen. Das klappt auch bis auf eine Kleinigkeit sehr gut.
Ich konnte bisher nicht loggen, welche Procedure des Parameters ausgerufen wurde.

Beispiel:
procedure Foo<T>(AInvoke : TProc)
begin
   ...
   // Log(AInvoke)
   ...
end;

Mit vielen Dank an Remy Lebeau (TeamB) für eine Lösung:

type

  TFDKProcLogHelper = class abstract
    public
      class function Proc2String(P : Pointer) : String;
  end;

class function TFDKProcLogHelper.Proc2String(P : Pointer): String;
type
  PIInterface = ^IInterface;
var
  UnitName : String;
  Ctx: TRttiContext;
  ProcType : TRttiType;
  obj      : TInterfacedObject;
begin
  obj := PIInterface(P)^ as TInterfacedObject;
  UnitName := obj.UnitName;
  Ctx := TRttiContext.Create;
  try
    ProcType := Ctx.GetType(obj.ClassType);
  finally
    Ctx.Free;
  end;

  Result := '"'+UnitName+'.'+ProcType.ToString+'"';
end;
Jetzt kann ich ich loggen mit:
procedure Foo<T>(AInvoke : TProc)
begin
   ...
  FDKConfig.GetLogger( Self ).Debug( 'Foo<%s>(%s)', [
    PTypeInfo( TypeInfo( T ) ).Name,
      TFDKProcLogHelper.Proc2String(@AInvoke) ] );
   ...
end;

Und wieder ist ein Puzzelsteinchen für's FDK fertig.