Posts Tagged ‘Programación’

Instalando Zend Framework 1.x desde cero


04 oct

Hoy les traigo un pequeño tuto para instalar Zend Framework 1.x desde cero, mas adelante les traere una guia para hacerlo con la version 2 que por lo que estoy viendo esta que promete.

  1. Descargando Zend Framework
    Lo Primero que vamos a hacer es descargar el comprimido desde la web oficial. En este momento la ultima version estable es la 1.12.0 que es con la que trabajaremos, puede ver las ultimas versiones aquí. En nuestra carpeta personal descargamos el .tar.gz

    wget http://packages.zendframework.com/releases/ZendFramework-1.12.0/ZendFramework-1.12.0.tar.gz
  2. Descomprimimos…
    tar -xzvf ZendFramework-1.12.0.zip.tar.gz
  3. Renombramos a un nombre mas estandar…
    mv ZendFramework-1.12.0 ZendFramework
  4. Copiamos todo a /usr/local
    sudo cp -R ZendFramework /usr/local
  5. Le damos los permisos necesarios…
    cd /usr/local
    sudo chmod 0755 ZendFramework
    sudo chmod -R 0755 ZendFramework/*
  6. Creamos un enlaze simbolico para el zf tool
    sudo ln -s /usr/local/ZendFramework/bin/zf.sh /usr/bin/zf
  7. Probamos nuestro zf tool
    zf show version

    Y si todo sale bien obtendremos ‘Zend Framework Version: 1.12.0

  8. Agregamos la libreria a nuestro sistema
    cd /etc/php5/apache2/
    sudo nano php.ini

    Buscamos esta linea

    ;include_path = ".:/usr/share/php";

    Y la sustituimos por la siguiente linea (notese que no esta el punto y coma inicial que indica un comentario)

    include_path = ".:/usr/share/php:/usr/local/ZendFramework/library"
  9. Creamos nuestro proyecto ‘zarpele
    zf create project zarpele
    Creating project at /var/www/framework/zarpele
    Note: This command created a web project, for more information setting up your VHOST, please see docs/README

Listo solo tienen que crear un vhost apuntando a la carpeta public, aqui les dejo un tutorial de mi autoria para crear vhosts de hace algunos años pero valido al fin.

Saludos…

Distancia de Levenshtein con PHP


04 nov

Se llama, Distancia de Levenshtein, distancia de edición, o distancia entre palabras, a la cantidad de inserciones, eliminaciones o cambios de caracteres que hay que realizar para convertir una palabra en otra.

Por ejemplo:

casa → cala (sustitución de ‘s’ por ‘l’) osea que d(casa,cala) = 1

cala → calla (inserción de ‘l’ entre ‘l’ y ‘a’) osea que d(cala, calla) = 1

calla → calle (sustitución de ‘a’ por ‘e’) osea que d(calla, calle) = 1

anemia → anestesia (3 inserciones ‘ste’, sustitución de ‘m’ por ‘s’) osea que d(anemia, anestesia) = 4

Luego de esta pequeña intro, veremos lo sencillo que resulta calcular distancias de Levenshtein con PHP.

<?php
echo levenshtein('anemia', 'anestesia');
?>

Resultado:

4

Fácil!, lo bueno es que con PHP, la función esta implementada de forma nativa en contra de otros lenguajes como C++, C#, Java, etc. en donde uno debe programar la función distancia.

Les dejo a continuación un pequeño script, que toma como entrada un conjunto de palabras y genera una matriz con las distancias de Levenshtein asociadas una por una. Esta matriz tiene la particularidad de que es simétrica respecto a su diagonal principal donde todos sus elementos son 0.

<?php
$data = array('Ana', 'Francisco', 'Belen', 'Zulma', 'Pedro', 'Esteban', 'Amy', 'Paula', 'Claudia', 'Anama', 
   'Jorge', 'Estanislao', 'Cristian', 'Adrian', 'Clara', 'Fernando', 'Alan', 'Charlize', 'Cameron', 'Anahi'); 

?>
<table>
    <tr>
        <td></td>
        <?php foreach($data as $value): ?>
        <td><?php echo $value?></td>
        <?php endforeach;?>
    <tr>
    <?php foreach($data as $value): ?>
    <tr>
    <td><?php echo $value?></td>
    <?php foreach($data as $value2):?>
        <td><?php echo levenshtein($value, $value2);?></td>
    <?php endforeach;?>
        </tr>
    <?php endforeach;?>
</table>

El resultado del anterior ejemplo, seria:

Feliz día del Programador!!


13 sep

Como ya sabrán, este día se conmemora el día 256 de cada año (que corresponde al 13 de septiembre en la mayoría de los casos, salvo los años bisiestos, que es el 12 del mismo mes) porque el número 256 (o dos elevado a ocho) es el número de valores distintos que pueden representarse con un byte.

La celebración fue propuesta por Valentin Balt, empleado de la firma de diseño web Parallel Technologies. En 2002 comenzó a juntar firmas para elevar una solicitud formal al gobierno ruso para reconocer este día como el “día oficial de los programadores”. Pasaron los años y las tramitaciones, hasta que el 11 de septiembre de 2009 el presidente Dmitry Medvedev firmó el decreto correspondiente y dos jornadas después se consagró la primera celebración.

Desde entonces, se celebra de manera no oficial en el resto del mundo.

Sin más, celebren todos. ¡Feliz día del programador!

Info | Programmer Day

PHP: Clase simple para obtener información de videos de YouTube v1.1


02 ago

Hace bastante tiempo ya, Septiembre 24 del 2010 para ser mas especifico, escribí una clase en PHP para poder obtener información de los videos de Youtube liberada bajo licencia GPL/v2.

Esta entrada tuvo muchas visitas y comentarios, así que decidí sacar la versión 1.1 con nuevas funcionalidades y mejoras en performance. El código lo pueden encontrar en este proyecto de Google Code:

En el mismo podrán hacer comentarios, sugerencias y bajarse el código con un ejemplo. También encontraran una Wiki para poder empezar a usar la clase…

En esta v1.1, podemos obtener los siguientes datos:

  • Title.
  • Valid (is a valid video?)
  • Published.
  • Updated.
  • Category.
  • Tags.
  • Content.
  • Description.
  • Link.
  • Images.
  • Author Name.
  • Author Url.
  • Author Uri.
  • Embed Code.

Les dejo el código para aquellos que les gusta el copy/paste…
youtube.class.php

<?php
/*
 * Name: Simple Class YouTube
 * Description: Get Information of YouTube video
 * Site: http://www.zarpele.com.ar
 * License: GNU GENERAL PUBLIC LICENSE (http://www.gnu.org/licenses/gpl.html)
 * Version: 1.1
 */

