Linux – grep mit ODER Verknüpfung – egrep
Oft benutzt und mal für das Archiv.
Wenn man mehrere Bedingen ODER verknüpft bei dem Programm grep haben möchte, geht das nur über egrep:
egrep# Bsp für eine Oder Verknüpfung (PIPE-Symbol) egrep "2010:13:59|2010:13:57" *.log
Zend Studio 7.2 – Autovervollständigung geht nicht mehr
Zend Studio 7.2 ist die kostenpflichtige IDE, wenn es um PHP-Entwicklung geht. Aus einem unbekannten Grund funktionierte meine Autovervollständigung nicht mehr.
Die Lösung habe ich in diesem Blog und dadurch auch in diesem Forum gefunden.
Man geht in seinen Workspace
# Bsp: windows 7, Standardworkspace C:\Users\<EUER_USER>\Zend\workspaces\DefaultWorkspace7\.metadata\.plugins\org.eclipse.core.runtime\.settings
und löscht die Datei
org.eclipse.dltk.ui.prefs
Danach Zend Studio neu starten, und die Autovervollständigung funktioniert wieder.
ZendFramework – Zend_Auth mit aktiven und inaktivem Nutzer
In meinem vorherigen Post habe ich geschrieben, wie man mit dem ZendFramework eine Spalte auf Eindeutigkeit prüft. Nun habe ich mit Zend_Auth herumgespielt. Diese Klasse ist für das Anmelden gegen eine definierte Datenquelle über einen Provider zuständig. Nun war meine pers. Anforderung, über Zend_Auth einen Login zu realisieren, welches auch aktive und inaktive User berücksichtigt. Ich habe dies in einem Modul integriert namens User.
Tabelle (gekürzt)
-- -- Tabellenstruktur für Tabelle `user` -- CREATE TABLE IF NOT EXISTS `user` ( `id` int(11) NOT NULL AUTO_INCREMENT, `username` varchar(45) NOT NULL, `password` varchar(45) NOT NULL, `firstname` varchar(45) NOT NULL, `lastname` varchar(45) NOT NULL, `email` varchar(45) NOT NULL, `active` tinyint(4) DEFAULT '0', PRIMARY KEY (`id`), UNIQUE KEY `email` (`email`), ) ENGINE=InnoDB DEFAULT CHARSET=utf-8;
Das Formular (vereinfacht):
// application/modules/user/form/Login.php class User_Form_Login extends Zend_Form { public function init() { // diese Felder kann man auch über Zend_Config realisieren $this->setAction('/user/authentication/login'); $this->setName('loginform'); $this->setMethod('post'); $username = new Zend_Form_Element_Text('username'); $username->setLabel('Benutzername'); $username->setRequired(); $password = new Zend_Form_Element_Password('password'); $password->setLabel('Passwort'); $password->setRequired(); $submit = new Zend_Form_Element_Submit('submit'); $submit->setLabel('Anmelden'); $this->addElements(array($username, $password, $submit)); } }
Im View (gekürzt):
<?php // application/modules/user/views/scripts/authentication/login.phtml ?> <h1>Login</h1> <?= $this->form->render(); ?>
Der Authentifizierungscontroller:
// application/modules/user/controller/Authentication.php class User_AuthenticationController extends Zend_Controller_Action { public function init() { /* Initialize action controller here */ } public function indexAction() { // action body } public function loginAction() { // schon eingeloggt? if (Zend_Auth::getInstance()->hasIdentity()) { $this->_redirect('/'); } $form = new User_Form_Login(); $this->view->form = $form; if ($this->getRequest()->isPost()) { $formData = $this->getRequest()->getPost(); if ($form->isValid($formData)) { $authAdapter = $this->getAuthAdapter(); $authAdapter->setIdentity($form->getValue('username')); $authAdapter->setCredential($form->getValue('password')); $auth = Zend_Auth::getInstance(); $res = $auth->authenticate($authAdapter); if ($res->isValid()) { $identity = $authAdapter->getResultRowObject(); $authStorage = $auth->getStorage(); $authStorage->write($identity); // ... } else { // ... } } else { $form->populate($formData); } } } public function logoutAction() { // action body Zend_Auth::getInstance()->clearIdentity(); $this->_redirect('/'); } /** * Liefert den AuthAdapter * * @return Zend_Auth_Adapter_DbTable */ private function getAuthAdapter() { return new Zend_Auth_Adapter_DbTable( Zend_Db_Table::getDefaultAdapter(), 'user', 'username', 'password' ); } }
In meiner persönlichen Anforderung wollte ich aber, das man auch einen Aktivstatus realisiert. Wenn ein User sich also registriert, soll er erstmal inaktiv sein und sich entweder durch eine E-Mail oder den Admin aktiviert werden. Solange darf er sich natürlich nicht anmelden können. Dazu ist nur ein Parameter mehr erforderlich
/** * Liefert den AuthAdapter * * @return Zend_Auth_Adapter_DbTable */ private function getAuthAdapter() { return new Zend_Auth_Adapter_DbTable( Zend_Db_Table::getDefaultAdapter(), 'user', 'username', 'password', 'SHA1(?) AND active=1' // hier kann man den credentialColumn-Parameter anpassen ); }
Vielleicht habt ihr ja noch weitere Möglichkeiten, den Loginprozess zu optimieren. Ich bin auf jeden Kommentar gespannt
Typo3 – 4.3 / Frontendediting aktivieren
Mit der aktuellen Version 4.3.x ist das neue Frontendediting gekommen. Um in den Genuss zu kommen, muss man dies erst aktivieren.
Folgende Schritte sind dafür notwendig:
Installieren und aktivieren der Extension feeditadvanced
Aktivieren des Plugins über die TSConfig:
admPanel { enable.edit=1 module.edit.forceDisplayFieldIcons=1 hide=1 }
ZendFramework – Eindeutigen Datensatz prüfen
Das Zend Framework bietet mit seinen Validatoren sehr schöne Möglichkeiten, die Daten des Benutzers zu prüfen. Bisher habe ich immer im Controller geprüft, ob es einen Datensatz schon einmal gibt, wie z.B.: E-Mail Adresse, oder Benutzername. Doch es geht noch viel einfacher. Das ZendFramework bietet dafür die Klasse Zend_Validate_Db_NoRecordExists an. Diese erbt von der abstrakten Klasse Zend_Validate_Db_Abstract. Als Parameter gibt man in diesem Beispiel die Tabelle und die zu prüfende Spalte an.
Hier ein Beispiel der Benutzung in der Formklasse eureres Moduls
class User_Form_Register extends Zend_Form { /** * Init the Registerform * * @return void */ public function init() { $this->setAttrib('id', 'registerform'); $this->setAction('/user/index/create'); // ... // username $dbValUnique = new Zend_Validate_Db_NoRecordExists('user', 'username'); // Das DB ValidatorObjekt $username = new Zend_Form_Element_Text('username'); $username->setLabel('Benutzername'); $username->setRequired(); $username->addValidator('regex', true, array('/^[a-z]/i')); $username->addValidator($dbValUnique); // Hinzufügen zum Element $this->addElement($username); // ... // e-mail $dbValUnique = new Zend_Validate_Db_NoRecordExists('user', 'email'); // Das DB ValidatorObjekt $email = new Zend_Form_Element_Text('email'); $email->setLabel('E-Mail'); $email->setRequired(); $email->addValidator(new Zend_Validate_EmailAddress()); $email->addValidator($dbValUnique); // Hinzufügen zum Element $this->addElement($email); // ... } }
WordPress Lightword Theme 1.9.8
Das Theme, was ich hier bei WordPress nutze, heißt LightWord. Es gibt wieder einige Updates und kompatibiltätspatches für WordPress 2.8. Eine Vorschau auf einige neue Features könnt ihr auf der Website betrachten.
Die aktuelle Version ist 1.9.8 und ist vom 27.01.2010.
Eine Hauptänderung, die ich jetzt nutze ist die Option, das Layout auf wide einzustellen.
Zu finden ist diese Option Plugins => LightWord Settings => Layout settings => Auf Wider stellen.
Singleton Muster
Das Singleton Muster (Singleton Pattern) ist ein Entwurfsmuster in der Sofwareentwickung, welches beschreibt, das man ein Objekt nur einmal instanziieren darf.
Was genau wird realisiert?
Der Konstruktor des Objektes wird auf private gesetzt. Dies hat zur Folge, das man keine Instanz mit dem new Operator erstellen kann. Danach wird eine statische Methode erstellt, die eine neue Instanz des Objektes zurück gibt. In dieser Methode wird überprüft, ob es schon eine Instanz gibt, anhand einer statischen Membervariable. Das wars. Eingesetzt wird dies unter anderem bei Winforms, damit man ein Fenster nicht mehrfach erzeugen kann.
class Singleton { /** * @var Singeleton */ private static $_instance; /** * Kontruktor MUSS logischerweise auf private gesetzt werden */ private function __construct() { /* beliebiger CODE */ } /** * @return Singleton */ public function getInstance() { if (self::$_instance == null || !(self::$_instance instanceof Singeleton)) { self::$_instance = new Singleton(); } return self::$_instance; } } // aufruf $mySingletonOnject = Singleton->getInstance();
Quelle: Wikipedia DE
// Nur zur Veranschaulichung – bitte nicht verwenden! sealed class Singleton { private Singleton() { /* beliebiger CODE im Kontruktor */ } private static Singleton _instance = null; public static Singleton getInstance() { if(_instance == null) { _instance = new Singleton(); } return _instance; } } // Diese Version verwenden, wegen der ThreadSicherheit sealed class Singleton { private Singleton() { /* beliebiger CODE */ } private static volatile Singleton _instance = null; public static Singleton getInstance() { // DoubleLock if(_instance == null) { lock(m_lock) { if (_instance == null) { _instance = new Singleton(); } } } return _instance; } // Hilfsfeld für eine sichere Threadsynchronisierung private static object m_lock = new object(); } // Zugriff über Singleton Singleton MySingletonObject = Singleton.getInstance();
Für weitere Informationen zu Singleton oder weiteren Design Pattern empfehle ich folgende Links
- Singleton
- Singleton WIKIPEDIA
- http://www.dofactory.com/Patterns/Patterns.aspx
- http://de.wikipedia.org/wiki/Entwurfsmuster
- Dirk Primbs - Singleton
Edit: eine erweiterte Variante, basieren auf Dirk Primbs Post
sealed class Singleton { // > c# 2008 - Hier wird eine statische Variable erzeugt, die mit // volatile => Threadsafe // readonly => mit dem Schlüsselwort stellen wir sicher, das keine neue Instanz erzeugt wird public static readonly volatile Singleton Instance = new Singleton(); public string Name {get; set; } // Konstruktor auf private private Singleton() { /* beliebiger CODE */ } } // Testing var x = Singleton.Instance; x.Name = "Hans"; var y = Singleton.Instance; y.Name = "Werner"; // Beide Ausgaben ergeben Werner, weil es nur eine Instanz des Objektes zurückgegeben wird Console.WriteLine("X: " + x.Name); Console.WriteLine("Y: " + y.Name); Console.ReadLine();
Frohe Weihnachten 2009
Ich wünsche allen Lesern, Kollegen und Freunden gute Weihnachten, ein fröhliches Fest und einen guten Rutsch in das Jahr 2010.
Happy Coding
Christian

















