Version Control

Centralised vs Distributed Version Contol Systems

Ein zentralisiertes Versionierung Control System funktioniert mit einem Client-Server Modell. Es gibt eine einzige Hauptkopie des Codes. Code Schnipseln, die geändert werden, sind normalerwiese gesperrt oder «checked out» damit nur eine einzige Person erlaubt ist, diese Änderungen zu machen. Wenn die Änderungen gesichert werden, wird die Datei wieder entsperrt und den anderen Entwicklern können nun den File bearbeiten. Sobald jeder Teammitglied seine Änderungen gesichert hat und es Zeit wird, eine Release zu erstellen, werden allen Modulen gesammelt und zusammen kombiniert.

Ein dezentralisiertes Versionierung Control System arbeitet mit einem Peer-to-Peer Modell. Den Code ist durch alle Teammitglieder verteilt. Den ganzen Verlauf der Datei ist bei jedem System verfügbar. Es gibt immer noch eine Hauptkopie des Codes aber sie wird bei einem Client gespeichert, statt bei einem Server. Es ist nach diesem Weg nicht möglich, Code Schnipseln zu sperren. Deswegen können Entwicklern Änderungen bei ihren lokalen Kopien und, wenn sie fertig sind, durch eine Anfrage an den Besitzer der Hauptkopie, seine Änderungen integrieren lassen. Schlussendlich ist eine Version des Projektes, nur eine Sammlung von Änderungen in der Hauptkopie.

Git

Git ist eine den beliebten Versionierung Tools.

Commits

In Git, sind Commits die Gundlage einer Repository (Das Ding, die den ganzen Sourcecode und Verlauf derselben beinhaltet). Einen Commit besteht aus einer Sammlung von Änderungen (bzw. hin gefügte und gelöschte Code).

Snapshots

Der wichtigste Unterschied zwischen Git und andere VCS ist, dass Git kontrolliert mehrere Versionen eines Projektes. Das heisst, das Git mehrere Kopien denselben Dateien speichert, nach jedem Commit. Meisten VCS speichern alle Änderungen und können, damit die jetzige Version des Projektes, durch den Verlauf abbilden.

Befehle sind meisten Lokal ausgeführt

Meisten Befehle sind nicht von remote Files abhängig. Falls ihr gewöhnt sind mit CVCS zu arbeiten, wisst ihr, dass es immer Latenz zwischen jedem Befehl gibt. Da den ganzen Verlauf des Projektes sich lokal auf ihrem Rechner findet, werden alle Befehle mit höhen Effizient ausgeführt. Das erlaubt die Bearbeitung von Dateien, wenn man offline ist.

Git hat Integrität

Git speichert Daten in einem sogenannten «Content-addressable file system». Das bedeutet, dass Git speichert alles mit einem einfachen «key-value» System. Wenn man Inhalt in einer Repository hin fügt, gibt Git einen «unique identifier» zurück. Damit können alle gespeicherten Daten wiedergeholt werden. Git benutzt SHA-1 für die Generierung von UIDs.

Git kann (normalerweise) nur hinzufügen

Fast alle Befehle von Git werden für die Addierung von Daten gebraucht. Es ist sehr kompliziert Änderungen zu machen, die nicht zurückkehrbar sind. Man kann mit wenig Aufmerksamkeit Änderungen löschen oder verlieren, aber nachdem eine Snapshot beim Git commited worden ist, ist es praktisch unmöglich diese zu verlieren.

Branches (Zweige)

Einen Commit zeigt immer auf seinen «Parent Commit» und auf eine Snapshot seinem Inhalt. Mit diesem System ist es möglich, dass einen Commit mehrere «Children» hat. In diesem Fall wurde eine Kette (Zweige) von Commits in zwei verschiedene Verläufe aufteilen. Entwicklern können nun auf zwei verschiedene Verläufe des Projektes arbeiten und sie später zusammenfügen.

Advertisements

C#: Async

Asynchrone Programmierung ist ein Weg, um Leistungsengpässe und die Reaktionsfähigkeit einer Anwendung zu verbessern. Es kann aber sehr kompliziert werden, eine Applikation zu schreiben, debuggen und verwalten.

Wenn die C# Version 5 herausgekommen ist, ist eine sehr einfache Ansatz eingeführt worden, die sehr viele komplizierte Arbeit an den Compiler weitergibt und dem Entwickler Zeit und Geduld erspart.

