miércoles, 17 de septiembre de 2014

Antigio [Leído]

Antigio es el nombre de la novela escrita por Alexander Copperwhite, el último libro que he tenido la oportunidad de leerme, más exactamente la edición: El montaje del Director.

Portada del libro Antigio de Alexander Copperwhite
Portada del libro Antigio de Alexander Copperwhite
Básicamente se trata de una novela que combina misterio, enigmas, asesinatos, mitología, aventura, e incluso romance; en la que su protagonista - El padre Vicente Gómez - nos narra como termina envuelto junto con sus amigos Eduardo y Emma en una aventura por cazar a un asesino en serie.

La historia se desarrolla en diferentes países y lugares emblemáticos del continente Europeo, dando una interesante visión de Europa como un único país. Cada caso de asesinato está lleno de mitología griega y simbolismo que los interconecta, lo que en mi concepto hace más atractiva la historia.

Por parte del autor se denota un trabajo investigativo ya que los lugares, descripciones, personajes, culturas y demás elementos se describen con gran detalle. En cuanto a la narrativa se utiliza un lenguaje muy comprensible, combinando palabras y conceptos de otros idiomas como el portugués, francés, inglés, alemán y griego, lo cual le agrega más calidad. 

Personalmente la novela fue de mi gusto, ya que combina los habituales elementos de una novela negra o de misterio como por ejemplo una trama, personajes y situaciones inesperados, entre otros. Si bien su final en cierta forma puede ser un poco predecible, algunos elementos logran sorprender al lector y ciertas situaciones y personajes que se consideran evidentes resultan siendo lo contrario a lo que esperabas.

Para obtener la novela sólo basta con ir al sitio web del autor y descargarla de forma gratuita, e incluso se puede obtener en Amazon en versión para Kindle.

jueves, 11 de septiembre de 2014

Matando la productividad desde la consola de Linux

Quien no haya procrastinado al menos una vez en su vida que tire la primera piedra, porque una pausa activa de vez en cuando no cae mal. 

A continuación una pequeña selección de películas y juegos disponibles desde la línea de comandos (si desde la línea de comandos), para los cuales solo necesitamos una conexión a internet para accederlos.

Películas y animaciones

Una de las películas más conocidas y taquilleras en el mundo es Star Wars, la cual no podía quedarse sin su versión ASCII para los más geeks. Para visualizarla sólo basta con conectarse vía telnet desde cualquier cliente (yo uso PuTTy) al servidor towel.blinkenlights.nl:

telnet towel.blinkenlights.nl

Y  disfrutar de la película:

Película Star Wars en ASCII
Película Star Wars en ASCII

También existe una animación llamada BB, que funciona sobre sistemas basados en UNIX como Linux, HP-UX o AIX por ejemplo; y sobre DOS. El demo es una muestra de como es posible crear aplicaciones de consola con color, sonido y animaciones haciendo uso de las librerías adecuadas.

Para instalar BB sólo basta con descargar los paquetes adecuados desde su sitio web oficial y seguir las instrucciones de instalación. En el caso de Linux muchas distribuciones lo incluyen en sus repositorios oficiales, por lo cual solo basta con instalarlo desde el gestor de paquetes de la distribución como apt-get, pacman o yum por ejemplo; para mi caso por ejemplo lo instalé con apt-get así:

sudo apt-get install bb

Para correr la animación sólo basta con ejecutar el comando bb y disfrutarla:

Animación BB
Animación BB

Juegos 

Uno de los juegos de arcade más legendarios es Space Invaders, que se encuentra disponible en los repositorios de muchas distribuciones de Linux para su instalación. En el caso de Debian y derivados solo basta con ejecutar apt-get para instalarlo:

sudo apt-get install ninvaders

Y ejecutar el comando ninvaders para entretenerse:

Space Invaders para Linux
Space Invaders para Linux

De igual forma existe una recopilación de juegos clásicos para jugar desde la línea de comandos de Linux; en cuya lista se encuentran títulos como tetris, el ahorcado, monopoly, 5 en raya, entre otros interesantes juegos cuya lista se puede consultar aquí. Para su instalación sólo basta con instalar el paquete bsdgames:


sudo apt-get install bsdgames

Y una vez instalado ejecutar el juego que deseemos llamándolo por su nombre según la lista anteriormente mencionada, por ejemplo tetris se ejecuta con el comando tetris-bsd:

Tetris desde la línea de comandos
Tetris desde la línea de comandos

Finalmente en esta página podemos encontrar una amplia lista de juegos publicados en internet y accesibles desde la línea de comandos; entre los cuales podemos encontrar juegos de rol, multi usuario, de acción y de muchos géneros más.

Huevos de Pascua y otros programas entretenidos (Linux)

En el mundo de la informática se conoce como Huevo de Pascua a cualquier funcionalidad o mensaje ocultos en el software o contenido digital. A continuación algunos huevos de pascua disponibles en muchas distribuciones de Linux.

Con el programa sl podemos visualizar un tren en movimiento, para instalarlo sólo basta con ejecutar:

sudo apt-get install sl


Con el programa cowsay podemos hacer "hablar" una vaca ASCII. Primero instalamos el programa con:

sudo apt-get install cowsay


Y luego ejecutamos el programa dándole como parámetro el texto que mostrará la vaca, por ejemplo al ejecutar cowsay hola se mostrará a la vaca saludando:

Vaca ASCII
Vaca ASCII

Incluso podemos hacer "hablar" a tux utilizando el parámetro -f tux:

Tux ASCII
Tux ASCII

Y si queremos otra vaca pero sin instalar software adicional, podemos acudir a la vaca que incorpora el gestor de paquetes apt-get:

sudo apt-get moo

Conlcusiones


Existen muchos huevos de pascua no solo en la terminal sino también en programas como Mozilla Firefox, Open Office e incluso en Google. De igual forma existen juegos muy vistosos, elaborados y que ofrecen una excelente experiencia al jugador; sin embargo, estos pequeños programas y trucos no están mal para distraerse un rato.

miércoles, 10 de septiembre de 2014

Obtener información del hardware en Linux

