Sonntag, 6. März 2016

GIT und SVN und Windows und legacy projects

Kategorie: Das ist mein eigenes Spickzettel - schielen gestattet!


Meine letzte zwei Projekten kamen noch aus der Zeit wo Menschen freiwillig SVN eingesetzt haben :)
Wenn man aber in den Genuss des lokalen commits bereits gekommen ist, dann wird es kompliziert.
Zum einem hat man einen unbehaglichen Gefühl alles sofort global einzuchecken. Anderseits, gemachten Änderungen länger als ein paar Stunden auf dem Rechner uncommitet zu haben - ist auch be-be-be. Und das wechseln zwischen verschiedenen Versionen - das ist doch einfach geil! Jeder Zeit ohne Risiken und Sorgen, innerhalb von wenigen Sekunden auf die Vorgengenversion oder auf einen anderen Branch wechseln zu können. Und dann wieder zurück zu den aktuellen Anpassungen, ... Klasse!

Also mein Ziel ist - bei mir den GIT als SVN-Client bei einem langlaufenden Projekt einzusetzen. Am besten so, dass die anderen Entwickler, die weiterhin mit SVN-Client arbeiten, nichts von meinen Innovationen mitbekämmen. Also zumindest davon nicht gestört wären.


Default Konfiguration für Windows verbessern

git config --global user.name "Mark Stein"
git config --global user.email "m.stein@mosst.de"

# Lange Pfade ermöglichen, komisch dass das kein default Wert bei git ist
git config --system core.longpaths true

# Git soll von den Lineendigs die Hände weglassen, bitte keine Automatismus.
# Insbesondere wenn man auf Windows-Rechnern die Artifakte für Unix bauen will
git config --system core.autocrlf false




Loslegen - Das erste Checkout ala Update ala Fetch ala Pull ala Rebase

Komisch warum ein frisch geborene Entwickler sich am Anfang seines Versionierungsweges etwas verarscht fühlt. Da, allein für den Vorgang "Hol mir bitte eine Version von dem Server" zig verschiedene Mechanismen existieren.

