In Excel 2010 erleichtert ein Feature das farbige visualisieren von größeren Datenmengen: Farbskalen.
Riesige Zahlenwüsten lassen sich somit etwas beleben und wichtige Informationen direkt erkennen.

Testen wir das ganze an einer fiktiven Datensammlung:

Ziel ist es, die letzten 3 Spalten farbig je nach Inhalt zu verändern. Zeitaufwand: so 2-3 Minuten.

Die Prozentspalte wird berechnet durch aktuelles Kapital / vorheriges Kapital. Es resultiert ein Wert wie 1,12. Durch die Zellformatierung „Prozent“ wird der Wert mit 100 multipliziert und so dargestellt wie man es dort sieht.
Um die Spalte farblich zu verändern markiere ich sie und klicke auf Bedingte Formatierung -> Farbskalen -> Grün-Gelb-Rot-Farbskala. Excel analysiert die Spalte, denkt sich spontan eine halbwegs sinnvolle Regel aus und wendet diese an, die Spalte wird direkt farblich verändert.

Da das vielleicht nicht ganz meinen Vorstellungen entspricht lasse ich die Spalte markiert und gehe auf Bedingte Formatierung -> Regeln verwalten…
Hier sehe ich die Regeln des gerade markierten Bereichs, also der Spalte. Diese Regel bearbeite ich jetzt. Ziel soll es sein, dass 100 Prozent gelb ist, 80 Prozent ein seichtes rot und 120 Prozent ein seichtes grün. Je stärker unter 80 oder über 120, desto stärker wird das rot bzw. grün. Info: Da ich die Zellenformatierung „Prozent“ gewählt habe muss ich hier die Werte 0,8 bis 1,2 verwenden. Denn Zelleninhalte bei der Zellenformatierung Prozent werden mi 100 multipliziert und dargestellt, im Hintergrund ist die 113,39% eigentlich der Zahlwert 1,1339.
Also, den Typ auf „Zahl“ stellen, die Werte eintragen und ggf. Farben anpassen. [Ok] und [Übernehmen] und schon werden die neuen Regeln angewendet.

Okay, beim Kapital reicht eine 2-Farben-Skala. Der niedrigste Wert ist gelb, der höchste Wert grün. Größere Ansammlungen einer Farbe zeigen mir also Stagnation, deutliche Veränderungen des Kapitals fallen also durch deutliche Farbänderungen in benachbarten Zellen auf.
Dazu markiere ich also wieder die Spalte und wähle Bedingte Formatierung -> Farbskalen -> Grün-Gelb-Farbskala.

Die neue Spalte „Ist das gut?“ füllt die Zelle mit „Ja“, wenn der Wert aus der Prozentspalte über 1 liegt. In Excel also

=WENN(UND(J3>=1);"Ja";"Nein")

Mit Bedingte Formatierung -> Regeln zum Hervorheben von Zellen -> Textinhalt weise ich Excel an die „Ja“ und „Nein“ Zellen farblich zu verändern (2 Regeln also).

Wem das noch nicht zu bunt ist: die Prozente lassen sich auch noch mit Symbolen verdeutlichen. Markieren, Bedingte Formatierung -> Symbolsätze -> 3 Pfeile (farbig). Dann Regeln bearbeiten, diese Regel bearbeiten und die Werte nach eigenem ermessen ändern.

So, um alle angewendeten Regeln zu sehen können wir, ohne etwas zu markieren, in den „Regeln bearbeiten…“ Dialog gehen und „Formatierungsregeln anzeigen für: Dieses Arbeitsplatt“ auswählen.

Sehr einfach, sehr schnell, sehr geil. Aber nach den guten alten Regeln der Präsentation bitte nicht zu intensiv nutzen 😉

Download section
Farbskalen [.xlsx]

In den letzten Tagen habe ich auf Arbeit ein Upgrade von SPSS 17 auf SPSS 20 vorbereitet und vorgestern durchgeführt.
Die Verteilung erfolgte mit Gruppenrichtlinien über ein Active Directory auf etwa 120 Windows Clients (98,4% Windows 7).
Deployments dieser Größenordnung müssen ausführlich durchdacht und sorgfältig umgesetzt werden. An viele Dinge muss man denken bevor der Tag der Verteilung anbricht.

