Miércoles 20 de agosto de 2014

Ramon Marquez

Ramon Marquez
Libuntu » Linux

Linux 3.17 tendrá mejor rendimiento gráfico con el driver opensource Radeon

Buenas noticias para los usuarios que usen GPU’s de AMD ya que según varias pruebas realizadas, Linux 3.17 ofrecerá mejoras en cuanto al rendimiento gráfico al usar el driver abierto Radeon. La gente de Phoronix ha realizado algunas pruebas con la primera versión candidata de Linux 3.17 y la versión de desarrollo de Mesa 10.3… Read More »
Ramon Marquez

Ramon Marquez
Libuntu » Linux

Marc Merlin de Google habla sobre las ventajas de BTRFS y las desventajas de ZFS

El administrador de sistemas Linux en Google, Marc Merlin, ha indicado varios puntos sobre el porque usar el sistema de archivos BTRFS sobre ZFS durante su presentación el día de ayer en la LinuxCon. La presentación llevó por título “Por qué deberías de considerar usar BTRFS, Instantáneas reales tipo COW y un incremento a nivel… Read More »

Ser fotógrafo con Software Libre

10538712_1440110709612031_223465409_nSé que hoy es día de podcast, sin embargo, fue una semana agitada y aunque hoy no les traigo un tutorial como tal, (pueden considerar que el tutorial de la semana fue el de estabilización de videos con transcode) no los voy a dejar sin video, pero un video muy especial.

Tengo trabajando con diseño utilizando solo herramientas libres desde el 2005 y muchas personas siempre cuestionan el hecho de que utilice herramientas no comerciales, a unas les da curiosidad, mientras que otras personas prefieren contratar diseñadores que solo utilicen el paquete de Adobe. En fin, entre gustos y colores lo importante es la variedad.

Este fin de semana pasado, en vez de estar grabando un podcast como de costumbre, estuve fotografiando la boda de Juan y Nancy, aproveché de estrenar la nueva cámara (Si, pronto vendrá un review) y poner en practica algunas cosillas que he ido aprendiendo en el camino. Una boda siempre es un momento especial y, ser fotógrafo, te permite compartir ese momento especial con tus clientes. Es como casarse cada fin de semana, aunque es trabajo, uno siempre se vuelve a enamorar.

Este artículo solo quería escribirlo para dejarles una reflexión, hace algún tiempo hablé con un fotógrafo que admiro mucho y le comenté que no sentía que las fotografías que yo tomaba se parecían en nada a las que tomaban otros colegas, y su respuesta fue: “Si un cliente te contrata, es porque le gustan tus fotos y tu estilo, recuerda que junto a tu servicio, vendes una parte de tu personalidad. Disfruta ser diferente, eso es lo que te hace ser único”.

Hoy hay video! pero está en una página diferente, está en Tap.Pics y es el video que refleja mi trabajo y lo que pueden hacer con los pequeños tutoriales que siempre les dejo en el Blog. Espero que les sirva de motivación y puedan visualizar todas las capacidades que tienen las herramientas Libres que hay en la red. Todo es posible.

a8VhAAq(Foto por Richzendy)

flattr this!

Lunes 18 de agosto de 2014

Estabilizar videos en Linux con Transcode y Vid-Stab

Tener una cámara que grabe videos es algo que siempre quise, sin embargo, no tengo un estabilizador de imagen, por lo que aunque tengo una calidad increíble, el movimiento que genera mi pulso no ayuda para nada. Es por eso que decidí ver que opciones tenía en Linux y me conseguí con Vid-Stab, el cual permite estabilizar la imagen. vid-stab es un plugin para transcode, por ende, lo primero que debemos instalar es transcode:

[tatica@susan Descargas]$ su -
[root@susan ~]$ yum -y install transcode

Ahora, solo debemos bajarnos el plugin, descomprimirlo e instalarlo: (Verifica la última versión en: http://public.hronopik.de/vid.stab/download.php?lang=en )

[tatica@susan Descargas]$ wget -c http://public.hronopik.de/vid.stab/files/vid.stab-0.98b-transcode-1.1-binary-x86_64.tgz
[tatica@susan Descargas]$ tar -zxvf vid.stab-0.98b-transcode-1.1-binary-x86_64.tgz
[tatica@susan Descargas]$ cd vid.stab-0.98b-transcode-1.1-binary-x86_64
[tatica@susan vid.stab-0.98b-transcode-1.1-binary-x86_64]$ ./install.sh

Así de sencillo es instalar el plugin, ahora vamos a estabilizar nuestro video. Esto generará un archivo trf donde se almacenará la información de los fotogramas que luego serán afectados por la transformación que transcode realizará.

[tatica@susan Videos]$ transcode -J stabilize -i ORIGINAL.mp4

Una vez obtenido el archivo trf, es momento de transformar el video:

[tatica@susan Videos]$ transcode -J transform -i ORIGINAL.mp4 -y xvid -o ESTABILIZADO.mp4

Y eso es todo! Siempre puedes agregar opciones adicionales tanto para mejorar la salida, como para cambiar el codec o incluso, para aplicar una reducción aún mayor del movimiento generado por el pulso u otros elementos.

Me tomé la libertad de hacer una prueba y tomar un video de Gris, el consentido de la casa. Perdí un poco de calidad, sin embargo, la estabilización funcionó a la perfección.

Youtube Link: https://www.youtube.com/watch?v=Y-DTBXulhlc

flattr this!

Miguel Ángel Useche

Miguel Ángel Useche
El weblog de Skatox » Planetas

Ubica tu telefono Android perdido y elimina sus datos con las cuentas de Cyanogenmod

A todos los usuarios de teléfonos con Android, siempre les doy recomendaciones para usar Cyanogenmod, una modificación del sistema operativo que incluye mejoras y optimizaciones para mejorar la experiencia de uso en el dispositivo. Entre sus ventajas existe una poco conocida: la posibilidad de ubicar tu teléfono y eliminar todos los datos en caso de pérdida. Algo muy útil en caso de robo, pérdida del teléfono por descuido, entre otros.

Para ello, solo debes entrar la configuración del teléfono y luego en la sección de cuentas, allí veras la opción para crear una cuenta de Cyanogenmod y listo. Luego podrás acceder a sitio de las cuentas de Cyanogenmod y tu dispositivo debe aparecer listado.

Opciones del dispositivo con Cyanogenmod

Opciones del dispositivo con Cyanogenmod

Entre las opciones puedes ver Ubicación, donde la aplicación web se conecta remotamente con el teléfono y a través del servicio de localización te muestra su posición en Google Maps (el teléfono debe tener activada la opción de ubicación precisa, de lo contrario no funciona). De esto modo, en caso de pérdida del dispositivo, sabrás su ubicación exacta y puedes intentar recuperarlo.

Ubicacion con Cyanogenmod

Punto en el mapa donde se encuentra ubicado el teléfono

El otro servicio disponible es el de Borrado remoto, para cuando des por perdido tu teléfono y deseas que el ladrón no tenga acceso a tu información, al eliminarla por completo. También esta opción es útil para borrar toda los datos antes de instalar otra ROM.

Aunque son funcionalidades simples, son añadidos extra que posee esta ROM, ademas a diferencia de servicios similares, es gratuito y respeta la privacidad de los datos, pues según ellos, toman poca información y no es comercializada a terceros.

Espero que haya sido útil esta información y que no tengan que utilizarla algún día.

Viernes 15 de agosto de 2014

Ramon Marquez

Ramon Marquez
Libuntu » Linux

Varios cambios en BTRFS fueron rechazados para ser integrados en Linux 3.17

Luego del envío de varios cambios en el sistema de archivos BTRFS al mainline del kernel Linux para que estos fuesen integrados en Linux 3.17, Linus Torvalds, conjuntamente con varios desarrolladores de Linux rechazaron integrar estos cambios y decidieron integrarlos para Linux 3.18 Chris Mason, líder del desarrollo de BTRFS habría enviado cientos de líneas… Read More »

Jueves 14 de agosto de 2014

Comunicada y Actualizada, Review General del Moto G

Y por fin estoy de vuelta en la red telefónica! Mi último teléfono, un Sony Ericsson Xperia ray, llegó a las últimas hace poco más de dos meses cuando, además de la ya molesta falla de encendido y apagado, se le sumó el hecho de que dejó de reconocer mi SIM y por ende, quedé desconectada de mundo. 

Adquirí el Moto G, volviendo a mis andanzas con Motorola quien, cuando tuve el Milestone, nunca me dejó abandonada. Esto no pretende ser un review detallado, solo evaluaré las características que más me han llamado la atención de este dispositivo (poco a poco iré haciendo reviews de cosas mas detalladas)

motog

  • Red: GSM 850 / 900 / 1800 / 1900 (SIM 1 & SIM 2 opcional) – HSDPA 850 / 900 / 1900 / 2100
  • 3G HSDPA 21 Mbps/ HSUPA 5.76 Mbps
  • EDGE Clase 12
  • Wi-Fi 802.11 b/g/n; banda dual, DLNA
  • Bluetooth v4.0 A2DP
  • GPS con soporte A-GPS, GLONASS

Es compatible con todas las telefonías, sin embargo, si vives en Venezuela, tendrás que cambiar tu chip por una MicroSIM o cortarla en un agente autorizado (30Bsf. Aprox) ya que el slot que tiene solo acepta esta medida. Todo lo demás relacionado con la conectividad funciona a la perfección.

  • Dimensiones: 129.9 x 65.9 x 11.6 mm
  • Peso: 143 g

Es un teléfono grande, no lo voy a negar, y como nunca he sido capaz de comprar un forro decente para los modelos de los que me he antojado, decidí comprarlo con forro y todo, lo cual le agrega unos milímetros adicionales. Cabe destacar que no me cabe en el bolsillo del pantalón, así que me tocará aprender a utilizar cartera.

El forro que adquirí, aunque grande, lo recomiendo al 100%. Es un triple forro de Fosmon, el cual incluye un forro convertible en 3. Viene con el clásico forro de silicona y te permite agregarle un extra con stand para el escritorio y otro adicional con clip para la ropa o colgarlo de cualquier lugar.

  • LCD TFT touchscreen capacitivo, 16M colores
  • Tamaño 720 x 1280 pixels, 4.5 pulgadas
  • Cámara 5 MP, 2592?1944 pixels
  • Autofocus, flash LED, geo-tagging, foco táctil, estabilizador de imagen, HDR, video 720p@30fps y Slow Motion.
  • Cámara frontal 1.3 MP
  • Pantalla Gorilla Glass 3
  • Sensor de luz ambiente
  • Sensor de proximidad para auto apagado
  • Sensor acelerómetro para auto rotación
  • Soporte multitouch
  • Editor de imagen/video

Solo puedo decir “Madre Pantalla”, tenía tiempazo que no me disfrutaba de una pantalla con tan buena resolución…

  • Ringtones Polifónico, MP3, WAV
  • Conector de audio 3.5 mm
  • Reproductor de video MP4/H.263/H.264
  • Reproductor de audio MP3/AAC+/WAV/eAAC+
  • Radio FM

El sonido es ensordecedor, por lo que no tendrás problemas tanto para escuchar los repiques, como para el audio de llamada.

  • Slot de tarjeta No
  • 16GB memoria interna

El único contra (si se le puede decir así) es que no trae slot para SD, sin embargo, hay dos modelos disponibles; uno de 8Gb y otro de 16Gb. Mi modelo es el de 16Gb y en mi tlf anterior siempre tenía un poco de espacio disponible de los 8Gb que tenía, así que, es solo cuestión de mantenimiento y no llenar el tlf de basura.

  • 1GB RAM
  • Procesador: Qualcomm Snapdragon 400 quad-core 1.2 GHz, GPU Adreno 305
  • OS: Android OS, v4.3 Jelly Bean (actualización a Android 4.4 KitKat asegurada)

Luego de dos años sin poder actualizar mi ROM finalmente sé lo que es tener la última versión de Android… la velocidad es similar a la de un Iphone, por lo que olvídate de guindar el teléfono.

  • Batería: Standard, Li-Ion 2070 mAh
  • Tiempo de conversación: Hasta 24 h

El primer día instalé cerca de 400Mb de aplicaciones y la batería duró todo el día, aún queda por comprobar si el uso es tan eficaz como dicen, sin embargo, todo se ve bien hasta ahora.

flattr this!

Lunes 04 de agosto de 2014

Jorge Ortega

Jorge Ortega
Joenco

Colocando un tono al grub

Hola amigos, uno de los problemas que tenemos muchas veces es saber cuando arranca el grub y aunque ya en el wiki de “es/accessibility” se explica como colocar sonido, buscando como cambiar la apariencia de mi escritorio, me encontré con este articulo: “20 curiosidades geeks para terminales linux“, que explica como se puede colocar otro sonido, en este articulo: “Música en grub” lo explican mejor y paso a paso.

De los tonos que podemos colocar esta Súper Mario, Súper Mario 2, MARCHA IMPERIAL STAR WARS y ENCUENTROS EN LA TERCERA FASE (este último no me funcionó).

Ya dejémonos de tanta cháchara y veamos como se hace:

1. Entramos en un terminal como superusuario (root).

2. Abrimos con VIMel archivo grub, escribiendo en el terminal/consola:

# vim /etc/default/grub

3. Presionamos la tecla “i”, para insertar.

4. Agregamos al final del archivo, el tono que deseamos:

# Súper Mario

GRUB_INIT_TUNE=”1000 334 1 334 1 0 1 334 1 0 1 261 1 334 1 0 1 392 2 0 4 196 2″

# Súper Mario 2

GRUB_INIT_TUNE=”480 165 2 165 2 165 3 554 1 587 1 554 2 370 1 554 1 523 2 349 1 523 1 494 3 165 2 165 2 165 2″ #

# MARCHA IMPERIAL STAR WARS

GRUB_INIT_TUNE=”480 440 4 440 4 440 4 349 3 523 1 440 4 349 3 523 1 440 8 659 4 659 4 659 4 698 3 523 1 415 4 349 3 523 1 440 8″

# ENCUENTROS EN LA TERCERA FASE

GRUB_INIT_TUNE=”480 900 2 1000 2 800 2 400 2 600 3″

5. Pulsamos enter, luego escribimos “:wq!” (sin las comillas) y presionamos nuevamente enter, para guardar y cerrar.

6. Por ultimo actualizamos el grub.

# update-grub

7. Listo!! Cuando reiniciemos ya tendremos un tono en el grub.

también lo podemos hacer de la siguiente manera, abrimos un terminal como root y escribimos:

# echo “GRUB_INIT_TUNE=\”1000 334 1 334 1 0 1 334 1 0 1 261 1 334 1 0 1 392 2 0 4 196 2\”” | tee -a /etc/default/grub
update-grub && update-grub

y en este caso tendremos el tono de Súper Mario.

Si te sabes otro sonido, compártelo escribiendo en los comentarios.

Saludos a todos!!


Domingo 03 de agosto de 2014

David Moreno

David Moreno
dm's blog

New hosting for Planeta Linux

Just a very quick shout out.

A few weeks/months ago, Planeta Linux lost its hosting. As I'm less and less involved on third party projects, it was a bit hard for me to just put it somewhere else. Víctor, however, approached me and offered to pay for it. A few days later, we hosted Planeta Linux on one of his hosting instances. A big round of applause goes to him! He is the one making that community possible.

Over and out.

Martes 29 de julio de 2014

pelican-quickstart

Dentro de nuestro directorio ~/virtualenv/pelican escribimos pelican-quickstart y seguimos todas las preguntas que nos hace el script

(pelican)abr4xas@hp ~/virtualenv/pelican $ pelican-quickstart
Welcome to pelican-quickstart v3.4.0.

This script will help you create a new Pelican-based website.

Please answer the following questions so this script can generate the files
needed by Pelican.


> Where do you want to create your new web site? [.] 
> What will be the title of this web site? My title
> Who will be the author of this web site? author
> What will be the default language of this web site? [en] en
> Do you want to specify a URL prefix? e.g., http://example.com   (Y/n) y
> What is your URL prefix? (see above example; no trailing slash) http://localhost
> Do you want to enable article pagination? (Y/n) y
> How many articles per page do you want? [10] 2
> Do you want to generate a Fabfile/Makefile to automate generation and publishing? (Y/n) y
> Do you want an auto-reload & simpleHTTP script to assist with theme and site development? (Y/n) y
> Do you want to upload your website using FTP? (y/N) n
> Do you want to upload your website using SSH? (y/N) n
> Do you want to upload your website using Dropbox? (y/N) n
> Do you want to upload your website using S3? (y/N) n
> Do you want to upload your website using Rackspace Cloud Files? (y/N) n
> Do you want to upload your website using GitHub Pages? (y/N) n
Done. Your new project is available at /home/abr4xas/virtualenv/pelican

Para iniciar pelican debemos escribir make devserver y luego debemos ir a http://localhost:8000 y veremos algo parecido a esto:

Alt Text

Escribir un post

La estructura de un post con markdown es la siguiente:

Title: My super title
Date: 2010-12-03 10:20
Category: Python
Tags: pelican, publishing
Slug: my-super-post
Author: 
Summary: Una descripción corta de lo que trata el post... 
image: http://url/de/imagen/destacada

A partir de aquí, el contenido del post... 

![Alt Text]({filename}/images/nombre-de-la-imagen.png)

Para guardar el archivo podemos hacerlo tomando el slug (my-super-post) con la extension .md ejemplo: my-super-post.md y esto va en la carpeta content

Como dato:

Si vamos a incluir imagenes en nuestras publicaciones seamos ordenados, por lo tanto vamos a crear una carpeta llamada images y ahi metemos todas las imagenes que necesitemos. ;)

Escribir una pagina:

Dentro de la carpeta content podemos crear otra carpeta llamada pages y ahi podemos incluir todas las paginas necesarias por ejemplo la de about.

Hasta la proxima entrada :D

Jorge Ortega

Jorge Ortega
Joenco

Instalar Debian 7 paso a paso con accesibilidad

Una de las caracteristicas de la versión estable de Debian 7, es que ahora los que tenemos discapacidad visual, podemos instalar sin problemas esta versión, ya que han integrado un sintetizador de voz en su instalación, lo que la hace accesible.

En este sentido, es importante mencionar que en la instalación se cuenta con diferentes listas de opciones que debemos elegir durante el proceso, las mismas, se encuentran asignadas con un número único, dicho número debe ser usado para elegir la opción que sea requerida.