Checkout - in SVN-Welt holt man sich dabei einen Code-Stand von dem Server herunter.
Checkout - in GIT-Welt wechselt man hiermit zwischen Versionen (Branch ist auch eine Version).
Update- nur in SVN-Welt, damit wird aktuelle Versionsstrang (trunk, branch-xy) auf die aktuellste oder angegebene Version von dem Server aktualisiert.
Fetch - nur in GIT-Welt, aktualisiert alle (oder ausgewählte) remote Versionstränge. Wichtig: lokale Versionstränge (Branches) werden davon nicht beeinflusst.
Pull - lokale Branches werden auf die Versionsstände von gemappten remote Branches gebracht. Tipp: mit git branch -vv kann dieses Mapping angeschaut werden, allerdings nicht bei SVN Repositories :( Danach suche ich noch.
Rebase -

... in Arbeit ...


Angedachte Themen:
* Arbeit mit SVN Branches: Wechsel, Merging

* Wechselwirkung mit einem weiterem Remote-Repository z.B. auf dem USB-Stick

Freitag, 9. August 2013

java.lang.NoClassDefFoundError - Aufklärung

Eine der bösesten in Java-Welt Exception ist

java.lang.NoClassDefFoundError: Could not initialize class ...


Dann weist man sofort, dass der Tag gelaufen ist und die Suche nach dem tatsächlichen Fehler ein nächtliches Debugging mit sich bringt.

Tja, dann versuchen wir an diese Stelle herauszufinden warum der Fehler so BÖSE ist, was die meiste Ursache hierfür sind und wie man es mit präventiven Maßnahmen vorbeugen kann.


Der Fehler wird so stark befurchtet vor allem wegen seinem un-sprechenden Namen. NoClassDefFoundError - was soll das schon heißen!? Sogar die Königin der Exceptions - NullPointerException - ist eindeutiger. Außerdem wird NoClassDefFoundError häufig mit dem ClassNotFoundException verwechselt und entsprechend - bekämpft man sie mit den Heilmitteln, die für das zweite pharmaziert wurden.


Die Ursache für dieses Error ist ganz trivial - die Klasse, also aufpassen die KLASSE und nicht das Objekt, könnten nicht initialisiert werden. Die Betonnung liegt dabei auf der KLASSE, weil der Error wird durch fehlerhafte Initialisierung der Attributen der Klasse verursacht. Und, wie wir alle wissen, Attribute der Klasse sind statischen Attribute (Felder).

Ein gutes Beispiel ist der Logger. Der Logger wird meistens als statisches Attribut definiert in etwa so:


public class Tester {
private static Logger log = Logger.getLogger(Tester.class);
...
}

Wenn der Logger nicht initialisiert werden kann, warum auch immer, dann kann auch die Klasse Tester nicht initialisiert werden.
Am Rande: Häufig kann der Logger nicht initialisiert werden, weil hier tatsächlich die Logger-Klasse im Classpath nicht eingebunden ist also kann die Logger-Klasse nicht geladen werden. Das ist jedoch, wie schon erwähnt, am Rande unseres Problem, da an der Stelle ist es unwichtig warum die Logger.getLogger(...) Methode eine Exception produziert hat.

Bei dem  alle ersten Zugriff auf die Tester-Klasse (z.B. über den Konstruktor new Tester()) stellt JVM, dass die Klasse Tester nicht initialisiert werden kann und merkt sich das. Ab dem zweiten Aufruf wird stets die NoClassDefFoundError Fehler produziert. Der eigentliche Fehler, dass die Logger.getLogger(...)-Methode bei dem aller ersten Aufruf fehlerhaft funktioniert hat, wird nicht mehr sichtbar.

Präventive Maßnahmen:
Die triviale Lösung fliest aus der Ursache des Problems heraus. Man sollte vermeiden statische Attributen direkt zu initialisieren.

Hier hab ich zwei Klassen verglichen, die einen Singelton abbilden, also sich selbst als statischen Attribut beinhalten.
In der ersten Klasse wird das statische Attribut zur Ladezeit der Klasse initialisiert:



Zweite Klasse initialisiert Singelton über die getInstance() Methode:



Und zum Schluss laden wir jeweils zwei Mal unsere beide Probanden  und schauen was dabei passiert:


Anbei die Konsole-Ausgaben:

Wie wir sehen - bei dem Laden der erste Klasse zum zweiten Mal kommt das NoClassDefFoundError Fehler.
Jedoch bei der zweiten Variante, wo das statische Attribute jedes Mal zur Abfragezeit geladen wird, bekommen wir stets sprechende Fehlermeldung, so dass die Ursache des Problems sofort identifiziert wird.

סוֹף~

Mittwoch, 24. Juli 2013

Java Debugging with Eclipse - Tutorial

Sehr empfehlenswerte Artikel über Java Debugging with Eclipse von Lars Vogel.

http://www.vogella.com/articles/EclipseDebugging/article.html

Insbesondere The Advanced Debugging. Es ist für mich eine Überraschung gewesen dass Teile des Programms zur Laufzeit neugestartet werden können (4.9). Und dass man Watchpoints auf Felde (Variablen) setzen kann und dadurch die Änderungen/Lesezugriffe überwachen - wusste ich auch nicht.


Donnerstag, 18. Juli 2013

Fotoalbum im Picasa publizieren und nicht im G+

Seit kurzem hat Google uns das Leben etwas komplizierte gemacht. Laut ihr (Google) sollten wir halt auf unsere einfache in Bedingung, simple und vor allem heißgeliebte Picasa-Web zu gunsten von G+ verzichten.

Nein, das machen wir nicht! ;)


Hier einpaar Schritte wie das geht. Und gleich kann man's als Tutorial für Fotoalbum publizieren verwenden.

Schritt 0:  Das kriegt man schon irgendwie selbst hin
Fotoalbum vorbereiten und hochladen und auf die Webseite von Picasa gehen:
https://picasaweb.google.com?noredirect=1
und zum Album springen.

Schritt 1: Berechtigungen bearbeiten




Für alle die den Link kriegen freischalten: "Eingeschränkt, alle mit dem Link"




Schritt 2: Link kopieren und am Ende des Links ein Parameter &noredirect=1 anhängen



Schritt Z: Einen Spende-Click auf die Werbung unten, Link verschicken an Menschen die uns lieb sind und fertig.

~Finito

Dienstag, 2. April 2013

