SlideShare une entreprise Scribd logo
1  sur  70
Télécharger pour lire hors ligne
PHP without PHP
   The Philosophy of Good
        Architecture


         terry chay
   2009-05-27T14:15+0200
International PHP Conference
      Berlin, Germany
Funky Caching
   Prologue #1
aka
ErrorDocument trick

Smarter Caching

… Rasmus’s Trick (Stig’s trick)



Go into apache.conf (or .htaccess) and

    ErrorDocument 404 /error.php
Error.PHP
$filepath = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH); //or $_SERVER['REDIRECT_URL']
$basepath = dirname(__FILE__).DIR_SEP;
 
// Test to see if you can work with it
if (false) { //…EDIT…
    //output a 404 page
    include('404.html'); // see http://www.alistapart.com/articles/perfect404/ for tips
    return;
}
 
// Generate the file
// …EDIT…
$data = 'something';
 
// Don't send 404 back, send 200 OK because this is a pretty smart 404
// not a clueless one! http://www.urbandictionary.com/define.php?term=404
header(sprintf('%s 200', $_SERVER['SERVER_PROTOCOL']));
//Show the file
echo $data;
 
//Store the page to bypass PHP on the next request. Use a temp file with a
// link trick in order to avoid race conditions between concurrent PHP
// processes.
$tmpfile = tempnam($basepath.'tmp','fc');
$fp = fopen($tmpfile,'w'); //remove the quot;_quot; this is crashing my blog syntax hilighter
fputs($fp, $data);
fclose($fp);
@link($basepath.$filepath, $tmpfile); //suppress errors due to losing race
unlink($tmpfile);
Error.PHP
$filepath = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH); //or $_SERVER['REDIRECT_URL']
$basepath = dirname(__FILE__).DIR_SEP;
 
// Test to see if you can work with it
if (false) { //…EDIT…
    //output a 404 page
    include('404.html'); // see http://www.alistapart.com/articles/perfect404/ for tips
    return;
}
 
// Generate the file
// …EDIT…
$data = 'something';
 
// Don't send 404 back, send 200 OK because this is a pretty smart 404
// not a clueless one! http://www.urbandictionary.com/define.php?term=404
header(sprintf('%s 200', $_SERVER['SERVER_PROTOCOL']));
//Show the file
echo $data;
 
//Store the page to bypass PHP on the next request. Use a temp file with a
// link trick in order to avoid race conditions between concurrent PHP
// processes.
$tmpfile = tempnam($basepath.'tmp','fc');
$fp = fopen($tmpfile,'w'); //remove the quot;_quot; this is crashing my blog syntax hilighter
fputs($fp, $data);
fclose($fp);
@link($basepath.$filepath, $tmpfile); //suppress errors due to losing race
unlink($tmpfile);
Error.PHP
$filepath = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH); //or $_SERVER['REDIRECT_URL']
$basepath = dirname(__FILE__).DIR_SEP;
 
// Test to see if you can work with it
if (false) { //…EDIT…
    //output a 404 page
    include('404.html'); // see http://www.alistapart.com/articles/perfect404/ for tips
    return;
}
 
// Generate the file
// …EDIT…
$data = 'something';
 
// Don't send 404 back, send 200 OK because this is a pretty smart 404
// not a clueless one! http://www.urbandictionary.com/define.php?term=404
header(sprintf('%s 200', $_SERVER['SERVER_PROTOCOL']));
//Show the file
echo $data;
 
//Store the page to bypass PHP on the next request. Use a temp file with a
// link trick in order to avoid race conditions between concurrent PHP
// processes.
$tmpfile = tempnam($basepath.'tmp','fc');
$fp = fopen($tmpfile,'w'); //remove the quot;_quot; this is crashing my blog syntax hilighter
fputs($fp, $data);
fclose($fp);
@link($basepath.$filepath, $tmpfile); //suppress errors due to losing race
unlink($tmpfile);
PHP without PHP
Paradigms
 Prologue #2
Code Complete
The metaphor of Code as
construction comes from this
book…


We   now   know    this   is
fundamentally wrong…
Mythical Man Month
“man-month” is a term from
construction work


The premise is that man and
months are interchangeable.


This means that in order to
reach a deadline I simply add
more people to the project.
paritionable
                                             with training
                                             traning + communication
                                             unpartitionable




                                     20




                                                                       Time to COmplete Title
First consider something like
painting a fence: everything is
                                     15

partionable (man-month).



…add a constant time for training.   10



…add communication cost: n(n-1)/2.
                                     5

Compare to the unpartitionable
(single man)



Adding people to a late project
makes it later!                           Number of People
Engineer and
 Architect
1 Fallingwater
organic, democratic, plasticity, continuity
…including me
Hatchway Staircase   View at the main (living room) level, from the
                                                 bridge (from east)
Beyond the glass   Fallingwater: Living room terraces and glass
                                               walls (from east).
Fall Foliage   View from lookout, downstream.
Fall Foliage   View from lookout, downstream.
No barriers   Detail: corner window at the guest house,
                                       from southeast.
Existing tree   The trellis over the driveway is built to
                                   accommodate a tree.
