BigBasti's Blog About Me & my Digital Lifestyle

29Jun/100

ScreenShot Helper – erleichert den Umgang mit Bildern in der Windows Zwischenablage

Heute mal etwas in eigener Sache: Ich habe mal wieder ein kleines Tool für Windows fertiggestellt welches euch das leben etwas erleichern kann. Die Rede ist von ScreenShot Helper.

Bild 1: Benachrichtigung über eine neue Grafik in der Zwischenablage

ScreenShot Helper ist dafür gedacht Grafiken, die ihr in die Zwischenablage steckt schnell und einfach zu verarbeiten. Ein Bleispiel: Ihr wollt einem Bekannten einen Fehler oder etwas anderes zeigen, dass auf eurem Bildschirm passiert. Wenn ihr nur die Windows Tools verwendet müsst ihr erst einen Screenshot machen, dann Paint (oder ein anderes Bildprogramm) starten die Grafik dort einfügen, das Bild speichern, nun müsst ihr eine Webseite suchen auf die ihr das hochladen wollt um dann schließlich den Link zu bekommen, den ihr eurem Freund geben könnt.

Mit ScreenShot Helper wird dieser Vorgang stark vereinfacht. Das Programm erkennt automatisch, dass eine neue Grafik in der Zwischenablage ist und zeigt euch das Fenster aus Bild1. Nun könnt ihr mit einem Klick das Bild speichern oder es mit ebenfalls einem Klick hochladen und bekommt direkt den Link den ihr weiter verteilen könnt.

Ich bin mir dessen völlig bewusst, dass es sehr viele sehr ähnliche Tools da draußen im Web gibt die diese und noch weitere Funktionalitäten bieten. Ich wollte aber einfach nur ein leichtes schnelles Tool haben, dass genau das macht was ich brauche und dass ich weiter anpassen kann.

Vielleicht könnt ihr ja auch soetwas gut gebrauchen. Hier gehts zum Programm.

VN:F [1.9.3_1094]
Rating: 9.0/10 (1 vote cast)
8Jun/101

Klasse 3 Smartcard Reader von Kobil geknackt

Dem Hacker Colibri ist es gelungen einen Smartcard Reader aus dem Hause Cobil zu knacken, der zur Klasse 3 der Reader gehört. Klasse 3 Reader besitzen eine eigene Tastatur und ein eigenes Display und gelten somit als sehr sicher, da die Eingaben nirgends hin übertragen werden müssen und somit nicht unterwegs abgefangen werden können.

Dieser Reader wurde von dem Bundesamt für Sicherheit in der Informationstechnik (BSI) und von T-Systems zertifiziert und sollen auch für die neuen ePersos von Deutschland benutzt werden. Leider sieht man hier mal wieder wie unsicher diese ganzen Systeme sind!

Das was ich aber am schockierendsten fand, war das Passwort das von Kobil benutzt wurde: "Geheim?" - wie geil ist das denn?

Als Zusatzinformation schreibt der Hacker noch, dass es inzwischen ein Update von Kobil gibt, welches diese Lücke schließt. Somit ist der Hack wohl schon veraltet.

VN:F [1.9.3_1094]
Rating: 10.0/10 (1 vote cast)
23Mrz/100

Asynchrone Programmierung (mit der TPL) Teil 2

Ja, ich weiß, lang ist es her, dass ich den ersten Teil geschrieben habe aber nun (nach nur 5 Monaten) gehts endlich weiter, und diesmal wirds neben der Theorie auch Code geben!

Wie ihr seht habe ich den Titel etwas abgeändert nun tauchen da drei neue Buchstaben auf die ihr (vielleicht) noch nie gehört habt, diese stehen für Task Parallel Library. Wie der Name es schon sagt, ist es eine Library die es uns ermöglicht parallel zu programmieren, aber dazu später mehr!

Machen wir erstmal mit ein wenig Theorie weiter. Im ersten Teil haben wir erfahren, dass es nicht automatisch heißt, dass ein Programm schneller wird, wenn man viele Prozessoren im Rechner verbaut hat, und diesen Gedanken möchte ich in dem zweiten Teil noch etwas fortführen.

Dazu möchte ich ein Beispiel geben. Nehmen wir an wir haben eine Funktion geschrieben, in der eine FOR-Schleife vorkommt die viele Berechnungen anstellt und die Ergebnisse in ein Array Speichert zb so:


        static double [] oldWay = new double[10000000];
        public static void doitOldSchool()
        {
            for (int i = 0; i < oldWay.Length; i++)
            {
                oldWay[i] = (Math.Sin(i) / Math.Cos(i)) * Math.Tan(i) * 12345;
            }
        }

Ich denke so eine Schleife hat schon jeder mal geschrieben, da ist nichts kompliziertes dran, sie funktioniert auch hervorragend und liefert uns ein Ergebnis.

Die obere Schleife ist natürlich sehr simpel und ein Durchgang ist schnell erledigt, aber die Schleife wird hier 10 Millionen mal durchlaufen - und das ist ne Menge! Stellt euch vor irgendwann später wird diese Schleife um weitere Rechnungen oder Aktionen erweitert, dann könnte sie die Anwendung dauerhaft blockieren und einfrieren lassen.

Anmerkung: Dies ist nur ein Beispiel, im wahren Leben ist sowas natürlich blöd, da würde die Schleife viel weniger Durchläufe haben, aber dafür einen größeren Body, was die Sache wieder ausgleicht!