Полезняшка : Generate Constructor using Fields

Man-o-man, wie häufig habe ich schon diese Konstruktoren geschrieben die einfach die Parameter auf Felder setzen. Das kennt doch jeder: this.hallo = hallo; Man-o-man!!! Und das geht doch so einfach:

In der Klasse, an der Stelle wo Konstruktor platziert werden soll:

ALT+SHIFT+S + O





voilà 




Donnerstag, 28. März 2013

Полезняшка : In Groß-/Kleinschreibung umwandeln

Um im eclipse eine Zeichenkette in Groß- bzw. Kleinbuchstaben zu konvertieren braucht man lediglich:
    Text selektieren und
    Lower case: CTRL+SHIFT+Y
    Upper case: CTRL+SHIFT+X

~

Montag, 4. März 2013

git merging approach

Nach dem wir von einfachem svn auf coolen git umgestiegen sind. Ging am Anfang gar nichts mehr. Das Merging mit dem eGit-Plugin und mit dem alten Rangehensweise wie bei SVN - funktionierte an der Stelle nicht.

Bei svn war das ganze schön einfach: vor dem Entwickeln einmal updaten dann anpassen, dann wieder updaten falls in Zwischenzeit jamand an der gleiche Stelle was gemacht hat - mergen und letzendilch commiten.

Bei git ist natürliche Weise alles komplizierte, oder denke ich das nur so. Auf jedem Fall habe ich nach lange Suche keinen vernünftigen Tutorial gefunden, wie das normale Arbeitsablauf mit git funktionieren soll.

Nach langem hier-und-her habe ich für uns folgende Vorgehensweise identifiziert.
Über Feedback und Hinweise, dass es auch einfache gehen kann, werde ich mich freuen.

Übrigens, ich mache jetzt alles über Konsole, da eGit bei den ersten Versuchen nicht so richtig funktioniert hat.


Das Geheimnis des erfolgreichen Mergen mit git liegt im lokalen Branch!

Also so gehe ich vor:

10: Begin:

20: Aktuelle Version des Codes herunterladen (svn update)

git pull

30: Eigenen lokalen Branch anlegen (das kann auch später gemacht werden, aber auf jedem Fall vor dem ersten add/commit)

git checkout -b FeatureXXX (Name des Branches kann z.B. der zu entwickelnde Feature oder Bug sein)


40: (Optional) Alle branches anschauen und wo man gerade arbeitet, das wird mit * vermekrt.

git branch


50: Programmieren und Entwicklen und add und commit, und add und commit ...

git add -A
git commit -m "das FeatureXXX ist schon fast fertig"


60: Wenn man fertig mit dem Feture/Fix ist, dann letztes mal commiten und zurück auf den master (trunk) switchen

git checkout master

70: Noch mal von dem remote updaten, kann ja sein dass in der Zwischenzeit jemand was gemacht und commitet hat

git pull

Jetzt haben wir im lokalen master die aktuelle Version von dem Server und im Branch FeatureXXX  unsere Anpassungen.

80: Jetzt wird gemergt, wichtig ist dass das Merging von dem master gemacht wird. Das kann mit git branch überprüft werden.
master branch, you can pruef it with "git branch")

git merge 
FeatureXXX 


90: Im Eclipse nachschauen ob wir keine Konfikte haben, dafür ist eGit gut. Die Konflikte werden mit rotem Sternchen vermerkt. Wenn wir so viel Gluck haben, das keine Konflikte entstanden sind (kann natürlich auch daran liegen, dass keine sonst außer uns was gemacht hat :) ) Dann Pushen:

git push


100: Wenn Konflikte nach dem Merging entstanden sind, dann müssen diese manuelle behoben werden und dann wie üblich: add/commit/push

git  add -A
git commit -m "F
eatureXXX ist gemerget"
git push


110:END

Ich teste erfolgreich das Vorgehen schon seit 3 Wochen.


Hier noch ein gutes Tutorial für großere Teams:
http://nvie.com/posts/a-successful-git-branching-model/


Good luck

Mittwoch, 21. November 2012

JAR Dependencies auflösen

Ab und zu stehe ich vor der Versuchung einpaar schöne Bibliotheken in mein Projekt einzubinden.
Den Abhändigkeitsschwanz aufzulösen ist dabei eine richtige Herausforderung. Wenn das ein Maven Projekt wäre - dann hat man es gut. Wenn aber nicht?!