Local quarry   Living room, west (downstream) side, from
                                             southeast
Existing boulder   Living room fireplace and hearth, looking
                         from kitchen door to south windows
Philosophy
organic,


democratic,


plasticity,


continuity.
Why on PHP?
Harmony with Environment

 Apache web server: ErrorDocument

 Customer-centric: Performance
 paramount

 Relational Database: Slow
 persistence

 Harmony with PHP itself…
Architecture of PHP   Modern web architecture
PHP is “Cheap”

“A project done in Java will cost 5 times
as much, take twice as long, and be
harder to maintain than a project done
in a scripting language such as PHP or
Perl.”

                    —Phillip Greenspun
PHP is “Scalable”
“That a Java servlet performs better
than a PHP script, under optimal
conditions [has] nothing to do with
scalability. The point is can your
application continue to deliver
consistent performance as volume
increases. PHP delegates all the ‘hard
stuff’ to other systems.”

                        —Harry Fuecks
PHP is “Pragmatic”
“PHP is not about purity in CS
principles or architecture; it is about
solving the ugly web problem with an
admittedly ugly, but extremely
functional and convenient solution. If
you are looking for purity, you are in
the wrong boat. Get out now before
you get hit by a wet cat!”

                      —Rasmus Lerdorf
2 Bellefield Towers
     Design Hubris
Gothic Romanesque architecture   The current Bellefield Church (two blocks
                                                                     away)
Other city towers   Allegheny Courthouse Main Tower & Four
                       Tower Types at Jail (and other towers)
Tower of
     Learning
Within spitting distance of
    Bellefield Towers
Carnegie Library   Most iconic moment in baseball history
Why is Bellefield
Towers so Ugly?
Design Hubris?
Frameworks (almost by definition)

Develop in the PHP community?

Take over an existing project?

Limitations of Site Operations?
Hosting? or Virtual hosting?

Business needs trump programmer
desire?

Dealt with a user request?
add slideshow




…at Tagged
…at Tagged
     Cubes
Waterfall process
   Oracle RAC
      Java
      PHP4
Zend Accelerator
Solutions Consider
   Environment
3 Golden Gate Bridge
     The Design Pattern
the other bridge
Same problem,
different pattern
Original design was hybrid
 cantilever-suspension.
    Replaced by purse
       suspension
Art Deco
Bridge Tower, Lighting,
 pedestrial walkway
International
     Orange
   Rust colored like the
environment it lives in … and
           safe.
Part of the
  whole
Design Patterns
      Defined
“Each pattern describes a
problem which occurs over
and   over   again     in   our
environment, and then
describes the core of the
solution to that problem, in
such a way that you can use
this solution a million times
over, without ever doing it
the same way twice.”
Certainly iconic   Me in front of both icons
Never the same way twice   How do you know which one?
                           How do you know which way?
Funky Caching again

“search for the closest matching valid
URL and redirect, and use attempted
url text as a DB keyword lookup”

                     —Rasmus Lerdorf
Javascript and CSS
compiling & caching
<?php

$watermark = '3129080702_c4e76f71d7_o.png';
$dead_url = 'http://example.com/dead_image.png';
 
// {{{ start_image($filename, &$data)
/**
* Creates a gd handle for a valid file
* @param $filename string the file to get
* @param $data array the imagesize
* @return resource GD handle
*/
function start_image($filename, &$data) {
    $data = @getimagesize($filename);
    if (empty($data)) { return null; }
    $data['ratio'] = $data[0]/$data[1];
    switch($data[2]) {
        case IMG_GIF: return imagecreatefromgif($filename);
        case 3: //problem where IMG_PNG is not bound correctly for my install
        case IMG_PNG: return imagecreatefrompng($filename);
        case IMG_JPG: return imagecreatefromjpeg($filename);
        case IMG_WBMP: return imagecreatefromwbmp($filename);
        case IMG_XPM: return imagecreatefromxbm($filename);
    }
    return null;
}   
// }}}
$requestimg = $_SERVER['REDIRECT_URL'];
if (!$_SERVER['QUERY_STRING']) {
    // redirect user to invalid image
    tag_http::redirect($dead_url);
    return '';
}
// grab image to temp {{{
$ch = curl_init($_SERVER['QUERY_STRING']);
$tempfile = tempnam('/tmp', 'prod_remote_');
$fp = f_open($tempfile, 'w'); //again delete the quot;_quot;
curl_setopt($ch, CURLOPT_FILE, $fp);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_exec_($ch); //delete the final quot;_quot;
curl_close($ch);
fclose($fp);
// }}}
<?php

$watermark = '3129080702_c4e76f71d7_o.png';
$dead_url = 'http://example.com/dead_image.png';
 
