**kwargs siempre me sonó a WARRRRRRRRRRRRRRRRRRRRRRRRRGGGGGGGHH o algo así como lo que usaría un orco para salir al campo de guerra. De hecho, me hizo acordar al mejor recurso para construir unidades que puede tener un juego de estrategia. Y cuando hablo de juego de estrategia hablo de Warhammer 40000 (Dawn of War y sus expansiónes). Los orcos tienen el Waagh!, que viene a ser una mezcla de guerra santa, migración y violencia galáctica, como un movimiento sindical, pero con menos lucha de clases.

La cuestión es que me fuí por las ramas. Bueno.

Supongamos que, en Python,  queremos hacer un programa que sume una cantidad indeterminada de números. Claro, podemos hacer un programa rápido tipo “mientras usario no escriba BASTA hacer: suma = suma + valor_ingresado”, pero por suerte, tenemos magia pythonesca:

Veamos:

def suma(*args):

return sum(args)

Y ya está!

>>> suma(1100)
1100
>>> suma(21,2,2,3,4,5,6,7,6,6,6,6,6)
80
>>> suma (1,2,3,4,5,6,7,8,8,9,0,100231,1.2)
100285.2
>>> a = 40
>>> suma (a,a*2,a**a)
12089258196146291747061760000000000000000000000000000000000000120L
Bueno, en ese me zarpé. Pero creo que se entiende, no? No importa cuantos parámetros pasemos (siempre que no caigamos en un loop infinito), Python agarra los argumentos que le pasamos y los suma (con sum)

Otro ejemplo

>>> def saludo(*args):
…     for nombre in args:
…             print “hola, %s” % nombre

>>> saludo(u”Nicolás”, “Sergio”)
hola, Nicolás
hola, Sergio

Bellísimo! hora de ahorrar un poco de código. Ahora bien, *args creo que está explicado (y creedme, en la hay  gente que explica mucho mejor que yo), ¿Cómo es la onda con **kwargs?.

Bueno, es casi lo mismo que *args, pero se diferencian en algo muy interesante. *args solo sirve para argumentos “sueltos” (sin palabras clave o variables), como vimosen los ejemplos. O sea, tomando “saludo()”, no podría haber hecho “saludo(nombre=”tomate”)”

>>> saludo(nombre=”Tomate”)
Traceback (most recent call last):
File “<stdin>”, line 1, in <module>
TypeError: saludo() got an unexpected keyword argument ‘nombre’
Porque justamente, le estoy pasando un argumento CON NOMBRE. Acá entra en acción **kwargs (Keyword Arguments, o KWARRRRRRRRRRRRRRRGH!)

>>> def saludo(**kwargs):
…     for nombre in kwargs:
…             print u”hola %s, estás en %s” % (kwargs[nombre], nombre)

>>> saludo (n1 = “nico”, n2=”blog”, n3=”melissa”)
hola nico, estás en n1
hola blog, estás en n2
hola melissa, estás en n3

Espectacular, ¿no?

Otra joyita, de paso, es saber que kwargs y args no tienen importancia. LO VITAL son los * y los **, que determinan si vas a pasar argumentos con clave o no. Igual se recomienda que usemos args y kwargs para tener un código más legible

Un ejemplo al voleo:

>>> def otro_nombre(**pato):
…     for animal in pato:
…             print u”dentro de %s está el %s” % (animal, pato[animal])

>>> otro_nombre(caramelo=”santo”)
dentro de caramelo está el santo

claro, el santo!

Una buena lectura sobre el tema (con ejemplos más bonitos) acá

Sigo desarrollando la galería en PHP para la parte de fotografía de mi sitio, y me topé, estudiando un poco, con la necesidad de hacer Thumbnails. Para hacerlos,  encontré dos maneras

GD o ImageMagick

Antes de empezar, conviene saber si tenemos instaladas en nuestro servidor tenemos instalado alguna de las dos (o las dos) librerías. Para verificar esto,  revisamos nuestro querido  phpinfo()

<?php
phpinfo();
?>

Usando GD, por lo que pude recolectar, podemos

 
<?php
//El % del tamaño total que queremos que tenga el humbnail
$size = 0.20 // O sea: 20% del tamaño original
 
// meto el header
header('Content-type: image/jpeg');
 