A la hora de administrar un sistema es importante conocer todos lo relacionado con su entorno y funcionalidad como sus usuarios, servicios que presta, reglas del negocio y componentes. Entre las competencias básicas de un administrador de sistemas debe estar el tener la capacidad de conocer cada uno de los componentes que en conjunto componen el o los sistemas de cómputo que administra.

Linux desde su consola provee múltiples comandos que nos permiten obtener información del hardware instalado así como su estado, a continuación vamos a ver algunos de los comandos más útiles.

Obtener información de la CPU y Memoria

Si necesitamos conocer en detalle la información de la(s) CPU del sistema, solo basta con darle una mirada al archivo /proc/cpuinfo apoyándonos de los comandos cat y more para visualizarlo más cómodamente:

cat /proc/cpuinfo | more

Así podremos visualizar información detallada de nuestra CPU como fabricante, modelo, arquitectura, cantidad de núcleos, entre otros datos. De igual forma, para obtener información de la memoria física del sistema podemos consultar el archivo /proc/meminfo del que obtendremos información detallada de la memoria física usada y libre:

cat /proc/meminfo | more

Con el mando free -m se obtiene de manera más detallada información sobre la memoria libre del sistema, la opción -m muestra las cantidades en MB.

Si en algún momento necesitamos saber que procesos se están consumiendo los recursos de procesamiento y memoria, no está demás utilizar los comandos para administrar procesos de los cuales se ha hablado con anterioridad.

Obtener información de los periféricos

También es posible obtener información de los diferentes periféricos conectados al computador, con el comando lspci podemos obtener información detallada de los dispositivos PCI, y con lsusb de los dispositivos USB. Con la opción -vv se puede obtener la mayor información posible:

Obteniendo información de los periféricos en Linux
Obteniendo información de los periféricos en Linux

Obtener información de los discos duros

Para conocer que discos se encuentran instalados y cuales son sus particiones podemos utilizar el comando fdisk con la opción -l, esta operación requiere permisos de administrador por lo cual podemos recurrir a sudo:

Información de los discos en Linux
Información de los discos en Linux

fdisk también permite manipular las particiones de los discos, para conocer sus opciones solo basta con ejecutarlo con la opción -h.Una vez se conoce los discos duros instalados es posible obtener información más detallada de sus características físicas con el comando hdparm, el cual se debe ejecutar con permisos de root tambien:

hdparm -I /dev/sda

Con el anterior comando obtengo información detallada del disco como fabricante, modelo, cilindros, sectores, entre otros datos.

Información del hardware en general

Finalmente con el comando dmesg podemos conocer los mensajes generados durante la etapa de arranque del sistema, con lo cual podemos conocer que hardware se detectó y cual posiblemente presentó conflictos; con el comando lsdev podemos ver información un poco más detallada del hardware que está instalado en la máquina.

miércoles, 30 de julio de 2014

Sacándole provecho a Google: Como realizar búsquedas más avanzadas

Aunque existen diversos buscadores en internet como Yahoo, Bing, u otros más interesantes como DuckDuckGo por ejemplo; Google es sin duda el líder en su especie gracias a su simplicidad, rapidez y capacidades.

El uso de Google es fácil e intuitivo, pero tal vez muchos ignoran que se pueden ampliar sus capacidades para obtener resultados más precisos en la búsqueda ya sea utilizando su página de búsquedas avanzadas o ya sea con el uso de operadores y comandos que veremos a continuación.

  • "": al incluir los términos de búsqueda entre comillas simples Google buscará las páginas que contengan literalmente dicha frase, por ejemplo al buscar "el arte de la guerra" me arrojará en los resultados únicamente las páginas que literalmente tiene dicha frase.
  • +: el símbolo más nos permite indicarle a Google que incluya términos que por ser muy comunes no son incluidos en las búsquedas. Por ejemplo si deseo buscar el arte de la guerra (sin comillas), el artículo "el" se excluye por ser un término común, por lo cual para indicarle a Google que deseo hacer una búsqueda más precisa incluyéndolo hago la búsqueda +el arte de la guerra.
  • -: el símbolo menos produce el resultado contrario al símbolo más ya que excluye un termino de las búsquedas. Por ejemplo si quisiera buscar vuelos a Medellín baratos pero no quiero ver los resultados de la aerolínea aeroxyz ingreso como términos de búsqueda: vuelos a medellin baratos -aeroxyz.
  • ~: al precder un término con la virgulilla se le indica a Google que busque los sinónimos del mismo, por ejemplo si busco ~compañía x la búsqueda también incluirá resultados de la organización x por ser sinónimos.
  • OR: es el equivalente a una disyunción lógica, es decir, si ingreso dos criterios de búsqueda me arroja resultados si se cumple uno o ambos criterios. Por ejemplo "Vuelos baratos a Medellín" or "Vuelos baratos a Cartagena".
  • AND: es el equivalente a un conjunción lógica, es decir, si ingreso dos criterios de búsqueda me arroja resultados si se cumplen ambos.
  • site: le indica a Google que solo arroje resultados de un sitio o dominio web determinado. Por ejemplo la búsqueda manuales linux site: juanchorua.blogspot.com solo nos mostrarán resultados que contengan las plabras clave manuales linux en el sitio juanchorua.blogspot.com
  • link: le indica a Google buscar las páginas que tengan links al dominio especificado. Por ejemplo link: juanchorua.blogspot.com arrojará como resultados las páginas que tengan links apuntando al dominio juanchorua.blogspot.com.
  • related: le indica a Google que busque sitios que tengan contenido similar a una página indicada. Por ejemplo related: juanchorua.blogspot.com arrojará como resultado páginas con contenido similar a este blog.
  • info: arroja información de una página como por ejemplo como la versión de la página almacenada en caché, páginas similares y páginas que dirijan al sitio. 
  • filetype: le indica a google que busque la informacipon solicitada solo en el tipo de archivos que especifiquemos. Por ejemplo "Hoja de vida Pepito Pérez" filetype: pdf buscará la hoja de vida de Pepito Pérez solo en archivos PDF.

En general estos son los comandos más conocidos y utilizados, sin embargo existen más y mucho más expeficos como por ejemplo para búsquedas de imágenes, noticias, grupos de Google, entre otras opciones que podemos consultar aqui y aqui.