class Youtube
{
    var $data = '';
    var $xml = '';
    var $id = '';

    private function youtubeCurl($url){
        $browser_id = 'none';
        $curl_handle = curl_init();
        $options = array
        (
            CURLOPT_URL => $url,
            CURLOPT_HEADER => false,
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_USERAGENT => $browser_id
        );
        curl_setopt_array($curl_handle, $options);
        $server_output = curl_exec($curl_handle);
        curl_close($curl_handle);
        return $server_output;
    }

    public function __construct($id)
    {
        if (strlen($id) >= 22)
        {
            parse_str( parse_url( $id, PHP_URL_QUERY ) );
            $this->id = $v;
        }
        else
        {
            $this->id = $id;
        }

        $url = 'http://gdata.youtube.com/feeds/videos/' . $this->id;
        $server_output = $this->youtubeCurl($url);

        if($server_output == 'Invalid id'){
            return false;
        }else{
            $this->data = $server_output;
            $description = $this->prepareDescription();
            $this->xml = new SimpleXMLElement($this->data);
            $this->xml->addChild('description', $description);
            return true;
        }
    }

    public function getData(){
        return $this->data;
    }

    public function getXml(){
        return $this->xml;
    }

    public function valid(){
        if(empty($this->data)){
            return false;
        }else{
            return true;
        }
    }