// {{{ start_image($filename, &$data)
/**
* Creates a gd handle for a valid file
* @param $filename string the file to get
* @param $data array the imagesize
* @return resource GD handle
*/
function start_image($filename, &$data) {
    $data = @getimagesize($filename);
    if (empty($data)) { return null; }
    $data['ratio'] = $data[0]/$data[1];
    switch($data[2]) {
        case IMG_GIF: return imagecreatefromgif($filename);
        case 3: //problem where IMG_PNG is not bound correctly for my install
        case IMG_PNG: return imagecreatefrompng($filename);
        case IMG_JPG: return imagecreatefromjpeg($filename);
        case IMG_WBMP: return imagecreatefromwbmp($filename);
        case IMG_XPM: return imagecreatefromxbm($filename);
    }
    return null;
}   
// }}}
$requestimg = $_SERVER['REDIRECT_URL'];
if (!$_SERVER['QUERY_STRING']) {
    // redirect user to invalid image
    tag_http::redirect($dead_url);
    return '';
}
// grab image to temp {{{
$ch = curl_init($_SERVER['QUERY_STRING']);
$tempfile = tempnam('/tmp', 'prod_remote_');
$fp = f_open($tempfile, 'w'); //again delete the quot;_quot;
curl_setopt($ch, CURLOPT_FILE, $fp);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_exec_($ch); //delete the final quot;_quot;
curl_close($ch);
fclose($fp);
// }}}
<?php

$watermark = '3129080702_c4e76f71d7_o.png';
$dead_url = 'http://example.com/dead_image.png';
 
// {{{ start_image($filename, &$data)
/**
* Creates a gd handle for a valid file
* @param $filename string the file to get
* @param $data array the imagesize
* @return resource GD handle
*/
function start_image($filename, &$data) {
    $data = @getimagesize($filename);
    if (empty($data)) { return null; }
    $data['ratio'] = $data[0]/$data[1];
    switch($data[2]) {
        case IMG_GIF: return imagecreatefromgif($filename);
        case 3: //problem where IMG_PNG is not bound correctly for my install
        case IMG_PNG: return imagecreatefrompng($filename);
        case IMG_JPG: return imagecreatefromjpeg($filename);
        case IMG_WBMP: return imagecreatefromwbmp($filename);
        case IMG_XPM: return imagecreatefromxbm($filename);
    }
    return null;
}   
// }}}
$requestimg = $_SERVER['REDIRECT_URL'];
if (!$_SERVER['QUERY_STRING']) {
    // redirect user to invalid image
    tag_http::redirect($dead_url);
    return '';
}
// grab image to temp {{{
$ch = curl_init($_SERVER['QUERY_STRING']);
$tempfile = tempnam('/tmp', 'prod_remote_');
$fp = f_open($tempfile, 'w'); //again delete the quot;_quot;
curl_setopt($ch, CURLOPT_FILE, $fp);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_exec_($ch); //delete the final quot;_quot;
curl_close($ch);
fclose($fp);
// }}}
<?php

$watermark = '3129080702_c4e76f71d7_o.png';
$dead_url = 'http://example.com/dead_image.png';
 
