26 Junio 2008

Meme: La portada de tu propio álbum

Por bote

Bueno, pues tenía mucho ya sin escribir… y eso que ya hace más de una semana que salí de vacaciones de la escuela… pero bueno, a ver si le doy buen ritmo este verano. Y para iniciar, aquí les traigo este meme que encontré en el blog de Tandro, donde se supone que de manera ficticia (obviamente) creamos la portada de un disco propio.

Las reglas son 3:

Y esta es mi portada:

mi portada

Afortunadamente me salió una imagen algo formal y no tonterías. Lo que nunca supe es qué diablos es Propaganda Due. Y por último, la frase que me tocó dice completa:

Sometimes the mind, for reasons we don’t necessarily understand, just decides to go to the store for a quart of milk.

Que traducida dice: A veces la mente, por razones que no necesariamente entendemos, decide simplemente ir a la tienda por un cuarto de leche. Otro WTF!

Escrito en Memes | 3 Comentarios

11 Junio 2008

Qué onda con la escuela

Por bote

Bueno pues tengo ya mucho que no escribo cosas de la escuela, desde que llevé matemáticas IV hace casi 2 años… así que como ya es final de semestre… y aunque no creo que sea interés de absolutamente nadie haré una pequeña reseña de las materias del semestre y cómo terminaron… por cierto, se trata del octavo semestre de ingeniería en sistemas computacionales.

  • Cultura empresarial

    ¡Asco de materia! después de administración, contabilidad y ética, esta es la peor materia que pueden dar a un alumno de ingeniería… en realidad no aprendí nada porque el maestro jamás dio una sola clase. Todas las clases fueron exposiciones de nosotros… Aburridísimo!

  • Sistemas operativos

    Por tradición jajaja, solo teniamos clases los martes y jueves, ya que el señor profesor nunca asistió los lunes y miercoles (hay que recordar que en la escuela nunca hay clases los viernes). Hubo que aprenderse de machete muchas diapositivas para pasar un examen parcial, para el otro, como abarcaba más diapositivas de estudio, convencimos al señor de que mejor nos dejara una tarea, fue así como nos dejó programar la solución a 2 problemas clásicos de concurrencia: El de los filósofos cenando, y el de Escritor-Lector, usando la técnica de semáforos y monitores respectivamente.

    Luego publicaré los códigos fuente de ambos hechos en Java para quien le interese.

  • Desarrollo de proyectos de software

    Jajaja me da risa recordar esta materia. El profesor desde el primer dia estableció los proyectos que desarrollariamos a lo largo del semestre, pero nunca los revisó hasta la última semana. Y como es costumbre del buen mexicano, nadie habia hecho nada. Se trata de proyectos para la misma escuela, todos en web.

    A ver si mañana termino el mio… que está bastante grandecito.

  • Inteligencia artificial

    Aquí ya por fin tenemos una clase más decente. La profesora experta en el área siempre intentó hacer una clase de calidad. Aunque hubo muchas cosillas que no salían como se esperaba, al final estuvo bien pues, ¡nunca hicimos exámenes!

  • Ingeniería de software

    Por la mecánica de la clase, esta materia fue de lo más aburrido. Aunque teniamos a uno de los mejores profesores de la escuela simple y sencillamente no encajaban el maestro y la materia. Era como tener a Einstein dando clases de medicina.

  • Métodos numéricos

    Esta matera es como de quinto semestre pero por hueva y otras razones sin peso, no la había cargado hasta ahora. Es como un review de todas las cinco matemáticas anteriores pero usando técnicas numéricas, bueno… mucho más fácil que las matemáticas de verdad.

Y es todo, hay materias que no son del semestre y también faltaron algunas que sí son pero no las cargué. En este momento ya tengo pasadas 3, me faltan las calificaciones de Inteligencia artificial, Ingeniería de software y Desarrollo. Pero todas son pan comido.

Y después de un largo semestre (trimestre en realidad) por fin podré tener unas vacaciones donde conoceré algunos lugares del sur del país, entre ellos Morelia de donde seguramente me leerá mi compra Michoacano!

Un saludo!

Escrito en Personal | 2 Comentarios

