Archive Page 2

Qué es xajax?

Xajax es un framework (que es algo así como un entorno de trabajo) y que está escrito en PHP. Es de código abierto y con él podemos crear aplicaciones web utilizando AJAX sin la necesidad de conocer todos los detalles de la programación en JavaScript.

Para qué sirve xajax?

En una aplicación Web, el servidor crea una página que es enviada al cliente. Ésta página crea, entre otras cosas, formularios y botones que a su vez disparan ciertos eventos de JavaScript (onclick, onchange, etc) o pueden redireccionar nuestra página a otra alojada en el servidor para ejecutar código PHP, por ejemplo. Estas funciones, como acabamos de mencionar, pueden o no interactuar con el servidor (llamando a eventos JavaScript o redirigiendo la página o otra alojada en el servidor), pero según el caso, podemos necesitar invocar datos que se encuentran sólo en el servidor de forma tal que parezca como si estuviéramos disparando un evento con JavaScript y no con una función PHP alojada en el servidor. Esto último se hace con Ajax (acceso asincrónico al servidor).

Este tipo de páginas resultan muy útiles y son lo último en desarrollo web (Web 2.0). Un proyecto Ajax puede resultar muy costoso y largo; pero con Xajax no es así.

XaJax te permite escribir funciones en PHP que pueden ser accedidas cuando ya la página ha estado enviada al navegador, cuando el usuario ha disparado un evento o la función PHP ha sido llamada desde JavaScript. Éstas funciones PHP modifican el contenido o el aspecto de la página, como lo podría hacer JavaScript, pero repito que se hacen desde PHP, lo que abre un abanico de posibilidades: PHP puede acceder a bases de datos, al sistema de archivos… Y todo sin recargar la página!!!

Descarga del .zip

Para instalar la librería xaJax, debes abrir el zip que acabamos de descargar de la web y lo descomprimimos conservando la estructura de las carpetas. Lo descomprimimos dentro de la carpeta donde tienes la web en el servidor local o remoto y debes cambiarle el nombre de la carpeta (normalmente el nombre xajax seguido del nombre de la versión) por solamente xajax.

A éste momento la última versión es xajax 0.2.5 (stable). El zip consta de tres scripts PHP: xajax.inc.php, que contiene la clase xajax, xajaxResponse.inc.php, que contiene la clase xajaxResponse, y xajaxCompress.php, que es una utilidad para, de cierta manera, reducir el peso de un archivo JavaScript. Contiene también, en la carpeta xajax_js, dos archivos .js; uno que contiene el código original (el xajax_uncompressed.js) y otro que es el que está comprimido y es el que se usa para enviar al navegador (el xajax.js). Además de eso, también incorpora dos archivos .txt (la licencia y el readme) y dos carpetas más (examples, con ejemplos de utilización y tests, donde puedes probar xaJax).

Funcionamiento

Lo único que hay que hacer es escribir un require (‘xajax/xajax.inc.php’) en el archivo por defecto (index.php, por ejemplo). Obviamente, este archivo index.php está en la carpeta de nuestra web en el servidor, en donde has descomprimido el zip que ahora se ve como una carpeta de nombre “xajax”, repito.

Como he dicho antes, xaJax permitirá a una función JavaScript recibir una respuesta de una función del servidor. Dicha respuesta estará en formato XML (como es habitual en AJaX) y será interpretada por la misma función JavaScript que realizará los cambios en la página que se le piden.

El objeto xajaxResponse contiene la respuesta que realiza la función PHP y el objeto xajax es el que recibe las peticiones de que se ejecuten las funciones, el que las gestiona, al igual que todas las respuestas, y el que envia las respuestas en XML de vuelta al navegador.

Por lo tanto, se puede distinguir dos partes en una página basada en xaJax: una parte es todo el código php que contiene las funciones y los objetos xajax y xajaxResponse (además de todo el código necesario para que la web tenga un entorno dinámico) y otra parte que sería todo lo que se ejecuta en el navegador.

Bueno, basta de preliminares y vamos directamente a los hechos…

El ejemplo que a continuación les muestro, es muy sencillo. Es sólo para explicar el funcionamiento de la clase xajax. Con un poco de imaginación y de acuerdo a sus necesidades, uds. podrás complicarlo todo lo necesario de acuerdo a sus necesidades. Aquí los pasos:

1) Incluir con PHP el archivo donde está la clase xajax

//incluímos la clase ajax
require (‘xajax/xajax.inc.php’);

2) Creamos una instancia de un objeto de la clase xajax

//instanciamos el objeto de la clase xajax
$xajax = new xajax();

3) Escribimos una función en PHP, que luego llamaremos por medio de ajax

Esta función es todo lo complicado que se requiera. Realizará acciones del lado del servidor y por tanto puede acceder a bases de datos, abrir ficheros o cualquier cosa que se nos ocurra. Luego en la propia función realizaremos una instancia de un objeto AjaxResponse, que utilizaremos para mostrar resultados en la página.