// {{{ start_image($filename, &$data)
/**
* Creates a gd handle for a valid file
* @param $filename string the file to get
* @param $data array the imagesize
* @return resource GD handle
*/
function start_image($filename, &$data) {
    $data = @getimagesize($filename);
    if (empty($data)) { return null; }
    $data['ratio'] = $data[0]/$data[1];
    switch($data[2]) {
        case IMG_GIF: return imagecreatefromgif($filename);
        case 3: //problem where IMG_PNG is not bound correctly for my install
        case IMG_PNG: return imagecreatefrompng($filename);
        case IMG_JPG: return imagecreatefromjpeg($filename);
        case IMG_WBMP: return imagecreatefromwbmp($filename);
        case IMG_XPM: return imagecreatefromxbm($filename);
    }
    return null;
}   
// }}}
$requestimg = $_SERVER['REDIRECT_URL'];
if (!$_SERVER['QUERY_STRING']) {
    // redirect user to invalid image
    tag_http::redirect($dead_url);
    return '';
}
// grab image to temp {{{
$ch = curl_init($_SERVER['QUERY_STRING']);
$tempfile = tempnam('/tmp', 'prod_remote_');
$fp = f_open($tempfile, 'w'); //again delete the quot;_quot;
curl_setopt($ch, CURLOPT_FILE, $fp);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_exec_($ch); //delete the final quot;_quot;
curl_close($ch);
fclose($fp);
// }}}
// configure image and dimensions {{{
$size_data = array();
$im = start_image($tempfile, $size_data);
if (!$im) {
    unlink($tempfile);
    tag_http::redirect($dead_url);
    return;
}
// }}}
// get watermark information {{{
$wm_data = array();
$wm = start_image($watermark, $wm_data);
if (!$wm) {
    unlink ($tempfile);
    tag_http::redirect($dead_url);
    return;
}
// }}}
// add watermark {{{
if ($size_data['ratio']> $wm_data['ratio']) {
    // image is wider format than the watermark
    $new_smaller_dim = $wm_data[0] * ($size_data[1]/$wm_data[1]);
    $dst_x = ($size_data[0] - $new_smaller_dim)/2;
    $dst_y = 0;
    $dst_w = $new_smaller_dim;
    $dst_h = $size_data[1];
} else {
    // image is taller format than the watermark
    $new_smaller_dim = $wm_data[1] * ($size_data[0]/$wm_data[0]);
    $dst_x = 0;
    $dst_y = ($size_data[1] - $new_smaller_dim)/2;
    $dst_w = $size_data[0];
    $dst_h = $new_smaller_dim;;
}
imagecopyresized($im, $wm, $dst_x, $dst_y, 0, 0, $dst_w, $dst_h, $wm_data[0], $wm_data[1]);
header(sprintf('%s 200', $_SERVER['SERVER_PROTOCOL']));
header(sprintf('Content-type: %s',$size_data['mime']));
// }}}
switch ($size_data[2]) {
    case IMG_GIF: imagegif($im); break;
    case 3: case IMG_PNG: imagepng($im); break;
    case IMG_JPG: imagejpeg($im); break;
    case IMG_WBMP: imagewbmp($im); break;
    case IMG_XPM: imagexbm($im); break;
}
imagedestroy($wm);
imagedestroy($im);
unlink($tempfile);
// configure image and dimensions {{{
$size_data = array();
$im = start_image($tempfile, $size_data);
if (!$im) {
    unlink($tempfile);
    tag_http::redirect($dead_url);
    return;
}
// }}}
// get watermark information {{{
$wm_data = array();
$wm = start_image($watermark, $wm_data);
if (!$wm) {
    unlink ($tempfile);
    tag_http::redirect($dead_url);
    return;
}
// }}}
// add watermark {{{
if ($size_data['ratio']> $wm_data['ratio']) {
    // image is wider format than the watermark
    $new_smaller_dim = $wm_data[0] * ($size_data[1]/$wm_data[1]);
    $dst_x = ($size_data[0] - $new_smaller_dim)/2;
    $dst_y = 0;
    $dst_w = $new_smaller_dim;
    $dst_h = $size_data[1];
} else {
    // image is taller format than the watermark
    $new_smaller_dim = $wm_data[1] * ($size_data[0]/$wm_data[0]);
    $dst_x = 0;
    $dst_y = ($size_data[1] - $new_smaller_dim)/2;
    $dst_w = $size_data[0];
    $dst_h = $new_smaller_dim;;
}
imagecopyresized($im, $wm, $dst_x, $dst_y, 0, 0, $dst_w, $dst_h, $wm_data[0], $wm_data[1]);
header(sprintf('%s 200', $_SERVER['SERVER_PROTOCOL']));
header(sprintf('Content-type: %s',$size_data['mime']));
// }}}
switch ($size_data[2]) {
    case IMG_GIF: imagegif($im); break;
    case 3: case IMG_PNG: imagepng($im); break;
    case IMG_JPG: imagejpeg($im); break;
    case IMG_WBMP: imagewbmp($im); break;
    case IMG_XPM: imagexbm($im); break;
}
imagedestroy($wm);
imagedestroy($im);
unlink($tempfile);
// configure image and dimensions {{{
$size_data = array();
$im = start_image($tempfile, $size_data);
if (!$im) {
    unlink($tempfile);
    tag_http::redirect($dead_url);
    return;
}
// }}}
// get watermark information {{{
$wm_data = array();
$wm = start_image($watermark, $wm_data);
if (!$wm) {
    unlink ($tempfile);
    tag_http::redirect($dead_url);
    return;
}
// }}}
// add watermark {{{
if ($size_data['ratio']> $wm_data['ratio']) {
    // image is wider format than the watermark
    $new_smaller_dim = $wm_data[0] * ($size_data[1]/$wm_data[1]);
    $dst_x = ($size_data[0] - $new_smaller_dim)/2;
    $dst_y = 0;
    $dst_w = $new_smaller_dim;
    $dst_h = $size_data[1];
} else {
    // image is taller format than the watermark
    $new_smaller_dim = $wm_data[1] * ($size_data[0]/$wm_data[0]);
    $dst_x = 0;
    $dst_y = ($size_data[1] - $new_smaller_dim)/2;
    $dst_w = $size_data[0];
    $dst_h = $new_smaller_dim;;
}
imagecopyresized($im, $wm, $dst_x, $dst_y, 0, 0, $dst_w, $dst_h, $wm_data[0], $wm_data[1]);
header(sprintf('%s 200', $_SERVER['SERVER_PROTOCOL']));
header(sprintf('Content-type: %s',$size_data['mime']));
// }}}
switch ($size_data[2]) {
    case IMG_GIF: imagegif($im); break;
    case 3: case IMG_PNG: imagepng($im); break;
    case IMG_JPG: imagejpeg($im); break;
    case IMG_WBMP: imagewbmp($im); break;
    case IMG_XPM: imagexbm($im); break;
}
imagedestroy($wm);
imagedestroy($im);
unlink($tempfile);
Beyond Funky
  Caching
San Francisco
Looking around you for
      inspiration
Thanks!
  tychay@php.net
terrychay.com/blog

Contenu connexe

Similaire à PHP Without PHP—IPC

Spark: Authoring Experience++ in Drupal 7, 8, and Beyond
Spark: Authoring Experience++ in Drupal 7, 8, and BeyondSpark: Authoring Experience++ in Drupal 7, 8, and Beyond
Spark: Authoring Experience++ in Drupal 7, 8, and BeyondAngela Byron
 
