20 Februar 2008

Speichermodell

Im Programmierumfeld betrachten wir vier Speichersegmente:
  1. Code-Segement (auch Text-Segment genannt)
  2. Data-Segment
  3. Heap
  4. Stack
Im Code-Segment sind die ausführbaren (Programm-)Codezeilen gespeichert, übrigens auch der Startup-Code der vor der main ausgeführt und den Terminate-Code, der nach Beenden des eigentlichen Programms ausgeführt wird. Das Code-Segment ist während der Programmausführung read-only.
Im Data-Segement befinden sich die Daten, die über die gesammte Programmlaufzeit erhalten bleiben (globale und statische Variablen). Es besteht aus einem const-Bereich, und je einem Bereich für initialisierte und nicht-initialisierte Daten.
Das Heap-Segment ist gleichbedeutend mit dem freien Arbeitsspeicher, der zur Laufzeit allokiert werden kann.
Das Stack-Segment ist ein LIFO (Kellerspeicher) und nur durch push/pop , aber nicht wahlfrei zugreifbar. Auf dem Stack werden lokale Daten abgelegt, sowie Rücksprungadressen und Parameter von Funktionen.

Ablauf der Speicherzugriffe eines Programmes:
  1. nach compiling/binding -> load des Programmes (in den Prozessorspeicher)
  2. Loader legt Maschinenbefehle ins Code-Segment
  3. Instruktionszeiger zeigt auf den ersten auszuführenden Befehl im Code-Segment
  4. Programm im Code-Segment wird linear abgearbeitet.
  5. erfolgt ein Funktionsaufruf, wird in die entsprechende Stelle im Code-Segment gesprungen - der letzte Instruktionszeigerwert(Rücksprungadresse) wird auf dem Stack gelegt und die Einsprungadresse in den Instruktionszeiger geladen.
  6. beim Verlassen der Funktion wird die alte Adresse vom Stack geholt und das Programm bei der nächsten folgenden Adresse fortgesetzt.
  • Über den Stack können auch Parameter an die Funktion übergeben oder Return-Werte an das Hauptprogramm zurück gegeben werden.
  • Variablenübergaben (bei C/C++) erfolgen durch Übergabe der Werte, indem die Werte auf den Stack geschrieben werden. Entweder durch Schreiben des Wertes (primitive Datentypen) oder Aufruf des Copy-Konstruktors (Objekte und Klassen) -> Call-by-Value
  • Möchte man Call-by-Reference einsetzen, muss man explizit Zeiger oder Referenzen übergeben.

Labels: ,

23 Mai 2007

Buzzword Olympiade

Gerade war an unserer sommerlich-schwitzenden Hochschule ein netter Vortrag über das Social Web. Dabei wurde in erfrischenderweise auf inflationäre Buzzwordnutzung verzichtet - außer vielleicht seitens des Publikums.

However, um diesen sinnlosen Post zu finalisieren, wenn Ihr noch ein paar schöne neue Buzzwords habt, die Ihr der digitalen Bewegung zukommen lassen wollt, schreibt sie einfach ins Bolsche-Wiki oder schreibt sie auf Charmin-Toilettenpapier und spült sie runter, demnächst gibts bestimmt einen Webservice, der die auswertet und online stellt, außer die Blase blatzt zuvor.

Hiermit erkläre ich die Schreibblogade für beendet, vielleicht steckts Schommi Crane ja an.

Labels: , ,

09 Mai 2007

ein Post in eigener Sache

als kleine Anmerkung an meine geneigten Leser: Ich habe einige technische Schwierigkeiten am lebenden Blog beseitigt, will heißen:

  1. Die Archivlinks funktionieren wieder
  2. Die Stylesheets und Grafiken sollten nun durchgehend vorhanden sein

Technorati Profile

Labels:

26 April 2007

Ist mir doch ein munteres Reh vor den Computer gelaufen...