Requisitos para la instalación:

  1. Un CD con la iso de Debian 7 (http://www.debian.org).

  2. Unas cornetas o audífonos.

  3. Conexión a internet

  4.  

A continuación se explican los pasos a seguir para instalar Debian 7 (Wheezy) de forma accesible:

  • El primer paso a seguir consiste en reiniciar el equipo con el CD de instalación en la unidad correspondiente. Espere hasta que se detenga el CD.

  • Luego se procede a presionar la tecla S y pulsar Enter. Esto activará el sintetizador de voz, utilice unas cornetas o audífonos para escuchar, ya que en ocasiones el volumen esta muy bajo.

  • Ahora elegimos el idioma de instalación, para el español es el número 42.

  • El paso siguiente consiste en elegir el país de ubicación, para el caso de Venezuela corresponde el número 20

  • Luego debemos elegir la configuración del teclado, en nuestro caso es Latinoamericano, siendo el número 49.

  • Para comprobar la detección del hardware de la red, se debe atender a la siguiente pregunta. ¿desea cargar los controladores que hacen falta de un medio extraíbles? Elegiremos No, que es el número 2.

  • Para elegir interfaces de red, si se tiene más de un dispositivo de red solo se debe seleccionar aquella que se va a utilizar durante la instalación de Debian Wheezy. En este caso es la opción 1 (ETH0).

  • Se nos pedirá el nombre de la maquina, sera de la preferencia del usuario.

  • En el siguiente paso se insertará la contraseña al usuario “root”, y se debe confirmar.

  • se procede a escribir el nombre completo del usuario.

  • Luego el nombre con el que se iniciara la sesión (login del usuario).

  • Así como con el superusuario root, se escribe la contraseña y se confirma para el usuario creado.

  • Este es un paso importante, aquí se elige donde se instalará Debian Wheezy en el disco duro, si no se tiene experiencia en particionado es recomendable realizarlo utilizando todo el disco. Así lo haremos para esta guía, por lo que elegiremos la opción 1: “Particionado guiado utilizar todo el disco”.

  • A continuación podemos elegir entre 3 opciones:

    • Una sola partición.

    • Separar el Home.

    • Separar OPT, Usr, var entre otras.

En mi caso siempre elijo la opción 2, para separar el home.

  • una vez realizadas dichas particiones, ya estamos listos para instalar el sistema base, por lo que elegimos la opción: “se ha terminado de definir la partición”.

  • Se muestra un resumen con las particiones, la cual deberemos aceptar, eligiendo la opción 1: “Sí”.

  • Luego preguntara ¿desea utilizar una replica en la red? Elegimos el numero 1 asignado a la opción si.

  • se debe elegir la ubicación donde se va a conectar, para nuestro caso es el 74: “Venezuela”.

  • Elegimos una replica de Debian, tenemos dos opciones:

  1. debian.unesr.edu.ve

2cdn.dedian.net

se puede seleccionar cualquiera de ellas, escribiendo 1 o 2.

  • por ultimo debemos elegir entre los programas:

  1. dedian desktop

  2. web server

  3. print server

  4. sql database

  5. dns server

  6. file server

  7. mail server

  8. ssh server

  9. laptod

  10. utilidades estándar del sistema

    aquí escribiremos dejando un espacio en blanco en cada opción elegida, de la siguiente forma: 1 8 9 10

  • Esto puede tardar algo de tiempo, dependiendo de su conexión a internet.

  • Cuando se termina la instalación, nos preguntará si deseamos instalar el sistema de arranque “grub”, elegimos la opción 1: “Sí”, es de acotar que si dejamos pasar un tiempo, por defecto lo instalará.

  • Una vez se complete la instalación, debemos reiniciar el equipo, habiendo sacado el CD previamente.

  • Al reiniciar se nos pedirá el nombre de usuario y la contraseña, la escribimos para iniciar sesión en nuestro sistema Debian 7.

  • Felicidades!!! ya haz instalado con accesibilidad Debian 7 en tu equipo.

Si te ha gustado, tienes alguna pregunta o sugerencia, te animo a dejarla en los comentarios.

Descargar archivo de instalación Debian 7.

Saludos a todos!!!


Lunes 28 de julio de 2014

Jesus Palencia

Xanadu GNU/Linux libera su versión 0.5.9

El proyecto Xanadu ha liberado su nueva versión 0.5.9, teniendo como principal novedad el estreno de la imagen minimal para amd64 además de múltiples optimizaciones y correcciones de errores.

Acá les dejo el enlace de la nota de lanzamiento:

https://xanadulinux.wordpress.com/2014/07/28/lanzamiento-de-la-version-0-5-9/


Tagged: lanzamiento, xanadu

Domingo 27 de julio de 2014

Tarea de Django-Celery desde un URL.

En el artículo anterior (Restful API con Django-tastypie y Django-Celery ) se mostró como pasarle datos a django desde su interprete de comandos, en este arículo se explicará como pasarlo desde el navegador o un script en python que lo haga por nosotros.

Recapitulando la parte del código que captura el url se maneja en el archivo urls.py que tiene lo siguiente:
url(r'^enviar/', celery_views.task_view(tasks.RecNums)),

Al abrir el url http://127.0.0.1:8080/ se tiene la siguiente imagen de una captura de pantalla:



Como django está en modo debug nos muestra esa página, la cual dice los urls tienen que manejar el orden que se muestra (admin,api, enviar y los otros dos con identificación de procesos).

Django devuelve mensaje 404, como se muestra a continuación:


En el artículo anterior se uso el interprete de comandos de Django con el siguiente código:
>>>import json
>>>from pasarela.apps.sms.tasks import RecNums
>>>datos = '{"numeros": ["34225673531", "34265673531", "34365673531", "34245673531", "34345673531"], "mensaje": "xyzw", "cantnumeros": 5,"evento":6}'
>>>resultado = RecNums.delay(datos)
>>>resultado.get()
'Se enviaron: 5'

Como se ve, datos es un string que contiene entre llaves un conjunto de datos, lo que está entre las comillas es un diccionario de python, por esa razón cuando la función RecNums recibe datos convierte el string que en sí es un json, el cual pasa de ser un tipo str a un tipo dict:
>>>type(datos)
str
>>>diccionario = json.loads(datos)
>>>type(diccionario)
dict

Ahora bien, se tiene que el url a usar debería ser algo como:
http://127.0.0.1/enviar/?datos=
Donde lo que va luego del igual debería ser el jason que se está pasando a la función ( '{"numeros": ["34225673531", "34265673531", "34365673531", "34245673531", "34345673531"], "mensaje": "xyzw", "cantnumeros": 5,"evento":6}' ). Este es el json, el problema que se tiene es que el url no está bien construído, para ello se mostrará en un script python como se abre el url pasandole el json (se muestra en la siguiente figura):


A continuación se muestra el log de celery donde se ve que procesa las tareas del envío de cada mensaje a su número celular respectivo:

Y para terminar se muestra el log de Django al recibir el URL que se paso en el script donde devuelve el código 200:

Así que para poder pasar por medio de un url sus parámetros se tiene que realizar una conversión a formato url de los datos que se tienen en el json.

Puntero del mouse no visible en gnome

Download PDF

Si por alguna razón utilizando alguno de los componentes de gnome (como gnome-settings-daemon en mi caso porque gnome-terminal todavía me gusta) el puntero del mouse no es visible pero aún funcional, entonces lo más probable es que tengas que ejecutar:

dconf write /org/gnome/settings-daemon/plugins/cursor/active false

Este problema se da puesto que Gnome esconde el puntero cuando se detecta algún dispositivo touch¹ (vaya estupidez cuando lo touch no es la pantalla, pero el trackpad). Así pues, es necesario hacer entender al !@#$%&*@# Gnome que no se trata de una !@#$%^ pantalla touch pero de un !@##$%%^ multi-touch trackpad.

1. https://bugs.archlinux.org/task/34901

Lunes 21 de julio de 2014

Convertir archivo de audio WMA a formato MP3

Vamos a convertir archivos VMA a MP3, de una manera bastante simple y directa. Los pasos descritos acá son de utilidad para esas ocasiones donde te bajas un audio WMA pero tu reproductor, celular, etc no lee ese formato, así que lo único que quieres es transformarlo a MP3 para que pueda reconocerlo. El procedimiento […]

De .NEF a .JPG en Linux sin perder calidad

El día de ayer mi amiga Gabriela me comentó que estaba tratando de transformar archivos .NEF (formato electrónico de archivos RAW de Nikon) a .JPG y que estaba perdiendo calidad en la imagen final, y que además tenía un lote de unas 2000 fotografías que deseaba procesarlas a JPG sin pasar por un proceso manual (ella usa Darktable ó UFRaw para ello). Durante un rato estuve jugando con las herramientas de imagemagick y notaba la alta perdida de calidad, por ejemplo:

Imagen Original .NEF

 

Imagen JPG procesada con Darktable/UFRaw

 

Para ello escribí un pequeño y sucio script en bash que:

  • Convierte los archivos .NEF a .PNG y luego con imagemagick transforma el PNG a JPG (método sucio que funciona usando netpbm, dcraw y imagemagick).
  • Procesa un lote de .NEF que estén ubicados en el directorio donde se corra el script.
#/bin/bash
# Instrucciones:
# 
# 1. Para que este script funcione, necesita tener instalado: netpbm, dcraw, imagemagick
#
# sudo aptitude install netpbm dcraw imagemagick
#
# 2. Setear permisos de ejecucion al script
# chmod +x nef_a_jpg.sh 
#
# Enjoy :D
#
# Por: Juan Angulo Moreno <apostols@gmail.com> 2014-07-20
 
echo "Preparando el ambiente..."
 
total_archivos=`ls *.NEF| wc -l` 
echo "Iniciando conversion... Total de archivos a convertir: $total_archivos"
 
# Que comience la fiesta
for ARCHIVOS in *.NEF ; 
do 
	nombre_base=`basename "$ARCHIVOS" .NEF`;
	echo "Conviertiendo $nombre_base.NEF a JPG...";
	dcraw -c -w $ARCHIVOS | pnmtopng > $nombre_base.png;
	convert $nombre_base.png $nombre_base.jpg
	echo "Listo."
done

Instalando pelican en virtualenv

Paso 1

En consola escribimos lo siguiente: (Como root/sudo)

aptitude install python-virtualenv

Luego

aptitude install python-pip

Nos movemos a nuestra carpeta de trabajo:

cd ~/virtualenv # La carpeta la pueden llamar como quieran ;)

Creamos un directorio de trabajo con virtualenv para nuestro pelican:

virtualenv pelican
New python executable in pelican/bin/python
Installing setuptools, pip...done.

Ahora, entramos en el directorio llamado pelican y escribimos

. bin/activate

Y veremos en la terminal, algo como esto:

(pelican)abr4xas@hp ~/virtualenv/pelican $

Escribimos:

pip install pelican Markdown

Ya con esto, tenemos -hasta los momentos- lo necesario para trabajar con pelican :D

Pelican Setup

Pelican es un generador estático de contenido, al estilo de Jekyll. Por si fuera necesario, en Static Site Generators hay una recopilación de proyectos similares.

Este será el indice de una serie de post que voy a realizar para tratar de explicar el facil uso de este generador estático de contenido

Pasos

  • Instalando pelican en virtualenv ver post.
  • Iniciamos el comando pelican-quick-start ver post.
  • Fork de temas y plugins desde el repo de GitHub de Pelican.
  • Agregando un submodulo de git en nuesto proyecto.
  • Crear directorios adicionales dentro del directorio content.
  • Modificar/agregar configuraciones en los archivos: pelicanconf.py y publishconf.py.

Sábado 19 de julio de 2014

Restful API con Django-tastypie y Django-Celery

Continuando con los artículos sobre django, en este caso se usará django-celery para envío de mensajes a un servidor kannel (servidor sms) y django-tastypie para mostrar el resultado por medio de API rest full con json.
En los dos artículos anteriores Manejo de colas de RabbitMQ en django con django-celery y Restfult API con django tastypie se tiene la base de este artículo. Este artículo se basa en el ejemplo de la mensajería sms del artículo de Restfult API con django tastypie (todo el proceso de creación del proyecto y de la aplicación sms fue explicada en ese artículo).

La idea ahora es poder mostrar los sms listados por evento, no es necesario estar creando una tabla que herede de las otras dos, esto será posible gracias a tastypie en una consulta del json.

Se usará como base de datos sqlite3. A continuación se muestra el archivo settings.py:
#Archivo settings.py:
#Configuración de la base de datos sqlite3
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3', # Add 'postgresql_psycopg2', 'mysql', 'sqlite3' or 'oracle'.
        'NAME': 'sms.db',                      # Or path to database file if using sqlite3.
        'USER': '',                      # Not used with sqlite3.
        'PASSWORD': '',                  # Not used with sqlite3.
        'HOST': '',                      # Set to empty string for localhost. Not used with sqlite3.
        'PORT': '',                      # Set to empty string for default. Not used with sqlite3.
    }
}





#Zona horaria y localización


TIME_ZONE = 'America/Caracas'




LANGUAGE_CODE = 'es-ve'


#Aplicaciones instaladas (djcelery,pasarela.apps.sms,tastypie y south)
INSTALLED_APPS = (
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.sites',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    # Uncomment the next line to enable the admin:
    'django.contrib.admin',
    'djcelery',
    'pasarela.apps.sms',
    'tastypie',
    'south',
    # Uncomment the next line to enable admin documentation:
    # 'django.contrib.admindocs',
)


#Conexión al servidor kannel 
direccion = "127.0.0.1"
portsms = "13013"
portadmin  = "13000"
usuario = "kannel"
clave = "kannel"
----------------------

El archivo pasarela/apps/sms/models.py:
#Archivo pasarela/apps/sms/models.py
from django.db import models

#Se crea la tabla Evento que contiene los campos evento (número del evento), el estatus del mismo (si se #termino el evento o no y si no termino fue por falla o no.
class Evento(models.Model):
    evento = models.IntegerField(primary_key=True)
    estatus = models.BooleanField(default=False)

    def unicode(self):
       evento = "Evento: %s, Estatus: %s , Falla: %s" %(self.evento,self.estatus,self.falla)
       return evento

#Se crea la tabla HistoricoSMS donde se tiene un campo
#foreignkey de la tablla evento, el mensaje, el número de celular, el estatus si se envío o no o si fallo.
class HistoricoSMS(models.Model):
    evento = models.ForeignKey(Evento)
    mensaje = models.CharField(max_length=150)
    numcel = models.CharField(max_length=11)
    estatus = models.BooleanField(default=False)

    def unicode(self):
        mensaje = "%s, %s, %s, %s, %s"  %(self.evento.evento,self.numcel,self.estatus, self.mensaje,self.falla)
        return mensaje
--------------------


Archivo pasarela/apps/sms/admin.py:
#Archivo pasarela/apps/sms/admin.py
#En este archivo se define que las tablas Evento e HistoricoSMS se puedan visualizar desde la #administración de django.
from django.contrib  import admin
from pasarela.apps.sms.models import HistoricoSMS,Evento


admin.site.register(HistoricoSMS)
admin.site.register(Evento)


Archivo pasarela/apps/sms/api.py (archivo para crear el api restful de django-tastypie), en este caso tiene varias modificaciones con respecto al artículo anterior sobre tastypie, ahora se agrega la variable filtering(más información sobre filtering en el siguiente enlace) que es un diccionario en cada recurso:

#Se importa de tastypie.resources ModelResource, ALL y ALL_WITH_RELATIONS
from tastypie.resources import ModelResource, ALL, ALL_WITH_RELATIONS
#Se importa del modelo HistoricoSMS y Evento
from .models import HistoricoSMS,Evento
#Se importa fields de tastypie
from tastypie import fields


class EventoResource(ModelResource):
    class Meta:
        queryset =Evento.objects.all()
        resource_name = 'evento'
#Se muestra todos los eventos
        filtering = {
            'evento': ALL,
        }


class SMSResource(ModelResource):
    evento = fields.ForeignKey(EventoResource, 'evento')
    class Meta:
        queryset = HistoricoSMS.objects.all()
        resource_name = 'sms'
#De evento se muestra todo con relación a el. de estatus se muestra exactamente lo que se necesita,
#acá también se puede usar para las consultas: ['exact', 'range', 'gt', 'gte', 'lt', 'lte'].
        filtering = {
            'evento': ALL_WITH_RELATIONS,
            'estatus':['exact'],
        }
------------------------


El archivo que permite manejar las tareas de celery pasarela/apps/sms/tasks.py :
#Archivo pasarela/apps/sms/tasks.py
from celery import Celery
app = Celery('tasks', broker='amqp://',backend='amqp')
from urllib2 import urlopen
from urllib import urlencode
import urllib2
import json
from time import sleep
from django.conf import settings
from pasarela.apps.sms.models import HistoricoSMS,Evento



#Conexión al servidor kannel (está configuración se puede pasar al archivo settings.py y usarla desde allí
direccion = settings.direccion
portsms = settings.portsms
portadmin  = settings.portadmin
usuario = settings.usuario
clave = settings.clave

#Se define una tarea para celery por medio del decorador @task, se recibe un json para luego sea
# procesado.
@app.task
def RecNums(datos):
    #Se toma el json y se convierte en un diccionario
    diccionario = json.loads(datos)
    #Se instancia la clave Evento(tabla Evento).
    evento = Evento()
    #Se asigna cada variable del diccionario para trabajarlos directamente
    for clave in diccionario.keys():
        if clave == 'mensaje':
            mensaje = diccionario[clave]
        elif clave == 'numeros':
            numeros = diccionario[clave]
        elif clave == 'cantnumeros':
            cantnum = int(diccionario[clave])
        elif clave == 'evento':
            eventoid = int(diccionario[clave])
    #Se crea una lista para agregar todos los números de celular a dicha lista
    lista = []
    for num in numeros: lista.append(str(num))
    #A evento.evento se le asigna el id del evento.
    evento.evento = eventoid
    #Si la lista es distinta a la variable cantnum se envía un mensaje de error, si no se procesa la lista
    if len(lista) == cantnum:
        #Se envía al proceso Enviar (de celery) cada mensaje con su número celular, esperando un segundo 
        #para procesar el siguiente.
        for i in range(len(lista)):
            #Se Envía el mensaje pasando el evento, el número celular de la lista y el mensaje
            resultado = Enviar.delay(evento,lista[i],mensaje)
            sleep(1)
        #Se asigna True al estatus del evento al terminar de procesar los mensajes.
        evento.estatus = True
        #Se salva los valores en la tabla Evento.
        evento.save()
        return "Se enviaron: %s" %cantnum
    else:
        evento.estatus = False
        evento.save()
        return "Error en la recepcion de los datos"


