Excelente artículo! Tiene muchos consejos y referencias sobre cómo instalar algunas cosas que no vienen con Ubuntu.
http://ubuntulife.wordpress.com/2009/05/02/cosas-a-hacer-despues-de-instalar-ubuntu-904-jaunty-jackalope/
domingo, 3 de mayo de 2009
Cosas a hacer despues de instalar Ubuntu 9.04 Jaunty Jackalope
Posteado por
Software and Motorcycles
a las
12:54
Enviar por correo electrónicoEscribe un blogCompartir en XCompartir con FacebookCompartir en Pinterest
0
comentarios
Labels:
linux,
ubuntu
domingo, 8 de marzo de 2009
Parches para mejorar Django
Encontré algunos parches que estoy usando a diario para desarrollo y tests en Django, y me pareció interesante compartirlos. Además la idea es que sirvan de ejemplo de las cosas que se pueden encontrar en el sistema de "tickets" de Django, donde hay muchos parches para agregar funcionalidad, por ejemplo:
- Make Django's server optionally multithreaded
(específicamente: devserver_multithread_trunk_r9532.patch)
Esto permite que el servidor de desarrollo funcione con multiple threads. Sirve, por ejemplo, si queremos realizar un request al mismo servidor (por ejemplo, usando urllib2) desde una vista.
- Add live test server support to test framework
(específicamente: django_live_server_r8458.diff)
Permite iniciar un servidor http desde un testcase.
- Make Django's server optionally multithreaded
(específicamente: devserver_multithread_trunk_r9532.patch)
Esto permite que el servidor de desarrollo funcione con multiple threads. Sirve, por ejemplo, si queremos realizar un request al mismo servidor (por ejemplo, usando urllib2) desde una vista.
- Add live test server support to test framework
(específicamente: django_live_server_r8458.diff)
Permite iniciar un servidor http desde un testcase.
Posteado por
Software and Motorcycles
a las
14:12
Enviar por correo electrónicoEscribe un blogCompartir en XCompartir con FacebookCompartir en Pinterest
1 comentarios
Labels:
django,
python
sábado, 28 de febrero de 2009
Problemas de teclado con Ubuntu 8.10 + VMPlayer
Por alguna cuestión VMPlayer no reconoce algunas teclas en Ubuntu (o sea, las teclas en Ubuntu funcionan bien, pero no "llegan" al sistema operativo ejecutando en VMPlayer). La solución es sencilla: hay que agregar la siguiente línea al archivo de configuración ubicado en ~/.vmware/config
Posteado por
Software and Motorcycles
a las
13:11
Enviar por correo electrónicoEscribe un blogCompartir en XCompartir con FacebookCompartir en Pinterest
1 comentarios
Labels:
linux,
vmplayer
jueves, 19 de febrero de 2009
pg_dump y "canceling statement due to statement timeout"
Al realizar backups de tablas grandes, pueden producirse "statement timeout":
Si esto sucede porque tenemos configurado "statement_timeout" a nivel general, esta configuración también está afectando las sentencias ejecutadas por pg_dump (esto sucede al menos con PostgreSql 8.1). Este se soluciona seteando la siguiente variable de entorno:
También podemos hacerlo en 1 línea
o también:
Tomado de: http://www.mail-archive.com/pgsql-general@postgresql.org/msg79518.html
pg_dump: SQL command failed
pg_dump: Error message from server: ERROR: canceling statement due to statement timeout
Si esto sucede porque tenemos configurado "statement_timeout" a nivel general, esta configuración también está afectando las sentencias ejecutadas por pg_dump (esto sucede al menos con PostgreSql 8.1). Este se soluciona seteando la siguiente variable de entorno:
~# export PGOPTIONS="-c statement_timeout=0"
~# pg_dump test_db
También podemos hacerlo en 1 línea
~# PGOPTIONS="-c statement_timeout=0" pg_dump test_db
o también:
~# env PGOPTIONS="-c statement_timeout=0" pg_dump test_db
Tomado de: http://www.mail-archive.com/pgsql-general@postgresql.org/msg79518.html
Posteado por
Software and Motorcycles
a las
12:58
Enviar por correo electrónicoEscribe un blogCompartir en XCompartir con FacebookCompartir en Pinterest
1 comentarios
Labels:
postgresql
martes, 17 de febrero de 2009
Formateo de excepciones en Python
Muy simple:
formatted_lines = traceback.format_exc().splitlines() # hacerlo en el exception handler
exc = "\n".join(formatted_lines)
print exc
Posteado por
Software and Motorcycles
a las
19:07
Enviar por correo electrónicoEscribe un blogCompartir en XCompartir con FacebookCompartir en Pinterest
0
comentarios
Labels:
python
jueves, 5 de febrero de 2009
Imports de Python como en Java
En Java, si tenemos 2 directorios con fuentes, y en cada directorio una misma estructura de paquetes, la JVM se encarga automáticamente de buscar cada clase/paquete en los distintos directorios. Por ejemplo, podemos tener src1 y src2 en el classpath, cada directorio con los mismos paquetes:
Desde una clase podemos hacer referencias a Uno y Dos sin mayores problemas, por ejemplo:
Pero con Python esto se complica y no funciona automáticamente. Si tenemos src1 y src2 en el PYTHONPATH, cada directorio con estructura similar:
Con PYTHONPATH=src1:src2
Con PYTHONPATH=src2:src1
Esto se puede solucionar utilizando pkgutil, modificando src1/ejemplo/__init__.py y src2/ejemplo/__init__.py de forma que incluya:
De esta manera, usando "extend_path" logramos lo que buscábamos, independientemente del orden en que están src1 y src2 en el PYTHONPATH.
src1/ar/com/ejemplo/Uno.java
src2/ar/com/ejemplo/Dos.java
Desde una clase podemos hacer referencias a Uno y Dos sin mayores problemas, por ejemplo:
import ar.com.ejemplo.Uno;
import ar.com.ejemplo.Dos;
Pero con Python esto se complica y no funciona automáticamente. Si tenemos src1 y src2 en el PYTHONPATH, cada directorio con estructura similar:
src1/__init__.py
src1/ejemplo/__init__.py
src1/ejemplo/uno.py
src2/__init__.py
src2/ejemplo/__init__.py
src2/ejemplo/dos.py
Con PYTHONPATH=src1:src2
from ejemplo import uno -> importa OK
from ejemplo import dos -> ImportError
Con PYTHONPATH=src2:src1
from ejemplo import uno -> ImportError
from ejemplo import dos -> importa OK
Esto se puede solucionar utilizando pkgutil, modificando src1/ejemplo/__init__.py y src2/ejemplo/__init__.py de forma que incluya:
from pkgutil import extend_path
__path__ = extend_path(__path__, __name__)
De esta manera, usando "extend_path" logramos lo que buscábamos, independientemente del orden en que están src1 y src2 en el PYTHONPATH.
from ejemplo import uno -> importa OK
from ejemplo import dos -> importa OK
Posteado por
Software and Motorcycles
a las
18:27
Enviar por correo electrónicoEscribe un blogCompartir en XCompartir con FacebookCompartir en Pinterest
0
comentarios
Labels:
python
lunes, 2 de febrero de 2009
Referencia rápida MySql 5.0
Diariamente trabajo y administro bases de datos PostgreSql, pero cada tanto uso MySql y siempre olvido los comandos para crear BD y usuarios, así que ahí va una referencia rápida sobre cómo hacerlo sobre MySql 5.0 (versión incluida en Debian Etch):
Para crear BD
Para crear un usuario y asignar permisos
Links:
http://dev.mysql.com/doc/refman/5.0/en/server-administration.html
http://dev.mysql.com/doc/refman/5.0/en/adding-users.html
http://dev.mysql.com/doc/refman/5.0/en/passwords.html
Para crear BD
$~ mysqladmin create nombre_base_de_datos
Para crear un usuario y asignar permisos
$~ mysql nombre_base_de_datos
[mysql] create user nombre_usuario identified by '**********';
[mysql] grant all on nombre_base_de_datos.* TO 'nombre_usuario'@'localhost';
[mysql] set password for 'nombre_usuario'@'localhost' = PASSWORD('********');
[mysql] flush privileges;
Links:
http://dev.mysql.com/doc/refman/5.0/en/server-administration.html
http://dev.mysql.com/doc/refman/5.0/en/adding-users.html
http://dev.mysql.com/doc/refman/5.0/en/passwords.html
Posteado por
Software and Motorcycles
a las
12:25
Enviar por correo electrónicoEscribe un blogCompartir en XCompartir con FacebookCompartir en Pinterest
0
comentarios
Labels:
mysql
domingo, 1 de febrero de 2009
SocketProcessId.getpid could not get unique port
Intentando ejecutar JBoss 5 (la versión para Java 6) en Ubuntu me apareció el siguiente error:
No sé exactamente cuál era el problema, pero lo pude solucionar mapeando al IP correcto el nombre de host que devuelven los comandos "hostname" y "hostname -f".
Ejemplo:
#~ hostname -f
unhost.example.com
Antes de solucionar el problema, "unhost.example.com" tenía asociado un IP incorrecto (o sea, un IP que no correspondía a ningun IP del sistema). Para solucionar el problema asocié a "unhost.example.com" el IP de la placa de red.
Esta cuestión también impide que Glassfish 2.1 arranque correctamente.
2009-02-01 02:49:32,115 INFO [com.arjuna.ats.jbossatx.jta.TransactionManagerService] (main) Setting up property manager MBean and JMX layer
2009-02-01 02:49:32,788 DEBUG [com.arjuna.ats.arjuna.logging.arjLoggerI18N] (main) [com.arjuna.ats.arjuna.recovery.TransactionStatusManager_1] - Starting service com.arjuna.ats.arjuna.recovery.ActionStatusService on port 4713
2009-02-01 02:49:32,812 ERROR [org.jboss.kernel.plugins.dependency.AbstractKernelController] (main) Error installing to Create: name=TransactionManager state=Configured com.arjuna.ats.arjuna.exceptions.FatalError: [com.arjuna.ats.internal.arjuna.utils.SocketProcessId_2] - SocketProcessId.getpid could not get unique port.
at com.arjuna.ats.internal.arjuna.utils.SocketProcessId.getpid(SocketProcessId.java:105)
at com.arjuna.ats.arjuna.utils.Utility.getpid(Utility.java:277)
at com.arjuna.ats.arjuna.common.Uid.(Uid.java:105)
at com.arjuna.ats.arjuna.utils.Utility.getProcessUid(Utility.java:289)
at com.arjuna.ats.internal.arjuna.recovery.TransactionStatusManagerItem.(TransactionStatusManagerItem.java:366)
at com.arjuna.ats.internal.arjuna.recovery.TransactionStatusManagerItem.createAndSave(TransactionStatusManagerItem.java:84)
at com.arjuna.ats.arjuna.recovery.TransactionStatusManager.start(TransactionStatusManager.java:145)
at com.arjuna.ats.arjuna.recovery.TransactionStatusManager.(TransactionStatusManager.java:72)
at com.arjuna.ats.arjuna.coordinator.TxControl.(TxControl.java:355)
at com.arjuna.ats.jbossatx.jta.TransactionManagerService.create(TransactionManagerService.java:178)
(y continúa...)
No sé exactamente cuál era el problema, pero lo pude solucionar mapeando al IP correcto el nombre de host que devuelven los comandos "hostname" y "hostname -f".
Ejemplo:
#~ hostname -f
unhost.example.com
Antes de solucionar el problema, "unhost.example.com" tenía asociado un IP incorrecto (o sea, un IP que no correspondía a ningun IP del sistema). Para solucionar el problema asocié a "unhost.example.com" el IP de la placa de red.
Esta cuestión también impide que Glassfish 2.1 arranque correctamente.
Posteado por
Software and Motorcycles
a las
2:48
Enviar por correo electrónicoEscribe un blogCompartir en XCompartir con FacebookCompartir en Pinterest
0
comentarios
Labels:
glassfish,
jboss
jueves, 29 de enero de 2009
Django + tsearch2
Encontré 2 artículos explicando cómo usar tsearch2 de PostgreSql desde Django, para realizar búsquedas de texto de forma eficaz.
- http://www.rossp.org/blog/2009/jan/28/django-postgresql-fulltext/
- http://barryp.org/blog/entries/postgresql-full-text-search-django/
- http://www.rossp.org/blog/2009/jan/28/django-postgresql-fulltext/
- http://barryp.org/blog/entries/postgresql-full-text-search-django/
Posteado por
Software and Motorcycles
a las
14:49
Enviar por correo electrónicoEscribe un blogCompartir en XCompartir con FacebookCompartir en Pinterest
0
comentarios
Labels:
django,
postgresql,
python
Fuentes (fonts)
Encontré en lwn.net un artículo sobre fuentes con licencias libres:
Una página que he usado alguna vez es http://www.dafont.com, tiene muchas fuentes, aunque no todas con licencias libres.
- Open Font Library: A sister-site to the Creative Commons' Open Clip Art Library, the Open Font Library is the largest single repository of free fonts, with over 100 selections — a small number compared to proprietary fonts, but a much larger number than even a few years ago. The site includes users' reviews, tags, and ratings, as well as remixes of various fonts.
- SIL Font Downloads: This is the main site for free fonts for language support, especially for minority languages, but also for the full range of western and eastern European languages, Cyrillic, Greek, and Hebrew. Some of these typefaces are so obscure that only specialists will use them regularly, but they include a number of general purpose fonts for English and other western European Languages, such as Gentium, Charis SIL and Doulos SIL.
- Raph Levien's fonts:A maintainer for GhostScript, Raph Levien also designs some of the best free fonts for everyday use. Be warned, though, that these are works in progress, and some are not be completely ready for use.
- Linux Libertine: Linux Libertine is designed as a free replacement for the ubiquitous Times Roman. Its letters are designed to have the same proportions as those of Time Roman, so that, when a recipient's machine replaces Linux Libertine in a document with Times Roman, your document's design does not suffer.
- Liberation fonts: A set of three fonts designed as free replacements for Times Roman, Arial/Helvetica, and Courier — respectively the most commonly used serif, sans serif, and monospace fonts used on Windows.
- DejaVu: DejaVu is a version of the Bitstream Vera family, one of the first free fonts. The main difference is that it includes support for a greater number of international characters.
Una página que he usado alguna vez es http://www.dafont.com, tiene muchas fuentes, aunque no todas con licencias libres.
Posteado por
Software and Motorcycles
a las
13:14
Enviar por correo electrónicoEscribe un blogCompartir en XCompartir con FacebookCompartir en Pinterest
0
comentarios
Labels:
fonts
viernes, 23 de enero de 2009
Instalación fácil de librerias en Wine
Encontré un script para instalar de manera fácil las librerias más comunes necesarias para ejecutar con Wine los programas para Windows: "winetricks is a quick and dirty script to download and install various redistributable runtime libraries sometimes needed to run programs in Wine"
http://wiki.winehq.org/winetricks
http://wiki.winehq.org/winetricks
Posteado por
Software and Motorcycles
a las
15:27
Enviar por correo electrónicoEscribe un blogCompartir en XCompartir con FacebookCompartir en Pinterest
0
comentarios
Labels:
linux,
wine
sábado, 29 de noviembre de 2008
Generando formularios de modelos en Django
Es muy fácil generar formularios basándonos en los datos definidos en un modelo (esto está ampliamente documentado en el sitio de Django, excepto:
1) cómo setear los ítems que debe contener el SELECT correspondiente a un campo ForeignKey
2) cómo cambiar el nombre del campo que debe aparecer en el formulario autogenerado
(marqué en rojo la manera que encontré para resolver estas 2 cuestiones).
Modelo:
Formulario:
Vista:
1) cómo setear los ítems que debe contener el SELECT correspondiente a un campo ForeignKey
2) cómo cambiar el nombre del campo que debe aparecer en el formulario autogenerado
(marqué en rojo la manera que encontré para resolver estas 2 cuestiones).
Modelo:
from django.db import models
from django.contrib.auth.models import User
class Proyecto(models.Model):
name = models.CharField(max_length=256, verbose_name="Nombre")
customer = models.ForeignKey(to=User, verbose_name="Cliente")
Formulario:
from django import forms
class ProyectoForm(forms.ModelForm):
class Meta:
model = Proyecto
fields = ('name', 'customer')
Vista:
if request.POST:
form = ProyectoForm(request.POST)
else:
form = ProyectoForm()
form.fields['customer'].queryset = User.objects.all().reverse()
Posteado por
Software and Motorcycles
a las
0:27
Enviar por correo electrónicoEscribe un blogCompartir en XCompartir con FacebookCompartir en Pinterest
0
comentarios
Labels:
django,
python
viernes, 21 de noviembre de 2008
Autocompletar con Ajax para ForeignKey de Django
Posteado por
Software and Motorcycles
a las
21:27
Enviar por correo electrónicoEscribe un blogCompartir en XCompartir con FacebookCompartir en Pinterest
1 comentarios
Labels:
django,
python
jueves, 20 de noviembre de 2008
Cómo embeber Flash
Una buena alternativa parece ser swfobject
Posteado por
Software and Motorcycles
a las
12:58
Enviar por correo electrónicoEscribe un blogCompartir en XCompartir con FacebookCompartir en Pinterest
0
comentarios
Labels:
flash,
javascript
martes, 18 de noviembre de 2008
Como backupear usuarios y grupos de PostgreSql
Respuesta:
(también backupea tablespaces)
Artículo original y respuestas más largas: Backing up Login Roles aka Users and Group Roles
pg_dumpall --globals-only(también backupea tablespaces)
Artículo original y respuestas más largas: Backing up Login Roles aka Users and Group Roles
Posteado por
Software and Motorcycles
a las
2:00
Enviar por correo electrónicoEscribe un blogCompartir en XCompartir con FacebookCompartir en Pinterest
0
comentarios
Labels:
postgresql
sábado, 15 de noviembre de 2008
Ejemplo de mod_deflate
Comprimir contenidos con mod_deflate es mucho más fácil que con mod_gzip:
Con las 2 primeras líneas ya alcanza. Las demás líneas son para loguear en un archivo información estadística sobre la compresión. Por ejemplo:
<ifmodule mod_deflate.c>
SetOutputFilter DEFLATE
AddOutputFilterByType DEFLATE text/html text/plain text/xml text/javascript application/x-javascript text/css
DeflateFilterNote Input instream
DeflateFilterNote Output outstream
DeflateFilterNote Ratio ratio
LogFormat '"%r" %{outstream}n/%{instream}n (%{ratio}n%%)' common_deflate_log
CustomLog logs/xyz.dynamicware.com.ar-mod_deflate.log common_deflate_log
</ifmodule>
Con las 2 primeras líneas ya alcanza. Las demás líneas son para loguear en un archivo información estadística sobre la compresión. Por ejemplo:
"GET /resources/virtualdisk-default.css HTTP/1.1" 1077/4041 (26%)
"GET /resources/static/back-body.gif HTTP/1.1" 44/52 (84%)
"GET /resources/static/back01.jpg HTTP/1.1" 138938/139402 (99%)
Posteado por
Software and Motorcycles
a las
11:41
Enviar por correo electrónicoEscribe un blogCompartir en XCompartir con FacebookCompartir en Pinterest
0
comentarios
Labels:
apache
Optimización de sitios
Puede optimizarse considerablemente un sistema web que estoy utilizando a través de la configuración del tiempo de expiración de los archivos servidos. Esto lo hice organizando todos los archivos que no cambian nunca (javascripts de prototype y jquery, algunos logos, etc). Los ubique en el directorio /resources/static, y luego configure en Apache:
Esto hace que el servidor Apache le envíe al navegador información para que guarde en su caché estos archivos por más de 2 meses. Los demás recursos que pueden cambiar (como los estilos desarrollados por mi y algunos javascripts) los ubiqué en /resources, así evito que sean cacheados por tanto tiempo.
Antes:

Después:

Para estas tareas de optimización, Firefox e YSlow son grandes aliados. Por ejemplo, en el último gráfico, a la izquierda, vemos que del total de bytes bajados, la mitad corresponden a "CSS images", lo que nos da información valiosa para saber por dónde empezar para optimizar más aún nuestro sitio (en este caso se debe a una imagen muy grande usada como background).
<directory /xxxxxxx/templates/resources/>
ExpiresActive On
ExpiresDefault "now plus 2 month"
</directory>
Esto hace que el servidor Apache le envíe al navegador información para que guarde en su caché estos archivos por más de 2 meses. Los demás recursos que pueden cambiar (como los estilos desarrollados por mi y algunos javascripts) los ubiqué en /resources, así evito que sean cacheados por tanto tiempo.
Antes:

Después:

Para estas tareas de optimización, Firefox e YSlow son grandes aliados. Por ejemplo, en el último gráfico, a la izquierda, vemos que del total de bytes bajados, la mitad corresponden a "CSS images", lo que nos da información valiosa para saber por dónde empezar para optimizar más aún nuestro sitio (en este caso se debe a una imagen muy grande usada como background).
Posteado por
Software and Motorcycles
a las
1:53
Enviar por correo electrónicoEscribe un blogCompartir en XCompartir con FacebookCompartir en Pinterest
0
comentarios
Labels:
apache
viernes, 14 de noviembre de 2008
Ejemplo de mod_gzip de Apache + JBoss
Un ejemplo de configuración de mod_gzip. Dos problemas con los que me topé mientras lo configuraba:
- Hacerlo funcionar con contenido tomado de un servidor JBoss vía AJP: para esto debemos utilizar:
mod_gzip_item_include handler ^jakarta-servlet
- Algunos contenidos no se comprimian, aunque parecía estar todo bien configurado: esto es debido a que la expresión regular configurada era:
^text/html$
y debía ser:
^text/html
porque los encabezados suelen incluir información de encoding, por ejemplo:
text/plain; charset=us-ascii
Ejemplo completo
- Hacerlo funcionar con contenido tomado de un servidor JBoss vía AJP: para esto debemos utilizar:
mod_gzip_item_include handler ^jakarta-servlet
- Algunos contenidos no se comprimian, aunque parecía estar todo bien configurado: esto es debido a que la expresión regular configurada era:
^text/html$
y debía ser:
^text/html
porque los encabezados suelen incluir información de encoding, por ejemplo:
text/plain; charset=us-ascii
Ejemplo completo
<ifmodule mod_gzip.c>
mod_gzip_on Yes
mod_gzip_can_negotiate No
mod_gzip_dechunk Yes
mod_gzip_handle_methods GET POST
# 512k
mod_gzip_maximum_file_size 524288
# 200k
mod_gzip_maximum_inmem_size 204800
mod_gzip_item_include handler ^jakarta-servlet
mod_gzip_item_include file \.html$
# Si usamos ^text/html$ (con $ al final) entonces estaremos excluyendo
# los mime que incluyen el encoding (utf8, etc) junto a text/html
mod_gzip_item_include mime ^text/html
mod_gzip_item_include mime ^text/plain
mod_gzip_item_include mime ^text/javascript
mod_gzip_item_include mime ^text/css
mod_gzip_item_include uri ^/intranet/app
mod_gzip_item_exclude mime ^image/
</ifmodule>
Posteado por
Software and Motorcycles
a las
22:01
Enviar por correo electrónicoEscribe un blogCompartir en XCompartir con FacebookCompartir en Pinterest
0
comentarios
Labels:
apache,
jboss
Minimización de JS
Buscando algún servicio online para minimizar JS, encontré una librería, creada por el proyecto Dojo que se puede bajar. Está hecho en Java y son sólo 2 jars.
http://dojotoolkit.org/docs/shrinksafe
Hay que bjajar js.jar y shrinksafe.jar y ejecutar:
java -cp js.jar -jar shrinksafe.jar archivo.js > archivo-minimizado.js
http://dojotoolkit.org/docs/shrinksafe
Hay que bjajar js.jar y shrinksafe.jar y ejecutar:
java -cp js.jar -jar shrinksafe.jar archivo.js > archivo-minimizado.js
Posteado por
Software and Motorcycles
a las
20:09
Enviar por correo electrónicoEscribe un blogCompartir en XCompartir con FacebookCompartir en Pinterest
0
comentarios
Labels:
java,
javascript
jueves, 13 de noviembre de 2008
Generando PDFs con Django
Encontré un artículo explicando cómo hacerlo. Internamente usan pisa.
http://uswaretech.com/blog/2008/10/generating-pdfs-with-django/
http://uswaretech.com/blog/2008/10/generating-pdfs-with-django/
Posteado por
Software and Motorcycles
a las
22:59
Enviar por correo electrónicoEscribe un blogCompartir en XCompartir con FacebookCompartir en Pinterest
0
comentarios
Labels:
django,
python
Suscribirse a:
Entradas (Atom)