Donnerstag, 28. März 2024

4 Wochen 4 Sprachen: Epilog

Die letzten vier Wochen habe ich vier verschiedene Sprachen vorgestellt, von denen ich aktuell überzeugt bin, dass sie für ihr jeweiliges optimales Einsatzgebiet als bevorzugte Sprache verwendet werden sollten und die eine Zukunft haben. Alle Sprachen sind unter einer freien Lizenz oder gar als internationaler Standard verfügbar. Das ist ein wichtiges Kriterium. Nur so ist sichergestellt, dass nicht der Profit einer einzelnen Firma über den Fortbestand der Sprache entscheiden kann. Nachfolgend eine Übersicht der vier Sprachen mit den wichtigsten Einsatzgebieten:

Wie erwähnt ist dies meine aktuelle Sicht im "Sprachen-Dschungel". Dazu kommen natürlich noch weitere Computer-Sprachen, die je nach Gesichtspunkt auch als Programmiersprache oder eben auch nicht, angesehen werden. Es sind u.a. die folgenden Sprachen und Formate, welche jeder Entwickler, je nach Tätigkeitsgebiet versteht sich, ebenfalls anwenden können sollte: SQL, HTML, CSS, JSON, YAML etc. Dazu kommen Standards wie OpenAPI und Konsorten. All die Frameworks, die noch viel mehr als die Sprachen selber wie Pilze aus dem Boden schiessen, lassen wir an dieser Stelle einmal aussen vor. Wie schrieb es einst Michael Ende: "Aber das ist eine andere Geschichte und soll ein andermal erzählt werden." Wir werden sehen, ob ich dieses Fass hier einmal öffnen werde.

"meine worte sind sortiert"

Warum funktionieren die Programme in den vorgestellten Sprachen beim String "Meine Worte sind sortiert" alle scheinbar nicht korrekt? Um diese Frage zu beantworten, müssen wir etwas tiefer in die Implementierung eintauchen. Die meisten Sprachen, resp. eigentlich präziser, die meisten API-Implementierungen von Arrays oder Listen, die eine alphabetische Sortierung anbieten, sortieren die einzelnen Elemente anhand der Unicode-Zahlen, welche die einzelnen Zeichen repräsentieren. Unicode ist ein Standard der definiert, welche Codes (Zahlen), welches Zeichen repräsentieren sollen, wenn man die Zahl als Zeichen interpretiert (was bspw. bei einem String der Fall ist). Nun ist es so, dass in Unicode die Grossbuchstaben vor den Kleinbuchstaben kommen. Sortiert man nun nach Unicode, so kommt bspw. der "Z" vor dem "a". Entsprechend sind die Wörter "Meine Worte sind sortiert", nach Unicode sortiert identisch, nämlich immer noch "Meine Worte sind sortiert". Die Programme funktionieren also richtig per Design. Auch wenn wir Menschen als User in der Regel wohl ein anderes Resultat erwarten würden. Wollen Sie es jeweils unabhängig von der Gross- und Kleinschreibung, müssen Sie den String jeweils vor der Sortierung in Gross- oder Kleinschreibung umwandeln. Sortieren und dann die einzelnen Elemente wieder der Ursprungsform zuordnen zur korrekten Ausgabe (in Gross- und Kleinbuchstaben).

Nun gut, dass ist aber nicht die einzige Eigenheit von Unicode. Eine weitere ist, dass gewisse Sonderzeichen auf zwei Arten abgebildet werden können. Zum einen als ein Zeichen inkl. dem "Sonderzeichenteil", bspw. "ñ". Zum anderen kann man es auch getrennt machen: "n" und ein höher gestelltes "~". Der erste Fall ist mit dem Unicode-Zeichen \xF1 codiert, der zweite mit "n" und \u0303. Optisch wird beides gleich dargestellt. Man sieht den Unterschied jedoch, wenn man bspw. in JavaScript ein String auf Char-Basis in ein Array umwandelt und dieses dann neu sortiert. Man kann dies korrigieren, wenn man Strings vor der Verwendung normalisiert, bspw. mit normalize('NFC'). Nachfolgend Beispiele in JavaScript, die das veranschaulichen:
Im zweiten Fall oben, landet die "Schlange" ober dem Buchstaben "n" plötzlich ober dem Buchstaben "b". Daran sieht man, dass im zweiten Fall der Buchstabe ñ mit zwei Unicode-Zeichen codiert worden ist: n\0303. Es sind zwei Chars. Dies sieht man übrigens auch an der Länge:
Obwohl in beiden Fällen der Output optisch identisch ist: abñam, ist die String-Länge im zweiten Fall um 1 grösser. Es werden eben die Chars gezählt. Daher ist es wichtig, vor String-Operationen eine Normalisierung vorzunehmen.