Conclusiones

Google es una inmensa fuente de información que puede ser utilizada con fines buenos o malos, por eso es importante que seamos cocientes del contenido que publicamos en internet porque queriéndolo o sin querer estamos atentando contra nuestra propia privacidad.

Si somos webmasters podemos limitar a los buscadores el acceso a cierta información haciendo uso del archivo robots.txt, que con las reglas adecuadas nos permite mejorar notablemente la seguridad de la información que se alojamos en los sitios web que construimos y administramos.

lunes, 28 de julio de 2014

Validando horas y fechas en Excel usando fórmulas

Supongamos que tenemos una base de datos con varios registros y una de sus columnas contiene un campo compuesto por fecha y hora, como por ejemplo: 27/07/2014  09:39:01 a.m. Ahora supongamos que necesitamos validar si en esa columna se cumplen ciertas condiciones como por ejemplo una determinada fecha y hora, o un determinado mes y día, etc. Lo primero que se podría hacer es aplicar filtros a la columna y con esto obtendríamos los resultados que necesitamos.

¿Pero qué pasa si la base de datos contiene muchos registros? El uso de filtros que de por si es una tarea muy manual podría ser un poco tedioso, ya que si se tienen registros de diferentes fechas la cantidad de opciones a seleccionar y descartar son muchas, y si por algún motivo hay registros con la fecha en otros formatos el uso del filtro se descontrola más. El siguiente ejemplo ilustra una base de datos con tres columnas que contienen el ID del registro, la fecha de registro y el sexo; la base de datos contiene más de 50.000 registros y algunos registros tienen el formato incorrecto:

Ejemplo de Base de datos en Excel
Ejemplo de Base de datos en Excel

Supongamos que necesitamos obtener los registros del día 17 de abril del 2014 sin importar la hora, si lo hacemos de forma manual con filtros la cantidad de clics que se tendría que hacer es un poco extensa. Una solución viable es aplicar una formular que valide el contenido de las celdas de la columna FECHA_REGISTRO y nos diga si cumple o no cumple con la condición (que el registro sea del 17 de abril del 2014).

Pensando de forma algorítmica una solución lo primero que se debe validar es que en el registro el año sea igual a 2014, luego que el mes sea igual a abril y finalmente que el día sea 17; si se cumplen las tres condiciones se debe marcar el registro como CUMPLE, en caso contrario como que NO CUMPLE.

Para lograrlo primero hacemos una conjunción de las tres condiciones usando la función Y() que funcionancomo el operador and de la mayoría de los lenguajes de programación; es decir, retorna verdadero si todas las condiciones que se le pasen como parámetros se cumplen. Para evaluar el día, mes y año utilizamos las funciones que nos provee Excel y que tienen su mismo nombre:

=Y(AÑO(B2)=2014;MES(B2)=4;DIA(B2)=17)

Y finalmente valido si la condición se cumple con la función SI(), que valida si una expresión es verdadera o falsa (para nuestro caso las tres condiciones propuestas) y realiza una acción si se cumple y otra si no; para ello anido las formulas así:

=SI(Y(AÑO(B2)=2014;MES(B2)=4;DIA(B2)=17);"CUMPLE";"NO CUMPLE")

La anterior fórmula la ponemos en una nueva columna y ya solo nos resta hacer un filtro y seleccionar los registros que cumplen o no con la condición que estamos evaluando:


Aplicando filtros en Excel
Aplicando filtros en Excel

Como vemos es posible sacarle mucho provecho a Excel aplicando lógica de programación y haciendo uso de sus formulas, sin necesidad de programar macros que tienen un nivel de complejidad un poco más alto para los no expertos en la materia.

domingo, 27 de julio de 2014

Dos funciones del intérprete de PHP que tal vez no conociamos

Como es sabido PHP es un lenguaje interpretado; es decir, la ejecución de los scripts se hace a través de un intérprete, un programa que va ejecutando línea por línea el código contenido en el archivo .php y devuelve los resultados de cada sentencia o los errores según aplique.

Lo que tal vez muchos no conocen es que además de ejecutar scripts, revisar la sintaxis y semántica de los del código fuente, y en general ejecutar los programas que escribimos; el intérprete de PHP también tiene otras capacidades que son últiles para el programador y que veremos a continuación.

Revisión de la sintaxis del código

Suena un poco obvio pues como se mencionó al comienzo es deber del intérprete revisar las sintaxis y semántica del código fuente, y generar las alertas necesarias al programador cuando se encuentran errores. cuando se ejecuta un script el intérprete antes de ejecutar el código realiza estas validaciones, ¿Pero y si sólo queremos saber si un script no contiene errores se sintaxis sin necesidad de ejecutarlo? Sólo basta con ejecutarlo con el siguiente parámetro:

php -l mi_script.php

Reemplazando mi_script.php por el nombre del archivo que queremos revisar, con el parámetro -l le estamos diciendo al intérprete de PHP que revise la sintaxis del código pero que no lo ejecute. Si todo esta bien nos devolverá un mensaje como éste:

No syntax errors detected in mi_script.php

Pero si hay errores nos lo dirá, por ejemplo:

Parse error: syntax error, unexpected ''l jS \of F Y h:i:s A);
' (T_ENCAPSED_AND_WHITESPACE) in mi_script.php on line 4
Errors parsing mi_script.php

Es importante tener en cuenta que con esta opción PHP solo nos dirá si tenemos errores de sintaxis, no nos dirá si tenemos errores de semántica o de lógica.

Ejecutar un servidor web


Lo habitual al momento de desarrollar una aplicación web es implementar un entorno de desarrollo adecuado en el cual se tengan instalados todos los programas, servicios, entornos de desarrollo, editores, librerías, y demás elementos necesarios para escribir y probar el código creado; como por ejemplo XAMPP.

Sino tenemos el tiempo para implementar un entorno de desarrollo, o si no contamos con los medios o privilegios para hacerlo podemos acudir al propio interprete de php para tener un servidor web ligero pero funcional. Para lograrlo solo basta con ejecutarlo así:

php -S direccion_servidor:puerto -t ruta_aplicacion

