Programmierung und Speicherstrukturen

18. Juli 2010 sep Keine Kommentare

Da ich doch öfters schon mal feststellen musste, dass angehende Informatiker oder auch Informatiker recht wenig Wissen über Collections und Datensammlungen haben, möchte ich hier mal versuchen meine Erfahrungen mit Collections in der Programmiersprache Java kund zu tun. Denn die Informatik beschäftigt sich nun mal sehr stark mit der Haltung und auch der Auswertung von Datenmengen. Damit dies hochperformant gesehen kann, sollte man sich in den verschiedenen Arten der Datenstrukturen doch schon auskennen.

Was sind Collections?

Collections sind in der Programmierung Strukturen zum organisieren von Daten. Das heißt um Daten in dem Arbeitsspeicher zu halten, oder zu bearbeiten, oder oder oder. Möglichkeiten der Datennutzung gibt es ja viele. Genauso gibt es auch viele Strategien zum organisieren der Daten innerhalb der Collection. Jede Strategie hat natürlich ihre Vor- und Nachteile. Jedoch möchte man nach Möglichkeit nur die Vorteile nutzen, um ein Programm möglichst leistungsfähig umzusetzen. Einen guten Überblick über die verschiedenen Arten von Collections im Java-Framework gibt die Java-Dokumentation her[1]. Einzuteilen sind diese Strukturen in

  1. Array
  2. List
  3. Vector
  4. Queue
  5. Stack
  6. Set
  7. Map

Ich werde nun versuchen die einzelnen Arten der Datensammlungen anzureißen und einen Überblick über diese zu geben.

Array

Das Array oder auch Feld, ist in der Programmierung wohl eines der bekanntesten Vertreter der Datenstrukturen. Es zeichnet sich dadurch aus, dass es sehr kompakt ist. Die Zugriffe auf die einzelnen Elemente erfolgt direkt anhand eines Indexes. Somit gibt es sehr kurze Zugriffszeiten bei einem willkürlichen Zugriff. Im inneren ist ein Array ein fest reservierter, zusammenhängender Platz im Speicher. Die Elemente werden nacheinander in diesem reservierten Speicher abgelegt. Der Index, mit welchem auf die Elemente zugegriffen wird, bezeichnet dann den Abstand des Elements von dem Anfang des Arrays. Somit gibt es nur einen Verweis auf das erste Element und die Elemente selbst, welche in dem Array gespeichert werden.

List

Bei einer Liste handelt es sich um eine dynamisch wachsende Speicherstruktur. Einzelne Elemente oder auch mehrere sind wiederum mit einzelnen oder mehreren Elementen verkettet. Die Elemente liegen also nicht nacheinander im Speicher sondern können überall abgelegt werden. Das wichtige dabei ist jedoch, dass die Verweise nicht abhanden kommen. Der Vorteil liegt klar auf der Hand. Es können dynamisch Elemente hinzu gefügt werden. Die Liste besitzt also keine festen Grenzen wie Beispielsweise das Array. Jedoch habe ich keinen direkten willkürlichen Zugriff auf die Elemente. Denn um zu einem Element zu gelangen muss ich immer den Verweisen, bis zu dem gewünschten Element folgen. Somit ist eine Liste selbstverständlich langsamer als ein Array. Des weiteren werden bei Listen häufig Statusinformationen vorgehalten. Wie die Kapazität der Liste, oder auch die Anzahl der Elemente, welche sich in einer Liste befinden. Des weiteren muss Speicher für die Verweise auf Elemente zur Verfügung stehen. Somit ist noch ein Nachteil der Liste klar sichtbar. Der Overhead ist natürlich auch größer als bei einem Array. Es gibt sehr viele verschiedene Möglichkeiten eine Liste zu programmieren und man wird im Internet sehr schnell fündig über Herangehensweisen an eine Liste. So möchte ich auch eine aufzeigen, da ich vor einiger Zeit eine Liste in C implementiert habe. Dabei handelt es sich um eine einfach verkettete Liste[2].

Vector

Bei einem Vektor handelt es sich ebenfalls um eine dynamische Speicherstruktur. Jedoch wird hier versucht den Nachteil der Lesegeschwindigkeit zu kompensieren. Bei einem Vector handelt es sich im inneren um ein Array, welches nach Bedarf vergrößert wird. Ist also die Kapazität eines Vectors erschöpft, wird ein neues Array initialisiert und alle Elemente welche enthalten waren werden einfach in das neue Array kopiert. Somit hat sich die Kapazität vergrößert. Der Vorteil ist, dass es hier ebenfalls einen willkürlichen Zugriff gibt. Die Lesegeschwindigkeit ist ähnlich hoch, wie bei einem Array. Jedoch kann das einfügen sehr viel länger dauern, wenn denn die Kapazität des Vektors vergrößert werden muss. Von daher sollte man ungefähr eine Ahnung haben wie viele Elemente in dieser Datensammlung gespeichert werden sollen.

Queue