15 Febrero 2008

Busy blogger

Por bote

Quiero ofrecer una disculpa por tanto tiempo sin actualizar… He tenido una agenda muy apretada ultimamente, voy a clases toda la mañana y despues voy al trabajo donde tengo bajo mi cargo a 4 individuos a quienes hay que capacitar intensivamente en tecnologías de desarrollo web, entre ellas PHP5, XHTML 1.0 Strict, XML, Feeds RSS, Javascript, DOM, CSS y Adobe AIR. A eso hay que añadir que a 3 los voy a enfocar al uso del framework CakePHP mientras que uno de ellos junto conmigo nos enfocaremos a usar el Zend Framework.

Debo confesar que he aprendido bastante al enseñarles lo que conozco. Así que dentro de poco este blog será más de tutorías y técnicas de desarrollo web y un poco menos cultural.

Un saludo!

Escrito en Microplagio | 3 Comentarios

12 Diciembre 2007

Cómo modificar documentos XML con PHP

Por bote

Bien, después de haberme atrasado casi un mes y en vista de que es un tema difícil de encontrar en la red, voy a hacer un microtutorial sobre cómo modificar un documento XML usando PHP5. Ya vimos cómo hacer un parsing a un documento XML usando la extensión que provee PHP5 llamada SimpleXMLElement. Ahora veremos primero cómo modificar elementos de nuestro XML, estamos hablando de agregar o eliminar elementos.

Cómo agregar elementos, hijos y atributos

Hasta PHP 5.1.3 la extensión SimpleXMLElement no tenía forma de agregar elementos a un documento XML. Sólo era posible modificar los valores de elementos o atributos pero para agregar nuevos era necesario exportar el objeto SimpleXMLElement a DOM, hacer los cambios y exportar de nuevo a SimpleXMLElement, lo cual era una tarea complicada. Pero la versión 5.1.3 introdujo dos nuevos métodos que nos dan el poder de modificar el documento XML. Me refiero a los métodos:

SimpleXMLElement::addChild()
SimpleXMLElement::addAttribute()

El nombre lo dice todo, con el primero agregamos un elemento hijo al elemento en el que nos encontramos y con el segundo agregamos un atributo. addChild() acepta tres parámetros, el primero indica el nombre del nuevo elemento, el segundo es opcional e indica el valor del elemento, y el tercero también es opcional e indica el namespace al cual pertenece el elemento. addAttribute() recibe dos, el nombre del atributo y su valor.

Pongamos un ejemplo para ilustrar su uso. Recordemos el ejemplo de la vez pasada donde usamos un archivo XML cuyo contenido son libros con sus respectivos datos y pasemos a crear el objeto SimpleXMLElement.

$library = new SimpleXMLElement('library.xml', null, true);

Ahora supongamos que queremos agregar un nuevo libro llamado The finished mistery cuyo autor es J. F. Rutherford, el ISBN es 0812550706 y la editorial es Watchtower Society.

$book = $library->addChild('book');
$book->addAttribute('isbn', '0812550706');
$book->addChild('title', "The finished mistery");
$book->addChild('author', 'J. F. Rutherford');
$book->addChild('publisher', 'Watchtower Society');

Con eso es suficiente para modificar el contenido XML. En la primera línea estamos agregando un nuevo hijo llamado book al elemento raíz que es library, como SimpleXMLElement siempre nos regresa un objeto del mismo tipo, entonces a la variable $book también podemos aplicarle el metodo addChild() para crearle hijos, (que vendrían siendo los nietos de $library). Es como una especie de recursividad, donde podemos ir creando elementos en varios niveles, paras obtener hijos, nietos, bisnietos etc.

Ahora bien, hasta este punto no podemos ver cómo ha quedado nuestro documento XML. Lo siguiente será mostrarlo en el navegador. Para ello, debemos enviar una cabecera para indicar al navegador que el contenido a mostrar no es simple texto ni HTML, sino XML y después hacer la impresión del mismo.

header('Content-type: text/xml');
echo $library->asXML();

