Linux Befehle

current user uid und gid (auch domain User – dann aber als solcher eingelogt):
id -u
id -g

beim Mount setzen die options die lokalen zugriffs rechte sprich uid und gid geben das lokale mapping an, dazu kann man bei cifs mit file_mode=0777 und dir_mode=0777 die berechtigungen setzen
um ein File für pw anzugeben
credentials=filepath/name
im File steht dann
username=NAME
password=PW
domain=DOMAIN

env variblen setzen global permanten
/etc/profile.local
da rein als bash script (also mit #!/bin/bash)
export NAME=value
jede Var eine Zeile
Festplatten speicherplatz anzeigen lassen:
df -h

ohne pw abfrage über rsa am server anmelden

key-authentication

ssh public Key des Clients findet man unter ~/.ssh/
und da die datei is_rsa.pub
Sollte die datei nicht existieren kann man sie mit ssh-keygen -p PASSWORT (-p optional wenn man das ganze noch pw schützen möchte)
erstellen.
Die Datei auf dem server auch in den .ssh Ordner des nutzers kopieren als der man sich einloggen möchste
dort umbenennen in authorized_keys und die rechte wie folgt anpassen:
Datei Rechte 0600 und Besitzer muss der User sein.
Sollte die Datei schon exitstiern den kompletten Inhalt der is_rsa.pub hinten anhängenn
Danach kann man sich ohne pw eingabe einloggen (außer man hat die zusatzoption -pw) genommen

Sollte irgendwas nicht gehen kann man sich versuchen sich mit ssh -vv name@server einzuloggen dann sieht man was beim login passiert

DRUCKER Einrichten:
Drucker so einrichten das man bei einem fertig installierten CUPS treiber per lp drucken kann:
mit:
lpstat -p bekommt mann alle Drucker angezeigt die das Sytsem kennt
mit lpadmin -d kann man einen standart drucker setzen
ansonsten kann man direkt mit lp -d [-o options=value] filename die Datei drucken
.ps dateien kann man mit ps2pdf datei.ps umwandeln und dann drucken.

System Zeit unter Debian auf localtime umstellen:
in /etc/default/rcS UTC=yes umstellen auf UTC = no

CPU Power setzen von 0 – 7
echo NUMBER | tee /proc/acpi/processor/P002/throttling > /proc/acpi/processor/P001/throttling

ssh-copy-id wessel@asdf

Version Control mit Git – Einführung

GIT
===

Einfuehrung
———–
GIT ist, das sollte bekannt sein, ein verteiltes Version Control System. Sowas
wie CVS oder SVN, nur eben mit dem neuen vorgestellten Attribut “verteilt”.
Was das genau bedeutet, sprengt ein wenig den Rahmen einer Einfuehrung, aber
man kann es sich eigentlich denken – es gibt keinen zentralen Server.

VCSs setzen sich mehrere Sachen zum Ziel. Zum einen soll die gesamte
Entwicklungsgeschichte (die einzelnen *Versionen*) von dem System gespeichert
und jederzeit abrufbar sein. So kann jederzeit der Unterschied zu einer noch
funktionierenden Version des Programms zurueckgesetzt werden oder die
Unterschiede aufgedeckt werden.
Zum anderen soll das gemeinsame Arbeiten an einem Projekt vereinfacht werden.
Jeder arbeitet erstmal, ohne auf andere grossartig Ruecksicht zu nehmen (wobei
diese Aussage fuer sowas wie SVN auch nur eingeschraenkt gilt). Hat dann jeder
seinen Teil der Arbeit getan, wird – soweit die Algorithmik das zulaesst -
jegliche geleistete Arbeit am Code zusammengefasst und als neuer Status Quo
zur Verfuegung gestellt.

Lokales Arbeiten
—————-
Nun aber erstmal die Basics!
Ich werde hier in keinster Weise ein GIT Befehlskompendium aufbauen.
Ich werde einen kleinen Ausschnitt zeigen, mit dem man sich die groessten
Vorzuege von GIT zunutze machen kann. Wer mehr in die Tiefe will, und das sei
jedem ans Herz gelegt, soll sich das kostenlose E-Book ProGit[1] durchlesen,
das man auch – wenn dann auch nicht mehr kostenlos – gedruckt erwerben kann.

[1] http://progit.org/book/

Um ein neues, leeres GIT Repository zu erstellen, sollte ein Ordner angelegt
werden, der die Daten in Zukunft enthaelt. Innerhalb dieses Ordners kann man
mit

$ git init

das GIT Repository initialisieren. Sehen tut man das nicht wirklich, ausser
das der versteckte Ordner “.git” angelegt worden ist.

Eine andere Moeglichkeit, ein Repo anzulegen, ist ein bereits bestehendes zu
klonen. Dafuer brauch man *keinen* Ordner anzulegen, das macht GIT
automatisch:

$ git clone

Die Adresse kann eine Web-Adresse (z.B von github.com), eine
GIT-Daemon-Adresse (wie z.B auf kernel.org) oder ein ssh-Server mit Pfadangabe
sein. Hier werden *alle* commits, *alle* Branches (s.u.) – einfach alles – auf
dem lokalen Rechner reproduziert. Nach dem clone kann man also ohne
Netzwerkanbindung jeden bisherigen commit sich anschauen.

Den Status des Repositorys (Welche Dateien wurden geaendert? Welche Dateien
sind da, aber werden von GIT gar nicht beobachtet? Welche Dateien wurden
geloescht? etc.) kann mit

$ git status

ueberprueft werden. Viel wird im Moment nicht zu sehen sein, denn das Repo
ist leer und wir haben auch noch nichts nuetzliches gemacht.

Um eine Datei von GIT beobachten zu lassen, muss sie offiziell zu dem
Repo hinzugefuegt werden. Also eine Datei mit Inhalt fuellen und mit

$ git add

GIT bekannt machen. Jetzt ist die Ausgabe von `git status` schon
interessanter.

Sobald wir den aktuellen Status der Datei sichern moechten, also als eigene
Version in die Geschichte eingehen lassen wollen, kann man einen commit mit

$ git commit -av

machen. Dann oeffnet sich ein Editor, bei dem man ganz oben noch eine
moeglichst praegnante Beschreibung der Aenderungen hinzufuegen sollte.
Alles unterhalb des Erklerungskommentars von GIT wird ignoriert.

Ist das getan, ist `git status` wieder relativ unspektakulaer,

$ git log

hingegen ist interessanter, den hier kann man sich alle bisherigen
commits anzeigen lassen.

Zu guter letzt ist noch interessant, was die Unterschiede von zwei
Versionen sind, dafuer gibt es

$ git diff

Dieser Befehl gibt die Unterschiede vom letzten commit (genannt HEAD)
zu der sich aktuell im Ordner befindlichen Version aus.
Alternativ kann auch eine Version explizit als Parameter angegeben werden. So
gibt

$ git diff HEAD~1

die Unterschiede zwischen dem commit, der eine Version vor dem aktuellen HEAD
ist, und der im Ordner befindlichen Version aus. Es koennen auch die
SHA-Checksummen, die `git log` produziert als Parameter uebergeben werden.

Um zu einem commit zurueckzukehren gibt es

$ git reset

hat hierbei die selbe Form wie die Parameter von `git diff`. Aber
Achtung, einmal resettet, sind alle nachfolgenden commits verloren.

Die ganze Historie kann man sich auch schoen graphisch mit dem mitgelieferten
Tool namens

$ gitk –all

anzeigen lassen.

Branching
———
Was GIT von vielen anderen VCSs unterscheidet, ist das billige “branchen”,
das Aufteilen der der Arbeit in zwei unabhaengige Entwicklungszweige.
Mit den e.g. Befehlen koennen wir nur ein commit nach dem anderen machen, uns
also auf einer Geraden bewegen.

Manchmal will man aber einen alternativen Weg ausprobieren ohne dabei die
bisherige Arbeit zu verwerfen (`git reset` faellt also weg). Natuerlich
koennte man einfach eine Kopie des aktuellen Status machen und dann doch `git
reset` benutzen. Dabei verliert man aber entweder seine commits oder hat
gleich 2 ganze Repos auf der Platte rumfliegen. Hier kommt das Branching ins
Spiel. Mit

$ git checkout -b

wird ein neuer, mit Namen versehener Branch angelegt, der auf dem selben
Status ist wie . Hier bei sollte erwaehnt werden, das wir die ganze
Zeit schon einen Branch haben, naemlich den “master” Branch. Dieser existiert
(fast) immer und ist der Standardname.

Nun kann man auf dem neuen Branch mit den Befehlen genau so gearbeitet werden,
wie auf dem “master” Branch. Der “master” Branch ist davon voellig
unbeeinflusst.

Alle vorhandenen Branches koennen mit

$ git branch -a

angezeigt werden. Will man den Branch wechseln, reicht ein einfaches

$ git checkout

Man sollte darauf achten, dass die Ausgabe von `git status` einen cleanes
working directory angibt, da sonst die nicht committeten Aenderungen implizit
mit auf den anderen Branch verschleppt werden, was schnell zu Verwirrung
fuehren kann.

Will man nach mehreren Wochen getrennter Arbeit nun die separaten Aenderungen
zusammenfuehren, wechselt man (meistens) auf den “master” Branch und fuehrt

$ git merge

aus. In den meisten Faellen ist GIT schlau genug, selbst Konflikte
aufzuloesen. Sollte das doch mal nicht der Fall sein, muss man selbst Hand
anlegen. Auch dafuer verweise ich auf das o.g. Buch, da der Fall doch recht
selten auftaucht.

An dieser Stelle ist man in der Lage, alleine seinen Code ordentlich zu
versionieren. Will man die Netzwerkfaehigkeiten von GIT ueber das Clonen
hinaus erweitern, mit mehreren Leuten effizient an einem Code arbeiten,
automatische Fehlersuche oder eine schoene Weboberflaeche fuer das Repository
haben, so verweise ich abermals an das Buch, das sein Geld fuer die
Druckversion als Kompendium wirklich wert ist.

Git Repo aufm Serer anlegen um damit zu syncen:
auf dem Server in den Ordner gehen und : $> git init –bare ausführen
Loakel dann : $>git remote remotename add ssh://bla@blupp/pfad/zu/ordner’

Ogre on iPhone

Momentan gibt es einen Port der OgreEngine auf das iPhone, sowie ein XCode Template und eine Sample App.
Ich werde in diesem Blogeintrag beschreiben, wie man die SampleApp auf seinem Mac einrichted, und sie dann wieder los wird, um mit einem minimalen Sysem sein eigenes Spiel zu starten:

Da das Projekt sich noch in Arbeit befindet, ist auch dieser Eintrag noch nicht fertig . Alle denen es unter den Nägeln brennt, sind eingeladen weiterzulesen – allen Anderen Empfehle ich auf die Strukturierte Variante zu warten :)

