miércoles, 5 de febrero de 2014

¿Por qué sigue usándose Turbo C/C++ en las escuelas?

Turbo C es un compilador creado por Borland en 1987 para el desarrollo en MS-DOS(aunque también hubo versiones para Atari y OS/2)  el cual fue reemplazado por Turbo C++ en 1990.La última versión de Turbo C++, la 3.01, en 1992, con lo que posteriormente se concentraría la empresa en su producto Borland C++ y C++ Builder.
A pesar de ser un compilador histórico, donde muchos de nosotros dimos nuestros primeros pasos en la programación en C y C++, se debe reconocer que nuestro compilador de 16bits ha pasado a la historia y su lugar es estar en una vitrina en el museo de la informática. 
Sin embargo, un gran número de escuelas, tienen como su compilador de cabezera ese viejo conocido: ¡Turbo C! No es extraño encontrarnos hoy en día, en diversos foros de programación código que usa las viejas bibliotecas.
¿Me pueden ayudar con este código? ... y se lee: gotoxy(23,5); clrscr(); etc. 

Parecería ser que el tiempo no ha cambiado en nada, que MS-DOS sigue siendo un sistema operativo, y no una terminal emulada por los sistemas windows modernos. A este ritmo no nos sorprendería ver código que invoque resoluciones de 320x200 con 256 colores indexados.

                            void SetVideo (void)
                            {
                                    asm{
                                                mov ah,0
                                                mov al,13h
                                                int 10h
                                          }
                            }


A pesar de que tenemos buenos recuerdos, y extrañamos los hacks del Modo 13h y Modo X, y otras curiosidades, es una verdadera barbaridad que a los alumnos no se enseñe a escribir código en compiladores modernos. Pareciera ser que los maestros, sin ganas de desarrollar nuevos retos de programación para sus alumnos, intentan reproducir una y otra vez los mismos ejercicios obsoletos.
El problema no solo es que la lógica no se puede reducir a producir cuadros de texto con colores en una consola de los años 90's sobre MS-DOS, sino que no dejan una verdadera experiencia de como se realiza la programación en C y C++ para sistemas modernos (lo cual no necesariamente quiere decir que se requiera una GUI.)
Recomiendo, para todos aquellos a quienes aún les estén enseñando con este compilador obsoleto, guardarlo en una carpeta llamada muso y descargar la versión del compilador GCC u otro compilador de nueva generación (como VC++ en Windowos) para su sistema operativo. Si requiere alguien de programación gráfica para ver los resultados de su lógica palpables en la pantalla puede usar SDL, que es una excelente biblioteca gráfica multiplataforma. 


  • Para Windows recomiendo ampliamente usar la distribución más actual de MingW, en concreto esta: http://nuwen.net/mingw.html (Evite usar Dev-C++ que su desarrollo ha sido parado, y si requiere un entorno gráfico use http://wxdsgn.sourceforge.net/ a pesar de también ya llevar 2 años sin actividad.)
  • En GNU/Linux: Instalar el compilador GCC desde su repositorio. ej. en debian like: sudo apt-get install build-essential
  • En Mac OS X: Instale sus herramientas de desarrollador que incluirán la versión más adecuada de GCC. 

viernes, 25 de noviembre de 2011

Tux4Kids: Mentor en Google Code-In


Nuevamente Tux4Kids ha sido aceptado en el Google Code-In que es un concurso para jóvenes menores a 18 años, en el cual pueden contribuir de diversas formas a proyectos se software libre y abierto. Desde imágenes, investigaciones, hasta código, los jóvenes pueden incorporar sus esfuerzos a diversos proyectos que todos conocemos. Este año participan, además de Tux4Kids, FreeBSD, GNOME, OpenSUSE, Perl, VideoLAN, PySoy, KDE, entro otros.
Los premios por participante comienzan al realizar una contribución, ganando 25 dólares y una playera. Pero los premios aumentan hasta 500 dolares y un viaje todo pagado a GooglePlex en Mountain View California.
Para cualquier ayuda o comentario, estaré de asesor para el Proyecto Tux4Kids y pueden ponerse en contacto por este blog o por la lista oficial del proyecto. Espero se animen.

lunes, 21 de noviembre de 2011

Flask: Un mundo poderoso y minimalista para la programación Web


He descubierto el mundo de los "microframework"s en Python. Estoy tratando de escribir un nuevo proyecto web, con la intención de hacerlo a mi medida. La herramienta tradicional: Django. que suelo utilizar me ha comenzado a poner piedras en el camino al querer hacer ciertas cosas que no están dentro del estándar.