Spätestens wenn die Anwendung merkbar langsamer wird lohnt es sich über Parallelisierung nachzudenken, denn wenn inzwischen eh fast jeder Rechner und Laptop eine Mehrkern CPU hat würde das Programm doch schneller laufen oder?

Hier muss man aufpassen, denn die Parallelisierung bietet viele Fallen, denn wenn man die obige Schleife parallelisiert wird sie in sehr viele einzelne Threads zerteilt und auf alle CPU Kerne verteilt. Man kann es sich ungefähr so vorstellen, dass jeder Schleifendurchgang einen Einzelnen Thread bekommt.

Das hört sich eigentlich ganz toll an, aber hier darf man nicht aus den Augen verlieren, dass es auch seine Zeit dauert einen Thread zu erzeugen und dieser erzeugte Thread muss irgendwann auch vernichtet werden. Das heißt also, dass es Zeit kostet einen Thread anzulegen und zu zerstören, und wenn wir uns unsere Schleife so anschauen werden dort ziemlich viele Threads gebildet und auch vernichtet. So kann es vorkommen, dass ein parallel laufendes Programm langsamer ist als sein sequentielles Ebenbild!

Hier gilt aber ein einfache Regel, es muss sich "lohnen" einen Thread zu erzeugen. Das heißt, dass ein Thread auch was zu tun haben muss, in unserem Beispiel ist die Berechnung so schnell, dass das Erzeugen und Vernichten des Threads länger dauert als die Berechnung!

Aber das hängt auch noch von der verwendeten Hardware ab, so werden zu Beispiel Threads auf einem 64-Bit System ca. 30% schneller erzeugt als auf einem 32-Bit System. Desweiteren wird die Performance von der Anzahl der CPU-Kerne beeinflusst, denn wenn davon genug da sind können viel mehr Aktionen gleichzeitig laufen was natürlich das Programm beschleunigt.

Aber gut, genug der Theorie. Nun wollen wir ein bisschen in die Praxis gehen und gucken wie wir mit der Parallelisierung an der Performance der Anwendung schrauben können! Wenn wir die Obige sequentielle Schleife so ausführen benötigt diese knapp 2 Sekunden um alle 10 Millionen Werte zu berechnen:

Bild 1: Das Ergebnis der Sequentiellen Schleife (Core2Duo @ 2,4 gHz)

Gar nicht mal schlecht was man in 2 Sekunden alles berechnen kann! Aber das Blöde hierbei ist, dass die Anwendung dann natürlich 2 Sekunden Blockiert ist. Versuchen wir nun mal die Arbeit gerecht auf alle Prozessoren (in diesem Falle 2) zu verteilen!

Dazu ist aber etwas Vorbereitung nötig. Die TPL wird von Visual Studio 2010 von Haus aus unterstützt, desweiteren wird auch das .NET Framework in der Version 4.0 benötigt, außerdem macht es auch Sinn einen Rechner mit mehr als einem CPU-Kern zu haben ;-) Es müsste auch mit Visual Studio 2008 gehen wenn man das .NET Framework 4 installiert, aber dafür lege ich nicht meine Hand ins Feuer!

Wenn das erledigt ist könnt ihr ein neues C# Konsolen Projekt anlegen. Alles was wir brauchen befindet sich in dem Namespace System.Threading.Tasks, weswegen wir das importieren sollten!

Nun wollen wir unsere FOR-Schleife in eine parallele FOR-Schleife umwandeln. Zum Glück ist das einfacher als es sich anhört, da und die TPL alles nötige zur Verfügung stellt! Schreiben wir also die Schleife folgendermaßen um:


        static double [] newWay = new double[10000000];
       public static void doitNewSchool()
        {
            Parallel.For(0,                 //From (Startwert)
                        newWay.Length,      //TO   (Endwert)
                        (i) =>              //Initialisierung der Variablen
                        {                   //Code der ausgeführt werden soll
                           newWay[i] = (Math.Sin(i) / Math.Cos(i)) * Math.Tan(i) * 12345;
                        });
        }

Zugegeben, auf den ersten Blick sieht das ganze verwirrend aus, da der Kopf der Schleife sich geändert hat. Aber auf den zweiten Blick erkennt man viel wieder. So beginnt die Schleife ebenfalls mit dem Startwert, gefolgt von der Abbruchbedingung. Nun kommt das neue, denn die TPL verwendet hier die so genannten Lambda Ausdrücke, die mit C# 3.0 Einzug erhielten. So ist es nun möglich ganze Codeblöcke in Parameter Felder zu setzen und vieles mehr.

Aber man langsam, man beginnt hier mit der Initialisierung der benötigten Variablen in diesem Fall nur eine namens "i", die Initialisierung erfolgt Typenlos in runden Klammern mit dem Pfeil dahinter wird der dazugehörige Codeblock initiiert (Anonyme Methoden). (ihr könnt die Variablen auch Typisieren, wenn ihr aber keinen Typ angibt wird er automatisch bestimmt!)

Der Inhalt der Schleife bleibt hierbei aber exakt der gleiche, praktisch oder? Aber was passiert nun genau? Naja einfach ausgedrückt wird der Block in viele einzelne Teile zerbrochen die in eigenen Threads dann über die verfügbaren CPU-Kerne verteilt werden. Schließlich werden die Ergebnisse wieder zusammengetragen!

Bevor wir nun hingehen und die neue Schleife testen will ich euch noch was zeigen. Auf dem Folgenden Screenshot sieht man die CPU-Auslastung während unsere erste sequentielle Schleife läuft:

Bild 2: CPU-Auslastung während sequentieller Berechnung