Finding harmony in web development
Finding harmony in web developmentFinding harmony in web development
Finding harmony in web developmentChristian Heilmann
 
Building Websites of the Future With Drupal 7
Building Websites of the Future With Drupal 7Building Websites of the Future With Drupal 7
Building Websites of the Future With Drupal 7Jay Epstein
 
Building Websites of the Future With Drupal 7
Building Websites of the Future With Drupal 7Building Websites of the Future With Drupal 7
Building Websites of the Future With Drupal 7Jay Epstein
 
Enterprise PHP (PHP London Conference 2008)
Enterprise PHP (PHP London Conference 2008)Enterprise PHP (PHP London Conference 2008)
Enterprise PHP (PHP London Conference 2008)Ivo Jansch
 
Drupal Extreme Scaling
Drupal Extreme ScalingDrupal Extreme Scaling
Drupal Extreme Scalingzekivazquez
 
Swimming upstream
Swimming upstreamSwimming upstream
Swimming upstreamDave Neary
 
Swimming upstream
Swimming upstreamSwimming upstream
Swimming upstreamOPNFV
 
XML for Humans: Non-geek Discussion of a Geek-chic Topic
XML for Humans: Non-geek Discussion of a Geek-chic TopicXML for Humans: Non-geek Discussion of a Geek-chic Topic
XML for Humans: Non-geek Discussion of a Geek-chic TopicPublishing Smarter
 
Top 10 Scalability Mistakes
Top 10 Scalability MistakesTop 10 Scalability Mistakes
Top 10 Scalability MistakesJohn Coggeshall
 
DrupalCon Paris Muiltilingual Panel
DrupalCon Paris Muiltilingual PanelDrupalCon Paris Muiltilingual Panel
DrupalCon Paris Muiltilingual PanelDoug Green
 
Rethinking Object Orientation
Rethinking Object OrientationRethinking Object Orientation
Rethinking Object OrientationIASA
 
Managing a Project the Drupal Way - Drupal Open Days Ireland
Managing a Project the Drupal Way - Drupal Open Days IrelandManaging a Project the Drupal Way - Drupal Open Days Ireland
Managing a Project the Drupal Way - Drupal Open Days IrelandEmma Jane Hogbin Westby
 
Apache Con 2008 Top 10 Mistakes
Apache Con 2008 Top 10 MistakesApache Con 2008 Top 10 Mistakes
Apache Con 2008 Top 10 MistakesJohn Coggeshall
 
Ran Mizrahi - Symfony2 meets Drupal8
Ran Mizrahi - Symfony2 meets Drupal8Ran Mizrahi - Symfony2 meets Drupal8
Ran Mizrahi - Symfony2 meets Drupal8Ran Mizrahi
 
Sustainable Agile Development
Sustainable Agile DevelopmentSustainable Agile Development
Sustainable Agile DevelopmentGabriele Lana
 
Stc 2015 preparing legacy projects for responsive design - technical issues
Stc 2015   preparing legacy projects for responsive design - technical issuesStc 2015   preparing legacy projects for responsive design - technical issues
Stc 2015 preparing legacy projects for responsive design - technical issuesNeil Perlin
 

Similaire à PHP Without PHP—IPC (20)

Current state-of-php
Current state-of-phpCurrent state-of-php
Current state-of-php
 
Enterprise PHP
Enterprise PHPEnterprise PHP
Enterprise PHP
 
Spark: Authoring Experience++ in Drupal 7, 8, and Beyond
Spark: Authoring Experience++ in Drupal 7, 8, and BeyondSpark: Authoring Experience++ in Drupal 7, 8, and Beyond
Spark: Authoring Experience++ in Drupal 7, 8, and Beyond
 
Finding harmony in web development
Finding harmony in web developmentFinding harmony in web development
Finding harmony in web development
 
Building Websites of the Future With Drupal 7
Building Websites of the Future With Drupal 7Building Websites of the Future With Drupal 7
Building Websites of the Future With Drupal 7
 
Building Websites of the Future With Drupal 7
Building Websites of the Future With Drupal 7Building Websites of the Future With Drupal 7
Building Websites of the Future With Drupal 7
 
Enterprise PHP (PHP London Conference 2008)
Enterprise PHP (PHP London Conference 2008)Enterprise PHP (PHP London Conference 2008)
Enterprise PHP (PHP London Conference 2008)
 
Drupal Extreme Scaling
Drupal Extreme ScalingDrupal Extreme Scaling
Drupal Extreme Scaling
 
Swimming upstream
Swimming upstreamSwimming upstream
Swimming upstream
 
Swimming upstream
Swimming upstreamSwimming upstream
Swimming upstream
 
XML for Humans: Non-geek Discussion of a Geek-chic Topic
XML for Humans: Non-geek Discussion of a Geek-chic TopicXML for Humans: Non-geek Discussion of a Geek-chic Topic
XML for Humans: Non-geek Discussion of a Geek-chic Topic
 