Heute war wieder so ein Versuchung. In einem überschaubaren Projekt wollte ich RESTEasy von JBoss für rest-ws verwenden. Wenn man allerdings über die Liste der mitgeschleppten Bibliotheken stolpert, 66 JARs samt 16MB, dann überlegt man drei mal.

Gut wenn man weißt das für den rest-ws Einsatz lediglich ein Paar von den JARs notwendig sind. Aber, wie kriegt man raus welche von den 66 tatsächlich erforderlich sind. Na gut, etwas Ahnung, dass z.B. JAX-RS das gesuchte Modul ist, müsste man schon haben.

Und die restliche JARs von denen das Modul abhängig ist, kriegt man mit einem kleinen Gradle Script herauskopiert:




und so wird der Script ausgeführt:
gradle -q copyJars



und was haben wir als Ergebnis? Es werden lediglich 13 JARs samt 2MB benötigt.

~
Finito 

Freitag, 16. November 2012

Auf HSQLDB über Tomcat zugreifen

Ziel

Ich wollte mir kleines Tomcat Projektchen mit HSQLDB zum Testen schnell einrichten. Da es letztendlich über zwei Stunden gedauert hat, und keine gute Anleitung im Netz zu finden war - schreibe ich Eine.

Umsetzung

Alles sehr simple. Mein Projekt trägt den stolzen Namen: Sausage

Schritt 1:   context.xml und web.xml von dem Projekt anpassen:

~/Sausage/docroot/META-INF/context.xml
- -
~/Sausage/docroot/WEB-INF/web.xml
- -

Schritt 2:
Die hsqldb.jar ins ~/Sausage/docroot/WEB-INF/lib/ reinschmeißen. Und Sausage deployen.

Schritt 3:
Und hier der Java-Aufruf für den Datenzugriff:
- -

~
Finito 

Mittwoch, 13. Juni 2012

Liferay 6.1 : Logging

Nach dem ich viel-zu-viel Zeit investiert habe um das Geheimnis zu luften - wo bei Liferay das Logging konfiguriert wird - hier die Auflösung. Eigentlich ist das ganz einfach, wenn man es kennt. Im Verzeichnis tomcat-7.x.x/lib/ext/META-INF müssen hierfür zwei Dateien abgelegt werden.
portal-log4j-ext.xml zum Beispiel so:
Die Kategorie sowie Log-Level kann hier konfiguriert werden.
Zusätzlich fragt Liferay nach DTD, dass im gleichen Verzeichnis abgelegt werden soll. Die Datei log4j.dtd ist im portal-impl.jar unter META-INF/ zu finden.

Die Dateien log4j.jar und log4j-extras.jar sollen aus dem tomcat-7.x.x/webapps/ROOT/WEB-INF/lib ins tomcat-7.x.x/lib/ext verschoben werden, damit alle Logger-Klassen mit gleichem (globalen) Classloader geladen werden.
Weiterhin, damit es funktioniert, muss man dem Liferay beibringen die log4j-Files beim Deployen von Portlets für sich zu behalten, also nicht in die Applikationen zu kopieren. Leider ist das nicht die default Einstellung.
Hierfür soll der altbekannte portal-ext.properties angepasst werden:

auto.deploy.copy.commons.logging=false
auto.deploy.copy.log4j=false
Erledigt.

Und das beste daran ist, jetzt kann ich den LogLevel Live konfigurieren, und zwar über das Control-Panel -> Server -> Administration -> LogLevel
Note: Anpassungen, die über Control-Panel getätigt sind, werden nicht im Datenbank abgelegt, also nach dem Neustart des Servers hat man wieder den LogLevel aus portal-log4j-ext.xml

Dienstag, 20. März 2012

Fette Liferay Portale


Liferay gewinnt stets an dem Bekanntheitsgrad, anbei ein paar große Portale, die auf Basis von Liferay aufgesetzt sind.  

 
Portal der US Marine

Studentische Portal der TU Braunschweig

Soziales Netzwerk für Schriftsteller und Szenaristen


 
 Palästinische Jugendportal

Nachrichten Agentur TVBEurope


Job Portal von Total Energy

