lunes, 5 de junio de 2017

Instalar Debian 9 Strech vía Usb

Hoy he comprado un PC "nuevo", es un PC de hace unos 4 años pero en muy buenas condiciones, como de costumbre siempre hago un formateo completo y desde cero.

Pues bien, buscando entre mis discos de instalación, me doy cuenta que mi disco de instalación de DEBIAN esta dañado, por otro lado revisando en la página de DEBIAN, me consigo que ya está a punto de salir la nueva versión de DEBIAN, STRETCH o lo que es lo mismo DEBIAN 9. Descargo la RC4 que aparece en la web y me topo con otra sorpresa. No tengo discos para quemar mi imagen de DEBIAN 9 STRETCH, por lo que decido hacer mi primera instalación USB de DEBIAN.

Como nunca lo había hecho de esta manera, pues busque en la documentación de DEBIAN y conseguí un comando super sencillo para realizar esta operación.

Lo único que debemos tener en cuenta, es tener formateada nuestra memoria en FAT32, estuve revisando un poco más a fondo esta realidad y aparentemente también funciona con NTFS, pero preferí irme por lo seguro y documentación oficial leida.

Luego de esta previa solo queda aplicar el siguiente comando:

dd if=/ruta/de/nuestra/imagen/debian.iso of=/dev/sdX bs=4M; sync

Para los menos entendidos, explico un poco el funcionamiento del comando anterior

dd (Dataset Definition):

if=/ruta/de/nuestra/imagen/debian.iso: if significa “input file=archivo de entrada“, y /ruta/de/nuestra/imagen/debian.iso, lo que se quiere copiar.

of=/dev/sdX: of significa “output file=archivo de salida“, /dev/sdb, el archivo y/o dispositivo destino (donde se van a copiar los datos). ADVERTENCIA: Aquí deben cambiar X por la letra correspondiente a su USB, en mi caso es b, es decir, debe quedarles algo así, of=/dev/sdb

bs=4M: bs "block sector=sector de bloque", 4M tamaño del bloque, puede ser menos, pero por consiguiente más seguro y más lento, se recomienda definir este bloque a 1M, pero como quería un poco más de rapidez, decidí hacerlo a 4M. Cabe acotar que esta definición de bloque aplica para la lectura y escritura hacia y desde nuestro dispositivo.

sync: El comando sync sirve para forzar la grabación de los datos de la cache. Recomendado su uso antes de desmontar un dispositivo más si hubo modificaciones y movimiento de información ( cp y mv por ejemplo ) entre particiones como es nuestro caso. (OPCIONAL)

Ya solo toca conectar nuestro USB, iniciar nuestra PC, hacer los cambios respectivos referentes al inicio de nuestra PC vía USB y si te toca una PC un tanto vieja como la mía, debes indicar el tipo de inicio del disco duro y colocar el pendrive como la primera opción, por alguna razón reconoce el pendrive como otro disco duro :S.

Y listo, ahora si. A disfrutar de nuestra instalación jeje.

miércoles, 24 de mayo de 2017

Instalar Skype en Debian 9 64bits

Hoy me he topado con la sorpresa que Skype ya tiene soporte para 64bits, por lo que he decidido instalarlo.

Si bien se puede descargar de la página de Shype el .deb, al instalarlo, da el siguiente error:

Skype for Linux Beta signatures couldn't be verified because the public key is not available.
Buscando un poco, descubrí el siguiente enlace desde la misma página de Skype que nos ayuda a resolver el problema.

Solo hay que aplicar los siguientes pasos:


make sure you have 'apt-transport-https' installed 

dpkg -s apt-transport-https > /dev/null || bash -c "sudo apt-get update; sudo apt-get install apt-transport-https -y" curl https://repo.skype.com/data/SKYPE-GPG-KEY | sudo apt-key add - 

echo "deb [arch=amd64] https://repo.skype.com/deb stable main" | sudo tee /etc/apt/sources.list.d/skype-stable.list 

sudo apt-get update 

sudo apt-get install skypeforlinux -y 
Si todavía tienes problemas con la verificación de la llave pública, aplica la siguiente tira de comandos, al parecer no reconoce toda la tira de comandos anterior y listo ahora si :).
curl https://repo.skype.com/data/SKYPE-GPG-KEY | sudo apt-key add -
Espero le sirva a alguien que tambien tenga este mismo problema.

viernes, 19 de mayo de 2017

Un acercamiento a la implementación del método elementById de la clase QDomDocument de Qt

En ocasiones trabajamos con archivos xml bastante estructurados y se requiere de ciertos mecanismos para acceder de forma más eficiente a los elementos y/o nodos contenidos en estos. Un ejemplo de esto sería trabajar con HTML en el cual queremos acceder a un contenedor particular (DIV); y si hemos sido muy precavidos al momento de maquetar nuestro HTML, habremos definido ID's, si bien no para todos los DIV's (lo cual sería lo ideal, por lo de la web semántica y todo eso), por lo menos si para los DIV's más importantes y que proveen una funcionalidad muy particular.

Pues bien, si estamos trabajando con Qt e intentamos realizar una pequeña utilidad para analizar nuestro código HTML, una de las API con la que debemos trabajar sería la API xml y xmlpatterns, pero que sorpresa cuando al utilizar la clase QDomDocument, y se quiere acceder a un elemento por su ID, la documentación no muestra lo siguiente:

Returns the element whose ID is equal to elementId. If no element with the ID was found, this function returns a null element.
Since the QDomClasses do not know which attributes are element IDs, this function returns always a null element. This may change in a future version.
Devuelve el elemento cuyo ID es igual a elementId. Si no se encontró ningún elemento con el ID, esta función devuelve un elemento nulo.
Dado que las QDomClasses no saben qué atributos son identificadores de elementos, esta función devuelve siempre un elemento nulo. Esto puede cambiar en una versión futura.
http://doc.qt.io/qt-5/qdomdocument.html#elementById

Es decir, el método QDomDocument::getElementById ( const QString &elementId ), no está implementado, por esta razón, hoy traigo esta pequeña contribución que tenía mucho tiempo ya que había escrito para facilitar el acceso a elementos vía ID

QDomElement getElementById ( QString id ) {

  QDomElement elementReturned;
  QDomElement filesListNode = this->xmlDocument.firstChildElement ( "ETIQUETA_RAIZ" ).firstChild ().toElement ();
  while ( !filesListNode.isNull () ) {

    QDomNamedNodeMap attributes = filesListNode.attributes ();

    if ( attributes.namedItem ( "id" ).nodeValue () == id ) {

      elementReturned = filesListNode;
      break;
    }
    filesListNode = filesListNode.nextSibling ().toElement ();
  }
  return elementReturned;
}
Por otro lado mientras escribía esta entrada, me di cuenta que se puede hacer mucho más genérica y no tener que modificar nada, y esto sería cambiando la línea:

QDomElement filesListNode = this->xmlDocument.firstChildElement ( "ETIQUETA_RAIZ" ).firstChild ().toElement ();
por

QDomElement filesListNode = this->xmlDocument.documentElement ();
Hay que tomar en cuenta, que este método debe ser incluido en una clase que encapsule la utilización de la clase QDomDocument, donde habrá un atributo xmlDocument de tipo QDomDocument, es decir:

private:
  QDomDocument xmlDocument;
Por otro lado se pueden hacer variaciones, para hacerlo más genérico aun, como pasarle por parámetros, todos los datos requeridos para efectuar la implementación, un ejemplo sería:

QDomElement getElementById ( QDomDocument xmlDocument, QString id )
Pues bueno, la implementación les queda de tarea para la casa ;).

Hasta una nueva entrada.

jueves, 19 de enero de 2017

Crear usuario sudo en Debian

Hoy comentaré cómo agregar un usuario a la lista de sudo en Debian, de una manera muy sencilla.

Como primera acción, verificamos que usuarios tienen privilegios de root, es de saber que si estamos ante una instalación nueva lo más seguro es que solo tengamos el usuario root, por lo que escribiremos en la consola:

ls -ls /etc/sudoers
lo que nos debe mostrar por pantalla la siguiente información:

4 -rw-r----- 1 root root 692 ene 18 18:58 /etc/sudoers
Ahora bien, en el editor de texto de tu preferencia abrir con privilegios de root el siguiente archivo.

/etc/sudoers
Luego no vamos a la línea donde dice root ALL=(ALL:ALL) ALL, y agregamos la siguiente línea:

nuestro_usuario ALL=(ALL) ALL
Solo nos queda guardar y cerrar.

Ahora bien, ¡para que todo esto!. En ocaciones necesitamos hacer ediciones y/o modificaciones pero no es necesario habilitar el usuario root para esto, sino solo hacer uso de sus superpoderes en una acción específica, como por ejemplo editar el sources.list de apt, pues con esto solo haríamos los siguiente:

sudo nano /etc/apt/sources.list
Y solo estamos dandole superpoderes a nano para editar este archivo, y pues claro cualquiero otro que queramos abrir y/o editar, pero solo eso y no tenemos una sesión habilitada para root.

Otra forma de usar nuestro usuario como sudo en escritorios KDE y/o PLASMA es con la interfaz kdesudo, de la forma siguiente:

kdesudo kate /etc/apt/sources.list
Al igual que la opción anterior nos solicitará la clave de nuestro usuario para confirmar la signación de superpoderes a la aplicación que queremos ejecutar.

jueves, 15 de diciembre de 2016

Dilema de las clases estáticas en PHP

En mi búsqueda interminable por conseguir estratégias para abordar problemas cotidianos en la programación, hoy coloco esta idea como propuesta para resolver la ambigüedad de las clases estáticas en PHP.

Un poco de teoría para empezar.

¿Que es una clase estática?

Una clase estática, es una clase declarada como estática, que puede ser accedida o invocada sin la necesidad de tener que instanciar un objeto de la clase.

Y ¿Qué significa esto?. Pues bien, de acuerdo a la teoría si queremos hacer una instancia de la clase que queremos definir como estática pues no nos debe permitir hacer esto.


$miClase = new MiClase (); // Esto debe dar un error
Pero PHP no nos genera error al instanciar esta clase.

Por otro lado podríamos omitir el constructor ( cosa que veo mucho por internet en las definiciones de clases y que me parece una mala práctica, creo que toda clase debe tener su constructor y tener además la inicialización de variables en su interior ), pero PHP por omisión acepta la instanciación de la clase pues asume un constructor en blanco o vacío por omisión ante la ausencia explicita de este. Cosa que no resuelve nuestro dilema.

Otra opción muy viable, que funciona y es efectiva, sería colocar el o los modificadores private o protected al constructor, es decir,


private(protected) function __constructor () {

  // nuestro código de inicialización
}
Pero para que colocar código de inicialización si de igual manera no se puede instanciar y no se ejecutará esa sección de código. Pues bueno es solo un ejemplo capcioso para que se confundan jajajaja. Lo cierto es que si colocamos el constructor en private o protected al intentar instanciarlo PHP nos devolverá un error pues el constructor no tiene la visibilidad requerida para ser ejecutado. Pero adicional a esto, ¡que sentido tiene colocar un constructor en private o protected que no se puede usar!. Mejor obviamos esas líneas de código innecesarias, nuestro código queda mucho más limpio, fácil de leer y menos oportunidad para confundirnos.

Ahora bien, mi propuesta para resolver la ambigüedad de las clases estáticas en PHP es la de definir la clase como "ABSTRACTA" de la siguiente manera:


abstract class MiClase {

  static public $atributo_1 = EL_VALOR_QUE_SE_REQUIERA;

  static public function miFuncion ( mi_lista_de_parametros ) {

    // nuestro código
  }
}
Así, al intentar instanciarla como en el primer cuadro de ejemplo, nos devolverá un error, cosa que debe suceder pues en teoría es una clase "estática" y como dije anteriormente, nuestro código queda mucho más limpio, fácil de leer y menos oportunidad para confundirnos.

lunes, 1 de agosto de 2016

Abrir menú de Plasma 5 con la tecla "Windows" de nuestro teclado

Hoy he instalado Plasma 5 en un Debian 9 puro (es decir, desde cero ;P) y hasta ahora no me puedo quejar, todo ha ido muy tranquilo.

Pero como a mi me gusta tener algunas facilidades sobre todo al momento de acceder a algunos programas, comandos entre otras hierbas, no podía dejar pasar el hecho de tener que configurar la fatídica tecla de la ventanita de windows del teclado (que ahora tiene el logo de Debian jejeje).

Pues bien, resulta que en Plasma 5 las cosas cambiaron un poco, pero nada tan complicado como el anterior KDE4, de hecho es igual de facil, solo que cambiaron la ruta de inicio de ~/.kde/Autostart/ a ~/.config/plasma-workspace/env/.

Ahora bien, lo que tenemos que hacer es exactamente lo mismo que en un post anterior que ya había publicado, pero esta vez lo explico de manera diferente para una mejor experiencia para futuros cambios y/o reinstalación del sistema.

Primero: crearemos una carpeta con el nombre ".misScripts" en "/home/miUsuario" en lo adelante "~/" esto significa "/home/miUsuario". Tengan en cuenta que al colocarle el punto (.) al principio del nombre del archivo le estamos indicando que que será un archivo oculto, así, que no se asusten si no lo llegan a ver. Para poder ver y/o mostrar los archivos y carpetas ocultos, basta con utilizar la combinación de teclas Alt+. en nuestro gestor de archivos y allí está.

Segundo: abrir el editor de texto de nuestra preferencia y crear un nuevo archivo que yo en lo particular lo nombro "menuPlasma", en él escribimos las siguientes líneas:


remove mod4 = Super_L
keysym Super_L = F14
y guardamos en la ruta donde creamos nuestra carpeta "~/.misScripts".

Con éste archivo le diremos al sistema que la tecla "Super_L" es la tecla "F14", si "F14", si, ya sé que no existe, recuerda que lo que acabamos de hacer con esas líneas es re-programar el teclado de nuestra PC y no tiene que existir físicamente(como dije en el post anterior).

Tercero: terminado esto y entendido por qué hicimos esto, creamos otro archivo de texto, al cual llamaremos "menuPlasma.sh" y lo guardamos en la ruta "~/.misScripts", en él escribimos las siguientes líneas:


