SlideShare una empresa de Scribd logo
1 de 148
Don't Make Me Read
Your Mind
Aaron Kuzemchak
CICONF 2012 - San Francisco, CA
Goal
๏   To suggest best practices and tools to make your code
    easier and more enjoyable for future developers to
    understand.
About Me
Sr. Application Developer
at Visual Chefs
I'm from Richmond, VA
I have an awesome family
Former full-time
front-end developer
I ♥ PHP
I build...
๏   Websites with ExpressionEngine
๏   Web applications with CodeIgniter & Laravel
My info
๏   http://kuzemchak.net/
๏   https://github.com/akuzemchak
๏   @akuzemchak
About Visual Chefs
Also known as "eecoder"
Also from Richmond, VA
We rock ExpressionEngine
We also rock CodeIgniter
Our info
๏   http://www.visualchefs.com/
๏   http://eecoder.com/
๏   @eecoder
Overview
1.Writing documentation
2.Organization & planning
3.Tools to help
"Documentation! I'm so
excited!" you all say
It's important if anyone else
will ever look at your code
And it can always be done
better
And if you don't do it...
Bad things
await you
Trust me, you want to
document
Nothing revolutionary
KYA:
Keep You Accountable
KYA:
Kick Your Ass
Documentation
That's documentation in
your code, not end-user
Everything you write should
be documented
I can't read your mind
Aha! That's where the presentation title comes from!
You and I don't see things
the same way
Don't assume I'm good
enough to learn from your
code
Don't assume your code
is good enough to teach
Document first
Use your comments to
guide you
//   ------------------------------------------------------------
//   User Login
//   ------------------------------------------------------------
 
//   If the credentials were correct, login and redirect to dashboard
 
//   Otherwise, redirect to the login form with errors
// ------------------------------------------------------------
// User Login
// ------------------------------------------------------------
 
// If the credentials were correct, login and redirect to dashboard
if($this->auth->login($email, $password) === TRUE)
{
    redirect('account/dashboard');
}
// Otherwise, redirect to the login form with errors
else
{
    $this->session->set_userdata('errors', $this->auth->errors);
    redirect('login');
}
Comment major control
structures
๏   Classes
    ๏   Properties
    ๏   Methods
๏   Functions
๏   Most conditionals
๏   Most loops
Tag your comments
//   @TODO:    Handle failed API requests better
//   @NOTE:    Passing by reference is necessary here
//   @HACK:    Fixed minor bug in query builder
//   @SEE:     http://tinyurl.com/2g9mqh
//   @BLAME:   Alex royally screwed this up
Write good docblocks
/**
 * login
 */
public function login($email, $password)
{
    // @TODO
}
NO!
/**
 * login
 */
public function login($email, $password)
{
    // @TODO
}
Good docblocks tell you:
๏   What it is
๏   What it does
๏   What it accepts
๏   What it returns
Enables code hinting in
some IDEs
Allows easy
documentation generation
Classes should describe
author and meta info
/**
 * User account model
 *
 * @author     Aaron Kuzemchak
 * @copyright  2012 Aaron Kuzemchak
 * @link       http://kuzemchak.net/
 * @package     CodeIgniter
 * @subpackage  Models
 */
class User_model extends CI_Model
{
    // @TODO
}
Methods should have more
functional info
/**
 * Hashes an array of settings for easy storage in a database
 *
 * @param   array   $data
 * @return  string
 */
public static function hash_settings($data)
{
    return base64_encode(serialize($data));
}
Properties should briefly
describe the purpose and
type
/**
 * The user's email address
 *
 * @var  string
 */
public $email;
Put example usage in the
docblock
/**
 * Hashes an array of settings for easy storage in a database
 *
 * <code>
 *     $settings = MyClass::hash_settings($data_array);
 * </code>
 *
 * @param   array   $data
 * @return  string
 */
public static function hash_settings($data)
{
    return base64_encode(serialize($data));
}
Use type hinting with your
arguments
/**
 * Hashes an array of settings for easy storage in a database
 *
 * <code>
 *     $settings = MyClass::hash_settings($data_array);
 * </code>
 *
 * @param   array   $data
 * @return  string
 */
public static function hash_settings(array $data)
{
    return base64_encode(serialize($data));
}
Don't be afraid to be
verbose
// At this point we need to send an email to the user to confirm
// their purchase. Since it's an HTML email, we've stored it in a
// view, and can pass the necessary data to it.
$email = $this->load->view('emails/receipt', $data, TRUE);
Reference ticket numbers,
user stories, etc.
Because most customer
"logic" doesn't make sense
//   At this point we send an email reminder to the customer, informing them
//   that their subscription will expire soon.
 