#Se crea la tarea de celery Enviar donde recibe el número del evento, el número de celular y la cantidad de 
#intentos para enviar el sms el valor por defecto es 5.
@app.task
def Enviar(evento,numcel,mensaje,intentos=5):
    #Se instancia la clase HistoricoSMS que maneja dicha table de models.py
    historico = HistoricoSMS()
    #Se le da forma de códificación url al mensaje para eliminar los espacios en blanco del mismo.
    form = urlencode({'text': mensaje})
    #se define la variable Url donde se tiene el url del servidor kannel donde se le pasa al texto
    #el usuario, la clave, el número celular y el mensaje a enviar.
    Url = "http://%s:%s/cgi-bin/sendsms?username=%s&password=%s&to=%s&text=%s" % (direccion,portsms,usuario,clave,numcel,form)
    #Se maneja una excepción si hay un error de comunicación http.
    try
        #Se abre el Url
        f = urlopen(Url,timeout=10)
        #Se asigna los valores numcel, mensaje y evento al objeto historico.
        historico.numcel = numcel
        historico.mensaje = mensaje
        historico.evento = evento
        #Se lee el resultado de abrir el url, si se tiene el mensaje  de encolado para enviar más tarde
        #se asigna el estatus False y se salva devolviendo el mensaje de no enviado 
        if f.read() '3: Queued for later delivery':
            historico.estatus = False
            historico.save()
            return 'Mensaje no enviado a: %s' %numcel
        else:
            #Se envío el mensaje se coloca el estatus en True y se salva en la tabla
            historico.estatus = True
            historico.save()
            #Se devuelve el mensaje de mensaje enviado.
            return 'Mensaje enviado a: %s' %numcel
    except (urllib2.URLError,urllib2.HTTPError),exc:
    #Si hay una excepción de error http se reintenta el envío llamando de forma 
    #concurrente a esta misma función reduciendo el valor de los intentos, 
    #cuando llegue a cero el número de intentos se devuelve un mensaje de no enviado 
        if intentos 0:
            Enviar(evento,numcel,mensaje,intentos-1)
        else:
            #Se salva los valores en la tabla y devuelve el mensaje de sms no enviado
            historico.numcel = numcel
            historico.mensaje = mensaje
            historico.evento = evento
            historico.estatus = False
            historico.save()
            return'No hay conexion al kannel por puerto o IP, el numero que no se procesaron es: %s' %numcel
----------------------------

A continuación se muestra el contenido del archivo pasarela/urls.py el cual contiene el acceso al API como se explico en el artículo anterior y ahora tiene el acceso a la función que permite recibir los datos para enviar (estos datos se pasan por un json):
#Archivo pasarela/urls.py
from django.conf.urls import patterns, include, url

from djcelery import views as celery_views
from pasarela.apps.sms import tasks

# Uncomment the next two lines to enable the admin:
from django.contrib import admin
admin.autodiscover()

#Se importa Api de tastypie.api
from tastypie.api import Api
from apps.sms.api import SMSResource,EventoResource

v1_api = Api(api_name='v1')
#Se registra los recursos en la instancia del api.
v1_api.register(SMSResource())
v1_api.register(EventoResource())

urlpatterns = patterns('',
    # Uncomment the next line to enable the admin:
    url(r'^admin/', include(admin.site.urls)),
    #Acceso al API
    url(r'^api/', include(v1_api.urls)),
    #se define enviar que usa la vista de tareas de celery para ejecutar tasks.RecNums
    url(r'^enviar/', celery_views.task_view(tasks.RecNums)),
    #Consulta a celery si la tarea se ejecuto sin problemas
    url(r'^(?P[\w\d-]+)/done/?$', celery_views.is_task_successful,
        name="celery-is_task_successful"),
    #Consulta de celery para ver el estatus de la tarea
    url(r'^(?P[\w\d-]+)/status/?$', celery_views.task_status,
        name="celery-task_status"),
)
-----------------------


La base de datos se sincroniza como se explico en los artículos anteriores, ahora toca ejecutar en modo pruba django-celery, django como tal y abrir un interprete de comandos para django.

Ejecución de django-celery con dos colas de rabbitMQ y en modo info:
python manage.py celeryd -E -l info -c 2
A continuación captura de pantalla de la ejecución:

Note que se tienen 2 tareas en el celery:
  • pasarela.apps.sms.tasks.Enviar
  • pasarela.apps.sms.tasks.RecNums
Ahora se ejecuta django en el 127.0.0.1 y puerto 8080:
python manage.py runserver 127.0.0.1:8080
A continuación una captura de pantalla de la ejecución del comando:

Y por último se ejecuta el comando para tener un shell interfactivo de django:
python manage.py shell
A continuación la captura de pantalla: 

Ahora se ejecutará en el shell una prueba que simula la recepción por parte de la tarea del json que recibe de una aplicación externa para enviar los sms:
Hay que acotar que los números de celular de la prueba no corresponden a números  reales o de proveedores de teléfonía celular.
Ahora para complementar la idea de consulta API restful por json del artículo anterior la idea es listar los números celulares que se enviaron del evento 6, en este caso se usará el programa curl:
curl http://127.0.0.1:8080/api/v1/sms/?evento=6
El resultado es:
{"meta": {"limit": 20, "next": null, "offset": 0, "previous": null, "total_count": 5}, "objects": [{"estatus":true, "evento": "/api/v1/evento/6/", "id": "21", "mensaje": "Esta es una prueba de sms", "numcel": "14225673531", "resource_uri": "/api/v1/sms/21/"}, {"estatus":true, "evento": "/api/v1/evento/6/","id": "22", "mensaje": "Esta es una prueba de sms", "numcel": "142165673531", "resource_uri": "/api/v1/sms/22/"}, {"estatus": true, "evento": "/api/v1/evento/6/","id": "23", "mensaje": "Esta es una prueba de sms", "numcel": "14265673531", "resource_uri": "/api/v1/sms/23/"}, {"estatus": true, "evento": "/api/v1/evento/6/", "id": "24", "mensaje": "Esta es una prueba de sms", "numcel": "14145673531", "resource_uri": "/api/v1/sms/24/"}, {"estatus": true, "evento": "/api/v1/evento/6/","id": "25", "mensaje": "Esta es una prueba de sms", "numcel": "14245673531", "resource_uri": "/api/v1/sms/25/"}]}

Por último se muestra la captura de pantalla de lo que se genera en el djcelery:

En el próximo artículo se mostrará el acceso a las tareas de celery desde el URL definido en urls.py.

Viernes 18 de julio de 2014

Carlos Colmenarez

Carlos Colmenarez
El Blog de Zero » LINUX

4 grandes mitos sobre Linux que la gente necesita dejar de creer

Linux lleva consigo la carga de los estigmas que ha acumulado con los años, y aunque ha hecho todo lo posible por borrar la mala imagen que tienen muchos de las distribuciones, aún la gente sigue creyendo cosas que dejaron de ser ciertas hace rato. Si quieres saber por qué Linux ya no es lo que era, no es lo que era, no es lo que era, sigue leyendo y entérate de por qué ahora es incluso mejor.

65242980_6a359a1a57_oMuchas veces cuando se habla de sistema operativos pareciese que se está discutiendo una religión, en la que el rebaño de cada uno ve con ojos de hereje a todos los demás. Mi dios es el verdadero y único camino. Puede que suene a exageración, pero si alguna vez te has visto envuelto en un debate sobre si es mejor un iPhone que un Android, o una Mac en lugar de una PC, o el Software Libre en lugar del privativo, de seguro notas las similitudes de inmediato.

“Expande tus horizontes y mira un poquito más allá de tu propia nariz.”

Es normal que muchos sintamos cierta pasión por las cosas que nos gustan, y que estemos dispuestos a defenderlas como lo mejor, pero la delgada linea que nos separa del fanatismo y le fe ciega es muy delgada, y a mucha gente le cuesta ver las cosas desde otro punto de vista, o siquiera darle una oportunidad a algo diferente. No se trata de traicionar tus creencias, se trata de expandir tus horizontes y ver un poquito más allá de tu propia nariz. Además, en la variedad está el gusto.

He usado Linux por muchos años, quizás una década, eso es más o menos el 40% de mi vida, y aunque pasé por una etapa muy estúpida en la que recurría a hablar mal de Windows para intentar tristemente promover el Software Libre con mis conocidos, ya he madurado lo suficiente como para entender lo falaz y lamentable que es esa actitud. Y, de hecho, sigo usando Windows felizmente. No necesitas echar tierra a los demás cuando lo que promueve tiene bondades, eso es muy de políticos, y solo deja una mala impresión. Es más fácil exponer tu punto si no estás intentando desesperadamente ganar una pelea.

Linux es difícil de usar

Esto es cierto, sumamente cierto, Linux es difícil de usar, pero solo porque para empezar a usar Linux por primera vez tienes que dejar el miedo al cambio de lado, y dejar el miedo a un lado es muy, muy difícil. De resto, instalar una distribución y comenzar a usarla es pan comido, ya no estamos en 1998. Hay tantas versiones amigables por ahí que cualquier niño, tu mama, o tu abuelo podrían aprender a usarlas en unos minutos. No tienen ni que abrir una terminal nunca en su vida, la tan temida y malentendida terminal.

“En Linux todo es muy parecido a lo que estás acostumbrado, la brecha se ha acortado mucho.”

Esto es un hecho, lo he probado con mucha gente, usuarios que entienden de informática lo que yo de física cuántica, personas mayores que sabemos tienen más dificultad para llevárselas con la tecnología, niños, cualquiera que haya usado un ordenador antes. En Linux todo es muy parecido a lo que están acostumbrados, la brecha se ha acortado mucho, y de hecho más de uno lo siente más fácil y divertido de lo que esperaban. El que más dificultades presenta es aquel usuario malcriado y caprichoso que todos conocemos, ese que hace berrinche porque le cambiaron un botón de sitio, esos que crean un grupo de Facebook para quejarse del nuevo diseño todos los años.

Linux no va a funcionar en mi PC

mitos-sobre-linux-portada

Esto es súper cierto, Linux funciona mal en muchos ordenadores. Pero, ¿saben ustedes cuantos modelos de ordenadores hay en el mundo?. Linux tiene un problema, los fabricantes de hardware, esos que construyen y venden las piezas de las PCs, no ofrecen soporte para Linux la enorme mayoría del tiempo, por lo que Linux depende totalmente de la comunidad para desarrollar controladores para los millones de componentes y las diferentes marcas de todo el planeta tierra. Y a pesar de esa limitación, en la mayoría de las PCs puedes ejecutar una distro Linux. ¿No es eso sorprendente y digno de una ovación?.

Saben que es más sorprendente aún, que cuando sistemas operativos como Windows y OS X dejan a un lado el hardware viejo, eliminando el soporte porque ya no les produce ninguna ganancia a sus respectivas empresas; en Linux la historia es todo lo contrario. Mientras más vieja es una máquina, más probabilidades hay de que funcione bien con una distro Linux, de hecho hay muchas que están orientadas a ordenadores de pocos recursos, PCs viejas que están listas para el basurero, pueden conseguir una segunda oportunidad gracias a Linux.

En cuanto al hardware moderno, el soporte cada vez es mejor, y de hecho fabricantes como NVIDIA y AMD han empezado a mejorar su compatibilidad principalmente por la revolución de Steam y sus juegos. Lo que me lleva al siguiente punto.

En Linux no puedes jugar nada

Hey, esto era 99% cierto hace 2 o 3 años. Jugar en Linux siempre fue una experiencia terrible, y la razón de que muchos entusiastas del SL y de los videojuegos aun usaran Windows para poder jugar. Pero, hace un par de años dios volvió a la tierra en la figura de Gabe Newell, y Steam llegó a Linux. Steam es la plataforma de videojuegos para PC más grande del mundo, cuenta con miles de miles de juegos y millones de usuarios, y unas ofertas que dan gastritis.

Valve planea su propio sistema operativo basado en Linux para dar vida a las Steam Machines, su propio híbrido entre PC y consola de sobremesa para jugones. Una iniciativa que promete revolucionar el mercado, y sí, de la mano de Linux. ¿Quien lo diría?. Aunque el panorama aún luce a años luz de lo que representa la experiencia de juego en Windows, ya Linux cuenta con más de 500 títulos disponibles, muchos son triple A, como The Witcher, la saga de Metro, Left 4 Dead, etc. Y estamos seguros de que solo vendrán más y más.

Cómo es gratis, Linux no tiene soporte

mitos-sobre-linux1

Esto es cierto, yo nunca he pagado por una distribución Linux, y en mi vida he llamado a soporte técnico… ya va, un momento. El Software Libre no es sinónimo de “software gratis”, de hecho hay empresas enormes como Red Hat que utilizan Linux para ofrecer soluciones empresariales, sí, esta gente cobra por su trabajo, son sumamente respetados y ofrecen calidad.

Android es software libre, y adivinen que empresa hace dinero con Android, no es solo Google, sino vean a Samsumg. Canonical, los responsables de Ubuntu, si bien no cobran por Ubuntu, tienen muchos otros servicios basados en el open source. Y así muchas más. Muchos de estos proyectos ofrecen soporte especial para los usuarios a través de portales especiales, wikis, foros, comunidades llenas de gente que busca ayuda y gente que busca ofrecerla.

Linux tiene una comunidad enorme que te ayuda a conseguir la solución a tu problema solo por amor al arte. Es de hecho una de las maneras en las que he terminado conociendo gente genial por muchos años, y haciendo amigos.

vito en: bitelia


Lunes 14 de julio de 2014

Miguel Ángel Useche

Miguel Ángel Useche
El weblog de Skatox » Planetas

Desarrollo de aplicaciones web con MEAN.io (Mongo, Express, Angular y NodeJS)

Hace unas semanas, elaborando un sistema interno para Oja.la tuve la libertad de escoger la plataforma a desarrollar y como este año me había decidido a realizar una aplicación web escrita 100% en Javascript empecé a investigar sobre como empezar con la plataforma  MEAN (Mongo, Express, Angular y NodeJS), para quienes no la conocen, es como LAMP (Linux, Apache, MySQL y PHP) pero orientada a usar JS tanto en frontend como en el backend. Investigando conseguí MEAN.io, un framework para desarrollar bajo esta plataforma.

Instalación

Al momento de iniciar el proyecto, no sabía utilizar Express ni Mongo, respecto a NodeJS sólo había hecho unos experimentos sencillos para ver como funcionaba, pero ya tenía experiencia en AngularJS y herramientas como: Yeoman, Grunt, Bower y NPM. Por ello, la instalación de este framework me pareció muy sencilla: clonar el repositorio y luego mediante bower instalar todas las dependencias automáticamente. Solo realicé algunos cambios para evitar actualizar versiones no estables de librerías (no me gusta actualizar  en pleno desarrollo para evitar incompatibilidades con funcionalidades ya escritas) y eliminar cosas innecesarias para el proyecto (como autenticación usando redes sociales).

Esqueleto inicial

La forma en como está estructurado me ha gustado mucho, la separación del backend y frontend se hace notable. Respecto a Express,  la estructura es muy sencilla, principalmente se divide en las carpetas: models (los objetos que permiten se comunican con la BD), controllers (donde se guarda la lógica del proceso), routes (maneja las rutas de las peticiones del servicio web), views (las vistas a mostrar desde el servidor, las cuales son diferentes de las vistas generadas en el frontend).

En la parte pública se trabaja como cualquier aplicación de Angular, se crean carpetas por cada módulo a desarrollar, por defecto vienen incluidas 2: auth y system. La primera es el módulo de autenticación que trae MEAN.io para permitir identificarse utilizando redes sociales y la segunda, donde va la aplicación como tal. También se incluyen los archivos para manejar las dependencias del proyecto usando npm, bower y se incluye un archivo de Grunt.

Este último, trae configuraciones para montar un servidor: de desarrollo, pruebas y producción. Cada uno de ellos tiene su propia  configuración, permitiéndote trabajar con diferentes bases de datos, bibliotecas comprimidas solo en la versión de producción y pruebas. Me pareció raro que no incluía la tarea grunt-ngmin, pues permite facilitar la compresión de archivos JS de AngularJS.

Logo de Mean.io

Logo de Mean.io, chévere que sea una chica ninja

Desarrollo

El desarrollo de la aplicación se me hizo fácil gracias a esta plantilla base, si nunca has desarrollado una aplicación bajo este modelo, te recomiendo iniciarte con MEAN.io. Lo único extraño es que generalmente en otras plataformas el código de backend es diferente al de frontend, permitiendo determinar fácilmente la ubicación del código que estas viendo, como aquí todo es JS a veces debes mirar la ruta para ver si estas en frontend o backend, además, probablemente llames a los modelos de Express y Angular con el mismo nombre, confundiendo a veces la apertura de archivos.

La desventajas que vi con esta plataforma fue: la poca documentación debido a su poco tiempo de disponibilidad e incompatibilidad para navegadores antiguos (Android 2.3, IE 8, entre otros), sé de la disminución de la cuota de mercado de estos navegadores, pero aún existen clientes/usuarios que lo utilizan y en el ambiente empresarial se les debe dar soporte. Y finalmente, no me gustó mucho trabajar con MongoDB, es muy chévere almacenar los objetos en JSON y la lectura se hace rápida, pero no sé si es por mi años utilizando BD relacionales pero la falta de restricciones de diseño o tanta libertad de almacenar lo que se desee allí, me parece que puede crear daños en la integridad de datos en el futuro. Tal vez porque estoy acostumbrado a manejar toda la validación de la data en la BD y no en la aplicación, me pareció inseguro que con MongoDB toda la validación se hace en la aplicación (si me equivoco, por favor me lo aclaran en los comentarios).

Recomendaciones

Te recomiendo utilizar Mean.io si deseas hacer una aplicación bajo esta plataforma en poco tiempo, realmente es sencilla de usar si tienes experiencia desarrollando aplicaciones web con Javascript. Probablemente la curva de aprendizaje para un novato sea fuerte pero vale la pena el esfuerzo. Si deseas algo mas sencillo o simple (sin sacrificar calidad), puedes probar Mean.JS un fork realizado por el autor de Mean.io para mejorar algunos problemas de diseño de la plataforma.

 

Jueves 10 de julio de 2014

Jesus Palencia

El Blog de Sinfallas ahora en Planeta Linux

Planeta Linux es una gran iniciativa que nos permite leer publicaciones de cientos de latinoamericanos entusiastas del software libre en un solo lugar, de manera cómoda y sin complicaciones, ya sea desde su sitio web o utilizando tu lector de noticias favoritos.

Ahora, gracias al equipo de Planeta Linux este blog también podrá leerse en sus feed, que esperas entra ahora y entérate de las noticias mas interesantes sobre Linux en tu propio idioma.

Enlace: Planeta Linux


Tagged: planeta

Lunes 07 de julio de 2014

I’am Back

De vuelta a mi espacio, no lleva mejor nombre que ese El  Espacio que Necesitaba!!

Domingo 06 de julio de 2014

José Miguel Parrella Romero

José Miguel Parrella Romero
null pointer dereference

Understanding records in Koha