Die erste wird die letzte sein

Die vorliegende Serie war inspiriert vom Buch, Sieben Wochen sieben Sprachen. Zwischendurch ist es inspirierend, den Fokus zu öffnen und sich 2-3 andere Sprachen und vor allem, andere Sprachkonzepte, anzuschauen. Es erweitert den Horizont und gibt vielleicht auch für die bereits bekannten Sprachen neue Inputs.

Wir starteten die Miniserie mit dem Prolog. Der Name ist Programm. Prolog heisst eine bereits recht alte, interessante Programmiersprache. Ich habe sie bereits einmal in einem Beitrag erwähnt. Prolog steht für "PROgramming in LOGics". Prolog ist eine logische und vor allem deklarative Programmiersprache. Abgesehen von SQL, wo man es meist gar nicht so wahr nimmt, sind es heute viele Entwickler gewohnt, imperativ zu programmieren. Prolog lässt sich nicht befehlen, wie etwas zu tun ist. In Prolog kann man die Spielregeln definieren. Wie es gelöst wird, ist Prolog überlassen. Ich würde nicht behaupte, dass man Prolog können muss und viel brauchen wird. Ehrlich, ich brauche es operativ auch nicht. Dennoch ist es erfrischend, bspw. in den Ferien, einmal damit zu experimentieren. Gewisse Problemstellungen lassen sich damit einfach ungemein schneller lösen als mit anderen, vorallem imperativen Sprachen. Eine nette Abwechslung, in Form einer kalten Dusche. Da denkt man, man kann in fast allen Sprachen rasch programmieren, und dann dass. Sie können es bspw. hier online ausprobieren, ohne zuerst Software installieren zu müssen: onecompiler.com/prolog. Daher, wie im Prolog bereits angedeutet, die Programmiersprache Prolog als Bonus zum Abschluss dieser Mini-Serie.

In dem Sinne, happy coding!

#rust #javascript #python #scala #prolog #unicode


Samstag, 23. März 2024

Cloud Serie: So einfach stellen Sie eine Angular Web-Applikation in der GCP bereit

Es ist äusserst einfach, eine Angular Web-Applikation auf der Google Cloud Platform (GCP) bereit zu stellen. Dazu müssen Sie im Root-Verzeichnis der Angular-Applikation ein app.yaml-File mit folgendem Inhalt erstellen (Pfade gemäss Ihrem Projekt/Applikation - allenfalls müssen Sie die Applikation zuerst mit ng build erstellen, um die Pfade der Distribution zu erhalten):

app.yaml-File Beispiel

Wechseln Sie nun in der Konsole Ihrer Wahl ins Root-Verzeichnis der Angular-Applikation. Jetzt kann die Angular-Applikation mit folgendem Befehl in der GCP bereitgestellt werden:

gcloud CLI Befehl um eine Angular-Applikation in der GCP bereit zu stellen.

Fertig. gcloud liefert die URL zurück mit welcher die Applikation aufgerufen werden kann.

Wenn Sie die Applikation das erste Mal bereitstellen, müssen Sie noch die gewünschte Region auswählen:

Printscreen einer erstmaligen Bereitstellung mit der Auswahl der Region (14) und der erhaltenen URL der Applikaton.


Fallstrick base href
Internationalisierung ist wichtig und die meisten Angular-Applikationen sind mehrsprachig. Angular erstellt in der jeweiligen index.html pro Sprache beim base href einen Eintrag, bspw. "de". Dies führt dazu, dass die Applikation mit der Bereitstellung wie oben beschrieben nicht funktioniert, da die JavaScript-Dateien nicht gefunden werden. Stellen Sie sicher, dass bei der base href nur der Slash steht "/": 

Beispiel eines index.html-Files mit base href="/"