Wie man ganz klar erkennen kann werden beide Kerne belastet! Wie kann das sein? Das Programm ist doch sequentiell! Die Erklärung ist relativ simpel, denn das System (hier Windows 7) erkennt auch, dass da ein Programm einen Kern überlastet und verteilt die Last automatisch auf andere Kerne. Ok, und warum soll ich mir nun die mühe machen und parallel programmieren wenn das System das doch auch so für mich macht?

Ganz einfach, weil das System es schlecht macht. Hier kann man es nicht erkennen, da der PC nur 2 Kerne hat. Wenn man mehr Kerne hätte würde man erkennen, dass das System, zwar versucht einen Kern zu entlasten und die Arbeit zu verteilen, aber es bezieht nur 1, vielleicht 2 weitere kerne in die Arbeit mit ein, alle anderen dürfen weiter "karten spielen" und auf Arbeit warten. Wenn wir aber unser Programm parallel gestalten, werden alle verfügbaren Kerne ausgenutzt!

Ok, dann wollen wir mal unsere überarbeitete parallel laufende Schleife mal anschmeißen:

Bild 3: Parallel laufende Schleife

Ahja, wie man sieht konnte unsere neue Schleife die Werte in fast der halben Zeit berechnen. Das ist eine enorme Steigerung! Schauen wir uns auch nochmal die CPU-Auslastung an:

Bild 4: Steile Berge

Man erkennt sofort, dass die CPU hier sehr viel effizienter genutzt wird, die Auslastung steigt kurz bis an das Maximum an und geht danach direkt wieder runter! Vergleicht man das Bild mit dem Sequentiellen sieht man auch, dass beide Kerne fast gleichstark und auch durchgängig belastet werden. Die last wird perfekt auf die verschiedenen Kerne verteilt!

Ruft man beide Funktionen hintereinander zur Laufzeit auf, wird der Unterschied noch besser sichtbar:

Bild 5: 100% Schneller

Der Unterschied ist gewaltig, man würde den Unterschied noch mehr spüren, wenn man eine Schleife mit einem Größerem Body testen würde, aber das könnt ihr dann ja mal selber irgendwann üben.

In bild 5 sieht man die Ergebnisse der Berechnung auf einem Windows 7 32 Bit Rechner mit einem Core2Duo mit 2,4 gHz. Schauen wir uns doch mal an, wie die Zahlen abweichen wenn wir ein System haben dass ein paar mehr Kerne hat und im 64 Bit Modus läuft:

Bild 6: Unglaublich oder?

Hier sieht man es nochmal ganz deutlich wie überlegen die parallel programmierte Schleife der sequentiellen ist. So sieht die CPU Verteilung aus auf einem 64 Bit System mit 16 Kernen:

Bild 7: Gegenüberstellung (Zum vergrößern klicken)

Wie man sieht beansprucht die sequentielle Schleife nur 4 der Prozessoren, und das nicht mal ganz. Die parallele Schleife dagegen hat 15 der 16 Kerne belastet und ist dem entsprechend 10 mal schneller fertig geworden!

Zum Schluss will ich noch eine kleine Schwäche der Parallelen Variante (wenn man sie Schwäche nennen mag) zeigen. Ich habe hier ganz bewusst eine Schleife genommen, die 10 Millionen mal ausgeführt wird, denn wenn die Schleife kleiner wird, hat man mit der Parallelen Schleife keinen Vorteil mehr!

Die Erklärung dafür habe ich zu Beginn dieses Artikels gegeben, denn die Thread Erzeugung dauert einfach viel zu lange! So sieht man hier den Ablauf der selben Schleife mit 100.000, 10.000 und 1000 Durchgängen:

Bild 8: Man muss vorher abwägen

Man muss sich unbedingt vorher Gedanken machen, ob es sich lohnt einen Prozess zu parallelisieren.

In dem Nächten Teil, der (ich hoffe) bald kommt werde ich euch dann noch ein paar weitere Gefahren zeigen, und auch Methoden wie man die Parallelisierung noch ein wenig beschleunigen kann, sowie auch weitere Beispiele mit anderen Schleifen und ganzen Codeblöcken!

Ich hoffe der Artikel hat euch gefallen und freue mich auf euer Feedback!

Die Demoanwendung gibts hier:

.

.

VN:F [1.9.3_1094]
Rating: 9.0/10 (1 vote cast)
27Jan/105

iPad – Apple’s neues Produkt – Mein Eindruck

Nun kann die Welt endlich wieder ruhig schlafen, Apple hat ihr neues Gerät vorgestellt - das iPad. Dieses soll die Lücke zwischen iPhone/iPod und dem Macbook schließen.

Quelle: gdgt.com <- Mehr Bilder

Ich persönlich war auch schon gespannt auf das lang erwartete "Tablet", die Medien überschlugen sich, jeden Tag neue Gerüchte immer wildere Photoshopkreationen.

Nun ist es da, und ich muss ehrlich sagen, ich bin enttäuscht. Optisch ist das Gerät, das so ähnlich aussieht wie der Bildschirm von einem Allu-Macbook, sehr chic - wie erwartet, aber alles in einem kann man es als einen großen iPod bezeichnen.

Nun darf man aber nicht, wie bei Apple Geräten üblich, daher kommen und das iPad mit anderen Tablet PCs vergleichen. Das wäre dann der berühmte Äpfel mit Birnen vergleich.