Throughout the years, I’ve found several open source ILS and most of them try to water down the way librarians have catalogued resources for years. Yes, we all agree ISO 2709 is obsolete, but MARC has proven to be very complete, and most of the efforts out there (Dublin Core, etc.) try to reduce the expression level a librarian can have. If your beef is with ISO 2709, there’s MARC-XML if you want something that is easier to debug in terms of encoding, etc.

That said, Koha faces a challenge: it needs to balance the expressiveness of MARC with the rigidness of SQL. It also needs to balance the convenience of SQL with the potential shortcomings of their database of choice (MySQL) with large collections (over a couple thousand records) and particularly with searching and indexing.

Koha’s approach to solve this problem is to incorporate Zebra to the mix. Zebra is a very elegant, but very difficult to understand piece of Danish open source software that is very good at indexing and searching resources that can come from, say, MARC. It runs as a separate process (not part of the Web stack) and it can also be enabled as a Z39.50 server (Koha itself is a Z39.50 consumer, courtesy of Perl)

The purpose of this post is to help readers navigate how records are managed in Koha and avoid frustrations when deploying Koha instances and migrating existing records.

Koha has a very simple workflow for cataloguing new resources, either from Z39.50, from a MARC (ISO 2709 or XML) file or from scratch. It has templates for cataloguing, it has the Z39.50 and MARC capabilities, and it has authorities. The use case of starting a library from scratch in Koha is actually a very solid one.

But all of the libraries I’ve worked with in the last 7 years already have a collection. This collection might be ISIS, Documanager, another SQL database or even a spreadsheet. Few of them have MARC files, and even if they had (i.e., vendors provide them), they still want ETLs to be applied (normalization, Z39.50 validations, etc.) that require processing.

So, how do we incorporate records massively into Koha? There are two methods, MARC import or fiddling with SQL directly, but only one answer: MARC import.

See, MARC can potentially have hundreds of fields and subfields, and we don’t necessarily know beforehand which ones are catalogued by the librarians, by other libraries’ librarians or even by the publisher. Trying to water it down by removing the fields we don’t “want” is simply denying a full fidelity experience for patrons.

But, in the other hand, MySQL is not designed to accommodate a random, variable number of columns. So Koha takes the most used attributes (like title or author) and “burns” them into SQL. For multivalued attributes, like subjects or items, it uses additional tables. And then it takes the MARC-XML and shoves it on a entire field.

Whoa. So what happens if a conservatorium is making heavy use of 383b (Opus number) and then want to search massively for this field/subfield combination? Well, you can’t just tell Koha to wait until MySQL loads all the XMLs in memory, blows them up and traverse them – it’s just not gonna happen within timeout.

At this point you must have figured out that the obvious solution is to drop the SQL database and go with a document-oriented database. If someone just wants to catalog 14 field/subfields and eventually a super detailed librarian comes in and starts doing 150, you would be fine.

Because right now, without that, it’s Zebra that kicks in. It behaves more like an object storage and it’s very good at searching and indexing (and it serves as Z39.50 server, which is nice) but it’s a process running separately and management can sometimes be harsh.

Earlier we discussed the use case where Koha excels: creating records from scratch. Does this mean that Koha won’t work for an existing collection? No. It just means the workflows are a tad more complicated.

I write my own Perl code to migrate records (some scripts available here, on the move to GitHub), and the output is always MARC. In the past I’ve done ISO 2709, yes, but I only do MARC-XML now. Although it can potentially use up more disk space, and it could be a bit more slow to load, it has a quick benefit for us non-English speakers: it allows to solve encoding issues faster (with the binary, I had to do hexadecimal sed’s and other weird things and it messed up with headers, etc.)

Sometimes I do one record per file (depending on the I/O reality I have to face) but you can do several at a time: a “collection” in just one file, that tends to use up more RAM but also makes it more difficult to pinpoint and solve problems with specific records. I use the bulkmarcimport tool. I make sure the holdings (field 942 in Koha unless you change it) are there before loading, otherwise I really mess up the DB. And my trial/error process usually involves using mysql’s dump and restore facilities and removing the content of the /var/lib/koha/zebradb directory, effectively starting from scratch.

Koha requires indexing, and it can be very frustrating to learn that after you import all your records, you still can’t find anything on the OPAC. Most distro packages for Koha have a helper script called koha-rebuild-zebra which helps you in the process. Actually, in my experience deploying large Koha installations, most of the management and operational issues have something to do with indexing. APT packages for Koha will install a cron task to rebuild Zebra, pointing at the extreme importance (dependency) on this process.

Since Koha now works with instance names (a combination of Zebra installations, MySQL databases and template files) you can rebuild using something like:

koha-rebuild-zebra -b -v -f mybiblio

Feel free to review how that script works and what other (Perl) scripts it calls. It’s fun and useful to understand how old pieces of Koha fit a generally new paradigm. That said, it’s time to embrace cloud patterns and practices for open source ILS – imagine using a bus topic for selective information dissemination or circulation, and an abstract document-oriented cloud storage for the catalogue, with extensive object caching for searches. And to do it all without VMs, which are usually a management nightmare for understaffed libraries.


Jueves 03 de julio de 2014

Carlos Colmenarez

Carlos Colmenarez
El Blog de Zero » LINUX

Diferencias entre Software Libre y Open Source

No deben ser pocas las veces en has utilizado estos términos sin conocer bien que son. A pesar de que están estrechamente relacionados, los movimientos de Software Libre y Open Source tienen sutiles diferencias y es importante conocerlas.

Diferencias entre Software Libre y Open Source

A pesar de que son términos relacionados y solemos usarlos indistintamente, Software Libre y Open Source no son exactamente lo mismo, al menos no según la FSF, de las iniciales de Free Software Foundation, organización creada por Richard Stallman en el año 1985 con el propósito de difundir este movimiento.

A pesar de que están intrínsecamente relacionados, hay algunas diferencias puntuales. Veamos cuales son.

¿Qué es Software Libre?

El Software Libre o Free Software en inglés, es un software que respeta las cuatro libertades que la FSF establece:

  • La libertad de usar el programa, con cualquier propósito.
  • La libertad de estudiar cómo funciona el programa y modificarlo, adaptándolo a tus necesidades.
  • La libertad de distribuir copias del programa, con lo cual puedes ayudar a tu prójimo.
  • La libertad de mejorar el programa y hacer públicas esas mejoras a los demás, de modo que toda la comunidad se beneficie.

En otras palabras, es aquel que respeta la libertad de todos los usuarios que adquirieron el producto para ser usado, copiado, estudiado, modificado, y redistribuido libremente de varias formas. Es muy importante aclarar que el Software Libre establece muchas libertades pero no es necesariamente gratuito. Con esto quiero decir que conservando su carácter libre (respetando las libertades), puede ser distribuido de manera comercial. Esto garantizando sus derechos de modificación y redistribución.
Software Libre y Open Source
¿Qué es Open Source?

Open Source o código abierto, es la expresión con la que se conoce al software distribuido y desarrollado libremente. Es un movimiento más pragmático, se enfoca más en los beneficios prácticos como acceso al código fuente que en aspectos éticos o de libertad que son tan relevantes en el Software Libre.

Su premisa es que al compartir el código, el programa resultante tiende a ser de calidad superior al software propietario, es una visión técnica. Obviamente para lograr calidad técnica lo ideal es compartir el código, pero no estás obligado a hacerlo.

Diferencias

Como podemos ver, el movimiento del Software Libre hace hincapié en cuestiones éticas y morales relacionadas con el software, viendo el aspecto técnico como secundario, a diferencia
del movimiento Open Source que lo establece como prioritario, siendo esta su diferencia más grande.

Otra de sus diferencias, quizá la más importante para lo que al ámbito comercial concierne, es que con una aplicación desarrollada bajo los estándares del Software Libre puedes obtener remuneración por conceptos de desarrollo, soporte y puesta a punto siempre y cuando entregues los fuentes, a diferencia del movimiento Open Source que no te obliga a hacerlo. Todos los productos desarrollados en Software Libre así como sus derivados siempre deben ser libres, a diferencia de Open Source.

Como podemos ver, básicamente el movimiento de Software Libre tiene diferencias de índole filosóficas con el Open Source, sin embargo, ambos han permitido el desarrollo de software de gran calidad y con muchísimas mas libertades de las que el software privativo otorgaría jamás.

Fuente: bitelia


Martes 01 de julio de 2014

Miguel Ángel Useche

Miguel Ángel Useche
El weblog de Skatox » Planetas

Internet’s Own Boy: El documental sobre Aaron Swartz

Hace unos meses escribí sobre el aniversario de la muerte de Aaron Swartz, pero esta vez les escribo sobre Internet’s Own Boy un documental de su vida realizado por Brian Knappenberger (director de We are Legion donde se muestra la historia de grupo hacktivista Anonymous). Siempre consideré a Swartz uno de los genios de Internet y seguí su carrera, por eso, al enterarme de la existencia de este proyecto, estuve esperando con ansias su estreno que ocurrió esta semana.

Historia

El filme comienza desde que Aaron era un niño aprendiendo a leer, sus inicios en la informática y luego empieza a hacer un resumen sobre los distintos aportes que hizo durante su vida. Gran parte del documental se enfoca en explicar el objetivo de liberar los documentos que le ocasionaron problemas legales, cómo funciona el acceso a los  mismos en Estados Unidos, las consecuencias de ello y los cargos presentados por el MIT, cómo fue el juicio, entre otras cosas. Esta parte, la cual ocupa gran parte del documental, me ayudó a entender bien todo lo acontecido respecto a la problemática de liberar esos documentos y como le afectó emocionalmente, pues a pesar de haber leído el tema, escucharlo desde el punto de vista de expertos en el área (como su abogado) entiendes mejor las cosas. Luego, el documental muestra la etapa hacktivista de Swartz:  como logró organizar a la gente para protestar en contra de SOPA y la censura en la red.

Finalmente, viene un momento triste al escuchar de sus allegados los problemas que pudieron llevarlo al suicidio. Sin embargo, luego el ambiente se vuelve  alegre al ver los frutos de su trabajo, no les voy a contar el final pero me gustó ver como en tan poco tiempo se ve resultados favorables de liberar las publicaciones científicas.

Participantes

En el documental participan personas que lo conocieron y trabajaron con él, familiares, Tim Berners Lee el creador de la web, su abogado en el caso, parejas, amigos y otros. Escuchar a Tim expresarse sobre Aaron, realmente te ha pensar sobre su contribuciones, ademas que las palabras del abogado sobre el problema con el MIT, permite conocer muy bien los cargos presentados.

¿Cómo verlo?

Realmente deben ver este documental si:  son hackers, activistas de la libertad de la información, apoyan el conocimiento abierto y global, informáticos y usuarios avanzados de Internet. Aunque pueden donar al proyecto, pueden ver legalmente el documental completo a continuación, gracias a su liberación bajo licencia Creative Commons.

Luego de verlo, te darán ganas de hacer algo por Internet.

 

Sábado 28 de junio de 2014

Milton Mazzarri

Milton Mazzarri
milmazz

Grunt: The Javascript Task Manager

Grunt

When you play the Web Developer role, sometimes you may have to endure some repetitive tasks like minification, unit testing, compilation, linting, beautify or unpack Javascript code and so on. To solve this problems, and in the meantime, try to keep your mental health in a good shape, you desperately need to find a way to automate this tasks. Grunt offers you an easy way to accomplish this kind of automation.

In this article I’ll try to explain how to automate some tasks with Grunt, but I recommend that you should take some time to read Grunt’s documentation and enjoy the experience by yourself.

So, in the following sections I’ll try to show you how to accomplish this tasks:

  • Concatenate and create a minified version of your CSS, JavaScript and HTML files.
  • Automatic generation of the documentation for JavaScript with JSDoc.
  • Linting your Javascript code.
  • Reformat and reindent (prettify) your Javascript code.

You can install Grunt via npm (Node Package Manager), so, in order to install Grunt you need to install Node.js first.

Now that you have Node.js and npm installed is a good time to install globally the Grunt CLI (Command Line Interface) package.

$ sudo npm install -g grunt-cli

Once grunt-cli is installed you need to go to the root directory of your project and create a package.json file, to accomplish this you can do the following:

$ cd example_project
$ npm init

The previous command will ask you a series of questions in order to create the package.json file, package.json basically store metadata for projects published as npm modules. It’s important to remember to add this file to your source code versioning tool to facilitate the installation of the development dependencies among your partners via npm install command.

At this point we can install Grunt and their respective plugins in the existing package.json with:

$ npm install grunt --save-dev

And the plugins that you need can be installed as follows:

$ npm install <grunt-plugin-name> --save-dev

Please note that the --save-dev parameter will modify your devDependencies section in your package.json. So, be sure to commit the updated package.json file with your project whenever you consider appropriate.

Code documentation

If you document your code following the syntax rules defined on JSDoc 3, e.g.:

 /**
  * A callback function returning array defining where the ticks
  * are laid out on the axis.
  *
  * @function tickPositioner
  * @see {@link http://api.highcharts.com/highstock#yAxis.tickPositioner}
  * @param {String} xOrY - Is it X or Y Axis?
  * @param {Number} min - Minimum value
  * @param {Number} max - Maximum value
  * @returns {Array} - Where the ticks are laid out on the axis.
  */
 function tickPositioner(xOrY, min, max) {

    // do something

    return tickPositions;
 }

If you need more information about JSDoc, read their documentation, it’s easy to catch up.

The next step to automate the generation of the code documentation is to install first the grunt-jsdoc plugin as follows:

$ npm install grunt-jsdoc --save-dev

Once grunt-jsdoc is installed you must create your Gruntfile.js in the root directory of your project and then add the jsdoc entry to the options of the initConfig method.

module.exports = function(grunt) {

  // Project configuration.
  grunt.initConfig({
      pkg: grunt.file.readJSON('package.json'),
      jsdoc : {
          dist : {
              src: ['src/*.js', 'test/*.js'], 
              dest: 'doc'
          }
      }
  });

};  

Then, you need to load the plugin after the initConfig method in the Gruntfile.js:

// Load the plugin that provides the 'jsdoc' task.
grunt.loadNpmtasks('grunt-jsdoc');

The resulting Gruntfile.js until now is:

module.exports = function(grunt) {

  // Project configuration.
  grunt.initConfig({
      pkg: grunt.file.readJSON('package.json'),
      jsdoc : {
          dist : {
              src: ['src/*.js', 'test/*.js'], 
              dest: 'doc'
          }
      }
  });

  // Load the plugin that provides the 'jsdoc' task.
  grunt.loadNpmtasks('grunt-jsdoc');

};  

To generate the documentation, you need to call the jsdoc task as follows:

$ grunt jsdoc

Immediately you can see, inside the doc directory, the available documentation in HTML format with some beautiful styles by default.

JSDoc

Linting your Javascript code

In order to find suspicious, non-portable or potential problems in Javascript code or simply to enforce your team’s coding convention, whatever may be the reason, I recommend that you should include a static code analysis tool in your toolset.

The first step is to define your set of rules. I prefer to specify the set of rules in an independent file called .jshintrc located at the root directory of the project, let’s see an example:

// file: .jshintrc
{
    "globals": {
        "Highcharts": true, // This is only necessary if you use Highcharts
        "module": true // Gruntfile.js
    },
    "bitwise": true,
    "browser": true,
    "camelcase": true,
    "curly": true,
    "eqeqeq": true,
    "forin": true,
    "freeze": true,
    "immed": true,
    "indent": 4,
    "jquery": true,
    "latedef": true,
    "newcap": true,
    "noempty": true,
    "nonew": true,
    "quotmark": true,
    "trailing": true,
    "undef": true,
    "unused": true
}

If you need more details about the checks that offer every rule mentioned above, please, read the page that contains a list of all options supported by JSHint

To install the grunt-contrib-jshint plugin do the following:

$ npm install grunt-contrib-jshint --save-dev

Next, proceed to add the jshint entry to the options of the initConfig method in the Gruntfile.js as follows:

jshint: {
 options: {
  jshintrc: '.jshintrc'
 },
 all: ['Gruntfile.js', 'src/*.js', 'test/*.js']
}

Then, as it’s done in the previous section, you need to load the plugin after the initConfig method in the Grunfile.js

// Load the plugin that provides the 'jshint' task.
grunt.loadNpmTasks('grunt-contrib-jshint');

To validate your Javascript code against the previous set of rules you need to call the jshint task:

$ grunt jshint

Note that if you need more information or explanations about the errors that you may receive after the previous command I suggest that you should visit JSLint Error Explanations site.

Code Style

As I mentioned in the previous section, I suggest that you should maintain an independent file where you define the set of rules about your coding styles:

// file: .jsbeautifyrc
{
  "indent_size": 4,
  "indent_char": " ",
  "indent_level": 0,
  "indent_with_tabs": false,
  "preserve_newlines": true,
  "max_preserve_newlines": 2,
  "jslint_happy": true,
  "brace_style": "collapse",
  "keep_array_indentation": false,
  "keep_function_indentation": false,
  "space_before_conditional": true,
  "break_chained_methods": false,
  "eval_code": false,
  "unescape_strings": false,
  "wrap_line_length": 0
}

Next, proceed to add the jsbeautifier entry to the options of the initConfig method in the Gruntfile.js as follows:

jsbeautifier: {
  modify: {
      src: 'index.js',
      options: {
          config: '.jsbeautifyrc'
   }
  },
  verify: {
   src: ['index.js'],
   options: {
   mode: 'VERIFY_ONLY',
   config: '.jsbeautifyrc'
  }
 }
}

The next step it to load the plugin after the initConfig method:

// Load the plugin that provides the 'jsbeautifier' task.
grunt.loadNpmTasks('grunt-jsbeautifier');

To adjust your JS files according to the previous set of rules you need to call the jsbeautifier task:

$ grunt jsbeautifier:modify

Concat and minified CSS, HTML, JS

In order to reduce your CSS, HTML and JS files do as follows:

$ npm install grunt-contrib-uglify --save-dev
$ npm install grunt-contrib-htmlmin --save-dev
$ npm install grunt-contrib-cssmin --save-dev

Next, proceed to add the htmlmin, cssmin and uglify entries to the options of the initConfig method in the Gruntfile.js as follows:

htmlmin: {
  dist: {
    options: {
      removeComments: true,
      collapseWhitespace: true
    },
    files: {
      'dist/index.html': 'src/index.html',     // 'destination': 'source'
      'dist/contact.html': 'src/contact.html'
    }
  }
},
cssmin: {
  add_banner: {
    options: {
      banner: '/* My minified css file */'
    },
    files: {
      'path/to/output.css': ['path/to/**/*.css']
    }
  }
},
uglify: {
 options: {
   banner: '/* <%= grunt.template.today("yyyy-mm-dd") %> */\n',
   separator: ',',
   compress: true,
 },
 chart: {
   src: ['src/js/*.js'],
   dest: 'dist/js/example.min.js'
 }
}

