Category Archives: Código

Repositorio GIT con deploy automático

GIT Logo
Bueno, volvamos a lo técnico en el blog.
En ciertas ocasiones es conveniente mantener los archivos generados en una carpeta diferente a la de nuestro repositorio GIT, el caso más común para este patrón es dentro de un servidor web donde www-data es propietario de la carpeta mientras que en el repositorio GIT los permisos son aplicados para un grupo o usuarios diferentes.

Sitioweb: /var/www/sitioweb
Repositorio: /opt/repositorios/sitioweb.git

Servidor

Comenzamos creando el repositorio tipo bare para que contenga sólo el árbol de actualizaciones y no cree un subdirectorio .git, después haremos ciertos ajustes para poder realizar actualizaciones sin tener que hacer merge hacia el canal principal.

mkdir -p /var/www/sitioweb
mkdir -p /opt/repositorios/sitioweb.git
cd !$
git init --bare
git config core.worktree /var/www/sitioweb/.
git config core.bare false
git config receive.denycurrentbranch ignore

Ahora añadiremos una instrucción al script post-receive

Archivo: hooks/post-receive
#!/bin/sh
git checkout -f

Obviamente tenemos que darle permisos de ejecución

chmod +x hooks/post-receive

Local

En el equipo local sólo es necesario añadir el repositorio recién creado como destino y podemos añadir los archivos inmediatamente

git remote add webserv ssh://usuario@servidor/opt/repositorios/sitioweb.git
git push webserv master

Listo

Distorsión en audio mp3 con flash

Hace un mes aproximadamente noté una distorsión terrible al ejecutar archivos mp3 con un cliente flash en la web, obviamente que lo asocié con el plugin para el navegador y probé forzando una versión anterior a la inestable, como no funcionó probé con las librerías de audio e incluso con pulse mismo. Lamentablemente no había podido encontrar el origen del problema hasta que hace unos días volví a buscar en Google harto de no poder sintonizar Grooveshark al estar compilando en Gentoo >.<

El problema se encuentra en una actualización de glibc, o libc6 en Debian, y sólo para 64 bits, que se origina en un cambio en la implementación de memcpy y que expone un bug en el plugin entregado por Adobe. La solución vino de las manos del mismo Torvalds y consiste en crear una librería que devuelva el funcionamiento original de memcpy.

Continue reading

Puppet (Segunda parte: Manifiesto y Módulos)

Antes de completar el ejercicio vamos a definir dos conceptos principales en Puppet: los módulos y manifiestos.

Manifiesto: Puppet es  un sistema declarativo, en donde las operaciones son aplicadas y no ejecutadas, estas operaciones son definidas en lenguage puppet dentro de archivos de texto denominados manifiestos. Por cada servidor puppet existe un manifiesto central, definido en /etc/puppet/manifests/site.pp, donde se configuran todos los sitios (clientes), mediante un nodo para cada uno de ellos.

Módulo: Un módulo es una colección de recursos, clases, archivos, definiciones y plantillas fácilmente redistribuible usado para configurar Dnsmasq o Apache o un sitio de reportes o una aplicación en Python determinada.

Cada uno de estos se escribe en lenguaje Puppet, un lenguaje declarativo bastante sencillo basado en Ruby en el cuál podemos definir toda la implementación para nuestros clientes. Les recomiendo ampliamente que se den una vuelta por la documentación oficial sobre este lenguaje.

Vamos a definir nuestro módulo para Dnsmasq, que incluirá como recursos al paquete, el archivo dnsmasq.conf y el servicio dnsmasq.

Continue reading

Puppet (Primera parte: Instalación)

Uno de los proyectos encargados en mi nuevo empleo consiste en la administración y mantenimiento de clústers para simulaciones de ingeniería, cada uno de los componentes del clúster mantiene comunicación con un servidor que aloja las licencias de los paquetes utilizados, así como los detalles de las cuentas de usuarios. Por supuesto que administrar a todos los equipos individualmente es una tarea exhaustiva y propensa a errores, independientemente de los instrumentos de decidamos utilizar o crear, así que como primer paso me encargaron buscar una herramienta que permitiera mantener a los servidores sin necesidad de realizar la misma tarea repetitivamente, por ejemplo: tener que modificar la dirección IP del servidor de autenticación en PAM o instalar un nuevo paquete en todos los equipos.

Para mi fortuna existe Puppet, un software que debería ser la punta de lanza de los administradores y arquitectos de servidores. Éste nos permite manejar varios equipos desde un nodo central mediante definiciones de módulos en archivos de configuración, que pueden ser paquetes, archivos, servicios, etc, independientemente de la distribución. Obviamente, homogenizar la distribución a utilizar es preferible para mantener las mismas versiones y evitar errores en implementaciones de las ramas.

