Basteln mit dem Nachwuchs: NFC Tags programmieren

Mein Nachwuchs interessiert sich für Technik, Computer und alles was so dazu gehört. Natürlich wird gerne gespielt, aber schön langsam durstet es ihm nach mehr. Mit kleinen Projekten kann man Technik recht schnell näher bringen, vermitteln und Interessen ausloten.

Richtig gut kamen NFC Tags an. Diese sind für kleines Geld zu haben, aber es lassen sich damit ganz nette Projekte umsetzen.

NFC Tag | Norbert Eder
Ein einfacher NFC Tag

Auf so eine NFC Chip können unterschiedliche Informationen gespeichert werden. Im einfachsten Fall handelt es sich dabei um einen Link, eine Wifi- bzw. Bluuetooth-Verbindung, eine E-Mail-Adresse oder Telefonnummer, einen Standort oder eine Anweisung, eine SMS zu senden oder eine App zu starten. Kommt das NFC-fähige Telefon mit dem NFC-Tag in Berührung, wird diese Aktion ausgeführt.

NXP TagWriter | Norbert Eder
NXP TagWriter liest und schreibt NFC Tags

Um NFC-Tags zu lesen und zu schreiben ist lediglich eine Smartphone-App notwendig. Hierzu gibt es unterschiedlichste Apps. Eine der einfachsten ist der NXP TagWriter (Android, Apple).

NFC Tags auslesen | Norbert Eder
NFC Tag auslesen

Neben diesen Standard-Funktionen gibt es weitere Apps (z.B. die NFC Tools), die zusätzliche Funktionen unterstützen. So ist es damit möglich, Bedingungen zu setzen und beispielweise folgende Konfigurationen vorzunehmen:

  • Smartphone auf lautlos stellen
  • Flugmodus aktivieren
  • Wenn Sonntag bis Donnerstag, Wecker für den kommenden Tag um 6:00 Uhr stellen

Das kann für viele ein guter NFC-Tag für das Nachtkasterl sein.

Viele weitere Möglichkeiten sind gegeben und laden vor allem auch zu experimentieren ein. Mein Bub hatte viele Ideen und einige davon auch gleich umgesetzt. Für Spaß war gesorgt und auch gelernt hat er viel.

Hinweis: NFC-Tags gibt es in unterschiedlichen Größen (Speicherplatz), mit und ohne Passwortschutz, als selbstklebender Sticker oder als Schlüsselanhänger.

Viel Spaß beim Experimentieren. Die Kids werden richtig Spaß daran haben.

MySQL-Queries mitloggen

Beim Microsoft SQL Server kann man SQL Queries recht einfach mitloggen in dem man mal schnell den SQL Server Profiler startet. MySQL bietet ein derartiges Tool nicht an, zumindest kann es die MySQL Workbench nicht. Dennoch kann man aber die abgesetzten Queries aufzeichnen.

So kann man beispielsweise alle Queries in eine Log-Datei schreiben:

SET global general_log_file='c:/Temp/mysql.log'; 
SET global general_log = on; 
SET global log_output = 'file';

Das kann man dann natürlich auch wieder deaktivieren:

SET global general_log = off; 

Weiterführende Informationen finden sich in der MySQL Dokumentation.

Cascadia Code: Neuer Font für Visual Studio Code

Microsoft hat einen neuen nichtproportionalen (monospaced) Font (für Visual Studio Code, Terminal etc.) veröffentlicht: Cascadia Code.

This is a fun, new monospaced font that includes programming ligatures and is designed to enhance the modern look and feel of the Windows Terminal.

Ich habe den Font getestet und finde ihn empfehlenswert. Und so kannst du ihn auch verwenden:

Installation

Öffne die Cascadia Code Releases. Klicke auf Cascadia.ttf und lade somit die Datei auf deinen Computer. Öffne den Font anschließend mit der Windows Schriftartenanzeige.

Links oben kann der Font nun via Installieren am System installiert und registriert werden.

Nun kann der Font in jeder Anwendung verwendet werden.

Font in Visual Studio Code ändern

Unter File > Preferences > Settings > Text Editor > Font kann der verwendete Font in Visual Studio Code geändert werden. Hierfür einfach im Feld Font Family einfach 'Cascadia Code', Consolas, 'Courier New', monospace eintragen. Um Ligaturen zu verwenden, ist das entsprechende Flag zu aktivieren:

Cascadia Code und Ligaturen in Visual Studio Code konfigurieren | Norbert Eder
Cascadia Code und Ligaturen in Visual Studio Code konfigurieren

Scratch – Kinder lernen programmieren

Ohne Computer läuft heute gar nichts mehr. Umso wichtiger ist es, zu verstehen, wie sowohl Computer, als auch die darauf laufende Software, funktionieren. Um dieses so wichtige Verständnis zu schüren, sollten schon Kinder mit dem Thema des Programmierens in Berührung kommen.

