<?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>Blog de Daniel Zegarra &#187; PHP</title>
	<atom:link href="http://danielzegarra.net/category/php/feed/" rel="self" type="application/rss+xml" />
	<link>http://danielzegarra.net</link>
	<description>De vuelta en Lima!</description>
	<lastBuildDate>Thu, 15 Mar 2012 14:42:51 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<item>
		<title>Diseño de un administrador de reportes</title>
		<link>http://danielzegarra.net/2011/12/13/diseno-de-un-administrador-de-reportes/</link>
		<comments>http://danielzegarra.net/2011/12/13/diseno-de-un-administrador-de-reportes/#comments</comments>
		<pubDate>Tue, 13 Dec 2011 08:20:08 +0000</pubDate>
		<dc:creator>Daniel Zegarra</dc:creator>
				<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://danielzegarra.net/?p=1456</guid>
		<description><![CDATA[[...]]]></description>
			<content:encoded><![CDATA[<p>Luego de dejar de postear por tanto tiempo queria volver publicando algo util, liberar algun proyecto o algo por el estilo, pero entre ver el siguiente capitulo de 24 y sanear un proyecto para ser publicado siempre salio ganando 24.</p>
<p>Lo siguiente no es tan interesante como lo que tenia planeado pero es de utilidad para quien necesita crear plantillas de reportes y esta a punto de empezar a indagar como hacerlo con PHP.</p>
<h3>El requerimiento</h3>
<p>Si por algun lado hay que empezar es por aqui. Se necesita lo siguiente:</p>
<ul>
<li>Tener un catalogo de reportes</li>
<li>Elegir el formato en que quiero cada reporte (el mismo reporte pueda obtenerse en distintos formatos)</li>
<li>La cantidad de parametros que cada reporte necesita sea variable</li>
</ul>
<h3>El modelo de datos</h3>
<p>El modelo de las tablas que necesitamos se limitan a lo siguiente.</p>
<div id="attachment_1458" class="wp-caption aligncenter" style="width: 466px"><a href="http://danielzegarra.net/wp-content/uploads/2011/12/datamodel.png" rel="lightbox[1456]"><img class="size-full wp-image-1458 " title="Modelo de datos de un catalogo de reportes" src="http://danielzegarra.net/wp-content/uploads/2011/12/datamodel.png" alt="Modelo de datos de un catalogo de reportes" width="456" height="132" /></a><p class="wp-caption-text">Modelo de datos de un catalogo de reportes</p></div>
<p>Tenemos tres tablas. Una guarda el catalogo de reportes, la otra el catalogo de formatos de archivos y una tabla de relación que describe los formatos en que cada reporte se encuentra disponible.</p>
<h3>Clases PHP</h3>
<p>Acostumbro a trabajar consumiendo servicios. Me parece que es mas limpio si tengo bien separado la vista (en el cliente) de la lógica del negocio (en el servidor). Ademas, si no amarro la vista a los controladores puedo utilizar otros clientes (flash, java, etc) sin hacer cambios al código.</p>
<p>Como dije, trabajando como servicios tengo el servicio/clase llamado <em><strong>Sistema_Reporte</strong></em> que tiene los siguientes métodos:</p>
<ul>
<li><strong>Sistema_Reporte</strong></li>
<ul>
<li><strong>run</strong>(<em><strong><span style="color: #333399;">codigo</span></strong></em><span style="color: #339966;">:string</span>, <strong><em><span style="color: #333399;">formato</span></em></strong><span style="color: #339966;">:string</span>, <span style="color: #333399;"><em><strong>params</strong></em></span><span style="color: #339966;">:array</span>)<br />
Ejecuta un reporte. recibe el código del reporte, el formato en que se requiere y los parámetros que necesita el reporte para hacer su trabajo.</li>
<li><strong>getReporte</strong>(<strong><em><span style="color: #333399;">codigo</span></em></strong><span style="color: #339966;">:string</span>)<br />
Entrega información disponible sobre un reporte (nombre, descripción, etc).</li>
<li><strong>getFormats</strong>(<strong><em><span style="color: #333399;">codigo</span></em></strong><span style="color: #339966;">:string</span>)<br />
Devuelve una matriz con los formatos que un reporte puede generar.</li>
<li><strong>getParams</strong>(<strong><em><span style="color: #333399;">codigo</span></em></strong><span style="color: #339966;">:string</span>)<br />
Entrega una matriz con los parámetros que recibe el reporte.</li>
<li><strong>getParamValues</strong>(<strong><em><span style="color: #333399;">parametro</span></em></strong><span style="color: #339966;">:string</span>)<br />
Algunos parametros son predefinidos (true, false, &#8220;si&#8221;, &#8220;no&#8221;) y otros serán IDs de un catalogo. Este método devuelve una matriz con los valores posibles que un parámetro puede tomar cuando estos no pertenecen a una tabla catalogo.</li>
<li><strong>scan</strong>(<strong><em><span style="color: #333399;">ruta</span></em></strong><span style="color: #339966;">:string</span>)<br />
Busca y registra los reportes encontrados en la ruta dada (relativa a la raíz del sistema).</li>
</ul>
</ul>
<p>Lo que este servicio hace es tan solo recibir la petición y direccionarlo al reporte especificado. Los reportes seran otras clases PHP que pueden estar ubicadas todas en un mismo directorio u ordenadas en otros directorios junto a otras clases de sus modulos, eso no importa ya que en nuestro modelo de datos estamos almacenando la ruta donde se encuentra el reporte. El metodo scan realizara una busqueda de reportes en el directorio especificado usando el siguiente algoritmo:</p>
<ul>
<li>Abre el directorio y lista su contenido</li>
<li>Recorre el contenido tomando en cuenta solo los archivos con extension .php</li>
<li>Carga cada archivo php y revisa si la clase cargada es hija de <em><strong>Sistema_Reporte_Plantilla</strong></em> (todos los reportes deben heredar de esta clase para ser reconocidos como tal).</li>
<li>Si la clase cumple con los requisitos es registrada en la tabla de catálogos de reportes si es que aun no se encuentra allí.</li>
</ul>
<p>En la clase <em><strong>Sistema_Reporte_Plantilla</strong></em> definimos los métodos que todo reporte debe tener:</p>
<ul>
<li><strong>Sistema_Reporte_Plantilla</strong></li>
<ul>
<li>getName()<br />
Entrega el nombre del reporte</li>
<li>getDescription()<br />
Entrega la descripcion del reporte</li>
<li>getFormats()<br />
Devuelve una matriz simple con los formatos que este reporte es capaz de generar (pdf, xml, csv)</li>
<li>getParams()<br />
Una matriz con los parametros que el reporte debe recibir</li>
<li>getParamValues(param)<br />
Devuelve una matriz con los valores posibles que un parámetro puede tomar cuando estos no pertenecen a una tabla catalogo.</li>
<li>run(format, params)<br />
Ejecuta el reporte.</li>
</ul>
</ul>
<p>Como ves, varios métodos del reporte son bastante similares a los del servicio. El servicio tan solo va a redireccionar la petición para que el usuario no tenga acceso directo a los reportes.</p>
<p><a href="http://danielzegarra.net/download/12" title="">Descargar Modelo PHP para la administración de reportes</a> <br/> <a href="http://danielzegarra.net/download/13" title="Necesitas de MySQL Workbench para abrir este documento. Puedes obtenerlo de la web de MySQL.">Descargar Modelo de datos para la administración de reportes</a></p>
<p>Ahora, para implementar los formatos, debes implementar metodos como <strong>_runPDF</strong>(<em><strong><span style="color: #333399;">params</span></strong></em>) o <strong>_runXLS</strong>(<em><strong><span style="color: #333399;">params</span></strong></em>) y generar los respectivos documentos. Dale un vistazo al codigo en el metodo <strong>run</strong>() de <strong>Sistema_Reporte_Plantilla</strong> para mas información.</p>
]]></content:encoded>
			<wfw:commentRss>http://danielzegarra.net/2011/12/13/diseno-de-un-administrador-de-reportes/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Trabajar con PHP y Flex en el mismo Framework</title>
		<link>http://danielzegarra.net/2010/11/22/trabajar-con-php-y-flex-en-el-mismo-framework/</link>
		<comments>http://danielzegarra.net/2010/11/22/trabajar-con-php-y-flex-en-el-mismo-framework/#comments</comments>
		<pubDate>Mon, 22 Nov 2010 00:39:24 +0000</pubDate>
		<dc:creator>Daniel Zegarra</dc:creator>
				<category><![CDATA[Adobe]]></category>
		<category><![CDATA[Eclipse]]></category>
		<category><![CDATA[Flash Builder]]></category>
		<category><![CDATA[Flex]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://danielzegarra.net/?p=1372</guid>
		<description><![CDATA[[...]]]></description>
			<content:encoded><![CDATA[<p>Usar PDT 2.0 y Flash Builder 4.1 en el mismo framework es algo muy simple de lograr ya que ambos son plugins de Eclipse.</p>
<p>Los pasos para instalar PDT como plugin en una instalación previa de Eclipse se pueden encontrar <span style="color: #0000ee;"><span style="text-decoration: underline;">aquí</span></span>.</p>
<p><span style="color: #ff0000;"><strong>Advertencia: Flash Builder esta basado sobre la versión 3.4 de Eclipse (alias Ganymede), por lo tanto, se debe usar la versión 2.0 de PDT preparada para esta versión.</strong></span></p>
<p>Segun la wiki de eclipse, estos son los pasos a seguir:</p>
<ol>
<li>Ir al menu Help &gt; Software Updates&#8230; &gt; Available Software &gt; Manage Sites&#8230;</li>
<li>Usando el boton <strong>Add</strong>, agregar la direccion http://download.eclipse.org/technology/dltk/updates-dev/1.0M4-PDT-2.0/</li>
<li>Nuevamente, agrega la direccion http://download.eclipse.org/tools/pdt/updates/2.0/</li>
<li>Presiona el boton Manage Sites y habilita el sitio de actualización de Ganymede (http://download.eclipse.org/releases/ganymede/) si es que no se encuentra habilitado. Los sitios habilitados son los marcados con el check.
<p><div id="attachment_1373" class="wp-caption aligncenter" style="width: 460px"><a href="http://danielzegarra.net/wp-content/uploads/2010/11/screenshot.1.png" rel="lightbox[1372]"><img class="size-medium wp-image-1373" title="Activando el sitio de actualización de Ganymede" src="http://danielzegarra.net/wp-content/uploads/2010/11/screenshot.1-450x310.png" alt="Activando el sitio de actualización de Ganymede" width="450" height="310" /></a><p class="wp-caption-text">Activando el sitio de actualización de Ganymede</p></div></li>
<li>Ahora debes seleccionar que paquetes vas a instalar. Selecciona los siguientes paquetes:<br />
En DLTK / Dynamic Languages Toolkit / Seleccionar <strong>Dynamic Languages Toolkit - Core Frameworks</strong><strong><br />
</strong></p>
<div class="mceTemp mceIEcenter" style="font-weight: bold;">
<dl id="attachment_1375" class="wp-caption aligncenter" style="width: 460px;">
<dt class="wp-caption-dt"><a href="http://danielzegarra.net/wp-content/uploads/2010/11/screenshot.6.png" rel="lightbox[1372]"><img class="size-medium wp-image-1375" title="Seleccionando DLTK Core" src="http://danielzegarra.net/wp-content/uploads/2010/11/screenshot.6-450x305.png" alt="Seleccionando DLTK Core" width="450" height="305" /></a></dt>
<dd class="wp-caption-dd">Seleccionando DLTK Core</dd>
</dl>
</div>
<p><strong><br />
</strong></li>
<li>En PDT Update Site / PDT SDK 2.0.1 / Seleccionar <strong>PDT Runtine Feature
<div id="attachment_1376" class="wp-caption aligncenter" style="width: 460px"><a href="http://danielzegarra.net/wp-content/uploads/2010/11/screenshot.5.png" rel="lightbox[1372]"><img class="size-medium wp-image-1376" title="Seleccionando PDT" src="http://danielzegarra.net/wp-content/uploads/2010/11/screenshot.5-450x305.png" alt="Seleccionando PDT" width="450" height="305" /></a><p class="wp-caption-text">Seleccionando PDT</p></div>
<p></strong><strong><span style="color: #ff0000;">Nota: En las imagenes no tengo seleccionado el paquete descrito porque yo ya lo tengo instalado.</span></strong></li>
<li>Hecho esto, dale un clic en el botón <strong>Install</strong>.</li>
<li>Acepta la condiciones y espera a que termine la instalación. Cuando te pida reiniciar Eclipse lo haces.</li>
</ol>
<p>Suerte en tu proyecto!</p>
<ol></ol>
]]></content:encoded>
			<wfw:commentRss>http://danielzegarra.net/2010/11/22/trabajar-con-php-y-flex-en-el-mismo-framework/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Error del garbage collector en distribuciones Linux que tienen a Debian como base</title>
		<link>http://danielzegarra.net/2010/11/18/error-del-garbage-collector-en-distribuciones-linux-que-tienen-a-debian-como-base/</link>
		<comments>http://danielzegarra.net/2010/11/18/error-del-garbage-collector-en-distribuciones-linux-que-tienen-a-debian-como-base/#comments</comments>
		<pubDate>Thu, 18 Nov 2010 00:25:51 +0000</pubDate>
		<dc:creator>Daniel Zegarra</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://danielzegarra.net/?p=1358</guid>
		<description><![CDATA[[...]]]></description>
			<content:encoded><![CDATA[<p>Hay un bug inquietante en la instalación por defecto de PHP sobre servidores Debian y distribuciones que parten de él (como Ubuntu). Aparentemente el error aparece de forma aleatoria y con el siguiente mensaje:</p>
<p>session_start() [function.session-start]: ps_files_cleanup_dir: opendir(/var/lib/php5) failed: Permission denied (13)</p>
<p>Si vuelves a ejecutar refrescar la página el error ya no aparece. Con el tiempo llega a ser desesperante <img src='http://danielzegarra.net/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /><br />
Bueno, si tu te has encontrado mas de una vez con este insecto te explico porque este error se dispara y como solucionarlo.</p>
<p>Las sesiones de php son datos asociados a un cliente que visita el servidor. Cuando un visitante se conecta por primera vez al servidor este le asigna un codigo para identificar al mismo cliente durante su visita. El cliente entrega este codigo en cada comunicacion de tal forma que el servidor pueda reconocer al visitante y a su vez asociar informacion adicional a este codigo sin que el cliente lo sepa. Para entenderlo mas facilmente, el servidor le asigna al visitante un casillero numerado y le entrega el numero de la llave para reconocerlo mas tarde.<br />
En servidores web de produccion, que pueden tener miles de visitantes en tan solo unos minutos, almacenar los codigos de sesion en memoria resulta una mala idea, por lo que almacena todos estos codigos en el disco duro (quedando los mas nuevos o mas utilizados en la RAM del servidor).<br />
Cuando un visitante deja de comunicarse con el servidor por un largo tiempo, el servidor entiende que ese visitante ya se ha retirado y procede a anular su sesion, pero la informacion asociada a esta aun queda en el disco duro. PHP esta configurado para depurar regularmente las sesiones inactivas y asi no llenar el disco duro de basura.<br />
El problema aparece aqui. En los servidores Debian las sesiones son almacenadas en un directorio con permisos restringidos y estas son depuradas por el cron del sistema. Entonces, cuando PHP intenta realizar la depuracion se produce un error debido a que PHP no tiene los permisos suficientes sobre el directorio de sesiones.</p>
<p>La solucion es muy simple: Decirle a PHP que no depure las sesiones. Dejar que cron lo haga.<br />
Para esto abre y modifica la siguiente linea en el archivo de configuracion de PHP (php.ini). En Ubuntu lo puedes encontrar usualmente en /etc/php5/apache2/php.ini. (no olvides abrirlo con permiso de escritura).</p>
<p>$config['gc_probability'] = 1;</p>
<p>No recuerdo el numero de linea ahora. Debe estar ubicado en la seccion de parametros de configuracion de sesiones.<br />
Cambia el valor de <strong>gc_probability</strong> a 0 para que PHP nunca depure las sesiones olvidadas.</p>
<p>Guardar los cambios, reinicias apache y listo.</p>
<p>La solucion fue hallada gracias a este hilo de discusión:<br />
<a href="http://forum.kohanaframework.org/discussion/565/garbage-collector-error-with-sessions-on-debian/p1">http://forum.kohanaframework.org/discussion/565/garbage-collector-error-with-sessions-on-debian/p1</a></p>
]]></content:encoded>
			<wfw:commentRss>http://danielzegarra.net/2010/11/18/error-del-garbage-collector-en-distribuciones-linux-que-tienen-a-debian-como-base/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Depurar Code Igniter con Eclipse y Zend Debugger</title>
		<link>http://danielzegarra.net/2010/11/18/depurar-code-igniter-con-eclipse-y-zend-debugger/</link>
		<comments>http://danielzegarra.net/2010/11/18/depurar-code-igniter-con-eclipse-y-zend-debugger/#comments</comments>
		<pubDate>Wed, 17 Nov 2010 23:45:10 +0000</pubDate>
		<dc:creator>Daniel Zegarra</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Soluciones]]></category>
		<category><![CDATA[Tutoriales]]></category>
		<category><![CDATA[CI]]></category>
		<category><![CDATA[Code Igniter]]></category>
		<category><![CDATA[Debug]]></category>
		<category><![CDATA[Eclipse]]></category>
		<category><![CDATA[hook]]></category>
		<category><![CDATA[hooks]]></category>
		<category><![CDATA[PDT]]></category>
		<category><![CDATA[Zend]]></category>
		<category><![CDATA[Zend Debugger]]></category>

		<guid isPermaLink="false">http://danielzegarra.net/?p=1356</guid>
		<description><![CDATA[[...]]]></description>
			<content:encoded><![CDATA[<p>Sin hacer cambios a Code Igniter no se puede. Aun si <code>enable_query_strings</code> esta definido en FALSE Code Igniter leera las variables que PDT pasa usando GET para que Zend Debugger conecte correctamente a la consola. Es una tonteria que Eclipse no nos permita NO pasar estas variables via GET. La solucion mas rapida pero no permanente es abrir el sitio que deseamos depurar en un browser aparte luego de tener a Eclipse esperando la conexion del depurador, pero es una salida molesta.</p>
<p>Lo que hice fue decirle a Code Igniter que ignore ciertas variables entregadas via GET aprovechando los Hooks para no tocar el codigo base de CI.</p>
<p>Para usar este hook sigue estos pasos:</p>
<ol>
<li>Descarga <a href="http://danielzegarra.net/download/10">este archivo</a> y guardalo en tu escritorio.</li>
<li>Descomprime el contenido del archivo en el directorio <em><strong>application </strong></em>de tu instalacion de CI. Si ya tienes registrado algun hook entonces no reemplaces el archivo config/hooks.php. Agrega el contenido del archivo descargado tu archivo hooks.php actual.</li>
<li>Asegurate que <code>enable_hooks</code> es igual a TRUE en el archivo config.php ubicado en CIroot/application/config/.</li>
</ol>
<p>Luego de hacer esto, intenta depurar tu aplicacion. Deberia correr sin problemas y ya no mostrar el error de que no se encuentra el controlador.</p>
<p><span style="color: #993300;">Nota: La intencion de este articulo es solo compartir un archivo fuente para utilizar Zend Debugger con CI. Para informacion de la instalacion de Zend Debugger o su uso con Eclipse PDT  puedes&#8230; googlear. </span></p>
<a href="http://danielzegarra.net/download/10" title="Hook para usar Zend Debugger con Code Igniter">Descargar ZendDebugger&CI Hook</a>
]]></content:encoded>
			<wfw:commentRss>http://danielzegarra.net/2010/11/18/depurar-code-igniter-con-eclipse-y-zend-debugger/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Nace Kopernik, un sistema académico</title>
		<link>http://danielzegarra.net/2010/08/14/nace-kopernik-un-sistema-academico/</link>
		<comments>http://danielzegarra.net/2010/08/14/nace-kopernik-un-sistema-academico/#comments</comments>
		<pubDate>Fri, 13 Aug 2010 23:14:07 +0000</pubDate>
		<dc:creator>Daniel Zegarra</dc:creator>
				<category><![CDATA[AMF]]></category>
		<category><![CDATA[AS3]]></category>
		<category><![CDATA[Flex]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Proyectos]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[Copernico]]></category>
		<category><![CDATA[Flex 4]]></category>
		<category><![CDATA[Kopernik]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[Zend AMF]]></category>
		<category><![CDATA[Zend Framework]]></category>
		<category><![CDATA[ZF]]></category>

		<guid isPermaLink="false">http://danielzegarra.net/?p=1308</guid>
		<description><![CDATA[[...]]]></description>
			<content:encoded><![CDATA[<p><a title="Nicolas Copernico en Wikipedia" href="http://es.wikipedia.org/wiki/Nicol%C3%A1s_Cop%C3%A9rnico" target="_blank">Kopernik</a> es el nombre clave del proyecto personal al que he dedicado mi tiempo estos ultimos 4 meses. Se trata de un sistema academico online desarrollado usando Flex, PHP (Zend Framework) y MySQL para su uso en instituciones educativas.</p>
<div id="attachment_1314" class="wp-caption aligncenter" style="width: 399px"><a href="http://danielzegarra.net/wp-content/uploads/2010/08/logo_kopernik.png" rel="lightbox[1308]"><img class="size-full wp-image-1314    " title="Logo de Kopernik" src="http://danielzegarra.net/wp-content/uploads/2010/08/logo_kopernik.png" alt="Logo de Kopernik" width="389" height="256" /></a><p class="wp-caption-text">Logo de Kopernik. La idea era que el sistema sea usado por escolares y por lo tanto, no debia ser tan serio.</p></div>
<p>Aprovechando la experiencia que adquiri trabajando y estudiando en universidades decidi crear desde cero un sistema que se ajustara a los requerimientos especiales que cada institucion pudiera tener. Como recien estaba empezando pense que mejor seria comenzar con modulos para colegios pero&#8230; resulta que he olvide como funcionan!</p>
<p>Cuando estaba en el colegio no pensaba en procesos y en maneras de como mejorarlos como lo hago ahora. Por eso es que los modulos que ya he creado almacenan datos como el valor en creditos de cada asignatura o que permiten a un alumno matricularse en asignaturas distintas que el resto de sus companeros. De hecho el proceso que los administradores deben realizar para matricular de un alumno esta pensado usando los requerimientos universitarios o de institutos.</p>
<p>En los colegios todos los alumnos llevan lo mismo. Solo hay dos opciones:</p>
<ul>
<li>No te matriculas un año o&#8230;</li>
<li>Estas matriculado y llevas todas las asignaturas de tu año (con algunas excepciones como no asistir al curso de religion por solicitud de los padres).</li>
</ul>
<p>Es algo en lo que hay que trabajar.</p>
<p>Por el momento me quedan algunos modulos importantes por desarrollar, como el control de evaluaciones, asistencias y materiales de clase.</p>
<p>A continuacion explico algunos detalles del software y al final puedes encontrar un enlace para que lo puedas ver en accion.</p>
<h2>Caracteristicas generales</h2>
<ul>
<li>Es modular, de tal forma que sea facil reutilizar los modulos comunes y adecuarlos a lo que necesite.</li>
<li>Permite el trabajo colaborativo (tiempo real).</li>
<li>Solo hace uso del puerto 80. No es necesario habilitar la salida puertos adicionales en una red controlada.</li>
<li>El cliente solo necesita tener Adobe Flash instalado.</li>
<li>No requiere de licencias adicionales.</li>
<li>Es multiplataforma. Corre en Windows, Mac, Linux y cualquier otro sistema operativo que tenga soporte para Adobe Flash (talvez Android?)</li>
<li>Es multitarea. Las aplicaciones y modulos son cargados dentro de contenedores visibles como ventanas. Por lo tanto, no es necesario salir de un modulo para entrar a otro. Puedes tener varios modulos abiertos al mismo tiempo compartiendo el escritorio visible o minimizar algunos de ellos para usarlos luego.</li>
<li>Al instalarlo en un servidor web con un IP publico es accesible desde cualquier parte del mundo.</li>
<li>Control de acceso, a modulos y acciones, por grupos de usuarios. Se define que grupos tienen acceso a que modulos y las operaciones que realizan estos.</li>
<li>El sistema cuenta con algunas herramientas como el administrador de tareas <em>(clic secundario sobre el fondo)</em> y un explorador de directorios (del servidor).</li>
</ul>
<div id="attachment_1321" class="wp-caption aligncenter" style="width: 460px"><a href="http://danielzegarra.net/wp-content/uploads/2010/08/kopernik_apps.png" rel="lightbox[1308]"><img class="size-medium wp-image-1321" title="Tres aplicaciones abiertas: el explorador de alumnos, el explorador de archivos y el administrador de tareas" src="http://danielzegarra.net/wp-content/uploads/2010/08/kopernik_apps-450x265.png" alt="Tres aplicaciones abiertas: el explorador de alumnos, el explorador de archivos y el administrador de tareas" width="450" height="265" /></a><p class="wp-caption-text">Tres aplicaciones abiertas: el explorador de alumnos, el explorador de archivos y el administrador de tareas</p></div>
<h2>Tecnologias usadas</h2>
<ul>
<li>Flex 4: Empece el proyecto con la version 3 pero las nuevas caracteristicas (en especial la capacidad de trabajar con archivos localmente y el skining) resultaron muy tentadoras y tuve que hacer la migracion ya casi a mitad del proyecto (y acepto que no fue una decision muy inteligente. Me retraso todo el calendario pero espero haya valido la pena).</li>
<li>Zend Framework: Elegi este framework por la empresa que hay detras (Zend creadora de PHP) y por que ya me encuentro familiarizado con el. Ademas podia usar el paquete Zend_Amf para conectar Flex con el servidor. Tuve que migrar desde AMFPHP por lo que perdi el explorador de servicios y el control de acceso en cada clase. Realmente fue una migracion dura porque las clases del sistema (no academicas) ya estaban empezadas y funcionaban perfecto con AMFPHP. La gran ventaja de usar Zend_Amf es que tienes a tu disposicion todo el framework de Zend y ademas es el unico soporte para AMF que tiene la venia de Adobe sin ser desarrollado por Adobe (y la version actual de AMFPHP se encontraba abandonada en una version beta).</li>
<li>PHP: Como es obvio, por ser un lenguaje fantastico y porque casi todo servidor Apache lo tiene instalado.</li>
<li>MySQL: Necesitaba una base de datos transaccional y confiable. Que mejor que MySQL usada en la mayoria de servicios de hosting.</li>
</ul>
<h2>Requisitos</h2>
<ul>
<li>Del lado del cliente
<ul>
<li>Flash Player 10.0.0 o una version mayor.</li>
</ul>
</li>
<li>Del lado del servidor
<ul>
<li>PHP 5.2</li>
<li>Apache</li>
<li>MySQL</li>
</ul>
</li>
</ul>
<h2>Acceso a la demo</h2>
<p>Antes de ingresar por favor, lee las siguientes instrucciones:</p>
<ul>
<li>Los datos de acceso se encuentran pre-escritos en los campos de texto, solo es cuestion de logearse.</li>
<li>El usuario de prueba pertenece al grupo de administradores, por lo que tendras acceso sin restriccion sobre los modulos y acciones que puedan estos realizar. Ten cuidado de eliminar aplicaciones, volver a registrarlas te puede resultar complicado si no sabes donde se encuentran almacenadas.</li>
<li>La falta de acentos se debe a que uso en teclado en ingles. Lo corregire muy pronto. Las fallas ortograficas se deben a mi falta de atencion a las clases de lengua (junto con la eficiencia del corrector ortografico de Word). Cuando tenga tiempo aplicare las correcciones necesarias.</li>
<li>La primera vez que cada aplicacion es solicitada puede demorarse unos segundos en cargarse (dependiendo de tu velocidad de salida a Internet). La aplicacion queda almacenada en la cache de tu navegador y es cargada de alli en las solicitudes posteriores.</li>
<li>Y por ultimo, te recuerdo que esta es una version en desarrollo y por ello puede tener errores. Si encuentras alguno, por favor ayudame a corregirlo comentandolo en este post. Gracias.</li>
</ul>
<p>Eso es todo. La direccion de acceso es la siguiente: <span style="font-size: 16;"><a title="Abrir Kopernik" href="http://kopernik.danielzegarra.net/" target="_blank">http://kopernik.danielzegarra.net/.</a></span> Espero tus comentarios.</p>
]]></content:encoded>
			<wfw:commentRss>http://danielzegarra.net/2010/08/14/nace-kopernik-un-sistema-academico/feed/</wfw:commentRss>
		<slash:comments>15</slash:comments>
		</item>
		<item>
		<title>Transfiriendo valores NaN entre Zend AMF y Flex</title>
		<link>http://danielzegarra.net/2010/05/26/transfiriendo-valores-nan-entre-zend-amf-y-flex/</link>
		<comments>http://danielzegarra.net/2010/05/26/transfiriendo-valores-nan-entre-zend-amf-y-flex/#comments</comments>
		<pubDate>Wed, 26 May 2010 20:45:11 +0000</pubDate>
		<dc:creator>Daniel Zegarra</dc:creator>
				<category><![CDATA[AMF]]></category>
		<category><![CDATA[AS3]]></category>
		<category><![CDATA[Flex]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Zend AMF]]></category>

		<guid isPermaLink="false">http://danielzegarra.net/?p=1170</guid>
		<description><![CDATA[[...]]]></description>
			<content:encoded><![CDATA[<p>Hay una discrepancia entre AS3 y PHP aun no solucionada por Zend AMF que puede llevar a un error no esperado cuando se trabajan con valores numericos. El problema consiste en que para PHP una variable es nula si <code>null</code>, sin embargo para AS3 el valor nulo de una variable depende de su tipo. Especificamente para las variables de tipo Number este valor es <a title="Number - Adobe® Flex™ 3.5 Language Reference" href="http://livedocs.adobe.com/flex/3/langref/Number.html#NaN" target="_blank"><code>NaN</code></a>.</p>
<p>Cuando Zend AMF devuelve una clase con variables nulas AS3 lo recibe asi, pero para AS3 las variables Number no pueden ser <code>null</code> y para salir de este problema convierte el <code>null</code> en 0 (cero). Y es asi como terminas teniendo variables con valores en cero en lugar del esperado <code>NaN</code>.</p>
<p>La manera mas facil de arreglarlo es hacerle un puente al problema utilizando setters para recibir el valor entregado por el servidor, validarlo y decidir si es un aceptarlo o no.</p>
<p>Se puede entender mejor viendo el siguiente ejemplo:</p>
<pre class="brush: as3; title: ; notranslate">
package DTO{
	[RemoteClass(alias=&quot;claseDTO&quot;)]
	[Bindable]
	public class claseDTO{
		/**
		 * Solo se tiene acceso a esta variable a travez de su getter/setter
		 */
		private var _numero:Number;

		/*
		 * Definiendo el getter/setter para la variable privada _numero.
		 * Recordar que Number es una subclase de Object.
		 */
		public function get numero():Object{
			return _numero;
		}
		public function set numero(val:Object):void{
			//Si el valor dado es un numero
			if(val is Number)
				_numero = val as Number;
		}

	}
}
</pre>
<p>Los comentarios son bienvenidos.</p>
]]></content:encoded>
			<wfw:commentRss>http://danielzegarra.net/2010/05/26/transfiriendo-valores-nan-entre-zend-amf-y-flex/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Decidirse entre Zend AMF, AMFPHP, WebORB, &#8230;</title>
		<link>http://danielzegarra.net/2010/05/21/decidirse-entre-zend-amf-amfphp-weborb/</link>
		<comments>http://danielzegarra.net/2010/05/21/decidirse-entre-zend-amf-amfphp-weborb/#comments</comments>
		<pubDate>Fri, 21 May 2010 12:13:52 +0000</pubDate>
		<dc:creator>Daniel Zegarra</dc:creator>
				<category><![CDATA[AMF]]></category>
		<category><![CDATA[AS2]]></category>
		<category><![CDATA[AS3]]></category>
		<category><![CDATA[Flex]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Tutoriales]]></category>
		<category><![CDATA[AMFPHP]]></category>
		<category><![CDATA[WebORB]]></category>
		<category><![CDATA[Zend AMF]]></category>
		<category><![CDATA[ZendFramework]]></category>

		<guid isPermaLink="false">http://danielzegarra.net/?p=1166</guid>
		<description><![CDATA[[...]]]></description>
			<content:encoded><![CDATA[<p>Para mi, decidir que framework usar para conectar una aplicacion Flex/Flash con un servidor PHP es todo un dilema debido a que mi eleccion influrira mucho en mi calendario de trabajo. Supongo a muchos les  pasara que se familiarizan con un pequeño grupo de lenguajes y/o  frameworks y lo utiliza en todo proyecto que crea conveniente. Asi era yo con AMFPHP, el primer gateway AMF que conoci alla cuando Flash 8 era el ultimo lanzamiento de Macromedia.</p>
<p>En si tenemos tres o cuatro candidatos potenciales y estos son: <a href="http://zendframework.com/download/amf">Zend AMF</a>,  <a href="http://www.amfphp.org/">AMFPHP</a> y <a href="http://www.themidnightcoders.com/products/weborb-for-php/overview.html">WebORB</a>. A continuacion comento las caracteristicas de cada uno.</p>
<p><a href="http://www.amfphp.org/">AMFPHP </a>es creo, sin lugar a dudas, la mejor alternativa si deseas conectar tu aplicacion Flex o Flash con un servidor PHP (y este a su vez con la BD) y no deseas tener que pasar por una larga curva de aprendizaje. AMFPHP es ligero, incluye una gestion de roles bastante simple, no es necesaria su instalacion, soporta mapeo de clases (VOs) y por ultimo, incluye un navegador de servicios para que puedas probar los mismos rapidamente. Ademas, soporta AMF0 y AMF3 (por si usas AS2 o AS3) de forma transparente. Ademas, viene preparado para comsumir Web services. Entre sus desventajas estaba la falta de soporte. La persona detras del proyecto lo abandono dejandolo en una version beta (y sin la nueva documentacion completa) durante un par de años  pero recientemente su desarrollo <a href="http://wadearnold.com/blog/flash/amfphp/passing-the-amfphp-torch" target="_blank">acaba de ser retomado</a> y gracias a ello, se acaba de lanzar, por fin, la version 1.9 oficial.</p>
<p>El siguente es <a href="http://zendframework.com/download/amf">Zend AMF</a>, desarrollado por <a href="http://www.zend.com">Zend </a>(la empresa detras de PHP) es el mas apoyado de todas las alternativas debido a que tiene la venia de Adobe y, obviamente, es desarrollado por Zend. A pesar de esto, carece de  caracteristicas que AMFPHP o WebORB ya ofrecen (como seguridad integrada y un navegador de servicios) obligandote a implementarlas tu mismo o, lo que es mas facil, a vivir sin ellas. Pero su gran ventaja es que al ser una parte de Zend Framework (aunque se puede descargar de manera independiente) se acopla perfectamente a su arsenal de herramientas lo que es muy util, creeme. Hoy acabo de enterarme que el problema de la <a title="ZendAMF serialization slow?" href="http://framework.zend.com/issues/browse/ZF-7493" target="_blank">lenta serializacion de datos </a>que Zend AMF tenia en versiones anteriores acaba de ser solucionada de manera oficial en la version 1.10.4.</p>
<p>El tercero es <a href="http://www.themidnightcoders.com/products/weborb-for-php/overview.html">WebORB</a>. Si tuviera que definirlo en una sola palabra esa seria &#8220;Completo&#8221;. Tiene tantas caracteristicas que impresiona. Un administrador de servicios decente junto con opciones pensadas para ahorrarle al desarrollador la necesidad de escribir codigo, incluye su propio administrador de acceso a servicios y metodos ademas de un administrador centralizado para el mapeo de clases. Sin lugar a dudas es el que ofrece mas opciones a simple vista. El problema de WebORB es justo eso, ofrece tantas opciones que pueden confundir al novato, darle una sensacion de demasiada complejidad.</p>
<p>Escribo este post porque hace poco he pasado de AMFPHP a Zend AMF. Me costo hacer la mudanza debido a que tenia muchas clases que recibian matrices asociativas como parametros (AMFPHP mapeaba los objetos de Flash en arrays asociativos y Zend AMF lo hace como objetos) y basaba casi toda la implementacion de seguridad en el metodo <a href="http://www.joshuaostrom.com/2008/06/03/securing-amfphp-19-via-authentication/">beforeFilter </a>de cada clase/servicio.</p>
]]></content:encoded>
			<wfw:commentRss>http://danielzegarra.net/2010/05/21/decidirse-entre-zend-amf-amfphp-weborb/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>La directiva date.timezone de PHP</title>
		<link>http://danielzegarra.net/2010/03/14/la-directiva-date-timezone-de-php/</link>
		<comments>http://danielzegarra.net/2010/03/14/la-directiva-date-timezone-de-php/#comments</comments>
		<pubDate>Sun, 14 Mar 2010 13:10:22 +0000</pubDate>
		<dc:creator>Daniel Zegarra</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[AMFPHP]]></category>
		<category><![CDATA[Zend Server]]></category>

		<guid isPermaLink="false">http://danielzegarra.net/2010/03/14/la-directiva-date-timezone-de-php/</guid>
		<description><![CDATA[[...]]]></description>
			<content:encoded><![CDATA[<p>Ya había <a href="http://danielzegarra.net/2010/01/17/default-timezone-en-php-ini/">publicado un post</a> acerca de el error que provoca no definir esta variable en PHP. Me doy cuenta ahora que la instalación por defecto de <strong>Zend Server</strong> no define este variable lo que hace que AMFPHP 1.9 no funcione adecuadamente.</p>
<div id="attachment_1111" class="wp-caption aligncenter" style="width: 431px"><a href="http://danielzegarra.net/wp-content/uploads/2010/03/errorAMFPHP.jpg" rel="lightbox[1115]"><img src="http://danielzegarra.net/wp-content/uploads/2010/03/errorAMFPHP.jpg" alt="Error que devuelve el browser de servicios de AMFPHP" title="Error que devuelve el browser de servicios de AMFPHP" width="421" height="321" class="size-full wp-image-1111" /></a><p class="wp-caption-text">Error que devuelve el browser de servicios de AMFPHP</p></div>
<p>La solución con Zend Server es bastante simple. Tan solo te diriges a las directivas de configuración y defines un valor para el parámetro <code>date.timezone</code> bajo la categoría <code>date</code>. Como dije antes, los valores posibles están publicados en <a title="http://pl2.php.net/manual/en/timezones.php" href="http://pl2.php.net/manual/en/timezones.php">http://pl2.php.net/manual/en/timezones.php</a>.</p>
<div id="attachment_1113" class="wp-caption aligncenter" style="width: 460px"><a href="http://danielzegarra.net/wp-content/uploads/2010/03/config.jpg" rel="lightbox[1115]"><img src="http://danielzegarra.net/wp-content/uploads/2010/03/config-450x306.jpg" alt="Modificando la configuracion de PHP usando la administracion de Zend Server" title="Modificando la configuracion de PHP usando la administracion de Zend Server" width="450" height="306" class="size-medium wp-image-1113" /></a><p class="wp-caption-text">Modificando la configuracion de PHP usando la administracion de Zend Server</p></div>
]]></content:encoded>
			<wfw:commentRss>http://danielzegarra.net/2010/03/14/la-directiva-date-timezone-de-php/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>AMFPHP 1.9 y la llegada de PHP 5.3</title>
		<link>http://danielzegarra.net/2010/01/17/amfphp-1-9-y-la-llegada-de-php-5-3/</link>
		<comments>http://danielzegarra.net/2010/01/17/amfphp-1-9-y-la-llegada-de-php-5-3/#comments</comments>
		<pubDate>Sun, 17 Jan 2010 21:24:56 +0000</pubDate>
		<dc:creator>Daniel Zegarra</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[AMFPHP]]></category>

		<guid isPermaLink="false">http://danielzegarra.net/?p=1034</guid>
		<description><![CDATA[[...]]]></description>
			<content:encoded><![CDATA[<p>Con la llegada de PHP 5.3 el metodo <code>ereg_replace()</code> queda obsoleto y  apartir de PHP 6 sera retirado.</p>
<p>En su reemplazo recomiendo usar el metodo <code>preg_replace()</code>.</p>
<p>Para continuar usando AMFPHP 1.9 con normalidad, en el fichero <code>MethodTable.php</code> ubicado en la ruta de directorios <code>\core\shared\util\</code> de los archivos base de AMFPHP se deben reemplazar el contenido actual de las siguientes lineas:</p>
<pre class="brush: php; first-line: 505; title: ; toolbar: false; notranslate">
$comment = preg_replace(&quot;\n[ \t]&quot;, &quot;\n&quot;, trim($comment));
</pre>
<pre class="brush: php; first-line: 507; title: ; toolbar: false; notranslate">
$comment = preg_replace(&quot;[\t ]&quot;, &quot; &quot;, trim($comment));
</pre>
<p><strong>Informacion adicional</strong><br />
<a title="Metodo ereg_replace()" href="http://www.php.net/manual/en/function.ereg-replace.php" target="_blank">Metodo<strong> ereg-replace()</strong> en php.net</a><br />
<a title="Metodo preg_replace()" href="http://www.php.net/manual/en/function.preg-replace.php" target="_blank">Metodo <strong>preg-replace()</strong> en php.net</a></p>
]]></content:encoded>
			<wfw:commentRss>http://danielzegarra.net/2010/01/17/amfphp-1-9-y-la-llegada-de-php-5-3/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Default timezone en php.ini</title>
		<link>http://danielzegarra.net/2010/01/17/default-timezone-en-php-ini/</link>
		<comments>http://danielzegarra.net/2010/01/17/default-timezone-en-php-ini/#comments</comments>
		<pubDate>Sun, 17 Jan 2010 21:03:12 +0000</pubDate>
		<dc:creator>Daniel Zegarra</dc:creator>
				<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://danielzegarra.net/?p=1032</guid>
		<description><![CDATA[[...]]]></description>
			<content:encoded><![CDATA[<p>La ultima version de XAMPP (en formato no instalable) puede no tener definido el parametro <code>date.timezone</code> lo que puede lanzar errores de tipo <code>E_WARNING</code> no dejando correr adecuadamente nuestro script.</p>
<p>El parametro se puede definir en la linea 1018 del archivo de configuracion <code>php.ini</code>. Los valores posibles se pueden encontrar en <a title="timezone PHP" href="http://pl2.php.net/manual/en/timezones.php" target="_blank">pl2.php.net/manual/en/timezones.php</a> .</p>
<p>Nota: XAMPP cuenta con el archivo <code>setup_xampp.bat</code> que completa basicamente su configuracion con algunas simples preguntas hechas al usuario.</p>
]]></content:encoded>
			<wfw:commentRss>http://danielzegarra.net/2010/01/17/default-timezone-en-php-ini/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Las VM2 y VM1 de Flash Player mantienen sesiones HTTP</title>
		<link>http://danielzegarra.net/2009/03/09/las-vm2-y-vm1-de-flash-player-mantienen-sesiones-http/</link>
		<comments>http://danielzegarra.net/2009/03/09/las-vm2-y-vm1-de-flash-player-mantienen-sesiones-http/#comments</comments>
		<pubDate>Mon, 09 Mar 2009 21:58:26 +0000</pubDate>
		<dc:creator>Daniel Zegarra</dc:creator>
				<category><![CDATA[Flash]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[AMFPHP]]></category>
		<category><![CDATA[AS2]]></category>
		<category><![CDATA[AS3]]></category>
		<category><![CDATA[VM1]]></category>
		<category><![CDATA[VM2]]></category>

		<guid isPermaLink="false">http://www.danielzegarra.net/?p=625</guid>
		<description><![CDATA[[...]]]></description>
			<content:encoded><![CDATA[<p>Tal vez era obvio para alguien que sabe del tema pero yo quería demostrarlo.</p>
<p>Dejo los archivos de ejemplo: <a href="http://danielzegarra.net/download/3" title="Si bien esto era obvio, aquí hay una demostracion usando AMFPHP.">Descargar Compartiendo sesiones HTTP entre VM1 y VM2 de Flash Player</a></p>
<p>Nota: Esto es la continuacion de un <a href="http://www.danielzegarra.net/2009/03/09/investigar-antes/">post pasado</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://danielzegarra.net/2009/03/09/las-vm2-y-vm1-de-flash-player-mantienen-sesiones-http/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Compatibilizando AMFPHP1.9beta2 con Zend Framework</title>
		<link>http://danielzegarra.net/2009/01/27/compatibilizando-amfphp-19beta2-con-zend-framework/</link>
		<comments>http://danielzegarra.net/2009/01/27/compatibilizando-amfphp-19beta2-con-zend-framework/#comments</comments>
		<pubDate>Tue, 27 Jan 2009 22:37:53 +0000</pubDate>
		<dc:creator>Daniel Zegarra</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Tutoriales]]></category>
		<category><![CDATA[AMFPHP]]></category>
		<category><![CDATA[ZendFramework]]></category>

		<guid isPermaLink="false">http://danielzegarra.net/?p=570</guid>
		<description><![CDATA[[...]]]></description>
			<content:encoded><![CDATA[<p>La verdad es simple.</p>
<p>Primero, incluir el directorio donde se encuentra los archivos de Zend Framework entre las rutas a cargar archivos por defecto. Esto puede hacerse de dos formar:</p>
<ul>
<li>Definiendolo en php.ini<br />
La clave a cambiar tiene el nombre de include_path. Esta es una cadena con rutas separadas por un caracter especial. Este puede diferir de acuerdo al SO siendo los dos puntos &#8220;:&#8221; para Linux o la barra oblicua &#8220;\&#8221; para Windows.</li>
<li>Agregando la siguiente línea en globals.php
<pre class="brush: php; title: ; notranslate">
//El siguiente método define un directorio más a la lista de
//rutas por defecto al usar include o require
//Cambia ZendLibrary por el directorio donde tengas la libreria.
//Ejm: /../../ZendLib
set_include_path( realpath(dirname(__FILE__)) . '/ZendLibrary'
. PATH_SEPARATOR . get_include_path() );
</pre>
</li>
</ul>
<p>Luego, agregar un par de líneas al bootstrap de AMFPHP para que cargue la clase Zend_Loader y asi nuestros servicios puedan usar otras clases/servicios sin tener que cargarlos al inicio (Y asi te ahorras de estar escribiendo tanto require_once).</p>
<p>Agrega las siguientes líneas al final del archivo globals.php</p>
<pre class="brush: php; title: ; notranslate">
include 'Zend/Loader.php';
Zend_Loader::registerAutoload();
</pre>
<p>Por ultimo, debes configurar AMFPHP para que convierta los puntos que describen las rutas de tus clases en undelines (_). Zend Framework incluye en los nombres de sus clases la ruta completa donde esta se encuentra y mantenendo el nombre estandar como nombre de archivo.</p>
<p>Esto evita la redundancia de clases (al menos hasta que lleguen los <a title="PHP.net" href="http://www.php.net/manual/es/language.namespaces.php" target="_blank">namespaces </a>con php 5.3) y te sirve para que Zend_Loader pueda cargar las clases de forma dinámica.</p>
<p>Normalmente AMFPHP convierte los puntos en barras diagonales &#8220;/&#8221; y el ultimo elemento lo toma como nombre del servicio/clase. Hay que hacer que como nombre de la clase use la ruta completa pero cambiando las barras diagonales por underlines. Para esto debes cambiar una sola linea de codigo en el archivo core\amf\app\Actions.php ubicado en tu instalacion de AMFPHP. Te recomiendo hacer una copia de este mismo antes de realizar un cambio.</p>
<pre class="brush: php; title: ; notranslate">
//Linea 122 (aproximadamente)
//Esto hará que el nombre de la clase sea ahora la ruta
//completa con guiones bajos mas el nombre del servicio
$classname = str_replace('.', '_', $trunced);
</pre>
<p>Eso es todo. No te olvides de recodificar los nombres de tus clases si es que ya has empezado algunas. Asi mismo, si tus clases usaban a su vez otras, tambien debes actualizar estas llamadas o tu script se detendrá sin entregar error alguno a flash.</p>
<p>Aqui tienes un servicio de prueba y el código en AS2 y AS3 para probarlo.</p>
<p>PHP service:</p>
<pre class="brush: php; title: ; notranslate">
class System_Prueba {
public function test(){
return 'Prueba exitosa';
}
}
</pre>
<p>ActionScript 2:</p>
<pre class="brush: java; title: ; notranslate">
import mx.remoting.*;
import mx.rpc.*;
var service = new Service('http://testserver/amfphp/gateway.php'
, null, 'System.Prueba');
var pc:PendingCall = service.test();
pc.responder = new RelayResponder(this, 'onRespond', 'onFault');
function onRespond(re:ResultEvent){
trace(re.result);
}
function onFault(fault:FaultEvent){
trace('Error');
}
</pre>
<p>ActionScript 3:</p>
<pre class="brush: java; title: ; notranslate">
import flash.net.*;
var rs:NetConnection = new NetConnection();
rs.connect('http://testserver/amfphp/gateway.php');
rs.call('System.Prueba.test', new Responder(onRespond, onFault));
function onRespond(re:Object){
trace(re);
}
function onFault(fault:Object){
trace('Error: '+fault.description);
}
</pre>
<hr /><strong><span style="color: #ff0000;">Actualización:</span></strong> Encuentro<a href="http://phpsenior.blogspot.com/" target="_blank"> </a>en el blog de <a href="http://phpsenior.blogspot.com/" target="_blank">Enrique Place</a> el aviso de un cambio importante con el uso de la clase Zend_Loader en la última versión de ZendFramework 1.8 y futuras versiones. Es una buena idea revisar <a href="http://phpsenior.blogspot.com/2009/05/por-actualizar-apurado-de-zf-17-18.html" target="_blank">este post</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://danielzegarra.net/2009/01/27/compatibilizando-amfphp-19beta2-con-zend-framework/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Primeros pasos con AMF y Zend Framework</title>
		<link>http://danielzegarra.net/2008/12/31/primeros-pasos-con-amf-y-zendframework/</link>
		<comments>http://danielzegarra.net/2008/12/31/primeros-pasos-con-amf-y-zendframework/#comments</comments>
		<pubDate>Wed, 31 Dec 2008 10:12:51 +0000</pubDate>
		<dc:creator>Daniel Zegarra</dc:creator>
				<category><![CDATA[Adobe]]></category>
		<category><![CDATA[AS3]]></category>
		<category><![CDATA[Flash]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Tutoriales]]></category>
		<category><![CDATA[AMF]]></category>
		<category><![CDATA[ZendFramework]]></category>

		<guid isPermaLink="false">http://danielzegarra.net/?p=493</guid>
		<description><![CDATA[[...]]]></description>
			<content:encoded><![CDATA[<p>Ahora que estoy de vacas tuve tiempo para leer la documentacion del framework de Zend para su PHP y esta bueno. </p>
<p>Decidi aprenderlo de una vez y empezar a usarlo en mis proyectos. </p>
<p>Una de las primeras cosas que busqué fue su compatibilidad con AMF puesto que estoy acostumbrado a usar AMFPHP para casi todo. Zend Framework viene con clases para trabajar con AMF y son clases muy buenas. </p>
<p>En 15 minutos arme mi gateway AMF en PHP con tan solo 7 lineas de codigo y cree un flash simple para probar mi servidor. </p>
<p>A este servidor solo le falta agregarle la autenticación y Zend Framework trae clases para eso tambien. </p>
<p>Puedes descargarte el Gateway + Service y Flash de ejemplo en el siguiente enlace.</p>
<a href="http://danielzegarra.net/download/1" title="Gateway AMF simple  creado usando ZendFramework ademas de un servicio y archivo flash de ejemplo">Descargar Gateway AMF usando ZF + Service y Flash de ejemplo</a>
<p>Necesita tener las librerìas de <a title="Ir a ZendFramework" href="http://framework.zend.com/" target="_blank">Zend Framework </a>junto al ejemplo.</p>
]]></content:encoded>
			<wfw:commentRss>http://danielzegarra.net/2008/12/31/primeros-pasos-con-amf-y-zendframework/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Bug en cache para RSS en WordPress 2.7</title>
		<link>http://danielzegarra.net/2008/12/12/bug-en-cache-para-rss-en-wordpress-27/</link>
		<comments>http://danielzegarra.net/2008/12/12/bug-en-cache-para-rss-en-wordpress-27/#comments</comments>
		<pubDate>Fri, 12 Dec 2008 18:23:00 +0000</pubDate>
		<dc:creator>Daniel Zegarra</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Tutoriales]]></category>
		<category><![CDATA[bugs]]></category>
		<category><![CDATA[RSS]]></category>
		<category><![CDATA[Twitter]]></category>
		<category><![CDATA[Wordpress]]></category>

		<guid isPermaLink="false">http://danielzegarra.net/?p=430</guid>
		<description><![CDATA[[...]]]></description>
			<content:encoded><![CDATA[<p>Luego de actualizar mi instalación de WordPress me di cuenta que los estados de Twitter no se actualizaban. No se realmente si este error se deba a actualizar WordPress porque no me fije en ello hasta ayer.</p>
<p>Yo uso el plugin <a href="http://rick.jinlabs.com/code/twitter/" target="_blank">Twitter for WordPress</a> porque es mas rápido que los otros. Este plugin utiliza la función de wordpress <strong>fetch_rss(url)</strong> para leer los estados de una cuenta de Twitter. El problema es que esta función carga el contenido de una <a title="Caché en Wikipedia" href="http://es.wikipedia.org/wiki/Cach%C3%A9" target="_blank">caché</a> desactualizada.</p>
<p>La <a title="Caché en Wikipedia" href="http://es.wikipedia.org/wiki/Cach%C3%A9" target="_blank">caché</a> es muy útil para evitar descargar de Internet lo mismo una y otra vez sabiendo que el contenido (texto, imagenes,videos, etc) no ha cambiado. Como el contenido de Internet es dinámico la cache debe contar con algoritmos para que esta información sea periódicamente actualizada.</p>
<p>Por alguna extraña razón WordPress 2.7 no actualiza su caché.</p>
<p><span style="color: #ff0000;"><strong>La solución: </strong></span><strong>Desactivar el uso de la cache para contenido RSS.</strong><br />
Simplemente debes cambiar el valor de la contante <span style="color: #0000ff;">MAGPIE_CACHE_ON</span>. Esta contante es definida en archivo rss.php ubicado en /raiz_de_wp/wp-includes/ línea 624.<br />
La línea 624 dice asi:<br />
<span style="color: #008000;">define</span>(<span style="color: #ff0000;">&#8216;MAGPIE_CACHE_ON&#8217;</span>, <span style="color: #333399;">1</span>); <span style="color: #808080;">//Definiendo la contante con el valor &#8220;1&#8243;</span><br />
Cambia el &#8220;1&#8243; por &#8220;0&#8243; (cero) y guarda el archivo.</p>
<p>Eso es todo.</p>
]]></content:encoded>
			<wfw:commentRss>http://danielzegarra.net/2008/12/12/bug-en-cache-para-rss-en-wordpress-27/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Instalar un Web Server sobre openSUSE 11</title>
		<link>http://danielzegarra.net/2008/08/12/instalar-un-web-server-sobre-opensuse-11/</link>
		<comments>http://danielzegarra.net/2008/08/12/instalar-un-web-server-sobre-opensuse-11/#comments</comments>
		<pubDate>Wed, 13 Aug 2008 01:05:34 +0000</pubDate>
		<dc:creator>Daniel Zegarra</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Tutoriales]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[servidor]]></category>

		<guid isPermaLink="false">http://dzegarra.wordpress.com/?p=314</guid>
		<description><![CDATA[[...]]]></description>
			<content:encoded><![CDATA[<p>En junio, si no me equivoco, se liberó la versión estable 11 de openSUSE, una de las mejores distribuciónes de Linux. Mi experiencia con Linux es muy limitada, pero he llegado a aprender algunas cosas (a la fuerza) gracias a la practica y a la ayuda de un compañero de trabajo.</p>
<p>Te mostraré los pasos para instalar tu propio servidor LAMP en openSUSE 11, pero no te alegres tanto, porque si bien al final de este tuto tu servidor estara funcionando, no seria recomendable que lo coloques en la zona pública aún. Para ello debes hacerle un <a title="Explicacion de hardening en wikipedia ingles" href="http://en.wikipedia.org/wiki/Hardening" target="_blank">hardening</a> a su servidor y yo no estoy capacitado para eso.</p>
<p><strong>Paso 1: Consigue el instalador de openSUSE 11</strong></p>
<p>Lo puedes descargar desde http://software.opensuse.org/. Es un archivo en formato ISO de 4.3Gb. Este archivo debes volcarlo a un disco DVD. Eso lo puedes hacer con un software como Nero o MagicISO. Puedes buscarte uno gratuito <a title="Grabacion de discos" href="http://www.softonic.com/windows/grabacion" target="_blank">por aquí</a>.</p>
<p>Una vez que hayas quemado la imagen en el dvd empiezas con la instalación.</p>
<p><strong>Paso 2: Empezar a instalar</strong></p>
<p>El disco grabado es booteable, solo asegurate que tu bios busca archivos de inicio en el CDRom antes que en tu disco duro.</p>
<p>Una vez que lo encuentre veras la siguiente pantalla.</p>
<div id="attachment_326" class="wp-caption aligncenter" style="width: 310px"><a href="http://dzegarra.files.wordpress.com/2008/08/opensuse-install-arranque-desde-el-disco-de-instalacion.jpg" rel="lightbox[148]"><img class="size-medium wp-image-326" src="http://dzegarra.files.wordpress.com/2008/08/opensuse-install-arranque-desde-el-disco-de-instalacion.jpg?w=300" alt="openSUSE Install Arranque desde el disco de instalacion" width="300" height="251" /></a><p class="wp-caption-text">openSUSE Install Arranque desde el disco de instalacion</p></div>
<p>Eliges Installation para empezar con el proceso. No te preocupes por el ingles, luego lo puedes cambiar.</p>
<p>Una vez iniciada la instalación y continuado con la bienvenida verás esto.</p>
<div id="attachment_319" class="wp-caption aligncenter" style="width: 310px"><a href="http://dzegarra.files.wordpress.com/2008/08/opensuse-install-modo-de-instalacion.jpg" rel="lightbox[148]"><img class="size-medium wp-image-319" src="http://dzegarra.files.wordpress.com/2008/08/opensuse-install-modo-de-instalacion.jpg?w=300" alt="openSUSE Install Modo de instalacion" width="300" height="251" /></a><p class="wp-caption-text">openSUSE Install Modo de instalacion</p></div>
<p>Yo elijo la primera opcion porque es lo que quiero hacer, no me interesa lo que actualmente tengo en mi disco duro.</p>
<div id="attachment_325" class="wp-caption aligncenter" style="width: 310px"><a href="http://dzegarra.files.wordpress.com/2008/08/opensuse-install-zona-horaria.jpg" rel="lightbox[148]"><img class="size-medium wp-image-325" src="http://dzegarra.files.wordpress.com/2008/08/opensuse-install-zona-horaria.jpg?w=300" alt="openSUSE Install Zona horaria" width="300" height="252" /></a><p class="wp-caption-text">openSUSE Install Zona horaria</p></div>
<p>Luego elijo mi zona horaria y verifico que la hora mostrada sea correcta.</p>
<p>En la siguiente pantalla debo decidir que escritorio gráfico usaré.</p>
<div id="attachment_323" class="wp-caption aligncenter" style="width: 310px"><a href="http://dzegarra.files.wordpress.com/2008/08/opensuse-install-seleccion-de-escritorio.jpg" rel="lightbox[148]"><img class="size-medium wp-image-323" src="http://dzegarra.files.wordpress.com/2008/08/opensuse-install-seleccion-de-escritorio.jpg?w=300" alt="openSUSE Install Seleccion de escritorio" width="300" height="251" /></a><p class="wp-caption-text">openSUSE Install Seleccion de escritorio</p></div>
<p>Yo elijo el KDE4, pero tu puedes elegir el que mas te guste. Si ya has usado ubuntu alguna vez, entonces debes conocer a Gnome. KDE4 es una nueva version de KDE que trae consigo buenas mejoras gráficas entre otras cosas. En este ejemplo no utilizaras el entorno gráfico.</p>
<div id="attachment_322" class="wp-caption aligncenter" style="width: 310px"><a href="http://dzegarra.files.wordpress.com/2008/08/opensuse-install-propuesta-de-particionamiento.jpg" rel="lightbox[148]"><img class="size-medium wp-image-322" src="http://dzegarra.files.wordpress.com/2008/08/opensuse-install-propuesta-de-particionamiento.jpg?w=300" alt="openSUSE Install Propuesta de particionamiento" width="300" height="251" /></a><p class="wp-caption-text">openSUSE Install Propuesta de particionamiento</p></div>
<p>En la siguiente pantalla debes elegir las particiones que deseas crear. Mi amigo me dice que es mejor hacerlo de forma manual, hay unos pasos a seguir. Pero como él esta ocupado dejaré que suse decida. Este no será un servidor de producción, no necesito que todo sea perfecto.</p>
<p>En la ultima parte de la preparación te pregunta por la identidad del servidor. En &#8220;Nombre completo&#8221; puedes escribir tu nombre. En el siguiente campo te pide el nombre de usuario. Coloca ahi tu nick (no debe tener espacios ni caracteres especiales). Y en los dos ultimos campos tu contraseña (una que elijas). Asegurate de marcar la opcion de &#8220;Utilizar esta contraseña para el administrador&#8221; (osea, el usuario <strong>root</strong>).</p>
<p>Una vez que ya he contestado a varias preguntas me muestra el resumen de lo que va a hacer.</p>
<div id="attachment_316" class="wp-caption aligncenter" style="width: 310px"><a href="http://dzegarra.files.wordpress.com/2008/08/opensuse-install-configuracion-de-la-instalacion.jpg" rel="lightbox[148]"><img class="size-medium wp-image-316" src="http://dzegarra.files.wordpress.com/2008/08/opensuse-install-configuracion-de-la-instalacion.jpg?w=300" alt="openSUSE Install Configuracion de la instalacion" width="300" height="251" /></a><p class="wp-caption-text">openSUSE Install Configuracion de la instalacion</p></div>
<p>Yo decido cambiar algunas cosas como el software que va a instalar, no me interesan los juegos o los efectos de pantalla, lo que harán sera ocuparme espacio y memoria.</p>
<div id="attachment_318" class="wp-caption aligncenter" style="width: 310px"><a href="http://dzegarra.files.wordpress.com/2008/08/opensuse-install-eligiendo-los-paquetes-a-instalar.jpg" rel="lightbox[148]"><img class="size-medium wp-image-318" src="http://dzegarra.files.wordpress.com/2008/08/opensuse-install-eligiendo-los-paquetes-a-instalar.jpg?w=300" alt="openSUSE Install Eligiendo los paquetes a instalar" width="300" height="251" /></a><p class="wp-caption-text">openSUSE Install Eligiendo los paquetes a instalar</p></div>
<p>Otra cosa a cambiar es el tipo de inicio del sistema. Por defecto inicia en el estado 5 que es el modo gráfico. Como este será un servidor la intención es no gastar memoria en cargar cosas imnecesarias. Por lo tanto, le decimos que inicie en el modo 3.<br />
Te da tres modos:</p>
<ul>
<li>1: Modo de consola sin red</li>
<li>3: Modo de consola con red<strong> (recomendado)</strong></li>
<li>5: Modo gráfico con red</li>
</ul>
<p>Si inicias por defecto en modo gráfico no hay problema. Puedes usar la consola en cualquier momento.</p>
<p>Conforme empiezas con la instalación, lo primero que hará será preparar el disco duro, lo particionará y formateará de acuerdo a lo decidido anteriormente.</p>
<div id="attachment_320" class="wp-caption aligncenter" style="width: 310px"><a href="http://dzegarra.files.wordpress.com/2008/08/opensuse-install-preparando-el-disco-duro.jpg" rel="lightbox[148]"><img class="size-medium wp-image-320" src="http://dzegarra.files.wordpress.com/2008/08/opensuse-install-preparando-el-disco-duro.jpg?w=300" alt="openSUSE Install Preparando el disco duro" width="300" height="251" /></a><p class="wp-caption-text">openSUSE Install Preparando el disco duro</p></div>
<p>Luego continuar con la instalación de los paquetes.</p>
<div id="attachment_317" class="wp-caption aligncenter" style="width: 310px"><a href="http://dzegarra.files.wordpress.com/2008/08/opensuse-install-instalacion-de-paquetes.jpg" rel="lightbox[148]"><img class="size-medium wp-image-317" src="http://dzegarra.files.wordpress.com/2008/08/opensuse-install-instalacion-de-paquetes.jpg?w=300" alt="openSUSE Install Instalacion de paquetes" width="300" height="250" /></a><p class="wp-caption-text">openSUSE Install Instalacion de paquetes</p></div>
<div id="attachment_324" class="wp-caption aligncenter" style="width: 310px"><a href="http://dzegarra.files.wordpress.com/2008/08/opensuse-install-terminando-la-instalacion-basica.jpg" rel="lightbox[148]"><img class="size-medium wp-image-324" src="http://dzegarra.files.wordpress.com/2008/08/opensuse-install-terminando-la-instalacion-basica.jpg?w=300" alt="openSUSE Install Terminando la instalacion basica" width="300" height="251" /></a><p class="wp-caption-text">openSUSE Install Terminando la instalacion basica</p></div>
<p>Una vez haya terminado te pedirá reiniciar. Si dejas el disco de instalación, dentro de la compu, no importa, la primera opcion del menu booteable es &#8220;Iniciar desde el disco duro&#8221;.</p>
<div id="attachment_315" class="wp-caption aligncenter" style="width: 310px"><a href="http://dzegarra.files.wordpress.com/2008/08/opensuse-install-configuracion-automatica.jpg" rel="lightbox[148]"><img class="size-medium wp-image-315" src="http://dzegarra.files.wordpress.com/2008/08/opensuse-install-configuracion-automatica.jpg?w=300" alt="openSUSE Install Configuracion automatica" width="300" height="253" /></a><p class="wp-caption-text">openSUSE Install Configuracion automatica</p></div>
<p>De manera automática vuelve al programa de instalacion para configurar los paquetes instalados.</p>
<p><strong>Paso 3: La configuracion de tu LAMP</strong> (<strong>L</strong>inux, <strong>A</strong>pache, <strong>M</strong>ySQL y <strong>P</strong>HP)</p>
<p>Una vez que hayas terminado con la instalación empieza lo divertido, la configuración. Depende a el tipo de inicio que hayas elegido puedes seguir de dos maneras:</p>
<p style="padding-left:30px;"><span style="color: #000000;"><strong><span>Si elegiste usar el modo grafico por defecto<br />
</span></strong></span></p>
<p style="padding-left:30px;"><span style="color: #000000;">Si elegiste iniciar por defecto en modo gráfico has lo siguiente:</span></p>
<p style="padding-left:30px;"><span style="color: #000000;">Una vez el escritorio este cargado, dale un clic a la iguana verde ubicada en la esquina inferior irquierda y luego escribe la palabra &#8220;terminal&#8221; en el campo de busqueda ubicado en la parte superior del menu emergente. Dale un clic sobre el primer resultado.</span></p>
<div class="mceTemp mceIEcenter" style="padding-left:30px;">
<dl class="wp-caption aligncenter">
<dt class="wp-caption-dt"><a href="http://dzegarra.files.wordpress.com/2008/08/opensuse-install-abiendo-el-terminal-en-kde4.jpg" rel="lightbox[148]"><img class="size-medium wp-image-329" src="http://dzegarra.files.wordpress.com/2008/08/opensuse-install-abiendo-el-terminal-en-kde4.jpg?w=300" alt="openSUSE Install Abriendo el terminal en KDE4" width="300" height="252" /></a></dt>
<dd class="wp-caption-dd">openSUSE Install Abriendo el terminal en KDE4</dd>
</dl>
</div>
<p style="padding-left:30px;"><span style="color: #000000;">Una vez abierto el terminal escribes: </span></p>
<p style="padding-left:30px;"><strong><span style="color: #000080;">su -</span></strong></p>
<p style="padding-left:30px;"><span style="color: #000000;">Luego la contraseña que elegiste previamente tal como se muestra en la siguiente imagen. Esto te da los privilegios del usuario <strong>root</strong> (administrador).</span></p>
<p style="padding-left:30px;"><img src="http://dzegarra.files.wordpress.com/2008/08/opensuse-install-ejecutar-comandos-como-root-desde-la-terminal.jpg" alt="openSUSE Install Ejecutar comandos como root desde la terminal" width="331" height="221" /></p>
<p style="padding-left:30px;">T<span style="color: #000000;">e recomiendo que maximices la ventana del terminar porque necesitaras espacio para lo que sigue. El boton de maximixar se encuentra exactamente debajo del cursor (ver última imagen).</span></p>
<p style="padding-left:30px;"><span style="color: #000000;"><strong>Si elegiste el modo de consola por defecto</strong></span></p>
<p style="padding-left:30px;"><span style="color: #000000;">Entonces una vez que el servidor termine de iniciar te pedira inicies tu sesión. Escribe <strong>root </strong>como nombre de usuario y luego la contraseña que hayas elegido previamente.</span></p>
<p><span style="color: #000000;">De aqui en adelante los pasos son comunes.</span></p>
<p><span style="color: #000000;">Una vez que te hayas logeado tipeas:</span></p>
<p><strong><span style="color: #000080;">yast</span></strong></p>
<p><span style="color: #000000;">Ahora debes tener al administrador Yast2 en pantalla. Con Yast puedes realizar varios cambios en tu servidor sin necesitad de estar editando archivos de configuración. Te ayuda sobretodo si eres un principiante como yo.</span></p>
<p><span style="color: #000000;">Usa las flechas direccionales para moverte y la tecla &lt;TAB&gt; para saltar de un cuadro a otro o entre los botones.</span></p>
<p><span style="color: #000000;"><strong>Paso 3.1: Configurando con Yast</strong></span></p>
<p><span style="color: #000000;">En <strong>Network Devices</strong> / <strong>Network Settings</strong> puedes configurar tu tarjeta de red: IP, Nombre, etc. Por defecto usaras DHCP.</span></p>
<div id="attachment_334" class="wp-caption aligncenter" style="width: 310px"><a href="http://dzegarra.files.wordpress.com/2008/08/opensuse-install-configurando-con-yast.jpg" rel="lightbox[148]"><img class="size-medium wp-image-334" src="http://dzegarra.files.wordpress.com/2008/08/opensuse-install-configurando-con-yast.jpg?w=300" alt="openSUSE Install Configurando con Yast" width="300" height="207" /></a><p class="wp-caption-text">openSUSE Install Configurando con Yast</p></div>
<p><span style="color: #000000;">Ve a <strong>Network Services</strong> y elige <strong>HTTP Server</strong>. Luego, asegurate que el puerto de escucha esa el 80 y que Open port in Firewall este seleccionado. Puedes seleccionar y deseleccionar usando la barra espaciadora. No olvides que puedes saltar entre los campos activos usando &lt;TAB&gt;. Vas a la siguiente pagina y activas lo que necesites: PHP5, Perl, etc&#8230; Sigues avanzando y veras que este asistente te ofrece varias opciones. Si desearas cambiar algo luego puedes volver a entrar aqui. Recuerda el <strong>DocumentRoot</strong>, es ahi donde se deben encontrar los archivos que seran visibles desde la web. Usualmente se encuentra en &lt;RAIZ&gt;\srv\www\htdocs.<br />
En la última pantalla te da dos opciones:</span></p>
<ul>
<li><span style="color: #000000;">Start apache2 server when booting</span></li>
<li><span style="color: #000000;">Start apache2 server manually</span></li>
</ul>
<p><span style="color: #000000;">Te recomiendo la primera opción, asi apache2 iniciará de forma automatica al arrancar openSUSE.</span></p>
<p><span style="color: #000000;">Bien, ahora que Apache esta configurado pasamos a mySQL.</span></p>
<p><span style="color: #000000;">Salimos de yast, puedes ir saltando con &lt;TAB&gt; hasta llegar al boton Quit o presional simplemente &lt;F9&gt;. Asi como hecho que el servicio apache2 se inicie automaticamente al arrancar nuestro servidor debemos hacer lo mismo con mySQL. Para ver si el servicio mysql esta configurado para un inicio automatico escribimos lo siguiente:</span></p>
<p><span style="color: #000080;"><strong>chkconfig &#8211;list | grep mysql</strong></span></p>
<p><span style="color: #000000;">Como resultado tendremos:</span></p>
<p><img src="http://dzegarra.files.wordpress.com/2008/08/opensuse-install-estado-del-inicio-automatico-de-un-servicio.jpg" alt="openSUSE Install Estado del inicio automatico de un servicio" width="607" height="63" /></p>
<p><span style="color: #000000;">Te resumo que significa esto: Estos numeros del 0 al 6 representan tipos de inicio del sistema operativo. <strong>3</strong><strong> inicio en modo de consola</strong> y <strong>5</strong> el <strong>inicio en modo gráfico</strong>. Como ves en la imagen el servicio mysql no se iniciará automaticamente en ningun tipo de inicio. Debemos hacer el &#8220;<strong>off</strong>&#8221; del estado <strong>3</strong> y <strong>5</strong> se convierta en &#8220;<strong>on</strong>&#8220;. Para esto escribimos lo siguiente:</span></p>
<p><strong><span style="color: #000080;">chkconfig mysql on</span></strong></p>
<p><span style="color: #000000;">Asi de simple. Si deseas puedes ejecutar otra vez el comando que te informa del estado del servicio para verificar que realmente en los estados 3 y 5 el servicio mysql a pasado a &#8220;<strong>on</strong>&#8220;.</span></p>
<p><span style="color: #000000;">Tambien puedes ejecutar: </span><strong><span style="color: #000080;">chkconfig &#8211;list | grep apache2</span></strong> <span style="color: #000000;">para asegurarte que apache2 este en &#8220;<strong>on</strong>&#8221; en los tipos 3 y 5.</span></p>
<p><span style="color: #000000;">Habiendo hecho debes reiniciar tu servidor, para ello ejecuta el comado:</span></p>
<p><strong><span style="color: #000080;">init 6</span></strong></p>
<p><span style="color: #000000;">Con esto ya tienes corriendo tu servidor Apache con PHP y mySQL.</span></p>
<p><span style="color: #000000;">Te dejo algunos comandos que te pueden ser útiles:</span></p>
<p><span style="color: #000080;"><strong>init 0</strong></span> <span style="color: #000000;">: Apagar el servidor.</span><br />
<span style="color: #000080;"><strong>init 6</strong></span> <span style="color: #000000;">: Reiniciar el servidor.</span><br />
<span style="color: #000080;"><strong>service apache2 status</strong></span> <span style="color: #000000;">: Para conocer el estado de un servicio. Puedes cambiar apache2 por el servicio que quieras.</span><br />
<span style="color: #000080;"><strong>service apache2 start</strong></span> <span style="color: #000000;">: Para iniciar un servicio. Asimismo, en vez de mysql puede ser apache, sshd, etc.</span><br />
<span style="color: #000080;"><strong>service apache2 stop</strong></span><span style="color: #000000;"> : Para detener un servicio.</span><br />
<span style="color: #000080;"><strong>service apache restart</strong></span> <span style="color: #000000;">: detiene y vuelve a iniciar un servicio.</span><br />
<span style="color: #000080;"><strong>ifconfig</strong></span><span style="color: #000000;"> : Muestra la configuracion de las tarjetas de red.</span><br />
<span style="color: #000080;"><strong>man nombre_cualquiera</strong></span> <span style="color: #000000;">: Muestra la ayuda del comando nombre_cualquiera.</span><br />
<strong><span style="color: #000080;">ping nombre_host</span> <span style="color: #000000;">:</span></strong><span style="color: #000000;"> Hace un ping a un nombre de host o direccion IP, igual que el comando ping de windows. A diferencia que este no se detendra hasta presionar las teclas &lt;CRTL&gt; + &lt;C&gt;.</span><br />
<span style="color: #000080;"><strong>top</strong></span> <span style="color: #000000;">: Muestra el estado de los procesos en ejecucion asi como su uso en memoria y procesador. De la misma manera, presiona &lt;CRTL&gt; + &lt;C&gt; para salir.</span></p>
<p><span style="color: #000000;">Si elegiste iniciar en modo consola por defecto y tambien elegiste instalar </span><span style="color: #000000;">el escritorio KDE </span><span style="color: #000000;">durante la instalación y ahora quieres probarlo, puedes ejecutar el comando</span> <span style="color: #000080;"><strong>startx</strong></span><span style="color: #000000;">. Esto iniciará el escritorio KDE usando el usuario actual. Para volver a la línea de comandos simplemente cierra sesión desde el entorno gráfico.</span></p>
<p><span style="color: #000000;">Si por algún motivo la aplicacion con la que tabajases se congelara, puedes reiniciar tu servidor saltando a otro escritorio. Para saltar entre escritorios presiona la tecla &lt;ALT&gt; + &lt;del F1 al F6&gt;. Tienes seis escritorios en modo de consola disponibles. El escritorio gráfico usa el siete. Para saltar del escritorio de comandos al grafico lo puedes hacer con &lt;ALT&gt;+&lt;F7&gt;, y para pasar del escritorio gráfico al de comandos lo debes hacer con &lt;CRTL&gt;+&lt;ALT&gt;+&lt;del F1 al F6&gt;. Recuerda usar las teclas &lt;CRTL&gt; y &lt;ALT&gt; de la izquierda de tu teclado.</span></p>
]]></content:encoded>
			<wfw:commentRss>http://danielzegarra.net/2008/08/12/instalar-un-web-server-sobre-opensuse-11/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
	</channel>
</rss>

