la quakiza de hoy !



Es el primer día que logro terminar varias veces con numeros positivos, y llegué a terminar arriba del último lugar ! que belleza

Claro que no podemos dejar de maldecir al transexual altamarge, que con su maldita puntería ganó todos los juegos de hoy

Se solicitan mas Dummys !!



Suspend to RAM (not working for me)


Gunnar tiene una respuesta a los problemas de Bubulle, y yo pongo como me va en la feria 🙂

Pues a mi me funciona el “hibernate” a disco, tengo una dell latitude D610, a la que le funciona todo, pero el suspender a RAM simplemente no me devuelve la pantalla, y ni siquiera he logrado hacer el truco de devolverla a ciegas, pero con alegría (y sin muchas quejas, a mi si me gusta) puedo suspender a disco, y volver con todo y sistema grafico, usando beryl, y todo lo presumido que se puede tener en debian.

Así que, eres un fscking suertudo Gunnar, y sigo sin poder postear mensajes a tu blog :(, ahorita ni siquiera salgo por el proxy, y aún así no lo logro.

Buen día !

P.D Por cierto !, beryl me funciona con xorg 7.1, pero no puedo usar el driver de ATI (fglrx) solo el oficial de xorg, si quiero aceleración no tengo beryl, y si tengo beryl no tengo aceleración, que cosas no :), pero ambas cosas funcionan por separado si problemas !



Spam Diabólico !!



Es o no es malo el spam ??



Seguridad de Linux explicada para novatos


Hoy vi un artículo interesante sobre la “no necesidad de usar antivirus en Linux” (aqui), y aunque me parece muy interesante, creo que hay ciertas cosas que hay que explicarles a los usuarios nuevos de linux (y además en español, que es el público al que dirijo mi blog).

Es cierto que Linux en general es seguro, pero no es completamente seguro, eso todo mundo lo debe entender, ningún sistema lo es. Por otro lado, la seguridad de Linux, y todos los Unixes y relacionados se basa en la forma de otorgar privilegios, de tal manera que un usuario no privilegiado solo puede afectarse a si mismo, o a aquellos archivos para los que otros (super)usuarios le dieron acceso, se oye bonito verdad 🙂

Volviendo al tema de antivirus, la realidad es que un usuario en red privada probablemente no debería preocuparse demasiado, normalmente va a ser muy complicado que sea atacado, ya que no tiene puertos abiertos al mundo, y solo puede ser atacado por medio de lo que baja de Internet, a través del navegador, transferencias de archivos, etc. Pero el punto clave de esta cómoda despreocupación está en que mantenga su sistema actualizado. Hablemos mas de esto.

En todo sistema, la medida mas importante de seguridad es actualizar, sabemos perfectamente que si tenemos un sistema viejo, que ya no tiene actualizaciones, seguramente en minutos vamos a ser infectados o atacados por gusanos, etc. Tal como es inseguro usar win98, porque ya no salen parches para sus múltiples hoyos, es completamente inseguro usar por ejemplo Redhat 9, o un mandrake de hace 4 años, y así nos podemos ir. Siempre hay que estar al filo de la navaja en cuanto a actualizaciones de seguridad, y la mejor manera es manteniéndonos en la ultima versión estable de la distribución que usemos.

Sobre las distribuciones, el paso de actualizar no es necesariamente trivial, ni agradable todo el tiempo. Aún distribuciones de las mas robustas llegan a ser problemáticas (Debiab, Redhat, Suse), por lo que el paso de estar al filo de la navaja (estable) frecuentemente puede no ser totalmente posible, sin embargo en general para usuarios de escritorio es menos probable enfrentar problemas. Aquí mi consejo sería usar una distribución robusta, no necesariamente popular, o no necesariamente comercial (no todo el SL es gratuito), Debian tiene un historial muy bueno, y toda actualización se dá en red, sin tener que sacar fuera de linea la máquina, pudiendo trabajar mientras tanto; Gentoo también es similar, si lo usas sabes que va a ser costoso en cuestion de tiempo, y solo de vez en cuando las actualizaciones llegan a ser problemáticas, otras distribuciones como fedora, mandrake, suse, etc, pueden ser cómodas, y fáciles de usar, pero no necesariamente 100% transparentes en las actualizaciones, y si tienes que sacarlas de linea para hacer el proceso (gran problema en mi opinión). Ubuntu es una de las nuevas populares y decentes, pero pues en general le debe mucho a ser basada en Debian, pero su juventud todavía a producido algunos dolores de cabeza en actualizaciones.

