Entrevista sobre el SPC referenciada en a:Ditoday

Referencia en a:Ditoday y resumen de la entrevista realizada por la revista Encuentros Diarios sobre el Sistema de Pagos Centralizado (SPC) de la AVPPM.

  • Referenced in «The Centralized Payments System, a crucial step» by a:Ditoday, number 138, year XIII, Barcelona, October of 2009.
  • Referenciado en «El Servicio Centralizado de Pagos, un paso crucial» por a:Ditoday, Barcelona, octubre de 2009.

Entrevista sobre el Sistema de Pagos Centralizado

Entrevista en Encuentros Diarios dedicada al Servicio de Pago Centralizado

Entrevista en la revista Encuentros Diarios de la Asociación de Vendedores Profesionales de Prensa de Madrid (AVPPM), en la que como su Consultor en Negocios y Tecnología presento los objetivos y características principales del Sistema de Pagos Centralizado (SPC) a los tres meses de su puesta en funcionamiento.

El SPC es la unión operativa de los quioscos en la función de pago que tiene un triple objetivo: facilitar el cobro a los proveedores presentes y futuros (lo que es relevante para nuevos proveedores no acostumbrados a trabajar con los quioscos de prensa), potenciar a la capacidad de negociación de los quioscos y dar un nuevo paso adelante en la modernización de la gestión de los quioscos.

  • Interviewee in «The Centralized Payments System, a crucial step» by ED Encuentros Diarios, monthly magazine, number 138, year XIII, AVPPM, Madrid, September of 2009.
  • Entrevistado en «El Servicio Centralizado de Pagos, un paso crucial» por ED Encuentros Diarios, revista mensual, número 138, año XIII, AVPPM, Madrid, septiembre de 2009.

Ideación el Sistema de Pagos Centralizado, AVPPM

Portada de Encuentros Diarios dedicada al crecimiento del Servicio de Pago Centralizado

Ideación y gestión del proyecto de desarrollo del Sistema de Pagos Centralizado (SPC) para la Asociación de Vendedores Profesionales de Prensa de Madrid (AVPPM).

El gráfico de la portada de la revista Encuentros Diarios (ya en marzo de 2010) muestra la evolución del volumen de pago semanal que gestiona el SPC.

El proyecto contó con el patrocinio del Instituto Madrileño de Desarrollo (IMADE) de la Comunidad de Madrid, dentro de su plan de subvenciones para la Innovación tecnológica en PYMES (InnoEmpresa 2009) y de los fondos FEDER de la Unión Europea.

  • Consultant, «Centralized Payments System (SPC)», an AVPPM project, Madrid, August of 2010.
  • Consultor, «Sistema de Pagos Centralizado (SPC)», un proyecto de la AVPPM, Madrid, agosto de 2010.

Aprender chino y poemas Táng, 2009

Traducción de juejus de la dinastía Táng

20 traducciones buscando la literalidad

de poemas de Dù Fu, Li Bái, Li Duan, Mèng Hàorán, Wáng Wéi, Xi Birén, Yú Shì Nán y Zhang Hù (dinastía Táng, siglos VII-X).

Los poemas son, por orden de aparición: Wáng Wéi «Adiós al partir», Wáng Wéi «Caída de la ciudad de Mèng», Li Bái «Sentado sólo en la montaña Jìng Tíng», Wáng Wéi «Entre los bambúes», Yú Shì Nán «Cigarras», Li Bái «Pensamiento en noche serena», Wáng Wéi «La cerca de los ciervos», Wáng Wéi «Llegada al pabellón del lago», Zhang Hù «Recuerdos de la infancia», Dù Fu «El Laberinto Octogonal», Wáng Wéi «La colina de Huá Zi», Xi Birén «La canción de Geshu», Mèng Hàorán «Pasando la noche en los ríos de Jiàndé», Wáng Wéi «Sierra de Jin Zhú», Li Duan «Escuchando al zheng», Wáng Wéi «Cerro del norte», Wáng Wéi «Cerro del sur», Wáng Wéi «Lago Yi» y Wáng Wéi «Albergue bajo el albaricoque veteado»

  • Author of «Learn Chinese and Táng poetry», Intellectual Property Register, number 16/2009/9955, Madrid, June of 2009. eBook illustrated in several languages self-constructed by object-oriented programming (poems, poets, poetry, quotes, pictures, etc.).
  • Autor de «Aprender chino y poemas Táng», Registro de la Propiedad Intelectual número 16/2009/9955. Madrid, junio de 2009. eBook ilustrado, en varios idiomas que se autoconstruye mediante programación orientada a objetos (poemas, poetas, versos, citas, figuras, etc.).