Bei der Queue handelt es sich um eine Datensammlung nach dem FIFO-Prinzip. Also First-in-first-out. Der Zugriff auf die anderen Elemente ist nachrangig. Es erfolgt immer nur direkter Zugriff auf das erste Element in der Struktur. Inwieweit hier intern die Daten organisiert werden ist ebenfalls nachrangig. Da ein Element sofort wieder verworfen wird, wenn es gelesen wurde. Wo kann man eine solche Datenstruktur einsetzten? Ich würde unter anderem sagen, wo Daten aus einem Stream kommen. Es wird dann dort gearbeitet wie bei einer Warteschlange. Die Daten, welche als erstes aus einem Stream kommen, werden als erstes verarbeitet. Die anderen müssen sich hinten anstellen und auf die Verarbeitung noch warten.

Stack

Bei einem Stack handelt es sich um ein ähnliches Prinzip wie bei der Queue. Nur das ein Stack nach dem LIFO-Prinzip arbeitet (Last-in-first-out). Also genau anders herum. Mir mag leider gerade kein Beispiel einfallen, wo ein Stapelspeicher eingesetzt wird in der Programmierung. Jedoch wird auf Prozessorebene ein Stack eingesetzt. Wenn der Prozessor in ein Unterprogramm springt, also in eine Funktion, so wird mindestens die Rücksprungadresse auf den Stack geschrieben. Wenn die Funktion abgearbeitet ist, holt er sich die letzte Rücksprungadresse aus dem Speicher und setzt dann dort seine Arbeit wieder fort.

Set

Bei einem Set handelt es sich um eine Menge. Das heißt ein Element darf in dieser Datensammlung nur ein mal vorkommen. Jetzt stellt sich mir die Frage, wie man das möglichst effizient lösen möchte. Da half mir ein kleiner Blick in die Java-Sources (Die sollten bei einer SDK Installation dabei sein). Jedes Objekt kann in der OOP einen so genannten HashCode erzeugen. Dieser HashCode ist relativ eindeutig.

Ein Hashwert wird deshalb auch als Fingerprint bezeichnet, da er eine nahezu eindeutige Kennzeichnung einer größeren Datenmenge darstellt, so wie ein Fingerabdruck einen Menschen nahezu eindeutig identifiziert.[3]

Die einzelnen Elemente in diese Speicherstruktur ermitteln also ihren Index also weitestgehend selber. Der Index erstellt sich dann weiterhin aus der Abhängigkeit zur Kapazität des Sets. Wird die Kapazität vergrößert, so liegt theoretisch auch das Element an einer anderen Stelle. Des weiteren muss das Element noch mit der Equals-Methode auf Eindeutigkeit geprüft werden. Der Vorteil dieser Speicherstruktur ist, dass ein Element auch wirklich nur ein mal vorkommt. Des weiteren ist der Zugriff auf definierte Elemente sehr schnell, da nicht jedes Element geprüft werden muss.

Map

Bei der letzten Speicherstruktur handelt es sich um eine Map, oder Tabelle. Diese arbeitet im Grunde genommen genauso wie ein Set mit Schlüssel-Wert-Beziehung. Denn es wird zu jedem Wert ein Schlüssel abgelegt. Wobei ein Schlüssel in der Datensammlung immer eindeutig sein muss. Der Zugriff auf den Wert erfolgt dann logischerweise über den Schlüssel. Die einzelnen Schlüssel sind organisiert wie die Elemente in einem Set. Somit kann auch ein Zugriff sehr schnell erfolgen. Hauptsächlich wird diese Speicherstruktur als Cache genutzt. Um sich also Daten vor zuhalten und sehr schnell wieder auf diese zuzugreifen.

Fazit

Ich hoffe eine grobe Zusammenfassung über die Arbeitsweise sowie die Vor- und Nachteile einzelner Speicherstrukturen gegeben zu haben. Somit sollten Speicherstrukturen effizient genutzt werden können. Womit ich meine, dass nur die Vorteile genutzt werden sollten!

Links

  1. Collections Framework Overview
  2. Einfach verkettete Liste
  3. Hashfunktion – Wikipedia
Categories: Informatik Tags:

Valide Seite

27. März 2010 sep 4 Kommentare

Ich bin gerade mal dabei meine gesamte seite zu checken ob diese w3 konform ist. Und dabei habe ich am Anfang festgestellt, das dies nicht wirklich der Fall ist. :D Insgesamt bin ich eigentlich nur darauf gekommen, weil ich meine Seite für Suchmaschinen optimieren wollte und bin dabei einige viele Erkenntnisse zu gewinnen. Das Theme, welches ich verwende sollte XHTML 1.1 konform sein. War es aber nicht. Zum einen liegt dies an einigen Artikeln von mir. Wovon ich ja nun nicht allzu viele habe! ^^ Jedoch auch zum Teil an Wordpress. Bestes Beispiel ist das Einbinden von externen Links im Blogroll. So werden diese jeweils wie folgt dargestellt.

<a href="http://www.extern.net/" target="_blank">Extern.net</a>

Leider ist dies aber nicht konform. So zieht sich dies Beispielsweise durch ganz Wordpress durch, wenn man einen externen Link einrichtet, oder einen Link, welcher speziell geöffnet werden soll. Konform ist dies nicht mehr, da das target-Attribut in XHTML 1.1 abgeschafft wurde (in XHTML 1.0 Strict war dies wohl noch enthalten). Das hat folgenden Grund, wie ich hier[1] nachlesen konnte und den ich auch gut akzeptieren kann. HTML bzw XHTML ist eine Formatierungssprache und hat keinen Einfluss auf Layout (CSS) oder Ablauf (JavaScript). (X)HTML ist nur für die Struktur einer Seite zuständig. Denn Webcrawler interessieren sich nicht für Ablauf oder Layout. Genauso Browser wie Lynx oder Links oder ähnliche. Auch Handys haben damit vielleicht Probleme. Also wird das öffnen einer Seite dem JavaScript zugemutet. In dem Forenbeitrag[1] war dann auch vermerkt, wie dis von statten gehen soll.

