Donnerstag, 18. April 2013

NFS on RedHat based Servers

How to mount a folder on a RedHat based server (client) from an other server (server).

This short blog describe how you can mount a folder from an other unix server with NFS. After the mount process you got read/write access to the mounted folder.

Prerequisite
  • nfs-utils
  • rpcbind (yum install nfs-utils rpcbind)

1. Create a user on both servers with the same UID and Group

To access the mounted directory later on you have to create a user with the same UID on both server, otherwise you can't write to the mounted folder.

useradd testuser -u 1200

2. Settings for the "server" Server

Open "/etc/exports with your favourite text editor from the server.  For each directory you'd like to give access, you have to add the following line. In this example we share the "testFolder" for the client with the IP 10.2.3.4. You can use hostnames, IP's, netmasks and wildcards to identify the client
/tmp/testFolder 10.2.3.4(rw,sync)
After you added the mount points you have to reload your configuration
exportfs -ar
Now we have to start the services 
service rpcbind start
service nfs start
service nfslock start
If you like to have your services started after a reboot, you have to add them to the "chkconfig"
chkconfig --level 2345 rpcbind on
chkconfig --level 2345 nfs on
chkconfig --level 2345 nfslock on

3. Settings for the "client" server

On the client you need to start the following two services. 
service rpcbind start
service nfslock start
chkconfig --level 2345 rpcbind on
chkconfig --level 2345 nfslock on
Now you need to create a folder as a mount point and then mount the NFS Server
mkdir /tmp/myMountFolder
mount -o rw -t nfs 10.0.0.122:/tmp/testFolder /tmp/myMountFolder/
You can easy unmount the mount point
umount /tmp/myMountFolder/
If you like to have your mounts created at startup you can edit "/etc/fstab"
10.0.0.122:/tmp/testFolder   /tmp/myMountFolder/  nfs rsize=8192,wsize=8192,timeo=14,intr 0 0



Montag, 18. Februar 2013

Build your Android App with shell commands

Build your Android app with shell commands for continuous integration tools like Jenkins

Google offers a very smoth way to build your android apk's with shell commands and ant task. These four steps will guide you to get a signed apk in no-time for test distribution.
We at impac use those steps in nightly jenkins jobs which builds our android apps for our continuous integration process.


Prerequisite
  • Installed Android SDK's
  • Installed Android Targets (e.g. 4.0.3, 4.2, ......)
  • Buildable Android App Projekt