Ich will erst einmal ausführen, was mir gefallen hat. Das iPad ist ein rundum schönes Gerät, Apple sagt selber es soll primär für "Browsing, Email, Photos, Videos, Musik, Games & eBooks" gut sein. Und nach der Keynote weis ich eins, dafür ist dieses Gerät wie gemacht.

Es kommt mir der vom iPhone und iPod bekannten Benutzeroberfläche daher, die an den größeren Bildschirm angepasst wurde und um einige neue Funktionen ergänzt wurde wie zB. PopUp Menüs.

Hut ab, das hat Apple echt drauf, die Bedienung ist super gelungen, ich als iPhone & Macbook Besitzer weiß das echt zu schätzen! Die Mail und Kalender App wurde von Grund auf überarbeitet und sieht richtig chic aus!

Ein weiteres Feature, dass wohl am wichtigsten ist, ist die Kompatibilität zu den iPhone Apps, denn man kann alle jeztschon verfügbaren Apps installieren und in voller Auflösung genießen. Desweiteren wird das iPad wohl ein starker Konkurent zu dem Kindle von Amazon werden, da das eBook Programm einfach nur grandios aussieht!

Dazu kommt noch, dass Apple eine Akkulaufzeit von 10 Stunden angibt, das ist beeindruckend!

Doch leider gibts auch Schattenseiten. Denn das iPad kommt wie auch das iPhone mit dem Safari Mobile daher, das bedeutet, dass man weiterhin keine Flash Unterstützung hat und nur YouTube Videos anschauen kann (über ein Extra Programm). Warum nur? Dieses Gerät schreit einfach danach! Wenn ich allein an die vielen Flash-basierenden Browsergames denke! Gut man kann natürlich argumentieren dass es im Appstore 140.000 Programme & Spiele gibt aber Flash ist heute (leider) immer noch eine der wichtigsten Web Technologien.

Desweiteren kann man keine Dateien herunterladen und auch keine hochladen, was man zwar nicht oft benötigt aber es dann bitter ist wenn man es mal braucht!

Weiter fällt auf, dass das iPad "nur" einen Dockconnector Port an der Unterseite hat und einen Kopfhörerstecker - exakt die selben Anschlüsse wie auf dem iPhone, inklusive der lauter/leiser Tasten und dem Stummknopf.

Warum findet man hier keinen USB-Stecker? Dick genug ist die Seite des iPads (glaube ich) oder wenigstens ein SD-Karten Slot. Diesen kann man zwar mit einem Adapter nachrüsten aber das ist doch Käse!

Ein weiteres Manko ist, dass es kein "richtiges" Betriebssystem hat. Das iPad OS (?) ist wie auch das iPhone nicht in der Lage mehrere Applikationen zur gleichen Zeit auszuführen (Multitasking). Wobei man diesen Punkt auch als Vorteil sehen kann, da das Gerät dadurch schneller und einfacher zu bedienen ist.

Genau aus diesem Grund kann man das Gerät auch nicht mit anderen Tablets vergleichen, da diese mit Windows - einem "vollen" Betriebssystem - laufen.

Leider ist genau hier auch der Nachteil der Windows Tablets, denn ein angepasstes System ist natürlich viel effizienter und einfacher. Doch hat Apple hier wiedereinmal seine Sperrvorrichtungen aufgefahren und unterbietet jegliche Zugriffe auf das Dateisystem, was bedeutet, dass man auch das iPad erst "jailbraken" muss bevor man es "vernünftig" benutzen kann!

Das Günstigste Model kostet 499 Dollar (also ca 499 Euro im Apple Wechselkurs) und kann nur 16 GB Speicher bieten und hat dazu noch kein 3G Modul integriert! Hier könnte man natürlich wieder sagen man bekommt ein gutes Netbook für das Geld - aber das wären wieder Äpfel und Birnen.

Apple hat den Zweck des iPads definiert und man muss als Kunde damit leben. Man bekommt nicht mehr und nicht weniger!

Mein Eindruck ist, dass Apple hier einen großen iPod Touch mit 16 GB Speicher für $500 verkauft. Im Vergleich zu der iPhone Präsentation verspüre ich keinerlei Begeisterung für das Produkt eher im Gegenteil. Aber vielleicht muss man nur eine Weile warten, bis die 2te Version des iPad herauskommt und alles besser macht, wie einst beim iPhone!

VN:R_N [1.9.3_1094]
Rating: 0.0/10 (0 votes cast)
2Dez/090

Uebersicht mit kostenlosen E-Books gestartet

Wie ihr erkennen könnt gibt es seit heute oben im Menü einen neuen Knopf namens "E-Book".

Auf dieser Seite habe ich alle (mir bekannten) kostenlosen E-Books aufgelistet. Das wollte ich schon immer mal machen, habe mir aber erst heute die Zeit dafür genommen!

Die Liste ist aber auch noch ausbaufähig, und ich bin auf euch angewiesen! Sicher kennt ihr noch anderen kostenlose Bücher, die in den unendlichen Weiten des WWW versteckt sind!

Da ich meine eigene kleine Sammlung auch gerne ausbauen will, hoffe ich, dass der eine oder andere Tipp von euch reinkommt!

Wenn das so ist, schreibt mir einfach ne Mail oder einen Kommentar mit dem Link und ich werde das Buch auch in die Liste übernehmen!

Bitte nur Bücher angeben, die sich mit Anwendungsentwicklung auseinander setzen.

VN:F [1.9.3_1094]
Rating: 0.0/10 (0 votes cast)
5Nov/090

Windows 7 und seine Schönheitsfehler Teil 2: Die Taskleiste