<a href="http://www.extern.net/" onclick="window.open( 'http://www.extern.net/', '_blank' ); return false;">Extern.net</a>

Mit “window.open” also das neue Fenster in dem entsprechenden Ziel. Das “return false” ist dafür wichtig, wenn der Browser kein JS versteht. Dann wird direkt der hinterlegte Link angesprungen.

Eine weitere Quelle für Fehler lag ebenfalls bei dem a-Tag. Denn diese Tag kann man auch als Anker benutzen, um im Dokument irgendwo hin zuspringen. Normalerweise hatte ich das auch damals mit dem name-Attribut bezeichnet und dann ging das schon. Das fällt leider auch flach in XHTML 1.1. Der Beitrag[2] den ich dazu gefunden habe, war ein bisschen kürzer. Von nun an benutze ich dort nun auch das id-Attribut.

<a id="marke" href="http://www.extern.net/" target="_blank">Extern.net</a>
<a href="#marke">zur Marke springen</a>

Als nächstes bleibt noch das Einbinden von externen Flash-Inhalten. Dort bin ich über das w3 zu einer Lösung[3] des Problems gekommen. Das embed-Tag fällt vollständig weg und ich bleibe nur noch beim object- und param-Tag. Wie der nachher zum Schluss aussehen wird, werde ich dann nochmal zeigen. Denn ganz so wie ich ihn haben will, ist der Tag noch nicht.

Ein weiteres Problem war die Galerie-Funktion von Wordpress in den Artikeln. Denn die Hauseigene Galerie hat einen Style-Tag in die Seite eingebunden, was der Validator nicht ganz so fein fand. Nach längerem, erfolglosem Suchen in dem Code habe ich mich dann entschieden eine externe Galerie als Plugin einzubinden. Dafür habe ich mich für die nextGen-Galerie[4] entschieden. Diese gefällt mir eigentlich ganz gut und ich danke für den Tipp. Damit war dann auch das Problem mit dem ominösen Style-Tag beseitigt, welcher bei jeder Galerie in Worpress auftrat.

Zur Zeit sieht es einigermaßen valide auf meiner Seite aus. Wobei einigermaßen jedoch nur 14 von 22 Artikeln/Seiten meint. Ebenfalls ist mein Blogroll zwar noch angezeigt, aber erst einmal wird es wohl leer bleiben, bis ich dort etwas gefunden habe. Mal schauen, wie es denn noch weiter geht und wie lange ich noch brauche um meine Seite suchmaschinenfreundlich zu machen. Einen Link[5] möchte ich aber noch einmal genannt haben. Dort gibt es eine schöne Erklärung mit dem “www-ahnsinn” und was das mit Frundlichkeit zu tun hat. Danach fehlt mir nur noch eine schöne robots.txt und dann denke ich das alles in Butter ist! ;)

Links

  1. Validierung XHTML 1.1: target=”_blank”
  2. The a name-attribute and XHTML 1.1 Strict
  3. Flash Satay: Embedding Flash While Supporting Standards
  4. NextGEN Gallery
  5. wwwahnsinn
Categories: Informatik Tags: , ,

Dualboot mit Windows und Truecrypt-Verschlüsselung

24. Februar 2010 sep Keine Kommentare

Lange habe ich ja nicht mehr geschrieben. Aber nun melde ich mich doch mal wieder zurück, um zu beschreiben wie ich folgendes Problem gelöst habe.  Nach einiger Zeit habe ich mir doch mal überlegt wieder einmal Windows 7 zu installieren. Ausschlaggebend dafür war mein Vater gewesen, hmm und ich… Da ich Windows eigentlich parallel ab und an mal nutze, brauchte ich einen Dualboot. Partitioniert war meine Festplatte schon. Also Windows DVD rein und einfach mal los installiert. Da meine Linux Platte ja schon mittels LUKS verschlüsselt ist, wollte ich nun auch meine Windows-Systempartition verschlüsseln. Also habe ich mir Truecrypt[1] installiert und dann dort angefangen meine Festplatte zu verschlüsseln. Dies geht dann wie folgt.

Truecrypt

Schritt für Schritt Anleitung, um die Systemplatte von Windows zu verschlüsseln.

23 Fotos

 

Wenn man dieser Galerie folgt, dann sollte es eigentlich kein Problem sein, die Systempartition zu verschlüsseln. Das ist auch nicht unbedingt eine unlösbare Aufgabe und es gibt relativ viele Anleitungen dazu. Nun wird es ein bisschen spannender. Denn wir brauchen nun noch eine Linux-Live-CD. Diese legen wir in das DVD-Laufwerk und booten neu. Selbstverständlich von der DVD/CD. Hat dieser nun durch gebootet und ist bereit, sichern wir uns den Bootsektor der Festplatte. Denn in diesem ist zur Zeit der Bootsektor von Trucrypt enthalten, welchen wir noch brauchen. Normalerweise ist der Bootsektor genau 512 Byte groß. Wie das nun mit neueren WD oder Samsung-Platten ist, weiß ich nicht. Denn diese haben die Sektorgröße auf 4kB gesetzt[2].Vorher mounten wir jedoch unser Boot-Laufwerk und lesen dann den Bootsektor der Festplatte aus.

