JuanCri.com

RSS: RSS
Shared Items: RSS
Add to Google

lunes 26 de julio, 2010 a las 23:57

xmlstarlet se autodefine como un toolkit XML para línea de comando.

He usado esta herramienta desde hace varios años, generalmente para validar un xml, ya sea que esté bien formado como también contra un esquema (XSD) o DTD. Para lo primero, basta con:

xmlstarlet val test.xml

Hoy, sin embargo, estaba buscando una forma rápida de obtener un valor desde un archivo XML. Tomemos como ejemplo este archivo:


	
		
			textoelemento
		
	

Si queremos, por ejemplo, seleccionar el texto de elemento, podemos ejecutar:

xmlstarlet sel --text -t -v /root/hijo/elemento test.xml

Si queremos encontrar el valor del atributo, ejecutamos:

xmlstarlet sel --text -t -v /root/hijo/elemento/@atributo test.xml

Para seleccionar elementos se utiliza la sintaxis XPath. Más info aquí.

miércoles 12 de mayo, 2010 a las 06:22

Niños: NUNCA HAGAN ESTO:

Sitio web:

Código fuente:

lunes 3 de mayo, 2010 a las 20:28

Hoy lanzo oficialmente mi nuevo blog: magnetoscopio.net

En él, pretendo publicar todos mis posts referentes a TV, video e Internet. Tal vez verán algunos posts que ya han visto aquí, pero hay mucha información interesante que comenzaré a publicar. ¡Suscríbete! ¡Cuéntale a tus amigos! :)

martes 16 de marzo, 2010 a las 00:25

Me gusta el tema de las transmisiones de video online. No por nada, hemos estado más de un año trabajando para desarrollar IPTV Adventista (que, de paso, lanzó su versión 2.0 hace algunos días).

Desde hace un tiempo (semanas al parecer), CNN Chile está transmitiendo su señal online para clientes VTR (CNN Chile es un proyecto de CNN y VTR).

Si desean acceder directamente al stream, puede usar VLC, así:
vlc rtsp://200.83.4.17/broadcast/cnn

La transmisión funciona bien, pero podría ser mejor. Aquí va una lista de problemas y sugerencias:

  • Se desperdicia en transmitir el audio en estéreo
  • La transmisión utiliza 30 cuadros por segundos, pero el encoder parece emitir menos
  • La imagen tirita, evidenciando la utilización de sistemas analógicos con interferencia de estática
  • El bitrate es de 700Kbps aprox, pero la calidad no corresponde a ese uso de ancho de banda

martes 2 de marzo, 2010 a las 13:15

Se están reuniendo esfuerzos en el grupo Digitales Por Chile de profesionales y empresas relacionadas con tecnología. Dos personas de CxNet estaremos a partir de esta tarde colaborando.

domingo 28 de febrero, 2010 a las 20:26

El terremoto ya pasó, pero queda mucho por hacer. Yo y mi familia estamos muy bien gracias a Dios.

Aquí hay una lista de sitios que pueden visitar para colaborar:

miércoles 17 de febrero, 2010 a las 16:08

  • Lo que busco
  • Quiénes son mis contactos
  • Lo que escribo y leo (Gmail)
  • Dónde estoy (Latitude)
  • Lo que me gusta leer (Reader)
  • Adónde voy (Maps / Navigator)
  • Dónde y qué compro (Checkout)
  • A quién llamo (Android)
  • Los sitios web que visito (Chrome)
  • Mi agenda diaria (Calendar)
  • Los proyectos que tengo (Docs)
  • Mis tareas pendientes (Tasks)

Sólo eso. ¿Se les ocurren más?

miércoles 17 de febrero, 2010 a las 05:36

Hace algunas semanas, comenzamos un experimento para definir la arquitectura básica de las aplicaciones web que desarrollaremos en CxNet de aquí en adelante.

Aunque uno de los lenguajes que más utilizado es PHP (principalmente entre 2001 y 2004), no me siento cómo desarrollando "web". Comparado a la satisfacción de programar software sin interfaz de usuario, que sólo debe cumplir con los protocolos de los sistemas a los cuales se conecta, la web tiene un sin fin de complejidades.