Top 10 Scalability Mistakes
Top 10 Scalability MistakesTop 10 Scalability Mistakes
Top 10 Scalability Mistakes
 
DrupalCon Paris Muiltilingual Panel
DrupalCon Paris Muiltilingual PanelDrupalCon Paris Muiltilingual Panel
DrupalCon Paris Muiltilingual Panel
 
Rethinking Object Orientation
Rethinking Object OrientationRethinking Object Orientation
Rethinking Object Orientation
 
REPL-driven development with pry
REPL-driven development with pry  REPL-driven development with pry
REPL-driven development with pry
 
Managing a Project the Drupal Way - Drupal Open Days Ireland
Managing a Project the Drupal Way - Drupal Open Days IrelandManaging a Project the Drupal Way - Drupal Open Days Ireland
Managing a Project the Drupal Way - Drupal Open Days Ireland
 
Apache Con 2008 Top 10 Mistakes
Apache Con 2008 Top 10 MistakesApache Con 2008 Top 10 Mistakes
Apache Con 2008 Top 10 Mistakes
 
Ran Mizrahi - Symfony2 meets Drupal8
Ran Mizrahi - Symfony2 meets Drupal8Ran Mizrahi - Symfony2 meets Drupal8
Ran Mizrahi - Symfony2 meets Drupal8
 
Sustainable Agile Development
Sustainable Agile DevelopmentSustainable Agile Development
Sustainable Agile Development
 
Stc 2015 preparing legacy projects for responsive design - technical issues
Stc 2015   preparing legacy projects for responsive design - technical issuesStc 2015   preparing legacy projects for responsive design - technical issues
Stc 2015 preparing legacy projects for responsive design - technical issues
 

Plus de terry chay

2019-03 Recomendation Engine @ Confoo
2019-03 Recomendation Engine @ Confoo2019-03 Recomendation Engine @ Confoo
2019-03 Recomendation Engine @ Confooterry chay
 
2019-02 The Recommendation Engine @ SunshinePHP
2019-02 The Recommendation Engine @ SunshinePHP2019-02 The Recommendation Engine @ SunshinePHP
2019-02 The Recommendation Engine @ SunshinePHPterry chay
 
2017-11 Recommendation Engine @ RaiseMe
2017-11 Recommendation Engine @ RaiseMe2017-11 Recommendation Engine @ RaiseMe
2017-11 Recommendation Engine @ RaiseMeterry chay
 
2013-08 10 evil things - Northeast PHP Conference Keynote
2013-08 10 evil things - Northeast PHP Conference Keynote2013-08 10 evil things - Northeast PHP Conference Keynote
2013-08 10 evil things - Northeast PHP Conference Keynoteterry chay
 
10 Evil(ish) Things and how they relate to Features Engineering at the WMF
10 Evil(ish) Things and how they relate to Features Engineering at the WMF10 Evil(ish) Things and how they relate to Features Engineering at the WMF
10 Evil(ish) Things and how they relate to Features Engineering at the WMFterry chay
 
2011 07 Tales of Virality—OSCON
2011 07 Tales of Virality—OSCON2011 07 Tales of Virality—OSCON
2011 07 Tales of Virality—OSCONterry chay
 
2011 07 Living without your Linemen—OSCON
2011 07 Living without your Linemen—OSCON2011 07 Living without your Linemen—OSCON
2011 07 Living without your Linemen—OSCONterry chay
 
Broken Jewel—Automattic
Broken Jewel—AutomatticBroken Jewel—Automattic
Broken Jewel—Automatticterry chay
 
Photo to Finished
Photo to FinishedPhoto to Finished
Photo to Finishedterry chay
 
Tales of Virality—Automattic
Tales of Virality—AutomatticTales of Virality—Automattic
Tales of Virality—Automatticterry chay
 
PHP Without PHP—Confoo
PHP Without PHP—ConfooPHP Without PHP—Confoo
PHP Without PHP—Confooterry chay
 
Chinese Proverbs—PHP|tek
Chinese Proverbs—PHP|tekChinese Proverbs—PHP|tek
Chinese Proverbs—PHP|tekterry chay
 

Plus de terry chay (13)

2019-03 Recomendation Engine @ Confoo
2019-03 Recomendation Engine @ Confoo2019-03 Recomendation Engine @ Confoo
2019-03 Recomendation Engine @ Confoo
 
2019-02 The Recommendation Engine @ SunshinePHP
2019-02 The Recommendation Engine @ SunshinePHP2019-02 The Recommendation Engine @ SunshinePHP
2019-02 The Recommendation Engine @ SunshinePHP
 
2017-11 Recommendation Engine @ RaiseMe
2017-11 Recommendation Engine @ RaiseMe2017-11 Recommendation Engine @ RaiseMe
2017-11 Recommendation Engine @ RaiseMe
 
2009-02 Oops!
2009-02 Oops!2009-02 Oops!
2009-02 Oops!
 
2013-08 10 evil things - Northeast PHP Conference Keynote
2013-08 10 evil things - Northeast PHP Conference Keynote2013-08 10 evil things - Northeast PHP Conference Keynote
2013-08 10 evil things - Northeast PHP Conference Keynote
 
