Mich beschäftigte heute kurz der Windows Update Fehler 8024402C unter Windows 7.
Er wird im Internet entweder an WSUS Problemen oder Netzwerkproblemen festgemacht. Ist der WSUS Server aktiv, sind die Netzwerkeinstellungen korrekt, kann man den WSUS von dem Rechner aus pingen?

Ich konnte den Fehler mit dem Löschen (vorher sichern!) des folgenden Registry Keys beheben:

HKEY_LOCAL_MACHINE\Software\Policies\Microsoft\Windows\WindowsUpdate

Wenn ihr einen WSUS nutzt (oder andere Windows Update bezogene GPO Einstellungen) solltet ihr direkt danach ein

gpupdate /force

abfeuern.
Danach ein Neustart und der Fehler sollte erledigt sein.

Die Gruppenrichtlinie und der WSUS sorgten dafür, dass der Schlüssel (korrekt) neu erstellt wurde und damit war das Problem wohl behoben.

via

Weitere Windows Update Fehler und ihre Lösung findet ihr hier.

Es ist ärgerlicher denn je: tanken! Vorhin zu Hause noch ein paar neue Autoteile für den Wagen bestellt und dann mit dem Bus unterwegs gewesen. Dann aus den öffentlichen Verkehrsmitteln noch 1,609€ an der Zapfsäule gesehen und direkt ins Auto gesetzt und schon kostet es 1,679€.
Wer diesen Ärger vermeiden will informiert sich schon vor der Fahrt zur Tanke nach dem günstigsten Preis der Umgebung.
Wie?

Wie wäre es mit einem Android Tankstellen-App: GasStations!
GasStations bietet alles, was man zum stressfreien und erfolgreichen Tanken braucht.

In einer Übersicht werden alle Tankstellen der Umgebung mitsamt Preis eines Kraftstoffes (wählbar) angezeigt. Die Daten werden live beim Öffnen der App aktualisiert und sind (bei mir bis jetzt) immer exakt. Einzelne Tankstellen kann man zu seinen Favouriten hinzufügen, sehr praktisch.
Zu jeder Tankstelle gibt es neben allen Kraftstoffpreisen auch die Adresse, Telefonnummer und Öffnungszeiten (falls bekannt).

Zusätzlich wird die Entfernung zu jeder Tankstelle angezeigt und eine Google Map gibt es auch.

Das alles gibt es kostenlos mit ein klein wenig Werbung am unteren Rand. Ich bin sehr positiv überrascht und hoffe, dass die App in Zukunft 1. öfter runtergeladen wird (500-1000 Downloads momentan deutet auf eine neue App hin) und auch weiterentwickelt wird.

Ich würde mir zum Beispiel einen Preisalarm wünschen, der im Hintergrund in regelmäßigen Zeitabständen bestimmte Tankstellen nach einem gewünschten Preis absucht und benachrichgt, wenn dieser Preis erreicht wird.

Mein Tipp für die Autofahrer unter euch.

In meinem letzten Post habe ich die Farbgestaltung in Java etwas näher untersucht. Zusätzlich auch die Konsolensteuerung (Cursor bewegen, Konsoleninhalt manipulieren usw) getestet.
Daraus kann man ja schon eine Menge machen. Ich habe mich mal an einen „Splash Screen Generator“ gemacht. Klingt natürlich viel geiler als es ist.
Ziel soll es sein einen beliebigen umrahmten Text in beliebiger Farbgestaltung an beliebiger Stelle auf dem Bildschirm für eine beliebige Zeit anzeigen zu lassen. Für den Benutzer ist das mit 1 Funktionsaufruf besonders einfach gehalten.

Code

Code anzeigenDen Code könnt ihr bequem mit den Links/Rechts Pfeiltasten horizontal bewegen.

import java.io.IOException;
import java.io.*;
import org.fusesource.jansi.AnsiConsole;
import org.fusesource.jansi.*;

public class test {
  
  public static final String CLS = "\u001b[2J";
  public static final String TOP = "\u001b[0;1H";
  public static final String UP = "\u001b[1F";
  public static final String LEFT = "\u001b[1G";
  public static final String DEL = "\u001b[2K";
  public static final String DEL_LEFT = "\u001b[1K";
  public static final String DEL_RIGHT = "\u001b[0K";
  public static final String BOLD = "\u001b[1m";
  public static final String RESET = "\u001b[0m";
  public static final String SPLASH = "\u001b[1;37;1;44m";
	
