Skip to content


tuvozlegal.es mi primer proyecto público con web2py

Llevo años programando aplicaciones web con interfaces bastante complejos de tipo gestión empresarial y para gestión de sistemas, siempre en las intranet de las empresas que me han contratado. He desarrollado en PHP y frameworks como Ruby on Rails, Web2Py y Django, pero esta es la primera web que hago con Web2py y que coloco en abierto en internet. Por supuesto sí que he entregado muchas webs basados en Joomla, Drupal (casi me pego un tiro), WordPress, TikiWiki, OpenCart, Magento (casi me pego otro tiro) y también con Web2py pero privada (protegida con login/pass sólo para la empresa) pero hasta el momento nunca había escrito mi propio código Web2py para una aplicación en Internet pública. Está desarrollada además con jQuery y TwitterBootstrap; le podéis echar un vistazo en www.tuvozlegal.es. En realidad ya está publicada y en producción, pero sólo es la primera iteración del proyecto. Falta una segunda que se publicará aproximadamente en un mes y medio.

¿Y por qué he usado web2py os estaréis preguntando y no otros frameworks de desarrollo infinitamente más populares, como Django y Ruby on Rails? Principalmente por el DAL y los HELPERS de Web2py. El DAL es una capa de abstracción para la programación de bases de datos relacionales, no relacionales, basadas en documento y de diccionario y hasta el protocolo IMAP. La lista completa es esta:

  • database drivers (source)
  • SQLite sqlite3 or pysqlite2 or zxJDBC [zxjdbc] (on Jython)
  • PostgreSQL psycopg2 [psycopg2] or pg8000 [pg8000] or zxJDBC [zxjdbc] (on Jython)
  • MySQL pymysql [pymysql] or MySQLdb [mysqldb]
  • Oracle cx_Oracle [cxoracle]
  • MSSQL pyodbc [pyodbc]
  • FireBird kinterbasdb [kinterbasdb] or fdb or pyodbc
  • DB2 pyodbc [pyodbc]
  • Informix informixdb [informixdb]
  • Ingres ingresdbi [ingresdbi]
  • Cubrid cubriddb [cubridb] [cubridb]
  • Sybase Sybase [Sybase]
  • Teradata pyodbc [Teradata]
  • SAPDB sapdb [SAPDB]
  • MongoDB pymongo [pymongo]
  • IMAP imaplib [IMAP]
  • DJango y Ruby on Rails utilizan algo parecido denominado ORM. El ORM es un poco diferente, te abstrae del lenguaje de la base de datos pero no a nivel de mapeo de las sentencias del lenguaje, sino que trata como objetos los datos de la base de datos. Esta idea es muy buena, porque te permite generar un código muy orientado a objetos y por lo tanto muy limpio y elegante, pero tiene la desventaja que cuando hay que hacer operaciones sobre grandes volúmenes de datos, se vuelve muy ineficiente, teniendo que bajar al nivel del lenguaje de la base de datos concreta. DAL en cambio es muy eficiente porque mapea/traduce su lenguaje al propio de la base de datos en cuestión. Se podría decir que ORM es una capa que da acceso a su propio DAL y este traduce a la base de datos, como si ORM fuese otra capa encima de DAL; no es exacto pero “gráficamente” lo ilustra bastante bien.

    El otro motivo son los HELPERS. No es ya por velocidad de desarrollo, la potencia, la limpieza que te permite trabajar con formularios, tags html y todo tipo de inputs, sino la integración que tienen los HELPERS con el framework en cualquier parte del código de la aplicación, desde el modelo, al controlador o la vista y por supuesto el nivel de seguridad que te aporta para la interfaz de usuario que da al saber que cumple con los problemas de seguridad listados en OWASP. En Django y Ruby on Rails he probado muchos tipos de herramientas para la vista, erb, haml, etc, pero no he encontrado la agilidad y potencia que con los HELPERS de web2py

    Y por último hay algo que hace a Web2py imbatible: la retrocompatibilidad hacia atrás

    la primera aplicación que escribí con web2py (nada serio) fue en 2008. Ese mismo código lo puedes coger y calzar en la última versión de web2py y funciona 100%. En Rails por ejemplo esto es ciencia ficción. En definitiva, este framework es muy ligero, de rápido desarrollo, muy potente y altamente escalable. Evidentemente los otros frameworks también aportan ventajas superiores a web2py, por lo pronto sus comunidades son infinitamente más amplias. En cualquier caso es imposible saber cual es le mejor framework y como en todas las disputas informáticas de cual es la mejor tecnologia, nunca hay una respuesta clara, así que podríamos decir que en ocasiones es subjetivo y en ocasiones es según el tipo de proyecto y con el equipo de gente y tecnologías que tengas que integrar el proyecto. En este momento y en este contexto el que más me encaja y con el que más cómo me siento es con web2py :-)

    Y ahora en secreto, todo este rollo me lo he marcado para que google indexe un poco mejor a www.tuvozlegal.es ;-P

