30. July 2008 17:47Regex y SQL statements

En uno de los proyectillos personales que estoy haciendo me he encontrado con la necesidad de parsear sentencias insert de SQL y extraer los valores que se introducen en la tabla. Una primera idea puede ser la de sacar el substring después de la cadena "VALUES" hasta el final de la línea y usar después el método split con el carácter ','. Sin embargo esto tiene sus inconvenientes, y es que los valores introducidos no pueden tener comas. Obviamente, esto es una castaña y no vale para nada así que tocó ver si alguien más había tenido este problema y si de casualidad había alguna expresión regular por ahí... Lo mejor que encontré fue esto.

(INSERT INTO\s+)(\w+)(\s+\()([\w+,?\s*]+)(\)\s+VALUES\s+)((\(['?\w+'?,?\s*]+\)\,?;?\s*)+)

Lamentablemente, esto no cumplía mis necesidades... Lo único que encuentra son caractéres alfanuméricos y adiós al resto. No me quedaba ninguna otra alternativa así que abrí mi Expresso dispuesto a refrescar esas regex. Después de mucho pelearme por fín he conseguido una expresión que cubre mis necesidades y un programa que me muestra cada valor de forma independiente:

(?:INSERT INTO\s+)`(?:\w+)`(?:\s+\()(?:[`\w+`,?\s*]+)(?:\)\s+VALUES\s*)\(?(?<values>\w+|'.*?')(?:,\s*(?<values>\w+|'.*?'))*\);

La parte más importante de la consulta es (?<values>\w+|'.*?') (las dos veces que aparece). Por una parte le indicamos que todos los "aciertos" los meta dentro del grupo values. Por otro le decimos que "matchee" cualquier carácter ( '.*?' ) que esté entre comillas simples ( '.*?' ), que se repita 0 o n veces ( '.*?' ) y que además sea lo más pequeño posible (as few as possible). Y en esto radica el éxito. ¿Que pasaría si no lo hubiéramos separado? Pues que adiós a la correcta separación de los campos (haced la prueba y ya veréis).

El código en C# que muestra cada imprime por pantalla cada campo es el siguiente:

   1: string pattern = @"(?:INSERT INTO\s+)`(?:\w+)`(?:\s+\()(?:[`\w+`,?\s*]+)(?:\)\s+VALUES\s*)\(?(?<values>\w+|'.*?')(?:,\s*(?<values>\w+|'.*?'))*\);";
   2: MatchCollection mc = Regex.Matches(line, pattern);
   3:  
   4: foreach (Match match in mc)
   5: {
   6:     foreach (Capture capture in match.Groups["values"].Captures)
   7:     {
   8:         Console.WriteLine(capture.Value);
   9:     }
  10: }

siendo line la línea que representa el INSERT (¡en una sola línea!).

Por fin puedo parsear cosas del estilo:

INSERT INTO `wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES
(944, 79, 'keywords', 'Steve, jobs, apple, ipod, barrapunto, free, gratis, superordenador, computación,'),
(951, 81, '_edit_lock', '1211789640');

¿De dónde habré sacado yo una cosa tan fea?

29. July 2008 14:49Versión 2.0

¡Hola a los cuatro gatos que me leen!

Como habéis podido ver (o quizás no si me léeis por rss) el blog ha cambiado, y no solo de forma. En esta nueva etapa quiero alejarme de las polémicas, fanatismos y de los talibanes. Todo eso se lo dejo a los de tecnicoless. ¿Qué es lo que puedes esperar ahora de este blog? Pues de todo: trozos de código, programillas, reseñas de libros, idas de pinza y cualquier otra cosa que se me ocurra en el momento y que me apetezca compartir :)

Sean bienvenidos a este circo de lo absurdo que la banda va a empezar a tocar.

28. July 2008 00:52Hello World!

Stay tuned.

News coming soon!!!

27. July 2008 23:49Probando, probando

¬¬

6. June 2008 04:14Jad Engine

En el proyecto Jad Engine están buscando a uno o dos programadores de gráficos que se quieran unir al equipo. Jad Engine es un proyecto LGPL que ya tiene unos 3 años de vida y donde colaboran entre 2 y 6 personas de Alemania, Estados Unidos y España. Como casi cualquier proyecto hay momentos buenos y momentos malos y ahora mismo los dos programadores de la parte de render no pueden seguir colaborando por motivos laborales.

De momento la nueva versión tiene las bases pero la verdad que queda mucho trabajo por hacer aún. Si alguien está interesado se necesita gente que sepa de C# (saber C++ además es un extra) y que tenga buenos conocimientos sobre el diseño de motores de render (si conoce o ha trabajado con OpenSceneGraph o con Ogre/Axiom mejor que mejor, porque se han cogido algunas ideas de ellos). Da igual saber DX u OpenGL porque el engine es neutral respecto al renderer (la idea es tener varios). El interesado debería también tener tiempo libre que dedicar al proyecto y ser capaz de conectarse al IRC para charlar con el resto de la gente del equipo (en particular con la gente que hizo la parte gráfica para que les expliquen como está organizado y puedan enterarse de forma más sencilla). Está claro que hay que estar cómodo con el inglés

Pues nada más, al que esté interesado que postee en su blog o que mande un mail a jadengine@gmail.com.

Un saludo!

26. May 2008 18:37Apocalypse Now

Arrepentíos hermanos, porque el fin del mundo está cerca. Confesad ante el altísimo vuestros pecados y suplicad vuestro perdón para no arder el resto de la eternidad en el infierno. Mirad los signos que se nos envían. Aún no es demasiado tarde para alcanzar la salvación. ¿Cómo? ¿Qué no has visto los signos? The random number generator in  Debian''s openssl package is predictable. El fin del mundo está cerca, ¡¡arrepentíos!!

Y como no, vamos a crear un poco de flame que la cosa ha estado muy tranquila últimamente :)

Como ya sabréis, un par de líneas de código comentadas hace unos dos años han provocado todo este desaguisado. Hay varias cosas que me dejan sorprendido, la primera son las razones por las que se modificó (para que un analizador de código no se quejara) y la segunda es que hayan pasado dos años hasta que alguien lo hiciese público. ¿Una de las principales ventajas del software libre no es que al estar disponible el código éste es revisado por miles de ojos haciéndolo mucho más seguro? Ese siempre ha sido uno de los principales argumentos en su favor, ¿no? Que estamos hablando de openssl y no de un programa usado por cuatro gatos. Si este paquete ha tenido este problema, ¿cuántos más tendrán vulnerabilidades introducidas por las mismas razones? No estamos hablando de código mal programado, sino de modificaciones que se hacen a la fuente original para "cumplir una serie de requerimientos y necesidades" de una distribución concreta. ¿Por qué tantas distribuciones? ¿Por qué cada uno va a su bola? ¿Por qué no hay un poco más de unidad? ¿Por qué se pierde tanto tiempo y esfuerzo en reinventar la rueda? Si el objetivo es desbancar a Microsoft, ¿que coño hacéis perdiendo el tiempo?

¿Por qué hay tantos desarrolladores de SL incapaces de ver más allá de su ombligo? ¿Por qué piensan que lo suyo siempre será "más mejor" y que por eso deberían hacer un fork metiendo nuevas incompatibilidades y dividiendo más a la "comunidad"? Solo hay que ver lo que pasó con compiz y beryl. O con los cientos de distribuciones que hay. ¿Realmente necesitamos que existan Mythbuntu, KnoppMyth y mythdora? ¿O que se pierda el tiempo en vidalinux?

Para continuar con el tema de la seguridad, espero que todos os hayáis leído el último informe de Jeff Jones sobre las vulnerabilidades encontradas en los principales sistemas operativos en el primer trimestre de este año. La verdad es que salen unos resultados bastante curiosos. ¿Alguien quiere comentar algo o está en desacuerdo con los resultados?

¡Buen comienzo de semana!

 

21. May 2008 08:21El reto de Bruce Lee

Del creador del reto de Chuck Norris nos llega ahora su última superproducción... el Reto de Bruce Lee:

Bruce Lee, que al igual que Chuck Norris estudió las artes del código simple y conciso, falleció en un intento de dejarnos escrito en C# 3.0 su reflexión vital más importante.

Según las últimas averiguaciones, parece que compartía la obsesión de escribir en una sola línea cualquier programa, y su incapacidad para hacerlo en esta ocasión le produjo un ataque de epilepsia en un apartamento de Hong Kong. Este fue el último legado del pequeño dragón:

Func<int, int> f = n => Enumerable.Range(0, n).Aggregate(new Point(1, 0), (p, a) => new Point(p.Y, p.X + p.Y)).Y;

Uri solution = new Uri("http://www.youtube.com/watch?v=" + new string(Enumerable.Range(0, 11)
.Select(i => "YOW-LczanEDpoiE"[f(i + 2) % 15]).ToArray()));

 

El equipo de Signum Software necesita ayuda para resolver los siguientes interrogantes:

  1. ¿Cuál es el video que Bruce Lee nos dejó como testamento? (compilar y ejecutar el código)
  2. ¿Que quería expresar Bruce Lee con la función ''f'' ?
  3. ¿Serías capaz de reescribir en una sola linea (en lugar de dos) el código que produjo la muerte de Bruce y dejar que su alma descanse en paz después de 35 años?

Si eres capaz de ayudarnos en alguna de estas preguntas queremos que trabajes con nosotros. Ofrecemos:

- Entorno joven y dinámico en una empresa de IT.

- Trabajo con las últimas tecnologías de .Net (Framework 3.5, C# 3.0, Sql Server 2005, WCF, WPF).

- Contrato fijo.

- Retribución 24.000 - 30.000 € brutos anuales. Si eres universitario/a, posibilidad de compatibilizar el horario con tus estudios (oficina cerca de la Facultad Informática UPM)

Si tenéis la solución escribid a empleo@signumsoftware.com

19. May 2008 00:27Aquí hay tomate (week nº20/08)

Y siguiendo con mi propósito de año nuevo de postear más (sí, voy con un poco de retraso lo sé), seguimos con otra edición más de "Aquí hay tomate":

¡A disfrutar lo que queda de fin de semana!

14. May 2008 21:00Steve Jobs prepara la dominación del mundo

Lo más importante cuando se va a publicar algo en internet es el título. Que sea verdad lo que pones o no es completamente secundario, las tres cuartas partes de la gente que lo vean no leerán jamás la noticia y se quedarán con la copla. Pero, ¿qué pasa con los que sí lo leen? Pues que probablemente se les quede la misma cara de "pero qué clase de ponzoña es esta" que se me quedó a mí cuando leí "Un superordenador a partir de iPods" en Barrapunto. Como no tenía muy claro si la máquina estaba ya en funcionamiento o no, y en vista de las cifras increíbles que daban, fui rápidamente a la fuente que citaban donde tuve el placer de leer perlas como esta:

Para los grandes superordenadores el consumo de energía se está convirtiendo en un grave problema. Unos investigadores de Berkeley creen haber encontrado la solución; utilizar microprocesadores para dispositivos móviles.

¿Ahora son dispositivos móviles? ¿No eran iPods? Sí, ¿no? El título en ambas noticias lo deja bastante claro. Lo digo porque la relación de potencia es bastante considerable. No es lo mismo tener un procesador con coma flotante que uno sin ella. No es lo mismo tener un procesador a 75MHz que otro a 600MHz.

En serio, leeros la noticia que no tiene desperdicio: 200 petaflops (el record lo tiene BlueGene/L con 478 TFlops, "casi na" de diferencia), 20 millones de procesadores (BlueGene/L tiene 106,496 nodos), ¿superordenadores que usan procesadores con gráficas integradas y que por eso consumen más? Vamos hombre, que no es el servidor de mi casa. ¿Estamos hablando de superordenadores de verdad? Menos mal que la fiesta no se acababa y el autor citaba otros dos artículos. Más de la misma mierda. ¿Dónde están esos iPods? ¿Dónde está ese diseño de supercomputador que revolucionará la predicción meteorológica? ¡Quiero que me devuelvan mi dinero! Completamente asqueado de ver tanta basura y siendo incapaz de comprender como alguien podía haber publicado algo con tanta chorrada junta (y de que la gente se hiciese eco de ella) decidí leer el paper al que hacen mención (Towards Ultra-High Resolution Models of Climate and Weather). La verdad es que el documento es bastante interesante y no tiene nada que ver con la cantidad de tonterías que había leído antes. A parte de hablar sobre los problemas para la predicción climática y de su modelo, la sección que más me ha gustado ha sido "4 Designing an HPC System for Kilometer Scale Climate Modeling". Me quedo con frases como:

Tensilica takes the embedded design philosophy one step further: customizing the design of the processor core so that it is custom-tailored to the computational requirements of the application [...]

The Tensilica approach represents the most extreme application of architectural specialization in order to improve power efficiency. However, it is important to note that the software infrastructure to utilize a system at this scare (3.7M cores, 116K sockets) remains a daunting challenge to implement. However, the situation is far worse since these calculations are based on the assumption that these systems will sustain peak perfomance.

¿Y ese superordenador de iPods? ¿Dónde está? ¿Se está fabricando ya? ¿Han hecho ya los pedidos de componentes? ¿Y todas las cifras que se han dicho en todos esos artículos? ¿Dónde están los 200 petaflops que me prometieron? En fin, tanta cosa para nada.

¡Feliz miernes a los madrileños!

8. May 2008 05:19El día de Edans

Y es que Edans se llenó de gloria hace unos días con la noticia El mito de la puerta trasera. Si no la habéis leído os la recomiendo encarecidamente. Pensaba escribir un fantástico post poniéndolo a caer de un burro, pero ya ha habido unos cuantos que se me han adelantado, y es que parece que todos se pusieron de acuerdo ayer :)¡Buena lectura a todos!

Powered by BlogEngine.NET 1.4.5.0
Theme by molant