Informes estadísticos para ANECA

Informes estadísticos para la Agencia Nacional de Evaluación de la Calidad y Acreditación

Automatización de la generación de informes estadísticos sobre los resultados de la evaluación del profesorado universitario para la Agencia Nacional de Evaluación de la Calidad y Acreditación (ANECA).

Realizado en colaboración con Cetiver, es un desarrollo en lenguaje TOL, contra una base de datos SQL-Server, con generación de informes en formato PDF y envío automático de los informes por email a 44 Vicerrectores de Universidades Españolas.

Se trata de un programa de los que llamo nocturnos, capaz de funcionar sólo, por las noches, activado por el programador de tareas del sistema, sin necesidad de intervención humana. Fue la primera aplicación real de mis experimentos de generación de informes PDF, desde el lenguaje TOL, mediante la creación de páginas HTML intermedias y su conversión a PDF con Two Pilots.

El código específico de esta aplicación es privado, por lo que sólo incluyo un pequeño ejemplo de las 15 líneas de código de la función de llamada a Two Pilots, para la conversión de un informe HTML a PDF, que es completemente genérico y útil para el que desee invocar a este conversor en su modo de línea de mandatos.


///////////////////////////////////////////////////////////////////
Real PdfBuild(Text filInp, // Input html file
              Text filOut) // Output pdf file
///////////////////////////////////////////////////////////////////
{
  If(Not(FileExist(filInp)), FALSE, // Nothing to do
  {
    // with back slash
    Text dosInp = Replace(PdfAbs+filInp, "/", "\\");
    Text dosOut = Replace(PdfAbs+filOut, "/", "\\");
        
    Text cmdTxt = PdfExe+" "+           // Executable pdf convertor
                  dosInp+" "+           // Input file
                  dosOut+               // Output file
                  " /jpeg 100 /author Aneca";
    Text WriteLn("  Pdf: "+filOut);

    System(cmdTxt) // Execute html to pdf conversion
  })
};
///////////////////////////////////////////////////////////////////
PutDescription(
"Returns true if can create a pdf file filOut from "+
"an html file filInp.",
PdfBuild);
///////////////////////////////////////////////////////////////////
  

Situación actual de los quioscos de prensa

Introducción a la situación actual de los quioscos de prensa de Madrid

Artículo de Enrique Fernández Marqués y mío publicado en la revista Encuentros Diarios. Tiene cierta relevancia para este sector ya que Enrique Fernández Marqués es el Presidente de la Asociación de Vendedores Profesionales de Prensa de Madrid (AVPPM) y yo soy el Consultor en Negocios y Tecnología de la AVPPM.

Este artículo describe la realidad actual del sector de prensa y revistas en Madrid a lo largo de la cadena formada por los editores, los distribuidores y los quiosqueros, que son el punto de encuentro con el consumidor final. Desde esta realidad actual se plantean las vías de evolución de los quioscos de prensa y su cambio de fisonomía en un futuro no muy lejano.

  • Coauthor of «Current situation of the newspapers stores of Madrid», ED Encuentros Diarios, monthly magazine, number 135, year XIII, AVPPM, Madrid, May of 2009.
  • Coautor de «Situación actual de los quioscos de prensa de Madrid», ED Encuentros Diarios, revista mensual, número 135, año XIII, AVPPM, Madrid, mayo de 2009.

Lanzamiento del web jueju.es

Página web jueju.es dedicada a aprender chino con poemas Táng

En mayo de 2009, lanzo mi página web http://www.jueju.es, que bajo el lema «aprender chino y poemas Táng», es la plasmación en internet de mi proyecto de traducción de poemas jué jù de la dinastía Táng (del 618 al 907 DC) orientado al aprendizaje del chino.

Son traducciones con métrica pero sin rima, que buscan un isomorfismo con el poema original. Ello me permite asociar, mediante un esquema de colores, cada carácter chino y su pronunciación en pinyin con 1 ó 2 palabras en español para facilitar el aprendizaje del chino.

