Nuestro blog

Bajo la categoría ‘Desarrollo web’

— por Asier Marqués

Para los que aún no utilicéis el driver oficial de SQL Server, os dejo un pequeño tip para recuperar el último id insertado en una consulta de SQL Server con la obsoleta extensión mssql de php.


$q = mssql_query("INSERT INTO TableName(...) VALUES(...); SELECT LAST_INSERT_ID=@@IDENTITY");
$r = mssql_fetch_assoc($q);

1 comentario | Archivado como Desarrollo web | 24/08/2010

— por Asier Marqués

Jquery es un estupendo framework de desarrollo en javascript que, utilizado en conjunto a los widgets de Jquery UI, nos permite dar a nuestras aplicaciones un toque de riqueza a su interfaz de usuario.

Uno de los widgets más utilizados en Jquery UI es Dialog, que nos permite abrir una ventana ajax en la que podemos insertar formularios o cualquier contenido html que nos interese, de la misma forma que lo insertaríamos en un div normal.

Uno de los problemas más frecuentes que se dan con Jquery UI se nos presenta cuando en nuestro contenido tenemos una película flash embebida. La ventanita del Dialog Box queda detrás de la misma y resulta imposible visualizar el contenido que contiene.

Para solucionar esto, debemos pasarle el parámetro wmode con un valor opaque al código flash que inserta nuestra película flash en el contenido. Lo muestro en un ejemplo con un video de blip.tv

<object width="634" height="387"
           type="application/x-shockwave-flash"
           data="http://blip.tv/play/71yBqdFXAA%2Em4v">
  <param value="http://blip.tv/play/71yBqdFXAA%2Em4v" name="src">
  <param value="true" name="allowfullscreen">
  <param name="wmode" value="opaque">
</object>

Sin comentarios | Archivado como Desarrollo web | 12/08/2010

— por Asier Marqués

El pasado lunes tuvieron lugar en la universidad San Jaume de Castellón las primeras jornadas de Symfony en España.

En Blackslot utilizamos Symfony como primera opción para el desarrollo de aplicaciones web y herramientas de gestión interna para nuestra infraestructura de sistemas. Desde nuestra experiencia podemos decir que es uno de los mejores frameworks que existen para el desarrollo ágil de aplicaciones web.

Ha sido utilizado para construir sitios web como Yahoo Answers, Delicious, Daily Motion entre otros.

Durante el evento los ponentes charlamos sobre nuestra experiencia con este framework, os recomiento echar un ojo a todas las ponencias.

La organización hizo un trabajo excelente y fue un evento genial. Ahora toca esperar al próximo :)

Os dejo por aquí mi presentación, sobre escalabilidad y cloud computing usando Symfony.

Sin comentarios | Archivado como Desarrollo web, Eventos | 12/07/2010

— por Asier Marqués

Los próximos días 5 y 6 de Julio, el equipo de decharlas.com ha organizado la  primera conferencia española dedicada en exclusiva a Symfony en la universidad Jaume I de Castellón.

symfony

Esta conferencia está dirigida a todo tipo de desarrolladores Symfony. El programa provisional es el sigueinte:

  • Introducción a symfony: charla introductoria al entorno de desarrollo, explicando las diversas partes de las que consta.
  • Domesticando los formularios: explicación del sub-framework de formularios que posee symfony (sfForm).
  • Say what? Be I18n my friend: internacionalizando nuestros proyectos.
  • CMF is the new CMS: evolucionando los CMS.
  • Symfony en España: trata de mostrar casos reales de empresas y productos que hacen uso de dicho entorno de trabajo.
  • No reinventes la rueda. Plugins: cómo crear nuestros plugins para ser reutilizados en diversos proyectos.
  • Un gran poder conlleva una gran responsabilidad (Admin Generator): crear nuestro propio tema para la parte de administración de contenidos.
  • Cose que te cose. Patrones de diseño y test unitarios: no sólo se trata de enseñar symfony sino también buenas prácticas y metodologías en el desarrollo web.
  • Conociendo tus herramientas de desarrollo: tratará sobre herramientas de apoyo en el desarrollo de software (control de versiones, IDE’s, integración continua, …)
  • Desarrollo basado en estándares: novedades en HTML5, XHTML 2.0 y CSS3.
  • ORMs en symfony: Doctrine, Propel.
  • Symfony, cloud computing y web escalables: desarrollo web pensando en el rendimiento y la escalabilidad.

Entre charla y charla, se habilitarán espacios de tiempo para que los asistentes hagan networking y conozcan a otros miembros y empresas de la comunidad Symfony.