function si_no($entrada){
if ($entrada==”true”){
$salida = “Marcado”;
}else{
$salida = “No marcado”;
}

//instanciamos el objeto para generar la respuesta con ajax
$respuesta = new xajaxResponse();
//escribimos en la capa con id=”respuesta” el texto que aparece en $salida
$respuesta->addAssign(“respuesta”,”innerHTML”,$salida);

//tenemos que devolver la instanciación del objeto xajaxResponse
return $respuesta;
}

El objeto xajaxResponse() se encarga de realizar acciones en la página sin tener que recargar el documento, en otras palabras, sin que veamos el refresh. Posee varios métodos o funciones. Uno de ellos es addAssign() que sirve para asignar un valor a una propiedad de un elemento HTML de la página. En este caso se asigna el valor contenido en la variable $salida al innerHTML de la capa “respuesta”, con lo que se cambia el contenido en esa capa.

4) Asociamos la función PHP al objeto xajax

//asociamos la función creada anteriormente al objeto xajax
$xajax->registerFunction(“si_no”);

Esta asociación permite ejecutar la función PHP desde una llamada a una función Javascript.

5) Antes de enviar cualquier contenido a la página, tenemos que ejecutar un método del objeto xajax para procesar las peticiones del que puedan llegar a la página.

//El objeto xajax tiene que procesar cualquier petición
$xajax->processRequests();

Es importante tener en cuenta que esta llamada al método se tiene que hacer antes de escribir algún contenido HTML dentro del código de la página, es decir, antes de que llegue al cliente algún caracter de código HTML.

6) Luego hacemos que la clase xajax escriba todo el códogo javascript necesario para procesar las llamadas a ajax.

//En el <head> indicamos al objeto xajax se encargue de generar el javascript necesario
$xajax->printJavascript(“xajax/”);

Lo ideal es hacer esta llamada al método printJavascript() dentro del <head> de la página.

Si nos fijamos, el método recibe un parámetro, que es la ruta relativa para acceder al directorio donde están los archivos xajax descomprimidos.

7) Podemos hacer llamadas a las funciones PHP en cualquier lugar del código, como respuesta a las acciones del usuario con javascript.

<input type=”checkbox” name=”si” value=”1″ onclick=”xajax_si_no(document.formulario.si.checked)”>
Como podemos ver, desde un elemento de la página, como en este caso una casilla de verificación, al cambiar su estado, se llama a una función javascript que ejecuta una función PHP escrita anteriormente. Es decir, al pulsar el chechbox se desencadena el evento onchange y con él se llama a la función xajax_si_no() enviándo como parámetro el estado (chequeado o no) de la casilla de verificación.

Pueden ver el código del ejemplo completo a continuación, pero hay que tener en cuenta que para que funcione tienen que disponer del código de la clase xajax, que en este caso debe estar en un subdirectorio que cuelgue del directorio donde está el archivo del ejemplo (por ejemplo index.php).

<?
//incluímos la clase ajax
require (‘xajax/xajax.inc.php’);

//instanciamos el objeto de la clase xajax
$xajax = new xajax();

function si_no($entrada){
if ($entrada==”true”){
$salida = “Marcado”;
}else{
$salida = “No marcado”;
}

//instanciamos el objeto para generar la respuesta con ajax
$respuesta = new xajaxResponse();
//escribimos en la capa con id=”respuesta” el texto que aparece en $salida
$respuesta->addAssign(“respuesta”,”innerHTML”,$salida);

//tenemos que devolver la instanciación del objeto xajaxResponse
return $respuesta;
}

//asociamos la función creada anteriormente al objeto xajax
$xajax->registerFunction(“si_no”);

//El objeto xajax tiene que procesar cualquier petición
$xajax->processRequests();
?>

<html>
<head>
<!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Transitional//EN” “http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd”>
<META HTTP-EQUIV=”Content-Type” CONTENT=”text/html;charset=ISO-8859-1″>
<title>Si / No en Ajax</title>
<?
//En el <head> indicamos al objeto xajax se encargue de generar el javascript necesario
$xajax->printJavascript(“xajax/”);
?>
</head>

<body>
<div id=”respuesta”></div>
<form name=”formulario”>
<input type=”checkbox” name=”si” value=”1″ onclick=”xajax_si_no(document.formulario.si.checked)”>
</form>

<script type=”text/javascript”>
xajax_si_no(document.formulario.si.checked); //Llamando inicialmente a la función xajax_si_no inicializamos el valor de la capa con la respuesta
</script>
</body>
</html>

Para escribir éste post me basé en un artículo publicado en www.desarrolloweb.com y en el libro “AJAX WEB 2.0 La guia total del desarrollador”, de Francisco Minera, Ed. MPEdiciones – 2007


Hola amigos, acá estoy de vuelta luego de algo más de un mes. Mis excusas son las habituales de todo el mundo: mucho trabajo.

palm

Esta vez les deseo comentar que he comprado una Palm TUNGSTEN E2. Recién estoy descubriéndole algunas cosas y la verdad es que la compré sólo con un sólo objetivo: programar en J2ME y ver que se puede hacer con un juguete como éste.

Lo primero que hice una vez que la tuve en mis manos, fué hacer algo que leí en un post por ahí: instalarle un simulador de HP48GX a mi palm. La HP48GX, es una muy potente calculadora de mano fabricada por la Hewlet Packard y, en mi modesta opinión, es una opción que todavía no ha sido superada a pezar de que son calculadoras que ya tienen algo más de 15 años en el mercado.

