Mrz 182015
 

Wie erstellt man einen Index über mehrere Spalten mit JPA Annotation?


@Table(name = "MEINE_TABELLE", uniqueConstraints = @UniqueConstraint(name = "A_B_INDEX", columnNames = { "FeldA", "FeldB" }))
public class MeineTabelleImpl implements MeineTabelle {
@Id
private Long id;
private String FeldA;
private String FeldB;

}

Damit erstellt man automatisch eine Tabelle mit dem Namen „Meine_Tabelle“, mit drei Spalten. Die Spalten FeldA und FeldB sind in einem Index zusammen.

Mrz 122015
 

Zusammenhanglose Liste von Argumenten:

Contra SVN

  • Beim arbeiten mit SVN kann man bei größeren Änderungen erst am Ende alles commiten.
  • Man kann keinen Zwischenstand speichern.
  • Es ist schwerer etwas auszuprobieren , weil man die kleinen Schritte nicht versionieren kann. Man kann nur ganz zurück oder gar nicht. Bedingt hilft die IDE.
  • Änderungen an deiner Datenbank müssen komplett sein, weil sonst das restliche Team unter Umständen nicht arbeiten kann
  • In SVN muss der ganze Commit grundsätzlich komplett sein. Ein großer Umbau muss komplett vollzogen sein, kein lokales Backup – System.

Pro Git:

  • In GIT bestimmt man selber bestimmt den Zeitpunkt der Veröffentlichung.
  • In git kann man viel öfter comitten, weil man erstmal nur lokal bin.
  • Mergen ist um ein vielfaches einfacher
Feb 162015
 

Die einfachste Art und Weise das Zeiss – Menu von der VR One in seinem Projekt ist einzubinden ist:

  1. Öfnen der Vr One Demo Szene.
  2. Das Menu aus der Hierarchy in die eigenen Assets ziehen.
  3. Eigene Scene öffnen.
  4. Das Menu aus den Assets in den eigenen Hierarchy-Baum ziehen.
  5. Leeres GameObjekt erstellen, dort die Klasse „SelectableObject.cs“ hinzufügen und der Klasse das MainMenu aus der Menu-Hierarchy hinzufügen.
  6. Fertig!

 

Feb 132015
 

Wenn man neu in ein Projekt mit Eclipse kommt, dann ist es meist so, dass es nur sauberen Code gibt; keine unnötigen Importe oder ungenutzte Variablen vorhanden und auch sonst sind die Eclipse-Warnungen auf 0. Oder vielleicht gibt es eine Handvoll Warnungen, mehr aber nicht, richtig?

Wer jetzt mit „Richtig“ antwortet, von dem möchte ich bitte einen Screenshot! Meine Erfahrung ist, dass es zwischen 1000 und 10.000 Warnungen gibt, jeder im Team das weiss, aber kaum einer etwas dagegen tut, bzw. nicht genau weiss, wie er das angehen soll.

Jeder kennt das Pfadfinderprinzip: den Code besser hinterlassen, als er vorgefunden wurde. In diesem Fall den Code mit weniger Warnungen hinterlassen. ,Die schiere Menge  verhindert dies allerdings. Man hat keinen Überblick darüber, welche Warnungen schon vorhanden waren und welche man eventuell neu hinzu geschaffen hat und welche zu „meinem“ Bereich gehören.

Was kann man also tun? Woran erkennt man neue Meldungen und woran, welche noch behoben werden sollen?

In Eclipse kann man Working Sets  erzeugen, siehe Link. Damit organisiert man seinen Code im Package Explorer. Für verschiedene Bereiche erstellt man seine Workings Sets.  Was aber weniger bekannt ist, damit kann man auch seine Warnungen filtern.

Dazu die „Marker“ – View öffnen und eine neue View anlegen.

Bildschirmfoto 2015-02-13 um 19.17.31

 

In der neuen Markersview („Projekt“) dann den Inhalt konfigurieren. Bildschirmfoto 2015-02-13 um 19.18.26

 

Dann Einstellen, dass man selber konfiguriert und beim Scope „on working Set“ einstellen. Dort wählt man dann seine Working Sets. Diesw sollten dann die sein, an denen man gerade programmiert.Bildschirmfoto 2015-02-13 um 19.20.27

In der ursprünglichen Markers-View sind weiterhin alle Warnungen erhalten In der neuen Markers-View sind nur noch Warnungen aus dem Bereich, den man gerade bearbeitet. Im Idealfall sind dies dann wirklich nur eine Handvoll und die kann (und sollte) man dann beheben.

Der Schlüssel zum Ganzen sind die Working Sets!

Feb 132015
 