//   However, don't send an email if today is a Monday or Thursday, because
//   the client's "really tech-saavy" cousin told them that people don't
//   read their email on those days.
 
//   @SEE: Ticket #138 - http://projects.visualchefs.com/tickets/138
Functions should have
descriptive names
And, they shouldn't try to do
too much
/**
 * Get the number of comments for a user
 *
 * @param   int  $user_id
 * @return  int
 */
public function comment_count($user_id)
{
    // @TODO
}
 
/**
 * Get a user's comments
 *
 * @param   int    $user_id
 * @param   int    $limit
 * @return  array
 */
public function comments($user_id, $limit = 100)
{
    // @TODO
}
/**
 * Get a user's comments, or just a count of their comments.
 *
 * @param   int        $user_id
 * @param   int        $limit
 * @param   bool       $count_only
 * @return  int|array
 */
public function comments($user_id, $limit = 100, $count_only = FALSE)
{
    // @NOTE: It's difficult to tell what the function does by its name
    // @NOTE: It also does too many things
    // @NOTE: I can't remember what the parameters are
}
/**




  meh...
 * Get a user's comments, or just a count of their comments.
 *
 * @param   int        $user_id
 * @param   int        $limit
 * @param   bool       $count_only
 * @return  int|array
 */
public function comments($user_id, $limit = 100, $count_only = FALSE)
{
    // @NOTE: It's difficult to tell what the function does by its name
    // @NOTE: It also does too many things
    // @NOTE: I can't remember what the parameters are
}
CodeIgniter's query builder
is a great example
$results = $this->db->select('id, email')
    ->where('plan_id', 1)
    ->order_by('id', 'ASC')
    ->limit(10)
    ->get('users');
Reference docs for third-
party tools
// Set the value in Redis if it doesn't already exist
// @SEE: http://redis.io/commands/setnx
Summary
๏   Documentation is easier when done first
๏   Give as much insight as you can
๏   Write those friggin' docblocks!
๏   Be verbose
๏   Link to external docs when possible
Organization
MVC has made this easier
Have a plan
Write a technical or
behavioral document
Sample
1. User fills out the registration form

2. User clicks submit

3. Form is submitted via Ajax

   1. Form data is validated

       1. If valid, account is created

   2. JSON response is returned with success flag, and array of errors if invalid data

4. If successful, user is redirected to the dashboard

   1. If not successful, list of errors are shown
Helps others get a visual
description of what's
happening
Simplicity is always
appreciated
Don't over-engineer things
Keep a README file
You're probably already
doing this if you use Github
or Bitbucket
List technical requirements &
setup instructions
REQUIREMENTS
============

* PHP 5.3+
    * curl
    * mcrypt
    * pdo_mysql
    * mongo PECL extension
* MySQL 5.4+
* MongoDB
* Redis
SETUP INSTRUCTIONS
==================

1. Create a MySQL database.
2. Update settings in local database config
   file.
3. Run database migrations from the command
   line.
Point out non-obvious
changes/tweaks/hacks
APPLICATION NOTES
=================

* Default timezone is set in index.php so that
  I don't have to rely on CI's odd
  localization system.
Note third-party tools you
are using
THIRD-PARTY TOOLS
=================

* dompdf - http://code.google.com/p/dompdf
Use a style guide
Makes it easier to get new
devs acquainted
CodeIgniter's is a great
starting point
PSR-1 isn't bad either
Unless you despise camelCase
Use the third_party folder
Prevents needing to
separate related configs,
libraries, models, etc.
third_party
    auth
         config
             auth.php
         libraries
             auth.php
         models
             user_model.php
$this->load->add_package_path(APPPATH.'third_party/auth');
$this->load->library('auth');
$this->load->model('user_model');
Manage CodeIgniter
packages with Sparks
Similar benefits to using the
third_party folder
Manage other dependencies
with Composer
Useful for any PHP project!
Write tests
Yes, unit tests
But, how about browser-
scripted tests as well?
You can watch interactions,
and make sure you're not
breaking stuff
Keep them updated when
things change!
Summary
๏   Have a plan
๏   Simplicity
๏   Keep a README file
๏   Use a style guide
๏   Keep packages organized with tools like Sparks and
    Composer
๏   Write tests
Tools
Sparks
Makes managing
CodeIgniter packages super
easy
cd project-root
php -r "$(curl -fsSL http://getsparks.org/go-sparks)"
php tools/spark install ion_auth
$this->load->spark('ion_auth/2.3.2');