The next step it to load the plugins after the initConfig method:

// Load the plugin that provides the 'uglify' task.
grunt.loadNpmTasks('grunt-contrib-uglify');
// Load the plugin that provides the 'htmlmin' task.
grunt.loadNpmTasks('grunt-contrib-htmlmin');
// Load the plugin that provides the 'cssmin' task.
grunt.loadNpmTasks('grunt-contrib-cssmin');

To adjust your files according to the previous set of rules you need to call the htmlmin, cssmin or uglify tasks:

$ grunt htmlmin
$ grunt cssmin
$ grunt uglify

After loading all of your Grunt tasks you can create some aliases.

If you want to create an alias to run the three previous tasks in one step do as follows:

// Wrapper around htmlmin, cssmin and uglify tasks.
grunt.registerTask('minified', [
        'htmlmin',
        'cssmin',
        'uglify'
    ]);

So, to execute the three tasks in one step you can do the following:

$ grunt minified

The previous command is a wrapper around the htmlmin, cssmin and uglify tasks defined previously.

Wrapping all together we get the following [Grunfile.js][]

Other plugins

Grunt offers you a very large amount of plugins, they have a dedicated section to list them!

I recommend that you should take some time to check out the following plugins:

Conclusion

Certainly, Grunt do a great job when we talk about task automation, also, automating this repetitive tasks is fun and reduce the errors associated with tasks that in the past we used to run manually over and over again. That been said, I definitely recommend that you should try Grunt, you will get in exchange an improvement in your development workflow, also with it you can forget to endure repetitive tasks that we hate to do, as a consequence you will get more free time to focus on getting things done.

Last but not least, another option for Grunt is Gulp, I recently read about it, if you look at their documentation you notice that their syntax is more clean than Grunt, also is very concise and allows chaining calls, following the concept of streams that pipes offer in *nix like systems, so, I’ll give it a try in my next project.

Grunt: The Javascript Task Manager was originally published by Milton Mazzarri at milmazz on June 28, 2014.

Miércoles 25 de junio de 2014

Kingsoft office suite, una alternativa a microsoft office en linux.

Está Escrito:
¿Se ocultará alguno, dice Jehová, en escondrijos que yo no lo vea? ¿No lleno yo, dice Jehová, el cielo y la tierra? (Jeremías 23:24)

Tomado de: Espaciolinux

