<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Programador PHP .ORG</title>
	<atom:link href="http://www.programadorphp.org/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.programadorphp.org</link>
	<description>Juan Belón - Programador PHP Freelance &#124; La era de la creatividad y la Ingeniería Web</description>
	<lastBuildDate>Tue, 16 Mar 2010 10:29:27 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<xhtml:meta xmlns:xhtml="http://www.w3.org/1999/xhtml" name="robots" content="noindex" />
		<item>
		<title>PHP : MySQL o NoSQL &#8211; Digg, Facebook y Twitter hablan</title>
		<link>http://www.programadorphp.org/blog/php-mysql-o-nosql-digg-facebook-y-twitter-hablan/</link>
		<comments>http://www.programadorphp.org/blog/php-mysql-o-nosql-digg-facebook-y-twitter-hablan/#comments</comments>
		<pubDate>Sat, 13 Mar 2010 01:18:34 +0000</pubDate>
		<dc:creator>Juan Belón Pérez</dc:creator>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[administracion]]></category>
		<category><![CDATA[amazon]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[bigtable]]></category>
		<category><![CDATA[cassandra]]></category>
		<category><![CDATA[digg]]></category>
		<category><![CDATA[dynamo]]></category>
		<category><![CDATA[facebook]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[lamp]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[nosql]]></category>
		<category><![CDATA[onefile]]></category>
		<category><![CDATA[oracle]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[s3]]></category>
		<category><![CDATA[sql]]></category>
		<category><![CDATA[tuenti]]></category>
		<category><![CDATA[twitter]]></category>
		<category><![CDATA[vivalinux]]></category>

		<guid isPermaLink="false">http://www.programadorphp.org/?p=576</guid>
		<description><![CDATA[Vía vivalinux, Leyendo por la red encuentro un enlace a la notica de que Twitter se cambiaba de MySQL a una arquitectura de NoSQL basada en el proyecto de Cassandra: un sistema de administración de base de datos distribuído diseñado para manejar enormes cantidades de información replicadas en varios servidores comunes y corrientes (parecido a lo que hace Tuenti con [...]]]></description>
			<content:encoded><![CDATA[<p>Vía <a href="http://www.vivalinux.com.ar/eventos/digg-cambia-mysql-por-nosql?utm_source=feedburner&amp;utm_medium=feed&amp;utm_campaign=Feed:+vivalinux+(VivaLinux!)">vivalinux</a>, Leyendo por la red encuentro un enlace a <a href="http://bitelia.com/2010/03/twitter-cambia-paradigma-mysql-nosql">la notica</a> de que <em><a href="http://twitter.com/programaphp">Twitter</a></em> se cambiaba de <strong>MySQL</strong> a una arquitectura de <a href="http://es.wikipedia.org/wiki/Nosql">NoSQL</a> basada en el proyecto de <em><strong><a href="http://incubator.apache.org/cassandra/">Cassandra</a></strong></em>: un sistema de administración de base de datos distribuído diseñado para manejar enormes cantidades de información replicadas en varios servidores comunes y corrientes (parecido a lo que hace Tuenti con sus granjas de caché). Usa el modelo de datos del <a href="http://en.wikipedia.org/wiki/BigTable">BigTable</a> de Google ejecutado sobre una infraestructura similar a la de <a href="http://en.wikipedia.org/wiki/Dynamo_%28storage_system%29">Dynamo</a> usada por los servicios web de Amazon (como S3).</p>
<p>Pero lo más importante es que, como una solución NoSQL, Cassandra <em>rompe</em> con la larga historia y teoría de las bases de datos relacionales por otro modelo con un almacenamiento híbrido del tipo &#8220;clave ⇒ valor&#8221;, totalmente descentralizado y mucho más fácil de escalar que MySQL.</p>
<p>Por ese motivo es que ahora <a href="http://digg.com/">Digg</a> quiere alejarse tanto como puedan de <a href="http://es.wikipedia.org/wiki/LAMP">LAMP</a>, comenzando por <a href="http://about.digg.com/node/564">cambiar MySQL por Cassandra</a>:</p>
<blockquote><p>“Nuestra principal motivación para alejarnos de MySQL es la creciente dificultad de construir una aplicación de alto rendimiento con escrituras intensivas en un conjunto de datos que crece rápidamente, sin un final a la vista.</p>
<p>A medida que nuestro sistema crece, es importante abarcar múltiples data centers para redundancia y performance de la red, para agregar capacidad o reemplazar sin downtimes nodos que hayan fallado. Planeamos continuar usando hardware común y continuar asumiendo que fallará regularmente. Todo esto es crecientemente difícil con MySQL”.</p></blockquote>
<p>Cassandra fué desarrollado por <a href="http://www.facebook.com/">Facebook</a>, pero ahora es de código abierto amparado bajo la licencia de Apache. <strong>Digg</strong> también prometió comenzar a contribuir sus propias mejoras y modificaciones.</p>
<p>En el <a href="http://horicky.blogspot.com/2010/01/notes-on-oracle-coherence.html#links" target="_blank"><strong>procesamiento para cloud compiting</strong></a> hace falta una base de datos realmente rápida&#8230;</p>
<p>Si os preguntáis por qué se sigue utilizando MySQL o NoSQL en lugar Oracle que tiene un mayor rendimiento: <a href="http://www.oracle.com/technology/pub/articles/lim-php-rac.html" target="_blank"><strong>leer más</strong></a> quizás el tema de las licencias responda a vuestra pregunta&#8230;</p>
<p>O también puede responderos a esta pregunta el que la facilidad tiene que ver mucho con <a href="http://blog.vlad1.com/2009/04/06/html5-web-storage-and-sql/" target="_blank"><strong>HTML5</strong></a> y su <a href="http://www.w3.org/TR/WebSimpleDB/" target="_blank"><strong>WebSimpleDB API</strong></a>&#8230;</p>
<p>NoSQL se basa en unos <a href="http://horicky.blogspot.com/2009/11/nosql-patterns.html" target="_blank"><strong>patrones</strong></a>, además del de &#8220;tipo=&gt;valor&#8221;, <a href="http://www.linuxjournal.com/article/3294" target="_blank"><strong>aquí teneis un tutorial</strong></a>&#8230;veamos un ejemplo sencillo usando la librería más simple que he encontrado en <strong>PHP</strong>: <strong><a href="http://www.bonneville.nl/software/OneFile/#download" target="_blank">OneFile </a></strong>-&gt; OneSQL:</p>
<pre class="brush: php">

// SELECT * FROM $table WHERE $property $comparator
//                    $value        AND $prop2 $comp2 $val2
function nosql_selectAllFromWhereAnd($table,$property,$comparator,
$value  ,$prop2,$comp2,$val2)

// UPDATE $table SET $prop=$new
//                    WHERE $searchfor=$value         AND $also=$val
function nosql_updateSetWhereEqualsAnd($table,$prop,$new,
$searchfor,$value  ,$also,$val)

// DELETE FROM &#039;$table&#039; WHERE &#039;$property&#039;
//                  $comparator &#039;$value&#039; AND  &#039;$prop&#039; $comp &#039;$val&#039;
function nosql_deleteFromWhereAnd($table,$property,
$comparator,$value,$prop,$comp,$val)
</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.programadorphp.org/blog/php-mysql-o-nosql-digg-facebook-y-twitter-hablan/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Recursos software avanzados para empresas</title>
		<link>http://www.programadorphp.org/blog/recursos-software-avanzados-para-empresas/</link>
		<comments>http://www.programadorphp.org/blog/recursos-software-avanzados-para-empresas/#comments</comments>
		<pubDate>Sat, 13 Mar 2010 00:29:45 +0000</pubDate>
		<dc:creator>Juan Belón Pérez</dc:creator>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[administración pública]]></category>
		<category><![CDATA[clientes]]></category>
		<category><![CDATA[commerce]]></category>
		<category><![CDATA[CRM]]></category>
		<category><![CDATA[e-business]]></category>
		<category><![CDATA[e-commerce]]></category>
		<category><![CDATA[e-marketing]]></category>
		<category><![CDATA[empresas]]></category>
		<category><![CDATA[entidades]]></category>
		<category><![CDATA[ERP]]></category>
		<category><![CDATA[herramientas]]></category>
		<category><![CDATA[marketing]]></category>
		<category><![CDATA[mobile]]></category>
		<category><![CDATA[OSS]]></category>
		<category><![CDATA[pago electrónico]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[Privacidad]]></category>
		<category><![CDATA[recursos]]></category>
		<category><![CDATA[RRHH]]></category>
		<category><![CDATA[SCM]]></category>
		<category><![CDATA[sector financiero]]></category>
		<category><![CDATA[SEO]]></category>
		<category><![CDATA[servicios web]]></category>
		<category><![CDATA[software]]></category>
		<category><![CDATA[tickets]]></category>
		<category><![CDATA[Web Services]]></category>

		<guid isPermaLink="false">http://www.programadorphp.org/?p=565</guid>
		<description><![CDATA[Ya hemos visto en el Curso de Arquitectura Web cómo las empresas se decantan por Java y los servicios web para sus negocios, es más ,como socio de la Asociación de Técnicos de Informática me ha llegado un correo con la siguiente invitación:
&#8220;&#8230;te invitamos a la sesión informativa que tendrá lugar en Barcelona el próximo [...]]]></description>
			<content:encoded><![CDATA[<p>Ya hemos visto en el <a href="http://www.programadorphp.org/blog/curso-de-arquitectura-de-servicios-en-java-en-comunicacion-con-php/" target="_blank">Curso de Arquitectura Web</a> cómo las empresas se decantan por <em>Java </em>y los <strong>servicios web</strong> para sus negocios, es más ,como socio de la <em>Asociación de Técnicos de Informática</em> me ha llegado un correo con la siguiente invitación:</p>
<blockquote><p><em>&#8220;&#8230;te invitamos a la sesión informativa que tendrá lugar en <strong>Barcelona </strong>el próximo martes 16 de marzo de las 18.30 a las 20.00 horas&#8230;&#8221;</em></p></blockquote>
<p>de un curso online de e-business para empresas, casualmente con los <strong>Módulos Propuestos</strong>:</p>
<ul>
<li>Privacidad.</li>
<li>Mobile Commerce.</li>
<li>Métodos de pago electrónico.</li>
<li><strong><a href="http://www.programadorphp.org/blog/curso-de-arquitectura-de-servicios-en-java-en-comunicacion-con-php/">Web Services</a></strong></li>
</ul>
<p><strong><a href="http://www.ati.es/spip.php?article1457" target="_blank"> Más información »</a></strong></p>
<p><strong>Aquí </strong>he hablado de e-business, servicios web, privacidad y métodos de pago electrónico, es a lo que me dedico habitualmente, a construir tiendas online con pasarelas de pago, gestores documentales con acceso por grupo de usuario y distintos privilegios asi como a diseñar diversos servicios web que ofertan a los clientes operaciones para que puedan integrarlos en sus aplicaciones ya sean para móbiles, web o de escritorio.</p>
<p>Entre los temas que se ha abordado en este blog aún no aparecen los micropagos por sms de lo que hablaré pronto (uno de cada cuatro internautas usa su móvil para acceder a algún servicio de pago según el <a href="http://www.aecem.org/que_es_aecem.html?11_opm=111" target="_blank">AECEM-FECEMD</a>). Pero por ahora vamos a centrarnos en las herramientas para empresas, recursos software de los que se dispone actualmente, quizás, primero debamos echar un vistazo al</p>
<div id="__ss_3408156" style="width: 477px;"><strong><a title="Aecem - Libro Blanco  - Para Programador Php.org" href="http://www.slideshare.net/programadorphp/aecem-libro-blanco-para-programador-phporg">Aecem &#8211; Libro Blanco del Comercio Electrónico  - Para Programador Php.org</a></strong><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="477" height="510" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowFullScreen" value="true" /><param name="allowScriptAccess" value="always" /><param name="src" value="http://static.slidesharecdn.com/swf/ssplayerd.swf?doc=aecemlibroblancoprogramadorphp-100312063714-phpapp01&amp;rel=0&amp;stripped_title=aecem-libro-blanco-para-programador-phporg" /><param name="allowfullscreen" value="true" /><embed type="application/x-shockwave-flash" width="477" height="510" src="http://static.slidesharecdn.com/swf/ssplayerd.swf?doc=aecemlibroblancoprogramadorphp-100312063714-phpapp01&amp;rel=0&amp;stripped_title=aecem-libro-blanco-para-programador-phporg" allowscriptaccess="always" allowfullscreen="true"></embed></object></div>
<p>Y ahora veamos, todos estamos acostumbrados a usar desde los tiempos de las <a href="http://es.wikipedia.org/wiki/Usenet" target="_blank"><strong>UseNet</strong></a>, grupos de noticias como el de <a href="http://groups.google.com/group/ugr-webmasters" target="_blank"><strong>webmasters de la UGR</strong></a>, y ahora ,más o menos recientemente, blogs como <em>Wordpress</em>, redes sociales para relaciones entre empresas como <em>Linked in</em>, pero quizás las compañías estén menos en contacto con herramientas como Skype para comunicarse con los comerciales, en definitiva esta es una lista que nos hace ver Internet como una herramienta empresarial:</p>
<ul>
<li><strong><em>BizLayer</em></strong>: plataforma de tramitación electrónica que ofrece a las empresas una solución global para gestionar sus facturas electrónicamente, abarcando todo el ciclo de vida básico de una factura (emisión, recepción y gestión de estados, ejemplo: <a href="http://efec.cert.fnmt.es" target="_blank">efec.cert.fnmt.es</a> )</li>
<li><strong><em>Jiibe</em></strong>: una aplicación online donde los usuarios indican cual es su puesto de  trabajo y, <strong>mediante una serie de preguntas, determinarán desde <em>rotundamente  falso</em> a </strong><strong>completamente verdadero</strong> cada una  de ellas, tanto para el trabajo actual como el ideal&#8230; <a href="http://www.jiibe.com/" target="_blank"><strong>jiibe.com</strong></a></li>
<li><strong><em>Mashable</em></strong> -&gt; analizar redes sociales, trabajos líder dentro de redes : <a href="http://jobs.mashable.com" target="_blank">jobs.mashable.com</a></li>
<li><strong><em>ActiveCollab</em></strong>-&gt; gestión de projectos y herramienta colaborativa para equipos de gente : <a href="http://www.activecollab.com/" target="_blank">activecollab.com</a></li>
<li><strong><em>Mic2000</em></strong> (ERP) aplicación Cliente/Servidor, pensada para las empresas de cualquier  tamaño -&gt;<a href="http://www.mic2000.com/" target="_blank">mic2000.com/</a></li>
<li><strong><em>Seresnet</em></strong>: portal cuyo objetivo es la promoción                                del comercio electrónico entre las PYMES                                y las grandes empresas del sector de la  distribución,                                desarrollado sobre una plataforma Web que  garantiza                                el funcionamiento y la seguridad de los  intercambios                                comerciales a través de Internet -&gt; <a href="http://www.seresnet.com/" target="_blank">www.seresnet.com</a></li>
<li><em><strong>Openbravo</strong></em>: econocido desarrollador de soluciones profesionales en software libre  para empresas, que ofrece la primera alternativa real al software  propietario para empresas. Su sistema en entorno web de gestión integral  de empresas (ERP) y de gestión de punto de venta (PoS),<a href="http://www.openbravo.com/es/" target="_blank"> openbravo.com</a></li>
<li><a href="http://www.agpd.es/portalwebAGPD/index-ides-idphp.php" target="_blank"><em><strong>agpd.es</strong></em></a> -&gt; Agencia Española de Protección de datos, más info sobre seguridad: <a href="http://www.datagestion.net/" target="_blank">datageston.net</a></li>
<li><a href="http://www.trackglobe.com/" target="_blank"><em><strong>trackglobe </strong></em></a>: La <strong>nube</strong> o <strong>Cloud Computing</strong> es una  tecnología que permite a los usuarios disponer de servicios  tecnológicos. Las <strong>Soluciones Cloud de TrackGlobe (CloudSite,  CloudCommerce y CloudMarketing)</strong> le permiten gestionar toda su  presencia en Internet sin necesidad de instalar ni actualizar</li>
<li><a href="http://www.ceb2b2000.com/htm/home.php" target="_blank"><strong><em>b2b 2000</em></strong></a>: business to business (<a href="http://es.wikipedia.org/wiki/B2B" target="_blank">¿qué es?</a>, ejemplo-&gt; universia &amp; apple): riesgo de monopolizar mercado</li>
<li><a href="http://www.web.overlap.net/" target="_blank"><em><strong>Overlap</strong></em></a>: desarrollo de equipos humanos e innovación de proyectos comerciales</li>
<li><a href="http://reclutamiento.monster.es/indexProspect.Redux.aspx?WT.mc_n=skr_www" target="_blank"><em><strong>Monster.es</strong></em></a> (empresas) : buscar candidatos, cv&#8217;s, contratación y colgar ofertas de trabajo</li>
<li><a href="http://www.elogos.es/soluciones/empresas.aspx" target="_blank"><em><strong>elogos.es</strong></em></a>: oferta de formación  y desarrollo de élogos se configura a partir del cliente, de sus  necesidades de negocio, entendidas a partir del conocimiento sectorial  específico de las áreas de Tecnología de la Información y las  Comunicaciones, Sector Financiero, Administración Pública, Industria,  Construcción y Energía</li>
<li>etc.</li>
</ul>
<p>En este punto y antes de continuar, el esquema que debemos tener en mente es el siguiente:</p>
<p><a rel="lightbox" href="http://www.programadorphp.org/wp-content/uploads/2010/03/esquema_red_empresarial.png" title="Esquema de red empresarial" rel="lightbox[565]"><img class="aligncenter size-medium wp-image-589" title="Esquema de red empresarial" src="http://www.programadorphp.org/wp-content/uploads/2010/03/esquema_red_empresarial-300x299.png" alt="" width="300" height="299" border="0"/></a></p>
<p>Para comprender mejor el esquema necesitamos conocer algunos conceptos, pero ¿para qué necesitamos software avanzado de empresas para hacer e-business?&#8230;es decir&#8230;</p>
<p><strong><em>¿Para qué sirven las herramientas de software avanzado de e-business?</em></strong></p>
<ol>
<li>Son aplicaciones para la empresa que siguen el modelo de línea de negocio, de hecho, empresas como Telefónica ya las están utilizando</li>
<li>Soporte a operaciones:<br />
-  <em>Planificación de Recursos de la Empresa</em> (<strong><a href="http://es.wikipedia.org/wiki/Planificaci%C3%B3n_de_Recursos_Empresariales" target="_blank">ERP</a></strong>) -&gt; gestión e integración de dichos recursos<br />
-  <em>Sistemas de Gestión de la Cadena de Suministros: </em>las empresas pueden prever las demandas del mercado, innovar respuestas  ante sus volubles condiciones y coordinar las operaciones en todas las  redes globales.  Oracle SCM proporciona soluciones sectoriales  específicas que están basadas en las mejores aplicaciones y abarcan  desarrollo de producto, gestión de la demanda, planificación de ventas y  operaciones, gestión del transporte y gestión de suministros. Ejemplo: Oracle Supply Chain Management (SCM)<br />
-  <em>PRM : <strong><a href="http://www.suport.org/index.php?option=com_content&amp;task=view&amp;id=209&amp;Itemid=168&amp;lang=spanish" target="_blank">Gestión de Relaciones entre Socios</a></strong></em> -&gt; automatización de tareas entre vendedores y canales indirectos. Las sencillas herramientas de PRM ofrecen visibilidad del rendimiento de su canal, y ayudan a  gestionar de forma efectiva los socios para hacerlos más productivos y  más implicados en el éxito.Aumento de la facturación y cartera de clientes, aumento de vínculos gracias a técnicas de venta cruzada.<br />
-  <em>OSS &#8211; Sistema de Soporte de Operaciones</em> -&gt; para proveedores de Servicios a la hora de implementarlos, ejemplo: <a href="http://w3.nokiasiemensnetworks.com/es/Portfolio/Products/Core/BusinessSupportSystems.htm?languagecode=es" target="_blank">Nokia</a><br />
- Inteligencia de Negocio : <a href="http://www.cdtvillalba.org/documentos/docs/BusinessIntelligence.pdf" target="_blank"><strong>ver más</strong></a></li>
<li>Soporte administrativo y apoyo:<br />
-  <strong><a href="http://es.wikipedia.org/wiki/Gesti%C3%B3n_de_derechos_digitales#DRM_y_documentos" target="_blank">ERM</a></strong>: Gestión de derechos digitales<br />
-  <strong><a href="http://es.wikipedia.org/wiki/Gesti%C3%B3n_del_conocimiento" target="_blank">KM</a></strong>: Gestión del conocimiento<br />
-  <a href="http://es.wikipedia.org/wiki/Inm%C3%B3tica" target="_blank"><strong>Inmótica </strong></a>-&gt; automatización de edificios corporativos, hoteleros, empresariales y similares para reducir costes y consumo energético (<a href="http://es.wikipedia.org/wiki/St._Regis_Hotel_%26_Residences#Edificio_Inteligente" target="_blank">edificios inteligentes</a>)</li>
<li>Sistemas comerciales:<br />
-  BSS -&gt; <a href="http://translate.google.es/translate?hl=es&amp;langpair=en|es&amp;u=http://www.networkdictionary.com/telecom/BSS.php" target="_blank"><strong>Sistema de Soporte al Negocio</strong></a> : recopilar información y análisis de datos de clientes (ejemplo banco y el dato entero de arquitectura) -&gt; fijar precios<br />
<img class="aligncenter" title="BusinessSupport" src="http://www.networkdictionary.com/images/BusinessSupport.gif" alt="" width="394" height="443" /><br />
-  <a href="http://es.wikipedia.org/wiki/Customer_relationship_management" target="_blank"><strong>CRM </strong></a>-&gt; mejora la rentabilidad. Es la Combinación de Acciones Estratégicas orientadas a fortalecer las relaciones con los Clientes. Es un proceso integrado de marketing, ventas y servicios dentro de una organización orientado a gestionar el Principal ACTIVO de la Empresa: “La Información de sus Clientes”; con el fin de  Retenerlos y Rentabilizarlos; y todo soportado en la Tecnología de la Información. La Tecnología hace posible este Objetivo, colaborando en mejorar los Procesos Comerciales de Ventas y Servicios al Cliente. <a href="http://www.crmademanda.com.mx/library/pdf/introduccioncrm.pdf" target="_blank"><strong>Ejemplo</strong></a>.<br />
<a href="http://www.sugarcrm.com/crm/" target="_blank"><strong>SugarCRM</strong></a>.</li>
<li>Social Media: incursión de las empresas en las redes sociales &#8230;<a href="http://tristanelosegui.com/2010/02/01/%C2%BFpor-donde-empiezo-pasos-a-seguir-para-empresas-en-social-media-i/" target="_blank"><em><strong>¿Cómo empezar?</strong></em></a></li>
<li><a href="http://es.wikipedia.org/wiki/E-business" target="_blank"><strong>e-business</strong></a> + TIC (<strong><a href="http://es.wikipedia.org/wiki/Tecnolog%C3%ADas_de_la_informaci%C3%B3n_y_la_comunicaci%C3%B3n" target="_blank">Tecnologías de la Información y la Comunicación</a></strong>): niveles&#8230;</li>
</ol>
<p>Ahora pasaremos a explicar un poco mejor esto de los niveles del punto 5</p>
<ul>
<li>Entrada: todo negocio tiene un comienzo, se ha de realizar un estudio de marketing en el emplazamiento sea este virtual o físico antes de lanzarse a la aventura</li>
<li>Consolidación: una vez realizado el estudio comenzamos con las primeras campañas de productos</li>
<li>SCM : Sistema de Gestión de Suministros -&gt; en otras palabras, preveer las demandas del mercado una vez consolidado</li>
<li>ERP: Planificación de recursos de la Empresa:<br />
- Aplicaciones multi-modulares -&gt; soluciones integrales (a veces), diseñadas para administrar procesos internos del negocio y la optimización de la cadena de valor&#8230;apps: factura., contabilidad , compras, producción, transporte, informes de gestión y RRHH</li>
<li>BI (Inteligencia de Negocio) y KM (Gestión del Conocimiento) vistos anteriormente</li>
<li>CRM : Gestión de las relaciones con los clientes: anticipar ,conocer y satisfacer las necesidades y los deseos de los clientes:<br />
- Mantenimiento y satisfacción de la cartera de clientes<br />
- Búsqueda de servicios personalizados para mantener la lealtad de nuestros clientes y maximizar su valor<br />
- Búsqueda de procesos de captación de nuevos clientes, mantenimiento de redes sociales, gestión de reclamaciones, tickets (<a href="http://sourceforge.net/projects/ticket/" target="_blank"><strong>PHP-Ticket</strong></a>), etc.</li>
<li>Aplicaciones tácticas<br />
- Datawarehouse: base de datos orientada al apoyo en toma de decisiones, consultas cruzadas de fuentes variadas, como se dijo sobre Bing vs Google en el <a href="http://www.programadorphp.org/blog/resumenes-del-search-congress-bilbao-2010/">Congreso SEO de Bilbao 2010</a>-&gt; <a href="http://www.programacion.com/bbdd/tutorial/warehouse/" target="_blank">ver manual</a><br />
- DDS : <a href="http://en.wikipedia.org/wiki/Digital_Data_Storage" target="_blank">almacenamiento de datos operativos</a> -&gt; datos para Datawarehouse<br />
- Reporting: fácil acceso a información en los Datawarehouse<br />
- CRM analítico: estudiar el comportamiento de los clientes y actuar en resonancia</li>
<li>Aplicaciones estratégicas:<br />
- <a href="http://www.gestiopolis.com/recursos2/documentos/fulldocs/ger/sisinfoej.htm" target="_blank"><strong>EIS</strong></a>: Sistemas de Información para Ejecutivos -&gt; <a href="http://www.wikilearning.com/monografia/sistemas_de_informacion_para_ejecutivos/11520-1" target="_blank"><strong>wiki</strong><br />
</a> &#8211; BI (Inteligencia de Negocio) : información disponible de cada departamento para organizarla y procesarla de acuerdo al modelo de la toma de decisiones por medio de los directivos</li>
<li>Aplicaciones de integración:<br />
- <a href="http://es.wikipedia.org/wiki/Enterprise_application_integration" target="_blank"><strong>EAI</strong></a>: Integración de Aplicaciones de Empresa -&gt; Arquitectura tecnológica de la que se puede disponer dentro de la empresa, formas de compartirla, información de fuentes y aplicaciones corporativas heterogéneas&#8230;</li>
</ul>
<p>Resumen de <strong>herramientas e-business:</strong></p>
<p><a rel="lightbox" href="http://www.programadorphp.org/wp-content/uploads/2010/03/herramientas_e_commerce.gif" title="herramientas_e_commerce" rel="lightbox[565]"><img class="aligncenter size-medium wp-image-582" title="herramientas_e_commerce" src="http://www.programadorphp.org/wp-content/uploads/2010/03/herramientas_e_commerce-300x234.gif" border="0" alt="" width="300" height="234" /></a><em><strong></strong></em></p>
<p><em><strong>¿Cómo influye la cadena de valor en el e-business?</strong></em></p>
<p>Porter propuso esta cadena como principal herramienta para identificar fuentes de generación de valor para el cliente, es decir, actividades estratégicas en la empresa ,ya sean:</p>
<ul>
<li><strong>Primarias</strong>: contribuyen directamente a obtener productos para el consumidor: logística de entrada/salida de materias primas, marketing, servicios de venta y post-venta,etc.</li>
<li><strong>De soporte:</strong> que proporcionan los <em>inputs </em>e infraestructura necesaria para las primarias: la propia infraestructura de la empresa, gestión de rrhh, desarrollo tecnológico, etc.</li>
</ul>
<p>Por ejemplo, las intranets proporcionan una infraestructura y un significado de las actividades secundarias&#8230;</p>
<p>Las empresas pueden crear valor a través de la recogida, organización,  selección, resumen y distribución de la información, por lo que pueden  aumentar su eficacia si trasladan actividades de la cadena de valor real  a la cadena de valor virtual presentada:</p>
<p><a rel="lightbox" href="http://www.programadorphp.org/wp-content/uploads/2010/03/actividades_primarias_secun.gif" title="actividades_primarias_secun" rel="lightbox[565]"><img class="aligncenter size-medium wp-image-583" title="actividades_primarias_secun" src="http://www.programadorphp.org/wp-content/uploads/2010/03/actividades_primarias_secun-300x96.gif" border="0" alt="" width="300" height="96" /></a></p>
<p>Las cuatro fuentes potenciales de creación de valor en el e-business son: la <em>eficacia</em>-&gt;aumento de simetrías de información, las <em>sinergías </em>-&gt; verticales(servicios postventa) u horizontales (hardware) conjuntos que proporcionan más valor, la <em>retención </em>-&gt; encontrar motivaciones de compra, <em>innovación </em>-&gt; nuevas formas de estructurar procesos.</p>
<p>Seguramente hay muchas herramientas más disponibles, algún comentario?</p>
]]></content:encoded>
			<wfw:commentRss>http://www.programadorphp.org/blog/recursos-software-avanzados-para-empresas/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Generador de formularios para gestores de contenidos</title>
		<link>http://www.programadorphp.org/portfolio/generador-de-formularios-para-gestores-de-contenidos/</link>
		<comments>http://www.programadorphp.org/portfolio/generador-de-formularios-para-gestores-de-contenidos/#comments</comments>
		<pubDate>Fri, 12 Mar 2010 11:29:25 +0000</pubDate>
		<dc:creator>Juan Belón Pérez</dc:creator>
				<category><![CDATA[Portfolio]]></category>
		<category><![CDATA[generador]]></category>
		<category><![CDATA[generador de formularios]]></category>
		<category><![CDATA[generadores de código]]></category>
		<category><![CDATA[gestor de contenidos]]></category>
		<category><![CDATA[gestor documental]]></category>
		<category><![CDATA[grupos de usuarios]]></category>
		<category><![CDATA[permisos]]></category>
		<category><![CDATA[usuarios]]></category>

		<guid isPermaLink="false">http://www.programadorphp.org/?p=561</guid>
		<description><![CDATA[La Asociación de Alzheimer de Granada me pidió un gestor documental con muchos formularios, tuve que idear un generador de estos para poder tenerlo a tiempo.
El generador es un script sencillo que utiliza un array donde se especifica el nombre del campo y su tipo, que puede ser variado, a partir de esta información se [...]]]></description>
			<content:encoded><![CDATA[<p>La Asociación de Alzheimer de Granada me pidió un gestor documental con muchos formularios, tuve que idear un generador de estos para poder tenerlo a tiempo.<br />
El generador es un script sencillo que utiliza un array donde se especifica el nombre del campo y su tipo, que puede ser variado, a partir de esta información se crean las instrucciones SQL para la estructura de la/s tabla/s que dependen así como sus asociaciones con el XHTML con validaciones que se conectan con las acciones PHP que permiten operar con los datos: altas, bajas, modificaciones,etc y sus correspondientes relaciones con otros formularios.</p>
<p><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="500" height="405" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowFullScreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="src" value="http://www.youtube.com/v/aFIZCd7yud4&amp;hl=es_ES&amp;fs=1&amp;color1=0x234900&amp;color2=0x4e9e00&amp;border=1" /><param name="allowfullscreen" value="true" /><embed type="application/x-shockwave-flash" width="500" height="405" src="http://www.youtube.com/v/aFIZCd7yud4&amp;hl=es_ES&amp;fs=1&amp;color1=0x234900&amp;color2=0x4e9e00&amp;border=1" allowscriptaccess="always" allowfullscreen="true"></embed></object></p>
<p>En el vídeo se muestran los pasos que hay que dar, sin llegar a profundizar demasiado en los algoritmos: se crea una entrada en la sección de contenidos (<em>expedientes -&gt; asociados) </em>con un enlace a un formulario que previamente habremos creado en la sección de <em>intranet -&gt; formularios </em>gracias al generador de enlaces, y hemos configurado para que sea la tabla asociada a ese formulario la que el algoritmo interno trata con los datos ,generando automáticamente un modelo de datos y las acciones del controlador que permiten la visualización de los datos correctamente.</p>
<p>Se ve también como funciona el generador y todas las funciones asociadas a la gestión de permisos por grupo de usuarios&#8230;</p>
<p>El gestor documental además permite la selección de permisos por grupos de usuarios (configurables) para artículos de cada sección además de por operación (crear, mostrar, grabar, editar, borrar,etc)</p>
]]></content:encoded>
			<wfw:commentRss>http://www.programadorphp.org/portfolio/generador-de-formularios-para-gestores-de-contenidos/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Otras Arquitecturas y metodologías SOA, ejercicios</title>
		<link>http://www.programadorphp.org/blog/cursos/otras-arquitecturas-y-metodologias-soa-ejercicios/</link>
		<comments>http://www.programadorphp.org/blog/cursos/otras-arquitecturas-y-metodologias-soa-ejercicios/#comments</comments>
		<pubDate>Wed, 10 Mar 2010 23:58:11 +0000</pubDate>
		<dc:creator>Juan Belón Pérez</dc:creator>
				<category><![CDATA[Cursos y talleres]]></category>
		<category><![CDATA[arquitectura]]></category>
		<category><![CDATA[BPEL]]></category>
		<category><![CDATA[ingeniería]]></category>
		<category><![CDATA[ingeniería del software]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[NetBeans]]></category>
		<category><![CDATA[reservas]]></category>
		<category><![CDATA[soa]]></category>
		<category><![CDATA[web]]></category>
		<category><![CDATA[Web Services]]></category>
		<category><![CDATA[wsdl]]></category>

		<guid isPermaLink="false">http://www.programadorphp.org/?p=553</guid>
		<description><![CDATA[Para terminar con las Arquitecturas Web vamos a dejar que Pablo García Sánchez nos cuente qué otras hay además de las que hemos visto: Otras Arquitecturas y metodologías SOA
EJERCICIO SIMPLE

Realizar un servicio web en Java con las operaciones:
- String addUser(String user, String pass) que la guarde en una lista (variable de clase) y devuelva un [...]]]></description>
			<content:encoded><![CDATA[<p>Para terminar con las Arquitecturas Web vamos a dejar que Pablo García Sánchez nos cuente qué otras hay además de las que hemos visto: <a href="http://www.programadorphp.org/wp-content/uploads/Cursos_Talleres/JavaWS/presentacionOtrasSOA.pdf" target="_blank"><strong>Otras Arquitecturas y metodologías SOA</strong></a></p>
<p><em><strong>EJERCICIO SIMPLE</strong></em></p>
<ul>
<li>Realizar un servicio web en Java con las operaciones:<br />
- <em>String addUser(String user, String pass)</em> que la guarde en una lista (variable de clase) y devuelva un mensaje diciendo que se ha guardado<br />
- <em>boolean loginUser(String user, String pass)</em> que compruebe que el usuario existe recorriendo la lista<br />
- (podemos usar dos listas de strings, <em>HashMaps </em>o crear una clase <em>Usuario </em>y guardarla en una <em>List&lt;Usuario&gt;</em>)<br />
- Testearlo en el navegador</li>
<li><a href="http://wp-content/uploads/Cursos_Talleres/JavaWS/EjercicioSimple.rar" target="_blank"><strong>Descargar ejercicio simple</strong></a></li>
</ul>
<p><em><strong>EJERCICIO AVANZADO</strong></em></p>
<ul>
<li>Desarrollar dos servicios web (cada uno con su WSDL separado) utilizando JAX-WS. El primero debe recibir un XML con datos de un usuario &lt;nombre&gt;&lt;edad&gt;&lt;contraseña&gt;&lt;tel&gt; y parsear ese XML con JDOM comprobando si hay  excepciones y guardarlo en una base de datos.</li>
<li>El segundo debe recibir un usuario y contraseña y devolver true si existe el usuario en la base de datos.</li>
<li>Finalmente crear un proceso BPEL con dos operaciones<br />
- Crear usuario (que ataque al primer servicio)<br />
- Hacer Login (que ataque al segundo) y devuelva un mensaje diciendo si los datos son correctos o no<br />
- Capturar Excepciones</li>
</ul>
<p><em><strong>EJERCICIO BPEL AVANZADO: <a href="http://wp-content/uploads/Cursos_Talleres/JavaWS/presentacionProyectoBPEL.pdf" target="_blank">descargar</a></strong></em></p>
<p><em><strong>fin Del Curso amigos</strong></em></p>
<p><strong><a href="http://www.programadorphp.org/blog/curso-de-arquitectura-de-servicios-en-java-en-comunicacion-con-php/">« Volver al Curso de Arquitectura de Servicios Web con Java y PHP</a></strong></p>
]]></content:encoded>
			<wfw:commentRss>http://www.programadorphp.org/blog/cursos/otras-arquitecturas-y-metodologias-soa-ejercicios/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>BPEL y OpenESB: Orquestación de Servicios Web</title>
		<link>http://www.programadorphp.org/blog/cursos/bpel-y-openesb-orquestacion-de-servicios-web/</link>
		<comments>http://www.programadorphp.org/blog/cursos/bpel-y-openesb-orquestacion-de-servicios-web/#comments</comments>
		<pubDate>Wed, 10 Mar 2010 02:25:48 +0000</pubDate>
		<dc:creator>Juan Belón Pérez</dc:creator>
				<category><![CDATA[Cursos y talleres]]></category>
		<category><![CDATA[BPEL]]></category>
		<category><![CDATA[esb]]></category>
		<category><![CDATA[glassfish]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[NetBeans]]></category>
		<category><![CDATA[openesb]]></category>
		<category><![CDATA[orquestación]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[servicios web]]></category>
		<category><![CDATA[tutorial]]></category>
		<category><![CDATA[webservices]]></category>

		<guid isPermaLink="false">http://www.programadorphp.org/?p=543</guid>
		<description><![CDATA[Introducción a BPEL y OpenESB
Normalmente integrar este tipo de servicios en multinacionales tiene un coste realmente alto, gracias a las herramientas que vemos en este curso se hace mucho más fácil la tarea.
La siguiente presentación de la mano de Pablo García Sánchez nos da las nociones básicas de ESB y JBI, para la integración empresarial [...]]]></description>
			<content:encoded><![CDATA[<p>Introducción a BPEL y OpenESB</p>
<p>Normalmente integrar este tipo de servicios en multinacionales tiene un coste realmente alto, gracias a las herramientas que vemos en este curso se hace mucho más fácil la tarea.</p>
<p>La siguiente presentación de la mano de Pablo García Sánchez nos da las nociones básicas de ESB y JBI, para la integración empresarial de aplicaciones compuestas que generan un flujo de trabajo dinámico, además de dar algunas ventajas, vocabulario, y ejemplos de BPEL.</p>
<div id="__ss_3381200" style="width: 425px;"><strong style="display: block; margin: 12px 0 4px;"><a title="Bpel y Open Esb" href="http://www.slideshare.net/programadorphp/bpel-y-open-esb">Bpel y Open Esb:</a></strong><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="425" height="355" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowFullScreen" value="true" /><param name="allowScriptAccess" value="always" /><param name="src" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=bpelyopenesb-100309192629-phpapp01&amp;stripped_title=bpel-y-open-esb" /><param name="allowfullscreen" value="true" /><embed type="application/x-shockwave-flash" width="425" height="355" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=bpelyopenesb-100309192629-phpapp01&amp;stripped_title=bpel-y-open-esb" allowscriptaccess="always" allowfullscreen="true"></embed></object></p>
</div>
<p>Necesitamos <a href="https://open-esb.dev.java.net/Downloads.html" target="_blank"><strong>descargar los componentes ESB</strong></a> para nuestro servidor Glassfish así como para el IDE Netbeans, aunque os recomiendo el <a href="http://java.sun.com/javaee/sdk/tools/sdkentpack_install.jsp" target="_blank"><strong>Java EE 5 Tools Bundle Installer</strong></a> y <a href="http://java.sun.com/javaee/downloads/index.jsp" target="_blank"><strong>java ee sdk 6 preview</strong></a> ya que trae soporte para <strong><a href="http://soa.netbeans.org/" target="_blank"><em>SOA </em></a></strong> para Glassfish y Netbeans 6.5.1 con todos los módulos instalados para trabajar con BPEL.</p>
<p>Veamos un ejemplo práctico con servicios web en vídeo:</p>
<p><object width="425" height="344"><param name="movie" value="http://www.youtube.com/v/LJbtQ1qd5mo&#038;hl=es&#038;fs=1"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/LJbtQ1qd5mo&#038;hl=es&#038;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"></embed></object></p>
<p>Lo que hago es crear un nuevo proyecto tipo BPEL Module (recordar no crear un proyecto en un directorio con acentos), añadir un WSDL Externo desde</p>
<p>http://webservices.daehosting.com/services/TemperatureConversions.wso?WSDL</p>
<p>y un nuevo BPEL Process, para la entrada del BPEL creamos un WSDL local con un parámetro, la entrada de temperatura y un parámetro de salida que es la respuesta.</p>
<p>Por último existe un tutorial de BPEL disponible <a href="http://www.programadorphp.org/wp-content/uploads/Cursos_Talleres/JavaWS/cursoTutorialBPEL.rar" target="_blank"><strong>aquí</strong></a>.</p>
<p><strong></strong><strong><a href="../blog/cursos/blog/curso-de-arquitectura-de-servicios-en-java-en-comunicacion-con-php/">« Volver al Curso de Servicios Web</a></strong></p>
]]></content:encoded>
			<wfw:commentRss>http://www.programadorphp.org/blog/cursos/bpel-y-openesb-orquestacion-de-servicios-web/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Curso de PHP y servicios Web</title>
		<link>http://www.programadorphp.org/blog/cursos/curso-de-php-y-servicios-web/</link>
		<comments>http://www.programadorphp.org/blog/cursos/curso-de-php-y-servicios-web/#comments</comments>
		<pubDate>Sun, 07 Mar 2010 20:29:59 +0000</pubDate>
		<dc:creator>Juan Belón Pérez</dc:creator>
				<category><![CDATA[Cursos y talleres]]></category>
		<category><![CDATA[Arquitectura web]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[Katy]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[servicios web]]></category>
		<category><![CDATA[wsdl]]></category>

		<guid isPermaLink="false">http://www.programadorphp.org/?p=532</guid>
		<description><![CDATA[Gracias a Pedro A. Castillo Valdivieso disponemos de este Curso de PHP:
Introducción a PHP &#8211; Programador PHP &#8211; UGR
Los ficheros que necesitáis para seguir el guión están aquí.

Lo interesante, ahora que sabemos como programar servicios web complejos con Java y comunicarlos mediante SOAP es usar la clase que traen las últimas versiones de PHP (desde [...]]]></description>
			<content:encoded><![CDATA[<p>Gracias a Pedro A. Castillo Valdivieso disponemos de este Curso de PHP:</p>
<div id="__ss_3358983" style="width: 425px;"><strong style="display: block; margin: 12px 0 4px;"><a title="Introducción a PHP - Programador PHP - UGR" href="http://www.slideshare.net/programadorphp/introduccin-a-php-programador-php-ugr">Introducción a PHP &#8211; Programador PHP &#8211; UGR</a></strong><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="425" height="355" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowFullScreen" value="true" /><param name="allowScriptAccess" value="always" /><param name="src" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=presentacionphp-100307134223-phpapp02&amp;stripped_title=introduccin-a-php-programador-php-ugr" /><param name="allowfullscreen" value="true" /><embed type="application/x-shockwave-flash" width="425" height="355" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=presentacionphp-100307134223-phpapp02&amp;stripped_title=introduccin-a-php-programador-php-ugr" allowscriptaccess="always" allowfullscreen="true"></embed></object></p>
<div style="padding: 5px 0 12px;">Los ficheros que necesitáis para seguir el guión están <a href="http://www.programadorphp.org/wp-content/uploads/Cursos_Talleres/JavaWS/ejemplos_php_ws.rar" target="_blank"><strong>aquí</strong></a>.</div>
</div>
<p>Lo interesante, ahora que sabemos como programar servicios web complejos con Java y comunicarlos mediante SOAP es usar la clase que traen las últimas versiones de PHP (desde la 5.x), con un ejemplo sencillo, podemos probar a crear una lista de servicios como los que hay en http://www.service-repository.com/schema/namespaces &#8230;</p>
<p>El código sería tan sencillo como lo siguiente:</p>
<pre class="brush: php">

$wsdl = &quot;http://www.currencyserver.de/webservice/currencyserverwebservice.asmx?WSDL&quot;;

echo &quot;Servicios ofertados por &lt;b&gt;$wsdl&lt;/b&gt;&quot;;
$client = new SoapClient($wsdl);
$avail = $client-&gt;__getFunctions();
echo &#039;&lt;ul&gt;&#039;;
foreach($avail as $func)
{
echo &quot;&lt;li&gt;&quot; . $func . &quot;&lt;/li&gt;&quot;;
}
echo &#039;&lt;/ul&gt;&#039;;

echo &#039;&lt;hr&gt;&lt;pre&gt;&#039;;
echo highlight_string( file_get_contents(__FILE__));
echo &#039;&lt;/pre&gt;&#039;;
</pre>
<p>Que devuelve una lista de las operaciones del servicio especificadas por el <a href="http://www.programadorphp.org/wp-content/uploads/Cursos_Talleres/JavaWS/manuales_comunicacion.html" target="_blank"><em><strong>WSDL</strong></em></a>.</p>
<p>Y para terminar ya sabéis que podéis crear vuestros propios servicios web con <em>PHP</em>, un ejemplo sencillo:</p>
<pre class="brush: php">

//Añadiendo función suma:
$cliente = new SoapClient(
null,
array(
&quot;location&quot;=&gt;&quot;http://localhost/simple/serversimple.php&quot;,
&quot;uri&quot;=&gt;&quot;&quot;
)
);
$suma = $cliente-&gt;suma(2,3);
print(&quot;La suma de 2 y 3 es :&quot;.$suma);
</pre>
<p>Ver ejemplo funcionando: <a href="http://www.programadorphp.org/wp-content/uploads/Cursos_Talleres/JavaWS/prueba.php" target="_blank"><strong>aquí</strong></a></p>
<blockquote><p>Recordar que hay que generar los ficheros WSDL con Katy u otra herramienta.</p></blockquote>
<p><strong><a href="../blog/curso-de-arquitectura-de-servicios-en-java-en-comunicacion-con-php/">« Volver al Curso de Servicios Web</a></strong></p>
]]></content:encoded>
			<wfw:commentRss>http://www.programadorphp.org/blog/cursos/curso-de-php-y-servicios-web/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Servicios web y Cloud Computing con JAVA, SOAP y PHP</title>
		<link>http://www.programadorphp.org/blog/cursos/servicios-web-y-cloud-computing-con-java-soap-y-php/</link>
		<comments>http://www.programadorphp.org/blog/cursos/servicios-web-y-cloud-computing-con-java-soap-y-php/#comments</comments>
		<pubDate>Sun, 07 Mar 2010 20:18:35 +0000</pubDate>
		<dc:creator>Juan Belón Pérez</dc:creator>
				<category><![CDATA[Cursos y talleres]]></category>
		<category><![CDATA[cloud computing]]></category>
		<category><![CDATA[Computación en nube]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[procesamiento distribuido]]></category>
		<category><![CDATA[servicios web]]></category>

		<guid isPermaLink="false">http://www.programadorphp.org/?p=528</guid>
		<description><![CDATA[DONDE ESTAMOS
Nos encontramos en un punto en el curso de Arquitectura de servicios web en el que ya hemos construido el modelo de datos que nos sirve como borrador para gestionar toda la información que ofertan los servidores y que los clientes tratan, así como de manipular esta información gracias a los servicios web que [...]]]></description>
			<content:encoded><![CDATA[<p><strong>DONDE ESTAMOS</strong></p>
<p>Nos encontramos en un punto en el <a href="http://www.programadorphp.org/blog/curso-de-arquitectura-de-servicios-en-java-en-comunicacion-con-php/"><strong>curso de Arquitectura de servicios web</strong></a> en el que ya hemos construido el <a href="http://www.programadorphp.org/?s=modelo+de+datos"><em>modelo de datos</em></a> que nos sirve como <em>borrador</em> para gestionar toda la información que ofertan los servidores y que los clientes tratan, así como de manipular esta información gracias a los <em>servicios web</em> que sirven de interfaces para dicha tarea.</p>
<p><strong>¿QUÉ VAMOS A HACER?</strong></p>
<p>Ahora vamos a centrarnos en la composición de servicios web para obtener un funcionamiento complejo mediante la invocación de estos servicios, concretamente a sus operaciones para construir un flujo de trabajo en nuestros servidores.</p>
<p><strong>INTRODUCCIÓN</strong></p>
<p>El nuevo modelo de datos basado en el que vimos en la lección anterior ( <em><a href="http://www.programadorphp.org/blog/cursos/creacion-de-servicios-web-con-netbeans-y-glassfish-java-y-php/" target="_blank">creación de servicios web con netbeans y glassfish</a></em> ) para hacer las primeras pruebas con servicios web está diseñado para crear automáticamente pilotos y naves en un universo, de modo que se ha suprimido el usuario y se han añadido una clase Universo y una clase Galaxia para simular una pelea entre Vippers asociados a ella dentro de una clase EstrellaDeCombate. Dentro de Universo se encuentran todas las Galaxias y las estrellas de combate están dentro de éstas. Recordar que los vipers necesitan pilotos para volar y estos pilotos pueden estar o no activos.</p>
<p><strong>¿CÓMO LO VAMOS A HACER?</strong></p>
<p>Envolviendo el modelo de datos en una capa de integración de servicios web lo primero, así podemos crear una estrella de combate y prepararla para que que se pueda enfrentar a otra, lanzando las naves al combate, para después conocer su estado tras el enfrentamiento.</p>
<p>COMENZAMOS</p>
<ol>
<li>Crear un nuevo proyecto Java Web llamado &#8220;BattleStarGallacticaWebServer&#8221;, y dentro de este creamos un nuevo paquete (Java package) llamado<br />
<em>es.ugr.cursows.battlestar.service</em><br />
Como era de esperar necesitamos añadir a las librerías el <strong><em>JAR </em></strong>del modelo de datos (<a href="http://programadorphp.org/wp-content/uploads/Cursos_Talleres/JavaWS/BSGModeloUniverso.zip" target="_blank"><strong>código fuente</strong></a> y <a href="http://www.programadorphp.org/wp-content/uploads/Cursos_Talleres/JavaWS/BSGModeloUniverso_javadoc.zip" target="_blank"><strong>documentación</strong></a> ,también está la <a href="http://www.programadorphp.org/wp-content/uploads/Cursos_Talleres/JavaWS/BSGModelo_Universo_javadoc/" target="_blank"><em>documentación online</em></a>):  <a href="http://www.programadorphp.org/wp-content/uploads/Cursos_Talleres/JavaWS/BSGModeloUniverso.jar" target="_blank"><strong>BSGModelo Universo.JAR</strong></a>.</li>
<li>Para no hacer demasiado extenso este guión, uso esta presentación:
<div id="__ss_3358977" style="width: 425px;"><strong style="display: block; margin: 12px 0 4px;"><a title="Composicion de servicios web, un ejemplo" href="http://www.slideshare.net/programadorphp/composicion-deserviciosweb-ejemplo">Composicion de servicios web: ejemplo de BattleStarGalactica</a></strong><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="425" height="355" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowFullScreen" value="true" /><param name="allowScriptAccess" value="always" /><param name="src" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=composiciondeservicioswebejemplo-100307134250-phpapp02&amp;stripped_title=composicion-deserviciosweb-ejemplo" /><param name="allowfullscreen" value="true" /><embed type="application/x-shockwave-flash" width="425" height="355" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=composiciondeservicioswebejemplo-100307134250-phpapp02&amp;stripped_title=composicion-deserviciosweb-ejemplo" allowscriptaccess="always" allowfullscreen="true"></embed></object></p>
<div style="padding: 5px 0 12px;">Ver más <a href="http://www.slideshare.net/">presentaciones </a> de <a href="http://www.slideshare.net/programadorphp">Juan Belón Pérez</a> »</div>
</div>
</li>
</ol>
<p>Lo importante de esta lección es aprender a crear servicios web y comunicarlos para ofrecer Servicios de <a href="http://es.wikipedia.org/wiki/Computaci%C3%B3n_en_nube" target="_blank"><strong>Cloud Computing</strong></a>&#8230;</p>
<p>Según esta empresa, esto es CloudComputing:<br />
<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="580" height="360" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowFullScreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="src" value="http://www.youtube-nocookie.com/v/VOn6tg3e1t4&amp;hl=es_ES&amp;fs=1&amp;color1=0x006699&amp;color2=0x54abd6&amp;border=1" /><param name="allowfullscreen" value="true" /><embed type="application/x-shockwave-flash" width="580" height="360" src="http://www.youtube-nocookie.com/v/VOn6tg3e1t4&amp;hl=es_ES&amp;fs=1&amp;color1=0x006699&amp;color2=0x54abd6&amp;border=1" allowscriptaccess="always" allowfullscreen="true"></embed></object></p>
<p>Y algo más sobre Cloud Computing : Cloud Sharing:<br />
<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="425" height="344" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowFullScreen" value="true" /><param name="allowScriptAccess" value="always" /><param name="src" value="http://www.youtube.com/v/oHam8glLuj4&amp;color1=0xb1b1b1&amp;color2=0xcfcfcf&amp;hl=en_US&amp;feature=player_embedded&amp;fs=1" /><param name="allowfullscreen" value="true" /><embed type="application/x-shockwave-flash" width="425" height="344" src="http://www.youtube.com/v/oHam8glLuj4&amp;color1=0xb1b1b1&amp;color2=0xcfcfcf&amp;hl=en_US&amp;feature=player_embedded&amp;fs=1" allowscriptaccess="always" allowfullscreen="true"></embed></object></p>
<p>Las posibilidades se van haciendo cada vez mayores&#8230;el futuro de la evolución de la web pasa por aquí&#8230;<br />
<object width="580" height="360"><param name="movie" value="http://www.youtube-nocookie.com/v/BnUhZ57fwbI&#038;hl=es_ES&#038;fs=1&#038;color1=0x006699&#038;color2=0x54abd6&#038;border=1"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube-nocookie.com/v/BnUhZ57fwbI&#038;hl=es_ES&#038;fs=1&#038;color1=0x006699&#038;color2=0x54abd6&#038;border=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="580" height="360"></embed></object></p>
<p><strong><a href="http://www.programadorphp.org/blog/curso-de-arquitectura-de-servicios-en-java-en-comunicacion-con-php/">« Volver al Curso de Servicios Web</a></strong> | <strong><a href="http://www.programadorphp.org/blog/cursos/curso-de-php-y-servicios-web">Ir a la siguiente lección »</a></strong></p>
]]></content:encoded>
			<wfw:commentRss>http://www.programadorphp.org/blog/cursos/servicios-web-y-cloud-computing-con-java-soap-y-php/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Creación de un paquete de servicios web para un modelo de datos JAVA</title>
		<link>http://www.programadorphp.org/blog/cursos/creacion-de-un-paquete-de-servicios-web-para-un-modelo-de-datos-java/</link>
		<comments>http://www.programadorphp.org/blog/cursos/creacion-de-un-paquete-de-servicios-web-para-un-modelo-de-datos-java/#comments</comments>
		<pubDate>Mon, 01 Mar 2010 03:40:23 +0000</pubDate>
		<dc:creator>Juan Belón Pérez</dc:creator>
				<category><![CDATA[Cursos y talleres]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[junit]]></category>
		<category><![CDATA[Pruebas de Unidad]]></category>
		<category><![CDATA[servicios web]]></category>
		<category><![CDATA[Web Services]]></category>
		<category><![CDATA[wsdl]]></category>
		<category><![CDATA[xml]]></category>
		<category><![CDATA[xsl]]></category>

		<guid isPermaLink="false">http://www.programadorphp.org/?p=512</guid>
		<description><![CDATA[Una vez creado nuestro paquete con la aplicación Java para interactuar con los servicios web como hemos visto en la lección anterior, vamos a realizar las tareas que habíamos dicho paso por paso. Es decir, vamos a crear un servicio web con una operación para añadir un usuario con su nombre de usuario, password, un [...]]]></description>
			<content:encoded><![CDATA[<p>Una vez creado nuestro paquete con la aplicación Java para interactuar con los servicios web como <a href="http://www.programadorphp.org/blog/cursos/creacion-de-servicios-web-con-netbeans-y-glassfish-java-y-php/"><strong>hemos visto en la lección anterior</strong></a>, vamos a realizar las tareas que habíamos dicho paso por paso. Es decir, vamos a crear un servicio web con una operación para añadir un usuario con su nombre de usuario, password, un nombre de piloto y una nave con su cantidad de armamento, otro para obtener una lista de usuarios con pilotos y naves y otro para hacer un login con usuario y password, para ello:</p>
<p>CREAR DIRECTORIO DE XML:</p>
<ol>
<li>Dentro de las propiedades del Proyecto Java Web &#8220;Excalibur&#8221; en la categoría de Sources  -&gt; Package Folder -&gt; Add Folder -&gt; creamos el directorio &#8220;XML&#8221; dentro de &#8220;src&#8221; y de etiqueta (label) ponemos &#8220;XML&#8221;. Aquí vamos a colocar nuestros ficheros WSDL para ver como se construyen servicios web a partir de estos, pero primero el método sencillo&#8230;ahora se puede añadir al esquema de forma gráfica cualquier dato y se formatea por el sistema ,podemos crear un servicio web a partir del fichero&#8230;</li>
</ol>
<p>CREAR SERVICIO WEB</p>
<ol>
<li>En el paquete &#8220;es.ugr.battlegalactica.servicios&#8221; -&gt; botón derecho  -&gt; New -&gt; Web services -&gt; Web Service -&gt; &#8220;construccionNexus&#8221;. Añadir el constructor de la clase y la variable estática Nexus nexus de ésta clase, que se incializa en dicho constructor&#8230;</li>
</ol>
<p>CREAR OPERACIÓN PARA AÑADIR UN USUARIO CON SUS PILOTOS Y SUS NAVES ASOCIADAS</p>
<ol>
<li>Segundo botón en el código dentro de la clase &#8220;construccionNexus&#8221; -&gt; &#8220;Insert Code&#8230;&#8221; -&gt; &#8220;Add Web Service Operation&#8221; -&gt; le llamamos &#8220;crearUsuarioConPilotosYnaves&#8221;</li>
<li>En return type (tipos devueltos) ponemos java.lang.Long y así, si es -1 ha ocurrido un error y en otro caso es el ID del nuevo usuario</li>
<li>Para los parámetros necesitamos que tenga: un nombre y password de usuario,un nombre de piloto  y un nombre de nave; por lo que empezamos por añadir el primer campo con name: &#8220;datos_usuario&#8221; , type: Choose -&gt; find type -&gt; buscamos &#8220;usuario&#8221; y seleccionamos el del modelo de datos de BSGModelo, ahora hacemos lo propio para &#8220;datos_piloto&#8221; -&gt; Piloto y &#8220;datos_nave&#8221; -&gt; Viper. Pinchamos en &#8220;OK&#8221; y se genera el código en Java, sólo hemos de meter los datos correspondientes que nos pasa tan amablemente el servicio web a la base de datos de Nexus ,tal como hacíamos en Prueba.java&#8230;<br />
la función de la operación debe quedar así:</p>
<pre class="brush: java">
@WebMethod(operationName = &quot;crearUsuarioConPilotosYnaves&quot;)
public Long crearUsuarioConPilotosYnaves(@WebParam(name = &quot;datos_usuario&quot;)
Usuario datos_usuario, @WebParam(name = &quot;datos_piloto&quot;)
Piloto datos_piloto, @WebParam(name = &quot;datos_nave&quot;)
Viper datos_nave) {

if (nexus.obtenerUsuario(datos_usuario.getUsuario())!=null ){
//El usuario ya existe, salir!
return new Long(-1);
}

//Añadir Viper
Viper v  = null;
try { //Buscar viper:
v = nexus.obtenerViper(datos_nave.getNombre());
} catch (ViperNoEncontradoException ex){
//La nave no existe, la añadimos
v = new Viper(datos_nave.getNombre());
v.setArmamento(datos_nave.getArmamento());
} finally {
//En otro caso, la nave es la misma?
if (!v.getId().equals(datos_nave.getId())){
//No es la misma, error
return new Long(-1);
}
}

//Añadir piloto:
Piloto p = null;
try {
p = nexus.obtenerPiloto(datos_piloto.getId());
} catch (PilotoNoEncontradoException ex){
//NO Existe el piloto, crearlo
p = new Piloto(datos_piloto.getNombre(), datos_piloto.getDestreza(),
v.getId());
nexus.guardarPiloto(p);
} finally {
//El piloto existe, tiene la misma ID?
if (!p.getId().equals(datos_piloto.getId())){
return new Long(-1);
}
}
ArrayList&lt;Long&gt; lista_pilotos = new ArrayList&lt;Long&gt;();
lista_pilotos.add(p.getId());

//Añadir el usuario con los datos almacenados ya en Nexus:
Usuario u = new Usuario(
datos_usuario.getUsuario(),
datos_usuario.getPassword(),
lista_pilotos );

nexus.guardarUsuario(u);

return u.getId();
}
</pre>
<p>Para probarla primero hacemos click con el segundo botón del ratón en el proyecto Excalibur &gt; Deploy ,esto instalará la aplicación web con la nueva operación compilada, ahora vamos a la lista de servicios web y pulsamos en test Web Service, ya podemos añadir usuarios con un piloto y una nave</li>
</ol>
<p>CREAR OPERACIÓN PARA HACER UN LOGIN CON USUARIO Y PASSWORD</p>
<ol>
<li>Una vez creado un usuario en la base de datos la función para hacer un login es tan simple como esta:
<pre class="brush: java">
@WebMethod(operationName = &quot;hacerLogin&quot;)
public String operation(@WebParam(name = &quot;usuario&quot;)
String nombre_usuario, @WebParam(name =&quot;password&quot;) String contrasena) {
//TODO write your implementation code here:
Usuario u = nexus.obtenerUsuario(nombre_usuario);
if (u==null) return &quot;El usuario no existe&quot;;
else if (u.getPassword().equals(contrasena)){
return &quot;Acceso concedido&quot;;
} else {
return &quot;Contraseña inválida&quot;;
}
}
</pre>
<p>Recordar que para testear los servicios podemos hacerlo en SOAP UI:<br />
<a rel="lightbox" href="http://www.programadorphp.org/wp-content/uploads/2010/03/probando_servicio_login.gif" title="probando el servicio login en SOAP UI" rel="lightbox[512]"><img class="aligncenter size-medium wp-image-517" title="probando el servicio login en SOAP UI" src="http://www.programadorphp.org/wp-content/uploads/2010/03/probando_servicio_login-300x216.gif" alt="" width="300" height="216" /></a></li>
</ol>
<p>CREAR OPERACIÓN PARA OBTENER UN LISTADO DE USUARIOS</p>
<ol>
<li>Es simplemente crear un listado a partir de recorrer el array de estos y devolverlo para que lo analice sintácticamente el sistema y devuelva la construcción XML correspondiente:
<pre class="brush: java">
public List&lt;Usuario&gt; listadoUsuarios() {
List&lt;Usuario&gt; listado = null;
for (Iterator&lt;Usuario&gt; iter = nexus.listarUsuarios(); iter.hasNext(); ){
listado.add(iter.next());
}
return listado;
}
</pre>
</li>
</ol>
<p>Buenas prácticas de programación: Los servicios web son un tipo de comunicación, añadir lógica de programación resulta en algo no-generalizable y por lo tanto ,no reutilizable. Resumiento: hay que hacer una conversión de los datos de un modelo de datos en un modelo de datos de un servicio web,i.e.,las clases con su lógica de programación en Java a un modelo del servicio y luego el paso inverso. Entre medias están las páginas web u otros clientes que los utilizan con su propia lógica. Por ello se recomienda diseñar los servicios web lo último, cuando ya tenemos todo lo que necesitamos en cuanto a datos y lógica interna con ellos, separar cada fichero WSDL para cada servicio es recomendable por si necesitamos cambiar algo y nos cuesta menos trabajo.</p>
<p>CREAR CLIENTES PARA CONECTARSE A LOS SERVICIOS WEB</p>
<ol>
<li>En el proyecto &#8220;Excalibur&#8221; creamos el paquete &#8220;es.ugr.battlegalactica.servicios&#8221; y dentro de este -&gt; segundo botón del ratón-&gt; New -&gt; Other -&gt; Web Services -&gt; Web Service Client -&gt; seleccionamos del proyecto &#8220;Excalibur&#8221; el Servicio Web &#8220;construccionNexus&#8221; -&gt; OK ; y ahora en package ponemos &#8220;es.ugr.battlegalactica.clientes&#8221;. Esto debe crearnos todas las clases Java para comunicarse con las operaciones del Servicio Web. Pero para saber que funcionan usamos un JUnit Test , creamos un paquete llamado &#8220;es.ugr.battlegalactica.clientes&#8221; y dentro un nuevo JUnit Test para clases existentes, elegimos la clase a testear y hacemos como en la primera lección las unidades de prueba.</li>
</ol>
<p><a href="http://www.programadorphp.org/blog/curso-de-arquitectura-de-servicios-en-java-en-comunicacion-con-php/"><strong>&lt; Volver al curso de Arquitectura de Servicios Web con JAVA y PHP</strong></a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.programadorphp.org/blog/cursos/creacion-de-un-paquete-de-servicios-web-para-un-modelo-de-datos-java/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Creación de Servicios Web con Netbeans y Glassfish &#8211; JAVA y PHP</title>
		<link>http://www.programadorphp.org/blog/cursos/creacion-de-servicios-web-con-netbeans-y-glassfish-java-y-php/</link>
		<comments>http://www.programadorphp.org/blog/cursos/creacion-de-servicios-web-con-netbeans-y-glassfish-java-y-php/#comments</comments>
		<pubDate>Mon, 01 Mar 2010 00:17:40 +0000</pubDate>
		<dc:creator>Juan Belón Pérez</dc:creator>
				<category><![CDATA[Cursos y talleres]]></category>
		<category><![CDATA[aplicaciones web]]></category>
		<category><![CDATA[datos]]></category>
		<category><![CDATA[despliegue]]></category>
		<category><![CDATA[esquema]]></category>
		<category><![CDATA[excalibur]]></category>
		<category><![CDATA[glassfish]]></category>
		<category><![CDATA[ibm]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[modelo]]></category>
		<category><![CDATA[modelo de datos]]></category>
		<category><![CDATA[NetBeans]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[servicios web]]></category>
		<category><![CDATA[Sun]]></category>
		<category><![CDATA[wsdl]]></category>
		<category><![CDATA[xml]]></category>
		<category><![CDATA[xsd]]></category>

		<guid isPermaLink="false">http://www.programadorphp.org/?p=501</guid>
		<description><![CDATA[INTRODUCCIÓN
Glassfish es el servidor de aplicaciones Web de Sun, como hay que crear un &#8220;dominio&#8221; dentro del servidor de aplicaciones y esto consume muchos recursos no se utiliza en máquinas convencionales ya que el coste de implementación de un servidor de dominios puede ser demasiado elevado por la carga que supone dicha tarea a pesar [...]]]></description>
			<content:encoded><![CDATA[<h3><strong>INTRODUCCIÓN</strong></h3>
<p>Glassfish es el servidor de aplicaciones Web de Sun, como hay que crear un &#8220;dominio&#8221; dentro del servidor de aplicaciones y esto consume muchos recursos no se utiliza en máquinas convencionales ya que el coste de implementación de un servidor de dominios puede ser demasiado elevado por la carga que supone dicha tarea a pesar de que se puede implementar sobre Apache.</p>
<p>Si instalamos la última versión de Netbeans con Glassfish podemos pasar directamente a la sección de <strong><a href="#creando_servicios_web">Crear el Modelo de datos al que acceder desde Servicios Web</a></strong></p>
<p>Podemos configurar nuestro dominio tanto con la consola como dentro de NetBeans, usando la interfaz de usuario. Vamos a ver cómo se hace de las dos formas, primero con la consola:</p>
<ol>
<li>Descargar Glassfish: <strong><a href="https://glassfish.dev.java.net/public/downloadsindex.html#top" target="_blank">aquí</a> </strong> e instalar con el comando:<br />
<strong>java -Xmx256m -jar <em>glassfish-installer-v2.1.1-b31g-windows.jar</em><br />
</strong>y ahora, entrar en el directorio glassfish, establecer las variables de entorno JAVA_HOME a vuestro directorio de instalación JDK y lo mismo para PATH añadiéndole el directorio de glassfish,  entonces ejecutamos el comando:<br />
<strong>lib\ant\bin\ant -f setup.xml</strong><br />
desde el directorio de glassfish.</li>
<li>Ir a la herramienta de administración por consola del servidor, está en:<br />
<strong>glassfish/bin/asadmin.bat<br />
</strong>ahora vamos a crear un dominio mediante la instrucción (en la consola del server):<br />
create-domain &#8211;user <em>nombre_usuario_admin </em>&#8211;adminport <em>numero_puerto nombredominio</em><br />
en nuestro caso usaremos el dominio Excalibur con usuario root y el puerto 6666:<br />
<strong>create-domain &#8211;user </strong><em><strong>root</strong></em><strong> &#8211;adminport <em>6666 </em></strong><em><strong>excalibur<br />
</strong></em>esto debe de tardar un poquito, se habrá creado un directorio para el dominio en glassfish/domains/excalibur,y ahora,  justo después, &#8220;levantaremos&#8221; el dominio en el servidor con la instrucción:<br />
<strong>start-domain </strong><em><strong>excalibur</strong></em></li>
<li><em><strong><span style="font-weight: normal;"><span style="font-style: normal;">Ahora podréis hacer uso de la dirección <a href="http://localhost:6666/" target="_blank"><em><strong>http://localhost:6666</strong></em></a><em><strong> </strong></em>con los datos de usuario para administrar el server. Podéis pararlo con </span>stop-domain<span style="font-style: normal;">.</span></span><br />
</strong></em>Sólo os diré que en mi máquina,al cargar el servidor y crear el dominio, me empezó a consumir su proceso 30MB de RAM,tras iniciar dicho dominio ya iba por 178MB y subiendo&#8230;imaginaos un servidor de decenas o cientos de dominios en memoria&#8230;más de 900MB pasa perfectamente&#8230;y además, esto en un servidor IBM es normal para un único proceso.</li>
</ol>
<p>Después de trabajar en <a href="http://www.programadorphp.org/blog/curso-de-arquitectura-de-servicios-en-java-en-comunicacion-con-php/" target="_blank">lecciones anteriores</a> con <a href="http://www.programadorphp.org/blog/cursos/instalacion-y-configuracion-de-netbeans-para-creacion-de-servicios-java/">NetBeans</a>, ya deberíamos conocer las ventajas de utilizar este IDE &#8230;</p>
<ol>
<li>Arrancar NetBeans, ir a la pestaña de Servicios -&gt; Servidores -&gt; Segundo botón del ratón -&gt; añadir servidor -&gt;<br />
si os dá un error o no sale ninguna ventana necesitáis actualizar vuestra versión del JDK de Java y reinstalar la última versión de NetBeans que trae una versión de Glassfish 3. Servidores  -&gt; iniciar -&gt; http://localhost:4848/</li>
<li>Para comprobar que el servidor está funcionando vamos a crear un nuevo proyecto de tipo Java web -&gt; Web Application -&gt; compilar y Ejecutar ,en el navegador debe aparecer un &#8220;Hola Mundo&#8221;</li>
</ol>
<p>Ahora vamos a aprender cómo se crean servicios web que utilicen complejas estructuras de datos así como colecciones y anotaciones,  reutilizables, desde distintos clientes que realicen las operaciones desde JAVA o PHP. También aprenderemos a definir un fichero WSDL para crear un servicio ,ambas cosas con Netbeans y usaremos JAX-WS para construir los clientes automáticamente, es decir, el cliente del servicio web (programa que lo usa desde la máquina de un usuario que se conecta a los servicios de un servidor) traduciendo los mensajes que se comunican por el protocolo SOAP.<br />
<a name="creando_servicios_web"></a></p>
<h3><strong>Crear el Modelo de datos para Servicios Web (Web services) con Java en Netbeans</strong></h3>
<p>Resumen de lo que vamos a hacer: crear un servicio web para registrar (en nuestro modelo de datos) usuarios, pilotos y naves en la base de datos de la clase que implementa el computador&#8230;recordar el proyecto <em>BSGModelo</em>&#8230;</p>
<p>Gracias a una clase llamada administracion que crea los usuariosse le asocia un piloto y a éste una nave (viper), todo esto queda almacenado en el modelo de datos del computador Nexus que se ejecuta sobre el servidor Excalibur (glassfish) y que lanza excepciones construidas por nosotros al nivel de aplicaciones y servicios web.</p>
<p>Abrir el proyecto de la <strong><a title="Breve repaso a Java para crear servicios web conectables con PHP" href="http://www.programadorphp.org/blog/cursos/breve-repaso-a-java-para-crear-servicios-web-conectables-con-php/" target="_blank">lección 2: BSGModelo</a> </strong>y haremos lo siguiente:</p>
<ol>
<li>Ya que todo servicio se construye a partir de un Proyecto Web, vamos a crear un nuevo proyecto web: File -&gt; New Project -&gt; Java Web -&gt; Web Application , nombre: &#8220;Excalibur&#8221;, para que podamos almacenar datos y confeccionar asociaciones entre el proyecto BSGModelo y el proyecto de Aplicación Web con Servicios llamado &#8220;Excalibur&#8221; vamos a este proyecto -&gt; segundo botón en &#8220;Libraries&#8221; -&gt; Add Project -&gt; seleccionar BSGModelo y Add Project JAR files.</li>
<li>Ahora vamos a modificar el proyecto &#8220;BSGModelo&#8221;, &#8220;en es.ugr.battlegalactica.modelos&#8221; -&gt; botón derecho -&gt; New -&gt; Java Class -&gt; nombre: &#8220;Usuarios&#8221;, como tenemos que asociar los vipers y los pilotos, debemos cambiar primero la clase pilotos para meter dentro una lista de vipers, crear en usuarios una lista de pilotos en la clase usuarios y luego añadir una lista de usuarios en nexus. El código ha quedar así:
<div id="attachment_506" class="wp-caption aligncenter" style="width: 310px"><a rel="lightbox" href="http://www.programadorphp.org/wp-content/uploads/2010/03/modelo_de_datos.jpg" title="Modelo de datos" rel="lightbox[501]"><img class="size-medium wp-image-506" title="Modelo de datos" src="http://www.programadorphp.org/wp-content/uploads/2010/03/modelo_de_datos-300x300.jpg" alt="Ver modelo de datos" width="300" height="300" /></a><p class="wp-caption-text">Descargar BSGModelo_usuarios.</p></div>
<p>Para que probemos todos estos cambios, hemos hecho cambios a la función Main de la clase Prueba.java:</p>
<pre class="brush: java">
/*
* Web 2.0: Arquitectura Orientada a Servicios en Java
* Primer Modelo: BSGModelo con la clase Prueba
* @author Juan Belón Pérez
*/

package es.ugr.battlegalactica;

import es.ugr.battlegalactica.modelo.Elemento;
import es.ugr.battlegalactica.modelo.Nexus;
import es.ugr.battlegalactica.modelo.Piloto;
import es.ugr.battlegalactica.modelo.Usuario;
import es.ugr.battlegalactica.modelo.Viper;
import es.ugr.battlegalactica.modelo.excepciones.NoHayArmamentoException;
import es.ugr.battlegalactica.modelo.excepciones.PilotoNoEncontradoException;
import es.ugr.battlegalactica.modelo.excepciones.ViperNoEncontradoException;
import java.util.ArrayList;
import java.util.Iterator;

/**
* Clase con los 3 primeros ejercicios propuestos
* @author Juan Belón Pérez
*/
public class Prueba {
private static ArrayList&lt;Elemento&gt; elementos;
private static ArrayList&lt;Piloto&gt; pilotos;
private static ArrayList&lt;Viper&gt; vipers;
private static Nexus nexus;
/**
* Función principal.
* Imprime por pantalla un mensaje fijo.
*
* @param args la linea de argumentos del programa
*/
public static void main(String[] args) throws NoHayArmamentoException, PilotoNoEncontradoException, ViperNoEncontradoException {
System.out.println(&quot;Prueba del modelo de datos BattleStarGallactica&quot;);
/*crear dos elementos e imprimir sus identificadores en la consola.
Si todo ha ido bien se deberían escribir los identificadores 1 y 2*/
init();
System.out.println(&quot;Prueba de creación de elementos:&quot;);
for (Elemento e: elementos){
System.out.printf(&quot;%d,&quot;,e.getId());
}
System.out.println(&quot;\nPrueba de creación de pilotos:\n&quot;);
for (Piloto p: pilotos){
System.out.printf(&quot;ID:%d,Nombre:%s,Destreza:%d\n&quot;,p.getId(),p.getNombre(),
p.getDestreza());
}
System.out.println(&quot;\nPrueba de creación de vipers:\n&quot;);
for (int i=0; i&lt;4; i++){ //Disparar 4 veces con todos los vipers:
for (Viper v: vipers){
System.out.printf(&quot;#%d# Disparando con el viper ID:%d,Nombre:%s,&quot; +
&quot;Armamento:%d\n&quot;,(i+1),v.getId(),v.getNombre(),v.getArmamento());
try {
v.disparar();
} catch (NoHayArmamentoException e){
System.err.println(&quot;\n\tError al disparar:&quot;+e.getMessage()+&quot;\n&quot;);
}
System.out.printf(&quot;\tEl nuevo armamento del viper con ID:%d y Nombre: %s&quot;+
&quot; ahora tiene %d unidad/es\n&quot;,
v.getId(),v.getNombre(),v.getArmamento());
}
}
System.out.println(&quot;\nPrueba de creación de Nexus con Pilotos:\n&quot;);
Iterator&lt;Piloto&gt; iter_piloto = nexus.listarPilotos();
Piloto aux_piloto = null;
while (iter_piloto.hasNext()){
aux_piloto = iter_piloto.next();
System.out.printf(&quot;Piloto %s, ID:%d\n&quot;, aux_piloto.getNombre(),
aux_piloto.getId());
}
System.out.println(&quot;\nPrueba de creación de Nexus con Vipers:\n&quot;);
Iterator&lt;Viper&gt; iter_viper = nexus.listarVipers();
Viper aux_viper = null;
while (iter_viper.hasNext()){
aux_viper = iter_viper.next();
System.out.printf(&quot;Viper %s, ID:%d\n&quot;, aux_viper.getNombre(),
aux_viper.getId());
}
if (aux_piloto!=null){
System.out.println(&quot;\nPrueba de búsqueda (el último:&quot; +
aux_piloto.getId()+&quot;) de Pilotos en Nexus:\n&quot; +
nexus.obtenerPiloto(aux_piloto.getId()).getNombre());
}
if (aux_viper!=null){
System.out.println(&quot;\nPrueba de búsqueda de Vipers (el último:&quot;+
aux_viper.getId()+&quot;) en Nexus:\n&quot; +
nexus.obtenerViper(aux_viper.getId()).getNombre()
);
}

System.out.println(&quot;\nComprobar que se generan las excepciones &quot;+
&quot;buscando un Piloto falso:23\n&quot;);
try {
aux_piloto = nexus.obtenerPiloto(new Long(23));
} catch (PilotoNoEncontradoException ex){
System.err.println(&quot;\n\t&quot;+ex.getMessage());
}
System.out.println(&quot;\nComprobar que se generan las excepciones &quot;+
&quot;buscando un Viper falso:23&quot;);
try {
aux_viper = nexus.obtenerViper(new Long(23));
} catch (ViperNoEncontradoException ex){
System.err.println(&quot;\n\t&quot;+ex.getMessage());
}

try {
Usuario usuario = nexus.obtenerUsuario(&quot;juaxix&quot;);
System.out.println(&quot;\nCreación de un usuario (&quot;+
usuario.getUsuario() + &quot; con piloto: &quot; +

(nexus.obtenerPiloto(
usuario.getPilotos().get(0)
).getNombre()) + &quot; y viper asociado a este piloto: &quot;+
nexus.obtenerViper(
nexus.obtenerPiloto(
(nexus.obtenerUsuario(usuario.getId()).getPilotos().get(0))
).getNaves().get(0)
).getNombre()
);
System.out.flush();
} catch (PilotoNoEncontradoException ex){
System.err.println(&quot;\n\t&quot;+ex.getMessage());
/* } catch (ViperNoEncontradoException ex){
System.err.println(&quot;\n\t&quot;+ex.getMessage());*/
} catch (Exception ex){
System.err.println(&quot;\n\tNEXUS LOG:&quot;+ex.getMessage());
}
}
/**
* Inicializador de elementos, pilotos, vipers y Nexus (vipers
* , pilotos y usuarios)
*/
private static void init(){
Viper v_aux;
elementos = new ArrayList&lt;Elemento&gt;();
pilotos   = new ArrayList&lt;Piloto&gt;();
vipers    = new ArrayList&lt;Viper&gt;();
nexus     = new Nexus();
elementos.add(new Elemento());
elementos.add(new Elemento());

v_aux = new Viper(&quot;Trueno&quot;);
v_aux.setArmamento(4);
vipers.add(v_aux);

pilotos.add(new Piloto(&quot;Migue&quot;,120,v_aux.getId()));
v_aux = new Viper(&quot;Rayo&quot;);
v_aux.setArmamento(4);
vipers.add(v_aux);
pilotos.add(new Piloto(&quot;Sara&quot;,110,v_aux.getId()));

//INTRODUCIR DATOS EN NEXUS:
v_aux = new Viper(&quot;Trueno&quot;);
v_aux.setArmamento(4);
nexus.guardarViper(v_aux);
Piloto juax = new Piloto(&quot;Juax&quot;,130,v_aux.getId());
nexus.guardarPiloto(juax);

v_aux = new Viper(&quot;Fuego&quot;);
v_aux.setArmamento(5);
nexus.guardarViper(v_aux);
nexus.guardarPiloto(new Piloto(&quot;Jesús&quot;,130,v_aux.getId()));
//Creación de un usuario en Nexus:
ArrayList&lt;Long&gt; lista_pilotos_usuario = new ArrayList&lt;Long&gt;();
lista_pilotos_usuario .add(juax.getId());
Usuario usuario = new Usuario(&quot;juaxix&quot; /*nombre usuario*/
, &quot;juaxix&quot; /* password */
,lista_pilotos_usuario /* lista de ids de pilotos asociados */
);
nexus.guardarUsuario(usuario);

}

}
</pre>
<p>La idea del modelo de datos es parecida a un modelo de cajas:<br />
<a rel="lightbox" href="http://www.programadorphp.org/wp-content/uploads/2010/03/modelo_cajas.gif" title="Modelo de cajas" rel="lightbox[501]"><img class="aligncenter size-medium wp-image-509" title="Modelo de cajas" src="http://www.programadorphp.org/wp-content/uploads/2010/03/modelo_cajas-300x212.gif" border="0" alt="" width="300" height="212" /><br />
</a> La nueva línea que ha de mostrar la ejecución de esta clase (el proyecto BSGModelo) es:</p>
<blockquote><p>&#8220;Creación de un usuario (juaxix con piloto: Juax y viper asociado a este piloto: Trueno&#8221;</p></blockquote>
</li>
<li>Para usar los servicios, creamos un nuevo paquete, en el proyecto Java Web llamado &#8220;Excalibur&#8221; -&gt;  &#8220;Source Packages&#8221; -&gt; botón derecho -&gt; New -&gt; Java Package -&gt; llamado &#8220;es.ugr.battlegalactica.servicios&#8221;.</li>
</ol>
<p><a href="http://www.programadorphp.org/blog/cursos/creacion-de-un-paquete-de-servicios-web-para-un-modelo-de-datos-java/"><strong>Continuar &gt;</strong></a></p>
<p><strong><a href="http://www.programadorphp.org/blog/curso-de-arquitectura-de-servicios-en-java-en-comunicacion-con-php/">&lt; volver al Curso de Arquitectura de Servicios Web con JAVA + XML + PHP</a></strong></p>
]]></content:encoded>
			<wfw:commentRss>http://www.programadorphp.org/blog/cursos/creacion-de-servicios-web-con-netbeans-y-glassfish-java-y-php/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Conceptos básicos: XML + JAVA + JDOM + SOAP + PHP</title>
		<link>http://www.programadorphp.org/blog/cursos/conceptos-basicos-xml-java-jdom-soap-php/</link>
		<comments>http://www.programadorphp.org/blog/cursos/conceptos-basicos-xml-java-jdom-soap-php/#comments</comments>
		<pubDate>Thu, 25 Feb 2010 02:36:26 +0000</pubDate>
		<dc:creator>Juan Belón Pérez</dc:creator>
				<category><![CDATA[Cursos y talleres]]></category>
		<category><![CDATA[base]]></category>
		<category><![CDATA[comunicación]]></category>
		<category><![CDATA[conceptos]]></category>
		<category><![CDATA[facebook]]></category>
		<category><![CDATA[http]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[jdom]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[sax]]></category>
		<category><![CDATA[servidor]]></category>
		<category><![CDATA[servidores]]></category>
		<category><![CDATA[smtp]]></category>
		<category><![CDATA[soap]]></category>
		<category><![CDATA[soap ui]]></category>
		<category><![CDATA[wsdl]]></category>
		<category><![CDATA[xml]]></category>
		<category><![CDATA[xml-rpc]]></category>

		<guid isPermaLink="false">http://www.programadorphp.org/?p=483</guid>
		<description><![CDATA[Hablemos primero un poco acerca de XML Gracias a los protocolos para conectar XML como XML-RPC,SOAP o RSS, XML sobrevivió al desastre de convertirse en un lenguaje que no aportara nada nuevo a lo existente (HTML), y que combinado con WSDL, JAVA y PHP obtenemos las herramientas más utilizadas en la red hoy en día: [...]]]></description>
			<content:encoded><![CDATA[<p>Hablemos primero un poco acerca de XML Gracias a los protocolos para conectar XML como XML-RPC,SOAP o RSS, XML sobrevivió al desastre de convertirse en un lenguaje que no aportara nada nuevo a lo existente (HTML), y que combinado con WSDL, JAVA y PHP obtenemos las herramientas más utilizadas en la red hoy en día: servicios.</p>
<p>XML es robusto, podemos modificar el fichero fácilmente sin que pierda su significado dramáticamente; podemos construir una estructura para moldear la forma en que se comunican nuestros servicios con los clientes y aplicaciones con diversas reglas, me gustaría que mirárais la documentación sobre <a title="Abrir documentación sobre protocolos XML" href="http://www.programadorphp.org//wp-content/uploads/Cursos_Talleres/JavaWS/manuales_comunicacion.html" target="_blank"><strong>XML, XML-RPC,SOAP,RSS,SAX,DOM, JDOM y WSDL que he puesto aquí</strong></a> (de la UGR , y también en un comprido <a href="http://www.programadorphp.org//wp-content/uploads/Cursos_Talleres/JavaWS/manuales_comunicacion.rar" target="_blank"><strong>manuales_comunicacion.rar</strong></a> para tenerlo en local) ya que se explican conceptos fundamentales, como el standalone de xml (para decir si la estructura del árbol documento [DOM] se construye sólo con un fichero o por medio de varios, etc.), o lo nuevo de XML que son los namespace para que dentro del nombre de la etiqueta se pueda incrustar un diccionario: <em>&lt;dic:alumno&gt;&#8230;&lt;/dic:alumno&gt;</em>, etc.; también, indicando donde está mediante &lt;Nombre xmlns=&#8221;url_del_diccionario_nombre&#8221;&gt;&#8230;</p>
<p>Sabiendo que DTD y un esquema XSD definen de la misma forma la estructura de un XML, estos últimos XSD son los más utilizados hoy en día, porque es realmente sencillo (al menos cuando estuve construyendo zenphp me costó mucho tener reglas DTD válidas para el generador de aplicaciones php a partir de un xml) hacer dichas reglas usando XML, ya que XSD se basa en un DTD ,son los diccionarios predefenidos que se van incrustando como las muñecas rusas.</p>
<p>El protocolo XML funciona normalmente a través del puerto HTTP (80) y dió lugar al XML-RPC, fué más famoso que SOAP porque éste había que introducirlo mediante un conjunto de reglas propias y era pesado de hacer, actualmente existen librerías que crean los envoltorios para enviar mensajes:</p>
<div class="wp-caption aligncenter" style="width: 537px"><a href="http://www.programadorphp.org/wp-content/uploads/Cursos_Talleres/JavaWS/manuales_comunicacion.html" target="_blank"><img title="XML-RPC" src="http://www.programadorphp.org/wp-content/uploads/Cursos_Talleres/JavaWS/manuales_comunicacion_files/apuntes_data/xmlrpc.jpg" alt="XML-RPC" width="527" height="270" /></a><p class="wp-caption-text">Ver XML-RPC en los manuales</p></div>
<p>..embebiendo tipos en parámetros y estos en valores dando forma así a las peticiones y las respuestas de los servicios.</p>
<p>SOAP : es ligero, tiene pocas etiquetas y casi no pesan nada, es como la evolución de XML-RPC ,al fin y al cabo, es otro envoltorio para enviar mensajes por HTTP o SMTP , (Facebook lo usa)&#8230;</p>
<p>WSDL: además define reglas para un servicio web&#8230;mirar la documentación propuesta anteriormente para más información&#8230;</p>
<p>Para empezar, veremos como conectar Java con un WSDL y obtener resultados, siguiendo los pasos:</p>
<ol>
<li>Dispondremos primero de un editor: <a href="http://sourceforge.net/projects/soapui/files/" target="_blank"><strong>SOAP UI</strong></a> ,descargar e instalar</li>
<li>Ahora daremos con una lista de servicios de tipo WSDL, por ejemplo los servicios de DaeHosting:
<p>http://webservices.daehosting.com/services/</p>
<p>abrimos el servicio de fechas: http://webservices.daehosting.com/services/DatesService.wso y copiamos la dirección URL de la descripción de sus servicios ,que es el fichero WSDL [un XML] que necesitamos: http://webservices.daehosting.com/services/DatesService.wso?WSDL</li>
<li>Abrimos SOAP UI y Vamos al menú: &#8220;File -&gt; New soapUI Project&#8221; , insertamos la URL copiada del paso anterior en &#8220;Initial WSDL/WADL&#8221; y se pondrá automáticamente el nombre a &#8220;DatesService&#8221; pero podemos ponerle el que queramos, pinchamos en &#8220;OK&#8221; y empezará a cargar los servicios que ofrece dicho WSDL. Estos aparecerán en la pestaña &#8220;Navigator&#8221; en modo árbol, seleccionamos MonthNames y desplegamos el árbol de modo que hacemos doble click sobre &#8220;Request 1&#8243; y aparecerá una ventana con el esquema XML de la petición que se realiza al servidor, las entradas se pueden identificar por el caracter &#8220;?&#8221;</li>
<li>Vamos a pulsar en la ventana de &#8220;Request 1&#8243; con el segundo botón del ratón-&gt;&#8221;Validate&#8221; para validar el documento y veremos que ﻿nos aparecen mensajes para que rellenemos los datos pedidos, pero antes debemos conocer qué poner en &#8220;iLanguage&#8221;, para ello, abrimos del árbol de Servicios &#8220;DateServiceSoapBinding&#8221; el &#8220;Request1&#8243; de &#8220;MainLanguages&#8221; de forma que al ejecutarlo nos aparecerá como respuesta del servidor una lista con el formato XML del WSDL del servicio con los idiomas que soporta, copiamos el valor para el español: &#8220;LANG_SPANISH&#8221; y volvemos a la ventana del &#8220;Request 1&#8243; de la Operación &#8220;MonthNames&#8221; donde ahora sí sabemos qué valor hay que poner en el tipo de dato &#8220;iLanguage&#8221;: LANG_SPANISH.  Los otros dos parámetros :  bAbbreviated y bUse13Months son booleanos, probad vosotros mismos qué diferencias hay entre poner 0 ó 1 <img src='http://www.programadorphp.org/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /><br />
En cualquier caso el resultado de la ejecución correcta del servicio debe de tener una pinta como esta:<br />
<a rel="lightbox" href="http://www.programadorphp.org/wp-content/uploads/2010/02/soap_ui.png" title="soap_ui" rel="lightbox[483]"><img class="aligncenter size-medium wp-image-485" title="soap_ui" src="http://www.programadorphp.org/wp-content/uploads/2010/02/soap_ui-300x222.png" alt="" width="300" height="222" /></a></li>
<li>Acabamos de presenciar la generación de llamadas a servicios para que devuelvan el nombre de los meses en un idioma deseado, con lo que este servicio, (por ingeniería inversa) sabemos que se trata de un traductor&#8230;</li>
<li>Combinando los servicios podemos hacer cosas realmente interesantes&#8230;probad a usar la petición de la operación MonthName para obtener el mes de Abril en Alemán por ejemplo</li>
</ol>
<p>Ahora que sabemos como comunicar servicios con esquemas XML veamos como utilizar Java para implementar una aplicación que haga lo que nuestro querido SOAP UI hace tan fácilmente en una serie de sencillos pasos:</p>
<ol>
<li>Descargar, descomprimir y abrir el proyecto para NetBeans: <em>Ejemplos XML</em> para Java: <a title="Descargar Ejemplos XML para Java con NetBeans" href="http://www.programadorphp.org/wp-content/uploads/Cursos_Talleres/JavaWS/EjemplosXML.rar" target="_blank"><strong>aquí</strong></a>.</li>
<li>Debe aparecer un problema de referencias al cargar el proyecto, para solucionarlo descargar las librerías <a title="Descargar las librerías jdom.jar, xerces.jar y xml-apis.jar para solucionar los problemas de dependencias del proyecto" href="http://programadorphp.org/wp-content/uploads/Cursos_Talleres/JavaWS/librerias.rar" target="_blank"><strong>aquí</strong></a> y en las propiedades del proyecto -&gt; Librerías -&gt; pestaña de Compilar -&gt; quitáis las referencias <em>rotas</em> y añadir los ficheros JAR (que hay que descomprimir de  librerias.rar). Entonces deben desaparecer todos los errores de compilación en NetBeans&#8230;(BuildAll&#8230;)</li>
<li>Ahora expandimos el paquete &#8220;EscribirXML.SOAP&#8221; y abrimos el fichero <em>ClienteSOAP.java</em>, donde vamos a reemplazar &#8220;localhost&#8221; de la línea 17 por nuestro servidor WSDL con soporte para acciones SOAP,en este caso es RFC, para mostrar que sirve para RPC también el mismo código:
<p>http://www.ebi.ac.uk/Tools/webservices/wsdl/WSDbfetch.wsdl</p>
<p>si el tipo de Operación es SOAP en lugar de RPC, la acción SOAP la podemos leer en el editor SOAP UI en las propiedades de la Operación seleccionada</li>
<li>Mirando el código comprender que se realiza una conexión al servidor y se envía por el método POST una petición HTTP con los parámetros establecidos (acción SOAP si se define) y se escribe en el búfer con wout.write() nuestro esquema XML, por lo tanto copiamos el WSDL del SOAP UI de la petición &#8220;Request 1&#8243; para la Operación &#8220;getSupportedDBs&#8221; (reemplazando los valores de las interrogantes como antes si es que los hay)&#8230;</li>
<li>Para probar el ejemplo compilamos y tras hacer click con el segundo botón del ratón sobre ClienteSOAP.java  pulsamos en &#8220;Run&#8221; (Ejecutar) o bien editamos las opciones del proyecto -&gt; run -&gt; Main class -&gt; &#8220;EscribirXML.SOAP.ClienteSOAP&#8221;, sin argumentos en este caso&#8230;<br />
El código ha de quedar así:</p>
<pre class="brush: java">
package EscribirXML.SOAP;
import java.net.*;
import java.io.*;

/**
*
* @author
*/
public class ClienteSOAP {

public final static String DEFAULT_SERVER
= &quot;http://www.ebi.ac.uk/Tools/webservices/wsdl/WSDbfetch.wsdl&quot;;
// = &quot;http://www.schemaweb.info/webservices/soap/SchemaWebSoap.asmx?WSDL&quot;;
/* public final static String SOAP_ACTION
= &quot;http://www.schemaweb.info/webservices/methods/GetObjects&quot;;*/

public static void main(String[] args) {
String server = DEFAULT_SERVER;
try {
URL u = new URL(server);
URLConnection uc = u.openConnection();
HttpURLConnection connection = (HttpURLConnection) uc;

connection.setDoOutput(true);
connection.setDoInput(true);
connection.setRequestMethod(&quot;POST&quot;);
//connection.setRequestProperty(&quot;SOAPAction&quot;, SOAP_ACTION);

OutputStream out = connection.getOutputStream();
Writer wout = new OutputStreamWriter(out);

wout.write(
&quot;&lt;soapenv:Envelope xmlns:xsi=\&quot;&quot;+
&quot;http://www.w3.org/2001/XMLSchema-instance\&quot; &quot;+
&quot;xmlns:xsd=\&quot;http://www.w3.org/2001/XMLSchema\&quot; &quot;+
&quot;xmlns:soapenv=\&quot;http://schemas.xmlsoap.org/soap/envelope/\&quot; &quot;+
&quot;xmlns:wsd=\&quot;http://wsdbfetch.ws.jdbfetch.ebi.ac.uk\&quot;&gt;&quot;+
&quot;&lt;soapenv:Header/&gt;&quot;+
&quot;&lt;soapenv:Body&gt;&quot;+
&quot;&lt;wsd:getSupportedDBs soapenv:encodingStyle=\&quot;&quot;+
&quot;http://schemas.xmlsoap.org/soap/encoding/\&quot;/&gt;&quot;+
&quot;&lt;/soapenv:Body&gt;&quot;+
&quot;&lt;/soapenv:Envelope&gt;&quot;);
wout.flush();

wout.close();

InputStream in = connection.getInputStream();
int c;
System.err.println( &quot;\n\nCONTESTACION\n\n&quot;);
while ((c = in.read()) != -1) System.out.write(c);
in.close();

}
catch (IOException e) {
System.err.println(&quot;HA DADO UNA EXCEPCION&quot;);
System.err.println(e);
}

} // end main

}
</pre>
</li>
<li>La salida debe ser algo como:<br />
<a rel="lightbox" href="http://www.programadorphp.org/wp-content/uploads/2010/02/salida_wsdl_java.png" title="salida_wsdl_java" rel="lightbox[483]"><img class="aligncenter size-medium wp-image-486" title="salida_wsdl_java" src="http://www.programadorphp.org/wp-content/uploads/2010/02/salida_wsdl_java-300x93.png" alt="" width="300" height="93" /></a></li>
</ol>
<p>Por último vamos a probar un ejemplo del análisis sintáctico de un fichero XML a través del uso de un ParserDOM, abriendo el paquete DOM.Parsear y dentro el fichero &#8220;ParserDOM.java&#8221; sólo hemos de pasarle la ruta por línea de comandos del fichero y observar los resultados&#8230; (ver ejemplos con SAX del mismo proyecto de NetBeans proporcionado)&#8230;</p>
<p>El Modelo Objeto Documento de Java además de servir de analizador sintáctico con el método parse(), proporciona interfaces para manejar ficheros como árboles de datos, se obtiene con parsed.getDocument(), si no existen excepciones se trata, en otro caso es que el documento no ha pasado la validación, encontraremos información de prefijo, etc. dentro del árbol&#8230;</p>
<p><a href="http://www.programadorphp.org/blog/curso-de-arquitectura-de-servicios-en-java-en-comunicacion-con-php/"><strong>« Volver al curso de Arquitectura de Servicios en Java+PHP</strong></a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.programadorphp.org/blog/cursos/conceptos-basicos-xml-java-jdom-soap-php/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Componente de Firefox para diseñadores y maquetadores Web: Pixel Perfect</title>
		<link>http://www.programadorphp.org/blog/componente-de-firefox-para-disenadores-y-maquetadores-web-pixel-perfect/</link>
		<comments>http://www.programadorphp.org/blog/componente-de-firefox-para-disenadores-y-maquetadores-web-pixel-perfect/#comments</comments>
		<pubDate>Wed, 24 Feb 2010 13:29:16 +0000</pubDate>
		<dc:creator>Juan Belón Pérez</dc:creator>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[diseño]]></category>
		<category><![CDATA[extensiones]]></category>
		<category><![CDATA[extensions]]></category>
		<category><![CDATA[firefox]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[maquetación]]></category>
		<category><![CDATA[pixel]]></category>
		<category><![CDATA[pixel perfect]]></category>
		<category><![CDATA[píxeles]]></category>
		<category><![CDATA[web]]></category>
		<category><![CDATA[xhtml]]></category>

		<guid isPermaLink="false">http://www.programadorphp.org/?p=478</guid>
		<description><![CDATA[Estos son algunos de los diseños en XHTML+CSS que existen actualmente en la red y que se basan en el correcto posicionamiento del arte gráfico usando un esquema de divisiones o cajas que enmarcan el resultado final&#8230;



Supongo que muchas veces os preguntaréis cómo diseñan estos genios sus páginas web, (mirad estos 35 excelentes diseños de [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: left;">Estos son algunos de los diseños en XHTML+CSS que existen actualmente en la red y que se basan en el correcto posicionamiento del arte gráfico usando un esquema de divisiones o cajas que enmarcan el resultado final&#8230;</p>
<p style="text-align: center;"><a rel="lightbox" href="http://www.programadorphp.org/wp-content/uploads/2010/02/Concept_Web_interface_by_graphiclancer.jpg" title="Concept_Web_interface_by_graphiclancer" rel="lightbox[478]"><img class="size-medium wp-image-492  aligncenter" title="Concept_Web_interface_by_graphiclancer" src="http://www.programadorphp.org/wp-content/uploads/2010/02/Concept_Web_interface_by_graphiclancer-300x229.jpg" alt="" width="300" height="229" /></a></p>
<p style="text-align: center;">
<p><a rel="lightbox" href="http://www.programadorphp.org/wp-content/uploads/2010/02/Alarm_Service_by_ducoradini.jpg" title="Alarm_Service_by_ducoradini" rel="lightbox[478]"><img class="aligncenter size-medium wp-image-496" title="Alarm_Service_by_ducoradini" src="http://www.programadorphp.org/wp-content/uploads/2010/02/Alarm_Service_by_ducoradini-300x230.jpg" alt="" width="300" height="230" /></a></p>
<p style="text-align: left;">Supongo que muchas veces os preguntaréis cómo diseñan estos genios sus páginas web, (mirad estos <a href="http://vandelaydesign.com/blog/galleries/ecommerce-ui/" target="_blank"><strong>35 excelentes diseños de webs e-commerce</strong></a>) no nos hace falta <strong>Flash</strong> realmente, sino que usando <strong>XHTML y CSS</strong> se pueden crear maravillas, ya lo estáis viendo.</p>
<p style="text-align: center;"><a rel="lightbox" href="http://www.programadorphp.org/wp-content/uploads/2010/02/Expresso_Brilhante_by_ducoradini.jpg" title="Expresso_Brilhante_by_ducoradini" rel="lightbox[478]"><img class="size-medium wp-image-494 aligncenter" title="Expresso_Brilhante_by_ducoradini" src="http://www.programadorphp.org/wp-content/uploads/2010/02/Expresso_Brilhante_by_ducoradini-300x218.jpg" alt="" width="300" height="218" /></a></p>
<p>Sin embargo, la tediosa tarea de colocar cada imagen en su sitio dentro de una división, cada fondo en el renglón adecuado y el pixel colocado en el milímetro ideal&#8230;es una tarea de titanes!, pero para eso amigos tenemos la herramienta <strong>Pixel Perfect</strong>&#8230;para colocar perfectamente los gráficos dentro de nuestra estructura y a mano <img src='http://www.programadorphp.org/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p style="text-align: center;">Y para muestra, un vídeo:<br />
<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="500" height="405" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowFullScreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="src" value="http://www.youtube-nocookie.com/v/ck0Tw_OnZ20&amp;hl=es_ES&amp;fs=1&amp;color1=0x402061&amp;color2=0x9461ca&amp;border=1" /><param name="allowfullscreen" value="true" /><embed type="application/x-shockwave-flash" width="500" height="405" src="http://www.youtube-nocookie.com/v/ck0Tw_OnZ20&amp;hl=es_ES&amp;fs=1&amp;color1=0x402061&amp;color2=0x9461ca&amp;border=1" allowscriptaccess="always" allowfullscreen="true"></embed></object></p>
<p>Para instalar esta extensión de Firefox sólo hay que pinchar <strong><a href="http://www.pixelperfectplugin.com/" target="_blank">aquí</a></strong>. (Debes tener <strong><a href="http://www.getfirebug.com" target="_blank">Firebug</a></strong> instalado)</p>
<p>Para usarlo: Vamos a nuestra web, pulsamos F12 o sobre el icono de <em>Pixel Perfect</em></p>
<p><a href="http://www.programadorphp.org/wp-content/uploads/2010/02/pixel_perfect.gif" title="pixel_perfect" rel="lightbox[478]"><img class="aligncenter size-full wp-image-479" title="pixel_perfect" src="http://www.programadorphp.org/wp-content/uploads/2010/02/pixel_perfect.gif" alt="" width="181" height="33" /></a>y añadimos una capa con &#8220;<em>Add overlay</em>&#8221; que será la imagen que necesitamos colocar mediante valores CSS.</p>
<p>Por ejemplo:</p>
<p><a rel="lightbox" href="http://www.programadorphp.org/wp-content/uploads/2010/02/ejemplo_firefox_start.png" title="ejemplo_firefox_start" rel="lightbox[478]"><img class="aligncenter size-medium wp-image-480" title="ejemplo_firefox_start" src="http://www.programadorphp.org/wp-content/uploads/2010/02/ejemplo_firefox_start-300x212.png" alt="" width="300" height="212" /></a></p>
<p>Ahora podemos colocar la imagen que hemos añadido gráficamente, para obtener el HTML+CSS correspondiente a esta colocación pinchamos en la pestaña &#8220;HTML&#8221; y buscamos el objeto añadido dinámicamente o bien pulsamos en &#8220;Inspeccionar&#8221; y luego en la capa con la imagen superpuesta de modo que podemos copiar fácilmente el código creado por el generador de la extensión.</p>
<p><a rel="lightbox" href="http://www.programadorphp.org/wp-content/uploads/2010/02/codigo_generado_pixel_perfe.png" title="codigo_generado_pixel_perfe" rel="lightbox[478]"><img class="aligncenter size-medium wp-image-481" title="codigo_generado_pixel_perfe" src="http://www.programadorphp.org/wp-content/uploads/2010/02/codigo_generado_pixel_perfe-300x189.png" alt="" width="300" height="189" /></a></p>
<p>Felices modificaciones CSS <img src='http://www.programadorphp.org/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.programadorphp.org/blog/componente-de-firefox-para-disenadores-y-maquetadores-web-pixel-perfect/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Breve repaso a Java para crear servicios web conectables con PHP</title>
		<link>http://www.programadorphp.org/blog/cursos/breve-repaso-a-java-para-crear-servicios-web-conectables-con-php/</link>
		<comments>http://www.programadorphp.org/blog/cursos/breve-repaso-a-java-para-crear-servicios-web-conectables-con-php/#comments</comments>
		<pubDate>Wed, 24 Feb 2010 01:08:29 +0000</pubDate>
		<dc:creator>Juan Belón Pérez</dc:creator>
				<category><![CDATA[Cursos y talleres]]></category>
		<category><![CDATA[curso]]></category>
		<category><![CDATA[excepciones]]></category>
		<category><![CDATA[exceptions]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[NetBeans]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[repaso]]></category>
		<category><![CDATA[tutorial]]></category>

		<guid isPermaLink="false">http://www.programadorphp.org/?p=466</guid>
		<description><![CDATA[Para crear Servicios Web necesitamos tener unas nociones básicas del lenguaje Java a partir de las que accederemos a los elementos que vamos a construir en nuestros ejemplos.
Lanzamos NetBeans, vamos a crear, a partir del proyecto de la lección anterior,

clases para construir modelos: elementos, pilotos (elemento), viper(elemento) ,computador y nexus (computador).
Clases para excepciones que se generarán [...]]]></description>
			<content:encoded><![CDATA[<p>Para crear Servicios Web necesitamos tener unas nociones básicas del lenguaje Java a partir de las que accederemos a los elementos que vamos a construir en nuestros ejemplos.</p>
<p>Lanzamos NetBeans, vamos a crear, a partir del proyecto de la <strong><a href="http://www.programadorphp.org/blog/cursos/instalacion-y-configuracion-de-netbeans-para-creacion-de-servicios-java/">lección anterior</a></strong>,</p>
<ul>
<li>clases para construir modelos: elementos, pilotos (elemento), viper(elemento) ,computador y nexus (computador).</li>
<li>Clases para excepciones que se generarán en las clases piloto, viper y nexus, lanzadas desde Prueba.</li>
</ul>
<p>Lo primero es construir el Elemento:</p>
<pre class="brush: java">
/*
* Web 2.0: Arquitectura Orientada a Servicios en Java.
* Introducción a JAVA
* CLASE DEL MODELO Elemento
*/

package es.ugr.battlegalactica.modelo;

/**
* Clase Elemento
* @author Juan Belón Pérez
*/
public class Elemento {
/**
* Siguiente elemento
*/
private static long nextId = 0;
/**
* ID del Elemento
*/
protected long id = 0;

/**
* Constructor de Elemento sin argumentos
* @return Elemento
*/
public Elemento() {
this.id = ++Elemento.nextId;
}
/**
* Devuelve el Id de la clase
* @return long
*/
public long getId() {
return id;
}
/**
* Devuelve el contador actual de ID&#039;s de Elementos
* @return long
*/
public long getNextId(){
return Elemento.nextId;
}

}
</pre>
<p>Ahora, podemos ,a partir de este elemento construir Pilotos que hereden de este:</p>
<pre class="brush: java">
/*
* Web 2.0: Arquitectura Orientada a Servicios en Java.
* Introducción a JAVA
* CLASE DEL MODELO Piloto que hereda del Modelo Elemento
*/

package es.ugr.battlegalactica.modelo;

/**
* Clase Piloto, hereda de Elemento
* @author Juan Belón Pérez
*/
public class Piloto extends Elemento {
/**
* Nombre del piloto
*/
private String nombre;
/**
* Destreza del piloto
*/
private int destreza;
/**
* Constructor de Piloto
* @param nombre
* @param destreza
*/
public Piloto(String nombre, int destreza) {
this.nombre   = nombre;
this.destreza = destreza;
}
/**
* Devuelve el valor de destreza de un piloto
* @return int
*/
public int getDestreza() {
return destreza;
}
/**
* Devuelve el nombre de un piloto
* @return String
*/
public String getNombre() {
return nombre;
}

}
</pre>
<p>y lo mismo que para Piloto pero con Viper (que son naves):</p>
<pre class="brush: java">
/*
* Web 2.0: Arquitectura Orientada a Servicios en Java.
* Introducción a JAVA
* CLASE DEL MODELO Viper que hereda del Modelo Elemento
*/

package es.ugr.battlegalactica.modelo;

import es.ugr.battlegalactica.modelo.excepciones.NoHayArmamentoException;

/**
* Clase Viper (naves)
* @author Juan Belón Pérez
*/
public class Viper extends Elemento {
/**
* Nombre del Viper
*/
private String nombre;
/**
* Cantidad de armamento (nºde proyectiles)
*/
private int armamento;

/**
* Constructor de Vipers
* @param nombre String
*/
public Viper(String nombre) {
this.nombre = nombre;
this.armamento = 0;
}
/**
* Devuelve la cantidad de munición del Viper
* @return int
*/
public int getArmamento() {
return armamento;
}
/**
* Devuelve el nombre del Viper
* @return String
*/
public String getNombre() {
return nombre;
}
/**
* Pone munición al Viper en la cantidad dada
* @param armamento
*/
public void setArmamento(int armamento) {
this.armamento = Math.abs(armamento);
}
/**
* Dispara con la munición disponible, decrementa el armamento
* @throws NoHayArmamentoException
*/
public void disparar() throws NoHayArmamentoException{
--this.armamento; // = (this.armamento==0)?0:(--this.armamento);
if (this.armamento&lt;0){
this.armamento = 0;
throw new NoHayArmamentoException(&quot;No queda munición en este viper (&quot;+
this.getId()+&quot;)&quot;);
}
}
}
</pre>
<p>Ahora repasaremos lo que es una interfaz o clase abstracta (no se puede instanciar sino que sirve como modelo para tener varias implementaciones distintas, por ejemplo, una clase base de datos con distintas tecnologías: mysql, oracle,etc). Construimos la clase Computador para realizar una implementación más tarde llamada Nexus</p>
<pre class="brush: java">
/*
* Web 2.0: Arquitectura Orientada a Servicios en Java.
* Introducción a JAVA
* CLASE DEL MODELO Computador para el
*  computador de la estrella de combate
*/

package es.ugr.battlegalactica.modelo;

import es.ugr.battlegalactica.modelo.excepciones.PilotoNoEncontradoException;
import es.ugr.battlegalactica.modelo.excepciones.ViperNoEncontradoException;
import java.util.Iterator;

/**
* Clase Computador
* @author Juan Belón Pérez
*/
public interface Computador {
/**
* Registra un Viper en el Computador
* @param v Viper
*/
void guardarViper(Viper v);
/**
* Registra un Piloto en el Computador
* @param p
*/
void guardarPiloto(Piloto p);
/**
* Devuelve el Viper asociado al id especificado
* @param id
* @return Viper
*/
Viper obtenerViper(long id) throws ViperNoEncontradoException;
/**
* Devuelve el Piloto asociado al id especificado
* @param id
* @return Piloto
*/
Piloto obtenerPiloto(long id) throws PilotoNoEncontradoException;
/**
* Devuelve un iterador de los Vipers registrados en el Computador
* @return Iterator
*/
Iterator listarVipers();
/**
* Devuelve un iterador de los Pilotos registrados en el Computador
* @return Iterator
*/
Iterator
listarPilotos();
}
</pre>
<p>Recordar también lo que son los iteradores&#8230;ahora vamos a dar el código para implementar la interfaz Computador con la clase Nexus:</p>
<pre class="brush: java">
/*
* Web 2.0: Arquitectura Orientada a Servicios en Java.
* Introducción a JAVA
* CLASE DEL MODELO Nexus que implementa el Computador para el
*  computador de la estrella de combate
*/

package es.ugr.battlegalactica.modelo;

import es.ugr.battlegalactica.modelo.excepciones.PilotoNoEncontradoException;
import es.ugr.battlegalactica.modelo.excepciones.ViperNoEncontradoException;
import java.util.ArrayList;
import java.util.Iterator;

/**
* Clase Nexus - un Computador de la estrella de combate
* @author Juan Belón Pérez
*/
public class Nexus implements Computador {
/**
* Pilotos registrados en el Computador Nexus
*/
private static ArrayList
pilotos_nexus;
/**
* Vipers registrados en el Computador Nexus
*/
private static ArrayList vipers_nexus;
/**
* Constructor del Computador Nexus
*/
public Nexus() {
init_Nexus();
}
/**
* Inicializador del Computador Nexus
*/
private void init_Nexus(){
pilotos_nexus = new ArrayList
();
vipers_nexus = new ArrayList();
}
public void guardarViper(Viper v) {
vipers_nexus.add(v);
}

public void guardarPiloto(Piloto p) {
pilotos_nexus.add(p);
}

public Viper obtenerViper(long id) throws ViperNoEncontradoException {
for (Viper v: vipers_nexus)
if (v.getId()==id) return v;
throw new ViperNoEncontradoException(&quot;Viper no encontrado: &quot;+id);
//    return null;
}

public Piloto obtenerPiloto(long id) throws PilotoNoEncontradoException {
for (Piloto p: pilotos_nexus)
if (p.getId()==id) return p;
throw new PilotoNoEncontradoException(&quot;No se ha encontrado el piloto:&quot;
+ id);
//   return null;
}

public Iterator listarVipers() {
return Nexus.vipers_nexus.iterator();
}

public Iterator
listarPilotos() {
return Nexus.pilotos_nexus.iterator();
}

}
</pre>
<p>Para probar las excepciones haremos que cuando se dispare una viper ,si la cantidad de armamento es 0 lance una excepción de tipo &#8220;NoHayArmamentoException&#8221;:</p>
<pre class="brush: java">
/*
* Web 2.0: Arquitectura Orientada a Servicios en Java.
* Introducción a JAVA
* CLASE PARA EXCEPCIONES DEL MODELO VIPER -&gt; Disparo
*/
package es.ugr.battlegalactica.modelo.excepciones;

/**
* Clase para lanzar excepciones cuando se intenta disparar sin munición
* desde un Viper
* @author Juan Belón Pérez
*/
public class NoHayArmamentoException extends Exception {
/**
* Constructor de Excepción con mensaje
* @param message
*/
public NoHayArmamentoException(String message) {
super(message);
}
/**
* Constructor
*/
public NoHayArmamentoException() {
}

}

[/source]

Creamos una clase de excepciones para la clase Piloto, en este caso para cuando se intenta encontrar un Piloto que no existe:
[sourcecode lang=&quot;java&quot;]
/*
* Web 2.0: Arquitectura Orientada a Servicios en Java.
* Introducción a JAVA
* CLASE PARA EXCEPCIONES DEL MODELO Piloto -&gt; busquedas
*/

package es.ugr.battlegalactica.modelo.excepciones;

/**
*
* @author Juan Belón Pérez
*/
public class PilotoNoEncontradoException extends Exception {

/**
* Constructor con mensaje
* @param message
*/
public PilotoNoEncontradoException(String message) {
super(message);
}
/**
* Constructor
*/
public PilotoNoEncontradoException() {
}

}
</pre>
<p>Lo mismo que antes, para Vipers:</p>
<pre class="brush: java">
/*
* Web 2.0: Arquitectura Orientada a Servicios en Java.
* Introducción a JAVA
* CLASE PARA EXCEPCIONES DEL MODELO Viper -&gt; busquedas
*/

package es.ugr.battlegalactica.modelo.excepciones;

/**
*
* @author Juan Belón Pérez
*/
public class ViperNoEncontradoException extends Exception {
/**
* Constructor con mensaje
* @param message
*/
public ViperNoEncontradoException(String message) {
super(message);
}

public ViperNoEncontradoException() {
}

}
</pre>
<p>Por último la clase Prueba para probar todo lo que hemos construido:</p>
<pre class="brush: java">
/*
* Web 2.0: Arquitectura Orientada a Servicios en Java
* Primer Modelo: BSGModelo con la clase Prueba
* @author Juan Belón Pérez
*/

package es.ugr.battlegalactica;

import es.ugr.battlegalactica.modelo.Elemento;
import es.ugr.battlegalactica.modelo.Nexus;
import es.ugr.battlegalactica.modelo.Piloto;
import es.ugr.battlegalactica.modelo.Viper;
import es.ugr.battlegalactica.modelo.excepciones.NoHayArmamentoException;
import es.ugr.battlegalactica.modelo.excepciones.PilotoNoEncontradoException;
import es.ugr.battlegalactica.modelo.excepciones.ViperNoEncontradoException;
import java.util.ArrayList;
import java.util.Iterator;

/**
* Clase con los 3 primeros ejercicios propuestos
* @author Juan Belón Pérez
*/
public class Prueba {
private static ArrayList elementos;
private static ArrayList
pilotos;
private static ArrayList vipers;
private static Nexus nexus;
/**
* Función principal.
* Imprime por pantalla un mensaje fijo.
*
* @param args la linea de argumentos del programa
*/
public static void main(String[] args) throws NoHayArmamentoException, PilotoNoEncontradoException, ViperNoEncontradoException {
System.out.println(&quot;Prueba del modelo de datos BattleStarGallactica&quot;);
/*crear dos elementos e imprimir sus identificadores en la consola.
Si todo ha ido bien se deberían escribir los identificadores 1 y 2*/
init();
System.out.println(&quot;Prueba de creación de elementos:&quot;);
for (Elemento e: elementos){
System.out.printf(&quot;%d,&quot;,e.getId());
}
System.out.println(&quot;\nPrueba de creación de pilotos:\n&quot;);
for (Piloto p: pilotos){
System.out.printf(&quot;ID:%d,Nombre:%s,Destreza:%d\n&quot;,p.getId(),p.getNombre(),
p.getDestreza());
}
System.out.println(&quot;\nPrueba de creación de vipers:\n&quot;);
for (int i=0; i&lt;4; i++){ //Disparar 4 veces con todos los vipers:
for (Viper v: vipers){
System.out.printf(&quot;#%d# Disparando con el viper ID:%d,Nombre:%s,&quot; +
&quot;Armamento:%d\n&quot;,(i+1),v.getId(),v.getNombre(),v.getArmamento());
try {
v.disparar();
} catch (NoHayArmamentoException e){
System.err.println(&quot;\n\tError al disparar:&quot;+e.getMessage()+&quot;\n&quot;);
}
System.out.printf(&quot;\tEl nuevo armamento del viper con ID:%d y Nombre: %s&quot;+
&quot; ahora tiene %d unidad/es\n&quot;,
v.getId(),v.getNombre(),v.getArmamento());
}
}
System.out.println(&quot;\nPrueba de creación de Nexus con Pilotos:\n&quot;);
Iterator
iter_piloto = nexus.listarPilotos();
Piloto aux_piloto = null;
while (iter_piloto.hasNext()){
aux_piloto = iter_piloto.next();
System.out.printf(&quot;Piloto %s, ID:%d\n&quot;, aux_piloto.getNombre(),
aux_piloto.getId());
}
System.out.println(&quot;\nPrueba de creación de Nexus con Vipers:\n&quot;);
Iterator iter_viper = nexus.listarVipers();
Viper aux_viper = null;
while (iter_viper.hasNext()){
aux_viper = iter_viper.next();
System.out.printf(&quot;Viper %s, ID:%d\n&quot;, aux_viper.getNombre(),
aux_viper.getId());
}
if (aux_piloto!=null)
System.out.println(&quot;\nPrueba de búsqueda (el último:&quot; +
aux_piloto.getId()+&quot;) de Pilotos en Nexus:\n&quot; +
nexus.obtenerPiloto(aux_piloto.getId()).getNombre());
if (aux_viper!=null)
System.out.println(&quot;\nPrueba de búsqueda de Vipers (el último:&quot;+
aux_viper.getId()+&quot;) en Nexus:\n&quot; +
nexus.obtenerViper(aux_viper.getId()).getNombre()
);
System.out.println(&quot;\nComprobar que se generan las excepciones &quot;+
&quot;buscando un Piloto falso:23\n&quot;);
try {
aux_piloto = nexus.obtenerPiloto(23);
} catch (PilotoNoEncontradoException ex){
System.err.println(&quot;\n\t&quot;+ex.getMessage());
}
System.out.println(&quot;\nComprobar que se generan las excepciones &quot;+
&quot;buscando un Viper falso:23&quot;);
try {
aux_viper = nexus.obtenerViper(23);
} catch (ViperNoEncontradoException ex){
System.err.println(&quot;\n\t&quot;+ex.getMessage());
}
}
/**
* Inicializador de elementos, pilotos, vipers y Nexus (vipers y pilotos)
*/
private static void init(){
Viper v_aux;
elementos = new ArrayList();
elementos.add(new Elemento());
elementos.add(new Elemento());

pilotos = new ArrayList
();
pilotos.add(new Piloto(&quot;Juax&quot;,120));
pilotos.add(new Piloto(&quot;Sara&quot;,110));

vipers = new ArrayList();
v_aux = new Viper(&quot;Trueno&quot;);
v_aux.setArmamento(3);
vipers.add(v_aux);
v_aux = new Viper(&quot;Rayo&quot;);
v_aux.setArmamento(4);
vipers.add(v_aux);

nexus = new Nexus();
nexus.guardarPiloto(new Piloto(&quot;Migue&quot;,130));
nexus.guardarPiloto(new Piloto(&quot;Jesús&quot;,130));
v_aux = new Viper(&quot;Trueno&quot;);
v_aux.setArmamento(4);
nexus.guardarViper(v_aux);
v_aux = new Viper(&quot;Fuego&quot;);
v_aux.setArmamento(5);
nexus.guardarViper(v_aux);
}

}
</pre>
<p>La salida que debe mostrar es la siguiente:</p>
<blockquote><p>Prueba del modelo de datos BattleStarGallactica<br />
Prueba de creación de elementos:<br />
1,2,<br />
Prueba de creación de pilotos:</p>
<p>ID:3,Nombre:Juax,Destreza:120<br />
ID:4,Nombre:Sara,Destreza:110</p>
<p>Prueba de creación de vipers:</p>
<p>#1# Disparando con el viper ID:5,Nombre:Trueno,Armamento:3<br />
El nuevo armamento del viper con ID:5 y Nombre: Trueno ahora tiene 2 unidad/es<br />
#1# Disparando con el viper ID:6,Nombre:Rayo,Armamento:4<br />
El nuevo armamento del viper con ID:6 y Nombre: Rayo ahora tiene 3 unidad/es<br />
#2# Disparando con el viper ID:5,Nombre:Trueno,Armamento:2<br />
El nuevo armamento del viper con ID:5 y Nombre: Trueno ahora tiene 1 unidad/es<br />
#2# Disparando con el viper ID:6,Nombre:Rayo,Armamento:3<br />
El nuevo armamento del viper con ID:6 y Nombre: Rayo ahora tiene 2 unidad/es<br />
#3# Disparando con el viper ID:5,Nombre:Trueno,Armamento:1<br />
El nuevo armamento del viper con ID:5 y Nombre: Trueno ahora tiene 0 unidad/es<br />
#3# Disparando con el viper ID:6,Nombre:Rayo,Armamento:2<br />
El nuevo armamento del viper con ID:6 y Nombre: Rayo ahora tiene 1 unidad/es<br />
#4# Disparando con el viper ID:5,Nombre:Trueno,Armamento:0</p>
<p><span style="color: #ff0000;">Error al disparar:No queda munición en este viper (5)</span></p>
<p>El nuevo armamento del viper con ID:5 y Nombre: Trueno ahora tiene 0 unidad/es<br />
#4# Disparando con el viper ID:6,Nombre:Rayo,Armamento:1<br />
El nuevo armamento del viper con ID:6 y Nombre: Rayo ahora tiene 0 unidad/es</p>
<p>Prueba de creación de Nexus con Pilotos:</p>
<p>Piloto Migue, ID:7<br />
Piloto Jesús, ID:8</p>
<p>Prueba de creación de Nexus con Vipers:</p>
<p>Viper Trueno, ID:9<br />
Viper Fuego, ID:10</p>
<p>Prueba de búsqueda (el último:8) de Pilotos en Nexus:<br />
Jesús</p>
<p>Prueba de búsqueda de Vipers (el último:10) en Nexus:<br />
Fuego</p>
<p>Comprobar que se generan las excepciones buscando un Piloto falso:23</p>
<p>Comprobar que se generan las excepciones buscando un Viper falso:23</p>
<p><span style="color: #ff0000;">No se ha encontrado el piloto:23</span></p>
<p><span style="color: #ff0000;">Viper no encontrado: 23</span><br />
<span style="color: #339966;">BUILD SUCCESSFUL (total time: 0 seconds)</span></p></blockquote>
<p>Para descargar el código y probar, hay un comprimido <a href="http://www.programadorphp.org/wp-content/uploads/Cursos_Talleres/JavaWS/BSGModeloAdvEx.rar" target="_blank"><strong>aquí</strong></a>.</p>
<p><strong><a href="http://www.programadorphp.org/blog/curso-de-arquitectura-de-servicios-en-java-en-comunicacion-con-php/">« Volver al Curso de Arquitectura de Servicios Java para PHP</a></strong> ó <strong><a href="http://www.programadorphp.org/cursos-y-talleres/">ver más cursos »</a></strong></p>
]]></content:encoded>
			<wfw:commentRss>http://www.programadorphp.org/blog/cursos/breve-repaso-a-java-para-crear-servicios-web-conectables-con-php/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Instalación y configuración de NetBeans para creación de servicios Java</title>
		<link>http://www.programadorphp.org/blog/cursos/instalacion-y-configuracion-de-netbeans-para-creacion-de-servicios-java/</link>
		<comments>http://www.programadorphp.org/blog/cursos/instalacion-y-configuracion-de-netbeans-para-creacion-de-servicios-java/#comments</comments>
		<pubDate>Mon, 22 Feb 2010 23:25:04 +0000</pubDate>
		<dc:creator>Juan Belón Pérez</dc:creator>
				<category><![CDATA[Cursos y talleres]]></category>
		<category><![CDATA[BattleStar Gallactica]]></category>
		<category><![CDATA[comunicación]]></category>
		<category><![CDATA[curso]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[java + php]]></category>
		<category><![CDATA[javadoc]]></category>
		<category><![CDATA[NetBeans]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[servicios]]></category>
		<category><![CDATA[taller]]></category>
		<category><![CDATA[Web Services]]></category>

		<guid isPermaLink="false">http://www.programadorphp.org/?p=445</guid>
		<description><![CDATA[En este tutorial, vamos a ver cómo instalar y configurar NetBeans para trabajar tanto con Java como con PHP y crear nuestros primeros servicios, Pruebas de Unidad de las funciones de las clases,etc.
INSTALACIÓN de NetBeans

Descargar e instalar Java SE JDK 6 de Sun y su Documentación (ZIP): aquí
Descargar e instalar NetBeans: aquí (recomendado instalarlo en [...]]]></description>
			<content:encoded><![CDATA[<p>En este tutorial, vamos a ver cómo instalar y configurar NetBeans para trabajar tanto con Java como con PHP y crear nuestros primeros servicios, Pruebas de Unidad de las funciones de las clases,etc.</p>
<p><strong><em>INSTALACIÓN de NetBeans</em></strong></p>
<ol>
<li>Descargar e instalar Java SE JDK 6 de Sun y su Documentación (ZIP): <strong><a href="http://java.sun.com/javase/downloads/index.jsp" target="_blank">aquí</a></strong></li>
<li>Descargar e instalar NetBeans: <strong><a href="http://netbeans.org/downloads/" target="_blank">aquí</a> (recomendado instalarlo en una ruta sin espacios)</strong></li>
<li>Arrancar NetBeans, actualizar, y después ir a &#8220;Tools -&gt; Java Platforms -&gt; J2SE -&gt; JDK 1.6&#8243; (o vuestra versión) y pinchar en la pestaña JavaDoc -&gt; Add Zip/Folder -&gt; y elegís el fichero ZIP de la documentación del paso uno, ahora podemos consultar la documentación al estar en cualquier miembro de la SE JDK mediante el segundo botón del ratón -&gt; &#8220;Show JavaDoc&#8221;</li>
</ol>
<p><strong>CREACIÓN del PRIMER PROYECTO CON NetBeans:</strong></p>
<ol>
<li>Vamos al menú: File -&gt; New Project -&gt; Elejimos el tipo Java -&gt; Java Application</li>
<li>En el nombre ponemos &#8220;BSGModelo&#8221;  y en &#8220;Create Main Class&#8221; ponemos: es.ugr.battlegalactica.Prueba<br />
este nombre indica que la clase se llama Prueba e irá dentro de un paquete cuya jerarquía empieza por battlegalactica como contenedor dentro de UGR dentro de España&#8230;</li>
<li>Se debe de haber creado la estructura de directorios y los ficheros necesarios</li>
<li>Ahora dejaremos el código fuente de <em>Prueba.java</em> como sigue:
<pre class="brush: java">
/*
* Web 2.0: Arquitectura Orientada a Servicios en Java
* Primer Modelo: BSGModelo con la clase Prueba
* @author Juan Belón Pérez
*/package es.ugr.battlegalactica;

/**
* Clase con los 3 primeros ejercicios propuestos
* @author Juan Belón Pérez
*/
public class Prueba {

/**
* Función principal.
* Imprime por pantalla un mensaje fijo.
* Dependiendo de si en los argumentos, separados por comas,
* se usa el título Adama, se saluda a la persona de distinta forma
* que si no se usa o se usa Piloto.
* @param args la linea de argumentos del programa
*/
public static void main(String[] args) {
System.out.println(&quot;Prueba del modelo de datos BattleStarGallactica&quot;);
String todo =&quot;&quot;;
String[] nombres ;
for (int i=0; i&lt;args.length; i++){
todo += args[i]+&quot; &quot;;
}
System.out.println(&quot;Cadena de entrada: \n- -\n&quot; + todo + &quot;\n- -\n&quot;);
nombres = todo.split(&quot;,&quot;);
for (int i=0; i&lt;nombres.length; i++){
System.out.println(crearSaludoRespeto(nombres[i]));
}
}
/**
* Utiliza los espacios para separar los títulos y las comas para separar
* las personas. Devuelve un saludo con el respeto adecuado al rango.
* @param String nombre
* @return String
*/
public static String crearSaludoRespeto(String nombre){
String saludo = &quot;&quot;;
if (nombre==null) return &quot;Hay alguien ahi?&quot;;
String[] partes = nombre.split(&quot; &quot;);

if (partes.length&gt;1){
if (partes[0].equalsIgnoreCase(&quot;adama&quot;)){
saludo = &quot;Bienvenido, comandante &quot; + partes[1];
} else if (partes[0].equalsIgnoreCase(&quot;piloto&quot;)) {
saludo = &quot;Bienvenido, piloto &quot; + partes[1];
} else { //nombre compuesto
saludo = &quot;Bienvenido, civil &quot; + nombre;
}
} else { //solo nombre, es un civil
if (partes.length&gt;0)
saludo = &quot;Bienvenido, civil &quot; + nombre;
else
saludo = &quot;Hay alguien ahi?&quot;;
}
return saludo;
}
}
</pre>
</li>
<li>Ahora compilamos, y para probar que funciona en todos los casos le metemos las siguientes entradas a mediante el menú : Pestaña &#8220;Projects -&gt; BSGModelo&#8221; -&gt; Segundo botón del ratón-&gt; &#8220;Set configuration -&gt; Customize&#8230;&#8221; y en argumentos colocamos la cadena: Adama Juax,Piloto Migue,Sara,Jesús González, la salida debe ser como esta:<br />
<blockquote>
<div id="_mcePaste">Prueba del modelo de datos BattleStarGallactica</div>
<div id="_mcePaste">Cadena de entrada:</div>
<div id="_mcePaste">- -</div>
<div id="_mcePaste">Adama Juax,Piloto Migue,Sara,Jesús González</div>
<div id="_mcePaste">- -</div>
<div id="_mcePaste">Bienvenido, comandante Juax</div>
<div id="_mcePaste">Bienvenido, piloto Migue</div>
<div id="_mcePaste">Bienvenido, civil Sara</div>
<div id="_mcePaste">Bienvenido, civil Jesús González</div>
<div id="_mcePaste">BUILD SUCCESSFUL (total time: 0 seconds)<br />
<a rel="lightbox" href="http://www.programadorphp.org/wp-content/uploads/2010/02/java_netbeans_debug.gif" title="Depuración de Java con NetBeans" rel="lightbox[445]"><img class="aligncenter size-medium wp-image-454" title="Depuración de Java con NetBeans" src="http://www.programadorphp.org/wp-content/uploads/2010/02/java_netbeans_debug-300x289.gif" alt="" width="300" height="289" /></a></div>
</blockquote>
</li>
<li>Sólo resta, crear una prueba para esta clase mediante el menú del segundo botón sobre es.ugr.battlegalactica: &#8220;Tools -&gt; Create JUnit Tests&#8221; -&gt; desmarcamos &#8220;Test Finalizer&#8221; por ahora, ya os explicaré por qué&#8230;-&gt; OK</li>
<li>Para probar todos los casos de la función crearSaludoRespeto primero quitamos todo de testMain para que no falle ya que no hace nada y luego añadimos las pruebas a la función testCrearSaludoRespeto y dejamos el fichero tal que así:
<pre class="brush: java">
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/

package es.ugr.battlegalactica;

import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import static org.junit.Assert.*;

/**
*
* @author webser22
*/
public class PruebaTest {

public PruebaTest() {
}

@BeforeClass
public static void setUpClass() throws Exception {
}

@AfterClass
public static void tearDownClass() throws Exception {
}

@Before
public void setUp() {
}

/**
* Test of main method, of class Prueba.
*/
@Test
public void testMain() {
/*  System.out.println(&quot;main&quot;);
String[] args = null;
Prueba.main(args);
// TODO review the generated test code and remove the default call to fail.
fail(&quot;The test case is a prototype.&quot;);*/
}

/**
* Test of crearSaludoRespeto method, of class Prueba.
*/
@Test
public void testCrearSaludoRespeto() {
System.out.println(
&quot;Probando la función crearSaludoRespeto de la clase Prueba&quot;);
assertEquals(&quot;Correcto&quot;, Prueba.crearSaludoRespeto(null),
&quot;Hay alguien ahi?&quot;);
assertEquals(&quot;Correcto&quot;, Prueba.crearSaludoRespeto(&quot;Adama Juax&quot;),
&quot;Bienvenido, comandante Juax&quot;);
assertEquals(&quot;Correcto&quot;, Prueba.crearSaludoRespeto(&quot;Piloto Migue&quot;),
&quot;Bienvenido, piloto Migue&quot;);
assertEquals(&quot;Correcto&quot;, Prueba.crearSaludoRespeto(&quot;Sara&quot;),
&quot;Bienvenido, civil Sara&quot;);
assertEquals(&quot;Correcto&quot;, Prueba.crearSaludoRespeto(&quot;Jesús González&quot;),
&quot;Bienvenido, civil Jesús González&quot;);
}

}
</pre>
<p>Entonces probamos mediante el menú &#8220;Run -&gt; Test &#8216;BSGModelo&#8217; &#8221; y ha de aparecer &#8220;passed&#8221; en el output y el mensaje &#8220;Probando la función crearSaludoRespeto de la clase Prueba&#8221; en la salida de los resultados de JUnit Results. <a href="http://www.programadorphp.org/blog/por-que-usar-unit-tests/">¿Para qué sirven las Pruebas de Unidad?</a></li>
</ol>
<p>Y esto es todo, el fichero con el proyecto se puede descargar <strong><a href="http://img.programadorphp.org/uploads/Cursos_Talleres/JavaWS/BSGModelo.rar" target="_blank">aquí</a>, </strong>tiene la documentación generada (hay que actualizarla).</p>
<p>Para el que esté impaciente ,puede continuar por aprender <strong><a href="http://www.amberweinberg.com/php-programming-with-netbeans/" target="_blank">cómo utilizar el editor NetBeans para PHP</a></strong> o bien volver al índice de este <strong><a href="http://www.programadorphp.org/blog/curso-de-arquitectura-de-servicios-en-java-en-comunicacion-con-php/">Curso de Arquitectura de Servicios en Java en comunicación con PHP</a></strong>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.programadorphp.org/blog/cursos/instalacion-y-configuracion-de-netbeans-para-creacion-de-servicios-java/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Curso de Arquitectura de Servicios en Java en comunicación con PHP</title>
		<link>http://www.programadorphp.org/blog/curso-de-arquitectura-de-servicios-en-java-en-comunicacion-con-php/</link>
		<comments>http://www.programadorphp.org/blog/curso-de-arquitectura-de-servicios-en-java-en-comunicacion-con-php/#comments</comments>
		<pubDate>Mon, 22 Feb 2010 23:24:05 +0000</pubDate>
		<dc:creator>Juan Belón Pérez</dc:creator>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[Cursos y talleres]]></category>
		<category><![CDATA[arquitectura]]></category>
		<category><![CDATA[comunicación]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[java + php]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[servicios]]></category>
		<category><![CDATA[talleres]]></category>

		<guid isPermaLink="false">http://www.programadorphp.org/?p=443</guid>
		<description><![CDATA[Este curso consta de diferentes partes

Instalación y configuración de NetBeans para creación de servicios Java
Breve repaso a Java y la Programación Orientada a Objetos: herencia, polimorfismo, Tipos como en C++ mediante especificaciones Clase&#60;tipo_dato&#62;, uso de netbeans, excepciones, etc.
Conceptos básicos de la comunicación entre aplicaciones mediante servicios: XML, XML-RPC, SOA, RSS, SAX, DOM, JDOM y WSDL
Creación [...]]]></description>
			<content:encoded><![CDATA[<p>Este curso consta de diferentes partes</p>
<ol>
<li><strong><a href="http://www.programadorphp.org/blog/cursos/instalacion-y-configuracion-de-netbeans-para-creacion-de-servicios-java/">Instalación y configuración de NetBeans para creación de servicios Java</a></strong></li>
<li><strong><a href="http://www.programadorphp.org/blog/cursos/breve-repaso-a-java-para-crear-servicios-web-conectables-con-php/">Breve repaso a Java y la Programación Orientada a Objetos</a></strong>: herencia, polimorfismo, Tipos como en C++ mediante especificaciones Clase&lt;tipo_dato&gt;, uso de netbeans, excepciones, etc.</li>
<li><strong><a href="http://www.programadorphp.org/blog/cursos/conceptos-basicos-xml-java-jdom-soap-php/">Conceptos básicos de la comunicación entre aplicaciones mediante servicios: XML, XML-RPC, SOA, RSS, SAX, DOM, JDOM y WSDL</a></strong></li>
<li><strong><a href="http://www.programadorphp.org/blog/cursos/creacion-de-servicios-web-con-netbeans-y-glassfish-java-y-php/">Creación del modelo de datos para los servicios web con JAVA</a>, <a href="http://www.programadorphp.org/blog/cursos/creacion-de-un-paquete-de-servicios-web-para-un-modelo-de-datos-java/">las operaciones de dichos servicios</a></strong> y <strong><a href="http://www.programadorphp.org/blog/cursos/creacion-de-un-paquete-de-servicios-web-para-un-modelo-de-datos-java/">los clientes que los utilizan también en JAVA</a><br />
</strong></li>
<li><a href="http://www.programadorphp.org/blog/cursos/servicios-web-y-cloud-computing-con-java-soap-y-php/"><strong>Creación del conjunto de servicios web (cloud computing) que utiliza el modelo de datos del punto 4</strong></a></li>
<li><a href="http://www.programadorphp.org/blog/cursos/curso-de-php-y-servicios-web/"><strong>Tutorial de PHP e iniciación a la creación y comunicación con servicios web usando WSDL</strong></a></li>
<li><a href="http://www.programadorphp.org/blog/cursos/bpel-y-openesb-orquestacion-de-servicios-web/"><strong>BPEL y OpenESB: Orquestación de Servicios Web</strong></a></li>
</ol>
<p>Resumen: <a href="http://www.programadorphp.org/blog/cursos/otras-arquitecturas-y-metodologias-soa-ejercicios/"><strong>Otras Arquitecturas y metodologías SOA, ejercicios a realizar</strong></a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.programadorphp.org/blog/curso-de-arquitectura-de-servicios-en-java-en-comunicacion-con-php/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Aplicación web para inmobiliarias &#8211; proyectos y multimedia</title>
		<link>http://www.programadorphp.org/portfolio/aplicacion-web-para-inmobiliarias-proyectos-y-multimedia/</link>
		<comments>http://www.programadorphp.org/portfolio/aplicacion-web-para-inmobiliarias-proyectos-y-multimedia/#comments</comments>
		<pubDate>Sat, 20 Feb 2010 03:07:19 +0000</pubDate>
		<dc:creator>Juan Belón Pérez</dc:creator>
				<category><![CDATA[Portfolio]]></category>
		<category><![CDATA[2007]]></category>
		<category><![CDATA[aplicacion web]]></category>
		<category><![CDATA[cms]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[galería]]></category>
		<category><![CDATA[imágenes]]></category>
		<category><![CDATA[inmobiliaria]]></category>
		<category><![CDATA[inmuebles]]></category>
		<category><![CDATA[multicapa]]></category>
		<category><![CDATA[multilenguaje]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[xhtml]]></category>
		<category><![CDATA[zenphp]]></category>

		<guid isPermaLink="false">http://www.programadorphp.org/?p=436</guid>
		<description><![CDATA[Esta es una aplicación multilenguaje del año 2007 con zenphp. Se incluye un administrador interno con capacidad para subir ficheros e imágenes asociados a los inmuebles así como enviar direcciones de youtube para insertar conjuntamente con la descripción de aquellos.
Las cabeceras se pueden cambiar por cada entrada de inmueble de cada categoría, además ,las plantillas [...]]]></description>
			<content:encoded><![CDATA[<p>Esta es una aplicación multilenguaje del año 2007 con zenphp. Se incluye un administrador interno con capacidad para subir ficheros e imágenes asociados a los inmuebles así como enviar direcciones de youtube para insertar conjuntamente con la descripción de aquellos.<br />
Las cabeceras se pueden cambiar por cada entrada de inmueble de cada categoría, además ,las plantillas contienen un gestor de imágenes con las que se construye una galería con fotografías dentro de la página de cada inmueble&#8230;</p>
<p>Las plantillas XHTML + CSS se crearon por <a href="http://www.agenciaq4.es" target="_blank">Agencia Q4</a> en el 2007.</p>
<p><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="500" height="405" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowFullScreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="src" value="http://www.youtube-nocookie.com/v/uwHLbKP7RNA&amp;hl=es_ES&amp;fs=1&amp;color1=0x234900&amp;color2=0x4e9e00&amp;border=1" /><param name="allowfullscreen" value="true" /><embed type="application/x-shockwave-flash" width="500" height="405" src="http://www.youtube-nocookie.com/v/uwHLbKP7RNA&amp;hl=es_ES&amp;fs=1&amp;color1=0x234900&amp;color2=0x4e9e00&amp;border=1" allowscriptaccess="always" allowfullscreen="true"></embed></object></p>
]]></content:encoded>
			<wfw:commentRss>http://www.programadorphp.org/portfolio/aplicacion-web-para-inmobiliarias-proyectos-y-multimedia/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Embeber clases de C++ como una extensión de PHP usando Zend</title>
		<link>http://www.programadorphp.org/blog/embeber-clases-de-c-como-una-extension-de-php-usando-zend/</link>
		<comments>http://www.programadorphp.org/blog/embeber-clases-de-c-como-una-extension-de-php-usando-zend/#comments</comments>
		<pubDate>Sat, 20 Feb 2010 03:01:24 +0000</pubDate>
		<dc:creator>Juan Belón Pérez</dc:creator>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[c++]]></category>
		<category><![CDATA[facebook]]></category>
		<category><![CDATA[framework]]></category>
		<category><![CDATA[freelance]]></category>
		<category><![CDATA[hiphop]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[programador]]></category>
		<category><![CDATA[Pruebas de Unidad]]></category>
		<category><![CDATA[zend]]></category>

		<guid isPermaLink="false">http://www.programadorphp.org/?p=426</guid>
		<description><![CDATA[Vamos a ir un poco más lejos que la última vez cuando analizábamos la gran ventaja de usar el lenguaje C++ frente a PHP, por su potencia al estar compilado para la máquina, en lugar de interpretado como PHP, sobre todo a la hora de usar algoritmos que requieren de un tiempo de ejecución mayor, a [...]]]></description>
			<content:encoded><![CDATA[<p>Vamos a ir un poco más lejos que la última vez cuando analizábamos la <strong><a href="http://www.programadorphp.org/blog/optimizar-php-con-c-y-cpp/comment-page-1/#comment-65">gran ventaja de usar el lenguaje C++ frente a PHP</a></strong>, por su potencia al estar compilado para la máquina, en lugar de interpretado como PHP, sobre todo a la hora de usar algoritmos que requieren de un tiempo de ejecución mayor, a pesar de que, su orden de ejecución no es muy elevado; al cambiar de tecnología se nota demasiado.</p>
<p>En este caso vamos a echar mano del framework de la empresa <em>Zend </em>que casualmente se utiliza en <strong><a href="http://www.programadorphp.org/portfolio/programacion-basica-del-cms-magento-productos-de-un-taller/">Magento</a></strong> como base y alguna otra tienda ( soloprecios.es ) también,&#8230; <a href="http://devzone.zend.com/article/4486">este artículo de la <strong>zona de programadores de Zend Framework</strong></a>, nos recomienda primero echar un vistazo al <a href="http://devzone.zend.com/article/1021-Extension-Writing-Part-I-Introduction-to-PHP-and-Zend"><strong>manual para escribir una extensión</strong></a>&#8230;, en este punto, quizás , os decantéis por olvidaros de Zend y queráis echar un vistazo a la herramienta que usan en <a href="http://www.facebook.com/pages/Programador-PHP-Freelance-Web-Programacion-C-freelancer-Juan-Belon/303337449540?v=app_4949752878">Facebook</a>: <a href="http://sebastian-bergmann.de/archives/885-Stubbing-Hard-Coded-Dependencies.html#content"><strong>HiHop</strong></a>, sinceramente os recomiendo leer  los informes de las <a href="http://www.programadorphp.org/blog/presentacion-xunit-y-junit-diseno-de-software-orientado-a-objetos/" target="_blank"><strong>unidades de prueba</strong></a> <a href="http://sebastian-bergmann.de/plugin/tag/phpunit">realizadas por <strong>Sebastian Bergmann</strong></a> primero.</p>
<p>En el artículo de <a href="http://devzone.zend.com/member/7261-paulosman" target="_blank"><strong>paulosman</strong></a>, se explica cómo configurar el makefile (para <a href="http://www.gnu.org/software/hello/manual/autoconf/C_002b_002b-Compiler.html" target="_blank"><strong>compilar C++</strong></a>) para que se incluya la <a href="http://php.net/manual/en/install.pecl.phpize.php" target="_blank"><strong>extensión de PECL con phpize</strong></a> , además es tan <em>apañao </em>que incluye incluso una macro para hacer la llamada a la función ZEND_GET_MODULE() que necesita el framework para asociar la clase con PHP, tras realizar estos pasos podemos usar :</p>
<pre> php -d"extension=nombre_de_mi_extension.so" -m</pre>
<p>para añadir la extensión recién compilada (tras usar phpize y make) a Apache u otro servidor (con Zend) ,ahora que tenemos el esqueleto básico de dicha extensión cargada en el servidor, el sistema de construcción de PHP sabe que tiene que compilar las clases C++ (definidas e implementadas fuera de la extensión) que se sincronizarán por medio de los objetos en C++ de Zend y la función externa ZEND_GET_MODULE(nombre_de_mi_extension)</p>
<p>¿Alguna duda?, aquí estamos&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.programadorphp.org/blog/embeber-clases-de-c-como-una-extension-de-php-usando-zend/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Aplicación Web para restaurante con guarderia &#8211; Platos y Noticias</title>
		<link>http://www.programadorphp.org/portfolio/aplicacion-web-para-restaurante-con-guarderia-platos-y-noticias/</link>
		<comments>http://www.programadorphp.org/portfolio/aplicacion-web-para-restaurante-con-guarderia-platos-y-noticias/#comments</comments>
		<pubDate>Sat, 20 Feb 2010 02:09:21 +0000</pubDate>
		<dc:creator>Juan Belón Pérez</dc:creator>
				<category><![CDATA[Portfolio]]></category>
		<category><![CDATA[administracion]]></category>
		<category><![CDATA[ajax]]></category>
		<category><![CDATA[aplicacion web]]></category>
		<category><![CDATA[base de datos]]></category>
		<category><![CDATA[categorías]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[menú]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[plantillas]]></category>
		<category><![CDATA[platos]]></category>
		<category><![CDATA[programador php]]></category>
		<category><![CDATA[restaurante]]></category>
		<category><![CDATA[W3C]]></category>
		<category><![CDATA[xhtml]]></category>
		<category><![CDATA[zenphp]]></category>

		<guid isPermaLink="false">http://www.programadorphp.org/?p=422</guid>
		<description><![CDATA[En el año 2007 se realizó la programación de esta web se hizo con el prototipo 0.1.2.7 de zenphp, las plantillas XHTML + CSS son validadas por la herramienta de la W3C.
Mediante la ayuda de la administración interna es posible editar el contenido de la base de datos que se muestra en el cliente.
Se realizan [...]]]></description>
			<content:encoded><![CDATA[<p>En el año 2007 se realizó la programación de esta web se hizo con el prototipo 0.1.2.7 de zenphp, las plantillas XHTML + CSS son validadas por la herramienta de la W3C.<br />
Mediante la ayuda de la administración interna es posible editar el contenido de la base de datos que se muestra en el cliente.<br />
Se realizan validaciones para formularios en AJAX, en cuanto a la administración, además se permite la creación rápida de categorías para platos, y otros parámetros avanzados, etc.</p>
<p>Las plantillas XHTML + CSS se crearon por <a href="http://www.agenciaq4.es" target="_blank">Agencia Q4</a> en el 2007.</p>
<p><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="500" height="405" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowFullScreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="src" value="http://www.youtube-nocookie.com/v/GhyYIO6x_Jo&amp;hl=es_ES&amp;fs=1&amp;color1=0x5d1719&amp;color2=0xcd311b&amp;border=1" /><param name="allowfullscreen" value="true" /><embed type="application/x-shockwave-flash" width="500" height="405" src="http://www.youtube-nocookie.com/v/GhyYIO6x_Jo&amp;hl=es_ES&amp;fs=1&amp;color1=0x5d1719&amp;color2=0xcd311b&amp;border=1" allowscriptaccess="always" allowfullscreen="true"></embed></object></p>
]]></content:encoded>
			<wfw:commentRss>http://www.programadorphp.org/portfolio/aplicacion-web-para-restaurante-con-guarderia-platos-y-noticias/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Catálogo de papelería &#8211; Flash + XML + PHP + MySQL</title>
		<link>http://www.programadorphp.org/portfolio/catalogo-de-papeleria-flash-xml-php-mysql/</link>
		<comments>http://www.programadorphp.org/portfolio/catalogo-de-papeleria-flash-xml-php-mysql/#comments</comments>
		<pubDate>Sat, 20 Feb 2010 02:02:06 +0000</pubDate>
		<dc:creator>Juan Belón Pérez</dc:creator>
				<category><![CDATA[Portfolio]]></category>
		<category><![CDATA[bases de datos]]></category>
		<category><![CDATA[catálogo]]></category>
		<category><![CDATA[catalogo web]]></category>
		<category><![CDATA[categorías]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[flash]]></category>
		<category><![CDATA[framework]]></category>
		<category><![CDATA[papelería]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[productos]]></category>
		<category><![CDATA[programación]]></category>
		<category><![CDATA[xml]]></category>
		<category><![CDATA[zenphp]]></category>

		<guid isPermaLink="false">http://www.programadorphp.org/?p=419</guid>
		<description><![CDATA[La aplicación web del proyecto hace uso de la tecnología Flash con XML y PHP + MySQL para crear un catálogo administrable usando el framework zenphp prototipo del 2007-2008 como base de programación. Las diferentes secciones contienen categorías configurables con un editor de texto enriquecido dentro de un gestor de contenidos programado a medida
El diseño [...]]]></description>
			<content:encoded><![CDATA[<p>La aplicación web del proyecto hace uso de la tecnología Flash con XML y PHP + MySQL para crear un catálogo administrable usando el framework zenphp prototipo del 2007-2008 como base de programación. Las diferentes secciones contienen categorías configurables con un editor de texto enriquecido dentro de un gestor de contenidos programado a medida</p>
<p>El diseño XHTML+CSS+FLASH de la página es de <a href="http://www.agenciaq4.es">Agencia Q4</a>.<br />
<object width="500" height="405"><param name="movie" value="http://www.youtube-nocookie.com/v/gMdI6E5ftQs&#038;hl=es_ES&#038;fs=1&#038;color1=0x006699&#038;color2=0x54abd6&#038;border=1"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube-nocookie.com/v/gMdI6E5ftQs&#038;hl=es_ES&#038;fs=1&#038;color1=0x006699&#038;color2=0x54abd6&#038;border=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="500" height="405"></embed></object></p>
]]></content:encoded>
			<wfw:commentRss>http://www.programadorphp.org/portfolio/catalogo-de-papeleria-flash-xml-php-mysql/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Presentación: xUnit y JUnit &#8211; Diseño de Software Orientado a Objetos</title>
		<link>http://www.programadorphp.org/blog/presentacion-xunit-y-junit-diseno-de-software-orientado-a-objetos/</link>
		<comments>http://www.programadorphp.org/blog/presentacion-xunit-y-junit-diseno-de-software-orientado-a-objetos/#comments</comments>
		<pubDate>Fri, 19 Feb 2010 18:20:32 +0000</pubDate>
		<dc:creator>Juan Belón Pérez</dc:creator>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[Diseño de Software Orientado a Objetos]]></category>
		<category><![CDATA[dsdo]]></category>
		<category><![CDATA[ingeniería]]></category>
		<category><![CDATA[ingeniería del software]]></category>
		<category><![CDATA[junit]]></category>
		<category><![CDATA[presentación]]></category>
		<category><![CDATA[Pruebas de Unidad]]></category>
		<category><![CDATA[universidad]]></category>
		<category><![CDATA[xunit]]></category>

		<guid isPermaLink="false">http://www.programadorphp.org/?p=416</guid>
		<description><![CDATA[Charla que dí para la asignatura Diseño de Software Orientado a Objetos de la Universidad de Granada en el año 2007
Presentación: xUnit y Junit
Más presentaciones de Juan Belón Pérez.

]]></description>
			<content:encoded><![CDATA[<p>Charla que dí para la asignatura Diseño de Software Orientado a Objetos de la Universidad de Granada en el año 2007</p>
<div id="__ss_3226912" style="width: 425px; text-align: left;"><a style="font: 14px Helvetica,Arial,Sans-serif; display: block; margin: 12px 0 3px 0; text-decoration: underline;" title="Presentación: xUnit y Junit" href="http://www.slideshare.net/programadorphp/presentacin-xunit-y-junit">Presentación: xUnit y Junit</a><object style="margin: 0px;" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="425" height="355" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowFullScreen" value="true" /><param name="allowScriptAccess" value="always" /><param name="src" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=presentacionxunitjunit-100219112419-phpapp02&amp;stripped_title=presentacin-xunit-y-junit" /><param name="allowfullscreen" value="true" /><embed style="margin: 0px;" type="application/x-shockwave-flash" width="425" height="355" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=presentacionxunitjunit-100219112419-phpapp02&amp;stripped_title=presentacin-xunit-y-junit" allowscriptaccess="always" allowfullscreen="true"></embed></object></p>
<div style="font-size: 11px; font-family: tahoma,arial; height: 26px; padding-top: 2px;">Más <a style="text-decoration: underline;" href="http://www.slideshare.net/">presentaciones</a> de <a style="text-decoration: underline;" href="http://www.slideshare.net/programadorphp">Juan Belón Pérez</a>.</div>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.programadorphp.org/blog/presentacion-xunit-y-junit-diseno-de-software-orientado-a-objetos/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Programación básica del CMS Magento &#8211; Productos de un Taller</title>
		<link>http://www.programadorphp.org/portfolio/programacion-basica-del-cms-magento-productos-de-un-taller/</link>
		<comments>http://www.programadorphp.org/portfolio/programacion-basica-del-cms-magento-productos-de-un-taller/#comments</comments>
		<pubDate>Fri, 19 Feb 2010 18:15:32 +0000</pubDate>
		<dc:creator>Juan Belón Pérez</dc:creator>
				<category><![CDATA[Portfolio]]></category>
		<category><![CDATA[banners]]></category>
		<category><![CDATA[cms]]></category>
		<category><![CDATA[contribuciones]]></category>
		<category><![CDATA[e-commerce]]></category>
		<category><![CDATA[magento]]></category>
		<category><![CDATA[módulos]]></category>
		<category><![CDATA[programación]]></category>
		<category><![CDATA[taller]]></category>

		<guid isPermaLink="false">http://www.programadorphp.org/?p=413</guid>
		<description><![CDATA[Los productos se muestran siguiendo una lógica programada desde la administración por medio del gestor de plantillas de Magento.
Se realizaron tareas de programación para ajustar cambios necesarios , pedidos por el cliente para mostrar las categorías a la izquierda así como la instalación de contribuciones para módulos de banners ,etc. 

En el vídeo se muestra [...]]]></description>
			<content:encoded><![CDATA[<p>Los productos se muestran siguiendo una lógica programada desde la administración por medio del gestor de plantillas de Magento.<br />
Se realizaron tareas de programación para ajustar cambios necesarios , pedidos por el cliente para mostrar las categorías a la izquierda así como la instalación de contribuciones para módulos de banners ,etc. </p>
<p><object width="500" height="405"><param name="movie" value="http://www.youtube.com/v/_n7uU_YN87o&#038;hl=es_ES&#038;fs=1&#038;color1=0xe1600f&#038;color2=0xfebd01&#038;border=1"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/_n7uU_YN87o&#038;hl=es_ES&#038;fs=1&#038;color1=0xe1600f&#038;color2=0xfebd01&#038;border=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="500" height="405"></embed></object></p>
<p>En el vídeo se muestra el funcionamiento de Magento tanto como cliente como administrador de la tienda, se tradujo a través de la administración interna el texo a inglés ya que en el año 2007 no existían muchos colaboradores que contribuyeran al proyecto.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.programadorphp.org/portfolio/programacion-basica-del-cms-magento-productos-de-un-taller/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Estudio de arquitectura &#8211; Proyectos, Galerías, Información</title>
		<link>http://www.programadorphp.org/portfolio/estudio-de-arquitectura-proyectos-galerias-informacion/</link>
		<comments>http://www.programadorphp.org/portfolio/estudio-de-arquitectura-proyectos-galerias-informacion/#comments</comments>
		<pubDate>Fri, 19 Feb 2010 18:03:45 +0000</pubDate>
		<dc:creator>Juan Belón Pérez</dc:creator>
				<category><![CDATA[Portfolio]]></category>
		<category><![CDATA[ajax]]></category>
		<category><![CDATA[arquitectura]]></category>
		<category><![CDATA[bases de datos]]></category>
		<category><![CDATA[diseño]]></category>
		<category><![CDATA[estudio]]></category>
		<category><![CDATA[flash]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[programador php]]></category>
		<category><![CDATA[zenphp]]></category>

		<guid isPermaLink="false">http://www.programadorphp.org/?p=410</guid>
		<description><![CDATA[Se utilizó el framework ZENPHP sobre un diseño de Agencia Q4 contra bases de datos de un servidor MySQL y animaciones con Flash y JavaScript en el año 2007.

Se pueden ver como se puede configurar las categorías que se deben mostrar primero, la galería de imágenes y la administración de contenidos : proyectos e información [...]]]></description>
			<content:encoded><![CDATA[<p>Se utilizó el framework ZENPHP sobre un diseño de <a href="http://www.agenciaq4.com">Agencia Q4</a> contra bases de datos de un servidor MySQL y animaciones con Flash y JavaScript en el año 2007.</p>
<p><object width="500" height="405"><param name="movie" value="http://www.youtube.com/v/L_fbUdvFx4Q&#038;hl=es_ES&#038;fs=1&#038;color1=0x3a3a3a&#038;color2=0x999999&#038;border=1"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/L_fbUdvFx4Q&#038;hl=es_ES&#038;fs=1&#038;color1=0x3a3a3a&#038;color2=0x999999&#038;border=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="500" height="405"></embed></object></p>
<p>Se pueden ver como se puede configurar las categorías que se deben mostrar primero, la galería de imágenes y la administración de contenidos : proyectos e información del estudio.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.programadorphp.org/portfolio/estudio-de-arquitectura-proyectos-galerias-informacion/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Optimizar PHP con C y C++</title>
		<link>http://www.programadorphp.org/blog/optimizar-php-con-c-y-cpp/</link>
		<comments>http://www.programadorphp.org/blog/optimizar-php-con-c-y-cpp/#comments</comments>
		<pubDate>Sun, 07 Feb 2010 22:16:15 +0000</pubDate>
		<dc:creator>Juan Belón Pérez</dc:creator>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[c++]]></category>
		<category><![CDATA[CGI]]></category>
		<category><![CDATA[cpp]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[programador php]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[ror]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[ruby on rails]]></category>
		<category><![CDATA[web 3d]]></category>

		<guid isPermaLink="false">http://www.programadorphp.org/?p=348</guid>
		<description><![CDATA[Este artículo se compone de:

Introducción
Implementación de un caso real 
Resultados
Conclusiones
Comentarios
Futuro: la web 3d


INTRODUCCIÓN C/C++ A TRAVÉS DE PHP:
He estado investigando después de leer una noticia enviada por WebGranada que decía que los chicos de Facebook han hecho una herramienta que transforma el código de PHP a C++ y que al realizar las tareas con lenguaje [...]]]></description>
			<content:encoded><![CDATA[<p>Este artículo se compone de:</p>
<ol>
<li><a href="#intro">Introducción</a></li>
<li><a href="#implementacion">Implementación de un caso real </a></li>
<li><a href="#resultados">Resultados</a></li>
<li><a href="#conclusiones">Conclusiones</a></li>
<li><a href="#comentarios">Comentarios</a></li>
<li><a href="#futuro">Futuro: la web 3d</a></li>
</ol>
<p><a name="intro"></a></p>
<h2>INTRODUCCIÓN C/C++ A TRAVÉS DE PHP:</h2>
<p>He estado investigando después de leer una noticia enviada por <a href="http://twitter.com/webgranada" target="_blank"><strong>WebGranada</strong></a><strong> </strong>que decía que los chicos de Facebook <a href="http://softlibre.barrapunto.com/article.pl?sid=10/02/02/2219211&amp;from=rss" target="_blank"><strong>han hecho una herramienta</strong></a><strong> </strong>que transforma el código de PHP a C++ y que al realizar las tareas con lenguaje de la máquina (bajo nivel),como es lógico ,es más rápido ,sin embargo, me preguntaba hasta que punto es más rápido&#8230;como no he visto nada serio que me convenza me he decidio por hacer mis propias pruebas con este tipo de construcción de webs a través de lenguaje C/C++ en lugar de PHP, e incluso escribir el código en PHP y pasarlo a C++&#8230;</p>
<p>De hecho, esto ya existía desde hace tiempo,&#8230;cualquiera puede implementar una herramienta como: <strong><a href="http://www.mibsoftware.com/php2cpp/" target="_blank">The PHP to C++ Translation tool</a></strong>&#8230;que no es más que un programa en C++ que analiza sintácticamente un programa en PHP y lo pasa a C++ para que se pueda compilar y colgar en el servidor , por ejemplo la plataforma <a href="http://swad.ugr.es/source/" target="_blank"><strong>SWAD</strong></a><strong> </strong>está escrita en este lenguaje y la especificación <strong><a href="http://es.wikipedia.org/wiki/Interfaz_de_entrada_com%C3%BAn" target="_blank">CGI</a></strong>&#8230;pero lo difícil es hacerlo bien, como casi siempre jeje</p>
<p>El debate que existe en Internet, ronda, en parte, a la cuestión de que no se va a conseguir una verdadera experiencia de mejora de velocidad en cuanto a interacción y carga de páginas, sobre todo en las que no tienes más de un número máximo, digamos, de más de miles de usuarios&#8230;ni tampoco, a la hora de conectarse a la base de datos ya que es algo que no suele mejorarse demasiado de una tecnología a otra ,no más de un 20%&#8230;</p>
<p>Sí que se notará cuando se realicen búsquedas y otras operaciones complejas con los datos ya que un programa en C++ está optimizado en memoria mucho más que PHP,siempre y cuando el programador haya llevado cuidado a la hora de escribir el código&#8230;además, al funcionar PHP como un módulo (extensión) del Servidor (por ejemplo Apache), tiene sus propios límites de memoria y ciclos de ejecución, darle los datos de entrada a un programa en C++ y que realice tareas complejas es más eficiente según qué casos&#8230;</p>
<h2>IMPLEMENTACIÓN DE UN CASO REAL</h2>
<p><a name="implementacion"></a><br />
Aquí propongo un ejemplo sencillo para demostrar en qué casos es mejor C++ que PHP, para empezar, si queremos ir probando todo lo que vamos haciendo, podemos crearnos un directorio en nuestro servidor llamado  &#8220;c++&#8221;, recordar añadirlo al .htaccess:<br />
<em>RewriteRule ^c\+\+(.*) &#8211; [PT]</em><br />
&#8230;para que Apache no procese ese directorio con otra regla, (si le ponemos un password mejor)&#8230;ahora, un script sencillo para ejecutar programas como si estuviéramos en una consola:<br />
<strong> shell.php:</strong></p>
<pre class="brush: html">

&lt;html&gt;
&lt;head&gt;
&lt;script type=&quot;text/javascript&quot;&gt;
function loadXML(_cmd) {
url=&quot;/c++/shell_exec.php&quot;;
if (window.XMLHttpRequest) {
// codigo para IE7+, Firefox, Chrome, Opera, Safari
xmlhttp=new XMLHttpRequest();
} else {// para IE6, IE5
xmlhttp=new ActiveXObject(&quot;Microsoft.XMLHTTP&quot;);
}
xmlhttp.open(&quot;GET&quot;,url+&quot;?cmd=&quot;+_cmd,false);
xmlhttp.send(null);
document.getElementById(&#039;test&#039;).innerHTML=xmlhttp.responseText;
if (document.frmT.b.checked)
document.frmT.cmd.value=&quot;&quot;;
document.frmT.cmd.focus();
}

&lt;/script&gt;
&lt;title&gt;Exec&lt;/title&gt;
&lt;/head&gt;

&lt;body&gt;

&lt;div id=&quot;test&quot;&gt;
&lt;h2&gt;CONSOLA&lt;/h2&gt;
&lt;/div&gt;
&lt;form name=&quot;frmT&quot; onsubmit=&quot;loadXML(document.frmT.cmd.value); return false;&quot;&gt;
&lt;input type=&quot;text&quot; name=&quot;cmd&quot; /&gt;
&lt;input type=&quot;checkbox&quot; name=&quot;b&quot; value=&quot;1&quot; id=&quot;b&quot;&gt;&lt;label for=&quot;b&quot;&gt;Borrar&lt;/label&gt;
&lt;/form&gt;
&lt;button type=&quot;button&quot; onclick=&quot;loadXML(document.frmT.cmd.value); return false;&quot;&gt;run&lt;/button&gt;
&lt;/body&gt;
&lt;/html&gt;
</pre>
<p>Este código llamará, usando el truquito AJAX, al siguiente fichero PHP (ojo!: más peligroso):</p>
<p><strong>shell_exec.php</strong></p>
<pre class="brush: php">

$t = trim($_GET[&#039;cmd&#039;]);
if (empty($t)) die(&quot;Escribe un comando chatin&quot;);

echo $_GET[&#039;cmd&#039;].&quot;&lt;br&gt;&quot;;
echo str_replace(&quot;\n&quot;,&quot;&lt;br&gt;&quot;,passthru($_GET[&#039;cmd&#039;]));
</pre>
<p><strong><br />
</strong> Ahora podemos utilizarlo invocando directamente la URL:</p>
<p style="text-align: center;"><a rel="lightbox" href="http://www.programadorphp.org/wp-content/uploads/2010/02/consola_shell-150x150.gif" target="_blank"><br />
</a><a rel="lightbox" href="http://www.programadorphp.org/wp-content/uploads/2010/02/consola_shell.gif" title="consola_shell" rel="lightbox[348]"><img class="size-full wp-image-358 aligncenter" title="consola_shell" src="http://www.programadorphp.org/wp-content/uploads/2010/02/consola_shell.gif" alt="" width="530" height="261" /></a></p>
<p style="text-align: left;">
<p style="text-align: left;">
<p style="text-align: left;">
<p style="text-align: left;">
<p style="text-align: left;">
<p style="text-align: left;">
<p style="text-align: left;">
<p style="text-align: left;">
<p style="text-align: left;">
<p style="text-align: center;">Ya podemos probar nuestros programas en C++ subiéndolos y compilándolos online (si nuestro servidor tiene <a href="http://gcc.gnu.org/" target="_blank"><strong>gcc</strong></a>), o bien, haciendo una llamada al programa compilado directamente por nosotros en local&#8230;Para los que son más de <em>Windows</em>, podéis instalar <a href="http://www.cygwin.com/" target="_blank"><em><strong>cygwin</strong></em></a><em><strong> </strong></em>y descargar las librerías para hacer compilaciones de Linux: <a href="http://prdownloads.sourceforge.net/metamod-p/cygwin-gcc-linux.tar.bz2?download" target="_blank"><strong><em>crosscompilers for cygwin</em></strong></a> (<a href="http://prdownloads.sourceforge.net/metamod-p/cygwin-gcc-3.3.6-glibc-2.3.2-linux.tar.bz2" target="_blank">existe una versión para 64bits</a> de las librerías), descomprimiéndolas en el directorio <em>cygwin </em>para poder llamar a <em>g++-linux</em>, por <em>Ejemplo para compilar </em><strong><a href="http://www.mibsoftware.com/php2cpp/" target="_blank"><em>The PHP to C++ Translation tool</em></a><em>:</em></strong><br />
<a rel="lightbox" href="http://www.programadorphp.org/wp-content/uploads/2010/02/compilar_php2cpp.gif" title="compilar_php2cpp" rel="lightbox[348]"><img class="aligncenter size-thumbnail wp-image-359" title="compilar_php2cpp" src="http://www.programadorphp.org/wp-content/uploads/2010/02/compilar_php2cpp.gif" alt="" width="521" height="255" /></a><br />
<strong> $ g++-linux -o php2cpp php2cpp.cpp</strong></p>
<p>No debe de darnos ningún error o advertencia&#8230;ahora podemos usar el comando desde el servidor para pasar un fichero en lenguaje php a un fichero en lenguaje C++ mediante:</p>
<p><em> ./php2cpp entrada.php salida.cpp</em></p>
<p>de nuevo debemos compilar la salida para obtener un binario&#8230;</p>
<p><em>$g++-linux -o salida salida.cpp</em></p>
<p>Una vez que tenemos los binarios podemos usar la consola improvisada en el navegador, para dar permisos de ejecución a aquellos mediante<br />
<em> chmod 750 salida</em></p>
<p>Y entonces podemos cargar el programa desde el servidor como antes (una vez subido,claro)<br />
<em>./salida</em></p>
<p>Un ejemplo básico de C,sería una búsqueda binaria de datos,por ejemplo de <strong><a href="http://www.youtube.com/watch?v=x79y2WKDb0A" target="_blank">triadas de vértices (x,y,z)</a></strong> de un conjunto de polígonos, dentro de un conjunto mayor,pero para no complicarnos, usaremos un array unidimensional, de valores dobles, un código como el siguiente nos vale:</p>
<pre class="brush: cpp">
#include &lt;stdio.h&gt;
#include &lt;time.h&gt;
#define tamanio 500
int busquedaBinaria(double *matrizOrdenada, int primero,
int ultimo, double llave);

int main ()
{
clock_t t_antes,t_despues;
double t,aux;
int i,k;
srandom(time(0));

for (k=1000; k&lt;=3000; k+=1000){
t_antes = clock();
double *m =  malloc (sizeof(double)*tamanio*k);
for (i=0; i&lt;tamanio*k; i++) {
m[i] = (double) (rand()%1000)+1;
}

aux = busquedaBinaria(m,0,tamanio*k,m[(int) (tamanio*k)/2]);
free(m);
t_despues = clock();
t = (((double)(t_despues - t_antes)) / CLOCKS_PER_SEC);
printf(&quot;&lt;br&gt;&lt;h1&gt;%f&lt;/h1&gt;segundos&quot;,t);
}
return 0;
}

/**
* @brief function busquedaBinaria:
*     Busca desde matrizOrdenada[primero]..matrizOrdenada[ultimo] por llave.
*  @returns: indice del elemento encontrado, la llave,
*          en otro caso -(indice donde se puede insertar)-1.
*  @param int matrizOrdenada array de sorted (ascending) values.
*  @param int primero
*  @param int ultimo
*  @llave double llave
*  @return int
*/
int busquedaBinaria(double *matrizOrdenada, int primero,
int ultimo, double llave) {
while (primero &lt;= ultimo) {
// calcula el punto medio
int mid = (primero + ultimo) / 2;
if (llave &gt; matrizOrdenada[mid])
// repite la busqueda si no esta en la mitad
primero = mid + 1;
else if (llave &lt; matrizOrdenada[mid])
// repite la busqueda en la otra mitad
ultimo = mid - 1;
else // encuentra el item, lo devuelve
return mid;
}
// no encontrado
return -(primero + 1);
}
</pre>
<p>Para compilar con gcc&#8230;</p>
<p>Ahora el mismo programa compilado con gcc, pero en PHP:</p>
<p><strong><em>o2.php:</em></strong></p>
<pre class="brush: php">

srand(null);
$tamanio = 500;
for ($k=1000; $k&lt;=3000; $k+=1000){
$t_antes = microtime(true);
$m =  array();
for ($i=0; $i&lt;$tamanio*$k; $i++) {
$m[i] = doubleval(rand(1,1000));
}
$aux = busquedaBinaria($m,0,$tamanio*$k,
$m[($tamanio*$k)/2]);
unset($m);
$t_despues = microtime(true);
$t = $t_despues - $t_antes;
printf(&quot;&lt;br&gt;&lt;h1&gt;%f&lt;/h1&gt;segundos&quot;,$t);
}

/**
* @brief function busquedaBinaria:
*     Busca desde matrizOrdenada[primero]..matrizOrdenada[ultimo] por llave.
*  @returns: indice del elemento encontrado, la llave,
*          en otro caso -(indice donde se puede insertar)-1.
*  @param int matrizOrdenada array de sorted (ascending) values.
*  @param int primero
*  @param int ultimo
*  @llave double llave
*  @return int
*/
function busquedaBinaria(&amp;$matrizOrdenada,
$primero, $ultimo, $llave) {
while ($primero &lt;= $ultimo) {
$mid = ($primero + $ultimo) / 2;  // calcula el punto medio
if ($llave &gt; $matrizOrdenada[$mid])
$primero = $mid + 1;  // repite la busqueda si no esta en la mitad
else if ($llave &lt; $matrizOrdenada[$mid])
$ultimo = $mid - 1; // repite la busqueda en la otra mitad
else
return $mid;     // encuentra el item, lo devuelve
}
return -($primero + 1);    // no encontrado
}
</pre>
<h2>RESULTADOS</h2>
<p><a name="resultados"></a><br />
<strong><em>Resultados C/C++:</em></strong></p>
<p style="text-align: center;"><a rel="lightbox" href="http://www.programadorphp.org/wp-content/uploads/2010/02/busqueda_con_cpp.gif" title="busqueda_con_cpp" rel="lightbox[348]"><img class="aligncenter" title="busqueda_con_cpp" src="http://www.programadorphp.org/wp-content/uploads/2010/02/busqueda_con_cpp.gif" alt="" width="413" height="463" /></a></p>
<p><strong><em>Resultados PHP:</em></strong></p>
<p style="text-align: center;"><strong><em><a rel="lightbox" href="http://www.programadorphp.org/wp-content/uploads/2010/02/busqueda_con_php.gif" title="busqueda_con_php" rel="lightbox[348]"><img class="size-full wp-image-368 aligncenter" title="busqueda_con_php" src="http://www.programadorphp.org/wp-content/uploads/2010/02/busqueda_con_php.gif" alt="" width="433" height="374" /></a><br />
</em></strong></p>
<p>He elegido las búsquedas ya que estas operaciones de ordenación, concatenación de cadenas, etc. son más rápidas que en PHP y se pueden ver en los resultados.</p>
<p style="text-align: center;"><em><strong>Gráficas:</strong></em><br />
<a rel="lightbox" href="http://www.programadorphp.org/wp-content/uploads/2010/02/grafica_elementos_segundos_.gif" title="grafica_elementos_segundos_" rel="lightbox[348]"><img class="size-full wp-image-371 aligncenter" title="grafica_elementos_segundos_" src="http://www.programadorphp.org/wp-content/uploads/2010/02/grafica_elementos_segundos_.gif" alt="" width="506" height="314" /></a></p>
<p><em>La gráfica muestra la diferencia de eficiencia entre C/C++ y PHP a la hora de ejecutar algoritmos complejos de búsqueda y ordenación&#8230;</em></p>
<p><a rel="lightbox" href="http://www.programadorphp.org/wp-content/uploads/2010/02/grafica_cpp_php_uso.png" title="grafica_cpp_php_uso" rel="lightbox[348]"><img class="aligncenter size-full wp-image-398" title="grafica_cpp_php_uso" src="http://www.programadorphp.org/wp-content/uploads/2010/02/grafica_cpp_php_uso.png" alt="" width="480" height="300" /></a></p>
<p><em>Esta gráfica corresponde al benchmark entre C++ y PHP: tiempo usado, memoria usada ,código usado versus velocidad y tamaño comparando los programas más rápidos de PHP </em></p>
<h2>CONCLUSIONES</h2>
<p><a name="conclusiones"></a><br />
Después de saber que C y C++ es mucho más rápido que <em>PHP </em>para manejar la memoria y realizar operaciones complejas como algoritmos de ordenación, podemos consultar algunas webs que han hecho análisis más profundos y sacan sus propias conclusiones al respecto:</p>
<ul>
<li><a href="http://www.dmh2000.com/cjpr/index.shtml" target="_blank"><strong><em>C++</em> vs <em>Java</em> vs <em>Python</em> vs <em>Ruby</em></strong></a> : la primera impresión, analiza como he hecho yo,<strong><a href="http://www.dmh2000.com/cjpr/cmpframe.html" target="_blank"> un programa en todos estos lenguajes</a></strong> añadiendo <em>Java, Ruby </em>y<em> Python</em>,realizando comparativas de lo mejor y lo peor de cada uno, por ejemplo la poca información de <em>Ruby </em>a la hora de mostrar errores en tiempo de ejecución y compilación, o los requerimientos de cada sintaxis, para poder hacer un programa, que hace que baje el tiempo de producción de una solución por ejemplo teniendo que recordar que en <em>Python </em>hay que escribir &#8220;<em>self</em>&#8221; y aumente el coste del proyecto&#8230;acaba concluyendo que <em>Java </em>es más productivo que <em>C++</em> pero nomás que <em>Ruby </em>o <em>Python </em>que además tienen un código más bonito&#8230;, mencionando que depende de nuestros conocimientos de estos dos últimos la curva final,&#8230;como colofón, <a href="http://www.dmh2000.com/blog/2006/02/c-java-python-ruby.html" target="_blank"><strong>los comentarios [flame!]</strong></a></li>
<li><strong><a href="http://shootout.alioth.debian.org/u64/benchmark.php?test=all&amp;lang=gpp&amp;lang2=php" target="_blank">Tamaño y velocidad: una serie de análisis de lenguajes:</a> </strong>este es uno de esos análisis de titanes, compara cualquier lenguaje, como si de un comparador de móviles o coches se tratara, dando datos y gráficas de las estadísticas de ejecución, además provee de enlaces con los ficheros con los que se realizaron las pruebas.</li>
</ul>
<p>Como conclusión personal, pienso en C siempre que necesite un algoritmo que consuma mucho tiempo o mucho espacio en memoria del servidor, por supuesto, este tipo de programas se usan en empresas para realizar diversas operaciones&#8230;si bien, no está mal recordar que si lo que necesitamos en un listado de productos con condiciones únicas podemos utilizar un <a href="http://www.orafaq.com/wiki/PL/SQL_FAQ" target="_blank"><strong>algoritmo de C o C++ embebido en PL/SQL</strong></a> tal como dicta el manual de Oracle&#8230;</p>
<p>¿Casos reales? Por ejemplo, se podría implementar un algoritmo para una búsqueda en una red social como Badoo.com, si necesitamos encontrar todas las personas con los ojos azules, aplicarle a la primera foto de cada contacto un algoritmo, primero con el comando wget() (o con PHP) nos descargamos la imagen o un rango de ellas, a un directorio de caché, llamamos al programa en C++ (exec() ,<strong><a href="http://library.thinkquest.org/16728/content/cgi/cplusplus.html" target="_blank">CGI</a></strong>, o lo que sea) que analiza la/s foto/s y nos dá una probabilidad de que los ojos azules se encuentren en ella y basándose en estos datos, marcar el perfil de la persona pasado al script como apto para añadirlo a la lista de candidatos de nuestra base de datos&#8230;esto en PHP podría tardar pues&#8230;imaginaos jaja</p>
<h2>FUTURO: LA WEB 3D</h2>
<p><a name="futuro"></a><br />
Ni que decir tiene que el futuro nos depara webs en 3D programadas en C++ o las generaciones siguientes a este como LUA que transforma internamente el código a C++&#8230;y esto amigos, si que se nota comparado con un applet de Java :]</p>
<p><a href="http://img.programadorphp.org/3d/grecia.html" target="_blank">Abrir grecia del futuro</a></p>
<p><a name="comentarios"></a></p>
<h2>COMENTARIOS</h2>
<p>De hecho existen algoritmos que estudian su probabilidad de éxito en el marketing&#8230;no es nada descabellada la idea <img src='http://www.programadorphp.org/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Es la hora de comentarme o insultarme, lo que más os guste o lo que más rabia os de <img src='http://www.programadorphp.org/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.programadorphp.org/blog/optimizar-php-con-c-y-cpp/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>La potencia de firebug &#124; Ingeniería inversa de aplicaciones web</title>
		<link>http://www.programadorphp.org/blog/la-potencia-de-firebug-ingenieria-inversa-de-aplicaciones-web/</link>
		<comments>http://www.programadorphp.org/blog/la-potencia-de-firebug-ingenieria-inversa-de-aplicaciones-web/#comments</comments>
		<pubDate>Thu, 04 Feb 2010 11:34:48 +0000</pubDate>
		<dc:creator>Juan Belón Pérez</dc:creator>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[ajax]]></category>
		<category><![CDATA[badoo]]></category>
		<category><![CDATA[bug]]></category>
		<category><![CDATA[firebug]]></category>
		<category><![CDATA[firefox]]></category>
		<category><![CDATA[ingeniería]]></category>
		<category><![CDATA[ingenieria inversa]]></category>
		<category><![CDATA[setInterval]]></category>
		<category><![CDATA[trucos]]></category>

		<guid isPermaLink="false">http://www.programadorphp.org/?p=338</guid>
		<description><![CDATA[Siempre es lo mismo, la depuración de aplicaciones que hago es automática, cuando visito un sitio web no puedo evitarlo, es como cuando un diseñador gráfico 3D ve una película de animación, o un programador de videojuegos prueba la última creación de una empresa, &#8230;no podemos disfrutar del producto al mismo nivel que alguien &#8220;normal&#8221; [...]]]></description>
			<content:encoded><![CDATA[<p>Siempre es lo mismo, la depuración de aplicaciones que hago es automática, cuando visito un sitio web no puedo evitarlo, es como cuando un diseñador gráfico 3D ve una película de animación, o un programador de videojuegos prueba la última creación de una empresa, &#8230;no podemos disfrutar del producto al mismo nivel que alguien &#8220;normal&#8221; , porque lo analizamos inconscientemente.</p>
<p>En este caso analicé anoche Badoo,una web de contactos escrita en AJAX y conseguí una única línea en JavaScript con la que puedes hacer un robot para votar a todas las personas sin restricciones de ningún tipo aprovechando un bug&#8230;</p>
<p>El vídeo (música de <a href="http://open.spotify.com/album/0eJUY2Em2YpciqDTAEUHZm" target="_blank">Helloween</a>):<br />
<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="550" height="371" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowfullscreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="src" value="http://vimeo.com/moogaloop.swf?clip_id=9198427&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=0&amp;show_portrait=0&amp;color=00adef&amp;fullscreen=1" /><embed type="application/x-shockwave-flash" width="550" height="371" src="http://vimeo.com/moogaloop.swf?clip_id=9198427&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=0&amp;show_portrait=0&amp;color=00adef&amp;fullscreen=1" allowscriptaccess="always" allowfullscreen="true"></embed></object></p>
<p><a href="http://vimeo.com/9198427">La potencia de FireBug</a></p>
<p>El ritmo que se consigue de votación es cada vez más vertiginoso a medida que voy obteniendo nuevos métodos para saltar de un perfil a otro hasta que consigo dar con un objeto en el árbol DOM que está conectado a toda la estructura y al que se le puede llamar directamente.</p>
<p>En esta web se captura el click en cualquier sitio, de forma que sólo permite el evento click en los objetos registrados, así pueden controlar la actividad completa de un usuario, la línea que permite acceder al evento click sería</p>
<p>$e._handlers.cl.meet_yes[0](el)</p>
<p>donde $e es un objeto que guarda todos los manejadores y enlaces a los objetos, _handlers todos los manejadores, cl las funciones que manejan los objetos de la interfaz registrados y meet_yes el conjunto de botones &#8220;Sí | Quizás | No&#8221;, si se sigue la traza del sí perfilando la web con el profiler de firebug encontramos que finalmente llama a la función vote que es lo único que nos interesa, ya que no tiene sentido regenerar el evento click ya que necesitaríamos construir un objeto válido con los parámetros del botón necesarios (que no se especifican) por lo que podría costarnos mucho trabajo así que llamamos a la votación indicándole que el objeto DOM es el botón &#8220;Sí&#8221;:</p>
<p>MeetMe.vote(<span style="color: #ff9900;">document</span>.<span style="color: #0000ff;">getElementsByClassName</span>(<span style="color: #339966;">&#8220;meet_yes&#8221;</span>)[<span style="color: #3366ff;">0</span>])</p>
<p>Ahora podemos embeber dicha línea dentro de una función para hacerla compatible con el modo de trabajar con prototipos de JavaScript:</p>
<p><span style="color: #3366ff;">function </span><strong>votar</strong>() <strong>{</strong>MeetMe.vote(<span style="color: #ff9900;">document</span>.<span style="color: #0000ff;">getElementsByClassName</span>(<span style="color: #339966;">&#8220;meet_yes&#8221;</span>)[<span style="color: #3366ff;">0</span>])<strong>}</strong></p>
<p>y nuestro robot sería tan sencillo como este:</p>
<p><span style="color: #0000ff;">setInterval</span>(&#8220;<strong>votar</strong>()&#8221;,<span style="color: #3366ff;">1000</span>);</p>
<p>cada segundo vota, así podeis dejarlo,si tenéis una mejor conexión podeis reducirlo a la mitad, recomiendo poner 5 segundos y meter el setInterval dentro de la función, podéis usar el fichero de ejemplo <a href="http://www.programadorphp.org/wp-content/uploads/2010/02/hacks_badoo.txt"><img src="http://img.programadorphp.org/uploads/icon_download.gif" alt="download" border="0"/><strong>hacks_badoo.js</strong></a></p>
<p>Supongo que arreglarán este bug&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.programadorphp.org/blog/la-potencia-de-firebug-ingenieria-inversa-de-aplicaciones-web/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
