Soy un firme defensor del software libre desde hace años. Incluso estoy muy orgulloso de haber formado parte como becario de la Oficina de Software Libre de la Universidad de La Laguna. Desde que fundamos Galotecnia Redes Sistemas y Servicios hemos estado muy ocupados tratando de hacernos un hueco en el pequeño y competitivo mercado canario.

Como empresa trabajamos principalmente con Django, que en este tiempo ha crecido muchísimo. Trabajar con Django nos aporta muchas ventajas como por ejemplo no tener que compilar cada vez que queremos probar una modificación o poder trabajar con un lenguaje, Python, que posiblemente se acerque al equilibrio entre expresividad y rendimiento.

El hecho de que cada vez más y más gente esté trabajando con este framework hace que haya disponible cientos de líneas de código al alcance de la tecla. Esto es magnífico ya que te permite concentrarte en lo que hace distinta a tu aplicación.

Hace tiempo que no puedo picar código a gusto por distintos motivos, pero hoy he podido un poco. He estado trabajando en hacer cosas con la aplicación administrativa. La aplicación administrativa es bastante flexible y permite hacer cosas bastante chulas con bastante sencillez.

Controlar las entradas que se muestran a un usuario (código de django-blog-zinnia modificado) :

def queryset(self, request):
"""Make special filtering by user permissions"""
queryset = super(EntryAdmin, self).queryset(request)
if request.user.has_perm('zinnia.can_view_all'):
return queryset
return Entry.objects.filter(blog__in = request.user.blog_set.all())

El truco está en que el request tiene un atributo user, por lo que básicamente se pueden hacer muchas cosas muy interesantes.

Restringir las opciones de una ForeignKey:

def formfield_for_foreignkey(self, db_field, request, **kwargs):
if (request.user.is_superuser == False) and (db_field.name == "blog"):
kwargs["queryset"] = Blog.objects.filter(authors = request.user)
return db_field.formfield(**kwargs)
return super(EntryAdmin, self).formfield_for_foreignkey(db_field, request, **kwargs)

Nuevamente tenemos el usuario en el request, en este caso es un poco más engorroso porque tenemos que filtrar por el nombre del campo, pero sigue siendo sencillo y potente.

Restringir las opciones de un ManyToMany:

def formfield_for_manytomany(self, db_field, request, **kwargs):
if (request.user.is_superuser == False) and (db_field.name == "related"):
kwargs["queryset"] = entries_published(Entry.objects.all(), request.user)
return db_field.formfield(**kwargs)
return super(EntryAdmin, self).formfield_for_manytomany(db_field, request, **kwargs)

Es básicamente lo mismo que en el caso anterior. Ojo este método no está documentado, por lo que no estoy seguro de que sea buena idea utilizarlo.

Con estas tres opciones y alguna que otra que no he comentado podemos hacer que el contenido que cada usuario ve en la interfaz administrativa sea personalizado a dicho usuario lo cual es necesario en muchas ocasiones.

EDITADA: Corregida la indentación y el el return del ejemplo de manytomany

Me he dado cuenta de que hace mucho que no posteamos nada, así que me dispongo a contarles un poco en qué hemos estado estos últimos meses.

Si algo puede definir este tiempo es trabajo, mucho, demasiado trabajo. El primer año tuvimos un buen año, lo que unido a una cierta falta de experiencia nos llevo a tener bastante más trabajo del que podíamos desarrollar, lo cual siempre es un problema. Hay veces en las que es necesario pararse decir de manera honesta que no puedes desarrollar un determinado proyecto. Cuando uno no tiene experiencia como empresario parece que el objetivo es vender lo más posible y eso no es cierto ni recomendable. Gestionar el tiempo, y las tareas de la empresa es una necesidad. Coger más trabajo del que se puede desarrollar es un problema.

Este segundo año lo hemos pasado, básicamente, liberando la pila. Ahora empezamos de nuevo a tener algo de tiempo, quedan algunos proyectos por cerrar, pero la mayoría ya está entregado sin problemas y funcionando. Ahora miramos por primera vez en mucho tiempo al futuro, tenemos muchos proyectos en la cabeza, algunos los desarrollaremos y otros no.

En este periodo hemos recibido algunas incorporaciones que nos han aportado una capacidad de trabajo mucho mayor de la que teníamos a la vez que tenemos nuevos enfoques en las reuniones de trabajo. Tener personal trabajando para nosotros es un valor importante, pero también es una responsabilidad. Todas y cada una de las personas que han pasado por la empresa son muy válidas, pero no podemos contratarlos a todos, lo cual es una lástima. El equipo de trabajo actual está formado por seis personas y creo que es el equipo que tenemos que tener por ahora.

También algunos no han aguantado. La emprendeduría es una carrera de fondo, extremadamente dura en la que muy pocos aguantan. Motivos personales han llevado a que uno de los socios fundadores y un gran amigo haya tenido que desvincularse de la empresa. Es una pena.