Creo que no me equivoco al decir que hay muchos usuarios de Linux que echan en falta una buena suite de ofimática a la altura de microsoft office. Y otro tanto, que no se ha tenido que quedar estancado en windows porque Linux no le ofrecía la contrapartida a microsoft office.
Kingsoft office (http://www.wps.com/) es una suite de ofimática de origen chino, muy similar a la ampliamente conocida suite de microsoft office. Esta suite es multiplataforma, estando disponible para: Windows, iOS, android y…Linux!! (en fase alpha)
all_kingsoft_2
La suite consta de las 3 principales utilidades para la ofimática: Presentation (PowerPoint), Writer (Word) y Spreadsheets (Excel). La descarga de la versión básica es gratuita, siendo las versiones para empresas y material adicional de pago.
La interfaz de usuario recuerda mucho a la de microsoft office desde la versión 2007, con el menú organizado en secciones y las opciones más usadas en iconos más grandes; pero con algunas interesantes mejoras como el uso de pestañas en lugar de ventanas o una herramienta selector, por poner unos ejemplos.
La suite soporta los formatos de microsoft (.doc, .xls, .docx, etc.) mejor que libreoffice, así como sus propios formatos propietarios y también permite exportar a .pdf o a .rtf. Desafortunadamente, no tiene soporte de formatos libres: .ods, .odt y .odp
La versión para linux se encuentra todavía en fase alpha, lo que significa que es posible que el programa tenga fallos, por lo que no se recomienda confiar altamente en él; pero, basado en mi experiencia, el programa funciona muy muy bien, y no he experimentado cierres repentinos o errores inesperados como sin embargo si los he experimentado en otras suites de ofimática.
KSO_WRITER_sample
Para instalar este programa, simplemente debéis acceder a la página de descarga y seleccionar el instalador que se ajuste a tu distribución: .deb para debian, ubuntu y derivados; o .rpm para redhat, fedora y derivados. Una vez descargado, lo instaláis (en la mayoria de sistemas, un doble clic hará el trabajo) y lo ejecutáis desde vuestro menú (dentro del submenu office o buscando por kingsoft).
Debido a cuestiones de licencia, algunas fuentes no se incluyen con el instalador del programa, pero pueden instalarse fácilmente descargándolas y siguiendo las instrucciones aquí.
El proyecto se encuentra en pleno desarrollo, la última alpha es de marzo y se prevé que para este año se pueda sacar ya una versión beta.
A mi está suite me ha solucionado mis problemas de malentendimiento con libreoffice y ahora incluso cuando estoy en windows la prefiero por encima de microsoft office. Recomiendo a todo el mundo que la pruebe y si os gusta os iré poniendo algunos trucos más para que le saquéis el mejor partido.
Qué lo disfruteis!!
Milton Mazzarri

Milton Mazzarri
milmazz

The DRY principle

The DRY (Don’t Repeat Yourself) principle it basically consist in the following:

Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.

That said, it’s almost clear that the DRY principle is against the code duplication, something that in the long term affects the maintenance phase, it doesn’t facilitate the improvement or code refactoring and, in some cases, it can generate some contradictions, among other problems.

Recently I have inherited a project, and one of the things that I noticed in some part of the source code are the following:

After a glance, you can save some bytes and apply the facade and module pattern without breaking the API compatibility in this way:

But, if you have read the jQuery documentation it’s obvious that the previous code portions are against the DRY principle, basically, this functions expose some shorthands for the $.ajax method from the jQuery library. That said, it’s important to clarify that jQuery, from version 1.0, offers some shorthands, they are: $.get(), $.getJSON(), $.post(), among others.

So, in this particular case, I prefer to break the backward compatibility and delete the previous code portions. After that, I changed the code that used the previous functions and from this point I only used the shorthands that jQuery offers, some examples may clarify this thought:

Another advantage of using the shorthand methods that jQuery provides is that you can work with Deferreds, one last thing that we must take in consideration is that jqXHR.success() and jqXHR.error() callback methods are deprecated as of jQuery 1.8.

Anyway, I wanted to share my experience in this case. Also, remark that we need to take care of some principles at the moment we develop software and avoid to reinvent the wheel or do overengineering.

Last but not least, one way to read offline documentation that I tend to use is Dash or Zeal, I can access a bunch of documentation without the need of an Internet connection, give it a try!

The DRY principle was originally published by Milton Mazzarri at milmazz on June 24, 2014.

Lunes 23 de junio de 2014

Instalación de Raspbmc

Raspbmc = Rasberry Pi   XBMC

Un amigo me recomendó esta distro para correr XBMC, ya que según me comentó el desarrollador de XBMC sacó optimizaciones específicas para que corriera mejor en el hardware del Rasberry. Entonces me animé a probarla y explicó aquí todo lo que tuve que hacer para realizar la instalación, que dicho sea de paso me pareció algo accidentada pero al final satisfactoria.

Raspbmc desde el instalador|

Raspbmc install error

Desde la página del proyecto recomiendan usar el instalador o Network Image, un script en python que prácticamente hace todo el proceso de instalación, particionamiento y configuración inicial…o por lo menos lo intenta, ya que en mi caso no funciono debido a que la conexión a Internet en casa no ayudaba y por ende no podía descargarme la imagen. Por lo que tuve que usar la imagen completa de Raspbmc.

Imagen completa de Raspbmc

La otra opción que ofrecen en la página del proyecto es la de descargar la versión completa de 235 MB llamada Standalone Image, la cual al descomprimirse queda en 1.4 GB aproximadamente. Esto fue un problema ya que mi SD es de 1 GB y no pensaba comprar otra porque tengo un disco duro de 320 GB dedicado al Rasberry Pi. Entonces se me ocurrió que podía reducir el tamaño de esta imagen para que entrara en la SD de 1 GB.

Reparticionado de la imagen

Similar a como hice en el artículo que explica cómo Correr Raspberry Pi desde un disco USB, volqué la imagen en un pendrive de 8 GB para poder extraer luego la partición /boot y la partición del sistema operativo o partición raíz. Para copiar la imagen en el pendrive se debe descomprimir la imagen y luego volcar en crudo, como se muestra  a continuación:

# gunzip raspbmc-final.img.gz
# dd if=raspbmc-final.img of=/dev/sdb

Si verificamos con gparted veríamos algo como esto:

Rasbmc image

Luego con el mismo gparted se debe redimensionar el tamaño de la partición /dev/sdb2 para que ocupe 800 MB aproximadamente, de esta forma podría meter también la partición /boot de 74 MB en mi tarjeta SD de 1 GB.

Raspbmc

Luego para extraer la partición /boot del pendrive se debe hacer lo siguiente:

# dd if=/dev/sdb1 of=raspbmc-final_boot.img

Y de forma similar para extraer el sistema de archivos de 800 MB  que se encuentra en la otra partición:

# dd if=/dev/sdb2 of=raspbmc-final_fsext4.img

Configuración inicial

La configuración inicial se realiza desde el instalador, que en esencia es un script que realiza una serie de preguntas como parámetros de red, etc. Luego esto se puede modificar desde el mimos XBMC con un script que se agregó para Raspbmc:

Raspbmc

Reparticionado del disco

Si bien la instalación detectó el disco duro de forma automática no me dejó particionarlo, de hecho borra todo el contenido y crea una única partición que se monta en /media con el UUID de la partición. Pero lo que quería era tener tres particiones: una para el sistema operativo (/), otra para la memoria de intercambio (swap) y el resto para los datos (/media/Toshiba320), aparte de la partición /boot que debe estar en la tarjeta SD .

Para particionar el disco, borré y creé las particiones usando para ello fdisk. Al final el disco quedó distribuido de la siguiente manera:

Raspbmc

Luego edité el /etc/fstab para reflejar estos cambios:

proc /proc proc defaults 0 0
devpts /dev/pts devpts rw,nosuid,noexec,relatime,gid=5,mode=620 0 0
#/dev/sda2 / ext4 defaults,noatime 0 0
UUID=e7db90716-9911-4fc8-95da-86c463f926a4 / ext4 defaults,noatime 0 0
UUID=70a55bca-9fdb-4073-87f6-c15fd7b351dc none swap sw 0 0
UUID=1ff934a3-f7ce-451f-9a07-0915e174a007 /media/Toshiba320 ext4 defaults 0 0
/dev/mmcblk0p1 /boot vfat defaults,noatime 0 0

Y por último modifiqué el archivo /boot/cmdline.txt, en particular para que la partición del sistema operativo fuese leída desde el disco duro y no desde la tarjeta SD:

dwc_otg.lpm_enable=0 root=/dev/sda1 rootfstype=ext4 noatime quiet rootwait loglevel=1   persistent-logs sdhci-bcm2708.enable_llm=1 dwc_otg.microframe_schedule=1 dwc_otg.fiq_fix_enable=1

Deshabilitar el Firewall

Para deshabilitar el firewall que viene por omisión con una regla  DROP  en el Raspbmc,  hay que editar el archivo /etc/network/if-up.d/secure-rmc, donde se debe comentar la línea:

iptables -A INPUT -i $IFACE -j DROP

También puedes deshabilitar el firewall desde el script de configuración desde XBMC como se muestra a continuación:

Raspbmc settings

Control remoto

Si bien tengo un teclado un un ratón conectado al Rasberry Pi, lo ideal es tener un control remoto. Como el Rasberry Pi está conectado a la red WiFI lo ideal es usar este medio y no tener que usar IR o Bluetooth. Por eso pensé en una aplicación en Android y mi primera elección fue XBMC Remote pero pareciera que tiene un problema de comunicación que vuelve loco al XBMC (tanto del Raspbmc como el XBMC que se puede conseguir por ahí para el Rasberry Pi), pero al final conseguí otra llamada Yatse que funciona correctamente y la presentación es mucho mejor como puede verse a continuación de las capturas que tomé desde mi teléfono:

Yatse XBMC remote  Yatse XBMC remote  Yatse XBMC remote

Desempeño

Comparado con el XBMC que había probado con Raspbian, esta versión verdaderamente se comporta muy bien. Reproduce las películas en varios formatos (.avi, .mkv, .mp4, etc) de forma fluida. Adicionalmente como tiene Linux también es mi centro de descarga con qbittorrent-nox, y otras cosas adicionales que le estoy colocando para pruebas. Y esto es lo que reporta XBMC como consumo de recursos:

Raspbmc

Referencias

Bajar/Subir volumen desde la terminal de Linux

En este artículo haré un resumen de algunos pasos que realicé para configurar el audio de una máquina con Canaima GNU/Linux, de tal modo que cada vez que el usuario inicie su sesión el audio esté con volumen alto. No estoy muy de acuerdo con ese lógica de iniciar con el volumen siempre alto pero […]

Viernes 20 de junio de 2014

Hacer Paquetes de Configuración para Debian

En este enlace de la wiki de Debian se encuentran reseñados varios consejos, herramientas y mejores prácticas que pueden servir para mejorar los paquetes de configuración de Canaima y para aquellas personas o instituciones que deseen personalizar su Canaima automatizando a través de paquetes la aplicación de sus configuraciones.

Lunes 16 de junio de 2014

Jesus Palencia

Tor + polipo + privoxy

Navegar a través de tor puede ser una experiencia anónima mas no necesariamente rápida, para mejorar un poco la velocidad y aumentar la seguridad vamos a utilizar dos programas.

El primero se llama polipo, el cual es un proxy ligero que hará un pequeño cache de las paginas visitadas a través de tor mejorando así la velocidad de carga la próxima vez que visitemos el sitio.

El segundo se llama privoxy, es un proxy que no hace cache y cuya función es filtrar el contenido no deseado además de mejorar la privacidad.

Como podrá observar hay que hay que hacer una cascada con los proxy que permita al usuario disfrutar las ventajas de cada uno de los sistemas.

Esta es la forma final que tendrán las conexiones:

navegador ==> privoxy ==> polipo ==> tor ==> internet

Antes de comenzar a modificar las configuraciones debemos instalar el software que necesitamos:

# apt -y install polipo privoxy tor tor-arm

Ahora abrimos la configuración de tor en /etc/tor/torrc y borramos el contenido para luego colocar este:

## SocksPort para trafico generico
SocksPort 9050 IsolateDestAddr IsolateDestPort
## SocksPort para el navegador
SocksPort 9151

RunAsDaemon 1
DataDirectory /var/lib/tor
CookieAuthentication 1
LearnCircuitBuildTimeout 1
EnforceDistinctSubnets 1
WarnUnsafeSocks 0
DownloadExtraInfo 0
OptimisticData auto
UseMicrodescriptors auto
UseNTorHandshake auto
NumCPUs 0
ServerDNSDetectHijacking 1
ServerDNSRandomizeCase 1
PIDFile /run/tor/tor.pid
AvoidDiskWrites 1
VirtualAddrNetworkIPv4 10.192.0.0/10
DNSPort 9053
AutomapHostsOnResolve 1
AutomapHostsSuffixes .exit,.onion
TransPort 9040
User debian-tor
DisableDebuggerAttachment 0
ControlSocket /run/tor/control
ControlSocketsGroupWritable 1
CookieAuthFileGroupReadable 1
CookieAuthFile /run/tor/control.authcookie
Log notice file /var/log/tor/log

Ahora modificaremos la configuración de polipo en /etc/polipo/config.polipo, con el mismo procedimiento que el anterior, borramos y colocamos el siguiente contenido:

logSyslog = true
logFile = /var/log/polipo/polipo.log
socksParentProxy = localhost:9151
socksProxyType = socks5
proxyAddress = "127.0.0.1"
proxyPort = 8123
allowedClients = 127.0.0.1
allowedPorts = 1-65535
diskCacheRoot = "/var/cache/polipo/"
cacheIsShared = false
localDocumentRoot = ""
proxyName = "localhost"
disableLocalInterface = true
disableConfiguration = true
dnsUseGethostbyname = yes
dnsQueryIPv6 = no
disableVia = true
#censoredHeaders = from,accept-language,x-pad,link
#censorReferer = maybe
maxConnectionAge = 5m
maxConnectionRequests = 120
serverMaxSlots = 8
serverSlots = 2
tunnelAllowedPorts = 1-65535
pidFile = /run/polipo.pid

Como puede observar en la linea numero 3 y 4 se encuentra la conexión con tor, permitiendo que el trafico entrante en polipo tenga su salida a través de la red tor. Ahora realizaremos el mismo procedimiento con privoxy, abriendo /etc/privoxy/config.privoxy y colocando lo siguiente:

user-manual /usr/share/doc/privoxy/user-manual
confdir /etc/privoxy
logdir /var/log/privoxy
actionsfile match-all.action
actionsfile default.action
actionsfile user.action
filterfile default.filter
filterfile user.filter
logfile logfile
hostname privoxy
listen-address  :8118
toggle  1
enable-remote-toggle  0
enable-remote-http-toggle  0
enable-edit-actions 0
enforce-blocks 0
buffer-limit 4096
enable-proxy-authentication-forwarding 0
forward   /               127.0.0.1:8123
forward         192.168.*.*/     .
forward            10.*.*.*/     .
forward           127.*.*.*/     .
forwarded-connect-retries  0
accept-intercepted-requests 0
allow-cgi-request-crunching 0
split-large-forms 0
keep-alive-timeout 5
tolerate-pipelining 1
socket-timeout 300

En este caso la privoxy se conectara a tor a través de polipo como puede verse en la linea 19, luego de realizar estas modificaciones solo falta configurar nuestro navegador para utilizar privoxy agregando los siguientes parámetros a su configuración:

  • Dirección: 127.0.0.1 o la ip de la maquina donde estén tor, polipo y privoxy
  • Puerto: 8118

Adicionalmente debe confirmar que las siguientes carpetas:

  • /var/cache/polipo/
  • /var/lib/tor/
  • /var/log/polipo/

existan y sean accesibles.

 

Referencias:


Tagged: optimizaciones, polipo, privoxy, tor

Domingo 08 de junio de 2014

Configurando un sitio estático con flask

Continuando con la serie de artículos sobre el microframework de desarrollo web flask, ahora se mostrará como crear un sitio estático.

Este artículo se basa en un artículo en inglés llamado Introduction to Flask, Part 1 - Setting up a static site.

Se usará el mismo archivo utilizado en los artículos anteriores (app.py), en este caso simplemente se agregará el decorador y la función que se va a usar que será para llamar una página de bienvenida.

Aparte del archivo app.py se necesita crear dos directorios, uno llamado templates el cual contendrá la plantilla html y el otro se llamará static que contendrá archivos estáticos como archivos css y archivos javascript.

ernesto@heimdall:~/proyectos/tutorialflask$ ls -l
total 12
-rw-r--r-- 1 ernesto ernesto  792 jun  7 20:56 app.py
drwxr-xr-x 2 ernesto ernesto 4096 jun  7 21:09 static
drwxr-xr-x 2 ernesto ernesto 4096 jun  7 21:10 templates

El archivo app.py tendrá la siguiente información adicional:

#Se agrega el renderizado de la plantilla

from flask import Flask,request,redirect,render_template









#Se usa el decorador ruta para ver el url bienvenido.


@app.route('/bienvenido')


#Se crea la funcion welcome que renderiza una plantilla html.


def welcome():


    return render_template('bienvenido.html')  # renderiza la plantilla bienvenido.html.






Ahora en el directorio templates se crea el archivo bienvenido.html con el siguiente contenido:



Se ejecuta la aplicación y se consulta el url http://127.0.0.1:5000/bienvenido


Ahora se usará un estilo que se llama bootstrap para descargarlo lo puede hacer desde el enlace. Al bajarlo y descomprimirlo copie los archivos bootstrap.min.css y bootstrap.min.js al directorio static, como se muestra a continuación:
ernesto@heimdall:~/proyectos/tutorialflask$ ls -l static/
total 132
-rw-r--r-- 1 ernesto ernesto 99961 feb 13 12:54 bootstrap.min.css
-rw-r--r-- 1 ernesto ernesto 29110 feb 13 12:54 bootstrap.min.js


A continuación se muestra los nuevos cambios a la plantilla bienvenido.html para que use los archivos mencionados anteriormente.

Ahora se abre el navegador al url http://127.0.0.1:5000/bienvenido y se obtiene lo que muestra la siguiente figura:

Martes 27 de mayo de 2014

Certificados de Novell

Novell® Certified Linux Administrator Data Center Technical Specialist

Comentando con un amigo le dije que la certificación LPI valida unas certificaciones adicionales con Novell que en esencia es como un incentivo para seguir las carreras de certificaciones que tienen la misma gente de Novell. Una de ellas es la certificación Novell(R) Certified Linux Administrator y la otra es la de Data Center Techinal Specialist.

¿Cómo obtengo estas certificaciones?

Al presentar y validar LPIC-1 en la página de  Novell puedes incluir tus datos de LPI para que te envíen estos certificados en digital (formato PDF). Entonces mi consejo es presentar la certificación CompTIA Linux+ Powered by LPI que con el convenio que existe con LPI (Linux Professional Institude) se obtiene  la certificación LPIC-1 y luego validar los datos de la cuenta LPI para obtener estas dos certificaciones extra.

Referencias:

 

Jueves 22 de mayo de 2014

Cómo instalar VMWare Tools en Red Hat y CentOS

VMWare how to install VMWare tools on CentOS and Red Hat - running Si necesitas instalar los VMWare Tools en máquinas virtuales corriendo Red Hat o CentOS como sistemas operativo, puedes seguir  el procedimiento descrito a continuación:

Procedimieto

Primero que nada en VMWare vSphere ubica la máquina virtual a la que deseas instalarle los VMWare tools y haz clic en donde dice “Install VMWare Tools” como se muestraen la siguiente imagen: VMWare how to install VMWare tools on CentOS and Red Hat Aparecerá una ventana de diálogo que indica que se montará el disco con los VMWare Tools en el sistema hacendo clic en el botón “mount”. Luego en la máquina virtual donde deseas instalar los VMWare Tools debes hacer lo siguiente desde un terminal de texto:

# mount /dev/cdrom /mnt/
mount: block device /dev/sr0 is write-protected, mounting read-only

# cp /mnt/VMwareTools-9.0.0-782409.tar.gz /opt/

# cd /opt/
# tar xvzf VMwareTools-9.0.0-782409.tar.gz

# cd vmware-tools-distrib/

#./vmware-install.pl

Este último es un script donde te realizarán una serie de preguntas relacionadas a la instalación de los VMWare Tools. En general las opciones por omisión son suficientes, pero si requieres modificar algún comportamiento puedes camiar el valor según tu conveniencia:

Creating a new VMware Tools installer database using the tar4 format.

Installing VMware Tools.

In which directory do you want to install the binary files?
[/usr/bin]

What is the directory that contains the init directories (rc0.d/ to rc6.d/)?
[/etc/rc.d]

What is the directory that contains the init scripts?
[/etc/rc.d/init.d]

In which directory do you want to install the daemon files?
[/usr/sbin]

In which directory do you want to install the library files?
[/usr/lib/vmware-tools]

The path "/usr/lib/vmware-tools" does not exist currently. This program is
going to create it, including needed parent directories. Is this what you want?
[yes]

In which directory do you want to install the documentation files?
[/usr/share/doc/vmware-tools]

The path "/usr/share/doc/vmware-tools" does not exist currently. This program
is going to create it, including needed parent directories. Is this what you
want? [yes]

The installation of VMware Tools 9.0.0 build-782409 for Linux completed
successfully. You can decide to remove this software from your system at any
time by invoking the following command: "/usr/bin/vmware-uninstall-tools.pl".

Before running VMware Tools for the first time, you need to configure it by
invoking the following command: "/usr/bin/vmware-config-tools.pl". Do you want
this program to invoke the command for you now? [yes]
Initializing...

Making sure services for VMware Tools are stopped.

The VMware FileSystem Sync Driver (vmsync) allows external third-party backup
software that is integrated with vSphere to create backups of the virtual
machine. Do you wish to enable this feature? [no]

Found a compatible pre-built module for vmci. Installing it...

Found a compatible pre-built module for vsock. Installing it...

The module vmxnet3 has already been installed on this system by another
installer or package and will not be modified by this installer. Use the flag
--clobber-kernel-modules=vmxnet3 to override.

The module pvscsi has already been installed on this system by another
installer or package and will not be modified by this installer. Use the flag
--clobber-kernel-modules=pvscsi to override.

The module vmmemctl has already been installed on this system by another
installer or package and will not be modified by this installer. Use the flag
--clobber-kernel-modules=vmmemctl to override.

The VMware Host-Guest Filesystem allows for shared folders between the host OS
and the guest OS in a Fusion or Workstation virtual environment. Do you wish
to enable this feature? [no]

Found a compatible pre-built module for vmxnet. Installing it...

The vmblock enables dragging or copying files between host and guest in a
Fusion or Workstation virtual environment. Do you wish to enable this feature?
[no]

!!! [EXPERIMENTAL] !!!
VMware automatic kernel modules enables automatic building and installation of
VMware kernel modules at boot that are not already present. By selecting yes,
you will be enabling this experimental feature. You can always disable this
feature by re-running vmware-config-tools.pl.

Would you like to enable VMware automatic kernel modules?
[no]

No X install found.

Creating a new initrd boot image for the kernel.
vmware-tools start/running
The configuration of VMware Tools 9.0.0 build-782409 for Linux for this running
kernel completed successfully.

You must restart your X session before any mouse or graphics changes take
effect.

You can now run VMware Tools by invoking "/usr/bin/vmware-toolbox-cmd" from the
command line.

To enable advanced X features (e.g., guest resolution fit, drag and drop, and
file and text copy/paste), you will need to do one (or more) of the following:
1. Manually start /usr/bin/vmware-user
2. Log out and log back into your desktop session; and,
3. Restart your X session.

Enjoy,

--the VMware team

Found VMware Tools CDROM mounted at /mnt. Ejecting device /dev/sr0 ...
No eject (or equivilant) command could be located.
Eject Failed: If possible manually eject the Tools installer from the guest
cdrom mounted at /mnt before canceling tools install on the host.

Al finalizar el script ya están instalados los VMWare Tools en la máquina virtual. Ahora se puede desmontar el ISO haciendo:

# umount /mnt

Luego en VSphere, puedes verificar que efectivamente están corriendo los VMWare Tools como se muestra en la primera imagen de este artículo.

 

Miércoles 21 de mayo de 2014

Gabriel Vegas

Gabriel Vegas
Gabriel Vegas » Linux

FAT filesystem – bad superblock

Tiempo sin publicar nada. Hace poco tuve un problema con una memoria sd, movía unos archivos y el Gala de Elementary OS se congelo. Me salia el siguiente error : mount:/dev/sdf1 can’t read superblock Con sudo fdisk -l /dev/sdf me salia: Disco /dev/sdf1: 1973 MB, 1973416448 bytes 61 cabezas, 62 sectores/pista, 1019 cilindros, 3854329 sectores…

Domingo 18 de mayo de 2014

José Luis Rivas

José Luis Rivas
ghostbar

Framework Challenge Bogodev 2014

Ayer participé en el framework challenge de Bogodev. Fue en la sede de Wayra Colombia que es genial.

El reto era hacer una visualización de objetos espaciales alrededor de otro (la "estrella de la muerte") y actualizar sus posiciones a partir de coordenadas X, Y y Z.

La solución que le dió mi equipo consistió en Angularjs y D3js para el frontend y un expressjs muy simple para el backend.

Para este tipo de visualización three.js da un mejor aspecto, genera 3D de verdad y no hay que forzar un fake 3d como nos tocó hacer con D3js, y eso fue lo que hicieron otros equipos. Pero: aprendimos D3js, SVG y cómo funciona D3js cuando da el órden de renderizado lo cuál fue muy instructivo (pista: cuando le pasas un array toma la posición como identificador para hacer el renderizado, tanto posición como transisiones).

Aquí está el código y cómo correrlo por si quieren probarlo: https://github.com/ghostbar/fchallenge-ngjs.

Miércoles 14 de mayo de 2014

Carlos Colmenarez

Carlos Colmenarez
El Blog de Zero » LINUX

Editores de texto basados en terminal más usados en Linux

Editores de texto basados en terminal más usados en Linux

Los editores de texto son una parte fundamental para el manejo de nuestro sistema. Ciertamente hay un montón de aplicaciones que permiten hacerlo desde la terminal, pero estas tres son las más populares.

A pesar de que para muchos es más simple editar sus textos desde utilidades gráficas como Gedit, la capacidad de poder hacerlo desde la terminal es imbatible, sobre todo en esos casos donde tenemos problemas con la interfaz gráfica o cuando estamos trabajando sobre un servidor remoto.

Existen muchas alternativas para este fin, pero son principalmente las tres que mencionaremos a continuación las más populares.

Nano

Ioannis Kedros  cc

Nano es un editor de texto basado en Curses, una biblioteca para el control de terminales sobre sistemas Unix. Es muy similar a Pico, un editor minimalista basado en terminal. A diferencia de Pico, Nano permite el resaltado de sintaxis y en términos generales es muy sencillo de usar.

Para editar un archivo con nano, solo debemos invocarlo en la terminal junto con el texto que deseamos editar. Cuando editamos un archivo con nano se despliega su interfaz junto con el contenido del archivo. Las opciones de edición incluyen moverte entre paginas si el texto es muy largo, buscar, copiar, cortar y guardar los cambios, entre otras. Para seleccionar una de estas opciones debemos presionar la tecla ctrl más la letra de la opción deseada.

Vim

jasonwryan

Vim es un editor de texto muy completo. Es una versión mejorada de Vi, un editor de la década de los 70’s que se encuentra en casi todo sistema de tipo Unix. Vim incluso es utilizado por programadores y administradores de sistema, su gran variedad de opciones lo hace perfecto para este fin. Es avanzado y versátil, incluso permite la configuración o instalación de temas personalizados que resaltan la sintaxis de una manera específica.

Vim te permite hacer tantas cosas que sería casi imposible poder asignarle un atajo de teclado único a cada una de ellas. Es por esto que Vim presenta varios modos de operación, para que puedas realizar varias operaciones con el mismo atajo. Entre los modos de operación mas útiles están:

  • Comando: este es el modo inicial. Permite ejecutar instrucciones para trabajar el formato del texto borrando lineas, por ejemplo. No permite escritura.
  • Inserción: se puede cambiar del modo comando al modo inserción pulsando la tecla i. Este modo es para escribir, borrar y editar texto.
  • Visual: para seleccionar bloques de texto o realizar operaciones por bloques. Una vez se tiene el texto marcado se pueden usar órdenes del modo comando para manipularlo.
  • Linea de ordenes: en este modo se pueden realizar búsquedas. Para acceder se pulsa la tecla dos puntos :. Las búsquedas se pueden realizar hacia adelante y hacia atrás.

También dispone de modos de Selección y Ex. Sin embargo, Vim no es tan fácil de aprender, pero una vez que lo dominas el esfuerzo se paga solo. Vim también tiene plugins para búsqueda difusa de archivos, explorar directorios y mejorar la interfaz de usuario, entre otros. Con un poco de conocimiento en Python o en el lenguaje de scripting de Vim, puedes programar tus propios plugins.

Emacs

Kelsin5

Emacs es un complejo editor de texto siendo GNU Emacs del Proyecto GNU, su implementación mas popular. Al igual que Vim, es muy usado por usuarios avanzados y programadores. Dispone de una gran variedad de características y funciones. Entre otras opciones, permite personalizar el resaltado de sintaxis, usando distintos tipos de letra o colores para mostrar las palabras reservadas, por ejemplo.

Gran parte del poder de Emacs viene de Emacs Lisp, una poderosa extensión de lenguaje que permite manejar múltiples tareas. Emacs tiene varios modos de edición llamados major modes. Hay major modes para edición de archivos de texto ordinario, código fuente para diversos lenguajes de programación, documentos HTML, y LaTeX, entre otros. Estos a su vez permiten la activación de varios minor modes, que contienen características relacionadas a un major mode, haciéndolo aun mas robusto. Los major modes disponen también de comandos especiales de edición para un tipo concreto de texto.

Emacs permite a sus usuarios extender o personalizar aún más sus funcionalidades, pudiendo estos escribir código en Emacs Lisp. Su curva de aprendizaje es elevada, pero una vez dominado se pueden lograr grandes cosas.

Los usuarios de Emacs y Vim suelen ser muy apasionados acerca de cual es el mejor editor pero la idea no es armar una guerra campal, sino que cuentes con excelentes opciones a la hora de editar tus documentos y decidas cual se adapta más a tus necesidades. ¿Usas otra aplicación? Cuéntanos cuál es tu favorita y por qué.

via: bitelia


José Luis Rivas

José Luis Rivas
ghostbar

transloadit-api v1.0.0-rc1

El release candidate de v1.0.0 para transloadit-api ya está disponible.

Puedes instalarlo vía npm y probarlo:

npm install transloadit-api@1.0.0-rc1

Ahora soporta la API completa de transloadit: firmas, assemblies, notifications y manejo de plantillas.

El código está en github, la documentación en este website así como en los comentarios del código (que son la fuente para el website) y por supuesto: cualquier problema repórtalo en el tracker de github. Tiene un montón de pruebas pero aún le faltan algunas, especialmente para operaciones que requieren internet.

Quizás tenga tiempo para escribirlas esta semana y entonces lanzar una v1.0.0 como es.

Martes 13 de mayo de 2014

José Luis Rivas

José Luis Rivas
ghostbar

Primera versión de angular-geocomplete

Esta es la historia de un día que necesitaba con una dirección o el nombre de una ciudad conseguir un array JSON que me diese los posibles lugares donde eso fuese cierto.

Y entonces nació angular-geocomplete.

Lo fino es que se puede combinar con algún typeahead y se obtiene un autocompletado demasiado genial como el de Google Maps.

Y sí, usa el API de Google Maps.

¿Cuál es la gran ventaja? Que obtienes no sólo el nombre del lugar sino sus coordenadas.

Instalable vía bower también con bower install angular-geocomplete.

Problemas a los issues de GitHub.

Domingo 27 de abril de 2014

Valencia Software Libre: Instalaciones y Charlas para el Flisol 2014 Valencia - Carabobo

Jueves 24 de abril de 2014

Valencia Software Libre: Flisol 2014 Valencia - Carabobo

Sábado 19 de abril de 2014

ubuntu-ve: UbuConLa 2014

3D Roll Over Links – version 1.0

Así funciona

Así funciona

Este plugin nació de un requerimiento que me hizo un cliente, ya que había visto este efecto en otros websites, realmente colocar a funcionar esto en el sitio del cliente fue rápido, lo que si me costó fue convertirlo en un plugin para WordPress, es mi primer plugin así que estoy abierto a criticas.

Si quiere saber más sobre el plugin, he creado una página en mi blog para mantener la información del mismo y de los futuros plugins que desarrolle.

El plugin es muy sencillo, pero me sirvió para practicar como hacer un plugin y estoy seguro que iré haciendo más ya que estoy trabajando activamente con WordPress en este momento.

Viernes 11 de abril de 2014

Jorge Ortega

Jorge Ortega
Joenco

14 Encuentro nacional de activadores tecnológicos Marzo/2014

 

Los días 20, 21 y 22 de Marzo del 2014 se realizo en Pto la Cruz el 14 encuentro nacional de activadores tecnológicos(en su mayoría son personas con discapacidad visual), con el objetivo de fortalecer los conocimientos que se tienen sobre el software libre y que ellos a su vez los multipliquen en las regiones.

El contenido que se desarrollo en el encuentro fue:

  1. Generalidades de la distribución Canaima4.0: objetivos, nuevas características, usabilidad.

  2. Repaso del lector de pantalla y magnificador orca: preferencias, atajos de teclado, entre otros.

  3. Conocimiento del escritorio Gnome3.4 (gnome-shell): configuración avanzada, configuración del sistema, navegación por los menús.

  4. Uso básico del terminal/consola: copiar, renombrar, mover, crear, eliminar carpetas y/o archivos, actualización del sistema, instalación de aplicaciones.

  5. Edición de audio: abrir, crear, guardar, grabar, mezclar, añadir efectos y exportar.

  6. Uso del gestor de correos Guacharo: configurar o eliminar la cuenta, enviar y recibir correos, añadir contactos.

Para mas información pueden revisar:

Saludos a todos y los animo a colocar sus comentarios!!

 


Lunes 07 de abril de 2014

Xavier Araque

Xavier Araque
Rendergraf

Calumnia, Difamación, Injuria y Rock and Roll

Xavier Araque | Rendergraf

Foto en la que aparece Xavier Araque junto a miembros de la Comunidad de Software Libre en Venezuela | Rendergraf

Acabo de enterarme en Twitter amigos que me informan que han tomando una de mis fotos realizada en una visita al CNTI cuando hacía la entrega de 20 contenidos educativos “Canaimaedu” para las canaimitas de educación básica, luego de haber participado en el lanzamiento de la versión 2.0 de Canaima y de la cual estuve a cargo 100% de la interfaz gráfica de la distribución.

Me sorprendo al ver que un Blog habla de la detención de personas que comercializaban Canaimitas pero usan una de mis fotos como si fuera yo, es triste saber que personas han difundido en las redes sociales la noticia como cierta pero usando una fotografía que solicité tomarme con varias laptops del plan piloto en el 2008.

Como les dije es triste saber que la gente difunde más rápido una mentira que una verdad y que nadie sepa que realmente yo fui quien doné ad honorem (sin costo alguno) toda la interfaz gráfica de las canaimitas para que ese año se pudiera distribuir en los niños de primaria.

Fotografía en una visita al CNTI, Utilizada por un perfil en Facebook llamado Pepsico Ventas – https://www.facebook.com/pepsico.ventas

Para finalizar quisiera me ayuden a difundir la falsedad de la noticia:

Sí tienes cuenta en WordPress puede reportar ese artículo, Reportar a los administradordes de Wordrpess.com

Voy a escribirle a la cuenta de https://twitter.com/julioCAPerez para que se retracte de la calumnia de la imagen que publicó sobre mí.

Respuesta: https://twitter.com/julioCAPerez/status/453271903634227200

Les recuerdo que los “Delitos Contra el Honor” como la calumnia, la injuria y la difamación.

LA INJURIA

Delito de acción por  instancia de parte   previsto y sancionado en el artículo 444 del Código Penal  Venezolano que  establece: “ Todo individuo que en comunicación con varias personas, juntas o separadas, hubiere ofendido de alguna manera el honor, la reputación o el decoro de alguna persona será castigado con prisión de seis meses a un año y multa de cincuenta a cien Unidades Tributarias.

LA CALUMNIA

Consiste en la imputación falsa a una persona de la comisión de un hecho que La Ley califique como delito, a sabiendas de que este no existe, o de que el imputado no fue quien lo cometió, es decir acusar a una persona de un delito que no cometió. Ella constituye una forma agravada de desacreditación de otro, por lo que ha de reunir todos los caracteres de La Injuria que es el género de los delitos contra el honor. En Venezuela el delito de calumnia está previsto en el Titulo IV, Capitulo III, Artículo 240 del Código penal, el cual establece una pena de prisión de seis a treinta meses, con dos numerales de agravantes que aumentan esta pena.


Archivado en: Personal

Operación Windingo: Malware utilizado para atacar a más de 500 mil computadoras

Está Escrito:
   Pero no oyeron, ni inclinaron su oído, antes se fueron cada uno tras la imaginación de su malvado corazón; por tanto, traeré sobre ellos todas las palabras de este pacto, el cual mandé que cumpliesen, y no lo cumplieron.(Jeremías 11:8)


Tomado de:WeliveSecurity
Desde el año pasado venimos publicando información sobre códigos maliciosos que afectan Linux. Tal es el caso de Linux/Ebury un backdoor OpenSSH utilizado para controlar los servidores y robar credenciales y Linux/Cdorked un backdoor HTTP utilizado para redirigir el tráfico Web
Sin embargo, después de una muy importante investigación desarrollada por el Laboratorio de Investigación de ESET, en colaboración con CERT-Bund (Swedish National Infrastructure for Computing) y otros organismos, se pudo determinar que ambos casos están relacionados y pertenecen a una campaña de infección denominada Windigo.
Con esta campaña los atacantes lograron infectar miles de servidores Linux y Unix, los cuales una vez comprometidos son usados para robar credenciales SSH, para redirigir a quienes visitan los sitios web a contenido malicioso y para enviar spam.
Esta operación ha afectado servidores y empresas de alto perfil, entre las que se incluyen cPanel (la empresa tras el famoso panel de control de hosting de sitios Web) y kernel.org de la Fundación Linux (el repositorio principal de código fuente para el núcleo de Linux.
De acuerdo con nuestro análisis, más de 25.000 servidores se han visto afectados en los últimos dos años, de los cuales más de 10.000 aún están infectados. Si bien la cantidad de equipos afectados no está cerca de los millones que puede afectar un código malicioso en Windows, es importante tener en cuenta que esta cantidad es muy significativa si se tiene presente que cada uno de estos sistemas tienen acceso a ancho de banda considerable, almacenamiento, potencia de cálculo y la memoria. En América Latina, los reportes indican aproximadamente 900 servidores infectados en Brasil, más de 250 en Argentina y 300 en México.
Se ha calculado que Windigo es responsable de enviar un promedio de 35 millones de mensajes de spam diarios y cada día más de medio millón de visitantes de sitios web legítimos alojados en servidores afectados son redirigidos a un paquete de exploits.
En la investigación se contó con la participación de diversas organizaciones internacionales, entre ellas el CERT-Bund, la Infraestructura Nacional Sueca para la Informática , la Organización Europea para la Investigación Nuclear (CERN) entre otros. Con la ayuda de todo el grupo de trabajo, miles de víctimas han sido advertidas sobre la infección de sus servidores, en un esfuerzo por limpiar tantos sistemas como sea posible.
Como resultado de la investigación ponemos a disposición de nuestros lectores un artículo en español con la descripción de la operación Windigo sus escenarios de infección, la forma en que trabaja y la manera de identificar si los servidores están comprometidos. Además tenemos un completo artículo con todo el detalle técnicos de las diferentes amenazas involucradas en Windigo.
ubuntu-ve: FLISoL 2014

Martes 01 de abril de 2014

Actualiza tu Samsung Galaxy Mini (GT-S5570 y GT-S5570L) a Android KitKat 4.4.2 con CyanogenMod 11!!

Cyano 11Larga vida al Samsung Galaxy Mini Original (GT-S5570 y GT-S5570L). Actualízalo a Android Kitkat 4.4.2 gracias a CyanogenMod 11 y al equipo de XDA

/*
* No me hago responsable por dispositivos dañados
* tarjetas SD rotas, guerras termonucleares, etc.
* Investiga un poco antes de hacer este procedimiento.
* TU y solo TU has escogido modificar tu dispositivo,
* así que no soy responsable de tus actos. Este
* procedimiento  podría anular la garantía de fábrica.
*/

Todas las instrucciones para actualizar, así como los enlaces de la descarga podrás encontrarlos en este enlace

Lunes 31 de marzo de 2014

Acceso root en el nuevo Samsung Galaxy S5!!!

Galaxy S5

El día de hoy les traigo los pasos a seguir para tener acceso súper usuario en el nuevo Galaxy S5, buque insignia de Samsung para este 2014.

/*
* No me hago responsable por dispositivos dañados
* tarjetas SD rotas, guerras termonucleares, etc.
* Investiga un poco antes de hacer este procedimiento.
* TU y solo TU has escogido modificar tu dispositivo,
* así que no soy responsable de tus actos. Este
* procedimiento  podría anular la garantía de fábrica.
*/

Primero que nada, algunas consideraciones

  • Se recomienda hacer un respaldo completo de la información contenida en el móvil (Fotos, música, archivos, contactos, SMS, etc.)
  • El dispositivo debe tener al menos un 80% de carga en su batería
  • Los drivers USB deben estar correctamente instalados en tu computador y la depuración USB (USB debugging) debe estar habilitada en el móvil

Ahora debemos descargar todo lo que necesitamos para rootear el Galaxy S4:

Ahora si, los pasos a seguir:

  1. Apaga tu móvil para encenderlo en modo descarga: para ello presiona simultáneamente los botones Volumen-, Home y Power. Luego de una advertencia, presiona el botón Volumen+  para entrar al modo de descarga.
  2. Ejecuta Odin 3.09.exe como administrador en tu máquina, y conecta el móvil en modo descarga mediante el cable USB. Si la conexión es exitosa, aparecerá un mensaje diciendo “Added!!” en Odin.
  3. Ahora haz clic en el botón “PDA” y selecciona el archivo “CF-Auto-Root” descargado.
  4. Selecciona las opciones “Auto Reboot” y “F. Reset Time” del Odin.
  5. Asegúrate que la opción del Odin “Re-partition” NO está seleccionada
  6. Haz clic en el botón “Start” para comenzar el proceso
  7. Una vez se complete el proceso, el móvil se reiniciará y un mensaje con la palabra “PASS” en fondo verde debe aparecer en el Odin.
  8. Desconecta el móvil y disfruta xD

Martes 25 de marzo de 2014

Configuración de un servidor web Apache en CentOS

Está Escrito:
Si confesamos nuestros pecados, él es fiel y justo para perdonar nuestros pecados, y limpiarnos de toda maldad. (1 Juan 1:9)
Tomado de : Desarrolloweb
Cuando contratamos un servidor a nuestro proveedor de servicios, podemos elegir el sistema operativo, la distribución y la configuración inicial. En nuestro caso optaremos por un servidor Linux con una distribución de la última versión de CentOS, configuración mínima y 64 bits. 

Una vez que el servidor este disponible podremos acceder por SSH. Nada mas conectar podremos empezar con la siguiente configuración:

1) Cambiamos el nombre de nuestra máquina

Podemos hacerlo editando el fichero “/etc/hosts”. Al final de la línea que empiece por 127.0.0.1 añadimos el nombre que queramos, quedando de la siguiente manera:
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 minombre

 
También habrá que hacerlo en el fichero “/etc/sysconfig/ network”, cambiando el valor de la variable “HOSTNAME”. En este caso el fichero queda de la siguiente manera:
NETWORKING=yes
HOSTNAME=minombre

2) Actualizamos el sistema con el siguiente comando