// Setting the resize parameters
list($ancho, $largo) = getimagesize($file);  //justamente, getimagesize() devuelve una lista: width y height (por eso cree una lista para obtener los valores)
$mancho = $ancho * $size;
$malto = $largo * $size;  //aplico el porcentaje
//me hacen reír los nombres de variables que pongo a veces
// Creamos
$destino= imagecreatetruecolor($mancho, $malto);
$origen = imagecreatefromjpeg($file);
 
// Resizing our image to fit the canvas
imagecopyresized($destino, $origen, 0, 0, 0, 0, $mancho, $malto, $ancho, $largo);
 
imagejpeg($destino);
?>

$file tendría que ser la variable donde está el nombre del archivo de la foto. Si está en otro directorio,  tiene que venir con el path…

Ahora estoy viendo como se usa con ImageMagick. Por ahí es más fácil. Yo realmente todavía no se mucho de esto =)

EDIT:

Aca me hice una donde meto un watermarck (marca de agua, esa cosa loca que dice “Esta foto la saqué yo”

<?php
$imagen = imagecreatefromjpeg('FOTO');
Header("Content-type: image/jpeg");
$negro = imagecolorallocate($imagen, 0,0,0);
$texto = "Prueba";
imagestringup($imagen,3,2,290,$texto,$negro);
imagejpeg($imagen,'',100);
imagedestroy($imagen);
?>

FOTO sería un path hacia una foto.
Con imagestringup hacemos un texto (en VERTICAL) en el costado izquierdo de la foto (porque le pedí que sea así). en $texto está…el texto que va a aparecer en la cadena.

Estoy desarrollando la galería de fotos que quiero tener en mi página web, en al sección de fotografía. Si bien podría elegir cualquier soft desarrollado para esto, me gusta la idea de aprender (y equivocarme en el camino).

Lo primero que tuve que aprender, es a conectarme a la base de datos que tengo para las fotos (con tablas que contienen las categorías, entre otras cosas), y para eso, llegué a este código:

1
2
3
4
5
<?php
// Conecta a la base de datos
 $mysql_link = mysql_connect('HOST', 'USUARIO', 'CONTRASEÑA');
 mysql_select_db('BASE DE DATOS') or die('No se pudo conectar a la base de datos :( ');
?>

Paso a explicar algunas cosas:

HOST: Sería la dirección de el server de base de datos (MySQL en este caso. Si estás trabajando en tu propia máquina, esto debería ser “localhost”, si te conectas a un servidor remoto, tendrías que poner la dirección IP del server)

USUARIO
: El usuario que hayas especificado para usar las bases de datos. Te recomiendo crear uno específico (sin privilegios en otras cosas), para evitarte dramas

CONTRASEÑA: Auto explicativo, supongo, la contraseña escrita del usuario que usas para acceder a la db

El comando “mysql_connect” lo guardo en $mysql_link y luego paso a usar el comando “mysql_select_db“, que le paso como parámetro el nombre de la base de datos. Si no se pudo conectar, pasa a “or die” (que me resulta curioso, es tan Patria o Muerte…), tirando el mensajito de error. Otra cosa que podemos meter es la función “mysql_error()“, que muestra los detalles de la falla de conexión (viene bien para debuggear). Lo tendríamos que poner a continuación del mensajito de error tierno que puse yo)

Algo adicional para mencionar (que lo dice en la referencia en php.net) es que el mysql_select_db tiene dos parámetros (y ahí solo le pase uno). El otro (“$link_identifier“) sirve para especificar que enlace usar (enlace sería lo que hicimos en el comando anterior, cuando guardamos el mysql_connect() en el $mysql_link. Como no pusimos nada, php asume que el valor “por defecto” es la última conexión realizada (en este caso, como es la única, ni lo puse. Pero si queremos ser realmente prolijos…nunca está de más).

Si me equivoqué en algo, avisen. Yo mientras sigo programando :)

Luego de mil años, regresé. Luegode terminar la facultad, puedo dedicarme abiertamente a escribir como la gente…y programar un poco.

Hace poc, un amigo me recomendó una librería de python, feedparser, que está muy interesante (y muy fácil de usar!). Te la recomiendo si vas a trabajar con feeds / xmls.