win7Letzte Woche habe ich unter Windows 7 etwas sehr seltsames beobachtet. Nach dem ich ein kleines Programm geschrieben hatte, dass ich zwischendurch nutzen wollte, wollte ich dieses an die Taskleiste "pinnen", damit ich es immer schnell griffbereit habe!

win75Bild 1: Links: Wie es sein sollte. Rechts: So sieht das "Problem" aus

Doch Pustekuchen! Ich konnte das Programm, ja nicht mal eine Verknüpfung, die auf das Programm linkte an die Taskleiste pinnen! Seltsam, denn andere Programme, auch selbstgeschriebene, konnte ich problemlos anpinnen!

Woran kann das liegen? Alle Optionen, die man von anderen Programmen kennt waren nicht da! Die ganze Jumplist hatte nur den Eintrag "Fenster schließen". Die anderen Optionen wie "Programm an die Taskleiste pinnen" waren alle weg!

Die erste Vermutung war natürlich, es liegt am Code! - Son Mist - Also habe ich losgelegt und das Programm Stück für Stück von verschiedenen Codeteilen befreit bis ich garkeinen Code mehr im Programm hatte. Aber das "Problem" war immernoch nicht behoben!

Wie gesagt konnte ich andere Programme, die ich selbst gemacht habe anpinnen, nur dieses eine nicht. Also habe ich das getan, was jeder kompetente Programmierer tun würde, ich befragte Google! :-)

Leider konnte ich nichts wirklich brauchbares finden, das meinen Fall bestätigte. Schließlich wollte ich schon aufgeben und das Projekt neu anlegen, in der Hoffnung es würde nicht wieder auftauchen.

Zu meinem Glück habe ich davor ein Skript (an dem ich zur Zeit etwas herum spiel) verwendet, dass dieses Programm  (zusammen mit vielen anderen Dateien) umbenannt hatte. Nun hieß das Programm "ax4b.exe". und Überraschung - ich konnte es anpinnen.

Es lag am Namen!

Als ich dem Programm wieder seinen Originalnamen verlieh konnte ich es wieder nicht anpinnen! Achja, das Programm heißt "Uploadhelper.exe"

Wie es also scheint, sind bestimmte Programme unter Windows 7 von der Fähigkeit befreit sich an die Taskleiste pinnen zu können.

Wie ich dann nach einer weiteren Internetrecherche herausgefunden habe gibt es einen Registryeintrag namens "AddRemovenames" derhier zu finden ist:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\FileAssociation\AddRemoveNames

win76Bild 2: Der Registryeintrag mit den "verbotenen" Namen

Dieser enthält alle Schlüsselwörter, die alle Programme, die eins dieser Wörter im Namen beinhalten, nicht an die Taskleiste pinnen lässt! Diese Wörter sind:

Documentation;Help;Install;More Info;Readme;Read me;Read First;Setup;Support;What's New;Remove

Und da mein Programm das Wort "help" im Namen hatte wurde es von dieser Regel betroffen.

Es scheint so zu sein, dass Microsoft keine Hilfe oder Setup Programme in der Taskleiste sehen will. Wobei ich wirklich nicht verstehen kann, warum "Documentation" in der Liste steht!

Also hat man als Entwickler nun die Wahl: Entweder man benennt sein Programm um, oder man löscht den entsprechenden Eintrag aus diesem Registryeintrag. Von dem letzteren würde ich allerdings abraten, da es ein enormer Eingriff in die Benutzereinstellungen wäre, und wer weiß, vielleicht benutzen noch andere Dienste diesen Eintrag und funktionieren dann eventuell nicht mehr!

Wenn man von dieser Beschränkung nichts weiß, kann es einen schon in den Wahnsinn treiben, denn wer vermutet denn bitte, dass es an dem Namen liegt?

VN:F [1.9.3_1094]
Rating: 7.4/10 (5 votes cast)
3Nov/090

VB.NET: Eigenes Programm mit Windows starten lassen

Oftmals ist es es von Nöten sein eigenes Programm beim Hochfahren von Windows automatisch starten zu lassen. Dies ist nicht wirklich anspruchsvoll aber dennoch sehr nützlich!

Windows bietet uns hier 2 Möglichkeiten dieses Vorhaben umzusetzen. Die erste ist es eine Verknüpfung zu unserem Programm zu erstellen und diese dann im Autostart Verzeichnis zu platzieren.

winstart11Bild 1: Der Windows Autostart Ordner im Startmenü

Dieser Ordner befindet sich unter dem folgendem Pfad:

C:\Users\[BENUTZERNAME]\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup

Windows führt automatisch alle Dateien aus, die sich in diesem Ordner befinden, nachdem der Startvorgang abgeschlossen ist!

Die zweite (und meiner Meinung nach), bessere Methode ist es, einen entsprechenden Eintrag in der Registry zu setzen. Dies hat auch den Vorteil, dass man später die Verknüpfung nicht suchen und entfernen muss und dass der Benutzer diese nicht ausversehen löscht.

Wenn ihr in den dafür vorgesehenen Ordner schaut werdet ihr feststellen, dass dort (wahrscheinlich) auch andere Programme ihr Unwesen treiben.

winstart2Bild 2: Weitere Autostart Einträge

Diesen Registry Ordner findet ihr im Regestrierungseditor unter folgendem Pfad:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run