#yum update
Si queremos que al instalar los grupos, que veremos mas adelante, se instalen también los paquetes opcionales, añadiremos entonces en el fichero "/etc/yum.conf" la siguiente línea:
group_package_types=mandatory,default,optional

3) Instalamos las herramientas de desarrollo, como el paquete de compiladores GCC, make, las fuentes del kernel y Perl


#yum install gcc make kernel-devel perl
Esto instala los mínimos paquetes para desarrollo. Si queremos instalar todos ellos, podremos hacerlo ejecutando el siguiente comando:
#yum groupinstall “Development tools”.

 
Si antes de instalarlos queremos sólo ver los paquetes que contiene el grupo de desarrollo, ejecutamos la siguiente línea:
#yum groupinfo "Development tools"

4) Instalamos PHP

Con el siguiente comando instalamos todo lo necesario:
 
#yum groupinstall "PHP Support”

 
Puede que nos falte alguna cosa, así que podemos correr la siguiente línea para completar la instalación de PHP:
#yum install php-mbstring php-devel php-mcrypt zlib zlib-devel zlib-static

 
Seguidamente, podemos configurar la zona horaria predeterminada usada por las funciones "date" y "time", para ello en el fichero "/ etc/php.ini" añadimos la siguiente línea:
date.timezone = "Europe/Madrid"

5) Instalamos y configuramos el servidor Apache


#yum groupinstall “Web Server”.
Como hemos dicho, si antes de instalar queremos ver todos los paquetes que contiene este grupo, haríamos "groupinfo" en lugar de "groupinstall".
Podemos completar la instalación del servidor Apache instalando las librerías de desarrollo:
#yum install httpd-devel

 
Para ver la versión de Apache instalada, ejecutamos:
#httpd -v

 
El fichero principal de configuración se encuentra en "/etc/ httpd/conf/httpd.conf", y el resto de ficheros de configuración en "/etc/httpd/conf.d".
Hay que decir que cualquier fichero con extensión .conf que coloquemos en el directorio "/etc/httpd/conf.d" será procesado por el servidor Apache. Tener en cuenta que los procesa por orden alfabético. Si hacemos un cambio en alguno de estos ficheros o añadimos uno nuevo, hay que recargar para que el servidor recoja los cambios y para ello hacemos:
#service httpd reload
Ahora daremos un nombre al servidor. Aunque no es necesario hacer esto, sí es recomendable para que no aparezcan problemas en los arranques. Para esto nos aseguramos de que en el fichero de configuración httpd.conf tengamos la siguiente línea:
ServerName localhost
También es recomendable eliminar la página de prueba que nos instala el servidor. Para ello editamos el fichero /etc/httpd/ conf.d/welcome.conf y comentamos todas las líneas, quedando de la siguiente manera:
#<LocationMatch "^/+$">
#Options -Indexes
#ErrorDocument 403 /error/noindex.html
#</LocationMatch>
Si queremos utilizar servidores virtuales (virtual hosts) y tener los ficheros organizados, podemos crearnos un fichero llamado por ejemplo "vhosts.conf" que contenga nuestros virtual hosts y colocar el fichero en "/etc/httpd/conf.d". El fichero quedaría con un contenido parecido al siguiente:
NameVirtualHost [IP]:80
<VirtualHost [IP]:80>
ServerName www.midominio.com
ServerAlias www.midominio.com midominio.com
DocumentRoot /var/www/html/midominio.com/www
CustomLog /etc/httpd/logs/midominio.com.access_log combined
ErrorLog /etc/httpd/logs/midominio.com.error_log
</virtualhost>

 
Sustituir [IP] por tu IP pública y “midominio” por el dominio que quieras dar servicio.
Ahora podemos arrancar el servidor Apache de la siguiente manera:
#service httpd start

 
Si queremos que el servicio se inicie al arrancar nuestra máquina, podemos habilitarlo con:
#chkconfig httpd on

 
Si en los servidores DNS de "midominio" tenemos las entradas correspondientes apuntadas correctamente a nuestra IP, ya podríamos verlo a través de un navegador entrando en http:// www.midominio.com 

1) Instalación de MySQL

Tal y como hicimos con Apache, instalamos MySQL de manera similar, es decir:
#yum groupinstall “MySQL Database server”

  Esto instalará el paquete mysql-server necesario para ejecutar el servidor de base de datos. A continuación instalamos las herramientas del cliente MySQL con:
#yum groupinstall “MySQL Database client”

  A continuación editamos el fichero de configuración de MySQL que podemos localizar en “/etc/my.cnf”.
Por cierto, el editor que suelo utilizar en el terminal es “nano”. No es tan potente como Vim o Emacs pero para ediciones sencillas, como en estos casos, es más que suficiente y su uso es muy simple: al editar cualquier fichero podemos ver en las dos líneas de abajo la ayuda.
Por tanto, hacemos:
#nano /etc/my.cnf

  El contenido de my.cnf podría ser algo tan sencillo como esto:
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
symbolic-links=0
[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

  Otros ficheros con configuraciones diferentes podemos encontrarlos en “/usr/share/doc/mysql-server-x.x.x” (sustituir x.x.x por nuestra versión de MySQL). Aquí podremos encontrar ejemplos de configuraciones para sistemas muy grandes (my-huge.cnf), pequeños (my-small.cnf), etc.
Lo siguiente que debemos hacer es ponerle la clave al usuario root de MySQL, así como eliminar la base de datos “test” y el usuario anónimo que se instalan por defecto. Para ello arrancamos el servicio con:
#service mysqld start

  A continuación ejecutamos la siguiente línea:
#/usr/bin/mysql_secure_installation

  Después de contestar a una serie de preguntas que nos hace, ya tendremos nuestro servidor MySQL instalado y ejecutándose. Es recomendable poner que se inicie al arrancar nuestra máquina Linux, para ello basta con hacer:
#chkconfig mysqld on

  Si queremos ver la información de los servicios del sistema y comprobar que los que hemos instalado hasta ahora se inician al arrancar la máquina, podemos hacerlo ejecutando:
#chkconfig --list

  En este punto podremos ver los servicios httpd y mysqld configurados en los niveles 2, 3, 4 y 5.

2) Instalamos el servidor FTP

Actualmente existen varios servidores de FTP que podemos instalar en nuestro sistema. En nuestro caso hemos optado por instalar ProFTPD, ya que es bastante estable y seguro.
Lo primero es asegurarnos de que no tenemos ya instalado otro servidor FTP, como pudiera ser vsftpd; en tal caso habría que eliminarlo con:
#yum remove vsftpd

  Si queremos instalar proftpd con yum debemos habilitar EPEL, que es un repositorio con paquetes adicionales. Lo habilitamos de la siguiente manera:
#rpm -Uvh http://download.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpm

  A continuación basta con instalar proftpd:
#yum install proftpd

  Seguidamente lo configuramos editando el fichero “/etc/proftpd.conf”. Algunas líneas útiles que deberíamos agregar al fichero de configuración y que no vienen en la instalación por defecto son:
#Para que no muestre los directorios superiores
DefaultRoot ~
#Para ocultar . y ..
ListOptions "" strict
#Permite continuar descargas incompletas
AllowRetrieveRestart on
#Permite continuar subidas incompletas
AllowStoreRestart on
Arrancamos el servicio:
#service proftpd start

  Lo habilitamos para que se inicie al arrancar la máquina:
#chkconfig proftpd on

  En este punto ya tendríamos el servidor listo para empezar a funcionar, pero antes de nada lo recomendable es asegurarlo. Aquí hay algunas cosas que hacer, pero para no alargar demasiado el artículo comento un par de puntos importantes para hacer ya mismo:
  • Si contamos con un firewall lo ideal es utilizarlo y cerrar todos los puertos excepto los que vayamos a utilizar: 80(http), 443(https), 20, 21(ftp), 22(ssh),…
  • Si accedemos a nuestra máquina por ssh podemos añadir una regla a las iptables para restringir el acceso por IP, lo mismo para el ftp (sustituimos las Xs por nuestra IP):
#/sbin/iptables --flush
#/sbin/iptables -A INPUT -s XXX.XXX.XXX.XXX -p tcp --dport 20:21 -j ACCEPT
#/sbin/iptables -A INPUT -s XXX.XXX.XXX.XXX -p tcp --dport 22 -j ACCEPT
#/sbin/iptables -A INPUT -p tcp --dport 20:21 -j DROP
#/sbin/iptables -A INPUT -p tcp --dport 22 -j DROP
#/etc/rc.d/init.d/iptables save

  Sé que se puede profundizar mucho mas en cada uno de estos puntos, pero el objetivo era hacer una guía breve y sencilla para poder comenzar a trabajar con el servidor.

Lunes 24 de marzo de 2014

Montando Imagenes de Discos

Casualmente necesite hacerle un fsck a un disco con LVM de una maquina virtual en KVM. Antes de ponerme a pelear con la VM y ver como iniciar en modo single, el vnc, y hacer el papeleo y protocolo correspondiente … Continue reading

Domingo 23 de marzo de 2014

David Moreno

David Moreno
dm's blog

New Debian mailing list: debian-astro

I will try to report my Debian activities here. I am trying to retake them and as I'm usually busy at work, I have limited amount of time to do so, they stand small for now.

A new mailing list, debian-astro, has been created. This was requested to create a space to allow a discussion space around astronomy for Debian, both for professionals and amateurs, to potentially look into a blend, and in general to talk about packaging and development of astronomy-related tools into Debian. Thanks to those interested on making this happen. Go subscribe today!

Jueves 20 de marzo de 2014

Open Data Monterrey 2014