power48_480.gif

La cosa resultó muy bien y aquí les dejo algunas conclusiones de mi experiencia:

El programa que hace de simulador es el Power48 que es un emulador que nos permite tener ésta y otras avanzadas calculadoras en la Palm (HP 48SX, 48GX y 49G) . Se trata de software libre y gratuito, basado en un proyecto anterior llamado Emu48, que corría bajo Windows y PocketPC. Se ejecuta en una Palm, con sistema operativo PalmOS 5, pantalla de color de 16 bits con una resolución mínima de 320×320, procesador ARM y 16Mb de memoria interna.

Este emulador por sí sólo no basta, es como si sólo se tratase de una interface gráfica que hace que la pantalla de nuestra palm se vea como una de las mencionadas calculadoras HP. Necesitamos además las ROM de éstas calculadoras. Son éstas las que hacen que el emulador se comporte tal cual como lo hacen éstos juguetitos en la realidad. Por motivos de copyright no se incluyen con el Power48, pero HP deja disponer de éstas siempre que sea sin ánimo de lucro.

La instalación no tiene ningún problema:

  • Primero debemos bajar el emulador y descomprimirlo en un directorio de nuestro disco duro. Por ejemplo en “C:\Power48″.
  • Descargamos la ROM de la o las calculadoras que queramos emular. Están disponibles libremente en la página de HPCalc, y éstos son sus enlaces:
  • Descomprimimos las ROMS en el directorio donde pusimos el Power48 (en nuestro caso “C:\Power48″). Ahora abrimos una ventana de comandos de Windows (“Menú inicio->Accesorios->Símbolo del sistema”) y hacemos lo siguiente:
    • Entramos en ese directorio. Por ejemplo “cd C:\Power48″ .
    • Convertimos las ROMS que hemos descomprimido aquí, a un formato que entienda el Power48. Para ello usamos la utilidad p48rc que acompaña al emulador. La sintaxis es “p48rc archivo-origen destino”. Destino puede ser “CARD” (es necesario en mayúsculas) si pensamos guardar las ROMS en nuestra tarjeta SD (recomendable), o “INTERNAL”, si van a guardarse en la memoria principal de la Palm. Por ejemplo, para convertir las tres ROMs, y copiarlas luego a la tarjeta SD, se haría con las siguientes órdenes:

      p48rc.exe sxrom-j CARD
      p48rc.exe gxrom-r CARD
      p48rc.exe rom.49g CARD

    • En ese directorio aparecerán tres archivos terminados en .p48rom. Son los que nos interesan.
    • Instalamos el Power48 como haríamos con cualquier otro programa.
    • Y finalmente transferimos las ROM ya modificadas haciendo un hotsync a la palm.

Listo, nuestra palm ya estará transformada en una maravillosa calculadora HP.

Algunos de ustedes se preguntarán: ¿Cómo hago para cargar mis programas hechos para HP que tengo en mi computadora al emulador de la HP48G de la Palm? muy simple:

Generalmente escribo los programas con un editor para calculadoras HP como puede ser el HPUserEdit 4. Este editor guarda los scripts con extensión “.hpe” En nuestro caso podemos tener un archivo “dummy.hpe” cuya contenido podría ser trivial:


«
40 'A' STO 60 'B' STO A B + EVAL
»

A éste archivo “dummy.hpe” debemos transformarlo a un formato transferible por hotsync mediante el ejecutable h48obj según la siguiente sintaxis:

p48obj dummy.hpe INTERNAL

Se generará un archivo para Palm y será éste el que debemos mandar via hotsync a nuestra palm. ¿Cómo se hace para hacer que el emulador lo cargue? también es muy simple: sobre la base de la pantalla de la calculadora a un lado, se encuantra una flecha doble (<->) (ver imágen de la calculadora más arriba). Haciendo click con el puntero en esa flecha doble, aparecerá una panralla como la siguiente:

sshot-5.png

En la pestaña LOAD aparecerá nuestro archivo “dummy.hpe”. Con sólo seleccionarlo con el puntero y dando OK, el programa se mostrará en el STACK de nuestra HP simulada.

¿Y si escribo un progama en el emulador? ¿Cómo hago para pasarlo a la computadora? También la solución es simple:

Al programa escrito lo debemos colocar en el STACK del emulador. Luego, en la pestaña SAVE (ver la última imagen de más arriba), se nos preguntará con que nombre queremos guardar éste último programa, por ejemplo “object-prueba”. Haciendo hotsync, el programita se copiará en “C:\Archivos de programa\palmOne\usuario\Backup” y dirigiéndonos a esa carpeta podremos ver el archivo “object-prueba” ya guardado en nuestra PC.

Y eso es todo!

En la página http://www.hpcalc.org/ se puede encontrar mucha información acerca de estas calculadoras, como por ejemplo el manual de instrucciones. Y en la del Power48 se explica cómo usar el emulador.

Que lo disfruten!


En esta segunda y última parte, les mostraré en que consisten los archivos login.php, autenticacion.php, aplicacion.php y un cuarto archivo salir.php