Al investigar, me tomé la molestia de experimentar con varias alternativas. Entre ellas TG, pyramid, cherrypy, web2py, etc... Pero me encantó la elegancia de Flask. Ya con anterioridad había llegado a la página, pero no me había tomado la molestia de revisar su documentación. Resulta ser una de las aplicaciones mejor documentadas, minimalistas, pero a la vez flexibles para todo los que necesito.

En mi proyecto utilizaré Jinja2 (que es por cierto mi sistema de Templates preferido) y que viene integrado desde la caja con Flask, junto con el ORM SQLAlchemy, que tiene una exención hecha para Flask. Les presento un rápido extracto de código para que se puedan dar una idea de lo confortable que es trabajar con este microframework.


from flask import Flask
app = Flask(__name__)

@app.route('/')
def index():
return 'Index Page'

@app.route('/hello')
def hello():
return 'Hello World'

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


Para más información pueden visitar la página de Flask en http://flask.pocoo.org/ Estaré informando de las diversas dificultades, que seguramente enfrentaré, al desarrollar mi proyecto.

sábado, 3 de septiembre de 2011

Usuarios independientes en el Admin de Django

Muchas veces los programadores de Django quieren usar la poderosa herramienta del Admin para permitir funcionar como un centro de administración para los diversos usuarios que se registran en un sitio. Pero al generar usuarios de staff con acceso al admin, estos pueden editar cualquier campo, a pesar de no ser el suyo. Para evitar esto, es posible configurar nuestro archivo admin.py para sobre heredar el administrador y sobre escribir dos funciones. Veamos el código:


from django.contrib import admin
from myproject.pages.models import pagesPage



class pagesPageAdmin(admin.ModelAdmin):
def save_model(self, request, obj, form, change):
if getattr(obj, 'added_by', None) is None:
obj.added_by = request.user
obj.last_modified_by = request.user
obj.save()

def queryset(self, request):
qs = super(pagesPageAdmin, self).queryset(request)

#If super-user, shows all rows
if request.user.is_superuser:
return qs
return qs.filter(added_by=request.user)


admin.site.register(pagesPage, pagesPageAdmin)

Tomando en cuenta que hemos declarado en models.py los necesarios campos, como lo es added_by como foreign key a User, de Auth. Espero ayude!

lunes, 4 de julio de 2011

Autocompletado de Django en VIM

Para poder usar el autocompletado de VIM en projectos Django es necearios tener estas lineas en nuestro archivo .vimrc


syntax on

autocmd FileType python set omnifunc=pythoncomplete#Complete
autocmd FileType javascript set omnifunc=javascriptcomplete#CompleteJS
autocmd FileType html set omnifunc=htmlcomplete#CompleteTags
autocmd FileType css set omnifunc=csscomplete#CompleteCSS


Y con esto listo, copiar este script que podemos colocar en alguna dirección dentro del path como lo es /usr/local/bin o crear un directorio para el path local en el home.


#!/bin/bash

# Name: djvim
# Description: Script to automate the setup of the
# enviroment vars to use omicomplete in vim
# for Django projects.
# Usage: djvim filename
#
# Author: Jesús Manuel Mager Hois
# Copyright: GPL v3 or later


#Set the global vars to the Django project
function startvim(){
local arr=$(echo $1 | tr "/" "\n")
for x in $arr
do
#echo "[$x]"
local PROJECT=$x
done
echo $PROJECT
cd ..
local DIR=`pwd`
export PYTHONPATH=$PYTHONPATH:$DIR
export DJANGO_SETTINGS_MODULE=$PROJECT.settings
vim $ARGS
}

#Iter the directory tree to find setting.py
function finddjbase(){
cd ..
local DIRF=`pwd`
local FILEF=`echo "$DIRF/settings.py"`
if [ $DIRF == '/' ]
then
echo "Couldn't find the Django base directory"
exit
fi
echo "Trying in $DIRF"
if ( ! fileexists $FILEF )
then
finddjbase
else
startvim "$DIRF"
exit
fi
}

#Check if we can find setting.py
function fileexists(){
local f="$1"
if [ ! -f $f ]
then
echo "This is not the Django base directory... trying"
return 1
else
echo "settings.py FOUND at $1"
return 0
fi
}

#Main block

ARGS=$@
DIRN=`pwd`
FILEN=`echo "$DIRN/settings.py"`

if ( ! fileexists $FILEN )
then
finddjbase
else
startvim $DIRN
exit
fi



Y listo, podemos abrir nuestro archivo con fjvim nombredelarchivio.py

