Recent Updates RSS Hide threads | Keyboard Shortcuts

  • El primer cable ethernet

    Luis Medel 09:17 on 01/07/2009 | 0 Permalink | Reply

    El primer cable Ethernet

    Tras una puerta normal y corriente en una simple habitación del PARC se encuentra el primer cable Ethernet del mundo. En 1973 Bob Metcalfe envió un memo interno a sus colegas de Xerox proponiendo un sistema de interconexión para estaciones de trabajo e impresoras. Los dispositivos estarían conectados por un cable coaxial que se extendería a lo largo de una LAN. Llamó al sistema “Ether Network”, o “Ethernet”. En 1976 ya había alrededor de 100 dispositivos conectados a la red. Incluso utilizaron el sistema para probar la primera impresora láser que estaba siendo desarrollada en otras instalaciones de Xerox. Metcalfe y David Boggs publicaron sus notas en el “Association for Computing Machinery”. El resto es historia.

    Éste es el esquema que Metcalfe envió en el memo interno.

    PARC 1973 - Esquema Ethernet

    Vía Boing Boing.

     
  • Twitter en 1935

    Luis Medel 08:45 on 23/06/2009 | 2 Permalink | Reply

    Twitter en 1935

    Mensajero robot muestra notas persona a persona en público.

    Para ayudar a las personas a concretar o cancelar citas o informar a sus amigos de su paradero, se ha presentado un “robot mensajero” en Londres.

    Conocido como el “notificador”, la nueva máquina se ha instalado en calles, tiendas, estaciones de tren y otros sitios públicos, donde cualquiera puede dejar mensajes a sus amigos.

    El usuario se sube a una pequeña plataforma frente a la máquina, escribe un pequeño mensaje en una tira de papel e introduce una moneda en la ranura. La nota se sitúa tras un panel de cristal donde permanece en público al menos dos horas, de forma que la persona a la que iba dirigida tenga suficiente tiempo para leer la nota en el lugar acordado. La máquina es similaren apariencia a una máquina expendedora de caramelos.

    Vía Modern Mechanix

     
    • Albert 10:39 on 23/06/2009 Permalink

      Y si al lado le pones un fotomatón, ya tienes el Facebook…

    • Luis Medel 16:35 on 23/06/2009 Permalink

      Cielos, de haber nacido a principios del siglo XX estarías nadando en millones Albert! :P

  • Primer día de verano 2009

    Luis Medel 10:33 on 21/06/2009 | 4 Permalink | Reply
    Tags: verano 2009

    Primer día de verano 2009

    Esta mañana, al hacer la primera búsqueda del día, me he encontrado con este simpático logo en Google. La verdad es que no había caído de que hoy domingo es el primer día de verano de 2009 y, además, mi santo.

    Habrá que ir preparándose para un día de celebración :)

     
    • Si Puedo 13:48 on 21/06/2009 Permalink

      Felicidades Luis!!

    • Chema 17:01 on 21/06/2009 Permalink

      Pues muchas felicidades !!!

      Hoy precisamente ha sido mi primer día de playa con baño incluido…

    • Luis Medel 17:44 on 21/06/2009 Permalink

      @Si Puedo, @Chema gracias!

    • Chema 01:23 on 22/06/2009 Permalink

      Ya no nos podemos suscribir a los comentarios??? :(

  • Mi lugar de trabajo (2ª parte)

    Luis Medel 00:00 on 13/06/2009 | 4 Permalink | Reply
    Tags: escritorio, fotografía, imac

    Hace un tiempo publiqué un set de Flickr con algunas fotos sobre mi lugar de trabajo. Hoy he caído en que no había colgado ninguna foto con la nueva configuración

    No es que sea gran cosa, pero ahí va…

    Por cierto, el Mighty Mouse lo voy a cambiar por mi viejo trackball…

     
    • Albert 07:17 on 13/06/2009 Permalink

      Jeje… el 90% de fotos tipo “mi escritorio” o “mi puesto de trabajo” son de gente con Macs… y la cuota de mercado de Mac dista de ser esa… ergo sois unos fanboys orgullosos de ello… :-p

    • Luis Medel 10:10 on 13/06/2009 Permalink

      ¿Es que de pequeño te caíste de la cuna sobre un mac? Si no, no me expico ese “nosequé” que le tienes a cualquier entrada con la palabra “Mac” :P

    • pedro 17:24 on 13/06/2009 Permalink

      Eso es que no lo ha probado, en cuanto lo pruebe no habrá quien lo separe de su mac… xD

      saludos del fanboy #2

    • Luis Medel 08:24 on 15/06/2009 Permalink

      @pedro mañana colgaré una foto de la tostadora de pan, a ver si Albert también me llaman fanboy de Phillips :P

  • Pues sí profesor, fue todo un error ¿verdad?

    Luis Medel 20:45 on 11/06/2009 | 0 Permalink | Reply
    Tags: flamewar, kernel, linux, minix, unix

    I still maintain the point that designing a monolithic kernel in 1991 is a fundamental error. Be thankful you are not my student. You would not get a high grade for such a design :-)

    Profesor Andy Tanenbaum dirigiéndose a Linus Torvalds durante un típico flamewar “kernel monolítico vs kernel modular”

     
  • Expresiones regulares. Curso de guerrilla

    Luis Medel 13:00 on 10/06/2009 | 3 Permalink | Reply
    Tags: expresiones regulares

    Si has trabajado alguna vez desde la línea de comandos seguro que has tenido la necesidad de manipular un grupo de ficheros cuyo nombre cumpliese una determinada condición (*.txt, balance_200?.xls, …), ¿cierto? Entonces ya sabrás lo que son los comodines y lo sencillo que es utilizarlos.

    Pues bien, cuando necesitamos hacer una búsqueda sobre un texto (en nuestro caso, el fuente de un programa) estamos acostumbrados normalmente a introducir el valor concreto que queremos localizar.

    Imaginemos que tenemos varias funciones que se llaman de manera similar (concatenarFechas(), concatenarCadenas(), concatenarListas()…) Si queremos buscar dónde aparece alguna de estas funciones no tenemos más que buscar de manera literal el texto correspondiente a su nombre. Por ejemplo, “concatenarListas”. Pero, ¿qué ocurre si queremos buscar las apariciones de todas las funciones que se llamen de manera similar a la vez? ¿tenemos algo parecido a los comodines para buscar texto? Efectivamente, sigue leyendo :)

    Una expresión regular es, valga la redundancia, una expresión que define un patrón de búsqueda sobre un texto. En el ejemplo anterior, la búsqueda literal de la función concatenarListas() equivaldría a la expresión regular /concatenarListas/. Por otro lado, la búsqueda de todas las funciones que se llamen de manera similar podría llevarse a cabo con la expresión /concatenar[A-Z][a-zA-Z0-9]+/. De momento no te preocupes por entenderlo porque vamos a empezar desde el principio :)

    Literales

    Como hemos comentado antes, una expresión regular puede ser cualquier literal. Así, ante el texto (olvidemos los acentos para simplificar los ejemplos)…

    mi mama me ama, mi mama me mima

    …la expresión /m/ (el literal “m”) nos devolvería cada una de las coincidencias con “m” del texto (11 en total). Si utilizamos la expresión /mama/ obtendremos dos resultados (las dos apariciones de la palabra “mama”). Y si utilizamos la expresión /ama/, ¿cuántas coincidencias obtendremos? ¿Una? No. Tres, ya que la palabra “mama” también coincide con el patrón /ama/.

    Pero las expresiones regulares servirían de poco si su utilidad terminase en la búsqueda de simples literales. ¿Seguimos?

    El comodín

    El carácter “.” es un carácter comodín que podría leerse como “cualquier carácter”. El patrón /m.ma/ encontraría cualquier resultado de 4 caracteres que comenzase por “m” y terminase por “ma”, sin importar cuál fuese el segundo carácter (letra, número, símbolo, espacio en blanco…)

    Si buscamos una equivalencia con los comodines que solemos usar en la línea de comandos, equivaldría al comodín “?”. Es decir, cualquier carácter, pero sólo uno.

    Conjuntos

    Si en una posición concreta queremos buscar más de un carácter, podemos especificar un conjunto de caracteres válidos. Para ello, no tenemos más que indicar los caracteres deseados entre corchetes.

    Por ejemplo, el patrón /m[ai]ma/ obtendría resultados tanto con la palabra “mama” como con la palabra “mima”. El orden en el que se defina el conjunto no tiene importancia.

    También podemos especificar rangos de caracteres que evitarán que tengamos que escribir todos y cada uno de los caracteres que queramos buscar. Así, si queremos aceptar cualquier letra minúscula del abecedario podemos usar el rango [a-z], si lo que queremos es aceptar las mayúsculas deberíamos usar el rango [A-Z] y si queremos aceptar cualquier carácter numérico el rango [0-9].

    Por supuesto, como es de esperar, los rangos se pueden combinar entre sí. Así, el patrón /[a-z0-9]/ representa un carácter (recuerda que el conjunto representa la búsqueda de un sólo carácter) que puede ser tanto una letra minúscula como un carácter numérico. De manera similar, el patrón /[a-fA-F0-9]/ localizaría un carácter hexadecimal (cualquier carácter en los rangos 0..9 y A..F).

    Ten en cuenta que tenemos la libertad al establecer los límites de los rangos. Si sólo necesitamos capturar las 5 primeras letras del abecedario, podemos indicarlo con el conjunto [a-e]. De manera análoga podemos definir cualquier rango numérico.

    Si lo que deseamos es negar el conjunto, esto es, realizar una búsqueda de caracteres que no estén en el conjunto especificado, debemos añadir al principio del mismo el carácter “^”. El patrón /m[^i]na/ devolvería resultados con “mona”, “mena”, “mana”…pero no devolvería “mina”, ya que hemos excluido ese carácter de manera explícita.

    Atajos -que no “hatajos” :)

    Dado que incluso los patrones de tamaño medio pueden llegar a ser bastante complejos de interpretar visualmente, existen algunos atajos para los rangos más comunes. Por ejemplo, la expresión \d encuentra cualquier dígito (igual que el rango [0-9]) y \w encuentra cualquier carácter alfanumérico, incluido el guión bajo (igual que el rango [A-Za-z0-9_])

    A continuación dejo una pequeña lista con algunos atajos que se puedes utilizar.

    \d – Captura cualquier dígito. Equivale a [0-9]

    \D – Captura cualquier carácter que no sea un dígito. Equivale a [^0-9]

    \s – Captura cualquier carácter que sea un espacio en blanco. Equivale a [ \t\n\r]

    \S – Captura cualquier carácter que no sea espacio en blanco . Equivale a [^ \t\n\r]

    \w – Captura cualquier carácter alfanumérico. Equivale a [a-zA-Z0-9_]

    \W – Captura cualquier carácter no alfanumérico. Equivale a [^a-zA-Z0-9_]

    Caracteres especiales

    Como habrás podido comprobar, existe un conjunto de caracteres que tiene significado especial en la sintaxis de las expresiones regulares ¿cómo hacemos entonces para “capturar” uno de esos caracteres en una expresión regular? Sencillo. Se deben escapar anteponiéndoles una barra invertida “\”.

    Esos caracteres son los siguientes:

    ^$|=#!<>-.,*?+[](){}\

    Su significado lo descubrirás a lo largo de las secciones siguientes.

    Repetición y cuantificadores

    Hasta ahora hemos visto expresiones muy sencillas y con una longitud determinada. Hemos visto antes un patrón que localizaba un sólo carácter hexadecimal (/[a-fA-F0-9]/). Sin embargo, ¿cómo hacemos para localizar números hexadecimales completos con múltiples caracteres?

    La repetición de caracteres se expresa añadiendo tras el carácter que se desea repetir, alguno de los caracteres modificadores “*”, “+” y “?”.

    El más intuitivo de los tres es “*” que se leería como “ninguna o varias veces”. El patrón /ab*c/ encontraría “ac”, “abc”, “abbc”, “abbbbb … bbbbbc”, etc.

    Por otro lado, tenemos el carácter “+” que se leería como “al menos una vez”. El patrón /ab+c/ encontraría “abc”, “abbc”, “abbbbb … bbbbbc”, etc. pero *nunca* encontraría “ac”.

    Por último tenemos el carácter “?” se leería como “una o ninguna”. El patrón /ab?c/ sólo encontraría “ac” y “abc”.

    Como se puede apreciar, el modificador sólo afecta al carácter (o conjunto de ellos) que tiene inmediatamente a su izquierda.

    Con esto que acabamos de aprender, ya sí estamos en condiciones de escribir un buen patrón para números hexadecimales /[a-fA-F0-9]+/. Si queremos aceptar números hexadecimales al estilo de C (precedidos de “0x”) podemos usar el patrón /0x[a-fA-F0-9]+/

    Hay otras ocasiones en las que no interesa que la repetición sea infinita (como ocurre con “*” y “+”) y desearemos especificar un número máximo (o mínimo) de repeticiones. Para eso tenemos los modificadores “{num}” y “{min,máx}”. Al igual que los anteriores modificadores, se debe indicar a la derecha del carácter (o conjunto) que deseamos repetir.

    Algunos ejemplos

    /0x[a-fA-F0-9]{4}/ encuentra números con 4 cifras hexadecimales.

    /0x[a-fA-F0-9]{4,}/ encuentra números con al menos 4 cifras hexadecimales.

    /0x[a-fA-F0-9]{4,8}/ encuentra números de entre 4 y 8 cifras hexadecimales.

    Fíjate que “{0,}” equivale a “*” y que “{1,}” equivale a “+”.

    Agrupación

    Las expresiones de repetición que acabamos de ver, como ya he dicho, operan sobre el carácter situado inmediatamente a la izquierda. Entonces, ¿qué hacer si queremos que la repetición o cuantificación afecte a un grupo de caracteres? Para eso utilizamos la agrupación con paréntesis. Así, si queremos encontrar todas las coincidencias del literal “abcd” repetido 2 o más veces, podríamos usar la siguiente expresión /(abcd){2,}/. Con esto, encontraríamos “abcdabcd”, “abcdabcdabcd”, etc. pero no “abcd”.

    Capturas al inicio y al fin de la línea

    Todas las expresiones regulares que he escrito hasta el momento devolverían cualquier resultado que se encontrasen a lo largo de un texto sobre el que se lanzasen. En ciertas ocasiones resulta útil poder especificar si queremos que la captura ocurra al principio o al final del texto. Para esto disponemos de los caracteres “^” y “$”.

    El carácter “^” sólo puede ir al principio de una expresión regular e indica que lo que vaya a continuación debe ocurrir al principio del texto. O dicho de otra manera, el texto debe comenzar con la expresión que indiquemos a continuación. Se verá muy claro con un ejemplo.

    Por cierto, no hay que confundir este “^” con el operador de negación utilizado dentro de los conjuntos. Aunque se utilice el mismo carácter, su significado es completamente distinto.

    Bien, dicho lo anterior, veamos un ejemplo sencillo. La expresión /^Luis/ devolverá resultados para las cadenas “Luis” y “Luis Medel”, pero no para “Me llamo Luis”, ya que “Luis” no aparece al principio del texto.

    Por su parte, el carácter “$” sólo se puede utilizar al final de una expresión y sirve para requerir que lo que hayamos especificado justo a la izquierda debe ocurrir al final del texto (es decir, obligamos a que el texto termine con la expresión situada a la derecha del “$”)

    Así, la expresión /Luis$/ devolverá resultados para “Luis” y “Me llamo Luis”, pero no para “Luis Medel”.

    Gracias a estos dos caracteres resulta muy sencillo utilizar expresiones regulares para validar datos de entrada.

    Por ejemplo, supongamos que queremos comprobar si una expresión introducida por un usuario se trata de un número entero compuesto única y exclusivamente por caracteres válidos (nada de espacios ni de otro tipo de caracteres) podemos utilizar la expresión /^\d+$/.

    Si lo que queremos es comprobar si se trata de un número real válido, podemos usar la expresión /^\d+(\.\d+)?$/ (un número seguido opcionalmente por un punto y los decimales)

    Un ejemplo real

    Con lo que sabemos de expresiones regulares, ya estamos listos para ver un pequeño ejemplo real de las mismas ¿Cuántas veces has escrito una función de validación para direcciones de email?

    Podemos hacerlo fácilmente con una expresión regular.

    /^[a-zA-Z0-9_\-\+]+(\.[a-zA-Z0-9_\-\+]+)+@[a-zA-Z0-9_\-\+]+(\.[a-zA-Z0-9_\-\+]+)+$/

    Evidentemente, no es perfecta ¿Qué tal si intentas mejorarla?

    Y mucho más

    La sintaxis de las expresiones regulares es mucho más rica de lo que acabo de exponer pero creo que al menos han quedado claras las bases para que comiences a investigar por tu cuenta.

    Aún queda mucho por aprender: operador “|”, captura y repetición de grupos, grupos simbólicos (con nombre), captura hacia delante, captura non-greedy, etc.

    En futuros artículos intentaré profundizar más en el tema e iré introduciendo expresiones regulares más complejas.

     
    • Si Puedo 16:59 on 10/06/2009 Permalink

      Ha merecido la pena la espera :P

    • ifanlo 23:19 on 10/06/2009 Permalink

      Plas, plas… ¡qué bien explicado!
      :-)

    • Luis Medel 00:14 on 11/06/2009 Permalink

      @Si Puedo, @ifanlo me alegro de que lo encontréis útil.
      Esa era la intención :)

  • Migrado

    Luis Medel 02:17 on 10/06/2009 | 5 Permalink | Reply
    Tags: migración, sitio, wordpress

    ¿Sorprendido?

    Acabo de migrar el blog a la plataforma Wordpress. Últimamente necesitaba algunas nuevas funcionalidades en mi motor de blogging pero no estaba sacando nada de tiempo para implementarlas, así que tiro por el camino fácil y, de momento, sigo con la solución “todoterreno”.

    No he podido migrar los comentarios de las entradas -en realidad no tenía más ganas de escribir SQL-. Espero que no os importe demasiado :)

    Por cierto, las suscripciones por correo a los comentarios las activaré mañana. Ahora son las 2 y cuarto y tengo ganas de acostarme ya…

     
    • Luis Medel 08:36 on 10/06/2009 Permalink

      Vaya, parece que al importar todos las entradas esto se ha puesto a hacer pingbacks como un loco (es una de las cosas que tenía pendiente de implementar, jejejejej)

      :)

    • Si Puedo 09:06 on 10/06/2009 Permalink

      Ohhhhhhhhhhhhhhhhh!!!!!!!!
      Y ese “repentino” cambio???

    • Luis Medel 10:55 on 10/06/2009 Permalink

      Pues como he dicho, porque tenía ganas de tener algunas funcionalidades útiles. Pingbacks y posibilidad de usar clientes XMLRPC para escribir las entradas sobre todo. Aunque ambas las tengo casi implementadas por mi cuenta, me falta tiempo para meterme a fondo y dejarlas “finas”.

      Mientras puedo y no puedo, prefiero tirar con un wordpress que me permita hacer lo que quiero y centrarme en otros aspectos de mi CMS que necesito “profesionalmente”. Cuando lo tenga todo listo, nada más sencillo que reactivar el blog anterior (con los contenidos debidamente actualizados, claro)

      Por cierto, acabo de darme cuenta de que necesito integrar el CMS con wordpress para presentar las últimas entradas en la portada, pero eso ya es más liviano :)

    • Si Puedo 23:30 on 10/06/2009 Permalink

      jejeje ya si lo había leido, no cuando decia lo de repentino era porque aún he visto cosas sin traducir :P

      pd: ojo con la fuente del body, porque como la tengas (como me pasa) se ve… un poco raro

    • Luis Medel 00:04 on 11/06/2009 Permalink

      @Si Puedo, muchas gracias :)
      A ver si cambio el tema por alguno más vistoso…

  • Cambios en el sitio

    Luis Medel 19:37 on 19/04/2009 | 0 Permalink | Reply
    Tags:

    ¡Aviso a navegantes! A lo largo de los próximos días voy a ir subiendo algunos cambios que estoy realizando sobre el motor del sitio. Así que os pediría a “los fijos” que si algo no funciona del todo bien (recibís algún correo que no proceda, observáis algún pete en una página, se me escapa información de depuración…) seais tan amables de avisarme.

    Espero que no tengais que sufrir mucho como betatesters :)

     
  • Por "La bahía"

    Luis Medel 15:03 on 17/04/2009 | 0 Permalink | Reply
    Tags:

    http://www.guardian.co.uk/technology/2009/apr/17/the-pirate-bay-trial-guilty-verdict

     
  • Sinde, pírate

    Luis Medel 07:03 on 08/04/2009 | 0 Permalink | Reply
    Tags:

    Aquí hay un puñado de razones

    Excelente Zapa, precisamente lo que necesitamos ahora es que, además de tontos, se nos siga llamando ladrones…

     
c
compose new post
j
next post/next comment
k
previous post/previous comment
r
reply
e
edit
o
show/hide comments
t
go to top
esc
cancel