...Feisty Fawn has landed.
Es begab sich, dass mal wieder eine Neuinstallation des Systems anstand. Da Gerade das krachneue Ubuntu 7-04 veröffentlicht wurde, natürlich mit Feisty Fawn.

Erwartungsgemäß muss ich sagen: Schönst.

Nach der Installation wieder das alte Bild: Ein Bild, gleich auf beiden Monitoren. Aber meine xorg.conf (siehe unten) hat genau so wieder funktioniert ebenso das DVD Lib Script (dito).

Die Installation der ATI funktionierte diesmal automatisch, ergo funktioniert auch die 3D Beschleunigung ohne Probleme.


Labels: ,

13 April 2007

Ubuntu und die Digitale Versatile Scheibe


Ja, ja. Das leidige Thema "Kopierschutz". Obwohl im Falle des CSS von DVDs wohl kaum von einem wirksamen Kopierschutz sprechen kann, werden viele Linux Distributionen ohne die zum Anschauen von DVDs notwendige Bibliothek ausgeliefert.

Nun ärgere ich mich ja schon, dass mitlerweile auf jeder gekauften DVD ein dämlicher "Raubkopierer sind Verbrecher" Spot kommt (Hallo! Ich habe die Dinger gekauft, erzählt das bitte den Raubkopierern!!). Ich möchte meine DVDs dann aber wenigstens unter Linux ansehen.

Ich folge hier der rechtlichen Einschätzung aus der Wikipedia:
"In Deutschland und weiteren Ländern ist es verboten, Programme zu schreiben oder zu vertreiben, die Kopierschutzmaßnahmen umgehen. Würde ein deutsches Gericht CSS in letzter Instanz für eine „wirksame technische Maßnahme“ erklären (§ 95a Urheberrechtsgesetz, in der durch Artikel 1 des Gesetzes vom 10. September 2003 geänderten Fassung[1]), so wäre die Benutzung dieser Bibliothek in Deutschland nicht gestattet. So ein Gerichtsurteil gibt es zur Zeit nicht.

Es gibt auch die Darstellung, nach der CSS lediglich einen Abspielschutz darstellt: Die DVD kann zwar kopiert werden, allerdings ist das Anschauen ohne Entschlüsselungsprogramm nicht möglich. Es ist unklar, ob Gerichte dieser Auffassung folgen würden (wobei – im Gegensatz zur Benutzung von DeCSS – die Anwendung der libdvdcss noch nicht Thema vor Gericht war).

Schlussendlich ist dies auf den Hinblick auf § 95a Urheberrechtsgesetz vermutlich irrelevant, da CSS als Schutz gegen unlizenziertes Abspielen eine technisch wirksame Einschränkung der Nutzungsrechte darstellt und somit potentiell den entsprechenden legalen Einschränkungen unterliegt.

Die Benutzung der libdvdcss würde in diesem Fall auch nach § 108b Urheberrechtsgesetz strafbar sein, soweit sie nicht „ausschließlich zum eigenen privaten Gebrauch des Täters oder mit dem Täter persönlich verbundener Personen erfolgt“. Im Falle des Privatgebrauchs kommen lediglich zivilrechtliche Ansprüche der Rechteinhaber in Betracht."

Hilfreiche User im Ubuntuforum haben dann glücklicherweise auch eine schmerzlose Anleitung zum nachinstallieren unter Edgy gepostet - einfach das bereits vorhandene Script mit:

sudo /usr/share/doc/libdvdread3/install-css.sh

auf der Konsole (Terminal) ausführen und DVDs gucken. C'est tout.
-hille crane ;-)

Labels: ,

02 April 2007

Ubuntu rockt (jetzt auch auf zwei Bildschirmen)