Otro punto importante, y que no cualquier usuario novato comprende es la diferencia entre experimentar con servicios (http, smtp, pop3, imap, etc) cuando estas en una red privada y cuando estas en una publica. La regla de oro es aprender a usar alguna herramienta para administrar iptables (firewall) antes que nada, de tal manera que sepas por lo menos con la ayuda de una aplicación gráfica (guardog, kmyfirewall, etc) mantener tus puertos cerrados al mundo, y solo abrir aquellos que DE VERDAD necesitas o quieres abrir. Esto no es gran problema en red privada, porque a menos que estemos en un ambiente de trabajo bastante hostil, o totalmente desprotegido 🙂

En resumen, el poder es peligroso, windows por default abre cosas que no debería y es inseguro por ello, pero Linux puede ser convertido en algo parecido rápidamente (Redhat lo aprendió de la manera dura por la versión 7.0) si nos ponemos a instalar servicios a diestra y siniestra sin empezar por implementar un sistema de actualizaciones automáticas, y por lo menos cerrar los puertos innecesarios de nuestra máquina con iptables.

Lo mejor es tener a alguien que nos aconseje, y que pueda detectar nuestros errores, y sobre todo, un p…dejo con iniciativa siempre es peligroso, así que hay que evitar convertirnos en uno 🙂



1 año de trabajo !


Hoy cumplo 1 año en mi actual chamba :), en realidad entre el día 5 creo, recuerdo que no pude entrar el 1o pq no tenía mucha lana para aventarme los 3 dias de viaje, y tuve que esperarme a la paga semanal en tmz 🙂 (que recuerdos !)

En este año he aprendido bastante, sobre todo a dar servicio, no solo mantenerlos para mi :), y hasta empecé el 2007 con oficina nueva, como siempre tengo todo desordenado, y creo que así va a seguir.

Veremos si tengo lo que se necesita para terminar un segundo año en el cide 🙂



Consol: Dia 2


El día empezó con unas buenas gordias en el metro universidad 😛

Y pasamos a platicas, primero una de como usan SL en analisis ambienta.

La segunda estuvo chida, era sobre honeynet, y estuvimos platicando un ratillo con Hugo Gonzalez al salir de la platica.

Luego estaba una platica de blender, pero pues el celular me saco y me puse a platicar con Hugo y los que estaban con el, incluido el chiapaneko !

Y ahorita estamos viendo una platiquita de computo cientifico con un cuate de Harvard, y nos habla principalmente de python…

Al raton voy a dar mi platica de redes y monitoreo con Debia, espero que me vaya bien !!



Consol: Dia 1


Empezamos el dia bastante bien, con una platica de Alvaro López sobre como han ido desarrollando cherokee, y sus nuevas características para la version 0.6, de hecho dió el anuncion de la primera beta de la versión 0.6 que será liberada el 1 de marzo.

Luego pasamos a ver una platica de computo científico, que en general hablaba de las posibilidades que existen en el software libre para hacer computo paralelo (mpi, mpich, openMP, open mosix).

Y ahorita despues de una hamburguesa estamos esperando a que nos pasen el archivo de blender para empezar el taller de animación, 🙂 se me hizo entrar

Más tarde la actualización de como me fué en el taller

Pues estuvo chido, realmente me sirvio para acordarme de los comandos basicos, pero la verdad me abrieron los ojos un poco mas sobre la maravilla de blender..

Hasta mañana



Semana divertida


Esta semana empieza y termina el consol 2007, andaré por ahí los 4 dias (martes a jueves), y el miercoles estaré dando mi platica de administración de red con Debian, luego publicaré la presentacion, primero necesito terminarla 🙂

También andarán mis excompañeros de trabajo Ivan y Beto con un par de talleres sobre desarrollo web.

Espero que este divertido el asunto, y espero ver algunas caras conocidas por allá…

Nos vemos mañana a las 10 en la fac de ing. de la UNAM !!



django: Todo hecho fácil


Django es la neta del planeta para mi 🙂

Lo conocí gracias a un comentario del “buena voz mother fucker” hace unos meses, y como python es mi lenguaje favorito cuando se trata de aprender algo nuevo, pues inmediatamente me puse a checar ese nuevo “framework” y en cuestión de horas estaba totalmente enamorado :P.

