Repositorio personal con Git y Dropbox

17 02 2012

Como muchos tengo ideas que se vuelven en proyectos pequeños personales, lo idóneo es tener un repositorio, en la que encarecidamente sugiero Git; en algunas ocaciones se quiere tener el repositorio en lugar no tan accesible para las personas, o bien hacer “Desarrollo en Solo”, por lo que ésta es una de las soluciones:

Obtener una cuenta de Dropbox, para los que no saben que es: una carpeta mágica en tu computadora (Linux, Windows, Mac), donde todo lo que coloques ahí va a estar automaticamente en internet (Nube), con la única limitante del espacio, que al fin y al cabo no es un problema mayor ya que se puede expandir de manera gratis o de pago. Nada mas de descargarlo de http://db.tt/ldy9CHA y crear la cuenta.

Luego tener instalado Git:

  • si se está en Mac éste viene por defecto
  • para windows recomiendo cygwin o bien éste paquete http://code.google.com/p/msysgit/
  • para linux normalmente se instala en el repositorio.

Cuando ya está todo instalado, lo ideal es abrir la consola:

$ cd ~/Dropbox
$ mkdir proyecto.git
$ cd proyecto.git
$ git init --bare

Lo que hace éste comando es crear un repositorio “Bare”: clonar y hacer “push” de cambios sin posiblidad de modificar el repositorio directamente, casí como el repositorio de SVN, normalmente éste proceso va a hacer que el Dropbox comience a sincronizar, para luego hay que clonar (hacer una copia) del repositorio donde se quiera:

$ git clone ~/Drobpox/proyecto.git

Éste crea una carpeta llamada “proyecto” en la cual ya es un repositorio de Git, en la carpeta hay “proyecto.git” hay archivos presentes pero son exclusivos de repositorio y no recomiendo modificarlos; después hay que crear un archivo hacerle commit y subirlo al repositorio de donde hicimos clone:

$ cd proyecto
$ echo "hello world" > archivo.txt
$ git add archivo.txt
$ git commit -m "Importado inicial"

Ya tenemos el primer archivo en el repositorio, pero está local, para subirlo al “servidor” hay que hacerle push, para ello es necesario solo la primera vez se determinar el origen:

$ git push origin master

Ahora cada vez que se quiera hacer un “push” nada mas se ejecuta:

$ git push

Por otro lado si tienes varias máquinas con Dropbox instalado, puedes hacer el clon y trabajar tranquilamente, cuando termines haces un push; si bien quieres obtener los últimos cambios del repositorio central se hace un “pull”:

$ git pull

Con eso tendríamos sólo una pincelada para trabajar con repositorios con Dropbox, yo por mi parte, tengo mi maquina de la casa y la laptop, mis proyectos los tengo en Dropbox y me la paso haciendo commits, pull y push. 🙂





Trac con Bazaar en Ubuntu

18 05 2009

Unas de las cosas que hacen a un buen programador, es el orden que lleve con los proyectos y su documentación, por lo que se me ocurrió intentar utilizar Trac, si me preguntan porque, por mera casualidad estaba buscando un paquete en el repositorio de Ubuntu y me encontré con el paquete de trac-bzr, me llamó la antención y decidí instarlo:

sudo aptitude install trac trac-bzr

luego crear el contenedor de los proyectos, en mi caso yo suelo utilizar mi home, pero se puede utilizar cualquiera:

mkdir ~/Trac
mkdir ~/Trac/proyecto
trac-admin ~/Trac/proyecto initenv

Seleccionamos todas las optiones a gusto a excepción del tipo de repositorio

Repository type [svn]> bzr

Hay que habilitar el plugin de bazaar o va a mostrar un error en la pagina del proyecto acerca de que no puede leer el repositorio, para esto hay que ir al archivo de configuración del proyecto:

vim ~/Trac/proyecto/conf/track.ini

y al final agregarle las lineas

[components]
tracbzr.* = enabled

Con eso ya esta habilitado el plugin, si se quisiera agregar más plugins se hace de la misma manera.

Con eso ya tenemos la instalación básica, ahora es necesario configurar el apache para que nos muestre las paginas de proyectos de trac

sudo apt-get install libapache2-mod-python

ahora es necesario editar el archivo de virtualhost de apache

sudo vim /etc/apache2/sites-available/default

agregamos la seccion debado de algun “location”

