C++Guns – RoboBlog blogging the bot

02.01.2014

How to build a mind

Filed under: Allgemein — Thomas @ 12:01
How to build a mind

How to build a mind

27.12.2013

Beste Nachricht 2013 - OpenSSL mit kaputter Hintertür

Filed under: Allgemein — Thomas @ 10:12

Ich lach mich tot:

http://www.heise.de/newsticker/meldung/OpenSSL-mit-kaputter-Hintertuer-2072370.html

Die Open-Source-Bibliothek für Krypto-Funktionen OpenSSL enthält auch eine Implementierung des Pseudo-Zufallszahlen-Generators "Dual EC DRBG" – das ist der mit der NSA-Backdoor. Dummerweise enthielt diese Implementierung einen Fehler, der dazu führt, dass die Funktion keine Zufallszahlen ausspuckt, sondern nur einen Fehler. Der Generator hat also über Jahre hinweg nie funktioniert – und niemand hat es gemerkt, weil niemand ihn verwendet hat.

http://www.wired.com/politics/security/commentary/securitymatters/2007/11/securitymatters_1115

This is how it works: There are a bunch of constants -- fixed numbers -- in the standard used to define the algorithm's elliptic curve. These constants are listed in Appendix A of the NIST publication, but nowhere is it explained where they came from.

What Shumow and Ferguson showed is that these numbers have a relationship with a second, secret set of numbers that can act as a kind of skeleton key. If you know the secret numbers, you can predict the output of the random-number generator after collecting just 32 bytes of its output. To put that in real terms, you only need to monitor one TLS internet encryption connection in order to crack the security of that protocol. If you know the secret numbers, you can completely break any instantiation of Dual_EC_DRBG.

25.10.2013

digitaler Kreis

Filed under: Allgemein — Thomas @ 16:10

Wie mancht man aus einem kontinuierlichen Kreis einen stetigen?


int offset = 10;

void resetFont() {
    if (isatty (fileno (stdout)))
        std::cout << "\e[0m";
}

void setFontRed() {
    if (isatty (fileno (stdout)))
        std::cout << "\e[1;31m";
}

void setFontGreen() {
    if (isatty (fileno (stdout)))
        std::cout << "\e[32m";
}

void setFontYellow() {
    if (isatty (fileno (stdout)))
        std::cout << "\e[33m";
}

void setFontBlue() {
    if (isatty (fileno (stdout)))
        std::cout << "\e[34m";
}

void setFont() {
    if (isatty (fileno (stdout)))
        std::cout << "\e[35m";
}

void gotoxy(int x,int y)
{
  printf("%c[%d;%df",0x1B,y,x);
}

void makeCircle(int radius, char c) {
  if(radius == 0) {
    gotoxy(offset, offset);
      cout << c;
  }
  else {
    int num = (radius+1) * 4;
    for(int i=0; i < num; i++) {
      int x = round(radius * cos(double(i) / num * 2 * M_PI));
      int y = round(radius * sin(double(i) / num * 2 * M_PI));
      gotoxy(x+offset, y+offset);
      cout << c;

    }
  }
}

int main() {

  char c = '0';
  
  int radius = 0;
  setFontRed();
  makeCircle(radius, c + radius);

  radius = 1;
  setFontGreen();
  makeCircle(radius, c + radius);

  radius = 2;
  setFontYellow();
  makeCircle(radius, c + radius);

  radius = 3;
  setFontBlue();
  makeCircle(radius, c + radius);

  radius = 4;
  setFont();
  makeCircle(radius, c + radius);
  
  resetFont();
  for(int i = 0; i < 10; i++) cout << endl;

return 0;
}


digitalerkreis

22.10.2013

#Bits für Integer Zahlen

Filed under: Allgemein — Thomas @ 10:10

Wieviel Bits braucht man zum speichern einer Integerzahl?

floor( log2( abs(x) ) + 1) +1

Die +1 damit man auch negativen Zahlen abdecken kann.

18.10.2013

dependency overview

Filed under: Allgemein — Tags: — Thomas @ 10:10

Ist es nicht grauenhaft ^^

pdlib

libunnamed

09.09.2013

Durchschnittstemperatur 2013

Filed under: Allgemein — Thomas @ 17:09

Ich habe mir mal die Temperaturaufzeichnung der HLUG [1] Messstation in Darmstadt besorgt und
die Durchschnittswerte berechnet:

Temperatur 10.4
Luftdruck 1015 hPa
Windgeschwindigkeit 0.7 m/s
Windrichtung 148°
rel Luftfeuchtigkeit 76.4%

Wir hatten also bisher ein ehr kaltes Jahr, leicht erhöhten Luftdruck, so gut wie kein Wind der meist aus Süd-Ost kam und eine hohe Luftfeuchte.

[1] http://www.hlug.de/start/luft/luftmessnetz.html

14.08.2013

GIMP Spielerreien

Filed under: Allgemein — Thomas @ 18:08

Das Schwert aus dem Bild entfernt und den Bogen reingemalt. War garnicht so schwer. :)

Vorher

Vorher

Nachher

Nachher

22.07.2013

Akku BTY 1000 Betrug

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

Für die schnurlosen Telefone war ein Satz neuer Akkus fällig. Bei Ebay welche gefunden, ganz billig, 1Eur das Stück.
Type BTY 1000 Nimh AAA Bild
Nur leider haben die keine 1000mAh. Nach mehrmaligen auf und endladen mit 100mA bzw 300mA wurde eine Kapazität von ca. 100 mA gemessen.
Billig Akku -> Schrott. Da sieht man es wieder.
Werde mir demnächst neue Akkus kaufen. Diesmal die teueren für 4Eur das Stück.

Ich werde hier berichten ob sich bei den Schrott Akkus noch was tut und ob die teueren ihr Geld wert sind.