El argumento -S debe ir en mayúscula y le indica a PHP que actúe como servidor web, el argumento -t sirve para indicarle a PHP dónde se encuentra el directorio con las aplicaciones.

Por ejemplo en el siguiente ejemplo el servidor será la máquina local y las conexiones se recibirán por el puerto 8080. La ruta de la aplicación es la ubicación donde está alojado el código fuente de la aplicación que para este caso es D:\Scripts\Php. En esa carpeta está el archivo index.php que contiene el siguiente código:
echo "Bienvenido visitante, hoy es ".date('l jS \of F Y h:i:s A');

Para levantar el servidor se debe ejecutar:

php -S 127.0.0.1:8080 -t D:\Scripts\Php

Al acceder por un navegador se visualizará algo así:

Servidor web ligero con PHP
Servidor web ligero con PHP

Y en el servidor se verá la información de los accesos así:

Servidor web ligero con PHP
Servidor web ligero con PHP

Para detener el servidor sólo basta con presionar Control + C.

Conclusiones

Son pocos los desarrolladores que interactúan directamente con el intérprete de PHP ya que la integración con otras tecnologías como Apache o MySQL por ejemplo y el uso de plataformas LAMPP, WAMPP , XAMPP y similares, brindan cierta abstracción que desliga un poco al programador de tener que manipular al intérprete gracias a que proveen interfaces gráficas muy amigables o programas que hacen las veces de asistentes para obtener lo que necesitamos.

PHP y su intérprete propiamente ofrecen una serie de opciones que nos permiten manipular de una forma más detallada como se ejecuta nuestro código y las cuales podemos consultar aquí. Como se ilustra en esta entrada es posible desarrollar aplicaciones en PHP teniendo a la mano el intérprete solamente, sin la necesidad de un editor de código fuente o complejos IDE adicionales.

miércoles, 23 de julio de 2014

Administrar procesos desde la consola de Windows

Hace unos días explicaba en una entrada el funcionamiento de algunos comandos que permitían administrar procesos desde la línea de comandos de Linux, hoy quiero compartir algunos comandos que nos permiten conocer que procesos se están ejecutando en un sistema Windows y algunas opciones aue nos permiten manipularlos.

Los comandos expuestos en esta entrada funcionan en Windows 7, Windows 8, Windows 2012 e incluso en el difunto Windows XP.

Conocer los procesos que se están ejecutando

Para saber que procesos se están ejecutando en el momento sólo basta con ejecutar el comando tasklist que al ejecutarlo sin ningún parámetro adicional nos arrojará una lista como esta:

Ejecutando tasklist en un entorno Windows
Ejecutando tasklist en un entorno Windows

Como se aprecia en la imagen tasklist nos muestra el nombre del proceso, su identificador (PID), información de la sesión y la memoria que está consumiendo. Si deseamos obtener información más detallada solo basta con ejecutar tasklist /v.

También es posible obtener información más especifica como por ejemplo que servicios del sistema están usando a cada proceso solo basta con ejecutar tasklist /svc:

Servicios que ejecutan procesos en Windows
Servicios que ejecutan procesos en Windows

También podemos saber que librerias está usando cada proceso ejecutando tasklist /m, la salida de este comando es extensa por lo cual podemos ejecutarlo combinado con more:


tasklist /m | more


O podemos guardar toda la información en un archivo para leer la información con más comodidad:


tasklist /m > C:\info_procesos.txt


El anterior comando guarda toda la información que generar el comando en el archivo C:\info_procesos.txt.

Para obtener más información de tasklist y de sus parámetros debe ejeuctarse tasklist /? para obtener la ayuda oficial del comando.

Terminar (matar) procesos

Para terminar un proceso solo basta con ejecutar el comando taskkillseguido del PID del proceso que queremos de la siguiente forma:

taskill /PID [PID del proceso]

Por ejemplo si quiero detener el proceso notepad.exe primero identifico su PID con tasklist:

Identificando procesos con tasklist
Identificando procesos con tasklist

Para este ejemplo el PID del proceso notepad.exe es 3044, ahora proceso a detenerlo con taskkill así:

Matando procesos con taskkill
Matando procesos con taskkill


Si por algún motivo no se puede detener el proceso podemos forzarlo agregando el parámetro /F que le indica al comando forzar la detención. De igual forma podemos detener a un proceso y a todos los procesos que este haya iniciado (hijos) con el parámetro /T.

Conclusiones

No hay duda en que el fuerte de Windows es su interfaz gráfica gracias a su usabilidad y fácil aprendizaje, lo cual ha significado un éxito del sistema operativo en el mercado durante años.

Si bien el administrador de tareas que incorpora el propio Windows permite de una manera muy gráfica e intuitiva conocer y detener los procesos que están ejecución, es posible que nos encontremos en entornos dónde la interfaz gráfica no está disponible (como en un servidor por ejemplo) o donde la línea de comandos es la mejor opción; es ahí donde es importante conocer los principales comandos para interactuar con el sistema y administrarlo.


Mejorando las capacidades de nuestro router Wifi con Linux

Si bien muchos ISP ofrecen el servicio de Internet inalámbrico a través de Wifi, somos muchos los que preferimos tener nuestro propio router para tener Internet inalámbrico en nuestros espacios, tener un mayor control de la red, para mayor seguridad o simplemente por no desechar un dispositivo con el que ya contamos.

Los modelos que se venden en el mercado para la línea de hogares cuentas con las características necesarias para prestar un servicio completo y seguro con funciones de firewall, filtrado de contenido, redirección de puertos, entre otras; sin embargo, existen algunos usuarios como yo que nos gusta ir un poco más allá con las cosas y ampliarles su capacidad :)

Para "liberar" nuestro router existen algunos proyectos como DD-WRT u OpenWRT, cuyo objetivo es el desarrollo y mantenimiento de firmware para routers inalámbricos basados en Linux, que cuentan con una amplia variedad de funciones y un alto grado de personalización de la configuración gracias a que son proyectos libres que se distribuyen bajo la misma licencia GPL de Linux. La sigla WRT viene del famoso router Linksys WRTG54G del cual se basan. puesto que su firmware al ser basado en Linux tuvo que ser liberado por el fabricante.


¿Para qué liberar nuestro router inalámbrico?

