BigBasti's Blog About Me & my Digital Lifestyle

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.8.4_1055]
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.8.4_1055]
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.8.4_1055]
Rating: 5.0/10 (2 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.8.4_1055]
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.8.4_1055]
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.8.4_1055]
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.8.4_1055]
Rating: 6.8/10 (4 votes cast)
14Sep/090

.NET: Parallelprogrammierung

Heutzutage haben die meisten Computer und auch Laptops Prozessoren mit mehreren Kernen. Das wollen natürlich viele Programmierer für sich nutzen um ihre eigenen Programme zu beschleunigen.

intel_quadcore

Bild 1: Eine Intel CPU mit 4 Kernen

An dieser Stelle kommt das Stichwort "Multithreading" ins Spiel! Doch leider denken viele, dass wenn man mehrere Threads innerhalb eines Programms erstellt, diese dann auch auf verschiedenen Prozessoren ausgeführt werden. Doch dies ist leider nicht so!

Denn auf welchem Prozessorkern ein Thread läuft entscheidet der Thread-Sheduler des Systems, außer man sagt ihm was anderes. So werden alle Threads eines Programms meistens nur auf einem Prozessor ausgeführt und laufen somit nicht parallel sondern sequentiell!

Es sieht zwar aus, dass die beiden Threads gleichzeitig arbeiten, dem ist aber nicht so! Also ist multithreading nicht gleich parallel!

Denn nur wenn ein Programm parallel auf zwei Kernen läuft erzielt man auch einen Performance Gewinn, da erst dann die Threads wirklich parallel laufen! So kann auch Multithreading auf einem SingleCore CPU zu Performanceeinbußen kommen, da das erstellen der Threads und das Hin- und Herschlalten zwischen den Threads Zeit kostet!

Was dazu kommt ist, dass Parallelprogrammierung sehr komplex ist und es zu unvorhergesehenen Problemen kommen kann. Zum Beispiel können die so genannten "Dead Locks" entstehen, wenn zB. "Thread A" den Wert einer Varibale löscht, die "Thread B" aber noch benötigt! Ein Crash ist vorprogrammiert!

Hier müssen "Synchronistations" Techniken angewandt werden um die Bildung solcher Fehler vorzubeugen, die nur sehr schwer durch debugging entdeckt werden können!

Das ist ein sehr großes Thema, das ich demnächst auch in einer Serie weiter vorstellen werde und auch einige Beispiele dazu anfertigen!

Bisdahin kann ich euch den MSDN-Webcast zu diesem Thema empfehlen, der vom Einstieg über die Probleme  auch einige Beispiele bietet! Zu finden hier!

VN:F [1.8.4_1055]
Rating: 8.5/10 (2 votes cast)
13Aug/090

Zusammenwohnen mit Google: Fluch oder Segen?

Was wäre wenn Google eine reale Person wäre? Und was wäre wenn ihr mit dieser Person zusammen wohnen würdet?

Diese Gedanken haben sich "The Big Honkin'" gemacht und haben das auch auf Video festgehalten!

Dabei sieht man schnell, dass alle Googles nützlichen Features dann doch etwas zu weit gehen, und dass nicht alle Menschen ihre persönlichen Informationen verbreiten möchten!

Besonders interessant und gut gemacht finde ich das Auftreten von Double Click, der Personen nahe Informationen schnell verarbeitet und in Geld verwandelt!

Etwas übertrieben aber durchaus realistisch sind auch die Szenen wo Google zu tief in die Privatsphäre eingreift und peinliche Bilder und Videos zeigt und nach einer Beschwerde dann vorschlägt die "Privacy Settings" zu ändern. Einfach herrlich!

Folge 1:

Folge 2:

Folge 3:

VN:F [1.8.4_1055]
Rating: 0.0/10 (0 votes cast)
12Aug/092

Codeklau & wie man eigenen Code schützen kann Teil 2

In diesem zweiten Teil werde ich darauf eingehen, wie man seinen Code möglichst gut schützen kann. Natürlich gibt es keinen 100%igen Schutz aber man kann es jemandem durchaus schwer machen an seinen Code zu kommen.