    /* DATA VIDEO */
    public function getTitle(){
        if ($this->valid()){
            return $this->xml->title;
        }else{
            return false;
        }
    }

    public function getPublished()
    {
        if ($this->valid()){
            return $this->xml->published;
        }else{
            return false;
        }
    }

    public function getUpdated()
    {
        if ($this->valid()){
            return $this->xml->updated;
        }else{
            return false;
        }
    }

    public function getCategory()
    {
        if ($this->valid()){
            $category = '';
            for ($i = 0; $i < count($this->xml->category);$i++){
                if ($this->xml->category[$i]['scheme'] == 'http://gdata.youtube.com/schemas/2007/categories.cat'){
                    $category = $this->xml->category[$i]['label'];
                    break;
                }
            }
            return $category;
        }else{
            return false;
        }
    }

    public function getTags(){
        if ($this->valid()){
            $tags = array();
            for ($i = 0; $i < count($this->xml->category);$i++){
                if ($this->xml->category[$i]['scheme'] == 'http://gdata.youtube.com/schemas/2007/keywords.cat'){
                    $name = $this->xml->category[$i]['term'];
                    array_push($tags, $name);
                }
            }
            return $tags;
        }else{
            return false;
        }
    }

    public function getContent()
    {
        if ($this->valid()){
            return $this->xml->content;
        }else{
            return false;
        }
    }

    public function getDescription()
    {
        if ($this->valid()){
            return $this->xml->description;
        }else{
            return false;
        }
   }

    private function prepareDescription()
    {
        $startString = "<media:description type='plain'>";
        $endString = "</media:description>";

        $starLocation = strpos($this->data, $startString);
        $tempString = substr($this->data, $starLocation);

        $endLocation = strpos($tempString, $endString);
        $description = substr($tempString, 0, $endLocation);

        if (empty($description))
        {
            $description=false;
        }
        else
        {
            $description = substr($description,strlen($startString));
        }

        return $description;
    }

    public function getUrl()
    {
        if ($this->valid()){
            return 'http://www.youtube.com/watch?v='.$this->id;
        }else{
            return false;
        }
    }

    public function getImageUrl($option)
    {
        if ($this->valid()){
            if($option == 'default'){
            return 'http://i.ytimg.com/vi/'.$this->id.'/default.jpg';
            }
            if($option == 0){
                return 'http://i.ytimg.com/vi/'.$this->id.'/0.jpg';
            }
            if($option == 1){
                return 'http://i.ytimg.com/vi/'.$this->id.'/1.jpg';
            }
            if($option == 2){
                return 'http://i.ytimg.com/vi/'.$this->id.'/2.jpg';
            }
            if($option == 3){
                return 'http://i.ytimg.com/vi/'.$this->id.'/3.jpg';
            }
        }else{
            return false;
        }
    }

    /* AUTHOR MEHTODS */
    public function getAuthorName(){
        if ($this->valid()){
            return $this->xml->author->name;
        }else{
            return false;
        }
    }

    public function getAuthorUrl(){
        if ($this->valid()){
            return 'http://www.youtube.com/user/'.$this->getAuthorName();
        }else{
            return false;
        }
    }

    public function getAuthorUri(){
        if ($this->valid()){
            return $this->xml->author->uri;
        }else{
            return false;
        }
    }