if( ! $this->ion_auth->logged_in())
{
    redirect('login');
}
It's been around a while, so
use if it you don't already
Composer
Awesome new dependency
manager
For any PHP project
It's not PEAR!
Packages are installed on a
per-project basis
cd project-root
curl -s https://getcomposer.org/installer | php
A simple JSON file controls
your packages
{
    "require": {
        "nategood/httpful": ">=1.0"
    }
}
# the first time you run
php composer.phar install

# all other times
php composer.phar update
One autoloader to rule
them all!
// Put this in index.php
require 'vendor/autoload.php';
 
// Call a class and it will be loaded automatically
$response = HttpfulRequest::get('http://eecoder.com/')->send();
Browse packages at
packagist.org
ApiGen
Generate documentation
from your docblocks
Organized by namespaces
and package/subpackage
Beautiful full highlighted
source browsing
Beautiful default theme (and
you can make your own)
Easy to install, easy to run
# download apigen to your project root (or wherever)
php apigen/apigen.php -s source-folder -d destination-folder

# watch the pretty progress bar!
Quick demo
Selenium IDE
Record tests in your
browser (with Firefox)
Not the most elegant UI
All the normal assertion
goodies of any other testing
framework
Save and distribute test
suites
Click record and start testing
Thanks, that's all I've got!
๏   http://kuzemchak.net/
๏   https://github.com/akuzemchak
๏   @akuzemchak

Más contenido relacionado

La actualidad más candente

Java script Session No 1
Java script Session No 1Java script Session No 1
Java script Session No 1Saif Ullah Dar
 
Eugene Andruszczenko: jQuery
Eugene Andruszczenko: jQueryEugene Andruszczenko: jQuery
Eugene Andruszczenko: jQueryRefresh Events
 
Introduction to Using PHP & MVC Frameworks
Introduction to Using PHP & MVC FrameworksIntroduction to Using PHP & MVC Frameworks
Introduction to Using PHP & MVC FrameworksGerald Krishnan
 
JavaScript: DOM and jQuery
JavaScript: DOM and jQueryJavaScript: DOM and jQuery
JavaScript: DOM and jQuery維佋 唐
 
plumbing for the next web
plumbing for the next webplumbing for the next web
plumbing for the next webIan Forrester
 
API Documentation -- Presentation to East Bay STC Chapter
API Documentation -- Presentation to East Bay STC ChapterAPI Documentation -- Presentation to East Bay STC Chapter
API Documentation -- Presentation to East Bay STC ChapterTom Johnson
 
OSDC 2009 Rails Turtorial
OSDC 2009 Rails TurtorialOSDC 2009 Rails Turtorial
OSDC 2009 Rails TurtorialYi-Ting Cheng
 
Beyond MVC: from Model to Domain
Beyond MVC: from Model to DomainBeyond MVC: from Model to Domain
Beyond MVC: from Model to DomainJeremy Cook
 
