Portfolio

RedTickets

Een online ticket-service

Moerland.nl

Online makelaardij - Amsterdam

IPAN

Offline networking voor online professionals

EyeCentre de IJssel

Oogkliniek in Gorssel

TRi - Interim

Online ICT Professionals

Absolutely Independent

De stille kracht in TV en Media

Chevrolet

Wintertestdag

Campings met korting

Topcampings met topkorting

Bedrius Tandartspraktijk

Netwerk van praktijken

Ferrimax

Security to the max

Echtscheidingen Nederland

Rechtelijke zaken

WK Kijken

Reclame actie van LG Electronics

Nederlands Hypotheek Collectief

Samen sterk in hypotheekonderhandelingen

De Lunchwinkel

Online lunch bestellen

Iventions

Planning, events en management

Frameworks

Dirty Code - to jail with that!

Been there, done that.

Na het werken in zo veel verschillende systemen, frameworks en grote, angstaanjagend vieze hopen code heb ik erg veel geleerd over programmeren in verschillende omgevingen en samenwerken met verschillende programmeurs. Hieronder een overzicht van wat projecten.

Dirty code, send it to jail

In theorie komen vaak de geweldigste ideeën, goed doorgedachte structuur en de schoonste code. In de praktijk is het vaak een heel ander verhaal. Te strakke deadline's, te weinig budget en slecht management leid vaak tot onoverzichtelijke structuur, slechte functionaliteit en hele vieze code.

Zend Framework

Het aantal projecten dat ik in dit framework heb gemaakt is ongekend veel. De projecten vliegen bijna letterlijk de deur uit. Een deadline van telkens een of twee dagen, vaak kleine projecten, geven een leuke afwisseling en geven je een goed beeld van veel verschillende klanten.

Een greep uit de doos

Bijvoorbeeld: www.canal.nl, www.openpodium.es, www.ipan.nl, www.wkkijken.nl, www.moerland.nl, www.myriaddesign.nl, www.hksadvocaten.nl, www.echtscheidingennederland.nl, www.strafzaakrotterdam.nl, www.nederlandleest.nl, www.bar-ca.com, www.campingsmetkorting.nl, www.chevroletnederland.nl, www.thebootcampclub.nl, www.restaurantdubbel.nl

Kohana Framework

Een licht, snel en vooral makkelijk framework. Alles is zo voor de hand liggend dat je het zo oppakt. Krachtig en toch klein. Perfect voor een groot aantal projecten. Dit framework word intern veel gebruikt voor grote software-pakketten.

Mijn CMS

Een van de proeve van bekwaamheid staat voor het realiseren van een content-management-systeem. Deze proeve heb ik uitgevoerd met als basis het Kohana Framework. Deze als onderliggende krachtpatser en bovenop een enorm simpel maar toch professioneel design maakt een strak CMS. Voeg daar een makkelijk integreerbaar design aan toe en je hebt een huis van een CMS.
Na het tonen van dit CMS aan mijn stagebegeleider was hij zo onder de indruk van de snelheid waarmee een website gerealiseerd kan worden, dat ik toestemming heb gekregen om deze in kleine projecten te gebruiken.

Server config

Bash, don't break it

Wat is er nou leuker dan een zaterdagavond te besteden aan het intypen van commando's, ontdekken van interessante open-source projecten en het oplossen van veel voorkomende problemen.

Look at my little Javascript Typewriter example.

Expirimenteren

De aanschaf van een VPS is een van mijn beste aankopen tot nu toe. De mogelijkheid om hem binnen 3 minuten opnieuw te installeren met welke linux-distro je maar wilt geef je veel vrijheid. Zo heb ik hem al meer dan 200 keer opnieuw laten installeren. Spelenderwijs leren hoe het Linux wereldje in elkaar steekt. Meer leren over pakketten, broncode compilen en server configuraties. De mogelijkheid om vanuit PHP commando's uit te voeren en andersom.

Zo is het leuk om alternatieven te zoeken voor software zoals Nginx voor Lighttpd en Apache. MongoDB, PostgreSQL voor MySQL. Ook het toevoegen van nieuwe caching-technieken als Memcached en Project Voldemort.

Code sample

Kohana Frontend

Het initialiseren van de frontend. Het controleren van alle gegevens, het uitvoeren van de benodigde functies en de uiteindelijke opbouw. Hieronder staat de volledige frontend code van het door mij ontwikkelde CMS op basis van het Kohana Framework.

$ cd /home/root/domains/pitgroup.nl/public_html/projects/bredius/site/application/
$ cat frontend.php
<?php defined('SYSPATH') or die('No direct script access.');

class Controller_Frontend extends Controller {

    /**
     * array with data to parse to the view
     * @var Array
     * @access private
     */

    protected $viewdata = array();

    /**
     * session data
     * @var Session_Core
     * @access private
     */

    protected $session;

    /**
     * @var string template that has to be rendered
     * @access protected
     */

    protected $template = null;

    /**
     * @var string master that wraps the child template
     * @access protected
     */

    protected $masterTemplate = 'template';

    /**
     * @var object member object
     * @access protected
     */

    protected $member = null;

    /**
     * @var login
     * @access protected
     */

    protected $login = false;

        /**
         * runs before running the controller
         */

        public function before(  )
    {
                // default meta info
                $this->_meta();

                //$this->_setTemplate('helper/plain');

                i18n::$lang = 'nl-NL';

                // vanuit flash uploader een sessie id posten
                $this->session = Session::instance('native',Arr::get($_POST,'PHPSESSID',NULL));

                View::set_global('_baseurl',BASEURL);

                View::set_global('_controller',$this->request->controller);

                View::set_global('_method',$this->request->action);
               
                View::set_global('_uri',$this->request->uri);

                View::set_global('_url',$this->request->controller . '/' . $this->request->action );

                View::set_global('_pageurl', '');

                // alle formulieren handlen
                if( $_POST )
                {
                        $_POST = $this->cleanPost( $_POST );
                }

                if( Arr::get($_GET,'ajax','') != '' ) {
                        $this->_setMasterTemplate('helper/plain');
                }
    }

        private function cleanPost(  $post) {
                foreach( $post as $var => $val ) {
                        if( is_array( $val ) ){
                                $post[$var] = $this->cleanPost( $val );
                        } else {
                                if( $this->request->directory == 'admin' )
                                {
                                        $post[$var] = trim( $val );
                                }else{
                                        $post[$var] = security::xss_clean( trim( $val ) );
                                }
                        }
                }
                return $post;
        }

        /**
         * runs after running the controller
         */

        public function after()
        {
                /*
                 * Sessie messages
                 */

                if( is_array( $this->session->get('_msg','') ) ){
                        View::set_global('_msg',$this->session->get('_msg'));
                        $this->session->delete('_msg');
                }
               
                /*
                 * Template = controller / actie .php
                 */

                $template = View::factory( $this->masterTemplate );

                /*
                 * Geassignde vars naar de template sturen
                 */

                if( count( $this->viewdata ) > 0 ){
                        foreach( $this->viewdata as $key => $val ){
                                $this->template->set($key, $val);
                        }
                }

                /*
                 * Sub template renderen
                 */

                if( !is_null( $this->template ) )  {
                        $template->_content = $this->template->render();
                } else {
                        throw new Exception('Geen template gezet');
                }

                /*
                 * De hoofd template als response naar de gebruiker sturen
                 */

                $this->request->response = $template->render();
        }

        /**
         * Setter voor de title
         * @param string $strTitle de titel
         */

        protected function _meta( $strTitle = '', $strDescription = '', $strKeywords = '' )
        {
                View::set_global('_title', $strTitle );
                View::set_global('_description', $strDescription );
                View::set_global('_keywords', $strKeywords );
        }

        /**
         * setter voor template
         * @param <type> $template
         */

        protected function _setTemplate( $template )
        {
                $this->template = View::factory( $template );
        }

        /**
         * setter voor template wrapper
         * @param <type> $template
         */

        protected function _setMasterTemplate( $template )
        {
                $this->masterTemplate = $template;
        }

    /**
     * set a key and a value to parse into template
     *
     * @param mixed $key
     * @param mixed $value
     */

    protected function _set( $key, $value )
    {
        $this->viewdata[$key] = $value;
    }

    /**
     * set a session message
     *
     * @param mixed $key
     * @param mixed $value
     */

    protected function _msg( $message, $status )
    {
        $this->session->set('_msg',array(
                        'message' => $message,
                        'status' => $status
                ));
    }

    /**
     * redirect tot a specified url
     *
     * @param mixed $key
     * @param mixed $value
     */

    protected function _redirect( $url, $ignore = false )
    {
                if( !$ignore && Arr::get($_GET,'goto','') != '' ) {
                        if( strstr( Arr::get($_GET,'goto'), 'http://' ) ) {
                                $this->request->redirect( Arr::get($_GET,'goto') );
                        }
                        $this->request->redirect( BASEURL . Arr::get($_GET,'goto') );
                }
                $this->request->redirect( BASEURL . $url );
    }

}

?>