ESC-Explanation Web-Applikation
Im letzten Cloud Serie-Artikel habe ich vorgestellt, wie man mit ESC und GCP Cloud Function einfach einen Name-Matching Rest-API-Endpoint erstellen kann. Ich habe für die beiden dort erstellen Rest-API-Endpoints, Personennamen- und Organisationsnamen-Vergleich, eine einfache Beispiel-Angular Applikation erstellt und wie oben beschrieben auf der GCP bereitgestellt. Sie können diese Applikation hier live ausprobieren: https://webdevice.asderix.com/

Printscreen der Beispiel Angular 17 Web-Applikation



Sie funktionierte jedoch erwartungsgemäss nicht direkt. Denn Cloud Functions und Apps haben in der GCP unterschiedliche Domains. Das führt dazu, dass der Browser die Aufrufe auf die Rest-API blockiert. Dies auf Grund der CORS (Cross-Origin Resource Sharing) Default-Einstellung der modernen Browser.

CORS-Problematik
Die von der GCP verwendete URL für die Applikation ist nicht geeignet für den produktiven Gebrauch, da sie nicht endkundenfreundlich ist. Zum Glück bietet der GCP Load Balancer gleich für beide Probleme die Lösung. Zum einen können Sie via Load Balancer eine eigene Domain für das Frontend verwenden, zum anderen können Sie auch gleich die Cloud Functions als Backend für den Load Balancer konfigurieren. Damit kann die Angular-Applikation für das Backend auf dieselbe Domain zugreifen und die CORS-Problematik besteht nicht mehr. Die Routing-Regeln sehen für meine Beispiel-Applikation wie folgt aus:

Load Balancer Routing-Regeln mit den ESC Cloud Functions.


Eine detaillierte Anleitung von Google, wie Sie den Load Balancer mit einem Serverless Backend wie Cloud Function einrichten können, finden Sie hier: cloud.google.com/load-balancing.

Ein weiterer Vorteil des GCP Load Balancers ist der Caching-Mechanismus. Eine Angular Web-Applikation ist statisch und eignet sich daher gut für das Caching, was die Auslieferung zusätzlich beschleunigt.

Beachten Sie, dass wenn Sie ein TLS-Zertifikat von Google verwenden, dies in der Regel 10-15 Minuten dauert, aber auch mal mehrere Stunden dauern kann, bis es signiert vorhanden ist.

Tipps & Tools zur Angular-Applikation
Verwenden Sie für die Internationalisierung in Angular i18n von Beginn an. Das initiale einrichten dauert 10-15 Minuten. Wenn Sie eine Applikation später internationalisieren müssen, steigt der Aufwand, da alle Texte nachträglich für i18n vorbereitet werden müssen.

CSS kann für einen Entwickler mühsam sein. Ich kann für das Design einer Web-Applikation tailwindcss empfehlen. Die Integration/Nutzung mit Angular ist einfach: Dokumentation.

Für meine beiden Rest-APIs mittels Cloud Function gibt es keine OpenAPI-Spezifikation. Für solche Fälle kann quicktype sehr nützlich sein. Mit diesem Tool können Sie einfach anhand konkreter JSON ein TypeScript Interface für Angular erstellen lassen um einfach eine typisierte Abfrage des Backends zu machen. Das Tool kann auch mit JSON-Schema oder Postman als Ausgangspunkt umgehen.

Ordentlich formatierter Code verschafft Übersicht und hilft beim Lesen von "fremden" Code im Team. Prettier hilft Ihnen den eigenen Code und jenem im Team oder Unternehmen einheitlich zu formatieren. Prettier kann einfach in allen gängigen Code-Editoren integriert werden. Ich empfehle bei jedem Projekt gleich zu Beginn Prettier aufzusetzen.

Landingzone, Security & Co.
Die gemachten Aussagen zur Landingzone, automatisiertes Bereitstellen, Sicherheit etc. im letzten Cloud Serie-Artikel gelten auch für die Bereitstellung einer Angular-Applikation wie hier beschrieben. Falls noch nicht gelesen, lohnt es sich aus meiner Sicht, sich diese Aspekte einmal anzusehen.





Donnerstag, 21. März 2024

4 Wochen 4 Sprachen: Scala