Zu diesem Zweck habe ich eine Präsentation vorbereitet, die die Herangehensweise und Durchführung einer Softwareverteilung, in diesem Beispiel SPSS 20, grob veranschaulicht. Die wichtigsten Schritte werden angeschnitten, jedoch nicht weiter vertieft, da dies natürlich den Rahmen sprengen würde.
Videos und Screenshots veranschaulichen einige Vorgehensweisen.

Download section
Präsentation ohne Videos: SPSS20-Deployment-om [.zip] (500KB)
Präsentation mit Videos: SPSS20-Deployment-mm [.zip] (110MB)

Zeit messen ist mit Batch kein Problem und oftmals eine nette Spielerei.

Code:

set /a timerstart=((1%time:~0,2%-100)*60*60)+((1%time:~3,2%-100)*60)+(1%time:~6,2%-100)
REM packing zip archive
%wd%\7za.exe a -bd -ssw "%job-ziel%.zip" "%job-quelle%" > nul
set /a timerstop=((1%time:~0,2%-100)*60*60)+((1%time:~3,2%-100)*60)+(1%time:~6,2%-100)
set /a timeseks=(%timerstop%-%timerstart%)
set /a timemins=(%timerstop%-%timerstart%)/60
echo Sekunden: %timeseks% -- Minuten: %timemins%

Erläuterung:
Also, timerstart nimmt die aktuelle Uhrzeit und rechnet aus, wieviele Sekunden seit 00:00 Uhr verstrichen sind.
Der 2. Timer, timerstop, rechner ebenfalls die Sekunden seit 00 Uhr aus. Zieht man diese jetzt von der Startzeit ab so bleibt die Anzahl in Sekunden übrig, die zwischen den Timern verstrichen ist.
Das bedeutet natürlich auch, dass eine Zeitberechnung von einem Tag in den nächsten nicht funktioniert. Start und Stop müssen zwischen 00 Uhr und 23:59 Uhr des selben Tages liegen.

Details zu dieser Art der Zeitmessung:
Diese Berechnung ist bereits eine optimierte Variante. Grundsätzlich würde in 80% der Fälle auch

set /a timerstart=((%time:~0,2%)*60*60)+((%time:~3,2%)*60)+(%time:~6,2%)

funktionieren; diese Variante findet man auch überall im Netz.
Ich beobachtete jedoch Probleme bei Zeitberechnungen, wenn mit den Zahlen „08“ und „09“ hantiert wurde.
Also beispielsweise um 16:08:09 Uhr wird ein Timer aktiviert. Dann rechnet dieser eigentlich
((16)*60*60)+((08)*60)+(09)
Batch kommt damit aber nicht klar, da er dezimale Zahlen und oktale Zahlen durcheinander bringt. Um trotzdem mit Uhrzeiten mit „08“ und „09“ rechnung zu können habe ich die Zeile ergänzt:

set /a timerstart=((1%time:~0,2%-100)*60*60)+((1%time:~3,2%-100)*60)+(1%time:~6,2%-100)

Nun wird also bei 16:08:09 gerechnet:
((116-100)*60*60)+((108-100)*60)+(109-100)
Funktioniert 🙂

Update:
Eine etwas komplexere Lösung mit der Berücksichtigung des Datums wurde von einem Leser via Kommentar eingereicht:

@echo off

REM dynamisch mit %TIME% oder Zahlenformat des endtime Beispiels nehmen
set starttime=%TIME%
set endtime=00:15:26,92
set startdate=08.09.2012
set enddate=09.09.2012

REM einstellige Uhrzeiten korrigieren
set starttime=%starttime: =%
set endtimehh=%endtime:~1,1%
if ‘%endtimehh%’ == ‘:’ set endtime=0%endtime%
echo endtime: %endtime%

set starttimehh=%starttime:~1,1%
if ‘%starttimehh%’ == ‘:’ set starttime=0%starttime%
echo starttime: %starttime%

set /a timerstart=((1%starttime:~0,2%-100)*60*60)+((1%starttime:~3,2%-100)*60)+(1%starttime:~6,2%-100)
echo timerstart: %timerstart%

set /a daymodifier=86400*((1%enddate:~0,2%)-(1%startdate:~0,2%))
rem set daymodifier=86400
echo daymodifier: %daymodifier%