El sitio para la descarga / documentación es este.

Lo bello en cuestión, es el código, tan sencillo y hermoso de leer…

#!/usr/bin/env/python
# -*- coding: utf-8 -*-
 
import feedparser
 
def main():
        for entry in feedparser.parse('http://criticadigital.com/herramientas/rss.php?ch=politica').entries:
                print 'Título', entry.title
                print '\n'
                print 'Link',entry.link
                print '\n'*2
if __name__ == "__main__":
	main()

Gracias a Mahadeva, por darme a conocer (y enseñarme las básicas) de esta hermosa librería

El Sábado 10 de Octubre se realizó en Santa Fe ciudad, la 1° Jornada de Videojuegos Santa Fe, donde se juntaron muchas empresas de la provincia (puedo decir que estuvo Sismo Studio de Rafaela) a comentar casos de éxito, la situación del mercado nacional/internacional y a compartir sus desarrollos.

Además, se hicieron talleres sobre tecnologías de desarrollo de videjuegos (muy interesante la charla sobre Blender!) y la presentación de la Tecnicatura en Diseño y Programación de Videojuegos, que se va a dictar en la Faculta de Ingeniería y Ciencias Hídricas, a partir del primer cuatrimestre de 2010.

Por si el lector está interesado en saber más, se puede ver la introducción que da CoDeViSa (Comunidad de Desarrolladores de Videojuegos de Santa Fe), pasate por su página que lo describen mejor que yo.  Les dejo un párrafo interesante:

Entre otros objetivos, el encuentro busca difundir los estudios de desarrollo de videojuegos  de la región y el país, afianzando la relación entre el ámbito académico y empresarial.

La verdad que eso fué muy importante.  Yo pensaba que, realmente, crear videojuegos en Argentina era algo poco rentable…y la verdad que me equivoqué. La Asociación de Desarrolladores de Videojuegos Argentina (Adva), escribe sobre esto en su FAQ. Por lo que pude preguntar a algunos empresarios, es muy interesante ver que, realmente, hay mucho trabajo para exportar. El mercado estrictamente nacional es “escaso”, y parece ser que la rentabilidad de las empresas viene de la producción que exportan al exterior.

Cuando llegué al evento, se pudo notar que superaron las expectativas de asistencia, los talleres (que tenían un cupo limitado), se llenaron enseguida, y la gente que se quedó afuera (me incluoyo),   pudo ver los talleres mediante un plasma en el sector de stands. Vamos a ver si se grabaron los talleres así pongo el link :)

El evento (por lo que pude estar), fue genial. No solo por el hecho de tratarse de Videojuegos, sinó por enterarme que, a pesar de lo que uno puede pensar, Hacer videojuegos tiene rentabilidad.

Una de las charlas a la cual asistí, Producción de Videojuegos, por Agustín Pérez Fernández, habló sobre los distintos mercados posibles que hay ahora mismo.

No voy a transcribir la charla completa (y espero poder verla colgada por Internet en algún momento), pero voy a comentar una sensación que tuve. Ciertos mercados, como el de juegos para celular, o juegos web, son muy fáciles de entrar a competir, con la desventaja de que, claro, tener mucha más competencia. Distinto es el mundo de los desarrolladores para juegos de consola, que no solo a veces la misma empresa fabricante compite con el desarrollador, sinó que las consolas especiales para “constuir” el software de tal manera que la consola lo interprete…cuestan (y MUCHO). A pesar de esto, en el mundo de la X-Box 360 es un tanto distinto, ya que solo necesitamos un software que se instala en la consola, pagar una suscripción mensual (accesible, comparandola con el precio de alguna consola para desarrollo)…. En fin, tanto conocimiento…y tan poco tiempo…

Para ir terminando este post atrasado:

Si estás pensando hacer una empresa de Videojuegos…

  • Aprovechá los créditos que te puedan dar fondos como FonSoft.
  • Elegí bien tu equipo. No busques teams gigantescos con 133120 personas, que encontraste en un foro. Grupos extensos tienden a debatir tanto, que todo se diluye…y no se toman decisiones.
  • Y hay tantas otras cosas a tener en cuenta!… Para las cuales, si estás interesado, podés preguntar y aprender en el Foro de Codevisa o el de Adva :)