Die heutige Sprache mag Sie überraschen. Sie kennen Scala nicht? Kein Problem. Mit einer Nutzung von nur knapp 3 % gemäss Statista ist Scala eine Nischensprache. Entwickelt wurde Scala in der Schweiz von Martin Odersky an der EPFL und 2004 erstmals vorgestellt. Scala ist eine objektorientierte aber vor allem auch funktionale Programmiersprache. Scala läuft auf drei verschiedenen Plattformen, resp. kann in drei verschiedene Ziele "kompiliert" werden: JVM, Native, JavaScript. Scala kann in Java Bytcode übersetzt werden und bietet daher vollständige Kompatibilität mit bestehenden Java-Bibliotheken. Mehr dazu bei den Stärken. Scala Native bietet die Möglichkeit, Scala direkt in binären Code zu kompilieren. Der Vorteil ist die bessere Performance. Der Nachteil (je nach Einsatz) ist die fehlende Interpolarität mit Java-Bibliotheken. Dafür kann Scala native einfach mit C- und C++ Bibliotheken interagieren. Scala.js schliesslich erzeugt aus dem Scala-Quellcode optimiertes JavaScript. Der Vorteil ist, je nach Sichtweise, dass man so typsicher und mit den Vorteilen der Scala-Sprache Programme für den Browser schreiben kann (oder natürlich auch für das Backend). Der Nachteil: Java-Bibliotheken können nicht verwendet werden und andere Scala-Bibliotheken auch nur, wenn diese Scala.js-Kompatibel sind. Meiner Meinung nach ist Scala.js mehr eine Spielerei. Das liegt vielleicht daran, dass ich JavaScript mag und den Vorteil nicht sehe, weshalb man sich die Mühe machen sollte in einer anderen Sprache zu schreiben für etwas, dass sich offenbar auch in JavaScript eignet. Persönlich würde ich es begrüssen, wenn Scala stattdessen WebAssembly unterstützen würde. Will man Scala im Browser nutzen, wäre dies meines Erachtens der sinnvollere Ansatz. Scala native kann je nach Einsatzzweck eine sinnvolle Alternative sein. Wobei bei den sinnvollen Einsatzzwecken die Abwägung gemacht werden sollte, ob dafür nicht Rust die bessere Alternative wäre. 
Obwohl nur sehr wenige Entwickler Scala nutzen, wird Scala für spezielle Zwecke von ein paar namhaften Firmen eingesetzt. Darunter bspw. X (vormals Twitter), LinkedIn, Netflix oder auch Airbnb.

Für was soll die Sprache verwendet werden?
Scala kann breit eingesetzt werden und eignet sich besonders für komplexe Business-Logik, verteilte asynchrone Systeme sowie in den Themenfelder von maschinellem Lernen (ML) und data processing. Es eignet sich auch gut um Libraries zu entwickeln, welche (auch) von anderen JVM-Sprachen wie Java oder Kotlin einfach genutzt werden können. Da Scala sehr performant ist, ist es bestens geeignet für die Lösung komplexer Berechnungen wie z.B. VaR oder Stresssimulationen im Finanzbereich.

Was macht die Sprache so stark?
Scala fasziniert durch die Kombination von funktionaler und objektorientierter  Programmierung (auf der JVM) mit einem ausdrucksstarken Typsystem und ermöglicht knappen und verständlichen Code, wie es wohl nur in wenigen anderen Sprachen möglich ist. Dies zeigt sich besonders deutlich bei Case Classes, dem Pattern Matching (eine Art "Switch auf Stereoiden"), den impliziten Variablen oder den sog. "Extensions". Die Interoperabilität mit Java (in der JVM-Variante) ermöglicht das Profitieren von zahlreichen bekannten Java-Bibliotheken. Betreffend Objekt orientiert ist es reiner als Java, alles ist ein Objekt. Scala bietet zudem mächtige immutable und mutable Collections. Dazu gibt es potente Frameworks im Bereich von Multi-Threading und verteilten Anwendungen wie bspw. Akka.

Beispiele
Wie bereits gewohnt, unser Beispiel mit der String-Sortierung:
Das Thema mit der Grossschreibung kennen Sie ja bereits von den vorherigen Blogbeiträgen. Scala ist diesbezüglich nicht anders.

