La comunidad en torno a OpenOffice da vida a LibreOffice

Standard

Al parecer al interior de las comunidades que participaban en los proyectos de código abierto de Sun (OpenSolaris por ejemplo) aprendieron la lección, por lo que ahora desde el mundo de los desarrolladores independientes de OpenOffice.org han ideado un nuevo proyecto denominado como “The Document Foundation” y que, en teoría, sería un fork de OpenOffice bajo el nombre de “LibreOffice”.

En términos simples este nuevo proyecto tomará como base el código existente de OpenOffice y avanzará en su desarrollo de manera totalmente independiente, de hecho junto con el anuncio de este nuevo proyecto se informa de la disponibilidad de la primera versión beta (en inglés por el momento) de LibreOffice, tanto para Linux (64 bit) como para Windows y Mac OS X.

De todas formas desde The Document Foundation se invitó a Oracle a participar del proyecto, claro que la idea es que ceda la marca OpenOffice.org para que pueda seguir siendo utilizada por la comunidad.

Link: The Document Foundation

Script: Convertir una página HTML a PDF

Standard

Un script útil me acabo de encontrar por la web. Cuantas veces quisiste bajarte esa pagina en PDF para poder leerla en el futuro o solo para tenerla ahi ocupando espacio :D , bueno el dia llego hoy con este script todo es mas fácil.

Programas Requeridos

Vamos a necesitar zenity y wkhtmltopdf.

Lo instalamos

~ $ sudo apt-get install zenity wkhtmltopdf

El Script

#!/bin/bash

#:::::::::::::::::::::::::::::::::::::.
# CONVERTIR A PDF
#
# Pide como entrada una direccion URL
# y el nombre del fichero PDF a generar
# generando un PDF resultado mediante
# wkhtmltopdf.
#
#:::::::::::::::::::::::::::::::::::::.

szAnswer=$(zenity --width 600 --entry --title "Convertir a PDF" --text "Pega la URL que quieres convertir a PDF:" --entry-text "http://"); echo $szAnswer

direccionURL=${szAnswer}

if [ -z $direccionURL ];
then
	exit;
fi

szSavePath=$(zenity --file-selection --title "Nombre del fichero PDF a generar:" --save --confirm-overwrite);echo $szSavePath

filepdf=${szSavePath}

if [ -z "$filepdf" ];
then
	exit;
fi

wkhtmltopdf "${direccionURL}" "${filepdf}"

Bien copiamos este código en un fichero nuevo de nombre html2pdf.sh y le damos permisos de ejecución de la siguiente manera…

~ $ chmod +x html2pdf.sh

Corriendo nuestro script

Para correr el script solo ponemos en consola.

~ $ sh html2pdf.sh

o

~ $ ./html2pdf.sh

Nos preguntara la URL

Y luego el nombre del fichero .pdf y listo a descargar…

Nuestro PDF

Salut!!!
Visto en | UbuntuLife

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

Standard

Hace poco, me puse a hacer la sección de Videos de esta pagina y por supuesto la quise integrar con el gigante de los videos YouTube.

Me dirijo a la API de Datos de Youtube y me encuentro con muuuuuuuucho para leer y nada rápido para probar.

Para utilizar la API con PHP se necesita Zend Framework un framework demasiado pesadito para mi gusto (por lo poco que necesitaba), por lo que me puse a investigar y desarrolle una pequeña clase para obtener la información de los videos utilizando CURL con PHP.

En esta primera versión, podemos obtener los siguientes datos de un video:

  • Titulo
  • Fecha de Publicación
  • Descripción
  • Meta Tags
  • URL en Youtube
  • Imágenes
  • Código del Reproductor

youtube.class.php

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

class youtube
{
    var $data = '';
    var $id = '';

    public function youtube($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;
        $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);

        $this->data=$server_output;
    }

    public function getTitle()
    {
        $startString = "<media:title type='plain'>";
        $endString = "</media:title>";

        $tempString = strstr($this->data, $startString);

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

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

        return $title;
    }

    public function getPublished()
    {
        $startString = "<published>";
        $endString = "</published>";

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

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

        if (empty($published))
        {
            $published=false;
        }
        else
        {
            $published=substr($published,strlen($startString));
            $published=substr($published,0,10);
        }

        return $published;
    }

    public function getDescription()
    {
        $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 getMetaTags()
    {
        $startString = "<media:keywords>";
        $endString = "</media:keywords>";

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

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

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

        return $metaTags;
    }

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

    public function getUrlImage($option)
    {
        if($option=='default')
        {
            return 'http://i.ytimg.com/vi/'.$this->id.'/default.jpg';
        }
        if($option=='grande')
        {
            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';
        }
    }

    public function getEmbeb($width, $height)
    {
        $autoplay = 1;
        return '<iframe class="youtube-player" type="text/html" width="'.$width.'" height="'.$height.'" src="http://www.youtube.com/embed/'.$this->id.'?autoplay='.$autoplay.'" frameborder="0">
        </iframe>';
    }


}

?>