    /* see: http://code.google.com/apis/youtube/player_parameters.html */
    public function getEmbeb($options = NULL)
    {
        $width = $options['width'];
        if (!isset($options['width'])){
            $width = 425;
        } //Width
        unset($options['width']);

        $height = $options['height'];
        if (!isset($options['height'])){
            $height = 349;
        } //Height
        unset($options['height']);
        
        $secure = '';
        if (isset($options['https'])){
            if ($options['https'] == 1){
                $secure = 's';
                unset($options['https']);
            }else{
                $secure = '';
                unset($options['https']);
            }
        }

        if(empty($options)){
            $exclamation = '"';
        }else{
            $exclamation = '?';
        }
        
        $embeb_code = '<iframe class="youtube-player" type="text/html" width="'.$width.'" height="'.$height.'" src="http'.$secure.'://www.youtube.com/embed/'.$this->id.$exclamation;

        $i = 1;
        foreach($options as $key => $value){
            if($i == count($options)){
                $embeb_code .= $key.'='.$value.'"';
            }else{
                $embeb_code .= $key.'='.$value.'&';
            }
            $i++;
        }
        $embeb_code .= '></iframe>';

        return $embeb_code;
    }
}

?>

sample.php

<?php
/*
 * Name: Simple Class Info YouTube
 * Description: Get Information of YouTube video
 * Site: http://www.zarpele.com.ar
 * License: GNU GENERAL PUBLIC LICENSE (http://www.gnu.org/licenses/gpl.html)
 * Version: 1.1
 */?>
<?php
require_once 'youtube.class.php';

$url = 'http://www.youtube.com/watch?v=5ocq6_3-nEw';
$youtube = new Youtube($url);

//$id = '5ocq6_3-nEw';
//$youtube = new Youtube($id);
?>

<h2>Video Data</h2>
<p>
    <strong>Title: </strong>
    <?php echo $youtube->getTitle()?>
</p>

<p>
    <strong>Valid: </strong>
    <?php var_dump($youtube->valid())?>
</p>

<p>
    <strong>Published: </strong>
    <?php echo $youtube->getPublished()?>
</p>

<p>
    <strong>Updated: </strong>
    <?php echo $youtube->getUpdated()?>
</p>

<p>
    <strong>Category: </strong>
    <?php echo $youtube->getCategory()?>
</p>

<p>
    <strong>Tags: </strong>
    <?php var_dump($youtube->getTags())?>
</p>

<p>
    <strong>Content: </strong>
    <?php echo $youtube->getContent()?>
</p>

<p>
    <strong>Description: </strong>
    <?php echo $youtube->getDescription()?>
</p>

<p>
    <strong>Link: </strong>
    <?php echo $youtube->getUrl()?>
</p>

<p>
    <strong>Imagen: </strong>
    <?php echo $youtube->getImageUrl('default')?><br/>
    <img src="<?php echo $youtube->getImageUrl('default')?>" alt=""/>
    <img src="<?php echo $youtube->getImageUrl(0)?>" alt=""/>
    <img src="<?php echo $youtube->getImageUrl(1)?>" alt=""/>
    <img src="<?php echo $youtube->getImageUrl(2)?>" alt=""/>
    <img src="<?php echo $youtube->getImageUrl(3)?>" alt=""/>
</p>

<h2>Author Data</h2>
<p>
    <strong>Author Name: </strong>
    <?php echo $youtube->getAuthorName()?>
</p>

<p>
    <strong>Author Url: </strong>
    <?php echo $youtube->getAuthorUrl()?>
</p>

<p>
    <strong>Author Uri: </strong>
    <?php echo $youtube->getAuthorUri()?>
</p>

<p>
    <strong>Video: </strong><br/>
    <?php $options = array('autoplay' => 1);?>
    <?php echo $youtube->getEmbeb($options);?>
</p>

Google Code Page | http://code.google.com/p/simple-class-youtube/

Deja tu comentario…

Como agregar botón Google +1 en WordPress!!!


07 jun

Hace mas de 2 meses, Google anunció su botón +1 que viene a competir con el “Me Gusta” de Facebook y el “Twitt” de Twitter, pero aun este no esta operativo para cualquier parte del mundo excepto EE.UU.