Dazu gibt es unterschiedlichste Werkzeuge. Eines, das ich – aus Erfahrung – sehr empfehlen kann, ist Scratch.

Scratch ist ein tolles Hilfsmittel für Neueinsteiger, vor allem aber Kinder und Jugendliche. Programme bestehen hier aus interaktiven Komponenten, die zusammengesetzt und mit “Leben” versehen werden können. Mittels unterschiedlicher Bausteine können die Komponenten bewegt werden, es ist möglich, auf Ereignisse zu reagieren oder aber auch Sound abzuspielen und vieles mehr.

Durch das Bausteinsystem werden Syntaxfehler vermieden. Statt Frust gibt es schnelle Erfolge und treiben zu weiteren “Spielereien” ein. Innerhalb kürzester Zeit können so zum Beispiel kleine Spiele entwickelt werden.

Kinder lernen so spielerisch einige Grundkonzepte der Programmierung kennen und können so in kurzer Zeit auf komplexere Sprachen umsteigen und sich weiterentwickeln.

Die Voraussetzungen für Scratch sind gering: Ein Computer und ein Browser werden benötigt. Die Entwicklung findet komplett im Browser statt. Die Programme können abgespeichert oder geladen werden und stehen so auch sofort zur Verfügung. Es kann auch offline entwickelt werden. Dazu steht Scratch-Desktop für Windows 10 und MacOS 10.13+ zur Verfügung.

Scratch - Programmieren lernen
Scratch – Programmieren lernen

Damit man nicht ganz alleine starten muss, gibt es auch eine große Community und zahlreiche Hilfen für den Einstieg. Vielleicht gibt es ja auch in deiner Nähe ein CoderDojo. Hier in Österreich gibt es das CoderDojo Linz und das CoderDojo Graz. Hier bekommt man Unterstützung, wenn man als Elternteil nicht ganz so firm in diesen Dingen ist.

Besonders hilfreich ist die Liste der Übungsbeispiele des CoderDojo Linz zu Scratch und HTML.

In diesem Sinne wünsche ich Happy Coding und interessante, lehrreiche Stunden mit dem Nachwuchs.

Fazit Zero-Follower-Strategie auf Twitter

In So ist auch Twitter wieder nutzbar habe ich meine Nutzungsstragie auf Twitter komplett umgestellt. Ich folgte niemanden mehr, sondern arbeitete ausschließlich mit Listen.

Das erste Monat war richtig gut. Ich nutzte Twitter weiterhin und arbeitete mit meinen Listen, es funktionierte wunderbar. Die Timeline war leer und ich wurde auch nicht durch Unnötiges abgelenkt. Das äußerte sich darin, dass ich beginnend mit dem zweiten Monat meiner Umstellung Twitter immer seltener nutzte. Nun sind es fast vier Wochen, als ich das letzte Mal etwas getweetet habe. Meinen Zweitaccount (@ne_photos für die Fotografie) hatte ich daraufhin wieder umgestellt (wenngleich auch sehr halbherzig). Aber so richtig schlägt Twitter bei mir nicht mehr ein. Oder anders gesagt: Es hat seinen hohen Stellenwert bei mir verloren. Das liegt aber sicherlich auch darin, dass ich meine Online-Kommunikation sehr stark verlagert habe.

In der nächsten Zeit werde ich wohl meinen Hauptaccount wieder umstellen und dem einen oder anderen wieder folgen. Den Zweitaccount werde ich nicht weiter bedienen, für zwei Twitter-Accounts fehlt mir schlicht die Muse. Da müssen meine Follower damit leben, dass die Themenbereiche bunt gemischt sind.

So long, man sieht sich: @norberteder

ASP.NET Core: DateTime bei der Serialisierung formatieren

Im Standard wird das Datum ISO-konform serialisiert (z.B. dueDate=2019-02-21T00:00:00). In manchen Fällen möchte man das Format ändern, oder aber beispielsweise nur das Datum übertragen. Hierfür bietet JSON.NET (welches bis .NET Core kleiner 3.0 die eingesetzte JSON-Library ist) eine sehr einfache Lösung:

public class JsonDateConverter : IsoDateTimeConverter
{
    public JsonDateConverter()
    {
        DateTimeFormat = "yyyy-MM-dd";
    }
}

Nun muss der Converter noch für die gewünschte Eigenschaft konfiguriert werden:

[JsonConverter(typeof(JsonDateConverter))]
public DateTime? DueDate { get; set; }

Ab nun wird das Datum im angegebenen Format serialisiert.

Ab .NET Core 3.0 wird JSON.NET nicht mehr als führende Library eingesetzt, die Integration bleibt jedoch als zusätzliches Package erhalten und JSON.NET somit weiterhin offiziell supported.