Erstmal die Bezugsquellen:
http://www.ogre3d.org/wiki/index.php/Ogre_iPhone
Statt from source zu builden habe ich mich entschieden die 1.7 Version zu nehmen
http://sourceforge.net/projects/ogre/files/
Hier läd man sich unter Ogre -> 1.7 das iPhone sdk und unter ogre_mac_dependecies -> das Xcode Template
(die iPhone dependencies braucht man nach meiner Erfahrung nicht – da die Libs auch im Release folder liegen)
Für das ganze braucht man dann noch cmake installiert und zwar in der Version 2.8.0 die 2.8.1 hat im Moment noch einige Bugs, die dazu führen das man nicht compilieren kann.

Dann das XCode template installieren
und dann kanns losgehen mit sample builden.

Wer als Debug compilieren möchte (was man tun sollte wenn man an den Samples arbeiten möchte oder daran arbeiten) der muss entweder bei den Lib Search Pathes bei eingestelltem Debug modus den Release Ordner hinzufügen oder sämtliche Libs aus lib/Release nach lib/Debug kopieren.

Wenn die Templates und alle Libs richtig installiert wurden – sollte die SampleApp Compilieren und sich im Simulator abspielen lassen.
Hier kann man sich erst einmal einen Überblick verschaffen zu was die Engine auf dem iPhone alles Fähig ist.

