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.