HttpContext in .NET Core nutzen

In vielen Fällen ist der Zugriff auf den HttpContext notwendig, sei es nur, um an die aktuellen Benutzerinformationen zu gelangen.

Dies gestaltet sich in einem Controller sehr einfach, da diese Basisklasse den HttpContext über eine Eigenschaft nach außen gibt.

public class DemoController : Controller
{
    [HttpPut]
    public IActionResult Put([FromBody] Audit audit)
    {
        ClaimsPrincipal principal = this.HttpContext.User;

        if (principal.HasClaim(c => c.Type == "id"))
        {
            audit.ChangedBy = principal.Claims.First(c => c.Type == "userName").Value;
        }
        else
        {
            return BadRequest("error message");
        }

        // code goes here

        return Ok();
    }
}

Nun kann man diverse Aufgaben in eigenen Komponenten ausführen. Dort ist der HTTP-Kontext nicht verfügbar. Wie kann nun darauf zugegriffen werden?

Die Lösung besteht in der Verwendung des Schnittstelle IHttpContextAccessor in Verbindung mit der Dependency Injection, die .NET Core bietet:

public void ConfigureServices(IServiceCollection services) 
{
    // configuration goes here

    services.AddHttpContextAccessor();
}

Bei Nutzung der Dependency Injection wird die Abhängigkeit nun bei Klassen, die das Interface IHttpContextAccssor als Konstruktor-Parameter erwarten, übergeben.

public class Auditor
{
    private IHttpContextAccessor ContextAccessor { get; set; }

    public Auditor(IHttpContextAccessor httpContextAccessor) 
    {
        ContextAccessor = httpContextAccessor;
    }

    public void WriteAudit(T oldEntity, T newEntity) 
    {
        var user = ContextAccessor.HttpContext.User;

        // code goes here
    }
}

Diese Klasse muss natürlich noch beim Dependendy System registriert werden:

public void ConfigureServices(IServiceCollection services) 
{
    // configuration goes here

    services.AddHttpContextAccessor();

    services.AddTransient<Auditor>();
}

Happy Coding.

Du willst mehr zu .NET Core erfahren? Hier lang.

.NET Core: Eigenschaft nicht serialisieren

Ausgangspunkt: Du überträgst Daten von deiner API an den Client. Dabei werden Daten übertragen, die der Client nicht benötigt oder – aus anderen Gründen – nicht an ihn übergeben werden sollen. Dafür gibt es zwei Ansätze:

DataContract

Markiere eine Klasse mit dem DataContractAttribute. Nun werden nur Attribute serialisiert, welche durch das Attribut DataMemberAttribute markiert wurden.

[DataContract]
public class User
{
    [DataMember]
    public string UserName { get; set; }

    public string Password { get; set; }
}

In diesem Fall wird nur die Eigenschaft UserName serialisiert und an an den Client übertragen. Password wird dabei ignoriert.

IgnoreDataMember

Die zweite Variante besteht in der Verwendung des Attributs IgnoreDataMemberAttribute. Hier wird die Klasse nicht mit DataContract markiert und alle Attribute serialisiert, ausser, wenn sie mit dem IgnoreDataMemberAttribute ausgenommen werden.

public class User
{
    public string UserName { get; set; }

    [IgnoreDataMember]
    public string Password { get; set; }
}

Sobald eine Klasse mit DataContract markiert ist, wird das IgnoreDataMemberAttribute ignoriert.

.NET Core: Wiederkehrende Aufgaben im Hintergrund ausführen

In vielen Anwendungen gibt es die Notwendigkeit, bestimmte Aufgaben in regelmäßigen Zeitintervallen auszuführen. .NET Core bietet hierfür eine einfache Möglichkeit an.

IHostedService

Die Schnittstelle IHostedService stellt dem Entwickler die Möglichkeit bereit, einen Dienst zu implementieren, der einmal im Dependency System registriert, über die gesamte Laufzeit lebt und eine Aufgaben ausführen kann. Sie steht seit .NET Core 2.1 zur Verfügung.

Mit folgender Implementierung kann ein Job realisiert werden, der alle fünf Minuten ausgeführt wird:

public class MyImportJob : IHostedService, IDisposable
{
    private ILogger<MyImportJob> Logger { get; }
    private Timer _timer;

    public MyImportJob(ILogger<MyImportJob> logger)
    {
        Logger = logger;
    }

    public Task StartAsync(CancellationToken cancellationToken)
    {
        Logger.LogInformation("Starting Job [" + nameof(NormalizedUserCheckJob) + "]");

        _timer = new Timer(Check, null, TimeSpan.Zero, TimeSpan.FromMinutes(5));

        return Task.CompletedTask;
    }

    private void Check(object state)
    {
        Logger.LogInformation("Running [" + nameof(MyImportJob) + "]");

        // Do job here
    }