En http://www.jueju.es se presentan poemas jué jù de los poetas Dù Fu, Li Bái, Mèng Hàorán, Wáng Wéi, Wáng Zhihuàn, Xi Birén, Yú Shìnán, etc. para aprender la lengua china a través de sus clásicos.

Mis traducciones se complementan con tablas trilingües (chino simplificado, tradicional, pinyin e inglés y español) para el vocabulario, imágenes para pictogramas e ideogramas, diagramas de derivación para caracteres compuestos, esquemas tonales para la entonación y todo ello acompañado de textos explicativos e ilustraciones mías en tintas y acuarelas para ir más allá de lo meramente textual.

  • Chinese language (Mandarin basic level) and translation of Tang Dynasty poetry (VII-X AC), available website with own translations at http://www.jueju.es.
  • El chino (nivel básico de Mandarín) y la traducción de poemas de la Dinastía Táng (VII-X dC), en http://www.jueju.es están disponibles mis traducciones.

InkWatercolor, primavera 2009

Patrones, patterns, catálogo de primavera 2009

Patrones | Patterns

Catálogo de primavera del año 2009 de InkWatercolor, 49 páginas, color, inglés y español.

Contiene patrones ~ patterns y creaciones artísticas inscritas en el Registro de la Propiedad Intelectual de Madrid con número de asiento registral 16/2009/9490, fecha de presentación y efectos 25 de febrero de 2008, titular de los derechos Antonio Salméron Cabañas y consistentes en arcos ~ arcs, bambú ~ bamboo, barcos ~ ships, bolas ~ balls, brotes ~ sprouts, cadenas ~ chains, cruces ~ crosses, dodecaedros ~ dodecahedrons, espirales ~ spirals, flores ~ flowers, flujos ~ flows, globos ~ ballons, humo ~ smoke, laberintos ~ labyrinths, laberintos ~ labyrinths, mejillones ~ mussels, nubes ~ clouds, palacios ~ palaces, palmeras ~ palm trees, pentágonos ~ pentagons, puertas ~ doors, rayos -rays, renacuajos ~ tadpoles, salamandras ~ salamanders, santos ~ saints, sedimentos ~ sediments, simetrías ~ symmetries y triángulos ~ triangles.

Patrones, patterns, InkWatercolor, primavera 2009

Foro de Inteligencia de Negocio

Portada del Foro de Inteligencia de Negocio 2009

Conferencia como Responsable de Business Intelligence de Cetiver, titulada «Si el público fluye, ¿por qué no adaptar nuestra respuesta?», en el Foro de Inteligencia de Negocio, dentro de las Jornada de Marketing y Ventas, organizado por Interban Network, en el Palacio Municipal de Congresos, Campo de las Naciones, Madrid, el 17 de marzo de 2009.

El título de esta conferencia procede de una idea, desarrollada junto con Luis Torrijos, sobre la adaptación de las organizaciones a los mercados cada vez más cambiantes, que de forma completa se expresaba como: «Si el público fluye, ¿por qué no adaptar nuestra respuesta? Hay mucho que ganar». El objetivo de la presentación era resumir algunas de las claves del éxito, en la construcción de sistemas de Inteligencia de Negocio, que he adquirido durante años de experiencia y con el desarrollo de muchos proyectos.

  • Lecturer in «If the public flows, why not to adapt our response?», Business Intelligence Forum, Interban Network, Madrid, March of 2009.
  • Conferenciante en «Si el público fluye, ¿por qué no adaptar nuestra respuesta?», Foro de Inteligencia de Negocio, Interban Network, Madrid, marzo de 2009.

GNU Plot, TOL, Html2Pdf y series temporales

Informes gráficos en PDF con GNU Plot + TOL + Two Pilots Html2Pdf

En la documentación adjunta a este post se cuenta el proceso de investigación sobre cómo automatizar la generación de informes con gráficos de series temporales mediante la combinación de GNU Plot con TOL con Html2Pdf de Two Pilots. El objetivo es mecanizar informes gráficos sin intervención humana.