10 Evil(ish) Things and how they relate to Features Engineering at the WMF
10 Evil(ish) Things and how they relate to Features Engineering at the WMF10 Evil(ish) Things and how they relate to Features Engineering at the WMF
10 Evil(ish) Things and how they relate to Features Engineering at the WMF
 
2011 07 Tales of Virality—OSCON
2011 07 Tales of Virality—OSCON2011 07 Tales of Virality—OSCON
2011 07 Tales of Virality—OSCON
 
2011 07 Living without your Linemen—OSCON
2011 07 Living without your Linemen—OSCON2011 07 Living without your Linemen—OSCON
2011 07 Living without your Linemen—OSCON
 
Broken Jewel—Automattic
Broken Jewel—AutomatticBroken Jewel—Automattic
Broken Jewel—Automattic
 
Photo to Finished
Photo to FinishedPhoto to Finished
Photo to Finished
 
Tales of Virality—Automattic
Tales of Virality—AutomatticTales of Virality—Automattic
Tales of Virality—Automattic
 
PHP Without PHP—Confoo
PHP Without PHP—ConfooPHP Without PHP—Confoo
PHP Without PHP—Confoo
 
Chinese Proverbs—PHP|tek
Chinese Proverbs—PHP|tekChinese Proverbs—PHP|tek
Chinese Proverbs—PHP|tek
 

Dernier

Genislab builds better products and faster go-to-market with Lean project man...
Genislab builds better products and faster go-to-market with Lean project man...Genislab builds better products and faster go-to-market with Lean project man...
Genislab builds better products and faster go-to-market with Lean project man...Farhan Tariq
 
Data governance with Unity Catalog Presentation
Data governance with Unity Catalog PresentationData governance with Unity Catalog Presentation
Data governance with Unity Catalog PresentationKnoldus Inc.
 
The Future Roadmap for the Composable Data Stack - Wes McKinney - Data Counci...
The Future Roadmap for the Composable Data Stack - Wes McKinney - Data Counci...The Future Roadmap for the Composable Data Stack - Wes McKinney - Data Counci...
The Future Roadmap for the Composable Data Stack - Wes McKinney - Data Counci...Wes McKinney
 
How to write a Business Continuity Plan
How to write a Business Continuity PlanHow to write a Business Continuity Plan
How to write a Business Continuity PlanDatabarracks
 
So einfach geht modernes Roaming fuer Notes und Nomad.pdf
So einfach geht modernes Roaming fuer Notes und Nomad.pdfSo einfach geht modernes Roaming fuer Notes und Nomad.pdf
So einfach geht modernes Roaming fuer Notes und Nomad.pdfpanagenda
 
Bridging Between CAD & GIS: 6 Ways to Automate Your Data Integration
Bridging Between CAD & GIS:  6 Ways to Automate Your Data IntegrationBridging Between CAD & GIS:  6 Ways to Automate Your Data Integration
Bridging Between CAD & GIS: 6 Ways to Automate Your Data Integrationmarketing932765
 
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024BookNet Canada
 
Zeshan Sattar- Assessing the skill requirements and industry expectations for...
Zeshan Sattar- Assessing the skill requirements and industry expectations for...Zeshan Sattar- Assessing the skill requirements and industry expectations for...
Zeshan Sattar- Assessing the skill requirements and industry expectations for...itnewsafrica
 
[Webinar] SpiraTest - Setting New Standards in Quality Assurance
[Webinar] SpiraTest - Setting New Standards in Quality Assurance[Webinar] SpiraTest - Setting New Standards in Quality Assurance
[Webinar] SpiraTest - Setting New Standards in Quality AssuranceInflectra
 
Generative Artificial Intelligence: How generative AI works.pdf
Generative Artificial Intelligence: How generative AI works.pdfGenerative Artificial Intelligence: How generative AI works.pdf
Generative Artificial Intelligence: How generative AI works.pdfIngrid Airi González
 
React Native vs Ionic - The Best Mobile App Framework
React Native vs Ionic - The Best Mobile App FrameworkReact Native vs Ionic - The Best Mobile App Framework
React Native vs Ionic - The Best Mobile App FrameworkPixlogix Infotech
 
Top 10 Hubspot Development Companies in 2024
Top 10 Hubspot Development Companies in 2024Top 10 Hubspot Development Companies in 2024
Top 10 Hubspot Development Companies in 2024TopCSSGallery
 
Testing tools and AI - ideas what to try with some tool examples
Testing tools and AI - ideas what to try with some tool examplesTesting tools and AI - ideas what to try with some tool examples
Testing tools and AI - ideas what to try with some tool examplesKari Kakkonen
 
2024 April Patch Tuesday
2024 April Patch Tuesday2024 April Patch Tuesday
2024 April Patch TuesdayIvanti
 
A Journey Into the Emotions of Software Developers
A Journey Into the Emotions of Software DevelopersA Journey Into the Emotions of Software Developers
A Journey Into the Emotions of Software DevelopersNicole Novielli
 
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptx
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptxThe Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptx
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptxLoriGlavin3
 
Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024BookNet Canada
 