Sesame Street 

Mittwoch, 16. März 2011

Suchen mi Firefox noch schneller als mit Chrome

Habe selbst diese Funktion sehr lange bei Firefox vermisst. Und zwar - die Suche direkt in einem "spezifizierten" Websystem, zum Beispiel Wikipedia oder Ebay oder Amazon oder Synonymen Datenbank oder Filmen Datenbank etc.

Und mit Firefox geht das, und zwar sehr bequem! Einfach in der Navigation-Leiste (wo die URL eingegeben wird) Schlüsselword + Suchbegriff eingeben, z.B.
wiki elefant

Statt 'wiki' als Schlüsselwort könnten wir auch 'w' verwenden. Die Konfiguration von
Schlüsselworten ist in diesem Artikel gut beschrieben:
http://support.mozilla.com/en-US/kb/Smart%20keywords

Donnerstag, 10. März 2011

Zwei oder mehr Firefox Instanzen starten



Problem: wir wollen in einem Multiuser Websystem die Interaktion zwischen zwei bzw. mehren Benutzern emulieren, testen, vorführen. Meistens wird für solche Anforderung zwei verschiedener Browser verwendet, z.B. Firefox und IE, oder Chrome, oder Opera. Das liegt an der Natur des Browsers, und zwar weil die User-Session browser-weit abgelegt wird. Das heißt wenn der User A sich in einem Firefox-Tab bzw. Firefox-Window bei einer Websystem eingeloggt hat, dann ist er ebenfalls in anderen Tabs und Windows von Firefox als dieser User A eingeloggt.


Es besteht jedoch auch die Möglichkeit solche Simulation allein mit Firefox durchzuführen. Hierfür bietet Firefox eine Unterstützung für Profile.

Firefox-Profile anlegen:
Firefox ProfileManager starten:
"C:\...\firefox.exe" -P

und zwei (bzw. mehrere) Profile anlegen. Wir nennen den ersten Profile "Surfer" und den zweiten "Developer".Tipp: Beim anlegen von Profilen kann ein eigenes Ordner angegeben werden, hierdurch bietet sich die Möglichkeit das Profile in ein Ordner zu verlegen, das ab und zu gesichert wird. Um beim Umstieg auf ein anderes PC bzw. bei Festplatte-Crash die Profile-Daten (Einstellungen, Bookmarks, Formular Autovervollständigung, Passwörter, Historie, Addons, Themes etc.) wiederherzustellen.
Firefox Instanzen starten:Instanz 1:
"C:\...\firefox.exe" -P "Surfer" -no-remote


Instanz 2:
"C:\...\firefox.exe" -P "Developer" -no-remote


und die beiden Ausführungsbefehle können anschließend als Verknüpfung auf dem Desktop abgelegt werden, damit man schnell die beiden Instanzen starten kann.

Tipp: Um die beiden Instanzen unterscheiden zu können habe ich bei dem Developer-Firefox ein anderes Theme gesetzt.


Tipp: Der Developer-Firefox hat zusätzlich ein Paar für die Web-Entwicklung interessante Addons installiert bekommen: Firebug, Web-Developer, ColloZilla. Im normalen Surfer-Firefox sind diese Addons nicht installiert, da sie die Surf-Geschwindigkeit beeinträchtigen.


Donnerstag, 4. November 2010

Groovy ist cool! 5 Zeiler

Eine Datenbank auswerten und in die andere ablegen - nur in 5 Zeilen:


Mittwoch, 29. April 2009

Zauberzutaten aus der Küche von FireFox

LastTab (bzw. Tab Mix Plus)
die Tastenkombination "Ctrl + Tab" führt zu dem letzten offenen Tab, wie man das von Windows "Alt + Tab" kennt
https://addons.mozilla.org/de/firefox/addon/112
Tab Mix Plus: https://addons.mozilla.org/en-US/firefox/addon/1122


TextArea autosave (Lazarus)
nützlich bei Eingabe lange Texte, z.B. in Wiki. Falls FireFox (oder ganzer Rechner) hängen bleiben, dann hat man ohne diesen Addon das eingegebene Text verloren, hiermit bleibt es nach dem Neustart von FireFox (bzw. Rechner) erhalten
https://addons.mozilla.org/en-US/firefox/addon/6984