Asynchronie wird für potenziell blockierende Tasks gebraucht, wie z.B. Webzugriff oder Laden eines Files. Wenn diese Aktivitäten in einer synchronen Applikation aufgerufen werden, wird die ganze Anwendung auf diesem Prozess warten, bis sie weiterlaufen kann.

Es gibt mehrere Anwendungsbereiche wo asynchrone Programmierung Sinn machen:

  • Webzugriff
  • Arbeiten mit Dateien
  • Arbeiten mit Bildern

Mit der Hilfe von Asynchronie, können Applikationen solche Funktionen ausführen und gleichzeitig auf Benutzer Input reagieren.

Es gibt zwei Schlüsselwörter in C#, await und async, die bei asynchroner Programmierung gebraucht werden. Diese beiden Schlüsselworte werden gebraucht, um Async-Methoden zu definieren.

Man kann eine asynchrone Methode so definieren:

async Task <method_name>() { }

Diese Methode kann jetzt asynchron aufgerufen werden und in seinem eigenen Thread laufen. Die Klasse Task ist eine spezielle Klasse die für die Verwaltung alle Tasks/Aufträge. Mit dieser Klasse, kann eine asynchrone Methode sagen, wenn sie ihren Auftrag erledigt hat.

Mit der Verwendung von der Schlüsselwort await kann eine asynchrone Methode auf eine andere asynchrone Methode warten. Sobald eine await aufgerufen wird, wird die Methode angehalten, und die Steuerung kehr zum Aufrufer der Methode zurück.

Ablauf