	public static void buildSplashScreen(String[] splash, int time, String Style, int x, int y) throws InterruptedException {
		Ansi ansi=Ansi.ansi();
		
		// get longest element
		int maxlength = 0;
		for(String getmax : splash) {
			if(getmax.length() > maxlength) maxlength = getmax.length();
		}
		
		// old style: AnsiConsole.out.print(SPLASH+"\u001b["+x+";"+y+"H");
		AnsiConsole.out.print(SPLASH+ansi.cursor(x-1,y));
		System.console().printf("\u2554");
		for(int i = 0;i<maxlength+2;i++) {
			System.console().printf("\u2550");
		}
		System.console().printf("\u2557\n");
		for(int j = 0;j < splash.length;j++) {
			AnsiConsole.out.print(ansi.cursor(x,10)); x++;
			System.console().printf("\u2551 " + splash[j] + " \u2551\n");
		}
		AnsiConsole.out.print(ansi.cursor(x,10));
		System.console().printf("\u255A");
		for(int k = 0;k<maxlength+2;k++) {
			System.console().printf("\u2550");
		}
		System.console().printf("\u255D\n");
		
		Thread.sleep(time);
		
		clearScreen();
	}
	
	public static void clearScreen() {
		for(int i=0;i<50;i++)
        {
            AnsiConsole.out.println( RESET + DEL);
        }
        AnsiConsole.out.print( CLS + TOP );
	}

	public static void main(String[] args) throws IOException, InterruptedException {
		
		try {AnsiConsole.systemInstall();}catch(Exception e){}
		Ansi ansi=Ansi.ansi();
		
		String[] splash = new String[9];
		splash[0] = "                                                        ";
		splash[1] = " _    _  _____            ____                          ";
		splash[2] = "| |  | |/ ____|          / _| |                         ";
		splash[3] = "| |__| | (___  ___  ___ | |_| |___      ____ _ _ __ ___ ";
		splash[4] = "|  __  |\\___ \\/ __|/ _ \\|  _| __\\ \\ /\\ / / _` | '__/ _ \\";
		splash[5] = "| |  | |____) \\__ \\ (_) | | | |_ \\ V  V / (_| | | |  __/";
		splash[6] = "|_|  |_|_____/|___/\\___/|_|  \\__| \\_/\\_/ \\__,_|_|  \\___|";
		splash[7] = "                                                        ";
		splash[8] = "                                                        ";
		
		buildSplashScreen(splash, 5000, SPLASH, 10, 10);
		
		try {System.in.read();}catch(Exception e){}
	}
}

Die Funktion buildSplashScreen wird also mit 5 Parametern aufgerufen:

buildSplashScreen(String[] anzuzeigender-Text, int Anzeigedauer-in-Millisekunden, String Unicode-Farbstyle, int x-Koordinate, int y-Koordinate);