Tab in TextArea
Nützlich bei Eingabe von Sourcecode in Wiki, sonst führt Tab-Taste ins nächstes Feld
http://www.erweiterungen.de/detail/Tab_in_Textarea/


ColorZilla
Farbenwerte eines Bereichs der Seite anzeigen


Wörterbüche
Deutsch - https://addons.mozilla.org/de/firefox/addon/3077
Russian - https://addons.mozilla.org/de/firefox/addon/3703

FireBug
muss an der Stelle erwähnt werden, weil für Web-Developer unabdingbar

https://addons.mozilla.org/de/firefox/addon/1843


Web Developer
und der heißt sogar so
https://addons.mozilla.org/de/firefox/addon/60

Donnerstag, 5. Februar 2009

Zaubersprüche aus Windows Kessel

auch bei Windows existieren hilfreiche HotKeys.
Anbei meine geliebten:
  • Alt+Tab — wechseln zwischen offenen Anwendungen/Fenstern

  • Start+D — alles, aber wirklich alles, minimieren

  • Start+M — alles bis auf Alerts minimieren

  • Start+E — Arbeitsplatz

  • Start+L — Rechner sperren

  • Start+R — Ausführen Dialog

  • Ctrl+Shift+Esc — Task Manager

  • Alt+Druck(Print) — Screenshot aktive Fenster

  • Alt+Enter — Objekteigenschaften
  • Start+Pause — Systemeigenschaften

Mittwoch, 10. September 2008

Eclipse Hotkeys oder meine Zaubersprüche

für eine effiziente Entwicklung mit eclipse, bietet es hunderte von HotKeys, die Liste kann durch tippen 'Ctrl+Shift+L' angezeigt werden. Für einen gewöhnliche Entwickler wie mich reicht jedoch ein Dutzend davon.



Legende:

[wsot] : with search on typing



Navigation:

  • Ctrl+O — Quick Outline [wsot]
  • Ctrl+Shift+T — Klasse suchen und öffnen [wsot]. Beschleunigung durch Eingabe von Großbuchstaben (z.B. tippe "FW" um FileWriter zu finden)

  • Alt+Left/Right — wechseln zwischen vorherigen/folgenden Dateien

  • Ctrl+F6 — wechseln zwischen offenen Dateien (am besten ins Ctrl+Tab ändern, wie bei Firefox, Photoshop etc.)

  • F3 — Deklaration öffnen

  • Ctrl+Alt+H — Open Call Hierarchy [wsot]

  • Ctrl+T — Open Type Hierarchy [wsot]. Hilfreich bei Suche nach Implementierungen von der Klasse oder Methode (unter dem Kursor).

  • Ctrl+E — Liste offene Dateien [wsot]

  • Ctrl+Shift+R — Datei suchen und öffnen [wsot]. Beschleunigung durch Eingabe von Großbuchstaben (z.B. tippe "TPTT" um TaskParserTokenTypes.txt zu finden)

  • Ctrl+J — Incremental Search [wsot]

  • Ctrl+. — Navigieren zum nächsten Fehler / Warning

  • Ctrl+Up/Down — springen zwischen Methoden





Editieren:

  • Ctrl+N — New Class, Project, File, etc. [wsot]

  • Ctrl+1 — Quick Fix: gibt Korrekturvorschläge (der Kursor steht in der fehlerhafte Zeile)

  • Ctrl+Space — Context Assist: tippen nach "a .", oder um Makros (for, while, sysout, public_methode, …) zu nutzen.

  • Ctrl+Shift+O — organisiert Imports

  • Alt+Up/Down — Schiebt die Selection, bzw. aktuelle Zeile nach oben (unten). Tipp: durch tippen von Alt+Up, Alt+Down wird eine Zeile markiert.

  • Ctrl+Alt+Up/Down — Kopiert die Selection, bzw. aktuelle Zeile nach oben (unten)

  • Ctrl+D — Löscht aktuelle Zeile

  • Alt+Shift+Up — Erweitert die Markierung auf übergeordnetes Element (z.B. zum Markieren eine Zeile aus der Mitte der Zeile)

  • Alt+Shift+T — Show Refactor Quick Menu

  • Alt+Shift+S — Show Source Menu

  • Ctrl+Shift+F — automatische Formatierung