Archivos de la categoría ‘programación’

Python Basics (II)

Noviembre 21, 2007

 

La Función range()Aunque ya vimos en el post Python Basics (I) la aplicación básica de la función range() en el ejemplo:

for i in range(1,3):

print(i)


Quiero explicar que podemos hacer muchas más cosas con ésta función. Por ejemplo: ¿cómo recorreríais un array cogiendo sólo los valores en posiciones pares? es decir: pongamos que tenemos un array de 10 elementos y queremos pillar sólo los elementos en las posiciones 0,2,4,6 y 8 (recordemos que en python, como en muchos otros lenguajes, los arrays empiezan en 0). Si, consideramos la posición 0 para que el ejemplo sea más sencillo.

La forma de hacerlo si sólo conocemos el uso de range() del ejemplo anterior sería algo como ésto:

for i in range(len(mi_array)):

if par(i):

print mi_array[i]

Peeeero, si sabemos utilizar bien la función range() podemos hacerlo así:

for i in range(0,len(mi_array),2):

print i

Y obtendremos el mismo resultado: los valores de las posiciones pares del array.

La explicación viene porque al llamar a range() así: range(valor_1, valor_2, valor_3) lo que le estamos diciendo es: “recorre mi_array desde la posición valor_1 hasta la posición valor_2 incrementando en vez de en 1, en valor_3″. En nuestro caso particular: “recorre mi_array desde la posición 0 hasta la posición longitud_de_mi_array incrementando de dos en dos el valor de i”.

La verdad es que no es nada del otro mundo, pero me ha llamado la atención y me parece bastante útil para según que casos.

SLOCCount

Octubre 3, 2007

Ésta aplicación la había visto hace tiempo y la había dejado aparcada hasta que tuviera un momento para hacer un post y creo que de hoy no pasa ;)

SLOCCount viende de contar SLOC… ¿? ….  y eso de SLOC que es? Yo también pensé lo mismo cuando lo vi, viene de ésto: Source Lines Of Code, es decir Líneas De Código Fuente (en español es un poco más ilegible con las siglas xD).

Bien, aclarado ésto, ya todos tenéis una idea de lo que hace éste programita. Nosotros sólo tenemos que indicarle un directorio que contenga código fuente y él contará las líneas “físicas” de código fuente y estimará, siguiente el modelo COCOMO el coste que conllevaría el desarrollo de ese software en personal y tiempo. Los parámetros son variables ya que, por defecto, a los programadores les asigna un sueldo impensable en España xD (me rio por no llorar, eh?)

Instalar la aplicación es realmente sencillo, se encuentra en los repositorios de ubuntu, así que con…

sudo aptitude install sloccount

estamos listos. Para utilizarlo sólo tenemos que llamarlo de la siguiente forma:

sloccount /ruta_al_directorio_con_código

y no os preocupéis por los subdirectorios, busca automáticamente dentro de ellos.

Yo para probarlo le he pasado mi carpeta workspace (que es donde guardo lo que voy picando ultimamente) y los resultados me han gustado xD: tengo unas 130.326 líneas de código ahora mismo, el tiempo estimado de desarrollo sería de poco más de 2 meses teniendo 16-17 desarrolladores y el coste de desarrollo habría sido de 4 millones y medio de dólares!?!?!?!??? Vale, ya os he dicho que el sueldo que asigna por defecto a los programadores es un sueldo cojonudo: 56.286$ al mes (más de medio kilo/3000€ al mes) ya nos gustaría ver eso en España! aquí habríamos cogido a 10 becarios y que tarden 3 meses en vez de dos xD

Pero bueno, la verdad es que es interesante ver éstos resultados y más de cara a hacer el PFC (proyecto de fin de carrera) éste año.

Por cierto, la lista de lenguajes soportados, así como más información sobre la aplicación y su desarrollador la podéis encontrar aquí.

Fuente: MundoGeek

Python Basics (I)

Octubre 2, 2007

Como comenté hace un tiempecillo, estamos aprendiendo python en la universidad. Al ver que el nivel con el que hemos empezado no es para nada básico, hilos y sockets, he decidido aprender un poco del lenguaje por mi cuenta porque me ha parecido bastante rápido (teniendo en cuenta que es interpretado) y sencillo a la par de potente.