¿Para que sirve el método asXML()? regresa el contenido XML del objeto como una cadena, pero solo si lo llamamos sin argumentos. La otra opción, que sin duda es la qué podria darnos mas usabilidad es llamarlo con un parametro que contendría una ruta a un archivo, el cual se escribirá con el contenido XML del objeto. El método asXML($string) regresará un valor de tipo boolean dependiendo del resultado de la operación.

¿Cómo escribir entonces un archivo XML? Supongamos que, una vez agregado el nuevo libro a nuestro archivo de libros queremos guardar los cambios. Lo único que habría que hacer es:

$library->asXML('library.xml');

Y listo, si escribimos el nombre de un archivo que no existe, se crea automaticamente y si ya existe se sobrescribe.

¿Cómo eliminar ahora elementos y atributos de un documento XML?

SimpleXMLElement, no provee ningun metodo para hacerlo, sin embargo sí hay una forma de eliminar hijos. Supongamos que quiero eliminar el libro que acabo de agregar. Como es el elemento book número 6, solo hay que destruir el objeto que pertenece a ese hijo:

$library->book[5] = null;

El cinco es porque los elementos empiezan a contarse desde cero. Sin embargo, hay un inconveniente; esto solo eliminara a los hijos del elemento book y a sus respectivos atributos, pero los atributos que haya al nivel de book permaneceran ahi. Por lo que el atributo isbn seguirá existiendo. Si lo igualamos a null, solo conseguiremos vaciar su valor pero dejando intacto al atributo.

Para remover efectivamente hijos y atributos, debemos exportar el objeto SimpleXMLElement a DOM, donde las funcionalidades de PHP5 para manipular los datos se hacen más poderosas. Hablaré de ello después…

Espero que este microtutorial sea de utilidad para quien necesite manipular datos XML con PHP 5.

Escrito en Microtutoriales, PHP | 21 Comentarios

26 Noviembre 2007

Meme: Sobre mí

Por bote

Pues ya he contestado un meme sobre mí al hablar sobre mis 5 miedos más grandes, así que ahora responderé al meme que me ha enviado he leído en el blog de Alan sobre algo más personal.

Así que ahí va, quizás me salte algunas preguntas, pero es que son muchas y algunas no tienen relevancia… de hecho no creo que siquiera una de ellas les interese en lo más mínimo, pero ya saben, es el simple vicio de bloguear…

¿Nombre completo
Abel Botello
¿Por “quién” te dieron ese nombre?
Así se llama mi padre.
¿Le pides deseos a las estrellas
No.
¿Cuándo fue la última vez que lloraste?
No me acuerdo jeje…
¿Te gusta tu letra?
¡Me encanta! de hecho la tengo horrible, pero es uno de mis grandes sueños… escribir feo pero entendible para mí.
El pan te gusta ¿con qué?
Con un Squirt.
¿Cuántos hijos tienes?
Aún no llego a ese punto…
¿Y tu edad es?
21 años (22 el 20 de enero igual que mi compa Alan.)
¿Si fueras otra persona, serías tu amigo
Ni idea…
¿Tienes un diario de vida?
Eso me parece una ñoñada.
¿Eres sarcástic@
Sí y mucho jeje.
¿Saltarías en bungee?
No creo…
¿Cuál es tu cereal preferido?
Zucaritas y Nesquick
¿Te desabrochas los zapatos antes de sacártelos?
Mis zapatos no tienen agujetas, mis teniss sí pero no me los abrocho jeje solo meto y saco el pie.
¿Crees que eres fuerte?
Claro (y no es sarcasmo)
¿Tu helado favorito?
Vainilla con Oreo
¿Cuánto calzas?
8 cm.
¿Rojo o Rosa
Depende, si es para un carro, pues rojo y si es para mmm… no sé.
¿Qué es lo que menos te gusta de ti?
¡¡Que tengo papada!!.
¿A quién extrañas mucho?
A mi morrita…
¿Lo último que comiste hoy?
Un café y unas galletas de canela.
¿Qué estás escuchando en este momento
Una canción del grandioso álbum Scenes from a Memory.
¿La última persona con que hablaste por teléfono?
No me acuerdo…
¿Lo primero que te fijas en el sexo opuesto?
definitivamente en sus ojos.
¿Cómo te cae la persona que te envió esto
Muy bien, no nos conocemos en persona pero lo tengo en mi blogroll.
¿Deporte favorito para ver por TV?
Si es un partido interesante como de la liga europea, pues el futbol, si es de México, pues algún partido de los Tomateros.
¿Color de Pelo?
Castaño oscuro
¿Color de ojos?
Café
¿Lentes de contacto?
No
¿Comida favorita?
Picadillo con arroz rojo… pero me conformo con unas quesadillas, frijoles, salsa y guacamole.
¿Última película que viste en el cine y con quién?
Yo los declaro marido y Larry, con mi chica
¿Día/s favorito/s del año?
Vacaciones de navidad… porque aquí no hace mucho frío y el clima es perfecto.
¿Besos o abrazos?
Lo que ella me dé…
¿Postre preferido?
No como postres jeje
¿Quién crees que te responderá?
Nadie, de hecho nunca me responden memes. La única vez que lo hicieron fue de un tío que no conocía.
¿El que menos crees que lo hará?
El Pancho.
¿Qué libro estás leyendo?
No leo libros, eso es de ñoños. Pero sí los consulto cuando es necesario.
¿Qué hay en tu pared?
Nada.
¿Qué viste anoche en la tele?
No veo la tele.
¿Rolling Stones o Beatles
Rolling Stones
¿Dónde es lo más lejos que has estado de tu casa?
San Francisco CA. en USA.

Pondré a prueba al Pancho a ver si quiere responder…

Escrito en Memes | Deja un comentario

18 Noviembre 2007

Cómo acceder a los datos de XML en PHP

Por bote

Bien, ahora si dedicaré una entrada completa al manejo de XML en PHP5. Veremos un ejemplo fácil y de paso servirá como explicación al funcionamiento de plugin que muestra la foto astronómica del día.

Lo primero de lo que hay que asegurarnos es de que el XML que vamos a parsear es válido. Esto significa que debe estar bien formado (un sólo elemento raíz, etiquetas abiertas y cerradas correctamente, anidaciones válidas, etc) y debe obedecer a un DTD. Después de segurarnos de esto, lo que sigue es trabajar sobre PHP5.

¿Por qué PHP5? por dos razones, una, nos da una orientación a objetos más eficiente que a versión 4 y, dos, nos provee de la extensión SimpleXMLElement que es con la trabajaremos el XML. ¿A caso PHP4 no tiene extensiones que hagan lo mismo? No lo sé, ni me interesa. PHP5 es mejor.

Bien, empecemos. Supongamos que tenemos un archivo XML llamado library.xml con el siguiente contenido:

<?xml version="1.0" ?>
<library>
	<book isbn="0345342968">
		<title>Fahrenheit 451</title>
		<author>R. Bradbury</author>
		<publisher>Del Rey</publisher>
	</book>
	<book isbn="0048231398">
		<title>The Silmarillion</title>
		<author>J.R.R. Tolkien</author>
		<publisher>G. Allen & Unwin</publisher>
	</book>
	<book isbn="0451524934">
		<title>1984</title>
		<author>G. Orwell</author>
		<publisher>Signet</publisher>
	</book>
	<book isbn="031219126X">
		<title>Frankenstein</title>
		<author>M. Shelley</author>
		<publisher>Bedford</publisher>
	</book>
	<book isbn="0312863551">
		<title>The Moon Is a Harsh Mistress</title>
		<author>R. A. Heinlein</author>
		<publisher>Orb</publisher>
	</book>
</library>

Y supongamos que lo que queremos hacer es una tabla con todos los libros y sus respectivos datos:

Title Author Publisher ISBN
Fahrenheit 451 R. Bradbury Del Rey 0345342968
The Silmarillion J.R.R. Tolkien G. Allen & Unwin 0048231398
1984 G. Orwell Signet 0451524934
Frankenstein M. Shelley Bedford 031219126X
The Moon Is a Harsh Mistress R. A. Heinlein Orb 0312863551

Debemos hacer una instancia de la clase SimpleXMLElement. Hay varias formas de hacerlo. Las dos primeras envuelven el uso de programación estructurada o usan funciones que solo regresan objetos SimpleXML.