Warum hat die Sprache Zukunft und warum soll ich sie lernen?
Scala ist auf der JVM in Sache funktionale Programmierung wohl unter den Top 2. Obwohl Objekt orientiere Programmierung seine Stärken hat, lassen sich gewisse Probleme eleganter und vor allem sicherer mit einem funktionalen Ansatz lösen. Scala kann beides. Die Möglichkeiten, komplexe Logiken mit wenig Zeilen Code abzubilden, machen Scala sehr wartungsfreundlich. Scala steht zudem in Konkurrenz zu Python in den Bereichen maschinelles Lernen und Data processing. Beides stark wachsende Themenfelder. Eine Nischensprache zu können hat zudem seinen Reiz für Entwickler. Sie sind gesucht und i.d.R. gut bezahlt.

Spoiler: Nächste Woche folgt ein letzter Artikel in dieser Serie mit Zusammenfassung und zusätzlichen Informationen sowie einer Auflösung der "Grossschreibung"-Problematik in den Code-Beispielen.

#scala #programming

Sonntag, 17. März 2024

Cloud Serie: So einfach erstellen Sie ein Name-Matching Rest-API mit Google Cloud Function und ESC

Mit dem Release 2.1 wurde ESC um eine Funktion erweitert, die es ermöglicht, eine Erklärung für einen Namensvergleich zu erhalten. Das bedeutet, dass man nicht nur das eigentliche Ergebnis erhält, sondern auch einzelnen Schritte nachvollziehen kann, die zu diesem Ergebnis geführt haben. Von besonderem Interesse dürfte dabei die Quelle des Vergleichswertes von einzelnen Namenselementen sein. Warum stimmt "Bill" zu 97 % mit "William" überein? Die neue Erklärungsfunktion gibt Auskunft darüber, woher die 97 % kommen.

Ich nehme diese neue Funktion zum Anlass, um zu zeigen, wie einfach es ist, mit Cloud Function der Google Cloud Platform (GCP) einen Rest-API Endpoint zu realisieren. Um ein einfaches Name-Matching Rest-API zu realisieren, benötigen wir nur wenig Programmcode:

Scala-Programm mit zwei Rest-API Endpoints


Zum Erstellen des JAR-Files verwenden wir die folgenden SBT-Konfigurationen:

build.sbt File mit den Konfigurationen und Abhängigkeiten

Nachdem wir das Programm mit dem Befehl sbt assembly erstellt haben, können wir den ersten Endpunkt bereits mit folgendem Befehl einfach als GCP Cloud Function bereitstellen:

Bash-Befehl um die erste Cloud Function mittels gcloud CLI bereit zu stellen

Im Anschluss können wir analog die zweite Funktion, mit EscOrganisationNameExplanation und --entry-point example.OrganisationNameExplanation bereitstellen - fertig. gcloud CLI gibt uns jeweils die URL für unsere Funktion zurück und wir können diese direkt aufrufen:

Printscreen einer API-Abfrage via Browser

Wir sehen in der markierten Zeile die Ähnlichkeit von 97 % zwischen "William" und "Bill" und darunter die Quelle: libDb. Das bedeutet, dass die Ähnlichkeit aus der internen Datenbank der ESC-Bibliothek stammt. Bill ist eine bekannte Kurzform von William.

Theorie und Praxis

Wie sagte es einst Albert Einsteint:

«Man soll die Dinge so einfach wie möglich machen, aber nicht einfacher»

Die gezeigte Umsetzung funktioniert soweit technisch einwandfrei. In der Praxis ist sie aber vielleicht etwas zu einfach. Es gibt noch das eine oder andere Detail zu beachten, das ich hier nicht vorenthalten möchte. Schauen wir uns also noch 2-3 wichtige Themen an, die oben aus Gründen der Übersichtlichkeit weggelassen wurden.

Scala-Applikation
Ist für eine echte produktive Anwendung etwas kurz geraten. Allgemein wurde das Error-Handling weggelassen und spezifisch zum Use Case wäre es hilfreich, wenn man eine aussagekräftige Fehlermeldung erhalten würde, wenn man bspw. nicht alle notwendigen Parameter sendet. Im Beispiel wird in dem Fall einfach "Unknown" als Name verwendet. Werfe dazu unbedingt auch einen Blick auf Cloud Logging, um aussagekräftige Log-Einträge in Cloud Logging von GCP zu erhalten.