Cuando se trata de programar en Python, simplemente no soy bueno, durante un par de años he hecho cosas sencillas, incluso con Glade y GTK, y recuerdo cuando estaba en tmz que me avente un “servidor de chat” muy simple, que tiempos aquellos, pero simplemente no soy muy productivo escribiendo Python, así que a veces me toma muchas horas hacer algo sencillo, de hecho luego sacando cuentas el numero de lineas por hora que escribo llega a ser muy cercano a 1 !! pero siempre quedo contento porque a pesar de terminar con muy pocas lineas, siempre logro tener algo que, al menos para mi, se ve muy elegante, y hace exactamente lo que quiero.

Y volviendo a Django, simplemente es asombroso lo que se puede hacer con tan poco conocimiento, voy a exponer unas cuantas lineas de un sistema pqueño que estoy haciendo para guardar datos de usuarios en la red, es realmente simple, pero preferí hacerlo en Python/Django que en PHP que es mi lenguaje más productivo en general (para web casi exclusivamente), y la razón de la elección fué que Django me permite hacer trivialmente varias tareas: autenticación, localización (traducción), separación MVC (al estilo Django, pero muy elegante), portabilidad en la base de datos, uso de plantillas, URL bonitos, y como dicen en su sitio, “no me repito”, o sea, las cosas se hacen de la mejor manera para que sea trivial reproducirlas cuantas veces sea necesario sin mucho código (one-liners seria la “palabra correcta”), y además de todo me crea un panel de control en el que puedo editar datos a placer.

Como antecedente, me tomo unas 4 a 6 horas hacer lo que voy a escribir aqui, y este es el resumen de programación:
Lineas Archivo (wc -l)
10 urls.py
37 base/models.py
8 base/urls.py
40 base/views.py
95 total

en las plantillas tengo mas de 130 lineas, pero pues ni vale la pena contar eso porque el gaste de HTML puede ser arbitrario, depende de cuando diseño le quieras meter, y que tan hábil seas para hacerlo de manera elegante.

En realidad esta no es la aplicación terminada, solo hice un ejemplo que necesito para reproducirlo para todas las tablas que sean necesarias, este ejemplo es un listado paginado, con soporte de todo lo que dije arriba.

No quiero irme sobre todos los detalles de la configuración (settings.py) de la aplicación, simplemente voy a remitirme a la parte del listado paginado.

en una “sub aplicación” de la aplicación principal tengo este url.py:


from django.conf.urls.defaults import *
from iplist.base import models, views

urlpatterns = patterns('',
(r'^$', 'iplist.base.views.myview'),
(r'^view/$', views.object_list, {'model': models.People}),
)

Lo que hace es definir 2 listados parecidos, el segundo por medio de las vistas genéricas que proporciona Django (generic.views), ambos paginan, pero el segundo es realmente elegante y portable, mientras que el primero es una vista a una sola tabla en particular.

Este es el archivo view.py, que contiene las 2 vistas en cuestion:


from django.template import Context, loader
from django.contrib.auth.decorators import login_required
from iplist.base.models import People
from django.core.paginator import ObjectPaginator, InvalidPage

from django.http import HttpResponse, HttpResponseRedirect
from django.views.generic import list_detail

@login_required
def myview(request):
people_list = ObjectPaginator(People.objects.all().order_by('name'), 3)
t = loader.get_template('base/list.html')
try:
page = int(request.GET.get('page'));
except:
page = 0
print page, people_list.pages
if (page < people_list.pages ):
c = Context({
'people_list': people_list.get_page(page),
'page': page,
'has_next': people_list.has_next_page(page),
'has_prev': people_list.has_previous_page(page),
'next_page': page+1 ,
'prev_page': page-1 ,
'paginator': people_list,
})
return HttpResponse(t.render(c))
else:
return HttpResponseRedirect('/list/')

@login_required
def object_list(request, model):
try:
return list_detail.object_list(
request,
queryset = model.objects.all().order_by('name'),
template_name = 'base/%s_list.html' % model.__name__.lower(),
paginate_by = 3,
)
except:
return HttpResponseRedirect('/list/view')

Las primeras lineas de “import” son necesarias para la vista de la tabla People paginada, los ultimos 2 “import”s son los que se necesitan para la vista genérica, de hecho el último contiene 2 funciones necesaria para la primera vista, y otra para la segunda, y la linea que importa login_required se usa en los 2 (5 contra 3 imports!).

