helloWorld.psp

Llevaba tiempo tratando de realizar una primera incursión en Python para web. Había leído sobre django, web.py, pylons etc…. pero al ojear la documentación no me quedaba nada claro. La razon será que estoy demasiado acostumbrado a ASP y algo de PHP y el hecho de ver algo del tipo

import web

urls = ("/.*", "hello")
app = web.application(urls, globals())

class hello:
    def GET(self):
        return 'Hello, world!'

if __name__ == "__main__":
    app.run()

pues como que no me inspiraba demasiado, y menos después de llevar un tiempo haciendo algunos algoritmos en python y sintiéndome encantado con la simplicidad del lenguaje, y lo intuitivo que resulta, además de lo limpio que queda el código.

Así pues, seguí buscando pues no me cuadraba que tan solo se pudiese programar en web de estas maneras y finalmente di con PSP, Python Server Pages, del cual apenas he encontrado información en español.

¿Que puedo decir?

Lo primero que me llamó la atención fué la apertura y cierre del scripting:

 <%= 'Hola mundo psp' %>

Y ya tenemos nuestra primera pagina index.psp

¿Pero, cómo? Si es igual que ASP!
¿Pues mejor, no?  De algo nos tiene que servir conocer otros lenguajes!

Lo segundo, como no todo el monte es orégano, pues python tampoco es perfecto, pues uno de sus puntos atractivos, la obligatoriedad de identar el código, se vuelve un pelin oscuro a la hora de escribir paginas .psp , y es que si bien no es necesario indicar de una nueva manera cómo empieza un bucle, si que hay que avisar al interprete cuando finaliza, pues corremos el riesgo de que media pagina quede absorbida dentro del iterador.

Se puede realizar dejando una linea en blanco, asegurandose de que no existe tabulacion, pero además, para facilitar su comprension se puede indicar con un comentario, algo que realmente nunca viene mal:

<html>
<body>
<%
for i in range(10):
%><!-- En esta linea no hace falta tabular pues encuentra el cierre del script
y sobre entiende que el codigo debajo quedara dentro del iterador -->
<p>
<%= i %>
</p>
<%
	for j in range(10):
		req.write('hello <br>')
		# La linea inmediatamente superior equivale a:
		# ASP --> Response.write "hello"
		# PHP --> echo "hello";

# Estas ultimas lineas no son  necesarias si aseguramos
# de que no existe tabulacion
# pero nunca vienen mal para facilitar la comprension del codigo
%>
</body>
</html>

Esto es todo para una primera aproximacion, debajo os dejo un enlace al codigo de arriba resaltado utilizando la web de pastebin.com, la verdad que muy util.

En breve mas cosas sobre este interesante juguete llamdo psp! 😉

Anuncios
Publicado en .psp, Programación, Python, web | Deja un comentario

Matemáticas

Hoy, mientras desayunaba mi padre ha aparecido de la nada para hacerme una inquietante pregunta:

Entonces, ¿ahora sabes más matemáticas?

Presuponiendo que , antes, ya sabia algo de esta noble materia.

Publicado en El, Mañana | 2 comentarios

Intentos

Tan sólo se puede catalogar a un ignorante desde una posición ausente de ignorancia, hablando de una ignorancia concreta ya que, en un plano general, todos somos bastante ignorantes.Pero si afirmamos que los inteligentes, digamos aquellos que gozan de una no-ignorancia concreta, están llenos de dudas, podríamos decir que no tienen la suficiente autoridad para poder afirmar quien es o deja de ser ignorante, pues incluso ellos podrían serlo para sí mismos. Lo cual nos conduce a la célebre frase que sintetiza una parte la doctrina filosófica de Sócrates.¿Entonces, si tan sólo sé que no sé, como puedo distinguir a los ignorantes que se ocultan tras el velo de falacias y sofismos?Sócrates mismo nos da la respuesta a este enigma, sentando así las bases para el inicio del conocimiento teórico. Saber que no sé, precede a un conocimiento, implicito, que todo aquel que cree saber ni tan siquiera a comenzado a vislumbrar.

Publicado en Añoranza, Intentos | Deja un comentario

Recuperar contenido de un textarea asociado a TinyMCE

Se nota que cuando estoy muy ocupado dejo de lado las discusiones con mi padre, eso no quita que actualice con contenidos mas o menos interesantes, según voy ¿avanzando? en diferentes lenguajes de programación, sea pues:

Nos podemos encontrar en el caso de querer recuperar el valor de un textarea que previamente hemos asociado al editor wysiwyg TinyMCE, mediante alguna instrucción javascript, como podría ser, a la hora de validar un formulario.

Pues bien, si lo hacemos directamente con la instrucciones conocidas tales como:

var contenido=document.getElementById("nombreTextarea").value;

no nos recuperará ningún valor, pues parece ser que el contenido del textarea es nulo justo hasta el momento de pulsar el boton submit del formulario, en el momento en que el editor TinyMCE vuelca el contenido dentro del textarea.

Bien, atascado en esta situación me he puesto a googlear y he encontrado un foro en el que indicaban la respuesta, que al parecer se encuentra en la documentación del mismo editor.

tinyMCE.triggerSave();

El propio editor tiene una función preparada para volcar la información en el textarea. Por lo tanto tan solo tendremos que llamarla en el momento que queramos recuperar el contenido actual. Por ejemplo:

if (tinyMCE) tinyMCE.triggerSave(); 
if (formulari.contenido.value==''){
		alert('El contenido no puede estar en blanco.');
		formulari.contenido.focus();
		return false;
	}

Hasta pronto!

Publicado en Javascript, Programación, TinyMCE | 6 comentarios

Comprobar NIF con Python

Este es una pequeña función que nos permitirá comprobar si un NIF introducido es correcto. Se sabe que para comprobar el nif hay que realizar una división entre el numero DNI y 23 y comparar el resto con una tabla formada por letras.

Si habeis programado antes en web seguro que lo habréis visto tanto en Javascript como en PHP. Este pequeño ejemplo está realizado en Python:

def nif():
	import string # no necesario
	tabla = "TRWAGMYFPDXBNJZSQVHLCKE"
	numeros = "1234567890"
	nif = raw_input("Introduzca el NIF: ")
	respuesta = "No ha introducido un NIF valido"
	if (len(nif) == 9):
		letraControl = nif[8].upper()
		dni = nif[:8]
		if ( len(dni) == len( [n for n in dni if n in numeros] ) ):
			if tabla[int(dni)%23] == letraControl:
				respuesta="El NIF introducido es correcto"
	print respuesta

Desgranemos un poco el asunto
Primero declaramos la función e importamos la clase string (No es necesario)

def nif():
	import string #no necesario

Luego añadimos la tabla de letras y una con todos los numeros para poder comparar los datos introducidos (sin incluir la I, tal y comenta Manuel en el primer comentario):

##tabla="TRWAGMYFPDXBIJZSQVHLCKE"
tabla="TRWAGMYFPDXBNJZSQVHLCKE"
números="1234567890"

Pediremos que introduzcan el nif y declararemos la respuesta negativa, por defecto:

nif = raw_input("Introduzca el NIF: ")
respuesta = "No ha introducido un NIF valido"

Ahora viene el meollo:
Comprobaremos que el NIF introducido tiene 9 caracteres.

if (len(nif) == 9):

Acto seguido, separaremos la letra (pasándola a mayúscula) en la variable letraControl y los dígitos los guardaremos en la variable dni. Ambas serán del tipo String, ya que provienen de otro String

letraControl = nif[8].upper()
dni = nif[:8]

En esta parte comprobaremos que cada dígito del String dni  es igual a algún otro dígito del String llamado números (que habíamos declarado al inicio).
Puede resultar un poco liosa pero con este método consigues incluir en una sola linea dos If y un For. Trabaja de la siguiente manera: Compara si la longitud del string dni es igual al numero de n’s en dni que están dentro del string números, donde cada n es un dígito del string dni.

if ( len(dni) == len( [n for n in dni if n in numeros] ) ):

Por ultimo comprobaremos si la letra que hemos separado coincide con la de la formula antes mencionada, y si es así, cambiaremos la respuesta negativa por una positiva.

if tabla[int(dni)%23] == letraControl:
	respuesta="El NIF introducido es correcto"

Ahora tan solo queda mostrar la respuesta por pantalla

print respuesta

Evidentemente, si en algún momentos no se cumple cualquiera de los tres condicionales, es que el Nif introducido no sera correcto.

Volveré pronto con mas y mejor!

Publicado en Programación, Python | 4 comentarios

Recursividad

¿Qué es? He de admitir que ando un poco vago con este concepto, lo poco que se, o que tengo claro es que es una función que se llama a si misma. Muy bien.
El otro día me pare a pensar, tras un ejemplo visto en clase, y me parecio entender que es una forma de programar evitable, así como el uso del break y del continue.

Y es que andaba yo programando en Python, algo que cada día aprecio mas, y me encontré en una disyuntiva por mi afán de generar un código eficiente, y mi una solución parecía ser la llamada a un continue dentro de un bucle while. Claro, nunca antes lo había utilizado así que tras informarme bien, me pareció entender que su uso se debe restringir a situaciones en el que no sea posible evitarlo, y al tenerlo tan claro, observe que yo si lo podía evitar. Tan solo eran necesarios unos cuantos retoques en el código.

