GeoIPTool - de donde es esta IP ?
Internet, Software, Web September 11th, 2008
El servicio GeoIPTool permite identificar de manera gráfica de donde proviene cualquier dirección IP que se desee.
Enlace: http://geoiptool.com/.
Tags: GIS
El servicio GeoIPTool permite identificar de manera gráfica de donde proviene cualquier dirección IP que se desee.
Enlace: http://geoiptool.com/.
Tags: GIS
No es que me sienta viejo aún, pero como me hubiera gustado que como ahora, hubieran existido tantas cosas y que hubieran estado al alcance de los desarrolladores cuando yo era estudiante hace un tiempo ya. Gloriosa época de muchas trasnochadas expermientando cositas, en particular con Java.
Desafortunadamente, en mi época de estudiante me tocó un mundo no tan interesante como el actual, ya que empezamos con C/C++ para MS-DOS y en esa época el reto adicional era mostrar imágenes en los programas y simular el ambiente 3D de ventanas con sólo las líneas y cuadrados del BGI
Java llegó después y me tocó la época en que todos estabamos aprendiendo y las cosas emocionantes empezaron a llegar con el tiempo y con Internet. Recuerdo que ya terminando mis clases, cuando abrí mis primeras direcciones de correo en USA.net y Hotmail, mis compañeros estuvieron renuentes por un buen tiempo porque no le veían la utilidad al correo electrónico o simplemente porque no tenían quien les escribiera. Pero por suerte ya todo eso pasó.
Ahora hay muchas cosas, tantas que no alcanza el tiempo para buscarlas, estudiarlas y hacer algo con ellas. Inclusive hay muchas cosas del mismo estilo. Todo un mundo de delicias para escoger. Lo que falta es tiempo. El trabajo y el cansancio son malos amigos para la investigación. Ahora, donde uno mire, hay cosas para probar y lo mejor de todo es que la mayoría son abiertas y grátis ... digo libres (free), el límite es el tiempo y la pereza mental de las personas.
Hoy, a pesar de que tengo muchos informes atrasados, me dieron ganas de hacer una aplicación muy sencilla para demostrar un par de estas librerías que están allí, esperando que hagamos algo interesante con ellas. Este ejemplo muy simple me tomó al rededor de 2 horas implementarlo y eso porque son muy lento para hacer las interfaces de usuario desde código.
Así surgió la demostración de georreferenciación al estilo web 2.0 que permite visualizar el mapa de cualquier ubicación del mundo y ubicar sobre él marcadores georreferenciados.
Para esto utiliza los servicios de Google Maps para la generación de las imágenes y GeoNames para la georreferenciación, es decir, para convertir las ubicaciones (Manizales, Caldas, Colombia) en sus respectivas duplas latitud/longitud para poder ser relacionadas geográficamente.
En la parte izquierda se aprecia la lista con las ubicaciones seleccionadas que corresponden con las marcas rojas en el mapa, en la parte derecha está el mapa junto con tres barras de desplazamiento que regulan su presentación y en la parte inferior se encuentran los botones de opciones.
El demo le permite al usuario Agregar y Remover ubicaciones como puntos seleccionados. Como se mencionó, estas se ingresan con los nombres de las ubicaciones y el sistema obtiene su ubicación geográfica a través de la consulta de un servicio web. Es posible en cualquier momento, Centrar el mapa al rededor de cualquiera de los puntos seleccionados almacendos.
La manipulación del mapa se realiza con las barras de desplazamiento. La naranja (derecha) corresponde con el zoom: hacia abajo aumenta, haciendo mayor el acercamiento del mapa. La horizontal, azul, corresponde con la longitud y la vertical, verde, corresponde con la latitud. Cuando se modifica cualquiera de estos valores se deberá solicitar la actualización del mapa presionando el botón Refrescar.
La aplicación ha sido desarrollada en Java por lo que su código es muy claro y modular. En términos de la implementación, el acceso al webservice de GeoNames utiliza su propio API para el cual se descargaron dos archivos: geonames-1.0-java5.jar y jdom-1.0.jar.
La georrefernciación no podría ser más fácil.
public static GeoLocation locate(String location) throws Exception { GeoLocation result = new GeoLocation(); // Creates the toponym searcher ToponymSearchCriteria searchCriteria = new ToponymSearchCriteria(); // Sets the criteria based on the specified location searchCriteria.setQ(location); // Request the geolocalization to the webserver ToponymSearchResult searchResult = WebService.search(searchCriteria); // Gets the results List toponyms = searchResult.getToponyms(); // Checks if there were results if(toponyms == null || toponyms.size() == 0) return null; // Gets the first result of all (could be many) Toponym first = toponyms.get(0); // Prepares the result with its information result.put("geoNameId", first.getGeoNameId() + ""); result.put("name", first.getName() + ""); result.put("latitude", first.getLatitude() + ""); result.put("longitude", first.getLongitude() + ""); result.put("countryCode", first.getCountryCode() + ""); result.put("countryName", first.getCountryName() + ""); return result; }
La clase GeoLocation que utilizo para manejar el resultado no es mas que un Hashtable<String, String> con algunos adendos para facilitar su uso.
Por otro lado, la generación del mapa requiere aún menos ciencia aunque la realizo en dos pasos discretos que en general no incluyen nada extraño.
public String prepareUrl() { String markers = ""; // Walks thru all the points to create its markers for(int i=0; i <points.size(); i++) { // Reads the points one by one GeoLocation point = points.elementAt(i); // The markers will be green String color = "green"; // Sets the point location information based on its longitude and latitude String pointLocation = point.get("latitude") + "," + point.get("longitude") + "," + color + point.get("name").toLowerCase().charAt(0); // Adds it to the markers accumulator markers += pointLocation + ((i < points.size() - 1) ? "%7C" : ""); } // Prepares the full URL based on markers information, centered location, size, zoom and API key String url = "http://maps.google.com/staticmap?" + "center=" + centerLatitude + "," + centerLongitude + "&" + "markers=" + markers + "&" + "zoom=" + zoomLevel + "&" + "size=" + sizeWidth + "x" + sizeHeight + "&" + "key=" + apiKey; // System.out.println(url); return url; }
En el primer paso preparo el URL del consulta al servicio basado en información como la coordenada centro del mapa, el nivel de zoom, el tamaño de la imagen, los puntos seleccionados (marcadores) y la llave del API que debe ser privada y es única para cada sitio web (FQDN), aunque para el caso específico de aplicaciones de escritorio no es muy relevante a pesar de ser obligatoria. La llave del API puede ser obtenida de manera gratuita por cualquier desarrollador desde esta dirección.
public Image prepareImage(String url) throws Exception { Image image = ImageIO.read(new URL(url)); return image; }
El segundo paso se relaciona con consultar el servicio de Google utilizando el URL recién generado, leer los bytes que conforman la imagen y crear con ellos un objeto Image para ser mostrado posteriormente en la interfaz de usuario. Con Java, este procedimiento es extremadamente sencillo: 1 línea de código.
Para su uso se deberá tener cuidado en el manejo de las posibles excepciones que pueda lanzar el requerimiento como por ejemplo, producto de un fallo de red.
// Gets the map image Image imageMap = mapService.getMap(); // Checks if was received if(imageMap == null) { JOptionPane.showMessageDialog(this, "El mapa no se pudo recuperar.", "Error recuperando mapa", JOptionPane.ERROR_MESSAGE); return; } // Puts the map on the gui map.setIcon(new ImageIcon(imageMap));
Teniendo el objeto Image lo podemos poner en cualquier componente de AWT/Swing. Por facilidad, yo utilizo un JLabel que incluye el soporte de íconos (ImageIcon) los cuales se basan en objetos de imagen.
Como se puede apreciar, la complejidad de la aplicación es muy baja por lo que reitero: la imaginación es el límite.
Es posible acceder a la aplicación desde web sin instalar ningún archivo local desde el siguiente enlace o ejecutando el siguiente comando en una consola/símbolo del sistema operativo:
$ javaws http://demo.jorgeivanmeza.com/Java/DemoGeoReferenceMap/0.1/DemoGeoReferenceMap.jnlp
Enlace:
Tags: GeoNames, GIS, GoogleMaps, Java
El tema de estudio del mes pasado era la implementación de sistemas multiagentes o SMA bajo la asesoría del profesor Luis Castillo. Estuvo muy interesante ya que alcanzamos a hacer varias prácticas utilizando la infraestructura de Jade, un framework para Java.
Como práctica propia desarrollé un prototipo llamado Buscador de talento amigo que resultó hasta interesante. Su objetivo es el de ayudarnos con algo que nos interesa bastante y frecuentemente: encontrar talento técnico para el desarrollo de nuestros proyectos, o visto desde el otro ángulo: buscar empleo.
La idea original era utilizar la base de datos de contactos de una red social real (Facebook o alguna OpenSocial), sin embargo revisando sus APIs y reglamentos es aparentemente inviable, ya que no permiten legalmente que se extraiga información de estas redes. Por esto tuve que volver aún mas prototipo a mi prototipo y elaborar mi propia versión de una extremadamente simple red social llamada Mandarina Social donde los usuarios pudieran tener un perfil propio (nombres, profesión, rol e información de ubicación) y tener a otros usuarios como amigos. El objetivo del sistema es aprovechar esta relación de FOAF.
En términos generales, el sistema le pregunta a un usuario de la red social: cómo es el perfil de las personas que necesita, es decir, que requiere que hayan estudiado: "ingeniería de sistemas", "zootecnia", etc; así como alguna información adicional: dónde está ubicada la red social, cuántos perfiles requiere, cuántos niveles de amistad desea verificar y cuánto tiempo desea que el SMA utilice en la búsqueda de talento.
Con esta información el sistema crea a un agente Atendedor quien se encargará de la interacción con el usuario final y que a su vez crea a agentes Buscadores que basados en el perfil del usuario que realiza el requerimiento empiezan a escudriñar a la red social en búsqueda del perfil especificado, saltando entre los contactos amigos del usuario y recursivamente entre los amigos de sus amigos. Mandarina Social fue desarrollada basada en la especificación hCard de Microformats la cual estandariza ciertas etiquetas (clases CSS en realidad) para demarcar la información del perfil y de las listas de amigos, permitiendo posteriormente su extracción fácil utilizando XPath. Este enfoque tiene un valor agregado, si se nota, se evita la necesidad de crear una interfaz web para los usuarios humanos y otra, probablemente XML, para el intercambio de datos entre aplicaciones. Todo se resume en una única versión XHTML/hCard.
Al final de esta etapa de búsqueda se tiene una lista de contactos candidatos que fueron encontrados entre los contactos del usuario. Los contactos de esta lista incluyen en su información de perfil los datos de su ubicación de la forma: Ciudad, Departamento, País. Esta información es georreferenciada gracias al agente GeoLocalizador que utiliza al servicio web de Geonames para obtener la ubicación de latitud y longitud de cada uno de los candidatos.
Los candidatos georreferenciados son entregados a un agente Seleccionador quien deberá elegir cuales de los candidatos serán finalmente elegidos. Esto lo hará basado en la cantidad de perfiles solicitados y un criterio de selección, el cual para este prototipo es la cercanía de los candidatos con respecto al usuario solicitante. El cálculo de distancias entre candidatos y usuario solicitante es realizado por el agente CalculadorDeDistancias el cual desarrolla su función gracias a la librería JCoord.
Una vez el agente Seleccionador ha decidido cuales de los candidatos son los realmente elegidos, transmite este listado de regreso al agente Atendedor quien gracias al servicio de Google Maps elabora un mapa con las ubicaciones de los contactos con el perfil requerido. Este mapa junto con el listado de los perfiles es mostrado al usuario como respuesta a su solicitud.
La descripción realizada hasta el momento se complementa con la presentación informal que creé para la muestra del prototipo en sociedad y que incluyo a continuación.
El desarrollo de este prototipo despertó mi curiosidad respecto a los SMA y me permitió darme cuenta que no son abstracciones tan complejas y extrañas como esperaba, mas que un paradigma diferente es una infraestructura que facilita la solución de ciertos tipos de problemas, infraestructura que uno mismo podría terminar desarrollando parcialmente en su propia aplicación pero que no es necesario ya que es provista como una base por la librería, en mi caso de estudio, Jade. Obviamente existen muchas otras opciones diferentes a Jade, aún mas, dentro de ella hay muchos otros recursos diferentes de los aprovechados con este prototipo, como por ejemplo, la movilidad de agentes entre plataformas físicas gracias a que, según pude apreciar, está desarrollado sobre RMI. A fin de cuentas, esta es apenas mi primera aproximación al mundo de los agentes.
A pesar de que el prototipo es completamente funcional estas son algunas de las cosas que podría mejorarle en un futuro.
Probablemente mas adelante publique algunos artículos prácticos relacionados con lo aprendido sobre la librería Jade en este blog, alias mi caché mental.
Como para todo lo que aprendo y me emociona, espero por estos temas volver a pasar en un futuro cercano.
El Pidgin de mi Ubuntu se encontraba ya desactualizado (2.4.1) y al parecer Synaptic no se enteraba que ya había nuevas versiones (2.5.0 actualmente).
Estos fueron los pasos que se siguieron para actualizarlo gracias a los paquetes de GetDeb.
$ wget http://www.getdeb.net/download/3099/1 $ wget http://www.getdeb.net/download/3099/2 $ wget http://www.getdeb.net/download/3099/0 $ sudo apt-get install libsilc $ sudo dpkg -i pidgin-data_2.5.0-1~getdeb1_all.deb $ sudo dpkg -i libpurple0_2.5.0-1~getdeb1_i386.deb $ sudo dpkg -i pidgin_2.5.0-1~getdeb1_i386.deb
Tags: Linux/Unix/FreeBSD
Los pasos descritos a continuación fueron seguidos para realizar la actualización del administrador de proyectos basado en Redmine de su versión 0.6.4 a la versión 0.7.3.
Se descomprimió el paquete con la distribución original.
$ tar zxvf redmine-0.7.3.tar.gz
Se renombró el directorio por especificaciones propias.
$ mv redmine-0.7.3 sistemas_redmine-0.7.3
Se copió la información de conexión a la base de datos.
$ cp sistemas_redmine-0.6.4/config/database.yml sistemas_redmine-0.7.3/config
Se editó la información del servidor SMTP.
$ vi sistemas_redmine-0.7.3/config/environment.rb
# SMTP server configuration
config.action_mailer.smtp_settings = {
:address => "127.0.0.1",
:port => 25,
:domain => "dominio.com",
:authentication => :login,
:user_name => "sistemas@dominio.com",
:password => "redmine",
}
Se realizó la actualización de la base de datos. En este punto se recomienda realizar antes una copia de seguridad de la base de datos actual en caso de que algo falle en el proceso de actualización.
$ cd sistemas_redmine-0.7.3 $ rake db:migrate RAILS_ENV="production"
Se restauran los archivos que hayan sido subidos al sistema.
$ cd .. $ cp -rf sistemas_redmine-0.6.4/files/* sistemas_redmine-0.7.3/files
En mi caso, el directorio de RedMine (sistemas_redmine-0.7.3) se encuentra ubicado por fuera del árbol público, sólo debería publicarse el directorio /public, para esto creo un enlace.
$ cd /home/usuario/public_html $ ln -s /home/usuario/sistemas_redmine-0.7.3/public/ redmine
Creo el nuevo despachador con FCGI.
$ cd redmine $ cp dispatch.fcgi.example dispatch.fcgi $ chmod 755 dispatch.fcgi
Como sugerencia final se debe restaurar o adaptar el archivo .htaccess ubicado en redmine/public, de lo contrario se presentarán problemas con la carga de archivos CSS y JS.
Para mi caso particular, este es el archivo que he utilizado con las versiones mencionadas: .htaccess
Para configurar a mi Thunderbird para que pueda manipular mi calendario de la cuenta de GoogleAppsForDomains de la Fundación voy a seguir los pasos descritos en el artículo Mozilla Thunderbird + Lightning + GoogleCalendar del año pasado, es decir, utilizando al plugin Provider for Google Calendar.
Sin embargo me surgió un problema. A la fecha, el Ubuntu 8.04 me permite solamente instalar el Lightning y su integración con Thunderbird en la versión 0.7, no la 0.8 la cual es requerida por el complemento PfGC 0.4. Para solucionar esto descargué la versión anterior del plugin del sitio Provider for Google Calendar Version History, es decir, la versión 0.3.1 del complemento, la cual instaló sin problemas.
Enlace: https://addons.mozilla.org/en-US/sunbird/addons/versions/4631
Tags: GoogleCalendar, Lightning, Thunderbird
Revisando el sitio web de Creative Commons International en búsqueda de opciones de licenciamiento para mis documentos educativos encontré que el sitio provee de un selector de licencias que ayuda a determinar que tipo de licencia se desea para una obra.
Las licencias disponibles para Colombia por parte de la CC son las siguientes actualmente.
Otras licencias de difusión mundial son:
En este documento se enuncian las generalidades de las licencias de Creative Commons y se detallan sus características.
Enlace: Creative Commons en Wikipedia.
Tags: CreativeCommons, Licenses
Para desactivar la creación libre de usuarios en MediaWiki es necesario realizar la siguiente modificación en el archivo LocalSettings.php.
# Prevent new user registrations except by sysops $wgGroupPermissions['*']['createaccount'] = false;
Después de realizar esta modificación es posible que los administradores (sysops) creen usuarios siguiendo estos pasos.
[[Special:Userlogin]].Enlace: MediaWiki User's rights.
Tags: MediaWiki
Leyendo blogs encontré uno interesante, escrito por José M. Aguilar, trata en su mayor parte de temas relacionados con ASP.NET y tecnologías similares, sin embargo tiene algunos posts sobre temas de informática general algunos de los cuales me parecieron interesantes y por ello los planeo referenciar a continuación para tenerlos a mano para futuras consultas.
7 hábitos de personas altamente innovadoras.
Como reconocer a los buenos desarrolladores.
Estos se concretan en un resumen final de características positivas y negativas, casi un checklist, que nos podrían ayudar a detectar comportamientos y actitudes clave:
Indicadores Positivos (propios de los buenos desarrolladores)
Indicadores Negativos (propios de los no tan buenos desarrolladores)
13 consejos para comentar tu código.
Selectores de CSS 2.1: parte 1, parte 2 y parte 3. Se hace referencia a SelectorOracle de TheOpalGroup que traduce de CSS3 a español o inglés.
Etiquetas XHTML 1.1: introducción, parte 1, parte 2 y parte 3.
Citas célebres del mundo de la informática: parte 1 y parte 2 (english version).
"No temo a los ordenadores; lo que temo es quedarme sin ellos"
-- Isaac Asimov
"Una vez un ordenador me venció jugando al ajedrez, pero no me opuso resistencia cuando pasamos al kick boxing"
-- Emo Philips
"El ordenador nació para resolver problemas que antes no existían"
-- Bill Gates
"El mayor enemigo del conocimiento no es la ignorancia, sino la ilusión del conocimiento"
-- Stephen Hawking
"Cuanto más sabes, más te das cuenta de que no sabes nada"
-- Sócrates
"Dime y lo olvido, enséñame y lo recuerdo, involúcrame y lo aprendo"
-- Benjamín Franklin
"El auténtico conocimiento es conocer la extensión de la propia ignorancia"
-- Confucio
"Sólo hay un problema con el sentido común: que no es demasiado común"
-- Milt Bryce
"Dicen que los pesimistas ven el vaso medio vacío; los optimistas, en cambio, lo ven medio lleno. Los ingenieros, por supuesto, ven que el vaso es el doble de grande de lo que sería necesario"
-- Bob Lewis
"Es importante destacar que ningún ingeniero software con ética consentiría escribir un procedimiento llamado DestruirBaghdad. Su ética le obligaría a escribir un procedimiento DestruirCiudad, al que se pasaría el parámetro Baghdad"
-- Nathaniel S. Borenstein
"Antes de que un software sea reutilizable debería ser utilizable"
-- Ralph Johnson
"Si automatizas un procedimiento desastroso, obtienes un procedimiento desastroso automatizado"
-- Rod Michael
"La simplicidad llevada al extremo se convierte en elegancia"
-- Jon Franklin
"Cuando estás en un atasco de tráfico con un Porsche, todo lo que puedes hacer es consumir más combustible que el resto estando parado. La escalabilidad va de construir carreteras más anchas, no coches más rápidos"
-- Steve Swartz
"La mejor forma de predecir el futuro es implementarlo"
-- David Heinemeier Hansson
"En dos ocasiones me han preguntado: 'si pone datos incorrectos en la máquina, ¿saldrán las respuestas correctas?'. Soy absolutamente incapaz de hacerme una idea del tipo de confusión de ideas que pueden provocar que alguien haga una pregunta así"
-- Charles Babbage
"Hazlo todo tan simple como sea posible, pero no más simple"
-- Albert Einstein
"Cuando se está depurando, el programador novato introduce código correctivo; el experto elimina el código defectuoso"
-- Richard Pattis
"No pueden existir concursos de Perl ofuscado; no tendría sentido"
-- Jeff Polk
"Perl: el único lenguaje cuyo código es prácticamente igual antes y después de someterlo a una encriptación RSA"
-- Keith Bostic
"UNIX es simple. Sólo necesita un genio para entender su simplicidad"
-- Dennis Ritchie
"Algunos desarrolladores cuando se enfrentan a un problema piensan que la solución es usar expresiones regulares. En este momento, ya tienen dos problemas"
-- Jamie Zawinski
"El único sistema seguro es aquél que está apagado en el interior de un bloque de hormigón protegido en una habitación sellada rodeada por guardias armados"
-- Gene Spafford
"Las contraseñas son como la ropa interor. No puedes dejar que nadie la vea, debes cambiarla regularmente y no debes compartirla con extraños"
-- Chris Pirillo
"En el mundo del software, los activos más importantes de la compañía se van a casa todas las noches. Si no se les trata bien, pueden no volver al día siguiente"
-- Peter Chang
"Es mejor esperar a que un desarrollador productivo esté disponible que esperar a que el primer desarrollador disponible sea productivo"
-- Steve C McConnell
"En el futuro es posible que los ordenadores no pesen más de 1,5 toneladas"
-- Popular mechanics, 1949
"Sí, tenemos unas reglas de vestuario en la empresa. Tienes que vestirte"
-- Scott McNealy, co-fundador de Sun Microsystems
"Si la industria automovilística hubiera seguido el mismo desarrollo que los ordenadores, un Rolls-Royce costaría hoy 100 dólares, circularía un millón de millas con 3,7 litros y explotaría una vez al año, eliminando a todo el que estuviera dentro en ese momento"
-- Robert X. Cringely
"Es ridículo vivir 100 años y sólo ser capaces de recordar 30 millones de bytes. O sea, menos que un compact disc. La condición humana se hace más obsoleta cada minuto"
-- Marvin Minsky
"Nunca confíes en un ordenador que no puedas lanzar por una ventana"
-- Steve Wozniak
"La mayoría del software actual es muy parecido a una pirámide egipcia, con millones de ladrillos puestos unos encima de otros sin una estructura integral, simplemente realizada a base de fuerza bruta y miles de esclavos"
-- Alan Kay
"Hay dos grandes productos que salieron de Berkeley: LSD y UNIX. No creemos que esto sea una coincidencia"
-- Jeremy S. Anderson
"19 de enero de 2038, a las 3:14:07 AM"
(Fin del mundo de acuerdo con la limitación de Unix de 2^32 segundos desde el 1 de enero de 1970)
"Controlar la complejidad es la esencia de la programación"
-- Brian Kernigan
"Hay dos maneras de diseñar software: una es hacerlo tan simple que sea obvia su falta de deficiencias, y la otra es hacerlo tan complejo que no haya deficiencias obvias"
-- C.A.R. Hoare
"La función de un buen software es hacer que lo complejo aparente ser simple"
-- Grady Booch
"Hay una antigua historia sobre una persona que quería que su ordenador fuese tan fácil de utilizar como su teléfono. Estos deseos se han hecho realidad, ya no sé cómo usar mi teléfono"
-- Bjarne Stroustrup
"Cualquier idiota puede usar un ordenador. De hecho, muchos lo hacen"
-- Ted Nelson
"La programación es una carrera entre los desarrolladores, intentando construir mayores y mejores programas a prueba de idiotas, y el universo, intentanto producir mayores y mejores idiotas. Por ahora va ganando el Universo"
-- Rich Cook
"La mayoría de ustedes están familiarizados con las virtudes del programador. Son tres, por supusto: pereza, impaciencia y orgullo desmedido"
-- Larry Wall
"La formación en informática no puede convertir a nadie en experto programador, de la misma forma que estudiar pinceles y pigmentos puede hacer a alguien un experto pintor"
-- Eric Raymond
"Un gran operario de tornos vale varias veces más que un operario medio, pero un gran escritor de código vale 10.000 veces el precio de un desarrollador medio"
-- Bill Gates
"No te preocupes si no funciona bien. Si todo estuviera correcto, serías despedido de tu trabajo"
-- Ley de Mosher de la Ingeniería del Software
"Medir el progreso del desarrollo de software por líneas de código es como medir el progreso de la construcción de un avión por su peso"
-- Bill Gates
"Lo mejor de los booleanos es que si te equivocas estás a un sólo bit de la solución correcta"
-- Anónimo
"Hay sólo dos clases de lenguajes de programación: aquellos de los que la gente está siempre quejándose y aquellos que nadie usa"
-- Bjarne Stroustrup
"PHP es un mal menor perpetrado y creado por amaterus incompetentes, mientras que Perl es un gran e insidioso mal perpetrado por hábiles pero pervertidos profesionales"
-- Jon Ribbens
"El uso de COBOL daña la mente. Su enseñanza debería ser considerada como un ataque criminal"
-- E. W. Dijkstra
"Pienso que Microsoft eligió el nombre .Net para que no pudiera ser mostrado en un listado de directorio de Unix"
-- Oktal
"No hay lenguaje de programación, no importa su estructura, que impida que los programadores hagan malos programas"
-- Larry Flon
"C++ : Donde los amigos tienen acceso a tus miembros privados"
-- Gavin Russell Baker
"Una de las causas principales de la caída del imperio romano fue que, como no usaban el cero, no tenían forma de saber cuándo sus programas en C terminaban correctamente"
-- Robert Firth
"El software es como el sexo: mejor si es libre y gratis"
-- Linus Torvalds
"Las únicas personas que tienen algo que temer de software libre son aquellos cuyos productos tienen un valor aún menor"
-- David Emery
"Tan pronto como comenzamos a programar encontramos, para nuestra sorpresa, que crear programas correctos no era tan fácil como habíamos pensado. Tuvo que descubrirse la depuración. Puedo recordar el instante exacto en el que me dí cuenta que una gran parte de mi vida desde entonces iba a pasarla encontrando errores en mis propios programas"
-- Maurice Wilkes descubre la depuración, 1949
"Hay dos formas de escribir programas sin errores; sólo la tercera funciona"
-- Alan J. Perlis
"Documenta siempre como si la persona que finalmente mantendrá tu código fuera un psicópata violento que sabe dónde vives"
-- Martin Golding
"Todo lo que puede ser inventado ha sido ya inventado"
-- Charles H. Duell, Comisario de oficina de Patentes en EEUU, en 1899
"Podría parecer que hemos llegado a los límites alcanzables por la tecnología informática, aunque uno debe ser prudente con estas afirmaciones, pues tienden a sonar bastante tontas en cinco años"
-- John Von Neumann, sobre 1949
"640K deberían ser suficientes para todo el mundo"
-- Bill Gates, 1981
10 razones por las que tu blog te ayuda a encontrar empleo.
Para terminar, un poco de humor geek con el concepto de transportes públicos al mejor estilo de 2.0.
![]() |
![]() |
Para quienes no tienen claro que significa IMHO, OMG o WTF encontré en Wikicionario una buena recopilación de estas abreviaturas que se han popularizado en el lenguaje escrito por internet.
Enlace: Jerga de internet.
Tags: Internet