Wer in dem Sample Codes ein wenig rumspielen will sollte folgendes beachten.
Im Sample Ordner liegen sämtliche header files nocheinmal in dem unterordner Samples/include. Wenn man nun n XCode unter den einzellnen Samples die Headerfiles editiert um ein wenig mit Ogre rumzuspielen passiert erstmal gar nix.

Den Ordner include löscht man daher am besten und fügt stattdessen unter in Search_path->Header Search Path den Pfad: $SRCROOT/Samples/** hinzu (** steht für Rekursiv durchsuchen) ($SRCROOT ist der Ordner in dem sich das Project befindet)

Nun kann man erstmal mit den Samples ein wenig rumspielen und wenn man Ogre noch nicht kennt anhand der Basic Tutorials durchspielen.
Ich habe zum testen immer sehr gerne die SkyDome scene genonmmen da sie recht übersichtlich ist. Und wenn man nicht ewig durch die vielen Samples scrollen will beim testen, der kann in der SamplesBrowser.h in der Methode setup das laden der SamplePlugins auskommentieren. Das erste Sample (BSP) muss allerdings da bleiben, und natürlich das an dem man arbeitet.

Der nächste Schritt war für mich dann eine App zu bauen die ohne die Samples auskommt, und vorallem den (zwar sehr schicken – aber für ein eigenes Spiel hinderlichen) SampleBrowser loszuwerden.

Meine ersten Versuche selber ein neuen Project aufzusetzen und die Settings aus dem Sampleproject zu übernehmen sind leider an einer menge komischer Compilerfehler gescheitert.(Handelt sich um einen Bug im iPhone sdk – wens intressiert: google ;) )

Deswegen habe ich mir das SampleProject nochmal vorgenommen und das reduziert, mit folgende Schritten:
1. xcode Project datei kopieren und ihr einen neuen Namen verpasst.
2. neuen Ordner angelegen, in dem man seinen eigenen Quellcode unterbringen kann.
3. aus dem Ordner Sample/Browser/include die Datei SampleBrowser.h und aus Browser/src die Datei SampeBrowser.cpp in den Quellcode
ordner kopieren (und gegebenenfalls umbennen)
4. das kopierte XCode project aufmachen und die Dateien SampleBrowser.cpp und .h umlegen auf die kopierten Dateien (Rechtsklick -> GetInfo -> Rechts neben der Pfad angaben auf Choose klicken und Dateien auswählen)
5. Die SampleBrowser.cpp habe ich nur geringfügig Abgeändert (siehe unten)
6. die SampleBrowser.h habe ich komplett neu geschrieben (als Anleitung kann man hier das Basic Tutorial 6 nehmen).
Manche Sachen (wie das Resource Managment) habe ich erstmal aus der SampleContext.h übernommen.

Bei mir sind beim einige Laufzeitfehler beim ResourceMangement passiert, bei denen ich Momentan noch nicht weiß warum sie auftreten, deswegen habe ich mir eine eigene resource.cfg Datei angelegt (original zu finden unter bin/resource.cfg), und nur die nötigsten Sachen eingeladen (Siehe unten)

7. Entgegen dem Basic tutorial 6 darf man nicht schon in der go() routine den RenderLoop starten (Root->startRendering()), sonst kehrt die go niemals zurück und es wird zwar gerendert aber der Splashscreen bleibt stehen und mann sieht nix.
(Der Splashscreen bleibt immer dann stehen wenn die AppDidFinishLaunching Methode nicht zurückkehrt)
Deswegen darf die go Routine nur setupen. Das starten des Renderings passiert dann über die Hauptroutine, in der SampleBrowser.cpp
Ich habe dazu den nTimer aus der cpp datei auf Repeat:NO gestellt und in der RenderOneFrame Methode dann das Rendering gestartet.
Hier muss man dann je nachdem wie man sein Spiel aufgebaut hat selber schrauben.

8. Wenn das dann alles geht, kann man anfangen die alles was man von den Samples nicht braucht rauszuschmeißen. Dazugehören auf jeden Fall alle SamplePlugins. Dazu löscht man die Quelldateien (aber nur die Referencen es sei denn man will das Sample nicht behalten), dann schmeißt man unter den LinkerOptions die ganzen Samples raus. Außerdem kann man unter Targets alle Targest außer dem SampleBrowser löschen.
Vom SampleBrowser benötigt man noch die folgenden Dateien:
FileSystemLayerImpl.h und die mm
OgreStaticPluginLoader.h

Wenn man die App umbenennt bekommt man einige Probleme – das behebt sich wenn man die PreBuild und das ReRun script bearbeitet siehe weiter unten.

Außerdem hatte ich öfter das Problem, das er das Rendersystem nicht finden konnte – das lag daran das in der OgreStaticPluginLoader Ogre_STATIC_GLES nicht defined war und deswegen beim laden nicht eingebunden wurde, mit einem #define OGRE_STATIC_GLES ist die Sache erledigt

Um die Sample Dateien nun vollständig loszuwerden sind noch folgende Schritte nötig:

Im XCode: Linke Seite unter Active Target ausklappen -> dort sind 3 Ordner drunter
Unter PrebuildScripts im XCode unter PrebuildScript(letzter Ordner) doppelklicken dort befindet sich ein make -C befehl.
-C ändert den Aktuellen Arbeitspfad (der aktuell auf $SRCROOT/Samples/Browser steht und evtl auch angepasst werden muss, auf den gleichen Folder in dem sich dann auch der CMakeScript Ordner befindet). Danach kommt der Befehl mit dem das Prebuild Script aufgerufen wird – das Script kann man sich kopieren und in dem Script dann alle Pfade abändern, und an die eigenen Belange anpassen. das Script liegt bei den Samples in /Samples/Browser/CMakeScript/SampleBrowser_postBuildPhase.makeDebug drinne befinden sich pfade
die muss man ersetzen.
Dieses PreBuild Script kopiert im Grunde alle benötigten Resourcen (MeshFiles, cfg Files etc) in den *.app Folder im bin verzeichnis, damit der iPhonesimulator damit arbeiten kann.

Ebenfalls unter ausgeklappten Target links Im Projectfolder CMakeScript befindet sich noch eine ReRun Datei. Hier auch doppelt klicken und schauen wo die Datei liegt – in dieser Datei müssen auch wieder die SampleBrowser Pfade angepasste werden.

Die Dritte Stelle die man noch für Abhängigkeiten checken muss sind natürlich die Project Settings in XCode

Nun kann man den Sample Folder komplett löschen, und seine eigene App aufbauen.
plugins.cfg braucht man nicht – die Aufgabe wird auf dem iPhone vom StaticPluginLoader übernommen

Anhang: Quellcode:

SampleBrowser.h

#include "Ogre.h"
#include "OgrePlugin.h"
#include "macutils.h"
#include "FileSystemLayerImpl.h"

// Static plugins declaration section
// Note that every entry in here adds an extra header / library dependency
# ifdef OGRE_BUILD_RENDERSYSTEM_GL
# define OGRE_STATIC_GL
# endif
# ifdef OGRE_BUILD_RENDERSYSTEM_GLES
# define OGRE_STATIC_GLES
# endif
# if OGRE_PLATFORM == OGRE_PLATFORM_WIN32
# ifdef OGRE_BUILD_RENDERSYSTEM_D3D9
# define OGRE_STATIC_Direct3D9
# endif
// dx10 will only work on vista, so be careful about statically linking
# ifdef OGRE_BUILD_RENDERSYSTEM_D3D10
# define OGRE_STATIC_Direct3D10
# endif
# ifdef OGRE_BUILD_RENDERSYSTEM_D3D11
# define OGRE_STATIC_Direct3D11
# endif
# endif

# ifdef OGRE_BUILD_PLUGIN_BSP
# define OGRE_STATIC_BSPSceneManager
# endif
# ifdef OGRE_BUILD_PLUGIN_PFX
# define OGRE_STATIC_ParticleFX
# endif
# ifdef OGRE_BUILD_PLUGIN_CG
# define OGRE_STATIC_CgProgramManager
# endif

# ifdef OGRE_USE_PCZ
# ifdef OGRE_BUILD_PLUGIN_PCZ

# define OGRE_STATIC_PCZSceneManager
# define OGRE_STATIC_OctreeZone
# endif
# else
# ifdef OGRE_BUILD_PLUGIN_OCTREE
# define OGRE_STATIC_OctreeSceneManager
# endif
# endif

# include "OgreStaticPluginLoader.h"

using namespace OgreBites;

#import "AnimationListener.h"

class SampleBrowser {

private:
Ogre::Root *mRoot;
FileSystemLayer* mFSLayer;
Ogre::RenderWindow* mWindow;
Ogre::StaticPluginLoader mStaticPluginLoader;
AnimationListener *mListener;
Ogre::AnimationState* mAnimationState;
Ogre::AnimationState* mAnimationState2;

public:
SampleBrowser(){
mFSLayer = OGRE_NEW_T(FileSystemLayerImpl, Ogre::MEMCATEGORY_GENERAL)(OGRE_VERSION_NAME);

//mRoot = 0;
}
void go(){

createRoot();
defineResources();
setupRenderSystem();
createRenderWindow();
initializeResourceGroups();
createFrameListener();
setupScene();

/**/

}