xmodmap ~/.misScripts/menuPlasma
como dato adicional, xmodmap es una utilidad para modificar el mapa de teclas (keymaps) y mapeador de apuntadores de teclas en Xorg.

Listo y entendido esto, por ser un script éste último archivo que hemos creado, le damos permisos de ejecución desde nuestra consola con:


$ chmod +x ~/.misScripts/menuPlasma.sh
O desde nuestro gestor de archivos le damos click derecho sobre el archivo, elegimos la opción "Propiedades" y en la pestaña "Permisos" marcamos la casilla "Es ejecutable".

Cuarto: procedemos a crear los enlaces simbólicos a nuestros archivos recien creados con el siguiente comando:


$ ln -s ~/.scriptInicio/menuPlasma ./~/.config/plasma-workspace/env/
$ ln -s ~/.scriptInicio/menuPlasma.sh ./~/.config/plasma-workspace/env/
Con esto, logramos que nuestros script, esten en una ubicación donde consideremos estén bien resguardados y solo hacer los enlaces simbólicos para cada nueva instalación.

Quinto: Ejecutamos el script haciendo click o doble click sobre el archivo menuPlasma.sh, o desde nuestra consola con un:


$ ./.misScripts/menuPlasma.sh
O


$ ./~/.config/plasma-workspace/env/menuPlasma.sh
Esto solo lo haremos esta vez, después el script se iniciará automáticamente).

Por otro lado, escudriñando un poco, también en Preferencias del Sistema->Arranque y Apagado->Autoarranque de Plasma tiene dos opciones "Archivo de escritorio" y "Archivo de script", esto muy práctico para los que nos son muy diestros con los comandos de consola. Del lado derecho hay un botón que dice "Añadir script" hacemos click en él y nos abre una ventana de dialogo para seleciconar el script creado, dandonos la opción de crearlo como un enlace simbólico (muy práctico para tenerlo muy bien guardado en alguna carpeta de nuestro /home y así, al tener que reinstalar o formatear nuestra pc no perder nuestras configuraciones) o también como un archivo script propiamente, con lo que nos copiará nuestro script en la ruta antes indicada. Al hacer este último procedimiento se puede obviar la ruta de inicio de Plasma indicada anteriormente, pues lo guarda en la misma carpeta pero de manera invisible para nosotros.

Luego de esto, configuramos el menú de KDE. Le damos click derecho sobre el menú de KDE, y seleccioonamos la opción "Preferencias de lanzador de aplicaciones" (Alt+D), en la sección "Acceso rápido de teclado" y donde aparece la llave de configuración, hacemos click sobre ella y presionamos nuestra famosa e "inexistente" tecla "F14" la cual se mostrará como F14, damos aceptar.

Y para finalizar, presionamos nuevamente nuestra tecla F14 y voila se abre nuestro menú de KDE, y si la volvemos a presionar se cierra nuestro menú.

viernes, 29 de abril de 2016

Solución a error de llave pública 1397BC53640DB551 de google chrome

Hoy al hacer una actualización de mi debian, se me presentó el siguiente error.

W: No existe ninguna clave pública disponible para los siguientes identificadores de clave: 1397BC53640DB551

No es que no me permitiera actualizar, pero me llamó la atención.

Después de investigar un rato solo conseguí una referencia a ese error en un foro de ubuntu, pero ahí conseguí otro enlace a reddit donde explican mejor el problema y la solución.

Al final lo que pude deducir de todo lo leido, es que la llave pública fué removida y hay que solicitar o actualizar la llave pública de google para google chrome.

Si bien la solución la consiguen en los enlaces que coloqué, aquí dejo la solución para no seguir dando vueltas como locos

Solución

wget -q -O - https://dl.google.com/linux/linux_signing_key.pub | sudo apt-key add -

lunes, 29 de junio de 2015

Abrir menú de KDE con la tecla "Windows" de nuestro teclado

Buenas amigos lectores, se que poco escribo por aquí, pero como siempre el trabajo poco me deja pasearme por mis espacios de regocijo.

En esta oportunidad, traigo una pequeña pero grandiosa utilidad que me traje de Windows, pues facilita el acceso a ese engranaje compuesto de inumerables aplicaciones que trae KDE más todas aquellas que terminamos instalando para nuestro confort y disfrute, así como también, para nuestro trabajo jeje.

Despues de buscar en tantos blogs y foros, por fin pude re-encontrar ese tutorial que tanto me ayudó en mi afan de asignar la tecla de la ventanita de mi teclado a mi menú de KDE.

El tutorial lo pueden conseguir en esta dirección pero para mi comodidad yo voy a describir en pocas líneas la forma como yo lo realizo.

Primero; abrir el editor de texto de nuestra preferencia y crear un nuevo archivo que yo en lo particular lo nombro ".menuKde", en él escribimos las siguientes líneas:



remove mod4 = Super_L
keysym Super_L = F14

y guardamos en la ruta "~/.kde/autostart". Tengan en cuenta que al colocarle el punto (.) al principio del nombre del archivo le estamos indicando que que será un archivo oculto, así, que no se asusten si no lo llegan a ver, para mostrar los archivos ocultos, basta con utilizar la combinación de teclas Alt+. en nuestro gestor de archivos y allí está.

Con éste archivo le diremos al sistema que la tecla "Super_L" es la tecla "F14", si "F14", si, ya sé que no existe, recuerda que lo que acabamos de hacer con esas líneas es re-programar el teclado de nuestra PC y no tiene que existir físicamente.

Ahora bien, terminado esto y entendido por qué hicimos esto, creamos otro archivo de texto, al cual llamaremos "menuKde.sh" y lo guardamos en la ruta "~/.kde/autostart", en él  escribimos las siguientes líneas:



xmodmap ~/.kde/Autostart/.menuKde

como dato adicional, xmodmap es una utilidad para modificar el mapa de teclas (keymaps) y mapeador de apuntadores de teclas en Xorg.

Listo y entendido esto, por ser un script éste último archivo que hemos creado, le damos permisos de ejecución desde nuestra consola con:



$ chmod +x ~/.kde/Autostart/menuKde.sh

O desde nuestro gestor de archivos le damos click derecho sobre el archivo, elegimos la opción "Propiedades" y en la pestaña "Permisos" marcamos la casilla "Es ejecutable". Ejecutamos el script haciendo click o doble click sobre el archivo menuKde.sh, o desde nuestra consola con un:



$ ./.kde/Autostart/menuKde.sh

(esto solo lo haremos esta vez, después el script se iniciará automáticamente)

Luego de esto, configuramos el menú de KDE. Le damos click derecho sobre el menú de KDE, y seleccioonamos la opción "Preferencias de lanzador de aplicaciones" (Alt+D), en la sección "Acceso rápido de teclado" y donde aparece la llave de configuración, hacemos click sobre ella y presionamos nuestra famosa e "inexistente" tecla "F14" la cual se mostrará como F14, damos aceptar.

Y para finalizar, presionamos nuevamente nuestra tecla F14 y voila se abre nuestro menú de KDE, y si la volvemos a presionar se cierra nuestro menú.


sábado, 21 de junio de 2014

Eclipse a tono para trabajar con PHP