Aunque ya es claro que los modelos de routers inalambricos que encontramos en el mercado cuentan con las funciones necesarias para tener una red inalámbrica funcional y segura, que cuentan con unos asistentes de configuración muy amigables, y que cubren la mayoría de las necesidades; tener un router "libreado" nos permite:

  1. Ampliar las capacidades de nuestro dispositivo, incluso habilitando  funciones que no vienen por defecto de fabrica.
  2. Configuración y mantenimiento más avanzado del dispositivo, gracias a las bondades que nos ofrece GNU / Linux.
  3. Posibilidad de crear scripts y programas en lenguajes de programación como python o pearl por ejemplo, para facilitar y automatizar tareas de administración y seguridad.
  4. Posibilidad de instalar programas adicionales gracias a los paquetes que ofrecen los propios proyectos.
  5. Tener un control total de nuestro sistema y realizar las tareas que se pueden realizar en un sistema Linux ya que se cuenta con una distribución totalmente funcional.
  6. Tener las mismas ventajas que se tiene con un sistema Linux.

¿Cómo liberar nuestro router inalámbrico?

La tarea de librerar un router no es compleja, solo basta con consultar primero en la página del proyecto (DD-WRT o OpenWRT por ejemplo) si soporta nuestra marca y modelo de router, descargar la versión del firmware que nos recomienden, y actualizar desde la página de administración del router el firmware que viene en un archivo .bin; en caso de tener problemas es posible revertir los cambios ya que estas páginas suelen ofrecer una copia del firmware original del dispositivo.

Es importante especificar en las búsquedas además de la marca y modelo del router la versión del mismo, ya que muchos modelos cuentan con diferentes versiones que varían en algunas características. Esta información la podemos visualizar en los sticker que tiene el router o en la propia página de administración del aparato.


Liberando el router TP-LINK TL-WR841N con OpenWRT

En mi casa cuento un router TP-LINK TL-WR841N versión 8, cuyas prestaciones no son nada despreciables para una red hogareña y el cual actualmente funciona con OpenWRT. A continuación explicaré como instalar OpenWRT en este modelo de router, la tarea en otras marcas y modelos no varia mucho salvo que las páginas de administración de cada router varían en función del fabricante.

¿Por qué OpenWRT? Porque provee una amplia variedad de paquetes para ampliar sus capacidades, una interfaz de usuario amigable y finalmente por un gusto meramente personal.

Paso 1: Descargar el firmware

A través de esta lista podemos comprobar la compatibilidad de OpenWRT con nuestro dispositivo, que para el caso del TL-WR841N Versión 8 está soportado por el proyecto. 

Una vez sepamos que nuestro dispositivo está soportado usamos el buscador de la página y colocando el modelo del router como palabra clave debemos llegar a una página similar a está dónde nos ofrecen una descripción técnico del dispositivo que tenemos y la posibilidad de descargar el firmware adecuada para el dispositivo que tenemos:


Descargando OpenWRT
Desde allí procedemos a descargar el firmware que viene en un archivo binario con extensión .bin, que para el caso del TL-WR841N es la 12.09.

Paso 2: Instalando el firmware

Antes que nada recomiendo que al hacer esta operación el computador desde el que lo estemos haciendo este conectado por cable al router, ya que hay una mayor fiabilidad en la transmisión de la información y en mi caso la red inalámbrica una vez cambie el firmware estaba desactivada.

Nos vamos a la página de administración del router, que se puede acceder a través de la URL http://tplinklogin.net o a través de la dirección http://192.168.0.1 sino hemos cambiado la configuración IP del dispositivo, en caso de haberla cambiado solo basta con reemplazar la anterior IP con la de la puerta de enlace. Una vez accedemos a la página de administración nos pide el usuario y contraseña de administración del router, que  por defecto es admin - admin salvo que lo hayamos cambiado (cosa que debería ser así por cuestiones de seguridad). 

Desde esta página nos vamos al menú izquierdo a la opción System Tools, luego a Firmware Upgrade, desde esta página hacemos clic en el botón Seleccionar archivo y seleccionamos el archivo .bin que descargamos en el paso anterior y por último damos clic en el botón Upgrade:

Página de administración del router TP-LINK TL-WR841N
Página de administración del router TP-LINK TL-WR841N  

Así comenzará el router actualizar su software por OpenWRT, una vez se concluya la operación el dispositivo se reiniciará:

Actualización del firmware del router TP-LINK TL-WR841N
Actualización del firmware del router TP-LINK TL-WR841N

Finalmente una vez se actualice el software del router se perderá la conexión ya que además de haber cambiado el software también cambió la configuración IP del dispositivo.

Paso 3: Configuración básica del router

El paso a seguir es acceder a la página de administración del router que ahora se accede a través de la URL http://192.168.1.1, allí nos pedirá usuario y contraseña:

Página de administración de OpenWRT
Página de administración de OpenWRT

Por defecto el usuario es root y la clave está en blanco, una vez ingresados tendremos acceso a toda la configuración del dispositivo para administras las opciones de red, de seguridad y del propio dispositivo. El paso a seguir es configurar las interfaces de red para lo cual nos vamos a la pestaña Network dónde nos aparecerán dos interfaces WAN y LAN:

Interfaces de red en OpenWRT
Interfaces de red en OpenWRT

Para editar la configuración de una interfaz solo basta con hacer clic en el botón Edit que aparece al frente de cada interfaz y desde allí ingresar la configuración IP como la dirección IP del dispositivo, mascara de subred, boradcast, entre otras.

Desde la opción Wifi que se encuentra en la parte superior podemos revisar que la red inalámbrica esté habilitada y en caso de que no (porque aparece en color rojo) simplemente la habilitamos haciendo clic en la opción Enable:

Red Wifi en OpenWRT
Red Wifi en OpenWRT

Para configurar la red inlámbrica hacemos clic en el botón Edit y desde allí podemos establecer su nombre (ESSID), clave, tipo de seguridad y demás parámetros:

Confguración de red Wifi en OpenWRT
Confguración de red Wifi en OpenWRT

Confguración de red Wifi en OpenWRT
Confguración de red Wifi en OpenWRT