void createRoot()

{
Ogre::String pluginsPath = Ogre::StringUtil::BLANK;
//pluginsPath = mFSLayer->getConfigFilePath("plugins.cfg");

//pluginsPath = "/Users/paulinealtmann/FID/ogre_1_7_stable/OgreSDK/Samples/Browser/";
//std::cout << std::endl << "Readed Plug Path: " << pluginsPath << std::endl;
mRoot = OGRE_NEW Ogre::Root(pluginsPath, mFSLayer->getWritablePath("ogre.cfg"), mFSLayer->getWritablePath("ogre.log"));
mStaticPluginLoader.load();

}

void defineResources()
{

// load resource paths from config file
Ogre::ConfigFile cf;
cf.load(mFSLayer->getConfigFilePath("/Users/paulinealtmann/FID/ogre_iPhone/OgreSDK/bin/resources_my.cfg"));
//cf.load(mFSLayer->getConfigFilePath("resources_my.cfg"));

Ogre::ConfigFile::SectionIterator seci = cf.getSectionIterator();
Ogre::String sec, type, arch;

// go through all specified resource groups
while (seci.hasMoreElements())
{
sec = seci.peekNextKey();
Ogre::ConfigFile::SettingsMultiMap* settings = seci.getNext();
Ogre::ConfigFile::SettingsMultiMap::iterator i;

// go through all resource paths
for (i = settings->begin(); i != settings->end(); i++)
{
type = i->first;
arch = i->second;

#if OGRE_PLATFORM == OGRE_PLATFORM_APPLE || OGRE_PLATFORM == OGRE_PLATFORM_IPHONE
// OS X does not set the working directory relative to the app,
// In order to make things portable on OS X we need to provide
// the loading with it's own bundle path location
if (!Ogre::StringUtil::startsWith(arch, "/", false)) // only adjust relative dirs
arch = Ogre::String(Ogre::macBundlePath() + "/" + arch);
#endif
Ogre::ResourceGroupManager::getSingleton().addResourceLocation(arch, type, sec);
}
}
Ogre::ResourceGroupManager::getSingleton().initialiseResourceGroup("Essential");
//Ogre::ResourceGroupManager::getSingleton().initialiseResourceGroup("Popular");

//Ogre::ResourceGroupManager::getSingleton().initialiseAllResourceGroups();

}

