tag:blogger.com,1999:blog-14665793652980715792024-02-19T02:48:47.698+01:00Kurts WeltAnonymoushttp://www.blogger.com/profile/00518780909495894706noreply@blogger.comBlogger54125tag:blogger.com,1999:blog-1466579365298071579.post-38823105764090495222013-05-28T20:39:00.000+02:002013-05-28T20:39:00.978+02:00Android SDK v22 und IDEA IntelliJSpielt man die neueste Version 22 des Android Development Kits (ADK) auf, so kann man mit IDEA IntelliJ seine Projekte nicht mehr kompilieren. Neben dem <a href="https://plus.google.com/u/0/109641424466258907138/posts/8iqLxkuTvMZ">Problem mit den fehlenden Build-Tools</a> liegt es auch daran, dass einige Sachen nicht mehr dort sind, wo sie noch bei Version 21 waren. Man erhält den Fehler<br />
<br />
<span style="font-family: Courier New, Courier, monospace;">android-apt-compiler: Cannot run program "/opt/android-sdk-linux_86/platform-tools/aapt": error=2, Datei oder Verzeichnis nicht gefunden (File or directory not found).</span><br />
<br />
Setzt man den Link, so klappt dieser Schritt, aber der nächste scheitert mit<br />
<br />
<span style="font-family: Courier New, Courier, monospace;">Android Dex: Cannot find file /opt/android-sdk-linux_86/platform-tools/lib/dx.jar</span><br />
<br />
Um beide Probleme zu lösen und wieder kopilieren zu können, wechselt man im ADK Verzeichnis in das Unterverzeichnis <span style="font-family: Courier New, Courier, monospace;">platform-tools</span> und setzt zwei Symbolische Links:<br />
<br />
<span style="font-family: Courier New, Courier, monospace;">ln -s ../build-tools/17.0.0/aapt .</span><br />
<span style="font-family: Courier New, Courier, monospace;">ln -s ../build-tools/17.0.0/lib .</span><br />
<br />
Und schon kann man wieder kompilieren.Anonymoushttp://www.blogger.com/profile/00518780909495894706noreply@blogger.com0tag:blogger.com,1999:blog-1466579365298071579.post-77170178585362168862013-05-08T07:40:00.000+02:002013-05-13T11:03:08.065+02:00Google Maps API v2 im Android EmulatorGoogle hat seine Maps Anwendung auf die <a href="https://developers.google.com/maps/documentation/android/">Version 2</a> aktualisiert. Diese lässt sich nicht so einfach im Android Emulator verwenden, denn dieser wird mit der alten Version ausgeliefert und eine Anwendung, die die neue API verwendet, liefert nur eine Fehlermeldung, dass man Upgraden soll. Es gibt aber einen Trick, wie man Google Maps trotzdem im Emulator zum Laufen bekommt:<br />
<br />
Zuerst benötigt man ein AVD mit mindestens API Level 9 (2.3.1), aber <b>ohne Google APIs</b>:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjx5b7djPua6u9QcurMdPAOgk_-4Vok-VPr4oncfLYisOBy2nI6BFkPtlIl3kI9ht7la_YwAWb6oYlS4QR_YMRhFyvnFqsaIkmn_eniCwKFs1XwZddyJoUaQTrpCx1pzbJHkMiyZxYsygU/s1600/avd-2.3.1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjx5b7djPua6u9QcurMdPAOgk_-4Vok-VPr4oncfLYisOBy2nI6BFkPtlIl3kI9ht7la_YwAWb6oYlS4QR_YMRhFyvnFqsaIkmn_eniCwKFs1XwZddyJoUaQTrpCx1pzbJHkMiyZxYsygU/s400/avd-2.3.1.png" width="338" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
Emulator Einstellungen aus dem Android SDK</div>
<br />
Man kann auch eine höhere Version wählen, aber wie gesagt muss sie ohne Google APIs sein. Google Maps sollte laut Manifest auch mit Version 8 laufen, aber man erhält dann eine Fehlermeldung über ein inkompatibles CPU/ABI Interface.<br />
<br />
Als nächstes benötigt man zwei APKs, die man am besten von einem gerooteten Android erhält:<br />
<br />
<span style="font-family: Courier New, Courier, monospace;">adb -d pull /data/app/com.android.vending-2.apk</span><br />
<span style="font-family: 'Courier New', Courier, monospace;">adb -d pull /data/app/com.google.android.gms-2.apk</span><br />
<br />
Sollten die Dateien nicht gefunden werden, kann man mit<br />
<br />
<br />
<span style="font-family: Courier New, Courier, monospace;">adb -d shell</span><br />
<span style="font-family: Courier New, Courier, monospace;">shell@android:/$ su</span><br />
<span style="font-family: Courier New, Courier, monospace;">shell@android:/# ls /data/app/</span><br />
<br />
nachsehen, ob sie eventuell doch eine andere Zahl hinten stehen haben. Hier die MD5-Prüfsummen der aktuellen Dateien:<br />
<br />
<span style="font-family: inherit;">558e12681e333d91f39f688aadbaf6ee com.android.vending-2.apk</span><br />
<span style="font-family: inherit;">2d3daf756852d813cd78366342b33d4d com.google.android.gms-2.apk</span><br />
<div>
<br /></div>
<div>
Jetzt kann man den Emulator starten und die APKs installieren</div>
<div>
<br /></div>
<div>
<span style="font-family: Courier New, Courier, monospace;">adb -e install com.android.vending-2.apk</span></div>
<div>
<span style="font-family: Courier New, Courier, monospace;">adb -e install com.google.android.gms-2.apk</span></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjU4MlJtLlS5tCLMgkBuWGgn9ivTlZ8Ws10gna8hSn9aI0g-NIVHlIt2wacEg_IXFokNbZFZuLsMbRPpk0C0TFII7QK0N-nWV7_r-gin0rONpOI9Ut9hID1doZnROU5ihhKUBdN-XpoJqg/s1600/emulator.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="302" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjU4MlJtLlS5tCLMgkBuWGgn9ivTlZ8Ws10gna8hSn9aI0g-NIVHlIt2wacEg_IXFokNbZFZuLsMbRPpk0C0TFII7QK0N-nWV7_r-gin0rONpOI9Ut9hID1doZnROU5ihhKUBdN-XpoJqg/s400/emulator.png" width="400" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
Google Maps API v2 im Android Emulator</div>
<div>
<br /></div>
<div>
Will man Google Maps direkt verwenden, benotigt man noch <span style="font-family: Courier New, Courier, monospace;">com.google.android.apps.maps-1.apk</span>, wobei man hier aufpassen muss, von welchem Gerät man sie bekommt. Die von meinem Nexus 4 läuft nur ab API Level 14 (4.0):</div>
<div>
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjJEYzq4Bn8fn-bgMm_e6GEFwluWk2k1zWip78T_E2ABpvb2i3nncZHVexHB2y0ApnPOAZLXRvBChFIbix_3BLQs2O5Do6G55usIZNNVsZaX7HLgs9B3HUPRwLVCyIEquDRzzqCckjQuig/s1600/maps.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="302" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjJEYzq4Bn8fn-bgMm_e6GEFwluWk2k1zWip78T_E2ABpvb2i3nncZHVexHB2y0ApnPOAZLXRvBChFIbix_3BLQs2O5Do6G55usIZNNVsZaX7HLgs9B3HUPRwLVCyIEquDRzzqCckjQuig/s400/maps.png" width="400" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
Google Maps im Emulator</div>
<div>
<br /></div>
Anonymoushttp://www.blogger.com/profile/00518780909495894706noreply@blogger.com0tag:blogger.com,1999:blog-1466579365298071579.post-91087627004169838802013-04-18T17:59:00.001+02:002013-04-18T17:59:26.691+02:00Langsame USB Sticks unter Kubuntu beschleunigenUnter Kubuntu werden USB-Sticks mit der Option "sync" gemountet. Dies hat auf meinem System zur Folge, dass nur mit ca. 150kB/s auf den Stick geschrieben wird. Man erkennt einen solchen Mount, an der Ausgabe des Befehls mount:<br />
<br />
<br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;">/dev/sdc1 on /media/disk type vfat (rw,nosuid,nodev,sync,gid=46,umask=002,uhelper=hal)</span><br />
<div>
<br /></div>
<div>
Um das Verhalten umzustellen, muss man in der Datei</div>
<div>
<br /></div>
<div>
<span style="font-family: Courier New, Courier, monospace;">/etc/halevt/halevt.xml</span></div>
<div>
<br /></div>
<div>
alle 4 Stellen mit "-o sync" entfernen und danach mit</div>
<div>
<br /></div>
<div>
<span style="font-family: Courier New, Courier, monospace;">service halevt restart</span></div>
<div>
<br /></div>
<div>
die Änderungen aktivieren. Danach werden USB-Sticks so gemountet:</div>
<div>
<br /></div>
<div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;">/dev/sdc1 on /media/disk type vfat (rw,nosuid,nodev,gid=46,umask=002,uhelper=hal)</span></div>
</div>
<div>
<br /></div>
<div>
und die Geschwindigkeit ist deutlich höher. Aber Vorsicht! Durch das fehlende Sync wird der Schreib-Cache aktiviert, so dass Schreibzugriffe den Eindruck erwecken, sie währen abgeschlossen, aber in Wirklichkeit schreibt Linux im Hintergrund noch auf den USB-Stick. Deshalb den Stick nach einem Schreibvorgang nicht abziehen, sondern sauber aushängen.</div>
Anonymoushttp://www.blogger.com/profile/00518780909495894706noreply@blogger.com0tag:blogger.com,1999:blog-1466579365298071579.post-64766184204539403992013-04-03T22:48:00.001+02:002013-05-20T14:26:27.004+02:00VMware Server 2.0 auf Ubuntu 12.04 LTS installierenIch habe (mal wieder) einen Ubuntu 12.04 LTS-Server mit einem VMware Server 2.0.2 versorgt. Dieses Produkt ist seit 2010 eingestellt, funktioniert aber immer noch prächtig. Allerdings ist die Installation unter einem neueren Linux nicht so einfach. Die Vorgehensweise ist für Fedora <a href="http://forums.fedoraforum.org/showthread.php?t=275000">hier</a> beschrieben. Unter Ubuntu macht man Folgendes:<br />
<br />
Zuerst die notwendigen Pakete installieren:<br />
<pre>apt-get -y install linux-headers-$(uname -r) build-essential patch unp module-assistant
</pre>
Dann das Paket <a href="https://my.vmware.com/web/vmware/info/slug/infrastructure_operations_management/vmware_server/2_0">VMware-server-2.0.2-203138.x86_64.tar.gz</a> auspacken und installieren:<br />
<br />
<pre>unp VMware-server-2.0.2-203138.x86_64.tar.gz
cd vmware-server-distrib
./vmware-install.pl
</pre>
<br />
Hierbei alle Werte auf den Vorgaben belassen, aber 'vmware-config.pl' noch nicht starten lassen. In der Datei '/etc/default/grub' diesen Eintrag setzen, um den NMI Watchdog zu deaktivieren:<br />
<br />
<pre>GRUB_CMDLINE_LINUX="nmi_watchdog=0"
</pre>
und die Änderung mit<br />
<br />
<pre>update-grub2
</pre>
aktivieren und rebooten. Danach diese Befehle eingeben, um VMware auf den neueren Kernel vorzubereiten:<br />
<br />
<pre>cd ~</pre>
<pre>m-a prepare</pre>
<pre>ln -s /usr/src/linux-headers-`uname -r`/include/generated/autoconf.h /usr/src/linux-headers-`uname -r`/include/linux/autoconf.h
ln -s /usr/src/linux-headers-`uname -r`/include/generated/utsrelease.h /usr/src/linux-headers-`uname -r`/include/linux/utsrelease.h</pre>
<pre></pre>
<pre><span style="font-family: 'Times New Roman'; white-space: normal;">Die obigen Befehle muss man auch eingeben, nachdem ein neuer Kernel installiert wurde.</span></pre>
<pre>wget http://www.jlbond.com/downloads/vmware-server-2.0.2-203138-linux_2.6.42+.tar.bz2
tar xvjf vmware-server-2.0.2-203138-linux_2.6.42+.tar.bz2
patch -d /usr/bin -p0 < vmware-config.pl.patch
pushd /usr/lib/vmware/modules/source
mkdir backups; cp -a *.tar backups/
mkdir working; ls *.tar | xargs -n 1 tar -C working/ -xf
pushd working
patch -p1 < ~/vmware-server-2.0.2-203138-linux-2.6.42.patch</pre>
<pre>tar cf ../vmci.tar vmci-only
tar cf ../vmmon.tar vmmon-only
tar cf ../vmnet.tar vmnet-only
tar cf ../vsock.tar vsock-only
popd; rm -rf working/ ;popd
pushd /usr/lib/vmware/lib; mv libxml2.so.2 SKIP-libxml2.so.2 ; popd
</pre>
Danach kann VMware konfiguriert werden<br />
<br />
<pre>vmware-config.pl
</pre>
Hierzu benötigt man einen gültigen Lizenzschlüssel. Er beschwert sich auch über die Version des GCC Compilers - hier einfach die Frage, ob der Compiler ok ist, mit "yes" beantworten. Nach dem Ende des Skriptes läuft der Server schon und kann unter<br />
<br />
http://<server>:8222/<br />
<br />
oder<br />
<br />
https://<server>:8333/<br />
<br />
erreicht werden. Anmelden kann man sich mit den Zugangsdaten von Root, sprich Benutzername "root" und dessen Passwort. Hat er noch keines, muss eines mit<br />
<br />
<pre>passwd root
</pre>
vergeben werden. Sinnvollerweise erlaubt man als erstes einem anderen die Administration und entfernt dann wieder das Passwort für root beispielsweise mit<br />
<br />
<pre>passwd -l root
</pre>
Standardmäßig sind die Ports 902/TCP, 8222/TCP und 8333/TCP für alle offen. Sollte der Server am Internet betrieben werden, dann am besten über die Firewall sperren, z.B. so alle Zugriffe über eth0:<br />
<br />
<pre>iptables -A INPUT -i eth0 -p tcp --dport 902 -j DROP
iptables -A INPUT -i eth0 -p tcp --dport 8222 -j DROP
iptables -A INPUT -i eth0 -p tcp --dport 8333 -j DROP
</pre>
Will man dann selbst zugreifen kann man beispielsweise einen SSH-Tunnel aufbauen:<br />
<br />
<pre>ssh -L 8222:localhost:8222 <server>
</pre>
dann kann man über<br />
<br />
http://localhost:8222/<br />
<br />
auf den Server zugreifen.Anonymoushttp://www.blogger.com/profile/00518780909495894706noreply@blogger.com11tag:blogger.com,1999:blog-1466579365298071579.post-26917274775775670182013-03-08T11:14:00.000+01:002013-03-08T11:14:31.845+01:00Bigdata, NoSQL, was ist das überhaupt? Intermezzo<br />
<div style="background-color: white; color: #222222; font-family: arial, sans-serif; font-size: 13px;">
Ich hab eine Frage bekommen: braucht man NoSQL aktuell in der Wirtschaft wirklich?</div>
<div style="background-color: white; color: #222222; font-family: arial, sans-serif; font-size: 13px;">
<br /></div>
<div style="background-color: white; color: #222222; font-family: arial, sans-serif; font-size: 13px;">
BigData und NoSQL sind die logischen Ergebnisse der aktuellen Entwicklung: die Datenmengen werden immer größer, weil immer mehr Prozesse technisiert werden (ELSTER, SEPA etc.), immer mehr Daten generiert werden (Megapixel, FullHD, 3D, etc.) und immer mehr Ereignisse elektronisch erfasst werden (Smart Meter, Bio-Monitoring, Web-Logging, etc.). Das Problem ist, dass die Speichertechnologie hierbei nicht mitkommt. Ein Speichermedium zeichnet sich zur 2 Eigenschaften aus:</div>
<div style="background-color: white; color: #222222; font-family: arial, sans-serif; font-size: 13px;">
<ol>
<li>Kapazität</li>
<li>IO-Leistung, aufgeteilt in<br />a. Anfragen pro Sekunde<br />b. Durchsatz pro Sekunde</li>
</ol>
</div>
<div style="background-color: white; color: #222222; font-family: arial, sans-serif; font-size: 13px;">
Während 1. in den letzten 15 Jahren um den Faktor 4.000 gestiegen ist, hat sich 2. nur um den Faktor 10 verbessert. Die Erfahrung zeigt, dass Festplatten immer zu 80-90% voll sind, unabhängig von der Größe (stimmt vom meiner ersten 20MB Festplatte bis zu meinen heutigen 3 TB). Dies bedeutet, dass wir heutzutage 400 mal langsamer sind, als vor 15 Jahren, wenn wir alle unsere Daten lesen wollen. Deshalb ist es unklug zu glauben, man kann die gleiche Vorgehensweise, wie vor 15 Jahren verwenden. NoSQL sorgt dafür, dass man weniger Anfragen pro Sekunde benötigt, um die gleiche Leistung zu erzielen, während die BigData-Produkte den Durchsatz pro Sekunde durch massive Parallelisierung erhöhen.</div>
<div style="background-color: white; color: #222222; font-family: arial, sans-serif; font-size: 13px;">
<br /></div>
<div style="background-color: white; color: #222222; font-family: arial, sans-serif; font-size: 13px;">
Berechtigt ist die Frage natürlich, was das ganze der Wirtschaft bringt. Genau die gleiche Frage wurde vor 70 Jahren gestellt, als die ersten Rechenmaschinen aufkamen. Und es ist klar, "a fool with a tool is still a fool". NoSQL macht Dinge wie eBay, Facebook, Google erst möglich. BigData schafft es, zeitnah Informationen zu liefern. Ich weiß von einem Beispiel eines großen Telefonanbieters, bei dem in einer Vorstandssitzung eine Frage aufkam. Diese konnte die Technik mit klassischem SQL nach 4 Tagen beantworten. Nach der Umstellung auf BigData konnten ähnliche Fragen in 5 Minuten beantwortet werden. Bei Scooter Attack hatte ich ähnliche Erfolge erzielen können, dort aber von 2 Minuten runter auf 5 Sekunden. Und Speicherkapazität von 9 GB auf 0,5 GB. Es geht auch gar nicht so sehr um die Frage, ob NoSQL/BigData besser oder schlechter ist, als klassisches SQL. Es geht vielmehr darum, welches für was am besten geeignet ist. Früher gab es nur SQL; jetzt kann man zwischen zwei Möglichkeiten wählen, die beide ihre Stärken und Schwächen haben. Was man daraus macht, das bleibt einem immer noch selbst überlassen.</div>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-1466579365298071579.post-42517452770724819032013-02-24T20:55:00.001+01:002013-02-24T20:55:26.724+01:00Bigdata, NoSQL, was ist das überhaupt? Teil 2: ACID vs NoSQL
Sobald man auf einer Datenbank mehrere Befehle gleichzeitig ausführen will, beispielsweise von mehreren Benutzern, muss man sich Gedanken über die Koordinierung der Zugriffe machen. Glücklicherweise haben dies bereits viele schlaue Leute gemacht und deshalb hat man dieses Thema vor einigen Jahren als erledigt angesehen: ACID lautet die Lösung, die so allgegenwärtig ist, dass man sich lange nicht vorstellen konnte, wie eine Datenbank ohne ACID überhaupt benutzbar sein soll. ACID beschreibt 4 Anforderungen an eine Datenbank, die einen geordneten Betrieb beim gleichzeitigen Zugriff sicher stellen. Wo Licht ist, ist auch Schatten und so hat ACID nicht nur Vorteile, sondern es bremst in der Praxis Datenbanken aus. NoSQL bricht mit diesen Anforderungen und kann so deutlich höhere Leistungszahlen erreichen. Was ist ACID, warum bremst es die Datenbank aus und wie schafft eine NoSQL-Datenbank es, ohne ACID einen geordneten Zugriff sicher zu stellen? Um diese Fragen geht es in den folgenden Absätzen.<br />
<h2>
A - Atomic</h2>
Das A in ACID steht für Atomic, womit gemeint ist, dass jede Operation auf der Datenbank unteilbar ist, eben "atomar". Dies bedeutet, dass jeder Befehl entweder komplett ausgeführt wird oder komplett nicht ausgeführt wird. Aktualisiert man beispielsweise alle Datensätze, so sind entweder alle aktualisiert oder keiner. Über so genannte Transaktionen gilt dies auch für eine Folge von Befehlen. Dies ist wichtig für Umbuchungen, beispielsweise von einem Konto auf ein anderes: der erste Befehl verringert den Kontostand des Ausgangskontos und der zweite Befehl erhöht den des Zielkontos. Es wäre fatal, wenn nur der erste Befehl ausgeführt wird und nicht der zweite, denn dann würden sich Kunden schnell beschweren.<br />
<br />
Um diese Funktionalität sicher zu stellen, muss eine Datenbank mit so genannten Sperren arbeiten: Datensätze oder ganze Tabellen werden gegen den Zugriff von anderen Transaktionen gesperrt. Eine triviale Implementation würde im oben genannten Umbuchungs-Beispiel die Datensätze beider Konten sperren, bis die Transaktion abgeschlossen ist, damit bei einem Abbruch der Transaktion keine weitere Transaktion mit einem falschen Kontostand arbeitet. Diese Sperren sind "teuer", denn bei jedem Zugriff muss geprüft werden, ob eine andere Transaktion auf diesen Datensatz zugreift. Noch teurer wird es, wenn die Datenbank auf einem Cluster mit mehreren Servern ausgeführt wird, was auch der Hauptgrund ist, dass klassiche Datenbankcluster selten aus mehr als einer Handvoll Servern bestehen. Auch besteht die Gefahr von so genannten Deadlocks: zwei Transaktionen behindern sich gegenseitig, indem beide einen Teil der Datensätze gesperrt haben und auf die jeweils anderen Datensätze zugreifen möchten.<br />
<br />
NoSQL-Datenbanken bieten auch atomare Zugriffe an, jedoch sind die Möglichkeiten für Sperren stark eingeschränkt. So kann eine Sperre beispielsweise nur einen einzigen Datensatz umfassen und nicht mehrere oder gar Datensätze in mehreren Tabellen. Damit löst man zwar das Problem der verteilten Sperren und kann problemlos auf Cluster mit hunderten von Servern skalieren, für den Programmierer erhöht sich aber der Aufwand. In der Praxis ist dies aber auch bei klassischen Datenbanken der Fall, denn wenn Performanceprobleme auftreten, sind Transaktionen einer der ersten Punkte, die optimiert - sprich weg gelassen - werden. So gesehen machen NoSQL-Datenbanken nur das, was man bei Hochleistungsanwendungen sowieso schon immer gemacht hat: möglichst wenig Transaktionen.<br />
<br />
<h2>
C - Consistent</h2>
Programmierer wünschen sich, dass Datenbanken konsistent sind, denn mit inkonsistenten Daten besteht die Gefahr von falschen Ergebnissen. Konsistenz bei Datenbanken wird mit so genannten Constraints - auf deutsch "Einschränkungen" - sichergestellt. Diese definieren Anforderungen an Datensätze und das Datenbanksystem verhindert, dass die Tabellen in einen Zustand gerät, der Constraints verletzt. Ein Beispiel für eine solche Einschränkung ist "jede in einer Rechnung angegebene Kundennummer gehört zu einem Kundendatensatz". Gibt es also einen Rechnungsdatensatz mit der Kundennummer 1234, so muss es auch einen Kunden mit dieser Nummer in der Datenbank geben. Soll der Kunde gelöscht werden, so müssen zuerst alle seine Rechnungen entfernt werden, sonst verweigert die Datenbank das Löschen des Kunden.<br />
<br />
Constraints verhindern sehr sicher, dass falsche Befehle die Datenbank in einen inkonsistenten Zustand bringen. Sie bedeutet aber auch einen Mehraufwand für die Datenbank, denn bei jedem Einfügen einer Rechnung muss geprüft werden, ob die Kundennummer existiert. Sofern der Programmcode korrekt ist, ist eine solche Prüfung immer erfolgreich. Dies bewegt Datenbankadministratoren dazu, bei Performanceproblemen der Datenbank die Constraints einfach zu entfernen, um die überflüssigen Überprüfungen zu vermeiden. Genau dies ist auch bei NoSQL-Datenbanken der Fall, die auf Constraints größtenteils verzichten. Hierbei nimmt man bewusst in Kauf, dass sich eine Datenbank kurzzeitig in einem inkonsistenten Zustand befindet: soll beispielsweise eine Rechnung mit ihren Rechnungspositionen gespeichert werden, so legt man zuerst die Positionen ab und dann erst den Rechnungskopf. Damit erreicht man, dass bei einer Navigation über den Rechnungskopf die dazu gehörenden Positionen immer vorhanden sind. Geht man dagegen über die Positionen und sucht den Rechnungskopf, so kann es sein, dass dieser (noch) nicht existiert. Dies muss der Programmierer beachten, wenn mit NoSQL gearbeitet wird. Und ebenso der Programmierer einer klassischen SQL-Datenbank, wenn die Constrainst aus Gründen der Geschwindigkeit entfernt wurden.<br />
<br />
<h2>
I - Independent</h2>
Mehrere gleichzeitig laufende Transaktionen sollten sich nicht gegenseitig beeinflussen. In der Praxis wird diese Anforderung meist etwas gelockert. Eine Frage ist, ob Änderungen innerhalb einer Transaktion für andere Transaktionen sichtbar sein sollen, bevor die Transaktion abgeschlossen ist. Dies kann zur Folge haben, dass Transaktionen Datensätze sehen, die niemals wirklich in geschrieben werden, da die entsprechende Transaktion abgebrochen wurde - der Fachmann spricht von "Phantom Reads". Wenn im Anwendungsfall Transaktionen sehr selten abgebrochen werden und Phantom Reads toleriert werden können, kann die Transaktions-Isolation entsprechend reduziert werden, was zu mehr Geschwindigkeit führt.<br />
<br />
Bei NoSQL-Datenbanken umfassen Transaktionen immer nur einen Datensatz, so dass die angesprochenden Probleme gar nicht erst auftreten können und entsprechend die maximale Geschwindigkeit erreicht wird.<br />
<br />
<h2>
D - Durable</h2>
Wenn die Datenbank dem Programm signalisiert, dass eine Transaktion abgeschlossen ist, dann kann man den Stecker ziehen und sich sicher sein, dass nach einem Neustart die Änderungen der Transaktion vorhanden sind. Ebenso, dass das Lesen nach dem Ende der Transaktion die geänderten Daten zurückliefert. In einem Cluster bedeutet dies, dass alle Knoten (zumindest diejenigen mit Kontakt zu Clients) über die Änderung informiert sein müssen, bevor die Datenbank den Erfolg zurückmelden darf, damit auch bei einer Verbindung zu eine anderen Knoten die gleichen Daten zurückgeliefert werden. Dies führt zu Verzögerungen nach Abschluss der Transaktion, so dass der Client weniger Transaktionen pro Sekunde ausführen kann. Auch gibt es sehr hohe Anforderungen an die Übertragungsgeschwindigkeit und Latenz zwischen den einzelnen Datenbankknoten, so dass ein über mehrere Rechenzentren verteilten Betrieb in der Regel nicht machbar ist.<br />
<br />
NoSQL garantiert auch, dass Daten nach dem Ende einer Transaktion ausfallsicher geschrieben sind. Es wird jedoch nicht garantiert, dass alle Knoten sofort über die Änderung informiert werden, sondern nur, dass sie irgendwann die Änderung erhalten werden. Man spricht von "eventually consistent", was nicht "eventuell" sondern "schlussendlich" bedeutet. In der Regel handelt es hier um Sekundenbruchteile, bis alle Knoten die Änderung erhalten haben. Damit ist ein Betrieb auch rechnenzentrumsübergreifend möglich, was die Ausfallsicherheit erhöht. Der Programmierer muss jedoch beachten, dass Änderungen nicht sofort für alle sichtbar sind. Dass dies von den Kunden akzeptiert wird, sieht man an Meldungen großer Internetseiten in der Art "es kann einige Minuten dauern, bis Ihre Änderungen in Ihrem Kundenkonto sichtbar werden".<br />
<br />
<h2>
Fazit</h2>
NoSQL macht bei den ACID-Kriterien zum Großteil Dinge, die bei klassischen Datenbanken zum Standardrepertoire der Geschwindigkeitsverbesserung gehören. Da hiermit Garantien verwässert werden, bedeutet dies generell einen höheren Aufwand für den Programmierer. Da die Prüfungen aber nicht nur deaktiviert werden, sondern gar nicht vorhanden sind, bieten NoSQL-Datenbanken eine deutlich höhere Geschwindigkeit, als herkömmliche SQL-Datenbanken. Denn wie lautet ein Bekannter Ausspruch eines Google-Entwicklers: kein Code ist schneller als der, der nicht ausgeführt wird.<br />
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-1466579365298071579.post-84770306242443173142013-02-24T20:50:00.000+01:002013-02-24T20:53:28.484+01:00Bigdata, NoSQL, was ist das überhaupt? Teil 1: KeyValueStores<div>
Bis vor nicht allzu langer Zeit war mit "Datenbank" meist eine relationale Datenbank gemeint, die über SQL angesprochen werden konnte, wie beispielsweise MySQL, PostgreSQL oder Microsofts SQL-Server, um nur einige zu nennen. SQL ist das "Esperanto der Datenbanken", wodurch es für Software-Entwickler leichter ist, mehrere Datenbanken zu unterstützen, da alle die gleiche Sprache sprechen. Eine SQL-Datenbank hat Tabellen, ähnlich denen einer Tabellenkalkulation: die Datensätze sind die Zeilen und die Felder der Datensätze sind die Spalten. Jeder Datensatz hat die gleichen Felder, beispielsweise "Vorname" und "Nachname" in einer Kundentabelle und jedes Feld hat einen Typ, der für alle Datensätze gleich ist. Diese Art der Datenspeicherung ist für Menschen sehr leicht verständlich, da es die natürliche Art ist, wie man auch auf einem Blatt Papier eine Liste von Personen anlegen würde.</div>
<div>
<br />
Diese Speicherung in Tabellen mit festen Feldern hat leider einen Nachteil: wenn man ein Feld hinzufügen möchte, muss üblicherweise die Tabelle kopieren, um bei jedem Datensatz Platz für das neue Feld zu schaffen; genauso beim Ändern oder Löschen eines Feldes. Während eines solchen Kopiervorganges ist die Datenbank nicht (oder zumindest nicht voll) verfügbar. Bei wenigen Datensätzen oder eine hausinternen Datenbank, die nachts nicht genutzt wird, sind solche Ausfälle kein Problem. Ist man ein Internet-Startup mit einer guten Idee, so ärgert dieses Problem jedoch gleich mehrfach: zum einen muss man 24/7 verfügbar sein, da das Internet nicht schläft. Dazu kommt eine oftmals rapide steigende Zahl an Nutzern und damit viele Datensätze. Als Startup entwickelt man noch kräftig an der Software, so dass die Struktur sehr oft geändert werden muss. Hierzu ein Beispiel: die besten Android Apps haben mehr als 100 Millionen Downloads. Legt man für jeden dieser Nutzer ein Kundenkonto an und jedes Kundenkonto belegt 1 Kilobyte an Speicher, so benötigt man 100GB Speicherplatz. Nicht sonderlich viel in der heutigen Zeit. Das Problem ist, dass eine aktuelle Festplatte im Idealfall etwa 15 Minuten benötigt, um diese Datenmenge zu lesen oder zu schreiben. Ein RAID-System ist natürlich entsprechend schneller, aber auch da wird man kaum unter eine Minute kommen.<br />
<br />
In der Praxis sind die Zeiten bedingt durch die Umrechnung und Neu-Indizierung eher ein gutes Stück länger. Hier kommt das erste NoSQL ins Spiel: Key-Value-Stores (KVS), auf Deutsch: Speicherung von Schlüssel-Wert-Paaren. Statt jedem Datensatz eine starre Anzahl an Feldern zuzuordnen, legt man eine variable Anzahl solcher Schlüssel-Wert-Paare ab. Also beispielsweise "Vorname = Kurt", "Nachname = Huwig" usw. Natürlich belegt dies mehr Speicherplatz, da die Feldnamen in jedem Datensatz nochmal drin stehen. Wie man oben gesehen hat, ist Speicherplatz aber nicht das Problem. Will man bei einem KVS ein neues Feld hinzufügen, braucht man an den bestehenden Daten nichts zu ändern sondern legt bei neuen Datensätzen einfach das neue Feld an. Oder fügt alten Datensätze das Feld im laufenden Betrieb hinzu und sobald man damit fertig ist, kann es genutzt werden. Ein Nachteil soll aber verschwiegen werden: bei SQL-Datenbanken ist es möglich, Datenbankfelder als notwendig zu definieren, so dass keine Datensätze angelegt werden können, in denen das Feld nicht gesetzt ist. Dies ist bei KVS nicht möglich, aber in der Praxis auch kein Problem: wurde früher vom Client direkt auf die Datenbank zugegriffen (Two-Tier) wird heute in der Regel eine Middleware eingesetzt, die alle Zugriffe des Clients bearbeitet und selbst mit der Datenbank spricht (Three-Tier oder Multi-Tier). Damit ist es leicht möglich, diese Konsistenzprüfung von der Datenbank in den Middle-Tier zu verlegen und hat damit mehr Möglichkeiten der Prüfung, als herkömmliche SQL-Datenbanken anbieten. </div>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-1466579365298071579.post-73789467104877182922010-12-30T12:54:00.001+01:002011-01-13T19:01:07.360+01:00Start der Glassfish Admin-Konsole beschleunigen<b>[UPDATE]</b><br />
Es gibt auch einen offiziellen Weg, den Start zu beschleunigen:<br />
<br />
<a href="http://www.mentby.com/Group/glassfish-users/glassfish-v3-admin-console-very-slow.html">http://www.mentby.com/Group/glassfish-users/glassfish-v3-admin-console-very-slow.html</a><br />
<br />
Hierzu ist bei gestopptem Glassfish in der <span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;">domain.xml</span> die Option<br />
<br />
<br />
<span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"><jvm-options></span><br />
<span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;">-Dcom.sun.enterprise.tools.admingui.NO_NETWORK=true</span><br />
<span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"></jvm-options></span><br />
<div><br />
</div><div>zu setzen sowie die Datei</div><div><br />
</div><div><span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;">glassfish/modules/console-updatecenter-plugin.jar</span></div><div><br />
</div><div>zu löschen. Danach noch in der Domain die beiden Verzeichnisse</div><div><ul><li><span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;">osgi-cache</span></li>
<li><span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;">generated</span></li>
</ul></div><br />
löschen und den Glassfish wieder starten.<br />
<b>[/UPDATE]</b><br />
<br />
Beim Aufruf der Admin-Konsole des Glassfish dauert es manchmal recht lange, bis sich diese öffnet. Der Grund hierfür sind nicht umfangreiche Initialisierungen - die CPU-Last liegt währenddessen bei 0 - sondern ein "nach Hause Telefonieren", um auf Updates zu prüfen. Man kann dies unterbinden, indem man in <span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;">/etc/hosts</span> diesen Eintrag einfügt:<br />
<br />
<span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;">127.0.0.2 pkg.sun.com pkg.glassfish.org</span><br />
<br />
Damit startet die Admin-Konsole deutlich schneller.Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-1466579365298071579.post-70502099358286788082010-10-18T15:42:00.000+02:002010-10-18T15:42:47.597+02:00vCards als SMS mit AndroidIch habe meine erste Android App geschrieben: "vCard SMS". Damit kann man beliebige Kontakte per SMS versenden und auch empfangen.Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-1466579365298071579.post-31946514936697607512010-04-19T17:40:00.000+02:002010-04-19T17:40:26.463+02:00VMware Player will einen Proxy beim Update der VMware Tools verwendenDer VMware Player verwendet automatisch die systemweit eingestellten Proxies, um nach Updates zu schauen. Leider ist der Programmcode fehlerhaft, denn er sucht auch dann nach Updates, wenn man Proxies deaktiviert hat. Er beachtet nämlich nicht die KDE-Einstellung "Direkte Netzwerkverbindung", sondern schaut in die Proxy-Einträge selbst rein. Stehen dort noch alte Werte drin, so werden diese verwendet. Der richtige Weg ist es deshalb, bei KDE kurzzeitig die Proxies zu aktivieren, die alten Werte komplett zu entfernen und dann wieder auf direkte Verbindung zu stellen. Die Einstellung "pref.downloadProxy" hilft übrigens nur, wenn man einen Proxy einstellen will, aber nicht, wenn man keinen verwenden will.Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-1466579365298071579.post-33470009348274121512010-03-17T13:04:00.000+01:002010-03-17T13:04:32.577+01:00HTML-Mails in ThunderbirdHTML-Mails sind <a href="http://www.georgedillon.com/web/html_email_is_evil.shtml">böse</a> und deshalb stellt jeder vernünftige Mensch sein Mailprogramm so ein, dass es nur Textmails versendet. Manchmal muss man aber doch mal eine HTML-Mail versenden, beispielsweise wenn man eine Tabelle schreiben oder ein Bild einbinden muss. Dies geht in Thunderbird sehr einfach, in dem man einen Umschalt-Klick (Groß-Mach-Taste festhalten und klicken) auf den Verfassen-Button macht.Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-1466579365298071579.post-67155732127434751902009-12-14T17:07:00.002+01:002009-12-14T17:11:39.722+01:00VMware Tools auf Ubuntu 8.04 LTS kompilierenVersucht man die VMware tools in der neuesten Version unter Ubuntu 8.04 LTS zu kompilieren, so erhält man diese Fehlermeldung:<br /><br /><span style="font-family: courier new;">Your compiler "/usr/bin/gcc" version "gcc-Version 4.2.4 (Ubuntu 4.2.4-1ubuntu4)" is not supported by this version of VMware Tools.</span><br /><br />Die Ursache dafür ist, dass das vmware-config.pl-Skript nicht mit einem auf deutsch lokalisierten GCC klar kommt. Dies muss man vorher auf englisch umstellen:<br /><br />Zuerst sicher stellen, dass alle zum Kompilieren notwendigen Pakete vorhanden sind:<br /><br /><span style="font-family: courier new;">apt-get install build-essential linux-headers-generic</span><br /><br />und dann kompilieren:<br /><br /><span style="font-family: courier new;">LANG=C vmware-config-tools.pl</span>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-1466579365298071579.post-17851688605352819112009-11-26T10:49:00.006+01:002009-11-26T11:01:05.629+01:00Google Trends geht zusammen mit InternetExplorer unterSchaut man sich die <a href="http://trends.google.com/websites">Google Trends</a> verschiedener Webseiten an, so gewinnt man den Eindruck, dass immer weniger Leute ins Internet gehen:<br /><br />Heise.de:<br /><img src="file:///tmp/moz-screenshot.png" alt="" /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://trends.google.com/websites?q=heise.de&geo=all&date=all&sort=0"><img style="cursor: pointer; width: 400px; height: 130px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgH8EoFSYzTSQYIJA2x6CSzxej8ELlxuTIt54L60YFDvTqxmFIGJBl4DxGbIlfAoBXYsibhVwQKEdV2UdCcJBgcAK37VO8oF1Kwo7fTu02b7b4BwafJxlKQIJGz6EQHbh_KqyA-fXto4fw/s400/heise.png" alt="" id="BLOGGER_PHOTO_ID_5408347966658859778" border="0" /></a><br /><br />Spiegel.de<br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://trends.google.com/websites?q=spiegel.de&geo=all&date=all&sort=0"><img style="cursor: pointer; width: 400px; height: 130px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg4eWxZt4zthNSLwnbM4jrvcfH3f90bJVsfF-KoF8Q5vDJoIs_AqvOCilLI2oqQ2tDkLvCIVHeJysfHtNQc6y8u4it2ExRomDhcjfspGj03T5hJtTFh_LWNnrQaNS6-1K7EaSoGj-G0GDI/s400/spiegel.png" alt="" id="BLOGGER_PHOTO_ID_5408348256214944338" border="0" /></a><br /><br />Microsoft.com:<br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://trends.google.com/websites?q=microsoft.com&geo=all&date=all&sort=0"><img style="cursor: pointer; width: 400px; height: 130px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhMw9wflEY-bfKeLr7e0i0JPAEi1-kZxi87U1LPN19mzwErWZYgrf_DDpjFePf53m_CJLUsDHogtS_gSmT-Rw3AMbefmeFRSmBVUXg_jAKxERI7TYVBJGLuKBTiDAwWkxuWS04FbhhTunY/s400/microsoft.png" alt="" id="BLOGGER_PHOTO_ID_5408348546949455138" border="0" /></a><br /><br />Vergleicht man den Google-Trend seiner eigenen Seite aber mal mit den eigenen Statistiken, so fällt auf, dass der Google-Trend nicht stimmen kann: auf der eigenen Seite werden mehr Zugriffe verzeichnet, obwohl der Trend nach unten zeigt. Woher kommt diese Diskrepanz? Nun ja, schauen wir uns mal die Browser-Trends in diesem Zeitbereich an:<br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://en.wikipedia.org/wiki/Usage_share_of_web_browsers"><img style="cursor: pointer; width: 400px; height: 200px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgNNYm9TjjlSnZho7W5bsrq2_wdOTy3PMbtX4aZfa1rl3mWu37m6OlnOWioXMc6AG3ffQsh8LFGxTPYdlyix0fyfStT2PCRarudI84LFkJFWt02frjzybsfO_hg9LEARtZxeza8-y7RsrM/s400/Usage_share_of_web_browsers_from_2000_to_2009_(Source_TheCounter.com).gif" alt="" id="BLOGGER_PHOTO_ID_5408349229181390946" border="0" /></a><br />Die Grafik zeigt zwar einen längeren Zeitbereich, als die Google-Trends - 2000 bis 2009 statt nur 2007 bis 2009, aber wenn man den Marktanteil des InternetExplorers mit den Trend-Kurven vergleicht, sieht man eine frappierende Ähnlichkeit. Dies bringt mich zu meiner Vermutung, warum die Grafiken alle nach unten zeigen: die Trends werden u.A. aus dem Nutzerverhalten von Benutzern mit dem Google-Toolbar ermittelt. Mit dem Rückgang des InternetExplorers und dem Aufstieg von Firefox verwenden immer weniger Nutzer diesen Toolbar und damit greifen scheinbar weniger Leute auf die Webseiten zu.<br /><br />Also Google: rechnet den Marktanteil des IEs in eure Trends rein, dann stimmen die Grafiken wieder!Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-1466579365298071579.post-87844025623371569952009-09-18T17:06:00.003+02:002009-09-18T17:08:33.899+02:00DB2 auf Ubuntu 9.04 Jaunty installierenBei der Installation von DB2 9.7 gibt es einen "geringfügigen Fehler", der leider zur Folge hat, dass DB2 nicht startet. Der Ursache ist ein fehlendes Verzeichnis. Zum Korrigieren sind folgende Befehle auszuführen:<br /><br /><span style="font-family: courier new;">cd /opt/ibm/db2/V9.7</span><br /><span style="font-family: courier new;">rm logs</span><br /><span style="font-family: courier new;">mkdir logs</span><br /><span style="font-family: courier new;">chown bin.bin logs</span><br /><br />Statt dem Verzeichnis existiert nur ein Link auf ein nicht existierendes Verzeichnis.Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-1466579365298071579.post-48255262459405538742009-09-13T15:12:00.002+02:002009-09-13T15:18:27.917+02:00Azureus auf AMD64 (x86_64)Azureus verweigert unter einem 64-Bit-Linux den Dienst mit der Meldung, dass ihm das 32-Bit SWT unter 64-Bit nicht passt. Zur Abhilfe lädt man das 64-Bit SWT herunter und ersetzt mit der darin enthaltenen swt.jar diejenige von Azureus. Aktuell (12. Juni 2009) ist die URL für SWT diese hier:<br /><br /><a href="http://www.eclipse.org/downloads/download.php?file=/eclipse/downloads/drops/R-3.5-200906111540/swt-3.5-gtk-linux-x86_64.zip">http://www.eclipse.org/downloads/download.php?file=/eclipse/downloads/drops/R-3.5-200906111540/swt-3.5-gtk-linux-x86_64.zip</a><br /><br />Da die Zeit vergeht und diese Seiten bestehen bleibt, hier der Weg zur jeweils aktuellsten Version:<br /><ol><li>Auf der <a href="http://www.eclipse.org/swt/">SWT-Seite</a> unter "Releases - Stable" den Link "more..." anklicken</li><li>dort unter "SWT Binary and Source" den Link "Linux (x86_64/GTK 2) verwenden<span style="font-weight: bold;">.</span></li></ol>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-1466579365298071579.post-60785153492387432312009-09-03T15:38:00.009+02:002009-09-03T16:07:09.849+02:00BASE Reisevorteil oder Reisenachteil?Gerade mal die Preise fürs Ausland bei BASE geprüft: es gibt <a href="http://www.base.de/tarife/ausland_reisevorteil.jsf">Reisevorteil</a>, <a href="http://www.base.de/tarife/ausland_reisevorteil_plus.jsf">Reisevorteil Plus</a>, <a href="http://www.base.de/tarife/ausland.jsf">International</a>. Der Reisevorteil hört sich ganz gut an, also prüfen wir mal die Preise:<br /><ul><li>Reisevorteil: 0,75€ + 0,29€/Minute, Taktung 60/60</li><li>Reisevorteil Plus: 0,75€ + 0,29€/Minute, Taktung 60/60</li><li>International: 0,51€/Minute, Taktung 30/1</li></ul>Hmm, wenn man sich das mal als Grafik anschaut, dann sieht das so aus (Zeit in Sekunden):<br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjD7rjxnP4gwVqpRnwO7DzE6PZDQvvDQE52S1YBVPOyPY1A-QjBKo3Xr66146jyBc9-133hG0opagORUcZ7viSl-TuADPQgWaUyMiz7ORE5AHrO1BZX8q2CligcsOVuMXuykftbojgusKg/s1600-h/reisevorteil1.png"><img style="cursor: pointer; width: 400px; height: 222px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjD7rjxnP4gwVqpRnwO7DzE6PZDQvvDQE52S1YBVPOyPY1A-QjBKo3Xr66146jyBc9-133hG0opagORUcZ7viSl-TuADPQgWaUyMiz7ORE5AHrO1BZX8q2CligcsOVuMXuykftbojgusKg/s400/reisevorteil1.png" alt="" id="BLOGGER_PHOTO_ID_5377236250976467298" border="0" /></a><br />Bis 191 Sekunden (3 Minuten 11 Sekunden) ist der International mit der Ausnahme eines kleinen Fensters günstiger. Kurz mal "hallo wir sind gut angekommen" sagen kostet sogar nur 1/3. Der Reisevorteil hilft also nur Dauertelefonierern. Dann mal die eingehenden Anrufe anschauen:<br /><ul><li>Reisevorteil: 0,29€/Minute, Taktung 60/60</li><li>Reisevorteil Plus: 0,29€/Minute, Taktung 60/60</li><li>International: 0,22€/Minute, Taktung 1/1 (!!!)<br /></li></ul>Hier versteckt sich der Vorteil so gut, dass ich ihn gar nicht sehen kann:<br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjxTBglnT7GLthRQ5ESNcFeQsCdggdkGoAkc6AmHytoXoPPH937SA2jI12EUxXBJXElw5ezc7X5St5vHc3r8qcIewBOn5OiWKFrZDEy0tKNA0rxVOq91TBbe8Kooq0ZcnZqzsM6sFo2cFk/s1600-h/reisevorteil5.png"><img style="cursor: pointer; width: 400px; height: 215px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjxTBglnT7GLthRQ5ESNcFeQsCdggdkGoAkc6AmHytoXoPPH937SA2jI12EUxXBJXElw5ezc7X5St5vHc3r8qcIewBOn5OiWKFrZDEy0tKNA0rxVOq91TBbe8Kooq0ZcnZqzsM6sFo2cFk/s400/reisevorteil5.png" alt="" id="BLOGGER_PHOTO_ID_5377240743628913106" border="0" /></a><br />Dann aber bestimmt bei den SMS-Preisen:<br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjMD3luONGgS5KXO-u5e95XlUXiXn_xbDFkL7_obdFpXNkzBISDpmEIaQ2MufgktI3tOFUbrXNJShzNHVCxuJLP_hWu3zBA8mlnoYBVMKBzgSVgI0X57tdcc4utgkNDd9zqU0U3sD8DPBk/s1600-h/reisevorteil4.png"><img style="cursor: pointer; width: 198px; height: 268px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjMD3luONGgS5KXO-u5e95XlUXiXn_xbDFkL7_obdFpXNkzBISDpmEIaQ2MufgktI3tOFUbrXNJShzNHVCxuJLP_hWu3zBA8mlnoYBVMKBzgSVgI0X57tdcc4utgkNDd9zqU0U3sD8DPBk/s400/reisevorteil4.png" alt="" id="BLOGGER_PHOTO_ID_5377238213109775042" border="0" /></a><br />Und da ja!!! Ich spare beim Reisevorteil Plus tatsächlich 0,04€ pro SMS! Wer im Ausland also nur SMS versendet, der hat tatsächlich einen Vorteil. Nur darf niemand anrufen, denn dann schwindet der Vorteil wie Eis in der Sonne.<br />Bleiben nur noch die Datenverbindungen für Surfen und MMS, die Paketierung ist hier weniger wichtig, insbesondere, wenn es ums Surfen geht. Hier die Preise für 1MB Datentransfer:<br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhaZuDAxcBJd1W5VM7T3KFY4aApuiExjmKZb_bw0-5Y4WY9GRMIkmn1sz6z_sFfyiesDkARCmNjBK7y8HQJu4E_h3W7TbX91-vu3mbp7JtMeozdiflZyXmc5K2pGcOD7KC1-51ck8_UD5Q/s1600-h/reisevorteil6.png"><img style="cursor: pointer; width: 276px; height: 257px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhaZuDAxcBJd1W5VM7T3KFY4aApuiExjmKZb_bw0-5Y4WY9GRMIkmn1sz6z_sFfyiesDkARCmNjBK7y8HQJu4E_h3W7TbX91-vu3mbp7JtMeozdiflZyXmc5K2pGcOD7KC1-51ck8_UD5Q/s400/reisevorteil6.png" alt="" id="BLOGGER_PHOTO_ID_5377241549381689538" border="0" /></a><br />Ist man in einem der Reisevorteilsländer, dann lohnt sich der Reisevorteil Plus mit einem knappen Euro / MB, wenn man unbedingt Mails abrufen und versenden muss.Unknownnoreply@blogger.com1tag:blogger.com,1999:blog-1466579365298071579.post-48506513180671039912009-08-29T23:02:00.004+02:002009-12-16T21:48:11.638+01:00MMS mit Android G1 und E-Plus/BASE/Blau O2/Fonic/SimplyNach langer Zeit endlich funktionierende Einstellungen bei <a href="http://www.android-hilfe.de/tarife-provider/4134-g1-internet-und-mms-einstellungen-fuer-base.html#post39954">Android-Hilfe</a> gefunden:<br /><br /><span style="font-weight: bold;">Für E-Plus/BASE/Blau:</span><br /><br />###############<br />APN #1 für Internet...<br />###############<br /><br />Name: <span style="color:YellowGreen;">internet</span><br />APN: <span style="color:YellowGreen;">internet.eplus.de</span><br />Proxy: Nicht festgelegt<br />Port: Nicht festgelegt<br />Nutzername: <span style="color:YellowGreen;">eplus</span><br />Passwort: <span style="color:YellowGreen;">eplus</span><br />Server: Nicht festgelegt<br />MMSC: Nicht festgelegt<br />MMS-proxy: Nicht festgelegt<br />MMS-port: Nicht festgelegt<br />MCC: <span style="color:YellowGreen;">262</span><br />MNC: <span style="color:YellowGreen;">03</span><br />APN-Type: <span style="color:YellowGreen;">default</span><br /><br />###############<br />APN #2 für MMS........<br />###############<br /><br />Name: <span style="color:YellowGreen;">mms</span><br />APN: <span style="color:YellowGreen;">mms.eplus.de</span><br />Proxy: Nicht festgelegt<br />Port: Nicht festgelegt<br />Nutzername: <span style="color:YellowGreen;">mms</span><br />Passwort: <span style="color:YellowGreen;">eplus</span><br />Server: Nicht festgelegt<br />MMSC: <span style="color:YellowGreen;">http://mms/eplus</span><br />MMS-proxy: <span style="color:YellowGreen;">212.23.97.153</span><br />MMS-port: <span style="color:YellowGreen;">8080</span><br />MCC: <span style="color:YellowGreen;">262</span><br />MNC: <span style="color:YellowGreen;">03</span><br />APN-Type:<span style="color:YellowGreen;"> mms<br /><br /></span><span style="font-weight: bold;">Für O2/Fonic/Simply</span> (Dank an raudi!)<br /><br />###############<br />APN für Internet und MMS<br />###############<br /><br />Name: <span style="color:YellowGreen;">internet</span><br />APN: <span style="color:YellowGreen;">internet.interkom.de</span><br />Proxy: Nicht festgelegt<br />Port: Nicht festgelegt<br />Nutzername: <span style="color:YellowGreen;">mms</span><br />Passwort: <span style="color:YellowGreen;">eplus</span><br />Server: Nicht festgelegt<br />MMSC: <span style="color:YellowGreen;">http://10.81.0.7:8002</span><br />MMS-proxy: 82.113.100.6<br />MMS-port: <span style="color:YellowGreen;">8080</span><br />MCC: <span style="color:YellowGreen;">262</span><br />MNC: <span style="color:YellowGreen;">07</span><br />APN-Type:<span style="color:YellowGreen;"> mms</span>Unknownnoreply@blogger.com5tag:blogger.com,1999:blog-1466579365298071579.post-23843940694213899442009-08-25T16:12:00.002+02:002009-08-25T16:23:21.625+02:00GWT Compiler beschleunigenDer GWT-Compiler erzeugt aus dem Java-Quellcode für verschiedene Browser JavaScript und zwar für jede Sprache eine eigene Datei. Die Browser mit Kennungen sind:<br /><ul><li>ie6: IE 6 und 7<br /></li><li>ie8: IE 8<br /></li><li>gecko: Mozilla<br /></li><li>gecko1_8: Firefox<br /></li><li>safari: Safari<br /></li><li>opera: Opera</li></ul>Hat man jetzt 5 Sprachen, dann erzeugt der Compiler 6 * 5 = 30 JavaScript-Dateien. Dies dauert eine ganz schöne Weile. Während der normalen Entwicklung testet man üblicherweise nur mit einem Browser und in einer Sprache. Über die Modul-spezifische .gwt.xml kann man dies Einstellen:<br /><ol><li>Folgenden Eintrag machen:<br /><set-property name="user.agent" value="gecko1_8"></li><li>Die Optionen<br /><extend-property name="locale" values="de"><br />auskommentieren.<br /></li></ol>Damit baut mein GWT-Projekt statt in 1,5 Minuten in 15 Sekunden, lohnt sich also. Nur vor einem Release nicht vergessen, alles wieder zurückzustellen, sonst gucken die Benutzer mit dem falschen Browser in die Röhre.Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-1466579365298071579.post-7717290666869408252009-04-24T16:09:00.005+02:002009-04-24T16:54:16.697+02:00Das schnellste Dateisystem für USB-SticksIch habe mal getestet, wie schnell die unterschiedlichen Dateisysteme auf meinem Transcent 64 GB USB-Stick sind. Hierzu habe ich den Stick jeweils mit dem entsprechenden Dateisystem formatiert und dann mein NetBeans-Projektverzeichnis mit viel Quellcode und Bibliotheken auf den Stick kopiert und mit sync sichergestellt, dass es auch geschrieben war. Danach das Verzeichnis wieder gelöscht, wieder sync und ein zweites Mal draufkopiert. Hier das Ergebnis mit Zeiten in Minuten:Sekunden:<br /><table><br /><tbody><tr><th>Dateisystem</th><th>Kopieren 1</th><th>Löschen</th><th>Kopieren 2</th></tr><br /><tr><td>ReiserFS</td><td>1:17</td><td>0:06</td><td>1:14</td></tr><br /><tr><td>XFS</td><td>2:20</td><td>0:27</td><td>2:15</td></tr><br /><tr><td>EXT3</td><td>3:10</td><td>0:08</td><td>3:03</td></tr><br /><tr><td>EXT2</td><td>3:13</td><td>0:19</td><td>3:26</td></tr><br /></tbody></table><br /><br />Wie man sieht ist ReiserFS deutlich schneller als die anderen. Schade eigentlich, dass Hans Reiser jetzt im Gefängnis sitzt.Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-1466579365298071579.post-74058142031045505412009-03-31T14:36:00.007+02:002009-03-31T15:19:48.293+02:00Glassfish, JDBC und DB/2Der JDBC-Treiber von IBM für DB/2 hat es in sich: normale Verbindungen über den DriverManager funktionieren, aber der Zugriff über eine DataSource - was der Glassfish macht - bricht ab mit einer Fehlermeldung in der Art<br /><br /><span style="font-family:courier new;">Caused by: com.ibm.db2.jcc.a.SqlException: jcc10389122453.51.90</span><br /><span style="font-family:courier new;">Beim Laden der nativen Bibliothek db2jcct2,</span><br /><span style="font-family:courier new;">java.lang.UnsatisfiedLinkError: no db2jcct2 in java.library.path ist ein</span> <span style="font-family:courier new;">Fehler aufgetreten: ERRORCODE=-4472, SQLSTATE=null</span><br /><br />Dies kommt daher, dass der Treiber standardmäßig als <a href="http://java.sun.com/products/jdbc/driverdesc.html">Typ-2-Treiber</a> eine native Bibliothek nachladen will. Ich hab es selbst nach Kopieren von 36 MB Bibliotheken nur geschafft, dass er nicht mehr über fehlende Bibliotheken meckert, dafür aber mit einem Segmentation Fault abstürzt. Die Lösung für das Problem ist es dem Treiber zu sagen, dass er ein Typ-4-Treiber sein soll. Beim DriverManager reicht hierfür die Angabe des Ports in der URL. Bei der DataSource muss man die Methode "setType(4)" aufrufen:<br /><br /> <span style="font-family:courier new;">DB2DataSource dB2DataSource = new com.ibm.db2.jcc.DB2DataSource();</span><br /><span style="font-family:courier new;"> dB2DataSource.setDriverType(4);</span><br /><span style="font-family:courier new;"> dB2DataSource.setServerName("192.168.1.194");</span><br /><span style="font-family:courier new;"> dB2DataSource.setPortNumber(50000);</span><br /><span style="font-family:courier new;"> dB2DataSource.setUser("XXX");</span><br /><span style="font-family:courier new;"> dB2DataSource.setPassword("YYY");</span><br /><span style="font-family:courier new;"> dB2DataSource.setDatabaseName("ZZZ");</span><br /><span style="font-family:courier new;"> dB2DataSource.setSysSchema("XYZ");</span><br /><span style="font-family:courier new;"> dB2DataSource.getConnection();</span><br /><br />und schon klappt es. Im Glassfish ist dies folgendermaßen einzurichten: man wählt als Datenbank DB/2 aus, ändert die Datasource-Klasse in "com.ibm.db2.jcc.DB2XADataSource" und setzt als Type "javax.sql.XADataSource".<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhw_hFYGtkCdKmEkfuu_T2ndKZvysqdGOrHQET0OlbIbZDNrdycDkYsM1QsnjejuwF3QG-oSIfJoE6VVYNWuB4RQElCnj55-sDsvQQrrbs0XnwyahUMgx7f0wBVxYW5pQswgZhQkFDFonQ/s1600-h/gf1.png"><img style="cursor: pointer; width: 400px; height: 210px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhw_hFYGtkCdKmEkfuu_T2ndKZvysqdGOrHQET0OlbIbZDNrdycDkYsM1QsnjejuwF3QG-oSIfJoE6VVYNWuB4RQElCnj55-sDsvQQrrbs0XnwyahUMgx7f0wBVxYW5pQswgZhQkFDFonQ/s400/gf1.png" alt="" id="BLOGGER_PHOTO_ID_5319332614114170114" border="0" /></a><br /><br />Bei den Properties muss man eine zusätzliche Property "driverType" einfügen und sie auf den Wert 4 setzen:<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhXN7rBbXa1BEMwRvb4_umtFN2be7wwnXBKJamdSmoXkxJOkMmyOZet2YRsi0irMeEu598AbS7ur2tAHCTooNXbgW16Q5__VcW33B2L8WboQvhVuUj5KQ0WFPXJ4_bgL7ZqsGJLmrRdogU/s1600-h/gf2.png"><img style="cursor: pointer; width: 400px; height: 246px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhXN7rBbXa1BEMwRvb4_umtFN2be7wwnXBKJamdSmoXkxJOkMmyOZet2YRsi0irMeEu598AbS7ur2tAHCTooNXbgW16Q5__VcW33B2L8WboQvhVuUj5KQ0WFPXJ4_bgL7ZqsGJLmrRdogU/s400/gf2.png" alt="" id="BLOGGER_PHOTO_ID_5319334683293101170" border="0" /></a><br />Hat man das gemacht, wir der Ping grün und das ganz ohne native Bibliotheken. Natürlich nicht vergessen, die Treiberdatei in das lib-Verzeichnis der Glassfish-Domain zu kopieren, damit er ihn überhaupt finden kann.Unknownnoreply@blogger.com4tag:blogger.com,1999:blog-1466579365298071579.post-90617242024663602232009-02-27T10:29:00.003+01:002009-02-27T10:59:56.133+01:00mod_jk und SSL-Verbindungen hängen<span style="font-weight: bold;">Das Problem</span><br /><br />Mehrere Probleme mit einer Ursache: Verbindungen von Apache über mod_jk zu einem JBoss (genauer zu dem darin enthaltenen Tomcat) hängen und SSL Verbindungen wollen sich einfach nicht aufbauen. Das Problem tritt manchmal auf, ein Apache-Neustart oder die Option "JkOptions +DisableReuse" scheinen manchmal zu helfen.<br /><br /><span style="font-weight: bold;">Die Ursache</span><br /><br />Die Ursache ist aber eine ganz andere: fehlender Zufall! Linux stellt zwei Geräte zur verfügung, die Zufall liefern: /dev/random und /dev/urandom. Diese greifen beide auf eine Kernel-interne Entropie-Quelle zu, die sich aus recht unvorhersehbaren Ereignissen im System füllt, wie Festplattenzugriffe, Netzwerkaktivität, Tastatur- und Mauseingaben usw. Der Unterschied zwischen den beiden ist, dass /dev/random sich nur auf diese Ereignisse verlässt, während /dev/urandom auch einen Pseudozufallszahlengenerator (PRNG) verwendet. In der Praxis bedeutet dies, dass /dev/random "hängen" kann, wenn zuviel Zufall abgerufen wurde, während /dev/urandom immer ein Ergebnis liefert.<br /><br />Man kann sich leicht anzeigen lassen, wieviel Zufall der Kernel gerade zur Verfügung hat:<br /><br /><span style="font-family: courier new;">cat /proc/sys/kernel/random/entropy_avail</span><br /><br />Mit einem<br /><br /><span style="font-family: courier new;">cat /dev/random</span><br /><br />kann man den Zufall auslesen. Der Befehl hängt recht schnell und kann mit Strg-C abgebrochen werden. Eventuell ist das Terminal dann verkonfiguriert, was man durch Eingabe von "reset" wieder korrigiert. Versucht man das Gleiche mit /dev/urandom, so erhält man ständig neue Werte.<br /><br />Java verwendet standardmäßig /dev/random für java.secure.SecureRandom, was wiederum für SSL-Verbindungen u.ä. verwendet wird. JBoss Seam verwendet es für seine Session-IDs. Gibt es nicht genug Zufall, dann wartet Java auf /dev/random und deshalb teilweise recht lange, bis es weiter geht.<br /><br /><span style="font-weight: bold;">Die Lösung</span><span style="font-weight: bold;"><br /><span style="font-weight: bold;"></span></span><br />Hängt ein Prozess aktuell, so muss man für mehr Zufall sorgen, indem man beispielsweise mit einem<br /><br /><span style="font-family: courier new;">ls -lR /</span><br /><br />oder<br /><br /><span style="font-family: courier new;">hdparm -t /dev/sda</span><br /><br />für Festplattenaktivität sorgt. Besser ist es, den Hänger gar nicht erst auftreten zu lassen. Hierzu muss man Java lediglich anweisen, statt /dev/random einfach /dev/urandom zu verwenden. Dies geht mit einer einfachen Kommandozeilenoption für die JVM:<br /><br /><span style="font-family: courier new;">-Djava.security.egd=file:/dev/urandom</span><br /><br />oder direkt im Programmcode mit<br /><br /><span style="font-family: courier new;">System.setProperty("java.security.egd", "file:/dev/urandom");</span><br /><br />Der Nachteil dieses Ansatzes ist, dass sich der Zufall von /dev/urandom leichter vorhersagen lässt und damit beispielsweise ein Angriff auf SSL-Verbindungen denkbar ist. Wer hier auf der sicheren Seite bleiben will, der muss über einen Hardware-Zufallszahlengenerator nachdenken. Ein leicht zu realisierender Ansatz ist ein Mikrofon vor einem Lüfter. Die damit aufgenommenen Samples aber noch etwas nachbearbeiten, aber das ist ein ganz anderes Thema.Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-1466579365298071579.post-53873663628872172982008-12-16T12:55:00.003+01:002008-12-16T12:59:39.874+01:00UTF-8 in HTML-FormularenBei einem HTML-Formular kann man den zu verwendenden Zeichensatz mit dem Parameter<br /><br /><span style="font-family: courier new;">accept-encoding="UTF-8"</span><br /><br />auf UTF-8 stellen. Leider wird dieser Zeichensatz beim Abschicken des Formulars nicht mit übermittelt, so dass der Server raten muss, welcher Zeichensatz verwendet wurde. Und er rät immer "ISO-8859-1", so dass bei einem Formular mit UTF-8 die Umlaute falsch interpretiert werden. Abhilfe schafft der folgende Aufruf:<br /><br /><span style="font-family: courier new;">request.setCharacterEncoding("UTF-8");</span><br /><br />er muss vor dem ersten request.getParameter() kommen, damit er funktioniert. Damit werden die Parameter als UTF-8 interpretiert und das Formular funktioniert.Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-1466579365298071579.post-82434313158977736422008-11-21T12:26:00.009+01:002009-10-08T21:52:06.906+02:00Tomcat, Glassfish auf Port 80Unter Unix Betriebssystemen dürfen die Ports unter 1024 nicht von normalen Benutzern verwendet werden, sondern nur vom Benutzer root. Aus Sicherheitsgründen will man so wenig Prozesse wie möglich mit Root-Rechten laufen lassen, da eine Sicherheitslücke damit automatisch Vollzugriff auf das System bedeutet. Webserver wie Apache helfen sich dadurch, dass ein Prozess mit Root-Rechten auf dem Port 80 lauscht, die Anfragen aber von normalen Benutzer-Prozessen bearbeitet werden. Die Funktionalität des Benutzerwechsels eines Prozesses ist Java nicht möglich. Man kann es auch nicht über JNI tricksen, da Java Threads verwendet und die immer einem gemeinsamen Benutzer gehören.<br /><br />Eine mögliche Lösung ist es, den Webserver auf einem hohen Port - zum Beispiel 8080 - laufen zu lassen und eine passende Umleitung einzurichten. Dies kann beispielsweise über mod_jk oder mod_proxy im Apache geschehen, oder über eine Umleitung über iptables:<br /><br /><span style="font-family:courier new;">iptables -t nat -A PREROUTING -i eth0 -p tcp \<br /> --dport 80 -j REDIRECT --to-ports 8080</span><br /><br />Beide Ansätze haben den Nachteil, dass der Tomcat oder Glassfish denkt, er wird über Port 8080 angesprochen. Dies kann zu Problemen führen, wenn komplette URLs ausgegeben werden, denn diese haben dann :8080 darin. mod_jk und Tomcat kennen als Abhilfe entsprechende Optionen ("proxy-port"), mit denen ein anderer Port mitgeteilt wird.<br /><br />Es gibt aber auch eine bessere Möglichkeit, mit der ein beliebiges Java-Programm auf privilegierten Ports lauschen kann und trotzdem als normaler Benutzer läuft: authbind und privbind. Die Einrichtung ist sehr einfach; als Beispiel hier die Freigbe des Ports 80 für den Benutzer glassfish: authbind ist SUID-root und kann deshalb direkt vom Benutzer gestartet werden. Bei dem Versuch auf einem niedrigen Port zu lauschen prüft es, ob der Benutzer Schreibzugriff auf eine bestimmte Datei hat. In unserem Beispiel wäre dies die Datei<br /><br /><span style="font-family:courier new;">/etc/autbind/byport/80</span><br /><br />Um diese anzulegen, müssen die folgenden Befehle als root eingegeben werden:<br /><br /><span style="font-family:courier new;">touch /etc/authbind/byport/80</span><br /><span style="font-family:courier new;">chmod 500 /etc/authbind/byport/80</span><br /><span style="font-family:courier new;">chown glassfish /etc/authbind/byport/80</span><br /><br />Für privbind ist eine solche Konfiguration nicht notwendig. Da es nicht SUID-root ist, muss es von root direkt gestartet werden. Außerdem ist es nicht möglich, den Zugriff auf einen Port einzuschränken - es sind immer alle möglich.<br /><br />Leider haben beide Programme eine große Einschränkung: sie funktionieren nicht mit IPv6 sondern nur mit IPv4. Java versucht standardmäßig auch IPv6 zu nutzen, was einen Fehler zur Folge hat. Dem Java-Prozess muss deshalb die Option<br /><pre style="font-family: courier new;">-Djava.net.preferIPv4Stack=true</pre>mitgegeben werden. Beim Tomcat schreibt man dies in die Variable CATALINA_OPTS in der Datei setenv.sh/setenv.bat, die man ggf. noch erzeugen muss. Beim Glassfish kommt diese Option in die entsprechende domain.xml in den Abschnitt mit den JVM-Optionen:<br /><br /><span style="font-family:courier new;"><jvm-options>-Djava.net.preferIPv4Stack=true</jvm-options></span><span style="font-family:courier new;"></span><br /><br />Gestartet wird beispielsweise der Glassfish bei Verwendung von authbind als Benutzer glassfish mit<br /><br /><span style="font-family:courier new;">authbind --deep asadmin start-domain domain1</span><br /><br />Die Option --deep ist notwendig, da der Java-Befehl ein Skript ist, das den eigentlichen Befehl erst aufruft und hierbei die Rechte für den Port sonst verloren gehen. Will man privbind verwenden, so lautet der Befehl so:<br /><br /><span style="font-family:courier new;">sudo privbind -u glassfish $(which asadmin) start-domain domain1</span><br /><br />Starte man den Befehl als Root, kann man das sudo weg lassen.<br /><br />Dies Ausgabe ist in beiden Fällen diese:<br /><br /><span style="font-family:courier new;">Starting Domain domain1, please wait.</span><br /><br /><span style="font-family:courier new;">Log redirected to /opt/glassfish-v2ur2/domains/domain1/logs/server.log.</span><br /><br /><span style="font-family:courier new;">Redirecting output to /opt/glassfish-v2ur2/domains/domain1/logs/server.log</span><br /><br /><span style="font-family:courier new;">Domain domain1 is ready to receive client requests. Additional services are being started in background.</span><br /><br /><span style="font-family:courier new;">Domain [domain1] is running [Sun Java System Application Server 9.1_02 (build b04-fcs)] with its configuration and logs at: [/opt/glassfish-v2ur2/domains].</span><br /><br /><span style="font-family:courier new;">Admin Console is available at [http://localhost:4848].</span><br /><br /><span style="font-family:courier new;">Use the same port [4848] for "asadmin" commands.</span><br /><br /><span style="font-family:courier new;">User web applications are available at these URLs:</span><br /><span style="font-family:courier new;">[http://localhost:80 https://localhost:443 ].</span><br /><br /><span style="font-family:courier new;">Following web-contexts are available:</span><br /><span style="font-family:courier new;">[/web1 /__wstx-services ].</span><br /><br /><span style="font-family:courier new;">Standard JMX Clients (like JConsole) can connect to JMXServiceURL:</span><br /><span style="font-family:courier new;">[service:jmx:rmi:///jndi/rmi://pckurt:8686/jmxrmi] for domain management purposes.</span><br /><br /><span style="font-family:courier new;">Domain listens on at least following ports for connections:</span><br /><span style="font-family:courier new;">[80 443 4848 3700 3820 3920 8686 ].</span><br /><br /><span style="font-family:courier new;">Domain does not support application server clusters and other standalone instances.</span><br /><br />Auf diesem Server wurde auch der SSL-Port von 8181 auf 443 umgestellt; hierfür ist bei Verwendung von authbind auch die entsprechende Datei notwendig.Unknownnoreply@blogger.com2tag:blogger.com,1999:blog-1466579365298071579.post-45097273632723188382008-08-19T16:23:00.001+02:002008-08-19T16:24:19.301+02:00Fix Imports im NetBeans unter KDEDie Tastenkombination für Fix-Imports (Strg+Umschalt+I) funktioniert unter KDE nicht solange der Kopete diese Kombination für sich beantsprucht. Zum Ändern die Kontaktliste öffnen und dann<br /><br />Einstellungen - Globale Kurzbefehle einrichten...<br /><br />auswählen. Dort kann man dann die Kurzbefehle ändern oder deaktivieren.Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-1466579365298071579.post-25853650150586745692008-05-13T21:36:00.004+02:002008-05-13T22:19:56.224+02:00Eclipse auf AMD64Eclipse auf einem 64-Bit-Prozessor mit Suns JDK stürzt ständig ab. Der Grund hierfür ist <a href="http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6614100">Bug #6614100</a>: eine fehlerhafte Optimierung durch den Hotspot-Compiler, die nur unter ganz bestimmten Umständen auftritt, aber leider eben bei Eclipse. Betroffen sind alle JDK/JRE von Sun. Abhilfe schafft das Deaktivieren des Hotspot-Compilers. Macht man dies für das komplette Eclipse, schlafen einem die Füße ein. Erfreulicherweise kann man dies auch ganz gezielt für die eine Klasse deaktivieren, die den Fehler verursacht. Hierfür muss man in seiner <span style="font-family:courier new;">eclipse.ini</span> folgende Option am Ende setzen - nach dem <span style="font-family:courier new;">-vmargs</span>:<br /><br /><span style="font-family:courier new;">-XX:CompileCommand=exclude,org/eclipse/core/internal/dtree/DataTreeNode,forwardDeltaWith</span><br /><br />Hier als Beispiel meine eclipse.ini:<br /><br /><span style="font-family:courier new;">-showsplash</span><br /><span style="font-family:courier new;">org.eclipse.platform</span><br /><span style="font-family:courier new;">-vmargs</span><br /><span style="font-family:courier new;">-Dosgi.requiredJavaVersion=1.5</span><br /><span style="font-family:courier new;">-Xms1536m</span><br /><span style="font-family:courier new;">-Xmx1536m</span><br /><span style="font-family:courier new;">-XX:PermSize=512m</span><br /><span style="font-family:courier new;">-XX:MaxPermSize=512m</span><br /><span style="font-family:courier new;">-XX:CompileCommand=exclude,org/eclipse/core/internal/dtree/DataTreeNode,forwardDeltaWith</span><br /><br />Das Erhöhen des Speichers auf 1536 MB und der PermSize auf feste 512 MB beschleunigt Eclipse, sollte aber nur mit ausreichend Speicher gemacht werden. Ob es geklappt hat, sieht man unter Linux mit<br /><br /><span style="font-family: courier new;">ps ux|grep java</span><br /><br />Dort müssen die Optionen erscheinen.Unknownnoreply@blogger.com0