Para guardar todos los cambios se debe hacer clic en el botón Save & Apply. Finalmente un cambio importante es establecer una contraseña para acceder a la administración del router ya que como se mencionó al principio esta por defecto viene en blanco. Para hacerlo debemos ir a la opción System y luego Administration, y allí hacemos el cambio desde la opción Router Password:

Configurando OpenWRT
Configurando OpenWRT

Para conocer las disitintas opciones que ofrece OpenWRT y como se pueden confirgurar podemos recurrir a la documentación oficial en inglés o a la documentación oficial en español. Si en algún momento falló la instalación o queremos regersar al firmware anterior solo basta con seguir estas instrucciones.


Conclusiones

Estas distribuciones de Linux son sin duda una excelente opción para ampliar de las capacidades de nuestros router inalámbricos o simplemente para aprender a administrar sistemas basados en Linux. Proyectos como OpenWRT o DD-WRT proveen un kenel de linux con todos los comandos y utilidades básicos para trabajar en entornos de red y para crear scripts que permiten automatizar tareas de administración.

De igual forma el grado de seguridad puede aumentar considerablemente al implementar estas distribuciones ya que proveen herramientas como iptables (el firewall de linux), VPN, y demás utilidades que permiten asegurar más las comunicaciones para proteger nuestra red y datos.

Gracias a que están basados y distribuidos como software libre, estos proyectos proveen una muy buena documentación que son creadas y mantenidas por comunidades entusiastas de compartir información, lo cual permite a principiantes instruirse de la mejor manera en su uso y mantenimiento.

jueves, 17 de julio de 2014

Administrar procesos desde la consola de Linux

Una de las actividades más habituales al momento de administrar un sistema son las que están relacionadas con la manipulación de los procesos que están corriendo en él, dado que existe la necesidad de ejecutarlos, detenerlos, conocer su estado, entre otras tareas.

No está demás recordar que en los sistemas basados en UNIX como por ejemplo Linux , un proceso es un programa en ejecución que tiene unas caraterísticas como un identificador de proceso conocido como PID, un propietario que corresponde al usuario que lo ejecutó, y otras características mucho más técnicas como un segmento de memoria, una pila de instrucciones, entre otras.

Desde la línea comandos Linux provee una seríe de comandos que nos permiten conocer en todo momento información de los procesos que están ene ejecución y que nos permiten manipularlos, en esta entrada vamos a dar un breve repaso por algunos de ellos.

Conocer los procesos que se están ejecutando

Para saber que procesos se están ejecutando solo basta con ejecutar el comando ps para obtener una lista de los procesos que se están ejecutando con nuestro nombre de usuario, es decir, de los que somos propietarios:

juancho@regulus:~$ ps
PID TTY          TIME CMD
27501 pts/0    00:00:00 bash
27596 pts/0    00:00:00 ps


Para conocer todos los procesos de todos los usuarios solo basta con ejecutar  el comando ps con el argumento -A y si queremos obtener más información debemos usar los parámteros -ef:

El núcleo de Linux maneja los procesos con base a un sistema de herencias, es decir, un proceso puede crear a otros los cuales se conocen como hijos los cuales heredan muchas de sus características. Para obtener una imagen de los procesos que se están ejecutando en forma de árbol dónde se ve la relación de procesos padres e hijos se usa el comando pstree el cuál nos da una salida como esta:

Árbol de procesos en ejecución en un sistema Linux
Árbol de procesos en ejecución en un sistema Linux
Si lo que necesitamos es información de un proceso en concreto podemos recurrir al comando pgrep que nos devuelve el PID siempre y cuando el procesos que se busca esté en ejecución:

juancho@regulus:~$ pgrep bash
27762

Si por el contrario conocemos el PID del proceso entonces debemos ejecutar pgrep -P. Sin un programa se está ejecutando varias veces se generará un proceso por cada instancia del mismo por lo cual es aconsejable ejecutar pgrep -l para que liste todos los procesos que se están ejecutando bajo un mismo nombre:

juancho@regulus:~$ pgrep -l lampp
28103 /opt/lampp/bin/
28128 /opt/lampp/bin/
28525 /opt/lampp/bin/
28526 /opt/lampp/bin/
28527 /opt/lampp/bin/
28528 /opt/lampp/bin/
28529 /opt/lampp/bin/

Además del PID podemos conocer otras características usando los demás parámetros de pgrep, los cuales podemos conocer ejecutando pgrep -h.

Si necesitamos obtener información más detallada de un proceso y de los recursos que utiliza, Linux provee algunos comandos útiles para auditorias y análisis forenses por ejemplo.

El comando pmap nos permite conocer la memoria que está consumiendo y las librerías, archivos y procesos que está utilizando:

juancho@regulus:~$ pgrep bash
28576
juancho@regulus:~$ pmap 28576
28576:   bash
0000000000400000    956K r-x-- bash
00000000006ee000      4K r---- bash
00000000006ef000     36K rw--- bash
00000000006f8000     24K rw---   [ anon ]
00000000013de000   2168K rw---   [ anon ]
00007f8cfe12d000     44K r-x-- libnss_files-2.19.so
00007f8cfe138000   2044K ----- libnss_files-2.19.so
00007f8cfe337000      4K r---- libnss_files-2.19.so
00007f8cfe338000      4K rw--- libnss_files-2.19.so
00007f8cfe339000     44K r-x-- libnss_nis-2.19.so
00007f8cfe344000   2044K ----- libnss_nis-2.19.so
..
..
..

Terminar (matar) procesos

Para detener un proceso (matarlo) se debe utilizar el comando kill acompañado del PID del procesos que se desea detener, es importante tener en cuenta que si no somos propietarios del proceso que se desea matar se debe hacer con permisos de root:

juancho@regulus:~$ pgrep -l proftpd
28106 proftpd
juancho@regulus:~$ sudo kill 28106
[sudo] password for juancho: 
juancho@regulus:~$ 

