Übersicht: Java Collections mit Big-O


Inspiriert durch den Blogeintrag von Misto (http://blog.misto.ch/archives/1162) habe ich mir vor langem das Buch Pragmatic Thinking and Learning – Refactor Your Wetware erworben und mir zu Gemüte geführt. Der Autor hat ein hervorragendes Werk, gespickt mit humorvollen englischen Floskeln, geschrieben. Die Seitenzahlen der spannenden Ansätze habe ich notiert und mir überlegt, ob ich wirklich über alles Schreiben oder einfach eine kleine Zusammenfassung liefern soll. Da auf dem Blog von Misto bereits ein Resümee existiert, entschied ich mich für die längere Fassung. Einfachheitshalber sind spannende Textpassagen direkt raus kopiert und auf die entsprechende Seite verwiesen.
Im ersten Teil wird eine kurze Einführung ins Thema gemacht, verschiedene Aspekte der Informatik erwähnt und das MindMap des Buches erläutert.

Anschliessend folgen Erläuterungen zu dem Dreyfus-Modell, welches den Erwerb- und die Entwicklung von Fähigkeiten beschreibt. Dabei wird der Wandel vom Anfänger zum Experten aufgezeigt und was dies für eine grosse Bedeutung mit sich bringt. Wie jeder weiss benötigt beispielsweise ein Spitzenkoch für die Zubereitung eines Gerichtes keine genaue Anleitung, wo hingegen der Anfänger auf eine exakte Beschreibung (Requirements) angewiesen ist.
[17] The novice wants to know exactly how long to set the timer on the oven given the weight of the meat, and so on. It’s not that the novice is being pedantic or stupid: it’s just that novices need clear, context-free rules by which they can operate, just as the expert would be rendered ineffective if he were constrained to operate under those same rules. Novices and experts are fundamentally different.
Als nächstes wird das Gehirn des Menschen vorgestellt. Die beiden Teile des Hirns (L- und R- Mode) werden dabei untersucht und somit die Schwächen und Stärken jedes einzelnen aufgezeigt. Hier wird erstmals deutlich gemacht, was der synchrone (L) und asynchrone (R) Teil des Hirns für einen Einfluss auf die Agilität hat.
[63] As you may have felt from looking at the characteristics of L-mode and R-mode, we have a bit of cultural bias toward L-mode thinking and related activities, and we might tend to dismiss R-mode thinking as being the province of lesser mortals. R-mode seems like a quaint leftover, a vestigial appendage from some previous age when people believed the world was flat and thunder was the result of unseen gods at war. And indeed, it was the strength of L-mode that differentiated humankind from common beasts; it brought humanity out of the forests and jungles and into villages and towns, out of the fields and into the factories, finally to land behind a desk and a copy of Microsoft Word. But although the analytical and verbal capabilities of L-mode thinking have brought us this far, we’ve lost some key capabilities from an overreliance on L-mode at the expanse of R-mode. To progress, in order to move on to the next revolution in human development, we need to learn to reintegrate our largely neglected R-mode processing with L-mode.
In diesem Abschnitt werden auch verschiedenste Beispiele geschildert, wo durch die Aktivierung der asynchronen Hirnhälfte, enorme Erfolge erzielt wurden. So lassen sich die grossen Verkaufszahlen vom iPod nicht nur durch das einzigartige Design erklären, sondern auch wegen der Beschreibung der Speichergrösse. Bei iPod standen viel mehr die abzuspielenden Songs im Vordergrund, als die effektive Anzahl an Gigabytes. Weg vom synchronen Denken hin zum Asynchronen!
[65] The Microsoft-flavored parody says how many gigabytes it will hold. Consumers don’t care about gigabytes; only we geeks do.
Amüsant zum lesen war auch der Bericht über die absterbenden Hirnzellen, bei übermässigem Alkoholkonsums und ob jemals wieder neue entstehen.
[67] … in a discovery that turned the field on ist ear, she discovered neurogenesis – the continued birth of new brain cells throughout adulthood. But here’s the funny part. The reason researchers had never witnessed neurogenesis previously was because of the environment of their test subjects. If you’re a lab animal stuck in a cage, you will never grow new neurons. If you’re a programmer stuck in a drab cubicle, you will never grow new neurons. On the other hand, in a rich environment with things to learn, observe, and interact with, you will grow plenty of new neurons and new connections between them. For decades, scientists were misled because an artificial environment created artificial data. Once again, context is key. Your working environment needs to be rich in sensory opportunities, or else it will literally case brain damage.
In einem weiteren Teil geht es darum die physische Rechenleistung zu steigern. Es werden verschiedene Ansätze zur Aktivierung der Hirnleistung aufgezeigt wie beispielsweise:
Der Autor schneidet wirklich sehr viele Themengebiete an, wie im Kapitel 5 mit den verschiedenen Altersgenerationen. Auf anschauliche Art und Weise zeigt er was Leute, geboren in verschiedenen Zeitepochen, voneinander unterscheiden oder wo sie Gemeinsamkeiten haben. Dabei resultieren 4 verschiedene Typen oder Rollen.
Die einzelnen Merkmale, Gemeinsamkeiten und Erkenntnisse werden auf einer Achse dargestellt, wobei der eigentliche Wert (z.B. Millenial) der Beschreibung der Zeitepoche entspricht.. (im Buch nachlesen *g*)

Ein ähnlicher Ansatz zur Persönlichkeitsanalyse ist der Myers-Briggs-Typindikator. Basierend auf den psychologischen Typen entwickelten Myers und Briggs einen Fragebogen, der bestimmte Muster und Züge menschlichen Grundverhaltens verständlich und transparent macht. Wer Unterschiede im Verhalten zwischen verschiedenen Personen bewusst wahrnimmt, über seine eigenen Neigungen bzw. Präferenzen Bescheid weiss und die der anderen erkennt, respektiert und in seinem persönlichen Verhalten berücksichtigt, wird in seiner Umgebung besser zurechtkommen und erfolgreicher sein – sei es im Beruf oder im Privatleben.
Im sechsten Kapitel geht es um das ganz bewusste Lernen und somit um die Erreichung von Zielen. Um einen gewünschten Punkt erreichen zu können, müssen im privaten wie auch im Geschäftsalltag Ziele definiert werden, doch diese sind noch lange keine Garantie für den Erfolg. Typische Aussagen für schlecht definierte Ziele sind z.B. „Ich will sportlicher und schlanker werden.“ oder „Ich will möglichst viele neuen Programmiersprachen lernen“. Bei diesen Aussagen handelt es sich um grosse Wünsche oder einen gewünschten Zustand, doch sicherlich nicht um Ziele. Wie viel Kilo möchte ich verlieren? Bis wann? Wie gut möchte ich diese Programmiersprachen beherrschen? Und so weiter und so fort…
Zur Lösung dieser Problematik wird das SMART Modell vorgestellt. SMART ist ein Akronym für “Specific Measurable Achievable Relevant Timely” und dient im Projektmanagement als Kriterium zur eindeutigen Definition von Zielen im Rahmen einer Zielvereinbarung.
Ein Ziel ist nur dann SMART, wenn es diese fünf Bedingungen erfüllt.
Im selben Kapitel wie dem von SMART wird noch die Lesemethode SQ3R gezeigt, die besonders effektiv in Bezug auf den Lerneffekt ist. Das mit dieser Methode erfasste Wissen, ist offenbar wesentlich besser im Gedächtnis gespeichert, da viel Eigeninitiative in den Schritten verankert ist. SQ3R steht für die Worte „Survey, Questions, Read, Recite, und Review.“
Interessant fand ich auch die Erläuterungen zu dem Problemlösungsansatz von dem ungarischen Mathematiker George Pólya, welcher unter anderem diesen Ansatz im Buch „Vom Lösen mathematischer Aufgaben“ beschreibt.

Abschliessend noch einige interessante Aussagen, die ich euch nicht vorenthalten möchte…
[2] The number of bugs programmers introduce into programs has remained constant for the past forty years.
[3] It’s not that the teacher teaches; it’s that the student learns. The learning is always up to you.
[211] You might hear yourself often saying, „I’d love to, but I don’t have the time. “ Or some new task comes up at work, and you think you just don’t have time to attend to it. It’s not really time that’s the issue. Time is just something you allocate. It’s not that we’re out of time; we’re out of attention. So instead of saying you don’t have time, it’s probably more accurate to say you don’t have the bandwidth. When you overload your bandwidth, you’ll miss things. You won’t learn, you won’t perform your work well, and your family will begin think maybe you have a brain tumor or something. If you’re paying attention – really paying attention – you can accomplish marvelous things.
[227] It takes twenty minutes to reload context.
[234] Establish rules of engagement to manage interruptions.
[236] Send less email, and you’ll receive less email and choose your own tempo for an email conversation.
[247] Want to do tomorrow morning
Ich habe mich für eine zusätzliche Art von Bloggen entschieden, da ich den Techtalk nicht mit Links zu Fachthemen überfluten will. Wie angedeutet, im Techalk werde ich weiterhin über die gelesenen Bücher oder Fachartikel berichten.
Kurze Artikel oder eben Links werde ich neu auf soup.fabio.li publizieren. Mich hat Soup weitaus mehr überzeugt als twitter. So lassen sich bei diesem “tumblelog” auch Videos, Audio oder sonstige Sachen posten, ohne einer Beschränkung von 140 Zeichen. In Zusammenarbeit mit Delicious eine wirklich tolle Sache.
Ich schaue mir regelmässig die Serie NUMB3RS an. Es handelt sich um einen FBI-Mitarbeiter Don Eppes und seinem Bruder Charlie, der ein Mathematik Genie ist und dieses Wissen an einer Uni weitergibt. Die beiden Brüder versuchen zusammen Krimalfälle mit Hilfe angewandter Mathematik wie z.B. der Numerik, Kombinatorik aufzuklären. An der HSR werden/wurden in regelmässigen Abständen Serien gezeigt und von einem Mathematik Dozenten fachlich ergänzt, was stets sehr spannend ist/war (http://www.hsr.ch/Numb3rs-HSR.3211.0.html).
In der Serie 4 Trust Metric (2007) versuchte so Charlie Eppes mittels der Gröbnerbasis eine Freundschaft zu beschreiben. Wikipedia beschreibt die Gröbnerbasis wie folgt:
[WIKIPEDIA]
Eine Gröbnerbasis ist eine endliche Idealbasis zu einem Ideal I im Polynomring
über dem Körper K, die besonders gut dafür geeignet ist, zu entscheiden, ob ein gegebenes Polynom zum Ideal gehört oder nicht.
Die Gröbnerbasis wird nicht nur zur Beschreibung von Freundschaften verwendet, sondern auch in der Astrofotografie über grosse Entfernungen benutzt. So entstehen z.B. die Bilder vom Hubble, da man auf fehlende Informationen schliessen kann ohne dabei die Daten zu haben. Dabei kommt der Algorithmus von Buchberger zum Zuge, welcher eben eine Idealbasis in eine endliche Gröbnerbasis transformiert. Implementierungen dieses Algorithmus sind in vielen Computer-Algebra-Systemen vorhanden (z.B. in Mathematica, Maple und REDUCE). Kanonische Simplifikation mit Gröbnerbasen wird in der Praxis benutzt, um idealtheoretische Probleme in Polynomringen zu lösen. Die Anwendungen werden für das Lösen von Polynomgleichungen, für geometrische Beweise oder auch in der Codierungstheorie verwendet. Bei der Codierungstheorie vor allem für die Dekodierung zyklischer Codes. Dort besteht ja die Idee eine Generatormatrix durch Generatorpolynome zu beschreiben (Informationscodierung Modul an der HSR). siehe auch Gröbner Dekodieren
Mittlerweile gibt es für alles einen Tag und gestern war für mich jener von ASCII. Zu diesem Zweck schaute ich mir unter anderem den Java Ascii Versatile Editor etwas genauer an. Mit diesem Editor kann in ASCII gezeichnet werden und so resultierten drei unterschiedliche Bilder.

Selbstverständlich habe ich diese drei Bilder nicht selber gezeichnet, sondern die Funktion IMAGE2ASCII dazu benutzt. Ein Blick in diese Anwendung lohnt sich!
Dabei möchte ich auch noch auf die ASCII Darstellungsart im VLC-Player verweisen, mit welcher Filme in ASCII betrachtet werden können oder auch http://oreilly.com/pub/h/4441
Die Meisten Anwendungen zur Visualisierung von ASCII verwenden oftmals eine der folgenden Libs.
http://aa-project.sourceforge.net/aalib/
und wer nur kurz ein Bild in ASCII umwandeln möchte, der soll die Seite http://www.text-image.com/convert/ verwenden
In dieser Woche absolvierte ich einen Weiterbildungskurs in der Armee. Das Ziel dieses Kurses bestand in der Schulung des neuen Telematik Einsatz und Planungssystems (kurz TEPLAS) der Armee. Mit diesem System werden alle zukünftigen Einsätze geplant und somit auch jenen des WEFs 2010, welcher in “unserer” Verantwortung steht. Wie jeder AdA weiss werden sämtliche Informationen mind. “vertraulich” klassifiziert, weshalb ich nicht viel darüber verlieren darf. *lach* Die Anwendung ist jedenfalls sehr umfangreich und beinhaltet unzählige Möglichkeiten für die Planung. So lässt sich z.B. bei der Positionierung von Richtfunk-Antennen exakt bestimmen, ob zwischen diesen irgendwelche Bäume, Häuser oder Sonstiges im Wege steht. Die Informationen sind sehr detailliert und wirklich interessant zu sehen, was für Daten über die Schweiz digital erfasst sind. Unter der folgenden Seite http://www.swisstopo.admin.ch/internet/swisstopo/de/home/products/services/web_services/webGIS/webGIStab.html stehen verschiedene GIS Anwendung gratis zur Verfügung, welche einen Einblick in die digital erfasste Welt der Schweiz geben. Wer also die Bauzonen, die Orte der Steinbock Kolonien oder doch lieber die Strassenbelastungen pro Tag ausfindig machen will, der soll diese Seite schnellstens besuchen.
Nebst den technischen Erkenntnissen lernte ich auch wieder einmal einen 6.5er zu schreiben (für alle “nichtmilitärler” – dies ist quasi ein Entschuldigungsschreiben). Ich bin mit 3 Minuten zu spät in den WK eingerückt. Von anderen AdA’s habe ich im nachhinein erfahren, dass auch fünf Minuten zu früh nichts genützt hätten, denn dieser höhere Militarist ist der Meinung: “Fünf Minuten zu früh, sind wie fünf Minuten zu spät”…
Abschliessend bin ich froh, dass ich um einige Diensttage reicher/ärmer geworden bin, etwas über geographische Informationssysteme gelernt habe und unzählige Abkürzungen der Armee anhören durfte.
Eine berühmte Persönlichkeit hat dieses Buch einer anderen berühmten Persönlichkeit weitergegeben und diese wiederum machte mich auf dieses Buch aufmerksam. Besten Dank an dieser Stelle
LOL²A ist die Abkürzung für
Es geht immer wieder darum zu zeigen, wie der Leser möglichst schnell und mit einem Minimum an Aufwand von einem IST- zu einem SOLL-Zustand gelangen kann. Dafür werden vor allem vier grundsätzliche Weisungen aufgestellt:
Die Regeln sind sehr einfach und ich habe rasch bemerkt, dass sie mir zum Teil wirklich helfen, effizienter zu werden. Nebst dem hilfreichen Lerneffekt waren auch die Beispiele äusserst angenehm zu lesen, da sie sowohl aus dem privaten wie auch geschäftlichen Alltag stammen.
Einige von euch Fragen sich wohl, warum ich ein solches Buch lese? Nun gut, ich bin ein Freund von Optimierungen und diese so kostengünstig zu erhalten, erachte ich als höchst spannend. Zudem beinhalten solche Bücher wertvolle Informationen zum Thema Sozialkompetenz, welche in der Welt der Informatik leider zu oft vergessen gehen. Mein Vater ist Leiter vom Personal der Helvetia Gruppe und so höre ich immer wieder von Fällen (selbstverständlich anonymisiert), wo halt eben diese Sozialkompetenz fehlt und somit deren berufliche Karriere unnötigerweise eingeschränkt wird. Ein Versuch dieser Problematik entgegen zu wirken lohnt sich also alleweil.
Sicherlich ist es mit dem Lesen dieser oder anderer Bücher noch nicht getan, denn wer kann schon ein Buch direkt umsetzen. Dafür braucht es tägliches Training oder Lernhilfen, welche ich mir nebst diesem Blog parallel erarbeite. Ich bin persönlich noch nicht da, wo ich einmal sein möchte, doch ich weiss, dass sich die Arbeit und Mühe lohnt. Wer glaubt er sei perfekt, dem Rate ich dringend zur Selbstreflexion. Wo findest du dich in den Beispielen wieder?
An einem Seeufer sitzt ein Mann und versucht, mit seinen Händen Fische zu fangen. Ein Wanderer kommt vorbei, klopft dem Fischer auf den Rücken und sagt: „He, guter Mann, komm ich zeige dir, wie man ein Netz knüpft. Damit kannst du viel schneller und mehr Fische fangen, als von Hand.“ Der Fischer ist so auf den See konzentriert, dass er kaum richtig zugehört hat. Ohne aufzublicken antwortet er dem Wanderer: „Keine Zeit. Ich muss jetzt Fische fangen.“
Wie viele Menschen befinden sich in genau dieser Situation? Keine Zeit für das Wesentliche, aber was ist denn dieses Wesentliche? Der Autor gibt eine Antwort auf eine einzige zentrale Frage und diese Frage lautet:„Wie komme ich mit einem Minimum an Aufwand und so schnell wie möglich von einem IST-Zustand zu einem Soll-Zustand?“
Ein Verkaufsleiter arbeitet seit sieben Jahren in einem Unternehmen. Obwohl das wirtschaftliche Umfeld schwierig ist, hat er seine Stelle bisher nicht verloren, und er ist überzeugt, dass er weiterhin in diesem Unternehmen arbeiten wird. Die Tatsache, dass es so gut geht, schreibt er seinen Fähigkeiten zu. Das bedeutet er übernimmt Verantwortung für seine Situation. So weit so gut. Plötzlich wird er entlassen. Und jetzt beginnt es: er sucht Schuldige. Der Chef ist schuld, oder die Rezession, oder jener Kunde, der ihm den grossen Auftrag versprochen, aber dann doch nicht gegeben hat.
Das ist doch unser „normaler“ Denkmechanismus: solange es für uns gut läuft, fühlen wir uns verantwortlich, sobald etwas geschieht, das uns nicht passt, suchen wir die Verantwortlichen anderswo.
Der Mitarbeiter erwartet, dass der Chef sich ändert. Der erwartet, dass die Mitarbeiter sich ändern. Der Bürger erwartet, dass die Regierung sich ändert. Die Regierung erwartet, dass die Bürger sich ändern. Usw. und so fort.
Bei mir selbst will ich lernen, will ich Schüler sein, will ich mich kennenlernen.
Der Physiker Paul Davies macht in seinem Buch „Prinzip Chaos“ eine hochinteressante Aussage: „Woher kann man wissen, ob das Werfen einer Münze oder das Würfeln wirklich zufällig ist? Darüber besteht keine Einigkeit.“ Mit dem Begriff Zufall sollte etwas vorsichtiger umgegangen werden.
Wir Mensch sind in unserem Denken dermassen begrenzt, dass wir schlicht und einfach nicht alle Ursachen kennen, und deshalb schieben wir dann zahlreiche Dinge dem Zufall in die Schuhe.
Mit Festhalten kann alles getötet werden, es ist nur eine Frage der Zeit. „Sie zielen mit einem Pfeilbogen auf eine Scheibe“. Was müssen Sie tun, damit der Pfeil die Scheibe trifft? Sie müssen den Bogen spannen: Sie müssen zielen (Intelligenz) und Sie müssen loslassen.
Loslassen ist der schnellste und kostengünstigste Weg zur Erreichung aller Ziele.
Ich habe asynchrone Programmteile zu testen. Eine kurze Lösung für das Problem ist unten dargestellt. Gelöst über die Lockingstrategie eines Latch (auch synchronized wäre denkbar gewesen). Ich frage mich, ob es noch eine bessere Lösung gibt, um asynchrone Programmteile zu testen?
public interface Feeder {
void feed(Object food, FeedListener listener);
}
public class CowFeeder implements Feeder {
public void feed(Object food, FeedListener listener) {
try {
Thread.sleep(1000);
listener.feedingFinished(new FeedEvent());
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public class FeedEvent {}
public interface FeedListener extends EventListener {
void feedingFinished(FeedEvent evt);
public FeedEvent getFeedModelEvent();
}
public class Test {
@org.junit.Test public void asyncFeeding() throws InterruptedException {
final CountDownLatch latch = new CountDownLatch(1);
final FeedListener mockListener = new FeedListener() {
private FeedEvent event;
public void feedingFinished(FeedEvent event) {
this.event = event;
latch.countDown();
}
public FeedEvent getFeedModelEvent() {
return this.event;
}
};
Thread t = new Thread(){
public void run(){
Feeder feeder = new CowFeeder( );
feeder.feed("gras", mockListener);
}
};
t.start();
latch.await(2, TimeUnit.SECONDS);
FeedEvent evt = mockListener.getFeedModelEvent();
assertNotNull("Feeding timed out", evt);
}
}
Ein Kollege (Maschinenbau-Ingenieur) von mir hatte mich heute bzgl. eines Problems in Java kontaktiert. Er muss im Geschäft eine Anwendung weiterentwickelen, welche ursprünglich von einem “Software Ingenieur” geschrieben wurde. Er hatte das Problem, dass er für das angeblich selbe Objekt, zwei unterschiedliche Werte hatte. Bei der Suche des Problems stiess ich sogleich auf die Singleton Klasse, welche in folgender Form vorlag und auch der Grund für das Problem darstellte:
public static JDBCHandler getInstance() {
return instance == null ? instance = new JDBCHandler () : instance;
}
Die Lösung des Problems liegt auf der Hand und zwar muss dieser Aufruf threadsafe gemacht werden. Die Problematik und Unschönheiten der Singletons werden im Internet zahlreich beschrieben (Singletons are evil) und nun durch meinen Beitrag um einen Eintrag erweitert.
Grundsätzlich stehen drei mögliche Varianten zur Lösung des Problems zur Verfügung.
Ein Beitrag dazu von Frank Kleine.
public static synchronized MySingleton getInstance() {
if(instance == null) ? istance = new MySingleton(): instance;
}
private static volatile MySingleton instance;
public static MySingleton getInstance(){
if(instance == null) {
synchronized (MySingleton .class) {
if(instance == null){
instance = new MySingleton ();
}
}
}
return instance;
}
Auch diese Variante ist threadsafe und löst das Problem. Würde die Variable instance nicht als volatile definiert werden, so könnte ein JIT Compiler den Assemblercode so umstrukturieren, dass vor dem Durchlaufen des Konstruktors ein Verweis auf das Instance Objekt gesetzt wird. Volatile Variablen werden in der jetzigen Java Version erst nach der vollständigen Abarbeitung des Konstruktors sichtbar (out-of-order-writes). Der Effizienzunterschied zwischen volatile und synchronized sieht wie folgt aus [in ms]:
| Anzahl Threads | synchronized | volatile | on demand |
| 10 | 2 | 3 | 1 |
| 100 | 13 | 11 | 12 |
| 1000 | 149 | 123 | 115 |
| 10000 | 1371 | 1178 | 950 |
| 100000 | 13059 | 11903 | 9209 |
Gemessen wurden die Daten auf einem Intel® Core 2 Duo Processor P9500 mit 2.53 GHz. Es zeigt sich, dass die volatile Variante bei einer grösseren Anzahl an Threads leicht besser ist.
Weitere Links:
http://www.softwarereality.com/design/singleton.jsp
http://aabs.wordpress.com/2007/03/08/singleton-–-the-most-overused-pattern
http://stackoverflow.com/questions/1392315/problems-with-singleton-pattern
Einigen von euch ist sicherlich schon die Robot-Klasse in die Finger gekommen. Sie hilft einem bei der Oberflächensteuerung mittels der Maus oder Tastatur. Die einzelnen Ereignisse werden sequentiell abgearbeitet. Viele GUI-Testing Software nutzen teilweise die Klasse. Für was könnte diese Klasse sonst noch verwendet werden?
Ein Anwendungsbeispiel wäre hier das automatische spielen von Wettbewerben. So gibt es z.B. in der Schweiz eine Internetseite mit einem einarmigen Bandit, welcher in unregelmässigen Abständen Preise ausspuckt. Nach der Betätigung des Knopfes wird die Maschine in Gang gesetzt und nach ca. 4 Sekunden erscheinen die Symbole. Dieser Vorgang liesse sich hervorragend mit dieser Robot Klasse automatisieren.
Die Mausposition oder anders gesagt, die Position vom Button liesse sich über folgende Funktion abrufen.
Rectangle screenSize = new Rectangle( Toolkit.getDefaultToolkit().getScreenSize() ); BufferedImage image = new Robot().createScreenCapture( screenSize ); Point location = MouseInfo.getPointerInfo().getLocation();
Aus rechtlicher Sicht würde man sich nicht strafbar machen, weshalb dieses Unternehmen die zwingende manuelle Bedingung in ihre AGBs aufgenommen hat. Falls ein automatisiertes Spielen durch Skripte aller Art festgestellt wird, dann würde der Teilnehmer für dieses Gewinnspiel gesperrt oder der Account vollständig gelöscht.
Eine weitere spannende Funktion der Robot-Klasse ist die BIldschirmabzugs-Möglichkeit mittels createScreenCapture(). Als Argument wird ein Rectangle Objekt erwartet.
BufferedImage bufImg = new Robot().createScreenCapture(new Rectangle(Toolkit.getDefaultToolkit().getScreenSize()) );
Es lässt sich so überwachen, ob sich Bildschirminhalte geändert haben. Mit einer Analyse des Bildes lässt sich herausfinden, was der Anwender gerade angeschaut hat oder der Benutzer aktiv vor dem Bildschirm ist oder nicht. Das untenstehende Programm erstellt jede Sekunde ein Screenshot und überprüft, um wie viel Prozent sich die Pixel gegenüber dem vorherigen Bild verändert haben.
Rectangle screenSize = new Rectangle( Toolkit.getDefaultToolkit().getScreenSize() );
BufferedImage beforeImg = new Robot().createScreenCapture( screenSize );
while ( true ) {
Thread.sleep( 1000 );
BufferedImage afterImg = new Robot().createScreenCapture( screenSize );
DataBuffer beforeBuffer = beforeImg.getData().getDataBuffer();
DataBuffer afterBuffer = afterImg.getData().getDataBuffer();
int total = beforeBuffer.getSize();
int diff = 0;
for ( int i = 0; i < beforeBuffer.getSize(); i++ ){
if ( beforeBuffer.getElem( i ) != afterBuffer.getElem( i ) ){}
diff++;
}
}
System.out.printf( "Pixel total=%d, unterschiedliche Pixel=%d, Unterschied=%.2f%%%n", total, diff, (double) 100 * diff / total );
firstImg = afterImg;
}