Buenas a todos los mis amigos e internautas que me leen y revisan el blog, hoy después de tanto tiempo he vuelto a desempolvar este espacio que me ayuda a desestresarme de mi día a día.


Hoy después de mucho tiempo he vuelto a linux y como es habitual hay que comenzar a configurar muchas cosas, pero por razones de trabajo no tengo mucho tiempo para sentarme a configurar todo como quiero, así que empecé por configurar Eclipse, que es mi herramienta de trabajo para casi todo lo que tiene que ver con programación.


Aquí les dejo una pequeña pero muy completa configuración que siempre realizo en Eclipse para hacer que programar en PHP sea un juego de niños :p.


Expresiones Regulares

Para hacer fácil la tarea de generar expresiones regulares



PDT - Extensions

Posee un generador de clases e interfaces muy al estilo de la perspectiva Java e integrado a nuestro proyecto y librerías PHP. Además nos permite definir nuestras propias reglas para la sintaxis, estándares y convenciones a los cuales estamos acostumbrados a trabajar, sobre todo en mi caso que trabajo con una configuración de estándares bastante simple pero a la vez compleja toda vez que utilizo algunos estándares de C/C++, Java, PHP y algunos propios, todo eso junto :).



PTI - PHP Tool Integration 1.6.0

Nos ofrece una seria de herramientas como PHP_CodeSniffer, PHPUnit, PHP Depend, PHP Copy/Paste Detector, para una mejor estandarización de nuestro código, además de un complemento a las PDT-Extensions.



Jasper Studio

Para generar nuestros reportes, si bien no es fácil trabajar Java y PHP juntos, pero si se puede, hay algunas herramientas que nos permiten realizar esta tarea aunque con algunos dolores de cabeza jejeje.



Bueno, esto es todo por ahora, pero viene mucho más de PHP, C/C++, Qt, Java, GNU/Linux(Debian) y otras Hierbas ;).

domingo, 3 de junio de 2012

Manejo de transparencias en imagenes PNG y BLOB Mysql

Hace un tiempo tuve un inconveniente con los tipos de datos blob para mostrar imagenes de tipo png con transparencias. Si bien muchas personas en su  momento me criticaron por querer guardar imagenes en una base de datos, yo seguí empeñado en mi idea, y gracias a DIOS que seguí firme en mi convicción.

Si bien aparentemente hay que hacer más procesos por el hecho subir la imagen al servidor y convertir la imagen a tipo binario para poder guardarla  en la base de datos, me he dado cuenta que el rendimiento de mis páginas ha sido mejor, pues al mostrarlas no tengo que reconvertirlas, pues las muestro tal cual son, un dato binario, que por otro lado pesan mucho menos que una imagen de archivo físico.

Voy a mostrar el proceso para archivos de imagen de tipo png pero el procedimiento es análogo para imagenes de tipo jpeg y gif. He de acotar que todo está desarrollado bajo POO y aconsejo tener un poco de conocimiento sobre el tema para una mejor comprensión del ejemplo, pero igual puede ser utilizado en forma de script.

Pues bien, sin más ni menos, aquí lo que se necesita para hacer la conversión para guardar la imagen en base de datos y luego mostrarla.

Para convertir la imagen a blob necesitaremos la siguiente función:



/**
     * Convierte un archivo png en formato binario.
     *
     * @param string $archivo Url de la imagen.
     * @return binary Objeto de tipo blob.
     */
    public static function pngABlob ( $archivo ) {

        $imagenCreada = imagecreatefrompng ( $archivo );

        if ( imagealphablending ( $imagenCreada, true ) ) {//SI SE ESTABLECE EL CANAL ALPHA

            imagesavealpha ( $imagenCreada, true );
        }
        ob_start ();
        imagepng ( $imagenCreada );
        $imagen = ob_get_contents ();
        ob_end_clean ();
        return base64_encode ( $imagen );
    }


Explicando un poco, la función imagecreatefrompng crea una nueva imagen a partir de un archivo o de una URL.

La función imagealphablending establece el modo de mezcla para la imagen, debe llevar el segundo parámetro en "TRUE" para establecer el canal alpha de la imagen obtenida de la función anterior.

La función imagesavealpha permite guardar la información completa del canal alpha que se há creado con la función anterior, también debe llevar el segundo parámetro en "TRUE".

La función imagepng procesa la imagen obtenida.

Con la función ob_get_contents capturamos el contenido del búfer de salida del procesamiento de la función anterior.

Con la función ob_end_clean limpiamos el búfer para evitar errores y liberar memoria ;).

Y por último, con la función base64_encode que nos permite convertir nuestra imagen en memoria a un formato que pueda aceptar el campo de tipo blob de Mysql.

En este punto, ya podemos guardar nuestra imagen en la base de datos en un campo de tipo blob. No voy a explicar como hacer esta parte, pues ya  sabemos como guardar otro tipo de datos; el procedimiento es el mismo.

Ahora bien, para mostrarla, hacemos nuestra consulta a base de datos como de costumbre, lo único que cambia es la línea de código que viene a  continuación:


echo '<_img src="' . Imagenes::mostrarBlob ( $miImagen->getImagen () ) . '"/>';


Donde Imagenes es una clase abstracta que contiene la función que expliqué anteriormente y esta nueva que es mostrarBlob.$miImagen, es un objeto que contiene la consulta realizada a la base de datos, y el método getImagen devuelve especificamente la imagen blob
de la consulta.

Pero quien es esa función mostrarBlob?, pues aquí la tenemos.


public static function mostrarBlob ( $blob ) {

 $mime = Archivos::obtenerMimeTypeBlob ( $blob );
 return "data:" . $mime . ";base64," . $blob;
}


La cosa se nos esta complicando un poco, pero no importa, que lo que interesa aquí es aprender.

Ahora bien, para mostrarla correctamente, necesitamos saber el tipo de imagen a mostrar, que si bien sabemos que es de tipo png, el sistema no lo sabe. Para eso hacemos uso de una función que nos va a permitir el cometido.

Pero antes, saber que Archivos, es otra clase que agrupa funciones que permiten procesar archivos de diferentes tipos y el método obtenerMimeTypeBlob permite obtener el MIMETYPE de archivos guardados en base de datos con formato blob.

Por último, la línea de código return "data:" . $mime . ";base64," . $blob;
donde "data:" permite identificar el tipo de imagen (realmente el tipo de archivo), ";base64," nos permite indicar la codificación de nuestro dato blob y $blob el dato de la consulta.

Pero quien es obtenerMimeTypeBlob?, aquí su código:


public static function obtenerMimeTypeBlob ( $blob ) {
 $listaFirmas = array (
 "474946383761"=>"image/gif",
 "474946383961"=>"image/gif",
 "89504E470D0A1A0A"=>"image/png",
 "FFD8FFE0"=>"image/jpeg",
 "FFD8FFE1"=>"image/jpeg",
 "FFD8FFE8"=>"image/jpeg",
 "25504446"=>"application/pdf",
 "377ABCAF271C"=>"application/zip",
 "504B0304"=>"application/zip",
 );

 $blob = base64_decode ( $blob );

 $firma = substr ( $blob, 0, 60 );
 $firma = array_shift ( unpack ( "H*", $firma ) );

 foreach ( $listaFirmas as $firmaParcial => $Mime ) {

 if ( stripos ( $firma, $firmaParcial ) === 0 ) {

 return $Mime;
 }
 }
 return "application/octet-stream";
 }