Async Task<int> AccessTheWebAsync()<-1.
{
  HttpClient client = new HttpClient();
  
  Task<string>getStringTask = client.GetStringAsync(«http://storage.freestrings.com»);<-2.
  
  DoIndependentWork();<-3.

  string urlContents = await getStringTask;<-5

  return urlContents.Length; <-6
}

void DoInpendentWork()
{
  resultsTextBox.Text += «Working…\r\n»;<-4.
}
  1. Die Methode wird aufgerufen und den Aufrufer dieser Methode wartet auf sie.
  2. Die Methode «AccessTheWebAsync» erstellt eine Instanz des HttpClient und ruft die asynchrone Methode «GetStringAsync» auf. In «GetStringAsync» wird etwas gemacht, das die Ausführung der Methode anhalten wird. Es müsste gewartet werden, bis den Text heruntergeladen würde. Umso Sachen zu vermeiden, übergibt die «GetStringAsync» Methode die Steuerung an ihren Aufrufer «AccessTheWebAsync».
  3. Da «getStringTask» noch nicht fertig ist, kann «AccessTheWebAsync» seiner Arbeit fortfahren, die nicht vom Ergebnis der «GetStringAsync» abhängig ist. Diese Aufgabe ist «DoIndependentWork» die eine synchrone Methode ist.
  4. «DoIndependetWork» ist eine synchrone Methode und führt ihrer Aufgabe aus. Erst wenn diese Methode fertig ist, wird die Steuerung an den Aufrufer «AccessTheWebAsync» zurückgegeben.
  5. Bei diesem Punkt, brauchte die Methode «AccessTheWebAsync», das Ergebnis von «getStringTask», um mit ihrer Arbeit fortfahren zu können. Mit Hilfe der await Schlüsselwort, kann «AccessTheWebAsync» die Steuerung an ihrem Aufrufer zurückgeben und sicherlich auf das Ergebnis von «getStringTask» warten.
  6. Danach kann die Methode «AccessTheWebAsync» ihrer Arbeit abschliessen und den erwarteten Wert zurückgeben.

IEnumerable Interface

Die IEnumerable Interface ist eine sehr hilfreiche Funktionalität des .NET Frameworks. Sehr oft musst man durch eine Collection von Objekten iterieren und IEnumerable erlaubt das und macht unser Leben viel einfacher.

Die IEnumerable Interface definiert eine Methode GetEnumerator, die eine IEnumerator Interface zurückgibt. Eine Collection, die IEnumerable implementiert kann in einem for-each Loop gebraucht werden.

Wichtigste Punkte:

– Die IEnumerable Interface befinden sich in der System.Collections.Generic Namespace.

– Die IEnumerable Interface ist ein generisches Interface und erlaubt Iterationen durch generische und nicht generische Listen.

– Man kann linq Query Expressions mit diesem Interface brauchen.

– Dieses Interface gibt einen Enumerator zurück, den durch eine Collection iteriert.

So kann man dieses Interface implementieren:

public class MyIterableCollection : IEnumerable
{
       public IEnumerator GetEnumerator()
       {
             (…Code…)
       }
}

 

Die IEnumerator Interface

Die IEnumerator Interface hilft und durch die Elemente eine Collection zu navigieren. Dieses Interface hat die folgenden Methoden:

– MoveNext()

– Reset()

MoveNext()

Diese Methode ändert den Wert des Enumerators auf dem nächsten Element der Collection und gibt einen Boolean Wert zurück. Die Methode gibt True zurück falls den Enumerator ohne Fehler auf dem nächsten Element gesetzt worden ist und False falls den Enumerator auf keinem neuen Element zeigen kann, bzw. befindet er sich am Ende der Collection.

Reset()

Die Reset Methode setzt den Wert des Enumerators auf seiner ersten Position, die erste Position befindet sich vor dem ersten Element der Collection.

Das IEnumerator Interface hat eine Property die Current heisst und gibt den Wert des jetzigen Elements zurück.

So kann man das Interface implementieren:

public class MyEnumerator : IEnumerator
{
       public object Current
       {
             get { (…Code…) }
       }

       public bool MoveNext()
       {
            (…Code…)
       }

       public void Reset()
       {
            (…Code…)
       }
}

 

Hier ist ein kleines Beispiel, wie man dieses Interface brauchen könnte:

// Einfaches Objekt für unsere Collection
public class Musician
{
     public Musician(string name, string song)
     {
        Name = name;
        Song = song;
     }

     public string Name { get; private set; }
     public string Song { get; private set; }
}

// Eine Collection von unsere Musicians Klasse
// Diese Collection implementiert IEnumerable 
// damit sie in einem for-each loop gebraucht
// werden kann
public class Collaboration : IEnumerable
{
    private Musician[] _musicians;

    public Collaboration(Musician[] musiciansArray)
    {
        _musicians = new Musician[musiciansArray.Length];

        for(int i = 0; i < musiciansArray.Length; i++)
        {
            _musicians[i] = musiciansArray[i];
        }
    }

    // Implementation der GetEnumerator Methode
    IEnumerator IEnumerable.GetEnumerator()
    {
        return (IEnumerator)GetEnumerator();
    }

    public MusiciansEnumerator GetEnumerator()
    {
        return new MusiciansEnumerator(_musicians);
    }
}

// Wenn man IEnumerable implementiert, braucht es auch eine IEnumerator Klasse
public class MusiciansEnumerator : IEnumerator
{
    private Musician[] _musicians;

   // Enumerators fangen immer vor dem ersten Element an
    // bis die Methode MoveNext() aufgerufen wird
    private int _position = -1;

    public MusiciansEnumerator(Musician[] musicians)
    {
        _musicians = musicians;
    }

    object IEnumerator.Current => Current;

    public Musician Current
    {
        get
        {
            try
            {
                return _musicians[_position];
            } catch (IndexOutOfRangeException)
            {
                throw new InvalidOperationException();
            }
        }
    }

    public bool MoveNext()
    {
        _position++;
        return (_position < _musicians.Length);
    }

    public void Reset()
    {
        _position = -1;
    }
}

class Program
{
    static void Main(string[] args)
    {
        Musician[] musiciansArray = new Musician[3]
        {
            new Musician("Freddie Mercury", "Bohemian Rapsody"),
            new Musician("Michael Jackson", "Thriller"),
            new Musician("John Legend", "All of me")
        };

        Collaboration collab = new Collaboration(musiciansArray);

        foreach (var musician in collab)
        {
            Console.WriteLine($"{musician.Name} - famous for: {musician.Song}");
        }

        Console.Read();
    }
}

/*
* Die Ausgabe für diesen Code ist:
* 
* Freddie Mercury - famous for: Bohemian Rapsody
* Michael Jackson - famous for: Thriller
* John Legend - famous for: All of me
* 
*/

 

REST API

Web API

Eine API ist eine Application Programming Interface, bei einem Web Server oder Web Browser verwendet wird. Eine Web API dient dafür, dass man Dienste einer Web Applikation in einem anderen Programm verwenden kann. Web API werden mit HTTP Anfragen verwendet. Normalerweise schickt man eine Anfrage mit JSON Syntax aber meisten APIs unterstützen auch XML und anderen Formaten.

REST Eigenschaften

Eine REST API ist eine Web API die bestimmten Eigenschaften hat. Diese Eigenschaften erleichtern die Benutzung einer API für den Benutzer und für den Server. Durch diese Eigenschaften werden die folgenden Punkte verbessert:

  • Bessere Performance zwischen verschiedene Komponente und effiziente Netzwerk.
  • Skalierung von den Anzahl Interaktionen zwischen alle Komponente. Das erlaubt, dass man mehr leisten kann.
  • Simplizität für alle Benutzern.
  • Kommunikation zwischen alle Komponente einer API wird mehr transparent.

REST Regeln

Die sechs Regeln einer REST API dienen dafür man alle Entstehung allen Eigenschaften garantieren kann. Die Regeln sind:

Client-Server Architektur

Der Unterschied zwischen Client und Server Kapazitäten sollen möglichst gut erkennbar sein, damit alle Client Komponente bei mehreren Plattformen gebraucht werden können.

Statelessness

Statelessness heisst, dass keine mehrfachen Interaktionen von der Benutzerseite gebraucht werden, um einen Request zu bauen. Alle Daten, die für einen Request wichtig sind, sollen vom Benutzer erhalten werden und den Server darf keine Daten zwischen Request halten. Es ist aber erlaubt die Daten aus den Requests in einer Datenbank zu speichern falls, das Ziel etwas persistent zu Speichern ist.

Cacheability

Antworten einem Request (normalerweise HTML oder JSON Textkörper) sollen explizit oder implizit als speicherbar definiert werden. Dies erlaubt eine schnellere Interaktion zwischen Client und Server.

Layered System

Das heisst, dass den Client nicht merken soll, ob er den Requests direkt an den End Server schickt. Falls es anderen Servers zwischen Client und End Server gibt, kann die Skalierung vereinfacht werden und die Leistung der API erhöhen.

Uniform Interface

Ressourcen Identification in Requests

Ressourcen müssen identifiziert werden in jedem Request, durch den Gebrauch von URIs. Die Ressourcen lassen sich von der Antwort zu dem Client gut Unterscheiden durch HTML und JSON.

Ressourcen Manipulation durch Repräsentationen

Wenn den Client eine Antwort von Server bekommt, muss er genug Information (inklusiv Metadaten) über eine Ressource erhalten, um dieselbe ändern oder löschen können.

Hypermedia as the engine of application state (HATEOAS)

Wenn den Client einen initialen URI, um die REST Applikation zu dienen, gebraucht hat, muss den Server den Client durch Hyperlinks, alle möglichen Funktionalitäten und Navigation geben.

HTTP Request Methoden

Es gibt verschiedene Request Methoden, die man brauchen kann. GET ist eine sichere Methode die nur Informationen über eine oder mehrere Ressourcen zurückgibt. PUT ist nicht sicher, da es eine Ressource ersetzt. PATCH kann eine Ressource ändern ohne, dass man alles ersetzen muss. POST erstellt eine neue Ressource. DELETE löscht eine Ressource.

Unity Game Engine

Die Unity Game Engine ist einen IDE, der für die Erstellung und Entwicklung von Games und andere interaktive Medien gebraucht wird. Unity ist meistens von Indie Entwicklern gebraucht und hat eine sehr freundliche Lernkurve. Es ist einfach Beginner Projekte zu erstellen und die Basics von Unity lassen sich von mehreren Tutorials einfach erklären.

 

Geschichte

Die Idee für die Unity Game Engine, kam von Nicholas Francis, Joachim Ante und David Helgason. Die drei Entwickler wollten, am Anfang, Games zusammen entwickeln aber sie haben später ein grösseres Interesse an einem Tool, mit dem man Games entwickeln kann, gefunden. Danach haben sie angefangen die Unity Game Engine in einem Keller in Kopenhagen zu entwickeln. Am Anfang ist die Unity Game Engine nur für MAC OS entwickelt worden aber später haben die Hersteller, der Unity Game Engine, diese auch für Windows und Web verbreitet. In den nächste paar Jahren, ist die Interesse an Web Browser Games sehr hoch gewesen und die Entwickler der Unity Game Engine haben sich auf dieser Plattform fokussiert. Nach zwei Jahren haben sie ihr Ziel erreicht aber mussten noch ein Game entwickeln, damit sie die Stärken von Unity zeigen könnten. Danach ist der ersten Unity Game zusammen mit der Unity Game Engine, am 6. Juni 2005 auf der Welt gekommen. Mit der Zeit sind Handy Games sehr beliebt worden und Unity hat sich auch auf die Handy Plattform verbreitet. Solang die Gaming Industrie sich immer weiterentwickelt hat und mehr Hardware erstellt war, hat sich Unity auch entwickelt. Heutzutage gibt es viele Menschen, die die Engine benutzen und es gibt eine grosse Liste von Games, die mit Unity entwickelt worden sind. Jetzt kann Unity Games für 27 verschiedene Plattformen exportieren und die Engine kann auch für Animationen und Datendarstellung gebraucht.

 

Skript Sprachen

Unity erlaubt, dass andere Anwendungen und Hardware an sich angepasst werden. Die Programmiersprachen, die von Unity unterstützt werden sind folgende:

UnityScript:

UnityScript ist fast dasselbe wie JavaScript aber ist für Unity eingerichtet worden. UnityScript ist sehr einfach zu lernen und ist für Anfänger empfohlen. UnityScript ist sehr schnell zu schreiben und alle Type Casting wird im Hintergrund gemacht. Da diese Sprache sich an JavaScript ähnelt, hat sie auch die Vorteil Klassen und Vererbung programmieren zu können.

C#:

Ist viel schwieriger als UnityScript und man muss viel mehr schreiben, um sein Ziel zu erreichen. Den Compiler handelt auch nicht viel Logik und es muss alles explizit codiert werden.

Boo:

Boo hat die gleiche Syntax wie Python und ist ähnlich wie UnityScript strukturiert. Da so wenig Menschen diese Sprache verwenden, ist Support dafür auch sehr selten.

C# Features 2

Wie im letzten Blogpost, werde ich die Features den letzten Versionen C# dokumentieren. Im letzten Blogpost habe ich einige Features der Version 3.0 und eine aus der Version 6.0 (statische Importe). In diesem Blogpost will ich über die Version 5.0, 6.0 und 7.0 schreiben.

Version 5.0

  • Asynchrone Methoden

Die Version 5.0 hat asynchrone Methoden zu C# gebracht. Asynchrone Methoden sind heutzutage sehr hilfreich für einen Entwickler und die C# Implementation ist sehr praktisch zu benutzen. Asynchrone Methoden sollen immer benutzt werden, um ein Programm flexibel zu machen und Responsiveness zu garantieren. Stellen Sie sich vor, dass Sie ein Programm schreiben, das einen UI hat und Daten verarbeiten kann, wenn es Input des Benutzers bekommt. Wenn es die Daten einfach nach einem Input verarbeiten würde, wäre die UI blockiert bis die Daten verarbeiten worden sind. Dafür können wir eine asynchrone Methode brauchen. Diese Methoden verwenden «Task» und «Task». Diese Tasks sind wie unabhängige Threads. Mit dem «async» Schlüsselwort» kann eine Methode in eine asynchrone Methode umgewandelt werden. Mit dem «await» Schlüsselwort weiss eine asynchrone Methode, dass sie die Steuerung an den Aufrufen zurückgeben muss. Den Code für unseren Beispiel würde ungefähr so aussehen:

submitButton.Clicked += async (o, e) =>
{
  // In dieser Methode werden wir definieren, dass es einen

  // separate Task starten muss, um unseren async
  // MakeCalculationsAsync() Methode auszuführen. Wichtig
  // ist es, dass MakeCalculationsAsync()
  // eine Task oder Task zurück gibt.

  var output = await MakeCalculationsAsync(input);
};

Wenn wir das so programmieren, wird das UI immer noch verwendbar sein, obwohl die Daten immer noch verarbeitet werden. Es ist auch einfacher als Threads zu konfigurieren und initialisieren.

 

  • Aufrufer Informationen

Die Aufrufer Informationen können für das Debuggen sehr hilfreich sein. Die Aufrufer Informationen können in einer Methode als Parametern Attribute definiert werden. Die drei vorgegebenen Informationen sind die «CallerFilePathAttribute» (string), «CallerLineNumberAttribute» (int) und «CallerMemberNameAttribute» (string).

public void DoProcessing()
{
  TraceMessage("Something happened.");
}

public void TraceMessage(string message,
  [System.Runtime.CompilerServices.CallerMemberName] string memberName = "",
  [System.Runtime.CompilerServices.CallerFilePath] string sourceFilePath = "",
  [System.Runtime.CompilerServices.CallerLineNumber] int sourceLineNumber = 0)
{
  System.Diagnostics.Trace.WriteLine("message: " + message);
  System.Diagnostics.Trace.WriteLine("member name: " + memberName);
  System.Diagnostics.Trace.WriteLine("source file path: " + sourceFilePath);
  System.Diagnostics.Trace.WriteLine("source line number: " + sourceLineNumber);
}

// Sample Output:
//  message: Something happened.
//  member name: DoProcessing
//  source file path: c:\Visual Studio Projects\CallerInfoCS\CallerInfoCS\Form1.cs
//  source line number: 31

(Beispiel vom: https://docs.microsoft.com/de-de/dotnet/csharp/programming-guide/concepts/caller-information)

 

  • Ausdruckskörpermember

Properties haben Upgrades bekommen und man kann viel mehr machen. Jetzt kann man Properties initialisieren. Die initialisierte Properties funktionieren immer noch gleich aber jetzt braucht man zum Beispiel keine private Variabel um eine read-only Variabel zu definieren.

public string Name { get; } = "A Name";

Mit einer Art von Lambda Expression kann man die Get Methode definieren. Diese Ausdruckskörpermember sind sehr gut, um code zu vereinfachen.

public string Name => "John" + ". " + "Doe";

C# Features

C# ist schon eine alte Programmiersprache aber es entwickelt sich immer weiter und jede neue C# Version zeigt, dass C# sehr spezielle Eigenschaften hat, die sich von anderen Programmiersprachen unterscheiden. Ab die Version 3.0 ist C# sich als einer den wichtigsten Programmiersprachen erkannt worden, da es neue und originale Features gebracht hat. Einige diesen Features sind sehr gut für die Umstellung von Code und besser Übersichtlichkeit, andere Features sind sehr wichtig für meisten C# Programme heutzutage, da sie eine sehr starke Funktionalität haben.

Version 3.0

Die Version 3.0 hat LINQ eingeführt und ist eine der wichtigsten und praktische Eigenschaften von C#. LINQ steht für Language-Integrated Query und es erlaubt, dass Abfragen für die Daten eines Programmes abgefragt werden können. Mit LINQ kann man aus einer Collection bestimmte Werte zu holen. Es funktioniert ähnlich wie eine SQL Abfrage aber die Syntax ist ein Bisschen verschieden. Eine LINQ Expression (Abfrage) sieht folgendes aus:

from <abgefragte_variable > in <collection_name>

            where <bedienung>

            select <wert_aus_abfrage>;

LINQ hat mehrere Funktionalitäten wie ‘orderby’ und ‘groupby’, die gleich wie bei SQL funktionieren.

Eine Funktionalität, die auch sehr praktisch ist, ist Anonyme Typen. Anonyme Typen sind Objekte, die nicht explizit deklariert sein müssen. Es funktioniert ähnlich wie eine «var» Zuweisung aber die Anonyme Typen sind für Objekte und das bedeutet, dass man einen Objekt Initialisieren muss und den Compiler wird für dieser nicht vordefiniertes Objekt, die richtige Referenz zuweisen. Meisten Anonyme Typen werden so deklariert:

var anonymous = new { <property_name> = <wert>, … };

Die linke Seite dieser Expression ist eine anonyme Deklaration, die den Compiler erklärt, dass er den Typ für dieses Objekt selbst identifizieren muss. Meistens ist dieser Typ immer «object». Die rechte Seite ist eine Initialisierung eines Objektes. Mit die «new» Keyword wird ein neues Objekt erstellt und in den geschweiften Klammern werden alle Properties definiert und auf einen Wert zugewiesen.

Erweiterungsmethoden sind Methoden, die einen Objekt erweitern können und ist auch eine den eigenartigen Eigenschaften von C#. Einen Erweiterungsmethode muss das Objekt zum Erweitern als Parameter deklarieren und das Keyword «this» muss auch vorhanden sein.

public static <methoden­­_name> (this <objekt_zum_erweitern> <parameter_name>) { … }

  • Die Methode muss immer statisch sein, damit das erweitertes Objekt Zugriff hat. Diese Methoden sind sehr praktisch, wenn ein vorgegebenes Objekt (z.B. string) geändert sein muss. Wenn man <objekt_zum_erweitern> mit string ersetzt, können alle string Objekt diese Methode brauchen.

Der nameof Operator ist auch einen Operator, der die Vermeidung von Typfehler und Bugs erlaubt. Mit diesem Operator kann man den Namen einer Variablen erzeugen ohne einen String selbst zu schreiben. nameof(<variable>) Gibt einen String zurück mit dem Namen der vorgegebene Variable.

Eine leicht unnötige aber trotzdem praktische Feature ist der Statische Import. Wenn man eine Methode eines anderes Namespaces erzeugen muss. Kann man den Importieren ohne den ganzen Namespace zu schreiben. Bei der Imports Liste kann man
using static <namespace>; schreiben und die Methoden verwenden in diesem Namespace. Zum Beispiel statt Console.WriteLineHello»); kann man es vereinfachen mit:

using static Windows.System.Console;

WriteLineHello»);