Es gibt mehrere Ansätze wie man das Problem angehen kann. Zum Einen wäre da die Möglichkeit unseren .NET Code nicht in ein Assembly sondern in eine native Anwendung zu kompilieren. Das würde die Dekompilierung um einiges erschweren.

Dafür stellt und Microsoft mit dem .NET Framework bereits ein Tool zur Verfügung. Dieses kann eure Assemblys in Maschinencode compilieren, tut also das was der JIT-Compiler sonst erst bei der Ausführung machen würde! Dies hat den Vorteil, dass die Anwendung schneller arbeitet, da sie direkt ausgeführt werden kann, aber wird erheblich größer, da alle .NET Abhängigkeiten nun in das Programm integriert werden müssen. Es kann nun sogar ohne ein Installiertes .NET Framework ausgeführt werden!

Das Programm was das für uns erledigt nennt sich "ngen.exe" und ist ein Kommandozeilen Programm. Im MSDN gibts eine umfassende Anleitung für das Programm weswegen ich hier nicht auf die Funktionsweise eingehen werde!

Leider bringt diese Art der Kompilierung einen entscheidenden Nachteil mitsich, nämlich dass das Programm die Plattformunabhängigkeit verliert und meistens nurnoch auf dem eigenen Rechner (auf dem es erstellt wurde) benutzt werden kann! Also müssen wir uns etwas anderes einfallen lassen!

Und tatsächlich gibt es eine weitere Möglichkeit seinen Code zu schützen und dennoch keine Nachteile aufkommen zu lassen! Das Visual Studio bringt bereits ein Programm mitsich das uns da helfen kann! Das ist der sogenannte "Dotfuscator Community Edition" den man über das "Extras"-Menü in Visual Studio aufrufen kann!

Diese "Ofuscatoren" machen dann, simpel ausgedrückt, den Quelltext schlechter lesbar. Was sich so simpel anhört ist aber sehr effektiv! Wie ich an einem Beispiel demonstrieren möchte:

Hier ersteinmal der Quelltext den wir geschrieben haben in der Originalform:


private void CalcPayroll(SpecialList employeeGroup) {
   while (employeeGroup.HasMore()) {
        employee = employeeGroup.GetNext(true);
        employee.UpdateSalary();
        DistributeCheck(employee);
    }
}

Und nun das Ergebnis des Obfuscators:


private void a(a b) {
    while (b.a()) {
        a = b.a(true);
        a.a();
        a(a);
    }
}

Wie man sieht kann man nicht mehr so einfach darauf schließen was diese Funktion eigentlich machen soll, da alle für den Menschen logischen Bezeichner fehlen!

Was macht der Obfuscator also genau? Seine Hauptaufgabe ist natürlich den Quelltext nach dem Dekompilieren für den Menschen möglichst unleserlich zu machen. Das wird dadurch erreicht, dass alle Bezeichner und alle Texte die im Quelltext vorkommen durch zufallsgenerierte Bezeichner ersetzt werden. Denn dem Computer ist es egal, ob eine Variable "anzahlBenutzer" oder "3Fdg4§§s" heißt. Aber der Benutzer der den Quelltext liest ist natürlich sehr verwirrt da er nichts mit diesen Bezeichnungen anfangen kann.

Es gibt auch andere Dritthersteller, die Software anbieten die genau das machen soll, nur besser versteht sich! Ich habe zum testen mal den Phoenix Protector, teLock und den im Visual Studio integrierten Dotfuscator ausprobiert.

Wobei ich teLock nicht weiter behandeln werde, da alle daraus erzeugten Programm nicht lauffähig waren und immer abgestürzt sind!

Wie kann man selbst vorgehen um zu testen wie gut sein Programm geschützt ist? Ganz einfach, indem man so vorgeht als ob man ein fremdes Programm "knacken" würde. Dazu können wir uns dem Tool .NET Reflector bedienen, das ich im ersten Teil vorgestellt habe!

