Mit Geokoordinaten Adresse auf der Map anzeigen lassen

Aktuell arbeite ich für einen Kunden aus der Landwirtschaft und der arbeitet mit vielen Geodaten. Aber auch zu anderen Gelegenheiten, benötige ich immer mal wieder ein Tool in dem ich die Adresse anhand der Geokoordinaten herausfinden kann. Es gibt bereits einige Tools, aber beim bekanntesten kann man so nur drei Adressen am Tag abfragen. Deshalb hab ich mir jetzt einfach mal ein kleines Google Maps Tool erstellt, wo ich mir das Anzeigen lassen kann. Vielleicht braucht ihr das ja auch ab und an mal. Hier geht es zum Tool.

Gehalt eines Softwareentwickler in Deutschland berechnen lassen

Wo ich noch Angestellter war und ich mich für einen neuen Job irgendwo beworben habe, gab es für mich beim Bewerbungsgespräch immer eine spezielle, unangenehme Situation. Die Frage nach dem Gehaltswunsch. Egal in welche Branche. Als als Onlinemarketer oder SEO oder als Softwareentwickler. Vielleicht geht es euch genauso. Beim Onlinemarketing, SEO habe ich eigentlich immer meinen Gehaltswunsch erfühlt bekommen. Nur bei der Softwareentwicklung nie. Das war auch einer der Gründe mich als Softwareentwickler selbstständig zu machen.

Im Corona Jahr 2020 habe ich einen sicher geglaubten Auftrag nicht erhalten und ich musste nach neuen Aufträge suchen. Anfang 2020 und damit zu beginn der Pandemie auch als Softwareentwickler nicht ganz so easy wie in den Jahren zuvor. Aus Interesse checkte ich mal das Jobportal Glasdoor nach freien IT PHP, Vue JS Jobs im Sauerland in NRW. Auch Dortmund und Köln wären eine Option gewesen, wenn mir ein vertraglich zugesicherter Remotanteil eingeräumt wäre. Im Sauerland habe ich mich auf zwei Stellen beworben. Einmal in Brilon und einmal in Oventrop. In Brilon war es eine Onlinemarketing Agentur und in Oventrop ein IT Dienstleister mit nur einem Kunden im Bereich Lohnabrechnungssysteme. Bei beiden Stellen hatte ich ein echt nettes Gespräch und das Gefühl, ich muss nur noch sagen, wann ich Anfangen möchte. Dem war auch so. Beide Unternehmen wollten mich haben. Irgendwie war schon mal ein schönes Gefühl. Aber dann ging es zum leidlichen Thema Gehalt. Gleich vor weg. In Deutschland variieren die Gehälter leicht in Abhängigkeit zur Unternehmensgröße und Bundesland. Ich glaubte mit einem Mittelwert komme ich gut an und bezifferte meinen Einstiegsgehaltswunsch aufgrund meiner Qualifikation auf 60 K (also 5000 pro Monat). Schweigen! Beim einen hatte ich das Gefühl ein entsetztes Gesicht zu sehen. Boah ey – „Hielten die mich jetzt für unverschämt?“ Irgendwie immer das Gleiche – eine sehr unangenehme Situation. Was sich bei mir aber raust stellte, war das ich im falschen Bundesland und an die falschen Unternehmen gekommen war. Und eventuell das ich im Sauerland nachfragte. Hier sind die Gehaltskönige noch die Maschinenbauer. Kariertes Hemdchen, Einfamilienhaus, Salomon Turnschuhe und zwei Autos in der Garage. Das sind hier die Kings. Ich dachte ich war durch Berlin und Hamburg einfach zu verwöhnt. Und fing an, an meinem Gehaltswunsch zu zweifeln. Und genau das dürft ihr nicht machen. STOPP!

Ein guter Softwareentwickler kostet Geld. Er liefert in den allermeisten Fällen, ein skalierbares Produkt, dass das Gehalt rechtfertigt. Falls nicht, sollte man eventuell an der Preispolitik des Produktes etwas ändern. Oder das Produkt an sich überdenken.