C#

C# ist eine objektorientierte, multithreading Programmiersprache. Der Mann, der diese Programmiersprache entwickelt hat, heisst Anders Hejlsberg und er basiertet sich aus den Grundlagen von Java, C++ und C. C# ist platformunabhängig und wurde mit der .NET Framework entwickelt. Microsoft bezeichnet ihre Implementierung der Sprache als Visual C#. Am Anfang war C# nur auf Windows OS begrenzt aber später, mit Xamarin, ist es für macOS, iOS und Android erweitert worden. Linux hat auch eine Unterstützung für C# mit der .NET Core Framework.

C# hat sehr spezielle Unterscheidungen Gegensatz zu anderen Sprachen, wie z.B. Attribute und Delegaten. Attribute können Informationen einer Klasse, Objekt oder Methode speichern, die zur Laufzeit ausgewertet werden können. Diese Informationen können auch Metadaten genannt werden. Ein Delegat kann auf Methoden einer Klasse zeigen. Der Delegat hat einen festen Typ, der eine Signatur festlegt. Diese Signatur wird von Compiler überprüft. Um ein Delegat aufzurufen, braucht der Delegat einen Verweis auf das Objekt, das den Methoden beinhaltet. Die Methode des Delegaten hat ein Objektzeiger als Parameter.