URL & Co.
Jede Cloud Function bekommt eine Standard Google-URL zugewiesen. In der Regel möchte man die Function aber über eine eigene Domain und ggf. mit einem anderen Pfad aufrufen können. Für die Realisierung empfiehlt sich die Umsetzung mittels eines Load Balancers. Dort kann man die Cloud Function als Backend angeben und Domain, Pfad, Zertifikate etc. festlegen.

Security & Co.
Das Beispiel ist als öffentliche API ausgelegt. Selbstverständlich möchte man nicht jede API öffentlich zugänglich machen. Es ist daher wichtig, bei Bedarf die Cloud Function entsprechend zu berechtigen und zu schützen. In Abhängigkeit der Bedürfnisse gibt es dazu verschiedene Optionen. Eine Möglichkeit wäre ein API Gateway zu verwenden. Dieses GCP-Produkt basiert auf Envoy (als Managed Service), welches verschiedene Möglichkeiten für die Sicherheit bietet. Als nächste Stufe, eine komplette API Management-Plattform, bietet sich mit Apigee eine Lösung an, die im Gartner Magic Quadrant regelmässig oben rechts zu finden ist. Einverstanden, der Preis befindet sich auch eher dort.
Weiter empfiehlt sich allenfalls die Sicherheit zusätzlich mit einer WAF zu verstärken. Naheliegend für Cloud Function wäre Cloud Armor zu verwenden.

GCP Landingzone
Voraussetzung um die Cloud Function wie eingangs beschrieben bereit zu stellen,  ist eine eingerichtete Landingzone auf der GCP. Dazu gehört es, dass ein Rechnungs-Account aufgesetzt, ein Projekt erstellt und die notwendigen APIs aktiviert sind. Mit allen notwendigen Accounts und Berechtigungen versteht sich. Dies kann man manuell via Konsole machen. Für produktive Umgebungen lohnt es sich aber bereits bei kleineren Infrastrukturen, diese als IaC zu betrachten und entsprechend mittels Tools wie Terraform, AnsiblePuppet und wie sie alle heissen, zu automatisieren. Für grössere Infrastrukturen und vor allem wenn grössere, resp. viele Teams, involviert sind, lohnt sich wahrscheinlich einen Ansatz wie TACOS zu verwenden. 

Deployment
Es gibt natürliche verschiedene Bereitstellungsmöglichkeiten. Die hier gezeigte ist die einfachste manuelle Art. Gerade bei grösseren Infrastrukturen/Projekten lohnt es sich solche Deplyoments automatisiert inkl. Build-, Test- und Security-Prozesse durchzuführen. Auf GCP bietet sich dafür Cloud Build an. Je nach Setup und Anforderungen direkt integriert mit den IaC-Tools von vorhin.

Achtung Kostenfalle
Insbesondere wenn die Cloud Function öffentlich zugänglich ist, besteht ein Kostenrisiko, wenn die Cloud Function millionfach aufgerufen wird. Es ist daher dringend empfohlen, auf dem GCP Projekt oder der Cloud Function selber, ein Budget einzurichten, um die Kostenkontrolle zu behalten. Bei den Budgets ist wichtig zu wissen, dass diese nur eine Alarmierung zur Folge haben. Die Services, und damit Kosten, laufen normal weiter. Man muss selber entsprechende Massnahmen ergreifen nach einem Alert. Es gibt allerdings bei gewissen Services die Möglichkeit, Quoten zu definieren/reduzieren, so dass nach Erreichung dieser, der Service nicht mehr zur Verfügung steht und entsprechend auch keine weiteren Kosten entstehen. Bei Cloud Function kann man dies bspw. für die Anzahl Request pro Minute definieren. Default sind 3'000 Request pro Minute. Man kann diese Limite selber reduzieren. Eine Erhöhung über 3'000 muss manuell bewilligt werden. Die Konfiguration kann man wie bereits bekannt, direkt via Konsole vornehmen oder indirekt via diverser IaC-Tools. Eine Doku dazu findet man hier. Die Kosten für Cloud Function können bequem mit dem Preisrechner von Google kalkuliert werden: GCP Preisrechnen.