    public Task StopAsync(CancellationToken cancellationToken)
    {
        Logger.LogInformation("Stopping Job [" + nameof(MyImportJob) + "]");

        _timer?.Change(Timeout.Infinite, 0);

        return Task.CompletedTask;
    }

    public void Dispose()
    {
        _timer?.Dispose();
    }
}

Nun fehlt noch die Registrierung.

Registrierung

Schlussendlich muss eine Registrierung erfolgen. Dies geschieht in Startup.ConfigureServices:

services.AddHostedService<MyImportJob>();

Mehr ist nicht notwendig und der Job wird ab Start des Hosts alle fünf Minuten ausgeführt.

Fazit

Wiederkehrende Aufgaben können sehr einfach über die Schnittstelle IHostedService implementiert und ausgeführt werden. .NET Core stellt die notwendige Infrastruktur zur Verfügung. Als Softwareentwickler können wir uns voll und ganz auf die Funktionalität konzentrieren.

So ist auch Twitter wieder nutzbar

Alexander Zeitler hat heute einen dahintümpelnden Gedanken wach gerüttelt, der sich zusehends im Gehirn breit macht und sogar unbewusst zu einigen Handlungen in den letzten Wochen geführt hat. Dabei geht es hauptsächlich um das hohe Grundrauschen aka Noice, dem wir auf Twitter mittlerweile ausgesetzt sind. Das hat mich bewegt, etwas zu ändern. Geschafft hat er das mit dem Retweet dieses Tweets:

Following 0

Wer mir auf Twitter folgt und auch öfter mit mir interagiert hat, hat sicher gemerkt, dass ich mich auch hier mittlerweile nur mehr selten blicken lasse. Microsoft-Gebashe hier, Apple-Gebashe dort, sinnlose Suderei darüber, was wo alles nicht funktioniert.

Destruktives Gehabe, das man sich unnötigerweise selbst angewöhnt. Das zieht Energie, die besser eingesetzt werden kann. Das brauch und will ich nicht mehr.

Und doch gibt es so viele interessante und hilfreiche Informationen auf Twitter. Diese möchte ich natürlich lesen und gerne auch an sinnvollen Diskussionen teilhaben. Damit das aber funktioniert, muss ich die Verwendung von Twitter ändern. Vom passiven User werde ich zum aktiven und gestalte meine “Timeline” nun selbst.

Following 0 | Twitter | Norbert Eder

Ich folge niemandem mehr. Auch meinen besten Freunden nicht. Stattdessen setze ich auf andere Möglichkeiten.

Listen

Listen verwende ich schon lange. Halbherzig. Da ich niemandem mehr direkt folge, habe ich die interessanten Accounts in Listen kategorisiert, der Rest wurde nicht mehr berücksichtigt. Meine Timeline ist leer (außer den eigenen Tweets) und ich lese, worauf ich gerade Lust habe. Ob die eingesetzten Listen so passen, wie sie sind, wird sich zeigen. Aktuell habe ich 9 Listen.

Gespeicherte Suchen

Horizonterweiterung. Neue interessante Hinweise, Artikel und Diskussionen von mir unbekannten Accounts finde ich per Keyword-Suche. Accounts, die positiv auffallen, werden in meine Listen übernommen.

Zu meinen Interessen finde ich so viele tolle Informationen.

Geblockte Keywords

Listen setzen auf Accounts und dort wird manchmal über Themen getweetet, die mich nicht interessieren oder über die ich nicht informiert werden möchte. Mittlerweile blocke ich diese Keywords und habe meine Ruhe. Super, um unnötige Aufregungen – und Rauschen im Allgemeinen – zu vermeiden. Ein laufendes Anpassen muss wohl sein, da sich natürlich Interessen ändern, oder aber manche Themen dann möglicherweise dann doch wieder interessant werden.

Fazit

Mit diesen Maßnahmen lässt sich Twitter wieder wunderbar für Informations- und Erkenntnisgewinn, aber auch interessanten Gesprächen, nutzen. Der Rest bleibt außen vor – und das ist auch gut so.

Cookie-Einstellungen
Auf dieser Website werden Cookie verwendet. Diese werden für den Betrieb der Website benötigt oder helfen uns dabei, die Website zu verbessern.
Alle Cookies zulassen
Auswahl speichern
Individuelle Einstellungen
Individuelle Einstellungen
Dies ist eine Übersicht aller Cookies, die auf der Website verwendet werden. Sie haben die Möglichkeit, individuelle Cookie-Einstellungen vorzunehmen. Geben Sie einzelnen Cookies oder ganzen Gruppen Ihre Einwilligung. Essentielle Cookies lassen sich nicht deaktivieren.
Speichern
Abbrechen
Essenziell (1)
Essenzielle Cookies werden für die grundlegende Funktionalität der Website benötigt.
Cookies anzeigen