Descargar Fichero PHP

Obviamente, hay muchas cosas que mejorar, pero lo hice en pocas horas y me sirvió para lo que yo necesitaba.

Como lo utilizo?, bueno es una clase no hay nada extraño, pero les dejo un ejemplito…

ejemplo.php

<?php
require_once 'youtube.class.php';
/* 
 * Name: Simple Class Info YouTube 
 * Description: Get Information of video YouTube
 * Development: Chuecko
 * Site: http://www.zarpele.com.ar
 * License: GNU GENERAL PUBLIC LICENSE (http://www.gnu.org/licenses/gpl.html)
 * Version: 1.0
 */
/*
 * Tambien le pueden pasar como parametro solo el ID de youtube 
 * $youtube = new youtube('59PyU_7iqaU');
 */
$youtube = new youtube('http://www.youtube.com/watch?v=59PyU_7iqaU');

echo 'Titulo: '.$youtube->getTitle().'<br/>';
echo 'Publicado: '.$youtube->getPublished().'<br/>';
echo 'Descripcion: '.$youtube->getDescription().'<br/>';
echo 'Meta Tags: '.$youtube->getMetaTags().'<br/>';
echo 'Link: '.$youtube->getUrl().'<br/>';
echo 'Imagen: '.$youtube->getUrlImage('default').'<br/>';

echo $youtube->getEmbeb(640, 390);

?>

Descargar Fichero PHP
Ya que están de paso, se miran el video del ejemplo :D

Salut…


ACTUALIZACION 27-02-2011
Ya que esta clase tuvo mucho éxito, he creado un proyecto en Google Code http://code.google.com/p/simple-class-youtube/, con el objetivo de ir mejorando el codigo, esta liberado bajo licencia GPL/v2.


ACTUALIZACION 02-07-2011
Lanzada la versión 1.1

Direct3D 10/11 llega de forma nativa a Linux

Standard


Grandes noticias para los jugones en Linux. Por primera vez, Direct3D ha sido implementado de forma nativa en Linux. ¿Por qué digo que es una gran noticia? Hay varias razones.

Todos sabemos que Linux no es la panacea en cuanto a soporte de gráficos. Sólo está OpenGL como librería de gráficos nativa, y la ejecución de Direct3D (la librería desarrollada por Microsoft para Windows) es muy pobre. Para ejecutar juegos Direct3D se usan programas como Wine, que crean una capa intermedia entre el software y la librería OpenGL. Para que nos entendamos, es como si fuese un adaptador. Por un lado tiene la forma de enchufe de Direct3D, para que los juegos Windows funcionen, y por el otro la forma de OpenGL, para poder comunicarse con la tarjeta gráfica.

Obviamente, este “adaptador” no tiene un rendimiento excelente. Además, Wine sólo podía emular juegos con Direct3D 10, la última versión, la 11, no estaba soportada, así que muchos juegos en Linux no funcionaban demasiado bien.

Pues bien, hoy se acaba todo esto. Gallium, una librería de gráficos libre desarrollada por VMWare y usada en el driver libre de nVidia Noveau, ha implementado la API Direct3D 10 y 11 de forma nativa. Es decir, sin capas intermedias.

Aunque todavía está en una fase temprana, la librería es capaz de realizar algunas funciones básicas perfectamente. La intención de sus desarrolladores es que se pueda usar en cualquier programa para mejorar su rendimiento gráfico, incluyendo Wine y los drivers de nVidia.

Si además tenemos en cuenta que, debido al rediseño desde cero de Direct3D 10 Wine soportaba malamente esta versión (la 11 no está ni implementada), es una noticia mejor todavía. En poco tiempo, podríamos tener juegos complejos funcionando en Linux a pleno rendimiento.

¿Quién dijo que Linux no valía para juegos?

Visto en | Genbeta

¿Ha perdido el código abierto su principal argumento?

Standard

Luego de un par de dias retirado de la vida 2.0 (por razones facultativas), vuelvo a poner una entrada en este humilde blog, en esta ocasión les dejo una reflexión de como estamos hoy en dia con lo relacionado al código abierto, les recomiendo también que lean los comentarios de la fuente

Hace diez años, tuve la oportunidad de tener largas charlas con los principales referentes del código abierto (Richard Stallman, Jon “Maddog” Hall, Eric Raymond, Linus Torvalds vía e-mail, etc). Recuerdo que si bien cada uno de estos personajes tenía un discurso particular, todos ellos en mayor o menor medida intentaban transmitir el mismo mensaje: El código abierto es la herramienta que tenemos los usuarios para mantener el control sobre nuestras computadoras, nuestras aplicaciones y, por sobre todo, nuestros datos personales.

Tanto Stallman como Maddog brindaban conferencias en las que apuntaban con sus cañones directamente a las compañías desarrolladoras de software cerrado como Microsoft, Apple y Adobe. ¿El argumento? Elemental: “No debemos usar sus herramientas porque no sabemos que hay detrás de ellas. Por lo tanto, no podemos confiar nuestros datos a estos sistemas”. Y, hay que admitir que los tipos tienen su punto. Hay decenas de casos de experiencias en los que, a causa de un bug, o una puerta trasera puesta a propósito, la privacidad de la información de las personas se vió amenazada.

