by:

In der Regel programmieren wir ja, um anderen die Arbeit leichter zu machen, bzw. erst zu ermöglichen.
Heute möchte ich einen Weg vorstellen, wie wir uns das Leben etwas leichter machen können.
Ich habe dazu zwei Klassen Online gestellt ClassCreater und TemplateCreater.
Wie der Name schon sagt, erstellt dieses Projekt automatisch Klassen und das dazugehörige Template.
So enthält die damit generierte Klasse alle nötigen Methoden um Daten
in einer Datenbank anzulegen, zu bearbeiten und zu löschen.

Das Projekt befindet sich zwar noch im Entwicklungsstadium, dennoch ist der generierte PHP Code
bereits voll funktionstüchtig.

Die Klassen sowie das Template werden anhand eines create table statements generiert->

BSP:

create table contact (
    id int(12) unsigned not null auto_increment,
    firstname varchar(255) default null,
    lastname varchar(255) default null,
    email varchar(255) default null,
    birthday datetime NOT NULL default '0000-00-00 00:00:00',
    comment text,
    PRIMARY KEY  (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;


Und dazu passend hier die generierte Klasse:
 

Update: Die Security issues sollten jetzt behoben sein !

Code

<?php
    
    
class contact extends BaseApp {
    
    
    
    /**
         * @var int
         */
    
    public $id 0;
    
    
    /**
         * @var string
         */
    
    public $firstname '';
    
    
    /**
         * @var string
         */
    
    public $lastname '';
    
    
    /**
         * @var string
         */
    
    public $email '';
    
    
    /**
         * @var string
         */
    
    public $birthday '';
    
    
    /**
         * @var string
         */
    
    public $comment '';
    
    
    protected $db;
    
    
        
        
/**
         * The constructer
         */
    
    public function __construct ($id '')
    
    {
    
        if (!isset($this->db))
    
           $this->db parent::getInstance();
    
    
        if (!empty($id))
    
        {
    
           $this->id $id;
    
           $this->get();
    
        }
    
    }
    
    
    
    /**
         * Sanitize a input array
         *
         * @param array $data
         * @return array
         */
    
    public function check($data '')
    
    {
    
        $check = array(
    
        'id' => FILTER_SANITIZE_NUMBER_INT,
    
        'firstname' => FILTER_SANITIZE_STRING,
    
        'lastname' => FILTER_SANITIZE_STRING,
    
        'email' => FILTER_SANITIZE_STRING,
    
        'birthday' => FILTER_SANITIZE_STRING,
    
        'comment' => FILTER_SANITIZE_STRING
            
);
    
        return filter_var_array($data$check);
    
    }
    
    
    
    /**
         * Delete a element in the Database
         */
    
    public function del ()
    
    {
    
        if (empty($this->id) || !is_numeric($this->id))
    
            return false;
    
    
        $sql "DELETE FROM contact WHERE id = :id";
    
        $stmt $this->db->dbh->prepare($sql);
    
        $stmt->bindValue(':id'$this->idPDO::PARAM_INT);
    
        $stmt->execute();
    
    }
    
    
    
    /**
         * Get a list of objects
         *
         * @param array $data optional if you like to get only a subset of data
         *
         * @return obj
         */
    
    public function get_list ($data '')
    
    {
    
        $sql "SELECT c.id, c.firstname, c.lastname, c.email, c.birthday, c.comment FROM contact as c";
    
        if (is_array($data))
    
        {
    
            $data $this->check($data);
    
            $sql .= " WHERE";
    
            foreach ($data as $key => $value)
    
            {
    
                if ($value)
    
                    $sql .= " c.$key = '$value' and";
    
            }
    
            $sql substr($sql0, -4);
    
        }
    
        $stmt $this->db->dbh->query($sql);
    
        $obj $stmt->fetchALL(PDO::FETCH_CLASS'contact');
    
        return $obj;
    
    
    }
    
    
    
    /**
         * Get one Dataset from the db
         */
    
    public function get ()
    
    {
    
        if (empty($this->id) || !is_numeric($this->id))
    
            return false;
    
    
        $sql "SELECT c.id, c.firstname, c.lastname, c.email, c.birthday, c.comment FROM contact as c WHERE
            c.id = 
$this->id";
    
        $stmt $this->db->dbh->query($sql);
    
        $result $stmt->fetch(PDO::FETCH_ASSOC);
    
        foreach ($result as $key=>$val)
    
        {
    
            $this->$key=$val;
    
        }
    
    }
    
    
    
    /**
         * The save method is responsability for
         * saving and updating a dataset
         */
    
    public function save ()
    
    {
    
        if (empty($this->id))
    
        {
    
            $sql 'INSERT INTO contact  (firstname, lastname, email, birthday, comment) VALUES
                (:firstname, :lastname, :email, :birthday, :comment)'
;
    
            $stmt $this->db->dbh->prepare($sql);
    
        }
    
        else
    
        {
    
            $sql 'UPDATE contact set
                 firstname = :firstname,
                 lastname = :lastname,
                 email = :email,
                 birthday = :birthday,
                 comment = :comment'
;
    
            $sql .= " WHERE id = :id";
    
            $stmt $this->db->dbh->prepare($sql);
    
            $stmt->bindValue(':id'$this->idPDO::PARAM_INT);
    
        }
    
        $stmt->bindValue(':firstname'$this->firstnamePDO::PARAM_STR);
    
        $stmt->bindValue(':lastname'$this->lastnamePDO::PARAM_STR);
    
        $stmt->bindValue(':email'$this->emailPDO::PARAM_STR);
    
        $stmt->bindValue(':birthday'$this->birthdayPDO::PARAM_STR);
    
        $stmt->bindValue(':comment'$this->commentPDO::PARAM_STR);
    
        $stmt->execute();
    
    }
    }
    
?>


Ich denke das die automatisch generierte Klasse relativ übersichtlich und verständlich gehalten ist,
dazu passend hab ich auch noch ein kleines Bsp. Script wie man nun diese Klasse benutzen kann.

Code
<?
    include('./inc/class/BaseApp.php');
    include('./inc/class/contact.php');
    
    # ein eintrag erstellen
    $new_contact = new contact();
    $new_contact->firstname = "andreas";
    $new_contact->save();
    
    # ein eintrag aktualisieren
    $contact = new contact(1);
    $contact->firstname = "andreas";
    $contact->lastname = "beder";
    $contact->save();
    
    # nun laden wir eine liste, mit gewissen eigenschaften
    $list = $contact->get_list(array("firstname" => "andreas", "lastname" => "beder"));
    foreach($list as $obj)
    {
        # das aktualisieren geht ganz einfach
        $obj->email="andreas@codejungle.org";
        $obj->save();
    
        # ebenso das löschen
        $obj->del();
    }
    
    ?>
    


Wer es selber mal ausprobieren oder sich daran beteiligen mag, kann sich das Projekt hier herunterladen:

svn co svn://codejungle.org/sourcemagic

Das Projekt ist wie gesagt noch nicht fertig, so benötigt das generieren von HTML Templates noch etwas mehr Zuwendung.
Ich hoffe aber, dass ich das in den kommenden Wochen und vielleicht mit deiner Hilfe in den Griff bekomme.

An dieser Stelle möchte ich auch noch die bekannten Object-Relational Mapper erwähnen,
Doctrine und Propel, welche beide sehr umfangreiche Funktionen zur Verfügung stellen.
Wer mehrere Tabellen verbinden möchte und komplexe Anfragen bewältigen muss ist hier gut bedient.

Man sollte allerdings immer bedenken, dass bei Applikationen, die sehr hohe Last bewältigen müssen, ein zusätzlicher layer
meistens mehr Komplexität bedeutet und ausserdem oft auf Kosten der Performance geht.

Mein Projekt bietet im Vergleich zu Doctrine und Propel wesentlich weniger Funktionen,
bei mir werden einfache C.R.U.D (Create, Read, Update und Delete) Methoden automatisch generiert,
was im wesentlichen uns Programmierern etwas Schreibarbeit abnehmen soll, die Applikationslogik
müssen wir natürlich weiterhin selbst erstellen.

Wer mit mir das Projekt weiterentwicklen möchte, schreibt am Besten einfach eine kurze Mail, ich werde dann
bei Bedarf SVN Zugang zur Verfügung stellen.

Ich freue mich natürlich auch über Verbesserungsvorschläge und Kommentare.

Happy Hacking

Andreas


Kommentare

by:

Zutaten

Teig:

 

400g Mehl
200ml Wasser (lauwarm)
15g Germ
4el Öl
  Salz


Belag:

Passierte Tomaten
Mozarella
Blattspinat (am einfachsten aus dem Tiefkühlfach!)

Gewürzmischung:

Olivenöl
Salz
Pfeffer
Oregano
Basilikum
Knoblauch
Wer es etwas feuriger mag, kann auch Chili dazu geben.


pizza


Zubereitung:

Das wichtigste ist die Basis, daher widmen wir uns als erstes dem Teig. Die Zutaten vermengen, gut durchkneten und zu einer Kugel formen. Das geht schnell und sollte auch für bekennende Nichtköche kein unlösbares Problem darstellen. So, nach der ersten Action haben sich Teig und Koch eine kleine Pause verdient. Der Teig wandert daher für mindestens 30 Minuten an ein lauschig warmes Plätzchen und der Koch kann sich in der Zeit in aller Ruhe wieder seinem Computer widmen. Keine Sorge, falls man vorlauter coden auf die Pizza vergisst, der Teig kann ruhig ein bisschen länger ruhen. Wenn sich der Hunger meldet wird es Zeit den Teig in eine essbare Pizza zu transformieren...

Auch kein Problem, den Teig auf Backpapier geben und möglichst dünn ausrollen. Gut auch das war nicht so schwierig. Darauf kommt jetzt der Belag.  
Erstmal passierte Tomaten auf den Teig geben und gleichmäßig verstreichen, mit Salz, Pfeffer und Oregano würzen. Etwas Käse darauf verteilen. Den aufgetauten Spinat ebenfalls mit Salz und Pfeffer würzen und mit etwas kleingescnittenem Knoblauch verfeinern, auf der Pizza verteilen. Jetzt noch den Mozarella klein schneiden und darüberstreuen. Wer mag kann auch noch frische Tomaten auf die Pizza geben, sofern der Vorratsschrank so etwas hergibt. ;)

Das sieht schon mal ganz gut aus, jetzt geht's ab ins Backrohr. Bei Stufe 6 (180 c) circa 20 Minuten backen. Wenn der Käse goldbraun ist, ist es die Pizza höchstwahrscheinlich auch, ist der Käse bereits schwarz ist das Experiment gescheitert und man muss zurück zu Schritt eins...

Auf die fertige Pizza gibt der Feinschmeckergeek jetzt noch eine leckere italienische Würzsauce. Auch die ist sehr simpel hergestellt, verbessert aber das Endergebnis enorm. Ein einfacher Trick mit großer Wirkung, schließlich möchte der Nerd von heute auch mal sein Mädel beeindrucken. Also schnell etwas Olivenöl (2-3 Esslöffel) in eine Schale geben, Salz, Pfeffer, kleingeschnittener Knoblauch, Oregano, Basilikum und nach belieben etwas Chili dazu geben. Frische Kräuter outen den professionellen Kochgeek und sind geschmacklich von den Trockenkräutern nicht zu übertreffen. Die getrockneten Kräuter aus dem Supermarkt eignen sich aber auch und erfüllen durchaus ihren Zweck.
Die Würzmischung über die Pizza träufeln und fertig.


Viel Spass und guten Hunger


Kommentare

by:

Ladies and Gentleman, turn your lights on

SourceCode

#!/usr/bin/python

import pygame
import pygame.camera

class Capture(object):
    a = []
    allines = []
    found = 0
    def __init__(self):
        self.size = (640,480)
        # create a display surface. standard pygame stuff
        self.display = pygame.display.set_mode(self.size, 0)
        
        # this is the same as what we saw before
        self.clist = pygame.camera.list_cameras()
        if not self.clist:
            raise ValueError("Sorry, no cameras detected.")
        self.cam = pygame.camera.Camera(self.clist[0], self.size)
        self.cam.start()

        # create a surface to capture to.  for performance purposes
        # bit depth is the same as that of the display surface.
        self.snapshot = pygame.surface.Surface(self.size, 0, self.display)

    def get_and_flip(self):
        # if you don't want to tie the framerate to the camera, you can check 
        # if the camera has an image ready.  note that while this works
        # on most cameras, some will never return true.
        if self.cam.query_image():
            self.snapshot = self.cam.get_image(self.snapshot)

        # blit it to the display surface.  simple!
        self.display.blit(self.snapshot, (0,0))
        pygame.display.flip()

    def main(self):
        going = True
        while going:
            for event in pygame.event.get() :
              if event.type == pygame.KEYDOWN :
                if event.key == pygame.K_SPACE :
                  print "Space bar pressed down."
                elif event.key == pygame.K_ESCAPE :
                  print "Escape key pressed down."
              elif event.type == pygame.KEYUP :
                if event.key == pygame.K_SPACE :
                  del self.a[:]
                  del self.allines[:]

                elif event.key == pygame.K_ESCAPE :
                  pygame.quit()

            self.get_and_flip()



    def get_and_flip(self):
        self.snapshot = self.cam.get_image(self.snapshot)
        # threshold against the color we got before
        crect = pygame.draw.rect(self.display, (255,0,0), (145,105,30,30), 4)
        #self.ccolor = pygame.transform.average_color(self.snapshot, crect)
        mask = pygame.mask.from_threshold(self.snapshot, (240, 240, 255), (30, 30, 30))
        self.display.blit(self.snapshot,(0,0))
        # keep only the largest blob of that color
        connected = mask.connected_component()
        # make sure the blob is big enough that it isn't just noise
        if mask.count() > 100:
            # find the center of the blob
            coord = mask.centroid()
            self.a.append(coord)
            self.found = 0
        else:
            self.found = self.found+1

        #if we not found the threshold color more then 15 times
        #we create a new line 
        if self.found > 15:
            self.allines.append(self.a[:])
            del self.a[:]

        l = len(self.a)

        for i in range(len(self.allines)):
            if len(self.allines[i]) >1:
                pygame.draw.aalines(self.display, (255,255,255), 0, self.allines[i], 1)
        if l > 1:                
            pygame.draw.aalines(self.display, (255,255,255), 0, self.a, 1)
        pygame.display.flip()


pygame.init()
pygame.camera.init()
x = Capture()
x.main()

Happy Hacking

Andreas


Kommentare

by:


Kommentare

by:

Ein guter Freund von mir war so freundlich, ein Python QT Interface zu meiner Website Thumbnailer API zu bauen.

Screenshot | Download

Hier der Sourcecode:

from PyQt4.QtCore import *
from PyQt4.QtGui import *
from PyQt4.QtNetwork import *

from designs.FetchDialog import Ui_FetchDialog

import os,sys



class MainClass(QDialog):
    def __init__(self, parent = None):
        super(QDialog, self).__init__()
        
        QApplication.setStyle(QStyleFactory.create('plastique'))
        
        self.layout = Ui_FetchDialog()
        self.layout.setupUi(self)
        
        self.layout.progress.hide()
        self.layout.btn_save.hide()
        self.layout.pic.hide()
        
        self.connect(self.layout.btn_save, SIGNAL("pressed()"), self.saveDownloadedImage)
        self.connect(self.layout.btn_get, SIGNAL("pressed()"), self.progressDownload)
        
    def progressDownload(self):
        self.layout.progress.setValue(0)
        self.layout.progress.show()
        
        self.networkmanager = QNetworkAccessManager();

        request = QNetworkRequest()
        url = "http://codejungle.org/api/thumb_get.php?url=%s" % self.layout.url.text()

        request.setUrl(QUrl(url))
        
        self.reply = self.networkmanager.get(request)
        self.connect(self.reply, SIGNAL("downloadProgress(qint64,qint64)"), self.updateProgressBar)
        self.connect(self.networkmanager, SIGNAL("finished(QNetworkReply *)"), self.showThumbnail)
    
    def showThumbnail(self, replyFromServer):
        if(replyFromServer.isFinished() == True):
            imageData = replyFromServer.readAll()
            
            if(imageData.size() == None):
                print "Error while reading image!"
            
            pixmap = QPixmap()
            pixmap.loadFromData(imageData)
            
            self.originalPixmap = pixmap
            
            if(pixmap.width() > 800):
                pixmap = pixmap.scaledToWidth(800)

            self.layout.pic.setPixmap(pixmap)
            self.layout.pic.setMaximumHeight(600)
            self.layout.pic.setMaximumWidth(800)
            
            
            self.layout.pic.show()
            self.layout.btn_save.show()
            
            replyFromServer.deleteLater()
            
    def saveDownloadedImage(self):
        saveTo = QFileDialog.getSaveFileNameAndFilter(parent=None, caption=QString(), directory = QString(), filter = "Images (*.png)")
              
        if(self.originalPixmap.save(saveTo[0], "png")):
            QMessageBox.information(self, "Success!", "Your image is now saved!")
            
            self.layout.pic.hide()
            self.layout.btn_save.hide()
            self.resize(530, 132)

    def updateProgressBar(self, bytesRecieved, bytesTotal):
        self.layout.progress.setMaximum(bytesTotal)
        self.layout.progress.setValue(bytesRecieved)
        
        if(self.layout.progress.value() == bytesTotal):
            self.layout.progress.hide()
    
if __name__ == "__main__":
    app = QApplication([])
    software = MainClass()
    software.show()
    app.exec_()



Known Bugs:

  • Die Vorschau zeigt bei manchen Webseiten nur einen Teil an, generiert und gespeichert wird davon unabhängig das Bild der ganzen Webseite.
  • Einige Sonderzeichen in der Adresse machen noch Probleme.

Vielen Dank an Mario (www.unite-it.at) an dieser Stelle.

Andreas


Kommentare


Seiten: