Notes from ZendCon 2010 #zendcon #zc10

Brain dumping ZendCon 2010..  If you find any broken links or have links to slides/people I wasn’t able to find, please let me know! I’m aware that some presenters are holding back their slide decks. And some folks (mostly from the IBM-i sessions) don’t seem to have blogs or twitter accounts?

Overall Impressions:

This was my first ZendCon, and my overall impression is a positive one. I walked away with a much better understand of the community and Zend’s involvement in it. I also was very fortunate to meet many new people from all over the world and of wide skillset and experience. The networking and conversations that took place outside of the sessions and at restaurants or poolside over drinks is where the real connections are made.

Some Highlights:

I didn’t know what to think:

  • The food (breakfast and lunch) where about what you would expect from a conference of this caliber. I found myself more than once wanting to leave the venue at lunch and seek real food. Of exception is the dinner provided at the receptions in the evenings.
  • The vendor expo / floor. What a sad turnout (although I was told it was on-par with last years). All you had to do was walk by the Cloud Expo hall to catch a glimpse of what a real show looks like. I was also told the prize/swag ratio was higher at last year’s conference.
  • The constant fawning by some vendors to recruit the attendees. It was like watching a Jr. High School dance. I wish I could have worn a “got telecommute?” shirt. That would have started conversations with companies I’d be interested in.

Big Letdowns:

There were two main low points for me at the conference:

  • The scheduling snafu that caused Jonathan Wage’s sessions to get canceled. One of the main reasons I was looking forward to ZendCon was the sessions on Doctrine2. I’m not sure what lead to this, and I would hope it was a fluke.
  • The Keynotes and ‘The Cloud’. I’ve been to a few internet/tech conferences, and I’d like to think I can recognize when a presentation is not reaching it’s target audience. Most of the keynotes at ZendCon were no exception. If they were related to Zend products, I’d guess most of the attendees didn’t learn anything new. If the presentation at any point used “cloud” more than once, it instantly lost credibility with me (and I was not alone as many users in the #zendcon IRC channel chimed in similar skepticism). The CloudExpo conference was next door and I wondered more than once if the speaker had wandered into the wrong hall.

Books to read:

Completely Random:

  • Robotic Vacuum Overlords (via @naderman)
  • The Nikon to Canon Ratio – why do most php developers prefer Nikon? (the ratio was 5-1 at the conference by my count)
  • Need to follow-up with David Abdemoulaie (@hobodave) – Re: Doctrine2 pagination
  • My Tweets from the week of ZendCon.
  • I need to brush up on my German and French, learn Russian.

My joind.in Comments:

Sessions and Slides:

Nov 01, 2010

Nov 02, 2010

Nov 03, 2010

Nov 04, 2010

Uncons, etc..  ping me if you have more info on these or others:

Should you attend ‘Day Camp 4 Developers’?

It’s a tough question. You find yourself sitting around with nothing to do on November 6th, and you’re thinking to yourself:

  • Man, I really could use some pointers on Career Management.
  • The team I manage could be more productive if I was just a little better at Technical Writing.
  • How do I write a resume that gets read?

Well then this is for you!

But ‘wait!‘, you say. Conferences are expensive. There’s the hotel and the airlines and the jet lag – all those costs add up!

Not Day Camp 4 Developers! This is an online conference, and just $35 per person.

So what are you waiting for!?

Getting Doctrine 2 and CodeIgniter 1.7 and PHP 5.3 and MySQL 5.1 and MongoDB 1.4 to play nice – across databases and objects.

Disclaimer: This post covers at a very high level an approach I’m taking into a possible solution to a challenge I’m facing at work. It should in no way be deemed the end-all, be-all, de facto standard. In fact, I’d love to hear your alternative approaches in the comments below!

There are some things that are  not covered in this post, including:

  • How to install/compile/configure PHP, CodeIgniter, Doctrine, MySQL, or MongoDB.
  • The reasons why we are using a Relation Database and a Document-based Database. No really, don’t ask.
  • How to use the command-line features of Doctrine to auto-generate your database schema.

There are some places in the code sample that you will need to edit and modify to your environment  if you copy-paste this code into your own works. Those items are in ALL_CAPS and <<CONTAINED_WITHIN_LT_GT_SIGNS>>. Just plug in your own values for these.

So,

We begin by starting off with a great example from the Doctrine v2 documentation / cookbook: Integrating with CodeIgniter. This will be the basis for our CodeIgniter Library, with a few modifications, including:

Adding in the Doctrine MongoDB ODM namespaces. You’ll noticed that we aliased the MongoDB\Configuration since it clashes with the ORM\Configuration.

<?php
use Doctrine\Common\ClassLoader,
    Doctrine\Common\Annotations\AnnotationReader,
    Doctrine\Common\Cache\ArrayCache,
    Doctrine\ORM\Configuration,
    Doctrine\ORM\EntityManager,
    Doctrine\DBAL\Logging\EchoSQLLogger,
    Doctrine\ODM\MongoDB\DocumentManager,
    Doctrine\ODM\MongoDB\Mongo,
    Doctrine\ODM\MongoDB\Configuration as MongoDBConfiguration,
    Doctrine\ODM\MongoDB\Mapping\Driver\AnnotationDriver;

class Doctrine {

    public $em = null;
    public $dm = null;

    public function __construct()
    {
        // load database configuration from CodeIgniter
        require_once APPPATH.'config/database.php';

        // Set up class loading. You could use different autoloaders, provided by your favorite framework,
        // if you want to.
        require_once APPPATH.'libraries/Doctrine/Common/ClassLoader.php';

        $doctrineClassLoader = new ClassLoader('Doctrine', APPPATH.'libraries');
        $doctrineClassLoader->register();
        $entitiesClassLoader = new ClassLoader('DW', APPPATH.'models');
        $entitiesClassLoader->register();
        $proxiesClassLoader = new ClassLoader('Proxies', APPPATH.'models/proxies');
        $proxiesClassLoader->register();

        // Set up caches
        $config = new Configuration;
        $cache = new ArrayCache;
        $config->setMetadataCacheImpl($cache);
        $config->setQueryCacheImpl($cache);

        // Mapping Configuration
        $driverImpl = $config->newDefaultAnnotationDriver("/<<PATH_TO_WEBSITE_CODE>>/system/application/models");
        $config->setMetadataDriverImpl($driverImpl);

        // Proxy configuration
        $config->setProxyDir('<<PATH_TO_PROXIES>>');
        $config->setProxyNamespace('Proxies');

        // Set up logger
    // commented out for now..
    //  $logger = new EchoSqlLogger;
    //  $config->setSqlLogger($logger);

        $config->setAutoGenerateProxyClasses( TRUE );

        // Database connection information
        $connectionOptions = array(
        'driver' => 'pdo_mysql',
        'user' =>     "<<DB_USERNAME>>",
        'password' => "<<DB_PASSWORD>>",
        'host' =>     "<<DB_HOST>>",
        'dbname' =>   "<<DB_NAME>>"
        );

        // Create EntityManager
        try { $this->em = EntityManager::create($connectionOptions, $config); } catch (Exception $e) { var_dump($e->getMessage()); }

        /**
        * MongoDB handler...
        */
        $configD = new MongoDBConfiguration();
        $configD->setProxyDir('<<PATH_TO_MONGODB_PROXIES>>');
        $configD->setProxyNamespace('Proxies');

        $readerD = new AnnotationReader();
        $readerD->setDefaultAnnotationNamespace('Doctrine\ODM\MongoDB\Mapping\\');
        $configD->setMetadataDriverImpl(new AnnotationDriver($readerD, APPPATH.'models/<<NAMESPACE>>'));

        try { $this->dm = DocumentManager::create(new Mongo("mongodb://<<MONGODB_SERVER>>"), $configD); } catch (Exception $e) { var_dump($e->getMessage()); }

    }

We then add methods to wrap around and make transparent which types of objects we are dealing with. Note that we just touch on some basic functionality such as find() and persist():

public function find($_entity, $_key) {
 $result = null;
 if (property_exists($_entity, '_docORM')) {
 try { $result = $this->dm->find($_entity, $_key); } catch (Exception $e) { var_dump($e->getMessage()); }
 } else {
 try { $result = $this->em->find($_entity, $_key); } catch (Exception $e) { var_dump($e->getMessage()); }
 }
 return $result;
 }

 public function findBy($_entity, $_keys = array()) {

 $result = null;
 if (property_exists($_entity, '_docORM')) {
 try { $results = $this->dm->getRepository($_entity)->findBy($_keys); } catch (Exception $e) { var_dump($e->getMessage()); }
 } else {
 try { $results = $this->em->getRepository($_entity)->findBy($_keys); } catch (Exception $e) { var_dump($e->getMessage()); }
 }
 return $results;
 }

 public function getRepository($_entity) {
 return $this->em->getRepository($_entity);
 }

 public function persist($obj) {
 if (property_exists($obj, '_docORM')) {
 try { $this->dm->persist($obj); } catch (Exception $e) { var_dump($e->getMessage()); }
 } else {
 try { $this->em->persist($obj); } catch (Exception $e) { var_dump($e->getMessage()); }
 }
 }

 public function flush() {
 $this->dm->flush();
 $this->em->flush();
 }

}

You may have noticed that we check to see if a property is set on our object: “_docORM”. This is the flag, a static value we set, in our class that tells use to use the MongoDB ODM calls instead of the Relation Database ORM calls.

Examples of class/Entity might look like this:

A MySQL based class:

<?php
namespace <<NAMESPACE>>;

/**
 * @Entity
 * @Table(name="<<TABLE_NAME>>")
 */
class Role {

 /**
 * @Id
 * @Column(type="integer")
 * @GeneratedValue
 */
 protected $id;

 /** @Column(length=50) */
 protected $name;

 /** @Column(length=255) */
 protected $description;

 /**
 * @ManyToMany(targetEntity="Permission")
 * @JoinTable(name="role_permissions",
 *            joinColumns={@JoinColumn(name="role_id", referencedColumnName="id")},
 *            inverseJoinColumns={@JoinColumn(name="permission_id", referencedColumnName="id")}
 *           )
 */
 protected $permissions = array();

 /**
 * @ManyToMany(targetEntity="Role")
 * @JoinTable(name="role_subrole",
 *            joinColumns={@JoinColumn(name="role_id", referencedColumnName="id")},
 *            inverseJoinColumns={@JoinColumn(name="subrole_id", referencedColumnName="id")}
 *           )
 */
 protected $subroles = array();

 // A way to check for recursive sub-roles
 public function hasSubRoles() {
 if(count($this->subroles) > 0) {
 return true;
 } else {
 return false;
 }
 }
}

A MongoDB based class:

<?php
namespace <<NAMEPSACE>>;

/**
 * @Document(db="<<MONOGO_DB>>", collection="<<MONGO_COLLECTION>>")
 */
class documentRecord {

 static $_docORM = true;

 /**
 * @Id
 */
 protected $id;

 /** @String */
 protected $name;

 /** @String */
 protected $description;
}

Notice too that we are using the docblock annotation to tell Doctrine about relationships and the database/document structure. No need to manage separate YAML or XML files.

Now, from within our CodeIgniter controller, we can transparently interact with database and document-based objects, like so:


function test() {

 $orm = $this->doctrine;
$r = $orm->find('<<NAMESPACE>>\Role', <<ROLE_ID>>);
var_dump($r);

$dr = $orm->find('<<NAMSPACE>>\DocumentRecord', <<DOC_ID>>);
var_dump($dr);

}

So, what do you think?

Notes from PHP-Tek 10 #Tekx

PHP-Tek 10 was organized by PHP Architect and Blue Parabola and held in Chicago, IL from May 18th – 21st this year. This was my first “PHP conference” and I was surprised with the breadth of related topics covered. The was allot of buzz in the air, but a few topics seemed to be very prominent, including the challenges of scalability, nosql and mongodb, hip-hop, application security,  frameworks, and code testing and releasing management .

Below are links to the slides (if the presenters posted them online) and blog and twitter info for each presenter. Some of the presentations I haven’t been able to find online, so if you have the links, send them my way!

Building a Zend Framework application (Rob Allen [Twitter / Blog])

  - Slides: http://akrabat.com/wp-content/uploads/TekX-ZF-Tutorial.pdf

Converting Your MySQL App to NoSQL with MongoDB (Kristina Chodorow [Twitter / Blog])

Bad Guy For a Day A Websecurity hands-on tutorial (Arne Blankerts [Twitter])

   - Slides: http://www.slideshare.net/TheSeer/bad-guy-for-a-day-a-websecurity-handson-tutorial

Javascript for PHP Developers (Ed Finkler [Twitter / Blog])

   - Slides: http://funkatron.com/content/JSforPHPdevs-tekx.pdf

PHP Best Practices (Matthew Weier O’Phinney [Twitter / Blog]) / (Lorna Jane Mitchell [Twitter / Blog])

   - Slides: http://www.slideshare.net/lornajane/best-practices-tekx

PHP Code Review (Sebastian Bergmann [Twitter / Blog]) / (Arne Blankerts [Twitter])

   - Slides: http://www.slideshare.net/sebastian_bergmann/php-code-review-4142719

The Lost Art of Simplicity (Josh Holmes [Twitter / Blog])

   - Slides: http://www.slideshare.net/joshholmes/the-lost-art-of-simplicity

Anti-spam and anti-gaming (Eli White [Twitter / Blog])

- Slides: http://eliw.com/presentations/tek-2010/tek-2010-antispamgame.pdf

Apache Cookbook (Rich Bowen [Twitter / Blog])

- Slides: http://www.slideshare.net/rbowen/apache-cookbook-tekx-chicago-2010

Working with Zend_Form (Rob Allen [Twitter / Blog])

   - Slides: http://akrabat.com/wp-content/uploads/TekX-Zend-Form.pdf

Advanced Date/Time handling with PHP (Derick Rethans [Twitter / Blog])

   - Slides: http://derickrethans.nl/talks/time-tek10.pdf

PHP Essentials (Beth Tucker [Twitter / Blog])

Graphs, Edges & Nodes: Untangling the Social Web (Joël Perras [Twitter / Blog])

   - Slides: http://www.slideshare.net/jperras/graphs-edges-nodes-untangling-the-social-web

Large Scale Systems (David Strauss [Twitter / Blog])

Subversion in a Distributed World (Lorna Jane Mitchell [Twitter / Blog])

   - Slides: http://www.slideshare.net/lornajane/subversion-in-a-distributed-world

Flex + Flickr = Fleckr? Part 1 (Keith Casey [Twitter / Blog])

PHP Looking Into the Future (Scott MacVicar [Twitter / Blog])

  - Slides: http://talks.macvicar.net/tekx-php-future.pdf

Getting Git (Travis Swicegood)

Flex + Flickr = Fleckr? Part 2 (Keith Casey [Twitter / Blog])

SQL Injection Myths and Fallacies (Bill Karwin [Blog])

   - Slides: http://www.slideshare.net/billkarwin/sql-injection-myths-and-fallacies

Code & Release Management (Eli White [Twitter / Blog])

- Slides: http://eliw.com/presentations/tek-2010/tek-2010-coderelease.pdf

Best and Worst Practices Building Rich Internet Applications RIAs (Josh Holmes [Twitter / Blog])

Domain NoSQL: Next Generation Play-Doh (Matthew Weier O’Phinney [Twitter / Blog])

Continuous Inspection and Integration of PHP Projects (Sebastian Bergmann [Twitter / Blog])

  - Slides: http://www.slideshare.net/sebastian_bergmann/continuous-integration-of-php-projects-4159699

Desktop Apps with PHP and Titanium (Ben Ramsey [Twitter / Blog])

   - Slides: http://www.slideshare.net/benramsey/desktop-apps-with-php-and-titanium

10 Developer Trends in 2010 (Matthew Schmidt)

A Web Application Framework for People who Hate Frameworks – Lithium (Nate Abele [Twitter / Blog]) / (Joël Perras [TwitterBlog]) /

- Slides: http://www.slideshare.net/jperras/tekx-a-framework-for-people-who-hate-frameworks-lithium

Introduction to Testing with Selenium (Arne Blankerts [Twitter])

  - Slides: http://www.slideshare.net/TheSeer/intro-toselenium

XDebug (Derick Rethans [Twitter / Blog])

   - Slides: http://derickrethans.nl/talks/xdebug-tek10.pdf

Agile in a waterfall world (Jason Sweat [Twitter / Blog])

   - Slides: http://blog.casey-sweat.us/talks/tekx_AgileWaterfall.pdf

MongoDB for Mobile Applications (Kristina Chodorow [Twitter / Blog])

New SPL Features in PHP 5.3 (Matthew Turland [Twitter / Blog])

   - Slides: http://www.slideshare.net/tobias382/new-spl-features-in-php-53

Streams, Sockets and Filters – Oh My (Elizabeth Marie Smith [Twitter / Blog])

  - Slides: http://elizabethmariesmith.com/slides/Streams,%20Sockets%20and%20Filters%20Oh%20My!.pdf
  - Slides (Notes): http://elizabethmariesmith.com/slides/Streams,%20Sockets%20and%20Filters%20Oh%20My!%20-%20notes.pdf

Measuring Your Code (Nate Abele [Twitter / Blog])

Put down the Superglobals! Secure PHP Development with Inspekt (Ed Finkler [Twitter / Blog])

Models for Hierarchical Data with SQL and PHP (Bill Karwin [Blog])

   - Slides: http://www.slideshare.net/billkarwin/models-for-hierarchical-data

The Art of Message Queues (Mike Willbanks)

Tips & Tricks to get the most of PHP with IIS, Windows, and the Windows Azure Cloud (Sumit Chawla) / (Kanwaljeet Singla)

  - Slides: http://www.slideshare.net/ksingla/how-to-get-the-most-with-windows-and-windows-azure

MySQL Scalability (Ligaya Turmelle [Twitter / Blog])

   - Slides: http://www.slideshare.net/ligaya/mysql-55

Building Real-Time Applications with XMPP (Travis Swicegood)

HipHop for PHP (Scott MacVicar [Twitter / Blog])

Caching with Memcached and APC (Ben Ramsey [Twitter / Blog])

   - Slides: http://www.slideshare.net/benramsey/caching-with-memcached-and-apc

Lean Mean PHP Machine (Jason Austin [Twitter / Blog])

  - Slides: http://www.slideshare.net/jfaustin/lean-mean-php-machine

PHP Inside (Derick Rethans [Twitter / Blog])

   - Slides: http://derickrethans.nl/talks/phpinside-tek10.pdf

Open Source Your Career (Lorna Jane Mitchell [Twitter / Blog])

Turning Numbers into Stories (Ryan Stewart [Blog])

Design Patterns (Jason Sweat [Twitter / Blog])

  - Slides: http://blog.casey-sweat.us/talks/tekx_patterns.pdf

Cross Platform PHP (Elizabeth Marie Smith [Twitter / Blog])

   - Slides: http://elizabethmariesmith.com/slides/Cross%20Platform%20PHP.pdf

Replication with MySQL (Ligaya Turmelle [Twitter / Blog])

   - Slides: http://www.slideshare.net/ligaya/mysql-51-replication

TEK-X on the horizon.

The PHP|Tek Conference is a little over a week away, and I’m excited about the opportunity to attend.  I’m also a little bummed that I’ll miss out on the Tutorial Day — specifically the session on “Converting Your MySQL App to NoSQL with MongoDB“. Can someone take notes for me? ;o)

Here are some of the sessions I’m looking forward to:

I’ll also be posting thoughts on Twitter under the #tekx hashtag. Hope to see you there!

“Geeking On”: How to speed-up your career transition.

Paul Merrill from “How To Geek On” shares tips, advice, and offers services to those who have been laid-off or looking to make a career transition:

  • We prepare you for a focused and efficient transition
  • Identify your skills, goals, and realities
  • Learn how to target companies and network into them
  • Learn how to get your Resume to the top of the stack
  • Mock Interview and Critique

Make sure to sign-up for the free newsletter, and if you are in the area, attend a “Coffee and Helping Each Other Out” session.

Photos from the 2007 Capital City Bike Fest in Raleigh, NC

Here are some interesting photos I took at the 2007 Capital City Bike Fest. I was out of town on business for the 2008 celebrations but hope to make it back for 2009!

For more information on this years festitivities check out the Capital City Bike Fest website – Sponsored by the great folks at Ray Price Harley Davidson here in Raleigh, NC.

Photos from the 2008 AMA Big Kahuna at Virgina International Speedway

As my first post to the photography section of my blog I thought I would share some of the photos I took last August up at the Virginia International Raceway for the 2008 AMA Big Kahuna.

The entire slide show can be found here. You might also be interested in the CCS Race I shot earlier that year as well.