Software versionieren

Semantic Versioning 2.0.0

MAJOR.MINOR.PATCH

Eigentlich wollte ich einen kurzen knappen Beitrag darüber schreiben wie man Software am besten versioniert. Nach kurzer Überlegung fiel mir aber sehr schnell SemVer ein, ein Verfahren das sich eigentlich perfekt durchgesetzt hat aber noch nicht einmal im deutschsprachigen Wikipedia-Artikel Einklang findet außer einen Link.

https://semver.org/lang/de/

Da SemVer ein gutes und sinnvolles Verfahren ist gehe ich hier auch gar nicht mehr weiter auf Versionierung ein.

 

Markdown – eine Möglichkeit eBooks auszuzeichnen

Wie erstellt man eigene eBooks? Markdown? LaTex?

Dokumentenstatus: – in Entwicklung –
Stand: 13/01/2019

Als erstes mal  den Wikipedia-Artikel  lesen. Kurz gesagt ist Markdown eine Aufzeichnungssprache wie z.B HTML mit einem gewaltigen Vorteil: Markdown kann man auch ohne irgend einem Anzeigeprogramm mit einem ganz üblichen Editor wie vim, nano oder Notepad lesen. Dieses Format lässt sich nahezu in jedes beliebige Format übersetzen. Ich erstelle und Compiliere Markdown Dateien mit folgenden

Programmpaketen:

  • Editor: vim und texmaker sowie LyX
  • Parser: pandoc

Der allergrößte Vorteil von Markdown besteht tatsächlich darin das man es auch problemlos im reinen Textformat leicht lesen kann ohne irgend welche zusätzlichen Programme.


Linksammlung:

C – int in String umwandeln

C-Bibliothek (int2str)

Stand: 01/06/2018