Ich werde hier als Beispiel mal das Tool aus dem Beitrag "Den Office Lizenzschlüssel aus der Registry auslesen" verwenden. Wenn wir das Programm dekompilieren dann sehen wir ca dieses Bild:

bild-32Bild 1: Office Key Finder im Dekompilierten Zustand

Wie man sieht konnte das Programm komplett dekompiliert werden und man kann in dem Quelltext wunderbar lesen (rechts)! Ich habe des weiteren die Stellen hervorgehoben, wo man die Original Namen der Variablen und Funktionen erkennen kann! - So sieht eine ungeschützte .NET Anwendung aus.

Nun habe ich den Phoenix Protector mal drüber laufen lassen und die selben stellen markiert.

bild-113Bild 2: Dieses Mal ist der Quelltext viel schlechter lesbar!

Wie man sieht haben nun alle Klassen, Funktionen und Variablen ganz andere unlogische Namen bekommen die in keinster weise deren Funktion wiederspiegeln!

bild-6Bild 3: Der Dotfuscator beschränkt sich auf das nötigste

Bild 3 zeigt das Ergebnis des im Visual Studio eingebauten Dotfuscators. Dieser hat sogar die Klassenstruktur geändert und auf das nötigste reduziert! (links)

Ich war aber mit dem Ergebnis des Phoenix Protectors besser zufrieden, denn nach etwas herumspielen mit den Einstellungen konnte ich den Quelltext so gut "tarnen", dass selbst der Disassambler diesen nicht mehr auflösen konnte und sich mit einem Fehler verabschiedete!

bild-26Bild 4: Das perfekte Ergebnis, der Quelltext lässt sich nicht mehr einsehen!

Das ist natürlich ein super Ergebnis! Ich habe es nicht an weiteren Programmen ausprobiert, aber ich denke nicht, dass man immer dieses Ergebnis haben wird und natürlich muss man im Hinterkopf behalten, dass auch das nicht sicher ist sondern auch mit genug Zeit ebenfalls geknackt wird!

Auch wenn diese Methode keinen perfekten Schutz bietet (den es eh nicht gibt!) ist sie trotzdem effektiv! Alle Tools die ich hier benutzt habe sind auch kostenlos und leisten dafür sehr viel! Ausprobieren lohnt sich! Als Alternative die aber auch was kostet kann ich euch .NET Reactor ans Herz legen. Dieses Tool arbeitet ebenfalls sehr gründlich sodass es teilweise nicht möglich ist zu dekompilieren kostet aber auch knappe 200 €!

Gut, kommen wir zu der dritten und auch sichersten und besten Lösung! .NET bietet uns die Möglichkeit auf fremdcode zuzugreifen zb. aus der Windows-API oder eigenen DLLs. Man kann auch Code aus dem Internet nachladen oder bestimmte Dienste in WebServices auslagern.

Und das Sollte man machen! So kann man das Hauptprogramm gerne in .NET schreiben, aber man sollte dann die besonders aufwendigen und geheimen Algorithmen und Prozeduren in eigene Native DLLs auslagern, die man dann wiederum ins Programm einbinden kann!

Das garantiert eine einfache Arbeit und höchste sicherheit! Denn auch wenn man dann das Hauptprogramm dekompiliert, ist der wichtige Teil immernoch sicher in der DLL verpackt!

Zum Schluss nochmal: hier habe ich nur .NET behandelt natürlich gibt es auch für Java und auch für Javascript Obfuscators die den selben Job machen, diese aber ebenfalls vorzustellen würde den Rahmen aber sprengen!

Ich hoffe dieser Zweiteiler hat euch gefallen und freue mich auf euer Feedback!

Interessiert dich dieses Thema? Möchtest du hier mehr Beiträge darüber lesen? Schreib ein Kommentar was dir gefallen hat oder was nicht.

VN:F [1.8.4_1055]
Rating: 10.0/10 (3 votes cast)
Get Adobe Flash playerPlugin by wpburn.com wordpress themes