Neuer Meilen Stein erreicht

Um Projekte überhaupt abschließen zu können muss man sich immer Ziele setzten und echt hart bleiben.

In dem aktuellen Projekt gab es schon mehrere Punkte an denen ich abbrechen wollte . Zum einen weil es so viele andere interessante Dinge gibt zum anderen der öde Teil an Projekte auf die man keine Lust hat und bei dem man die Details ausarbeiten muss. Zum anderen gibt es dann auch noch Punkte die einen nerven die vorher falsch geplant oder mangelhaft umgesetzt waren.

Aber all dem zu Trotz konnte ich einen neuen Meilenstein erreichen und das Newsletter System implementieren . Dieses enthält Empfänger Gruppen, unterbrechen des Sendevorgangs, Zeitgesteuertes versenden sowie einige Auswertungen jedes Newsletter.

Zudem können Newsletter einmalig oder im Intervall versendet werden wobei sich der Inhalt den aktuellsten Inhalten der Objekt Typen zum versenden nimmt.

Hier ist leider noch Optimierung gefragt denn wenn sich keine Inhalte ändern wird ein identischen Newsletter versendet.

Die Optimierung wird aber in den nächsten Tagen erfolgen.

Nächster Meilenstein ist die Integration von sozialen Medien.

PHP erstellen von Observern, Subscribern und Event

Hi Leute,

gestern im Live Stream habe ich mich ein wenig mit Observern und Subscribern beschäftigt.

Ziel war es einen View zu erstellen und diesen zu Rendern. Das geht natürlich alles auch viel einfacher aber durch die Verwendung von Observern und Subscribern sind die Möglichkeiten viel flexibler zwischendurch noch andere dinge zu erledigen.

Dazu folgt als nächstes die Implementierung von Events um bestimmte Ereignisse genauer zu spezifizieren.

Durch die Verwendung von abstrakte Klassen und Interface sieht das ganze schon sehr nach richtiger Software aus.

https://www.livecoding.tv/onko/videos/bXQdr/embed

Freu mich auf neue Abonnenten in Livecoding und schaut mal vorbei. Livecoding.tv/onko

Heute Abend kommen dann die Events.

Build a PHP Docker File with .htaccess and Mod-Rewrite

Hi Guys,

today a write about Docker to share a PHP Project with Mod-Rewrite and no Public Application Code and i try to write it in english. I must learn it. 😀 This How-to is written for Puschel from Cranktube.tv. Maybe he will understand the Docker Commands now.

The PHP Project Folder are

/myProject

/appcode

/Model
/View
/Control

/html

/css
/js
/img
index.php

.htaccess
.gitignore
Dockerfile
httpd.conf

The First Step is to open a File names Dockerfile and write the Build Requirements in it.

Here the full Dockerfile Content.

FROM centos:latest
MAINTAINER Manuel ‚Onko‘ Müller <mueller.m.h@gmail.com>

RUN yum update -y
RUN yum install git curl php -y
RUN yum install httpd -y
RUN yum install php-pdo -y
RUN yum install php-pdo_mysql -y

COPY . /var/www
COPY httpd.conf /etc/httpd/conf/httpd.conf

EXPOSE 80

CMD httpd && tail -f /var/log/lastlog

We need a OS so i choose CentOS in latest version. This is the First Line

FROM centos:latest

The MAINTAINER is only for Information, who has written this holy shit.

The next RUN Commands update the CentOS and install Git, Curl, PHP, httpd, php-pdo, php-pdo-mysql

PDO is the Database Conector and php_pdo_mysql the Connector for MySQL.

The Copy Command take the Content of the actually Folder in the Docker Container. The Target Folder is /var/www. This is the httpd default Webroot.

Then i  copy my own httpd.conf file in the Container to Allow Override and some other Stuff. This File is in the same Folder too.

EXPOSE 80 Open the http Port for the Container so it is possible to connect the container.

CMD httpd && tail -f /var/log/lastlog this command start the httpd service and open a logfile without the tail logfile the httpd will startet and the docker container shutdown if all done.

Now we have a full running PHP Project in this Container.

In my Case i will run it local for development. So i run boot2docker on my Windows Maschine and shared my Development Folder with the Virtual Maschine. So i have access to it with mount Point /c/Users

So i Switch the workdir to my development Project Folder

cd /c/Users/myPHPCode

In this folder are my PHP Code, public code like CSS Images and public PHP Files in subfolder html, my httpd Config and the Dockerfile