Gracias al trabajo desinteresado de los organizadores David Castelló y Javier López y gracias a la colaboración de la Universidad Jaume I, la asistencia a las jornadas será gratuita.

Dado que nosotros ofrecemos servicios de desarrollo web en Symfony, estaremos presentes en este evento sin falta. Si desarrollas en php y te interesa symfony no dudes en apuntarte.

Sin comentarios | Archivado como Cloud Computing, Desarrollo web, Eventos | 20/05/2010

— por Asier Marqués

Muchos os habréis fijado en servicios web que usan subdominios dinámicos (wildcard) para las cuentas de sus usuarios, como por ejemplo jaiku.

Sin embargo, una vez configurados los subdominios dinámicos, tenemos un serio problema y es que, las variables de sesión por defecto se pierden cada vez que ejecutamos la aplicación web desde un subdominio distinto al que hemos utilizado para crear dicha variable de sesión.

Podemos comprobar esto en algunos sitios web que no usan subdominios dinámicos pero, si hacemos login en su www.dirección.com, si después vamos a su dirección.com sin las ‘www’ nos encontramos con que no hemos iniciado sesión. El problema es similar y tiene la misma solución que en el caso de los wildcard domains.

Voy a explicar cómo solucionar este problema y como hacer funcionar subdominios dinámicos.

Los pasos:

1 – Configurar el dns
2 – Configurar el servidor web
3 – Configurar bien el ámbito de las variables $_SESSION en la aplicación php para que se compartan las variables de sesión entre los subdominios.


Configurar el dns.

Basta con crear una entrada tipo host es decir, “A” apuntando a *.tudominio.com . También vale con crear un CNAME * apuntando al registro A del dominio principal (“tudominio.com”).

Si hacemos un ping a “loquesea.tudomino.com” debería ya resolver (a menos que tengas capado el tráfico ICMP claro)

Configurar el servidor web.

En Apache httpd, debemos configurar en el vhost de nuestro dominio un ServerAlias que atienda a “*.midominio.com”

En Nginx, debemos configurar en la sección Server un valor server_name como “*.midominio.com”

En IIS, debemos dejar un sitio virtual sin headers y ese es el que atenderá las peticiones de vuestro wildcard dns, es la única forma.

Se ha discutido sobre este tema en el foro oficial de IIS y según los propios desarrolladores, aunque ha sido demandada durante años, no se piensa implementar dicha funcionalidad por ahora, ni siquiera en IIS7.

Nota: sólo podemos disponer de un sitio web sin headers por servidor web IIS.


Configurar nuestras variables de $_SESSION en php

El truco esta en configurar la directiva session.cookie_domain como “.midominio.com” (importante el . delante del dominio).

Podéis hacerlo en tiempo de ejecución, antes de llamar a session_start(); siempre que tengamos deshabilitado el autoarranque de sesiones en el php.ini (como es lógico y viene por defecto)

ini_set("session.cookie_domain",".midominio.com");
session_start();


¿Usas plesk?

Sergio ya explicó como configurar wildcard domains en servidores con el panel de control Plesk.

Sin comentarios | Archivado como Desarrollo web, Sistemas TI | 10/05/2010

— por Asier Marqués

Hace unos días podíamos leer que por fín el driver de php para trabajar con SQL Server desde php contará con soporte para PDO en su versión 2.0.

php_sqlsrv_pdo

Esto es un gran avance para los desarrolladores que trabajen con php bajo entornos Microsoft ya que los orm más importantes escritos en este lenguaje, y algunos cms como Drupal, se basan en PDO y se integran en la mayoría de los framework más usados.

Por nuestra parte en Blackslot, procederemos a implantar este driver en nuestros servicios de hosting grid Microsoft, en cuanto la versión estable esté disponible.

Sin comentarios | Archivado como Desarrollo web | 08/05/2010

— por Asier Marqués

Doctrine es un ORM que cada vez estamos usando más los que trabajamos con el framework Symfony para php.

La nueva versión de Doctrine está reescrito en php5.3, mejorando su rendimiento de una forma notable y haciendo mucho más ágil su uso.

Jonathan Wage, impartió en Febrero de este año durante la conferencia Symfony Live 2010 una interesante charla presentando algunas de las novedades más interesantes que se recogen en esta nueva versión.

1 comentario | Archivado como Desarrollo web | 02/05/2010

— por Asier Marqués

Una de las primeras dudas que nos entran a la hora de pensar en Azure es si Azure es algún tipo de instancia virtual, a la que podemos acceder vía escritorio remoto y configurar lo que necesitemos en nuestro servidor.