Así que analizando casos de funciones recursivas, bastante básicos, he llegado a la conclusión de que si el único merito de estas es llamarse a sí mismas hasta que se cumpla una condición, estas, podrán ser sustituidas por alguna instrucción iterativa, por lo menos en niveles de baja complejidad. Por favor, que alguien me corrija si me equivoco!

Y aqui tenemos un ejemplo bastante basico:
Disponemos de un vector con unos nombres y queremos mostrarlos por pantalla

nombres=['Juan','Claudio','Inaki','Alberto']

La función llamada iterativa se compone por un bucle while del cual no saldra hasta que i
sea  igual a la longitud del vector llamado nombres, e irá imprimiendo los valores que se vayan encontrando en la posición i del vector:

def iterativa(nombres):
	i=0
	while not i==len(nombres):
		print nombres[i]
		i=i+1

La función llamada recursiva generará un vector igual al que recibe, para no modificarlo, y eliminara el primer elemento del nuevo vector justo después de mostrarlo,(esto se consigue con la función pop(), que por defecto muestra y elimina el ultimo, pero podemos indicarle la posición  del indice para adecuarlo a nuestras necesidades). Inmediatamente después comprobara si la longitud del nuevo vector es igual a 0 y si no es así se llamará a sí misma, pero esta vez con un vector que tendrá una posición menos, y así hasta que el numero de posiciones sea cero.

def recursiva(nombres):
	nombresCopia=nombres[:]
	print nombresCopia.pop(0)
	if (len(nombresCopia)>0):
		recursiva(nombresCopia)

Observamos que ya la segunda llamada se realiza con el nuevo vector, y que este se sobre-escribe luego a sí mismo.

Un apunte. Este paso que muestro debajo, realiza una copia del vector nombres y todos sus elementos en el vector nombresCopia

nombresCopia=nombre[:]

Si no lo hiciésemos así, Python, tan sólo nos crearía un enlace llamado nombresCopia a la misma posición de memoria que ocupa el vector llamado nombres. Por lo tanto, cualquier cambio sobre el vector nombresCopia se vería reflejado en el vector nombres, ya que el contenido de ambos proviene de la misma posición de memoria, que equivale a ser el mismo vector con dos enlaces de llamada diferentes.

Hemos visto la manera de sustituir una instrucción iterativa mediante una función recursiva, y viceversa. Sería interesante tratar de encontrar algún método de los dos que no permitiese el cambio al otro, o que resultase lo suficiente complejo como para evitarlo.

Se admiten discusiones!

Publicado en Programación, Python | Deja un comentario

Improving

Hoy, dejaremos las discusiones con mi padre a un lado y nos centraremos en algo a lo que dedico cierto tiempo diariamente, la programación.

No llevo mucho en esto, pero lo suficiente como para haber tocado un lenguaje, haberlo olvidado, y haber vuelto a el.

En esta ocasión hablaremos de Python.

He de confesar que al principio, hace prácticamente dos años, no me hizo mucha gracia, yo venia de C, el cual había sido mi primer lenguaje, y aquel me resultaba un tanto confuso ya que no entendía la obligatoriedad de tabular ni el desprecio a los punto y coma. Pero ahora, todo me parece diferente.

Después de haber tanteado Java, Visual Basic .Net, JavaScript,ASP, PHP ( he de confesar que ese ultimo me cautivó, y mas después de llevar un año trabajando bajo el lenguaje de Microsoft el cual parece ser que abandonó en Noviembre de 2000 apostando por .Net) me ha parecido que aquello que cierto día me asustó, hoy me resulta de lo mas sugerente, y me he animado a mostrar un ejemplo tras haber encontrado un post en el que se realiza cierta comparación entre este y otro llamado Ruby, otro que pinta muy bien.
La cuestión es sencilla:
Se trata de realizar una función que pida un texto y te muestre el numero de palabras que contiene.

def paraules():
55555cadena=raw_input("Introdueixi una frase: ")
55555count=0
55555for paraula in string.split(cadena):
5555555555count=count+1
55555print count, " Paraules"

Bueno, algunos ya habrán notado la inexperiencia, pero a simple vista esta seria una de las maneras mas intuitivas de realizarlo. Pero claro, poco a poco hay que empezar a conocer los diferentes lenguajes y a utilizar las herramientas que ellos mismos nos disponen para hacer la tarea de programar mucho mas sencilla.

Así que con un par de retoques, tendríamos esto:

import string
def paraules():
55555cadena=raw_input("Introdueixi una frase: ")
55555print len(string.split(cadena))

Así de simple y así de elegante.

Pronto, mas discusiones!

Publicado en Programación, Python | Deja un comentario