Jeder weiß sicher, dass ein regelmäßig Backup vom Blog Gold wert ist. Das kann aber durchaus etwas Zeit kosten, wenn man das von Hand macht, jedes Mal aufs Neue.
Eine Möglichkeit, bequem mit vielen Features ein FTP Backup zu machen wäre mit SyncBack (Freeware).

Installiert die Software, erstellt ein neues Synchronisierungs-Profil und aktiviert den Expertenmodus per Klickt auf [Experte] neben [OK].
Geht in den „FTP“ Tab, klickt die Checkbox und tragt eure FTP Server Daten ein. Ein Klick auf [FTP-Einstellungen testen] bestätigt, dass die Eingaben korrekt sind. Eventuell wollt ihr auch noch die Werte bei Timeout und Verbindungsversuchen anpassen.

Klickt nun auf das Durchsuchen Symbol neben dem „Ziel“ Eingabefeld. Bestätigt, dass ihr eine Verbindung aufbauen wollt und schaut euch die Anzeige an. Das sollte jetzt der Inhalte eures FTP Servers sein. Wählt nun den Ordner aus, den ihr sichern wollt.
Bei der Quelle nutzen wir jetzt eine dynamische Angabe, damit nicht immer in das selbe Verzeichnis gesichert wird. Dazu nutzen wir die Systemvariable %date%, die immer das aktuelle Datum (z.B. „15.06.2010“) zurückgibt.
C:\Webserver-Backup\%date%\ ist also meine Quelle. Startet das SyncBack Profil so wird ein neuer Ordner mit dem Datum als Namen erstellt und alles dort reinkopiert.

Geht nun in den „Filter“ Tab und tragt ein paar Masken ein, die bei der Synchronisierung ignoriert werden sollen. Das bietet sich bei jeglicher Art von Logfiles an, wenn ihr die nicht sichern wollt, bei temporären Dateien wie die vom Global Translator (gt-cache) oder wenn ihr einen Downloadordner im FTP habt, in dem viele große Dateien liegen. Ihr könnt auch erstmal 2, 3 Backup Testläufe machen um eventuelle Problemkandidaten zu finden. Ist auch etwas Geschmackssache.

So, letzte Einstellung vorerst: „Weitere Einstellungen“ Tab bietet euch einen Zeitplan an. Aktiviert diesen, ggf. müsst ihr die Meldung „Windows XP erlaubt keine leeren Passwörter im Taskplaner. […]“ bestätigen. Nun wird in eurem Taskplaner eine Verknüpfung zu dem SyncBack Job erstellt. Wie das Popup vorher schon erwähnt: setzt euer Passwort neben eurem Nutzernamen mit [Kennwort festlegen].
Im Karteireiter „Zeitplan“ stellt ihr die gewünschte Regelmäßigkeit ein und auch der Reiter „Einstellungen“ ist nicht uninteressant.

Das wars!

Ein typisches und ebenso simples Junior-Administrator-Problem. Welche .NET Framework Version ist installiert, wie kann ich die Version ermitteln?

Batch-File:
Download section
netversioninfo.bat liest eure installierten .NET Versionen aus und gibt zu jeder (exakten) Version noch einige Informationen aus. Getestet mit WinXP, Win7, .NET 3.5 und .NET 4, funktioniert einwandfrei.
Credits, Code, Erklärungen und .NET Versionsinfos von hier.

Update:
Das grafisch hübschere Tool DotNet (.NET) Version Check tuts auch, allerdings nicht ganz so genau wie das Batch Script oben. Z.B. wird das Framework 3.5 nicht erkannt, statt dessen werden aber alle Major Buildnummer angezeigt, ebenfalls auf allen Systemen und bis Version 4. Ich erfahrt sogar ob/welche Version der ADODB Library und des Internet Explorers installiert ist, Nutzen sei mal dahingestellt.


Registry:
Start -> Ausführen -> regedit ->

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP

Hier sind eure Versionen gelistet. Per Klick auf einen Schlüssel erfahrt ihr sogar die genaue Version.

Dateibasiert:

C:\Windows\Microsoft.NET\Framework\

Das Verzeichnis existiert, wenn .NET Framework installiert ist. Es enthält einige Unterordner, die auf die ungefähre Version des Frameworks hinweisen.
In diesen Unterordnern existiert u.U. auch eine MSBuild.exe. Die Dateiversion dieser Datei entspricht der exakten Version eures Frameworks und ist an der Stelle auch sehr genau hinterlegt.