Nach längerem Überlegen und mit dem Gedanken schwanger gehen, bin ich nun mit meinem Arbeitsrechner zu Linux migriert. Um genauer zu sein: Zu Ubunut (06.10 Edgy Eft). Und zwei Dinge kann ich gleich schonmal sagen:
1) Das ist die verdammt benutzerfreundlichste Distribution, die ich je installiert habe
2) Normale Menschen dürften trotzdem noch immer ihre Probleme damit haben, alles zu konfigurieren. (Aber wenns mal läuft, warum nicht?)


Mein Hauptproblem bestand darin, den Desktop auf zwei Monitore auszudehnen.
Mein Setup: Dell Optiplex 745, 2 Gig RAM, ATI X1300 pro mit dual DVI über Kabelpeitsche, Zwei Dell 19" TFT.
Alles probieren hat nix geholfen, ich bekam immer nur einen geklonten Bildschirm.
Wie ihr auf meinem Screenshot seht, hats dann aber doch geklappt (für den Screenshot Tip ein Dank an Günther).

Im Endeffekt blieb mir nichts anderes übrig, als die xorg.conf zu editieren (/etc/X11/xorg.conf) und zwar folgendermaßen:



# /etc/X11/xorg.conf (xorg X Window System server configuration file)
#
# This file was generated by dexconf, the Debian X Configuration tool, using
# values from the debconf database.
#
# Edit this file with caution, and see the /etc/X11/xorg.conf manual page.
# (Type "man /etc/X11/xorg.conf" at the shell prompt.)
#
# This file is automatically updated on xserver-xorg package upgrades *only*
# if it has not been modified since the last upgrade of the xserver-xorg
# package.
#
# If you have edited this file but would like it to be automatically updated
# again, run the following command:
# sudo dpkg-reconfigure -phigh xserver-xorg

Section "ServerLayout"
Identifier "Default Layout"
#Screen 0 "aticonfig-Screen[0]" 0 0
#Screen 1 "aticonfig-Screen[1]" 0 0
Screen 0 "aticonfig-Screen[0]"
Screen 1 "aticonfig-Screen[1]" RightOf "aticonfig-Screen[0]"
InputDevice "Generic Keyboard"
InputDevice "Configured Mouse"
InputDevice "stylus" "SendCoreEvents"
InputDevice "cursor" "SendCoreEvents"
InputDevice "eraser" "SendCoreEvents"
EndSection


Section "Files"

# path to defoma fonts
FontPath "/usr/share/X11/fonts/misc"
FontPath "/usr/share/X11/fonts/cyrillic"
FontPath "/usr/share/X11/fonts/100dpi/:unscaled"
FontPath "/usr/share/X11/fonts/75dpi/:unscaled"
FontPath "/usr/share/X11/fonts/Type1"
FontPath "/usr/share/X11/fonts/100dpi"
FontPath "/usr/share/X11/fonts/75dpi"
FontPath "/usr/share/fonts/X11/misc"
FontPath "/var/lib/defoma/x-ttcidfont-conf.d/dirs/TrueType"
EndSection

Section "Module"
Load "i2c"
Load "bitmap"
Load "ddc"
Load "dri"
Load "extmod"
Load "freetype"
Load "glx"
Load "int10"
Load "type1"
Load "vbe"
EndSection

Section "ServerFlags"
Option "Xinerama" "true"
EndSection

Section "InputDevice"
Identifier "Generic Keyboard"
Driver "kbd"
Option "CoreKeyboard"
Option "XkbRules" "xorg"
Option "XkbModel" "pc105"
Option "XkbLayout" "de"
Option "XkbOptions" "lv3:ralt_switch"
EndSection

Section "InputDevice"
Identifier "Configured Mouse"
Driver "mouse"
Option "CorePointer"
Option "Device" "/dev/input/mice"
Option "Protocol" "ExplorerPS/2"
Option "ZAxisMapping" "4 5"
Option "Emulate3Buttons" "true"
EndSection

Section "InputDevice"

# /dev/input/event
# for USB
Identifier "stylus"
Driver "wacom"
Option "Device" "/dev/wacom" # Change to
Option "Type" "stylus"
Option "ForceDevice" "ISDV4" # Tablet PC ONLY
EndSection