Por que este botón es importante?, el botón podría llegar a tener incidencia en los resultados generales de búsqueda en Google, de modo que puede ser interesante.

Suelo modificar cosas del blog a mano, no me gusta bajar plugins que modifiquen y hagan lento el sitio si con un fragmento de codigo propio, puedo arreglar o mejorar el mismo. Para esto necesitamos editar 2 templates de nuestro WordPress Main Index Template (index.php) y Single Post (single.php)
El primero, es el template que nos permite visualizar las entradas en la pagina principal y el segundo, es el que nos permite ver una entrada en particular.

Se ubican donde quieren agregar el botón y agregan el siguiente código. Notese

<?php the_permalink(); ?>

esto nos permite decirle al boton, cual es la pagina que queremos darle el +1 .

Google +1
<script type="text/javascript" src="http://apis.google.com/js/plusone.js">
  {lang: 'es-419'}
</script>
<g:plusone size="medium" href="<?php the_permalink(); ?>"></g:plusone>

A este botón lo podemos editar, elegir tamano, si se muestra el numero, etc. para hacer estos cambios Google nos facilita esta pagina.

Si quieren probarlo, arriba de esta misma entrada tienen el botón !!! :D

Saludos…


Ver mas:
FayerWayer | El botón +1 de Google ya está disponible
Zarpele | Como agregar botón Facebook y Twitter en WordPress!!!
Google Blog | The +1 button for websites: recommend content across the web

[PHP]Leer XML con SimpleXML


06 abr


Una de las cosas mas estúpidas y de noob que he echo programando, es hacer una función que lee los datos con estructura XML, como la que ven acá abajo…

public function getTitle($data)
    {
        $startString = '<author>';
        $endString = '</author>';
        $tempString = strstr($data, $startString);
        $endLocation = strpos($tempString, $endString);
        $title = substr($tempString, 0, $endLocation);

        if (empty($title))
        {
            $title = false;
        }
        else
        {
            $title = substr($title,strlen($startString));
        }

        return $title;
    }

Esta función busca el valor dentro de las etiquetas <author></author>, y en caso de no encontrarlo, devuelve false. Si bien esta función funciona (valga la redundancia), no es de lo mas eficiente que podemos hacer.

Una de las formas de manejar XML de forma nativa es SimpleXML, una extensión en PHP que proporciona un juego de herramientas muy simple y fácilmente usable para convertir XML en un objeto que pueda ser procesado con selectores normales de propiedades e iteradores de array.

Si. Manejemos toda la estructura XML como ya sabemos (?? :D ), como un objeto!

Les voy a mostrar un ejemplo con un XML simple…

$xml_data = "<?xml version='1.0'?>
    <document>
        <date>04-05-2011</date>
        <author>Zarpele</author>
        <description>Linux and Sofware Libre</description>
        <content>Simple example for SimpleXML use with PHP</content>
    </document>";

$xml = new SimpleXMLElement($xml_data);
echo $xml->author;

Simple, Rapido y Facil, obtenemos como resultado “Zarpele”

Este ejemplo es para leer un XML desde una URL especifica, por ejemplo el feed del blog.

$xml = simplexml_load_file('http://www.zarpele.com.ar/feed/');
echo $xml->channel->title;
foreach ($xml->channel->item as $noticia) {
  echo $noticia->title;
  echo '<br/>';
}

Lo que hace este código, es imprimir el titulo del blog y todos los títulos de las entradas que están en el feed.

Mas adelante, les prometo traerle la parte 2 con un manejo mas avanzado, coméntale si te gustó.

Saludos…

More Info | http://www.php.net/manual/es/book.simplexml.php
More Info | http://conf.phpquebec.com/slides/2007/advanced_xml.pdf

Zarpele! Linux and Software Libre

GNU/Linux, Programación, Tecnologia…


Follow Me Hazte Fan