Ésta es mi historia:

  • HTML: Aprendí gracias a Mosaic y algunas páginas de muestra que venían en el CD de mi primer módem. Luego, cuando por fin pude usarlo para conectarme a internet, seguí experimentando y creé algunas páginas, pero nada de lo que me sienta muy orgulloso.
  • Perl: Hace unos 11 años, alguien me pidió investigar una forma de listar información sobre empresas en un sitio web. Hice pruebas con Perl, el lenguaje más utilizado para desarrollar CGI en la época, y logré buenos resultados. Perl se convertiría en mi segundo lenguaje de programación (después de BASIC... aunque pasando por alto algunas pruebas con JavaScript).
  • PHP: Ya el 2001, cuando comencé a trabajar (semi) formalmente, PHP resonaba como la maravilla del desarrollo web. Me tomé algunos días y, utilizando unas mil hojas tamaño carta y varios cartuchos recargables de tinta, imprimí la documentación de la, entonces nueva, versión 4 de PHP. Éste sería uno de los lenguajes que utilizaría por más tiempo. Si bien no habían frameworks en la época, y todas las variables se importaban mágicamente (nada de $_POST o similares), hace algunos años comencé a buscar alternativas como PRADO Framework.
  • ASP.NET:
  • Durante la búsqueda de un lenguaje y plataforma más poderosos que me permitieran desarrollar para web y para escritorio, y luego de probar Java y Delphi, encontré el proyecto Mono (allá por la versión 0.16). De inmediato me sentí muy atraido por el lenguaje principal, C#. Luego, descubriría ASP.NET y su revolucionaria arquitectura de controles y estados. Ha sido mi principal plataforma de desarrollo web desde 2003 hasta 2009.
  • Java Struts: Este conocido motor MVC para Java me fue impuesto por el cruel mercado. Nunca me sentí cómodo con él y, después de menos de seis meses de práctica, renuncié a mi trabajo y decidí enfocarme en .NET/Mono, lo que incluía ASP.NET.

Si bien el modelo de ASP.NET, también ocupado en JSF, PRADO Framework y otros, es cómodo y ordenado, uno de los problemas que tiene es el uso de servicios Ajax o JSON y la interacción con JavaScript, nada de natural. Hay varios intentos de amalgamar estas tecnologías que parecen haber sido diseñadas para lo mismo pero que, sin embargo, tienen arquitecturas totalmente opuestas. Un intento es ASP.NET Ajax, el cual incluye un "update panel", en el cual se pueden insertar otros controles que utilizar AJAX por debajo. Otro intento, muy bueno, es Gaia Ajax Widgets. En este caso, sus desarrolladores crearon toda una gama de controles "ajaxosos", extendiendo la funcionalidad de los controles originales. Incluso llegué a comprar una licencia durante una oferta. El viewstate se seguía ocupando, pero no todo era color de rosas. Hay que saber muchos detalles de cómo funcionan estos sistemas, a bajo nivel, para poder resolver problemas que seguramente ocurrirán tarde o temprano, síntomas de una relación ilícita entre dos mundos que se niegan a convivir.

Como todo cambia, especialmente en este mundillo de la computación, siempre hay que replantearse las cosas. En el caso de las plataformas web, esto me ha ocurrido varias veces.

Hay dos criterios muy importantes que deben ser tomados en cuenta cuando se elige una plataforma: el usuario y el desarrollador. GMail es tal vez el gran ejemplo de AJAX. La primera aplicación masiva donde no había que esperar por un refresh o postback y donde el usuario es complacido con una interfaz intuitiva y simple. En el caso del desarrollador, hay un gran problema en el típico framework web mezclado con AJAX (o JSON, etc). Cierto contenido es rendereado en el servidor mientras otro contenido es generado dinámicamente al cargarse datos a través de un request AJAX.

Luego de la popularidad alcanzada por JQuery y la facilidad de uso de JSON en ASP.NET MVC, decidí probar esta combinación. En los próximos posts, les contaré cómo.

jueves 11 de febrero, 2010 a las 23:00

Cuando se llevan estructuras de árbol a una base de datos, es común utilizar un esquema como este:

CREATE TABLE nodos
(
    id int primary key,
    idpadre integer REFERENCES nodos (id),
    nombre varchar
);

Una vez hecho esto, podemos insertar algunos datos para crear la estructura:

INSERT INTO nodos (id, nombre) VALUES (1, 'Raíz');
INSERT INTO nodos (id, nombre, idpadre) VALUES (2, 'Nodo 1', 1);
INSERT INTO nodos (id, nombre, idpadre) VALUES (3, 'Nodo 2', 1);
INSERT INTO nodos (id, nombre, idpadre) VALUES (4, 'Nodo 3', 2);
INSERT INTO nodos (id, nombre, idpadre) VALUES (5, 'Nodo 4', 4);