Microsoft Visual Studio ist der dominierender IDE um C# zu programmieren aber es gibt auch andere Möglichkeiten.

  • Baltie ist einen IDE, der sehr einfach ist und von Kindern gebraucht werden kann.
  • JetBrains bietet mit spezieller Software (ReSharper) viele Plug-ins für Visual Studio an.
  • Rider ist eine Entwicklungsumgebung, die für Windows, Linux und Mac Os gebraucht werden kann.
  • Notepad++ kann auch gebraucht werden, bietet aber nicht so viel Funktionalitäten wie andere IDEs an. Nun kann es mit dem Plugin CS-Script, Autovervollständigung, Codeausführung und Debugging ermöglicht werden.
  • Xamarin Studio bietet eine mehr Handy richtete Entwicklungsumgebung an.

 

C# Compiler kompilieren den Code nicht direkt zur Maschinesprache, sondern zur einer Zwischensprache, sogenannte Common Intermediate Language. Bei der Ausführung wird eine virtuelle Maschine gestartet, die die Zwischensprache für dem entsprechendem OS übersetzen kann. Es existieren vier Compiler für C#:

  • Microsofts Roslyn-Compiler für Visual Basic .NET.
  • Xamarins Mono
  • DotGNU
  • CoreRT

 

Während dem Entwicklungsprozess von C#, wurde die Sprache unter dem Codenamen «Cool» entwickelt. Den coolen Namen «Cool» müsste nun wegen Marketings Probleme geändert werden. C Sharp stimmt vom Zeichen Kreuz (#, englisch sharp) der Notenschrift ab, den eine Erhöhung des Grundtons um Halbton bedeutet. Dieser Ton wird in der deutschen Sprache unter «cis» gekannt.

 

