Git GUI unter Linux an GitLab Server mit PuTTY-Key

Nach der Umstellung auf LInux System, benötigte ich meinen vorhanden PuTTY-Schlüssel als OpenSSH Schlüssel im Linux System. Für die Wandlung gibt es unter linux puttygen, was entweder einzeln oder im Packet putty-tools installiert wird. Zum Wandeln wird folgender Befehl benutzt:

puttygen <keyfile> -O  private-openssh -o <output>

In <keyfile-PuTTY> wird der Putty-Schlüssel angegeben und bei <output> wird die Ausgabedatei angegeben, welche auch direkt die Datei „~/.ssh/id_rsa“ sein kann.

Um den Public-Key zu ermitteln, wird folgender Befehl benutzt:

ssh-keygen -f <source-private-key> -y > <output>

Hier wird bei <source-private-key> der OpenSSH-Private-Key benötigt, und bei Output der Ziel des Public-Keys definiert, z.B: „~/.ssh/id_rsa.pub“.

Damit dann meine gewählte Git-GUI, hab mich für GitEye entschieden, auch noch richtig funktionierte musste unter „Window -> Prfeferences -> General -> Nework Connections -> SSH2 -> Private keys: der id_rsa an den Anfang geschoben werden.

Linux Desktop Screenshots und Video-Aufzeichnung

Um unter Linux einen Screenshot vom Desktop oder nur eines Ausschnitts zu erzeugen, gibt es die Software Shutter. Nach dem Start dieser Software, kann damit genauso gearbeitet werden wie mit dem Snipping-Tool von Windows 8.

Zu Aufzeichnung eines Desktop-Videos, kann unter Gnome zum einem die Tastenkombination „Strg + Alt + Umschalt + R“ benutzt werden. Nach dem Starten erscheint oben rechts ein roter Punkt, der darstellen soll, dass die Aufnahme läuft. Das Video wird in den Benutzerverzeichnis im Ordner Videos abgelegt.

Des weiteren gibt es die Software SimpleScreenRecorder, welche eine Hülle an möglichen Einstellungen besitzt (die nicht angepasst werden müssen, aber können). Mit dieser können auch nur feste Ausschnitte bzw. der Maus folgende Ausschnitte aufzeichnet werden und nicht immer der ganze Desktop.

Windows 8 Energiesparmodus

Da ich immer wieder Probleme mit automatischen Aufwachen aus dem Energiesparmodus in Windows 8 hatte, hab ich mich im Internet etwas umgeschaut und bin auf folgenden Befehl gestoßen:

powercfg -devicequery wake_armed

Mit diesen, werden alle Geräte aufgelistet, die den Rechner aus den Energiesparmodus aufwecken dürfen. Und mit nachfolgenden Befehl, können einzelne Geräte entfernt werden:

powercfg -devicedisablewake [device_name]

(device_name, durch den Namen des zu entfernenden Gerät ersetzen. Vorsicht, wenn der Gerätename Leerzeichen beinhaltet, muss der Namen mit „“ umschlossen werden)

.Net und WebRequest mit Authentifizerung

WebRequest in C# abzusetzten ist mit den Bibliotheken recht einfach geworden. Aber wenn es dann mal mehr wird, als nur ein einfacher Download wird es schon wieder schwieriger. Daher hier eine kurze Anleitung, wie so ein Request bearbeitet wird.

Zuerst muss ein WebRequest erstellt werden:

var webReq = (HttpWebRequest)HttpWebRequest.Create("http://example.com/");

Dann muss unterschieden werden, ob es ein laden einer Website ist, oder ob senden von Daten an die Website ist. Bei laden einer Website wird häufig die GET-Methode verwendet, siehe hier:

webReq.Method = "GET"; // Ein einfache Get-Befehl, mit Parameter in der URL ala: example.com?param1=val1&param2=val2
// Request abschicken und Antwort auswerten 
try {
  // Beim GetResponse() fliegen die Fehlermeldungen, die der Server zurückgibt, wie 404 (Datei nicht gefunden) oder 401 (Nicht Authentifiziert)
  var webRes = (HttpWebResponse)webReq.GetResponse();
  // und nun den Stream lesen
  using (var streamer = webReq.GetResponseStream()) {
    // Hier kann man nun anhand von webRes.ContentType unterschiedlich die Daten verarbeitetn, z.B.: bei "text/xml" mit einem (new XmlDocument()).Load(streamer); alles in ein Xml-Objekt packen
  }
}
catch (WebException exc) {
  // Exceptions verarbeiten
}