Si por alguna circunstancia el proceso no se detiene se puede usar la orden kill -9 que fuerza la detención del proceso, el uso de esta orden es recomendable solo en situaciones extrictamente necesaria ya que se puede dejar un Proceso Zombie que puede ocasionar efectos secundarios en el sistema. Si se quiere detener un listado de procesos con el mismo nombre pero con diferente PID se debe usar la orden killall acompañada del nombre común de esos procesos, por ejemplo killall apache2 mata todas las instancias del programa apache2, si se desea que aparezca una confirmación antes de hacerlo se le debe añadir el parámetro -i.

Manipulación de procesos

Si por alguna razón necesitamos que un proceso se ejecute en segundo plano para que nos deje libre el interprete  para seguir ejecutando otros comandos, solo basta con ejecutar el comando que necesitamos correr seguido de un & que envía el proceso a segundo plano, por ejemplo:

juancho@regulus:~$ sudo  nano /boot/grub/grub.cfg&
[6] 29071
juancho@regulus:~$

Si en el ejemplo anterior no se hubiera enviado a segundo plano el programa nano se abriría, con lo cual no podría seguir ingresando comandos en el shell hasta que lo cierre. Al enviarlo a segundo plano como se aprecia en el ejemplo puedo seguir ingresando comando en el intérprete.

Para conocer que programas se están ejecutando en segundo plano solo basta con ejecutar el comando jobs:

juancho@regulus:~$ jobs
[1]   Ejecutando              sudo gedit /etc/network/interfaces &
[2]   Detenido                sudo nano /etc/network/interfaces
[3]   Detenido                sudo nano /etc/network/interfaces
[4]   Detenido                sudo nano /etc/network/interfaces
[5]-  Detenido                sudo nano /etc/network/interfaces
[6]+  Detenido                sudo nano /boot/grub/grub.cfg
juancho@regulus:~$ 

Como se puede apreciar en los ejemplos cada proceso en segundo plano está identificado con un número que se ve entre corchetes, este número se utiliza para manipular cada tarea. Por ejemplo con el comando fg 1 traigo el proceso [1] a primer plano, con el comando bg lo puedo enviar de nuevo a segundo plano.

Conclusiones

Manipular los procesos en ejecución es una de las tareas esenciales de los administradores de sistemas ya que permite realizar auditorias sobre el sistema, mejorar su performance, solucionar problemas y conflictos, o simplemente tener un mayor control sobre el sistema.

Los comandos presentados en esta entrada no son los únicos que nos provee Linux para tales fines pero son los que mínimanente un buen administrador de sistemas debe conocer. Existen comandos un poco más avanzados como nice o renice por ejemplo que permiten manipular parte de los recursos asignados a un proceso, pero como el fin de esta entrada es más introductorio los dejaremos para futuras ocasiones.

jueves, 10 de julio de 2014

Historias de developers [Leído]

Historias de developers es un libro ideado y dirigido por Alberto de Vega Luna, y escrito por empleados de Telefónica I+D. Está compuesto por 26 capítulos y se distribuye bajo la licencia Creative Commons tanto en formato impreso como en diversos formatos digitales (estos últimos de manera gratuita).

Portada libro Historias de developers
Libro: Historias de developers
Como lo describe su autor, el libro reune "experiencias de developers que pueden ser muy útiles para los miembros de este colectivo, pero también para sus jefes, ya que se habla de temas como arquitectura, gestión del código, seguridad, testeo, depuración, motivación, comunicación,? En resumen, muchas de las cosas que querrías saber cómo hacen otros developers. Un libro hecho por developers y para developers."

Como ya lo mencioné en el libro se tratan temas que a nivel general están relacionados con el desarrollo de software y el manejo de equipos desarrollo; y más concretamente se tratan temas relacionados con lenguajes de programación, nuevas tecnologías de desarrollo, programación funcional, seguridad de aplicaciones, metodologías de desarrollo, testeo de aplicaciones, desarrollo de aplicaciones móviles, mantenimiento de código, motivación y comunicación de equipos de trabajo, entre muchos otros temas en sus 26 capitulos.

Personalmente me gustó el libro, porque más allá de ser netamente técnico en él se exponen ideas, conocimientos y experiencias de verdaderos desarrolladores que se enfrentan a los retos del mercado. De igual forma en el libro se abracan temas del momento como el big data, la computación distribuida, desarrollo móvil, metodologías de desarrollo ágiles, entre otros temas que lo hacen más interesante.

Si hacemos parte del mercado del desarrollo del software, si queremos conocer buenas practicas y nuevas tecnologías, o simplemente nos interesa conocer una perspectiva de expertos en el tema, no está de más darle una leída a este buen libro en cualquiera de sus formatos.

Más información del libro aquí | Direcciones para obtener el libro aqui.

jueves, 3 de julio de 2014

Instalar Yii Framework en Windows 7 con XAMPP

Yii es un framework escrito en PHP con el que se pueden construir aplicaciones Web 2.0 basadas en el patrón de diseño de software MVC (Modelo Vista Controlador). Es software libre que se distribuye bajo licencia BSD

Entre sus características se destacan la posibilidad de construir con un código de fácil comprensión aplicaciones livianas para entornos donde se requiere un alto rendimiento con capacidad de manejar alto tráfico. Además, Yii permite una máxima reutilización de código, cuenta con una documentación completa y puede acelerar el proceso de desarrollo. Más información en su sitio oficial.

En este pequeño tutorial se explicará como instalarlo en un entorno Windows corriendo XAMPP.

Requisitos

  • Sistema operativo Windows XP, Vista, 7 o compatibles.
  • Descargar e instalar XAMPP para Windows
  • Descargar Yii Framework, al momento de escribir este artículo se encuentra en la versión 1.1.15

Paso 1: Instalando Yii

La instalación de XAMPP no supone un mayor esfuerzo, solo es necesario descargar el instalador y correrlo, siguiendo los pasos e introduciendo la información que se necesite. 

Una vez descargado Yii lo descomprimimos y la carpeta resultante la copiamos en la carpeta de instalación de XAMPP. Por ejemplo en mi caso yo obtuve la carpeta yii-1.1.15.022a51 y tengo instalado XAMPP en la ruta D:\ServidorWeb:

Directorio de instalación de XAMPP
Directorio de instalación de XAMPP


Por defecto la instalación de XAMPP es en C:\xampp salvo que la hayamos cambiado en el momento de la instalación. Una buena practica de seguridad es no copiar el framework en una carpeta que se encuentre expuesta a la red para evitar posibles vías de ataque.