So i can build a Container now.

docker build -t myProject .

The dot as the end is the acctually folder i can use follow command too.

docker build -t myProject /c/Users/myPHPCode

Next Command we need is to start the Container.

docker run -p 80:80  -d -i -t myProject

With -p i mapped the container port 80 to the Virtual Maschine Port 80.

Now i have running a PHP Project with the latest code of my Project. But i want to change code and try it out. so i can mount my real local code to the container.

With -v i can mount /var/www with the virtual maschine folder /c/Users/myPHPCode

docker run -p 80:80 -v /c/Users/myPHPCode/var/www -d -i -t myProject

I hope my english is clear enough to understand what i try to explain. 🙂

mysql_query ( ) und mysql_* co hat ausgedient

Da ich mich privat wiedermal PHP gewidmet habe ist mir jetzt erst bekannt geworden das die wohl meist verbreitete Art der MySQL Datenbank Nutzung im PHP Bereich längst ausgedient hat und bereits auf der Abschuss Liste steht. Oder besser gesagt in den neuesten Versionen bereits nicht mehr vorhanden sind.

Als Alternative kommt nun nur der Connector PDO zum Tragen. Auch dieser ist nicht neu und seit Jahren ein erpropter Connector.

Natürlich war das die richtige Entscheidung PHP weiter Richtung OOP zu bringen und die alt gedienten Funktionen zu entfernen.

Wer seine Datenbank Handler mit prepare bind_param und execute ausgestattet und verwendet hat, ist die umstellung kein spektakulärer Eingriff. In den besten Fällen kann zum Beispiel der Inhalt der eigenen Datenbank Klasse gelöscht und stattdessen ein extend PDO genutzt werden.

Die Info ist für alle die wie ich überhaupt nicht auf dem laufenden sind. 🙂

Viel Spass beim programmieren.

Backups wtf …

Eigentlich bin ich sehr sorgfältig mit Backups, eigentlich …

Langzeit Daten speichere Ich auf Amazon S3, Alles an Dokumente und Excel landen in Google Drive ebenso alle Bilder. Programmcode liegt auf GIT oder BitBucket und in meiner Dropbox… und dann das.

Nach gut 3 Jahren benötige ich tatsächlich wieder mein PHP Framework. Kein Ding ist ja alles gesichert … denkste.

Mein 500GB Development Festplatte ist altersbedingt in die Knie gegangen, kein Problem neue rein Code der benötigt wird auschecken und weiter gehts. In den letzten 3 Jahren hab ich mich hauptsächlich mit Coldfusion, Java, C# und SQF C++. So das meine PHP Webprojekte weiterhin in dem unendlichen Wolkenspeicher liegen. Also hab ich mir die Tage meinen Kram gezogen und ein wenig in alten Projekten geschwelgt. Ziel war es mein Framework was ich 2007 angefangen habe zu schreiben, wieder zu verwenden. Bis hier war ich mir sicher das alles in den Backups liegt. Hier sind auch einige Projekte hinterlegt. Mein Clan Content Management System aus dem Jahr 2000. World of eSport von 2005 und einiges an nie fertig gewordene Projekte. Aber kein Framework…

Tatsächlich liegt der Code weder bei Git noch Bitbucket. Auch in den Cloud Speichern ist nichts zu finden. Eine Wiederherstellung der Daten von der HDD ist auch nicht mehr möglich da diese bereits Sachgemäß entsorgt wurde.

Leider ist auch das letzte DVD Backup schon veraltet, 2009 steht auf der Scheibe.

Moral von der Geschichte: Wer seine Daten nicht ordentlich Backupt hat Pech gehabt.

Bis dahin Happy Backup Dude

Freitag, Symfony und der Sinn

Freitag, die Woche hat endlich ein Ende gefunden. Stundenlange Qualen des lauten Tickens eines Sekundenzeigers.

Cranktube soll auf Symfony aufgebaut werden. Eines der Top Frameworks im PHP Bereich . Es soll einem alles abnehmen und man braucht sich nur noch um das Wesentliche kümmern. Tausende Bundle der Community stehen bereit um genutzt zu werden. Caching, MVC und Orm über nimmt das Framework. Dazu schreibt man über die Konsole Befehle die Bundle Models und Co generieren. Das ganze kostet nur 20MB overhead und nimmt einem auch nicht mehr ab..

