C#

Logging-Framework: Serilog

Ich werde ab und zu gefragt wie ich denn Daten zur Laufzeit (nicht Debugging) mit logge.

Log4Net war hier lange Platzhirsch, aber für mich und viele andere ist es nun Serilog. Denkbar einfach zu implementieren. Es gibt viele Sinks (Ziele für das Logging, z.B. Datenbanken, Dateien, Console).

Das ganze in kostenlos und OpenSource…

Hier ein kleines Beispiel für einen Logger der in eine Datei schreibt und zusätzlich in die Console, auch schön in Bunt von hier:

Log.Logger = new LoggerConfiguration()
    .WriteTo.LiterateConsole()
    .WriteTo.RollingFile("log-{Date}.txt")
    .CreateLogger();

Log.Information("Ah, there you are!");

coloredconsolesinkdemo

Von |2016-10-13T13:46:45+02:002016-10-13|C#|

Visual Studio Toolchain 2016 April

Ich schaue gerne Entwicklern bei der Arbeit zu :^)
… denn man sieht oftmals Workflows oder auch Tools welche man nie vermisst hat, aber welche viel Arbeit ersparen würden…

Darum hab ich mir gedacht, ich schreib einfach mal was ich so mit Visual Studio an Tools verwende… Vielleicht ist etwas für euch dabei.

  • ReSharper (kostenpflichtig): Glaube ohne den ReSharper könnte ich gar nicht mehr programmieren, schaut euch die tollen Features mal an.
  • Supercharger: Ganz neu bei mir im Einsatz, nutze gerne die CodeMap und die Farbgestaltung im Editor
  • ResXManager: Nimmt sehr viel Arbeit bei der Übersetzung von Projekt ab
  • Editor Guidelines: Zeigt mir dass ich nicht so lange Zeilen schreiben soll, damit es auf Suplanus schön lesbar ist
  • XAML Styler: Formatiert den XAML Code von WPF
Von |2016-04-19T13:38:20+02:002016-04-20|C#|

Dash & Zeal offline Dokumentation

„Programmierer schreiben nur den ganzen Tag Code“… das höre ich oft, aber eigentlich lesen wir Dokumentation und im schlimmsten Fall kopieren wir einfach von StackOverflow.

Beider erleichtert mir seit kurzem ein Tool namens Dash für den Mac. Für Windows & Linux gibt es etwas ähnliches namens Zeal (OpenSource).

Ich kann leider nur von Dash berichten… und kann sagen dass es sehr angenehm ist damit zu arbeiten.

Schaut euch die Tools mal an, auch Dash kann man kostenlos testen.

Dash

Von |2016-04-18T10:04:54+02:002016-04-18|C#, Coding|

Pushover unter Mono

Ich hab ja die Superkraft in Probleme zu laufen die wohl sonst keiner hat…

Wenn man unter Mono auf den Dienst Pushover zugreifen will dann ist es notwendig das Zertifikat zu registrieren (Shell):

certmgr -ssl https://api.pushover.net --machine

Mir ist es aufgefallen als ich mit der .NET-Library NPushOver gearbeitet habe… kann ich sehr empfehlen.
Da hatte ich aber auch das Problem dass ich Push-Notifications ohne Inhalt (Body) versenden wollte. Bekam dann immer einen 400er Fehler. Liegt daran dass Pushover keine leeren Notifications erlaubt.

Pushover API

Von |2015-11-24T10:39:24+01:002015-11-24|C#, Mono|

Entity Framework MySql mit SSH-Tunnel in Mono

Der Titel sagt schon dass es nicht gerade das ist was man gerne programmiert…

Kurz zu meiner Anwendung:
Ich möchte gerne Werte von einem Raspberry Pi auf meinem Uberspace in einer MySql Datenbank speichern. Erst wollte ich das auf Azure tun, leider wird hier Mono noch nicht korrekt unterstützt.

Dann eben in MySql… aber Uberspace lässt Zugriff auf die Datenbank nur per SSH zu.

Gut, dann bauen wir uns mal einen SSH-Tunnel in Mono. Hier gibt es ein schönes NuGet-Packeg namens SSH.NET

Die Objekte wie folgt initialisieren:

private const string passwordSsh = "myPassword";
private const string username = "myUsername";
private const string server = "my.server.de";
static ForwardedPort port = new ForwardedPortLocal("localhost", 3306, "localhost", 3306);
private static SshClient sshClient = new SshClient(server, 22, username, passwordSsh);

Den Port benötigen wir um später die Daten durch Port 3306 zu tunneln.

 

Die Verbindung ist dann relativ einfach:

if (!sshClient.IsConnected)
{
    sshClient.Connect();

    // offline
    if (sshClient.IsConnected)
    {
        // Start port if not started
        if (!port.IsStarted)
        {
            // Add port if not added yet
            if (!sshClient.ForwardedPorts.Contains(port))
            {
                sshClient.AddForwardedPort(port);
            }
            port.Start();
        }
    }
}

Jetzt schnell noch das Entity Framework (Code First) einbinden und fertig … dachte ich.

Leider kommt mir das alle ziemlich buggy und nicht fertig vor. Drum weiß ich nicht ob ich das wirklich in einer Produktivumgebung einsetzten werde / würde.

Per NuGet gibt es MySql packages … aber welche brauche ich?
Bin selbst noch nicht durchgestiegen was für was ist, kann aber sagen, bei mir hat es nur mit folgenden geklappt:

  <package id="EntityFramework" version="6.1.3" targetFramework="net4" />
  <package id="MySql.Data" version="6.8.7" targetFramework="net4" />
  <package id="MySql.Data.Entities" version="6.8.3.0" targetFramework="net4" />

Nun gibt es aber noch einen Bug der unter einer Mono-Runtime die Version des Servers falsch parsed, somit braucht man folgenden fix (hab es bisl erweitert dass jeder Server/Version richtig gewandelt wird):

using System.Data;
using System.Data.Common;
using System.Data.Entity.Infrastructure;
using System.Text.RegularExpressions;

namespace OpenHop.Database
{
    public class ManifestTokenResolver : IManifestTokenResolver
    {
        public string ResolveManifestToken(DbConnection connection)
        {
            try
            {
                connection.Open();
                string version = OnlyNumbers(connection.ServerVersion);
                return version;

            }
            finally
            {
                if (connection.State == ConnectionState.Open)
                {
                    connection.Close();
                }
            }
        }

        private static readonly Regex digitsOnly = new Regex(@"[^\d]");
        public static string OnlyNumbers(string text)
        {
            return digitsOnly.Replace(text, "");
        }
    }
}

 

In der app.config dann noch die Daten eintragen:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <configSections>
    <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
  </configSections>
  <entityFramework>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" />
    <providers>
      <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
      <provider invariantName="MySql.Data.MySqlClient.EF6" type="MySql.Data.MySqlClient.MySqlProviderServices, MySql.Data.Entity.EF6, Version=6.8.3.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d" />
    <provider invariantName="MySql.Data.MySqlClient" type="MySql.Data.MySqlClient.MySqlProviderServices, MySql.Data.Entity.EF6, Version=6.9.8.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d">
      </provider></providers>
  </entityFramework>
  <connectionStrings>
    <add name="MyContext" providerName="MySql.Data.MySqlClient.EF6" connectionString="server=localhost;database=myDatabase;uid=myUsername;pwd=myPassword" />
  </connectionStrings>
  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="MySql.Data" publicKeyToken="c5687fc88969c44d" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-6.8.7.0" newVersion="6.8.7.0" />
      </dependentAssembly>
    </assemblyBinding>
  </runtime>
  <system.data>
    <DbProviderFactories>
      <add name="MySQL Data Provider" invariant="MySql.Data.MySqlClient.EF6" description=".Net Framework Data Provider for MySQL" type="MySql.Data.MySqlClient.MySqlClientFactory,MySql.Data, Version=6.8.1.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d" />
    <remove invariant="MySql.Data.MySqlClient" /><add name="MySQL Data Provider" invariant="MySql.Data.MySqlClient" description=".Net Framework Data Provider for MySQL" type="MySql.Data.MySqlClient.MySqlClientFactory, MySql.Data, Version=6.9.8.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d" /></DbProviderFactories>
  </system.data>
</configuration>
Von |2015-11-02T11:14:25+01:002015-11-02|C#, Mono, Raspberry Pi|
Nach oben