Für die einfache übermittlung von Variablen mit der POST-Methode, hier noch ein Code-Schnipsel:

webReq.Method = "POST";
webReq.ContentType = "application/x-www-form-urlencoded";
// Variablen zusammenbauen und in Byte-Array wandeln um es auf den Stream schreiben zu können
var postData = "variable1=val1&variable2=val2";
var postBytes = Encoding.UTF8.GetBytes(postData);
// Länge der Daten mitgeben und diese nun auf den Stream schreiben
webReq.ContentLength = postBytes.Length;
var stream = webReq.GetRequestStream();
stream.Write(bytes, 0, bytes.Length);
// Request abschicken und Antwort auswerten (wie bei GET-Methode)
try {
  // Beim GetResponse() fliegen die Fehlermeldungen, die der Server zurückgibt, wie 404 (Datei nicht gefunden) oder 401 (Nicht Authentifiziert)
  var webRes = (HttpWebResponse)webReq.GetResponse();
  // und nun den Stream lesen
  using (var streamer = webReq.GetResponseStream()) {
    // Hier kann man nun anhand von webRes.ContentType unterschiedlich die Daten verarbeitetn, z.B.: bei "text/xml" mit einem (new XmlDocument()).Load(streamer); alles in ein Xml-Objekt packen
  }
}
catch (WebException exc) {
  // Exceptions verarbeiten
}

Dann gibt es aber noch die Probleme mit den Anmeldungen an dem WebServer, die mit folgenden Quellcode-Stücken gelöst werden können:

// Um die aktuelle Anmeldung zu benutzen (Häufig im Intranet möglich)
request.UseDefaultCredentials = true;
// Für eine explizite Netzwerkidentifikation (Via Domain)
request.Credentials = new NetworkCredential("username", "password");
// Für eine HTTP-Authentifizierung (Wird häufig via .htaccess parametriert)
var auth = Encoding.UTF8.GetBytes("user:password");
request.Headers["Authorization"] = "Basic " + Convert.ToBase64String(auth);
// Und ein Übel gibt es noch, wenn man einen Server besitzt der zwar mit SSL-Zertifikaten ausgestattet ist, aber
// keine Root-Zertifikate besitzt, kann mit nachfolgenden Code, mit diesen Server trotzdem reden:
ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };
// Wobei hier zu bedenken ist, dass nun alle Zertifikate angenommen werden, man könnte hier noch eine passende Prüfung einbauen

Wenn Dateien an einen Website hochgeladen werden sollen, wird das ganze etwas schwieriger, daher habe ich dafür eine Klasse gebaut, die man unter nachfolgenden Link herunterladen kann: HttpFileUploader.
Hier noch eine Beispiel-Verwendung:

// Objekt erstellen
var fileUploader = new HttpFileUploader("http://example.com/upload");
// Parameter setzten
fileUploader.SetParam("LastModifiedSource", DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss"));
fileUploader.SetParam("Name", "ExampleName");
fileUploader.SetParam("Designation", "ExampleDesignation");
// XML-Datei setzten
var xmlfile = System.Text.Encoding.Unicode.GetBytes(xmlString);
fileUploader.SetFile("xmlfile", "xmlfile.xml", xmlfile, "text/xml");
// Bild setzen
fileUploader.SetFile("picture", "picture.png", pictureBytes, "image/png");
// Upload durchfuehren
var ret = fileUploader.SendRequest();

WordPress TinyMCE wieder aktivieren

Seit dem ich Markdown ausprobiert hatte, funktionierte mein TinyMCE-Editor nicht mehr. Nach langen suchen hab ich auch nicht wirklich was gefunden, immer nur Links auf TinyMCE Advanced Plugin.

Daher dachte ich, das ich mir das alte Plugin wieder suchen müsste, diese installieren und dann durch erneutes deaktivieren der TinyMCE wieder erscheint. Dabei bin ich dann aber auf des Rätsels Lösung gestoßen.

Ich musste das alte Plugin nicht installieren, sondern in meinen Profil, ist die erste Option wenn diese gesetzt ist, zum deaktivieren des TinyMCE vorhanden. Nach dem ich den Haken wieder entfernt habe, erscheint nun endlich der TinyMCE-Editor weider *freu*.

Umbau des Blogs

Guten Tag Leser

Der Blog wird aktuell umgebaut.

Zuerst wird ein Strukturierender Umbau durchgeführt. Alles was als KnowHow gehandelt wird, wird ab sofort in die Wissensdatenbank eingetragen, damit die Artikel einfach zu finden sind. In den Standard-Blog kommen dann noch Eintrage die mehr an Meldungen erinnern.

Nachfolgend wird noch ein neuer Style auf HTML5 und CSS3 kommen wird, da dieser nicht gekauft wird, sondern von mir selbst gebaut wird, dauert dies noch etwas bis er komplett funktionstüchtig ist und für alle aktiviert wird.

Mfg MDN

CSS und seine Vielfalt

Da ich mich nun in der Arbeit wieder mehr mit Webseiten beschäftigen muss, bin ich zurzeit auf viele gute Webseiten zu CSS und HTML gefunden. Als interessantes fand ich folgenden URL: Sprite-Grafik / Webstandard. Solche Menus kenne ich nur per JavaScript, welches ich ungern einsetze, aber jetzt weiß ich auch wie es per CSS geht. Dies werde ich woll merken und in meine Nächsten Templates einbauen :-).

