Kategorien
JavaScript Web Frontend

Javascript Text spliten in Array nach maximaler Zeichenlänge

Wenn man einen Text mit Javascript so teilen will, dass man eine bestimmte Zeichenlänge nicht überschreitet, kann man die folgende Funktion verwenden, die aus einem Text und einer Zeichenlänge ein Array zurückgibt:

Bsp:

textArr  = textToArray ("Wordpress eigene Farben und CSS Klassen in den Editor einbauen", 20);
//textArr enhält ["Wordpress Plugin"] und ["selber erstellen Tutorial"]
     textToArray = function(text, maxLineCharactersCount){
    var textArr = new Array();
    var fragment = "";
    var lastCutPostion = 0;
    var lastPossibleCutPosition = 0;
    var charCounter = 0;
    var position = 0;
    $j.each(text, function(index, char) {
        if(char == " " && charCounter != 0)
        {
            if(charCounter > maxLineCharactersCount)
            {
                //console.log(charCounter- (position - lastPossibleCutPosition));
                fragment  = text.substring (lastCutPostion, lastPossibleCutPosition);
                //console.log(fragment);
                textArr.push(fragment);
                charCounter = -1 + (position - lastPossibleCutPosition);
                lastCutPostion = lastPossibleCutPosition + 1;
            }
            lastPossibleCutPosition = position;
        }
        position++;
        charCounter++;
    });
    //do not forget the last Word
   if(charCounter > 0)
   {
       fragment  = text.substring(lastCutPostion, text.length);
       //console.log(textWidth);
       if(charCounter > maxLineCharactersCount)
       {
           fragment  = text.substring (lastCutPostion, lastPossibleCutPosition);
           lastCutPostion = lastPossibleCutPosition + 1;
           textArr.push(fragment);
           fragment  = text.substring(lastCutPostion, text.length);
       }
       textArr.push(fragment);
   }   
    return textArr;
}
Kategorien
HTML5 JavaScript three.js WebGL

Three.js Camerasteuerung mit der Tastatur

Um mit der Tastatur (a,w,s,d und q,e und t,g,f,h) in einem three.js 3D-Projekt die Kamera zu bewegen, sind ein paar einfach Schritte nötig.

in der init-Methode

document.addEventListener( 'keypress', onDocumentKeyPress, false );

und eine einfache Methode

Kategorien
C C++

Terminal/Konsolen Befehl aus dem Programm aus starten

Mit folgender Funktion lassen sich Konsolen Befehle aus einem C++/C Programm aus starten:

#include <iomanip>
#include <iostream>
#include <cstdlib>

using namespace std;

bool startExternalProgramm(char* terminalCommando)
{    
    bool returnVal = false;
    if(terminalCommando != "")
    {
        cout << "Executing terminal command: " << terminalCommando << endl;
        int systemReturn = system(terminalCommando);
        
        if (systemReturn == 0)
        {
            returnVal = true;
        }
        else
        {
            cout << "The value returned from Terminal  was: " << systemReturn << endl;
            cout << "Sorry,commando for terminal not executable" << endl; 
        }
    }
    else
    {
        cout << "Sorry, empty commando for terminal" << endl;         
    }
    return returnVal;
        
}
Kategorien
C++

CSV Datei einlesen in Struct

Einlesen einer CSV Datei am Bsp. der magicNumbers.txt. Akademisch schlecht an dem Beispiel ist, das die beiden structs mit festem Längen ausgestattet sind. Der Speicher müsste dynamisch erzeugt werden mit realloc wie bei  der Variable magicNumbers.

magicNumbers.txt:
Adobe PDF;pdf;0x255044462d;evince %1
Postscript;ps;0x2521;evince %1
jpg, jpeg;jpg;0xffd8ffe0;gimp %1
header.h:

struct MagicNumbers
{
    char dateitTyp[20];
    char defaultExtension[4];
    char magicNumber[30];    
    char codeConsole[40];
};
struct MagicNumbersTableArray
{
    MagicNumbers magicNumbers[8];
};
MagicNumbersTableArray* readMagicNumbersFromFile(void);
file.cpp:

struct MagicNumbersTableArray* readMagicNumbersFromFile(void)
{

        char fileName[50] = MAGIC_FILE_NAME;

        FILE *file = NULL;
        struct MagicNumbers *magicNumbers = NULL;
        int x = 1;
        int i;

        file = fopen (fileName, "r");

        if (file == NULL)
        {
                cout << "Fehler beim Oeffnen von Datei: " << fileName << endl;
        }

        char line [500];
        fgets (line, sizeof(line) ,file );