Wenn man eine RegEx-Suche nutzt, hat man den Vorteil, dass man den Suchbegriff beim Ersetzen mit benutzen kann. Kleines Codebeispiel aus Eclipse:

private static final String DB_PATH = "target/chess-db";

Der String „target/chess-db“ soll, warum auch immer,  ersetzt werden durch:

private static final String DB_PATH = String.valueOf("target/chess-db");

Mit RegEx ganz einfach. String markieren und ersetzen durch :

String.valueOf($0)

 

Bildschirmfoto 2015-02-13 um 17.05.43

Mit $0 kann man das erste Ergebnis einer Gruppe wieder verwenden. Es funktioniert nur, wenn man

  1. eine RegEx Suche verwendet, und
  2. man nach dem Gesamten Ausdruck sucht.

Will man beispielsweise alle seine String-Ausdrücke ersetzen und will nicht jedesmal vorher den Begriff markieren um dann erst danach zu suchen. Dann kann man auch mit einem RegEx suchen.
Mit:

"\w+\ *\w*.*"

findet man String zwischen zwei “ “ , allerdings nur, wenn es nicht mehr als einen String pro Zeile gibt.

Wer mehr zu RegEx erfahren möchte, dem kann ich diese Seite empfehlen.

Es lohnt sich, wenn man versucht aus jeder Suche mittels RegEx zu machen. Das übt ungemein und bringt ungeahnte Vorteile mit sich.

Feb 122015
 

Das Script auf das Objekt ziehen, dann hat man mitthis. die Objekt-Eigenschaften.
Beispiel:

// Update is called once per frame
void Update () {
this.transform.Rotate (Vector3.left, rotationSpeed * Time.deltaTime, Space.World);
}

Hat ein Objekt dieses Script, dann dreht sich das Objekt.

Wie kann man ein anderes Objekt ändern?

Wie bekommt man ein anderes Objekt instantiiert? Über FIndByTag oder ähnliche Methoden?

Es ist einfacher!

Das Script bekommt ein public Property

public GameObject gameObject;

Nun kann man direkt von Unity darauf zugreifen und das Objekt, dass im Code benötigt wird benutzen. Beim Starten der Anwendung werden die Objekte dann injekted.
Im Beispiel soll sich nun ein anderes Objekt drehen, hier der Code

public GameObject gameObject;

public float rotationSpeed=60f;
 // Use this for initialization
 void Start () {
 }
 // Update is called once per frame
 void Update () {
 gameObject.transform.Rotate (Vector3.left, rotationSpeed * Time.deltaTime, Space.World);
 }

Und hier der Screenshot. Ein Objekt in der Welt hat das Script und das Objekt B wurde per Drag and Drop hinzugefügt.

Vorher
Bildschirmfoto 2015-02-12 um 21.26.32

Nachher
Bildschirmfoto 2015-02-12 um 21.25.44

 

Feb 122015
 

Zeiss möchte gern, dass die Apps für eine VR One das eigene Menu nutzen. Dort gibt es einen Recenter – Button und einen Media-Launcher um zwischen den Apps zu wechseln.

Wie erstellt man nun son ein Menü mit Launcher und Recenter? Eigentlich ist hier alles beschrieben:

What else do you provide?

Included in the VR One Unity SDK is a simple Menu-prefab, which Zeiss recommends to be integrated into any application. The menu provides two basic functionality:

  1. View recenter, to allow the user to reposition his/her head and have the view adjusted to it.
  2. Jump to VR One Media Launcher button.

By allowing the user to navigate between VR apps directly through head-tracking accessible buttons, the VR One aims provide a consistent virtual reality experience across all the supported apps.

In the demo scene you can see a basic menu set up with a recenter icon and the jump to launcher icon. You can create your own menu by creating an empty game object and adding the script component Menu.cs to it. Each menu is naturally consisted of several buttons. The prefab also allows you to define the layout of your menu.

It is important to note that you need to define a hot spot object that triggers the menu. Create such an object and add SelectableObject.cs to it. Next, drag and drop the menu gameobject into „Menu Prefab“. You can set the menu to be active on start, define a selection time and a progress bar.

Alles klar? Hier noch einmal meine Variante, man kann sich aber auch die Demo angucken und es sich dort abschauen.