Posted in Opinión.


Disco SSD en servidor

Tengo que montar un nuevo servidor. Como no necesito grandes cantidades de storage, me he decidido por un “disco” SSD. Se suponen que son muy rápidos, así que espero se note el rendimiento. Por lo pronto he hecho unos mini benchmark de lectura/escritura comparándolo con un SATA3 de 7k revoluciones.

Resultados SSD

Lectura

root@ns354000:~# hdparm -Tt /dev/md2

/dev/md2:

Timing cached reads: 27268 MB in 2.00 seconds = 13648.40 MB/sec
Timing buffered disk reads: 792 MB in 3.01 seconds = 263.35 MB/sec

Escritura

root@ns354000:~# dd if=/dev/zero of=/tmp/output2 bs=8k count=10k; rm -f /tmp/output2
10240+0 records in
10240+0 records out
83886080 bytes (84 MB) copied, 0.0398274 s, 2.1 GB/s

Resultados SATA3 7K rpm

Lectura

root@odysseus:/home/freemem# hdparm -Tt /dev/sda

/dev/sda:
Timing cached reads: 20206 MB in 2.00 seconds = 10111.98 MB/sec
Timing buffered disk reads: 462 MB in 3.00 seconds = 153.88 MB/sec

Escritura

root@odysseus:/home/freemem# dd if=/dev/zero of=/tmp/output bs=8k count=10k; rm -f /tmp/output
10240+0 records in
10240+0 records out
83886080 bytes (84 MB) copied, 0,0496915 s, 1,7 GB/s

No voy a sacar conclusiones hasta que no haga comparativas de rendimiento con aplicaciones instaladas. Al menos ya me he quitado la curiosidad. Por lo pronto, parece que el aumento es considerable.

 

 

 

Posted in Opinión.


Gestión Experta CRM en GitHub

Ayer por la noche generé mi primer proyecto en gitHub:

https://github.com/FreeMEM/gestionexpertacrm

Este proyecto pretender matar dos pájaros de un tiro:

    • Que un amigo se ponga las pilas con la programación, la programación web con el framework web2py, python y la ingeniería de software.
    • Tener un CRM para mi empresa en http://www.gestionexperta.com. Los objetivos de la aplicación serán:
      • Controlar los contratos de servicios de los clientes. Fecha de inicio y fin.
      • Una herramienta de helpdesk mediante tickets
      • Herramienta para hacer presupuestos
      • Herramienta para facturar
      • Herramienta para hacer newsletter masivos a suscritos

La licencia libre que tendrá todavía no la he decidido, aunque por ahora tiene una GPL V.3.

¿Y por qué no uso CRMs de proyectos ya creados? ahorraría costos. Bueno, eso es lo primero que piensas, sin embargo en mi entorno empresarial esto no ocurre así.
Instalar, configurar y entender cómo funciona un CRM, no es algo rápido. Tengo que adaptarme a sus excesos y limitaciones y por lo tanto, tengo que adaptar mi empresa tal como los desarrolladores del CRM en cuestión han imaginado. Luego vienen los problemas de integración con otras herramientas, como pueden ser herramientas de helpdesk, emailings, marketing, facturación, contabilidad, etc. Mi entorno empresarial gira alrededor de tecnologías escritas en python con el framework web2py. Este entorno de programación incluye un poderoso y versátil sistema de gestión de usarios que me permite integrar todos los desarrollos que voy haciendo en un único gran paradigma. Es decir, que puedo compartir datos e información con una facilidad pasmosa entre aplicaciones. Pero lo mejor es su sistema de formularios. Para herramientas internas, que no necesiten un acabado visual exquisito, me permite crear aplicaciones de gestión a muy alta velocidad. Es casi como programar en Clipper en cuanto términos de productividad. En una mañana puedo terminarme el módulo de helpdesk y en otra el de los contratos. En una semana puedo tener terminados los objetivos marcados.