        while(1)
        {

                magicNumbers = (struct MagicNumbers*) realloc(magicNumbers, x * sizeof(struct MagicNumbers));

                if(magicNumbers == NULL)
                {
                        cout << "Es konnte kein Speicher angelegt werden." << fileName << endl;
                }
                if(
                   fscanf(
                          file, "%[^;];%[^;];%[^;];%[^\n]\n", 
                          magicNumbers[x - 1].dateitTyp, 
                          magicNumbers[x - 1].defaultExtension, 
                          magicNumbers[x - 1].magicNumber, 
                          &magicNumbers[x - 1].codeConsole
                          ) == EOF)
                {
                        break;
                }
                x++;
        }
        struct MagicNumbersTableArray* magicNumbersTableArray = new MagicNumbersTableArray;
        for(i = 0; i < x - 1; i++)
        {
                printf("%s ,%s ,%s ,%s \n", 
                       magicNumbers[i].dateitTyp, 
                       magicNumbers[i].defaultExtension, 
                       magicNumbers[i].magicNumber, 
                       magicNumbers[i].codeConsole
                       );
                magicNumbersTableArray->magicNumbers[i] = magicNumbers[i];
        }
        free(magicNumbers);    
return magicNumbersTableArray;
}
Kategorien
C++

Hexadezimal nach Asci Konvertierung

Um eine Zeichenkette in hexadezimaler Form in den entsprechenden ASCI Wert umzuwandeln, kann man die folgende Funktion verwenden:

unsigned char hexToAsci(char firstChar, char secondChar)
{
        char hex[2];
        unsigned int asci;
        hex[0] = firstChar;
        hex[1] = secondChar;
        sscanf(hex,"%x",&asci);
        return (unsigned char) asci;
}

Bsp:

cout << hexToAsci("2", "5"); // ergibt "%", weil hex "25" <=> ASCI "%", siehe http://www.torsten-horn.de/techdocs/ascii.htm
Kategorien
Hardware Webdeveloper Tools

Der beste Laptop für Programmierer

Ich habe viele Freelancer Kollegen gefragt, welcher Laptop der beste für Programmierer sei und das Ergebnis war eindeutig:

Die beste Firma für Arbeits-Laptop für Programmierer ist Lenovo (IBM) nach Meinung von verschiedenen Freiberuflern.

Nach 2 Jahren Erfahrung mit dem Rechner bin ich zu der Erkenntnis gelangt, mir bald ein Apple MacBook Pro
zu kaufen und bin damit sehr zufrieden seit mehreren Jahren, aufgrund folgender Fakten:

  • sowohl Windows hat mein Thinpad sehr langsam mit der Zeit gemacht
  • der Sound ist sehr schlecht
  • die Akkuleistung beträgt effektiv etwas unter 3 Stunden
  • das Mainboard musste schon asugetauscht werden, ein USB Slot ist auch schon kaputt gegangen nach unter 2 Jahren – positiv war der sehr gute Service von Lenovo, der das Gerät beu mir zu hause repariert hat am nächsten Tag gleich

Der beste Laptop für Programmierer: Das Macbook Pro

  1. sehr schnell: 2,8 GHz Quad-Core Intel Core i7
  2. Akku bis zu 7h
  3. 16Gb Ram
  4. 1,8 Kilo leicht
  5. stabiles Betriebssystem Max OS
  6. Preis: teuer

Das Lenovo Thinkpad

  1. 3 Jahre Garantie, Laptop wird von zu hause abgeholt
  2. 140€ für eine Docking Station lohnen sich
  3. Laptop mit 17,5″ Display
  4. 500Gb schnelle SSD Festplatte
  5. 32Gb RAM
  6. Akku bis 10h
  7. sehr gut verarbeitetet
  8. Preis: teuer

 

Kategorien
three.js WebGL

Anordnen von WebGl 3D Objekten mit three.js

var pageRotation = 0.9;
var pageHeight = 300;
var pageWidth = 200;
var pageLength = 20;

bookPageContainer = new THREE.Object3D();
bookPageContainer.rotation.x = pageRotation; //linkes Buchhälfte 

leftPageContainer = new THREE.Object3D();
leftPageContainer.position.set(-pageLength / 2, 0, 0);
leftPageContainer.rotation.z = -Math.PI * 0.5;
leftPageCon = new THREE.CubeGeometry(pageWidth, pageLength, pageHeight, 1, 1, 1, loadLeftPageTextures());
leftPage = new THREE.Mesh(leftPageCon, new THREE.MeshFaceMaterial());
leftPage.position.set(-100, 0, 0);
leftPageContainer.add(leftPage);
bookPageContainer.add(leftPageContainer); //Buchrücken 

bookSideCon = new THREE.CubeGeometry(pageHeight, 1, 2 * pageLength, 1, 1, 1, getBookSideTextureWithText("Buchrücken"));
bookSide = new THREE.Mesh(bookSideCon, new THREE.MeshFaceMaterial());
bookSide.position.set(0, -pageLength / 2, 0);
bookSide.rotation.y = -Math.PI / 2;
bookPageContainer.add(bookSide); //rechte Buchhälfte 

rightPageContainer = new THREE.Object3D();
rightPageContainer.position.set(pageLength / 2, 0, 0);
rightPageContainer.rotation.z = Math.PI * 0.5;
rightPageCon = new THREE.CubeGeometry(pageWidth, pageLength, pageHeight, 1, 1, 1, new THREE.MeshLambertMaterial({
  color: 0x00ff00,
  wireframe: false,
  needsUpdate: true
}));