In dem folgenden Codebeispiel werden wir hier einen Eintrag mit dem Verweis auf unser Programm einfügen.


    Public Sub LoadOnStartup(ByVal DoOrNot As Boolean)

        Dim RegKey As String = "HKEY_CURRENT_USER\Software\" &amp;amp;amp;amp; _
                               "Microsoft\Windows\CurrentVersion\Run"
        If DoOrNot = True Then
            My.Computer.Registry.SetValue _
            (RegKey, "[PROGRAMMNAME]", My.Application.Info.DirectoryPath &amp;amp;amp;amp; _
                                "\" &amp;amp;amp;amp; My.Application.Info.AssemblyName &amp;amp;amp;amp; ".exe")
        Else
            My.Computer.Registry.SetValue _
            (RegKey, "[PROGRAMMNAME]", "")
        End If

    End Sub

Wie man sieht ist es dank .NET nicht wirklich schwer einen Registryeintrag zu erstellen und zu bearbeiten, denn wenn ihr nicht mehr wollt, dass euer Programm mit Windows gestartet wird, löscht ihr den Eintrag einfach oder gebt statt dem Pfad etwas anderes ein.

In dem Code verwende ich den Kern-Schlüssen "HKEY_CURRENT_USER" statt des oben erwähnten "HKEY_LOCAL_MACHINE". Dies heißt nur, dass das Programm nur bei dem User Automatisch starten wird, der diesen Code ausführt. Benutzt man allerdings "HKEY_LOCAL_MACHINE" wird das Programm bei allen Benutzern des Computers automatisch gestartet!

Zur Benutzung: Ruft diese Funktion einfach auf und übergebt True um euer Programm automatisch starten zu lassen, oder False um dies wieder zu unterbinden!

Da dies nur ein Copy & Paste Beispiel ist, habe ich hierfür kein Demoprojekt angefertigt, ich hoffe ihr könnt mir verzeihen! :-)

VN:F [1.9.3_1094]
Rating: 7.0/10 (3 votes cast)
17Okt/090

Kostenloses Windows 7 E-Book von Microsoft

Wer schon mal ein Buch von Microsoft Press gekauft hat weis, dass diese Bücher Gold wert sind! Nun gibts ein Buch gratis als Download bis zum 31.10.

Das Buch beschäftigt sich mit Windows 7 und seinen Grundfunktionen:

  • Programme und Mini-Anwendungen ausführen
  • E-Mails senden, Termine planen, im Web surfen
  • Fotos, Musik und Videos organisieren, Spiele spielen
  • CDs und DVDs brennen und eigene Filme erstellen
  • Drucker einrichten und ein Heimnetzwerk erstellen
  • Sicherheit verbessern und Windows 7 optimal einrichten

Das Buch ist vor allem für Leute empfehlenswert, die noch nicht so viel Erfahrung mit Computern (Windows) sammeln konnten. Also wer noch eine Freundin hat kann der ja das Buch mal unterjubeln! ;-)

Ich habs mir mal vorsichtshalber mal gesichert  - kost ja nix!

Zu finden hier: Windows 7 - Auf einen Blick

VN:F [1.9.3_1094]
Rating: 10.0/10 (1 vote cast)
11Okt/090

Windows 7 überzeugt mit tollem Treibermanagement

Seit nun ca 2 Monaten nutze ich Windows 7 Professional und bin sehr begeistert von diesem "Besten Windows aller Zeiten" wie Microsoft es sagt.

Warum? Nicht nur dass es sehr schnell läuft, die neuen Netzwerk Funktionen, dank welcher LAN Party noch mehr Spaß machen werden aber auch die neue Taskleiste (die "Superbar") sehr gut umgesetzt ist.

Was einem aber nicht gleich ins Auge springt, sind die Neuerungen "unter der Haube". So ist mir heute, als ich meinen Drucker an dem PC anschloss folgendes aufgefallen:

treiberBild 1: Automatisch Treiberinstallation

Wie immer wenn man ein neues Gerät an dem Computer schließt erscheint der Treiber Assistent und versucht passende Treiber zu finden. Dies gelang ihm aber in früheren Windows Versionen aber (so gut wie) nie!

So musste ich immer meine Treiber CD von Canon rauskramen und die Treiber installieren, die ca 100 MB Groß waren, warum auch immer!

So war ich umsomehr überrascht als Windows alles eigenständig erkannte und installierte. Und das mit nur 10 MB statt 100! Das ganze habe ich gleich auch noch mit einem Nokia 95 getestet, dass eigentlich die Nokia PC Suite benötigt.

Auch diese wurde heruntergeladen und installiert! Also hier mal ein riesen Komplement an Microsoft.

Windows 7 ist in meinen Augen ein sehr gelungenes OS geworden! Ich selber nutze es auf meinem Macbook Unibody neben Snow Leopard. Wobei ich Mac OS schon seit knapp einem Monat nicht mehr gebootet habe, was schon was heißt finde ich!

VN:F [1.9.3_1094]
Rating: 8.0/10 (1 vote cast)
29Sep/090

Asynchrone Programmierung mit Threads Teil 1

In diesem ersten Teil dieser Serie möchte ich auf die Theorie hinter der Asynchronen Programmierung zu Sprechen kommen, Vor- und Nachteile dieser und auf Probleme, die dabei entstehen können.

700px-moores_lawsvgBild 1: Mooresches Gesetz grafisch dargestellt (klicken zum vergrößern) Quelle: Wikipedia

Wenn man mal auf die letzten Jahre schaut, sieht man eine starke Entwicklung der Computerrechenpower, zB. 1998 galt ein Computer mit 500 MHz noch als sehr leistungsfähig. Bis heute gilt auch noch (naja zumindest fast) das Mooresche Gesetz, welches besagt, dass alle 2 Jahre sich die Schaltkreise auf einem Chip (CPU) verdoppeln und somit auch die Leistung.

