Kategorien
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
HTML5 Web Frontend WebGL

WebGL Tutorial mit three.js

Mit Hilfe von WebGL lassen sich 3D Animation, Spiele und Webseiten komplett in 3D ohne Plugin (wie bei Flash) realisieren. WebGL wird erst von wenigen Browser unterstützt, was der Hauptnachteil ist:

  • Firefox ab 4.0
  • Chrome ab 9.0
  • Safari (OS X) ab 5.1 (ist aber standardmäßig deaktiviert)
  • Opera, nur Beta-Builds
  • Internet Explorer, aus „Sicherheitsgründen“ wahrscheinlich nie
  • Android Standard Browser, sehr viele
  • iOS, theoretisch ja ab iOS5.0, aber praktisch nur für iAds für schicke Werbung (typisch Apple, Hauptsache Geld verdienen)

Als Testbrowser zur Entwicklung empfiehlt sich Chrome aufgrund der Geschwindigkeit und der sehr guten Unterstützung. Google ist sehr bemüht WebGL voranzutreiben und bietet auf einer eignen Webseite eine sehr gute Übersicht über interessante Projekte.

Vom Standard her basiert WebGL auf OpenGL ES2.0, optimiert für mobil Anwendungen und deren niedrige Leistungsfähigkeit.

WebGL mit three.js

Zur 3D Programmierung im Browser mit WebGL sollten man auf jeden Fall ein leistungsstarkes Framework benutzen. Ich habe mich für three.js entschieden, da es das z.Z. populärste mit den meisten Tutorials und Erweiterungen ist. Laut Aussage der Entwickler ist es auch das einfachste Framework:

„The aim of the project is to create a lightweight 3D library with a very low level of complexity — in other words, for dummies.“

Alle Feature gibt es hier.

Ein paar sehr intreressante Demos: Skin, Terrain, Text, Sammlung alles Demos.

Lizenz: MIT License

Dokumentation (Version 49): Doku, allgemein ist die Doku noch ausbaufähig und enthält nur Todos und keine richtige Hilfe. Ein dicker Nachteil. Es wird oft empfohlen sich anhand der mitgelieferten Samples in die benötigten Methoden und Objekte einzuarbeiten, was auch gut funktioniert.

Eine Übersicht über alle WebGL Frameworks findet man hier (z.Z. ca. 30 Stück). Der Hoster dieser Seite Khronos ist übrigends der Entwickler des WebGL Standards.

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 .“
 

 

Kategorien
PHP WordPress

WordPress Plugin selber erstellen Tutorial

Wenn man WordPress erweitert, sollte man immer seinen eigenen Code sauber von dem WordPress Core  trennen und ein Plugin programmieren. Ein weiterer Vorteil ist, dass man sein hard ercodetes Plugin natürlich auch in das WordPress Plugin Verzeichnis stellen kann nach Vollendung.

Follgende Schritte sind durchzuführen:

Kategorien
PHP SEO WordPress

WordPress SEO: Meta Description Tag einbauen

WordPress ist sehr sparsam mit Meta-Tags, um das Description Tag einzubauen, muss man folgenden Code in die header.php einbauen:

<meta name="description" content="<?php if ( is_single() ) {
        single_post_title('', true);
    } else {
        bloginfo('name'); echo " - "; bloginfo('description');
    }
    ?>" />

 

Kategorien
Android Mobil

Android App in den Google Play Market stellen Windows7

Wenn man seine hart ercodete App in den Google Play Market stellen will muss man ein paar einfache Schritte durchführen. Im Vergleich zum Aufnahmeprozess im Apple App Store sind diese allerdings mit wenig Aufwand verbunden.

  1. Anlegen eines Developer Accounts für den Play Market. Es muss eine Gebühr von einmalig 25$ gezahlt werden, allerdings zwingend mit einem Google Checkout Account, den man mit einer Kreditkarte (z.B: Visa) verbinden muss.
  2. Die APK-Datei muss mit einem gültigem Zertifikat versehen werden, sonst gibt es eine Fehlermeldung: 
