% Memcached LatinoWare 2008
% (c) Copyleft 2008.
% Cesar Rodas
%
% Based on http://www.cs.berkeley.edu/~mdw/proj/texslides for details.
\documentclass[20pt,landscape]{foils}
\usepackage{eso-pic}
\usepackage{mdwslides}
\usepackage[english]{babel}
\hypersetup{
pdfmenubar=true,
pdftoolbar=true,
% colorlinks=false,
pdfpagemode={None},
pdftitle={Escribiendo Aplicaciones Ajax con PHP},
pdfauthor={Cesar D. Rodas},
pdfsubject={Latinoware 2008: Escribiendo Aplicaciones Ajax con PHP },
pdfkeywords={PHP,ajax}
}
\usepackage{hyperref}
\usepackage{pause}
\usepackage{graphicx}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Fondo
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\definecolor{bgblue}{rgb}{0.04,0.39,0.53}
\definecolor{bgwhite}{rgb}{0.9,1,1}
\definecolor{mygreen}{rgb}{0,0.3,0}
\bgaddcenter{\includegraphics[width=15cm]{logo.png}}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Set headers
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\MyLogo{\color{mdwblue}Cesar D. Rodas, http://cesar.la/ - \LaTeX}
\rightfooter{\quad\textsf{\thepage}}
\begin{document}
\rm
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Presentacion
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\slide{}
\LogoOff
\vskip 1.5in
\begin{center}
{\color{mdwblue}\huge\trebucbd Escribiendo Aplicaciones Ajax con PHP}
\vskip 11ex
César D. Rodas\\
{\small\trebucit \href{mailto:crodas@member.fsf.org}{crodas@member.fsf.org}}
\vskip 5ex
{\mdwsmall\tt \href{http://cesar.la/talks/}{http://cesar.la/talks/}}
\vskip 2ex
\includegraphics[width=4cm]{logo.png}\\
Latinoware 2008, Foz do Iguaçu, Brasil
\end{center}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Quien soy
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\slide{Quien les habla?}
\LogoOn
\begin{list1}
\item Participante Google Summer of Code 2008
\begin{list2}
\item Plug-in para WordPress\pause
\end{list2}
\item Ganador del PHP Innovation award 2007\pause
\item Centro Nacional de Computacion\pause
\item \href{http://www.cesarodas.com/}{www.CesaRodas.com}\pause
\end{list1}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Porque USA Ajax?
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\slide{Porque utilizar AJAX?}
\begin{list1}
\item Es la tendencia ({\tt web 2.0})\pause
\item Desarrollo de "Aplicaciones" webs.\pause
\item Reducción de ancho de banda.\pause
\item ...
\end{list1}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Que no es memcached
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\slide{Porqué AJAX es complicado}
\begin{list1}
\item Doble programación.
\begin{list2}
\item Servidor ({\tt PHP}).
\item Cliente ({\tt Javascript}).\pause
\end{list2}
\item Las implementaciones de Javascript no son estándares.\pause
\item Liberías de PHP complicadas o incompletas.\pause
\begin{list2}
\item Montón de códigos para cosas sencillas.
\item Se necesita escribir javascript.
\item Casi todas las librerías PHP sólo relizan {\tt RPC}.\pause
\end{list2}
\item Las librerías Javascript son muy grandes.\pause
\end{list1}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Soluciones?
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\slide{Algunas soluciones...}
\begin{list1}
\item Simple librería de Javascript.\pause
\item Método de transporte.
\begin{list2}
\item XML
\item JSON
\item ...\pause
\end{list2}
\item Buenas librerías y/o frameworks "AJAX" en PHP.\pause
\end{list1}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Comparacion
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\slide{}
\LogoOff
\vskip 2in
\begin{center}
{\color{mdwblue}\Huge\trebucbd Comparación de Librerias/Frameworks}
\\Nada personal.
\end{center}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% XAJAx
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\slide{XAjax}
\LogoOn
\definecolor{000000}{rgb}{0.000,0.000,0.000}
\definecolor{0000BB}{rgb}{0.000,0.000,0.733}
\definecolor{FF8000}{rgb}{1.000,0.502,0.000}
\definecolor{007700}{rgb}{0.000,0.467,0.000}
\definecolor{DD0000}{rgb}{0.867,0.000,0.000}
\begin{noindent}{\color{000000}
{\color{0000BB} <?php\\
}}{\color{FF8000} /*\ RPC\ */\ \\
}{\color{007700} function\ }{\color{0000BB} myFunction}{\color{007700} (}{\color{0000BB} \$arg}{\color{007700} )\ \{\\}
\ \ \ \ {\color{FF8000} /*\ Creando\ una\ respuesta\ */\\}
\ \ \ \ {\color{0000BB} \$objResponse\ }{\color{007700} =\ new\ }{\color{0000BB} xajaxResponse}{\color{007700} ();\\}
\ \ \ \ {\color{0000BB} \$objResponse}{\color{007700} ->}{\color{0000BB} assign}{\color{007700} (}{\color{DD0000} "SomeElementId"}{\color{007700} ,}{\color{DD0000} "innerHTML"}{\color{007700} ,\ }{\color{0000BB} \$newContent}{\color{007700} );\\
\}\\
}{\color{0000BB} \$xajax\ }{\color{007700} =\ new\ }{\color{0000BB} xajax}{\color{007700} ();\\
}{\color{FF8000} /*\ Registrando\ funcion\ */\\
}{\color{0000BB} \$xajax}{\color{007700} ->}{\color{0000BB} registerFunction}{\color{007700} (}{\color{DD0000} "myFunction"}{\color{007700} );\\
}{\color{FF8000} /*\ Procesando\ */\\
}{\color{0000BB} \$xajax}{\color{007700} ->}{\color{0000BB} processRequest}{\color{007700} ();\\
}{\color{0000BB} ?>\\
}\\
<!--Codigo\ Javascript-->\\
{\color{0000BB} <?php\ \$xajax}{\color{007700} ->}{\color{0000BB} printJavascript}{\color{007700} ();\ }{\color{0000BB} ?>\\
}<!--\ el\ codigo\ -->\\
<div\ id="SomeElementId"></div>\\
<button\ onclick="xajax\_myFunction('It\ worked!');"></pre>
\end{noindent}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% XAjax
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\slide{XAjax - Desventajas}
\begin{list1}
\item Utiliza solo XML para el transporte.\pause
\item Genera mucho código.\pause
\item API débil.
\begin{list2}
\item No hay forma de crear elementos en la repuesta.
\item Cosas complicadas requieren de escritura de javascript.
\end{list2}
\end{list1}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% XAjax
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\slide{SAjax}
\definecolor{000000}{rgb}{0.000,0.000,0.000}
\definecolor{0000BB}{rgb}{0.000,0.000,0.733}
\definecolor{007700}{rgb}{0.000,0.467,0.000}
\definecolor{DD0000}{rgb}{0.867,0.000,0.000}
\begin{noindent}{\color{000000}
{\color{0000BB} <?php\\
\ \ \ \ }}{\color{007700} function\ }{\color{0000BB} multiply}{\color{007700} (}{\color{0000BB} \$x}{\color{007700} ,\ }{\color{0000BB} \$y}{\color{007700} )\ \{\\}
\ \ \ \ \ \ \ \ return\ {\color{0000BB} \$x\ }{\color{007700} *\ }{\color{0000BB} \$y}{\color{007700} ;\\
\ \ \ \ \}\\
\ \ \ \ }{\color{0000BB} sajax\_init}{\color{007700} ();\\
\ \ \ \ }{\color{0000BB} sajax\_export}{\color{007700} (}{\color{DD0000} "multiply"}{\color{007700} );\\
\ \ \ \ }{\color{0000BB} sajax\_handle\_client\_request}{\color{007700} ();\\
}{\color{0000BB} ?>\\
}<script>\\
{\color{0000BB} <?php\ sajax\_show\_javascript}{\color{007700} ();\ }{\color{0000BB} ?>\\
}function\ do\_multiply\_cb(z)\ \{\\
\ \ \ \ document.getElementById("z").value\ =\ z;\\
\}\\
function\ do\_multiply()\ \{\\
\ \ \ \ x\ =\ document.getElementById("x").value;\\
\ \ \ \ y\ =\ document.getElementById("y").value;\\
\ \ \ \ x\_multiply(x,\ y,\ do\_multiply\_cb);\\
\}\\
</script>
\end{noindent}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% XAjax - Desventajas
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\slide{SAjax - Desventajas}
\begin{list1}
\item Genera mucho javascript.\pause
\item Poca documentacion.\pause
\item API débil.\pause
\item Se necesita escribir código Javascript.\pause
\item Solo realiza el "RPC".
\end{list1}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Comparacion
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\slide{}
\LogoOff
\vskip 2in
\begin{center}
{\color{mdwblue}\Huge\trebucbd Cual sería la solución perfecta?}
\\Lo que todo PHPero necesita...
\end{center}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\slide{La solución}
\LogoOn
\begin{list1}
\item La parte importante.
\item Abstracción de Javascript.
\item Abstracción de los Objetos HTML (DOM API).
\item Método optimizado de transporte.
\end{list1}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Comparacion
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\slide{}
\LogoOff
\vskip 2in
\begin{center}
{\color{mdwblue}\Huge\trebucbd PHPAJAX}
\end{center}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\slide{PHPAJAX}
\LogoOn
\begin{list1}
\item PHPClasses, Open source (BSD License).\pause
\item Es la versión (re-escritura) 3.\pause
\item Extensible.\pause
\item Método de transporte.\pause
\item Genera código javascript desde el PHP.\pause
\item Subir (upload) archivos al servidor usando "ajax".\pause
\end{list1}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\slide{PHPAJAX - Un poco de historia}
\definecolor{000000}{rgb}{0.000,0.000,0.000}
\definecolor{0000BB}{rgb}{0.000,0.000,0.733}
\definecolor{007700}{rgb}{0.000,0.467,0.000}
\definecolor{DD0000}{rgb}{0.867,0.000,0.000}
\begin{noindent}{\color{000000}
{\color{0000BB} <?php\\
}}{\color{007700} class\ }{\color{0000BB} chat\_put\ }{\color{007700} extends\ }{\color{0000BB} phpajax\ }{\color{007700} \{\\}
\ \ \ \ var\ {\color{0000BB} \$hotkeys}{\color{007700} =array(}{\color{DD0000} "ctrl-m"}{\color{007700} ,}{\color{DD0000} "alt-y"}{\color{007700} );\\}
\ \ \ \ var\ {\color{0000BB} \$inputs}{\color{007700} =array(}{\color{DD0000} "text"}{\color{007700} ,}{\color{DD0000} "usr\_id"}{\color{007700} );\\}
\ \ \ \ function\ {\color{0000BB} loading}{\color{007700} ()\ \{\\}
\ \ \ \ \ \ \ \ {\color{0000BB} aprint}{\color{007700} (}{\color{DD0000} 'loading'}{\color{007700} ,\ }{\color{DD0000} 'Sending...'}{\color{007700} );\\}
\ \ \ \ \ \ \ \ {\color{0000BB} ashow}{\color{007700} (}{\color{DD0000} 'loading'}{\color{007700} );\\}
\ \ \ \ \ \ \ \ {\color{0000BB} ahide}{\color{007700} (}{\color{DD0000} 'send'}{\color{007700} );\\}
\ \ \ \ \}\\
\ \ \ \ function\ {\color{0000BB} main}{\color{007700} ()\ \{\\}
\ \ \ \ \ \ \ \ global\ {\color{0000BB} \$mysql}{\color{007700} ;\\}
\ \ \ \ \ \ \ \ {\color{0000BB} \$a\ }{\color{007700} =\ \ }{\color{0000BB} \$this}{\color{007700} ->}{\color{0000BB} text}{\color{007700} ;\\}
\ \ \ \ \ \ \ \ {\color{0000BB} aprint}{\color{007700} (}{\color{DD0000} 'chat-text'}{\color{007700} ,}{\color{DD0000} "me\ \$a"}{\color{007700} ,}{\color{0000BB} false}{\color{007700} );}\\
\ \ \ \ \ \ \ \ {\color{0000BB} aprint}{\color{007700} (}{\color{DD0000} 'text'}{\color{007700} ,}{\color{DD0000} ''}{\color{007700} );}{\color{0000BB} ashow}{\color{007700} (}{\color{DD0000} 'send'}{\color{007700} );}\\
\ \ \ \ \ \ \ \ {\color{0000BB} js}{\color{007700} (}{\color{DD0000} "getObject('chat-text').scrollTop\ =\ getObject('chat-text').scrollHeight;"}{\color{007700} );\\
\ \ \ \ \}\\
\}\ \\
}{\color{0000BB} ?>\\
}
\end{noindent}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\slide{PHPAJAX - Desventajas}
\begin{list1}
\item API muy débil.\pause
\item JSON.\pause
\item Prototype.\pause
\item Definir una clase por acción.\pause
\end{list1}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\slide{PHPAJAX 3}
\begin{list1}
\item Método de transporte.
\begin{list2}
\item XML, JSON, ... ?
\item Código Javascript.\pause
\end{list2}
\item Posible método alternativo de AJAX sin XMLHttpRequest().\pause
\item Genera código Javascript a partir de PHP.\pause
\item Funciones comunes para evitar escritura de Javascript.
\begin{list2}
\item Filtros.
\item Operaciones Matematicas.\pause
\end{list2}
\item Creacion de elementos HTML en el RPC.\pause
\item "Hooks" a eventos.
\end{list1}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\slide{PHPAJAX 3 - PHP2JS}
\definecolor{000000}{rgb}{0.000,0.000,0.000}
\definecolor{0000BB}{rgb}{0.000,0.000,0.733}
\definecolor{007700}{rgb}{0.000,0.467,0.000}
\definecolor{FF8000}{rgb}{1.000,0.502,0.000}
\definecolor{DD0000}{rgb}{0.867,0.000,0.000}
\begin{noindent}{\color{000000}
{\color{0000BB} <?php\\
}}{\color{007700} class\ }{\color{0000BB} MyButton\ }{\color{007700} extends\ }{\color{0000BB} HtmlButtons\ }{\color{007700} \{\\}
\ \ \ \ {\color{FF8000} \#\\}
\ \ \ \ {\color{007700} function\ }{\color{0000BB} onClick}{\color{007700} ()\ \{\\}
\ \ \ \ \ \ \ \ {\color{FF8000} \#\\}
\ \ \ \ \ \ \ \ {\color{0000BB} \$text\ }{\color{007700} =\ }{\color{0000BB} js}{\color{007700} ::}{\color{0000BB} GetObject}{\color{007700} (}{\color{DD0000} "algun\_input"}{\color{007700} );\\}
\ \ \ \ \ \ \ \ {\color{0000BB} \$numero\ }{\color{007700} =\ }{\color{0000BB} js}{\color{007700} ::}{\color{0000BB} GetObject}{\color{007700} (}{\color{DD0000} "algun\_numero"}{\color{007700}I );\\}\pause
\ \ \ \ \ \ \ \ {\color{0000BB} js}{\color{007700} ::}{\color{0000BB} alert}{\color{007700} (}{\color{DD0000} "El\ valor\ del\ input\ es\ "}{\color{007700} ,\ }{\color{0000BB} \$text}{\color{007700} ->}{\color{0000BB} value}{\color{007700} );\\}\pause
\ \ \ \ \ \ \ \ {\color{FF8000} /*\ filtro\ */\\}
\ \ \ \ \ \ \ \ {\color{0000BB} jfilt}{\color{007700} ::}{\color{0000BB} number}{\color{007700} (}{\color{0000BB} \$numero}{\color{007700} ->}{\color{0000BB} value}{\color{007700} ,}{\color{DD0000} "Tiene\ que\ ser\ un\ numero"}{\color{007700} );}{\color{0000BB} a\\}\pause
\ \ \ \ \ \ \ \ {\color{FF8000} /*\ matematica,\ suma\ */\\}
\ \ \ \ \ \ \ \ {\color{0000BB} \$numero}{\color{007700} ->}{\color{0000BB} value\ }{\color{007700} =\ }{\color{0000BB} jnum}{\color{007700} ::}{\color{0000BB} add}{\color{007700} (}{\color{0000BB} 5}{\color{007700} ,}{\color{0000BB} \$numero}{\color{007700} ->}{\color{0000BB} value}{\color{007700} );\\}
\ \ \ \ \}\\
\}\\
{\color{0000BB} ?>\\
}
\end{noindent}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\slide{}
\LogoOff
\vskip 2in
\begin{center}
{\color{mdwblue}\Huge\trebucbd Theory is good, show me in action}
\end{center}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Preguntas
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\slide{}
\LogoOff
\begin{center}
\vskip 1.5in
{\color{mdwblue}\Huge\trebucbd Muchas gracias! Preguntas?}\\
\vskip 0.5in
{\color{mdwblue}\Large\trebucbd Cesar Rodas.}\\
{\color{black}\small\trebucbd crodas@member.fsf.org}\\
{\color{black}\small\trebucbd http://cesarodas.com/}\\
\vskip 0.5in
{\color{mdwblue}\Large\trebucbd Mi blog.}\\
{\color{black}\small\trebucbd http://cesar.la/}\\
\end{center}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Powered by
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\slide{Resources}
\begin{list1}
\item PHPAjax
\begin{list2}
\item \url{http://www.phpajax.org/}
\end{list2}
\item XAjax
\begin{list2}
\item \url{http://www.xajaxproject.org}
\end{list2}
\end{list1}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Powered by
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\slide{Powered by...}
\LogoOn
\begin{center}
{\includegraphics[width=10cm]{php.png}}\\
{\includegraphics[width=10cm]{latex.png}}\\
\end{center}
\end{document}