mount /dev/sda2 /mnt/boot
dd if=/dev/sda ibs=512 of=/mnt/boot/windows_truecrypt.mbr count=1

Danach müssen wir dann noch den Eintrag in der grub.conf einfügen. Diese sieht bei mir folgendermaßen aus.

title Windows 7 Professional
rootnoverify (hd0,0)
makeactive
chainloader (hd0,1)/windows_truecrypt.mbr

Mit dem Chainloader[3] sagen wir ihm, dass dies direkt ausgeführt werden soll. Da sich in der mbr-Datei unser alter Truecrypt-MBR befindet, wird dieser halt ausgeführt. Danach wird der Windows Bootloader ausgeführt und Windows startet “ganz” normal. Also mit Passworteingabe. Nun müssen wir nur noch den alten Grub-Bootloader in den MBR schreiben und dann sollten wir auch schon fertig sein.

mount /dev/sda3 /mnt/gentoo
mount -t proc none /mnt/gentoo/proc
mount -o bind /dev /mnt/gentoo/dev
chroot /mnt/gentoo /bin/bash

grub

root (hd0,1)
Filesystem type is ext2fs, partition type 0×83

setup (hd0)
Checking if “/boot/grub/stage1″ exists… yes
Checking if “/boot/grub/stage2″ exists… yes
Checking if “/boot/grub/e2fs_stage1_5″ exists… yes
Running “embed /boot/grub/e2fs_stage1_5 (hd0)”… 17 sectors are embedded.
succeeded
Running “install /boot/grub/stage1 (hd0) (hd0)1+17 p (hd0,1)/boot/grub/stage2 /boot/grub/menu.lst”… succeeded
Done.

quit

exit

umount /mnt/gentoo/dev
umount /mnt/gentoo/proc
umount /mnt/gentoo
umount /mnt/boot

Wenn es dort keine Fehler gab, dann sollte alles funktionieren. Nach einem Neustart sollte Grub wieder der Bootloader sein. Wenn man nun sein Linux auswählt, startet der wie gewohnt. Bei Windows sollte danach der Bootloader von Truecrypt kommen. Dort dann das Passwort eingeben und Windows sollte dann auch wieder starten.

Links

  1. TrueCrypt – Free Open-Source On-The-Fly Disk Encryption Software
  2. heise – Festplatten mit 4 KByte Sektorgröße
  3. GNU GRUB Manual 0.97 – chainloader
GNU GRUB Manual 0.97

Java und Call-By-Reference

23. November 2009 sep 1 Kommentar

Hey, ich arbeite ja mal wieder an einem Projekt, und bin dort ein mal auf ein kleines Problem gestoßen. Nämlich einen nativen Typen in einer Funktion zu bearbeiten. Eigentlich kein Problem. Zumindest kann man diesen ja zurück geben, per return. Jedoch hatte ich dort schon einen anderen Rückgabewert.  Also, kann man sich nun noch eine neue Klasse schaffen, um dort mehrere Sachen zurück zu geben. Jedoch war mir das nicht elegant genug.

Dann kam ich auf eine Idee, welche ich aus C, C++ und C# kenne. Nämlich das Call-By-Reference[1]. Unter C# ist es wie folgt möglich.

TryParse( String str, ref int value );

Doch unter Java ist das nicht so einfach. Denn folgendes ist dort der Fall. Da sehr viele Programmierfehler auf Zeiger zurück zu führen sind, hatte man die Zeiger in der Sprache sozusagen abgeschafft. Sie sind für uns also nicht mehr sichtbar. Nun ist die objektorientierte Programmierung ohne Referenzen aber nicht möglich. Denn auf jedes Objekt, welches instantiiert wird, gibt es eine Referenz. Diese Referenz wird als Kopie an eine Funktion übergeben. Und die Funktion arbeitet dann damit. So ist es möglich, dass Eigenschaften in einem Objekt geändert werden könne und außerhalb der Funktion diese Änderungen auch noch “aktiv” sind. Sie wurden also nicht zurück geändert. Jedoch kann man das Objekt an sich nicht verändern. Also neu instantiieren und dies dann über die Parameter zurück geben. Native Datentypen werden alle als Kopie übergeben. So fällt der Aspekt des Änderns weg. Also dachte ich mir, es gibt ja Wrapper-Klassen und so wollte ich eine nutzen. Denn dort werden wieder die Referenzen weiter gegeben und ich könnte die Eigenschaften ändern. Aber mir ist dann aufgefallen, dass ich die Eigenschaften in der Wrapper-Klasse nicht bearbeiten kann, da mir die Zugriffskontrolle dies verbietet. Blöd! Also wollte ich mir selber eine Wrapper-Klasse schaffen. Jedoch kann es ja sein, dass Java so was bietet. Also machte ich mich auf die Suche und hab nichts gefunden. (Wenn es so was gibt dann sagt mir Bescheid! :D ) Naja. Wie auch immer. Im Java-Forum[2] wird davon gesprochen einfach ein Array-Objekt zu übergeben. In einem Array sind die Werte gespeichert. Von dem Array wird dann eine Kopie der Referenz übergeben und ich könnte meine Werte bearbeiten. Funktioniert zwar, war mir aber nicht schön genug.