Noch eine Möglichkeit:
Diese Variante ist eher alt, also mehr für die Info, ob .NET Framework überhaupt installiert ist.
Start -> Ausführen -> regedit ->

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\

In dem Schlüssel „.NETFramework“ befinden sich weitere Schlüssel, z.B. „v2.0.50727“, „v3.0“.


Für die ganz Harten im Garten gibts hier ausführliche Details zu C++ Code, mit dem ihr die .NET Versionen auslesen könnt.

Eine kleine Zusammenfassung von Möglichkeiten und Links auch auf dieser Seite nochmal.

*hüpf*
*fang*

Nuuun, was ich hier in der Hand halte ist das Stöckchen von Kenny.
Es geht um die 100 „erfolgreichsten“ Filme. Wobei ich schon allein auf grund dieser Aussage Gänsehaut kriege. Die „erfolgreichsten“ Filme nach Gewinneinspielung zu sortieren ist eigentlich Schwachsinn. Darüber kann man viel lesen und diskutieren. Aber klar mach ich mit, zumal ich aus der inflationsbereinigten Topfilmliste nicht ganz so viele kenne 🙂

Also die Filme, die ich kenne, sind fett gedruckt.

  1. Avatar – Aufbruch nach Pandora 2009 James Cameron
  2. Titanic 1997 James Cameron
  3. Der Herr der Ringe – Die Rückkehr des Königs 2003 Peter Jackson
  4. Pirates of the Caribbean – Fluch der Karibik 2 2006 Gore Verbinski
  5. The Dark Knight 2008 Christopher Nolan
  6. Harry Potter und der Stein der Weisen 2001 Chris Columbus
  7. Pirates of the Caribbean – Am Ende der Welt 2007 Gore Verbinski
  8. Harry Potter und der Orden des Phönix 2007 David Yates
  9. Harry Potter und der Halbblutprinz 2009 David Yates
  10. Der Herr der Ringe – Die zwei Türme 2002 Peter Jackson
  11. Star Wars Episode 1 – Die dunkle Bedrohung 1999 George Lucas
  12. Shrek 2 – Der tollkühne Held kehrt zurück 2004 Andrew Adamson, Kelly Asbury, Conrad Vernon
  13. Jurassic Park 1993 Steven Spielberg
  14. Harry Potter und der Feuerkelch 2005 Mike Newell
  15. Spider-Man 3 2007 Sam Raimi
  16. Ice Age 3 2009 Carlos Saldanha, Mike Thurmeier
  17. Harry Potter und die Kammer des Schreckens 2002 Chris Columbus
  18. Der Herr der Ringe – Die Gefährten 2001 Peter Jackson
  19. Findet Nemo 2003 Andrew Stanton
  20. Star Wars Episode 3 – Die Rache der Sith 2005 George Lucas
  21. Transformers – Die Rache 2009 Michael Bay
  22. Spider-Man 2002 Sam Raimi
  23. Independence Day 1996 Roland Emmerich
  24. Shrek der Dritte 2007 Chris Miller
  25. Krieg der Sterne 1977 George Lucas
  26. Harry Potter und der Gefangene von Askaban 2004 Alfonso Cuaron
  27. E.T. – Der Außerirdische 1982 Steven Spielberg
  28. Der König der Löwen 1994 Roger Allers, Rob Minkoff
  29. Indiana Jones und das Königreich des Kristallschädels 2008 Steven Spielberg
  30. Spider-Man 2 2004 Sam Raimi
  31. 2012 2009 Roland Emmerich
  32. The Da Vinci Code – Sakrileg 2006 Ron Howard
  33. Die Chroniken von Narnia – Der König von Narnia 2005 Andrew Adamson
  34. Matrix Reloaded 2003 Andy & Larry Wachowski
  35. Oben 2009 Pete Docter, Bob Peterson
  36. Transformers 2007 Michael Bay
  37. New Moon – Biss zur Mittagsstunde 2009 Chris Weitz
  38. Forrest Gump 1994 Robert Zemeckis
  39. Ich weiß, geiler Klassiker. Wird schon bald mit „Täglich grüßt das Murmeltier“ nachgeholt. Hab mich bis jetzt irgendwie noch nicht dazu überreden können.

  40. The Sixth Sense 1999 M. Night Shyamalan
  41. Fluch der Karibik 2003 Gore Verbinski
  42. Ice Age 2 2006 Carlos Saldanha
  43. Star Wars Episode 2 – Angriff der Klonkrieger 2002 George Lucas
  44. Kung Fu Panda 2008 Mark Osborne, John Stevenson
  45. Die Unglaublichen 2004 Brad Bird
  46. Hancock 2008 Peter Berg
  47. Ratatouille 2007 Brad Bird
  48. Vergessene Welt – Jurassic Park 1997 Steven Spielberg
  49. Die Passion Christi 2004 Mel Gibson
  50. Mamma Mia! 2008 Phyllida Lloyd
  51. Madagascar 2 2008 Eric Darnell, Tom McGrath
  52. 007 – Casino Royale 2006 Martin Campbell
  53. Krieg der Welten 2005 Steven Spielberg
  54. Men in Black 1997 Barry Sonnenfeld
  55. 007 – Ein Quantum Trost 2008 Marc Forster
  56. I Am Legend 2007 Francis Lawrence
  57. Iron Man 2008 Jon Favreau
  58. Nachts im Museum 2006 Shawn Levy
  59. Mission: Impossible 2 2000 John Woo
  60. Armageddon 1998 Michael Bay
  61. King Kong 2005 Peter Jackson
  62. WTF King Kong aus 2005?? Wo war ich in dem Jahr, dass ich das nicht mitbekommen hab. Oder ich hab den Trailer damals schon so schlecht gefunden wie gerade und den Film wieder vergessen. Sieht aus wie schlechtes „Jurassic Park“ mit etwas „Liga der außergewöhnlichen Gentlemen“, angehaucht von „Planet der Affen“. Soll aber King Kong sein… *yawn*

  63. The Day After Tomorrow 2004 Roland Emmerich
  64. Das Imperium schlägt zurück 1980 Irvin Kershner
  65. Wall-E – Der Letzte räumt die Erde auf 2008 Andrew Stanton
  66. Kevin – Allein zu Haus 1990 Chris Columbus
  67. Madagascar 2005 Eric Darnell, Tom McGrath
  68. Die Monster AG 2001 Pete Docter
  69. Die Simpsons 2007 David Silverman
  70. Ich hab nach der Hälfte des Film ausgemacht, war nicht so meins.

  71. Terminator 2 – Tag der Abrechung 1991 James Cameron
  72. Ghost – Nachricht von Sam 1990 Jerry Zucker
  73. Hey! Kenn ich nicht obwohl der Trailer cool aussieht, erinnert mich an „Solange du da bist“ *hach schmacht* …

  74. Meine Frau, ihre Schwiegereltern und ich 2004 Jay Roach
  75. Aladdin 1992 John Musker, Ron Clements
  76. Troja 2004 Wolfgang Petersen
  77. Twister 1996 Jan De Bont
  78. Indiana Jones und der letzte Kreuzzug 1989 Steven Spielberg
  79. Illuminati 2009 Ron Howard
  80. Toy Story 2 1999 John Lasseter
  81. Bruce Allmächtig 2003 Tom Shadyac
  82. Shrek – Der tollkühne Held 2001 Andrew Adamson, Vicky Jenson
  83. Der Soldat James Ryan 1998 Steven Spielberg
  84. Mr. & Mrs. Smith 05 Doug Liman
  85. Die Rückkehr der Jedi-Ritter 1983 Richard Marquand
  86. Charlie und die Schokoladenfabrik 2005 Tim Burton
  87. Gladiator 2000 Ridley Scott
  88. Der weiße Hai 1975 Steven Spielberg
  89. Hangover 2009 Todd Phillips
  90. Mission: Impossible 1996 Brian De Palma
  91. Pretty Woman 1990 Garry Marshall
  92. Cars 2006 John Lasseter
  93. Matrix 1999 Andy & Larry Wachowski
  94. X-Men – Der letzte Widerstand 2006 Brett Ratner
  95. Das Vermächtnis des geheimen Buches 2007 Jon Turteltaub
  96. Last Samurai 2003 Edward Zwick
  97. Tarzan 1999 Kevin Lima, Chris Buck
  98. 300 2007 Zack Snyder
  99. Ocean’s Eleven 2001 Steven Soderbergh
  100. Pearl Harbor 2001 Michael Bay
  101. Men in Black II 2002 Barry Sonnenfeld
  102. Sherlock Holmes 2009 Guy Ritchie
  103. Das Bourne Ultimatum 2007 Paul Greengrass
  104. Mrs. Doubtfire – Das stachelige Kindermädchen 1993 Chris Columbus