Also doch nicht so einfach?

Manch ein Leser ist vielleicht dazu geneigt zu denken: Einen plakativen einfachen Start beschreiben, um dann im Anschluss mit den komplexen Themen der Praxis wieder alles zu relativieren? Ist es also doch nicht so einfach, eine Cloud Function zu erstellen?

Meine Antwort ist: doch. Das ist die schöne Seite der Cloud. Man kann klein und einfach beginnen und dann skalieren, ohne dass man die gesamte Architektur bei jeder Iteration der Skalierung über den Haufen werfen muss. Man kann also so einfach anfangen wie gezeigt - ja, mit Fehlerhandling und Logs - und loslegen. Sobald es richtig public sein soll, kann man einen Load Balancer voranstellen und die Domain-Sachen definieren. Plötzlich muss man die Function trotzdem schützen? Dann kann man einen API Gateway konfigurieren und die gewünschte Security einrichten. IaC oder gar TACOS einführen ist etwas aufwändiger. Umso früher man damit beginnt, desto einfacher ist es (klein zu gross). Aber auch IaC lässt sich später Schritt für Schritt einführen. Wichtig ist, dass man bereits zu Beginn ein stimmiges Zielbild hat an dem man die Schritte dorthin ausrichten kann.

Die Herausforderung bei Hyperscalern ist nach meiner Erfahrung häufig die grosse Menge an möglichen Tools und Services und die schnellen Änderungszyklen. Welcher Service löst welches Problem am besten? Wie sieht es mit den Kosten aus? Es ist (zeitlich) kaum möglich, dass man für jedes Problem jeweils alle Varianten eines Hyperscalers zuerst sauber selber evaluiert und ausprobiert. Bei der Wahl von geeigneten Services und Architekturen gibt es aber zum Glück verschiedene (unabhängige) Spezialisten, die man beiziehen kann. Scheuen Sie sich nicht, dafür temporär externe Unterstützung in Anspruch zu nehmen.

Weitere nützliche Weblinks:







Donnerstag, 14. März 2024

4 Wochen 4 Sprachen: Python


Nach JavaScript kommen wir zur nächsten populären Sprache, Python. Python wurde von Guido van Rossum am Centrum Wiskunde & Informatica (CWI) in den Niederlanden entwickelt und 1991 das erste Mal veröffentlicht (die erste Vollversion wurde 1994 vorgestellt). Damit zählt die Sprache bereits zu den ein bisschen älteren. Python wird von der Python Software Fondation (weiter-) entwickelt und unter einer freier Lizenz (Python Software Fondation License, Link) veröffentlicht.

Python ist heute einer der am meisten genutzten Programmiersprachen. Das war aber nicht immer so. Es gibt wohl zwei Gründe, welche den Anstieg der Nutzung begünstige. Zum einen die Tatsache, dass Python zusammen mit Java die wohl meist verwendete/unterrichtete Sprache an Schulen und Hochschulen ist. Das kommt nicht von ungefähr. Schliesslich wurde Python ursprünglich zu diesem Zweck entwickelt. Zum anderen wurde Python früh im Bereich der Datenvor- und Datenbearbeitung, nicht zuletzt im Bereich der Statistik und des maschinellen Lernens (Stichworte, ML, KI) verwendet. Durch die Popularität von KI stieg auch die Popularität von Python an.

Python ist eine interpretierte Sprache wie JavaScript und relativ einfach zu lernen (dafür wurde sie ja entwickelt).

Für was soll die Sprache verwendet werden?
Python eignet sich besonders dafür, Daten zu konvertieren und auf- und vorzubereiten. Dafür kann sie bevorzugt im Bereich Data-Processing verwendet werden. Ein weiteres geeignetes Feld sind Functions im Bereich Serverless Computing (bspw. AWS Lambda, GCP Cloud Function oder Azure Functions). Python wird von allen Hyperscalern in deren SDKs offiziell unterstützt.

Was macht die Sprache so stark?
Python hat eine umfassende Standardbibliothek und in den Bereichen der Datenbearbeitung zahlreiche gut Drittbibliotheken wie bspw. pandas. Dazu hat Python eine sehr grosse hilfsbereite Community.