En la primera vista usamos la herramienta de paginación de Django, y seleccionamos una tabla sobre la cual vamos a iterar en la plantilla, después tenemos que tomar la plantilla y alimentarla con los datos necesarios. Aquí un detalle importante, las plantillas no pueden accesar a métodos, solo accesan valores, arreglos, etc, por lo que es necesario alimentar bastante, en ves de por ejemplo pasar el objeto people_list con todas sus capacidades.

La segunda vista/clase/funcion/como-quieras-llamarle toma el parametro “page” automáticamente de GET, pagina, y manda los parámetros relevantes a la plantilla (pagina proxima, numero total de paginas, de registros, etc) con solo agregar “paginate_by” a la funcion list_detail.object_list.

NOTA: la linea precediendo a cada función hace necesario estar logueado con un usuario para ver la vista, las tablas y sistema de autenticacion los creo Django por mi, si quieres tener una forma de logueo solo creas una plantilla básica y agregas una linea a url.py y listo ! todo lo demás Django lo hace sin ayuda 🙂

De tal manera que esta plantilla (templates/base/people_list.html) hace todo lo que se esperaría de una lista paginada:


{% load i18n %}
{% extends "base.html" %}

{% block title %}{% trans "Generic List" %}{% endblock %}

{% block content %}
{% for entry in object_list %}
<div style="border:1px solid black;">
<h1>{{ entry.name }}</h1>
<p>{{ entry.comments }} ({{ entry.department }})</p>
</div>
{% endfor %}
{% if has_previous %}
<a href="?page={{ previous }}">&lt;</a>
{% else %}
{% trans "No Previous Page" %}
{% endif %}
|
{% if has_next %}
<a href="?page={{ next }}">&gt;</a>
{% else %}
{%trans "No More Pages" %}
{% endif %}
<br />
{% endblock %}

a través del segundo patrón en el url.py que puse arriba, y si notan todos los textos están marcados para traducción (notar la primera linea, es importante que sea así), pero para no hacer el cuento muy largo eso lo dejo para otro post (si es que lo llego a hacer :P).

Y dejo aquí la plantilla de la vista “no genérica”:


{% load i18n %}

{% extends "base.html" %}

{% block title %}{% trans "Another Testing Template" %}{% endblock %}

{% block content %}
{% for entry in people_list %}
<div style="border='1px';">
<h2>{{ entry.name }}</h2>
<p>{{ entry.comments }}</p>
</div>
{% endfor %}
{% if has_prev %}
<a href="?page={{ prev_page }}">&lt;</a>
{% else %}
{% trans "No Previous Page" %}
{% endif %}
|
{% if has_next %}
<a href="?page={{ next_page }}">&gt;</a>
{% else %}
{%trans "No More Pages" %}
{% endif %}
{% endblock %}

En conclusión, podemos lograr en 11 lineas de programación tener una función que nos pagina, y protege con autenticación el listado de cualquier tabla, ya que el nombre de la tabla lo mandamos a través de un parámetro en una linea de url.py, de tal manera que podemos hacer cuantos querramos y reutilizar la misma vista, y al final solo tenemos que crear plantillas personalizadas para cada vista, ya que cada tabla tienen campos diferentes, o no ?? 🙂

O en otras palabras, copias una linea en url.py, le cambias lo esencial, y copias la plantilla y haces lo mismo, igual y quieres un diseño totalmente diferente para cada listado :), y es todo, volvemos aún mas aburrido el trabajo del desarrollador web ! y le ahorramos un buen de tiempo, ni siquiera tiene que aprender struts !!

Hasta la proxima

P.D. Notaron la elegancia de la validación para page ?? es o no bonito Python ??



kqemu


En un mundo listo para aceptar y abrazar la virtualizacion, kqemu ha sido liberado con GPL!

QEMU es una herramienta tipo vmware, que simplemente funciona magnificamente, pero nunca ha logrado ser tan rapida como vmware, yo nunca he usado kqemu pq no era libre, pero ahora estoy en camino de instalarlo 🙂

Por si alguno ha estado escondido el ultimo año, si no sabes de virtualización en esta época simplemente no eres nadie en el ambiente de administracion de sistemas/servidores/redes/etc, ahora todo esta orientado a virtualizacion y almacenamiento remoto (san, nas, etc), así que los que aspiren a ser muy chidos tienen una tarea extra para los pocos tiempos libres que les queden 🙂