/edit
Auch nach 15mal auf und entladen ändert sich die Kapazität nicht. Es bleiben etwa 100mAh. Ich teste jetzt zwei Akkus auf einmal. Vllt. kann das Ladegerät dann besser bestimmen wann der Akku voll ist und so ein paar mAh mehr reinpumpen. Aber das ändert alles nichts Wesentliches.

Heute hab ich auch für 8Eur zwei neue Akkus gekauft. VARTA NIMH 56703 mit 800mAh sollten es sein. Und die haben auch wirklich 800mAh. Hab gleich eine Testladung gemacht. Da bin ich mal gespannt wie lange das Telefon mit den Akkus hält :)

07.05.2013

safer code

Filed under: Allgemein — Tags: , — Thomas @ 21:05

Was ist das Problem mit folgenden Code?


    Element *ele                // uninitialisierter pointer;
    while(iter->hasNext()) {    // schleife kann auch nicht ausgefuehrt werden
        ele = iter->next();
        ...
    }
    qDebug() << ele;            // segfault
 

Wir nehmen mal an, dass qDebug() hier normalerweise nicht stehen würde. Man wollte sich aber das Element ausgeben lassen und hat vergessen die Debug Ausgabe wieder zu löschen.
Problem ist, dass die Variable ele durch qDebug dereferenziert wird, obwohl der Pointer ins Nirvana zeigen kann, wenn die Schleife nicht ausgeführt wird.
Der erste Fehler ist den Pointer nicht zu initialisieren. Man hätte ihn auf 0 (nulptr) setzen können. Das hätte den segfault aber nicht verhindert, aber das Debuggen erleichtert.
Der eigentliche Fehler ist, dass ele ausserhalb der Schleife deklariert wurde. Das Element darf nur innerhalb der Schleife existieren, da es auch nur dort gebraucht wird. Wie gesagt gäbe es im Normalfall auch keine Debug Ausgabe mit qDebug().

Leider gibt der Compiler in diesem Fall auch kein Warning aus (gcc 4.7 -Wall -Wextra)

Hier der richtige Code. Der Scope von ele wurde verkleinert und der Pointer sofort mit einer gültigen Adresse belegt.


    while(iter->hasNext()) {
        Element *ele = iter->next();
       qDebug() << ele;
    }
 

26.04.2013

C++ Guns - explicit keyword und warum man es braucht

Filed under: Allgemein — Tags: , — Thomas @ 08:04

Stell dir vor, du willst die Qt Klasse QPolygonF erweitern damit man noch zusätzlich eine z Koordiante abspeichern kann.
Du erstellst also eine Klasse Polygon die von QPolygonF public erbt.
Dafür hast du dir eine Klasse Point3D erstellt, die eben x,y,z speichert. Und damit man zu Qt's QPointF Klasse kompatibel bleibt, die ja nur 2D arbeitet, kann man ein Point3D aus einem QPointF erstellen. Die Z Koordiante wird entsprechend auf 0 gesetzt.

Nun fängst du an die Klasse Polygon zu implementieren und schreibst eine push_back(Point3D) Funktion. Die x,y Koordinate wird weiter an QPolygonF::push_back() gegeben und den Z Anteil wird irgendwie in Polygon gespeichert.

Um an seine Daten wieder dran zu kommen gibt es mehere Möglichkeiten. Eine davon geht über die Funktion at(). Nun vergisst du aber gerade diese Funktion zu überladen. Kann schonmal passiert. QPolygonF (mit QVector) hat über 30 Funktionen die angepasst werden müssten. Noch dazu haben wir ja keine Zeit und der Compiler wird es auch nicht als Fehler werfen.

Hier die Datenstruktur. Unrelevate Teile hab ich weggelassen.

class Point3D {
public:
...
Point3D(const QPointF & point);
...
};

...
Point3D::Point3D(const QPointF &point)
: x(point.x()), y(point.y()), z(0) {
}

class PolyShape : public QPolygonF {
public:
void push_back ( const Point3D & node);
...
};


Hier mein kleines Testprogramm:

PolyShape poly;
Point3D pointIn(1.,2.,3.);
qDebug() << "put in " << pointIn.x << " "<< pointIn.y << " " << pointIn.z; poly.push_back(pointIn); Point3D pointOut = poly.at(0); qDebug() << "get out" << pointOut.x << " "<< pointOut.y << " " << pointOut.z;

Ich gebe also ein Punkt mit den Koordianten 1, 2, 3 in das Polygon ein und erwarte, dass der selbe Punkt wieder rauskommt.

Starting /home/kater/qtcode/test2/test2...
put in 1 2 3
get out 1 2 0

So ein Mist! Die Z Koordinate ist verschwunden! Aber ist ja auch kein Wunder. Da Polygon kein at() hat, wird die entsprechende Funktion von QPolygonF ausgerufen. Die speichert aber nur QPointF und keine z Koordiante.
Der Fehler passiert, wenn man ein QPointF einem Point3D zuweist. Durch den entsprechenden Konstructor in Point3D klappt das auch, aber wollten wir das so eigentlich?

Man kann mit dem Keyword explicit in diesem Fall einem Compilerfehler erzwingen.

explicit Point3D(const QPointF & point);

main.cpp:62: error: conversion from 'const QPointF' to non-scalar type 'Point3D' requested

Verwende explicit immer dort, wo der Konstructor nur ein Argument hat und es nicht der Copy Ctor ist.

Besser wäre es aber ein anderes Design zu finden. Jede Funktion von QPolygonF zu überladen klingt nicht so gut. Vllt. kommen in der Zukunft ein paar neue hinzu oder es fallen einige weg. Noch mehr Arbeit...

« Newer PostsOlder Posts »

Powered by WordPress