Category Archives: Projekte - Page 3

Umkehrfunktion Cäsarcode

C = Code
M = Klartext
P = Schlüssel
E = letzter Buchstabe des Alphabets
I = erster Buchstabe

Eine Verschlüsselung mit dem Cäsarcode erfolgt durch ASCII-Code des Klartexts plus (ASCII-Code des) Schlüssel:

C = M + P

Wir dürfen nicht vergessen, dass nach 26 Buchstaben Ende ist. Modulo funktioniert perfekt.

C = (M + P) mod E

Und nicht vergessen, dass zB ASCII nicht bei 1 mit A anfängt

C = I + ((M + P - I) mod (E - I + 1))

Wie lautet die Umkehrfunktion? Also der Entschlüsselungsalgorithmus, der daran denkt, dass -1 zu 25 referenziert?

M = E - ((E - (C - P)) % (E - I + 1))

Ich bin froh, dass ich es mathematisch beschreiben konnte, ohne eine Fallunterscheidung notieren zu müssen :-) Fürs Programmieren muss man halt ord() und chr() anwenden und Modulo ist meist das Prozentzeichen %

Oder in python:

import unittest

class test_caesar_cryptography(unittest.TestCase):

    def __defaultord__(self, x):
        if not isinstance(x, int):
            return ord(x)
        else:
            return x

    def encrypt(self, m, p=3, i=65, e=90):
        m, p, i, e = map(self.__defaultord__, (m, p, i, e))
        return chr(e - ((e - (m - p)) % (e - i + 1)))

    def decrypt(self, c, p=3, i=65, e=90):
        c, p, i, e = map(self.__defaultord__, (c, p, i, e))
        return chr(i + ((c + p - i) % (e - i + 1)))

    def runTest(self):
        self.assertEqual(self.encrypt('D', 3, 65, 90), 'A')
        self.assertEqual(self.decrypt('A', 3, 65, 90), 'D')
        self.assertEqual(self.encrypt('D', 3, 'A', 'Z'), 'A')
        self.assertEqual(self.encrypt('Z', 3, 65, 90), 'W')
        self.assertEqual(self.encrypt('D', 29, 65, 90), 'A')
        self.assertEqual(self.encrypt(1, 3, 1, 26), chr(24))

if __name__ == '__main__':
    unittest.main()

Menno… hat das lange gedauert, das herauszufinden :-/

proj tom_bathhouse

Ein Badehaus hat 1000 Spinde. Der erste Gast geht durch die Garderobe und schließt die Türe von allen Spinden. Der zweite Gast geht durch und ändert (hier: öffnet) den Zustand jeder zweiten Türe. Der dritte Gast geht durch und ändert den Zustand jeder dritten Türe… der tausendste Gast ändert den Zustand der letzten Türe.
Frage: Welche System steckt hinter den geöffneten Türen?

Thanks to the math geek from ToM ;-)

#!/usr/bin/env python
# -*- coding: utf-8 -*-

limit = 1001

# True = the locker is open
lockers = [True] * limit

def bprint(liste):
    ''' Like pprint, but more beautiful '''
    print '{'
    a = -1
    for i in liste:
        a += 1
        if a != 0:
            print ' %s : %s ' % (a, liste[a])
    print '}'

# foreach person
for a in xrange(1, limit):
    # foreach locker
    for b in xrange(1, limit):
        if b % a == 0:
            lockers[b] = not lockers[b]

bprint(lockers)

Christbäume und prog_langs

>>> print "n".join([(10-a)*' ' + 'x'*2*a + (10-a)*' ' for a in range(10)+[1,1]])

         xx
        xxxx
       xxxxxx
      xxxxxxxx
     xxxxxxxxxx
    xxxxxxxxxxxx
   xxxxxxxxxxxxxx
  xxxxxxxxxxxxxxxx
 xxxxxxxxxxxxxxxxxx
         xx
         xx
>>> 

<?php for($i=1;$i<12; $i++){$a=($i%10==0)?1:$i%10; echo str_repeat(' ',10-$a).str_repeat('x',$a*2).str_repeat(' ',10-$a)."n";}?>

         xx
        xxxx
       xxxxxx
      xxxxxxxx
     xxxxxxxxxx
    xxxxxxxxxxxx
   xxxxxxxxxxxxxx
  xxxxxxxxxxxxxxxx
 xxxxxxxxxxxxxxxxxx
         xx
         xx

Schöner haben es diese Typen gemacht:
via entwicklergolf

PAA vs. PDA

Thomas A. Limoncelli unterscheidet zwischen PAA und PDA. Während PDA (Portable digital assistant) die digitale Version bezeichnet, ist ein PAA “ein papiernes Notizbuch”. Ich wollte auch über die Vor- und Nachteile schreiben, die immer wieder erwähnenswert sind, doch Dirk hat das Thema sehr schön zusammengefasst.