set /a timerstop=(((1%endtime:~0,2%-100)*60*60)+((1%endtime:~3,2%-100)*60)+(1%endtime:~6,2%-100))+%daymodifier%
echo timerstop: %timerstop%

rem =======================

set /a timeseks=(%timerstop%-%timerstart%)
echo Sekunden: %timeseks%

set /a timemins=((%timerstop%-%timerstart%)/60)
echo Minuten: %timemins%

set /a timeminsseks=((((%timerstop%-%timerstart%)/60)*60)-(%timerstop%-%timerstart%))*-1
echo Zeit: %timemins%:%timeminsseks%

pause

Auf der rechten Seite bei Facebook gibt es 3 recht nervige Container: “Personen, die du vielleicht kennst”, “Gesponsort” und “Personen, deren Aktualisierungen du abonnieren kannst”. Diese Bereiche sind meiner Meinung nach sinnlos, warum also nicht entfernen?
Adblock, was jeder im Browser installiert haben sollte, kann diese Aufgabe schnell und einfach übernehmen:

Chrome: Rechtsklick auf das Adblock Icon -> „Optionen“ -> „Eigene Filter“ -> auf [Bearbeiten] klicken und in das Textfeld

##div#pagelet_ego_pane_m
##div#pagelet_ego_pane
##div#MessagingNetegoSidebar

eintragen.

Firefox: Adblock Plus Preferences -> Filters -> Add Filter ->

##div#pagelet_ego_pane_m
##div#pagelet_ego_pane
##div#MessagingNetegoSidebar

eintragen.

Zur Erklärung:

##div#pagelet_ego_pane_m

versteckt die 3 unnötigen Anzeigen auf der Facebook Startseite.

##div#pagelet_ego_pane

versteckt die 3 unnötigen Anzeigen auf allen Profilseiten.

##div#MessagingNetegoSidebar

versteckt diese Elemente auf den „Nachrichten“-Seiten.
Auf der Startseite verbleiben weiterhin die Anzeigen für Veranstaltungen und Anstupser. Wer auch diese entfernen will kann auch noch

##div#pagelet_eventbox
##div#pagelet_pokes

ergänzen.

Fertig, den Kram seht ihr nicht mehr wieder (außer die ID wird umbenannt) 🙂

Ich hatte letztens mal drüber geschrieben: mit erweiterten Stringoperationen kommt man leicht an Dateinamen, Endung, Ordner, Pfade, Dateieigenschaften und Ähnliches.

Ich möchte gerne die Aussagen und den Code korrigieren. Ich hatte folgendes vorgeschlagen:
Dieser Code ist unsicher, lest weiter unten für einen zuverlässigeren Code!

:: nur der Dateiname (ohne .ext)
for %%a in (C:\test\geheim.txt) do set 1=%%~na
:: -> geheim
:: funktioniert auch mit Ordnern
for %%a in (C:\test\ziemlich\geheim) do set 1=%%~na
:: -> geheim

Letzte Datei und Ordner lassen sich so herausfinden. Ist auch korrekt, hat aber 2 Fehlerpotentiale:

Man sollte natürlich den Pfad, den man auswertet, in Gänsefüße stecken! Ansonsten gibt es nämlich Fehler sobald der gesuchte letzte Part (Dateiname/Ordnername) ein Leerzeichen enthält. Bei erweiterten Stringoperationen mit FOR sollte man doppelte Gänsefüße verwenden obwohl man sonst ja bei FOR Befehlen einfache nutzen sollte. Hier kommt es teilweise aber vor, dass im Ergebnis ein einfaches mit reingerät (“ geheim‘ „), was nicht gewollt ist. Doppelte Anführungsstriche sind hier zuverlässiger.

Ebenfalls wird es problematisch wenn man den letzten Ordnernamen sucht und dieser aber ein Punkt enthält („C:\Windows 3.1\“). For erkennt den Punkt und denkt, dass es sich um eine Datei handelt. Also gibt der Befehl „Windows 3“ zurück, dabei soll es „Windows 3.1“ zurückliefern.

Lösung:

:: Datei mit Anführungsstrichen und %%~n suchen!
for %%a in ("C:\test\geheim.txt") do set 1=%%~na
:: -> geheim
:: den letzten Ordner immer mit Anführungsstrichen und %%~nx suchen!
for %%a in ("C:\test\ziemlich\geheim 9.1") do set 1=%%~nxa
:: -> geheim