Softwareentwickler wie ich sind ständig am lernen. In den letzten Jahren, ausgenommen der Geburtstage, habe ich an jedem Tag etwas in Softwareentwicklung dazugelernt. Selbst auf dem Klo, beschäftigte ich mich bereits schon ausgiebig mit Designpatterns um mein Code verbessern. Die Vielschichtigkeit in der Softwareentwicklung ist immens und meines Erachtens gibt es wenig Berufe wo eine ähnlich hohe Lernbereitschaft abgefordert wird. Klar gibt es auch Softwareentwickler die gerne WordPress aufsetzen ein paar Design und PHP Anpassungen vornehmen und jahrelang auf der Stelle treten. Die sogenannten WPJqueryPhp`ĺer. Auch wenn die viel cooles mit WP zaubern und eine vollkommende Daseinsberechtigung haben, von denen spreche ich gerade nicht.

An dieser Stelle löse ich mal das Rätsel, wie viel man im Sauerland bereit gewesen wäre für einen Senior PHP Laravel und Vue Developer auszugeben. 3330 Euro Brutto monatlich und bei der anderen Stelle 2800 Brutto monatlich. Ich fragte in meiner Naivität ob es hier um eine Halbtagsstelle ginge. Das war für die Oventroper wohl zu viel des Guten. Ich blieb weiter Selbstständig und hatte nach dem Sommer wieder gute Anfragen und damit auch Aufträge.

Hier ein wichtige Tipp: Wer wissen möchte, wie viel man in etwa in deiner Branche, Altersgruppe und Bundesland verdienen sollte, schaut mal beim Destatis.de nach. Hier ist ein echt guter Gehaltsrechner.

Was ich mit diesem Artikel nicht möchte, ist das schlechtreden von angestellten Softwareentwicklern. Bei angemessenen Gehalt wäre das auch für mich heute immer noch eine Option.

MySQL Datenbankserver im lokalen Netzwerk einrichten

Es kommt mal vor, dass man beim Entwickeln die Test, Entwickler Datenbank nicht auf einem Liveserver sowie auf dem lokalen Rechner einrichten möchte. Und arbeiten an der Livedatenbank sollten sowieso keine Option sein. Jedenfalls kann der Wunsch nach einer Testdatenbank, die nicht auf dem Entwicklerrechner installiert ist unterschiedliche Gründe haben. Ein häufiger Grund ist wohl, wenn die Datenbank sehr mit Testdaten aufgebläht ist. So war das bei einem großen Kunden von mir. Die Datenbank war so riesig, dass man den Dump nicht auf den Rechner hätte packen können. Wahrscheinlich wurden dort alle Flatulenzen der letzten 30 Jahre aller Menschen, samt Geodaten und Meta(n)daten in die Datenbank geschrieben. Der Dump alleine war ein Wochenprojekt. Es war wirklich einfach grauenvoll. Unabhängig von den Gründen, ist es auch nett zum Verständnis im eigenen Netzwerk eine Datenbank auf einem am Netzwerk angeschlossenen Rechner (Server) zu kontaktieren.

Was muss gemacht werden. Wir bräuchten mindestens zwei Rechner. Der eine (Host) der die Datenbank hat und der andere (Client) der über das Netzwerk drauf zugreift. Dazu benötigen wir natürlich auch die lokale IP Adresse des Datenbankrechners. Im Grunde könnten wir auch sagen, wir brauchen die IP Adresse von unserem lokalen Datenbankservers. Unter der Linux Distribution Ubuntu geht das rasch mit der Konsole.

hostname -I

Der erste Wert wäre die benötigte IP Adresse. In meinem Fall die 192.168.1.45

Nun müssen wir als erstes auf dem Datenbankserver die Configuration anpassen. Diese ist nämlich Standardmässig nur auf Zugriffe innerhalb des installierten Rechners nutzbar. Also nur localhost. Dazu müssen wir in einer Konfigurationsdatei von MySQL eine Zeile ändern.

Das ändert man ebenfalls über die Ubuntu Konsole:

sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf 

In der Zeile bind-address: 127.0.0.1 ersetzten wir den Wert 127.0.0.1 mit 0.0.0.0 . Das bedeutet nun das Remote Rechner die Datenbank ansprechen können. Ansonsten wird die Ansprache von MySQL direkt verweigert.

Standardmäßig ist ein MySQL Nutzer nur Abrufbar vom Rechner auf dem MySQL installiert ist. Mit anderen Worten nur localhost. Man kann sich die Nutzer und deren Hosts ausgeben lassen:

mysql -u root -p
mysql_>  SELECT USer, Host, authentication_string FROM mysql.user;

Im nächsten Schritt müssen wir auf dem Datenbankserver einen Nutzer anlegen, der berechtigt ist, von einem externen Aufruf zu antworten. Wir loggen uns dafür über die Konsole auf den Datenbankserver ein.

mysql -u root -p

nun

mysql_> CREATE USER 'remote_user'@'%' IDENTIFIED BY superCyptoPassword_123';

das Prozentzeichen dient hier als Wildcard und berechtigt Remote Rechner den Zugriff auf die Datenbank. Statt einer Wildcard (%) kann man auch mit festen IP oder IP Bereichen arbeiten.

_> CREATE USER 'remote_user'@'192.168.1.45' IDENTIFIED BY superCyptoPassword_123';
_> CREATE USER 'remote_user'@'192.168.1.%' IDENTIFIED BY superCyptoPassword_123';
und Standard wäre:
_> CREATE USER 'remote_user'@'localhost' IDENTIFIED BY superCyptoPassword_123';

danach berechtigen wir den neuen User, dass er auf alle Datenbanken auf dem Datenbankserver zugreifen darf.

GRANT ALL PRIVILEGES ON *.* TO 'remote_user'@'%';

Alternativ kann man den User auch nur auf eine bestimmte Datenbank zugreifen lassen oder gar nur auf eine bestimmte Tabelle in einer Datenbank eingrenzen. Ebenfalls kann man Lese und Schreibrechte einen einzelnen Nutzer zuweisen. Dazu mal in einem anderen Tutorial. Wenn ihr das wollt?

That it.

mysql> SELECT Ueer, Host, authentication_string FROM mysql.user;
+------------------+-----------+-------------------------------------------+
| USer             | Host      | authentication_string                     |
+------------------+-----------+-------------------------------------------+
| root             | localhost | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE |
| mysql.session    | localhost | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE |
| mysql.sys        | localhost | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE |
| debian-sys-maint | localhost | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE |
| icke           | localhost | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE |
| remote_user         | %         | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE |
+------------------+-----------+-------------------------------------------+

SSH Authentifizierung mit dem SSH Public Key einrichten

Die schlüsselbasierte Authentifizierung in SSH wird als Authentifizierung mit öffentlichem Schlüssel / Public Key bezeichnet. Mit ssh-copy-id kann man leicht die Authentifizierung mit dem SSH Public Key einrichten. Der Prozess läuft wie folgt ab.

Generieren zuerst einen SSH-Schlüssel / SSH Key

Mit OpenSSH wird ein SSH-Schlüssel mit ssh-keygen erzeugt. Führe den Befehl ssh-keygen aus und beantworten die folgenden Fragen.

# ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/seotheater/.ssh/id_rsa): meinKey
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in mykey.
Your public key has been saved in mykey.pub.
The key fingerprint is:
SHA256:FCKW765ALioSCryPtIsAfDiSKAcKeXeOUOz3Us ma@seo
The key's randomart image is:
+---[RSA 2048]----+
|.*++ o.o.        |
|.+C + oo.        |
| +++ *+.         |
| .o.Oo.+H        |
|    ++M.B.       |
|   o * =.        |
|  + = o          |
| + = = .         |
|  + o o          |
+----[SHA256]-----+
#

Schlüssel auf den Server kopieren

Sobald ein SSH-Schlüssel erstellt wurde, kann er mit dem Befehl ssh-copy-id als autorisierter Schlüssel auf dem Server installiert werden. Sobald der Schlüssel für SSH autorisiert wurde, gewährt er den Zugriff auf den Server ohne Passwort.

Verwenden Sie folgenden Befehl, um den SSH-Schlüssel zu kopieren:

ssh-copy-id -i ~/.ssh/mykey benutzer@host

Dieser meldet sich beim Server-Host an, kopiert Schlüssel auf den Server und konfiguriert den so, dass der Zugriff gewährt wird. Beim Kopieren wird letztmalig das Passwort oder eine andere Authentifizierung für den Server verlangt.

Es wird nur der öffentliche Schlüssel auf den Server kopiert. Der private Schlüssel solltest Du niemals auf einen anderen Rechner / Server kopieren.

Jetzt teste mal den SSH Zugriff auf deinen Server. Du wirst merken, keine Passwortabfrage mehr. Einfach druff..

Laravel Mass Assignment – kurz erklärt

Jeder der mit Laravel und einer Datenbank arbeitet kommt zwangsläufig auf das Thema Mass Assignment. Was ist das eigentlich?

Beziehungsweise ihr kennt diese HTTP 500 Fehlermeldung:
Add [name] to fillable property to allow mass assignment on [App\Models\Profil].

Stellen wir uns vor wir haben eine Website mit einem geschütztem Dashboard für unsere Nutzer. Ein registrierter Nutzer kann unter anderem sein Profil bearbeiten. Beispielsweise: Email, Vorname, Nachname, Strasse usw. Stellen wir uns weiter vor, dass wir in unserer Applikation dem Nutzer verschiedene Rollen zuweisen können. Zum Beispiel Premiumnutzer, Admin oder ähnliches.

Wenn der Nutzer über ein Formular sein Profil bearbeitet und an das Backend abschickt passiert dann folgender Ablauf. Im Backend Controller wird der Request entgegengenommen. Zum Beispiel:

public function update_profil(Request $request) {
	$id = $request->input('id');
	$name = $request->input('name');
	$street = $request->input('street');
	$email = $request->input('email');	

	// oder einfach mit:  
	$alleDaten = $request->all(); 

	// Dann werden die Daten zum Model weitergeben. 
	$profil = Profil::find($id);
	$profil->name = $alleDaten['name'];
	$profil->street = $alleDaten['street'];
	$profil->email = $alleDaten['email'];
	$profil->save();  
}

Das wars! Dieser Weg ist gut aber bei mehreren Feldern auch mühselig. Weil man noch Validierungen, Plausibilitäten usw. vornehmen muss. Eine einfache Alternative wäre das ganze Request Array ( $request->all() ) am Stück dem Model Profil zu übergeben. Man nennt das auch Mass Update. Quasi so :

Profil::where('id', 1)->update( $request->all() );
// oder: 
$profil = Profil::find($id);
$profil->update( $request->all() ); 

Was kann aber nun ein Bösewicht hier böses machen? Genau er kann versuchen den – nennen wir die Datenbankspalte mal – user_type in das Formular mit dem value „admin“ einschleusen. Nicht gut, wenn wir nun über ein unvalidiertes Mass Assignment die Daten updaten. Kommt öfters vor als man denkt. Deshalb ist es wichtig das Konzept der fillable und guarded Spalten im Model zu verstehen und auch überlegt anzuwenden.

Genau aus diesem Grund gibt es im Model auch die protected Klassenvariablen $fillable und $guarded .

fillable()

...
protected $fillable = ['name', 'password', 'email']; 
...

Hier trägst Du ein welche Felder so geupdatet werden dürfen. Felder die nicht im fillable Array stehen werden auch nicht berücksichtigt.

guarded()

Die Model Klassenvariable $guarded ist genau das gegenteil von fillable. Hier schreibst du die Spaltennamen rein, die nicht geupdated werden dürfen. Also in unserem Fall user_type.

Man kann auch sagen, fillable ist eine whitelist und guarded eine blacklist. Beides braucht man nicht. Entscheidet einfach selbst welchen Ansatz ihr verfolgt.

Wichtig ist zu wissen, sobald man mit Mass assignment oder mass update arbeitet die fillable bzw. guarded zu setzen.

Möchte man das alle Felder erlaubt sind, dann muss man nicht extra alle Felder in fillable einfüge sondern kann einfach:

protected $guarded = []

und ohne viel Schreiberei das lösen.

Kurz mal Modulo erklärt

Ihr seid keine Mathematiker und fragt euch was soll dieses komische aber anscheinend nützliche Prozentzeichen (%) in manchen Funktionen. Das Ding nennt sich Modulo. Ihr könnt euch jetzt ganz einfach bei Wikipedia die mathematische Erklärung reinziehen oder ich erkläre auch das kurz im Streetstyle for Everybody.

Das Ding ist ziemlich einfach:
Wir gehen mal die Zahlen 5 und 3 durch:

5%1 = 0
5%2 = 1
5%3 = 2
5%4 = 1
5%5 = 0

7%1 = 0
7%2 = 1
7%3 = 1
7%4 = 3
7%5 = 2
7%6 = 1
7%7 = 0

Na, Muster erkannt?

Falls noch nicht löse ich es jetzt anhand der Zahl 7 auf.

7%1 = 0  weil 7 = ((1*7 = 7) + 0) also ist Rest 0
7%2 = 1  weil 7 = ((2*3 = 6) + 1) also ist  Rest 1
7%3 = 1  weil 7 = ((3*2 = 6) + 1) also ist  Rest 1
7%4 = 3  weil 7 = ((4*1 = 4) + 3) also ist  Rest 3
7%5 = 2  weil 7 = ((5*1 = 5) + 2) also ist  Rest 2
7%6 = 1  weil 7 = ((6*1 = 6) + 1) also ist  Rest 1
7%7 = 0  weil 7 = ((7*1 = 7) + 0) also ist  Rest 0

Nun kann man sich in der Programmierung einige Eigenschaft zu nutze machen. Wie zum Beispiel ob die Zahl gerade oder ungerade ist. Dafür setzten wir die Zahl zu Modulo 2 und erhalten bei einer ungerade stets 1 und bei einer gerade immer die 0. Beispiele gefällig:

1%2 = 1 weil ((2*0 = 0) + 1) also ist Rest 1
2%2 = 0 weil ((2*1 = 2) + 0) also ist Rest 0
3%2 = 1 weil ((2*1 = 1) + 1) also ist Rest 1
4%2 = 0 weil ((2*2 = 2) + 0) also ist Rest 0
5%2 = 1 weil ((2*2 = 1) + 1) also ist Rest 1
6%2 = 0 weil ((2*3 = 0) + 0) also ist Rest 0

Oder ein kleines JavaScript Programm:

btn = document.createElement("BUTTON");
btn.innerHTML = "Das Alphabet";
btn.setAttribute("id","klicki-klicki")
document.body.appendChild(btn);

const letters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
let letterIndex = 0;

document.getElementById("klicki-klicki").onclick = function() {
	console.log(letters[letterIndex++ % letters.length])
}

In diesem Programm hilft und das Modulo nach Erreichung des letzten Buchstabens wieder bei A anzufangen. Weil letters[23*1 = 23 REST 0]

Laravel Testing – Das kleine Problem mit dem ENUM bei SQLITE

Wer sein Code Testgetrieben schreibt und bei Laravel seine Testdatenbank auf SQLITE geschaltet hat, wird eventuell auf ein SQLITE Problem treffen, wenn man in seiner Migration Datei ein Enum Feld hat. Da kann zum Beispiel solch eine Fehlermeldung kommen:

Tests\Feature\CustomerTest > created customer and found by email 
Illuminate\Database\QueryException 

  SQLSTATE[HY000]: General error: 1 no such table: customers (SQL: insert into "customers" ("organisation_or_person", "gender", "first_name", "last_name", "email", "phone", "place", "street", "street_number", "zip_code", "country", "updated_at", "created_at") values (organisation, male, John, Steiner, martin@martin.com, 0272516913, Wegberg, Behrensallee, 6, 12989, de, 2020-11-07 14:43:45, 2020-11-07 14:43:45))

Hier ein kleiner Hinweis wie man seine Testdatenbank auf Sqlite einstellt. Geht dazu in die phpunit.xml Datei und tragt folgende zwei Zeilen in den php Block ein. In den jüngsten Laravel Versionen sind die Felder bereits vorhanden und es muss nur noch die Auskommentierung gelöscht werden.

<server name=”DB_CONNECTION” value=”sqlite”/>
<server name=”DB_DATABASE” value=”:memory:”/>

Dann sieht das ganze wie folgt aus:
<php>
<server name=”APP_ENV” value=”testing”/>
<server name=”BCRYPT_ROUNDS” value=”4″/>
<server name=”CACHE_DRIVER” value=”array”/>
<server name=”DB_CONNECTION” value=”sqlite”/><!—->
<server name=”DB_DATABASE” value=”:memory:”/><!—->
<server name=”MAIL_MAILER” value=”array”/>
<server name=”QUEUE_CONNECTION” value=”sync”/>
<server name=”SESSION_DRIVER” value=”array”/>
<server name=”TELESCOPE_ENABLED” value=”false”/>
</php>

Zurück zum eigentlich Problem. Das Problem ist auch sehr simpel. SQLITE kennt keine ENUM Felder. Es kennt auch keine JSON Felder so wie MySQL. Deshalb ändern wir für unsere Testdurchläufe den Type von enum zu string. Packen das aber vorher in eine Bedingung. Und zwar, soll das nur passieren, wenn wir einen Test fahren. Geht zu euren Migration Dateien wo die ENUM Felder drin sind und baut die Condition if (config(‘app.env‘ === ‘testing‘) {} ein.

Die If Condition sieht dann in eurer Migration Datei so aus.

    public function up()
    {
        if (config('app.env') === 'testing' ) {            
            Schema::create('customers', function (Blueprint $table) {                
                $table->id();
                $table->string("organisation_or_person");
                $table->string("gender");
                $table->string("first_name");
	    // ...
            });            
        } else {            
            Schema::create('customers', function (Blueprint $table) {
                $table->id();
                $table->enum("organisation_or_person", ["organisation", "person"]);
                $table->enum("gender", ["male","female"]);
                $table->string("first_name");
	    // ...
	}
}

Für den einen oder anderen mag das vielleicht nicht ausreichen. Es gibt auch einen weiteren Weg, wie man ENUM Felder in SQLITE zum laufen bringt. externer Link

5 freie Datenbankdesign Tool

Ein Datenbankschema ist ein Abbild Ihrer Datenbank. Sie beschreibt die Datenbankstruktur, die Datentypen und ihre Einschränkungen. Der Entwurf eines Datenbankschematas ist einer der allerersten und wichtigsten Schritte, bei der Entwicklung einer Software bzw. Website. Wer hier das gewünschte Produkt selbsterklärend abbilden kann, hat eigentlich schon die halbe Miete.

Um dir dabei zu helfen, das richtige Werkzeug für den Entwurf von Datenbankschema-Diagrammen zu finden, haben wir eine Liste mit 5 der besten kostenlosen Online-Werkzeuge dafür zusammengestellt.

Unsere Top 5 der Free online Database Diagram (ERD) Design Tools:

dbdiagram.io
QuickDBD
SQLDBM
Lucidchart
draw.io

Top 1 – dbdiagram.io

  • DBdiagram.io ist ein schneller und einfacher Datenbankdesigner, der Ihnen hilft, Ihre Datenbankdiagramme mit ihrer eigenen domänenspezifischen Sprache (DSL) zu zeichnen.
  • Sie arbeiten mit einer einfachen Sprache
  • Sie erstellen die Datenbank live über den Textblock:

Table areas {
  id int [pk, increment] // auto-increment
  lat lat
  lng lng
  geo_json json
  owner_id int [ref: > owners.id]
  created_at timestamp
}
  • der Fokus liegt ganz klar auf das Zeichnen von Datenbank-Beziehungsdiagrammen
  • Wer registriert ist, kann seine Diagramme online zu speichern und weiterzugeben
  • es wurde für Entwickler, DBA (Datenanalysten) konzipiert
  • das User Interface wirkt klar und aufgeräumt und ist somit super geeignet für die manchmal sehr dröge Arbeit an Datenbankmodelle
  • dbdiagram.io gibt auch hübsche Diagramme aus, die man gut in seine Softwaredokumentation einbauen kann

Top 2 – SQLDBM

  • SqlDBM bietet Ihnen eine einfache, bequeme Möglichkeit, Ihre Datenbank online zu entwerfen
  • SqlDBM enthält alle erforderlichen Datenbankregeln und Objekte wie Datenbankschlüssel, Schemata, Indizes, Spaltenbeschränkungen und -beziehungen.
  • Sehr einfache Bedienung dank Drag & Drop User Interface
  • unterstützt MySQL und MS SQL
  • Unterstützung von Forward Engineering und Reverse Engineering
  • Beta Version ist komplett kostenlos und man kann unbegrenzt viele Diagramme mit Objekten erstellen

Top 3 – QuickDBD

  • Auch mit QuickDBD kann man schnell ein Diagramm über Texteingabe zeichnen. Ähnlich wie bei dbdiagram.io
  • Unterstützung den Export nach SQL, PDF und Word
  • sehr ansprechende Diagramme
  • Leider nur für ein Diagramm mit 10 Tabellen kostenlos

Top 4 – Lucidchart

  • Lucidchart ist eine Cloud-basierte und kollaborative Diagramm-Software. Lucidchart hilft deinem Team nicht nur bei der Erstellung von Datenbankdiagrammen, sondern auch bei der Erstellung von Flussdiagrammen, Prozesskarten, UML-Modellen, Organigrammen
  • mit Lucidchart kann man sehr gut in Teams zusammenarbeiten
  • das arbeiten ist nach kurzer eingewöhnung recht simpel da es eine gute Drag-and-Drop Schnittstelle zum User Interface besitzt
  • lässt sich mit Microsoft Office und G Suite integrieren
  • Unserer Meinung ist der Nachteil bei Lucidchart das geringe Limit der freien Diagramme und Diagrammobjekten. Für Unternehmen und Selbstständige sollte das kein Problem darstellen. Aber für Lust und Laune Coder ist das nicht das geeignete Tool

Top 5 – Draw.io

  • Draw.io ist ebenfalls eine kostenlose Online-Diagramm-Software zur Erstellung von Ablaufdiagrammen, Flussdiagrammen, Prozessdiagrammen usw.
  • man kann viele verschiedene Arten von Diagrammen wie Flussdiagramme, Organigramme, UML-, ER- und Netzwerkdiagramme zeichnen
  • erlaubt das Speichern der Diagramme in der Cloud. Zum Beispiel Storage-Diensten wie GDrive, Dropbox und OneDrive oder halt auf dem eigenen Rechner
  • die visuellen Darstellung ist nicht so fancy wie die der anderen hier vorgestellten Tool

Fazit

Alle hier vorgestellten Datenbank Design Programme erfüllen ihren Zweck. Meiner Meinung sticht aber dbdiagram.io hervor. Weniger durch das sehr ordentlich und schöne User Interface. Viel mehr durch die einfache Sprache und das es kompletto kostenlos ist. Danke an die Entwickler!

Laravel Ajax Request Validation

Stellt euch dieses Beispiel ma vor. Wir haben in unserem SPA Frontend ein Formular. Es soll mit Hilfe eines Formulars eine XHR Anfrage mit Geodaten Lat und Lng gesendet werden. Der Server führt dann ein HTTP Reuqest auf die Google Places Api durch und schickt uns das Resultat als Json zum Frontend zurück. Im Frontend haben wir also zwei Inputfelder (id=“lat“ und id=“lng“) und ein Sende Button. Beim klicken des Buttons feuern wir eine Ajax Anfrage an unseren Server (GET /api/call_google_places_by_lat_lng). Der Api Router leitet die Anfrage an den entsprechenden Controller und die dafür bestimmte Methode weiter.

<input id="lat" value=""> 
<input id="lng" value=""> 
<button id="btn-action">And Action!</button>

In unserer Routes Verzeichnis passen wir nun die API Route in der api.php an.

Route::get('call_google_places_by_lat_lng/', [App\Http\Controllers\GooglePlacesController::class, 'call_google_places_by_lat_lng']);

Mit dem Konsolen Programm Artisan erstellen wir einen neuen Request.

php artisan make:request RequestGeoDataForGooglePlacesCall

In der neuen Request Klasse passen wir bei Bedarf die authorize() Methode an. Falls Ihr ohne Authorisierung arbeitet, müsst ihr hier den boolischen Rückgabewert auf true setzen. Das bedeutet dann, man muss nicht Authorisiert sein um diesen Request abzusetzen. In Rules schreibt ihr Eure Formcalidations Regel nieder. Für die Validationsregeln lege ich Euch die Laravel Validation Dokumentation nahe. Die Möglichen Errornachrichten könnt Ihr auch noch nach belieben anpassen. Das macht ihr in der Methode messages(). Hier mal meine Beispiel Custom Request Klasse.

class RequestGeoDataForGooglePlacesCall extends FormRequest
{
    /**
     * Determine if the user is authorized to make this request.
     *
     * @return bool
     */
    public function authorize()
    {
        return true;
    }

    /**
     * Get the validation rules that apply to the request.
     *
     * @return array
     */
    public function rules()
    {
        return [
            'placeid' => ['required','max:10'],
        ];
    }

    /**
     * Get the error messages for the defined validation rules.
     *
     * @return array
     */
    public function messages()
    {
        return [
            'placeid.required' => 'The Google Places ID field is required.',            
        ];
    }    
}

Nun zurück nun zum Controller. Hier müsst ihr die neue Request Klasse dem Controller bekannt machen.

use \App\Http\Requests\RequestGeoDataForGooglePlacesCall;

und dann der Funktion dem Typ des $request mitgeben. Jetzt könnt Ihr mit der Requestmethode validated() Eure Requestvariable checken lassen.

public function test_new(SendGeoDataForGooglePlacesCall $request) 
{
    $request→validated();
    // ...
}

Hier mal ein Postman Request zum Überprüfen. Achtet bei Postman Request auf den HTTP Header. Setzt unter Headers Key auf Accept und den dazugehörigen Value auf application/json . Ansonsten leitet Euch Laravel bei nicht erfolgreicher Validierung mit einem 302 auf eure Anfrageseite zurück. Wenn der Header richtig gesetzt wurde, solltet ihr ein HTTP Statuscode 422 und folgende Fehlermeldung als Json erhalten.

Jetzt könnt ihr das nach belieben erweitern und verfeinern. Man muss nicht zwingend mit einer eigenen Request Klasse arbeiten. Ihr könnt genauso gut auch die Validierung im Controller vornehmen.

Javascript async/await kurz mal erklärt

Async steht für asynchron. Man kann async vor eine Funktion oder Klassenmethode setzen.

async function test() {
	return true;
}

test();
// Output: Promise …

test().then(alert)
// Output: true

Ruft man jetzt die Funktion auf, erhält man statt dem true ein Promise. Das bedeutet das der Rückgabewert in einem Promise verpackt wird, was erst einmal aufgelöst werden muss.

Await – Wer async sagt sollte await nutzen

…und wer await sagt muss async nutzen. Das Zauberwort bei der Benutzung von async ist await. Mit await weisen wir an, dass wir hier auf noch auf eine Antwort warten und erst dann weiter rechnen wollen. Ein kleines Beispiel: Wir fragen den Supercomputer nach den Sinn des Lebens und wollen das Resultat mit Pi multiplizieren.

async function meaningOflifeAndPi() {
let duration = 1000 // wer lieber eine genaue Reproduktion des Tests durchführen möchte sollte hier  3,1536e+16 statt 1000 Millisekunden eintragen. Dann könnt ihr erstmal paar Tassen Cafe trinken und nebenbei alle Programmiersprachen lernen ...

  let promise = new Promise((resolve, reject) => {
    setTimeout(() => resolve(42), duration)
  });
  let result = await promise; // wait until the promise resolves (*)
  alert( result * Math.PI ); 
}
meaningOflifeAndPi();
// Output: "131.94689145077132"

SeoTheater Autoren