Nachfolgende URLs sind ebenfalls noch zu nennen:

Akismet-Plugin in Deutschland verwenden

Durch Suche für Custom Post Types bin ich auf folgenden Artikel gestoßen: Hinweise zum Datenschutz beim Einsatz von Akismet in Deutschland.

Da ich bis jetzt nur gute Arbeit vom Akismet kenne, und das Plugin nicht deaktiveren möchte habe ich mich dazu entschieden das Plugin „Akismet Privacy Policies“ zu aktivieren, wodurch jetzt an jeder möglichen Stelle für Kommentar die Checkboxen erscheint, aber leider geht es nicht anders.

WordPress Syntaxhighlighting mit Leerraum am Anfang

Ich hab seit langer Zeit das Plugin „SyntaxHighlighter Plus“ verwendet, um meine Quellen farblich anzuzeigen. Bei einfachen Quellen war dies noch einfach und ohne Probleme, es wurde einfach mit [ Sprachkennung ] begonnen und mit [ /Sprachkennung ] beendet.

Probleme gab es aber immer dann, wenn es längere Quellen waren, die auch Einrückungen hatten. Entweder man hat diese in der Visuell-Ansicht angegeben, dann sind nach jedem speichern die mühsam erzeugten Einrückungen wieder entfernt gewesen. Hat man das ganze in einen Quote-Block gesetzt, so wurde nichts gelöscht, aber es wurden die Tags nicht erkannt, wodurch die Quellen nicht farblich geschaltet wurden

Oder man musste in die HTML-Ansicht wechseln, und dort die Quellen einfügen. Nach dem Speichern und erneuten editieren, sind aber dort dann bekannte HTML-Zeichen durch ihre Textersetzungen ersetzt worden. Das Problem war dann aber, das das kaufmännische Und bei jedem Speichern ersetzt wurde. Was bedeutet, der erste Wurf musste sitzen.

Endlich fand ich dann folgenden 2 Plugins, welche die alte Funktionalität unterstützten und sehr einfach gehalten wurden:

  • SyntaxHighlighter Evolved
  • SyntaxHighlighter TinyMCE Button

So existieren nun 2 Buttons im TinyMCE-Editor, durch denen Quote-Blöcke eingefügt werden, die zeitgleich eine Sprachkennung besitzen, um die Quellen farblich zu gestalten. Und durch den Quote-Block, gehen auch keine Einrückungen mehr verloren. Was ebenfalls sehr interessant ist, es gibt die Möglichkeit, in den Kommentaren das Syntaxhighlighting zu aktivieren.

Einzige einige Einstellungen musste ich noch im Evolved vornehmen, damit es wieder so aussah wie im alten und das waren folgende:

  • Hightlighter Version auf 2.x gestellt, dadurch funktioniert wieder der Zeilenumbruch, sowie die 4 Buttons werden dargestellt
  • „Load all Brushes“ muss aktiviert werden, damit es überhaupt funktioniert
  • „Wrap long lines“ muss aktiviert werden, damit der Zeilenumbruch funktioniert

[Update]Nachgehend habe ich doch noch ein anderes Plugin gefunden, mit dem Namen „WP SyntaxHighlighter“, welches die oberen 2 in einem vereint und noch etwas zusätzliche Funktionalität hinzufügt. Der einzige Nachteil ist, das die alte []-Tags nicht mehr erkannt werden, wodurch einige älter Blogs nochmal überarbeitet werden mussten.

Als zusätzliche Funktionalität existiert die Möglichkeit in Kommentaren SyntaxHighlighting zu setzten. [/Update]

C# Dienst mit eigener Installationsroutine (per /i)

Nach langer suche und vielen Zusammenstückeln, habe ich nun endlich ein komplettes Paket um einen Dienst die Möglichkeit zu implementieren sich selbst per Kommandozeilenparameter zu installieren.