Ich mag Symfony nicht.

PHP ist wohl die leichteste Programmiersprache die es je gab und wurde explizit für den Einsatz im Web entwickelt. Mit wenigen Zeilen Code hat man eine Datenbank Klasse, Registrierungshandler und ein entsprechendes View gebastelt. Im html sind mit ein paar extra Zeichen alle von mir gewünschten Variablen ausgegeben. Dazu braucht man keine template engine die pseudo Code parst um dann daraus PHP zu generieren. Und was hat im PHP Webbereich bitte eine Console zu suchen? Dann der overhead von bis zu 80MB nur damit ich eine nicht benötigte Console habe und meine Klassen Routen kann über findige? Ach ja die Datenbank… Hier in Blog findet ihr ein Beitrag von mir in dem ich über meinen Datenbank parser schreibe. Das Datenbank Design wird dabei nicht in eine „concole“ getippt sondern sauber über workbench designed .. Datenbank Design ..  anschließend ließ der parser das Schema aus und generiert alle benötigten Objekt classen inkl Verknüpfungen und Update Register. Die Objekte wissen wann sie sich zu speichern haben.

Mit Session, Error , Database und Co Handler komm ich da auf eine große von nicht mal 500kb.

Zu dem Totschlag Argument „damit geht es aber viel schneller und ist sauberer“ sag ich nur WTF ….

Sagen wir mal 7 Tage für die Einarbeitung in Symfony um überhaupt zu verstehen was die von einem wollen.
Dazu das verlangsamte Tempo dank der Unsicherheit ob das denn so funktioniert. 3 Tage um Code neu zu schreiben der nicht zum Konzept von symfony passt. Nach vielleicht 3 Monaten hat man die Besten Wege raus gefunden um damit zu arbeiten und erste Erfahrungen sammeln können.

3 Monate pro Entwickler der neu in dem Bereich ist… Ganz schön teuer . Und dafür macht man sich dann auch noch von einem weiteren abhängig. Jaja symfony wird sicher die nächste 5 Jahre weiter entwickelt.
Aber was ist in 10 Jahren?  Es gibt PHP Projekte die laufen seit 20 Jahren und solche wird es in Zukunft auch geben . Hier und da umbauten durch PHP Updates .. okay muss man mit Leben aber dann noch umbauten für  Updates von drittanbieter weil irgend etwas in einem Top aktuellen framework eines anderen noch viel besser läuft und man dazu ja mal das alte komplett ersetzt. Gab es auch schon alles … Auch bei symfony.

Mir geht es aber nicht nur mit symfony so. Nehmen wir laravel .. da wird’s noch verrückter… Laravel setzt nämlich einfach noch ein wraper über symfony Oo warum zur Hölle?

TYPO3 bringt direkt noch eine eigene scriptsprache mit die Macher in PHP umgewandelt wird um dann interpretiert zu werden?

Das ganze kann man bis zum erbrechen fortführen .

Frameworks sollen das bestehende mit sinnvollem erweitern um einige Funktionalität bereit zu stellen und nicht so tun als ob sie eine eigene Programmier Sprache sind .

HTTP Request, Response Androide App, REST JSON API

Gerade im Bereich der App Entwicklung möchte man Inhalte über das Web abrufen und in der Applikation weiterverarbeiten.
Oft ist es aber auch notwendig Daten zum Server zu schicken und diese dort zu speichern.

Daher habe ich mir meine JSONServer.class auseinander gepflügt um hier die einzelnen Punkte nieder zu schreiben.

Für meine Zwecke habe ich folgende Bibliotheken in meine JSONServer.class importiert:

  • import org.apache.http.NameValuePair;
  • import org.apache.http.client.ClientProtocolException;
  • import org.apache.http.client.HttpClient;
  • import org.apache.http.client.ResponseHandler;
  • import org.apache.http.client.entity.UrlEncodedFormEntity;
  • import org.apache.http.client.methods.HttpPost;
  • import org.apache.http.impl.client.BasicResponseHandler;
  • import org.apache.http.impl.client.DefaultHttpClient;
  • import org.apache.http.message.BasicNameValuePair;
  • import org.apache.http.params.BasicHttpParams;
  • import org.apache.http.params.HttpConnectionParams;
  • import org.apache.http.params.HttpParams;
  • import org.json.JSONObject;

Um mit dem Ergebnis des Servers weiter zu arbeiten nutze ich das  JSONObject in der Applikation.