Se presentan cuatro ejemplos, crecientes en complejidad:

  • El primero genera un gráfico simple en formato GIF utilizando GNU Plot, se trata de un programa de demostración de GNU Plot ligeramente modificado.
  • El segundo muestra la generación de un gráfico en formato GIF de una serie temporal larga con datos que proceden del Banco de Canada (Bank of Canada).
  • El tercero muestra cómo generar un gráfico en formato GIF con una serie temporal almacenada en el formato BDT de TOL. También se construye un fichero HTML que contiene el gráfico y lo convierte a PDF llamando tanto a GNU Plot como al conversor a PDF (Two Pilots Html2Pdf) desde TOL.
  • En el cuarto se genera el mismo gráfico que en el tercero pero en 3 formatos diferentes JPEG, GIF y PNG, se insertan los tres gráficos dentro de una página HTML y se produce el PDF utilizando la mejor calidad posible para la generación de los JPEG internos del PDF. Como se explica en el fichero PDF adjunto, al final de este post, el formato que proporciona mejores resultados es el PNG (formato que desde hace tiempo me gusta mucho, por ejemplo, todas las imágenes de este web están en formato PNG).
  • Finalmente en el quinto se utiliza multiplot para generar un gráfico del estilo de los que se emplean en los mercados bursátiles con datos de la operadora de telecomunicaciones Jazztel. También en este ejemplo, dejo de utilizar la extensión de demostración de los ficheros de GNU Plot (.dem) para utilizar la genuina (.plt).

Adjunto a continuación un trozo del código (el código fuente completo se puede ver en el documento adjunto a este post) donde se generan las especificaciones para GNU Plot a partir de una plantilla e igualmente para la página HTML y se invoca a GNU Plot y a Two Pilots Html2Pdf. La plantilla para GNU/Plot está inserta en el propio código TOL y la plantilla para la página HTML se lee de un fichero externo:


///////////////////////////////////////////////////////////////////
// GnuPlot prototype
///////////////////////////////////////////////////////////////////
Text ploSed =
"
set term gif font 'arial' 10 size SIZWID, SEDHEI
set output 'FILGIF'
set datafile separator ';'
set title 'GRATIT' textcolor lt 3 font 'arial,14'
set style data lines
set timefmt '%d/%m/%Y'
set xdata time
set xlabel 'LABELX' textcolor lt 3 font 'arial,12'
set xrange [ 'DTEINI':'DTEEND' ]
set xtics rotate by 90
set format x '%d/%m/%Y'
set ylabel 'LABELY' textcolor lt 3 font 'arial,12'
set yrange [ 0 : ]
set format y '%g'
set grid
set key left
plot 'FILDAT' using 1:2 t 'SERNAM'
reset
";


///////////////////////////////////////////////////////////////////
// Dates and names
///////////////////////////////////////////////////////////////////
Text iniTxt = FormatDate(First(UniqueUsers), "%d/%m/%Y");
Text endTxt = FormatDate(Last (UniqueUsers), "%d/%m/%Y");
Text serNam = Name(UniqueUsers);


///////////////////////////////////////////////////////////////////
// Build and write the GnuPlot command file
///////////////////////////////////////////////////////////////////
Text ploDem = ReplaceTable(ploSed,
  [[ [["SIZWID",  "800"]], [["SEDHEI",  "500"]],
     [["FILGIF", filGif]],
     [["GRATIT", "Demo: BDT to GIF Chart"]],
     [["LABELX", "Weeks"]],
     [["DTEINI",  iniTxt]], [["DTEEND", endTxt]],
     [["LABELY", serNam]],
     [["FILDAT", filDat]],
     [["SERNAM", serNam]] ]], 1);
Text WriteFile(filDem, ploDem);


///////////////////////////////////////////////////////////////////
// Run GnuPlot
///////////////////////////////////////////////////////////////////
Text cmdExe = "C:\\asc\\Bin\\gnuplot\\bin\\pgnuplot";
Text cmdTxt = cmdExe+" "+filDem;
Real cmdRun = System(cmdTxt); // Execute gnuplot


///////////////////////////////////////////////////////////////////
// Makes a Pdf file from the Html page
///////////////////////////////////////////////////////////////////
Text codHtm = ReplaceTable(ReadFile(filSed),
  [[ [["SIZWID",  "800"]], [["SEDHEI",  "500"]],
     [["FILGIF", filGif]],
     [["PLOCOD", ploDem]] ]], 1);
Text WriteFile(filHtm, codHtm);


///////////////////////////////////////////////////////////////////
// Makes a Html page from a seed
///////////////////////////////////////////////////////////////////
Text pdfExe = "\""+"C:\\Archivos de programa\\Two Pilots\\"+
                      "HTML2PDF Pilot\\HTML2PDF_Pilot.exe"+"\"";