void setupRenderSystem()
{

Ogre::RenderSystemList rsList = mRoot->getAvailableRenderers();
if(rsList.size()>0)
{
// mRoot->setRenderSystem(mRoot->getRenderSystemByName(rsList[0]->getName()));
std::cout << "Found Renderer: " << rsList[0]->getName()<< std::endl;
//mRoot->setRenderSystem(mRoot->getRenderSystemByName("OpenGL ES 1.x Rendering Subsystem"));
}
else {
std::cout << "Error no Available Renderer found" << std::endl;

}

}

void createRenderWindow()
{
mWindow = mRoot->initialise(true);
//[[UIApplication sharedApplication] keyWindow];
}

void initializeResourceGroups()
{
Ogre::TextureManager::getSingleton().setDefaultNumMipmaps(5);

}

void createFrameListener()
{
mListener = new AnimationListener();
mRoot->addFrameListener(mListener);
}

void setupScene()
{

mWindow->removeAllViewports();
Ogre::SceneManager *mSceneMgr = mRoot->createSceneManager(Ogre::ST_GENERIC, "Default SceneManager");
Ogre::Camera *mCamera = mSceneMgr->createCamera("Camera");
Ogre::Viewport *mViewport = mWindow->addViewport(mCamera);
mViewport->setBackgroundColour(Ogre::ColourValue(0.5,0.50,0.50));
mCamera->setPosition(Ogre::Vector3(100,100,100));
mCamera->lookAt(Ogre::Vector3(0,0,0));
mCamera->setNearClipDistance(1);
mCamera->setFarClipDistance(1000);
mCamera->setAspectRatio((Ogre::Real)mViewport->getActualWidth() / (Ogre::Real)mViewport->getActualHeight());

// setup some basic lighting for our scene
mSceneMgr->setAmbientLight(Ogre::ColourValue(1, 1, 1));
mSceneMgr->createLight()->setPosition(20, 80, 50);

// create a floor mesh resource
//Ogre::MeshManager::getSingleton().createPlane("floor", Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME,
// Ogre::Plane(Ogre::Vector3::UNIT_Y, -30), 1000, 1000, 10, 10, true, 1, 8, 8, Ogre::Vector3::UNIT_Z);

// create a floor entity, give it a material, and place it at the origin
/*Ogre::Entity* floor = mSceneMgr->createEntity("Floor", "floor");
floor->setMaterialName("Examples/BumpyMetal");
mSceneMgr->getRootSceneNode()->attachObject(floor);*/

Ogre::SceneNode* node = mSceneMgr->getRootSceneNode()->createChildSceneNode("penguin2",Ogre::Vector3(-50.0f, 0.0f, 30.0f));
Ogre::SceneNode* node2 = mSceneMgr->getRootSceneNode()->createChildSceneNode("penguin",Ogre::Vector3(0.0f, 0.0f, 0.0f));

Ogre::Entity* penguin2 = mSceneMgr->createEntity("Penguin1", "penguin.mesh");
node->attachObject(penguin2);
node->setScale(0.5f, 0.5f, 0.5f);

Ogre::Entity* head = mSceneMgr->createEntity("Penguin2", "penguin.mesh");
node2->attachObject(head);

// Set idle animation
mAnimationState = head->getAnimationState("amuse");
mAnimationState->setLoop(true);
mAnimationState->setEnabled(true);
mAnimationState->setTimePosition(123);
mListener->addAnimationState(mAnimationState);

// Set idle animation
mAnimationState2 = penguin2->getAnimationState("amuse");
mAnimationState2->setLoop(true);
mAnimationState2->setEnabled(true);
mListener->addAnimationState(mAnimationState2);

}

Ogre::Root* getRoot(){
return mRoot;
}

};

SampleBrowser.cpp

#include "OgrePlatform.h"

#include "game_main.h"
#import

int main(int argc, char *argv[])
{

NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
int retVal = UIApplicationMain(argc, argv, @"UIApplication", @"AppDelegate");
[pool release];
return retVal;

}

@interface AppDelegate : NSObject
{
//UIWindow *window;
NSTimer *mTimer;
//OgreBites::SampleBrowser sb;
SampleBrowser sb;
}

- (void)go;
- (void)renderOneFrame:(id)sender;

@property (retain) NSTimer *mTimer;

@end

@implementation AppDelegate

@synthesize mTimer;