Ich verwende eine stinknormale Textdatei für alles mögliche (unwichtig & wichtig) und muss ich mir Sachen daraus merken, schreibe ich sie mir heraus (PAA). Den PDA (Palm m500) verwende ich nicht mehr (war mir zu kompliziert und Lehrer haben die schlechte Angewohnheit gleich zu denken, dass Schüler irgendwas Schlimmes damit anstellen – ein weiterer Nachteil des PDAs ;-) ). Aber eine PDF über meine eigene Organisation bin ich mir noch schuldig :-)

proj tom_marriage

Treffpunkt Mathematik Heiratsproblem Algorithmus
Treffpunkt Mathematik Heiratsproblem Algorithmus

Beim Treffpunkt Mathematik (ToM) hat Franz Rendl über “Heiratsprobleme – Mathematische Optimierung auf Graphen” gesprochen und uns einen Algorithmus vorgestellt, der das folgende Problem löst (Algorithmus auf unscharfem, zweiten Photo erkennbar):

Die Studenten und die Universität geben jeweils eine Liste heraus; auf welche Uni sie gehen wollen bzw. welchen Studenten sie bevorzugen. Finde die optimale Kombination, damit möglichst viele Studenten und Universität glücklich sind.

Wie in der Angabe werden die Studenten mit 1-12 bezeichnet und die Universitäten mit Kürzeln (Buchstaben), die in unis_translate definiert sind. Es existieren noch zusätzliche Funktionen, die nicht unbedingt notwendig sind.

Das Skript calc.py (funktionierende Version, ohne Tabellen)
Das ganze Projekt (ältere Versionen, funktionierende Version, Tabellen)

Erweiterte Aufgabe: Die Liste beim ToM resultiert aus unseren persönlichen Präferenzen von uns 12 Schülern. Welcher Student war ich (siehe list_students)? :smile:

Der erste Blogbeitrag beschrieb den Umzug auf den serverdrome-Server. Diese Tatsache hat sich heute wieder geändert :-)

Umzug

An diesem Wochenende werde ich den Umzug schaffen. Die neue Adresse (ab morgen):

http://lukas-prokop.at/blog/

Für alle Feed-Abonnenten also:

http://lukas-prokop.at/blog/feed/

proj CMS

Das ist ein uralter Draft, den ich im letzten März geschrieben habe. Er beschreibt das, was im Projekt CMS zusammengefasst werden soll. In der Zwischenzeit wurde dieses CMS von mir kritisiert und der Aufbau wird noch einmal durchdacht. Aber ich will den Einblick nicht verwähren, wie ich damals argumentierte und wie der alte Aufbau ausgesehen hat. Wen es interessiert, kann es lesen ;-)

Jeder PHP-Entwickler entwickelt bei einer Homepage – die nicht auf “fremder” Software basiert – ein eigenes System, das er meist auch bei anderen Webseiten einbaut und ausbaut. Auch ich habe mein eigenes System, allerdings kann ich nicht mit Sicherheit sagen, dass es dem Begriff CMS gleicht. Eigentlich steht nicht der Inhalt im Vordergrund, sondern es sollte eine Plattform für Programmierer sein. So ist es zumindest bei mir der Fall. Im Folgenden beziehe ich mich also auf die Projekte BRG_HP, MyHP und lowk-spotting.at dessen Merkmale ich im Folgenden analysiere.

  • Konfiguration Von entscheidender Bedeutung ist die Konfiguration. Ich schreibe vieles in Variablen wie zB den Titel (<title>) der Seite. Inhalte die sich kurzfristig ändern können, werden genauso zentral definiert, damit ein schneller Zugriff mit minimalem Aufwand möglich.
  • (X)HTML und CSS Von der zuerst genannten Regel schließe ich HTML und CSS aus. Grundlegend schreibe ich in keine Variable wie breit die Tabelle xy ist. Da ich (X)HTML und CSS für “nicht ausgereift” halte, muss ich oft die eine Tabelle breiter machen, als die zweite, weil sie einen anderen Inhalt hat, deshalb ist ein zentrale Verwaltung unmöglich (besonders proj:lowk-spotting.at).
  • central/ Ein Ordner existiert immer in dem die zentrale Verwaltung stattfindet. Eine MySQL-Verbindung wird aufgebaut, Konfigurationsvariablen zur Verfügung gestellt und die meta-Angaben und das Menü stehen auch nur in einer einzelnen Datei. Aktionen, die sich zumindest 2mal wiederholen und einen aufwändigeren Quelltext enthalten, sind zentral definiert und im Ordner central/ zu finden. Das ermöglicht eine einfache Fehlersuche, falls zB eine MySQL-Verbindung nicht mehr möglich ist. Dann ist der Fehler ist der Fehler in nur einem Ordner (central/) zu finden, in dem sich nur wenig Dateien befinden.
  • Ordnung Außerdem muss meine Webseite über eine klare Ordnerstruktur verfügen:
    • root/: Hier befinden sich alle Dateien auf die der User direkt zugreift. Das Verzeichnis enthält alle – im Folgenden genannten – Unterordner. Der Rest der Dateien wird mit require() oder include() eingebunden.
    • bilder/: Dieses Verzeichnis verfügt über alle Bilder, die nicht für das Design der Webseite benötigt werden, sondern nur in einzelnen Dateien und eine hohe Dateigröße aufweisen. Die Bilder sind nicht dokumentiert (der Name ist nicht in Vars definiert – siehe “Doku”).
    • icons/: im Ordner Icons sind alle Graphiken gespeichert, die für das Design verwendet werden. Meist verwende ich hierfür gifs oder pngs. Soll Transparenz im Design enthalten sein, verwende ich natürlich pngs (beachte IE6!). Meist ist es so, dass in bilder/ nur jpegs sind und in /icons nur pngs.
    • central/: Dieser Ordner wurde oben erwähnt. In ihm liegen alle Dateien, die zu 90% in jeder Webseite mitwirken. Eine besondere Datei ist die unten erwähnte hp.php.
    • +workout/ und design/: Diese Ordner kommen nicht auf den Server. In ihm kommen veralterte Dateien und Tests für das Design.

    Diese Ordnerstruktur ist für mich typisch und unverzichtbar. Für mich hat sich diese Struktur sehr bewährt.

  • hp.php
    Die hp.php ist so etwas wie eine globale Konfigurationsdatei. In ihr werden allgemeine Variablen, MySQL-Passwort und die Pfade zu den einzelnen Dateien definiert. Ebenso wird das Framework in ihr geladen, der HTTP-Header gesandt und evtl. die meta-menü-Angaben geladen. Sie übernimmt auch alle Aufgaben, die vor dem Senden der Datei ablaufen müssen (Error-Weiterleitung, Variablenausgabe).