Um ein neues JSONObject  zu erstellen benötigt man nicht viel Code:

JSONObject json = new JSONObject(„{name:“JSON STRING“});

Nun steht ein aus dem JSONSTring abgeleitetes Objekt zur Verfügung. Möchte ich nun den wert von „name“ auslesen

Aufbau  der httpParameter:

HttpParams httpParams = new BasicHttpParams();
HttpConnectionParams.setConnectionTimeout(httpParams,
TIMEOUT_MILLISEC);
HttpConnectionParams.setSoTimeout(httpParams, TIMEOUT_MILLISEC);

und des HttpClient sowie HttpPost:

HttpClient httpclient = new DefaultHttpClient();
HttpPost httppost = new HttpPost(ServerUrl);

Erstellen eines NameValuePairs für die Post Daten:

List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2);
nameValuePairs.add(new BasicNameValuePair(„user“, „wert“));
nameValuePairs.add(new BasicNameValuePair(„lat“, „Wert“)));
nameValuePairs.add(new BasicNameValuePair(„lng“, „Wert“)));

Und absenden :

httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
ResponseHandler<String> responseHandler = new BasicResponseHandler();
String responseBody = httpclient.execute(httppost, responseHandler);

Anschließend den Response zum JsonObject übergeben:

JSONObject json = new JSONObject(responseBody);

Mantis SOAP API Teil 1 Issue Get and Add

Zur Zeit entwickel ich einen WebService der zwischen Mantis und Zendesk Tickets und Kommentare synchronisiert.
Klingt etwas spektakulär, ist im Grunde aber eine Simple Sache wenn nicht immer alles nicht funktionieren würde.

Die Mantis SOAP Api:

Wenn es nach mir ginge würde da eine REST Api hinterstecken aber gut es geht aber nicht nach mir.

Mir ist aufgefallen das es keine wirklich schöne Dokumentation der Mantis Api geht.
Die Nerds unter Euch denken wahrscheinlich: „docu? … wtf … steht alles in der wsdl“ aber das lesen der wsdl ist auch nicht jedermanns Sache.

Da ich ein fauler Programmierer bin, hab ich mir natürlich nicht die Arbeit gemacht, die Komponenten, Verknüpfungen und den Restlichen Firlefanz selbst zu schreiben.
Hierfür hab ich meiner  Request Komponente einfach eine Methode gegeben die aus dem ganzen WSDL Kram die Klassen und Modele erstellt und sich selbst der Komponente erweitert.

Wunder Bärchen.

Grob sähe dass dann so aus.


