Ir al contenido principal

Entradas

Mostrando entradas de 2011

Curso Django Primera Parte

Hace tiempo que quiero hacer un pequeño curso-manual sobre django. En esta primera parte comenzaremos con el software base para llevarlo a la práctica. Espero que una vez terminado quede suficientemente claro y sobre todo, que sea de utilidad. Software base: - Debian 6.0.3 - Python - Python setuptools - gcc - python-imaging - Mysql - python-mysqldb - apache2 - Django-1.3.1.tar.gz -> https://www.djangoproject.com/download/ - digi604-django-smart-selects-1.0.4-0-ga8f9eb9.zip -> https://github.com/digi604/django-smart-selects Hay un bug (https://github.com/digi604/django-smart-selects/issues/27) que se corrige con el parche que podemos encontrar en: https://github.com/GrAndSE/django-smart-selects/commit/7e2a8d572b3615cc39a3c9f9d60e1b60de06f46f Habría que actualizar el fichero widgets.py en la carpeta smart_selects, tras esto instalar django-smart-selects. - django-command-extensions -> svn checkout http://django-command-extensions.googlecode.com/svn/trunk/ d

Road Salt Two

El nuevo disco de uno de mis grupos favoritos: Pain of Salvation. Obligada escucha del disco, genial, con una intro que te lleva a recordar el "Within You Without You" de The Beatles.  Tracklist: 1. Road Salt Theme 2. Softly She Cries 3. Conditioned 4. Healing Now 5. To The Shoreline 6. Eleven 7. 1979 8. The Deeper Cut 9. Mortar Grind 10. Through The Distance 11. The Physics Of Gridlock 12. End Credits  Página Oficial: http://www.painofsalvation.com/

Resetear pass de admin en Django

Para resetear la password de admin en Django en caso de olvido: Entramos en la shell: python manage.py shell Aparecerá la siguiente interfaz de comandos: Python 2.7.1+ (r271:86832, Apr 11 2011, 18:05:24) [GCC 4.5.2] on linux2 Type "help", "copyright", "credits" or "license" for more information. (InteractiveConsole) >>> Una vez dentro ejecutaremos los siguientes comandos: >>> from django.contrib.auth.models import User >>> users = User.objects.all() >>> u = users[0] >>> u.set_password(‘la clave que queramos’) >>> u.save() Y listo, ya tenemos nuestra nueva password.

Error en ejecución de script en Alfresco

Hace tiempo publiqué una entrada con una serie de webscripts para facilitar ciertas tareas de administración de Alfresco: Pantalla de Administración para Alfresco . Pues hace poco tuve que cambiar el tipo de autenticación en uno de los webscripts para permitir su uso a usuarios no adminstradores, para ellos cambié la autenticación a user. Fué entonces cuando surgió el problema. Para ciertos grupos, al lanzar el script me devolvía el siguiente mensaje: 500 Description: Un error en el servidor HTTP, el cual le ha impedido cumplir con la solicitud. Message: 09246007631 Wrapped Exception (with status template): 09246007630 Failed to execute script '/org/alfresco/sample/prueba.post.js (in repository store workspace://SpacesStore/Empresa/Diccionario de datos/Web Scripts)': 09246007629 Acceso denegado. No tiene los permisos apropiados para realizar esta operación. Exception: net.sf.acegisecurity.AccessDeniedException - Access Denied Traceando el script me dí cuenta

Django y AJAX