bei ncurses bin  ich einmal auf ein Problem gestoßen das mvprintw() einen Pointer auf char-Array (int printw(const char *fmt, …) erwartet. Ich hatte aber nur Zahlen die dargestellt werden sollten. Es musste also eine Funktion her die den int in einen String, Char oder Array  umwandelt. Ein itoa() ist ja nicht immer verfügbar. Hier meine eigene Implementation, das sie nicht unbedingt die schnellste ist leuchtet ein aber es geht mir hier eher um die Vorgehensweise:

 

#include <stdlib.h>
#define ASCII_SHIFT 48

/**
 * Wandelt einen int in *char um
 *
 * @param i als Integer
 * @return unsigned *char
 */
unsigned char *int2str(int i) {
  unsigned char *str;
  int len, tmp, c;

  /* Platz schaffen fuer negatives Vorzeichen falls i negativ ist */
  len = (i < 0) ? 2 : 1;

  /* berechnen wieviele Zeichen benötigt werden */
  for (tmp = i; tmp != 0; tmp /= 10) {
    len++;
  }

  /* Unbedingt an der Stelle an der aufgerufen wird den Speicher wieder
   * freigeben! */
  str = malloc(sizeof (char) * len);

  /* Den gesamten String füllen
   * Ohne Fuellen habe ich am ende des Strings immer undefinierte Zeichen */
  for (tmp = 0; tmp <= len; tmp++) {
    str[tmp] = '\0';
  }

  /* Ein Zeichen zurueckspringen, letztes Zeichen ist bereits
   *  0-terminiert */
  len--;

  /* Übergebene Zahl ist negativ?*/
  if (i < 0) {
    str[0] = '-';
  }

  /* Ist die übergebene Zahl etwa eine 0? 
   * Wenn ja nur eine 0 einfuegen an erster Stelle.
   */
  if (i == 0) {
    str[0] = '0';
  } else {
    /* Die Zahlen in Zeichen umwandeln */
    for (tmp = i, len--; tmp != 0;) {
      c = (tmp >= 0) ? (tmp % 10) : (tmp % 10) * -1;
      str[len--] = (char) (c + ASCII_SHIFT);
      tmp /= 10;
    }
  }
  return str;
}

Wichtig ist hier das man den Speicherplatz mit free() wieder freigibt der mit malloc reserviert wurde! Wenn jemand Verbesserungsvorschläge hat dann bitte her damit.

Alternativ kann man das ganze natürlich auch mit sprintf() machen.

 

CodeBlocks auf deutsch umstellen

Code:Blocks auf deutsch umstellen
(Debian und Derivate)

Stand: 29/04/2018

Ganz kurz in eigener Sache: eigentlich sollte man als Programmierer nicht unbedingt eine IDE in seine Landessprache stellen und in Englisch arbeiten. Ich habe es manchmal aber dennoch ganz gerne und so stieß ich irgendwie auf dieses kleine aber kniffelige Problem.

Die Original Wiki zu Codeblocks [1] lässt sich da nicht so ganz eindeutig aus und bezieht sich da irgendwie auf Windows etc. Die Anleitung dort lässt sich zumindest nicht eindeutig auf Debian umsetzen.

Zuerst muss man sich die bereits übersetze .mo Datei besorgen. Ich habe die gesuchte .mo Datei auf dem FTP-Server geladen  [2] und das Original findet man hier [3]. Je nachdem wann Du das hier ließt, wäre es sicherlich besser wenn Du dir eine neuere Version besorgst.

Anschließend wird diese Datei nach
/usr/share/codeblocks/locale/de_DE kopiert. Sollten die letzten beiden Verzeichnisse nicht vorhanden sein, müssen diese natürlich erstellt werden. Dieser Pfad ist bei mir unter Debian 9 so, Codeblocks wurde über atp installiert.

 

 

Zum Schluss muss Codeblocks gestartet werden und unter Settings -> Environment -> View finden sich im oberen Bereich Kontrollkästchen die anzuwählen sind. In Anschluss nur noch die Sprache Auswählen und Codeblocks neu starten.
 

 


[1] – http://wiki.codeblocks.org
[2] – ftp://ionivation.com/pub/codeblocks.mo
[3] – https://translations.launchpad.net

Java-Preferences-API

Einführung in die Java-Preferences-API der java.util.prefs.Preferences Klasse

Stand: 09/02/2018 – Version 0.2
< zurück zur Java-Programmierung-Übersicht >

Dieser Artikel basiert in der ersten Version auf eigenen Gedanken und dieser Quelle[1]. Oft ist es notwendig bestimmte Angaben eines Programms dauerhaft zu speichern. Diese Angaben stellen die grundlegendsten Einstellungen dar wie z.B welche Datenbank soll beim Programmstart verwendet werden. Alle weiteren Einstellungen könnte man aus der Datenbank laden doch hier geht es um die absoluten Basisdaten.

Grundsätzlich ist es ja bei den ersten Gedanken überhaupt kein Problem solche Angaben zu speichern, da gibt es viele Möglichkeiten. Zum einen einfach in eine Testdatei schreiben oder die alte Properties aus java.util.Properties[2]. Problematisch wird das ganze erst wenn wir uns Plattform-übergreifend bewegen. Hier beschäftigen wir uns aber erst einmal rein mit der java.util.prefs.Preferences [3] Klasse.

Die Preferences Klasse geht bei dem ganzen noch einen Schritt weiter, wir müssen uns als Entwickler gar nicht mehr darum kümmern wo diese Daten gespeichert werden, das erledigt für uns das jeweilige Betriebssystem. Unter Linux liegt es im ~/.java/ Verzeichnis und unter Windows je nach Version im Dokumenten-Ordner, Appdata oder auch der Registry. Dazu später mehr.

Von der o.g Quelle hole ich mal den dort vorliegenden Quelltext, übersetze die Kommentare und arbeite das ganze etwas auf. Zum Schluss gibt es das ganze fertig zum Download und zum ausprobieren. Jetzt eber erst einmal den original Quelltext:

import java.util.prefs.Preferences;

public class PreferenceTest {
  
    private Preferences prefs;

    public void setPreference()
    { 
        prefs = Preferences.userRoot().node("/data");
        
        String ID1 = "Test1";
        String ID2 = "Test2";
        String ID3 = "Test3";

        System.out.println(prefs.getBoolean(ID1, true));
        System.out.println(prefs.get(ID2, "Hello World"));
        System.out.println(prefs.getInt(ID3, 50));

        prefs.putBoolean(ID1, false);
        prefs.put(ID2, "Hello Europa");
        prefs.putInt(ID3, 45);

        prefs.remove(ID1);
    }

    public static void main(String[] args)
    {
        PreferenceTest test = new PreferenceTest();
        test.setPreference();
    }
}

Was passiert hier nun also?
Ich habe bewusst die Kommentare aus dem Code herausgelassen und hole es hier nun nach. Also:

Zeile 10:

Definieren wir einen „node“, wo die Daten gespeichert werden können. Es gibt da mehrere Möglichkeiten. Hier einfach nur als String in Form eines Pfades. Schau Dir die Klasse im javadoc [3] genauer an, es gibt noch andere Möglichkeiten die nodes zu definieren.

Der überwiegende Teil bezieht sich auf die Nutzerrechte. Globale und lokale Konfiguration als Stichwort.

Zeile 15-17:

Wir laden Werte testweise aus einer eventuell vorhandenen Konfiguration mit der Methode .get diese läd die Daten in eine Variable. Hinter dem Kommata können default-Werte eingetragen werden falls es die Daten oder den ganzen node nicht gibt.

Zeile 19-21:

Hier speichern wir die aktuellen Werte aus den Variablen in unsere Konfiguration.

Zeile 23:

Hier löschen wir testweise einen Wert aus dem node.

Wo werden die Daten gespeichert?

Genau das ist nun der Trick an der ganzen Sache. Wir müssen uns eben nicht darum kümmern WO diese Daten gespeichert werden. Überlassen wir das dem Betriebssystem wo der Container ausgeführt wird. Wie dies allerdings unter Windows und Ubuntu aussieht zeige ich eben an zwei Screenshots.

Ja genau, ein und der gleiche Code aber unter Linux wird dies unter ~/home/.java/.userPrefs/data/prefs.xml gespeichert und unter Windows in der Registry im Zweig HKEY_CURRENT_USER -> Software -> JavaSoft -> Prefs -> data

Wo dies genau gespeichert wird legen in Zeile 9 fest. Es lässt sich auch definieren das dies im System Zweig der Registry oder /etc/.java unter Linux gespeichert wird. Dazu muss der Container allerdings als Administrator oder root gestartet werden. Ich nehme an es ist verständlich worum es geht.

Eine komplette Liste, wo auf welchem System die nodes gespeichert werden, liefere ich nach aber dies sollte für Dich als Entwickler allerdings zweitrangig sein.

— Fortsetzung folgt …

Achja, ein Tipp am rande. Viele Anfänger tendieren dazu darauf zu bestehen das ihre Daten relativ zum Container gespeichert werden. Am besten in einem Unterverzeichnis unterhalb des Containers. Geht bitte davon ab, das ist nicht wirklich sinnvoll. Stellt euch vor jemand möchte euer Programm an einer globalen Stelle für alle Benutzer installieren. An dieser Stelle hätte der Benutzer der das Programm ausführt gar keine Schreibrechte. Für diesen Einsatz wäre also euer Programm unbrauchbar. Falls es wirklich unbedingt nötig sein sollte, musst Du Dir die Klasse java.util.Properties [2] anschauen die allerdings schon ein paar Jahre auf dem Buckel hat. Dazu gibt es bald noch einen eigenen Beitrag.

Du hast Fragen zur java.util.prefs.Preferences Klasse, Anmerkungen oder bist völlig anderer Meinung? Teile es bitte hier im Forum  mit.


Quellen:

  1.  http://www.vogella.com/tutorials/JavaPreferences/article.html
  2. https://docs.oracle.com/javase/7/docs/api/java/util/Properties.html
    https://docs.oracle.com/javase/8/docs/api/java/util/Properties.html
  3. https://docs.oracle.com/javase/8/docs/api/java/util/prefs/Preferences.html

 

 

 

Netbeans – Konsole

Integrierte Konsole/ Shell von Netbeans

Netbeans 8.2 – Stand 02/2018
<zurück zur Hauptseite – Netbeans >

Netbeans besitzt eine eigene Konsole die man schnell aufrufen kann. Unter Dateien (Bild 1) wählt man einen Pfad und anschließend unter „Extras“ -> „Open in Terminal„.

Ich verwende hier in diesem Beispiel die deutschsprachige Version direkt von Oracle. In der Englischen Version kann der Weg lauten: „IDE Tools“ -> „Terminal„. Den sich öffnenden Reiter kann man anschließend überall hinziehen, wo man ihn gerade braucht. Sinnvoll wäre es im unteren Bereich, wo auch die Ausgabe erfolgt bei einem RUN, oder auch im Editor-Bereich.

<zurück zur Hauptseite – Netbeans >


Du hast Fragen zu Netbeans? Gerne beantworte ich oder andere diese im IDE-FORUM 

Mono (C#)

Enwicklung mit C# oder eben Mono …

Version: 07/12/2017

[ Enwicklerseite ]

Was ist mono? Ganz einfach, Wikibeitrag lesen aber kurz und bündig auf den Punkt gebracht reicht ein einziges Zitat aus der Wiki:

Mit Mono ist es möglich, Programme, welche für die Microsoft-.NET-Umgebung erstellt wurden, auch ohne Neuübersetzung unter unixähnlichen Betriebssystemen auszuführen.

Der Satz der in der Wiki darauf folgt ist natürlich Unsinn den der Vorteil ist nicht den Komfort bei der Entwicklung sondern einzig und allein die Platzformunabhängigkeit! Mit unixähnlich ist gewöhnlich alles was nicht Windows ist, bis auf Ausnahmen die in der Hausanwendung uninteressant sind, gemeint.

Wieso ist das für mich interessant? Ganz einfach, da es eine ernsthafte Alternative zu Java ist. Vieleicht hat es auch die Nachteile aber auf den ersten Blick erkenne ich das aktuell viele Spiele und Handyapplikationen mit C# entwickelt werden. Die Game-Engine Unity [1] – [2] gibt es nun schon seit längerem für Linux und da bietet es sich doch an auch als Laie etwas genauer hin zuschauen. Den Umstand von Mono und Unity haben wir aktuell viele Spielportierungen auf Steam zu verdanken.

Ich habe einen interessanten Artikel in der Online Ausgabe des Linux Magazin entdeckt, dieser lautet „C#-Entwicklung unter Linux“ und ist bereits von 2008 aber klingt wirklich vielversprechend.

Diskussionen und Anregungen dazu bitte auf G+


[ 1 ] – https://unity3d.com/de
[ 2 ] – https://de.wikipedia.org/wiki/Unity_(Spiel-Engine)

ECPLIPSE: Dateien umbenennen

Verschieben, Umbenennen und Löschen von Dateien. Umbenennen einzelner Dateien oder des ganzen Projekts.
Version: 2 – 06/01/2018

Wenn man in Eclipse automatisch ein Working-Set sowie ein neues Projekt erstellt hat, werden einzelne Dateien nicht immer so benannt wie man es gerne hätte. Dateien im Dateimanager einfach umbenennen wirkt sich sehr fatal aus den Eclipse wird sie gar nicht mehr anzeigen. Selbst ein Importieren einzelner Dateien stellt sich als kleiner Hürdenlauf dar.

In Eclipse ist das Werkzeug zum z.B umbenennen versteckt unter dem Menüpunkt „Datei -> Refactoring„. Noch einfacher mit einem Rechtsklick auf die gewünschte Datei und „Refactoring„. In der Englischen Originalversion nennt sich der Punkt „Refactor“ und „Rename„.

Datei in Eclipse umbenennen.

Möchte man nur eine Klassendatei umbenennen geht das sogar noch einfacher. Einfach die entsprechende Klasse umbenennen, anschließend wird dies als Fehler erkannt und im Hilfe-Tooltipp wird angeboten die Datei nach der Klasse zu benennen.

 

Noch Fragen zu diesen oder ähnlichen Themen?
Diskussion zum Beitrag hier 

JAVA: getText String in int umwandeln

Java-Typumwandlung

Type-Casting mit primitiven Datentypen

Folgendes kleine Problem: Wenn man mit text = textfeld.getText() den Inhalt eines Textfeldes abfragt, wird das Ergebnis in text als String zurückgegeben. Möchte man damit Berechnungen vornehmen funktioniert dies natürlich nicht.

Die Klasse Integer aus java.lang.Integer kann sehr schön einen String in int umwandeln mit zahl = Integer.parseInt(text);

Vor einem textfeld.setText( ergebniss ) muss man die Zahl natürlich wieder in einen String umwandeln. Dies kann sehr gut mit ergebniss = String.valueOf( zahl ); bewerkstelligt werden.

Codebeispiel:

String txt1 = textField1.getText();
String txt2 = textField2.getText();

int zahl1 = 0;
int zahl2 = 0;
int zahl3 = 0;
String ergebniss = "";

try{
    zahl1 = Integer.parseInt(txt1);
    zahl2 = Integer.parseInt(txt2);
    
    zahl3 = zahl1 + zahl2;
    
    ergebniss = String.valueOf( zahl3 );
    
}catch(NumberFormatException ex){
    //Fehlerbehandlung wenn es sich nicht um Zahlen handelt.

}
    
textField3.setText( ergebniss );

Noch fragen oder Anregunden?
Diskussion hier 

JAVA: .jar direkt ausführbar machen

Thema: Linux – Java – Windows – .jar

Normalerweise wird ein Java-Programm das zu einem .jar Archiv geschnürt ist folgender maßen ausgeführt: java -jar dateiname.jar Manchmal möchte man ein .jar Paket direkt ausführbar machen. Damit spart man sich ein shell Startskript das zB so aussehen könnte:

#!/bin/bash
"$JAVA_HOME"/bin/java -jar /pfad/zum/paket/programm.jar

Befindet sich das Startskript im gleichen Verzeichnis wie das programm.jar spart man sich den Pfad und ersetzt diesen gegen ./

Oft sieht man  java-Programme die man als solche gar nicht mehr erkennt oder mit der Endung .run

Solche Konstrukte stellt man wie folgt her:
Man nehme folgende Shellscript und speichert es als stub.sh

#!/bin/sh
MYSELF=`which "$0" 2>/dev/null`
[ $? -gt 0 -a -f "$0" ] && MYSELF="./$0"
java=java
if test -n "$JAVA_HOME"; then
    java="$JAVA_HOME/bin/java"
fi
exec "$java" $java_args -jar $MYSELF "$@"
exit 1

Anschließend kopiert man es in das gleiche Verzeichnis wie die .jar Datei, mache sie mit chmod +x deine.jar ausführbar und führe folgendes aus:

cat stub.sh deine.jar > dein_programm.run

Nun hast Du eine Datei namens dein_programm.run, dieses kannst Du wiederum mit chmod -x dein_programm.run ausführbar machen.

Jetzt wurde das Shellskript sowie die Java .jar zu einer Datei zusammengefügt und lässt sich problemlos starten. Es wird als Shellskript erkannt und lässt sich auch mit Doppelklick starten.

Für Windows gibt es dafür auch einen angeblich gut funktionierenden Wrapper Launch4j den ich allerdings nie selbst ausprobiert habe.

Viel Erfolg!