El primer archivo, login.php, es bastante simple. Sólo se trata de un simple condicional que verifica la existencia o no de una variable al principio del script que, dependiendo del resultado, muestra un texto de advertencia en un color o en otro. La última parte del script es un formulario que al introducir los datos redirigirá la página a autenticacion.php.

login.php

<html>
<head>
<title>Autenticación PHP</title>
</head>
<body>
<h1>Formulario de autenticación</h1>
<?if ($_GET["errorusuario"]=="si"){?>
<font color="red"><b>Datos incorrectos</b></font>
<?}else{?>
Introduce tu nombre de usuario y contraseña
<?}?>
<form action="autenticacion.php" method="POST">
<table border="0">
<tr><td>Nombre de usuario:</td><td><input name="usuario" size="25" value=""/></td></tr>
<tr><td>Contraseña:</td><td><input name="contrasena" size="25" type="password"/></td></tr>
<tr><td/><td><input type="submit" value="Inicio de sesión"/></td></tr>
</table>
</form>
Para ingresar, debés ingresar <b>usuario</b> en el 1er campo y <b>123</b> en el 2do.
</body>
</html>

El otro archivo es el autenticacion.php. Es también bastante simple.

autenticacion.php

<?
//vemos si el usuario y contraseña son válidos
if ($_POST["usuario"]=="usuario" && $_POST["contrasena"]=="123"){
//usuario y contraseña válidos
//se define una sesion y se guarda el dato session_start();
$_SESSION["autenticado"]= "SI";
header ("Location: aplicacion.php");
}else {
//si no existe se va a login.php
header("Location: login.php?errorusuario=si");
}
?>

Como habrán visto, se hace uso de sesiones para manejar una variable que se utilizará para indicar si el usuario se logeó en forma exitosa o no.

En estos scripts no trabajo con una base de datos para no alargar demasiado este post, pero lo que aquí sí interesa es la recuperación de las variables de usuario y la clave correctas para compararlas con las que se ingresan desde el formulario. Aquí directamente comparamos los campos ingresados del formulario con dos variables ya definidas.

En caso de ingresar los datos correctos, se crea una variable de sesion (autenticado -que será leída más tarde desde los scripts de la aplicación segura-) y se redirigirá la página a aplicacion.php. En caso de ingresar datos incorrectos, no se crea esa variable de sesion y se pasa una variable de error a login.php que sirve para mostrar en pantalla que ingresamos mal los datos.

Antes de mostrar aplicacion.php, voy a mostrarles en que consiste el bloque de seguridad que estará dentro de aplicacion.php en forma de un include.

bloqueDeSeguridad.php

<?
//Inicio la sesión
session_start();
//COMPRUEBA QUE EL USUARIO ESTA AUTENTICADO
if ($_SESSION["autenticado"] != "SI") {
//si no existe, va a la página de autenticacion
header("Location: login.php");
//salimos de este script
exit();
}
?>

En ésta parte sólo se verifica que exista la variable de sesion (autenticado). Si existe no hace nada y continúa, y si no existe, redirige la página a login.php

Ahora pasamos a ver el script aplicacion.php. Este contiene el bloque de seguridad al principio, de tal manera de que sea lo primero que se ejecute en el script… El contenido de la aplicación segura es trivial.

aplicacion.php

<?include ("bloqueDeSeguridad.php");?>
<html>
<head>
<title>Aplicación segura</title>
</head>
<body>
<h1>Ahora estás en una aplicación segura</h1>
<br>
<br>
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
<br>
<br>
<br>
<a href="salir.php">Hacé click aquí para salir</a>
</body>
</html>

Es interesante comprobar que pasa si se tipea en el browser directamente aplicacion.php. Podremos comprobar que no accede a la misma. Esto es porque en este script, al princio está el bloque de seguridad que, al no ver la variable de sesion porque no existe o porque si existe su valor es incorrecto, en vez de continuar con el script de aplicacion.php, corta todo ahí mismo y redirige a login.php

Por último para salir de la sesion, es decir para destruir la variable de sesion, se puede hacer clik en salir.php. La razón por la que podríamos desear destruir esa variable es que no quisiéramos que algún intruso aproveche el descuido de un usuario válido, que al retirarse momentáneamente de su computadora, aquél utilice ésa misma computadora para acceder a contenidos seguros.

salir.php

<?
session_start();
session_destroy();
?>
<html>
<head>
<title>Contenido no seguro</title>
</head>
<body>
Ahora estás fuera de la aplicación segura.
<br>
<br>
<a href="login.php">Autenticar usuario</a>
</body>
</html>

Eso es todo.

Se debe saber que la forma en se implementó este sistema de seguridad es bastante discutible. Por ejemplo, la variable de sesion (autenticado) es bastante simple de “adivinar” y por lo tanto, tendríamos que crear una variable de sesion con un nombre un poco mas complejo, como ser “HjkrTS3986Yg444aASds”.

Ver el ejemplo funcionando


La validación o la también llamada autenticación de usuarios, es un problema clásico, que tarde o temprano, tenemos que utilizar en una página web. Hoy creo que casi no existe ninguna página que no incluya una validación de usuarios.