Ahora necesito encontrar un hueco para implementarlo. El código que hay ahora mismo (que no hace casi nada) lo escribí en 20 minutos mientras le explicaba, para poner en raíles al  amigo  que está enganchándose a la programación. Digamos que lo creamos sólo para que pudiese aprender con un “proyecto” real. Después de eso, pensé que quizá había sentado las bases para crear mi primera aplicación de software libre. Vamos a ver qué tal evoluciona.

Posted in programación.


Condiciones de una sola línea en ruby y en python

Para hacer condiciones de una sóla línea, se pueden usar en ruby y python estructuras de este tipo

Ruby:

1
resultado = condicion ? si_verdadero : si_falso

Python:

1
resultado = (si_falso,si_verdadero)[condicion]

De este modo podríamos sustituir todas estas líneas

1
2
3
4
5
6
7
if True:

   n=0

else:

   n=1

 

luego pongo un ejemplo.

Posted in programación.


Árboles creciendo

La imágen que os dejo es una comparativa de los árboles que hay frente a mi casa, entre el año 2005 y 2012. Es impresionante cómo crecen. ¿Uhmmmmm y si monto un stopmotion y espero otros pocos años?  Click en la imágen para verla completa.

Posted in Opinión.


Un sueño hecho realidad

Hace unos años tuve la oportunidad de practicar “puenting”. Desde aquel momento se me atravesó una idea: quería saltar en paracaídas desde un avión. Acabo de cumplir 40 y María del Mar, mi santa esposa, tras el machaque de años contándole mi sueño, me sorprendió con un regalazo, ¡y qué regalazo! Evidentemente lo he grabado en vídeo, eso sí, a 200Km/h y 4600m de altura.  Aquí os lo dejo para que conste en acta ;-P.

Posted in Opinión.


Problemas con Acer Aspire One D250, Ubuntu Lucid Remix y grub

Hace unos días me prestaron un Acer Aspire One D250, muy mono por cierto, al que le instalé desde un pendrive (¿quien carajo quiere ya los CD/DVDs?) la Ubuntu 10.04 Remix para NetBooks. La verdad es que probé cuatro distribuciones, la Ubuntu Lucid desktop, Jolicloud (que no me gustó nada), Meego (simplemente no me funcionó) y la Lucid para netbooks, que es la que tiene ahora. Toda la instalación fue muy transparente, rápida y sencilla, hasta que decidí reiniciar. Simplemente, no arrancó. Hice mil pruebas y nada. Estaba claro, algo pasaba con el grub. Googleé un poco y encontré gente con el mismo problema pero sin solución. Al final, rejunté toda la información para darle arreglo y este es el resultado:

Lo primero es arrancar con el pendrive en modo live y acceder a un terminal. La idea es cambiar un parámetro del grub:

GRUB_CMDLINE_LINUX_DEFAULT="quiet splash hpet=force nolapic"

pero antes hay que acceder a la partición del disco donde está y activar los cambios con update-grub. Para ello, en el terminal teclear todo esta lista de comandos

sudo fdisk -l
sudo mount /dev/sda1 /mnt
sudo mount --bind /dev /mnt/dev
sudo mount --bind /proc /mnt/proc
sudo mount --bind /sys /mnt/sys
sudo mount --bind /dev/pts /mnt/dev/pts
sudo chroot /mnt
sudo grub-mkconfig -o /boot/grub/grub.cfg
sudo grub-install /dev/sda

Si falla esto último comando, reinténtalo de esta forma

sudo grub-install --recheck /dev/sda

Ahora sí, vamos a modificar la confi del grub

gksudo gedit /etc/default/grub

Y añade esto a la línea GRUB_CMDLINE_LINUX_DEFAULT

GRUB_CMDLINE_LINUX_DEFAULT=”quiet splash hpet=force nolapic”

salva y

sudo update-grub

y ya acabando

exit
sudo umount /mnt/dev
sudo umount /mnt/proc
sudo umount /mnt/sys
sudo umount /mnt

Ahora arranca de nuevo y ya debería funcionar. Espero os sirva.

Posted in Opinión.


Python y PHP: contructores múltiples

Mae mía, ni en python 2.6.x ni en php 5.x se pueden escribir clases con contructores multiples, como se hace con toda normalidad en C# por ejemplo. Hace tiempo pensé un par de trucos parecidos para cuando estoy con lenguajes con esta particularidad y que me gustaría compartir, pero vamos que hay mil formas de hacerlo.

