<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-5195037349762984827</id><updated>2012-02-09T10:53:43.794+01:00</updated><category term='JTable'/><category term='Visual Swing for Eclipse'/><category term='RowSorter'/><category term='Sortieren'/><category term='Nagios'/><category term='Java'/><category term='bash'/><category term='Open Source'/><category term='Swing'/><category term='Generieren Sudoku'/><category term='visualswing4eclipse'/><category term='GUI-Designer'/><category term='Bugs'/><category term='Ruby'/><category term='TableModel'/><category term='Linux'/><category term='Eclipse'/><category term='Mac'/><category term='bacula'/><category term='Windows Live Messenger deinstallieren'/><category term='Sudoku'/><category term='MySql'/><category term='ubuntu'/><category term='Windows Live Essential'/><category term='couchDB'/><category term='Windows 7'/><title type='text'>Tipps und Tools</title><subtitle type='html'>Tipps und Tools - Rund um IT und anderen Nebensächlichkeiten</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://tippsundtools.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5195037349762984827/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://tippsundtools.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>stefan</name><uri>http://www.blogger.com/profile/11778575587066022922</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>7</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-5195037349762984827.post-5587697094044921089</id><published>2009-12-14T15:54:00.001+01:00</published><updated>2009-12-14T16:07:39.606+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JTable'/><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='RowSorter'/><category scheme='http://www.blogger.com/atom/ns#' term='TableModel'/><category scheme='http://www.blogger.com/atom/ns#' term='Swing'/><category scheme='http://www.blogger.com/atom/ns#' term='Sortieren'/><title type='text'>Tabellen in Java-Swing per Klick sortieren lassen</title><content type='html'>Es gibt in Swing eine nette Möglichkeit Tabellen per Klick auf die Kopfleiste sortieren lassen. Man muss nur einen Schalter setzen und schon kann die Tabelle das.&lt;br /&gt;&lt;br /&gt;Wie folgt:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;table.setAutoCreateRowSorter(true);&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;Das ist alles. Schon klappt das Sortieren. Siehe auch: &lt;a href="http://java.sun.com/docs/books/tutorial/uiswing/examples/components/index.html#TableSortDemo"&gt;Link&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Sortieren nach "Sport":&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_XsL4J8_n4Dk/SyZUbKXMmcI/AAAAAAAAAEI/YZw4UPpDV-U/s1600-h/Bildschirmfoto1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_XsL4J8_n4Dk/SyZUbKXMmcI/AAAAAAAAAEI/YZw4UPpDV-U/s400/Bildschirmfoto1.png" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Sortieren nach "# of Years":&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_XsL4J8_n4Dk/SyZUmpwwiVI/AAAAAAAAAEQ/TInbUNjauZk/s1600-h/Bildschirmfoto2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_XsL4J8_n4Dk/SyZUmpwwiVI/AAAAAAAAAEQ/TInbUNjauZk/s400/Bildschirmfoto2.png" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Nur hat die Sache einen Nachteil. Beim Ändern des Tabelleninhaltes bekommt der RowSorter das nicht immer mit (gerade wenn man eigene TableModels hat) und wirft mit lauter Exceptions um sich. Diese Exception haben manchmal auch zur Folge das die Tabelle nicht vollständig geladen wird ... was nicht toll ist.&lt;br /&gt;&lt;br /&gt;Lösung des Problems:&lt;br /&gt;Man entfernt vor dem Ändern des Tabelleninhaltes den RowSorter und setzt ihn danach wieder neu.&lt;br /&gt;&lt;br /&gt;Beispiel:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;table.setAutoCreateRowSorter(true);&lt;br /&gt;oder&lt;br /&gt;table.setRowSorter(null);&lt;br /&gt;  &lt;br /&gt;... dann Tabelle füllen&lt;br /&gt;&lt;br /&gt;table.setAutoCreateRowSorter(true);&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;Vorteil: Die Exceptions sind weg.&lt;br /&gt;Nachteil: Eventuelle Sortierauswahl ist auch weg.&lt;br /&gt;&lt;br /&gt;Lösung: Man merkt sich die Sortierauswahl, entfernt den RowSorter, ändert die Daten und setzt Sortierauswahl wieder.&lt;br /&gt;&lt;br /&gt;Ich habe das mal in zwei statische Funktionen gepackt:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;/**&lt;br /&gt;     * TableRow-Sorter ausschalten&lt;br /&gt;     */&lt;br /&gt;    public static List disableTableRowSorter(JTable jtTable)&lt;br /&gt;    {&lt;br /&gt;        RowSorter rowSorter = jtTable.getRowSorter();&lt;br /&gt;        List sortKeys = null;&lt;br /&gt;        if (rowSorter != null)&lt;br /&gt;        {&lt;br /&gt;          sortKeys = rowSorter.getSortKeys();&lt;br /&gt;          jtTable.setRowSorter(null);&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        return sortKeys;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    /**&lt;br /&gt;     * TableRow-Sorter einschalten&lt;br /&gt;     */&lt;br /&gt;    public static void enableTableRowSorter(JTable jtTable&lt;br /&gt;                                           ,List   sortKeys)&lt;br /&gt;    {&lt;br /&gt;        jtTable.setAutoCreateRowSorter(true);&lt;br /&gt;        if (sortKeys != null)&lt;br /&gt;        {&lt;br /&gt;          RowSorter rowSorter = jtTable.getRowSorter();&lt;br /&gt;          rowSorter.setSortKeys(sortKeys);&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;und dann sieht es bei mir so aus:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;List sortKeys = disableTableRowSorter(table);&lt;br /&gt;  &lt;br /&gt;... dann Tabelle füllen&lt;br /&gt;&lt;br /&gt;enableTableRowSorter(table, sortKeys);&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;und schon klappt es ohne meckern (Exceptions).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5195037349762984827-5587697094044921089?l=tippsundtools.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tippsundtools.blogspot.com/feeds/5587697094044921089/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://tippsundtools.blogspot.com/2009/12/tabellen-in-java-swing-per-klick.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5195037349762984827/posts/default/5587697094044921089'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5195037349762984827/posts/default/5587697094044921089'/><link rel='alternate' type='text/html' href='http://tippsundtools.blogspot.com/2009/12/tabellen-in-java-swing-per-klick.html' title='Tabellen in Java-Swing per Klick sortieren lassen'/><author><name>stefan</name><uri>http://www.blogger.com/profile/11778575587066022922</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_XsL4J8_n4Dk/SyZUbKXMmcI/AAAAAAAAAEI/YZw4UPpDV-U/s72-c/Bildschirmfoto1.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5195037349762984827.post-2815983714545445380</id><published>2009-12-02T18:11:00.000+01:00</published><updated>2009-12-02T18:11:08.773+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='bash'/><category scheme='http://www.blogger.com/atom/ns#' term='couchDB'/><category scheme='http://www.blogger.com/atom/ns#' term='Linux'/><category scheme='http://www.blogger.com/atom/ns#' term='Nagios'/><title type='text'>couchDB + Nagios</title><content type='html'>Da für die couchDB auch kein Nagios-Check vorhanden ist, habe ich einen erstellt der prüft ob die Datenbank zu ereichen ist.&lt;br /&gt;&lt;br /&gt;Der Script funktioniert auf jeden Unix mit einer Bash-Shell und dem Tool "curl". &lt;br /&gt;&lt;br /&gt;Nun der Script:&lt;br /&gt;#!/bin/bash&lt;br /&gt;# ------------------------------------------------------&lt;br /&gt;#&lt;br /&gt;# Pruefen einer couchDB mit NAGIOS&lt;br /&gt;#&lt;br /&gt;# ------------------------------------------------------&lt;br /&gt;&lt;br /&gt;usage()&lt;br /&gt;{&lt;br /&gt;echo "check_couchdb"&lt;br /&gt;echo "============="&lt;br /&gt;echo " "&lt;br /&gt;echo "Es wird gerprueft ob es eine lokale 'couchDB' gibt und die aktuell als Hintergrundprozess laueft"&lt;br /&gt;echo " "&lt;br /&gt;echo "Parameter:"&lt;br /&gt;echo "-h                  Diese Hilfe"&lt;br /&gt;echo "-H &lt;hostname/ip&gt;    Host bzw. IP-Adresse"&lt;br /&gt;echo "-p &lt;prot/ip&gt;        Port (DEfault: 5984)"&lt;br /&gt;echo " "&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;okay=true&lt;br /&gt;&lt;br /&gt;while [ $# -gt 0 ]&lt;br /&gt;do&lt;br /&gt;case "$1" in&lt;br /&gt;-h)&lt;br /&gt;help=true&lt;br /&gt;usage&lt;br /&gt;exit 0&lt;br /&gt;;;&lt;br /&gt;-H)&lt;br /&gt;shift&lt;br /&gt;if [ $# -eq 0 ]&lt;br /&gt;then&lt;br /&gt;echo "Hostname bzw. IP-adresse fehlt."&lt;br /&gt;okay=false&lt;br /&gt;else&lt;br /&gt;check_hostname="$1"&lt;br /&gt;shift&lt;br /&gt;fi;;&lt;br /&gt;-p)&lt;br /&gt;shift&lt;br /&gt;if [ $# -eq 0 ]&lt;br /&gt;then&lt;br /&gt;echo "Port fehlt."&lt;br /&gt;okay=false&lt;br /&gt;else&lt;br /&gt;check_port="$1"&lt;br /&gt;shift&lt;br /&gt;fi;;&lt;br /&gt;&lt;br /&gt;*)&lt;br /&gt;echo "Falscher Parameter $1"&lt;br /&gt;okay=false&lt;br /&gt;shift;;&lt;br /&gt;esac&lt;br /&gt;done&lt;br /&gt;&lt;br /&gt;# Parameter pruefen&lt;br /&gt;if [ "$okay" == false ]; then&lt;br /&gt;usage&lt;br /&gt;echo "Fehler:"&lt;br /&gt;echo "Falscher  doer fehlerhafter Parameter"&lt;br /&gt;exit 9&lt;br /&gt;fi&lt;br /&gt;if [ " $check_hostname" == " " ]; then&lt;br /&gt;usage&lt;br /&gt;echo "Fehler:"&lt;br /&gt;echo "Hostname/Ip-Adresse fehlt"&lt;br /&gt;exit 9&lt;br /&gt;fi&lt;br /&gt;if [ " $check_port" == " " ]; then&lt;br /&gt;check_port="5984"&lt;br /&gt;fi&lt;br /&gt;&lt;br /&gt;COUCHDB_CHECK1=`curl -s -X GET http://${check_hostname}:${check_port}`&lt;br /&gt;&lt;br /&gt;COUCHDB_CHECK2=${COUCHDB_CHECK1:0:20}&lt;br /&gt;export COUCHDB_CHECK2&lt;br /&gt;&lt;br /&gt;STATUS_NAGIOS="OK: $COUCHDB_CHECK1"&lt;br /&gt;EXIT_CODE=0&lt;br /&gt;&lt;br /&gt;if [ "$COUCHDB_CHECK2" != "{\"couchdb\":\"Welcome\"" ] ; then&lt;br /&gt;STATUS_NAGIOS="ERR(1): $COUCHDB_VALUE"&lt;br /&gt;export STATUS_NAGIOS&lt;br /&gt;EXIT_CODE=2&lt;br /&gt;fi&lt;br /&gt;&lt;br /&gt;echo $STATUS_NAGIOS&lt;br /&gt;exit $EXIT_CODE&lt;br /&gt;&lt;br /&gt;# --------- SCRIPT ENDE -------------------&lt;br /&gt;&lt;br /&gt;&lt;/prot/ip&gt;&lt;/hostname/ip&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5195037349762984827-2815983714545445380?l=tippsundtools.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tippsundtools.blogspot.com/feeds/2815983714545445380/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://tippsundtools.blogspot.com/2009/12/couchdb-nagios.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5195037349762984827/posts/default/2815983714545445380'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5195037349762984827/posts/default/2815983714545445380'/><link rel='alternate' type='text/html' href='http://tippsundtools.blogspot.com/2009/12/couchdb-nagios.html' title='couchDB + Nagios'/><author><name>stefan</name><uri>http://www.blogger.com/profile/11778575587066022922</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5195037349762984827.post-8935771117658025291</id><published>2009-11-24T10:23:00.000+01:00</published><updated>2009-11-24T10:23:04.107+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Windows Live Messenger deinstallieren'/><category scheme='http://www.blogger.com/atom/ns#' term='Mac'/><category scheme='http://www.blogger.com/atom/ns#' term='Linux'/><category scheme='http://www.blogger.com/atom/ns#' term='Windows 7'/><category scheme='http://www.blogger.com/atom/ns#' term='Windows Live Essential'/><title type='text'>Nerviges Windows 7 - oder wie bekomme ich den Messenger weg</title><content type='html'>Als Nutzer verschiedener Betriebssysteme ist man ja einiges gewohnt. Aber das wohl mit Abstand unübersichtlichste und von der Bedienung komplizierteste ist Windows 7. Mag sein das die vielen bunten Bildchen und effekte nett sind, aber die Bedienung ist Mist.&lt;br /&gt;&lt;br /&gt;Bewusst wurde es mir besondes als ich den nervenden Windows Live Messenger los werden wollte der bei jeden Systemstart ungefragt erschien. Ich habe das Zeug nicht installiert und noch weniger will ich diesen Dienst nutzen. Trotzdem muss ich es jedes mal beenden und im Wahn möglichst viele User zu sammeln hat Microsoft es unterlassen eine einfache Möglichkeit zu schaffen diesen Dreck zu entfernen.&lt;br /&gt;Es ist Dreck und noch mehr eine Unverschämtheit, denn ich habe für Windows bezahlt und muss nun trotzdem diese lästige Zwangs-Anmeldeaufforderung über mich ergehen lassen.&lt;br /&gt;&lt;br /&gt;Wenn man nun versucht diesen Unsinn zu entferne findet man natürlich auf anhieb keine Möglichkeit. Es gibt keinen Dialog der es deaktiviert und unter "&lt;b&gt;Programme deinstallieren oder ändern&lt;/b&gt;" findet sich das Programm nicht. Was nun?&lt;br /&gt;Das man unter "&lt;b&gt;Programme deinstallieren oder ändern&lt;/b&gt;" "&lt;b&gt;Windows Live Essential&lt;/b&gt;" aufrufen muss und es dort deinstallieren kann findet man erst nach längeren Suchen - Goggle hab Dank.&lt;br /&gt;&lt;br /&gt;Also unter Linux oder Mac bin ich besseres gewohnt. Dort wird man nicht so massiv dazu gedrängt sich bei einem Dienst anzumelden den man nicht nutzen möchte.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5195037349762984827-8935771117658025291?l=tippsundtools.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tippsundtools.blogspot.com/feeds/8935771117658025291/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://tippsundtools.blogspot.com/2009/11/nerviges-windows-7-oder-wie-bekomme-ich.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5195037349762984827/posts/default/8935771117658025291'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5195037349762984827/posts/default/8935771117658025291'/><link rel='alternate' type='text/html' href='http://tippsundtools.blogspot.com/2009/11/nerviges-windows-7-oder-wie-bekomme-ich.html' title='Nerviges Windows 7 - oder wie bekomme ich den Messenger weg'/><author><name>stefan</name><uri>http://www.blogger.com/profile/11778575587066022922</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5195037349762984827.post-7985940386008511915</id><published>2009-05-01T09:34:00.004+02:00</published><updated>2009-05-01T09:39:49.801+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='visualswing4eclipse'/><category scheme='http://www.blogger.com/atom/ns#' term='Open Source'/><category scheme='http://www.blogger.com/atom/ns#' term='Linux'/><category scheme='http://www.blogger.com/atom/ns#' term='Eclipse'/><category scheme='http://www.blogger.com/atom/ns#' term='Swing'/><category scheme='http://www.blogger.com/atom/ns#' term='GUI-Designer'/><category scheme='http://www.blogger.com/atom/ns#' term='Visual Swing for Eclipse'/><title type='text'>Probleme mit Eclipse und dem GUI-Designer Tool "Visual Swing for Eclipse"</title><content type='html'>Es gibt einen ausgezeichneten Open Source GUI-Designer für Eclipse, der alles kann was man braucht. Wenn man diesen unter Linux verwenden möchte bekommt man Fehlermeldungen wie:&lt;br /&gt;&lt;br /&gt;&lt;blockquote style="font-family: courier;"&gt;Caused by: java.lang.ClassCastException: sun.awt.motif.MToolkit cannot be cast to sun.awt.X11.XToolkit&lt;br /&gt; at sun.awt.X11.XEmbeddedFrame.addNotify(XEmbeddedFrame.java:50)&lt;br /&gt; at sun.awt.X11.XEmbeddedFrame.&lt;init&gt;(XEmbeddedFrame.java:40)&lt;br /&gt; at sun.awt.X11.XEmbeddedFrame.&lt;init&gt;(XEmbeddedFrame.java&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Das Problem läst sich sehr leicht umgehen. Es muss nur eine Umgebungsvariable vor dem Aufruf von Eclipse gesetzt werden.&lt;br /&gt;&lt;br /&gt;Beispiel:&lt;br /&gt;&lt;br /&gt;&lt;blockquote style="font-family: courier;"&gt; export AWT_TOOLKIT="XToolkit"&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Link zum GUI-Designer: &lt;a href="http://code.google.com/p/visualswing4eclipse/"&gt;http://code.google.com/p/visualswing4eclipse/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5195037349762984827-7985940386008511915?l=tippsundtools.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tippsundtools.blogspot.com/feeds/7985940386008511915/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://tippsundtools.blogspot.com/2009/05/probleme-mit-eclipse-und-dem-gui.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5195037349762984827/posts/default/7985940386008511915'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5195037349762984827/posts/default/7985940386008511915'/><link rel='alternate' type='text/html' href='http://tippsundtools.blogspot.com/2009/05/probleme-mit-eclipse-und-dem-gui.html' title='Probleme mit Eclipse und dem GUI-Designer Tool &quot;Visual Swing for Eclipse&quot;'/><author><name>stefan</name><uri>http://www.blogger.com/profile/11778575587066022922</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5195037349762984827.post-4487255312310311848</id><published>2009-04-26T19:30:00.013+02:00</published><updated>2009-04-26T21:08:18.460+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='Sudoku'/><category scheme='http://www.blogger.com/atom/ns#' term='Generieren Sudoku'/><title type='text'>Berechnen Sudoku</title><content type='html'>Es gibt für Entwickler immer wieder Herausforderungen die man gerne annimmt - einfach weil es Spaß macht. So auch dieses mal - ein Sudoku zu berechnen.&lt;br /&gt;Aber es soll nicht nur ein Sudoku berechnet werden - es soll auch schnell geschehen und nach Möglichkeit sollen mehrere Sodukus auf einmal generiert werden. So habe ich mich für eine Variante entschieden die aus zwei Teilen besteht.&lt;br /&gt;1. Alle möglichen Zeilen-Varianten erzeugen&lt;br /&gt;2. Eigentliche Sudokus generieren.&lt;br /&gt;&lt;br /&gt;Bei meinen Tests komme ich auf ca. 0,6 Sekunden für ein Sudoku, 100 Sudokus in 3 Sekunden, 1000 Sudokus in 28 Sekunden. &lt;br /&gt;&lt;br /&gt;Files zum Download:&lt;br /&gt;&lt;a href="http://sites.google.com/site/tippsundtools/files/Sudoku.java?attredirects=0"&gt;Sudoku.java: Klasse zum Generieren der Sudokus&lt;/a&gt;&lt;br /&gt;&lt;a href="http://sites.google.com/site/tippsundtools/files/SudokuStart.java?attredirects=0"&gt;SudokuStart.java: Startklasse zum Testen&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Startklasse zum Testen:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;package sudoku;&lt;br /&gt;&lt;br /&gt;import java.util.ArrayList;&lt;br /&gt;&lt;br /&gt;public class SudokuStart {&lt;br /&gt;&lt;br /&gt; /**&lt;br /&gt;  * @param args&lt;br /&gt;  */&lt;br /&gt; public static void main(String[] args) {&lt;br /&gt;  try {&lt;br /&gt;   Sudoku sd = new Sudoku();&lt;br /&gt;   ArrayList&amp;lt;string&amp;gt; sudokus = sd.generate();&lt;br /&gt;   int count = 0;&lt;br /&gt;   for (String sudoku : sudokus)&lt;br /&gt;   {&lt;br /&gt;    System.out.println(sudoku);&lt;br /&gt;    System.out.println("=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-");&lt;br /&gt;    count++;&lt;br /&gt;    if (count &amp;gt; 50)&lt;br /&gt;     break;&lt;br /&gt;   }&lt;br /&gt;  }&lt;br /&gt;  catch (Exception ex)&lt;br /&gt;  {&lt;br /&gt;   ex.printStackTrace();&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Eigentliche Generierungsklasse:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;package sudoku;&lt;br /&gt;&lt;br /&gt;import java.util.ArrayList;&lt;br /&gt;import java.util.Date;&lt;br /&gt;&lt;br /&gt;public class Sudoku {&lt;br /&gt;&lt;br /&gt; ArrayList&amp;lt;String&amp;gt; listOneLine = new ArrayList&amp;lt;String&amp;gt;();&lt;br /&gt; &lt;br /&gt; ArrayList&amp;lt;ArrayList&amp;lt;String&amp;gt;&amp;gt; listLevelOneLine = new ArrayList&amp;lt;ArrayList&amp;lt;String&amp;gt;&amp;gt;();&lt;br /&gt; &lt;br /&gt; ArrayList&amp;lt;sudokuObject&amp;gt; listSudokus = new ArrayList&amp;lt;sudokuObject&amp;gt;();&lt;br /&gt; &lt;br /&gt; public static char[] used = {'1','2','3','4','5','6','7','8','9'};&lt;br /&gt;&lt;br /&gt; /** Maximale Anzahl Sudokus */ &lt;br /&gt; int maxCountSudokus = 100;&lt;br /&gt; &lt;br /&gt; int countCheck = 0;&lt;br /&gt; &lt;br /&gt; public Sudoku()&lt;br /&gt; {&lt;br /&gt;  &lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; /**&lt;br /&gt;  * Generieren Sukdoku&lt;br /&gt;  * @throws Exception&lt;br /&gt;  */&lt;br /&gt; public ArrayList&amp;lt;String&amp;gt; generate()&lt;br /&gt;        throws Exception&lt;br /&gt; {&lt;br /&gt;  &lt;br /&gt;  // Laden eindeutige Lines&lt;br /&gt;  Date dstart = new Date();&lt;br /&gt;&lt;br /&gt;  char[] checkArray = {' ',' ',' ',' ',' ',' ',' ',' ',' '};&lt;br /&gt;  checkChar(0, checkArray);&lt;br /&gt;  &lt;br /&gt;  System.out.println("time: " + ((new Date()).getTime() - dstart.getTime()));&lt;br /&gt;  System.out.println("count: " + listOneLine.size());&lt;br /&gt;  &lt;br /&gt;  // Fuer jeden Level eine eigene Liste&lt;br /&gt;  for (int i = 0; i &amp;lt; 9; i++)&lt;br /&gt;  {&lt;br /&gt;   ArrayList&amp;lt;String&amp;gt; newList = new ArrayList&amp;lt;String&amp;gt;();&lt;br /&gt;   int aktPos = (int) (Math.round((Math.random() * ((double)listOneLine.size()))));&lt;br /&gt;   for (int j = 0; j &amp;lt; listOneLine.size(); j++)&lt;br /&gt;   {&lt;br /&gt;    newList.add(listOneLine.get(aktPos));&lt;br /&gt;    aktPos++;&lt;br /&gt;    if (aktPos &amp;gt;= listOneLine.size())&lt;br /&gt;     aktPos = 0;&lt;br /&gt;   }&lt;br /&gt;   listLevelOneLine.add(newList);&lt;br /&gt;  }&lt;br /&gt;  System.out.println("Calc Sudokus");&lt;br /&gt;  &lt;br /&gt;  // Arrangieren eindeutige Lines&lt;br /&gt;  for (String firstLine : listLevelOneLine.get(0))&lt;br /&gt;  {&lt;br /&gt;   sudokuObject so = new sudokuObject();&lt;br /&gt;   so.add(firstLine);&lt;br /&gt;   checkSudoku(1, so);&lt;br /&gt;   &lt;br /&gt;   if (listSudokus.size() &amp;gt;= maxCountSudokus)&lt;br /&gt;    break;&lt;br /&gt;  }&lt;br /&gt;  &lt;br /&gt;  System.out.println("time: " + ((new Date()).getTime() - dstart.getTime()));&lt;br /&gt;  System.out.println("count Sudoku: " + listSudokus.size());&lt;br /&gt;  System.out.println("count Pruefung: " + countCheck);&lt;br /&gt;  &lt;br /&gt;  ArrayList&amp;lt;String&amp;gt; result = new ArrayList&amp;lt;String&amp;gt;();&lt;br /&gt;  for (sudokuObject so : listSudokus)&lt;br /&gt;  {&lt;br /&gt;   result.add(so.toString());&lt;br /&gt;  }&lt;br /&gt;  return result;&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; private void checkChar(int level&lt;br /&gt;                 ,char[] checkArray)&lt;br /&gt; {&lt;br /&gt;  int nextLevel = level + 1;&lt;br /&gt;  for (char pos : used)&lt;br /&gt;  {&lt;br /&gt;   if (in(pos, checkArray) == false)&lt;br /&gt;   {&lt;br /&gt;    checkArray[level] = pos;&lt;br /&gt;    &lt;br /&gt;    // Naechste Stufe&lt;br /&gt;    if (nextLevel &amp;lt; checkArray.length) &lt;br /&gt;    {&lt;br /&gt;     checkChar(nextLevel, checkArray);&lt;br /&gt;     for (int i = nextLevel; i &amp;lt; checkArray.length; i++)&lt;br /&gt;     {&lt;br /&gt;      checkArray[i] = ' ';&lt;br /&gt;     }&lt;br /&gt;    }&lt;br /&gt;    else // Ende&lt;br /&gt;    {&lt;br /&gt;     listOneLine.add(new String(checkArray));&lt;br /&gt;     return;&lt;br /&gt;    }&lt;br /&gt;   }&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; private void checkSudoku(int level&lt;br /&gt;                   ,sudokuObject so)&lt;br /&gt; {&lt;br /&gt;  int nextLevel = level + 1;&lt;br /&gt;  for (String nextLine : listLevelOneLine.get(level))&lt;br /&gt;  {&lt;br /&gt;   countCheck++;&lt;br /&gt;   if (so.checkLine(nextLine) == true)&lt;br /&gt;   {&lt;br /&gt;    sudokuObject soNew = so.clone();&lt;br /&gt;    soNew.add(nextLine);&lt;br /&gt;    if (nextLevel &amp;lt; 9)  // Naechster Level&lt;br /&gt;    {&lt;br /&gt;     checkSudoku(nextLevel, soNew);&lt;br /&gt;     if (listSudokus.size() &amp;gt;= maxCountSudokus)&lt;br /&gt;      return;&lt;br /&gt;    }&lt;br /&gt;    else  // New&lt;br /&gt;    {&lt;br /&gt;     listSudokus.add(soNew);&lt;br /&gt;     &lt;br /&gt;     if (listSudokus.size() &amp;gt;= maxCountSudokus)&lt;br /&gt;      return;&lt;br /&gt;    }&lt;br /&gt;   }&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt;    // ---------------------------------------------------------&lt;br /&gt;    /** Pruefen, ob der uebergebene Integerwert in dem angegebenen&lt;br /&gt;      * Array enthalten ist.&lt;br /&gt;      * @param nWert      zu pruefender Integer-Wert&lt;br /&gt;      * @param nArrray    Array mit dem Integer-Werten (1-Dimensional)&lt;br /&gt;      */&lt;br /&gt;    public static boolean in(char      cWert&lt;br /&gt;                            ,char[]    cArray)&lt;br /&gt;    {&lt;br /&gt;      if (cArray  != null)&lt;br /&gt;        {&lt;br /&gt;        for (int nI = 0; nI &amp;lt; cArray.length; nI++)&lt;br /&gt;          {&lt;br /&gt;          // Uebereinsteimmung&lt;br /&gt;          if (cArray[nI] == cWert)&lt;br /&gt;             return true;&lt;br /&gt;          }&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;      return false;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt; class sudokuObject&lt;br /&gt; {&lt;br /&gt;  String[] sudokuLines = new String[9];&lt;br /&gt;  &lt;br /&gt;  /**&lt;br /&gt;   * Line dazufuegen&lt;br /&gt;   * @param line&lt;br /&gt;   */&lt;br /&gt;  public void add(String line)&lt;br /&gt;  {&lt;br /&gt;   for (int i = 0; i &amp;lt; 9; i++)&lt;br /&gt;   {&lt;br /&gt;    if (sudokuLines[i] == null)&lt;br /&gt;    {&lt;br /&gt;     sudokuLines[i] = line;&lt;br /&gt;     return;&lt;br /&gt;    }&lt;br /&gt;   }&lt;br /&gt;  }&lt;br /&gt;  &lt;br /&gt;  /**&lt;br /&gt;   * Line pruefen&lt;br /&gt;   * @return TRUE wenn keine Uebereinstimmung, FALSE wenn schon&lt;br /&gt;   */&lt;br /&gt;  public boolean checkLine(String line)&lt;br /&gt;  {&lt;br /&gt;   for (String sudokuLine : sudokuLines)&lt;br /&gt;   {&lt;br /&gt;    if (sudokuLine == null)&lt;br /&gt;     break;&lt;br /&gt;    for (int i = 0; i &amp;lt; 9; i++)&lt;br /&gt;    {&lt;br /&gt;     if (sudokuLine.charAt(i) == line.charAt(i))&lt;br /&gt;      return false;&lt;br /&gt;    }&lt;br /&gt;   }&lt;br /&gt;   return true;&lt;br /&gt;  }&lt;br /&gt;  &lt;br /&gt;  /**&lt;br /&gt;   * Sudoku ausgeben&lt;br /&gt;   */&lt;br /&gt;  public String toString()&lt;br /&gt;  {&lt;br /&gt;   StringBuffer sbResult = new StringBuffer();&lt;br /&gt;   for (String sudokuLine : sudokuLines)&lt;br /&gt;   {&lt;br /&gt;    if (sbResult.length() &amp;gt; 0)&lt;br /&gt;     sbResult.append('\n');&lt;br /&gt;    sbResult.append(sudokuLine);&lt;br /&gt;   }&lt;br /&gt;   return sbResult.toString();&lt;br /&gt;  }&lt;br /&gt;  &lt;br /&gt;  public sudokuObject clone()&lt;br /&gt;  {&lt;br /&gt;   sudokuObject so = new sudokuObject();&lt;br /&gt;   for (int i = 0; i &amp;lt; 9; i++)&lt;br /&gt;   {&lt;br /&gt;    so.sudokuLines[i] = sudokuLines[i];&lt;br /&gt;   }&lt;br /&gt;   return so;&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt;}&lt;br /&gt;package sudoku;&lt;br /&gt;&lt;br /&gt;import java.util.ArrayList;&lt;br /&gt;import java.util.Date;&lt;br /&gt;&lt;br /&gt;public class Sudoku {&lt;br /&gt;&lt;br /&gt; ArrayList&amp;lt;String&amp;gt; listOneLine = new ArrayList&amp;lt;String&amp;gt;();&lt;br /&gt; &lt;br /&gt; ArrayList&amp;lt;ArrayList&amp;lt;String&amp;gt;&amp;gt; listLevelOneLine = new ArrayList&amp;lt;ArrayList&amp;lt;String&amp;gt;&amp;gt;();&lt;br /&gt; &lt;br /&gt; ArrayList&amp;lt;sudokuObject&amp;gt; listSudokus = new ArrayList&amp;lt;sudokuObject&amp;gt;();&lt;br /&gt; &lt;br /&gt; public static char[] used = {'1','2','3','4','5','6','7','8','9'};&lt;br /&gt; &lt;br /&gt; int maxCountSudokus = 100;&lt;br /&gt; &lt;br /&gt; int countCheck = 0;&lt;br /&gt; &lt;br /&gt; public Sudoku()&lt;br /&gt; {&lt;br /&gt;  &lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; /**&lt;br /&gt;  * Generieren Sukdoku&lt;br /&gt;  * @param countSudokus Anzahl zu generierenden Sudokus&lt;br /&gt;  * @throws Exception&lt;br /&gt;  */&lt;br /&gt; public ArrayList&amp;lt;String&amp;gt; generate()&lt;br /&gt;        throws Exception&lt;br /&gt; {&lt;br /&gt;  &lt;br /&gt;  // Laden eindeutige Lines&lt;br /&gt;  Date dstart = new Date();&lt;br /&gt;&lt;br /&gt;  char[] checkArray = {' ',' ',' ',' ',' ',' ',' ',' ',' '};&lt;br /&gt;  checkChar(0, checkArray);&lt;br /&gt;  &lt;br /&gt;  System.out.println("time: " + ((new Date()).getTime() - dstart.getTime()));&lt;br /&gt;  System.out.println("count: " + listOneLine.size());&lt;br /&gt;  &lt;br /&gt;  // Fuer jeden Level eine eigene Liste&lt;br /&gt;  for (int i = 0; i &amp;lt; 9; i++)&lt;br /&gt;  {&lt;br /&gt;   ArrayList&amp;lt;String&amp;gt; newList = new ArrayList&amp;lt;String&amp;gt;();&lt;br /&gt;   int aktPos = (int) (Math.round((Math.random() * ((double)listOneLine.size()))));&lt;br /&gt;   for (int j = 0; j &amp;lt; listOneLine.size(); j++)&lt;br /&gt;   {&lt;br /&gt;    newList.add(listOneLine.get(aktPos));&lt;br /&gt;    aktPos++;&lt;br /&gt;    if (aktPos &amp;gt;= listOneLine.size())&lt;br /&gt;     aktPos = 0;&lt;br /&gt;   }&lt;br /&gt;   listLevelOneLine.add(newList);&lt;br /&gt;  }&lt;br /&gt;  System.out.println("Calc Sudokus");&lt;br /&gt;  &lt;br /&gt;  // Arrangieren eindeutige Lines&lt;br /&gt;  for (String firstLine : listLevelOneLine.get(0))&lt;br /&gt;  {&lt;br /&gt;   sudokuObject so = new sudokuObject();&lt;br /&gt;   so.add(firstLine);&lt;br /&gt;   checkSudoku(1, so);&lt;br /&gt;   &lt;br /&gt;   if (listSudokus.size() &amp;gt;= maxCountSudokus)&lt;br /&gt;    break;&lt;br /&gt;  }&lt;br /&gt;  &lt;br /&gt;  System.out.println("time: " + ((new Date()).getTime() - dstart.getTime()));&lt;br /&gt;  System.out.println("count Sudoku: " + listSudokus.size());&lt;br /&gt;  System.out.println("count Pruefung: " + countCheck);&lt;br /&gt;  &lt;br /&gt;  ArrayList&amp;lt;String&amp;gt; result = new ArrayList&amp;lt;String&amp;gt;();&lt;br /&gt;  for (sudokuObject so : listSudokus)&lt;br /&gt;  {&lt;br /&gt;   result.add(so.toString());&lt;br /&gt;  }&lt;br /&gt;  return result;&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; private void checkChar(int level&lt;br /&gt;                 ,char[] checkArray)&lt;br /&gt; {&lt;br /&gt;  int nextLevel = level + 1;&lt;br /&gt;  for (char pos : used)&lt;br /&gt;  {&lt;br /&gt;   if (in(pos, checkArray) == false)&lt;br /&gt;   {&lt;br /&gt;    checkArray[level] = pos;&lt;br /&gt;    &lt;br /&gt;    // Naechste Stufe&lt;br /&gt;    if (nextLevel &amp;lt; checkArray.length) &lt;br /&gt;    {&lt;br /&gt;     checkChar(nextLevel, checkArray);&lt;br /&gt;     for (int i = nextLevel; i &amp;lt; checkArray.length; i++)&lt;br /&gt;     {&lt;br /&gt;      checkArray[i] = ' ';&lt;br /&gt;     }&lt;br /&gt;    }&lt;br /&gt;    else // Ende&lt;br /&gt;    {&lt;br /&gt;     listOneLine.add(new String(checkArray));&lt;br /&gt;     return;&lt;br /&gt;    }&lt;br /&gt;   }&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; private void checkSudoku(int level&lt;br /&gt;                   ,sudokuObject so)&lt;br /&gt; {&lt;br /&gt;  int nextLevel = level + 1;&lt;br /&gt;  for (String nextLine : listLevelOneLine.get(level))&lt;br /&gt;  {&lt;br /&gt;   countCheck++;&lt;br /&gt;   if (so.checkLine(nextLine) == true)&lt;br /&gt;   {&lt;br /&gt;    sudokuObject soNew = so.clone();&lt;br /&gt;    soNew.add(nextLine);&lt;br /&gt;    if (nextLevel &amp;lt; 9)  // Naechster Level&lt;br /&gt;    {&lt;br /&gt;     checkSudoku(nextLevel, soNew);&lt;br /&gt;     if (listSudokus.size() &amp;gt;= maxCountSudokus)&lt;br /&gt;      return;&lt;br /&gt;    }&lt;br /&gt;    else  // New&lt;br /&gt;    {&lt;br /&gt;     listSudokus.add(soNew);&lt;br /&gt;     &lt;br /&gt;     if (listSudokus.size() &amp;gt;= maxCountSudokus)&lt;br /&gt;      return;&lt;br /&gt;    }&lt;br /&gt;   }&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt;    // ---------------------------------------------------------&lt;br /&gt;    /** Pruefen, ob der uebergebene Integerwert in dem angegebenen&lt;br /&gt;      * Array enthalten ist.&lt;br /&gt;      * @param nWert      zu pruefender Integer-Wert&lt;br /&gt;      * @param nArrray    Array mit dem Integer-Werten (1-Dimensional)&lt;br /&gt;      */&lt;br /&gt;    public static boolean in(char      cWert&lt;br /&gt;                            ,char[]    cArray)&lt;br /&gt;    {&lt;br /&gt;      if (cArray  != null)&lt;br /&gt;        {&lt;br /&gt;        for (int nI = 0; nI &amp;lt; cArray.length; nI++)&lt;br /&gt;          {&lt;br /&gt;          // Uebereinsteimmung&lt;br /&gt;          if (cArray[nI] == cWert)&lt;br /&gt;             return true;&lt;br /&gt;          }&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;      return false;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt; class sudokuObject&lt;br /&gt; {&lt;br /&gt;  String[] sudokuLines = new String[9];&lt;br /&gt;  &lt;br /&gt;  /**&lt;br /&gt;   * Line dazufuegen&lt;br /&gt;   * @param line&lt;br /&gt;   */&lt;br /&gt;  public void add(String line)&lt;br /&gt;  {&lt;br /&gt;   for (int i = 0; i &amp;lt; 9; i++)&lt;br /&gt;   {&lt;br /&gt;    if (sudokuLines[i] == null)&lt;br /&gt;    {&lt;br /&gt;     sudokuLines[i] = line;&lt;br /&gt;     return;&lt;br /&gt;    }&lt;br /&gt;   }&lt;br /&gt;  }&lt;br /&gt;  &lt;br /&gt;  /**&lt;br /&gt;   * Line pruefen&lt;br /&gt;   * @return TRUE wenn keine Uebereinstimmung, FALSE wenn schon&lt;br /&gt;   */&lt;br /&gt;  public boolean checkLine(String line)&lt;br /&gt;  {&lt;br /&gt;   for (String sudokuLine : sudokuLines)&lt;br /&gt;   {&lt;br /&gt;    if (sudokuLine == null)&lt;br /&gt;     break;&lt;br /&gt;    for (int i = 0; i &amp;lt; 9; i++)&lt;br /&gt;    {&lt;br /&gt;     if (sudokuLine.charAt(i) == line.charAt(i))&lt;br /&gt;      return false;&lt;br /&gt;    }&lt;br /&gt;   }&lt;br /&gt;   return true;&lt;br /&gt;  }&lt;br /&gt;  &lt;br /&gt;  /**&lt;br /&gt;   * Sudoku ausgeben&lt;br /&gt;   */&lt;br /&gt;  public String toString()&lt;br /&gt;  {&lt;br /&gt;   StringBuffer sbResult = new StringBuffer();&lt;br /&gt;   for (String sudokuLine : sudokuLines)&lt;br /&gt;   {&lt;br /&gt;    if (sbResult.length() &amp;gt; 0)&lt;br /&gt;     sbResult.append('\n');&lt;br /&gt;    sbResult.append(sudokuLine);&lt;br /&gt;   }&lt;br /&gt;   return sbResult.toString();&lt;br /&gt;  }&lt;br /&gt;  &lt;br /&gt;  public sudokuObject clone()&lt;br /&gt;  {&lt;br /&gt;   sudokuObject so = new sudokuObject();&lt;br /&gt;   for (int i = 0; i &amp;lt; 9; i++)&lt;br /&gt;   {&lt;br /&gt;    so.sudokuLines[i] = sudokuLines[i];&lt;br /&gt;   }&lt;br /&gt;   return so;&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5195037349762984827-4487255312310311848?l=tippsundtools.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tippsundtools.blogspot.com/feeds/4487255312310311848/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://tippsundtools.blogspot.com/2009/04/berechnen-sudoku.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5195037349762984827/posts/default/4487255312310311848'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5195037349762984827/posts/default/4487255312310311848'/><link rel='alternate' type='text/html' href='http://tippsundtools.blogspot.com/2009/04/berechnen-sudoku.html' title='Berechnen Sudoku'/><author><name>stefan</name><uri>http://www.blogger.com/profile/11778575587066022922</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5195037349762984827.post-9202081210512108283</id><published>2009-03-29T01:53:00.006+01:00</published><updated>2009-03-29T03:04:02.779+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MySql'/><category scheme='http://www.blogger.com/atom/ns#' term='Ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='Linux'/><category scheme='http://www.blogger.com/atom/ns#' term='Nagios'/><category scheme='http://www.blogger.com/atom/ns#' term='bacula'/><title type='text'>Bacula + Nagios</title><content type='html'>Leider gibt es keinen Nagios-Check für Bacula-Jobs. Aber da es ja nicht allzu schwer ist einen neuen Check anzulegen habe ich folgenden Ruby-Script geschrieben der zumindest zusammen mit einer MySQL-DB super funktioniert. Für andere Bacula-Datenbanken (z.B. Postgres) müssten kleine Änderungen vorgenommen werden.&lt;br /&gt;&lt;br /&gt;Und wichtig: Funktioniert unter Linux mit Ruby Vesion 1.8 und MySQL-DBI-Unterstützung von Ruby installieren.&lt;br /&gt;&lt;br /&gt;Nun der Script:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;#!/usr/bin/ruby&lt;br /&gt;# ------------------------------------------------------------------------&lt;br /&gt;# Checken bacula ueber die Mysql-DB ob der Job OK ist&lt;br /&gt;#&lt;br /&gt;# Aufrufbeispiel: ./check_bacula_job.rb  -h bacula-host -db bacula-db -u bacula -p baculapwd -j BackupCatalog&lt;br /&gt;#&lt;br /&gt;# Siehe auch "usage"&lt;br /&gt;#&lt;br /&gt;# Benoetigt: Ruby&lt;br /&gt;#            MySql-Libraries fuer Rubi dbi&lt;br /&gt;&lt;br /&gt;require "dbi"&lt;br /&gt;&lt;br /&gt;def print_usage(out)&lt;br /&gt;    out.puts 'Nagios-Check zum Pruefen von Bacula-Jobs'&lt;br /&gt;    out.puts 'Version: 0.1'&lt;br /&gt;    fmt = "  %-12s %s\n"&lt;br /&gt;    out.puts&lt;br /&gt;    out.puts 'Global options:'&lt;br /&gt;    out.printf fmt, '--help',    'print this message'&lt;br /&gt;    out.printf fmt, '-j',        'Job name'&lt;br /&gt;    out.printf fmt, '-h',        'MySQL-DB-Host'&lt;br /&gt;    out.printf fmt, '-db',       'MySQL-DB-Name'&lt;br /&gt;    out.printf fmt, '-u',        'MySQL-DB-User'&lt;br /&gt;    out.printf fmt, '-p',        'MySQL-DB-Password'&lt;br /&gt;    out.puts&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;# &lt;br /&gt;# Pruefen Eingaben&lt;br /&gt;begin&lt;br /&gt;  jobName = "leer"&lt;br /&gt;  status = "f"      # = Fatal&lt;br /&gt;  mysql_host = ""  &lt;br /&gt;  mysql_db   = ""&lt;br /&gt;  mysql_user = ""&lt;br /&gt;  mysql_pwd  = ""&lt;br /&gt;&lt;br /&gt;  ARGV.each_with_index do |arg, index|&lt;br /&gt;    #Prüfe, ob eine Option angegeben wurde, und wenn ja, nehme Änderungen vor&lt;br /&gt;    case arg&lt;br /&gt;    when '-j', '-J'&lt;br /&gt;      jobName = ARGV[index + 1]&lt;br /&gt;    when '-h'&lt;br /&gt;      mysql_host = ARGV[index + 1]&lt;br /&gt;    when '-db'&lt;br /&gt;      mysql_db = ARGV[index + 1]&lt;br /&gt;    when '-u'&lt;br /&gt;      mysql_user = ARGV[index + 1]&lt;br /&gt;    when '-p'&lt;br /&gt;      mysql_pwd = ARGV[index + 1]&lt;br /&gt;    when '-?', '-hilfe', '-help'&lt;br /&gt;      print_usage $stdout&lt;br /&gt;      exit 0&lt;br /&gt;    end&lt;br /&gt;  end&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;#   printf "JobName %s\n", jobName&lt;br /&gt;#   printf "mysql_host %s\n", mysql_host&lt;br /&gt;#   printf "mysql_db %s\n", mysql_db&lt;br /&gt;#   printf "mysql_user %s\n", mysql_user&lt;br /&gt;#   printf "mysql_pwd %s\n", mysql_pwd&lt;br /&gt;#   printf "connect %s\n", "dbi:mysql:" + mysql_db + ":" + mysql_host&lt;br /&gt;&lt;br /&gt;begin&lt;br /&gt;  # Connect to mysql&lt;br /&gt;  dbh = DBI.connect("dbi:mysql:" + mysql_db + ":" + mysql_host, mysql_user, mysql_pwd);&lt;br /&gt;  # Abfragen Job-Tabelle&lt;br /&gt;  sth = dbh.prepare( "select jobid&lt;br /&gt;                           , job&lt;br /&gt;                           , Name&lt;br /&gt;                           , JobStatus&lt;br /&gt;                           , SchedTime&lt;br /&gt;                           , startTime&lt;br /&gt;                        from Job&lt;br /&gt;                       where Name = '" + jobName + "'&lt;br /&gt;                       order by SchedTime desc"&lt;br /&gt;                   ) &lt;br /&gt;  sth.execute&lt;br /&gt;  # Nur der erste interessiert&lt;br /&gt;  if row=sth.fetch &lt;br /&gt;    status = row["JobStatus"]&lt;br /&gt;    job    = row["job"]&lt;br /&gt;    jobid  = row["jobid"]&lt;br /&gt;    name   = row["name"]&lt;br /&gt;    # printf "ID: %d, Job: %s, Job Name: %s Status: %s \n", row[0], row[1], row[2], row[3]&lt;br /&gt;  end&lt;br /&gt;  sth.finish&lt;br /&gt;rescue DBI::DatabaseError =&gt; e&lt;br /&gt;  puts "An error occurred"&lt;br /&gt;  puts "Error code: #{e.err}"&lt;br /&gt;  puts "Error message: #{e.errstr}"&lt;br /&gt;ensure&lt;br /&gt;  # disconnect from server&lt;br /&gt;  dbh.disconnect if dbh&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;# Terminated = OK&lt;br /&gt;if status == "T"&lt;br /&gt;   # OK&lt;br /&gt;   printf " ID: %d, Job: %s, Job Name: %s Status: %s\n", jobid, job, name, status&lt;br /&gt;   exit 0&lt;br /&gt;elsif status == "R" or&lt;br /&gt;      status == "C"&lt;br /&gt;   # Warning&lt;br /&gt;   printf " WARN: ID: %d, Job: %s, Job Name: %s Status: %s\n", jobid, job, name, status&lt;br /&gt;   exit 1&lt;br /&gt;else&lt;br /&gt;   # Critical&lt;br /&gt;   printf "ERR: ID: %d, Job: %s, Job Name: %s Status: %s\n", jobid, job, name, status&lt;br /&gt;   exit 2&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;# Falls was schief geht immer Fehler zurueckmelden&lt;br /&gt;exit 2&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;--------- SCRIPT ENDE -------------------&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5195037349762984827-9202081210512108283?l=tippsundtools.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tippsundtools.blogspot.com/feeds/9202081210512108283/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://tippsundtools.blogspot.com/2009/03/bacula-nagios.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5195037349762984827/posts/default/9202081210512108283'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5195037349762984827/posts/default/9202081210512108283'/><link rel='alternate' type='text/html' href='http://tippsundtools.blogspot.com/2009/03/bacula-nagios.html' title='Bacula + Nagios'/><author><name>stefan</name><uri>http://www.blogger.com/profile/11778575587066022922</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5195037349762984827.post-5055145930190036281</id><published>2009-03-12T10:13:00.007+01:00</published><updated>2009-03-14T02:24:28.455+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MySql'/><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><category scheme='http://www.blogger.com/atom/ns#' term='Bugs'/><category scheme='http://www.blogger.com/atom/ns#' term='bacula'/><title type='text'>Bacula - einige Hürden</title><content type='html'>Bei der Installation von Bacula 2.4.2 (&lt;a href="http://www.bacula.org"&gt;http://www.bacula.org&lt;/a&gt;) habe ich einige Probleme gehabt. Anbei wie ich es gelöst habe.&lt;br /&gt;Installiert habe ich es unter Ubuntu 8.10 - Server&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Kein Log der Deamons&lt;/span&gt;&lt;br /&gt;Das hier ist besonders fies. Es geht nichts und man weiss nicht warum. Bei mir lag es an zwei Gründen. Ich hatte Fehler weil der eine Service nicht mit den anderen kommunizieren konnte und weil dieser Fehler nicht kommuniziert wurde konnte ich nicht sehen was für ein Fehler es ist.&lt;br /&gt;Lösung:&lt;br /&gt;&lt;blockquote style="font-family: courier new;"&gt;&lt;br /&gt;# Send all messages except skipped files back to Director&lt;br /&gt;Messages {&lt;br /&gt; Name = Standard&lt;br /&gt; director = sarax-dir = all, !skipped, !restored&lt;br /&gt; append = "/var/lib/bacula/log" = all, !skipped&lt;br /&gt;}&lt;br /&gt;(in bacula-sd.conf und bacula-fd.conf)&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Das "append=" sorgt dafür das die "log" gefüllt wird. Natürlich muss das Verzeichnis "/var/lib/log" vorhanden sein und dann sieht man auch wo der Bacula-schuh klemmt.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Logeintrag:&lt;/span&gt;&lt;br /&gt;bconsole JobId 0: Fatal error: bsock.c:129 Unable to connect to Director daemon on 127.0.0.1:9101. ERR=Connection refused&lt;br /&gt;&lt;br /&gt;Hier besteht das Problem das in allen conf-Dateien entweder der Service (dir, sd, fd) auf "localhost" hängt und unter der IP-Adresse oder dem Rechnernamen gesucht wird - oder umgekehrt. Tipp: alles vereinheitlichen&lt;br /&gt;&lt;br /&gt;Zum Beispiel:&lt;br /&gt;&lt;blockquote&gt;Director {                            # define myself&lt;br /&gt; Name = sara-dir&lt;br /&gt; DIRport = 9101                # where we listen for UA connections&lt;br /&gt; QueryFile = "/etc/bacula/scripts/query.sql"&lt;br /&gt; WorkingDirectory = "/var/lib/bacula"&lt;br /&gt; PidDirectory = "/var/run/bacula"&lt;br /&gt; Maximum Concurrent Jobs = 1&lt;br /&gt; Password = "jasjdjksdasdasdajk"         # Console password&lt;br /&gt; Messages = Daemon&lt;br /&gt; # DirAddress = 127.0.0.1    ALT UND FALSCH&lt;br /&gt; DirAddress = sarax.mulit.intra&lt;br /&gt;}&lt;br /&gt;(in bacula-dir.conf)&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;oder&lt;br /&gt;&lt;br /&gt;&lt;blockquote style="font-family: courier new;"&gt;FileDaemon {                          # this is me&lt;br /&gt; Name = sara-fd&lt;br /&gt; FDport = 9102                  # where we listen for the director&lt;br /&gt; WorkingDirectory = /var/lib/bacula&lt;br /&gt; Pid Directory = /var/run/bacula&lt;br /&gt; Maximum Concurrent Jobs = 20&lt;br /&gt; # FDAddress = 127.0.0.1  ALT UND FALSCH&lt;br /&gt; FDAddress = sarax.mulit.intra&lt;br /&gt;}&lt;br /&gt;(in bacula-fd.conf)&lt;/blockquote&gt;&lt;br /&gt;und wichtig: bconsole.conf nicht vergessen. Dort auch die Adresse richtigstellen.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;DB-Fehler&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote style="font-family: courier new;"&gt;&lt;br /&gt;Passwords or names not the same or&lt;br /&gt;Maximum Concurrent Jobs exceeded on the FD or&lt;br /&gt;FD networking messed up (restart daemon).&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Diese Fehlermeldung kann zwei Gründe haben:&lt;br /&gt;1.) Datenbank-Connect ist nicht möglich. So ist bei MySql zum Beispiel notwendig das die Tabelle "user" mit den verwendeten Varianten angelegt wird. Bitte beachten das der im "conf" angegebene Hostname verwendeit wird.&lt;br /&gt;2.) Es läuft ein Prozess doppelt.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5195037349762984827-5055145930190036281?l=tippsundtools.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tippsundtools.blogspot.com/feeds/5055145930190036281/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://tippsundtools.blogspot.com/2009/03/bacula-einige-hurden.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5195037349762984827/posts/default/5055145930190036281'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5195037349762984827/posts/default/5055145930190036281'/><link rel='alternate' type='text/html' href='http://tippsundtools.blogspot.com/2009/03/bacula-einige-hurden.html' title='Bacula - einige Hürden'/><author><name>stefan</name><uri>http://www.blogger.com/profile/11778575587066022922</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