// Carga una cadena XML desde un archivo...
$xmlstr = file_get_contents( 'library.xml' );
$library = simplexml_load_string( $xmlstr );

// Carga un archivo XML
$library = simplexml_load_file( 'library.xml' );

Las dos formas al final hacen lo mismo. Sin embargo en un escenario real definitivamente nos vamos por la segunda. Hay otras dos formas que implican el uso de algo más orientado a objetos:

// Carga una cadena XML desde un archivo...
$xmlstr = file_get_contents( 'library.xml' );
$library = new SimpleXMLElement( $xmlstr );

// Carga un archivo XML
$library = new SimpleXMLElement('library.xml', null, true);

Ahora sí, de las cuatro formas, recomiendo la última. El segundo argumento no tiene aplicación práctica para este ejemplo y el tercero es solo para informar al constructor que el primer parámetro es una ruta a un archivo y no una cadena XML.

Aquí viene lo interesante, el acceso a los hijos y atributos. He aquí por qué SimpleXMLElement hace magia; convierte a todos los nodos del árbol XML en atributos de clase y los atributos del XML mismo los convierte en variables a las que podemos acceder como arreglos asociativos.

Si hasta aquí todo va claro, entonces ya tenemos las bases para manipular de forma sencilla el archivo de la biblioteca para mostrar los libros en una tabla. Y nos debería quedar algo así:

echo '<table>';
echo '<tr>';
echo '<th>Title</th><th>Author</th>
       <th>Publisher</th><th>ISBN</th>';
echo '</tr>';
foreach( $library->book as $book ) {
	echo '<tr>';
	echo '<td>' . $book->title . '</td>';
	echo '<td>' . $book->author . '</td>';
	echo '<td>' . $book->publisher . '</td>';
	echo '<td>' . $book['isbn'] . '</td>';
	echo '</tr>';
}
echo '</table>';

El problema ahora sería, ¿qué pasa si no conocemos todos los nombres de los elementos ni los atributos? SimpleXMLElement tiene la solución. Los métodos SimpleXMLElement::children() y SimpleXMLElement::attributes() así como el método recien introducido en PHP5.1.3 SimpleXMLElement::getName() nos ayudarán en gran medida.

Como bien se sobreentiende, el método children() regresa los nodos hijos de elemento actual. El método attributes() regresa los atributos del elemento actual y el método getName() el nombre del elemento actual. Todos se pueden aplicar recurrentemente dependiendo del nivel de anidación de los elementos. Es decir, si estamos en el elemento $x, y llamamos a $x->children() obtendremos a los hijos de $x, y si a uno de esos hijos le aplicamos el children() obtendremos los nietos de $x, y así sucesivamente.

De modo que, para concluir, el plugin que hice solo lee el feed, saco el nodo hijo <item> del elemento raíz que es <channel> llamándolo así:

$item = $apod->channel->item[0];

La posición cero indica que es el primer item del documento, es decir, el elemento con el cual se ha actualizado el feed. Y con ese elemento trabajo para obtener los demás datos. Por ejemplo, si la descripción es un elemento hijo de cada item, la obtengo así:

$descripcion = $apod->channel->item[0]->description;

Hasta aquí llega el microtutorial de hoy que ha servido para ver cómo parsear una cadena de XML para leerla nada más. La próxima semana escribiré cómo modificar documentos XML.

Fuente de inspiración: El manual para certificación de Zend PHP.

Escrito en Microtutoriales, PHP | 9 Comentarios

31 Octubre 2007

Meme: Mis 5 miedos

Por bote

Miedo!!

Veo en Bitperbit el meme sobre los 5 miedos más grandes de un blogger… y aunque no me han invitado a contestarlo se me ha hecho interesante y lo responderé:

  1. Las cucarachas, sé que suena muy gay pero le temo a los insectos, en especial a estos. Ojalá alguién los extermine algún día…
  2. Los cruceros demasiado transitados, suelo conducir en friega y siempre tengo miedo de que se me atraviese un idiota o algún conductor despistado.
  3. Subir escaleras a más de 2 pisos, es por mi seguridad…
  4. Las mujeres rebeldes, no soy machista pero no quiero tener una batallosa.
  5. No pasar los examenes de certificación de ADOO, Java y PHP5