<Location /projects> #set up Trac handling
SetHandler mod_python
PythonHandler trac.web.modpython_frontend
PythonOption TracEnvParentDir /home/<tu_usuario>/Trac
PythonOption TracUriRoot /projects
</Location>

Cambiamos los permisos para que apache pueda leer nuestro trac

sudo chown www-data -R ~/Trac

Luego reiniciamos el apache

sudo /etc/init.d/apache2 restart

Seguidamente hay que agregar autenticación al sitio, para la parte del flujo de los ticketes y demás, primero hay que crear un archivo de password para apache

htpasswd -c ~/Trac/.htpasswd admin

Se llenan los password y luego hay que hacer la referencia en el location de apache, quedando de ésta manera

<Location /projects>
SetHandler mod_python
PythonHandler trac.web.modpython_frontend
PythonOption TracEnvParentDir /home/edder/Trac
PythonOption TracUriRoot /projects
#authentication scheme
AuthType Basic
AuthName "Trac Projects"
AuthUserFile /home/<tu_usuario>/Trac/.htpasswd
Require valid-user
</Location>

Reiniciamos apache y ya con eso estamos 😛

Nota: Funciona para Intrepid como para Jaunty.





Una clase php para hacer archivos log

4 05 2009

Actualmente estoy trabajando en un sistema legacy de PHP,  en algunas partes del código quiero saber que hay en las variables, si trato de hacer un var_dump / print_r no sale nunca en pantalla, me dirán “pero existe xdebug”, en efecto existe pero algunas veces si hay mod_rewrite no funciona bien por lo que no sirve de nada.

Para eso me cree una clase pequeña, que permite crear un archivo de log a el cual le agrega la hora y fecha además si es una arreglo lo muestra formateado, a éste archivo de log se le dice el path y el te va a decir si puede crearlo o no, además va a agregar linea tras linea, asi que cuidado de dejarlo habilitado porque despues de más 1.000.000 puede hacerse grande el archivo :P.

El codigo de archivo:

< ?php

	/**
	 * myLogger
	 * @author Edder Rojas Douglas
	 * @version 0.2
	 */

	class myLogger  {

		protected $_path;
		protected $_fileName = 'myLogger.log';

		/**
		 * @param string $path can be a directory o a file path
		 */
		public function __construct($path) {
			if (empty($path)){
				Throw new Exception("Path must be filled");
			}
			if (!file_exists($path)) {
				Throw new Exception("The Path doesn't exists.");
			}
			if (!is_writeable($path)) {
				Throw new Exception("You can write on the give path");
			}
			$this->_path = $this->_parsePath($path);
		}	

		/**
		 * Validate the path the add the filename to the path
		 * @param String $path
		 * @return String
		 */
		protected function _parsePath($path) {
			$strLenght = strlen($path);
        	$lastChar = substr($path, $strLenght - 1, $strLenght);
        	$path = $lastChar != "/" ? $path . "/" : $path;

        	if ( is_dir($path) ) {
        		return $path . $this->_fileName;
        	} else {
        		return $path;
        	}
		}

		/**
		 * Will save the path on the give path
		 * @param String $line
		 */
		protected function _save($line) {
			$fhandle = fopen($this->_path, "a+");
			fwrite($fhandle, $line);
			fclose($fhandle);
		}

		/**
		 * main function to add lines to the logging file
		 * @param String $line
		 */
		public function addLine($line){
			$line = is_array($line) ? print_r($line, true) : $line;
			$line = date("d-m-Y h:i:s") . ": $line\n";
			$this->_save($line);
		}
	}

Su utilización es sencilla:

// cargar la clasesita
require_once('myLogger.php');

$log = new myLogger(dirname(__FILE__) . "/tmp");
$log->addLine(array("testing", "my", 'data'));
// si en éste punto no muestra errores, todo bien =D

Actualización: Hice unas pequeñas modificaciones para mostrar mejor los resultados si lo que se loguea es un objecto.





Como ver los índices en Postgres y MySQL

10 03 2009

Unos de los problemas de rendimiento se deben a las base de datos, un ejemplo sería tratar de traerse datos cuando no hay indices que definan la tabla, eso provocaría que el gestor de base de datos valla registro por registro aplicando las condiciones, y en donde la base de datos en grande podría generar problemas de rendimiento.

Unas de las formas de mejorar el problema de rendiemiento relacionados a las Bases de datos es crear índices, pero en mi caso es ver si una base de datos existente hay indices definidos, por lo que en mysql se podrían ver así:

show create table <tu_tabla>;

Y por otro lado en postgres es:

select * from pg_indexes where tablename = '</tu_tabla>';

Nota: cambiar <tu_tabla> por el nombre de la tabla que se quiere inspeccionar.

Con ése queda el truquito para encontrar cuellos de botellas en las base de datos 🙂





Recomendaciones al crear una Clase en Orientación a Objetos

7 03 2009

Cuando se crea una clase en la programación orientada a objectos, la responsabilidad de ésa nueva clase dería ser descrita en menos de 25 palabras sin usar las palabras “y”, “o”, además de tratar de mantener ésa clase los más simple y enfocada posible en su responsabilidad.

Si alguna vez esa clase contiene más de una resposabilidad, es bueno ir pensando en crear más clases para abarcar esas otras responsabilidades.





Iniciando con Dojo Toolkit

4 12 2008

Dojo toolkit

Dojo Toolkit es una framework javascript para desarrollar aplicaciones ricas en Interfaces de usuarios y funcionalidades, muy a lo Web 2.0.

Mi idea no es hacerle propaganda, más bien es contar mi punto de vista de lo que he visto hasta ahora, ya que no he me adentrado mucho en esta herramienta que a primera vista me encanta, de hecho me encanta Javascript 😀 , bueno, volviendo al punto, he utilizado recientemente Extjs lo cual es otro buen Framework Javascript pero no destaca por su velocidad, si no, por su interface de usuario y todo los widgets que viene por defecto.

Lo primero que me ha llamado la antención es, que solo es una liberia “dojo.js” a la hora de inicializar y las demas llamadas se hacen por medio de dojo.require(“nombre_libreria_dojo”) que realmente es un XHR; esto me gusta a medias, por un lado esta muy bien hecho de tal manera que para el desarrollador es muy sencillo segmentar el codigo y trabajar las dependecias si tener que cargar todo el framework cada vez que se refresque la pagina y por otro lado eso le da carga al servidor por cada request, pero para eso digamos que tiene una solución: creando un paquete comprimido con las dependecias del modulo o pagina que se requiera y así solo hace una llamada.

Otra cosa que me gusto bastante es lo sencillo que es comprender como funciona, lo digo porque cuando trate de aprender a usar Extjs es más complicado seguir los tutoriales y ver el codigo fuente ya que no se usa un patrón determinado y todo está estrechamente relacionado, en el dojo solamente creas tu objeto e interactúas.

La documentación no es muy elaborada como la de Extjs, pero se comprende y trae por lo menos un ejemplo de cada cosa, además que es más facil encontrar como se hacen más cosas específicas por medio de Google que Extjs.

Bueno me regreso a programar que tengo seguir leyendo sobre Dojo 😉





Script que te lee lo que selecciones con el mouse

18 11 2008

Algo que me sucede muy a menudo, es que si hay mucho ruido no puedo concentrarme, tengo grandes problemas para mantener la concentración, más aún si estoy leyendo, ésto se hace un gran problema cuando tengo que leer documentación o manuales, una solución que me ayuda bastante es leerlo en voz alta, el cual no se puede en un entorno de trabajo compartido, porque molestarías a los compañeros, otra solución usando sintetizadores de voces para que te lean por ti, por lo que me di la tarea de hacer una pequeña investigación al respecto, y me encontré que espeak está instalado por defecto, lo cual hace mucho más facil el desarrollo del script, en ésta pagina hay buena información al respecto.

Linux por defecto tiene dos clipboard (cuando copias se almacena ahi), uno es cuando le das copiar o cortar y otro es cuando con el mouse seleccionas un texto, éste ultimo se pega cuando das click en el botón central de mouse. Para obtener el clipboard de seleccion del mouse y tener acceso de esa información desde la consola (o script) se necesita una utilidad que está en los repositorios de Ubuntu:

sudo aptitude install xclip

y con esa utilidad tenemos el texto seleccionado que nos va alimentar a espeak, para que nos hable; el siguiente script solo habla en inglés, pero se puede modificar para hable español (lo dejo de tarea para después 😛 ), ademas si se vuelve a llamar a el script se va a detener de seguir hablando:

#!/bin/bash
VOICE=`pgrep espeak`
if [ $VOICE ]; then
        killall espeak
        exit
else
        xclip -selection primary -out | espeak
        exit
fi