Varsha Sewlal- Cyber Attacks on Critical Critical Infrastructure
Varsha Sewlal- Cyber Attacks on Critical Critical InfrastructureVarsha Sewlal- Cyber Attacks on Critical Critical Infrastructure
Varsha Sewlal- Cyber Attacks on Critical Critical Infrastructureitnewsafrica
 
Microsoft 365 Copilot: How to boost your productivity with AI – Part one: Ado...
Microsoft 365 Copilot: How to boost your productivity with AI – Part one: Ado...Microsoft 365 Copilot: How to boost your productivity with AI – Part one: Ado...
Microsoft 365 Copilot: How to boost your productivity with AI – Part one: Ado...Nikki Chapple
 
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptx
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptxMerck Moving Beyond Passwords: FIDO Paris Seminar.pptx
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptxLoriGlavin3
 

Dernier (20)

Genislab builds better products and faster go-to-market with Lean project man...
Genislab builds better products and faster go-to-market with Lean project man...Genislab builds better products and faster go-to-market with Lean project man...
Genislab builds better products and faster go-to-market with Lean project man...
 
Data governance with Unity Catalog Presentation
Data governance with Unity Catalog PresentationData governance with Unity Catalog Presentation
Data governance with Unity Catalog Presentation
 
The Future Roadmap for the Composable Data Stack - Wes McKinney - Data Counci...
The Future Roadmap for the Composable Data Stack - Wes McKinney - Data Counci...The Future Roadmap for the Composable Data Stack - Wes McKinney - Data Counci...
The Future Roadmap for the Composable Data Stack - Wes McKinney - Data Counci...
 
How to write a Business Continuity Plan
How to write a Business Continuity PlanHow to write a Business Continuity Plan
How to write a Business Continuity Plan
 
So einfach geht modernes Roaming fuer Notes und Nomad.pdf
So einfach geht modernes Roaming fuer Notes und Nomad.pdfSo einfach geht modernes Roaming fuer Notes und Nomad.pdf
So einfach geht modernes Roaming fuer Notes und Nomad.pdf
 
Bridging Between CAD & GIS: 6 Ways to Automate Your Data Integration
Bridging Between CAD & GIS:  6 Ways to Automate Your Data IntegrationBridging Between CAD & GIS:  6 Ways to Automate Your Data Integration
Bridging Between CAD & GIS: 6 Ways to Automate Your Data Integration
 
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
 
Zeshan Sattar- Assessing the skill requirements and industry expectations for...
Zeshan Sattar- Assessing the skill requirements and industry expectations for...Zeshan Sattar- Assessing the skill requirements and industry expectations for...
Zeshan Sattar- Assessing the skill requirements and industry expectations for...
 
[Webinar] SpiraTest - Setting New Standards in Quality Assurance
[Webinar] SpiraTest - Setting New Standards in Quality Assurance[Webinar] SpiraTest - Setting New Standards in Quality Assurance
[Webinar] SpiraTest - Setting New Standards in Quality Assurance
 
Generative Artificial Intelligence: How generative AI works.pdf
Generative Artificial Intelligence: How generative AI works.pdfGenerative Artificial Intelligence: How generative AI works.pdf
Generative Artificial Intelligence: How generative AI works.pdf
 
React Native vs Ionic - The Best Mobile App Framework
React Native vs Ionic - The Best Mobile App FrameworkReact Native vs Ionic - The Best Mobile App Framework
React Native vs Ionic - The Best Mobile App Framework
 
Top 10 Hubspot Development Companies in 2024
Top 10 Hubspot Development Companies in 2024Top 10 Hubspot Development Companies in 2024
Top 10 Hubspot Development Companies in 2024
 
Testing tools and AI - ideas what to try with some tool examples
Testing tools and AI - ideas what to try with some tool examplesTesting tools and AI - ideas what to try with some tool examples
Testing tools and AI - ideas what to try with some tool examples
 
2024 April Patch Tuesday
2024 April Patch Tuesday2024 April Patch Tuesday
2024 April Patch Tuesday
 
A Journey Into the Emotions of Software Developers
A Journey Into the Emotions of Software DevelopersA Journey Into the Emotions of Software Developers
A Journey Into the Emotions of Software Developers
 
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptx
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptxThe Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptx
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptx
 
Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
 
Varsha Sewlal- Cyber Attacks on Critical Critical Infrastructure
Varsha Sewlal- Cyber Attacks on Critical Critical InfrastructureVarsha Sewlal- Cyber Attacks on Critical Critical Infrastructure
Varsha Sewlal- Cyber Attacks on Critical Critical Infrastructure
 
Microsoft 365 Copilot: How to boost your productivity with AI – Part one: Ado...
Microsoft 365 Copilot: How to boost your productivity with AI – Part one: Ado...Microsoft 365 Copilot: How to boost your productivity with AI – Part one: Ado...
Microsoft 365 Copilot: How to boost your productivity with AI – Part one: Ado...
 
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptx
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptxMerck Moving Beyond Passwords: FIDO Paris Seminar.pptx
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptx
 

PHP Without PHP—IPC