Python:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Clase():
    _id=None

    def __init__(self,*args):
        if len(args) != 1:
            if isinstance(args[0], str):
                self.__constructor_uno (int(args[0]))
        else:
            self.__constructor_dos()

    def __constructor_uno(self, id):
        self._id=id

    def __constructor_dos(self):
        self._id=0

PHP:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
class Clase {

    private $id;

    function __construct() {
        $args = func_get_args();
        $nargs = func_num_args();
        switch($nargs) {
        case 1:
            self::__constructor_uno($args[0]);
            break;
        case 2:
            self::__constructor_dos();
            break;
        }
    }

    function __constructor_uno($get) {
        $id=$get;
    }

    function __constructor_dos() {
        $id=0;
    }
}

Posted in programación.

Tagged with , , , .


Bitácora sobre NetSurvibox y sus nuevos modelos

Para todo aquellos que trabajen con los legendarios routers/firewall de IronGate, NetSurvibox266, deciros que hay una bitácora nueva sobre esta familia de dispositivos, igseguridadyredes.com. Y digo familia porque recientemente la han ampliado con dos modelos nuevos, el NetSurvibox 400 y el 667. He tenido la suerte de probarlos y son una maravilla, de hecho tengo un 400 en el salón ;-)

El 667 es el hermano mayor del NSB400. Ofrece las mismas características, pero su procesador funciona a 667 Mhz, y  tiene 256MB de RAM, aumentando el rendimiento y las prestaciones (más túneles VPN).

Se trata de un router ideado para la seguridad en la red de las PYMES, actuando como firewall, antivirus  (POP3) y filtrador de contenidos web. Ofrece una interfaz muy sencilla (similar a la del NSB266) basada  en objetos con la que podrás activar/desactivar dichos servicios de la forma más cómoda y rápida posible.

Dispone de 5 puertos de RJ-45 (4 de LAN en switch y 1 de WAN), y permite la posibilidad de añadirle (se vende por separado)  un módulo de ADSL2+ y una tarjeta minipci para conexiones Wireless (se vende por separado), compatible con los estándares de red inalámbricos 802.11 b/g/n, con la que pueden crearse dos redes inalámbricas distintas (por ejemplo, una de hogar y otra de trabajo), lo que supone una plataforma ideal para teletrabajo.

Con este dispositivo se pueden configurar hasta 40 VPNs, estáticas y/o dinámicas.

Dispone de brazos para montarlo en un armario de telecomunicaciones (rack) y ocupa 1,5 U (6cms) de altura.

Su músculo es de un Intel ARM IXP435 a 667Mhz con 256Mb de RAM y 4+1 conectores ethernet RJ45 en switch. El mío viene montado además con un router ADSL2+ y una CompactFlash.

Posted in Administración de sistemas.

Tagged with , , .


web2py’s examples: helpers, validators y expresiones regulares

No me voy a explicar demasiado. Sólo un ejemplo de vista de formulario con web2py en el que interviene un input html, que limito con expresión regular palabras de entre  3 y 15 letras alfanuméricos, incluyendo “ñ”s, tildes y algo más, con una longitud máxima de 128 caracteres y 10 palabras. Incluye además un mensaje de error traducible. Ese mensaje de error luego se puede capturar con jquery y mostrarse cómodamente en un bonito efecto. Todo en una única línea, mu cómodo oiga.