Beispiele
Nachfolgend das inzwischen bekannte Programm um einen String zu sortieren in Python:
Den Part mit den Grossbuchstaben ("Meine Worte sind sortiert") kennen Sie ja inzwischen.

Warum hat die Sprache Zukunft und warum soll ich sie lernen?
Sie wird an Schulen und Hochschulen häufig als erste Sprache gelehrt. Sie hat einen grossen Fussabdruck in einem stark wachsenden Bereich der Informatik (ML, AI). Ist relativ einfach zu erlenen und wird von allen Hyperscalern als offizielle Sprache in ihren SDKs unterstützt. Du kannst kein Python? Dann bist du vielleicht froh, wenn du in Zukunft für Prozess-Orchestrationen oder Datenverarbeitungen auf Python zurückgreifen kannst.

#python #programming

Donnerstag, 7. März 2024

4 Wochen 4 Sprachen: JavaScript


Unsere zweite Sprache kennen Sie bestimmt - JavaScript. JavaScript wurde ursprünglich von Brendan Eich bei Netscape entwickelt und 1995 erstmals vorgestellt. JavaScript wird seit 1997 von der ECMA als Standard herausgegeben. Der offizielle Name des Standards ist ECMAScript. Der Name JavaScript ist eine eingetragene Marke von Oracle. Weiter muss die Sprache wohl nicht vorgestellt werden. Gemäss Statista ist es die am meisten genutzte Programmiersprache der Welt (de.statista.com).

Der Name ist Programm, es handelt sich um eine Script-Sprache.

Für was soll die Sprache verwendet werden?
Die Einsatzmöglichkeiten von JavaScript sind sehr breit. Sie kann im Frontend wie im Backend verwendet werden. Für das Frontend im Browser wurde sie ursprünglich entwickelt. Seit der Vorstellung von Node.js im Jahr 2009 kann JavaScript aber auch im Backend verwendet werden und wird es immer mehr. Im Browser ist JavaScript ebenfalls für mobile Anwendungen geeignet. Dazu gibt Tools wie NativeScript, mit welchen auch native Mobile App, geschrieben in JavaScript, möglich sind. Verwenden Sie JavaScript für Frontend-Entwicklungen und JavaScript für Backend-Entwicklungen, wenn es sich um einfach(ere) Logiken handelt, welche wenig rechenintensiv sind. Vorsicht ist bei JavaScript im Zusammenhang mit mathematischen Aufgaben geboten. JavaScript kennt für Zahlen nur ein Format. Jede Zahl in JavaScript ist eine Double Precision Floating Point Number, gemäss IEEE 754 Standard. Dies kann zu Rundungsfehlern bei der Rechnung mit Nachkommazahlen führen (www.vectorsoft.de). Wenn Sie mit JavaScript rechnen müssen, verwenden Sie entsprechende Bibliotheken (bspw. mathjs.org), welche Abhilfe verschaffen können. Wenn Sie können, vermeiden Sie es, in JavaScript mathematische Operationen auszuführen, jedenfalls wenn die mathematische Genauigkeit eine Rolle spielt.

Was macht die Sprache so stark?
Die Stärken liegen in der Flexibilität der Nutzung. Dass man vieles auf viele Arten Lösen kann, könnte auch als Schwäche dargestellt werden. Aus meiner Sicht ist die vielfältige Nutzungsmöglichkeit, insb. die Anwendung verschiedener Programmierparadigmen, aber eine grosse Stärke.

Beispiele
Hier ein analoges Beispiel vom Rust-Programm des letzten Beitrages in JavaScript:
Nach Rust werden Sie in JavaScript bei Grossbuchstaben nun vielleicht nicht mehr gleich überrascht sein ("Meine Worte sind sortiert"), Sie kennen es bereits.

Warum hat die Sprache Zukunft und warum soll ich sie lernen?
An der meist genutzten Sprache kommt wohl (fast) kein Entwickler ganz vorbei. Dabei wird die Sprache häufig unterschätzt und nicht selten nach wie vor genutzt wie vor über 10 Jahren. In den letzten Jahren wurden zahlreiche echte Verbesserungen eingeführt. Auch wenn es vielleicht nicht die Haupt- oder Lieblingssprache ist, ein bisschen JavaScript sollte jeder Entwickler verstehen.

#javascript #js #programming