Lo que hace esta función, es leer nuestro blob y obtener las coincidencias para los tipos de archivos indicados en el arreglo $listaFirmas,  solo lo he hecho para estos pocos archivos, pero es un comienzo ;). Al encontrar el mime correspondiente lo devuelve, si no, devuelve un tipo de mime genérico.

Pues bien, si piensan que la cosa está muy complicada porque utilizo muchas clases y no las hé colocado todas o completas, no es problema porque  si las metemos todas en una sola clase, igual funcionará este ejemplo sin ningún problema, pero de todas formas aquí les dejo una clase completa con todas las funciones necesarias :).


abstract class ManejoBlob {

 /**
 * Convierte un archivo png en formato binario.
 *
 * @param string $archivo Url de la imagen.
 * @return binary Objeto de tipo blob.
 */
 public static function pngABlob ( $archivo ) {

 $imagenCreada = imagecreatefrompng ( $archivo );

 if ( imagealphablending ( $imagenCreada, true ) ) {//SI SE ESTABLECE EL CANAL ALPHA

 imagesavealpha ( $imagenCreada, true );
 }
 ob_start ();
 imagepng ( $imagenCreada );
 $imagen = ob_get_contents ();
 ob_end_clean ();
 return base64_encode ( $imagen );
 }

 /**
 * Muestra un dato de tipo blob.
 *
 * @param binary $blob Dato de tipo blob.
 */
 public static function mostrarBlob ( $blob ) {

 $mime = Archivos::obtenerMimeTypeBlob ( $blob );
 return "data:" . $mime . ";base64," . $blob;
 }

 /**
 * Obtiene el mime type de un tipo de dato blob.
 *
 * @param binary $blob Dato de tipo blob.
 */
 public static function obtenerMimeTypeBlob ( $blob ) {
 $listaFirmas = array (
 "474946383761"=>"image/gif",
 "474946383961"=>"image/gif",
 "89504E470D0A1A0A"=>"image/png",
 "FFD8FFE0"=>"image/jpeg",
 "FFD8FFE1"=>"image/jpeg",
 "FFD8FFE8"=>"image/jpeg",
 "25504446"=>"application/pdf",
 "377ABCAF271C"=>"application/zip",
 "504B0304"=>"application/zip",
 );

 $blob = base64_decode ( $blob );

 $firma = substr ( $blob, 0, 60 );
 $firma = array_shift ( unpack ( "H*", $firma ) );

 foreach ( $listaFirmas as $firmaParcial => $Mime ) {

 if ( stripos ( $firma, $firmaParcial ) === 0 ) {

 return $Mime;
 }
 }
 return "application/octet-stream";
 }
}


PD. ¿Por qué la clase es de tipo abstract?, porque no requiere ser instanciada y así ahorramos memoria ;P

Hasta una próxima oportunidad.

martes, 14 de febrero de 2012

Una solución a los div's contiguos

Hoy después de mucho tiempo he vuelto a retomar la senda de la enseñanza.

Algo que siempre nos ha dado muchos dolores de cabeza ( sobre todo a mí ) al momento de maquetar nuestras páginas web, es el colocar un conjunto de capas (div) de forma continua dentro de otra capa.

Si bien una solución es el de definir la propiedad float:left o float:right, pues bien hoy y después de investigar un buen rato, he conseguido una forma un tanto más elegante de realizar este efecto sin mayores complicaciones y de forma más eficiente y menos dolorosa.

 Se que hay muchas paginas  y foros que hablan sobre esto, pero en verdad no había visto que emplearan esta solución y gracias a DIOS que mi afán de buscar siempre una forma más óptima de hacer las cosas me llevó hasta esta página que si bien ya la conocía y la he estudiado algo, no había prestado atención a las bondades de la propiedad display.

Solo hay que hacer los siguientes ajustes en nuestra css que definirá nuestras capas, el ejemplo que coloco es para tres columnas. Solo habría que ajustar el ancho de las columnas para insertar o eliminar capas.

CSS:


.capa1 {
    ...
    width: 25%;
    display: table-cell;
}
.capa2 {

    ...
    width: 50%;
    display: table-cell;
}

.capa3 {

    ...
    width: 25%;
    display: table-cell;
}


.capaPrincipal {
    ...
     width: 100%; 
    display: table;
}


HTML:


capa class="capaPrincipal"
     capa class="capa1" /capa
     capa class="capa2" /capa 
     capa class="capa3" /capa
/capa


Por razones de código tuve que cambiar el div por capa y quitarle los < y >, pero la idea se entiende.

Hasta una próxima oportunidad.

PD: Estaré montando una serie de tutoriales de como programar en POO con php.

domingo, 17 de abril de 2011

Instalar controladores privativos de nvidia en Debian 6 (Squeeze)

En esta oportunidad voy a explicar como instalar los controladores privativos de nvidia en Debian 6 (Squeeze).

Si bien existen muchos tutoriales en la web, muy pocos son los que están actualizados para esta versión que por lo general siempre traen nuevos trucos para lograr este cometido.

La diferencia de este radica en una explicación paso a paso de todo lo que hay que hacer para instalar estos controladores.

Se asume el conocimiento mínimo de comandos en linux, y como desplazarse entre carpetas por consola.

Lo primero que vamos a hacer es saber cual es la versión de nuestro kernel y a partir de ahí empezaremos a instalar las cosas que necesitaremos, con lo que escribiremos:

# uname -r

Debería mostrarnos un mensaje como este.

2.6.xx-x-xxx

Sabiendo esto, ahora podemos descargarnos los siguientes archivos:

linux-source-2.6.xx-x
linux-headers-2.6.xx-x-xxx


Al intentar instalar estos paquetes, nos preguntará si queremos instalar otros paquetes adicionales que son necesarios para nuestra tarea, les decimos que si (Esto se puede hacer con el gestor de paquetes de su preferencia, apt-get, aptitude, synaptic o adept) después de todo da lo mismo.

Mientras se descarga e instala todo eso, buscamos nuestro controlador privativo nvidia aquí.

Al descargarlos le damos permisos de ejecución aunque rara vez es necesario (he de recordar que hay que estar en la carpeta donde descargamos nuestro archivo, o indicarle la dirección):

# chmod +x /ruta/de/mi/archivo/NVIDIA-Linux-x86-260.19.44.run

Luego de todo esto, nos disponemos a eliminar los controladores que tenemos por defecto en nuestra instalación de Debian. Para esto, abrimos synaptic y buscamos lo siguiente y le decimos eliminar completamente:

xserver-xorg-video-nouveau
xserver-xorg-video-nv
libdrm-nouveau1


Ahora nos pasamos a las tty (ctrl+alt+f1) nos registramos como root y detenemos el entorno gráfico:

# etc/init.d/kdm stop (para el caso de KDE, para GNOME sería gdm )

Nos dirigimos a la carpeta donde descargamos el controlador de nvidia y ejecutamos el archivo:

# sh NVIDIA-Linux-x86-260.19.44.run