Nota: El orden es irrelevante.

No paso el meme a nadie porque de todas formas nadie me los contesta :(

Escrito en Memes | 2 Comentarios

27 Octubre 2007

Al fin Microplagio con PageRank 3

Por bote

Sé que un pagerank de 3 no es la gran cosa pero tomando en cuenta que hace unos días ni siquiera tenía pagerank, estoy muy feliz. Así es, cuando este blog era un subdominio de NetSkyZone tenía un pagerank de 2. Y despues cuando compré este dominio hice una redirección 301 o redirección permanente, pero aún no terminaba de actualizarse el índice de Google con mi nuevo dominio cuando el dominio antiguo murió.

Microplagio inició su vida entonces con pagerank 0, y así estuvo muchísimo tiempo, hasta que hoy por fin veo algo de luz en el camino, pues Google me ha dado un 3. Ya lo necesitaba…

Mi pagerank

Si no tienen la barra Google, pueden consultar su pagerank en sitios como www.mipagerank.com.

Un saludo!

Escrito en Google, Microplagio | Deja un comentario

3 Octubre 2007

Cómo usar DTD's en HTML y XHTML

Por bote

Document Type Declaration (DTD) es una definición o descripción de estructura y sintaxis de un documento XML o SGML. Su función básica es la descripción del formato de datos, para usar un formato común y mantener la consistencia entre todos los documentos que utilicen la misma DTD.

De esta forma, dichos documentos, pueden ser validados, conocen la estructura de los elementos y la descripción de los datos que trae consigo cada documento, y pueden además compartir la misma descripción y forma de validación dentro de un grupo de trabajo que usa el mismo tipo de información.

Las DTD se emplean generalmente para determinar la estructura de un documento mediante etiquetas XML o SGML. Una DTD describe:

  • Elementos: indican qué etiquetas son permitidas y el contenido de dichas etiquetas.
  • Estructura: indica el orden en que van las etiquetas en el documento.
  • Anidamiento: indica qué etiquetas van dentro de otras.

Para poder validar un documento HTML o XHTML es obligatorio establecer una definicion del tipo de documento. Esto se hace en la primera linea de código de cada página y puede tener tantos valores permitidos como versiones aprobadas por la W3C para documentos web existan.

Por extensión de uso y popularidad, las versiones más usadas actualmente para documentos HTML y XHTML son la 4.01 y 1.0 respectivamente. Veamos ahora los DTD’s asociados a cada versión:

DTD’s para HTML 4.01

HTML 4.01 Strict, no permite elementos antiguos (marquee, font, blink) que están en desuso y atributos que sirven para formatear el estilo. Se exige el uso de CSS para el diseño. La declaración de tipo de documento es:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
"http://www.w3.org/TR/html4/strict.dtd">

HTML 4.01 Transitional permite algunos elementos y atributos antiguos que están en desuso. La declaración de tipo de documento es:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/DTD/loose.dtd">

HTML 4.01 Frameset para el uso de frames (marcos). La declaración de tipo de documento es:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN"
"http://www.w3.org/TR/html4/DTD/frameset.dtd">

DTD’s para XHTML 1.0

XHTML 1.0 Strict es la más estricta de las DTD disponibles: no soporta etiquetas antiguas y el código debe estar escrito correctamente. La declaración de tipo de documento es:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

XHTML 1.0 Transitional es como XHTML Strict DTD, pero las etiquetas en desuso están permitidas. Actualmente ésta es la DTD más popular. La declaración de tipo de documento es:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

XHTML 1.0 Frameset es la única DTD XHTML que soporta Frameset. La declaración de tipo de documento es:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">

Así que cuando querramos hacer que nuestro sitio web valide, lo más recomendable es apegarnos a un DTD y aplicar todas las especificaciones. Este es el primer paso para formar parte del mundo web estandarizado.

Escrito en Microtutoriales | Deja un comentario

  • Ventana al cosmos

  • Cassini pasa a través de los penachos de hielo de Encelado

  • Publicidad