C++Guns – RoboBlog blogging the bot

26.07.2014

Fortran Speicherverbraucht ermitteln

Filed under: Allgemein — Tags: , — Thomas @ 13:07

Wieviel Speicher verbraucht mein Programm? Die Frage ist nicht so einfach zu beantworten, denn es gibt kein Funktionsaufruf in C der bei jedem Compiler und jedem *unix funktioniert. Nach vielen googlen habe ich herausgefunden, dass es wohl am besten ist, die entsprechenden Datein in /proc zu parsen.

In /proc/self/status steht unter anderem auch der Speicherverbraucht dinne. Man kann auch /proc/self/statsm parsen, wenn man Lust hat.

kater@mintux:~$ gfortran -Wall -o procstat procstatus.F90
kater@mintux:~$ ./a.out 
 VM size:        43044  kB

Das komplette Programm ist im Anhang.
procstatus.F90

24.07.2014

Welcher Code ist "schöner" ? ;)

Filed under: Allgemein — Tags: , — Thomas @ 14:07

Kurzes Programm, welches überpüft ob der Benutzer eine Variable "resolution" definiert hat. Wenn ja, wird versucht die Benutzereingabe in eine Zahl umzuwandeln. Wenn nein, wird ein default Wert von 1 angenommen.

Variante 1:


const QString resolution = options().text("resolution");
bool userResolution = false;
// check if user defined cellsize
qreal newCellSize = 1;
if(!resolution.isEmpty()) {            
  userResolution = true;
  bool ok;
  const qreal userCellSize = resolution.toDouble(&ok);
  if(ok) {
    newCellSize = userCellSize;
  }
  else {
    qDebug() << "Cant parse user defined resolution:" << resolution;
  }
}

Die Variable userResoltion ist nicht als const declariert und könnte überschrieben werden. Machen wir sie read-only!

Variante 2:


const QString resolution = options().text("resolution");
const bool userResolution = !resolution.isEmpty();
// check if user defined cellsize
qreal newCellSize = 1;
if(!resolution.isEmpty()) {            
  bool ok;
  const qreal userCellSize = resolution.toDouble(&ok);
  if(ok) {
    newCellSize = userCellSize;
  }
  else {
    qDebug() << "Cant parse user defined resolution:" << resolution;
  }
}

Der Code sieht noch etwas aufgebläht aus. Trennen wir den normalen Programm Path und den Error Path, der durchlaufen wird, wenn die Benutzereingabe ungültig ist.

Variante 3:


qreal toDouble(const QString& s) throw(Exception) {
    bool ok;
    qreal x = s.toDouble(&ok);
    if(!ok)
        throw Exception("Cant convert to double" + s);
    return x;
}

...

const QString resolution = options().text("resolution");
const bool userResolution = !resolution.isEmpty();
// check if user defined cellsize
qreal newCellSize;
try {
      newCellSize = toDouble(resolution);
}catch(...) {
      newCellSize = 1.0;
      if(!resolution.isEmpty())
           qDebug() << "Cant parse user defined resolution:" << resolution;
}

Nun möchten wir die Variable newCellSize auch noch read-only haben, da sie ein Parameter ist und niemals mehr geändert werden darf. Dafür lagern wir nun die komplette Logik für das Parser der Benutzereingabe in eine Funktion aus.

Variante 4:


qreal toDouble(const QString& s, qreal defaultValue = 0.0) {
    if(s.isEmpty())
        return defaultValue;

    bool ok;
    qreal x = s.toDouble(&ok);
    if(!ok) {
        qDebug() << "Cant convert to double" + s;
        return defaultValue;
    }
    return x;
}

...

const QString resolution = options().text("resolution");
const bool userResolution = !resolution.isEmpty();
// check if user defined cellsize
const qreal newCellSize = toDouble(resolution, 1.0);

Der wesentliche Code ist jetzt nur noch 4 Zeilen lang, statt 15 Zeilen.
Er ist auf das wesentliche reduziert, verständlicher und gegen das versehentliche überschreiben der Variablen geschützt.
Nachteile gibt es allerdings auch. Die Fehlermeldung wenn das Konvertieren fehl schläng ist nicht anpassbar. Mit einem zustäzlichen Funktionsargument könnte man das aber nachbessern.

23.07.2014

SSH Tunnels

Filed under: Allgemein — Tags: — Thomas @ 14:07

local$ ssh -4 -p PORT -N -L 8000:192.168.210.102:80 user@ite

Nette Sache Das! SSH bindet aber leider keine Ports an 0.0.0.0 da muss man mit netcat etwas nachhelfen
01.2018 Update: Doch das geht. Man muss nur 0.0.0.0: vorne dran setzen. Für IPv4 natürlich.
02.2019 Update2: Für IPv4 die -4 nicht vergessen. Sonst bind [::1]:10000: Cannot assign requested address

Old:
local$ ssh -p PORT -L 1391:192.168.210:41:139 user@ite -N
local$ netcat -l -p 139 -c "netcat 127.0.0.1 1391"

Mit 445 genauso.

Powered by WordPress