Por último, debemos escribir lo siguiente para evitar la carga de los controladores que teníamos instalados anteriormente:

# echo blacklist nouveau | tee -a /etc/modprobe.d/blacklist.conf

Ahora ya podemos reiniciar nuestro entorno gráfico de la siguiente forma:

# etc/init.d/kdm start

Si es de nuestra preferencia, se puede reconfigurar las X para hacer ajustes más precisos con:


# dpkg-reconfigure xserver-xorg

sábado, 9 de abril de 2011

Configurando apache para trabajar con repositorios Subversion en windows

En esta ocasión voy a explicar como configurar subversion para el control de versiones de nuestros proyectos.

De antemano advierto que solo se configurará Subversion para tener acceso vía web, esto por razones diversas, por lo general, los IDE's con los que trabajamos poseen plug-in's que acceden a nuestros repositorios de esta manera, por lo que no es necesario tener en ejecución el servidor svnserve para tener acceso a nuestros repositorios, bien desde nuestra red o bien desde Internet.

Se asume que ya se tiene instalado apache, en mi caso lo tengo instalado vía wamp versión 2.1e.

Este trae:

  • apache versión 2.2.17

  • php versión 5.3.3

  • mysql versión 5.5.8

  • PhpMyadmin versión 3.2.0.1

  • SQLBuddy versión 1.3.2

Primero que nada debemos descargarnos la aplicación en cuestión Subversion, la podemos encontrar aquí, para efectos de este mini-how-to, se utilizó la versión 1.6.6.

Para instalarlo basta con siguiente, siguiente, siguiente; a menos que quieras cambiar la dirección de instalación de subversion, la deberían tener en C://archivos de programas/Subversion.

Yo en lo particular lo he instalado en la carpeta de instalación de wamp, C:\wamp\bin\subversion\Subversion.

Ya instalado Subversion, haremos los siguientes ajuste:


  1. Tomamos los dos archivos .so que se encuentran en la carpeta bin de la instalación de subversion, en mi caso C://wamp/bin/subversion/Subversion/bin y los copiamos en la carpeta modules de nuestra instalación de apache C:\wamp\bin\apache\Apache\modules. A diferencia de otros tutoriales que se consiguen en la web

  2. Editamos el archivo httpd.conf, ubicado en la carpeta conf de la instalación de apache C:\wamp\bin\apache\Apache\conf, buscamos la sección de LoadModule y la linea LoadModule dav_module modules/mod_dav.so descomentarla.
    comentada

    #LoadModule dav_module modules/mod_dav.so

    descomentada

    LoadModule dav_module modules/mod_dav.so

    y al final de esta sección le añadimos las siguientes dos lineas (puede ser en el lugar que queramos):

    LoadModule dav_svn_module modules/mod_dav_svn.so

    LoadModule authz_svn_module modules/mod_authz_svn.so



  3. Ahora nos dirigimos al final del archivo agregamos la siguiente linea:
    Include conf/extra/httpd-subversion.conf

  4. Este archivo será el que utilicemos para crear la seguridad y el acceso a nuestros repositorios vía web.

  5. Pues bien, vamos a crear el archivo httpd-subversion.conf en la carpeta ubicada en C:\wamp\bin\apache\Apache\conf\extra, este archivo contendrá la siguiente información:

  6. <location /svn>

    # Le dice a Apache qué módulo será responsable de servir esa URL - en este caso, el módulo de Subversion.
    DAV svn

    # Para Subversion 1.3 y superiores, esta directiva habilita el listado de todos los repositorios disponibles bajo SVNParentPath.
    SVNListParentPath on

    # Activa la versión automática de WebDAV sin un cliente SVN.
    SVNAutoversioning on

    # Opciones de indexacion.
    Options Indexes MultiViews IncludesNoExec

    # Le dice a Subversion que busque repositorios en C:/ruta/de/mis/repositorios.
    SVNParentPath C:/ruta/de/mis/repositorios

    # Utilizado para mejorar la visualización desde un navegador de web.
    SVNIndexXSLT /svnindex.xsl

    # Se utiliza para activar la autenticación básica, es decir, Usuario/contraseña.
    AuthType Basic

    # Se utiliza cuando aparece el diálogo de autenticación como información para indicar que se necesita su autenticación.
    AuthName "Mis Repositorios"

    # Especifica qué archivo de contraseñas se utiliza para la autentificación.
    AuthUserFile C:/wamp/bin/apache/Apache2.2.17/usuarios.conf

    # Lugar del archivo de Acceso para las rutas dentro del repositorio de Subversion.
    #AuthzSVNAccessFile C:/wamp/bin/apache/Apache2.2.17/acceso.conf

    # Obliga a apache a solicitar autenticación usuario/contraseña
    Require valid-user


    </location >

    Para mayor información de como configurar esta sección pueden referirse a la siguiente dirección.

    Nota: En <location /svn>, /svn (puede ser cualquier nombre), es el nombre con el que accederemos vía web, es decir, http:/<monbre de mi servidor>//svn


  7. Después de todo esto, necesitamos crear el archivo de usuarios que podrán acceder a nuestros repositorios, tal como se especificara en el punto anterior, le colocaremos el nombre de usuarios.conf, este archivo lo colocaremos en la carpeta raíz de apache C:/wamp/bin/apache/Apache, aunque puede ir en el lugar que mejor no parezca. Para esto hacemos win+r escribimos cmd y nos abre la consola de MS-DOS (tambien se puede hacer inicio->ejecutar->cmd) y escribimos los siguiente:
    C:\wamp\bin\apache\Apache\bin\htpasswd -cm "C:\wamp\bin\apache\Apache\usuarios.conf" administrador
  8. nos solicitará la contraseña para el usuario administrador dos veces. Si queremos agregar nuevos usuarios solo tendremos que ejecutar la siguiente linea
    C:\wamp\bin\apache\Apache\bin\htpasswd -m "C:\wamp\bin\apache\Apache\usuarios.conf" nuevousuario
    Nótese que en esta ocasión solo se ha colocado la opción -m y no -cm; esto es porque la opción c crea el archivo que le hemos colocado, para más información refiérase a la documentación de Subversion aquí.

  9. Por otro lado tenemos el acceso a los repositorios a través de lo que se llama rutas de acceso, este archivo lo crearemos al igual que en el punto anterior en la carpeta C:/wamp/bin/apache/Apache con el editor de texto de nuestra preferencia, en él colocaremos la siguiente información:
    [aliases]

    administrador = CN=Nombre del administrador,OU=area de trabajo,DC=grupo de trabajo,DC=empresa
    usuario1 = CN=Nombre del Usuario1,OU=area de trabajo,DC=grupo de trabajo,DC=empresa
    usuariodev = CN=Nombre del Usuariodev,OU=area de trabajo,DC=grupo de trabajo,DC=empresa
    usuariodoc = CN=Nombre del usuariodoc,OU=area de trabajo,DC=grupo de trabajo,DC=empresa


    [groups]
    administratores = &administrador, &usuario1
    desarrolladores = &usuariodev
    documentadores = &usuariodoc
    invitados = anonymous, anonimo

    # Regla de acceso por defecto para TODOS los repositorios
    # Todo el mundo puede leer, los administradores pueden escribir.
    [/]
    * = r
    @administrador = rw

    # Dar a los documentadores acceso de escritura
    # a todas las carpetas de documentación
    [miproyecto:/trunk/doc]
    @documentador = rw

    [miproyecto:/trunk]
    @administrador = rw
    @desarrollador = rw
    @documentador = r
    usuariodev = rw

    [miproyecto:/branches]
    @administrador = rw
    @desarrollador = rw
    usuariodev = r

    [miproyecto:/tags]
    @administrador = rw
    @desarrollador = rw
    @documentador = r
    usuariodev = r

    [miotroproyecto:/]
    @administrador = rw
    @desarrollador = rw
    @documentador = rw

    Nota: este es un ejemplo para visualizar algunas combinaciones que se pudieran hacer en este archivo.