Llevo unos meses utilizando el framework Django y me parece una maravilla. En la última aplicación que estoy realizando me he encontrado con un pequeño problema a la hora de utilizar en una plantilla tecnología AJAX. Concretamente el problema con el que me he topado ha sido para recoger unos datos mediante jQuery con un post. Tengo dos select combinados, de tal forma que al hacer la selección del primero, los datos del segundo se actualizan dependiendo del valor del primero. Pues debido a la protección que trae Django para CSFR (Cross Site Request Forgery), la llamada post que hago para traerme los datos en JSON no es válida, ya que no estaba mandando el token válido para CSFR. La solución, la propia documentación de Django te la da. Básicamente se trata de meter este código en nuestro template: $ ( document ). ajaxSend ( function ( event , xhr , settings ) { function getCookie ( name ) { var cookieValue = null ; if ( document . cookie &

Control de procesos

Gracias a supervisor , podremos controlar de manera fácil y precisa los procesos que queramos. Presentaré cómo instalarlo sobre Ubuntu y un pequeño ejemplo de uso. Lo primero que haremos será instalarlo desde el repositorio: sudo apt-get install supervisor Lo más probable es que nos de un error al no encontrar una dependencia: elementtree. Por tanto lo que haremos es desinstalarlo: sudo apt-get remove supervisor e instalar la dependencia: sudo easy_install elementtree Tras esto ya podremos instalar supervisor sudo apt-get install supervisor Bien, ya lo tenemos instalado y ejecutando, pero sin hacer nada útil, así que vamos a modificar el fichero de configuración que trae por defecto y que se encuentra en /etc/supervisor/supervisord.conf, añadiendo las siguientes entradas: ;activamos la interfaz web [inet_http_server] ; inet (TCP) server disabled by default port=*:9001 ; (ip_address:port specifier, *:port for all iface) username=admin ; (default is no use

Controla el estado de la memoria en aplicaciones Java

En muchas ocasiones nos encontramos con aplicaciones que tienen leak de memoria, y se va consumiendo este recurso sin que sea liberado adecuadamente. La solución: corregir el código, que suele ser el principal origen del problema. Pero cuando eso no depende de ti y tienes que ofrecer disponibilidad en dicha aplicación, una posible solución es controlar el consumo que hace la aplicación de la memoria, y en función de esta, realizar un reinicio antes de su degradación. Aquí dejo un script que puede resultar útil. Se basa en controlar como se consume la memoria en las zonas Eden y Old Generation. Al haber una fuga de memoria, la zona Old Generation no se liberará como debe, y la zona Eden se consumirá también, imposibilitando la creación de nuevos objetos. El script lo que hace es controlar estas zonas y cuando se alcance cierto umbral durante cierto número de ciclos consecutivos, reiniciar la aplicación (evitamos que la aplicación se acabe degradando y que al final la tengamos q

Diangosticar y solucionar problemas de memoria en Java

Adjunto un documento que he traducido del artículo " Chuk-Munn Lee of Sun Microsystems Troubleshoots Java SE 6 Deployment" que me parece muy interesante. Trata diversas formas de obtener información para analizar posibles problemas de memoria en aplicaciones Java. Solución de problemas de memoria en java Espero que sea de utilidad.

Material Defectuoso. Nuevo disco de Extremoduro.

Siempre he añadido entradas sobre temas de informática, pero hoy me apetece añadir una entrada musical.... Se trata del nuevo disco de Extremoduro. Es difícil no decir nada después de haberlo escuchado. Me ha sorprendido gratamente y creo que a todo aquel que le guste la música que hacen, también habrán disfrutado con esta joyita: Letra de Tango Suicida Sangre negra de esta herida brota, no dejo de pensar que te deje marchar. Nunca había estado un alma tan rota desde que tu no estas no quiere recordar. Se paso una vida entera y yo solo guardo el recuerdo de una pocas horas. Era primavera, el sol salió ese día por ponerse a tu vera. Y el olor de un día de enero, estribadito en tu agujero, sígue en mi cabeza. Y un verano juntos de la mano, y me pasao la noche fuera. Ya todo el año me hace daño y me vuelvo a llevar a patadas con la primavera. Junto a las hojas que el otoño vino a derribar me deje llevar... me deje llevar. Que te corre por las venas

Python + Jython. Cómo cambiar el estado de Alfresco 3.2r

Ante la necesidad de cambiar el estado de lectura/escritura de Alfresco de forma automática (para realizar los backup) he realizado unos scripts basándome en el jythonJmxClient.py de matthew@thebitsource.com. La idea consiste en conectarme vía JMX a la instancia de alfresco para cambiar el atributo server.transaction.allow-writes del mbean Alfresco:Type=Configuration,Category=sysAdmin,id1=default. Para esto me valgo del script jythonJmxClient.py, pero añadiéndole un nuevo método, def do_setAttribute(self, line). Este método será el que nos permita cambiar el valor del atributo: def do_setAttribute(self, line):                 """setAttribute -m|--mbeanpath <path to mbeanr> -a|--attribute <name of attribute>                 Set the mbean server for a specific attribute"""                 #annoying option parsing stuff - need cmd2                 parser = optparse.OptionParser(conflict_handler="error")                 parser.a

Pantalla de Administración para Alfresco

En otras ocasiones, he posteado algunos scripts para facilitar la administración de usuarios/grupos en alfresco. El inconveniente que le encuentro a trabajar directamente con los scripts, es que para pasarle los datos (usuarios, grupos, listas,...) hay que editar directamente el js, lo que hace perder tiempo y añade la posibilidad de introducir errores en el script. He estado investigando un poco el tema de los WebScripts, y es precisamente lo que estaba buscando. Con ellos podemos interactuar con los scripts a través de amigables formularios. He creado una serie de ellos basándome en los js que ya tenía (con algunas modificaciones) y este ha sido el resultado. Añado algunas imágenes para que veáis cómo queda: - Pantalla principal de administración: - Ver grupos por usuario. Dado un usuario, te muestra los grupos a los que pertenece: - Inserta un usuario en varios grupos. Dado un usuario y una lista de grupos, añade este usuario a los grupos indicados: - Copia los permisos de un usua

Administración de usuarios/grupos en alfresco (II)

Siguiendo con los scripts para la administración de usuario y grupos en alfresco, añado algunos más que pueden resultar útiles: - grupos_por_usuario.js: Su propio nombre ya es bastante descriptivo, se trata de un script que dado un usuario, nos devuelve los grupos a los que este usuario está añadido. Y digo añadido y no pertenece, puesto que no nos da el listado de grupos padres-hijos a los que pertenece por herencia, sino directamente los grupos a los que este usuario ha sido añadido. //Variable a rellenar var usuario=""; //Funcion que comprueba si un usuario dado existe como hijo de un grupo dado function comprueba_grupo_usuario (grupo, usuario) { scr_grupo = groups.getGroup(grupo); var usuarios = scr_grupo.getChildUsers(); var encontrado = false; var i = 0; while ( i<usuarios.length && !encontrado) { if ( usuarios[i].getFullName() == usuario ){ encontrado = true; } i++; } return encontrado; } //Creamos el log que devolveremos var logFile = space.childBy

Parsear un fichero de configuración

Con frecuencia necesitamos cambiar ciertas variables o campos de un fichero de configuración para adaptarlo a nuestro sistema. Cuando esto se convierte en una tarea repetitiva y sobre todo cuando son muchos los valores a cambiar, se hace interesante automatizar este proceso. Una forma de hacerlo es a través de algún script, en mi caso lo he hecho en python. En dicho script definimos las variables a buscar y los nuevos valores a tomar. Recorrerá el fichero buscando coincidencias con las variables y les pondrá los valores que hemos indicado (independientemente de si tienen o no ya un valor). Sería algo así: #!/usr/bin/env python # -*- coding: iso-8859-15 -*- """ USO: sustituye.py fichero_origen > fichero_destino Este script toma un argumento por la linea de comandos: el nombre del fichero a parsear. El resultado lo podemos redirigir a un nuevo fichero o ver como quedaría por pantalla. """ from cStringIO import StringIO import re, sys #Conjunto de variable

Publicar el contenido de logs a través de tomcat

Se crea en $TOMCAT_HOME/conf/Catalina/localhost/ un xml para el nuevo contexto que se va a utilizar para acceder a los logs: logs.xml: <Context path="/logs" docBase="/ruta/de/logs" crossContext="false" debug="1" reloadable="true" > </Context> El docBase debe ser la ruta absoluta donde estén los logs que se quieran publicar. Y en el direcotorio de los logs, creamos un direcotorio WEB-INF, y dentro un web.xml con el siguiente contenido: <?xml version="1.0" encoding="ISO-8859-1"?> <web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" version="2.4"> <servlet> <servlet-name>logs</servlet-name> <servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class> <init-para

LPIC 1

Prueba superada, el pasado 24 de marzo me examiné del LPIC 1, y hoy me han dado el resultado: LPI ID: LPI000192128 Verification Code: zf4h7v2lux https://cs.lpi.org/caf/Xamman/certification Muy recomendable esta prueba, se refrescan muchos datos y se aprenden nuevos conceptos.... Siguiente meta: LPIC 2......

Ruta en bici

Ayer me di una vuelta con la bici de montaña, y me llevé el móvil para registrar la ruta con el GPS, este fue el resultado: http://www.sports-tracker.com/#/workout/rafabono/8vlae3g74o195gth Resultado: Agujetas hasta en el cielo de la boca, pero bueno, cuestión de práctica.....

Recuperar permisos de un espacio de Alfresco

Recientemente me he encontrado con un nuevo problema con Alfresco. De buenas a primeras habían desaparecido todos los permisos asignado a un espacio, y dicho espacio tenía cientos de subespacios con sus permisos y roles. En este caso se pudo salir al paso recuperando la mayor parte de los permisos de un entorno de preproducción. La forma de hacerlo fue recorriendo de forma recursiva el espacio del entorno de preproducción y guardando sus permisos en un fichero. Este fichero es parseado posteriormente obteniendo un nuevo fichero con las sentencias necesarias para aplicar los permisos sobre el espacio que los había perdido. Expongo los scripts: - backup_permisos.js //Obtiene el path del espacio var ruta_origen = (space.displayPath + "/" + space.name).replace("/Empresa/",""); //Crea log en el espacio personal de quien se loga. var nombre = space.name + "_permisos.log" var logFile = userhome.childByNamePath(nombre); if (logFile == null) { logFile =