C# hat mehrere spezielle Eigenschaften. Encapsulation in C# wird mit mehreren Keywords als in andere Sprachen behandelt.  Für Encapsulation gibt es die Keywords «public» und «private» wie in Java, aber auch noch «readonly», «sealed», «protected». Das Keyword «readonly» wird für Variablen gebraucht, die nur initialisiert werden sollten. Das heisst, dass nach der Initialisierung den Wert nicht geändert werden kann. Das Keyword «sealed» hat den Zweck, eine Klasse von Vererbung zu beschützen, indem keine andere Klasse von dieser «sealed» Klasse vererben kann. Das Keyword «protected» erlaubt Subklassen den Zugriff auf die Variablen und Methoden einer vererbten Klasse.

Machine-learning

Heutzutage gibt es schon Computern, die selbständig lernen können. Die Methode von Machine learning ist erst im Jahr 1959 von Arthur Samuel verwendet worden. Er hat einen Algorithmus entwickelt, der auf Mustererkennung basiert ist. Bei Machine learning geht es um das Programmieren von einem Algorithmus, den selber lernen kann. Das Programm soll schon vorgegebene Daten interpretieren können und, in diesen, Ähnlichkeiten herausfinden. Wenn das Programm diese Muster findet, kann es neuen Daten, mit Bezug auf die Originale, erstellen. Es gibt sehr einfache Beispiele von dieser Technologie wie z.B. Email-Filters und Anti-virus Software. Alle Programme, die eine Gemeinsamkeit zwischen Daten interpretieren kann wie «Google Top Suchbegriffe» ist eine Self-learning AI (Artificial Intelligence). Schwierige Beispiele wären Programme, die das Wetter und Katastrophen vorsehen können.