Paso 2: Preparando el intérprete de PHP

Por defecto el intérprete de PHP está ubicado en C:\xampp\php\php.exe o para mi caso en D:\ServidorWeb\php\php.exe, por lo cual cada que queramos ejecutar un script desde la consola nos debemos ubicar en esa ruta y desde allí llamar el script. Lo anterior puede ser un poco complicado, sin embargo se puede solucionar añadiendo el comando php a las variables de entorno para que sea llamado a través de la línea de comandos desde cualquier ubicación.

Para crear una variable de entorno en Windows 7 solo basta con ir a las propiedades del sistema (Clic derecho en el icono Mi Equipo y luego en Propiedades), luego Configuración Avanzada del Sistema, y por último clic en el botón Variables de entorno:

Configuración Avanzada del sistema en Windows 7
Configuración Avanzada del sistema en Windows 7

En el recuadro que aparece nos ubicamos en la sección Variables del sistema y luego ubicamos la variable path:

Variables del sistema en Windows
Variables del sistema en Windows
Una vez seleccionamos la variable path hacemos clic en el botón Editar y al final del campo de texto agregamos un punto y coma seguida de la ruta donde esta PHP, por ejemplo para mi caso D:\ServidorWeb\php:

Editando variables de entorno en Windows
Editando variables de entorno en Windows

Damos aceptar a todo y con esto ya podemos ejecutar el intérprete de PHP desde cualquier ruta de la línea de comandos.

Paso 3: Creando una aplicación con Yii

Nos ubicamos en el directorio htdocs dónde se publican las páginas web (C:\xampp\htdocs en la instalación por defecto o D:\ServidorWeb\htdocs en mi caso), y creamos una carpeta con el nombre de la aplicación que vayamos a crear, por ejemplo app-prueba:

Creando la carpeta de la app
Creando la carpeta de la app

Ahora nos vamos a la línea de comandos y ejecutamos la consola de Yii para crear una aplicación web, dándole como parámetro la carpeta de destino que fue la que acabamos de crear:

php yiic webapp ../htdocs/ruta-aplicacion

La consola de Yii se encuentra dentro de la carpeta framework, para mi caso el comando sería así:

php D:\ServidorWeb\yii-1.1.15.022a51\framework\yiic.php webapp D:\ServidorWeb\htdocs\app-prueba


Al ejecutarlo nos preguntará que si queremos crear la aplicación en el directorio especificado, a lo cual respondemos Yes:

Creando una aplicación con Yii
Creando una aplicación con Yii


E inmediatamente creará todos los archivos necesarios para que funcione la aplicación, si ingresamos ala carpeta de la aplicación veremos todos los archivos y carpetas de la aplicación web:

Estructura de una aplicación Yii
Estructura de una aplicación Yii

Finalmente verificamos que XAMPP esté corriendo y solo queda acceder a la aplicación para probar tecleando http:\\localhost\app-prueba

Aplicación creada con Yii
Aplicación creada con Yii

Conclusiones y algunos recursos

Una vez ejecutados los pasos 1 y 2, solo resta ejecutar el paso 3 cada vez que se necesite crear una aplicación con Yii y comenzar a programar. 

Algunos recursos que me han servido para aprender a programar con este poderoso framework son la documentación oficial del proyecto en inglés y en español, el libro Web Application Development with Yii and PHP escrito por Jeffrey Winesett, y esta serie de Video tutoriales para aprender a programar con Yii por Gustavo Salgado.



miércoles, 2 de julio de 2014

Configurar direccionamiento IP por la consola de Linux

Configurar el direccionamiento IP en un sistema Linux a través de línea de comandos es una tarea sencilla, que como lo son la mayoría en Linux, se basa en archivos de configuración. A continuación se explica de manera sencilla como lograrlo en un sistema basado en Debian / Ubuntu.

El primer paso es saber que interfaces de red tenemos y que direccionamiento IP tienen, para lo cual usamos el comando ifconfig sin ningún parámetro con lo que obtenemos una salida similar a esta:

Salida del comando ifconfig
Salida del comando ifconfig

En este ejemplo se tienen dos interfaces de red: eth0 que hace referencia a la conexión cableada  y lo que hace referencia al loopback que se usa para conexiones localesy que no se suele configurar (más información de los dispositivos de red en Linux aquí).

Para modificar el direccionamiento se debe editar el contenido del archivo /etc/network/interfaces con algún editor de textos como vim, nano o gedit; por ejemplo en línea de comandos uso nano:

sudo nano /etc/network/interfaces

El contenido del archivo es algo parecido a este:

Editando archivo con nano
Editando archivo con nano

El primer bloque corresponde a la configuración de la interfaz lo, el segundo a la configuración de la red por cable (eth0), y todo lo que va precedido del símbolo # son comentarios.

Ahora analizando en detalle la configuración de la red cableada, la primera línea indica al sistema que levante la interfaz desde el inicio:

auto eth0 

La segunda línea indica que la red cableada está configurada con un direccionamiento IP dinámico, es decir haciendo uso del protocolo DHCP,:

iface eth0

Si se desea cambiar el direccionamiento de dinámico a estático en primer lugar se debe cambiar la palabra dhcp por static para que quede así:

iface eth0 inet static

Y finalmente se deben especificar los parámetros de configuración de la red así:

address 192.168.0.1 # Dirección IP para la interfaz / host
netmask 255.255.255.0 # Máscara de subred
network 192.168.0.0 # Dirección IP de la red
broadcast 192.168.0.255 # Dirección IP de Boradcast en la red
gateway 192.168.0.1 # Puerta de enlace de la red (router)
dns-nameservers 192.168.0.1 # Servidor DNS

Para que de algo similar a esto, a mayor número de interfaces mayor será el contenido del archivo:

Archivo /etc/network/interfaces
Archivo /etc/network/interfaces
Finalmente para que se tomen los cambios primero se debe bajar la interfaz:

ifdown eth0


Luego subirla:

ifup eth0

Y finalmente ejecutamos ifconfig para corroborar que todo haya quedado bien configurado.

Más información del archivo /etc/network/interfaces