Haré unos cuantos posts que tendrán como título Python Basics, en los que iré comentando cosas básicas del lenguaje. Hoy por ejemplo me voy a centrar en las sentencias de control de flujo (los if … then … else de toda la vida y los bucles for y while).

En el manual que estoy siguiendo, bastante simplón pero es lo que más me gusta para empezar a tocar un lenguaje sólo contemplan 3 estructuras de control de flujo: if, for y while. Vamos con ellos:

Condiciones if:

La sintaxis es bastante sencilla:

if condicion:

    sentencia

elif:

    sentencia

else:

    sentencia

¿Sencillo verdad? Quizás debería haber comentado en un primer post que python no usa llaves ni ningún carácter para delimitar las funciones o los bloques de código (aunque éste ejemplo nos viene de puta madre)… los distingue por la tabulación. Puede parecer un poco más lioso pero se consigue que se tenga un código mucho más legible en el sentido de las estructuras.

Bucles for:

La sintaxis no es para nada más compleja que lo anterior:

for variable in secuencia:

    sentencia

¿Que narices es eso de sencuencia? También me lo he preguntado yo y he visto que python nos permite hacer cosas como éstas:

Un bucle sencillo sería de éste pelo:

for i in range(1, 3):

print i

Que nos daría como salida: 1,2 y 3 en líneas separadas. Pero disfrutamos también de la ventaja de hacer cosas como ésta:

coordenada = [(1, 1), (1, 2), (1, 3), (1, 4)]

for x,y in coordenada:

print x,y

Que nos daría como salida: 1 1, 1 2, 1 3 y 1 4 en líneas separadas. Mola ¿eh? No tenemos que acceder al array para sacar los elementos sino que iteramos directamente sobre él de una forma MUY sencilla. Debéis saber que ésto de recoger dos variables no es sólo en éste tipo de bucles ya que en python podemos llamar a funciones que devuelven dos valores de ésta forma:

a, b = funcionDoble()

y tendremos en a y en b cada uno de los valores que devuelve. Muy cómodo también.

Bucles while:

La sintaxis, más sencilla todavía que en el tipo anterior de bucles:

while condicion:

    sentencia

Muy, muy fácil. Si queremos que en alguna comprobación dentro del bucle se rompa éste (por ejemplo para romper un while True o algún bucle largo por eficiencia) podemos usar la sentencia break que hará que salgamos del bucle inmediatamente. Ya sabéis en la universidad siempre enseñan que esas cosas no deben hacerse, pero yo soy de la opinión de que si realmente sabes lo que haces debes poder usar todas las ventajas que te ofrece el lenguaje que uses. ¿o acaso la sobrecarga de operadores de C++ que no disfrutamos en Java por motivos de seguridad es una desventaja? ;)

Bueno, hasta aquí éste primer post sobre conceptos básicos de python. En el siguiente, que planeo escribir mañana, me meteré con la definición de funciones y, posiblemente, con la definición de clases porque me parece que ambas cosas van muy liagadas. La diferencia entre un método y una función es realmente meramente teórica en la mayoría de los lenguajes.

Espero que os sea útil para los que estéis pensando en empezar con éste lenguaje y os anime un poco al ver lo realmente sencillo que es, un saludo a todos :D

PyDev = Python + Eclipse

Septiembre 26, 2007

Python era uno de los lenguajes que tenía en cola esperando tener algo de tiempo para toquetear, pero al final me han dado la oportunidad perfecta porque en la universidad vamos a trabajar con python para la asignatura de Programación Concurrente y Distribuida, así que…manos a la obra.De momento poco os puedo comentar sobre el lenguaje porque todavía no he tirado una sóla línea, lo que si os puedo comentar es cómo montaros un bonito IDE para trabajar con python. La solución pasa por añadir a Eclipse los complementos para trabajar con éste lenguaje, con muy poco esfuerzo (la primera o segunda entrada de google) encuentro PyDev, que vienen a cumplir perfectamente las espectativas. Vamos con lo que necesitamos para poder instalar PyDev:

  • Eclipse 3.3
  • Python 2.3.x o 2.4.x
  • Java 1.4 o superior