Esto debería servir como resumen de lo que ha pasado en Galotecnia en los últimos meses. Ahora espero que podamos rescatar la actividad blogera con artículos de contenido más técnico en los próximos días.

Durante la formación para ser profesionales del mundo de la informática se enseñan metodologías de ingeniería del software para lo cual, normalmente se, enseñan con cierta profundidad procesos pesados (en contraposición a los ágiles) como métrica o UP. Las metodologías ágiles se suelen nombrar, pero no se profundiza mucho en ellas.

Nunca me han gustado las metodologías pesadas ya que considero que en la mayoría de los casos es más costoso seguir la metodología y escribir la documentación que desarrollar el proyecto.

En contraposición con todo esto existen las metodologías ágiles, que permiten utilizar un esquema de desarrollo mucho más natural.

Utilizando una metodología pesada el ciclo de desarrollo puede ser algo como:

  • Entrevista con el cliente para obtener requisitos
  • Convertir los datos obtenidos del cliente en una especificación de requisitos (doc1)
  • Hacer diagramas de casos de uso que contemplen todas las funcionalidades (doc2)
  • Hacer un montón de documentos más (Plan de pruebas,…)
  • Presentarle los documentos anteriores al cliente (que en muchas ocasiones no es técnico y no los entiende bien)
  • Desarrollar el proyecto
  • Desplegar el proyecto

En las metodologías ágiles se busca aligerar la carga que conlleva la documentación, pero también se consigue hablar de manera natural el lenguaje del cliente. El ciclo anterior podría ser:

  • Entrevista con el cliente para obtener requisitos en forma de ejemplos (se utiliza un lenguaje cercano al la lógica de negocio del cliente)
  • Convertir los ejemplos en tests (esto es código)
  • Desarrollar el proyecto verificando que pase los tests
  • Desplegar el proyecto

En el primer caso era necesario convertir en explícito los datos entregados por el cliente mediante multitud de documentos. Esto hace que, si los requisitos del proyecto cambian, sea necesario modificar todos los documentos generados con nuevas versiones que reflejen los cambios, con lo cual el coste del cambio va aumentando con el transcurso de los distintos ciclos. En este tipo de metodologías el contrato son los documentos.

En el segundo caso se evita generar documentos para explicitar los acuerdos, requisitos, etc, presentados por el cliente. Acuerdos, requisitos, etc. se reflejan en los ejemplos, que, una vez convertido en tests, son el contrato. Además el contrato es en sí mismo el plan de pruebas (o al menos una parte muy importante de este).

En estos días se ha producido la compra de Sun por parte del gigante Oracle, lo cual ha hecho que el mundo del Software Libre se haya estremecido ya que Sun era la abanderada del software libre (con el permiso de IBM) entre las empresas grandes. Este movimiento es bastante curioso ya que no se ha dejado claro qué espera Oracle de Sun o en otras palabras cuáles son los motivos que les han empujado a gastarse miles de millones de dolares en  su compra.

(más…)

Escribo esta entrada a colación de una muy interesante entrada en Barrapunto. Me ha parecido extremadamente interesante, especialmente los comentarios. Parece que el avance del Software Libre en los escritorios es cada vez más patente. Hace unos pocos años nadie tenía “Linux” en el escritorio, y pocos en los servidores. A día de hoy, los sistemas operativos basados en GNU/Linux ya dominan el mercado de los servidores (en la organización en la que trabajo son aproximadamente el 80% de los servidores) y parece que poco a poco se están abriendo paso en los escritorios.

¿Qué ha hecho posible esto?¿Qué camino habría que seguir para que dentro de 5 ó 10 años el 80% de los escritorios use este sistema?

(más…)

Este aparato es un NAS de la marca Conceptronic para discos IDE 3.5″ PATA con interfaz wireless, que compré hace unos meses. El dispositivo ya tiene un Linux dentro. Aquí siguen las instrucciones necesarias y los pasos que he aprendido para acceder a el, y para poder instalarle una debian etch.

(más…)

A nadie se le escapa que en este momento tenemos una crisis bastante profunda en España. En realidad no tenemos una crisis sino dos crisis unidas. La primera crisis es la crisis financiera internacional, mientras que la segunda es la explosión de la infladísima burbuja inmobiliaria. España es un país en el cual aproximadamente el 30% del PIB (no recuerdo la fuente) proviene directa o indirectamente del sector construcción. Otros paises como Alemania rondan el 11%.

Los dirigentes políticos (ni nadie) no saben qué medidas serán efectivas a la hora de superar la crisis. Una de las que se propone en España es la inversión pública.  Esta medida me parece acertada, solo que creo que se están equivocando sobre en qué invertir. Existe la necesidad de reducir el porcentaje de la economía que depende del sector construcción, pero es precisamente en este sector donde se va a intertir la aplastante mayoría de la inversión pública que se hará para superar la crisis.

(más…)

Seguir

Recibe cada nueva publicación en tu buzón de correo electrónico.