- (void)go {

NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

try {
sb.go();

Ogre::Root::getSingleton().getRenderSystem()->_initRenderTargets();

// Clear event times
Ogre::Root::getSingleton().clearEventTimes();
} catch( Ogre::Exception& e ) {
std::cerr << "An exception has occurred: " <<
e.getFullDescription().c_str() << std::endl;
}

mTimer = [NSTimer scheduledTimerWithTimeInterval:(NSTimeInterval)(1.0f / 60.0f)
target:self
selector:@selector(renderOneFrame:)
userInfo:nil
repeats:NO];

[pool release];
}

- (void)applicationDidFinishLaunching:(UIApplication *)application {
// Hide the status bar
[[UIApplication sharedApplication] setStatusBarHidden:YES];

[self go];
}

- (void)renderOneFrame:(id)sender
{
//[sb.mGestureView becomeFirstResponder];
// Start Rendering
sb.getRoot()->startRendering();

//Ogre::Root::getSingleton().renderOneFrame((Ogre::Real)[mTimer timeInterval]);
}

- (void)applicationWillTerminate:(UIApplication *)application {
Ogre::Root::getSingleton().queueEndRendering();
}

//- (void)applicationWillResignActive:(UIApplication *)application
//{
// // Pause FrameListeners and rendering
//}
//
//- (void)applicationDidBecomeActive:(UIApplication *)application
//{
// // Resume FrameListeners and rendering
//}

- (void)dealloc {
[mTimer release];

[super dealloc];
}

@end

plugins.cfg

# Defines plugins to load

# Define plugin folder
PluginFolder=

# Define plugins
# Plugin=RenderSystem_GL
Plugin=RenderSystem_GLES
Plugin=Plugin_ParticleFX
Plugin=Plugin_BSPSceneManager
Plugin=Plugin_PCZSceneManager
Plugin=Plugin_OctreeZone
Plugin=Plugin_OctreeSceneManager

Da ich ein neuling unter XCode und Mac bin: hier noch ein paar Dinge zu XCode die mir aufgefallen sind:

XCode Section

Eine sehr hilfreiche Sache: Mehrere Zeilen einrücken in XCode macht man mit alt+cmd + 6 zurück dann mit alt+cmd+5

Eine Sache mit der ich als VS Nutzer lange gekämpft habe: Die Settings für den Linker macht man unter:
(Nicht die Project Settings)
$SRCROOT ist beim Einstellen von Pfaden die Varible zu dem Folder in dem sich das Projekt befindet.

FAQ:
iPhone (device) bleibt schwarz – ohne das Fehler angezeigt werden:
1. OpenGL muss immer im haupt thread rendern
2. Haupthread darf nicht blockiert werden. (Zum bsp. mit startRenderloop())

Thunderbird und Google Calendar

Thunderbird wird mit dem Lighting Plugin um eine Kalenderfunktion erweitert, die sich in beide Richuntunge mit dem Google Calendar Synchronisieren lässt. Hier eine kurzanleitung wie man die Synchronisation einstellt:

Thunderbird Kalender:
1. Links unter Kalender -> Rechtsklick -> “Neuer Kalender…” auswählen
2. “Neuen Kalender erstellen” Dialog:
-> Im Internet”  ->  “Weiter” klicken
-> “CalDAV” auswählen, (iCalendar kann nur lesen, aber nicht nach Google Calendar schreiben)
Adrese einegeben:

https://www.google.com/calendar/dav/[ID]/events

[ID]  dabei durch die Kalender Id ersetzen. Die Kalender Id findet man so:
-> In Google Calendar neben dem entsprechenden Kalender auf den kleinen “Pfeil nach unten” klicken und “Kalendereinstellungen” auswählen
-> Unter “Kalenderadresse” steht die entsprechende ID neben den drei Buttons XML ICAL HTML in Klammer mit dem Text “Kalender-ID:”
-> Die ID also einschließlich “@group.calendar.google.com” ist die gesuchte Id

-> Die Adrese kann dann bspw. so aussehen: https://www.google.com/calendar/dav/123abc567@group.calendar.google.com/events

Folgende Einstellungen gelten nur für Thunderbird und werden nicht in den Google Calendar übernommen:

3.  Unter “Name” einen beliebigen Name für den Kalender eintragen
4.  Eine “Farbe” für die Kalendereinträge auswählen
Ggf. den Haken bei “Erinnerungen anzeigen” setzen (Hinweis: Dies gilt auch nur für Thunderbird.)
Bei “E-Mail” kann eine beliebige mail adresse rein
5. Weiter und Fertigstellen klicken

den Vorgang muss man für jeden Kalender wiederholen .

cygwin

… and VIM

Ein Problem das unter vim bei cygwin immer ersteinmal auftritt: die Pfeiltasten beenden den Insert Mode. Backspace funktioniert nicht etc.

Das liegt an der fehlenden conf datei namens: vimrc die vim benötigt um richtig zu funktionieren.
Unter den meisten linux distributionen wird eine bsp conf beim install erstellt, weswegen den meisten nicht klar ist warum vim funktioniert wies eben funktioniert. Unter cygwin wird dieses File leider nicht sofort erstellt. Das heißt das sich vim unter cygwin erstmal so komisch verhält kann man einfach durch kopieren der Bsp Conf datei ändern.

/usr/share/vim/vim62/vimrc_example.vim nach ~/.vimrc (die 62 dabei durch die Version ersetzen einfach mal tabben)

wer die Config für alle User haben möchste schmeißt sie in
/usr/share/vim/vimrc