Section "InputDevice"

# /dev/input/event
# for USB
Identifier "eraser"
Driver "wacom"
Option "Device" "/dev/wacom" # Change to
Option "Type" "eraser"
Option "ForceDevice" "ISDV4" # Tablet PC ONLY
EndSection

Section "InputDevice"

# /dev/input/event
# for USB
Identifier "cursor"
Driver "wacom"
Option "Device" "/dev/wacom" # Change to
Option "Type" "cursor"
Option "ForceDevice" "ISDV4" # Tablet PC ONLY
EndSection

#Section "Monitor"
# Identifier "DELL 1907FPV"
# Option "DPMS"
#EndSection

Section "Monitor"
Identifier "aticonfig-Monitor[0]"
Option "VendorName" "ATI Proprietary Driver"
Option "ModelName" "Generic Autodetecting Monitor"
Option "DPMS" "true"
EndSection

Section "Monitor"
Identifier "aticonfig-Monitor[1]"
Option "VendorName" "ATI Proprietary Driver"
Option "ModelName" "Generic Autodetecting Monitor"
Option "DPMS" "true"
EndSection

Section "Device"
Identifier "aticonfig-Device[0]"
Driver "fglrx"
BusID "PCI:1:0:0"
Option "CRT2Position" "LeftOf"
EndSection

Section "Device"
Identifier "aticonfig-Device[1]"
Driver "fglrx"
BusID "PCI:1:0:0"
## here the needed values for 'Dual' are starting:
Option "AGPMode" "4"
Option "AGPFastWrite" "true"
Option "BusType" "PCIE"
Option "MonitorLayout" "LVDS, CRT"
Option "MergedFB" "true"
#Option "CRT2HSync" "31.0-80.0"
#Option "CRT2VRefresh" "60.0-76.0"
Option "CRT2Position" "RightOf"
#Option "MetaModes" "1920x1200-1600x1200"
Option "PanelOff" "false"
Option "DynamicClocks" "true"
Option "DesktopSetup" "horizontal"
## Change this to "false" if there are any problems:
Option "EnablePageFlip" "true"
Screen 1
EndSection

Section "Screen"
Identifier "aticonfig-Screen[0]"
Device "aticonfig-Device[0]"
Monitor "aticonfig-Monitor[0]"
DefaultDepth 24
SubSection "Display"
Depth 24
Modes "1280x1024" "1152x864" "1024x768" "800x600" "720x400" "640x480"
EndSubSection
EndSection

Section "Screen"
Identifier "aticonfig-Screen[1]"
Device "aticonfig-Device[1]"
Monitor "aticonfig-Monitor[1]"
DefaultDepth 24
SubSection "Display"
Depth 24
Modes "1280x1024" "1152x864" "1024x768" "800x600" "720x400" "640x480"
EndSubSection
EndSection

Section "DRI"
Mode 0666
EndSection

Labels: , ,

25 Januar 2007

Velocity if-else ohne Whitespace

Letztes Jahr hatte ich das Problem, dass ich in einem Template mit Velocity Tags nach dem else Block einer if-else Schleife immer Whitespace hatte:

#if ( $firstString == "Nummer 1")Das ist Nummer 1. #else Das ist nicht Nummer 1.


Das kam daher, dass Velocity den Whitespace nach dem else erhielt. Das dumme war nur, das damit meine Überschrift im fertigen Text mit " " begann.
Lesen in der Doku und Googeln haben nichts gebracht, schließlich kam mir dann die zündende Idee: Velocity-Comments! Sie trennen die Ausdrücke und werden vom Parser entfernt. Die Lösung ist also:

#if ( $firstString == "Nummer 1")Das ist Nummer 1. #else#**#Das ist nicht Nummer 1.


Vielleicht nutzt jemanden. :)

Labels: ,