Text pdfInp = "C:\\asc\\App\\GnuPlot.Test\\"+filHtm;
Text pdfOut = "C:\\asc\\App\\GnuPlot.Test\\"+filPdf;
Text pdfCmd = pdfExe+" "+             // Executable pdf convertor
              pdfInp+" "+             // Input file
              pdfOut+" "+             // Output file
              " /jpeg 100 /author asalmeron@asolver.com";

Real pdfRun = System(pdfCmd); // Execute html to pdf conversion
    

La documentación adjunta incluye, en el mismo orden anterior (salvo los tres códigos fuente HTML que están al final del todo): el código completo de especificaciones para GNU Plot, el código fuente TOL, los datos de series temporales utilizados en los gráficos y los ficheros de mandatos.

Ajax para el cambio de divisas

Conexión Ajax con el Rss del Banco de Canada para el cambio de divisas

¿Aburrido de tener que ir divisa a divisa buscando el cambio cada día, para copiarlo e introducirlo en hojas Excel?. Así estaba yo hasta que me programé esta combinación de JavaScript y PHP para leer los RSS (Really Simple Syndication en formato XML) del Banco de Canada (Bank of Canada), de siempre mi banco central favorito, para obtener una tabla de cambios con mis divisas habituales y poder pegar con comodidad esa tabla en las hojas Excel que necesitaban esos cambios actualizados.

El resultado es una página web, con un estilo vintage muy a mi gusto, en colores de computador clásico y con la preciosa Lucida Console por tipo de letra.

Todo el código JavaScript y PHP (PHP Hypertext Pre-processor ) puede consultarse en PDF (Portable Document Format) al final de este post, sólo pongo a continuación un par de funciones, la primera JavaScript y la segunda PHP, que muestran como se puede tener un estilo de programación similar con leguajes de programación diferentes.


///////////////////////////////////////////////////////////////////
   function XmlGetValue(itm, atr)

// PURPOSE: Returns a text value. If atr = cb:value and itm =
// ...<cb:value frequency="business" decimals="4">0.9947</cb:value>...
// first gets " frequency="business" decimals="4">0.9947<"
// and returns 0.9947
///////////////////////////////////////////////////////////////////
{
  var tmp = TxtBetween2Tag(itm,"<"+atr,"/"+atr+">");
  var txt = TxtBetween2Tag(tmp,">","<");
  return(txt);
}

///////////////////////////////////////////////////////////////////
   function GetRssFile()
   
// PURPOSE: Gets the contents of an external Rss feed and saves its
// contents to the cached file on the server.
///////////////////////////////////////////////////////////////////
{
  global $rssUrl, $pthFile;
  $contents=file_get_contents($rssUrl); // Fetch the Rss file
  $fp=fopen($pthFile, "w");             // Open local file for write
  fwrite($fp, $contents);     // Write contents of Rss to cache file
  fclose($fp);                          // Close the local file
}
  

Observatorio de la Economía y la Sociedad China

Contraportada de la primera entrega en OES-China 9

De diciembre de 2008 a junio de 2010 he publicado traducciones de poemas jueju de la dinastía Táng en la revista Observatorio de la Economía y la Sociedad China (OES-China, ISSN: 1887-3197), en la sección de Cultura y Sociedad coordinada por Yawen Teh.

OES-China es una revista editada por Eumed.Net su editor ejecutivo es Juan Carlos M. Coll y está patrocinada por la Universidad de Málaga y la Fundación Universitaria Andaluza «Inca Garcilaso».

Durante estos años se han realizado 5 entregas:

  1. Diciembre de 2008, primera entrega, OES-China, número 9.
  2. Marzo de 2009, segunda entrega, OES-China, número 10.
  3. Julio de 2009, tercera entrega, OES-China, número 11.
  4. Septiembre de 2009, cuarta entrega, OES-China, número 12.
  5. Junio de 2010, quinta entrega, OES-China, número 13.

Estas 5 entregas representaron todo un proceso de evolución en mi técnica y metodología de traducción de la poesía medieval china.

  • Author of «Learn Chinese and Tang poetry», OES Chine magazine, numbers 9, 10, 11, 12 & 13, 5 publications with different poems each, Málaga, 2008, 2009 & 2010.
  • Autor de «Aprender Chino y Poemas Táng», revista OES China, números 9, 10, 11, 12 & 13, 5 publicaciones con poemas diferentes cada una, Málaga, 2008, 2009 y 2010.