Es gibt mehr Arten einen Machine-learning Algorithmus zu schreiben. Diese Methoden sind:

Decision tree learning

Decision Tree Learning fangt von null an und baut neue «Zweige» mit jeder neuen Information. Alle Information die neu ist aber eine Beziehung zu schon vorgegeben Info entwickelt einen Zweig weiter.

Association rule learning

Association rule learning fokussiert sich bei Beziehungen in Datenbanken zu finden durch das Speichern von den Resultaten mehrere Abfragen. Das ist ein gutes Beispiel eines Social Media System um Empfehlungen zu geben.

Artificial neural networks

Berechnungen, die mit einander verbunden sind und schneller Beziehungen erkennen können. Dieser Methode kann Leistung des Computers zwischen mehrere Neuronen unterteilen und eine schnellere Berechnungszeit ermöglichen.

Deep learning

Deep learning benutzt die Methode von Artificial neural networks um eine riesige Neuronen Netzwerk zu erstellen und einen menschlichen Gehirn imitieren. Die beste Software, die diese Methode brauchen sind Speech Recognition und Computer Vision.

Inductive logic programming

Inductive logic programming ist auch eine Art von «rule learning» (2.Thema) aber es benutzt eine Strategie bei dem Programmieren, den «logic programming» heisst. Diese Methode sammelt Input des Benutzers und Informationen über seinen Hintergrund und nimmt alle Informationen als positive Daten. Mit diesen Daten kann die Methode um sich zu weiterentwickeln brauchen.