Nota: En el punto 5 la linea #AuthzSVNAccessFile C:/wamp/bin/apache/Apache2.2.17/acceso.conf aparece comentada, esto es porque por alguna razón que desconozco por el momento, apache no está permitiendo acceder a los repositorios a través de los grupos definidos; mientras resuelvo el problema se mantendrá comentada.

Nota: En el mismo punto 5 la linea #SVNIndexXSLT /svnindex.xsl también esta comentada, este archivo es un compendio de 2 archivos el svnindex.xsl y svnindex.css; estos archivos van en la carpeta que indica la directiva DocumentRoot del archivo de configuración httpd.conf de Apache. Los archivos se pueden conseguir en la web con solo escribir svnindex.xsl



lunes, 21 de marzo de 2011

Editor visual para eclipse

Revisando en internet en mi afán de conseguir una buena solución para el diseño de ventanas en eclipse de forma gráfica, he descubierto que se puede hacer uso de el entorno visual de netbeans , gracias a MyEclipse que ha adaptado el plugin del visual editor para eclipse y de aquí hé tomado la información.

Pero de todas formas aquí dejo la solución, solo tenemos que agregar esta dirección a nuestros repositorios de eclipse y voila.

Help > Install New Software> Add>

colocamos la etiqueta Swing GUI Designer, puede ser cualquier nombre que le queramos poner y agregamos la URL http://downloads.myeclipseide.com/downloads/products/eworkbench/helios/enterprise-earlyaccess

lunes, 15 de febrero de 2010

Comet ó Ajax

INTRODUCCIÓN

Hace casi cuatro años (aproximadamente) se hablaba de una nueva técnica de programación Web que utiliza el objeto XMLHttpRequest, muy similar a Ajax, por algunos llamada Comet. Está técnica también es conocida como Reverse Ajax, Ajax Push, Server Push, HTTP Push , Two-way-web, HTTP Streaming y HTTP server push entre otros.

HISTORIA

En el año 1994 Netscape Navigator 1.1 introdujo la posibilidad de realizar un "server push" a través de un tipo de contenido HTTP multipart / x-mixed-replace.  Una ejecución CGI mantenía una conexión TCP abierta en el navegador, con la que se podía realizar el envío de nuevos contenidos a intervalos arbitrarios, sin una solicitud del cliente.

Esta técnica tenía algunas aplicaciones interesantes, pero se adelantó a su tiempo y se empleó raramente. El soporte multipart / x-mixed-replace nunca fué agregado a Internet Explorer, así que cuando Netscape perdió la guerra de los navegadores en la década de los 90, esta técnica fue en su mayoría abandonada.

         Con la incorporación de ajax en el contexto de la programación web se comenzaron a presentar nuevos retos de desarrollo, lo que ha permitido el resurgimiento de esta vieja tecnología que data de hace más de 25 años.

                Alex de DojoToolkit.org fué el primero en definir esta técnica hacia el año 2006, y Dojo es el primer framework que implementa Comet.

EN QUE CONSISTE

Comet (Push Ajax) nos permite establecer una conexión abierta de larga duración entre el cliente y el servidor web, en este caso, es el servidor el que se encargará de enviar información al cliente cuando se genere algún evento en este.

Esta tecnología difiere del modelo original de la web, en el que un navegador solicita una página web completa o trozos de datos para actualizar una página web. En la práctica, las aplicaciones Comet usan tradicionalmente programación AJAX con una petición prolongada para detectar nueva información en el servidor.

Esto no quiere decir que el cliente no envía información al servidor, al contrario, si envía información al servidor, pero en este caso, el servidor no le responde al cliente con un bloque de datos, espera a que se suscite algún evento para informar al cliente de su nuevo estado.

Diagrama COMET


QUIENES USAN Comet

  • Chat en GMail
  •  Meebo
  •  Facebook
  •  Twitter
  •  Entre otros.

EJEMPLOS Y DOCUMENTACIÓN

En los siguientes enlaces se puede conseguir bastante información sobre la implementación de esta no tan nueva tecnología llamada COMET.

Español

http://www.ribosomatic.com/articulos/como-implementar-comet-con-php-y-prototype/

http://component-showcase.icefaces.org/component-showcase/showcase.iface

Ingles

http://cometdaily.com/

http://cometdproject.dojotoolkit.org/

http://alex.dojotoolkit.org/2006/03/comet-low-latency-data-for-the-browser/

http://www.ape-project.org/demos/1/ape-real-time-chat.html

http://www.lightstreamer.com/?gclid=CNjqupv39J8CFRKenAod8QL7-g

 

CONCLUSIONES

Como palabras finales, son innumerables las aplicaciones que se pueden servir de esta tecnología, que si bien no es nada nueva, hasta hace poco tiempo no se le prestaba la debida atención y que indudablemente está marcando una nueva era en la prestación de servicios vía web, lo que representa un crecimiento cada vez mayor de este mercado.

Por otro lado cabe destacar, que si bien esta tecnología hace uso en algunas implementaciones de otra tecnología tal como lo es ajax, no se debe confundir, pues puede ser aplicada sin el uso de esta.

                Se recomienda el uso de la terminología Push ajax para esta tecnología.

REFERENCIAS

http://alex.dojotoolkit.org/2006/03/comet-low-latency-data-for-the-browser/

http://www.openjsan.org/doc/f/fu/fuzzynerd/HTTP/Push/0.04/lib/HTTP/Push.html

http://es.wikipedia.org/wiki/Comet

miércoles, 27 de enero de 2010

No se ejecuta código javascript o archivo .js

Programando una página web a un cliente, se me presento un problema al momento de hacer algunos códigos en javascript.

Realmente nunca se me había presentado un error así, pero siempre hay una primera vez. Por falta de experiencia en el tema (muy poco programo con javascript y solo hago validaciones muy sencillas), pero esta vez tuve la necesidad de hacer cosas un poco más complejas.

El problema de los errores radica en los errores sintácticos, que son el común denominador en la programación, porque nadie es infalible, pero que a veces por no entender porque falla nuestro código, el estrés se vuelve el peor enemigo del programador porque nos nubla el entendimiento. 

Pero bien, como dije anteriormente el problema son los errores y si tenemos uno o varios de ellos, nuestro código javascript no se ejecutará y nos coloca en un dilema mayor cuando hacemos llamados a otros archivos bien sean js, php, jsp, html, java, xml, txt, css o asp (por nombrar algunos) y perdemos el enfoque del error, por supuesto que los errores logicos son mas difíciles de detectar y un editor no lo resuelve, pero al depurar los errores sintácticos ya es mucho peso el que nos quitamos de encima.