Nachdem hinzufügen des SDK zu Unity (ausführlich auch hier beschrieben : https://bitbucket.org/vrone/unity3d ) erstellt man ein leeres GameObjekt für das Menü. Damit der Menüinhalt schön zusammen ist.

Darin erstellt man ein weiteres , leeres GameObjekt, im Beispiel MainMenu

Bildschirmfoto 2015-02-12 um 19.58.27

 

Das MainMenu bekommt das Menu.cs Skript aus dem SDK VROneCOntrols/Scripts/Menus/Menu.cs. Einfach drauf ziehen, sieht dann so aus:

Bildschirmfoto 2015-02-12 um 20.00.41

Bei Rows können wir einstellen, wie viele Zeilen das Menü haben soll, wir nehmen eine Reihe.

Bildschirmfoto 2015-02-12 um 20.01.19

Mit 2 Icons, eines für Recenter, eines für den Media Launcher, aber das kommt später.

Bildschirmfoto 2015-02-12 um 20.11.31

Dann benötigen wir 2 weitere leere GameObjekte, für Recenter und Media Launcher.

Bildschirmfoto 2015-02-12 um 20.13.18

Recenter bekommt das Script CursorAttachment.cs aus VROneControls/Scripts/ und benötigt dann ein Objekt für Recenter Prefab.

Bildschirmfoto 2015-02-12 um 20.24.47

Dort das Prefab „Recenter“ einfügen, liegt unter: VROneControl/Prefabs. Dann sollte es so aussehen:

Bildschirmfoto 2015-02-12 um 20.27.17

Der MediaLauncher bekommt nur das Script OpenUrl.cs aus VROneControls/Scripts/OpenUrl.cs

Damit kann nun das Menü gefüllt werden!

Das MainMenu wieder im Inspector öffnen und im Script alles aufklappen. Zuerst wir Recenter eingerichtet:

Unter Element 0 folgende Einstellungen vornehmen und Objekte hinzufügen:

  • Mat: Bekommt die Textur recenter, aus VROneCOntrols/Textures
  • IsCLoseButton anhaken
  • Callback Component ist unser Recenter Gameobjekt (einfach aus der Hierarchy in das leere Feld (none GameObjekt) ziehen
  • Name ist recenter
  • Tooltip Size ist 2, mit „Center“ und „View“
  • Second State bleibt so
  • Beide Haken für IOS und Android setzen.

Fertig!

Bildschirmfoto 2015-02-12 um 20.37.12

Und ausprobieren!

Aber dafür benötigen wir noch eine Selection!

Wir erstellen eine Sphere und schicken die ins Nirvana (z= 100 oder so) Es ist egal wo die ist, Hauptsache, sie ist da! Sie bekommt das Script: SelectableObjekt.cs aus dem Script Ordner. Einfach drauf ziehen. Auf die leere Variable Menu Prefab ziehen wir das MainMenu und es soll aktiv beim Start sein.

Jetzt ausprobieren!

Entweder auf der VR One oder der Kamera Tastatursteuerung verpassen, siehe ( Link ).

 

Bildschirmfoto 2015-02-12 um 20.54.06

Da isses 🙂

Die Einstellungen für den MediaLauncher bitte aus dem Bild entnehmen. Falls es dann noch Fragen gibt, einfach fragen!

MediaLauncher:

Launcher

Feb 112015
 

Es ist hilfreich, wenn man die VR One auch mit der Tastatur bewegen kann. Dadurch erspart man sich jedes Mal ein Deployen.

Nachfolgendes Script einfach auf VROneSDK ziehen und schon lässt dich die VR One mit der Tastatur bedienen.


using UnityEngine;
using System.Collections;

public class SImpleMove : MonoBehaviour {

public float schritt = 0.2f;
// Use this for initialization
void Start () {

}

// Update is called once per frame
void Update () {
if (Input.GetKeyDown(KeyCode.LeftArrow))
{
Vector3 position = this.transform.position;
position.x =position.x-schritt;
this.transform.position = position;
}
if (Input.GetKeyDown(KeyCode.RightArrow))
{
Vector3 position = this.transform.position;
position.x=position.x+schritt;
this.transform.position = position;
}
if (Input.GetKeyDown(KeyCode.UpArrow))
{
Vector3 position = this.transform.position;
position.y=position.y+schritt;
this.transform.position = position;
}
if (Input.GetKeyDown(KeyCode.DownArrow))
{
Vector3 position = this.transform.position;
position.y=position.y-schritt;
this.transform.position = position;
}
}
}

Wer die Kamera nicht nach rechts und links bewegen, sondern drehen will, ändert den Code für rechts und links auf:

if (Input.GetKeyDown(KeyCode.LeftArrow))
{
transform.Rotate (Vector3.up, -schritt * rotationSpeed * Time.deltaTime);
}
if (Input.GetKeyDown(KeyCode.RightArrow))
{
transform.Rotate (Vector3.up, schritt * rotationSpeed * Time.deltaTime);
}

Empfohlen mit
public float rotationSpeed = 60.0f;
public float schritt = 10f;

Public, damit es beim Testen von aussen änderbar ist!