Nach einiger erfolgloser Suche habe ich mir dann eine eigene Wrapper-Klasse geschrieben.

package org.seplog.javrsimulator.util;

/**
 * Diese Klasse ist eine Wrapper Klasse. Hierdurch können alle möglichen
 * Typen, Klassen und Objekte einer Funktion als Referenz übergeben
 * werden.
 *
 * @author Sebastian Koschmieder
 * @date 17.11.2009
 * @mail sep@seplog.org
 * @param < T >
 *            Ist der Typ der Klasse, welche übergeben wird.
 */
public final class ByReference< T > {

    /******* Member ****************************/

    /**
     * Dies ist der Wert, welcher als "Referenz" übergeben wird.
     * Da mit diesem Wert durch beide Bearbeiter gleichermaßen
     * bearbeitet werden können muss, findet keine
     * Zugriffskontrolle statt.
     */
    public T value;

    /******* Konstruktoren *********************/

    /**
     * In dem Konstruktor wird nur die Variable übergeben.
     *
     * @param value
     *            Dies Variable wird als Referenz behandelt.
     */
    public ByReference( T value ) {
        this.value = value;
    }

}

Die Verwendung dieser Klasse ist ganz einfach. Ich instantiiere mir ein ByReference-Objekt, welchem ich im Konstruktor mein Objekt gebe. Danach übergebe ich die ByReference-Klasse an die Funktion. Beide, also Aufrufer und die aufgerufene Methode können nun das Objekt gleichermaßen bearbeiten.

package org.seplog.javrsimulator.util;

public class Program {

    public static void main( String[] args ) {

        ByReference< Integer > reference = new ByReference< Integer >( 42 );
        System.out.printf( "Wert: %d\n", reference.value );
        changeRef( reference );
        System.out.printf( "Wert: %d\n", reference.value );

    }

    public static void changeRef( ByReference< Integer > reference ) {
        reference.value = 1337;
    }
}

Links

  1. Referenzparameter – Wikipedia
  2. Lösung Java-Forum
Categories: Informatik Tags: , ,

Rette deine Freiheit

10. Oktober 2009 sep Keine Kommentare

Habe was gefunden, was sich sehr anzuschauen lohnt[1]. Mehr dazu nicht, außer ein kleines Zitat.

Wenn wir Angst haben, raschelt es überall.

Von Sophokles.

Zur Anzeige des Videos benötigen Sie den Adobe Flash Player,
welchen Sie hier herunterladen können.

Links

  1. Rette deine Freiheit

Viele Kameras

25. September 2009 sep Keine Kommentare

Hmm, als ich heute mal von der Arbeit kam, hab cih mich mal entschieden einfach die Kameras zu zählen, welche mich aufnehmen. Ich muss dabei wohl ausgesehen haben wie ein Tourist. oder für die Leute dennen die Kameras gehören wie ein Verdächtiger. :D Mein Heimweg dauert ca 60min und ich habe sage und schreibe 74 Kameras gezählt. Kurz zu meinem Heimweg. Ich fahr erst Bahn. ca 20min dann komme ich an dem Hbf an. Danach gings für mich zu Fuss zum Anger in ca 5min. Danach dann in die S-Bahn. Auch noch mal ca 20min. Dann Noch kurz Geld holen in den Thüringen Park. Danach dann noch in den Edeka, schnell mal was zu Essen kaufen und danach dann in meine Wohnung. 74(!) Kameras, welche mich Beobachtet haben in 60min. Ich find das irgendwie Pervers. Schreibt mir mal eure Erfahrungen damit!

Der Kamerawahn

24. September 2009 sep Keine Kommentare

Mir ist heute mal aufgefallen, wie krank doch die Politik und auch die Unternehmer sind. Grund dafür war ein Buch, welches ich bekommen habe. 1984 von George Orwell. Als ich angefangen hab es zu lesen, saß ich gerade in der Straßenbahn. Ich hab nach oben geschaut und sah eine Kamera. Ich stieg aus und ging was einkaufen. In dem Center waren vom Eingang bis zur Rolltreppe (vlt. 50m) ca. 5 Kameras. Im Media Markt ist es noch schlimmer. Dort sind bei uns schätzungsweise 20 bis 30 Kameras angebracht. Nun frag ich mich wozu?

Um mal auf das Bsp. Media Markt bei mir einzugehen. Es sind dort immer viele Kunden auch Personal hat Media Mark mehr als genug. Also im Grunde genommen ausreichend Augen dort in dem Laden. Wie die Führungsebene von MM wohl auch vermutet ordentlich Langfinger. Also nicht verwunderlich warum dort so viele Kameras sind. Oh doch, sehr verwunderlich finde ich! Es gibt genug Mitarbeiter, welche ein Auge auf die Produkte haben und Diebstahl melden können. Genauso wie dort immer ein Laden-Detektiv rum streunert. Früher gab es noch Zivilcourage. Heutzutage wird diese durch Kameras abgeschafft. Weil sich keiner mehr verantwortlich für die andren fühlt. Schlimm finde ich so was und auch die Betriebsführung muss stark gelitten haben, solch ein Misstrauen gegenüber seinen Mitarbeitern zu haben. Aber “zum Glück” ist ja der Media Markt kein Einzelfall.