Nach dem kopieren funktioniert die Backspacetaste und die Pfeiltasten, der Insert Mode wird gelabeld und Syntaxhiglight ist auch an. Eben alles was man so mag :)
Wer noch mehr braucht sollte einfach mal einen Blick in die vimrc werfen, da sind alle Einstellungen dokumentiert.

Pencil – klassische Animationen am Rechner

Ich bin heute durch einen Kollegen auf ein sehr schönes Programm gestoßen, mit dem man klassische Animationen am Rechner machen kann.
Ähnlich wie bei Flash hat man hier eine Zeichenfläche und eine Zeitleiste, so wie eine Layerverwaltung. Im gegesatz zu Flash legt das Programm sein Augenmerk aber auf klassisches zeichnen, und nicht auf Vectorgrafiken.
Für mich ein lange vermisstes Tool am Rechner, auch wenn es sich noch in einem sehr frühen Stadium befindet. Aber da das ganze OpenSource ist kann man ja auch mal einen Blick hinter die Kulissen werfen und eventuell fehlende sachen hinzufügen.
Zu finden ist das ganze hier:www.pencil-animation.org

Windows nach Linux installiern – eeePC

Ich nenne seid diesem Semester einen asus eeePC 1000h mein Eigen. Den Umstand habe ich dann vor einem halben Jahr auch gleich genutzt um mich endlich mal ernsthaft mit Linux auseinader zu setzen. Also habe ich ein Debian installiert und lebe damit glücklich und zufrieden.
Leider kann man mit Linux aber nicht zocken, und da ich ein großer Freund der alten Spielegeneration bin, hat es mich die ganze Zeit gereizt auf dem kleinen doch noch ein Windows paralell zu installieren, um mal eben schnell zu Freunden zu gehen und ne Runde Age of Empire 2 zu spielen.
Nun war das Problem bei der ganzen Sache: bei meiner ersten Debian installation hatte ich keine Partition für Windows vorgesehen. Da ich aber unter keinen Umständen mein Debian neu aufsetzen wollte musste die Festplatte im laufenden Betrieb verkleinert und umpartitioniert werden.

Also war der erste Schritt sich um ein Festplattenimage zu scheren – um im Falle des Falles auch alles wieder herstellen zu können.
Nach einigem suchen entschied ich mich für Clonezilla, wobei ich im Nachhinein sagen muss PartImage währe auch eine gute Wahl gewesen, da es bei SysRescueCd gleich dabei ist. Aber dazu später mehr.

Bevor ich anfange noch eine kleine Anmerkung – ich habe mir nach einigem hin und her mit den bootbaren USB Sticks ein externes CD Laufwerk an den eee angeschlossen, sollte aber eigentlich alles auch vom USB Stick aus gehen – hab ich nur nicht getestet. Aber ich habe ein paar Websiten verlinkt, auf die ich bei meiner Recherche gestoßen bin.

Als aller ersten Schritt bei solchen Aktionen: DATEN SICHERN.
Da ich auch das BackUp tool das ich benutzen werde noch nicht getestet habe, habe ich meine Daten nochmal per cp kopiert.

Dann ging es los mit der erstellung eines bootbaren USB Sticks für Clonezilla. Die Anleitung dazu gibts hier:
http://clonezilla.org/clonezilla-live/liveusb.php
Dann bootet man den Rechner vom USB stick aus (Beim eee erscheint durch esc drücken beim Start das Auswahlmenü).

Alternativ kann man auch an dieser Stelle schon SystemRescueCD beutzen. Dazu erstellt man sich einen Bootbaren USB Stick mit dem SysRescCD System.
Die Anleitung dazu gibts hier:
http://www.sysresccd.org/Sysresccd-manual-en_How_to_install_SystemRescueCd_on_an_USB-stick

Auch das lässt sich dann vom Stick booten – und bringt PartImage mit.

Nach dem die Daten gesichert sind, kann man sich an das Projekt wagen.
Wer es noch nicht gemacht hat braucht spätestens jetzt einen bootbaren Stick mit SystemRescue, denn da ist auch Gparted dabei was uns den Plattenplatz für Windows freischieben soll.
Nur so nebenbei (weil ich da eine ganze Weile dran gebrütet habe): Den Rechner immer schön mit shutdown -hp -t time now runterfahren sonst bootet der Stick nicht nochmal.
Wie man gparted bedient findet ihr hier:

http://www.howtoforge.com/partitioning_with_gparted_p2