Azure es un concepto distinto a esto, un planteamiento o paradigma nuevo a la hora de pensar en el alojamiento de nuestras aplicaciones web en internet. Exige en un principio estar abiertos a un cambio, un cambio necesario que se impondrá sin ninguna duda en los próximos años.

Azure es un entorno formado por varios roles a los que subiremos según el tipo de rol de nuestra instancia, nuestra aplicación, nuestra base de datos, nuestros archivos estáticos y nuestros procesos backend. Todo está pensado para ser modular y escalable sin provocar dolores de cabeza al desarrollador. Estos roles se comunicarán entre sí mediante Rest vía Http o sockets TCP/IP. El coste será por horas de servicio y, aunque las instancias estén paradas se seguirán cobrando.

En Windows Azure principalmente tenemos los siguientes roles:

  • Web Role: Destinado a servir aplicaciones web frontales, escritas en .net, php, ruby, perl, python o cualquier lenguaje que soporte Fastcgi.
  • Worker Role: Destinado a servicios que funcionen en el backend, los primeros que se nos vienen a la mente pueden ser mysql o memcached.

Adicionalmente tenemos estos otros servicios en Azure

  • SqlAzure: Una versión de Sql Server 2008 implementada en Azure.
  • Storage: Un repositorio de archivos con el que podremos trabajar desde nuestras aplicaciones web.

En este primer acercamiento me voy a centrar en el WebRole y por la naturaleza de nuestra aplicación web, será de tipo FastCgi para poder ejecutar aplicaciones php.

Para programar en php bajo entorno Microsoft uso Visual Studio 2008 + vs.php o netbeans (en este caso usaré lo primero). Si no usas visual studio, dispones de herramientas que te permiten trabajar de una forma similar pero utilizando Eclipse. Recuerda que si estás en la universidad o has terminado hace poco, existen descargas gratuitas completas de visual studio y horas de servicio Azure en dreamspark.

Lo primero es crear un servicio tipo Windos Azure en el panel de control de la plataforma azure.

azure1

Una vez creado el servicio vemos que disponemos de dos entornos, uno de integración y otro de producción. Nos cobrarán por tener instancias en ambos entornos, estén levantadas o no.

azure2

Para poder trabajar con Azure desde visual studio, nos tenemos que descargar el SP1 y las tools de Azure para Visual Studio que nos permitirán disponer de un entorno basado en IIS similar a azure.

Una vez hecho esto, en Visual Studio podremos seleccionar un tipo de proyecto Windows Azure Cloud Service.

azure3

Tras seleccionar el tipo de proyecto, nos preguntará qué rol vamos a asignar a este proyecto. En nuestro caso al ser una aplicación php, le asignamos el rol WebCGI role.

azure4

Una vez completado este paso, se nos crearán dos proyectos en el árbol de soluciones de Visual Studio y se nos mostrará el contenido del archivos de configuración del WebRole: el Web.roleconfig. Este es un archivo xml tipo al Web.config y en el que aparece entre las llaves fast cgi el siguiente comentario:


<!-- Set the "Enable Full Trust" property to true on the corresponding
 Web Role in the Cloud Service project.
 -->

 <!-- Define the fastCgi application here. The application must be located
 under the role root folder or subfolder. The handler is defined in
 the Web.config file.

 Ensure that all of the handler binaries have their "Build Action" Solution
 Explorer file property set to "Content".

 <application fullPath="%RoleRoot%\approot\cgi-handler.exe" arguments="arg1 arg2 ..." />
 -->

Nos pide que realicemos las siguientes tareas:

  • Que subamos la aplicación fastCGI encargada de procesar las peticiones a nuestra aplicación. Los binarios de la aplicación deben estar en el directorio raíz de nuestro proyecto (representado por la constante %RoleRoot%\approot) y debemos configurar el handler en el web.config de la aplicación.
  • Tenemos que activar la propiedad “Full Trust” en la configuración del WebRole.

Vamos a ello:

1) Primero nos descargamos los binarios o instalamos el msi (te recomiendo lo segundo) la última versión de php en windows.php.net

2) Una vez descargado o instalado php, copiamos sus binarios tal cual al directorio raíz de nuestro proyecto (a un directorio llamado /php). Si has instalado php, normalmente te dejará los binarios en “c:\archivos de programa\php”.

3) Si ya tenemos el directorio php en nuestra raíz del proyecto, indicaremos donde se encontrará la aplicación en el Web.roleconfig