miércoles, 29 de junio de 2011

Primera impresión del iPad2 de un programador de Software Libre

La semana pasada mi madre ha decidido comprarse un iPad2 por razones de movilidad. El simpático computador pesa alrededor de 600 gramos, y goza de una muy buena fama. Escogió el modelo con opción 3G y con 32 GB en disco duro. Por mi parte, no encontré ningún motivo para evitar esta compra para un usuario con modestas pretensiones. ¿Cuáles son estas pretensiones?
  • Escribir en un procesador de textos decente.
  • Proyectar películas desde YouTube, o presentaciones desde archivos PowerPoint.
La propaganda oficial argumenta una gran variedad software disponibles desde AppStore, las cuales es posible adquirir ya sea comprando o descargando gratuitamente. Desde que salió el iPhone, desconfié de esta plataforma cerrada, pero no había tenido la posibilidad de probarla en carne propia.
Al ayudar a mi madre en la configuración de su iPad para que pudiera cumplir sus expectativas me encontré con un verdadero calvario que comprobó mis reservas iniciales. Enumeraré lo peor que pude encontrar:
  • De las aplicaciones disponibles desde el AppStore son muy contadas las que ofrecen verdadera calidad, incluso dentro de las aplicaciones con costo.
  • No pude encontrar un Procesador de Textos decente. Un trabajo de investigación necesariamente requiere de citas y pies de página. Ni Pages(creado por Apple y la aplicación más avanzada en este sector) pudo ofrecer esta característica tan elemental. Las demás aplicaciones ofimáticas ofrecían aún menos capacidades.
  • La conectividad es pésima. El dispositivo se encuentra tan cerrado que no puede acceder libremente una red e imprimir en algún servidor de impresiones.
  • Si bien Pages es el procesador de texto más avanzado, su productor no permite conectarse a servicios tan importantes como Dropbox y sólo se limita a sus propios servicios (iDisk y iCloud).
Al final mi madre terminó usando DocsToGo para estar constantemente interactuando con su computadora vía Dropbox, aún a costa de características de Pages. En lo particular extrañé compilar las aplicaciones de mi preferencia, usar Python y en general gozar de una verdadera computadora.
El harware tiene buena pinta, el problema es lo cerrado del sistema. Yo no compraría uno de estos equipos y no los recomiendo, pero si alguien quiere gastar más de diez mil pesos para escuchar música, ver alguna película y jugar, adelante, quizá esta curiosidad es para ustedes.

sábado, 18 de junio de 2011

Hacer que autoconf detecte LUA 5.1

He tenido algunos problemas para poder hacer detectar las librerías de LUA en autotools. He logrado realizar esto con algunas pruebas de nombres y así lograr incluir las bibliotecas y las cabeceras. AUX_LUA.m4 no logra detectar LUA en Debian, pero no se si también tiene dificultades en otras distribuciones. Al parecer en Ubuntu también existe un problema semejante.

Aquí el código básico del configure.ac que busca LUA 5.1.



AC_INIT([luaexp], [1.0], algo@correo.com)

AC_PREREQ(2.61)
AC_CANONICAL_HOST
AC_CANONICAL_BUILD
AC_CANONICAL_TARGET

AM_INIT_AUTOMAKE([foreign -Wall -Werror])
AC_PROG_CC

dnl Check for LibLua: --------------------------------------------------------

AC_MSG_CHECKING([for Lua package name])
PKG_CHECK_EXISTS([lua5.1], [LUA="lua5.1"],
[PKG_CHECK_EXISTS([lua-5.1], [LUA="lua-5.1"], [LUA="lua"])])
AC_MSG_RESULT([$LUA])

PKG_CHECK_MODULES([LUA],
[$LUA],
,
[ [echo "$LUA not found via pkg_config, checking AC_CHECK_LIB:"]
AC_CHECK_LIB([$LUA],
[lua_newstate],
,
[AC_MSG_ERROR([LUA no found! http://www.lua.org/download.html])]
)
[echo "$LUA successfully located"]
]
)

AC_DEFINE([HAVE_LUA],[1],[Define to 1 if you have the `LUA` library])


CFLAGS="$CFLAGS $LUA_CFLAGS"
LIBS="$LIBS $LUA_LIBS"


AC_CONFIG_HEADERS([config.h])
AC_CONFIG_FILES([Makefile src/Makefile])

AC_OUTPUT


Espero esto ayude a cualquier otra persona que necesite incluir LUA en su proyecto. En negrita resalto el código específico para la detección.