Google Play akzeptiert keine mit dem Debug-Zertifikat signierten APK-Dateien. Erstellen Sie ein neues Zertifikat, das mindestens 50 Jahre gültig ist.

Zertifizieren der App mit einem gültigem Zertifikat

Kategorien
PHP Zend Framework

Zend APIs: einzelne Komponenten verwenden

Das Zend Framework enthält viele praktische Schnittstellen zu bekannten APIs:

  1. Google Base (Zend_Gdata)
  2. Open ID (Zend_OpenId)
  3. Zend_Service mit:
  • Zend_Service_Akismet
  • Zend_Service_Amazon
  • Zend_Service_Amazon_EC2
  • Zend_Service_Amazon_S3
  • Zend_Service_Audioscrobbler
  • Zend_Service_Delicious
  • Zend_Service_DeveloperGarden
  • Zend_Service_Ebay
  • Zend_Service_Ebay_Finding
  • Zend_Service_Flickr
  • Zend_Service_LiveDocx
  • Zend_Service_Nirvanix
  • Zend_Service_ReCaptcha
  • Zend_Service_ShortUrl
  • Zend_Service_Simpy
  • Zend_Service_SlideShare
  • Zend_Service_StrikeIron
  • Zend_Service_Technorati
  • Zend_Service_Twitter
  • Zend_Service_WindowsAzure
  • Zend_Service_Yahoo

Eine komplette Liste gibt es hier.

Solche APIs können folgender Maßen eingebunden werden ohne die ganze Webseite als Zend-Projekt programmieren zu müssen (am Bsp. von GBase: Google Base):

Kategorien
VBA Excel

VBA Excel nach CSV Tutorial

Ein Beispiel Skript für das Umwandeln von Excel Tabellen nach csv-Dateien:

Sub csvToExcelTabelle()
ExcSheetName = "yyy.xls"
Csvsheet = "xxx.csv"

Dim excl As Worksheet
Dim csv As Worksheet
Set csv = Workbooks(Csvsheet).Worksheets(1)
j = 1

'csv leeren
csv.Cells.Clear

For Each excl In Workbooks(ExcSheetName).Worksheets

    zeilen = excl.UsedRange.Rows.Count
    For i = 3 To zeilen
        'Zahlenformate anpassen
        excl.Cells(i, 13).NumberFormat = "m/d/yyyy"
        excl.Cells(i, 14).NumberFormat = "m/d/yyyy"
        excl.Cells(i, 2).NumberFormat = "h:mm;@"
        excl.Cells(i, 3).NumberFormat = "h:mm;@"

        csv.Cells(j, 1).Value = "D"

        csv.Cells(j, 2).Value = "NO"
        'DATEFROM
        DATEFROM = excl.Cells(i, 13).Value
        csv.Cells(j, 3).Value = DATEFROM

        'DAYOFPERIOD
        DAYOFPERIOD = ""
         For k = 1 To 7
            If (excl.Cells(i, 3 + k).Value = "x") Then
                DAYOFPERIOD = DAYOFPERIOD & k
            End If
         Next k
         csv.Cells(j, 5).Value = DAYOFPERIOD

        'SCHEDULEDTIME
        SCHEDULEDTIME = excl.Cells(i, 2).Value
        csv.Cells(j, 6).Value = Format(SCHEDULEDTIME, "h:mm;@")

        'REMOTE_ und TONAME
        REMOTE__tmp = excl.Cells(i, 1).Value
        pos = InStr(REMOTE__tmp, " (")
        If (pos <> 0) Then
            REMOTE_ = Mid(REMOTE__tmp, pos + 2, Len(REMOTE__tmp) - pos - 2)
            TONAME = Left(REMOTE__tmp, pos - 1)
        Else
            REMOTE_ = ""
            TONAME = ""
        End If
        csv.Cells(j, 7).Value = REMOTE_
        csv.Cells(j, 8).Value = TONAME

        'VIA1
        VIA1 = excl.Cells(i, 12).Value
        csv.Cells(j, 9).Value = VIA1

        j = j + 1
    Next

Next excl

End Sub