En los repositorios de Ubuntu, la versión disponible ahora mismo de Eclipse es la 3.2.2, que a priori no nos vale, así que lo mejor será bajar la última versión de su sitio web e instalarlo de forma manual (hay miles de tutoriales por ahí). Para python si que tenemos paquetes en los repositorios, hasta 3 versiones diferentes: 2.3, 2.4 y 2.5. Si habéis instalado algo que use python seguramente tendréis ya instalada la versión 2.4, sino podéis instalarla así:

sudo aptitude install python2.4

Para Java en los repositos tenemos las versiones 5 y 6 (que vienen a ser 1.5 y 1.6) de Sun, así que tampoco habrá problemas. Para instalarlo (que seguramente lo tendréis todos ya) sería tal que así:

sudo aptitude install sun-java6-jdk

Después de ésto ya tenemos todo el sistema listo para instalar PyDev, que viene a ser algo tan sencillo o incluso más que lo anterior. Tenemos dos opciones para hacer la instalación: bajarnos el paquete e instalarlo a mano (mucho más coñazo) o instalarlo a través del Eclipse Update Manager (mucho más sencillo porque casi no tenemos que hacer nada). Yo me decanto por la segunda opción, vosotros? ;)

Vamos a ello, como podemos ver en la sección de download de PyDev, la dirección del servidor que usaremos para instalarlo desde Eclipse es la siguiente:

http://pydev.sourceforge.net/updates/

Nos copiamos esa dirección a la voz de ya y arrancamos Eclipse… … … tarda un poco si … …

Vale, ahora en los menús vamos a Help -> Software Updates -> Find and Install… Os aparecerá una ventana donde viene una lista de sitios remotos en los que Eclipse buscará nuevo software, añadimos el de PyDev pinchando en el botón Add Remote Site… le damos un nombre, por ejemplo PyDev, y pegamos la dirección debajo. Si queréis instalar todo lo que incluye PyDev marcad también el Europa Discovery Site y pulsad en Finish. Ahora Eclipse va a bajarse los ficheros de índice de esos servidores, que indica el software que está disponible para descargar.

Una vez haya terminado aparecerá otra ventana con desplegables, marcad directamente el de PyDev y os dirá que os falta Mylyn (o algo parecido, no lo recuerdo bien ahora). Para encontrar Mylyn, abrid el desplegable de Europa Discovery Site y buscadlo, no tardaréis en encontrarlo, y lo marcáis, así debería desaparecer el error. Una vez seleccionado todo ésto, dadle a Next, os pedirá confirmación de que aceptáis la licencia del software, marcad que si y dadle a Finish.

A partir de aquí es mucho más automático: Eclipse se bajará los paquetes que le hemos indicado y, cuando los tenga todos, nos pedirá confirmación para instalarlos advirtiéndonos de que no están firmados por alguien de confianza, blablabla…

Aceptamos y listo, nos aconsejará que reiniciemos Eclipse, cosa que hacemos, nos aparecerá una ventana de presentación que podemos cerrar y luego, dando en el menú Window -> Open Perspective -> Others… veremos que podemos seleccionar la perspectiva de PyDev.

Por ahora, poco más, sólo un screenshot para que os hagáis a la idea de cómo es, ya comentaré algo más cuando haya trabajado con él :D

D, el lavado de cara de C++

Septiembre 18, 2007

Ya hace un tiempo que se vienen oyendo comentarios sobre el nuevo lenguaje D, todos de ellos hacen pensar que va a ser una verdadera bomba. D no es que sea un lenguaje nuevo completamente, es más bien una revisión de C++ (supongo que C+++ no quedaba demasiado bien :P) y, al parecer, hace que sea un lenguaje mucho más legible, sobretodo en cuanto a la sintaxis de punteros.