PHPSpec & Behat: Two Testing Tools That Write Code For You (#phptek edition)
PHPSpec & Behat: Two Testing Tools That Write Code For You (#phptek edition)PHPSpec & Behat: Two Testing Tools That Write Code For You (#phptek edition)
PHPSpec & Behat: Two Testing Tools That Write Code For You (#phptek edition)Joshua Warren
 
Javascript 2009
Javascript 2009Javascript 2009
Javascript 2009borkweb
 

La actualidad más candente (18)

Java script Session No 1
Java script Session No 1Java script Session No 1
Java script Session No 1
 
Eugene Andruszczenko: jQuery
Eugene Andruszczenko: jQueryEugene Andruszczenko: jQuery
Eugene Andruszczenko: jQuery
 
Introduction to Using PHP & MVC Frameworks
Introduction to Using PHP & MVC FrameworksIntroduction to Using PHP & MVC Frameworks
Introduction to Using PHP & MVC Frameworks
 
Ant User Guide
Ant User GuideAnt User Guide
Ant User Guide
 
JavaScript: DOM and jQuery
JavaScript: DOM and jQueryJavaScript: DOM and jQuery
JavaScript: DOM and jQuery
 
Java script
Java scriptJava script
Java script
 
plumbing for the next web
plumbing for the next webplumbing for the next web
plumbing for the next web
 
API Documentation -- Presentation to East Bay STC Chapter
API Documentation -- Presentation to East Bay STC ChapterAPI Documentation -- Presentation to East Bay STC Chapter
API Documentation -- Presentation to East Bay STC Chapter
 
Rich faces
Rich facesRich faces
Rich faces
 
JSP Custom Tags
JSP Custom TagsJSP Custom Tags
JSP Custom Tags
 
OSDC 2009 Rails Turtorial
OSDC 2009 Rails TurtorialOSDC 2009 Rails Turtorial
OSDC 2009 Rails Turtorial
 
SlideShare Instant
SlideShare InstantSlideShare Instant
SlideShare Instant
 
SlideShare Instant
SlideShare InstantSlideShare Instant
SlideShare Instant
 
Beyond MVC: from Model to Domain
Beyond MVC: from Model to DomainBeyond MVC: from Model to Domain
Beyond MVC: from Model to Domain
 
PHPSpec & Behat: Two Testing Tools That Write Code For You (#phptek edition)
PHPSpec & Behat: Two Testing Tools That Write Code For You (#phptek edition)PHPSpec & Behat: Two Testing Tools That Write Code For You (#phptek edition)
PHPSpec & Behat: Two Testing Tools That Write Code For You (#phptek edition)
 
Css, xhtml, javascript
Css, xhtml, javascriptCss, xhtml, javascript
Css, xhtml, javascript
 
Jsp
JspJsp
Jsp
 
Javascript 2009
Javascript 2009Javascript 2009
Javascript 2009
 

Destacado

092812 david addington article (esperanto)
092812   david addington article (esperanto)092812   david addington article (esperanto)
092812 david addington article (esperanto)VogelDenise
 
072712 usa ku klux klan runned government - estonian
072712 usa ku klux klan runned government - estonian072712 usa ku klux klan runned government - estonian
072712 usa ku klux klan runned government - estonianVogelDenise
 
CHINESE (Simplified) hillary clinton stingers
CHINESE (Simplified)   hillary clinton stingersCHINESE (Simplified)   hillary clinton stingers
CHINESE (Simplified) hillary clinton stingersVogelDenise
 
Korean thank you to republic of ecuador (asylum of julian assange)
Korean   thank you to  republic of ecuador (asylum of julian assange)Korean   thank you to  republic of ecuador (asylum of julian assange)
Korean thank you to republic of ecuador (asylum of julian assange)VogelDenise
 
Russian thank you to republic of ecuador (asylum of julian assange)
Russian   thank you to  republic of ecuador (asylum of julian assange)Russian   thank you to  republic of ecuador (asylum of julian assange)
Russian thank you to republic of ecuador (asylum of julian assange)VogelDenise
 
Latvian thank you to republic of ecuador (asylum of julian assange)
Latvian   thank you to  republic of ecuador (asylum of julian assange)Latvian   thank you to  republic of ecuador (asylum of julian assange)
Latvian thank you to republic of ecuador (asylum of julian assange)VogelDenise
 
Pdiva 2012 1 balotario pc1
Pdiva 2012 1 balotario pc1Pdiva 2012 1 balotario pc1
Pdiva 2012 1 balotario pc1c09271
 
Norwegian thank you to republic of ecuador (asylum of julian assange)
Norwegian   thank you to  republic of ecuador (asylum of julian assange)Norwegian   thank you to  republic of ecuador (asylum of julian assange)
Norwegian thank you to republic of ecuador (asylum of julian assange)VogelDenise
 
092812 david addington article (latvian)
092812   david addington article (latvian)092812   david addington article (latvian)
092812 david addington article (latvian)VogelDenise
 
071310 obama email (japanese)
071310   obama email (japanese)071310   obama email (japanese)
071310 obama email (japanese)VogelDenise
 
071310 obama email (arabic)
071310   obama email (arabic)071310   obama email (arabic)
071310 obama email (arabic)VogelDenise
 
071310 obama email (maltese)
071310   obama email (maltese)071310   obama email (maltese)
071310 obama email (maltese)VogelDenise
 
021013 adecco email (hebrew)
021013   adecco email (hebrew)021013   adecco email (hebrew)
021013 adecco email (hebrew)VogelDenise
 
071310 obama email (esperanto)
071310   obama email (esperanto)071310   obama email (esperanto)
071310 obama email (esperanto)VogelDenise
 
092812 david addington article (swedish)
092812   david addington article (swedish)092812   david addington article (swedish)
092812 david addington article (swedish)VogelDenise
 
071310 obama email (lithuanian)
071310   obama email (lithuanian)071310   obama email (lithuanian)
071310 obama email (lithuanian)VogelDenise
 
Nuremberg crimes against humanity-peace (galician)
Nuremberg   crimes against humanity-peace (galician)Nuremberg   crimes against humanity-peace (galician)
Nuremberg crimes against humanity-peace (galician)VogelDenise
 
AMERICA'S BLACK WALL STREET - How The Ku Klux Klan Went About TERRORIZING & D...
AMERICA'S BLACK WALL STREET - How The Ku Klux Klan Went About TERRORIZING & D...AMERICA'S BLACK WALL STREET - How The Ku Klux Klan Went About TERRORIZING & D...
AMERICA'S BLACK WALL STREET - How The Ku Klux Klan Went About TERRORIZING & D...VogelDenise
 
Nuremberg crimes against humanity-peace (turkish)
Nuremberg   crimes against humanity-peace (turkish)Nuremberg   crimes against humanity-peace (turkish)
Nuremberg crimes against humanity-peace (turkish)VogelDenise
 

Destacado (20)

092812 david addington article (esperanto)
092812   david addington article (esperanto)092812   david addington article (esperanto)
092812 david addington article (esperanto)
 
072712 usa ku klux klan runned government - estonian
072712 usa ku klux klan runned government - estonian072712 usa ku klux klan runned government - estonian
072712 usa ku klux klan runned government - estonian
 
CHINESE (Simplified) hillary clinton stingers
CHINESE (Simplified)   hillary clinton stingersCHINESE (Simplified)   hillary clinton stingers
CHINESE (Simplified) hillary clinton stingers
 
Korean thank you to republic of ecuador (asylum of julian assange)
Korean   thank you to  republic of ecuador (asylum of julian assange)Korean   thank you to  republic of ecuador (asylum of julian assange)
Korean thank you to republic of ecuador (asylum of julian assange)
 
Russian thank you to republic of ecuador (asylum of julian assange)
Russian   thank you to  republic of ecuador (asylum of julian assange)Russian   thank you to  republic of ecuador (asylum of julian assange)
Russian thank you to republic of ecuador (asylum of julian assange)
 
Latvian thank you to republic of ecuador (asylum of julian assange)
Latvian   thank you to  republic of ecuador (asylum of julian assange)Latvian   thank you to  republic of ecuador (asylum of julian assange)
Latvian thank you to republic of ecuador (asylum of julian assange)
 
Pdiva 2012 1 balotario pc1
Pdiva 2012 1 balotario pc1Pdiva 2012 1 balotario pc1
Pdiva 2012 1 balotario pc1
 
Norwegian thank you to republic of ecuador (asylum of julian assange)
Norwegian   thank you to  republic of ecuador (asylum of julian assange)Norwegian   thank you to  republic of ecuador (asylum of julian assange)
Norwegian thank you to republic of ecuador (asylum of julian assange)
 
092812 david addington article (latvian)
092812   david addington article (latvian)092812   david addington article (latvian)
092812 david addington article (latvian)
 
071310 obama email (japanese)
071310   obama email (japanese)071310   obama email (japanese)
071310 obama email (japanese)
 
071310 obama email (arabic)
071310   obama email (arabic)071310   obama email (arabic)
071310 obama email (arabic)
 
071310 obama email (maltese)
071310   obama email (maltese)071310   obama email (maltese)
071310 obama email (maltese)
 
021013 adecco email (hebrew)
021013   adecco email (hebrew)021013   adecco email (hebrew)
021013 adecco email (hebrew)
 
071310 obama email (esperanto)
071310   obama email (esperanto)071310   obama email (esperanto)
071310 obama email (esperanto)
 
092812 david addington article (swedish)
092812   david addington article (swedish)092812   david addington article (swedish)
092812 david addington article (swedish)
 
071310 obama email (lithuanian)
071310   obama email (lithuanian)071310   obama email (lithuanian)
071310 obama email (lithuanian)
 
Nuremberg crimes against humanity-peace (galician)
Nuremberg   crimes against humanity-peace (galician)Nuremberg   crimes against humanity-peace (galician)
Nuremberg crimes against humanity-peace (galician)
 
Winx Club
Winx Club Winx Club
Winx Club
 
AMERICA'S BLACK WALL STREET - How The Ku Klux Klan Went About TERRORIZING & D...
AMERICA'S BLACK WALL STREET - How The Ku Klux Klan Went About TERRORIZING & D...AMERICA'S BLACK WALL STREET - How The Ku Klux Klan Went About TERRORIZING & D...
AMERICA'S BLACK WALL STREET - How The Ku Klux Klan Went About TERRORIZING & D...
 
Nuremberg crimes against humanity-peace (turkish)
Nuremberg   crimes against humanity-peace (turkish)Nuremberg   crimes against humanity-peace (turkish)
Nuremberg crimes against humanity-peace (turkish)
 

Similar a CICONF 2012 - Don't Make Me Read Your Mind

Create a web-app with Cgi Appplication
Create a web-app with Cgi AppplicationCreate a web-app with Cgi Appplication
Create a web-app with Cgi Appplicationolegmmiller
 
Joomla! Day Chicago 2011 Presentation - Steven Pignataro
Joomla! Day Chicago 2011 Presentation - Steven PignataroJoomla! Day Chicago 2011 Presentation - Steven Pignataro
Joomla! Day Chicago 2011 Presentation - Steven PignataroSteven Pignataro
 
Intro To Mvc Development In Php
Intro To Mvc Development In PhpIntro To Mvc Development In Php
Intro To Mvc Development In Phpfunkatron
 
Website Security
Website SecurityWebsite Security
Website SecurityCarlos Z
 
Website Security
Website SecurityWebsite Security
Website SecurityMODxpo
 
Zend - Installation And Sample Project Creation
Zend - Installation And Sample Project Creation Zend - Installation And Sample Project Creation
Zend - Installation And Sample Project Creation Compare Infobase Limited
 
Clean Code: Stop wasting my time
Clean Code: Stop wasting my timeClean Code: Stop wasting my time
Clean Code: Stop wasting my timeEdorian
 
Laravel 8 export data as excel file with example
Laravel 8 export data as excel file with exampleLaravel 8 export data as excel file with example
Laravel 8 export data as excel file with exampleKaty Slemon
 
Exploring Symfony's Code
Exploring Symfony's CodeExploring Symfony's Code
Exploring Symfony's CodeWildan Maulana
 
Introduction To Code Igniter
Introduction To Code IgniterIntroduction To Code Igniter
Introduction To Code IgniterAmzad Hossain
 
Best Practices For Drupal Developers By Mir Nazim @ Drupal Camp India 2008
Best Practices For Drupal Developers By Mir Nazim @ Drupal Camp India 2008Best Practices For Drupal Developers By Mir Nazim @ Drupal Camp India 2008
Best Practices For Drupal Developers By Mir Nazim @ Drupal Camp India 2008Mir Nazim
 
Building Your First App with MongoDB Stitch
Building Your First App with MongoDB StitchBuilding Your First App with MongoDB Stitch
Building Your First App with MongoDB StitchMongoDB
 
Catalyst - refactor large apps with it and have fun!
Catalyst - refactor large apps with it and have fun!Catalyst - refactor large apps with it and have fun!
Catalyst - refactor large apps with it and have fun!mold
 
API Workshop: Deep dive into REST APIs
API Workshop: Deep dive into REST APIsAPI Workshop: Deep dive into REST APIs
API Workshop: Deep dive into REST APIsTom Johnson
 
Joomla security nuggets
Joomla security nuggetsJoomla security nuggets
Joomla security nuggetsguestbd1cdca
 
Survival Strategies for API Documentation: Presentation to Southwestern Ontar...
Survival Strategies for API Documentation: Presentation to Southwestern Ontar...Survival Strategies for API Documentation: Presentation to Southwestern Ontar...
Survival Strategies for API Documentation: Presentation to Southwestern Ontar...Tom Johnson
 
CQRS / ES & DDD Demystified
CQRS / ES & DDD DemystifiedCQRS / ES & DDD Demystified
CQRS / ES & DDD DemystifiedVic Metcalfe
 
5 Reasons To Love CodeIgniter
5 Reasons To Love CodeIgniter5 Reasons To Love CodeIgniter
5 Reasons To Love CodeIgniternicdev
 

Similar a CICONF 2012 - Don't Make Me Read Your Mind (20)

Create a web-app with Cgi Appplication
Create a web-app with Cgi AppplicationCreate a web-app with Cgi Appplication
Create a web-app with Cgi Appplication
 
Joomla! Day Chicago 2011 Presentation - Steven Pignataro
Joomla! Day Chicago 2011 Presentation - Steven PignataroJoomla! Day Chicago 2011 Presentation - Steven Pignataro
Joomla! Day Chicago 2011 Presentation - Steven Pignataro
 
Intro To Mvc Development In Php
Intro To Mvc Development In PhpIntro To Mvc Development In Php
Intro To Mvc Development In Php
 
Cqrs api v2
Cqrs api v2Cqrs api v2
Cqrs api v2
 
Website Security
Website SecurityWebsite Security
Website Security
 
Website Security
Website SecurityWebsite Security
Website Security
 
Zend - Installation And Sample Project Creation
Zend - Installation And Sample Project Creation Zend - Installation And Sample Project Creation
Zend - Installation And Sample Project Creation
 
Clean Code: Stop wasting my time
Clean Code: Stop wasting my timeClean Code: Stop wasting my time
Clean Code: Stop wasting my time
 
Laravel 8 export data as excel file with example
Laravel 8 export data as excel file with exampleLaravel 8 export data as excel file with example
Laravel 8 export data as excel file with example
 
Exploring Symfony's Code
Exploring Symfony's CodeExploring Symfony's Code
Exploring Symfony's Code
 
Introduction To Code Igniter
Introduction To Code IgniterIntroduction To Code Igniter
Introduction To Code Igniter
 
Best Practices For Drupal Developers By Mir Nazim @ Drupal Camp India 2008
Best Practices For Drupal Developers By Mir Nazim @ Drupal Camp India 2008Best Practices For Drupal Developers By Mir Nazim @ Drupal Camp India 2008
Best Practices For Drupal Developers By Mir Nazim @ Drupal Camp India 2008
 
Building Your First App with MongoDB Stitch
Building Your First App with MongoDB StitchBuilding Your First App with MongoDB Stitch
Building Your First App with MongoDB Stitch
 
Catalyst - refactor large apps with it and have fun!
Catalyst - refactor large apps with it and have fun!Catalyst - refactor large apps with it and have fun!
Catalyst - refactor large apps with it and have fun!
 
API Workshop: Deep dive into REST APIs
API Workshop: Deep dive into REST APIsAPI Workshop: Deep dive into REST APIs
API Workshop: Deep dive into REST APIs
 
flask.pptx
flask.pptxflask.pptx
flask.pptx
 
Joomla security nuggets
Joomla security nuggetsJoomla security nuggets
Joomla security nuggets
 
Survival Strategies for API Documentation: Presentation to Southwestern Ontar...
Survival Strategies for API Documentation: Presentation to Southwestern Ontar...Survival Strategies for API Documentation: Presentation to Southwestern Ontar...
Survival Strategies for API Documentation: Presentation to Southwestern Ontar...
 
CQRS / ES & DDD Demystified
CQRS / ES & DDD DemystifiedCQRS / ES & DDD Demystified
CQRS / ES & DDD Demystified
 
5 Reasons To Love CodeIgniter
5 Reasons To Love CodeIgniter5 Reasons To Love CodeIgniter
5 Reasons To Love CodeIgniter
 

Más de ciconf

Chef + AWS + CodeIgniter
Chef + AWS + CodeIgniterChef + AWS + CodeIgniter
Chef + AWS + CodeIgniterciconf
 
Work Queues
Work QueuesWork Queues
Work Queuesciconf
 
Pretty Good Practices/Productivity
Pretty Good Practices/ProductivityPretty Good Practices/Productivity
Pretty Good Practices/Productivityciconf
 
Who Needs Ruby When You've Got CodeIgniter
Who Needs Ruby When You've Got CodeIgniterWho Needs Ruby When You've Got CodeIgniter
Who Needs Ruby When You've Got CodeIgniterciconf
 
Hosting as a Framework
Hosting as a FrameworkHosting as a Framework
Hosting as a Frameworkciconf
 
Zero to Hero in Start-ups
Zero to Hero in Start-upsZero to Hero in Start-ups
Zero to Hero in Start-upsciconf
 
How to use ORM
How to use ORMHow to use ORM
How to use ORMciconf
 

Más de ciconf (7)

Chef + AWS + CodeIgniter
Chef + AWS + CodeIgniterChef + AWS + CodeIgniter
Chef + AWS + CodeIgniter
 
Work Queues
Work QueuesWork Queues
Work Queues
 
Pretty Good Practices/Productivity
Pretty Good Practices/ProductivityPretty Good Practices/Productivity
Pretty Good Practices/Productivity
 
Who Needs Ruby When You've Got CodeIgniter
Who Needs Ruby When You've Got CodeIgniterWho Needs Ruby When You've Got CodeIgniter
Who Needs Ruby When You've Got CodeIgniter
 
Hosting as a Framework
Hosting as a FrameworkHosting as a Framework
Hosting as a Framework
 
Zero to Hero in Start-ups
Zero to Hero in Start-upsZero to Hero in Start-ups
Zero to Hero in Start-ups
 
How to use ORM
How to use ORMHow to use ORM
How to use ORM
 

Último

TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law DevelopmentsTrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law DevelopmentsTrustArc
 
Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024The Digital Insurer
 
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptxHampshireHUG
 
Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)wesley chun
 
Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...Enterprise Knowledge
 
Understanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdfUnderstanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdfUK Journal
 
🐬 The future of MySQL is Postgres 🐘
🐬  The future of MySQL is Postgres   🐘🐬  The future of MySQL is Postgres   🐘
🐬 The future of MySQL is Postgres 🐘RTylerCroy
 
[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdfhans926745
 
Data Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonData Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonAnna Loughnan Colquhoun
 
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Drew Madelung
 
GenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationGenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationMichael W. Hawkins
 
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdfThe Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdfEnterprise Knowledge
 
Artificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsArtificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsJoaquim Jorge
 
Boost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityBoost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityPrincipled Technologies
 
The Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptxThe Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptxMalak Abu Hammad
 
Boost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfBoost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfsudhanshuwaghmare1
 
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationFrom Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationSafe Software
 
Real Time Object Detection Using Open CV
Real Time Object Detection Using Open CVReal Time Object Detection Using Open CV
Real Time Object Detection Using Open CVKhem
 
Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024The Digital Insurer
 
Factors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptxFactors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptxKatpro Technologies
 

Último (20)

TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law DevelopmentsTrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
 
Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024
 
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
 
Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)
 
Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...
 
Understanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdfUnderstanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdf
 
🐬 The future of MySQL is Postgres 🐘
🐬  The future of MySQL is Postgres   🐘🐬  The future of MySQL is Postgres   🐘
🐬 The future of MySQL is Postgres 🐘
 
[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf
 
Data Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonData Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt Robison
 
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
 
GenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationGenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day Presentation
 
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdfThe Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
 
Artificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsArtificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and Myths
 
Boost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityBoost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivity
 
The Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptxThe Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptx
 
Boost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfBoost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdf
 
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationFrom Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
 
Real Time Object Detection Using Open CV
Real Time Object Detection Using Open CVReal Time Object Detection Using Open CV
Real Time Object Detection Using Open CV
 
Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024
 
Factors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptxFactors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptx
 

CICONF 2012 - Don't Make Me Read Your Mind

Notas del editor

  1. \n
  2. \n
  3. \n
  4. \n
  5. \n
  6. \n
  7. \n
  8. \n
  9. \n
  10. \n
  11. \n
  12. \n
  13. \n
  14. \n
  15. \n
  16. \n
  17. \n
  18. \n
  19. \n
  20. \n
  21. \n
  22. \n
  23. \n
  24. \n
  25. \n
  26. \n
  27. \n
  28. \n
  29. \n
  30. \n
  31. \n
  32. \n
  33. \n
  34. \n
  35. \n
  36. \n
  37. \n
  38. \n
  39. \n
  40. \n
  41. \n
  42. \n
  43. \n
  44. \n
  45. \n
  46. \n
  47. \n
  48. \n
  49. \n
  50. \n
  51. \n
  52. \n
  53. \n
  54. \n
  55. \n
  56. \n
  57. \n
  58. \n
  59. \n
  60. \n
  61. \n
  62. \n
  63. \n
  64. \n
  65. \n
  66. \n
  67. \n
  68. \n
  69. \n
  70. \n
  71. \n
  72. \n
  73. \n
  74. \n
  75. \n
  76. \n
  77. \n
  78. \n
  79. \n
  80. \n
  81. \n
  82. \n
  83. \n
  84. \n
  85. \n
  86. \n
  87. \n
  88. \n
  89. \n
  90. \n
  91. \n
  92. \n
  93. \n
  94. \n
  95. \n
  96. \n
  97. \n
  98. \n
  99. \n
  100. \n
  101. \n
  102. \n
  103. \n
  104. \n
  105. \n
  106. \n
  107. \n
  108. \n
  109. \n
  110. \n
  111. \n
  112. \n
  113. \n
  114. \n
  115. \n
  116. \n
  117. \n
  118. \n
  119. \n
  120. \n
  121. \n
  122. \n
  123. \n
  124. \n
  125. \n
  126. \n
  127. \n
  128. \n
  129. \n
  130. \n
  131. \n
  132. \n
  133. \n
  134. \n
  135. \n
  136. \n
  137. \n
  138. \n
  139. \n
  140. \n
  141. \n
  142. \n
  143. \n
  144. \n
  145. \n
  146. \n