Canales de distribución y preguntas de marketing

Tipos de canales de distribución y otras preguntas de marketing

En un foro asociado al curso de especialista en gestión inmobiliaria de la Universidad de Burgos, cuando lo cursaba, me hicieron las siguientes preguntas:

«¿Qué se entiende por canales directos de distribución, por cortos y largos y por estrechos y anchos?.
¿Qué es normalizar la oferta?.
¿Qué significa que no existe un substrato transferible?.
Pon un ejemplo de mercados organizacionales»

Reproduzco aquí mis respuestas:

Canales directos de distribución: Los que van directamente del fabricante al comprador, sin pasar por nadie más, por ejemplo, Dell fabrica computadores e intenta que se los compres directamente.

Canales cortos / largos de distribución: Canal corto es el que tiene pocos pasos, por ejemplo, Coca-Cola, la embotelladora (Casbega en Madrid, Cobega en Cataluña, etc.) embotella y con sus camiones (antes propios y ahora subcontratados) llega al bar de tu barrio que te la vende. El extremo de canal corto es el directo que sólo tiene un paso. Canal largo el que tiene muchos pasos fabricante, mayoristas, minoristas, etc.

Canales estrechos / anchos de distribución: Por ancho del canal se entiende el número de entidades en paralelo que ofrecen el producto. Por ejemplo, los coches de lujo, imaginemos Buick, tienen un canal estrecho, puede haber un concesionario o a lo sumo 2 en una gran ciudad. Los chicles Orbit tienen un canal ancho, en bares, tiendas de chuches, quioscos, máquinas en la calle, miles de sitios ofreciéndolos.

Normalizar la oferta: Se dice que un sector ha normalizado la oferta cuando consigue establecer medidas en casi todo lo que compra de forma que los productos o servicios que compra son totalmente comparables. Normaliza pesos, anchos, gamas de calidades, etc. de forma que junto con su precio las ofertas son fácilmente comparables. Cuando la oferta esta está hipernormalizada se podría llamar "commoditie" (luz, agua, gas, etc.), en este caso la única variable verdaderamente es el precio. La electricidad esta supernormalizada, es un commoditie, no hay electrones de más o menos calidad (te venden electrones verdes, de energía eólica, pero realmente no sabes si el electrón procede de una central nuclear, es un invento para intentar diferenciarse). En este casos prácticamente la decisión de compra es a cuánto vale el megawatio. Cuando hay precios caros y baratos, pero los productos tienen características muy diferentes y no son comparables, se dice que la oferta no está normalizada. Hay dentistas caros y baratos pero es difícil saber si el caro es realmente bueno, si el empaste estará bien hecho, si no se infectará y si no lo pasarás tan mal como la última vez o si justo eso es, al revés, que el barato es el realmente bueno.

No existe un substrato transferible: Que no hay nada que dar físico, por ejemplo, el servicio de un psicólogo. Vas allí y el psicólogo puede ser bueno o malo y a ti valerte o no valerte, pagas y no vuelves a casa con un paquete que enseñar a los niños, llegas con tus problemas resueltos o no o a medio resolver.

Ejemplo de mercados organizacionales: Tal vez se entiende mejor cuando se les denominan mercados industriales. Por ejemplo, todo el mercado alrededor de los grandes fabricantes de coches, hay quien vende gomas, telas, planchas, tornillos, ..., el que fabrica los asientos compra al de telas o a varios, pero también al de los tornillos o a varios, el fabricante de coches compra a los de los asientos, pero también a los de tornillos, grandes, medianas y pequeñas empresas comprándose y vendiéndose para ofrecer al final un producto que es un coche. De poco vale el marketing convencional (de gran público) para conseguir colocarle tus tornillos a la BMW.

InkWatercolor, otoño 2008

¿Por qué nunca termino nada?, why do I never finish anything?, catálogo de otoño 2008

¿Por qué nunca termino nada? | Why do I never finish anything?

Catálogo de otoño del año 2008 de InkWatercolor, 12 páginas, color, inglés y español.