Besonders die CDU ist in dem Bereich “Sicherheit” sehr weit vorne. Schon in ihrem Wahlprogramm[1] hat die CDU/CSU erläutert, wie sie die Sicherheit verschärfen möchten. Dabei ist mir auch das Interview mit CDU-Politiker Trapp[2] aufgefallen.

Ich gehe immer von der Unschuldsvermutung aus. Aber ich brauche Informationen über Personen, die den Staat verändern wollen. Denn ohne Sicherheit gibt es keine Freiheit. Ich kann mir doch nicht von einem Taliban vorschreiben lassen, was ich zu tun und zu lassen habe.

Benjamin Franklin hält dagegen!

Wer die Freiheit aufgibt, um Sicherheit zu gewinnen, der wird am Ende beides verlieren.

Und nun schauen wir uns doch mal an, wie groß die Gefahr denn durch die Taliban ist. Natürlich kam dort vor kurzem EIN Thema zu Hauf in den Medien. Afghanistan und der Verteidigungsschlag auf den Tanklaster. Auch ziehen die Taliban Richtung Norden, wo die Deutschen ihre Stützpunkte haben. Auch gibt es zur baldigen Bundestagswahl einige Meldungen über einen Terroranschlag nach den Wahlen[3]. Jedoch habe ich vor solchen Terror-Warnungen wenig Angst. Natürlich gab es schon Versuche hier in Deutschland. Bsp Köln und der Anschlag im Hauptbahnhof[4] oder die Sauerlandgruppe[5]. Wobei der erste Anschlag nicht verhindert wurde. Es war unser Glück, dass der Zünder bei den Kofferbomben einen technischen Defekt hatte. Auch die Sauerlandgruppe wurde nicht durch Überwachungskameras, sondern durch V-Männer enttarnt. Überwachungskameras können keine Sicherheitskräfte ersetzen. Trotzdem möchte dies die Politik. “Eigentlich läuft alles ganz prima, aber trotzdem brauchen wir mehr Überwachung”[6] so die Meinung von Angela Merkel. Aber 2006 ist ja schon lange her und seit dem hat sich viel geändert. Ansonsten nehmen wir solche Meldungen wie die verstärkte Telefonüberwachung[7] einfach hin, oder auch die Vorratsdatenspeicherung. Dort hat der CCC, schon vor einiger Zeit, ein Dokument veröffentlicht, welches die Gefahren dieses Werkzeug zeigt[8]. Das BKA-Gesetz ist ebenfalls noch nicht vom Tisch. Im Frühjahr lebte dort ein Projekt gegen das BKA-Gesetz auf[9].

Aber nicht nur in der “realen” Welt hält die Überwachung Einzug. Auch im Netz der Netze ist, wie zu erwarten, dies ein Thema. So zum Beispiel sponsert die EU 11 Mio Euro für die Entwicklung eines Systems um Blogs, Foren, Social Networks und viele andere Medien des Web 2.0 automatisch zu durchsuchen und auszuwerten. Um, wie in dem Artikel[10] beschrieben “ungewöhnliches Verhalten” festzustellen. Echt grauenerregend diese Vorstellung. Natürlich wird im Internet nicht so schnell vergessen. Aber möchtet ihr, dass dort direkt nach euren auffälligen Äußerungen gesucht wird? Vielleicht von euch sogar ein Profil erstellt werden kann, welches EU weit eingesehen werden kann? Also, ich möchte das nicht. Da gibt es bei mir auch kein “eigentlich” und “wenn” und “aber”.

Was ich mich jedoch immer wieder frage. Ich bin in einer Kleinstadt aufgewachsen. Dort gab es immer “Tratschweiber”, welche alles wussten. Es geht sogar noch schlimmer, wenn die Nachbarn wissen, wann man aus dem Haus gegangen ist und wann man wieder kam &&& So etwas stört einen, weil das ein Eindringen in die Privatsphäre ist. Aber wenn in Kaufhäusern und auf öffentlichen Plätzen und in öffentlichen Gebäuden Überwacht wird, dann stört es einen nicht. Wie gesagt war ich heute kurz einkaufen. Nicht länger als eine halbe Stunde. Aber ich will nicht wissen, wie viele Videos es nun von mir gibt. Das entscheidende dabei ist auch noch, dass Kameras und Computer nicht so schnell vergessen. Diese Daten sind von euch gespeichert. So lange wie die Festplatte hält, oder so lange wie die Überwachungsorgane entscheiden diese Daten zu behalten! Dabei hilft auch nicht die Aussage, “Ich habe ja nichts zu verbergen.” Was ich einkaufe und wo ich es einkaufe, wo ich hin gehe und was ich dort mache, das ist alleine meine Sache. Solange ich natürlich strafrechtlich nicht auffalle. Ich muss nicht durch einen, wie Geoge Orwell ihn nennt, “Großen Bruder” beaufsichtigt werden. Wir können alleine Verantwortung übernehmen und sollten es auch!