En fin, una excelente movida!

Ahora, por otro lado, gente de la UNL comentó que ya hay muchos inscriptos para la carrera, lo cual va a alimentar mucho la “masa crítica” necesaria para que, con el tiempo, ideas más “complejas” (como la realización de juegos “pesados”, tanto en guión como en desarrollo), puedan realizarse. Esperemos que si! ¿Qué mejor que un juego estilo WOW del Eternauta?

Hace unos minutos termino de leer un post en el blog de Hernán Foffani, un Pythonero, y debo confesar que me enamoré del post, y como explica el (hermoso) tema de los Namespaces.  se los recomiendo a todos los interesados en este hermoso lenguaje

Para referenciarte, mirá acá.

Ahora, el post anterior era para WebMasters, para que en sus sitios pongan un buscador… pero que pasa con nosotros, aquellos que sabemos poco?

Existe una posibilidad de que, para sitios (que tengan motores de búsqueda incorporados) que no tienen ganas de hacer esto por su cuenta…es hora de que nos movamos nosotros, los holgazanes.

El proceso es más sencillo, pero cambia dependiendo el explorador que tengas actualmente (en mi caso es el Firefox, desde linux).

Principalmente, voy a hacerlo para este caso, aunque por ahí en la internes hay gente qu elo hizo para Windows (aunque no vi para Opera ni para IE).

El XML que tenemos que hacer es, mas o menos:

<SearchPlugin xmlns=”http://www.mozilla.org/2006/browser/search/”>
<ShortName>Planet Distopia</ShortName>
<Description>El Buscador del Planeta Distópico</Description>
<InputEncoding>UTF-8</InputEncoding>
<Image width=”16″ height=”16″ type=”image/x-icon”>

http://niko.kane.googlepages.com/favicon.ico

</Image>

<Url type=”application/x-suggestions+json”

method=”GET”

template=”http://suggestqueries.google.com/complete/search?output=firefox&amp;client=firefox&amp;hl=locale&amp;q={searchTerms}”/>

<Url type=”text/html” method=”GET” template=”http://planetdistopia.wordpress.com/”>
<Param name=”s” value=”{searchTerms}”/> <!– Parámetros de búsqueda –>

</Url>
<SearchForm>http://planetdistopia.wordpress.com/</SearchForm>
</SearchPlugin>

Como siempre, XML es fácil de entender, pero acá vemos dos cosas interesantes:

vemos dos tags URL.

el primero (<Url type=”application/x-suggestions+json”…), es para las SUGERENCIAS que nos van a aparecer cuando empecemos a escribir contenido (¿Cómo funciona?: Creo que, cuando escribe una palabra, este mismo xml pide una búsuqueda dentro de la lista de sugerencias de google y muestra las encontradas)

el segundo tag (<Url type=”text/html” method=”GET”…), es el de nuestro sitio. (mi blog, en este caso).

Lo interesante es la estructura.

Dentro del campo de acción del el tag URL, están los <param>. Estos están para identificar los parámetros que contiene la URL una vez iniciada la búsqueda (en el caso de mi blog, este tiene solo un parámetro, ‘s’). Debería haber uno por cada parámetro, y en el que contiene las palabras buscadas, debe contener la variable de OpenSearch “{searchTerms}

Este archivo xml lo tenemos que guardar en…bueno la carpeta que guarde los plugins de búsqueda de nuestro explorador web (en mi caso, /usr/lib/firefox-3.0.4/searchplugins, aunque también puede ser /usr/lib/mozilla-firefox/searchplugins o C:\Archivos de Programa\Mozilla Firefox\searchplugins). Damos un reboot…y ya está (o al menos para mi ya está)

Primero, si no conocés el Firefox, bajátelo (amperio) ahora, acá.

Segundo. HOLA, Tanto tiempo.

Tercero, este post está inspirado de un artículo presentado aquí.

No voy a contar las cosas que me pasaron en este tiempo, porque realmente no vale la pena (y además, este es un post sobre tecnología y demás),

Ahora, el post:

Continue reading »

Se va la….tercera?

Continue reading »

Seguimos con los ejercicios en C! Continue reading »

Interesado en mi fotografía?, pasate por mi Tumblr :-) Suffusion WordPress theme by Sayontan Sinha