Contiene 10 obras artísticas en su interior más una de portada tituladas: why do I never finish anything? ~ ¿por qué nunca termino nada?; seventeen points of growth [angel of cryings] ~ diecisiete puntos de crecimiento [angel de los lloros]; up and down in the green lagoon ~ arriba y abajo en la laguna verde; multiplication of wealth and opportunities ~ la multiplicación de la riqueza y las oportunidades; a self-propelled crushing machine of souls ~ máquina trituradora de almas, autopropulsada; the flowers of the hell [waiting for a kiss] ~ las flores del infierno [esperando un beso]; heart tunnelling, a silent process ~ perforación del corazón, un proceso silencioso; a parting, bié sòng [Wáng Wéi] ~ adiós al partir, bié sòng [Wáng Wéi]; slow sleeping waves against the column ~ lentas ondas de sueño contra la columna; the quest of the last saints ~ la búsqueda de los últimos santos y the iconoclast tree, icons of thought ~ el álbol iconoclasta, iconos del pensamiento.

¿Por qué nunca termino nada?, why do I never finish anything?
  • Author of «Automatic painting 1991/2004; 210 paitings using inks, watercolors and others media», Intellectual Property Register, number 16/2008/9490, Madrid, September of 2008.
  • Autor de «Pintura automática 1991/2004; 210 cuadros con tinta, acuarela y otros medios», Registro de la Propiedad Intelectual, número 16/2008/9490, Madrid, septiembre de 2008.

Contador de separadores de campos

En una gran aseduradora nos volcaban ficheros inmensos de datos de operaciones sobre polizas desde el host, ficheros con millones de registros. Eran ficheros planos y ellos mismos elegían el carácter separador de campos. Esos ficheros los subíamos, a su vez, a otra base de datos que los cargaba utilizando, para interpretar la separación de campos, el carácter indicado en cada caso. Esta carga se realizaba empleando el programa de carga suministrado junto con el sistema de gestión de la base de datos.

El proceso de carga era lento y, además, con frecuencia, el carácter que habían elegido, aparecía en algún campo de texto de algún registro. Por ejemplo, elegían el asterisco y algunos campos de observaciones contenían asteriscos. Al llegar al primer registro con más separadores de los esperados el proceso de carga abortaba tras horas de ejecución.

La solución era programar un comprobador de ficheros, muy rápido, que antes de iniciar el proceso de carga, comprobara que todas las líneas del fichero contuvieran el mismo números de caracteres separadores de campo, asumiendo como correcto el número de separadores de la primera línea del fichero. Y sólo comenzar la carga a la base de datos tras comprobar que el fichero era correcto.

Hacía ya mucho tiempo que no programaba en C y esta era una ocasión para volver a él. El programa se llama chksep.exe, esta hecho en lenguaje C en pocas horas, por lo que seguro que se puede mejorar. Se ejecuta como chksep 42 < fichero.txt, donde el 42 es el código ASCII del caracter *, que era el separador de campos habitual, aunque se puede elegir cualquier otro carácter, por ejemplo, chksep 59 < fichero.txt, para el punto y coma.

El programa visualiza las líneas donde el número de separadores de campo es diferente al de la primera línea. En un computador portatil normal este programa es capaz de revisar un Giga en 2 minutos 15 segundos, lo que equivalía con los ficheros reales que nos daban a unos 800.000 registros por minuto. Por lo que en 5 ó 10 minutos se podía evitar que luego abortara una carga de horas. El programa también cuenta el número de líneas del fichero.

A continuación pongo el ciclo principal del programa y en el fichero PDF adjunto a este post el código fuente completo.

Me gustan mucho los programas eficaces de pocas líneas de código y que sean eficientes ya lo considero un regalo.


while((chrInp=getc(stdin)) != EOF)
{
       if(chrInp==sepChr) { sepCnt++; }     /* Es un separador */
  else if(chrInp==EOL)                 /* Es un salto de linea */
  {
    if(linCnt==1)                  /* Estabamos en la 1ª linea */
    {
      sepFst = sepCnt;   /* Referencia para el resto de lineas */
      printf("\n[%d] [%s] en la primera linea.", sepFst, sepStr);
    }
    else                                       /* Linea normal */
    {
      if(sepFst!=sepCnt)        /* Faltan o sobran separadores */
      {
        printf("\nlinea %d: [%d] [%s] en vez de [%d].",
               linCnt, sepCnt, sepStr, sepFst);
      }
    }
    linCnt++;             /* Incrementar el contador de lineas */
    sepCnt = 0;     /* Poner a cero el contador de separadores */
  }
}
printf("\nProcesadas [%d] lineas.", linCnt);