Similarity and metric learning

Bei dieser Methode bekommt die Maschine einem Muster. Sie soll dieses Muster mit anderen Daten vergleichen und diese Daten sind entweder sehr ähnlich wie dem Muster oder sehr unterschiedlich. So kann die Maschine erkennen ob Daten für einen Benutzer relevant sind.

Genetic algorithms

Diese Methode ist sehr ähnlich wie die Evolution den Menschen. Die Maschine generiert mehrere Regeln und Prozesse und kann nach einem Test, die Ergebnisse analysieren und benutzt die Resultaten um die Regeln und Prozesse zu entwickeln. Die neuen Prozesse werden auch weiterentwickelt und es kann zu mehrere neue Prozesse führen. Der Prozess, der die beste Resultaten ergibt, wird gebrauch um alle andere Prozesse zu entwickeln und diesen auf den richtigen Weg zu führen. Diese Methode braucht sehr lang und sehr viel Computer Leistung.

Machine-learning ist eine sehr wichtige Schritt in den IT Bereich da es die Computer eine grössere Unabhängigkeit gibt und wie immer, unsere Leben einfacher machen. Ich denke, dass in der Zukunft, unsere Computers werden uns besser kenne als wir selber. Diese Methoden werden schon heutzutage mit unseren persönlichen Daten gebraucht wie man bei Google sehr «interessante» und «zutreffende» Adds bekommt.

FTP

FTP (File Transfer Protocoll) ist eine Datenübertragung Medien, die schon lang in der Welt der Informatik genutzt wurde. FTP ist ein Protokoll, der in der Layer 5 stattfindet, dieser Protokoll hat eine TCP Port mit dem Nummer 21. Mit FTP kann man Dateien freistellen und mit anderen teilen zu lassen. Mit dem Befehl «FTP (IP Adresse)» kann man sich mit anderen Hosts verbinden , mit «put (filename)» Dateien aufladen und mit «get (filename)»dateien herunterladen.