Intro

Ziel soll es sein, mittels eines „Batch Ping Skripts“ die Erreichbarkeit eines Server/Clients zu testen. Dabei wird der Ping-Befehl benutzt, welcher mit Hilfe von ICMP-„Echo Request“-Paketen ein Netzwerkgerät kontaktiert und für gewöhnlich eine Antwort von diesem erhält. Die Antwort kann dann in Form von errorlevel automatisiert ausgewertet werden um die Erreichbarkeit anzugeben. Aber: Beim Batch Erreichbarkeits-Test mittels Ping gibt es Details, die beachtet werden müssen – der errorlevel kann trügen.

Technische Hintergründe

Die normale ICMP-Anfrage via CMD kann 3 verschiedene Ergebnisse erzeugen:
Normaler ping ohne Parameter von 192.168.178.20 zu 192.168.178.88:
Zeitüberschreitung der Anforderung“ – der Client antwortet nicht und keine andere Vermittlungsstelle reagiert. Der Errorlevel ist 1.
Antwort von 192.168.178.13: Zielhost nicht erreichbar.“ – der Ziel-Client antwortet nicht aber eine andere Gegenstelle reagiert. Gateway, Router, Switch o.Ä. melden, dass dieser Client zwar im Netzwerk gefunden wird aber auf den Ping nicht reagiert, ihn nicht auflösen kann oder etwas in der Art. Der Errorlevel ist 0! Obwohl der Ziel-Client nicht erreichbar ist wird der Rückgabewert 0 für erfolgreich zurückgeliefert.
Antwort von 192.168.178.88: Bytes=32 Time<1ms TTL=128“ – die Ziel-Client ist erreichbar, der Errorlevel ist 0.

Lösung – Code

Möchte man die tatsächliche Erreichbarkeit des Ziel-Clients erfassen, ist folgender Weg nötig:

REM Aufteilen der IP für bessere Automatisierung mehrerer Clients eines Netzes
set ipnetz=192.168.178
set serverip=88
ping %ipnetz%.%serverip% -n 2 -w 1000 -l 2000
if %errorlevel%==1 echo Fehler

Mit -l wird die Größe des Ping Pakets bestimmt, -w bestimmt die Wartezeit in Millisekunden. Beide Parameter in Kombination sorgen dafür, dass der Ping nur noch eine Zeitüberschreitung oder einen Erfolg liefern kann. Das Verwenden von Errorlevel ist somit also sicher.

Alternative:

ping  %server_ip% -n 1 -w 1000 -l 2000 -4 | find /i "TTL" >nul 2>&1
if errorlevel 1 (
echo Server offline
) else (
echo Server online
)

via Kommentar von Gerd – funktioniert ebenfalls zuverlässig, optimiert mit dem -4 Parameter, danke Rudolph.
batch-ping-erreichbarkeit-online-test-script


Update: Überlegung: 2000 Byte Pakete mit einem maximalen Zeitlimit von 1000 Millisekunden… dadurch ist zwar ein Ping bei 2 gut angebundenen Clients entweder erfolgreich oder komplett nicht erfolgreich. Was passiert aber mit 2 sehr langsamen Clients? Wenn der Zielhost eigentlich erreichbar wäre aber es in 1 Sekunde nicht schafft auf das 2KB Ping Paket zu antworten. Wäre das dann ebenfalls negativ? Eine solche Situation ist wohl eher nicht üblich, wenn nicht sogar recht unwahrscheinlich, aber rein logisch könnte sie Probleme bereiten. Wer dazu Anmerkungen hat, bitte kommentieren!

Die Windows 8 Developer Preview ist Englisch. Coole Sache, allerdings bei Tastatureingaben hört der Spaß auf. So stellt man das Tastaturlayout auf Deutsch und ermöglicht auch die deutsche Touch Tastatur.

Control Panel -> More Settings -> Change Keyboards and other input methods -> Add a language -> [G]ermany (2x auswählen) -> (Germany anklicken) Move Up -> Advanced Settings

„Text input options“ -> German
Touch keyboard -> [X] „Enable the compatibiity touch keyboard“

Nun ist die deutsche Tastatur eingestellt und man kann auch die Layouts in der Touch Tastatur via Button wechseln.