Da die Rechenleistung der Computer stetig stieg, war es für Programmierer meist nicht nötig, bzw. gab es keine Anreize die Software effizienter zu gestalten, denn mit jedem neuen Computer lief auch das Programm schneller!

Doch heute sind wir an einer Grenze angekommen, an der es kaum noch möglich ist eine einzelne CPU leistungsfähiger zu machen, und somit stagnieren wir zur Zeit bei ca 3 - 4 GHz bei  SongleCore CPUs. (Ich selbst habe vor ca 6 Jahren geschätzt, dass die Marke von 5 GHz nicht mehr überschritten wird.)

Da man die Transistorenzahl auf den Chips nicht mehr erhöhen kann bedient sich die Industrie einem Trick. Sie bauen einfach zwei (oder mehr) CPUs in eine. Das ganze nennt sich dann DualCore. Man hat also zwei echte von einander unabhängig arbeitende CPUs.

taskmanager8x6Bild 2: Im Windows Taskmanager sieht man die 2 CPUs bei der Arbeit (oben)

Das Problem hierbei ist nur, dass man nun zwar zwei Kerne hat, diese aber nicht schneller geworden sind! So hat man zB. 2x 2,2 GHz was aber nicht heißt, dass die Rechenleistung dieser CPU bei 4,4 Ghz liegt!

Denn ein Programm läuft standardmäßig nur auf einem Kern, und da dieser nicht schneller geworden ist läuft das Programm darauf genauso schnell wie auf einem SingleCore 2,2 GHz Prozessor! (Natürlich ist das nicht ganz wahr, sicher läuft das Programm auf dem DualCore etwas schneller, da das System andere Prozesse auf den zweiten Kern auslagert, aber der Performancegewinn ist nicht enorm!)

Also sind wir Programmierer nun gezwungen unsere Software so zu gestalten, dass diese möglichst alle Kerne der CPU auslasten. Also Parallelprogrammierung anwenden!

Doch das ist leider leichter gesagt als getan, denn es gibt viele Steine die da in dem Weg liegen und viele Kleinigkeiten die man beachten muss! Der Anfang ist aber verschiedene Abläufe des Programms in einzelne Threads aufzuteilen.

Zunächsteinmal muss man wissen, dass nicht jedes Programm in Threads aufgeteilt werden kann (dazu gleich mehr) und desweiteren muss man verstehen, dass egal wieviele Prozessoren ein Computer hat man ein Programm nicht unendlich schnell machen kann!

Daher ist die Aussage "je mehr Kerne desto schneller das Programm" falsch! Warum das so ist werde ich nun erklären!

Sehen wir uns eine vereinfachte Programmkette an:

dar1Darstellung 1: Sequentieller Programmablauf

Hier steht "T" für Thread und "P" für Prozedur.

Da jedes Programm einen klaren Einstiegspunkt haben muss (was hier P1 ist) kann dieser schon mal nicht in einen zweiten Thread ausgelagert werden. Der Endpunkt der meist alle Ressourcen freigibt ist der Punkt wo alles zusammenläuft, daher kann dieser auch nicht ausgelagert/aufgeteilt werden!

Somit können schon 2 von unseren 7 Prozeduren nicht ausgelagert werden und müssen sequentiell (nacheinander) ablaufen. Gut, schauen wir uns mal die restlichen 5 Prozeduren an.

Ein Programm kommt nicht ohne sequentielle Abläufe aus, da es oft so ist, dass eine Prozedur mit Ergebnissen einer anderen Prozedur arbeitet. Logischerweise können diese zwei Prozeduren nicht parallel laufen.

Für dieses Beispiel nehmen wir an, dass jeder Thread auf einer eigenen CPU laufen würde!

Für unser Beispiel denken wir uns mal, dass P4 mit Ergebnissen von P3 arbeitet und diese daher nicht parallelisiert werden können. Somit fallen wieder 2 Prozeduren aus, die man parallelisieren könnte.

Desweiteren benötigt P6 die Daten aller Prozeduren die davor liefen und kann daher auch nicht ausgelagert werden!

Somit bleiben uns zwei Prozeduren, die wir in einen andren Thread packen könnten. Was ca. so aussehen würde:

dar2Darstellung 2: Asynchroner Programmablauf mit 2 Threads

Wie man sieht konnten wir in diesem Programm P2 und P5 erfolgreich in einen zweiten Thread auslagern. Doch was heißt das für unser Programm? hier ein kleines Rechenbeispiel:

Nehmen wir an, dass jede Prozedur eine Laufzeit von 5 Sekunden hat, das würde bedeuten, dass unser Programm wie in Darstellung 1 aufgeführt 35 Sekunden benötigen würde, um durch zulaufen.

Da bei dem Programm aus Darstellung 2, 2 Prozeduren "Parallel" ablaufen, verringert sich die Zeit auf 25 Sekunden. Also eine Ersparnis von knapp 30 %!

Natürlich ist das hier eine Ausnahme, denn es wird wohl kein Programm geben, dessen Prozeduren alle Gleichschnell sind, was uns zu unserem Nächsten Problem führt!

Denn wenn die Prozeduren nicht alle gleich schnell sind kann es zu Verzögerungen kommen! Das ist so, als wenn man Einen Tisch bauen will, und bestellt die Tischbeine bei Amazon und die Tischplatte bei Ebay. Den Tisch wirklich zusammenbauen kann man erst wenn beide Teile da sind! Fehlt eins der Teile muss man warten bis das andere auch ankommt!