Die Namen der Verzeichnisse können in den einzelnen Projekten variieren.

Linux is more configurable…

Von meiner Startup-Datei habe ich schon mehrmals erzählt. Wenn ich meinen Rechner boote, dann erscheinen der Reihe nach ToDo-Listen, RSS-Feeds, pidgin, etc.

In Windows folgt das ganze diesem System:
Notepad++ wird mit den ToDo-Listen geöffnet
Wird es geschlossen, erscheint Thunderbird
Wird es geschlossen, erscheint pidgin
Die Batch-Datei muss manuell beendet werden (rechte Maustaste > Schließen)

Linux arbeitet da schon ein bisschen komplexer :-)
Möchtest du die Programme der Reihe nach aufrufen?
Eingabe von y für ja
Es erscheint ein Willkommensgruß
Über Variablen wird der Ort der ToDo-Listen-Dateien ermittelt
Starte den Music-Player
Starte direkt darauf den Editor mit den ToDo-Listen
Wird der Editor geschlossen, öffne Thunderbird
Wird Thunderbird geschlossen, öffne pidgin
Warte noch 2 Sekunden und beende das Skript selbstständig

Also welches OS ist anpassungsfähiger? ;-)

Webseitenentwicklungs-Prioritäten

Ich erwähnte bereits den Kampf zwischen Wirtschaftlichkeit und Ideologie. Wie sollte man handelt, wenn W3C-Kompatibilität und Wirtschaftlichkeit in Konflikt stehen?

Prinzipiell: Bei Webseiten versuche ich den folgenden Grundsätzen zu folgen:

  1. One page, one job
  2. Strikte Trennung zwischen HTML, CSS, JS, PHP, TEMPLATES und CONF
  3. Dynamik
  4. Überprüfen von Zuständen, die normalerweise nicht auftreten (gutes Error-Management)
  5. KISS
  6. Kompatibilität mit großer Anzahl von Browsern (IE, FF, Opera, Konqueror, Chrome, Safari, Lynx, etc.)

Im Punkt #5 steht auch wieso ich gegen PHP-OOP bei durchschnittlichen Webseiten bin: OOP kann eine Seite verdammt unübersichtlich machen. Vor allem wenn es schlecht dokumentiert, wenn die Objekte eine starke Abhängigkeit voneinander haben oder es natürlich schlecht programmiert ist. Bei kleinen Webseite bin ich weiterhin gegen OOP (PS: python-OOP finde ich schöner als PHP-OOP)!

Jetzt aber zur eigentlichen Frage: Was ist, wenn sich X und Y ausschließen? Wie geht man damit um? Ich habe für mich die folgende Liste geschrieben. Die #1 hat die höchste Priorität und muss überall gewährleistet sein. Mit “Ideologie” versuche ich bis zur #7 alle Punkte zu erfüllen.

  1. Hauptsache, es funktioniert (Browserkompatibilität)
  2. Sicherheit
  3. SEO (Google)
  4. W3C-Kompatibilität
  5. Quelltext übersichtlich (clientseitig sowie serverseitig)
  6. Quelltext kommentieren (serverseitig)
  7. Laufzeit Optimierung

Was ich auch immer machen wollte, aber immer vergaß: Log-Datei für Systemfehler. zB “08.11.01 date.php konnte smileys.php nicht öffnen”