Con estos datos, tendremos una estructura como esta:

Raíz (1)
 |-- Nodo 1 (2)
 |    |-- Nodo 3 (4)
 |         |-- Nodo 4 (5)
 |-- Nodo 2 (3)

Supongamos que queremos saber todos los nodos padres del "Nodo 4" (ID: 5). Para esto, PostgreSQL provee consultas recursivas. Acá un ejemplo de cómo podemos realizar la consulta para este nodo:

WITH RECURSIVE arbol (idpadre, idnodo) AS (
    SELECT
	n.idpadre,
	n.id
    FROM
	nodos n
    WHERE
	n.id = 5
  UNION ALL
    SELECT n2.idpadre, n2.id
    FROM arbol a INNER JOIN nodos n2
      ON (n2.id = a.idpadre)
  )
SELECT * FROM arbol

Esta simple consulta, retornará:

 idpadre | idnodo 
---------+--------
       4 |      5
       2 |      4
       1 |      2
         |      1

Espero que les sirva ;)

jueves 11 de febrero, 2010 a las 01:55

Si puede iniciar el día sin cafeína;
Si usted puede funcionar sin píldoras estimulantes;
Si usted siempre puede ser alegre, ignorar dolores y dolores;
Si puede resistir la queja y aburrido la gente con sus problemas;
Si usted puede comer la misma comida todos los días y estar agradecidos por ello;
Si usted puede entender cuando sus seres queridos están demasiado ocupados para darle cualquier momento;
Si se puede perdonar la falta de un amigo de su examen;
Si usted puede pasar por alto cuando las amas de sacarlo a usted cuando, no por culpa propia, algo va mal;
Si usted puede tomar la crítica y la culpa, sin resentimiento;
Si usted puede ignorar la educación limitada de un amigo y nunca lo correcto;
Si puede resistir el tratamiento de un amigo rico mejor que un amigo de los pobres;
Si puedes enfrentar el mundo sin mentiras y el engaño;
Si usted puede conquistar la tensión sin ayuda médica;
Si usted puede relajarse sin licor;
Si usted puede dormir sin la ayuda de las drogas;
Si usted honestamente puedo decir que en el fondo de su corazón no tiene ningún perjuicio contra el credo o el color, la religión o la política, entonces, mi amigo, usted es casi tan bueno como su perro.

Fuente: La Voz de la Esperanza. Copia aquí.
Dedicado a Mad, mi perro (2002 - 2010)

viernes 5 de febrero, 2010 a las 19:13

La versión del branch 2.0 de Asterisk GUI permite configurar el sistema de telefonía IP para intercomunicación (intercom) o mensajes (paging). La opción que da es utilizar un header Alert-Info para que los teléfonos puedan reconocer este modo especial.

Por otro lado, los teléfonos Grandstream, una de las marcas más utilizadas gracias a sus equipos económicos, tienen dos opciones interesantes:

 

  • Allow Auto Answer by Call-Info
  • Turn off speaker on remote disconnect

La primera permite que, cuando se envía el header:

Call-Info: answer-after=0

el teléfono conteste la llamada utilizando el speaker, sin un ring previo. Más info aquí.

La segunda permite que el teléfono termine la llamada por la contraparte, el teléfono cuelgue.

El problema es que Asterisk GUI genera el header

Alert-Info: ${PAGING_HEADER}

donde ${PAGING_HEADER} es un header definido por el usuario en Asterisk GUI. El problema está entre Call-Info y Alert-Info. Para solucionarlo, hice un pequeño parche que simplemente cambia este header. Está disponible aquí.

Y... voila. Pueden configurar todo el resto en Asterisk GUI sin problemas.

 

lunes 1 de febrero, 2010 a las 04:16

Hoy estaba escuchando POSOL, un podcast de la comunicad de software libre de Nicaragua (Posol también es el nombre de una bebida típica de centroamérica).

Entre los temas del episodio 4, está ALBAstryde. Se trata de un software basado en la idea de cyberstryde. Durante el gobierno de Salvador Allende en Chile, entre 1970 y 1973, se desarrolló el proyecto Synco, el cual permitíría administrar información acerca de la agricultura chilena.