<?xml version="1.0"?>

<configuration>
 <system.webServer>
   <fastCgi>
     <application fullPath="%RoleRoot%\approot\php\php-cgi.exe" arguments="" />
   </fastCgi>
 </system.webServer>
</configuration>

4) En el web.config descomentamos las líneas dedicadas al Handler FastCgi y las dejamos como siguen:


<add name="FastGGI Handler"
 verb="*"
 path="*.php"
 scriptProcessor="%RoleRoot%\approot\php\php-cgi.exe"
 modules="FastCgiModule"
 resourceType="Unspecified" />

5) En las propiedades del Rol WebCgi nos aseguramos que está activada la propiedad Full Trust de .net

azure5

6) Subimos nuestra aplicación php. En este caso, subiré una sencilla aplicación que hará una tirada basándose en el bastante poco óptimo sistema aleatorio de php para otorgarme puntos en diferentes niveles de ataque y defensa.

Después de hacerlo, escribirá el resultado en un archivo de texto pero estará disponible tan sólo de forma temporal. Si quisiéramos almacenarlo de forma persistente, deberíamos almacenarlo en Azure Storage.

El código es el siguiente:


<?php
$poderes = array(
 "resistencia al fuego",
 "resistencia al frio",
 "aguante",
 "formulas de excel",
 "mirada penetrante",
 "escalabilidad",
 "ROI",
 "SEO",
 "SEM",
 "SMO",
 "pensamiento deslumbrante");

$resultado = null;

for($i=1;$i<10;$i++){

 $puntos     = $i*1E2*rand(5,11);
 $poder      = $poderes[rand(0,10)];
 $resultado .= $puntos . " puntos en " . $poder;
 $resultado .= "\n";

 echo "Asier ha obtenido " . $puntos . " puntos en " . $poder . "<br/>";

}

$fp = fopen("resultados.txt","w+");
fwrite($fp, $resultado, strlen($resultado));
fclose($fp);

7) Si estamos ejecutando Visual Studio como Administrador podemos compilar el proyecto, sino lo cerramos y ejecutamos Visual Studio con privilegios de Administrador. Una vez compilada la aplicación se nos abrirá nuestro navegador ejecutando nuestra aplicación php.
Por defecto, si no le indicamos un archivo raíz, nos dará un error que nos detalla que no tenemos permiso para listar el directorio raíz.
Para que nos cargue un archivo inicial, podemos agregarle la clave defaultDocument a la configuración system.webServer en el web.config.

<system.webServer>
 <defaultDocument enabled="true">
   <files>
     <add value="index.php"/>
   </files>
 </defaultDocument>

8) Vale en principio tenemos todo funcionando en local, ya que vemos que se ejecuta la aplicación y que escribe las puntuaciones en el archivo de texto.
Ahora necesitamos subir todo esto a Azure.

Si volvemos al panel de control de windows.azure.com, y pulsamos en el botón deploy en el entorno de integración vemos que se nos pide subir dos archivos: El paquete de la aplicación y el archivo de configuraciones.

azure6

Desde Visual Studio podemos generar muy fácilmente estos dos archivos al hacer click en la opción Publicar, que aparece al hacer click en el botón derecho sobre el proyecto de Azure.

Cuando lo hagamos, se nos abrirá la ventana en el navegador del Panel de control de Azure y una ventana en el explorador de windows con la ruta donde se han generado los archivos.

Una vez subidos le damos a Run, e iniciará la instancia. Tarda varios minutos.

Tras la espera podemos ejecutar nuestra aplicación desde la ruta que nos indique el panel de control.

azure8

Hay otras herramientas de las que podemos beneficiarnos al crear aplicaciones en Azure, una de ellas es el gran módulo de rewrite de IIS7 con el que podemos utilizar urls amigables en nuestras aplicaciones web.

Vamos a hacer que nuestra aplicación otorgue le de poderes a un usuario que le indiquemos por url.

Para ello tenemos que añadir una regla de rewrite en el web.config, dentro de system.webserver, en la que le indiquemos por la ruta /user/[nick] se le pasará como parámetro GET al script index.php.


<rewrite>
  <rules>
    <rule name="Rewrite">
       <match url="^user/([a-z]+)" />
      <action type="Rewrite" url="index.php?user={R:1}" />
    </rule>
  </rules>
</rewrite>

En la aplicación recuperamos el parámetro GET. Tendríamos el siguiente código en el index.php