Wenn wir das nun auf unser Programm aus Darstellung 2 beziehen heißt das, P6 erst weiter machen kann, wenn sowohl P4 als auch P5 Abgeschlossen sind! Wenn P4 zB. schneller fertig ist dann pausiert der erste Thread solange bis der zweite fertig ist! Dies kann zu unangenehmen Effekten führen, die das Programm sogar verlangsamen können statt es zu beschleunigen!

Wenn P2 und P5 also 6 Sekunden benötigen würden statt 5 würde die Laufzeit unseres Programms sich um 2 Sekunden verlängern also 27!

Nun könnte man aber sagen, P2 und P5 sind ja nicht von einander abhängig also lagere ich diese zwei Prozeduren auch noch aus:

dar3Darstellung 3: Asynchroner Programmablauf mit 3 Threads

Hier müsste P6 auf die Fertigstellung von P4, P2 und P5 warten!

Das würde allerdings nur Sinn machen, wenn die Prozeduren P2 und P5 in der Summe länger brauchen würden als P3 und P4! Denn wenn P2 und P5 zusammen schneller sind als als P3 und P4 würde dieses erneute Auslagern nichts bringen, da sie sowieso schneller fertig wären als P3 und P4!

Wie man sieht wurde unser Programm durch die Auslagerunggen von Prozeduren um fast ein Drittel schneller! Aber man sieht auch, dass unser Programm auch nicht schneller werden würde wenn man 10 oder 100 CPUs hätte! Da wir sowieso nur 2 CPUs benutzen bringen uns die restlichen CPUs nichts da wir unser Programm nicht weiter aufteilen können!

Besonders Sinn macht es Prozeduren auszulagern, die viel Zeit in Anspruch nehmen. Denn wenn man solche Prozeduren Sequentiell abarbeitet blockieren diese den Ganzen Ablauf! Besonders Schleifen machen das ganz gerne!

Wenn man zb. eine Grafische Oberfläche hat und eine lange Prozedur im selben Thread (der auch die GUI verwaltet) startet, reagiert diese solange nicht mehr bis diese Prozedur durchgelaufen ist! Dann sieht man meist folgendes:

noreplyBild 3: Man beachte das "Keine rückmeldung"

Um das zu verhindern sollte man längere Schleifen und Rechenoperationen immer in einen Hintergrund Thread verschieben damit die Oberfläche weiterhin bedienbar bleibt!

Ansich ist Threading sehr nützlich wir haben nun einige Vorteile kennengelernt wie den Performancegewinn, aber auch Nachteile gefunden, wie etwa Verzögerungen. Aber auch bei der Programmierung von Threads gibts einige Gefahren die man nur durch genaues Debuggen finden kann!

An dieser Stelle möchte ich ein Beispiel bringen, welches die Problematik darstellt!

Nehmen wir an, wir haben ein Programm, dass für ein Ehepaar das Konto verwaltet! Jeder der beiden hat dabei seinen eigenen Thread, der für den Ehepartner das Geld vom Konto abhebt! Die Hauptaufgabe unseres Programms ist es dafür zu sorgen, dass man das Konto nicht überbelastet also mehr abhebt als drauf ist!

Ein typischer Programmablauf wäre dann wie folgt:


### Programmstart
Verbinde mit Konto
Frage wieviel Geld abgehoben werden soll
speichere den gewünschten Betrag in Variable $Betrag
Prüfe ob $Betrag kleiner ist als der Betrag auf dem Konto
Wenn genug Geld auf dem Konto vorhanden ist
Hebe $Betrag vom Konto ab
Trenne Verbindung
### Programmende

Beide Threads (von beiden Ehepartnern) laufen dabei Parallel, damit der eine nicht waren muss und immer sofort Zugriff hat.

Auf den ersten Blick sieht das Programm sicher aus, man prüft ob genug Geld auf dem Konto ist bevor was abgehoben wird. Totsicher - oder?

Eigentlich ja, wenn das Programm nur in einem Thread laufen würde! Denn es könnte ja zu dem Fall kommen, dass beide Ehepartner gleichzeitig Geld abheben wollen:

Nehmen wir an auf dem Konto sind 100 Euro!

Dann würde folgendes passieren: Beide wollen 70 Euro abheben, nun würden die Threads "gleichzeitig" prüfen, ob genug Geld auf dem Konto ist. Und da sie beide "gleichzeitig" prüfen und noch keiner Geld abgehoben hat ist die Bedingung erfüllt und beide Threads heben 70 Euro vom Konto ab, da sie ja vorher geprüft haben, ob genug Geld da war - und es war ja auch genug da!

Als Ergebnis hätten wir einen neuen Kontostand von -40 Euro - genau das was wir mit dem Programm verhindern wollten!

Ähnliche Probleme können auftreten, wenn mehrere Threads mit mit der selben Datenquelle arbeiten. Wenn zB. Thread 1 eine Datei löscht auf die Thread 2 noch zugreifen will, stürzt das Programm mit einer Exception ab!

Man müss also Möglichkeiten suchen solche Probleme zu erkennen und vorzubeugen! Das werde ich dann im Teil 2 dieser Serie an Hand von ein paar Beispielen behandeln!

VN:F [1.9.3_1094]
Rating: 6.8/10 (4 votes cast)
Get Adobe Flash playerPlugin by wpburn.com wordpress themes