Lamentablemente, este proyecto fue descontinuado en 1973... ya saben por qué...

lunes 25 de enero, 2010 a las 19:13

Tal vez algunos ya se enteraron por Twitter, pero hace algunos días lanzamos (@jos88tco y yo) un nuevo blog llamado: "Más... que..." con frases típicas chilenas como "Más huasqueado que león de circo" :)

Si quieren reirse un rato, pueden suscribirse y ¡recomiéndenselo a sus amigos!

Más... que...

miércoles 20 de enero, 2010 a las 11:56

Cuando comencé a desarrollar aplicaciones configurables en .NET, guardaba todo en appSettings. Más tarde, evolucioné y creé clases para guardar las configuraciones y descubrí que la forma más simple de cargarlas desde un archivo era usando serialización XML. El problema de este método es que se necesita un archivo distinto al .config normal (Web.config en el caso de ASP.NET y programa.exe.config en el caso de aplicaciones de consola o desktop).

En algún punto ya fue necesario incorporar todo en el archivo .config normal, por lo tanto, aprendí a escribir las clases que heredan de ConfigurationSection, ConfigurationElement, etc. Este método permite crear archivos de configuración muy limpios y ordenados, pero es muy tedioso escribir las clases C# a las cuales se mapea el archivo de configuración. Definitivamente, debía existir una manera más simple de generar estas clases.

Hace algunos días descubrí SCDL, una pequeña herramienta que permite generar las clases entregándole un archivo simple de muestra.

¡Nunca más escribas código que puede ser generado! :)

lunes 23 de noviembre, 2009 a las 19:57

  • ¿Te gusta programar?
  • ¿Tienes conocimientos de programación orientada a objetos?
  • ¿Te consideras geek?

Postula Aquí

miércoles 21 de octubre, 2009 a las 17:46

No tengo mucho tiempo, pero "Yo voy al Encuentro Linux"

Yo voy

martes 13 de octubre, 2009 a las 09:15

Estimados lectores:

Estamos recibiendo CVs para una posición de Ingeniero de Software. El perfil es un ingeniero en informática o computación recién egresado con conocimientos en C# para trabajar tanto bajo Linux como Windows.

Si estás interesado (o conoces a alguien que calce con este perfil), puedes contactarme a cristobal@cxnet.cl.

domingo 4 de octubre, 2009 a las 16:31

Esta semana se realizan en Santiago las Jornadas Regionales de Software Libre 2009. Espero poder asistir y los invito a participar.

Banner JRSL

domingo 27 de septiembre, 2009 a las 04:11

Entramos de lleno en la carrera presidencial y, aunque la mayor parte de ustedes ya lo sabe, quiero anunciar mi apoyo a Marco Enríquez-Ominami.

Marco 2010

¿Por qué?

  • Por una educación estatal digna para todos
  • Por una mejor distribución de la riqueza
  • Por un gobierno transparente
  • Por un país donde todos nos sintamos orgullosos de ser chilenos
  • Por un estado fuerte que apoye el emprendimiento
  • Porque merecemos tener un gobierno socialista y progresista

¡He dicho!

domingo 27 de septiembre, 2009 a las 00:39

En el debate realizado hace algunos días en Chile, Eduardo Frei se refirió a un informe emitido por Transparencia Internacional en el cual se indica que Sebastián Piñera utilizó información privilegiada y compró acciones de LAN Chile, cuando debio haberse abstenido y por lo cual fue multado por la SVS. Luego agregó que ese informe había sido publicado por el "tribunal" internacional

El informe existe y fue publicado por Transparencia Internacional, una ONG y no un tribunal. El informe incluso habla de "uso de información privilegiada", pero ténicamente hablando, ése es un delito y Sebastián Piñera no fue acusado de eso. En cambio, se le multó por no abstenerse.

Aquí tenemos dos personajes. El primero, miente y habla de un tribunal y de uso de información privilegiada, sabiendo que eso no es cierto. El segundo, se escuda en la legalidad de su accionar, sin embargo, no acepta que su actuar fue antiético.

¿A quién prefieren para dirigir Chile? ¿El mentiroso o el pillo?

PS: Sebastián piñera está desinformado. La violación fue en La Reina y no en Peñalolén.

Creative Commons License
Blog JuanCri.com por Juan Cristóbal Olivares licenciado bajo la Creative Commons Attribution 2.0 Chile License.
Mono PostgreSQL Firefox Gratis

© JuanCri.com