<?php
$poderes = array(
  "resistencia al fuego",
  "resistencia al frio",
  "aguante",
  "formulas de excel",
  "mirada penetrante",
  "escalabilidad",
  "ROI",
  "SEO",
  "SEM",
  "SMO",
"pensamiento deslumbrante");

$resultado = null;

$usuario = "asier";
if(!empty($_GET) && is_array($_GET) && key_exist("user", $_GET)){
  $usuario = ucfirst($_GET["user"]);
}

for($i=1;$i<10;$i++){

  $puntos     = $i*1E2*rand(5,11);
  $poder      = $poderes[rand(0,10)];
  $resultado .= $puntos . " puntos en " . $poder;
  $resultado .= "\n";

  echo $usuario . " ha obtenido " . $puntos . " puntos en " . $poder . "<br/>";

}

$fp = fopen("resultados.txt","w+");
fwrite($fp, $resultado, strlen($resultado));
fclose($fp);

Una función que me resulta imprescindible también es poder visualizar los logs de nuestra instancia y podemos hacerlo desde el panel de control de Azure y una cuenta de storage.

Con esto hemos visto como ejecutar aplicaciones web sencillas php en Azure, en las próximas entregas veremos como usar los Worker Roles, SQL Azure y cómo trabajar con phpazure para almacenar y recuperar archivos en Azure Storage.

Cosas que he echado en falta

Entre las cosas que he echado en falta, y desconozco por ahora si Azure es las permite de forma nativa o con herramientas de terceros pueden ser las siguientes:

  • Un módo más ágil para hacer deploy de nuestras aplicaciones. Los desarrolladores web php estamos acostumbrados a usar subversion o rsync para hacer deploy de nuestras aplicaciones. El hecho de tener que generar un paquete y luego subirlo, es un paso que estaría genial si se automatizase. Lo más lógico podría ser que desde la opción publicar de visual studio se subiesen los cambios al entorno de integración de azure o al menos, a Azure Storage para que luego se haga el deploy definitivo con un botón desde el panel de control web de azure.
  • Posibilidad de personalizar el directorio público a la que se tendrá acceso desde el servidor web. En algunos frameworks como Symfony, el directorio público no es el directorio raíz de la aplicación por seguridad.
  • Algún modo para gestionar los permisos de los directorios de la aplicación. No es para nada seguro tener permisos de escritura en todos los directorios de nuestra aplicación.
  • Posibilidad de ejecutar scripts php o powershell vía cmd en la instancia. Imaginemos que necesitamos vaciar un directorio en el que almacenamos archivos de caché o archivos temporales, podemos hacerlo mediante algún script que se ejecute vía web, pero igual puede interesarnos realizar estas gestiones o alguna otra mediante línea de comandos.

5 comentarios | Archivado como Cloud Computing, Desarrollo web, Sistemas TI | 01/04/2010

— por Asier Marqués

Por defecto y desde su versión 1.1, el driver oficial para trabajar con sql server 2005 o superior desde php realiza conexiones con marte MARS (Multiple Active Result Sets) activado.

Actualmente SQL Azure no soporta MARS, y para que nuestra conexión no fuerce la activación de esta funcionalidad en SQL Server tendremos que indicarle en el array de conexión lo siguiente:


$BD_SERVER = "[TOKEN].database.windows.net";
$BD_CONECTION_INFO   = array(
                              "UID"=>"blackslot@[TOKEN]",
                              "PWD"=>"P@ssw0rd",
                              "Database"=>"nombre_bd",
                              "ReturnDatesAsStrings"=> true,
                              "CharacterSet" => 'utf-8',
                              //Aquí desactivamos MARS
                              'MultipleActiveResultSets'=> false);

1 comentario | Archivado como Cloud Computing, Desarrollo web, Sistemas TI | 31/03/2010

— por Asier Marqués

asp.net mvc

Hace un par de semanas se anunciaba la segunda versión del framework asp.net MVC 2, totalmente compatible con los desarrollos sobre asp.net MVC 1.

Además de helpers fuertemente tipados, validación de modelos y controladores asincronos nos encontramos otras novedades que  Scott Guthrie mencionó en su blog el día del lanzamiento

Podéis ver videos y materiales de introducción sobre el framework en el nuevo sitio web oficial.

Por nuestra parte acabamos de actualizar nuestros servidores grid Microsoft y ya disponen de soporte para MVC 2, además de contar como hasta ahora de SQL Server 2008.

Recordaros que podéis probar estos servicios por 1€ al mes durante 6 meses gracias a nuestra promoción junto a Microsoft.

1 comentario | Archivado como Desarrollo web, Novedades, Nuestros servicios | 30/03/2010