Das Umschreiben der Formatierung der Festplatte dauert ne gane Weile (ca. 30 min bis ne Stunde ganz sicher bin ich mir nicht mehr).
Danach ist aber der Platz frei für Windows. Man kann jetzt gparted schließen und die Konsole aufmachen. Hier verstecken wir sicherheitshalber die Linux patitionen damit Windows da bei der Installation nicht drin rumwühlt.(Auch wenn es das eigentlich schon aufgrund des Dateisystems nicht können dürfte – aber bei Windows geh ich immer lieber auf Nummer sicher.)
In der Shell gibt man dann folgendes ein (das nach der # sind Kommentare – die nicht mit eingeben)
grub #öffnet den interactiven Grub modus
hide (hdX,X) #versteckt die Partition X,X ersetzen durch die enstprechenden Platten bsp hd0,0
Wer nicht mehr weiß welche Partition jetzt die Linux partitionen waren -> mit quit raus aus grub und mit fdisk -l nachschauen.
mit quit kann man grub verlassen mit help kann man schauen was man sonst noch alles mit anstellen kann.

So jetzt rechner herunterfahren (ja dran denken shutdown… nicht halt oder solche Späße)

Jetzt entweder das CD Laufwerk anschließen und das klassische “ich installier Windows” spielchen spielen. Oder aber sich mal hier:
http://myeee.wordpress.com/2008/11/14/winsetupfromusb-windows-installation-vom-usb-stick/ ein wenig umschauen und versuchen das ganze vom Stick zum laufen zu kriegen.

Nach der Windows installation sollte das Windows wunderschön booten – aber Grub ist weg und damit auch erstmal Linux. Also muss Grub wieder her. Auch hier hilft SystemRescueCD. Vom Stick booten und ab in die Konsole. Dort dann wieder folgende Befehle ausführen:

grub # startet wieder grub interactive
find /boot/grub/stage1 # gibt die Partition aus auf der Grub installiert ist
root (hdX,X) # X,X durch das ersetzen was find ausgegeben hat
setup (hd0) # installiert Grub in den mbr
unhide (hdX,X) #die Linuxpartitionen die wir vorhin versteckt haben wieder sichtbar machen sonst startet gar nix!
quit

Etwas genauer findet man das ganze hier:
http://ubuntuforums.org/showthread.php?t=224351
diskutiert, und etwas mehr Informationen zu Grub (und vorallem den Fehlermeldungen) gibts hier:
http://www.linuxer.onlinehome.de/apps/grub.htm.

Jetzt müssen wir Grub noch sagen das es da ein Windows gibt. Dazu in die Shell in den Ordner /boot/grub/ wechseln und die Datei menu.lst öffnen. Dort an geigneter Stelle (ganz zum Schluss wenn Windows als letztes in der Auswahlsequenz stehen soll) folgendes eingeben:

title Windows XP
unhide(hd0,1)
root (hd0,1)
makeactive
chainloader (hd0,1)+1

statt (hd0,1) dann eben die entsprechende Partition. Grub fängt bei null an zu zählen wenn die win Partition also wie bei mir sda2 ist dann währe das hd0,1
Gleiches gilt für die unhide aktion. Damit soll sichergestellt werden das Windows seine Platte trotz unserer ganzen hide spielerein auch findet.

Vorsicht ist geboten bei den Empfehlungen die Linuxplatte vor der Windowsplatte per hide zu verstecken.
Das geht einmal gut. Beim nächsten reboot meldet sich Grub dann mit Error 17 – aus dem ganz einfachen Grund, die Platte auf der Grub installiert ist, ist meistens auch die Linuxpartition und die ist versteckt. Da hilft dann nur die Live Cd dann in der shell grub eingeben und dann unhide(hd0,0) (0,0 wieder durch die Grub install platte ersetzen wer sich nicht sicher ist -> alle unhiden)

Ich habe im Netz auch oft den Befehl chainloader+1 gesehen – bei mir ist er nur mir der expliziten Angabe hochgefahren.
Forenbeitrag dazu:
http://www.linuxquestions.org/questions/linux-software-2/grub-windows-xp-ubuntu-631831/
Allerdings kann ich leider nicht genau sagen was dieser Befehl macht.

Nach einem Reboot sollte jetzt grub zu sehen sein, inklusive Windows und Linux zur Auswahl. Viel Spaß damit!

Ach ein paar Windowstreiber findet man hier:

http://support.asus.com/download/download.aspx?SLanguage=de-de

Hier die Produktfamilie eee auswählen, dann den eeepc und dann den 1000h / Windows. Nicht den 1000h / Linux nehmen – da kommt man auch mit der Betriebsystemauswahl : Windows nicht zu allen Treibern.

Bei mir läuft jetzt alles. Age of Empires 2 sowie Diablo II lassen sich Problemlos spielen – weitere Spiele werde ich testen.

Die Vergangenheit …

Ja auch dieser Blog war nicht das erste was ich gemacht habe. Und ich habe ihn erstellt um Projekte zu dokumentieren bei denen ich dabei war und bin. Deswegen möchte ich der Vollständigkeithalber einigen Projekten im nachhinein hier hinein verhelfen.
Ich werde im Gegensatz zu meinen aktuellen Projekten dabei nur eine grobe Zusammenfassung geben und sie als einzellene Posts behandeln auch wenn das nicht besonders schön ist. Aber wo sollen die armen denn sonst unterkommen, wenn ich es nicht schaffe eine Vollständige website zu Programmieren, und vielleicht kommt ja eines schönen Tages der Zeitpunkt an dem dieser Blog nicht mehr alleine ist, sondern Teil einer ganzen Website.
Ich wünsche Viel Spaß beim Stöbern in den alten Kisten ;)

5elements

Das PC-Spiel 5elements ist ein letzte Überbleibsel aus meiner Schulzeit.
Ursprünglich als kleines Browsergame im Informatik Unterricht Klasse 11/12
gestartet, habe ich mit einigen ehemaligen Mitschülern nach dem Abi begonnen das
Konzept auszubauen und das Spiel weiter zu entwickeln.

Nach dem das Konzept abgeschlossen war, habe ich begonnen mich um Design und 3d
Umsetzung zu kümmern.

Weiter Informationen zum Spiel unter: www.5elements-thegame.de

Maya XPM Converter – für Windows

Maya nimmt bekanntermaßen nur XPMs als Icon dateien. Zwar gehen BMPs in der auch
machen in der Praxis aber viel Ärger. Und auch bei den XPMs ist Maya sehr eigen.
Wirklich sicher funktionieren nur jene die mit dem mitgelieferten Konsolen Programm
imconvert Konvertiert wurden.

Dieses kleine Tool gibt diesem Programm eine Oberfläche, und erkennt auch image
Sequenzen selbständig wenn die Nummerierung am Ende des Dateinamens steht und mit
underscore abgetrennt ist.

Es muss ein Pfad C:temp auf dem Rechner bestehen, und die zu konvertierende Datei
muss schon auf 32×32 px gecropt sein.

XPM Converter