1. Create the keystore (if you don't allready have one)

keytool -genkey -v -keystore my-release-key.keystore -alias alias_name -keyalg RSA -keysize 2048 -validity 10000
Above command creates the keystore file. You have to follow the prompts in your shell to complete the keygen process. We will use this file later to sign the android apk. You only have to generate the keystore file once.

2. Create the build.xml file

android update project --target <TARGET> --path <PATH> --subprojects
The update project command creates the "build.xml" file which includes all the build informations for the "ant" process. You can specify the <TARGET> version (Android Version) .To list all your installed <TARGET> versions you can call 

android list target

You need to add your project location <PATH>

3. Build the APK with ANT

ant release -Dkey.store=<KEYSTORE-FILE> -Dkey.alias=<KEYSTORE-ALIAS> -Dkey.alias.password=<KEYALIAS-PWD> -Dkey.store.password=<KEYSTORE-PWD>
This ant command builds your apk and signs it with your keystore made in step 1. You could also build a unsigned debug version with "ant debug".
On our release command you have to set the four properties for the keystore.

4. Deliver your APK to testers


The "ant" command creates the "apk" in the "bin/" folder of your project. You can now move your APK to a website or send it via email to your testers.

You could now create a Jenkins job with the steps 2-4 and trigger the job to version control commits. This gives you the possibility to always share your newest build to testers. Step 1 is only needed once and should not be located in a jenkins job.



Freitag, 21. September 2012

rubygems file_split

Im Zuge eines Massen-Imports von SQL Daten haben wir dieses gem entwickelt. Damit kann man via Ruby-Modul als auch via Befehlszeile (mittels GLI gem) grosse Dateien in mehrere kleine aufteilen.

Das Modul FileSplit beinhaltet die Klasse FileSplitter mit folgendem Aufbau:
  • source (required, gli alias: -s): Die Quelldatei
  • target (required, gli alias: -t): Die resultierenden Dateien werden nach diesem Muster #{basename(target)}_n.#{extname(target)} gespeichert.
  • lines (default: 1000, gli alias: -l): Die Aufteilung erfolgt anhand der Anzahl Zeilen. Es kann ein Maximum von Zeilen festlegt werden.
  • maxlines (default: 0, gli alias: -m): Die Maximal-Anzahl der zu splittenden Zeilen.
  • header (default: 0, gli alias: -h): Anzahl der Zeilen in der Quelldatei, die den Header ausweisen, wird in jedem Target wiederholt.
  • footer (default: 0, gli alias: -f): Anzahl der Zeilen in der Quelldatei, die den Footer (also letzte n Zeilen) ausweisen, wird in jedem Target wiederholt.
Bei der Verwendung via Befehlszeile müssen die Optionen in den global Variables eingegeben werden, also noch vor dem Befehl split:

lib/file_split -s /in/source.sql -t /out/split.sql -l 2000 -h 2 -f 1 split

Als Modul:

FileSplit.start "/in/source.sql", "/out/split.sql", 2000, 0, 2, 1

Link zum gem: http://www.rubygems.org/gems/file_split

Montag, 9. Januar 2012

3D-Animation mit WebGL

Dieser Post zeigt wie man im Browser eine 3D-Animation mit WebGL programmieren kann. WebGL ist eine Mischung zwischen JavaScript und OpenGL. Der Vorteil davon ist, dass die Berechnung der Bildbearbeitung auf der Grafikkarte passiert und dadurch performanter ist. Weil WebGL eine relativ neue Technologie ist, gibt es auch einige Einschränkungen, welche beachtet werden müssen:
  • WebGL läuft nur auf Browsern, welche HTML5 unterstützen
  • Im IE ist WebGL nicht implementiert, es gibt jedoch ein kostenpflichtiges Plugin (http://iewebgl.com/) um dieses Problem zu beheben
  • Auf dem Client ist eine Grafikkarte die OpenGL unterstützt erforderlich
Wir programmieren einen 3D-Würfel mit einem Logo, welcher mittels der Maus um sämtliche Achsen gedreht werden kann. Das Resultat kann hier betrachtet werden. Im folgenden werden einige Aspekte angeschaut, Details können dem Blog Learning WebGL entnommen werden.

Shaders

Shader sind Miniprogramme, welche direkt auf der Grafikkarte ausgeführt werden um eine Grafik zu berechnen. Für jede WebGL Grafik gibt es zwei Shaders, ein Vertex-Shader und ein Fragment-Shader, welche in der Sprache GLSL geschrieben werden. Um Berechnungen durchzuführen wird als erstes der Vertex-Shader aufgerufen. In diesem werden die einzelnen Koordinaten (Vertices) mit einer Matrize multipliziert um die Positionen einer 3D-Grafik in Pixel zu berechnen. Der Output dieser Berechnung wird dem Fragment-Shader übergeben, welcher die einzelnen Punkte linear interpoliert um die 3D-Grafik als Ganzes darzustellen. Dieser Abschnitt ist keine Definition, sondern beschreibt nur den Ablauf des Renderings auf einem sehr abstrakten Level!

Vertex

Vertex oder in Mehrzahl Vertices sind Koordinaten von einzelnen Punkten in einem 3D-Koordinatensystem mit einer X-, Y- und Z-Achse. Diese dienen dazu, Objekte auf einer Leinwand (Canvas) zu positionieren. Jeder 3D-Grafik besteht aus n Vertices, welche ihr aussehen beeinflussen.

Aufbau des Programms

In ein HTML-Dokument wird ein canvas eingebettet, welches seit HTML5 zum Funktionsumfang gehört. Deshalb muss der Browser HTML5 unterstützen um WebGL-Objekte darstellen zu können.

Beim laden der Seite wird die JavaScript-Funktion webGLStart aufgerufen, welche dafür verantwortlich ist, dass das canvas mit der 3D-Grafik angezeigt wird. In dieser Funktion werden nacheinander die Funktionen initGL, initShaders, initBuffers, initTextures und tick aufgerufen.

Die Funktion initGL überprüft ob WebGL auf dem Client unterstützt wird und füllt im Erfolgsfall das GL-Objekt ab. In der Funktion initShaders werden die Shaders kompiliert und an das GL-Objekt angehängt. In initBuffers werden die Koordinaten für das Objekt in ArrayBuffers gefüllt und dem GL-Objekt angehängt. Dasselbe geschieht in initTextures mit den Textures. Textures sind Bilder, welche auf die 3D-Grafik gelegt werden.

Die tick-Funktion wird in einer Endlosschleife (requestAnimFrame) aufgerufen und zeichnet die Grafik mittels drawScene neu auf den Bildschirm.

Mittwoch, 13. Juli 2011

Oracle Tabelle in einen anderen Tablespace verschieben

Das Verschieben einer Tabelle von einem Tablespace in einem anderen sollte nur in Ausnahmefällen erfolgen. Dies kann z.B. notwendig sein, wenn die Performance drastisch sinkt. Sämtliche Indizes dieser Tabelle werden gelöscht und müssen neu erstellt werden.

alter table [schema].[ursprungs_tabelle] move tablespace [ziel_tablespace];

Die Indizes müssen neu gebildet werden.

alter index [schema].[index]  rebuild;

Donnerstag, 7. Juli 2011

Rails Migrations mit Oracle Enhanced Adapter

Da Oracle für verschiedene numerische Datentypen nur den Datentyp NUMBER kennt, kann dies zu Problemen führen, wenn eine Rails-Applikation auf eine bereits bestehende Datenbank zurückgreift. Wird eine neue Tabelle mit Hilfe von Migrations angelegt, werden die Datentypen wie folgt zugewiesen:
 :boolean => number(1)  
 :integer => number(38)  
 :float => number  
 :decimal => decimal  

Sind Integer-Werte in der bestehenden Datenbank mit NUMBER ohne Grössenangabe definiert, werden diese in der Rails-Applikation standardmässig als BigDecimal behandelt. Dies kann sich fehlerhaft auf die Applikation auswirken (Darstellungsprobleme, Vergleichsabfragen etc.).

Um das Problem zu lösen, können verschiedene Ansätze gewählt werden:

Wenn möglich, sollte der Datentyp auf der Datenbank angepasst werden (z.B. NUMBER(12)).
Mit der Option
 emulate_integers_by_column_name  
kann eingestellt werden, dass alle Datenbankfelder, welche auf ID enden, in der Applikation als Fixnum behandelt werden. Dazu kann die Datei config/initializers/oracle_enhanced.rb angelegt und mit folgendem Code abgefüllt werden:
 ActiveRecord::ConnectionAdapters::OracleEnhancedAdapter.emulate_dates_by_column_name = true  

Um die Einstellungen global zu ändern, kann die Methode is_integer_column aus der Klasse OracleEnhancedAdapter überschrieben werden.

Müssen nur spezifische Attribute angepasst werden, können für diese im Model die Getter-Methode überschrieben werden.
 def attr   
  self[:attr].to_i if self[:attr].kinf_of? Numeric   
  self[:attr]  
 end  

Dienstag, 21. Juni 2011

jQuery Mobile Beta 1 veröffentlicht

Das JQuery Mobile Team hat die Beta 1 Version veröffentlicht. Es wurde viel Arbeit in Kompatibilität, Geschwindigkeit und Erweiterbarkeit gesteckt. Die Version 1.0 ist für den späten Sommer geplant. Bis dahin werden weitere Betaversionen in einem höheren Rhythmus veröffentlicht.
Die Kompatibilität wurde auf Blackberry 5 und Opera Mini ausgedehnt. WP7 wurde bereits in der Alpha 4 unterstützt.

Mehr dazu im offiziellen Blog-Post