Hatte ich erwähnt, dass ich damals nen ziemlicher Filmfreak war?
Also wenn Notepad das richtig gezählt hat kenne ich 88% der Liste. Hab versucht zu zählen, wieviele der Filme ich besitze aber im Kopf nicht so einfach. Ich denke aber, dass mindestens die Hälfte davon in meinem Besitz ist. Nicht umsonst, sind immerhin die 100 besten Filme 🙂

So, nun noch schnell den Ast hier (der Beitrag hat mich tatsächlich etwas Zeit gekostet) zu Matthias, Jeffrey und Martin geworfen!

Jetzt funktioniert der Passwortstärke Analyzer endlich so, wie er soll. Ein Fix von Ahmet hat das Problem behoben, dass die Passwortüberprüfung nach Anzeigen/Verstecken des Passworts beendet hat.

Details:
Jetzt gibt es 2 Eingabefelder, 1 ist jeweils versteckt. Ein Feld ist vom Typ password und eins vom Typ text. Denn durch das Ersetzen des Eingabefeldes mit

replaceWith()

oder

html()

ist auch automatisch der Link zu den Events verloren gegangen. Das Problem wird damit behoben, guter Gedankengang.
Ich sehe das trotzdem als Manko schließlich kann ich mir viele Situationen vorstellen wo viel HTML Inhalt ersetzt werden muss, danach diese eingesetzten Inhalte aber dynamisch verlinkt sein müssen. Ich glaube über diese Thematik werde ich noch öfter stolpern. 🙂
Ich hab den Code entsprechend mit Credits versehen.