function parseXml(xml)
{
httpService = new http();
httpService.setMethod('GET');
httpService.setTimeOut(10);
httpService.setUrl( 'http://www.mantisbt.org/bugs/api/soap/mantisconnect.php?wsdl');
result = httpService.send().getPrefix();
xmlfile = xmlparse(result.filecontent); //Parses the XML

//dump(var="#xmlfile.XmlRoot#",label="dump",format="html",abort=true);
strComponent = 'component {';
if(structKeyExists(xmlfile.XmlRoot, "XmlChildren"))
{
for(node in xmlfile.XmlRoot.XmlChildren)
{
switch(node.xmlName){
//dump(var="#node#",label="dump",format="html",abort=false);
case 'message':
if(structKeyExists(node, "XmlAttributes"))
{
strComponent &= chr(13) & chr(10) &'public function ' & node.XmlAttributes.name;
strComponent &= '(';
paramArray = [];
for(strParam in node.XmlChildren)
{
if(structKeyExists(strParam, "XmlAttributes") && strParam.XmlAttributes.name !='return')
ArrayAppend(paramArray, strParam.XmlAttributes.name);
}
if(arrayLen(paramArray))
strComponent &= arraytolist(paramArray);
strComponent &= ')'& chr(13) & chr(10) &'{'&chr(10)&chr(13);
for(strParam in node.XmlChildren)
{
if(structKeyExists(strParam, "XmlAttributes") && strParam.XmlAttributes.name !='return')
strComponent &= chr(9)&'param name="' & strParam.XmlAttributes.name & '" type="' & Mid(strParam.XmlAttributes.type,5,len(strParam.XmlAttributes.type)-3) & '";'&chr(10)&chr(13);
}
}
strComponent &= '}'&chr(10)&chr(13);

break;
case 'types':
for(comps in node.XmlChildren[1].XmlChildren)
{
if(structKeyExists(comps, "XmlAttributes"))
{
if(comps.xmlName == 'xsd:complexType')
{
newComp ='component ' & comps.XmlAttributes.name &chr(10)&chr(13)& ' {'&chr(10)&chr(13);
for(strParam in comps.XmlChildren)
{
for(strP in strParam.XmlChildren)
{
if(structKeyExists(strP, "XmlAttributes"))
if(structKeyExists(strP.XmlAttributes, "name"))
newComp &= chr(9)&'property name="' & strP.XmlAttributes.name & '" type="' & Mid(strP.XmlAttributes.type,5,len(strP.XmlAttributes.type)-3) & '";'&chr(10)&chr(13);
}
}
newComp &= "function toXML()
{
data = getMetaData(this);
xml = '';
for (prop in data.properties)
{
xml &= '<'&prop.name&'>';
switch(prop.type)
{
case 'string':
if(structKeyExists(this, prop.name))
xml &=this[prop.name];
break;
case 'dateTime':
if(structKeyExists(this, prop.name))
xml &=this[prop.name];
break;
case 'boolean':
if(structKeyExists(this, prop.name))
xml &=this[prop.name];
break;
case 'integer':
if(structKeyExists(this, prop.name))
xml &=this[prop.name];
break;
default:
if(refind('Array',prop.name))
{
if(structKeyExists(this, prop.name))
xml &= arrayToList(this[prop.name]);
}
else
{
Comp = createObject(prop.type);
Comp.toXml();
}
break;
}
xml &='';
}
return xml;
}";
newComp &= '}';
FileWrite(comps.XmlAttributes.name&'.cfc',newComp);
}
}
}
break;
}
}
}
strComponent &= '}'&chr(10)&chr(13);
FileWrite('mantis.cfc',strComponent);
//dump(var="#strComponent#",label="dump",format="html",abort=true);
}

MEMO (an mich): Ich brauch hier im Blog mal einen ordentlichen Code Parser -.-

Gut dann hab ich alles was ich benötige zur Hand und kann die Model dem Manger geben.

Die wichtigsten Methoden möchte ich hier einmal aufführen:

Diese Methode holt sich den Eintrag der übergebenden ID

public function issue_get(issue_id)
{
param name="issue_id" type="number";

return '<mc_issue_get>'
& '<username>'
& this.username
& '</username>'
& '<password>'
& this.password
& '</password>'
& '<issue_id>'
& issue_id
& '</issue_id>'
& '</mc_issue_get>';
}

Diese Methode erstellt einen neuen Eintrag.
issue._toString() ist eine von mir überschriebene Methode die mir aus den erstellten Modellen sauberes XML zurückliefert um es einfach an die Api zu schicken.


public function issue_add(issue)
{
param name="issue" type="IssueData";

xmlData = ''
& ''
& this.username
& ''
& ''
& this.password
& ''
& ''
& issue._toString()
& ''
& '';
return xmlData;
}

PHP Model Generator

Hallo Leser,

diese Woche habe ich mich mit einem Problem beschäftigt das mir sehr am Herzen lag.
Zeit sparen in der Entwicklung.
Nachdem ich ein Datenbank Design fertig gestellt hatte ging es wie immer damit los die Models in PHP nieder zu schreiben. Anschließend noch die Lade und Speicher Routine einzufügen und die verschiedenen Objekte des erstellten Objektes zu laden.

Hier gehen schon einige Stunden ins Land und diese Zeit hab ich persönlich einfach nicht um Produktiv arbeiten zu können. Ich muss dazu sagen das ich in meinen Entwicklungen nur auf 3 Frameworks zurückgreife.

Zumeinen Smarty als Template Engine dann noch Xajax für, na klar, Ajax Implementationen und zu guter letzt JQuery für das Frontend. So das ich bei Projekten fast bei 0 Anfange. Das Grundgerüst der Applikation steht in 10 Minuten mit autoload, funktionstüchtiger Template Engine und meiner Xajax Autoload Klasse um die entsprechenden Objekte einzubinden die Ajax Requeste verarbeiten.

Also habe ich beschlossen mir die Arbeit der Modele zu erleichtern und nur noch die Controller und Applikationslogik zu schreiben was mir persönlich viel zeit sparen wird.

Was macht der Generator?