rightPage = new THREE.Mesh(rightPageCon, new THREE.MeshFaceMaterial());
rightPage.position.set(100, 0, 0);
rightPageContainer.add(rightPage);
bookPageContainer.add(rightPageContainer);
scene.add(bookPageContainer);

Ergebnis (Perspektive ist geändert worden):

Kategorien
JavaScript Web Frontend

Objektorientierte Programmierung in JavaScript OOP

In der letzten Zeit erfreut sich JavaScript wieder größerer Beliebtheit. Für Freunde der objektorientierten Programmierung ist JavaScript allerdings etwas umständlich. Es gibt keine Klassen, keine Vererbung und keine privaten Attribute. Dennoch ist es möglich, in JavaScript objektorientiert zu programmieren.

Hierzu wird anstelle einer Klasse einfach eine Funktion definiert, die alle Attribute und Methoden enthält. Diese Funktion nennt sich Konstruktorfunktion. Man kann allerdings auch etwas tricksen, in dem man den Attributen das Schlüsselwort ‚var‘ voran stellt. Damit sind sie nur innerhalb der Klasse sichtbar (private statt public).

Um eine ganz allgemeine geometrische Figur darzustellen, kann der folgenden Programmcode verwendet werden:

function Figur() {}

Figur.prototype = {
 getBreite: function() {
 return this.breite;
 },
setBreite: function(b) {
 this.breite = b;
 },
getHoehe: function() {
 return this.hoehe;
 },
setHoehe: function(h) {
 this.hoehe = h;
 }
 }

Da gibt es zum einen den Konstruktor ganz oben. Wie auch in jeder Programmiersprache kann man in JavaScript beliebige Parameter angeben. Um die Attribute einer Klasse muss man sich an dieser Stelle nicht kümmern. Diese werden, wie in diesem Beispiel, über den Prototypen automatisch mit angelegt. Desweiteren werden direkt im Prototypen die Funktionen implementiert, die die Klasse bereitstellen soll. In diesem Beispiel sind das nur die Getter und Setter für die Breite und Höhe der Figur. Wie schon erwähnt, werden jetzt auch die Attribute mit angelegt. Zum Beispiel bei getBreite, wird mit dem Zugriff auf this.breite, die Variable angelegt und ist innerhalb der Klasse verfügbar.

Weiterhin ist auffällig, dass die Funktionen jeweils per Komma getrennt werden. Es ist also soetwa, wie eine Aufzählung der Funktionen.

Das Instanziieren der Klasse würde dann wie folgt aussehen:

meineFigur = new Figur();
meineFigur.setBreite(4);
meineFigur.setHoehe(6);

Vererbung

Will man jetzt eine ganz spezielle geometrische Figur, wie zum Beispiel ein Viereck anlegen, kann die Klasse Figur verwendet und erweitert werden. So kann eine Funktion hinzugefügt werden, um die Fläche der Figur zurück zu geben:

function Viereck() {}

Viereck.prototype = new Figur();
Viereck.prototype.constructor = Viereck;
Viereck.prototype.getFlaeche = function() {
 return this.getBreite() * this.getHoehe();
 }

Auch hier beginnt die Klasse mit dem Konstruktor. interessanter ist jetzt allerdings, dass die neue Funkton getFlaeche() zwar auch im Prototypen definiert wird, jetzt aber einen eigenen Eintrag erhält. Dem Prototypen der Klasse wird jetzt ein Objekt der Eltern-Klasse zugewiesen. Und den Konstruktor kann man auch nochmal explizit angeben, was aber optional ist.

Artikel von Tobias Spiesecke

Kategorien
Webdeveloper Tools

SVN verschieben von SVN Daten auf neuen Server/NAS und Client

Wenn man seine Dateien in einem Versionierungssystem wie SVN verwaltet und einen neuen PC und Server aufsetzt, kann man seine alten Dateien einfach kopieren auf den neuen Rechner und folgende Punkte ausführen, um sein SVN wieder nutzen zu können:

Verschieben des SVN Server Repositorys

Ich habe dafür lokal einen NAS installiert, der die Daten für mich verwaltet und sichert. Dorthin habe ich einfach meine Respository Ordner kopiert, die immer die folgenden Dateien enthalten:

SVN Respository Dateistruktur

 Verschieben und verbinden der SVN Client Dateien

Kategorien
Webdeveloper Tools

Ubuntu unter Windows7 mit VMware auf Thinkpad X220

Um ein virtuelles Betriebssystem unter Windows7 aufzusetzen braucht man nur VMware und das Ubuntu iso-Image herunterladen und zu installieren. Eine sehr gute Anleitung findet man hier. Beide sind kostenlos erhältlich.

Beim Thinkpad von Lenovo (ich verwende das X220) muss man Virtualisierung erst im Bios aus Sicherheitsgründen aktivieren.

Dazu muss man den Laptop erst runterfahren und kalt neustarten. Beim Start muss F1 betätigt werden und im Bios unter Security-> Enable Virtualization beide Einträge aktiviert werden ansonsten kommt bei der Installation von Ubuntu mit VMware die folgende Fehlermeldung:

„You have configured this virtual machine to use a 64-bit guest operating system. However, 64-bit operation is not possible. This host does not support VT.
For more detailed information, see .“