Links

  1. Seþ[og.org » Wahlprogramm der CDU/CSU
  2. Kameras für eine freundliche U-Bahn
  3. Al-Qaida droht Deutschland in neuem Video
  4. So nah am Terroranschlag wie noch nie
  5. Angeklagter gibt Details der Terrorplanungen preis
  6. Merkel plädiert für mehr Überwachung trotz hoher Sicherheit
  7. Die Polizei hört immer öfter mit
  8. CCC: Vorratsdatenspeicherung bringt unkontrollierbare Überwachung
  9. “Projekt Verfassungsbeschwerde” gegen BKA-Gesetz vorgestellt
  10. EU-Projekt soll Techniken für Internetüberwachung entwickeln

PHP Dbg und der Apache

8. September 2009 sep Keine Kommentare

So, nachdem ich nun mal mein halbes gentoo System neu aufgesetzt habe bin ich auf etwas Interessantes gestoßen. Ich programmiere ab und an auch gerne mal PHP. Natürlich ist ein Debugger beim programmieren in der Umgebung ein recht nützliches Werkzeug. Also habe ich mich einmal auf die Suche gemacht und auch was feines gefunden.

PHP Dbg nennt sich der nette Gefährte und er lässt sich auch relativ einfach in Eclipse integrieren. Zur Vorbereitung jedoch erst einmal was anderes. Damit ich als normaler User auf meinem System PHP ordentlich und ohne Umwege scripten kann habe ich mir einen Userdir angelegt. Das geht wie folgt. Zuerst müsst ihr dazu die /etc/conf.d/apache2 auf eurem gentoo System bearbeiten. Dort sind die APACHE2_OPTS wichtig. Fügt dort einfach “-D USERDIR” hinzu. Dann geht es weiter mit der /etc/apache2/modules.d/00_mod_userdir.conf. Diese sieht bei mir folgendermaßen aus:

<IfDefine USERDIR>
    <IfModule userdir_module>

        UserDir workspace/web

        <Directory /home/*/workspace/web>
            AllowOverride FileInfo AuthConfig Limit Indexes
            Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec
            <Limit GET POST OPTIONS>
                Order allow,deny
                Allow from all
            </Limit>
            <LimitExcept GET POST OPTIONS>
                Order deny,allow
                Deny from all
            </LimitExcept>
        </Directory>

        <IfDefine SUEXEC>
            <IfModule suexec_module>
                <Directory /home/*/workspace/web/cgi-bin>
                    Options ExecCGI
                    SetHandler cgi-script
                </Directory>
            </IfModule>
        </IfDefine>

    </IfModule>
</IfDefine>

Danach habe ich den Vorteil, dass ich in ~/workspace/web an meiner Seite arbeiten kann. Jetzt muss der apache nur noch neu geladen/gestartet werden und dann kann man auch schon mal eine kleine Testseite aufrufen. Diese Testseite befindet sich in meinem Fall hier: http://localhost/~sep/ (sep, natürlich mein Benutzeraccount)
Schon ist es ein sehr viel angenehmeres Arbeiten. Nun kann ich mit der Installation von PHP Dbg beginnen. Dazu diesen erst einmal unmasken und dann emergen. Nicht zu vergessen ist das Common Language Interface von PHP. Da ihr ohne dies kein PHP Parser mit an Bord habt, welchen ihr jedoch braucht!

# echo "dev-lang/php cli" >> /etc/portage/package.use
# emerge -avN php
# echo "dev-php/phpdbg ~*" >> /etc/portage/package.keywords
# emerge -av php phpdbg

Nun öffnet ihr die /etc/php/apache2-php/php.ini. Dort müssen alle Einträge mit zend und debug entfernt werden. Ist dies geschafft, gehts in der /etc/php/apache2-php/ext/dbg.ini gleich weiter. Diese sieht bei mir folgendermaßen aus:

[Debugger]
extension=dbg.so
debugger.enabled=on
debugger.profiler_enabled=on
debugger.timeout_seconds=600
debugger.JIT_enabled=Off
debugger.JIT_host = localhost
debugger.JIT_port = 7869

Danach wieder einmal den Apache neu laden/starten. Wenn ihr nun eine phpinfo Datei aufruft, sollte es dort eine neue Section geben. Diese heißt “dbg”. Dort sollten dann die Informationen stehen, welche ihr gerade in die dbg.ini geschrieben habt. Wenn das alles funktioniert habt können wir nun Eclipse starten. Wir nehmen uns nun ein, wie sollte es auch sein, PHP Projekt vor. Dort möchten wir beispielsweise die src/index.php debuggen. Dazu dann einfach auf den Debug Dialog und ein neues DebugScript für PHP erstellen. Als Namen könnt ihr euch dort was aussuchen. Bei mir nennt es sich “Debug PHP Core”.

Auf dem Reiter File wählt ihr in dem Punkt Project natürlich euer Projekt aus und bei File atürlich die Datei welche ihr debuggen wollt. Bei mir “src/index.php”. Den zweiten Reiter überspringe ich und fahre mit dem dritten fort.

Enviroment. Dort wählt ihr als Interpreter “/usr/bin/php” aus. Diese Datei wurde durch das cli USE-Flag erzeugt. Dann geht ihr zu Remote Debug. Dort ein Häckchen bei Remote debug setzen, Cross Platform debugging und Open with DBGSession URL in internal Browser. Nicht mehr Häckchen. Danach tragt ihr bei Remote Sourcepath den Pfad der zu debuggenden Datei auf dem Remote Rechner. Jedoch nur den root-Pfad zu dem Projekt. Darunter bei den Mapped Path dann wieder ähnlich. Der lokale Pfad ist natürlich euer Pfad zu dem Projekt. Der remote Pfad ist dann wieder der Pfad vom Server zu dem Projekt. Also, da das bei mir beispiel alles läuft, sind alle drei Pfade gleich. Sie lauten “/home/sep/workspace/web”.  Das zweite Enviroment Register könnt ihr dann überspringen.

In dem letzen Reiter Common nur noch den Hacken bei Debug machen und dann noch evtl. den Zeichensatz umstellen. Danach nur noch das Script speichern und schon kanns auch los gehen.

Wir wechseln nun zu erst in die Debug Sicht in Eclipse. Dann können wir ein paar Brechpunkte setzen und dann das Debuggen starten. Oben in der Debug Session sehen wir, dass der Debugger nun auf localhost Port 10001 lauscht. Also geben wir ihm den! Dazu öffnet ihr einen Browser. Dann rufen wir die Adresse nun auf. http://localhost/~sep/src/index.php. Die Seite wird normal aufgebaut und der Debugger wartet immer noch. Nochmal wie folgt aufrufen: http://localhost/~sep/src/index.php?DBGSESSID=1@localhost:10001 Wichtig ist dabei “DBGSESSID=1@localhost:10001″, womit der Debugger über den Apache aktiviert wird. Wenn nun alles geklappt hat, dann sollte die Seite sich nicht aufbauen. Dann läuft der Debugger und man kann in Eclipse durch steppen.

Wichtig sind nochmal die drei Ordner die ihr angeben müsst. Der Remote Path und die beiden Mapper. Wenn diese nicht vernünftig konfiguriert sind, läuft es einfach nicht. Es kommt kein Fehler und kein gar nichts. Einfach damit rum probieren. Was jedoch einfach mal hilft, um zu schaun, ob der Debugger funktioniert, ist ohne den Debugvorgang in Eclipse zu starten einfach mal “?DBGSESSID=1@localhost:10001″ an die Seite anhängen. Dann sollte kommen, dass der Debugger keinen Port finden kann, oder ähnliches. Also, euch viel Erfolg damit.

Categories: Informatik Tags: , , ,

Ich schreibe recht wenig

5. August 2009 sep Keine Kommentare

Hey, leider Gottes habe ich in dem letzten Monat recht wenig hier geschrieben und ich möchte mich dafür erst einmal entschuldigen. Jedoch ist dies durch zwei Sachen bedingt. Zum einen hatte ich zwei Wochen Urlaub, wo ich mal Ruhe vor dem Netz haben wollte und zum anderen hat sich meine Festplatte vom Laptop verabschiedet. Natürlich habe ich Backups, habe ich einige Veränderungen an meinem Linux System vor, weshalb ich mein Systembackup nicht wieder her stellen werde. Nur die Daten will ich nicht verlieren. Zum einen ist bei mir nun Festplattenverschlüsselung angesagt und dann soll noch KDE4 mit rauf kommen. Da ich gentoo nutze und abends ab und an mal ein paar Stündchen sitze, könnte das evtl noch dauern. Aber das macht ja nix. Zumindest mir nicht.

Also, dann bis bald.

Categories: Allgemeines Tags:

“Killerspiele”

14. Juli 2009 sep Keine Kommentare

Noch eine Sache habe ich eben gerade erst mit bekommen. Wahrscheinlich ein bisschen spät, aber besser als nie.

Ausgelöst durch den schrecklichen Amoklauf in Winnenden hat der Bund mal wieder ein Attentat vor. Nämlich in Deutschland die “Killerspiele” zu verbieten. Was ich daran sehr bedauernswert finde ist, das einfach nur ein Schuldiger gesucht wird. Auf die Frage “Sind Videospiele wirklich schuld?”[1] werde ich antworten “Definitiv nicht”. Denn wenn dem so währe, würden wir aus den Meldungen über Amokläufe nicht mehr raus kommen. Was dabei immer vergessen wird, ist die soziale Stellung der Amokläufer. Denn sie sind meistens vor dem Amoklauf die Opfer. Werden in der Gesellschaft nicht angenommen, oder verspottet und ziehen sich zurück. Darüber wird natürlich in den Medien immer weniger Berichtet. Denn die Tat rückt ja in den Vordergrund. Jedoch vor der Tat diese Schüler, oder wie es hier in Erfurt vor einigen Jahren war, ehemaligen Schüler oder sozial schwache besonders zu betreuen oder beraten, das macht man nicht. Wahrscheinlich ist es zu kostenintensiv mehr Seelsorger für Bildungszentren auszubilden, bzw einzustellen.

Wie dem auch sei. Ich bin der festen Überzeugung, das nicht Computerspiele Killer machen, sondern die Gesellschaft. Einfach dadurch, dass sie die Menschen, welche nie Beachtung gefunden haben, auch weiterhin einfach nicht beachten und keine Aufmerksamkeit schenken.

Um wieder auf mein Thema zu dem Attentat des Bundes zu kommen. Es gibt seit längerem schon eine Petition[2] dazu. Ich bitte euch dort zu unterzeichnen. Falls es euch tangiert. Das möchte ich jedoch stark hoffen!

Links

  1. Amoklauf-Winnenden.de: Forum für Interessierte und Betroffene
  2. Gegen ein Verbot von Action-Computerspielen vom 05.06.2009