Yesterday we had a great famliy day (my g/f’s sister with kids and her parants) at Frankfurt zoo. Kids are so interessted in animals, it’s just awesome.
Right at the beginning of our zoo tour we passed the bear cages. So if you ever think YOU are chilling, think of this picture here:

Chilling sloth bear
The only thing missing in this picture is the thought bubble: “That’s how we role at the zoo, bro!”
I was so fascinated that I probably spend 15 minutes watching the bear doing just nothing.
Ok, just wanted to share my experience with you; there’s only one statement left to say:
chilling bear is … chilling!
Posted in Daily Grind
Wow,
after 6 weeks of low carb diet with a maximum of 2000 calories a day (inspired by the body of Jason Statham seen in the movie Death Race) and unfortunately one week of having a cold and being down, I started to change to “regular” food again. Last night I hit the gym and *BAM* … what a new feeling. I managed all my exercises without any Problems and actually had enough power for another round.
The difference to working out on the low carb diet compared to “regular” is amazing.
I’m also thrilled about the fact that the diet really works. I lost 8 kg (about 16 lbs) in 6 weeks. It’s easy if you really want it but having low (or almost ‘no’) carb means that you don’t eat any of the following food:
- pasta
- bread
- rice
- potatoes
- cornflakes
You should create a list of foodstuff with its substances to quickly find out what you can/should eat or not. There are several websites where you can find those lists. Just use Google.
Being on this diet without doing anything else is probably pretty senseless so you should hit the gym and do some cardio exercises regularly. For workout; I had two training units (for different muscle groups), each one took about an hour. I hit the gym three to four times a week, played basketball 2 hours a week and went running outside once or sometimes twice a week.
You’ll have less power at the gym during that time and you might not accomplish your usual weight, repetitions and workout sets as usual … that’s ok!
My best friends concerning food during that diet were:
- tuna (or fish in general)
- turkey breast (or meat in general)
- vegetables (mostly tomatoes, salad and cucumber)
- cheese
- mayonnaise as dressing (be careful with that, it has a lot of calories)
- water (a lot of it ’cause it fills you up)
For breakfast I usually had an apple and a peach cut into pieces mixed with some yoghurt and sunflower seeds. Why the seeds? Low carb means, that you won’t have anything to bite. There are no crunchy things to bite on on a low carb diet so I had to put those seeds into my food. Try it out, it’s good.
The hard part is to have varied meals because your options are very limited. You need time to plan your meals, that’s for sure.
There’s no guarantee that this diet will work for. The daily calorie rate also depends on your actual weight and your metabolism plays a big part two. It worked for me and I’m pretty happy that I did it. I started at 90 kg and I’m down to 82 right now. I still try not to eat too much ’cause I want to get down to 79.
I’m not a sport student, physician or coach. I’m just interested in sports. I don’t have any special education that qualifies me to tell anyone what to do to loose weight or what he/she should do for sport. I just wanted to share my experience with you. If your have any questions, just write a comment to this post. I’d be happy if you share your experiences with me too.
Posted in Daily Grind
I spent a lot of time looking for an android hello world widget how to but I couldn’t find a simple example so I had to spend some time on cutting an existing one into pieces and then start from scratch with a HelloWidget tutorial.
I hope this will help you to get started on android desktop widgets. Please give me some feedback about the tutorial and/or any errors or wrong explanations.
Download the tutorial here. Get the source code here.
Posted in Android, Java
Es ist mir bisher zwar erst zwei Mal untergekommen, aber das ist mir diesen Eintrag Wert.
Listen in Java zu sortieren ist dank vieler Vergleichsmethoden relativ problemlos möglich. Aber es soll auch vorkommen (wie bei mir jetzt das zweite Mal), dass man in der Liste nach mehr als einem Kriterium sortieren möchte. Hier kommt der MultiComparator zum Einsatz.
Den unrsprünglichen MultiComparator habe ich bei AllExperts.com gefunden. Diesen habe ich mal auf die neue Generics-Welt in Java umgeschrieben.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
| package what.ever.you.like;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
/**
* Comparator, der für das gegebene Objekt <code>T</code> mehrere Comperatoren
* für eine Mehrfachsortierung anwenden kann.
* @param <T>
*/
public class MultiComparator<T> implements Comparator {
List<Comparator<T>> comparators = new ArrayList<Comparator<T>>();
public void addComparator(Comparator comp) {
comparators.add(comp);
}
public void removeComparator(Comparator comp) {
comparators.remove(comp);
}
public int compare(T obj1, T obj2) {
int result = 0;
for (Comparator comp : comparators) {
result = comp.compare(obj1, obj2);
if (result != 0)
break;
}
return result;
}
} |
Diesem MultiComparator kann man jetzt weitere Comparatoren für ein beliebiges Objekt T hinzufügen. Diese sorgen dann für die eigentliche Sortierung. Hier ein kurzes Beispiel:
1
2
3
4
5
| MultiComparator<SomeObject> multiComp = new MultiComparator<SomeObject>();
multiComp.add(new FirstOtherComparatorForSomeObject());
multiComp.add(new SecondOtherComparatorForSomeObject());
Collections.sort(listWithSomeObjects, multiComp); |
Jetzt kann man für jeglichen complexeren Vergleich einen eigenen Comparator schreiben und diesen dann an den MultiComparator in der Reihenfolge anhängen, in welcher sortiert werden soll.
Posted in IT & Development, Java
Das Problem mit Beispielen ist immer, daß es nur Beispiele sind und dadurch nicht alle Fälle abgedeckt werden, die im richtigen Einsatz nötig sind. In diesem Fall geht es darum, daß die Struts-Doku leider das Beispiel von Checkboxen gemeinsam mit Labels nicht im Repertoire hat.
Labels im Zusammenhang mit Checkboxen sind eine sehr hilfreiche Sache und tragen auch zur Usability bei.
Struts bietet mit html:multibox die Möglichkeit, Checkboxen zu gruppieren. Ein Aufruf aus dem JSP mit einem Iterator über eine gewisse Anzahl von Checkboxen sieht bspw. so aus:
1
2
3
4
5
6
7
8
| <logic:iterate id="currentField" name="fields">
<html:multibox
property="fields"
styleClass="checkbox">
<bean:write name="currentField" property="id" />
</html:multibox>
<bean:write name="currentField" property="name" /><br />
</logic:iterate> |
In Jim’s Blog habe ich ein gutes Beispiel gefunden, wie hier Labels ohne größeren Aufwand verwendet werden können:
1
2
3
4
5
6
7
8
9
10
11
12
13
| <logic:iterate
id="currentField"
name="fields"
indexId=”count”>
<label for=”field.<bean:write name=’count’/>”>
<html:multibox
property=”fields”
styleClass=”checkbox”
styleId=’<%=”field.”+count%>’>
<bean:write name=”currentField” property=”id” />
</html:multibox>
<bean:write name=”currentField” property=”name” /><br />
</logic:iterate> |
Im Quelltext sieht das ganze dann so aus:
1
2
3
4
5
6
7
8
| <label for=”field.0″>
<input type=”checkbox”
name=”fields”
value=”1″
id=”field.0″
class=”checkbox” />
Ein Labelname<br />
</label> |
Und schon hat man wieder mehr Usability erreicht.
Posted in IT & Development, Java
Über die Criteria API von Hibernate lassen sich mittlerweile fast alle SQL-Queries wurderbar zusammenstellen. Nur hier und da gibt es ein paar Dinge, die schöner umgesetzt werden könnten.
Ich habe bspw. eine Criteria auf ein Entity welches wiederum verknüpfte Entities hat. Meine Sortierung möchte ich auf ein Property des verknüpften Entities legen. Von der Crietria API sind wir es eigentlich gewohnt, so vorzugehen:
1
2
| Criteria criteria = getCurrentSession().createCriteria(User.class);
criteria.addOrder(Order.asc("usergroup.name")); |
Leider funktioniert dieser Code nicht, die Exception ist, das das Property “usergroup.name” nicht bekannt ist.
Um das Problem zu umgehen, muss man der Criteria explizit angeben, dass man auf das Entity “UserGroup” zugreifen möchte. Folgendes funktioniert demnach:
1
2
3
4
| Criteria criteria = getCurrentSession().createCriteria(User.class);
Criteria subCrit = criteria.createCriteria(UserGroup.class);
// Sortierung auf UserGroup.name
subCrit.addOrder(Order.asc("name")); |
Dieser “Bug”, das eine solche Sortierung überhaupt noch nicht unterstützt wurde, gilt nur für die Version 2.1. Schade ist, dass weiterhin eine Subcriteria verwendet werden muss, um die Sortierung dann auf die darunterliegende Property ausführen zu können. Der Weg über die Punkt-Notation wäre wohl schöner und leichter.
Hoffentlich kommt das noch.
Posted in IT & Development, Java
Ich weiß gar nicht so genau, warum mir das erst jetzt aufgefallen ist … wahrscheinlich liegt es daran, dass ich foreach-Schleifen in PHP bisher immer nur zum Auslesen verwendet habe.
Die foreach-Schleife in PHP
1
2
3
| foreach ($myArray as $key => $value) {
// code here
} |
referenziert $value nicht, sondern kopiert die Werte. Das bedeutet, dass folgender Code keinen Effekt hat:
1
2
3
| foreach ($myArray as $key => $value) {
$value += "something";
} |
Nach dem Schleifendurchlauf sind die Werte des Arrays genau wie vorher.
Seit PHP 5 kann man dieses “Problem” folgendermaßen lösen:
1
2
3
| foreach ($myArray as $key => &$value) {
$value += “something”;
} |
Wie in der Doku (php.net) von PHP beschrieben, wird jetzt der Wert durch das &-Zeichen referenziert und nicht mehr kopiert.
Es wird noch darauf hingewiesen, dass man nach dem Schleifendurchlauf mit
die Referenz auflösen sollte, da diese auch nach der Schleife auf das letzte Element des Arrays zeigt.
Posted in IT & Development, PHP
Ein Problem bei Struts ist, dass man nicht mehrere Formulare auf einer Seite haben kann, da das ActionMapping immer genau eine FormBean konfigurieren kann. Benötigt man jedoch eine solche Konstellation, muss man sich mit anderen Tricks helfen.
In meinem Fall habe ich ein Formular verwendet und dieses mit einem hidden-field ausgestattet. Per JavaScript wird bei verschiedenen Buttons zunächst das hidden-field gesetzt, und dann die Form abgeschickt. In der Action werden dann nur die entsprechenden Felder ausgewertet, die unter die Kategorie des Flags im hidden-field fallen. Soweit so gut, aber was ist mit Validierung?
Bei meiner Konstellation muss die Validierung über die validate()-Methode im FormBean geschehen, da ja je nach gesetztem Flag nicht alle Felder benötigt und somit nicht validiert werden. Die validation.xml kann in diesem Fall leider nicht verwendet werden, da diese immer die komplette FormBean überprüft, ungeachtet der Tatsache, dass ja nur ein Teil der FormBean-Daten zur Weiterverarbeitung verwendet werden soll.
Da Struts die Apache Commons Validations Bibliothek implementiert, kann dieses Framework auch gut vom Programmcode aus genutzt werden. Mein Problem war bspw. die Überprüfung eines Datums mit der richtigen Schreibweise. Hierfür gibt es schon eine fertige DateValidation.
Meine validate()-Methode sieht dann so aus:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
| @Override
public ActionErrors validate(ActionMapping mapping, HttpServletRequest request) {
ActionErrors errors = super.validate(mapping, request);
SimpleDateFormat sdf = new SimpleDateFormat("dd.MM.yyyy", Locale.GERMAN);
// überprüfen, welcher Formularteil ausgewertet werden soll
if (this.hiddenFieldFlag.equals("firstForm")) {
// Überprüfung des Datumsformates
boolean checkDate = DateValidator.getInstance().isValid(date, sdf.toPattern(), true);
/*
* ... weitere Validierungen und ggf. ActionErrors setzen ...
*/
}
if (this.hiddenFieldFlag.equals("secondForm")) {
// ...
}
return errors;
} |
Einen anderen Weg, auf die vorkonfigurierten Validierungen der XML-Datei zuzugreifen, habe ich bisher leider nicht gefunden. Sollte jemand hierfür eine Lösung haben, wäre ich dankbar für die Information.
Posted in IT & Development, Java
Manche Dinge fallen einem nur dann auf, wenn es in den kritischen Zustand rutscht. In diesem Fall betrifft das meine Systempartition, deren Speicherplatz sich dem Ende neigt. Durch dieses Problem habe ich gesehen, wie WinRAR arbeitet, und was den Unterschied macht zwischen dem Kontextmenübefehl “Hier entpacken…” (Extract here …) und einem Drag&Drop einer Datei aus dem geöffneten Archiv aus.
Wenn ihr das Archiv öffnet und eine darin enthaltene Datei per Drag&Drop in ein Verzeichnis kopiert, dann erzeugt WinRAR ein temporäres Verzeichnis unter eurem Benutzer, was standardmäßig mal auf der (bei mir vollen) Systempartition liegt. In meinem Fall handelte es sich hierbei um knapp 1GB Daten. Diese wurden also erst auf die Systempartition extrahiert und von dort dann in das gewünschte Verzeichnis verschoben.
Mit dem Befehl “Hier extrahieren…” kann man das Problem allerdings umgehen. In diesem Fall extrahiert WinRAR die Datei(en) direkt in das gewünschte Verzeichnis, ohne Umweg über einen Temp-Ordner (oder Datei).
Warum das so umgesetzt wurde würde mich allerdings schon interessieren. Wozu der Umweg?
Naja, solltet ihr wie ich das Speicherplatzproblem haben, einfach über den richtigen Befehl im Kontextmenü gehen, dann funktioniert das auch.
Posted in IT & Development
Vielleicht kennt das der ein oder andere von euch:
Man sitzt entspannt beim Programmieren und hört dabei leise über Kopfhörer Musik. Da wir ja alle schnelle Entwickler sind, beherrschen wir das 10 Finger-System und hauen ordendlich in die Tasten .. und erwischen auf unserem ThinkPad ausversehen mal 3 Tasten gleicheitig BEEEEEEEEEP. *Autsch* da kommt einem gleich das Hirn durch die Nase und schlabbert über die Tastatur … denn dieser Beep hat alles andere als die vom Betriebssystem eingestellte Lautstärke.
Ich rede hier von MS Windows XP und habe an dieser Stelle keine Erfahrung mit anderen Betriebssystemen. Der Weg über BIOS hat bei meinem R60 nicht funktioniert, obwohl manche ThinkPads diese Option in ihrem BIOS laut Internetrecherche besitzen.
Den Lösungsweg unter Windows aber habe ich endlich gefunden:
- Systemsteuerung > System > Hardware > Geräte Manager
- Ansicht > Ausgeblendete Geräte anzeigen
- Im Baum ‘Nicht-PNP-Treiber’ > Beep > rechte Maustaste > Deaktivieren
Endlich kehrt wieder Ruhe in das Entwicklerleben ein; und wenn ich mal wieder zu schnell tippe, dann vibriert der Schädel nicht gleich wieder.
Ja, manch einer wird jetzt sagen: “Die Beeps sind für Warnhinweise” … schon klar … aber lieber einen Warnhinweis nicht mitbekommen, als Taub durch die Gegend zu rennen … und gerade bei Tastatureingaben sehe ich ja wohl, wenn ein oder mehrere Zeichen nicht angekommen sind.
Posted in IT & Development