Firefox: 4GB Plugin-Updates

Gerade hat sich Firefox bei mir gemeldet und mir verraten, dass es ein paar Plugin-Updates gibt. Updates gestartet... aber was ist das?! Jedes Plugin will plötzlich 4 Gigabyte an Daten herunterladen! 🙁

Firefox: 4GB Plugin-Updates

Glücklicherweise wurden schlussendlich doch nicht die vollen 4GB heruntergeladen - ein bisschen Angst hatte ich davor allerdings schon!

Wie kann so ein Fehler denn zustande kommen? Hat der Updater vielleicht einfach nur die Größe des Plugins nicht anfragen können und hat deswegen die 4GB angezeigt? Ist euch soetwas auch schon einmal aufgefallen?
Update:
@huxi hatte bereits nach ein paar Minuten eine mögliche Antwort für das Problem geliefert:

@weizenspreu Da wurde -1 als unsigned int angesehen => 4GB 😀
(@Huxi bei Twitter.com)

Aktuelle Grüße, Kenny

Naziaufmärsche und Parteigezanke

Eigentlich hatte ich mir ja vorgenommen, zu dem Thema meine Klappe zu halten, aber inzwischen gibt es so viele Meinungen dazu im Netz, dass ich auch meine mal kundtun möchte. Thema ist die Initiative "Dresden Nazifrei", die dazu aufruft, Europas größten Naziaufmarsch, der am 13.02.2010 in Dresden stattfinden soll, mit einer Sitzblockade zu vereiteln.

Dieser Aufruf ist in den letzten Tagen in die Schlagzeilen geraten, nachdem Razzien durchgeführt, Werbematerial beschlagnahmt und Plakatierer festgenommen wurden. Parallel dazu wurde die Webseite der Initiative Dresden-Nazifrei.de vom LKA Sachsen gesperrt, obwohl dieses Vorgehen von Juristen als unhaltbar angesehen wird (die Webseite ist inzwischen übrigens unter Dresden-Nazifrei.com erreichbar).

Ein ganz anderes Feuer brodelte - und brodelt immernoch - innerhalb der Piratenpartei. Dort ist man zwiegespalten über die Teilnahme an dieser Blockade. Die einen berufen sich auf § 1 Abs. 1 der Bundessatzung, der wie folgt lautet:

(1) Die Piratenpartei Deutschland (PIRATEN) ist eine Partei im Sinne des Grundgesetzes der Bundesrepublik Deutschland und des Parteiengesetzes. Sie vereinigt Piraten ohne Unterschied der Staatsangehörigkeit, des Standes, der Herkunft, der ethnischen Zugehörigkeit, des Geschlechts, der sexuellen Orientierung und des Bekenntnisses, die beim Aufbau und Ausbau eines demokratischen Rechtsstaates und einer modernen freiheitlichen Gesellschaftsordnung geprägt vom Geiste sozialer Gerechtigkeit mitwirken wollen. Totalitäre, diktatorische und faschistische Bestrebungen jeder Art lehnt die Piratenpartei Deutschland entschieden ab.
(Bundessatzung der Piratenpartei Deutschland, Hervorhebung durch mich)

So lehnt Sven Scholz zum Beispiel jegliche Meinungsfreiheit für Nazis ab es ab, dass die Ideologie der Nazis unter dem Deckmantel der Meinungsfreiheit geschützt wird, da er die Nazi-Ideologie nicht als Meinung sondern als Verbrechen ansieht:

Zur “Meinungsfreiheit” der Nazis: Ich sehe eine Ideologie, die Menschenrechte nicht nur missachtet sondern ihnen offen widerspricht nicht als “Meinung”, die durch Menschenrechte gedeckt ist. Naziideologie ist keine Meinung sondern ein Verbrechen.
(Artikel in Sven Scholz' Blog)

Die andere Seite widerum beruft sich ausschließlich auf § 5 Abs. 1 des Grundgesetzes, in dem es heißt:

(1) Jeder hat das Recht, seine Meinung in Wort, Schrift und Bild frei zu äußern und zu verbreiten und sich aus allgemein zugänglichen Quellen ungehindert zu unterrichten. Die Pressefreiheit und die Freiheit der Berichterstattung durch Rundfunk und Film werden gewährleistet. Eine Zensur findet nicht statt.
(§ 5 Abs. 1 GG)

Natürlich ist es edel, sich nur auf diesen Absatz zu stürzen, allerdings geht der § 5 noch weiter. Auch dieser sollte unbedingt Beachtung finden, bevor man für Menschenverächter in die Bresche springt:

(2) Diese Rechte finden ihre Schranken in den Vorschriften der allgemeinen Gesetze, den gesetzlichen Bestimmungen zum Schutze der Jugend und in dem Recht der persönlichen Ehre.
(§ 5 Abs. 2 GG)

In meinen Augen ist es nicht hinnehmbar, dass eine Gruppe die Rechte, die ihnen zustehen, missbrauchen, um damit die Rechte anderer Gruppen öffentlich zu unterminieren. In diesen Fällen muss der demokratische Staat - zu dem sich auch die Piratenpartei bekennt - aktiv werden und die Rechte und die Ehre der einzelnen Bürger schützen, die bei solchen Naziaufmärchen tangiert werden.

Das wird wahrscheinlich auch der Grund sein, weshalb der Landesverband Sachsen im Piratenpartei-Wiki seine Unterstützung bei der Teilname an "öffentlichen, friedlichen Aktionen und Demonstrationen" erklärt hat. Schön war auch zu sehen, dass der Bundesverband dies auch kurze Zeit später auf der offiziellen Webseite der Piratenpartei Deutschland nachgeholt hat. Man darf jedoch nicht vergessen, dass angemeldete Demonstrationen und Prosteste den besseren Weg zur friedlichen Bekämpfung von Verfassungsfeinden darstellen.
Genau diese Aussage bekräftigt auch noch einmal die Pressesprecherin des LV Berlin - Lena Rohrbach - in einem Kommentar im Spreeblick-Blog. Aktionen gegen Naziaufmärsche sind gerechtfertigt, solange probate, verfassungskonforme Mittel dafür eingesetzt werden.

Und für alle Gegner solcher Gegendemonstrationen, die ausschließlich auf den § 5 Abs 1. GG pochen, möchte ich abschließend gerne noch den Kommentar von Julian anführen, der das ganze in meinen Augen wunderbar zusammenfasst:

Jeder hat das recht zu demonstrieren, auch die Gegner einer anderen Demo. Meinungsfreiheit heisst nicht, seine Meinung unwidersprochen kundtun zu dürfen.
(Kommentar von "Julian" auf SvenScholz.de)

Diese Aussage trifft haargenau meinen Gedanken: Natürlich dürfen die Leute ihre Gedanken äußern, jedoch müssen sie damit rechnen, dass sie vom Staat dazu ermahnt werden, nicht die Rechte und die Ehre anderer zu verletzen und dass sich ihn andere Leute in den Weg stellen, die ihre Meinung nicht teilen und als Gegensprecher auftreten. So ist das nunmal in einer Demokratie: Es gibt immer mehr als nur eine Meinung. 😉
Update:
Im Zuge eines Kommentars von Sven Scholz habe ich den Absatz über seine Ansichten zur Meinungsfreiheit der Nazis abgeändert. Danke für die Korrektur! 😀
Demokratische Grüße, Kenny

Rossmann und der Diebstahlschutz

Letztens war ich mal wieder bei Rossmann und bin am DVD-Regal hängen geblieben: Dort lagen 2 Filme der Monty-Python-Crew aus - "Das Leben des Brian" und "Die Ritter der Kokusnuss"; zwei echte Klassiker des britischen Humors! 😀

Jedenfalls habe ich die DVDs genommen, bin zur Kasse, habe sie bezahlt, will aus dem Laden raus und plötzlich *piep* *piep* *piep*! Oh, da hatte wohl jemand vergessen, den RFID-Tag zu töten. Ich wurde damit getröstet, dass sie die DVDs erst seit kurzem mit diesen sogenannten 1-Bit-Tags schützen.

RFID-Tag


Nunja, nicht nur, dass diese äußerst einfach zu entfernen sind, sie lassen sich laut Wikipedia auch noch mit einem einfachen Magneten deaktivieren! Das nenne ich mal trügerische Sicherheit! Interessant ist übrigens auch, dass diese viereckigen RFID-Etiketten sich mit einer 1-Euro-Münze aushebeln lassen.

Dumm nur, dass die Kosten für diese sinnlosen Sicherungsversuche natürlich schlussendlich mal wieder vom Kunden bezahlt werden dürfen.
Etikettierte Grüße, Kenny

RunAs für normale Dokumente anwenden

Hannes hat letztens das Tool CPAU vorgestellt, das im Grunde genauso funktioniert, wie das Windows-interne runas-Programm. Wer dessen Funktionalität nicht kennt: Es ist dazu da, um eine Anwendung mit den Rechten eines anderen Benutzers ausführen zu können.

Nun ist bei ihm das Problem aufgetreten, dass es ihm nicht möglich ist, MSP-Dateien auszuführen. Grund hierfür ist, dass es sich bei MSP-Dateien nicht um echte, ausführbare Dateien handelt, sondern um Dokumente - also im Grunde wie Bilddateien.

Wenn ihr sehen wollt, was Windows im Hintergrund macht, wenn ihr ein Dokument doppelt anklickt, könnt ihr folgendes machen:

  1. Drückt die Tastenkombination Windowstaste+R. Es öffnet sich das Ausführen-Fenster.
  2. Gebt in dem Fenster "regedit" ein und drückt Enter. Es öffnet sich der Registry-Editor.

    Ausführen-Dialog

  3. Öffnet unter "Arbeitsplatz" den Baum "HKEY_CLASSES_ROOT". Darunter findet ihr eine Liste aller Dateiendungen.

    HKEY_CLASSES_ROOT

  4. Öffnet nun den Eintrag einer Dateiendung - zum Beispiel ".jpg". Ihr seht ein paar Unterelemente.

    .jpg Knoten

  5. Guckt, ob es den Unterbaum "shell/open/command" gibt. Falls ja, macht weiter mit Punkt 8, falls nein, macht weiter mit Punkt 6.
  6. Klickt den aktuellen Baumeintrag (z.B. ".jpg") an, dieser sollte einen Wert "(Standard)" beinhalten. Der darin gespeicherte Wert ist ein Platzhalter.

    .jpg-(Standard)-Wert

  7. Sucht einen Baumeintrag, der den Namen des Platzhalters entspricht. Die Platzhalter dienen dazu, dass mehrere Dateiendungen sich genau gleich verhalten (z.B. ".jpg" und ".jpeg").

    jpegfile Knoten

  8. Öffnet nun den Unterbaum "shell/open/command". Dieser Knoten bestimmt, was geschehen soll, wenn eine Datei dieses Typs geöffnet werden soll.

    shell/open/command Knoten

  9. Seht euch nun den Wert "(Standard)" an. Dieser beinhaltet den tatsächlich ausgeführten Befehl zu einer Dateiendung (z.B. bei einem Doppelklick). Der Parameter "%1" wird bei der Ausführung mit dem entsprechenden Dateinamen ersetzt. Einige Dateitypen (z.B. MSI-Dateien) können zusätzliche Parameter erhalten. Diese können mit dem Parameter "%*" übergeben werden.

    shell/open/command-(Standard)-Wert

(Für diejenigen unter euch, die gerne experimentieren: Lasst die Finger von dem Knoten "exefile"! Wenn ihr diesen unbedarft ändert, zerschießt ihr euch das ganze System. Um das dann wieder gerade zu biegen, müsst ihr remote den entsprechenden Registry-Hive mounten und den Registry-Eintrag reparieren.)

Nach diesem kleinen Exkurs kommen wir nun zurück zum Thema: Das Problem, weshalb die runas-Programme diese MSP-Datei nicht öffnen können, liegt wahrscheinlich daran, dass sie versuchen, die Datei direkt auszuführen - dabei müssten sie doch erst nachgucken, mit welchem Programm die Datei geöffnet werden muss! Und genau hierfür habe ich ein kleines Programm mit dem Namen "execute" geschrieben: Es macht nicht viel, sondern öffnet eine angegebene Datei einfach anhand des Befehls, der dort in der Registry hinterlegt ist. Dabei ist es egal, ob es sich um ein Programm, ein Bild oder etwas anderes handelt. Den Quelltext des Programms findet ihr hier:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
program execute;

uses
  Windows,
  SysUtils,
  ShellAPI,
  ActiveX;

var
  VCOMCode    : HRESULT;
  VIndex      : Integer;
  VParameters : String;
  VReturnCode : Cardinal;

begin
  ExitCode := 0; // application terminated successfully

  if (ParamCount > 0) then
  begin
    VParameters := '';
    for VIndex := 2 to ParamCount do
      VParameters := VParameters + '"' + ParamStr(VIndex) + '" ';
    Delete(VParameters, Length(VParameters), 1); // trim last space character

    VCOMCode := CoInitializeEx(nil, COINIT_APARTMENTTHREADED or COINIT_DISABLE_OLE1DDE);
    if ((VCOMCode = S_OK) or (VCOMCode = S_FALSE)) then
    begin
      try
        VReturnCode := ShellExecute(0,                                       // hwnd,
                                    'open',                                  // lpOperation,
                                    PAnsiChar(ParamStr(1)),                  // lpFile,
                                    PAnsiChar(VParameters),                  // lpParameters,
                                    PAnsiChar(ExtractFilePath(ParamStr(1))), // lpDirectory,
                                    SW_SHOWNORMAL                            // nShowCmd
                                   );

        if (VReturnCode <= 32) then
          ExitCode := 100 + VReturnCode; // file could not be executed
      finally
        CoUninitialize();
      end;
    end
    else
      ExitCode := 2; // COM could not be initialized
  end
  else
    ExitCode := 1; // file was not provided
end.

Die Verwendung der Anwendung ist super einfach: Ihr ruft das Programm einfach mit dem Pfad der auszuführenden Datei als ersten Parameter auf - alle weiteren Parameter werden an die Datei als weitere Parameter übergeben.

In diesem Beispiel wird z.B. die Kommandozeile mit den Rechten des Administrators aufgerufen, Google angepingt und die Kommandozeile danach offen gehalten:

1
runas /user:Administrator "execute cmd /K ping "google.de""

Bitte beachtet, dass der gesamte Aufruf mit allen Parametern für das aufgerufene Dokument in einem Parameter an runas übergeben werden muss! Sollte es nötig sein, Anführungungszeichen für die eigentlichen Parameter zu benutzen, so müssen diese mit einem Backslash "escaped" werden. Seht euch den Parameter \"google.de\" als Beispiel an. 😉

Ich hoffe, euch hat dieser kleine Ausflug in die Welt der Dateitypen gefallen und ihr habt ein bisschen was darüber gelernt, wie Windows eure Dateien intern behandelt. 🙂
Update:
Ich sorge nun vor dem Aufrufen noch dafür, dass COM ordentlich initialisiert und danach auch wieder deinitialisiert wird. Man weiß ja nie. 😉

Zum Schluss noch etwas Rechtliches:
Der Autor dieses Programms haftet nicht für Schäden an Soft- oder Hardware oder Vermögensschäden, die durch das Benutzen des Programms entstehen, es sei denn, diese beruhen auf einem grob fahrlässigen oder vorsätzlichen Handeln des Autors, seiner Erfüllungsgehilfen oder seiner gesetzlichen Vertreter.
Aufrufende Grüße, Kenny

P.S.: Wie zu erkennen ist, verwende ich einfach die API-Funktion ShellExecute(). Wer Langeweile hat und sich mit dem Parsen der Befehle herumärgern will, der kann das ganze natürlich auch nach dem oben beschriebenen Schema nachbauen (Action auslesen und über CreateProcess() nachbilden).

Kostenloses PDF-zu-Text-Programm

Nachdem ich vor einiger Zeit verzweifelt versucht habe, aus einer PDF-Datei den darin enthaltenen Text zu extrahieren, wollte ich euch nun einmal zeigen, wie man soetwas relativ einfach selbst realisieren kann.

Auf meiner Suche nach einer Lösung bin ich mehrfach über Implementationen gestoßen, die die gewünschte Funktionalität zwar bieten, aber entweder Geld gekostet hätten oder sich nicht für eine Automation hätten verwenden lassen.

Schlussendlich gelöst wurde es nun in Java unter Zuhilfenahme der Bibliothek PDFBox. Wer mich kennt, weiß, dass ich eigentlich ein Java-Kritiker bin, aber in diesem Fall war es nunmal die einfachste Lösung 😉 .
PDFBox scheint derzeit in ein Apache-Projekt überführt zu werden: es durchläuft gerade den Apache Incubator Prozess - es ist also zu hoffen, dass der Quelltext auch in Zukunft gepflegt werden wird.
Derzeit aktuell ist die Version 0.7.3 - diese scheint jedoch einigen Änderungen unterlaufen zu sein, die nicht vollständig durchdacht wurden. Deshalb empfehle ich vorerst, die Version 0.7.2 weiterzuverwenden.
Aus früheren Erfahrungen weiß ich, dass diese Lösung leider Probleme mit geschützten PDF-Dateien hat - für einfache Dokumente reicht sie jedoch allemal aus. Eventuell ändert sich dies ja, wenn die Bibliothek in Zukunft weiterentwickelt wird.

Kommen wir zur Implementierung: Nachdem ihr ein neues Projekt angelegt und die gerade besprochene Bibliothek zu dem Projekt hinzugefügt habt, müsst ihr zuerst ein paar Klassen importieren. Hier sind, alle, die benötigt werden:

1
2
3
4
import java.io.File;
import java.io.FileWriter;
import org.pdfbox.pdmodel.PDDocument;
import org.pdfbox.util.PDFTextStripper;

Danach benötigt ihr noch die folgende Methode - diese kümmert sich um alles weitere. Vom Einlesen der PDF-Datei, über das Konvertieren bis hin zum Erstellen der Text-Datei ist dort alles enthalten:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
private static void ConvertPDF2TXT(String APDFFile,
                                   String ATXTFile) {
  File LFile = new File(APDFFile);
  if (LFile.isFile()) {
    try {
      try {
        PDDocument LDocument = PDDocument.load(LFile);

        FileWriter LWriter = new FileWriter(ATXTFile);
        try {
          PDFTextStripper LStripper = new PDFTextStripper();
          LStripper.setStartPage(1);
          LStripper.setEndPage(LDocument.getNumberOfPages());
          LStripper.writeText(LDocument, LWriter);
        }
        finally {
          LWriter.close();
        }
      }
      catch(Exception e) {}
    }
    catch(Exception e) {}
  }
}

Die Verwendung sollte selbsterklärend sein - der erste Parameter ist der Name der existierenden PDF-Datei, der zweite Parameter ist der Name der zu erzeugenden Text-Datei. Der Ordner, in den die Text-Datei gespeichert werden soll, muss bereits existieren.

Ich hoffe, dass diese Minimallösung für den ein oder anderen hilfreich sein wird. Leider muss mit dem eigenen Programm die gesamte PDFBox-Library mitgeliefert werden - immerhin über 3MB.
Vielleicht findet sich ja jemand, der Lust hat, das ganze soweit zusammenzustellen und alle unnötigen Klassen zu entfernen, damit das Programm in einer einzigen JAR-Datei ausgeliefert werden kann. Falls sich jemand die Arbeit macht, würde ich mich über eine Information darüber freuen - zwecks Verlinkung 😉 .

Bis dahin wünsche ich viel Spaß mit dem eigenen PDF-zu-Text-Programm!
Textliche Grüße, Kenny

Seite 58 von 87« Erste...575859...Letzte »