1
INPUT (_value='', _name='tags', _id='tags', requires=(IS_NOT_EMPTY(error_message = T('Tags are required')), IS_MATCH('^([\wáéíóúÁÉÍÓÚñÑçÇàèìòùÀÈÌÒÙâêôûÂÊÎÔÛ]{3,15}\ ?){1,10}, error_message=T('only allowed words of third to fifteen characters')), IS_LENGTH(128)))

Posted in programación.

Tagged with , , .


Python’s examples: quitar palabras repetidas de una cadena

Si algo me gustaba de php era lo sencillo que resultaba tirar código a toda velocidad y sin pensar. Desde el verano pasado me he aficionado a python por lo mismo y  sobre todo por la facilidades que tiene para trabajar con él en cualquier entorno operativo, ya sea de escritorio, consola o web. Muestra de ello, os dejo un ejemplo de cómo en una sola línea se pueden quitar las palabras repetidas de una cadena de texto:



1
2
3
4
>>> import string
>>> cadena=”hola esto es una lista lista de de cadenas hola repetidas”
>>> print string.join(set(string.split(cadena,’ ‘)),’ ‘)
esto repetidas de una hola cadenas lista es

Posted in programación.


Chiste malo de Linux

En qué se parecen los juegos de Linux a la “Inteligencia Militar”. En que ni los militares tienen inteligencia, ni Linux juegos.

Posted in Opinión.


Iconizar Evolution

Llevo años usando el Evolution de Gnome y años quejándome de que no se puede iconificar en el trayicon. Hace unas semanas un amigo me enseñó un programa que viene a solucionar este problema. Me entusiasmé mucho con este programa pero hasta que no lo probase durante un buen tiempo, no quería decir nada en el blog. Se llama Alltray y logra iconizar cualquier programa que sea lanzado con esta herramienta. Para instalarlo en Ubuntu/Debian, invocamos a apt:

apt-get install alltray

Una vez instalado es muy fácil de usar. Para el ejemplo de Evolution, desde consola se puede lanzar

alltray "evolution --component=mail"

et voilà

Alltray

Ya sólo hay que situarse con el puntero del ratón encima del icono del sobre y botón derecho e izquierdo para probar sus funciones

Posted in Opinión.


Logo, mucho más de lo que parece

Evidentemente, el conocimiento estándar que se le aporta a nuestros hijos en la escuela pública es más que suficiente, pero es inevitable pensar en complementarlo con algún extra que le aporte alguna ventaja en su futura autosufiencia. Hay quien refuerza este aprendizaje con clases de apoyo escolar, de inglés, informática, música o  deportes. Todas estas disciplinas aportan sus propios patrones cognitivos que configuran su personalidad adulta, aunque nada como los tres primeros años de vida. Hace poco, he ido a fijarme en una que quisiera investigar con más detenimiento y aunque es demasiado  pronto para decidir, el tiempo vuela.

Hará un par de años un familiar  me habló de Kumon,  una empresa que “vende” un  método de aprendizaje que así se describe en su web:

“Kumon es una actividad extraescolar diseñada para desarrollar al máximo el potencial de cada niño a través de las matemáticas. Gracias a nuestro programa individualizado nuestros alumnos desarrollan confianza, concentración, responsabilidad y hábito de estudio que los acompañan durante toda la vida.”

Del mensaje me caló que las habilidades adquiridas le acompañarían toda la vida y ese es al fin y al cabo el objetivo, habilidades que le permitan desarrollarse con soltura. Aunque una disciplina matemática es dura, los críos motivados son esponjas, pero no estoy seguro que sea esto lo que busco para Eva. De rebote, he encontrado una alternativa parecida que me convence algo más,  aunque tampoco creo que sea la panacea. Se llama Logo, un lenguaje de programación derivado de LISP (un lenguaje de programación para inteligencia artificial) usado para aprender mediante el juego y la experimentación y que busca ofrecerles las ventajas de ser capaces de desarrollar estrategias basadas en pequeñas metas y objetivos que en su conjunto,  sirvan para resolver problemas complicados  de la vida y les permita desarrollarse con seguridad en cualquier tipo de disciplina, ya sea artística, científica, humanística o empresarial.

Había oído hablar de este lenguaje cuando era niño, pero nunca tuve la oportunidad de usarlo; los ordenadores no estaban al alcance de los mortales y cuando tuve ordenador, no conseguí hacerme con este programa (internet no existía), aunque si he de ser sincero, no estaba demasiado interesado por lo que creía ser un método de iniciación a la programación  para niños y yo, por aquellos entonces, me creía mayor aprendiendo Basic, QuickBasic y TurboPascal. El panorama ha cambiado mucho desde aquel entonces en el que el hecho de tener un ordenador ya era de por sí friki.  No estoy seguro, pero cuando mi hija llegue a secundaria, probablemente deba usar ya ordenadores en clase así que su normalización habrá que aprovechar. Esto no quita, que  otras actividades de habilidad social, deban tener un gran papel en su etapa de formación, de hecho, en ello irá su felicidad.

Lo único malo es que no tengo un plan de ejercicios… un plan de seguimiento o un objetivo concreto,  como ocurre con kumon, aunque lo mismo existen planes, es cuestión de investigar. Por lo pronto, aquí dejo un enlace que parece interesante al respecto. Os iré comentando.

Posted in programación.


git para usuarios de svn

En el trabajo hemos tenido algunos problemas con el sistema control  de versiones que usamos, svn, en cuanto al mantenimiento de las distintas branch. Un compañero (Karl) ha comentado que usar git, podría ayudarnos  con el mantenimiento de las branches, trunk y los merges entre ellos. En git, cada commit genera en una base de datos un identificador único en forma de hash. Esto ayudaría en cualquier momento a conocer en que branches está disponible un commit concreto y administrar correctamente el código por las distintas ramas del árbol.

Se da la circunstancia que estoy desarrollando un proyecto personal con un amigo, por el gusto de aprender bien python y jquery (y las malas artes del 2.0 famoso). y ya nos hemos visto en la necesidad de disponer de un sistema control de versiones, así que, con el objeto de  probar y conocer mejor git, ambos hemos decidido instalarlo: bah!, pasando de svn.

La primera impresión ha sido bastante buena. La gestión de las branch parece “mágica” (sí he escrito mágica y no magia; algún día explicaré qué es eso de mágica). Sin moverte del mismo path del sistema de archivos, puedes cambiar de branch (git checkout  [branch_name]) y mágicamente si haces un ls, descubres que la estructura de ficheros se ha modificado a la de la branch elegida.

En fin, menos introducciones y más al tajo.

Lo primero es crear el repositorio. En git los repositorios no tienen por qué estar centralizados en un servidor, es más un “cliente” puede actuar de servidor para sí mismo o para otros. Cuando termine la explicación de cómo se usa, os daréis cuenta de esto. En cualquier caso, voy  a seguir el modelo de cliente-servidor, tal como funciona en svn para que quede más claro.

Comencemos. En el servidor (host.dominio.com) crear un usuario devel (por ejemplo):

adduser devel

Loguearse con ese usuario y hacer

mkdir -p git/nombre_proyecto.git
cd git/nombre_proyecto.git
git init --bare

ya está creado el repositorio sin código de nuestro proyecto. Para subir el código, lo vamos hacer desde nuestro sistema cliente (nuestro estación de trabajo). Para ello vamos a usar de capa de transporte, ssh, de tal modo que pase cifrado. Aconsejo subir tu clave pública al servidor para no tener que estar escribiendo user y pass todo el tiempo. Nos vamos al directorio donde tangamos ya nuestro código y le pasamos los siguientes comandos:

cd proyecto
git init
git remote add origin ssh://devel@host.dominio.com/home/devel/git/nombre_proyecto.git
git add .
git commit -m "Apertura del repositorio"

Este commit, no escribe en el servidor, sino que lo hace en local generando su correspondiente entrada hash (el identificador único que identifica la operación) en la bbdd de git.

git push origin master

finalmente, con push, lo empujamos al servidor

Si por lo que sea, queremos obtener una copia del repositorio en otro ordenador o path, podemos optar por traerlo clonado desde el servidor. Esto es algo parecido a un checkout, sólo que se trae toda la base de datos de todo lo sucedido en el repositorio. Es decir, que en un momento dado este clon, podría convertirse en el repositorio raiz.

Clonar un repositorio ya creado:

mkdir proyecto
cd proyecto
git clone ssh://devel@host.dominio.zona/home/devel/git/nombre_proyecto.git

Para crear una branch del proyecto es pasmosamente fácil:

git branch branch_proyecto

Donde branch_proyecto es el nombre de la branch del repositorio

Para ver la branch en la que estás:

git status

Para añadir ficheros al proyecto (svn add, svn commit). Lo primero es asegurarse que la branch en la principal :

git checkout master

y ahora sí a añadir:

git add README
git commit

Y finalmente hay que hacer un push, si quieres que llegue el cambio al repositorio del servidor. De esta forma, otros usuario podrán usar tus cambios:

git push

Para tener actualizado tu  repositorio local con el remoto:

git pull --rebase

Equivale a svn update y el –rebase es para revisar si otro usuario ha hecho antes un push

Más o menos con esto te puedes hacer una idea y manejarte con git. Más información en la página del proyecto oficial.

En cuanto a gestores de tickets para git, se puede usar el clásico Trac con el plugin correspondiente, aunque en realidad me gustaría probar http://www.redmine.org/ un trac para git. Intentaré hablaros pronto de redmine

Posted in Administración de sistemas, programación.