Existen varias formas de realizar una autenticación. Algunas son realmente simples aunque fallan en que no se consideran aspectos básicos de seguridad. Hay otras que consideran a la seguridad como la razón de ser de una validación (lo cual es obvio) y, por lo tanto, son mucho más complejas. La solución que aquí trato es bastante simple y sí considera aspectos básicos de seguridad, aunque no podría implementarse en un sistema de e-commerce porque no sería muy “seguro”, aunque el ejemplo sirve para entender la problemática.

Les aclaro a todos que ésta solución es prácticamente igual a muchas publicadas en varios sitios de la red, uno de ellos es: www.desarrolloweb.com

El concepto es el siguiente:

El usuario ingresa a una página, que podemos llamar login.php e ingresa un usuario y una clave o password. Una vez cargado éstos dos datos vamos a una segunda página, autenticacion.php y allí comprobamos que el usuario ingresado corresponda con la clave ingresada. Esta última página, no se muestra en pantalla, sólo sirve para comprobar que se ingresaron el usuario y la clave correctas. Si la comprobación es errónea salta a la primera página que vimos, login.php para que se ingresen nuevamente. Si es correcta la autenticación, salta a una tercera página, aplicacion.php que será una cualquiera con contenido de nuestro sitio. Esta última contendrá un bloque de seguridad que sirve para comprobar que el usuario pasó por login.php y por autenticacion.php y ya hizo una comprobación exitosa porque no queremos que alguien ingrese directamente a aplicacion.php y tenga, en forma directa, acceso a todo nuestro contenido…

La figura siguiente, explica un poco el concepto detrás de todo esto.

autenticacion.jpg

En el próximo post, les mostraré los scripts de éstos tres archivos.


Estos dos videos ya tienen algún tiempo pero son muy interesantes para conocer la filosofía del software libre.

Con respecto a éste tema, no tengo todavía una posición tomada: Sin ánimo de parecer simplista, no me parece aceptable patentar software. Si yo patento que 2+2 es 4, pués de ahora en más, todos los que sumen 2+2 y tengan como resultado 4, me tendrán que pagar derechos…… Por otro lado, me parece justo exigir un pago por el esfuerzo que supone desarrollar un software, pues el desarrollador invirtió en la obtención de ese conocimiento, le dedicó tiempo y muchas veces es su modo de ganarse la vida, por lo tanto sí es justo cobrar por ello, de la misma manera que es justo pagar por el conocimiento y la experiencia de un abogado o la de un arquitecto.

Aquí Stallman habla sobre las licencias, la historia del software libre y sobre ética en la trasmición del conocimiento, en este caso software.


Para aquellos que no sepan cómo se hace, acá les muestro qué hay que hacer para pegar un video de Youtube en nuestro blog de wordPress.com:

1.- Localizar en la página de YouTube, el video que deseamos pegar en nuestro blog.

2.- Seleccionar la caja de texto que se encuentra junto a la palabra URL:

sshot-3.png

3.- Copiar el texto en el portapapeles (CONTROL + C), en nuestro caso, el texto sería:

http://www.youtube.com/watch?v=D1R-jKKp3NA

4.- En el editor de texto de la entrada, tipeamos el siguiente texto:

[ youtube=(pegar aqui)]