Nach dem ich ihm das Datenbank Schema zugewiesen habe, welche ich immer mit MySQL Workbench erstelle, beginnt der Generator alle Tabellen und deren Spalten auszulesen. Er generiert die Einträge der Objekteigenschaften und anschließend die Get und Set Methoden. In diesen Methoden prüft der Generator noch ob das Feld ein Prim Key einer anderen Tabelle ist und bereitet die Set Methode dafür vor das entsprechende Objekt zu laden. Anhand der Spalten kann gleichzeitig die Prüfroutine des Wertes implementiert werden, sprich Type und Länge des Wertes. Hinzu kommt noch ein Change Array das Änderungen der Set Methoden registriert und im __destruct verarbeitet. Hier werden dann die Änderungen automatisch in der Datenbank aktualisiert Dies hat den Vorteil das ich mich um die Objekt Speicherung nicht mehr kümmern muss und in der Logik der Anwendung nur noch mit den Set und Get Parametern arbeite. Im __Constructor wird das Objekt und alle Verweise an Objekten anhand der eigenen Id initialisiert. Natürlich nur wenn auch eine Id gesetzt ist.

Nachdem alle Methoden und Eigenschaften im Objekt Array gesetzt sind wird das Objekt in einen Definierten Ordner der Applikation geschrieben und über den autoload eingebunde.

Bei Datenbankentwürfen mit vielen Tabellen ist dies ein erheblicher Zeitsparer der sich natürlich auch zu Gunsten der Kunden auswirkt.

SQL Anweisung für das Auslesen der Datenbank:

„Show Tables;“ – gibt alle Tabellen des Schemas aus.
„SHOW COLUMNS FROM $table“; – gibt alle Spalten der Tabelle aus. Inkl. Key, Type und Default Wert
Der Generator an sich besteht nur aus ein paar Schleifen und einem Schreibvorgang für Datein.

Wünsche Euch Viel Spaß euch auch einen Generator zu basteln.

 

 

Visual Basic Projekt

Hallo Zusammen,

heute schreibe ich etwas über mein neues Projekt an dem ich gerade Arbeite. Hier bei geht es um ein Buchungssystem das auf Windows Tablett PC´s genutzt wird und verschiedene USB Komponenten verwendet.
Die Datenspeicherung wird über ein Web-Service realisiert, hier können Kunden Daten, Mitarbeiter Daten und Produktdaten ausgelesen werden und die gebuchten Produkte werden hier  nachgehallten.

Da mein Schwerpunkt ehr in der Entwicklung mit PHP und MySQL liegt bin ich immer wieder darüber überrascht wie einfach der Umstieg von PHP auf VB, C, C++, C# oder Java ist. Unterschiede findet man hauptsächlich in der Syntax und der zu verwendenden Bibliotheken. Dabei muss ich sagen das die Desktop Entwicklung um einiges einfacher ist als die Frontend Entwicklung im Web.

Layer Verarbeitung die in PHP, HTML und JavaScript vorbereitet werden müssen und entsprechende Funktionalitäten implementiert werden müssen ist dies alles schon in der Desktop Umgebung vorhanden und muss nur noch angesprochen werden. Objekte die man in der PHP Entwicklung mühselig erstellt sind im Vollen Umfang vorhanden und brauchen nur noch verwendet werden.

In der Vergangenheit habe ich öfters den Satz zu Hören bekommen: „Wer eine Programmiersprache beherrscht, kann in jeder Sprache entwickeln.“
Nun bedenkt man das man mit der wohl „einfachsten“ Sprache begonnen hat und nun in die Entwicklung der Desktop Applikationen starten soll.
Das kann doch nicht funktionieren!?

Aber ich kann sagen es Funktioniert. Vielleicht liegt es mit daran das ich in den frühen 90er schon Basic und Pascal Programmiert habe und hier alter Datenbestand abgerufen wird. Ich bin jedoch der Meinung und da werden mir wahrscheinlich einige Entwickler zustimmen, dass es bei der Programmierung wirklich nicht auf die Sprache ankommt sondern rein auf die Logik welche man damit darstellen möchte.

Ich kann jedem angehenden Entwickler nur Empfehlen über den Tellerrand der eigenen Entwicklungssprachen zu schauen und mal ein Projekt in einer anderen Sprache zu realisieren.

In weiteren Beiträgen werde ich auf ein paar Dinge bei der Desktop Entwicklung eingehen und den ein oder anderen Tipp als Beispiel hier veröffentlichen.

In dem Sinne viel Erfolg!