Den Anzeigetext als Array (ein- oder mehrzeilig möglich), Backslashes im Anzeigetext müssen natürlich doppelt gesetzt werden, Unicode Farbstyle als String mit einer Form ähnlich wie „\u001b[1;37;1;44m„, x- und y-Koordinate definiert die obere linke Ecke des Splash Screens.

Ausführung in Notepad++:
(schon mehrfach behandelt, aber nochmal zur Erinnerung)
Code anzeigen

(Vorbereitung hier) NppExec Plugin installieren, Batch erstellen mit folgendem Inhalt (oder unten downloaden):

Code

Code anzeigenDen Code könnt ihr bequem mit den Links/Rechts Pfeiltasten horizontal bewegen.

@echo off

:: jar(s) specified?
if not [%4]==[] goto jars

:: compile and run without externals jars
if not [%1]==[] javac %1
if not [%2]==[] if not [%3]==[] start cmd.exe /c java -classpath %2 %3

:jars
setlocal enabledelayedexpansion
set /a N=0

:: reads up to 6 externals jars
for /f "tokens=1,2,3 delims=;" %%a in ("%~4") do (
	set /a N+=1
	set j1=%%a
	set j2=%%b
	set j3=%%c
)

set classpath=%~2
set jarpath=%~2
if not [%5]==[] set jarpath=%~5
set jars=.
if not [%j1%]==[] set jars=%jars%;%jarpath%\%j1%
if not [%j2%]==[] set jars=%jars%;%jarpath%\%j2%
if not [%j3%]==[] set jars=%jars%;%jarpath%\%j3%

:: compile and run with external jars
if not [%1]==[] javac -cp "%jars%" %1

if not [%2]==[] if not [%3]==[] start cmd /c ""c:\Program Files\Java\jre7\bin\java" -cp "%jars%;%classpath%" %3"

endlocal

:: usage:

:: just compile
:: executor.bat "C:\Pfad\zur\Javadatei\MeinProgramm.java"

:: compile with 1 external .jar
:: executor.bat "C:\Pfad\zur\Javadatei\MeinProgramm.java" "lib1.jar"

:: compile with 1 external .jar
:: executor.bat "C:\Pfad\zur\Javadatei\MeinProgramm.java" "lib1.jar;lib2.jar"

:: just run java code
:: executor.bat "C:\Pfad\zur\Javadatei\MeinProgramm.java" "C:\Pfad\zur\Javadatei" "MeinProgramm"

:: run java code with one or multiple external jars
:: executor.bat "C:\Pfad\zur\Javadatei\MeinProgramm.java" "C:\Pfad\zur\Javadatei" "MeinProgramm" "lib1.jar"

:: run java code with one or multiple external jars - up to 3 jars supported (change lines 15-28 [if you know batch] for more)
:: usage: executor.bat "C:\Pfad\zur\Javadatei\MeinProgramm.java" "C:\Pfad\zur\Javadatei" "MeinProgramm" "lib1.jar;lib2.jar;jcurse.jar"

:: Notepad++ F6 Code: 
::   NPP_SAVE
::   ?:\path\to\executor.bat "$(FULL_CURRENT_PATH)" "$(CURRENT_DIRECTORY)" "$(NAME_PART)" "one_or_multiple_external.jar"

Batch, .java Code und alle nötigen .jars (jansi.jar in diesem Fall) in ein Verzeichnis, in Notepad++ F6 drücken, folgenden Code (erst anpassen!) einfügen:

NPP_SAVE
t:\Dropbox\Programmierung\Java\executor.bat "$(FULL_CURRENT_PATH)" "$(CURRENT_DIRECTORY)" "$(NAME_PART)" "jansi.jar"

(bei mir liegen also .java, .jar und .bat in T:\Dropbox\Programmierung\Java\)

und dann sollte das funktionieren. Weitere Nutzungshinweise zur executor.bat befinden sich als Kommentar am Ende. Die Batch kann mittlerweile nur kompilieren (ohne und mit jars) und ausführen (ohne und mit jars).
Beachte: javac.exe und java.exe müssen in der Windows Umgebungsvariablen PATH eingetragen sein! siehe Vorbereitungen oder Google.

Demo

Download

executor [.bat]
SplashScreen [.java]
SplashScreen [.class]
jansi [.jar]

Ich habe es mittlerweile aufgegeben eigene Funktionen für farbige Ausgaben oder Konsolenhandling (Konsole leeren, Cursor bewegen usw) in Java (unter Windows) zu schreiben. Fehlendes ANSI Verständnis von Windows sorgt dafür, dass ANSI Steuerzeichen nicht umgesetzt werden; damit sind Farben, Formatting und Handling in der Konsole schier unerreichbar.
Aber glücklicherweise gibt es dutzende Java Bibliotheken, die solche Dinge realisieren: Jansi, JCurses, Charva, uvm.

Ich habe bisher nur Jansi getestet und es klappt ganz gut. Jansi installiert das Ansi Verständnis in die Konsole und ermöglicht somit die ordnungsgemäße Nutzung dieser Steuerzeichen sowohl mit der eigenen Funktion AnsiConsole.out als auch mit der normalen Funktion System.out.

Ich habe die Farbgestaltung und ein paar Handlingsachen mal in einem Beispiel zusammengepackt.

Code

Code anzeigenDen Code könnt ihr bequem mit den Links/Rechts Pfeiltasten horizontal bewegen.

import java.io.IOException;
import java.io.*;
// Jansi Bibliothekbestandteile importieren, logischerweise muss das sein.
// Diese imports befinden sich in der jansi.jar, die dann beim kompilieren und ausführen mit eingebunden werden muss
// siehe http://hannes-schurig.de/17/04/2012/java-2-farbige-formatierte-konsolenausgaben-in-windows-einfache-beispiele/
import org.fusesource.jansi.AnsiConsole;
import org.fusesource.jansi.*;

public class Farben {

/*
	Author: 	 Hannes Schurig
	Created: 	 16.4.2012
	Changed: 	 16.4.2012
	Version: 	 1.0
	Changelog:
		v1.0:	 Farbige Ausgaben und Konsolenhandling dank jansi.jar, verschiedene Beispiele
	Title: 		 Farben				 
	Quellen:	jansi Doku: http://jansi.fusesource.org/documentation/api/index.html
				http://en.wikipedia.org/wiki/ANSI_escape_code
*/
  
  public static final String CLS = "\u001b[2J";
  public static final String TOP = "\u001b[H";
  public static final String UP = "\u001b[1F";
  public static final String LEFT = "\u001b[1G";
  public static final String DEL = "\u001b[2K";
  public static final String DEL_LEFT = "\u001b[1K";
  public static final String DEL_RIGHT = "\u001b[0K";
  public static final String BOLD = "\u001b[1m";
  public static final String RESET = "\u001b[0m";
  public static final String SPLASH = "\u001b[1;37;44m";
  public static final String f1 = "\u001b[1;37;46m";
  public static final String f2 = "\u001b[1;34;41m";
  public static final String f3 = "\u001b[1;31;45m";
  public static final String f4 = "\u001b[1;36;42m";
  public static final String f5 = "\u001b[1;35;43m";

	public static void main(String[] args) throws IOException, InterruptedException {
		try {
			// Installation der AnsiConsole und Einbetttung der Funktionalitäten in die System.out Funktion
			AnsiConsole.systemInstall();
		}catch(Exception e){}
		// muss nicht in einer try catch stehen, würde ich persönlich aber bevorzugen
		
		// Ansi Objekt erstellen
		Ansi ansi=Ansi.ansi();
		
		// AnsiConsole.out wird für ANSI Steuerzeichenausgaben genutzt
		// Farb- oder Formatierungsanweisungen immer vor den Text, den es betreffen soll.
		// Diese Formatierungen bleiben so lange aktiv, bis sie neu gesetzt werden. Also auch über mehrere Ausgabebefehle hinweg.
		// Ein Zurücksetzen der Farb- und Formatierungsanweisungen kann mit [0m oder [m erfolgen (hier in RESET gespeichert).
		AnsiConsole.out.println( f1 + " Dies ist ein Test " + RESET );
		AnsiConsole.out.println( f2 + " Dies ist ein Test " + RESET );
		AnsiConsole.out.println( f3 + " Dies ist ein Test " + RESET );
		AnsiConsole.out.println( f4 + " Dies ist ein Test " + RESET );
		AnsiConsole.out.println( f1 + " Dies ist ein Test " + RESET );
		AnsiConsole.out.println( f2 + " Dies ist ein Test " + RESET );
		AnsiConsole.out.println( f3 + " Dies ist ein Test " + RESET );
		AnsiConsole.out.println( f4 + " Dies ist ein Test " + RESET );
		AnsiConsole.out.println( SPLASH + " Dies ist ein Test " );
		AnsiConsole.out.println( " Eine Zeile ohne RESET davor ist wie die vorherige. " + RESET );
		AnsiConsole.out.println( " Wieder normal " );
		
		// Pause von 5 Sekunden (main Funktion braucht throws InterruptedException und import java.io.*; nötig)
		Thread.sleep(10000);
		
		// Ausgabe von ANSI [2J und [H ( auch: [1;1H ) für 'Clear Screen' und 'Cursor to top left cornor'
		AnsiConsole.out.print( CLS + TOP );
		
		// weiterhin kann man System.out und System.console() verwenden
		System.console().printf( " CLS löscht zwar die Zeichen aber nicht farbige Überreste, " );
		System.console().printf( " daher müssen diese Zeile für Zeile gelöscht werden. " );
		
		Thread.sleep(10000);
		
		// echter CLS Befehl mit mehrfachem Zeile Löschen und erneutem Hochspringen am Ende
		for(int i=0;i<50;i++)
		{
			AnsiConsole.out.println( RESET + DEL);
		}
		AnsiConsole.out.print( CLS + TOP );
		// echter CLS Ende
		
		AnsiConsole.out.print(ansi.cursor(10,10) + SPLASH + " Positionieren des Cursors kann auf 2 verschiedene Wege passieren: " );
		AnsiConsole.out.print(ansi.cursor(11,10) + " Entweder generiert man sich das Ansi Objekt (siehe oben) und nutzt " );
		AnsiConsole.out.print(ansi.cursor(12,10) + " dann die ansi.cursor(row, column) Funktion oder man nutzt direkt die " );
		AnsiConsole.out.print( "\u001b[13;10H entsprechenden ANSI Steuerzeichen dafür. Also [row;columnH " );
		AnsiConsole.out.print( "\u001b[14;10H wie in den letzten beiden Zeilen hier zu sehen. " + RESET );
		// System.out bietet nach der AnsiConsole.systemInstall die gleichen Funktionalität
		System.out.print( "\u001b[16;10H\u001b[1;37;41m Grundsätzlich brauch man sich also gar keine Variablen für Formatierungen setzen\u001b[m " );
		System.out.print( "\u001b[17;10H\u001b[1;37;41m und kann alle Steuerzeichen händisch eingeben. Variablen sind aber zu empfehlen ;)\u001b[0m " );
		
		Thread.sleep(10000);
		
		// echter CLS Befehl mit mehrfachem Zeile Löschen und erneutem Hochspringen am Ende
		for(int i=0;i<50;i++)
		{
			AnsiConsole.out.println( RESET + DEL);
		}
		AnsiConsole.out.print( CLS + TOP );
		// echter CLS Ende
		
		AnsiConsole.out.println("\n\n" + BOLD + "Choose a menu item with the specified number key" +"\n"+ "or press another key to exit." +"\n\n"+ " >> " + RESET);
		
		try {System.in.read();}catch(Exception e){}
	}
}

In diesem Beispiel nutze ich eigens definierte Variablen mit Ansi Steuercodes und die ansi.cursor() Funktion. Vermutlich bietet Jansi weitere fertig ausprogrammierte Lösungen in Form von Funktionen für Dinge, die ich hier noch manuell gemacht habe (ein richtiges Clear Screen z.B.). Für weitere fertige Lösungen schaut bitte die Jansi Dokumentation durch.

Ausführung in Notepad++:
(Vorbereitung hier) NppExec Plugin installieren, Batch erstellen mit folgendem Inhalt (oder unten downloaden):

Code

Code anzeigenDen Code könnt ihr bequem mit den Links/Rechts Pfeiltasten horizontal bewegen.

@echo off

:: jar(s) specified?
if not [%4]==[] goto jars

:: compile and run without externals jars
if not [%1]==[] javac %1
if not [%2]==[] if not [%3]==[] start cmd.exe /c java -classpath %2 %3

:jars
setlocal enabledelayedexpansion
set /a N=0

:: reads up to 6 externals jars
for /f "tokens=1,2,3 delims=;" %%a in ("%~4") do (
	set /a N+=1
	set j1=%%a
	set j2=%%b
	set j3=%%c
)

set classpath=%~2
set jarpath=%~2
if not [%5]==[] set jarpath=%~5
set jars=.
if not [%j1%]==[] set jars=%jars%;%jarpath%\%j1%
if not [%j2%]==[] set jars=%jars%;%jarpath%\%j2%
if not [%j3%]==[] set jars=%jars%;%jarpath%\%j3%

:: compile and run with external jars
if not [%1]==[] javac -cp "%jars%" %1

if not [%2]==[] if not [%3]==[] start cmd /c ""c:\Program Files\Java\jre7\bin\java" -cp "%jars%;%classpath%" %3"

endlocal

:: usage:

:: just compile
:: executor.bat "C:\Pfad\zur\Javadatei\MeinProgramm.java"

:: compile with 1 external .jar
:: executor.bat "C:\Pfad\zur\Javadatei\MeinProgramm.java" "lib1.jar"

:: compile with 1 external .jar
:: executor.bat "C:\Pfad\zur\Javadatei\MeinProgramm.java" "lib1.jar;lib2.jar"

:: just run java code
:: executor.bat "C:\Pfad\zur\Javadatei\MeinProgramm.java" "C:\Pfad\zur\Javadatei" "MeinProgramm"

:: run java code with one or multiple external jars
:: executor.bat "C:\Pfad\zur\Javadatei\MeinProgramm.java" "C:\Pfad\zur\Javadatei" "MeinProgramm" "lib1.jar"

:: run java code with one or multiple external jars - up to 3 jars supported (change lines 15-28 [if you know batch] for more)
:: usage: executor.bat "C:\Pfad\zur\Javadatei\MeinProgramm.java" "C:\Pfad\zur\Javadatei" "MeinProgramm" "lib1.jar;lib2.jar;jcurse.jar"

:: Notepad++ F6 Code: 
::   NPP_SAVE
::   ?:\path\to\executor.bat "$(FULL_CURRENT_PATH)" "$(CURRENT_DIRECTORY)" "$(NAME_PART)" "one_or_multiple_external.jar"

Batch, .java Code und alle nötigen .jars (jansi.jar in diesem Fall) in ein Verzeichnis, in Notepad++ F6 drücken, folgenden Code (erst anpassen!) einfügen:

NPP_SAVE
t:\Dropbox\Programmierung\Java\executor.bat "$(FULL_CURRENT_PATH)" "$(CURRENT_DIRECTORY)" "$(NAME_PART)" "jansi.jar"

(bei mir liegen also .java, .jar und .bat in T:\Dropbox\Programmierung\Java\)

und dann sollte das funktionieren. Weitere Nutzungshinweise zur executor.bat befinden sich als Kommentar am Ende. Die Batch kann mittlerweile nur kompilieren (ohne und mit jars) und ausführen (ohne und mit jars).
Beachte: javac.exe und java.exe müssen in der Windows Umgebungsvariablen PATH eingetragen sein! siehe Vorbereitungen oder Google.

Demo

Download

executor [.bat]
Farben [.java]
Farben [.class]
jansi [.jar]

Meine ersten Schritte in Java sind getan. Diese beschränken sich noch auf die Textausgabe in einer Konsolenanwendung aber nach „Hello World“ kommt nunmal sowas 😀
Gestern Abend habe ich meine erste Anwendung geschrieben.

Ziel: Sie soll die Nutzung von Unicode Zeichen zum Aufbau einer „Titel Box“ verdeutlichen und dabei den Unterschied zwischen System.out und System.console() hervorheben. Am Ende wird der Aufbau dynamisch abhängig vom beinhalteten Text gestaltet und in einer Funktion verpackt.
Alle Anmerkungen, Hinweise, Links und Quellen stehen im Code.

Code

Code anzeigenDen Code könnt ihr bequem mit den Links/Rechts Pfeiltasten horizontal bewegen.

public class Gruppenmitglieder {

/**
	Author: 	 Hannes Schurig
	Created: 	 6.4.2012 22:16
	Changed: 	 7.4.2012 00:28
	Version: 	 1.1
	Changelog:
		v1.1:	 Code der for-Schleife optimiert
		v1.0:	 Erstellung der GUI mit einer Funktion,
				 Ausgabe aller Namen eines festgelegten Arrays untereinander
	Title: 		 Gruppenmitglieder
	Description: Mein erster Versuch mit Java. Ziel ist die Ausgabe von vielen Namen.
				 Die Ausgabe soll mit nur 1 Schleife und einem Array erfolgen um
				 möglichst flexibel einsetzbar zu sein.
				 Ich ergänze das um einen Titel-Prototyp. Dieser soll dynamisch mit
				 einer Funktion erstellt werden können um ebenfalls flexibel und
				 einfach anwendbar zu sein.
**/

	public static void buildGUI(String text) {
		int length = text.length();
		String slength = String.valueOf(length);

		// Box mit den richtigen Maßen bauen
		System.console().printf("\u2554");
		for(int i=0; i<length; i++) {
			System.console().printf("\u2550");
		}
		System.console().printf("\u2557\n");
		System.console().printf("\u2551"+text+"\u2551 \n");
		System.console().printf("\u255A");
		for(int i=0; i<length; i++) {
			System.console().printf("\u2550");
		}
		System.console().printf("\u255D \n");
	}

	public static void main(String[] args) {
		/**
		   Hat 2 Stunden gedauert das Zusammenspiel des Character Encoding von Windows
		   und Java halbwegs zu verstehen. Die Windows CMD arbeitet mit der alten ANSI
		   Kodierung und System.out verwendet stur diese Systemkodierung.
		   ANSI beinhaltet aber zu wenig schöne Zeichen.
		   Für Extended ASCII und Unicode muss man System.console() nutzen,
		   wenn man nicht die Codepage des Systems vor der Ausführung verstellen
		   möchte (was nicht zu empfehlen ist).
		   System.console() erkennt die benötigte Kodierung automatisch.
		   Quelle: http://bit.ly/Htl3SH

		   BOX_DRAWING Unicode Chars: http://bit.ly/HtlmNb

		   Double Box Codes skizziert:

		   2554 2550 2566 2550 2557

		   2551      2551      2551

		   2560 2550 256C 2550 2563

		   2551      2551      2551

		   255A 2550 2569 2550 255D

		   Mehr? Alle Unicode Characters: http://bit.ly/HtmyjI

		   Let's go!

		**/

		/**
			einfache leere Box
			__________________
		**/
		System.console().printf("Box:\n");

		System.console().printf("\u2554\u2550\u2550\u2550\u2557 \n");
		System.console().printf("\u2551   \u2551 \n");
		System.console().printf("\u255A\u2550\u2550\u2550\u255D \n");


		/**
			breite Box mit wenig Code dank Schleife
			_______________________________________
		**/
		System.console().printf("breite Box:\n");

		// oberer Rand
		System.console().printf("\u2554");
		for(int i=0; i<19; i++) {
			System.console().printf("\u2550");
		}
		System.console().printf("\u2557 \n");

		// Mitte mit Text
		System.console().printf("\u2551 Dies ist ein Test \u2551 \n");

		// unterer Rand
		System.console().printf("\u255A");
		for(int i=0; i<19; i++) {
					System.console().printf("\u2550");
		}
		System.console().printf("\u255D \n");


		/**
			dynamische Boxbreite dank Zeichenzählung
			________________________________________
		**/
		System.console().printf("dynamische Box:\n");

		// gewünschter Boxtext (sollte nicht zu lang sein), Zeichen zählen
		String text = " 6.4.2012  |  Gruppenmitglieder ausgeben  |  Hannes Schurig ";
		int length = text.length();
		String slength = String.valueOf(length);

		// Box mit den richtigen Maßen bauen
		System.console().printf("\u2554");
		for(int i=0; i<length; i++) {
					System.console().printf("\u2550");
				}
		System.console().printf("\u2557\n");
		System.console().printf("\u2551"+text+"\u2551 \n");
		System.console().printf("\u255A");
				for(int i=0; i<length; i++) {
							System.console().printf("\u2550");
				}
		System.console().printf("\u255D \n");

		/**
			Programmieren I: LE01 Übung: Aufgabenblatt 1: Gruppenmitglieder ausgeben
			________________________________________________________________________
		**/
		System.out.println("");
		System.console().printf("Programmieren I: LE01 Übung: Aufgabenblatt 1: Gruppenmitglieder ausgeben:\n");
		System.out.println("");

		// Titel erstellen
		buildGUI(" 6.4.2012  |  Gruppenmitglieder ausgeben  |  Hannes Schurig ");
		System.out.println("");
		System.out.println("");

		// Namen festelegen
		String[] namen = {"Hannes Schurig", "Max Mustermann", "Max Mustermann", "und viele mehr"};

		// sexy Abarbeitung von Arrays mit wenig Code: http://bit.ly/HoeKyp
		for(String s : namen){
			System.console().printf(s+"\n");
		}

		System.out.println("");
		System.out.println("");


		/**
			Farbige Ausgabe war leider nicht so einfach wie gedacht, DOS ist da etwas
			zu alt für. Es gibt portable Ansätze aber die sind mir jetzt zu krass.
			Siehe: http://bit.ly/Htrg0Y
		**/
	}

}

Hinweis: Ich benutze Javadoc Kommentarblöcke (mit 2 Sternen) weil die Blog-Code-Anzeige bei normalen Kommentarblöcken (mit 1 Stern) spinnt. Dient also nur der korrekten Darstellung im Blog.

Ausgabe:

Ziel soll es sein mit Notepadd++ (in Windows) einfache Java Anwendungen schreiben und sie mit einem einfachen Tastendruck testen zu können. Das ganze soll schnell und einfach sein und damit ein ständiges „javac ba.class java bla“ in der Konsole ersparen.

Anmerkung: es geht bei „einfachen Java Anwendungen“ hauptsächlich erstmal um Konsolenprogramme, die in der Windows CMD oder der internet Console des Editors ausgeführt werden soll.

Notepad++ bietet für solche Zwecke die Erweiterung „NppExec“. Sollte die Erweiterung nicht installiert sein ist das schnell über Erweiterungen -> Plugin Manager -> Show Plugin Manager -> NppExec -> Install erledigt. NppExec führt beliebige Befehlszeilen per Tastenkombi aus, speichert diese in Profilen usw.
Ihr könnt F6 drücken oder per Erweiterungen -> NppExec -> Ausführen das Pupup öffnen, in das ihr eure Befehlszeilen eintragen könnt.

2 Möglichkeiten stehen zur Verfügung:

Ausführung innerhalb von Notepad++ in der eigenen Konsole:
F6 Code:
Quelle

NPP_SAVE
javac "$(FULL_CURRENT_PATH)"
java -classpath "$(CURRENT_DIRECTORY)" "$(NAME_PART)"

Das Dokument wird gespeichert, der komplette Pfad wird an den Compiler übergeben, kompiliert und danach mit der java.exe ausgeführt.
Achtung: Damit das funktioniert muss der Java SDK /bin/ Ordner in der Path Umgebungsvariable des Betriebssystems eingetragen sein. Das passiert normalerweise bei der Installation der SDK in Windows automatisch. Ich fand aber auch schon viele Rechner (u.A. 2 von meinen) wo das nicht so war. Testet es, indem ihr aus einem beliebigen Ordner heraus folgende cmd Befehle abfeuert:

Sollte gehen; if not, do this (Neustart oder Ab- und Anmelden danach).

Führt nun den oben stehenden F6 Code aus. Wenn alles funktioniert und in der Konsole des Editors euer Programm erscheint ist alles super.

Wenn auch nach dem Setzen der Umgebungsvariablen mit Neustart noch folgendes Problem in der Konsole auftritt:

javac "T:\Dropbox\Programmierung\Java\TextGUI.java"
CreateProcess() failed with error code 2:
Das System kann die angegebene Datei nicht finden.

… dann geht’s euch wie mir. Ich hab keine Ahnung warum Notepad++ bei mir die javac nicht findet.
Auch ein einfaches javac -version geht nicht. Die normale Windows CMD kann javac aus jedem Ordner heraus finden. Sowohl 32bit als auch 64bit SDK ist installiert, beide Pfade stehen in der Path.

Keine Ahnung, egal, Workaround:

Erstellt eine Batch Datei (ich nenne sie „executor.bat“) irgendwo, folgender Inhalt:

if not [%1]==[] javac %1
if not [%2]==[] if not [%3]==[] start cmd.exe /c java -classpath %2 %3

Die Batch kann mit 1 oder 3 Parametern aufgerufen werden. Bei nur 1 Parameter wird die Java Datei nur kompiliert. Bei 3 Parametern wird sie von der Windows CMD ausgeführt (brauchen wir nur zur externalen Ausführung, siehe unten).

Hier noch den F6 Code:

NPP_SAVE
Pfad\zur\Batch\executor.bat "$(FULL_CURRENT_PATH)"
java -classpath "$(CURRENT_DIRECTORY)" "$(NAME_PART)"

Die Batch kompiliert und der interne Interpreter von Notepad++ führt die Anwendung in der internen Konsole aus.

Ausführung außerhalb von Notepad++ in der Windows CMD:
Auch hier brauchen wir die oben erstellte .bat Datei mit folgendem Inhalt:

if not [%1]==[] javac %1
if not [%2]==[] if not [%3]==[] start cmd.exe /c java -classpath %2 %3

…und folgendem F6 Code:

NPP_SAVE
t:\Dropbox\Programmierung\Java\executor.bat "$(FULL_CURRENT_PATH)" "$(CURRENT_DIRECTORY)" "$(NAME_PART)"

Jetzt müsste sich kurz ein Windows CMD Fenster öffnen und direkt wieder schließen. Denn wie wir wissen schließt sich ein Java Konsolenprogramm (wie auch die Windows Konsole) wenn alle Befehle abgearbeitet sind.
Also lassen wir es am Ende pausieren. Dazu nutzen wir eine Nutzereingabe, die das Konsolenfenster so lange aufhält bis dieser eine Taste drückt.

Ihr müsst zusätzlich java.io.IOException importieren, eurer main Funktion die throws IOException Erweiterung geben und an das Ende 2 Zeilen hängen.
Like that:

import java.io.IOException;
public class TextGUI {
	public static void main(String[] args) throws IOException {
		System.out.println("1234 1234 1234 1234\b9999");
		System.out.println("1234 1234 1234 1234\r9999");
		
		System.out.println("Press Enter to continue...");
		System.in.read();
	}
}

Okay, warum denn jetzt 2 verschiedene Wege? Reicht nicht die interne Konsole oder die externe CMD?
Vielleicht ist es jemanden aufgefallen: die Ausgaben unterscheiden sich trotz selbem Code voneinander.
Die interne Konsole der Editoren (Notepad++ wie auch andere Programme wie Eclipse) behandeln ASCII Steuerzeichen (\b \r \t \n) nämlich anders als die Windows CMD. Wer das wirklich verstehen will muss wohl sowas hier lesen.

Jedenfalls kann es helfen beide Wege zu testen bevor man ein solches Konsolenprogramm freigibt.

Der MSOCache Ordner ist vielen bekannt. Er fasst zwischen 1 und 1,5GB, liegt in der Root der Partition auf der Office installiert wurde und scheint auf den ersten Blick keinen Zweck zu erfüllen. Auf den zweiten Blick enthält der Ordner alle wichtigen Daten für eine Reperatur oder Feature-Erweiterung der bestehenden Office Installation. Man sollte ihn also wenn möglich nicht löschen. Trotzdem kann er, in Zeiten kleiner SSDs, wichtigen Speicherplatz belegen.

Bei Office 2003 gab es das LISTool. Es ermöglichte die Verschiebung oder gar Deaktivierung des MSOCaches. Problem solved.

Für Office 2010 gibt es ein solches Tool jedoch nicht.
Hier ist Handarbeit nöig:

  • Ordner verschieben, z.B. von P:\MSOCache nach T:\MSOCache (muss nicht in der Root bleiben)
  • mit einem Registry Replace Tool (jv16 PowerTools Trial) die komplette Registry nach dem alten Pfad durchsuchen und alle Funde mit dem neuen Pfad ersetzen