En fin la solución que conseguí para evitar errores sintácticos en la programación con javascript es trabajar con un editor para este lenguaje, mis problemas se redujeron en un 75% y eso es mucho en términos de tiempo.

Conseguí uno muy bueno llamado JavaScript Editor, con el que puede revisar sintaxis además que ofrece una serie de ejemplos, código y rutinas ya probado con el cual se facilita la programación de muchas cosas triviales.

Espero que como a mí, todo el que lea este comentario le sirva de ayuda y no se quede a esperar la solución.

domingo, 15 de noviembre de 2009

Estrenando red en casa


Me he comprado un router TP-LINK modelo TL-WR340G 54M Wireless Router debo confesar que lo adquirí a riesgo de que no trabajara de la manera como esperaba configurarlo, pero ¿cual es mi sorpresa? hace muchas cosas y más, de verdad que es muy completo en cuanto a funciones, muy fácil de configurar y se puede actualizar el firmware cosa que me llamo mucho la atención, el problema sería si diera conflictos al momento de actualizarlo lo cual espero que no.

Configurando este juguete nuevo y luego leyendo la documentación del fabricante, note que se puede utilizar como repetidor de señal wifi, cosa que por demás me pareció muy interesante, por si se quiere extender el alcance de nuestra señal.

Les comento los pasos que realicé para la configuración de mi nuevo juguete:

Primero seguí las instrucciones del manual y el mini-CD que trae, que después de solo unos escasos 5 minutos ya tenia funcionando el acceso a Internet.

Segundo, como es evidente; al ver los pasos de configuración, aun no tenia configurado el DHCP ni el DNS de mi red.

Tercero, para facilitarme mucho las cosas y porque me moría de ganas de tener en funcionamiento mi red, decidí usar el DHCP de mi ISP y un DNS dinámico gratis de Internet que pueden conseguir aquí, más adelante les comentaré como crear tu propio servidor DHCP y DNS para nuestra red y así tener un control mayor de quien se conecta a nuestra red y que es mejor para la administración de la misma.

Les recomiendo este dispositivo para hacer sus pequeñas redes caseras, y por que no de oficina, tiene muy buen sistema de seguridad wifi, nada que envidiarle a muchos router's económicos en el mercado.

lunes, 12 de octubre de 2009

Instalar driver de video VIA (openchrome) en Mini Laptop Siragon ML-1010 con Debian



Desde hace días que me venía dando dolores de cabeza instalar Debian en una Mini Laptop Siragon ML-1010, uno de los primeros problemas que se me han presentado es el del video, que me muestra un escritorio mucho más grande del de la pantalla.

He buscado y rebuscado en diferentes foros y no daba con la respuesta a mi problema, hasta que he encontrado la solución, en uno de los foros de ubuntu, pero aun así voy a colocar aquí como se resuelve el problema de estos driver de video que como sacan de quicio a cualquiera:

Primero, en consola como super usuario, escribimos lo siguiente:

apt-get install build-essential subversion autoconf automake1.9 libtool

Luego, escribimos lo que sigue a continuación:

apt-get build-dep xserver-xorg-video-openchrome

Después, descargamos los driver openchrome:

svn checkout http://svn.openchrome.org/svn/trunk openchrome

Ahora nos movemos a la carpeta openchrome que acabamos de descargar (seguramente se nos descargó en la carpeta /home/carpeta_usuario)

Como usuario normal escribinos el siguiente comando en consola:

./autogen.sh --prefix=/usr

Y luego:

make

Ahora como super usuario escribimos los siguiente:

make install

Después de haber hecho todo esto, tenemos que hacer una pequeñas modificaciones al archivo xorg.conf, ubicado en la dirección /etc/X11/ (solo substituir las siguientes secciones, no sobre escribir el archivo):

Section "Monitor"
     Identifier "Monitor0"
     Option "DPMS" "true"
     HorizSync 31.5-55
     VertRefresh 40-70
     Modeline "1024x600" 48.96 1024 1064 1168 1312 600 601 604 622 -HSync +Vsync
EndSection

Section "Device"
     Identifier "Card0"
     Driver "openchrome"
     VendorName "VIA"
     BoardName "UniChrome"
     Option "ForcePanel"
     Option "ActiveDevice" "LCD,CRT"
     Option "PanelSize" "1024x600"
     Option "SWcursor"
EndSection

Section "Screen"
     Identifier "Screen0"
     Device "Card0"
     Monitor "Monitor0"
     DefaultColorDepth 24
     SubSection "Display"
          Depth 1
          Modes "1024x600" "800x600" "640x480"
     EndSubSection
     SubSection "Display"
          Depth 4
          Modes "1024x600" "800x600" "640x480"
     EndSubSection
     SubSection "Display"
          Depth 8
          Modes "1024x600" "800x600" "640x480"
     EndSubSection
     SubSection "Display"
          Depth 15
          Modes "1024x600" "800x600" "640x480"
     EndSubSection
     SubSection "Display"
          Depth 16
          Modes "1024x600" "800x600" "640x480"
     EndSubSection
     SubSection "Display"
          Depth 24
          Modes "1024x600" "800x600" "640x480"
     EndSubSection
EndSection

Section "DRI"
     Mode 0666
EndSection

Section "Extensions"
     Option "Composite"
EndSection

Por ultimo guardamos, reiniciamos y listo, ya tenemos nuestro Debian funcionando a la perfección, con nuestro driver de video.

martes, 6 de octubre de 2009

Convertir archivos .nrg a .iso en Debian

Si tienes problemas para grabar imagenes de cd de nero en Debian, aquí esta la solución:

apt-get install nrg2iso

Usarlo es muy sencillo, solo tienes que escribir la siguiente linea en consola y listo, esperar nuestro archivo iso.

nrg2iso archivo_NERO.nrg archivo_ISO.iso

domingo, 4 de octubre de 2009

Reiniciar servicios en Debian

Haciendo algunas modificaciones en mi laptop, específicamente configurando mi tarjeta de red inalámbrica, me resulto un poco inconveniente tener que reiniciar el sistema completo pudiendo solo reiniciar el servicio de red, como otrora hubiese hecho con fedora en donde trabaje un buen tiempo.

Pues buscando un poco en los manuales, conseguí lo que estaba buscando.

Comandos para iniciar, detener o reiniciar el servicio de red en Debian y en muchas otras distribuciones linux:

Para iniciar el servicio:
# /etc/init.d/ start

Para detener el servicio:
# /etc/init.d/ stop

Para reiniciar el servicio:
# /etc/init.d/ restart

Como ejemplo les dejo las lineas de consola que me facilitaron la vida en el trabajo reiniciar el servicio de red mientras configuraba el wifi.

Para iniciar el servicio de red:
# /etc/init.d/networking start

Para detener el servicio de red:
# /etc/init.d/networking stop

Para reiniciar el servicio de red:
# /etc/init.d/networking restart

Con estos comandos nos evitamos el tedioso trabajo de reiniciar (esperar, perder tiempo) los servicios al mejor de los estilos de windows.