Buscando para ver algo de código, para ver si es verdad que cambia bastante, he encontrado éste sitio. Parece especialmente completo y sobretodo incluye una interesante tabla donde indican las funcionalidades de las que disfrutan otros lenguajes como C++, C# y Java y cuales de ellas tiene D. La lista es bastante larga así que acabo antes dejándoos el link a la tabla e indicando aquí cuales son las que no tiene:

  • Herencia Múltiple: Tampoco la tenía C++, muchos puristas de éste lenguaje defendían que era mejor no poder heredar de varias clases pero para mí sigue siendo un fallo. Un lenguaje debería dejarte hacer todo lo que te pudiera venir bien, tú decides si debes hacerlo así o no.
  • Carga Dinámica de Clases: Supongo que se refiere a cargar clases en tiempo de ejecución (ya os dije que no tenía mucha idea xD) y la verdad es que casí nunca lo he usado así que…no puedo decir nada.
  • Preprocesador de Macros: Otra cosa bastante avanzada que tampoco he usado mucho, vendría bien que la gente deje sus comentarios y amplie ésto con lo que pueda, así todos aprendemos algo ;)

Espero poder hacer otro post, no tardando mucho, donde  compile un programa sencillito hecho en D con algún compilador libre ;)


NetBeans será “casi” libre

Agosto 19, 2007

Según leo en barrapunto, los chicos de Sun han decidido hacer con NetBeans lo mismo que hicieron en su día con Java y cuasi-liberarlo. Dentro de poco NetBeans será licenciado bajo la GPL Linking Exception, la misma licencia que permite que actualmente tengamos el jdk (Java Development Kit) en los repositorios de ubuntu. Si, vale, netbeans aparece, pero tenemos que descargar por nuestra cuenta el paquete de su web para que la cosa funcione, con la nueva licencia ya no habrá más problemas.

La razón que han dado no es muy lógica (como citan en la noticia de barrapunto) ya que han dicho que: “lo último que necesitamos son más licencias que hagan que los programadores se tengan que hacer abogados si quieren utilizar dos productos juntos.” Me supongo que dicen eso porque la GPL Linking Exception ya la han usado antes, sino lo más lógico sería pasarla a GPL.

A pesar de que hay varios comentarios en contra, me parece un gran adelanto. Además, mi editor favorito sigue siendo Eclipse, aunque para hacer interfaces gráficos sigo llevándome mis clases editadas con eclipse a NetBeans porque el editor que incorpora sigue siendo mucho más ligero que el plugin Visual Editor que hay disponible para Eclipse.

Ahora sólo nos falta un C++ Builder que sea libre y permita trabajar con gtk. No, no me gusta glade, prefiero el “arrastra y suelta donde te de la gana” antes que los contenedores.

Gráficas en Ruby

Agosto 12, 2007

Hace tiempo que no toco nada de Ruby, básicamente desde que dejé de trabajar en la empresa en la que estaba antes, pero sigo recopilando recetas que me parecen sencillas y útiles para tenerlas a mano cuando me hagan falta.

La que he encontrado hoy en mundogeek es una de ellas, un par de líneas de código permiten generar una imagen con gráficas estadísticas muy vistosas. Imprescindible.

El código fuente de ejemplo es éste:

#!/usr/bin/ruby

require ‘rubygems’
require ‘gruff’

g = Gruff::Line.new
g.title = “Mi gráfica de prueba”

g.data(”Java”, [24, 25, 18])
g.data(”C”, [17.5, 17, 16.5])
g.data(”PHP”, [4, 3.5, 9.5])
g.data(”Python”, [1, 6.5, 2.5])

g.labels = {0 => ‘2003′, 1 => ‘2004′, 2 => ‘2005′}

g.write(’prueba.png’)

Si os habéis fijado habréis visto que necesita una “gema” que, para los no iniciados en ruby, viene a ser lo mismo que una libreria. La que necesitamos se llama gruff y gracias al comodísimo sistema de gemas de ruby (funciona de la misma manera que el aptitude de ubuntu o el apt-get de debian) podemos instalarla así:

sudo gem install gruff

Una vez hecho eso podemos ejecutar el ejemplo así:

ruby ejemplo.rb

lo que nos generará una imagen png como ésta que os dejará asombrados :D