Ebenso wird zeitgleich eine Konsolenausgabe mit implementiert. Das einzige Problem hier ist, solange der Projekt-Typ nach Standard auf „Windows Anwendung“ steht, funktionieren das Attachen nicht ganz komplikationslos, da die Anwendung in der Konsole direkt zurückkehrt ohne aufs Ende des Prozesses zu warten. Um diese Problem wegzubekommen, muss der Projekt-Typ auf „Konsolen Anwendung“ umgestellt werden.

Dieser Quellcode hat einen großen Vorteil gegenüber anderen die noch vorhanden sind, da hier beim installieren und deinstallieren das gleiche durchgeführt wird, was auch das InstallUtil Programm durchführt. Daher kann das Array welches bei Install und Deinstall übergeben wird, entsprechend der Parameter die am InstallUtil vorhanden sind erweitert werden.

(Vorne weg noch ein kleiner Tip, sollte die using-Direktive zu einer Klasse fehlen und die Klasse wurde richtig geschrieben, dann kann per [Strg]+[.] die Direktive automatisch ermittelt und hinzugefügt werden. Für den Fall das ich welche vergessen habe.)

Zuerst einmal die Konstanten und die Imports, welche innerhalb der „static class Program“ eingefügt werden müssen:

const uint ATTACH_PARENT_PROCESS = 0x0ffffffff;
const int ERROR_ACCESS_DENIED = 5; // Process ist schon attached von einer anderen Konsole
[DllImport("kernel32", SetLastError = true)]
static extern bool AllocConsole();
[DllImport("kernel32", SetLastError = true)]
static extern bool FreeConsole();
[DllImport("kernel32", SetLastError = true)]
static extern bool AttachConsole(uint dwProcessID);

Die Main-Prozedur (der noch der Paramter „string[] args“ hinzugefügt werden muss, wenn nicht vorhanden) muss nun folgender weise erweitert werden:

ServiceBase[] ServicesToRun;
ServicesToRun = new ServiceBase[] { new MyNewService() };
if (System.Environment.UserInteractive)
{
  if(!AttachConsole(ATTACH_PARENT_PROCESS) || Marshal.GetLastWin32Error() == ERROR_ACCESS_DENIED)
    AllocConsole();
  // Uebergabe Parameter
  bool install = false;
  bool uninstall = false;
  bool debug = false;
  string value = "";
  int pos = -1;
  for (int i = 0; i < args.Length; i++)
  {
    var arg = args[i];
    value = "";
    pos = arg.IndexOf('=');
    if (pos > 0)
    {
      value = arg.Substring(pos + 1);
      arg = arg.Substring(0, pos);
    }
    switch(arg.ToLower())
    {
      case "/i": install = true; break;
      case "/u": uninstall = true; break;
      case "/c": debug = true; break;
      case "/account": /*Account-Typ aus der Variable value speichern*/ break;
      case "/user": /*Benutzer aus der Variable value speichern*/ break;
      case "/passwd": /*Passwort aus der Variable value speichern*/ break;
      default:
        Console.WriteLine("Argument nicht verstanden: {0}", arg);
        break;
    }
  }
  try
  {
    if (install)
    {
      var combArgs = new string[] { Assembly.GetExecutingAssembly().Location };
      System.Configuration.Install
        .ManagedInstallerClass.InstallHelper(combArgs);
    }
    else if (uninstall)
    {
      var combArgs = new string[] { "/u", Assembly.GetExecutingAssembly().Location };
      System.Configuration.Install
        .ManagedInstallerClass.InstallHelper(combArgs);
    }
    else if (debug)
    {
      var svc = ServicesToRun[0] as MyNewService;
      svc.OnStartDebug(args);
      Console.WriteLine("[Return] fürs beenden drücken...");
      Console.ReadLine();
      svc.OnStopDebug();
    }
  }
  catch (Exception exc)
  {
    Console.WriteLine(exc.Message);
  }
  // Konsole wieder freigeben
  FreeConsole();
}
else
{
  // Wenn das Programm nicht ueber die Konsole gestartet wurde dann als Dienst starten lassen
  ServiceBase.Run(ServicesToRun);
}

Zusätzlich müssen die 2 Funktionen (OnStartDebug/OnStopDebug) angelegt werden, die einzig die gleichnamigen (ohne Debug am Ende) protected Methoden aufrufen, wenn der Debug-Modus gewünscht ist. Wenn nicht, dann einfach diesen Teil aus den obigen Quellcode entfernen.