{"id":635,"date":"2005-03-28T03:10:00","date_gmt":"2005-03-28T10:10:00","guid":{"rendered":"http:\/\/kodegeek.com\/blog\/?p=635"},"modified":"2005-03-28T03:10:00","modified_gmt":"2005-03-28T10:10:00","slug":"echando-codigo-haciendo-data-mining-con-postgresql-y-java-parte-ii","status":"publish","type":"post","link":"http:\/\/kodegeek.com\/blog\/2005\/03\/28\/echando-codigo-haciendo-data-mining-con-postgresql-y-java-parte-ii\/","title":{"rendered":"Echando c\u00f3digo: Haciendo data mining con PostgreSQL y Java, Parte II"},"content":{"rendered":"<p><a href=\"http:\/\/jasperreports.sourceforge.net\/community.html\"><img decoding=\"async\" src=\"http:\/\/jasperreports.sourceforge.net\/jasperreports.png\" \/><\/a><\/p>\n<p><a href=\"http:\/\/elangelnegro.blogspot.com\/2005\/03\/echando-cdigo-haciendo-data-mining-con.html\" rel=\"datamining\">En un articulo anterior<\/a> yo les comentaba como hacer parsing the una bitacora de un servidor web Apache utilizando <span style=\"font-style: italic;\">Java y PostgreSQL<\/span>; Tambi\u00e9n les comentaba que con SQL tenemos una flexibilidad increible para obtener y manipular los datos. Sin embargo, para que la presentaci\u00f3n de los datos luzcan un poco m\u00e1s profesionales <span style=\"font-style: italic;\">deber\u00edamos usar un generador de reportes;<\/span> De esa manera trabajamos menos y podemos repetir los resultados con otro tipo de reportes.<\/p>\n<p><span style=\"font-style: italic;\">\u00bfPorqu\u00e9 utilizar un generador de reportes?<\/span> La raz\u00f3n m\u00e1s sencilla es que <span style=\"font-style: italic;\">usted tiene cosas m\u00e1s importantes que hacer que generar un reporte que se vea bonito<\/span>, <span style=\"font-style: italic;\">usted debe concentrarse en solucionar problemas como administrador<\/span>; Por otro lado, <span style=\"font-style: italic;\">usando un generador de reportes usted puede f\u00e1cilmente controlar el aspecto de sus datos<\/span> (convirtiendolos en informaci\u00f3n) mientras utiliza lo obtenido ya sea para solucionar problemas o para comunicarle algo importante a sus clientes en un lenguaje que ellos puedan entender.<\/p>\n<p>Empec\u00e9 evaluando varias aplicaciones. La primera que trat\u00e9 de usar se llama &#8216;<a href=\"http:\/\/datavision.sourceforge.net\/\">DataVision<\/a>&#8216;.<\/p>\n<p>Yo tuve unos cuantos problemas usandolo con PostgreSQL y JDBC:<\/p>\n<ul>\n<li>Manejo de el tipo de datos CIDR. No es texto, as\u00ed que si quieren ver la direcci\u00f3n IP de la m\u00e1quina en cuestion, deber\u00e1n convertirlo a texto utilizando la funci\u00f3n <span style=\"font-style: italic;\">host<\/span> (por ejemplo: <span style=\"font-style: italic;\">select host(ip_addr) from http_log<\/span>). Para m\u00e1s informaci\u00f3n, <a href=\"http:\/\/www.ninthwonder.com\/info\/postgres\/user\/functions2446.htm\">vean aqu\u00ed <\/a>las rutinas de manipulaci\u00f3n de datos de tipo CIDR.<\/li>\n<li>Bajese <a href=\"http:\/\/jdbc.postgresql.org\/download.html\">la \u00faltima versi\u00f3n del manejador de JDBC<\/a> para su base de datos. Yo tuve problemas con una versi\u00f3n vieja, asi que me busque el manejador para PostgreSQL 7.4.<\/li>\n<\/ul>\n<p><a href=\"http:\/\/datavision.sourceforge.net\/DataVision\/DataVision.html\">El manual de DataVision<\/a> es bastante preciso en cuanto a como proceder para obtener los reportes y para controlar la apariencia de los resultados. La mejor forma de probarlo es convertir uno de los SQL que escribimos anteriormente al reporte. Voy a utilizar uno sencillo:<\/p>\n<pre><span class=\"gutterH\">  <\/span><span class=\"syntax1\">--<\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\">Count<\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\">all<\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\">IP<\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\">addresses<\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\">(including<\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\">repetitive<\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\">hits<\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\">from<\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\">the<\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\">same<\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\">IP<\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\">address)<\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\">that<\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\">have<\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\">visited<\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\">the<\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\">site<\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\">for<\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\">each<\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\">day<\/span><br \/><span class=\"gutter\">  <\/span><span class=\"syntax8\">SELECT<\/span> log_date as Date ,<span class=\"syntax9\">count<\/span>(ip_addr) <span class=\"syntax8\">AS<\/span> <span class=\"syntax13\">\"<\/span><span class=\"syntax13\">Visits<\/span><span class=\"syntax13\">\"<\/span><br \/><span class=\"gutter\">  <\/span><span class=\"syntax8\">FROM<\/span> http_log<br \/><span class=\"gutter\">  <\/span><span class=\"syntax8\">GROUP<\/span> <span class=\"syntax8\">BY<\/span> log_date<br \/><span class=\"gutter\">  <\/span><span class=\"syntax8\">ORDER<\/span> <span class=\"syntax8\">BY<\/span> log_date <span class=\"syntax8\">DESC<\/span>;<\/pre>\n<p>En mi caso, salida de esta consulta me retorna lo siguiente:<\/p>\n<blockquote><p><span style=\"font-weight: bold;\">Date                                 Visits<\/span><br \/>2005-03-25      246<br \/>2005-03-24      868<br \/>2005-03-23      743<br \/>2005-03-22      780<br \/>2005-03-21      824<br \/>2005-03-20      673<br \/>2005-03-19      644<br \/>2005-03-18      311<\/p><\/blockquote>\n<p>El primer golpe al usar esta herramienta, es que <a href=\"http:\/\/datavision.sourceforge.net\/faq\/design.html\">no soporta<\/a> &#8216;<span style=\"font-style: italic;\">Groub By<\/span>&#8216; en el SQL. Si usted quiere agrupar los datos, <a href=\"http:\/\/sourceforge.net\/mailarchive\/forum.php?thread_id=6236033&#038;forum_id=7329\">deber\u00e1 dejar que sea Datavision quien lo haga<\/a>. Eso puede que sea un inconveniente serio, dependiendo de la complejidad de el SQL. Como no puedo utilizar &#8216;group by&#8217;, entonces debo cambiar mi estrategia para contabilizar los totales por d\u00eda; Eso no me agrada mucho, ya que yo quisiera concentrarme lo menos posible aprendiendo la herramienta, y m\u00e1s tiempo resolviendo el problema que tengo a la mano, asi que lo mejor es seguir buscando.<\/p>\n<p>Revisando <a href=\"http:\/\/www.sf.net\/\">SourceForge<\/a> otra vez, consigo que existe otro generador de reportes llamado &#8216;<a href=\"http:\/\/jasperreports.sourceforge.net\/index.html\">JasperReports<\/a>&#8216;. Parece ser que esta herramienta cuenta con <a href=\"http:\/\/jasperreports.sourceforge.net\/gui.tools.html\">un soporte inmenso de la comunidad Open Source<\/a>, y decido bajarme una interfaz gr\u00e1fica para la herramienta llamada <a href=\"http:\/\/ireport.sourceforge.net\/\">Ireport.<\/a><\/p>\n<p>Usando un &#8216;Wizard&#8217; obtuve mi primer reporte en 30 minutos. Increible, justo lo que yo quer\u00eda, sin limitaciones en el SQL:<\/p>\n<p><a href=\"http:\/\/www.flickr.com\/photos\/josevnz\/7494267\/\" title=\"Photo Sharing\"><img decoding=\"async\" loading=\"lazy\" src=\"http:\/\/photos5.flickr.com\/7494267_edd59861f9.jpg\" alt=\"iReport logreport screenshot\" height=\"400\" width=\"500\" \/><\/a><\/p>\n<p>Lo que sale en la pantalla es el reporte, el cual puede ser guardado en varios formatos (HTML, PDF, etc). Increiblemente conveniente, flexible. Justo lo que un SA con tiempo limitado necesita.<\/p>\n<p>La creaci\u00f3n de el reporte se limito a escoger la fuente de datos (no limitada a bases de datos), el dise\u00f1o de la plantilla, compilarla y finalmente ejecutarla. Luego de correr el reporte, este se puede guardar en el disco duro en el formato de salida que se desee, adem\u00e1s de que la plantilla de el reporte se puede guardar para una futura ocasi\u00f3n.<\/p>\n<p>Puede <a href=\"http:\/\/prdownloads.sourceforge.net\/elangelnegro\/logreport-ireport.tar.gz?download\">bajarse mi reporte desde aqu\u00ed<\/a>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>En un articulo anterior yo les comentaba como hacer parsing the una bitacora de un servidor web Apache utilizando Java y PostgreSQL; Tambi\u00e9n les comentaba que con SQL tenemos una flexibilidad increible para obtener y manipular los datos. Sin embargo, para que la presentaci\u00f3n de los datos luzcan un poco m\u00e1s profesionales deber\u00edamos usar un <a class=\"read-more\" href=\"http:\/\/kodegeek.com\/blog\/2005\/03\/28\/echando-codigo-haciendo-data-mining-con-postgresql-y-java-parte-ii\/\">[&hellip;]<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[],"tags":[],"_links":{"self":[{"href":"http:\/\/kodegeek.com\/blog\/wp-json\/wp\/v2\/posts\/635"}],"collection":[{"href":"http:\/\/kodegeek.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/kodegeek.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/kodegeek.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/kodegeek.com\/blog\/wp-json\/wp\/v2\/comments?post=635"}],"version-history":[{"count":0,"href":"http:\/\/kodegeek.com\/blog\/wp-json\/wp\/v2\/posts\/635\/revisions"}],"wp:attachment":[{"href":"http:\/\/kodegeek.com\/blog\/wp-json\/wp\/v2\/media?parent=635"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/kodegeek.com\/blog\/wp-json\/wp\/v2\/categories?post=635"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/kodegeek.com\/blog\/wp-json\/wp\/v2\/tags?post=635"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}