Sin embargo, diez años después, el panorama es totalmente diferente. Hoy las personas no solo siguen utilizando software cerrado en sus equipos, sino que además confían gran parte de su información personal a megacorporaciones como Google, Microsoft, Facebook y Apple. Y me pregunto entonces si en este terreno, la batalla ya está perdida. En “la nube” la discusión sobre plataformas abiertas y plataformas cerradas se da en ciertos circulos extremadamente particulares y acotados. En palabras simples, a nadie parece importarle un carajo de que Facebook o GMail sean plataformas cerradas y autoritarias. Entonces, pregunto, ¿ha perdido el Código Abierto su principal argumento?

Google, Facebook, Apple y Microsoft dicen ser “amigas del código abierto”; pero lo cierto es que solo lo usan porque les sirve y no porque haya una intención real de ser más transparente con los usuarios.

Fuente | Alternativa TV

36 errores clásicos en los proyectos de Software.

Standard

Algunas prácticas de desarrollo ineficaces han sido elegidos con tanta frecuencia, por tantas personas, con resultados tan predecibles, mal que merecen ser llamados “Errores clásicos”. La mayoría de los errores tienen un atractivo seductor.

Personas

Éstos son algunos de los errores clásicos relacionados con las personas.

  1. Motivación débil.
  2. Estudio tras estudio se ha mostrado que la motivación probablemente tiene mayor efecto sobre la productividad y la calidad que ningún otro factor (Boehm, 1981).

  3. Personal Mediocre
  4. Después de la motivación la capacidad individual de los miembros del equipo, así como sus relaciones como equipo, probablemente tienen la mayor influencia en la productividad (Boehm, 1981; Lakhanpal, 1993).

  5. Empleados problemáticos incontrolados.
  6. Un fallo al tratar con personal problemático también amenaza la velocidad de desarrollo. Es un problema habitual, y se ha comprendido bien, al menos desde que Gerald Weinber publicó Psychology of Computer Programming en 1971. Un fallo al tomar una decisión cuando se trata con un empleado problemático es una de las quejas mas comunes que tienen los miembros del equipo respecto de sus responsables (Larson y LaFasto, 1989)

  7. Hazañas.
  8. Algunos desarrolladores de software ponen un gran énfasis en la realización de hazañas en los proyectos (Bach, 1995). Pero lo que hacen tiene mas de malo que de bueno.

  9. Añadir mas personal a un proyecto retrasado.
  10. Esta es quizás el mas clásico de los errores clásicos. Cuando un proyecto se alarga, añadir mas gente puede quitar mas productividad a los miembros del equipo existente de la que añaden los nuevos miembros. Fred Brooks compara añadir gente a un proyecto retrasado con echar gasolina en un fuego (Brooks, 1975)

  11. Oficinas repletas y ruidosas.
  12. La mayoría de los desarrolladores consideran sus condiciones de trabajo como insatisfactorias. Alrededor del 60 por 100 indican que no tienen suficiente silencio ni privacidad (De-Marco y Liste, 1987).

  13. Fricciones entre los clientes y los desarrolladores.
  14. Las fricciones entre los clientes y los desarrolladores pueden presentarse de distintas formas. A los clientes puede parecerles que los desarrolladores no cooperan cuando rehúsan comprometerse con el plan de desarrollo que desean los clientes o cuando fallan al entregar lo prometido. A los desarrolladores puede parecerles que los clientes no son razonables porque insisten en planes irreales o cambios en los requerimientos después de que estos hayan sido fijados.
    En el caso medio, las fricciones entre clientes y desarrolladores de software llegan a ser tan severas que ambas partes consideran la cancelación del proyecto (Jones, 1994)

  15. Expectativas poco realistas.
  16. Una de las causas mas comunes de fricciones entre los desarrolladores y sus clientes o los directivos son las expectativas poco realistas.
    Una inspección de Standish Group marcó las expectativas realistas como uno de los cinco factores principales necesarios para asegurar el éxito de los proyectos internos de software de gestión (Standish Group, 1994)

  17. Falta de un promotor efectivo del proyecto.
  18. Para soportar muchos de los aspectos del desarrollo rápido es necesario un promotor del proyecto de alto nivel, incluyendo una planificación realista, el control de cambios y la introducción de nuevos métodos de desarrollo.
    El consultor Australiano Rob Thomsett afirma que la falta de un promotor efectivo garantiza virtualmente el fracaso del proyecto (Thomsett, 1995).

  19. Falta de participación de los implicados.
  20. Todos los principales participantes del esfuerzo de desarrollo de software deben implicarse en el proyecto. Incluyendo a los promotores, ejecutivos, responsables del equipo, miembros del equipo, personal de ventas, usuarios finales, clientes y cualquiera que se juegue algo con el proyecto.

    Continue reading