Desde que Milton y yo llegamos a Monterrey habíamos estado alejados de la actividad de participación en comunidades de Open Source en la ciudad, solo unas pocas asistencias a reuniones organizadas por la comunidad de Python de Monterrey.

Nos enteramos del Open Data Monterrey 2014 por invitación del CIC, con quién  Milton ha colaborado en sus ratos de ocio desarrollando un cliente en Python [https://github.com/milmazz/pycic] para interactuar con el API del Centro de Integración Ciudadana (CIC) quienes promueven la participación ciudadana a través de medios tecnológicos para organizarse y resolver problemas comunes, uno de ellos por ejemplo es el tema de la inseguridad o el tráfico en la zona metropolitana del estado de Nuevo León.

El evento se realizó los días 22 y 23 de febrero en el marco del International Open Data Hackaton y el CodeAccross The World. Organizado por el CIC y Codeando México con aliados como: Alcalde ¿Cómo vamos? , rutadirecta, Mente y Nongrid

Se dictaron talleres interesantes como Análisis espacial y estadístico de delitos: más allá de los hotspots y correlaciones por Carlos Castro representando Estrategia Digital Nacional (México abierto),  Civic hacking 101 – Creando tu primer aplicación cívica de código abierto por Braulio Chávez y Noé Domínguez representando a Codeando México. Scraping de datos públicos por Francisco Mekler representando al Instituto Mexicano para la Competitividad.

Los lineamientos para conceptualizar el proyecto era usar los datos disponibles en http://data.cic.mx y lograr obtener información que pueda ser interpretada en beneficio de la comunidad.

Surgieron ideas muy interesantes como una app móvil para implementar la alerta Amber, para los que no la conocen esta es una alerta para la búsqueda de menores desaparecidos y en la actualidad se hace por medios tradicionales como la radio, este proyecto tuvo mención honorífica. El tercer lugar se lo llevó un software para geolocalizar las patrullas de policía de acuerdo a las estadísticas de incidentes de delito en una zona.

En el primer y segundo lugar hubo empate con el proyecto ¿Cuánto debemos? y nuestro proyecto ¡Pregúntale! 

Ganadores

Pregúntale está basado en varias iniciativas de peticiones a nivel global, hay muchas, cada una con su concepto, para nosotros askThem.io fue nuestra mayor inspiración.

¿Por qué pregúntale? El estado de Nuevo León cuenta con  la iniciativa de Alcalde ¿Cómo vamos? En donde existe un espacio de comunicación con los alcaldes del área metropolitana, conformado por los alcaldes de los 9 municipios.

Es muy importante saber que en Nuevo León solo el 2% de la población manifiesta interés en participar en cualquier causa social.

Pregúntale es una aplicación web que puede ser un medio para incentivar la participación ciudadana, en donde cualquier persona de la comunidad puede plantear preguntas dirigidas a los alcaldes y promoverlas en las redes sociales teniendo una posibilidad real de recibir una respuesta de la autoridad. La aplicación fue desarrollada en el lenguaje Python haciendo uso del microframework Bottle.Para el desarrollo de las vistas HTML se usó de Jinja2  junto con Bootstrap para el delineado del layout, para la muestra de gráficas y estadísticas se uso HighCharts.

Los próximos pasos consistirán en armar un API para el manejo de preguntas, respuestas, alcaldes y usuarios y organizaciones.

Si alguien desea contribuir con el desarrollo de ¡Pregúntale! el repositorio del proyecto se encuentra en [github.com/milmazz/preguntale] porque ciertamente cumpliremos con aquello de: “Lo que se hace en el hackatón, no se queda en el hackatón”, continuaremos mejorando ¡Pregúntale! y por supuesto, haciéndolo de dominio público.


Android Kitkat 4.4.2 en tu Acer Iconia A500!!!

Acer Iconia A500

Nuevamente, debemos dar gracias al trabajo de Thor2002ro, desarrollador en el Foro Tegraowner, quien ha estado trabajando de forma ardua en portar las últimas versiones de Android a nuestra Acer A500, proporcionándole nueva vida y ahorrándonos la necesidad de darla de baja. 

/*
* No me hago responsable por dispositivos dañados
* tarjetas SD rotas, guerras termonucleares, etc.
* Investiga un poco antes de hacer este procedimiento.
* TU y solo TU has escogido modificar tu Tablet,
* así que no soy responsable de tus actos. Este
* procedimiento  podría anular la garantía de fábrica.
*/

Requerimientos:

  • Acer Iconia A500 Rooteada
  • Bootloader ICS v8
  • Thor Recovery v1.7.3 o superior

Si no tienes los requerimientos anteriores, y tu tablet se encuentra con la última versión oficial de Acer (4.0.3), puedes usar la herramienta Afterota v1.09 y seguir las instrucciones en el post de XDA Developers

Si ya cumples los requerimientos, deberás suscribirte en el Foro Tegraowners para poder descargar la ROM y flashearla de acuerdo a las siguientes instrucciones:

  1. Entrar a modo Recovery (Power + Volumen[+])
  2. Hacer wipe de Data, Cache y Dalvik Cache
  3. Instalar ROM (Tiene su propio instalador luego de seleccionar el Zip). En este paso podrán seleccionar si desean soporte 3G para modems Huawei
  4. Instalar Gapps (De este enlace)
  5. Instalar SuperSU para acceso Root (De este enlace)
  6. Reiniciar y dejar algunos minutos a que complete la instalación
  7. Disfruta

Domingo 16 de marzo de 2014

ubuntu-ve: IV Encuentro Nacional de Tecnología adaptativa de personas con discapacidad visual

Lunes 10 de marzo de 2014

Milton Mazzarri

Milton Mazzarri
milmazz

libturpial needs your help

Do you want to begin to contribute into libturpial codebase but you don’t know where to start?, that’s ok, it also happens to me sometimes, but today, the reality is that we need your help to fix some errors reported by our style checker (flake8), this errors are:

  • E126: continuation line over-indented for hanging indent
  • E128: continuation line under-indented for visual indent
  • E231: missing whitespace after :
  • E251: unexpected spaces around keyword / parameter equals
  • E261: at least two spaces before inline comment
  • E301: expected 1 blank line
  • E302: expected 2 blank lines
  • E303: too many blank lines
  • E501: line too long
  • E711: comparison to None should be if cond is not None:
  • E712: comparison to False should be if cond is False: or if not cond:
  • F401: imported but unused
  • F403: unable to detect undefined names
  • F821: undefined name
  • F841: local variable is assigned to but never used
  • F999: syntax error in doctest
  • W291: trailing whitespace
  • W391: blank line at end of file
  • W601: .has_key() is deprecated, use in

As you can see, some errors are really easy to fix but are too many for us, so please, we desperately need your help, help us!

The following is how we expect the community can contribute code into libturpial via Pull Requests.

1) If you don’t have a Github account, please create one first.

2) Fork our project

3) Install Git, after that you should setup your name and email:

    $ git config --global user.name "Your Name, not your Github nickname"
    $ git config --global user.email "you@example.com"
    

4) Set your local repository

    $ git clone https://github.com/your_github_nickname/libturpial.git
    

5) Set satanas/libturpial as your upstream remote, this basically tells Git that your are referencing libturpial’s repository as your main source.

    $ git remote add upstream https://github.com/satanas/libturpial.git
    

5.1) Update your local copy

    $ git fetch upstream
    

6) Verify that no one else has been working on the same bug, you can check that in our issues list, in this list you can also check Pull Requests pending for the BDFL approval.

7) Working on a bug

7.1) In the first place, install tox

    $ pip install tox
    

7.2) Then, create a branch that identifies the bug that you will begin to work on:

    $ git checkout -b E231 upstream/development
    

In this example we are working on the bugs of the type: E231 (as indicated by our style checker, flake8)

7.3) Make some local changes and commit, repeat.

7.3.1) Delete the error code that you will begin to work from the ignore list located at the flake8 section in the tox.ini file (located at the root of the project)

Example:

    # Original list:
    ignore = E126,E128,E231,E251,E261,E301

    # After we decide to work in the E231 error:
    ignore = E126,E128,E251,E261,E301
    

7.3.2) Execute tox -e py27 to check the current errors.

7.3.3) Fix, fix, fix…

7.3.4) Commit your changes

    $ git commit -m "Fixed errors 'E231' according to flake8."
    

7.4) In the case that you fixed all errors of the same type, please delete the corresponding line in the tox.ini file (located at the root of the project)

7.4.1) Don’t forget to commit that.

8) Publish your work

    $ git push origin E231
    

Please, adjust the name E231 to something more appropiate in your case.

9) Create a Pull Request and don’t hesitate to bug the main maintainer until your changes get merged and published. Last but not least, don’t forget to add yourself as an author in the AUTHORS file, located at the root of the project.

10) Enjoy your work! :-)

If you want to help us more than you did already you can check our issues list, also, you can check out the Turpial project, our light, fast and beautiful microblogging client written in Python, currently supports Twitter, and identi.ca.

You can find more details on our guide, also, in case of doubt don’t hesitate to reach us.

About libturpial

libturpial is a Python library that handles multiple microblogging protocols. It implements a lot of features and aims to support all the features for each protocol. At the moment it supports Twitter and Identi.ca and is the backend used for Turpial.

About Turpial

Turpial is an alternative client for microblogging with multiple interfaces. At the moment it supports Twitter and Identi.ca and works with Gtk and Qt interfaces.

libturpial needs your help was originally published by Milton Mazzarri at milmazz on March 10, 2014.

Sábado 08 de marzo de 2014

Nerissa Aguilera

Nerissa Aguilera
Blog de Nerissa

HISTORIAS I - Mujeres

Días de Software Libre en el X Salón de Arte Digital de Maracaibo

Salón de Arte Digital de Maracaibo

Salón de Arte Digital de Maracaibo

Sobre el Evento

El Salón de Arte Digital de Maracaibo se celebra anualmente con participantes locales y foráneos, con el objetivo de reunir y mostrar el trabajo creativo de todo el que desee participar que involucre la tecnología en su proceso creador o como plataforma. Cada año hay diversos participantes divididos en cuatro categorías: impreso (subdividido en fotografías e ilustraciones digitales y digitalizadas), videos (animación 2D, 3D, Flash y stop motion), música digital y multimedia. Además de una Charla-Foro durante los cuatro días del evento bajo el título Creatividad + Tecnología.

¿De dónde viene la idea de hacer un Salón de Arte Digital en Maracaibo?

Según Fernando Asián, Fundador del Salón de Arte Digital “La idea nace de la necesidad. En Venezuela dejaron de celebrarse salones nacionales de arte desde 1989. Como artista plástico participé en muchos de ellos, siendo reconocido con premios como el Premio Emilio Boggio para Dibujo en el Salón Arturo Michelena, y el Premio Metro de Caracas para Dibujo, en el Salón Nacional de Artes Plásticas, 1989, entre otros. Deduje que la inevitable, y cada vez más presente, tecnología era un elemento aglutinador, o mejor, una excusa para convocar actividades artísticas que usan el formato digital en su realización. Esta incorporación del elemento tecnológico facilita la participación de cualquier género, lo que permite romper el paradigma del salón clásico. Por otra parte la herramienta digital no producirá un nuevo tipo de arte, pero favorece la interrelación entre géneros y facilita la producción de expresiones como el cine, la multimedia, etc…¨

Salón de Arte Digital, es un evento realizado por 10 ediciones, que reúne artistas multimedia de todo el mundo. Este edición ofrece nuevas tecnologías, nuevos medios en las artes y en las ciencias. Este evento se estará realizando desde el 10 al 28 de Marzo 2014.

ACTUALIZADO:  Sirva la presente para comunicar que se cambio el inicio de las actividades de los talleres al Software Libre en Salón de Arte Digital debido a las protestas que se encuentran cerca de PDVSA La Estancia Maracaibo, mas se estima iniciar una semana después de lo planeado, es decir, el 17 de Marzo hasta el 28 de Marzo, allí los esperamos.

Información básica

Lugar: PDVSA La Estancia Maracaibo. Ubicado en la Calle 77 (bulevar 5 de Julio), parroquia Olegario Villalobos del Municipio Maracaibo, al lado del Edificio Principal de Enelven.

Costo: ENTRADA TOTALMENTE LIBRE Y GRATUITO

Inscripciones: Desde el 5 de marzo de 2014, en la recepción de PDVSA La Estancia Maracaibo.

Cronograma de Software Libre en el Salón de Arte Digital de Maracaibo.

Primer día – 10 de marzo

Titulo: ¿Qué es el Software Libre?

Descripción: esta cátedra habla de Historia, Definición y Filosofía de The GNU Project, Free Software Foundation (FSF), Software Libre (Free Software), El Núcleo Linux, Código Abierto (Open Source), Open Source Initiative (OSI). Además trata sobre las Licencias, Distribuciones, Alternativas Libres, Comunidades de Software Libre, Ventajas, Desventajas, Situación Actual del SL en Vzla, Sitios en Internet.

Duración: 1 hora académica

Titulo: ¿Qué es Hardware Abierto?

Descripción: esta cátedra habla de la Problemática actual, Historia, Lee Felsenstein y el Homebrew Computer Club, FPGAs y Open Design Circuits. Definición y Filosofía según su naturaleza (Hardware estático y Hardware reconfigurable); y según su filosofía, Open Hardware, Open source hardware, Free hardware design, Libre hardware design, Free hardware. Además trata sobre el Licenciamiento, Comercialización, Modelos de intercambio, Proyectos, Comunidades de Hardware Abierto, Ventajas y Desventajas, Situación actual en Venezuela, Conclusiones, Sitios de Referencia.

Duración: 1 hora académica

Titulo: Del uso de la tecnología a la innovación tecnológica.

Descripción: esta cátedra habla de la experiencias de muchos activistas Venezolanos dentro de las comunidades de tecnologías libres y su formación socio política ante la tecnología y su impacto en la sociedad, formando a nuevos ciudadanos, estos actualmente no solo son activista en tecnologías que promuevan el conocimiento libre sino forman parte muchos movimientos culturales y sociales a nivel mundial, nacionalmente y regionalmente. Con esta experiencia se educa como involucrarse en estos movimientos.

Duración: 1 hora académica


Segundo día – 11 de marzo

Titulo: Distribuciones de Software Libre Venezolanas

Descripción: esta cátedra habla de Distribuciones GNU/Linux, ¡GNU/Linux a la medida!, Clasificación de Distribuciones, Historia en Árbol genealógico y Mapa mental de distros. Además las Implementaciones Venezolanas de distros como: HVLinux, Bluewall GNU/Linux, KnoppixMED, LinuxDoc, Latinux, GNU/Linux – Venezuela, Soliedelca, Lavicux, ULANIX y sus sabores, Kuntur y CANAIMA GNU/Linux, con algunas demostraciones y anexos las referencias a Sitios en Internet.

Duración: 1 hora académica

Titulo: Proyecto Canaima

Descripción: esta cátedra habla del proyecto Canaima surge como un proyecto para normalizar la migración a Software libre en al APN en Venezuela, en esta charla busca compartir las experiencia del proyecto Canaima globalmente no solo como un producto tecnológico sino como el estado ofreció la apertura a la comunidades de software libre para compartir saberes y ayudar a construir una base de socio productiva en tecnologías libres en Venezuela, aquí se comenta un poco de su historia, productos tecnológicos y organización social de la comunidad hasta el momento, encuentros comunitarios y recursos tecnológicos disponibles en redes sociales e Internet para colaborar virtualmente con el proyecto.

Duración: 1 hora académica

Titulo: Diseño Gráfico Digital en Software Libre

Descripción: esta cátedra habla de Alternativas Libres para Editor de gráficos; Editor de gráficos vectoriales; Editor de animación 2D; Editor de gráficos 3D; Editor de gráficos de post-producción; Editor de Fuentes; Maquetación y Publicación; Animaciones Web; Editores Web; con sus características técnicas y tabla de costos por licenciamiento de software. Además trata sobre Sitios en Internet y Demostraciones.

Duración: 1 hora académica


Tercer día – 12 de marzo

Titulo: Sistema de gestión de contenidos Plone

Descripción: esta cátedra habla de como crear facilmente usando el software de sistema de gestión de contenidos Plone ideal para creacion de Paginas Web

Plone es el mas longevo, poderoso, flexible, seguro y premiado sistema de gestión de contenido escrito en Python. Utilizado en sitios como Brasil.gov.br, CIA.gov y VTV.gob.ve, él es conocido por su seguridad e flexibilidad. En esta charla exploraremos, ¿cómo funciona él?, ¿cómo funciona su comunidad organizada?, y vemos como los usuarios exigentes con fechas límite de entrega le encanta Plone, ya que les permite no tener que inventar la rueda de nuevo cada vez que trabajan en la carga de contenidos en la Web.

Duración: 1 hora académica

Titulo: Traducción asistidas por computadoras en Software Libre

Descripción: esta cátedra habla de ¿Qué es la traducción?, describir los recursos del traductor, también como ha evolucionado hasta la actualidad la industria de la Lengua. Herramientas CAT (Computer-aided Translation), Memorias de Traducción. Se ofrece un análisis comparativo entre herramientas CAT privativas y libres donde se describen sus ventajas y desventajas, costo de licencias de software y soporte. También se ofrecen algunos recursos en la red y demostraciones.

Duración: 1 hora académica

Titulo: Montaje de un proyecto de Software Libre

Descripción: esta cátedra habla de ¿Cómo montar un proyecto de software libre?, lo que hay que hacer antes de comenzar el proyecto se explican los temas de: Lenguaje de programación, Plataforma, Especificaciones, Luego se debe definir algunas metodologías de desarrollos que se asemejen a SL y las herramientas de trabajo colaborativo para el desarrollo y control de gestión y proyectos para definir roles del proyecto, uso de recursos CVS, Lista de correos; tales como algunos recursos de la Web 2.0 disponibles para empezar a organizarse, y también sobre algunos FOSP-hostsites. Y una vez que esta listo la primera publicación se deben tomar en cuentas los aspectos legales, buenas prácticas al liberar, la publicidad del proyecto, el empaquetamiento y distribución (fuentes y binarios), el cuidado con la imagen, el soporte a usuarios: sitios de referencia, BTS, comunidades. Además trata sobre el Tiempo de dedicación al proyecto, Conclusiones, Referencias, Sitios en Internet, Demostraciones, Preguntas.

Duración: 1 hora académica


Del 13 al 18 de marzo

Actividades simultaneas de talleres de diseño gráfico y dibujo, exposición de arte. Mas información recepción de PDVSA La Estancia Maracaibo.

Mas información

Para difundir a través de las redes sociales:

Google+: https://plus.google.com/u/0/events/c0shdk3hpl860gg9v90iq7lbsu0

Facebook: https://www.facebook.com/events/595560203864477/