Neuer Codeanfang der passwort.js:

$(document).ready(function()  {
$("input[type=checkbox]:first").change(function(){
	/* Made by Ahmet Topal
	* http://basicblogger.de/
	*/
	var nopw = $("#passwrap input:not(.pw)").attr('id');
	var pw = $("#passwrap input.pw").attr('id');
	$("#"+nopw).addClass('pw').fadeIn(0);
	$("#"+pw).removeClass('pw').fadeOut(0);
});
	
$("#passwrap input").keyup(function() {
	/* Made by Ahmet Topal
	* http://basicblogger.de/
	*/
	var passtemp = $('#passwrap input.pw').val();
	$("#passwrap input:not(.pw)").val(passtemp);
		
	ratePW();
});

Auch die .css und .html haben sich leicht verändert, bitte beachten!

So, mein letzter Post ist ohne Beispiel gekommen. Das hatte den Grund, dass ich noch einen Bug in dem Tool war.
Das „Passwort anzeigen“ unterbricht die Analyse Funktion. Einmal betätigt wird das Passwort nicht weiter bewertet. Das hat sicher mit dem Austausch des HTML Inhalts zu tun. Ich habe bereits

html()

und

replaceWith()

probiert. Denke mal ich brauche da eine ganz andere Herangehensweise. @Ahmet, noootfalls nehme ich das showPassword Plugin 😉

Soo, ich habe es nicht gefixt bekommen bis jetzt 😀
Egal, hier ist es: jQuery Passwortstärke Analyzer

Ich habe einen jQuery Passwortstärke Analyser programmiert. Dieser ist natürlich sehr basic und der Code alles andere als optimal oder perfekt. Ich kriege selber Gänsehaut wenn ich ihn sehe. Man könnte so viel Code kürzern, modularisieren, verbessern, auslagern; so viel Design aufhübschen, interaktiver machen und so weiter. Aber die Zeit hab ich einfach jetzt nicht.
Ich empfehle also natürlich professionelle Plugins dieser Art. Den Code zeige ich rein aus informativen und lerntechnischen Gründen.

Wenn ich mal Zeit habe dann würde ich sicherlich probieren, meine Features in etwa wie hier auszubauen. Ein Großteil davon hat sich an 1, 2 Tagen aber nicht realisieren lassen.

Hier der Code und darunter die Erklärung einzelner Zeilen:

Update 05.06. – es gibt mittlerweile eine verbesserte Version 1.2 des Tools, bitte also den neuen Code aus diesem Post beachten!

$(document).ready(function() 
{
$("input[type=checkbox]:first").change(function(){
if($("#passwort").is('.pw')) {
	var passtemp = $("#passwort").val();
	$("#passwrap").replaceWith('<div id="passwrap"><input type="text" id="passwort" class="text" size="30" maxlength="30" /></div>');
	$("#passwort").val(passtemp);
} else {
	var passtemp = $("#passwort").val();
	$("#passwrap").replaceWith('<div id="passwrap"><input type="password" id="passwort" class="pw" size="30" maxlength="30" /></div>');
	$("#passwort").val(passtemp); 
}
});
	
$("#passwort").keyup(function() {
	ratePW();
});

function runde(zahl) {
  var rzahl = (Math.round(zahl * 10) / 10).toString();
  rzahl += (rzahl.indexOf('.') == -1)? '.0' : '0';
  return rzahl.substring(0, rzahl.indexOf('.') + 2);
}

function ratePW() 
{
var strength = 0,
klein = 0,
cap = 0,
zahl = 0,
zeichen = 0;

var passlength = $("#passwort").val().length;
var input = $("#passwort").val();

$("#length").text("Passwortlänge: "+passlength+" Zeichen");
	
for(var i=0,l=passlength;i<l ;i++)
{
var x = input.charCodeAt(i);
if ( x >= 97 && x < = 122 ) {
	klein += 1;
	if ( klein > 4 ) {
		strength += 0.2;
	} else {
		strength += 1;
	}
	} else if ( x >= 65 && x < = 90 ) {
		cap += 1;
		if ( cap > 4 ) {
			strength += 0.6;
		} else {
			strength += 2;
		}
		} else if ( x >= 48 && x < = 57 ) {
			zahl += 1;
			if ( zahl > 4 ) {
				strength += 1;
			} else {
				strength += 3;
			}
			} else if ( x >= 32 && x < = 47 || x >= 123 && x < = 126 || x >= 91 && x < = 96 || x >= 58 && x < = 64  ) {
				zeichen += 1;
				if ( zeichen > 4 ) {
					strength += 2;
				} else {
					strength += 4;
				}
				} else {
					alert("Fehler");
					}
}

var rstrength = runde(strength);
$("#strength").text("Passwortstärke: "+rstrength);
if (rstrength == 0.0) { 
	$("#cover").css({'width':'208px','left':'1px'});
	} else if (rstrength > 0.0 && rstrength < = 4.0) {
		$("#cover").css({'width':'173px','left':'35px'});
		} else if (rstrength > 3.0 && rstrength < = 8.0) {
			$("#cover").css({'width':'139px','left':'69px'});
			} else if (rstrength > 6.0 && rstrength < = 12.0) {
				$("#cover").css({'width':'105px','left':'103px'});
				} else if (rstrength > 9.0 && rstrength < = 16.0) {
					$("#cover").css({'width':'71px','left':'137px'});
					} else if (rstrength > 12.0 && rstrength < = 20.0) {
						$("#cover").css({'width':'37px','left':'171px'});
						} else if (rstrength > 15.0) {
							$("#cover").css({'display':'none'});
							} 
};	
}); //$(document).ready

Zeile 3:
Das Ändern einer Checkbox lässt sich mit

.change()

ganz leicht abfangen, hier wird die Checkbox durch eine ID identifiziert:

$("#hide").change(function() {

Man könnte auch

$("input[type=checkbox]:first").change

nehmen; wie immer führen viele Wege nach Rom,

.change()

ist jedenfalls an dieser Stelle perfekt um Buttons aus dem Weg zu gehen.

Zeile 4:
Prüfen, ob ein Element eine Klasse besitzt.

is()

bietet sich da an.

if($("#passwort").is('.pw')

Zeile 5:

.val()

fragt den Inhalt eines Elements ab, Inhalt auslesen. Mit

.val("bla")

(Zeile 7) kann man den Inhalt setzen.

var passtemp = $("#passwort").val();

Zeile 6:

replaceWith()

ersetzt den Knoten, der angesprochen wird mitsamt Inhalt mit dem neuen Inhalt. Wird

replaceWith()

auf einen Tag mit ID angewendet so verschwindet auch der Tag mit der ID. Daher habe ich in den neuen Inhalt diesen Tag mit drin.

$("#passwrap").replaceWith('<div id="passwrap"><input type="text" id="passwort" class="text" size="30" maxlength="30" /></div>');

Ich glaub das könnte man mit

append()

,

html()

oder anderen inhaltsverändernden Funktionen eleganter lösen aber mein Beispiel ging in meinem Kopf am schnellsten umzusetzen, bei anderen Methoden hätte ich erstmal nochmal lesen müssen ^^

Zeile 15-17:
Beim Tastendruck im Textfeld mit der ID passwort wird die Funktion

ratePW()

ausgeführt.

$("#passwort").keyup(function() {
	ratePW();
});
.keydown()

und

.keypress()

sind hier nicht geeignet. Testet mal aus, wie es sich dann verhält.

Zeile 19-23
Das Runden einer Zahl, in diesem Fall auf 1 Nachkommastelle. Full Credits an die Herren hier, denn von dort habe ich den Code geklaut. Hatte nicht die Nerven das selber zu schreiben. Danke 🙂

function runde(zahl) {
  var rzahl = (Math.round(zahl * 10) / 10).toString();
  rzahl += (rzahl.indexOf('.') == -1)? '.0' : '0';
  return rzahl.substring(0, rzahl.indexOf('.') + 2);
}

Wenn vorhanden wird „.0“ auch angezeigt. Ich überlege noch ob das besser aussieht als ausblenden. Weil wenn mit Nachkommastellen dann eigentlich ja immer. Egal, keine Zeit 😀

Zeile 33
Wie oben beschrieben komme ich mit

.val()

an den Inhalt des Eingabefelds und mit

.length()

an die Anzahl der Zeichen, die Länge.

var passlength = $("#passwort").val().length;

Zeile 34,38-40:
Jedes mal, wenn eine Taste in das Eingabefeld eingetragen wird, bekommt

input

den Inhalt des Textfelds neu zugewiesen. Durch die Schleife wird jedes Zeichen dieser Zeichenkette einzeln durchlaufen. Die letzte Zeile weist x den dezimalen Charcode des Zeichen zu.

var input = $("#passwort").val();
for(var i=0,l=passlength;i<l ;i++)
{
var x = input.charCodeAt(i);

Ich hatte erst mit

.Number()

und

.parseInt()

probiert an den dezimalen Charcode zu kommen, kam immer NaN bei raus. Weiß einer wieso? Bin mir nicht so sicher, was da im Hintergrund abläuft. Bei Google findet man zu 90% diese 2 Funktionen, nur ganz selten die

.charCodeAt()

.

Zeile 41-71:
Ich spar es mir den Code hier nochmal zu posten. Die Zeilen überprüfen, welcher Typ Zeichen der zwischengespeicherte Char ist. Ich weiß, das if if else Chaos ist tödlich. Zudem sind viel zu viel Zeichen erlaubt. Die Fehlerbehandlung wie z.B. bei Umlauten ist noch nicht fertig. Es gehen auch Zeichen, die normalerweise bei Passwörtern nicht erlaubt sind. Viele Details die jemand mit Langerweile besser machen würde 😉

Ein verbautes Gimmick: Wird eine Zeichenart mehr als 4 Mal benutzt gibt es Abzüge in der Wertung. Damit soll die Variation der Zeichentypen gefördert werden. Schrecklich gelöst 😀

klein += 1;
   if ( klein > 4 ) {
	strength += 0.2;
   } else {
	strength += 1;
   }

Zeile 74:
Wie oben beschrieben, rundet den Wert.

var rstrength = runde(strength);

Zeile 76-90:
Was in diesem Codeblock passiert ist mir wieder etwas peinlich. Ginge wahrscheinlich kürzer und besser, aber es funktioniert ^^
Mit

.css()

setze ich je nach Wertung die CSS Eigenschaften des #cover DIVs. Dies ist ein grauer Balken über dem eigentlichen, bunten Balken. Dieser graue Balken wird Stück für Stück kleiner, bis er bei über 20 Punkten ganz ausgeblendet wird. Die meisten vermuten, man habe nur einen farbigen Balken, der immer größer wird. Aber ich glaube das ist schwerer zu realisieren als 2 Balken. einer davon überdeckendend.

$("#cover").css({'width':'208px','left':'1px'});
  $("#cover").css({'width':'173px','left':'35px'});
    $("#cover").css({'width':'139px','left':'69px'});
      //..
        $("#cover").css({'display':'none'});

So, das wars. Eigentlich schon ein tolles Ding. Man kann natürlich auch eins der hunderten jQuery Plugins nutzen, die es mittlerweile gibt wie Sand am Meer. 😉

Und, wie stark ist euer Passwort?

Als kleine Vorbereitung den Artikel von gestern über PixelSearch lesen, wenn ihr den noch nicht kennt.

Zusätzlich zu PixelSearch spielt PixelGetColor eine sehr wichtige Rolle beim Automatisieren von komplexeren Aufgaben. Wie der Name der Funktion schon deutlich macht wird die Farbe eines Pixels abgefragt. Das Prinzip ist also recht simpel:

PixelGetColor(x, y)

liefert den dezimalen Farbwert des Pixels mit den Koordinaten x und y. Da wir bei PixelSearch und auch sonst aber öfter mit den hexadezimalen Farbwerten arbeiten bietet es sich an PixelGetColor immer mit der Funktion Hex zu kombinieren:

Hex(PixelGetColor(x, y),6)

Hex wandelt den übergebenen Wert um, 6 gibt die Länge des hexadezimalen Rückgabewerts an (bis zu 8).
Das Ergebnis von

Hex(PixelGetColor(x, y),6)

auf einem bestimmten Pixel losgelassen ist eine simple Zeichenkette wie „A3BB4C“ und kann daher auch ganz einfach so abgefragt werden:

If Hex(PixelGetColor($x, $y),6)="A3FFBC" Then
   do something
EndIf

Ansonsten kommt nicht viel dazu, es wird nur etwas konkreter.
Und zwar geht es um dieses geniale Flash Game hier: Curveball.
Vielleicht kennen es einige von euch ja. Die Grafik des Spiels ist ebenso bahnbrechend wie die Spielidee. Ein Wunder, dass es noch kostenlos ist!
Aber Spaß beiseite, das Spiel eignet sich suuper zum üben dieser Funktionen.

Der Hauptteil des Bots ohne Kommentare sieht in etwa so aus:

MsgBox(0,"Ecke oben links","Führe die Maus über die Ecke des Flash-Games oben links, du hast " & ($waittime/1000) & " Sekunden.")
Sleep($waittime)
$ol = MouseGetPos()
$center = PixelSearch($ol[0],$ol[1],$ol[0]+472,$ol[1]+315, 0xFFFFFF)
while True
	If Hex(PixelGetColor($center[0]+170,$center[1]+110),6)="FFFFFF" Then
		MouseClick("left",$center[0]+170,$center[1]+110,1,1)
	EndIf
	If Hex(PixelGetColor($center[0]+170,$center[1]+110),6)="EFFFEC" Then
		MouseClick("left",$center[0]+170,$center[1]+110,1,1)
	EndIf
	$Ballposition = PixelSearch($ol[0],$ol[1],$ol[0]+472,$ol[1]+315, 0xF0FFED, 2, 1)
	If Not @error Then
		MouseMove( $Ballposition[0], $Ballposition[1], 1)
	EndIf
WEnd

Simpel aber äußerst effektiv. Wie im letzten Post gestern schon geschrieben; das ganze PixelSearch-relative Variablen-PixelGetColor-Gedöns zu schreiben kostet erstaunlich viel Zeit. Es sieht so simpel aus aber bei jedem Spiel muss man theoretisch komplett von vorn anfangen. Überlegen, ob man Pixel sucht, relative Koordinaten abfragt und ganz viel Kleinkram. Aber ist das Werk vollbracht ist es natürlich viel mächtiger als wenn der User jedes Mal am Anfang alle Koordinaten übergeben muss.

Interessiert, wie es aussieht? Dann Spielseite geöffnet und mein Script gezogen:
Download section
CurveBot.exe
oder
CurveBot.au3 (mit all meinen Tests, Kommentaren etc, die nötig waren, bis ich den Bot funktionstüchtig fertig hatte)

Ich hoffe ihr konntet was lernen!