Nota: hay que borrar el espacio entre “[" y "youtube". Debe quedar "[youtube...". Aquí no lo hago porque el editor de WordPress me mostraría el efecto de esta acción y no el código.

5.- Reemplazar el "(pegar aqui)" sin las comillasdel punto anterior, por el link que acabamos de copiar al portapapeles desde YouTube. Queda algo así:

[ youtube=http://www.youtube.com/watch?v=D1R-jKKp3NA]

6.- Guardar la entrada…..y listo! ya está! Ahora deberías poder ver tu video pegado en tu post de WordPress.


Este es un video que encontré leyendo algunos blogs. Es una ceremonia de egreso de universitarios (de Stanford, nada más). Es muy estimulante el mensaje.

Stanford Report, June 14, 2005 ‘You’ve got to find what you love,’ Jobs says
This is the text of the Commencement address by Steve Jobs, CEO of Apple Computer and of Pixar Animation Studios, delivered on June 12, 2005.

I am honored to be with you today at your commencement from one of the finest universities in the world. I never graduated from college. Truth be told, this is the closest I’ve ever gotten to a college graduation. Today I want to tell you three stories from my life. That’s it. No big deal. Just three stories.

The first story is about connecting the dots.

I dropped out of Reed College after the first 6 months, but then stayed around as a drop-in for another 18 months or so before I really quit. So why did I drop out?

It started before I was born. My biological mother was a young, unwed college graduate student, and she decided to put me up for adoption. She felt very strongly that I should be adopted by college graduates, so everything was all set for me to be adopted at birth by a lawyer and his wife. Except that when I popped out they decided at the last minute that they really wanted a girl. So my parents, who were on a waiting list, got a call in the middle of the night asking: “We have an unexpected baby boy; do you want him?” They said: “Of course.” My biological mother later found out that my mother had never graduated from college and that my father had never graduated from high school. She refused to sign the final adoption papers. She only relented a few months later when my parents promised that I would someday go to college.

And 17 years later I did go to college. But I naively chose a college that was almost as expensive as Stanford, and all of my working-class parents’ savings were being spent on my college tuition. After six months, I couldn’t see the value in it. I had no idea what I wanted to do with my life and no idea how college was going to help me figure it out. And here I was spending all of the money my parents had saved their entire life. So I decided to drop out and trust that it would all work out OK. It was pretty scary at the time, but looking back it was one of the best decisions I ever made. The minute I dropped out I could stop taking the required classes that didn’t interest me, and begin dropping in on the ones that looked interesting.

It wasn’t all romantic. I didn’t have a dorm room, so I slept on the floor in friends’ rooms, I returned coke bottles for the 5¢ deposits to buy food with, and I would walk the 7 miles across town every Sunday night to get one good meal a week at the Hare Krishna temple. I loved it. And much of what I stumbled into by following my curiosity and intuition turned out to be priceless later on. Let me give you one example:

Reed College at that time offered perhaps the best calligraphy instruction in the country. Throughout the campus every poster, every label on every drawer, was beautifully hand calligraphed. Because I had dropped out and didn’t have to take the normal classes, I decided to take a calligraphy class to learn how to do this. I learned about serif and san serif typefaces, about varying the amount of space between different letter combinations, about what makes great typography great. It was beautiful, historical, artistically subtle in a way that science can’t capture, and I found it fascinating.

None of this had even a hope of any practical application in my life. But ten years later, when we were designing the first Macintosh computer, it all came back to me. And we designed it all into the Mac. It was the first computer with beautiful typography. If I had never dropped in on that single course in college, the Mac would have never had multiple typefaces or proportionally spaced fonts. And since Windows just copied the Mac, its likely that no personal computer would have them. If I had never dropped out, I would have never dropped in on this calligraphy class, and personal computers might not have the wonderful typography that they do. Of course it was impossible to connect the dots looking forward when I was in college. But it was very, very clear looking backwards ten years later.

Again, you can’t connect the dots looking forward; you can only connect them looking backwards. So you have to trust that the dots will somehow connect in your future. You have to trust in something — your gut, destiny, life, karma, whatever. This approach has never let me down, and it has made all the difference in my life.

My second story is about love and loss.

I was lucky — I found what I loved to do early in life. Woz and I started Apple in my parents garage when I was 20. We worked hard, and in 10 years Apple had grown from just the two of us in a garage into a $2 billion company with over 4000 employees. We had just released our finest creation — the Macintosh — a year earlier, and I had just turned 30. And then I got fired. How can you get fired from a company you started? Well, as Apple grew we hired someone who I thought was very talented to run the company with me, and for the first year or so things went well. But then our visions of the future began to diverge and eventually we had a falling out. When we did, our Board of Directors sided with him. So at 30 I was out. And very publicly out. What had been the focus of my entire adult life was gone, and it was devastating.

I really didn’t know what to do for a few months. I felt that I had let the previous generation of entrepreneurs down – that I had dropped the baton as it was being passed to me. I met with David Packard and Bob Noyce and tried to apologize for screwing up so badly. I was a very public failure, and I even thought about running away from the valley. But something slowly began to dawn on me — I still loved what I did. The turn of events at Apple had not changed that one bit. I had been rejected, but I was still in love. And so I decided to start over.

I didn’t see it then, but it turned out that getting fired from Apple was the best thing that could have ever happened to me. The heaviness of being successful was replaced by the lightness of being a beginner again, less sure about everything. It freed me to enter one of the most creative periods of my life.

During the next five years, I started a company named NeXT, another company named Pixar, and fell in love with an amazing woman who would become my wife. Pixar went on to create the worlds first computer animated feature film, Toy Story, and is now the most successful animation studio in the world. In a remarkable turn of events, Apple bought NeXT, I returned to Apple, and the technology we developed at NeXT is at the heart of Apple’s current renaissance. And Laurene and I have a wonderful family together.

I’m pretty sure none of this would have happened if I hadn’t been fired from Apple. It was awful tasting medicine, but I guess the patient needed it. Sometimes life hits you in the head with a brick. Don’t lose faith. I’m convinced that the only thing that kept me going was that I loved what I did. You’ve got to find what you love. And that is as true for your work as it is for your lovers. Your work is going to fill a large part of your life, and the only way to be truly satisfied is to do what you believe is great work. And the only way to do great work is to love what you do. If you haven’t found it yet, keep looking. Don’t settle. As with all matters of the heart, you’ll know when you find it. And, like any great relationship, it just gets better and better as the years roll on. So keep looking until you find it. Don’t settle.

My third story is about death.

When I was 17, I read a quote that went something like: “If you live each day as if it was your last, someday you’ll most certainly be right.” It made an impression on me, and since then, for the past 33 years, I have looked in the mirror every morning and asked myself: “If today were the last day of my life, would I want to do what I am about to do today?” And whenever the answer has been “No” for too many days in a row, I know I need to change something.

Remembering that I’ll be dead soon is the most important tool I’ve ever encountered to help me make the big choices in life. Because almost everything — all external expectations, all pride, all fear of embarrassment or failure – these things just fall away in the face of death, leaving only what is truly important. Remembering that you are going to die is the best way I know to avoid the trap of thinking you have something to lose. You are already naked. There is no reason not to follow your heart.

About a year ago I was diagnosed with cancer. I had a scan at 7:30 in the morning, and it clearly showed a tumor on my pancreas. I didn’t even know what a pancreas was. The doctors told me this was almost certainly a type of cancer that is incurable, and that I should expect to live no longer than three to six months. My doctor advised me to go home and get my affairs in order, which is doctor’s code for prepare to die. It means to try to tell your kids everything you thought you’d have the next 10 years to tell them in just a few months. It means to make sure everything is buttoned up so that it will be as easy as possible for your family. It means to say your goodbyes.

I lived with that diagnosis all day. Later that evening I had a biopsy, where they stuck an endoscope down my throat, through my stomach and into my intestines, put a needle into my pancreas and got a few cells from the tumor. I was sedated, but my wife, who was there, told me that when they viewed the cells under a microscope the doctors started crying because it turned out to be a very rare form of pancreatic cancer that is curable with surgery. I had the surgery and I’m fine now.

This was the closest I’ve been to facing death, and I hope its the closest I get for a few more decades. Having lived through it, I can now say this to you with a bit more certainty than when death was a useful but purely intellectual concept:

No one wants to die. Even people who want to go to heaven don’t want to die to get there. And yet death is the destination we all share. No one has ever escaped it. And that is as it should be, because Death is very likely the single best invention of Life. It is Life’s change agent. It clears out the old to make way for the new. Right now the new is you, but someday not too long from now, you will gradually become the old and be cleared away. Sorry to be so dramatic, but it is quite true.

Your time is limited, so don’t waste it living someone else’s life. Don’t be trapped by dogma — which is living with the results of other people’s thinking. Don’t let the noise of others’ opinions drown out your own inner voice. And most important, have the courage to follow your heart and intuition. They somehow already know what you truly want to become. Everything else is secondary.

When I was young, there was an amazing publication called The Whole Earth Catalog, which was one of the bibles of my generation. It was created by a fellow named Stewart Brand not far from here in Menlo Park, and he brought it to life with his poetic touch. This was in the late 1960’s, before personal computers and desktop publishing, so it was all made with typewriters, scissors, and polaroid cameras. It was sort of like Google in paperback form, 35 years before Google came along: it was idealistic, and overflowing with neat tools and great notions.

Stewart and his team put out several issues of The Whole Earth Catalog, and then when it had run its course, they put out a final issue. It was the mid-1970s, and I was your age. On the back cover of their final issue was a photograph of an early morning country road, the kind you might find yourself hitchhiking on if you were so adventurous. Beneath it were the words: “Stay Hungry. Stay Foolish.” It was their farewell message as they signed off. Stay Hungry. Stay Foolish. And I have always wished that for myself. And now, as you graduate to begin anew, I wish that for you.

Stay Hungry. Stay Foolish.

Thank you all very much.


Otro servidor web disponible es wamp5. La version actual es wamp5 1.6.6 Se destaca, al igual que el anterior, por su facilidad de uso y fácil instalación.

Wamp5 instala Apache 2.0.59, PHP 5.2.0, SQLitemanager, MySQL 5.0.27 yPhpmyadmin.

Descargaremos wmp5 y la instalaremos siguiendo las instrucciones del asistente (wamp5 se descarga como un archivo exe). Durante el proceso de instalación, todos los archivos se cargarán en el directorio que especifiquemos en el asistente, incluída la carpeta “www“, que será el directorio donde colocaremos nuestros sitios.

Una vez finalizada la instalación, veremos que el instalador colocó un ícono en el escritorio (en windows, claro), hacemos click ahí y a continuación aparecerá otro ícono en el tray que servirá como administrador de servicios.

wamp5.gif

El color del ícono en el tray indica el estado del servidor.

wamp5_tray.gif

Si deseamos desinstalar wamp5, seleccionamos desinstalar en el administrador de servicios y se borrarán todos los archivos y carpetas dentro del directorio de wamp5 (o el que indicamos en el momento de la instalación).


VertigoServ es un programa que nos instala de una sola vez las siguientes componentes:

* Apache
* PHP5
* MySQL
* SQLite
* PhpMyAdmin
* ZendOptimizer
* SQLiteManager

Una vez descargado el archivo, la instalación es realmente muy simple: al principio el asistente nos preguntará en que idioma queremos la palicación. Luego nos dará la bienvenida y nos mostrará la licencia del software. A continuación nos preguntará si queremos un acceso directo en el escritorio y en que lugar de nuestro disco se instalará. Aquí es recomendable aceptar la ruta que la aplicación sigue por defecto. Aceptamos… y listo!! Por último el asistente termina preguntándonos si queremos abrir Vertrigo o cerrar sin abrirlo.

0_vertrigo1.gifPara trabajar con el servidor, también los pasos a seguir son muy simples: si aceptamos colocar un acceso directo de VertrigoServ en nuestro escritorio, lo seleccionamos y nos aparecerá una ventana que nos informará que nuestro servidor web está ejecutándose. Para cerrar esa ventana, clickeamos en “Hide this windows and start server” (ver la primera figura de éste artículo). Luego, en la barra de tray (en la esquina inferior derecha de nuestra pantalla), aparecerá un pequeño ícono del servidor. Hacenos click allí y se abrira el menu del servidor (ver la segunda figura de éste artículo). Sólo basta con seleccionar las opciones con las que deseamos trabajar.

vertrigo1.jpgEn el menú, podemos iniciar o detener el servidor desde la opción “Server”. Desde la opción “WWW folder”, accedemos a la carpeta en donde instalaremos nuestra página y desde la opción “Shutdown and exit” finalizamos la aplicación -las otras opciones del menú son también muy simples y se las dejo par satisfacer al investigador que llevan dentro de ustedes :) -.

En el próximo artículo les hablaré de otro servidor web de características similares a las de VertrigoServ, y también muy simple de instalar y trabajar.


Escribir código para un sitio web demanda conocer en profundidad un determinado lenguaje de programación (aquí hablo de PHP). Personalmente tuve que leer bastante para poder escribir mi primera página. Mientras lo hacía ya se veía que sólo con scripts PHP no me alcanzaba para que mi página tuviera la misma “imagen” que las otras que vemos habitualmente en internet. Ahí descubrí CSS. También descubrí que para manejar distintos aspectos de un formulario, necesitaba escribir código en JavaScript porque éste me solucionaba aspectos que PHP no manejaba. ¡Ni que hablar para acceder desde el código de mi página a una base de datos!… necesitaba conocer SQL…etc, etc, etc. Lo anterior demuestra que para escribir el código de una página web mas o menos aceptable desde el punto de vista de la usabilidad y que le sirva al que la necesita, tenemos que conocer mínimamente algo de todas éstas tecnologías a la vez, además de considerar también el tiempo que se necesita para escribirla.

Los CMS (Content management system) o sistemas de gestión de contenidos, vienen a solucionar ésta problemática, pues escriben automáticamente el código de una página “tipo” y personalisamos su contenido, generalmente, seleccionando e ingresando información desde unos formularios, todo esto sin escribir código.

Más adelante detallaré algunos de éstos CMS, pero basta sólo con nombrar algunos: PHPNuke, Joomla!, Drupal, WordPress, etc. También existen, por ejemplo un Administrador de proyectos ActiveCollab y un sistema CRM SugarCRM. Estos son gratuitos, es decir que con sólo bajar estos archivos desde sus páginas en internet, podemos disponer de nuestra propia página sin haber escrito nada de código y sin haber pagado ni un sólo peso… ;) (luego de haberlos instalado, configurado y alojado en un servidor, claro).

phpnuke_logo.jpg

joomla_logo.png

drupal_logo.png

wordpress_logo.jpg

activecollab.gif

sugarcrm_logo.jpg

Todos éstos CMS sólo se pueden correr en nuestro navegador si tenemos previamente instalado un “servidor web” en nuestra computadora. Si no tenemos un servidor instalado en nuestra máquina, el navegador no sabrá donde buscar la página ni cómo interpretar el código, etc.

Podemos necesitar un servidor web en nuestra computadora para testeos, o para que haga de servidor web en una intranet de una pequeña empresa o para que haga de servidor web y alojar la página corporativa de una empresa y sea vista desde internet.

apache_server1.jpgHay muchos programas, algunos pagos y otros gratuitos, que podemos usar para nuestro servidor web. Algunos de ellos son Apache e IIS . El primero es gratuito y el segundo es pago y es la empresa Microsoft.

Aparte de un servidor web, necesitamos instalar un “programa” que nos permita escribir código para que sea visto en una página web. Aquí también existen muchos de estos “programas”: PHP, ASP.NET, etc. Aquí tendría que aclarar que éstos dos que menciono son lenguajes que se ejecutan del lado del servidor, pero también hay otros que se ejecutan del lado del cliente tal como JavaScript, pero acá medio como que nos salimos del tema porque para ejecutar una página con código JavaScript no necesitamos un servidor web: sólo basta con escribir el código con cualquier editor de texto, guardarlo con formato “html” y abrirlo con cualquier navegador.

Una vez que tenemos instalado estos “programitas”, necesitamos instalar un motor de bases de datos, porque seguramente nuestra página necesitará trabajar con datos de nuestros clientes, o el stock, etc que se “guardan” en una base de datos. Aquí nuevamente hay muchas opciones: MySQL, MS SQL, DBase, Oracle, Sybase, etc.

En el caso de los CMS, puesto que son Open source o de código abierto, “prefieren” el trio PHP, MySQL y Apache.

Hay que aclarar que cada uno de estos “programitas”, se pueden instalar individualmente, o sea, por separado en nuestra computadora, seguramente los más puristas prefieran hacerlo de ésta última manera pués permiten una mayor presonalisación. Hace un tiempo atrás, instalar de a uno por vez éstos programas era un poco tedioso para gente no experimentada, pues necesitaban hacerce muchas configuraciones una vez instalados y para ver una página luego de haberla escrito, teníamos que inicializar cada uno de éstos servicios por separado.

Afortunadamente, desde hace algún tiempo existen programas que instalan estos tres elementos de una sóla vez y declarando sólo unos pocos pasos muy sencillos.

En el próximo artículo les escribiré sobre ellos.