En esta serie vamos a utilizar Puppet para configurar Dnsmasq actuando como servidor DNS y DHCP detrás de diferentes redes, como un ejercicio para adentrarnos en el uso de esta herramienta, utilizando Debian tanto para el cliente como el servidor.

En esta primera parte instalaremos y configuraremos clientes y servidor.

Continue reading

Python, el lenguaje de programación del 2010

El índice comunitario de Programación TIOBE (qué mal me sale esto de traducir) ha otorgado el premio a Python como mejor lenguage de Programación en el 2010 mostrando el mayor índice de crecimiento el mercado durante ese año: 1.81% situándose justo por encima de Objective C (1.63%). El informe señala que esto es debido al aumento en el uso de Python como relevo de Perl para realizar tareas administrativas en diferentes Sistemas Operativos, así como la mayor penetración como lenguaje de programación para la web en combinación con frameworks como Django.

En estos momentos el índice general se encuentra de la siguiente manera

Índice publicado por TIOBE

Lo bueno también es que Visual Basic va perdiendo terreno 😉

Nota original

Cambia el tamaño de la terminal con un script en Python

Hace un rato publicamos un pequeño tutorial para cambiar el tamaño de la ventana de la terminal de Gnome. Pues debido a que siempre ando probando distintas distribuciones en una partición de 8 Gb especialmente para eso, y también a que soy demasiado flojo, decidí hacer un pequeño script en Python para evitarme estar editando el archivo con cada instalación:


#!/usr/bin/env python
#Copyleft Raymundo Vásquez Ruiz
import re, fileinput

def change_settings(col, lin):
	line_pattern = ':co#(d*):it#(d*):li#(d*).*'
	try:
		for line in fileinput.FileInput("/usr/share/vte/termcap/xterm", inplace=1):
			match = re.search(line_pattern,line)
			if match:
				match_groups = match.groups()
				if len(match_groups) == 3:
					columns = match_groups[0]
					it = match_groups[1]
					lines = match_groups[2]
					line = line.replace(line, "t:co#%s:it#%s:li#%s:\n" % (col, it, lin))
			print line,
	except OSError, e:
		if e.errno == 13 :
			print "You dont have permission to do this!"
		else:
			print e.message

if __name__ == "__main__":
	from optparse import OptionParser
	parser = OptionParser()
	parser.add_option("-c", dest="columns", default=80)
	parser.add_option("-l", dest="lines", default=24)
	(options, args) = parser.parse_args()
	change_settings(options.columns, options.lines)

Copien el archivo y asignen un nombre, el que deseen, sólo asegúrense de que tiene la extensión .py.

Una vez guardado procedemos a ejecutarlo de la siguiente manera:

sudo python termset.py -c 130 -l 80

Donde
termset.py debe ser sustituído por el nombre que le asignaron.

-c indica el número de columnas.

-l indica el número de líneas

Agradecería las sugerencias, aún no me las sé todas en Python =)

Esquema de resaltado de sintaxis en Monodevelop

Edición del tema

Edición del tema

A veces con simplemente cambiar el esquema de colores de nuestro IDE como que le vuelven las ganas a uno de seguir revisando ese Segmentation Fault en nuestro código. Últimamente me la paso todo el rato en Monodevelop, tanto para C# como para Boo, y aunque trae ya sus propios temas integrados, personalmente no me parecen agradables.

Personalmente soy fan de los fondos oscuros y los colores contrastantes, sin llegar a lastimar la vista claro, y con base en esto he creado mi propio esquema de colores que se puede ver en acción en las siguientes pantallas

Continue reading

¡FELIZ 12:34:56 7/8/9!

Este viernes 7 de Agosto del 2009 a las 12:34:56 (hora de Cd. de México) ocurriá uno de esos sucesos curiosos que solamente ocurren una vez cada siglo.

En ese momento alguna estrella en alguna galaxia lejana se alinea con algún otro planeta en alguna otra galaxia, pero eso no importa, por que acá sucederá la simpática hora con fecha:

12:34:56 7/8/9

Por supuesto, también esta el año 90, que daría un número como 12:34:56 7/8/90 (o 1234567890), las  teclas numéricas en un teclado. Ahora lo que importa es que se nos pasó el año 1990 y el 2090 está muy lejos, asi que vamos a esperar a ver como sucede la hora del año 2009 y para eso podemos hacer un contador simple en Java (o lenguaje de tu preferencia), para hacerle un “Print Screen” y presumírselo a tus nietos mientras llega el 2090. A continuación el código…

Continue reading