Kalender
Suche |
Freitag, 16. April 2010Neues LaufwerkHeute haben wir im Büro ein nettes Paket bekommen. Drin war ein Laufwerk, das wir bestellt hatten. Aber nicht irgendein neumodisches Blu-ray Laufwerk oder so. Nein, ein IBM 3490E E11, ein knapp über 30kg schweres und etwa einen Meter langes Bandlaufwerk, das eigentlich für Mainframes gedacht ist. Gebaut werden die Dinger auch gar nicht mehr, das E11-Modell wurde zwischen 94 und 97 produziert. Billig war das Laufwerk dementsprechend nicht, wohl aber vermutlich nicht so teuer, wie sie damals waren. So, aber warum brauchen wir das ganze denn? Naja, COBOL ist nicht das einzige Relikt aus einer lange vergessenen Zeit, das noch gerne in der Finanz- und Versicherungsbranche verwendet wird, nein, auch Bänder gehören da natürlich dazu. Nun hatte aber einer unserer Kunden ein Problem, die Daten, die sie uns übermitteln sollten von ihrem Mainframe irgendwie runterzubekommen und uns zu schicken. Also haben sie uns kurzerhand Bänder zugeschickt und jetzt dürfen wir uns damit rumärgern. Allerdings hatten wir schonmal ne ganze Menge Spaß damit, haben auch ein Gruppenfoto mit dem Laufwerk in der Mitte gemacht (das ich natürlich nicht habe). Probleme fingen dann erst an, als wir das Laufwerk installieren wollten. Anschließen war erstmal kein Problem (über SCSI), aber Treiber hatten wir erstmal keine. Montag wird es wohl dann weitergehen. Samstag, 6. Februar 2010Something I learned today 2: RTFMThreads sind eine tolle Sache... wenn man richtig damit umgeht. Nicht nur, dass Fehler auf Grund von Race Conditions nicht jedes mal auftreten, nein, ab und an helfen einem auch die Exceptions nicht viel weiter, wenn es um das Lokalisieren der Fehlerquelle geht:
Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException at javax.swing.LayoutComparator.compare(Unknown Source) at java.util.Arrays.mergeSort(Unknown Source) at java.util.Arrays.mergeSort(Unknown Source) at java.util.Arrays.mergeSort(Unknown Source) at java.util.Arrays.mergeSort(Unknown Source) at java.util.Arrays.mergeSort(Unknown Source) at java.util.Arrays.mergeSort(Unknown Source) at java.util.Arrays.sort(Unknown Source) at java.util.Collections.sort(Unknown Source) at javax.swing.SortingFocusTraversalPolicy.enumerateAndSortCycle(Unknown Source) at javax.swing.SortingFocusTraversalPolicy.getFirstComponent(Unknown Source) at javax.swing.LayoutFocusTraversalPolicy.getFirstComponent(Unknown Source) at javax.swing.SortingFocusTraversalPolicy.getDefaultComponent(Unknown Source) at java.awt.FocusTraversalPolicy.getInitialComponent(Unknown Source) at java.awt.DefaultKeyboardFocusManager.dispatchEvent(Unknown Source) at java.awt.Component.dispatchEventImpl(Unknown Source) at java.awt.Container.dispatchEventImpl(Unknown Source) at java.awt.Window.dispatchEventImpl(Unknown Source) at java.awt.Component.dispatchEvent(Unknown Source) at java.awt.EventQueue.dispatchEvent(Unknown Source) at java.awt.SequencedEvent.dispatch(Unknown Source) at java.awt.EventQueue.dispatchEvent(Unknown Source) at java.awt.EventDispatchThread.pumpOneEventForHierarchy(Unknown Source) at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source) at java.awt.EventDispatchThread.pumpEvents(Unknown Source) at java.awt.EventDispatchThread.pumpEvents(Unknown Source) at java.awt.EventDispatchThread.run(Unknown Source)
Once a Swing component has been realized, all code that might affect or depend on the state of that component should be executed in the event-dispatching thread. Bei uns wurde das ganze dadurch ausgelöst, dass in einem anderen Thread Components aus einem Panel entfernt wurden. Gleichtzeitig hat aber der event-dispatching thread versucht, diese Objekte zu zeichnen. Das das nicht gut gehen kann, sollte man sich recht leicht vorstellen können. Der Fehler lässt sich auch recht leicht beheben. Man muss nur sämtlichen nebenläufigen Code nach Methoden-Aufrufen von Swing Components durchsuchen (um genau zu sein, muss es nicht jeder Aufruf sein. So sollte ein add() keine Exception verursachen. Der event-dispatching thread würde die Componenten im alten Zustand zeichnen, merken, dass etwas neues dazu gekommen ist und das ganze einfach noch mal zeichnen) und sie dann mit invokeLater() oder auch invokeAndWait() im event-dispatching thread ausführen lassen. Die mehrstündige Suche nach der Ursache wäre uns also erspart geblieben, wenn wir vorher einfach nachgelesen hätten, was man bei Threads und Swing zu beachten hat.
Geschrieben von pb
in Die echte Welt, Java, Softwareentwicklung
um
15:30
| Kommentare (0)
| Trackbacks (0)
Samstag, 2. Januar 2010Des Zewa-Bärs FerienwohnungWie ja bereits bekannt ist, ist der Charmin-Bär umgezogen und wohnt jetzt bei Zewa... oder vielleicht auch nicht:
Die feuchten Toilettentücher sind von der gleichen Firma wie auch das normale Zewa Toilettenpapier, hat scheinbar die Marketingabteilung vergessen. Denn was soll der Kunde denn jetzt denken? Ist der Bär jetzt bei Zewa oder noch bei Charmin? Wurde der Bär geklont? Handelt es sich um einen lange verschollen geglaubten Zwillingsbruder? Ich für meinen Teil werde ihn einfach Chawa-Bär nennen. Das hat dann mit der Programmiersprache Java nicht nur die Aussprache gemein, sondern es ist auch beides für den Popo Donnerstag, 17. Dezember 2009Something I learned today 1: Verwende Generics konsequentGestern hatte eine Kollegin ein Problem, dass uns etwas Kopfzerbrechen bereitete. Sie hatte in ihrem Code eine ClassCastException, wo wir keine erwarteten. Sie hatte eine mit Generics spezifizierte LinkedList (sagen wir mal mit Klasse A) und als sie eine Zuweisung der Art LinkedList<A> liste = new LinkedList<A>(); ... A obj = liste.get(0); ausführte, flog eine ClassCastException. Wir fragten uns dann natürlich, wie es sein kann, dass ein Objekt einer anderen Klasse in der Liste steckt. Schließlich sollten die Generics gerade das verhindern, so, dass der Fehler nicht zur Laufzeit, sondern schon zur Compilerzeit auftritt. Nunja, des Rätsels Lösung war dann recht einfach. Sie hatte an anderer Stelle eine Liste die ohne Generics spezifiert war und hatte sie prompt mit einem falschen Objekt gefüllt. Anschließend übergab sie diese nicht-generic Liste als Parameter der Methode addAll(Collection<? extends E> c). Auch wenn die Parameter-Deklaration eigentlich vermuten lässt, dass hier auch nur Collections mit entsprechendem Typ erlaubt sind, scheint das nicht der Fall zu sein. Die generic Liste schluckte die falschen Objekte ohne zu murren. LinkedList<String> genericList = new LinkedList<String>(); LinkedList nonGenericList = new LinkedList(); nonGenericList.add(new Integer(1)); genericList.addAll(nonGenericList); // funktioniert, obwohl genericList nur Strings erlaubt String result = genericList.get(0); // ClassCastException Deshalb: benutzt eure Generics konsequent.
Geschrieben von pb
in Die echte Welt, Java, Softwareentwicklung
um
16:31
| Kommentare (0)
| Trackbacks (0)
Samstag, 12. Dezember 2009Eine IdeeGestern war ich auf der Plenum-Weihnachtsfeier und auf der Fahrt dort hin, hatten wir eine super Idee als wir an einem McDonald's LKW vorbei gefahren sind: Drive-by Fastfood. Beim Drive-Through fährt man ja bekanntlichermaßen an einen Schalter, an dem man seine Bestellung aufgibt, dann an einen anderen Schalter und dort bekommt man dann sein Essen. Man kann das ganze zwar aus dem Auto aus machen, aber man muss trotzdem die Straße verlassen. Hier würde das Drive-By ansetzen. Man bräuchte entsprechende Trucks mit einer Theke, ähnlich wie bei einem ice cream truck, nur größer, an dem man wärend der Fahrt die Bestellung auf- und entgegennehmen kann. So würde man noch etwas mehr Zeit gegenüber dem Drive-Through sparen. Und natürlich sollte es auch eine App geben um zu sehen, wo gerade ein entsprechender Truck unterwegs ist und über die man evtl. eine Bestellung aufgeben kann. Sonntag, 15. November 2009Die Wege meiner Telefonnummer sind unergründlichIch habe seit Freitag dem 7. wieder einen Festnetzanschluss (bei KabelBW) und schon zweimal (am 9. und am 15.) einen Anruf von zwei verschiedenen mir unbekannten Nummern erhalten. Laut whocallsme sind beides Nummern von Meinungsumfrageunternehmen. Die Frage, die sich mir natürlich stellt, ist: woher haben die meine Nummer? Ich habe sie nicht ins Telefonbuch eintragen lassen, zum Zeitpunkt des ersten Anrufs hatte ich die Nummer nur an meine Eltern weitergegeben und beim zweiten Anruf zusätzlich noch an meine Schwester und an zwei Freunde und soweit ich weiß, hat keiner von diesen irgendwelche Verbindungen zu Adress-Händlern. An einen Wählautomat, der zufällig Kombinationen durchprobiert, glaube ich nicht. Es wäre schon sehr unwahrscheinlich, zweimal innerhalb von einer Woche angerufen zu werden und vorher vier Jahre lang nicht (habe noch eine Festnetznummer bei O2). Bliebe eigentlich nur die Möglichkeit, dass KabelBW es kaum abwarten konnte, die Daten weiterzugeben. Ich warte mal eine Woche und schaue, ob ich nochmal angerufen werde, nehme den Anruf mit einem "Hallo?" entgegen und schaue, ob explizit nach mir gefragt wird. Anschließend werde ich KabelBW kontaktieren und schauen, was sie zu der Sache zu sagen haben. Montag, 21. September 2009Die erste TrainingseinheitDer Plan sah für heute folgendes vor: Jeweils 4 Sätze mit 6 Wiederholungen mit 60 Sekunden Pause zwischen den einzelnen Übungen. Frontsquats abgewechselt mit Reverse Crunches Soweit, so gut. Es gibt nur ein kleines Problem: Ich war am Ende, bevor es der Plan war. Ich weiß nicht, ob ich hätte weniger Gewicht nehmen sollen oder ob es daran lag, dass ich vorher nur etwa 15g Kohlenhydrate zu mir genommen hatte oder ob ich einfach nur völlig außer Form bin. Vermutlich eine Mischung aus allen dreien. Naja, morgen geht es weiter (sofern der Muskelkater nicht dafür sorgt, dass ich nicht laufen kann). Zeit Verantwortung zu ÜbernehmenDerzeit befindet sich ja Deutschland mal wieder im Lotto-Fieber und so dachte ich mir, dass es auch für mich wieder Zeit wird, aus dem Ruhestand zurück zu kehren und so gab ich letzten Donnerstag einen Schein mit meinem Lieblings-System (VEW 22) für die Ziehung am Samstag ab, bei der der Jackpot bei etwa 27 Millionen Euro lag. Den Jackpot habe ich leider nicht geknackt, aber Dank dem VEW-System sind es 1x 4-richtige und 4x 3-richtige geworden, was dann 71,50 an Gewinn waren (bei einem Einsatz von 17 Euro). Erst hatte ich mit dem Gedanken gespielt, mir irgendeinen Quatsch für den Gewinn zu kaufen, aber dann entschied ich mich dafür, verantwortlich zu handeln und in die Zukunft zu investieren. Und so hab ich 2 neue Lotto-Scheine abgegeben und hoffe auf den neuen Jackpot von ~30 Millionen am Mittwoch. Samstag, 19. September 2009Es geht los...Oft angekündigt werde ich es dieses mal tatsächlich umsetzen: Ich werde ein paar Kilo abnehmen. Startgewicht ist 95,1kg am 17.09. und das bedeutet laut Kalorienbedarfsrechner, dass ich pro Tag etwa 3000kcal verbrauche, wenn ich nichts anderes mache außer schlafen und sitzen. Also hab ich kurzerhand wieder KaLoMa rausgekramt und angefangen Kalorien zu zählen und bin dabei auf ein kleines Problem gestoßen... wenn ich mich nicht, wie sonst immer, mit allem Möglichen Zeug vollstopfe, esse ich zu wenig. Am 17. waren es etwa 1500kcal und am 18. gerade mal 1250kcal. Ich sollte also tatsächlich mal regelmäßig frühstücken, damit ich so an die 2000kcal pro Tag schaffe. Der ein oder andere wird sich nun vielleicht fragen, was an ~1200-1500kcal so schlimm ist. Das Problem dabei ist, der Körper ist ziemlich schlau und wenn er merkt, dass er keine Energie zugeführt bekommt, dann sorgt er dafür, dass er mit weniger Kalorien auskommt. Das führt zu langsameren Stoffwechsel und Muskelabbau, wärend die Fettpölsterchen genau da bleiben, wo sie sind, schließlich kann die Hungerphase ja noch ein ganzes Weilchen dauern. Was auch noch anzupassen gilt, ist der Kohlenhydratanteil. Ziel sind 100g an Trainingstagen und 70g an trainingsfreien Tagen, momentan liege ich bei 120-130g, dafür werde ich mehr Protein zu mir nehmen müssen. Apropos Training: in den letzten Tagen habe ich ein wenig rumgeplänkelt, damit ich dann, wenn der eigentliche Trainingsplan (Montag soll es losgehen) beginnt, nicht vor Muskelkater sterbe... Wie das mit der Ernährung hinhaut, wenn ich tagsüber auswärts esse muss ich mal schauen, aber irgendwie wird das schon klappen. Montag, 1. Juni 2009Server Fault
Montag, 25. Mai 2009Ze Ze Ze Ze ... Zewa?Heute musste ich eine schreckliche Entdeckung machen: Charmin ist tot. Zumindest die Marke. Das Toilettenpapier und der Bär leben jetzt weiter als "Premiummodel" Soft samtstark der Marke Zewa. Freitag, 17. April 2009Java Programme ohne installierte JRE ausführenDer ein oder andere mag das Problem kennen: Man möchte ein Java Programm ausführen, aber auf dem Rechner ist keine JRE installiert und man kann auch nichts daran ändern, sei es nun, weil man nichts installieren darf oder einem schlicht die Rechte dazu fehlen. Im Berufsleben kann es auch dazu kommen, dass die Richtlinien eines potentiellen Kunden keine JRE vorsehen oder nur eine veraltete Version vorhanden ist, zu der das Programm inkompatibel ist. start <Pfad zum JRE Verzeichnis>\bin\javaw.exe -jar DeinJar.jar Jetzt reicht das Aufrufen der BAT-Datei und schon wird das Programm ohne eine installierte JRE gestartet. Natürlich kann man das Ganze auch für andere Zwecke nutzen und für ein Programm eine andere JRE als die installierte verwenden. Samstag, 21. März 2009Wie mich Mathe um den Schlaf brachte
Dienstag, 17. März 2009Überraschungstest und Abendessen
Donnerstag, 12. März 2009Zweiter Tag beim Planspiel, Triumph und Weiteres zur Hochschule
(Seite 1 von 2, insgesamt 20 Einträge)
» nächste Seite
|
KategorienBlog abonnierenExternes
EssentiellesVerwaltung des Blogs |
|||||||||||||||||||||||||||||||||||||||||||||||||
Kommentare