Blog

Archivo: diciembre de 2009

Muchas gracias y feliz 2010

Publicado en General en diciembre 31, 2009 6:55 pm

Muchas gracias por confiar en nosotros, por cada RT en twitter, por estar ahí (en el blog, en twitter, facebook, en persona…), por trabajar con nosotros y sobre todo, por hacer que este año lo empecemos con toda la ilusión y ganas de ofreceros el servicio y la atención que os merecéis.

feliz2010

Extraer elementos de una lista html y exportarlos a un array con php

Publicado en Desarrollo web en diciembre 31, 2009 5:50 pm

Puede que en algún momento de nuestras apasionantes vidas como desarrolladores web nos interese extraer el contenido de cada uno de los elementos de una lista html (<li>,<option> o similares) y almacenarlos en un array para utilizarlos a lo largo de nuestra aplicación.

Me he escrito una función que hace precisamente esto, gracias a la función preg_replace de php.


function li2Array($html,$elemento="li"){

  $a = array("/<".$elemento.">(.*?)</".$elemento.">/is");
  $b = array("$1 <explode>");

  $html  = preg_replace($a, $b, $html);
  $array = explode("<explode>",$html);

  return $array;

}

Solución al error HTTP/1.1 417 Expectation Failed Connection: close Content-Length: 0 en php con curl

Publicado en Desarrollo web en diciembre 31, 2009 8:32 am

Cuando desarrollamos con php haciendo uso de la librería curl, para hacer peticiones http post, nos podemos encontrar con el siguiente error al mostrar las cabeceras de respuesta: “HTTP/1.1 417 Expectation Failed Connection: close Content-Length: 0

La solución al problema es enviar el campo Expect (basta con enviarlo vacío) dentro de las cabeceras http de la petición. Lo vemos en el siguiente ejemplo:


$ch = curl_init();

//metemos el campo expect en la cabeceras

curl_setopt( $ch, CURLOPT_HTTPHEADER, $headers = array( "Expect:"));

Symfony, diferentes choices para un sfWidgetFormChoice en un mismo formulario

Publicado en Desarrollo web en diciembre 30, 2009 8:10 pm

Los desarrolladores familiarizados con symfony conocen la clase sfWidgetFormChoice que nos permite crear un campo html seleccionable (tipo select, radio, checkbox y list) de una forma muy cómoda:

class ComprarForm extends sfForm{

  private $opciones = false;

  //configuramos el widget con sus opciones en la clase formulario
  public function configure()
  {

     $this->opciones  = array('manzanas',
                              'peras',
                              'limones');

     $this->setWidgets(array(
                              'quiero'   => new sfWidgetFormChoice(
                                              array('expanded' => true,
                                                    'choices'  => $this->opciones)),
                       ));

     $this->setValidators( array( 'quiero' => new sfValidatorChoice(
                                              array( 'required' => true,
                                                     'choices'=> array_keys($this->opciones)
                                                   )),
                         ));
  }

}

//en la acción creamos el formulario
  $this->formulario = new ComprarForm();

//y en la vista generamos el campo tipo <select> con las opciones configuradas
  $formulario['quiero']->render();

Hoy me he encontrado con la necesidad de tener que crear diferentes opciones segun la petición que llegue a la acción que muestra el formulario. Quizá me interese que en lugar de que mi select se rellene con frutas como en el ejemplo anterior, se rellene con todo tipo de utensilios para matar zombies, por ejemplo.

Para conseguir esto podríamos crear otra clase de formulario que contenga un widget con esas opciones y sus respectivos validadores, pero eso rompería totalmente la regla de oro en el desarrollo web ágil: “Don’t repeat yourself“.

La solución más elegante es sobreescribir el constructor de nuestra clase ComprarForm, de tal forma que se especialice con respecto al de su padre sfForm para admitir un parámetro extra llamado “tipoDeProducto”.

class ComprarForm extends sfForm{

  private $opciones = false;

  public function __construct($tipoDeProducto='frutas',
                              $defaults = array(),
                              $options = array(),
                              $CSRFSecret = null){

      switch($tipoDeProducto){
        case 'frutas':
          $this->opciones  = array('manzanas',
                                   'peras',
                                   'limones');
        break;
        case 'armas':
          $this->opciones  = array('sierra eléctrica',
                                   'recortada',
                                   'katana',
                                   'rifle de francotirador');
        break;
      }

      parent::__construct($defaults, $options, $CSRFSecret);

 }

 //configuramos el widget con sus opciones en la clase formulario
 public function configure()
 {

     $this->setWidgets(array(
                              'quiero'   => new sfWidgetFormChoice(
                                                   array('expanded' => true,
                                                         'choices'  => $this->opciones)),
                      ));

    $this->setValidators(array(
                              'quiero' => new sfValidatorChoice(
                                               array('required' => true,
                                                     'choices'=> array_keys($this->opciones)
                                                    )),
                         ));
 }

}

Ahora ya tenemos todo preparado para poder especificar desde la acción qué opciones queremos en el campo select del formulario ComprarForm

   $this->formulario = new ComprarForm('armas');

Y en la vista sin modificar el código ya nos aparecerán los productos que estamos deseando comprar.

SQL Server al día

Publicado en Sistemas TI en diciembre 30, 2009 1:07 pm

No hace falta explicar la conveniencia de mantener un sistema actualizado, aunque todos los sysadmins no son de mi misma opinión y muchos se jactan de tener uptimes altísimos en su servidor, confundiendolo con el SLA del servicio.

Para saber la compilación de SQL Server, lo vemos desde el SQL Server Management si lo tenemos instalado o ejecutando:

SELECT SERVERPROPERTY('productversion'), SERVERPROPERTY ('productlevel'), SERVERPROPERTY ('edition')

A falta de una lista oficial que agrupe todas las compilaciones, en SQLTEAM hay publicada una lista mantenida por Bill Graciano que os será de ayuda.

Saludos, Sergio Sainz.

Conexiones remotas en SQL Server 2008 y 2005

Publicado en Sistemas TI en diciembre 27, 2009 12:27 pm

Quien se haya encontrado con un Sql Server recién instalado posiblemente se habrá visto en la situación de que necesita conectar a él desde otro equipo remoto.

En primer lugar si el equipo cliente no tiene las herramientas de cliente para SQL Server, puedes descargar la versión gratuita del administrador de SQL;

- Para SQL Server 2005: Microsoft SQL Server Management Studio Express .

- Para SQL Server 2008: Microsoft SQL 2008 Server Management Studio Express .

Mejor aún, si lo deseas puedes descargar el Kit de Herramientas de Sql Server Express 2005, este Kit además del administrador de SQL, incluye una herramienta gráfica de administración, y Business Intelligence Development Studio, un entorno de creación y edición de informes que usa SQL Server Reporting Services. Si usas SQL 2008, la descarga recomendada es Microsoft SQL Server 2008 Express with Advanced Services.

Configurando el servidor

1- Vamos a la utilidad Configuración de superficie de SQL Server 2005 (Surface Area Configuration Utility) > Configuración de superficie para servicios y conexiones > conexiones remotas > Conexiones locales y remotas > Usar TCP/IP y canalizaciones con nombre.

Sql Configuration Manager

2- Vamos a SQL Configuration Manager > Configuración de red de SQLEXPRESS y habilitamos las conexiones TCP/IP y las canalizaciones con nombre.

Sql Configuration Manager3- Seguimos en el SQL Configuration Manager > Protocolos de SQL Express > TCP/IP y en las propiedades Direcciones IP > IPALL > Puerto TCP > poner el 1433 (o el puerto que desees habilitar para SQL)

Protocolos TCP/IP

4- Crear una excepción en el FW para C:Archivos de programaMicrosoft SQL ServerMSSQL.1MSSQLBinnsqlsrvr.exe

Y abrir los puertos 1434 (UDP) y 1433 (TCP)

5- Finalmente hay que reiniciar el servicio de SQL para que se apliquen los cambios y ya estamos listos para probar la conexión desde nuestro equipo cliente.

¡¡NO PIERDAS LA OPORTUNIDAD DE ALOJAR TUS BASES DE DATOS SQLSERVER CON BLACKSLOT!!

Contempla nuestras ofertas de

HOSTING COMPARTIDO WINDOWS

SERVIDORES CLOUD WINDOWS

o solicítanos un plan de prueba escribiendo a

info@blackslot.com

Fotolia_18406256_XS

Transacciones con Propel 1.3 y Symfony >= 1.2

Publicado en Desarrollo web en diciembre 26, 2009 8:24 pm

Cuando tenemos que actualizar varias tablas, insertando, borrando o actualizando varios registros en cada una de las mismas y cuya integridad puede estar en riesgo en caso de que una de las operaciones falle, nos es crítico el uso de transacciones.

Si estamos usando Symfony y el orm Propel, con mySql e innodb, podemos hacer lo siguiente:


    $con = Propel::getConnection();

    try {
         //abrimos la transacción
         $con->beginTransaction();

         //operaciones pertinentes contra la base de datos

         //si todo va bien guardamos los cambios
         $con->commit();

    } catch (Exception $e) {

         // Hacemos rollback de los cambios en caso de fallo
         $con->rollback();
         //devolvemos el error al depurador
         throw $e;
    }

Saludos, Asier Marqués

Bloquear IPs desde el firewall de Windows 2008

Publicado en Sistemas TI en diciembre 25, 2009 3:50 pm

Una de las cosas que más me gustan respecto a la seguridad de Windows, son las mejoras en el firewall de Windows 2008. Entre muchas más posibilidades que en la versión anterior de Windows, podemos bloquear ips atacantes de una forma sencilla.

Como estoy seguro de que ningún administrador deja de revisar la pestaña Seguridad en el Visor de Eventos (¿verdad que no?), en ocasiones pueden detectarse reiterados intentos de conexión, si son ilégitimos, aunque no consigan nada pueden lograr un DDOS en toda regla, por ello lo mejor es filtrarlos desde un firewall perimetral. A falta de  uno, ahora podemos filtrar desde el propio server.

1) Abrimos el firewall de Windows.

2)Seleccionamos añadir nueva regla...

3) Añadimos una regla personalizada.

Añadir regla de firewall

4) La aplicamos a Todos los programas.

firewall

5) Tipo de protocolo: Cualquiera.

fw protocolo

6) Agregamos la IP que queremos bloquear, también puede ser un rango entero.

fw agregar ip a bloquear

7) Seleccionamos: Bloquear la conexión.

fw bloquear la conexion

8) Indicamos a que redes aplicamos la regla.

fw redes

9) Le damos un nombre identificativo.

fw nombre regla

10) Y ya tenemos nuestra regla de seguridad creada.

firewall windows 2008

Saludos, Sergio Sainz

Html templates con JQuery

Publicado en Desarrollo web en diciembre 25, 2009 9:22 am

Cuando te acostumbras a programar siguiendo el patrón MVC, te resulta incómodo y poco limpio el hardcodear Html en el código interno de la aplicación.

Si embargo en JavaScript, estamos mal acostumbrados a ver códigos como el siguiente:


var html = "<li class='" + class + "'>" +
           "<input type='text' id='"+ id +"' /></li>";

Aunque el código en sí no es incorrecto, cuando tenemos que realizar cambios en nuestra aplicación (situación bastante común) sin volvernos locos, necesitaremos separar o hacer más mantenible ese código html que queremos dinamizar desde javascript.

Una solución consiste en escribir el código html que vamos a reutilizar desde javascript, con una serie de patrones que sustituiremos más adelante por los valores que nos interesen.

Por ejemplo, si quisiéramos rellenar el siguiente elemento <ul>


<ul id="list"></ul>

Junto antes de terminar el body colocaríamos el siguiente bloque de código


<div id="bloque_lista" style="display:none">

  <li class="|class|">
    <input type=”text” id=”input|row_id|” />
  </li>

</div>

Para rellenar la lista, bastaría con sustituir los patrones |class| y |row_id| por los valores que necesitemos.


function addItemToList() {

   var list     = $('#list');
   var class    = "rosa";
   var template = $('#bloque_lista').html();

   template = template.replace(/|class|/gi, class)

   for(var id=1;id<11;id++){

     list.append(template.replace(/|row_id|/gi, id));

   }

}

Saludos, Asier Marqués

Cómo activar o deshabilitar Safe Mode (Modo Seguro) en nuestro panel

Publicado en Nuestros servicios Sistemas TI en diciembre 24, 2009 12:59 pm

Algunas aplicaciones, como WordPress necesitan que el Safe Mode (Modo Seguro) no este activo. Esto se puede controlar facilmente desde nuestro panel de control, sin tocar una línea de código.

1) En el panel de control accedemos a Ajustes de alojamiento.

ajustes de alojamiento

2) En el apartado de soporte para PHP, activamos o desactivamos la función php_mode.

safemode

Cargar extensión de php desde código (en tiempo de ejecución)

Publicado en Desarrollo web en diciembre 24, 2009 9:37 am

Para cargar una extensión en tiempo de ejecución en php, tenemos la función dl();

Para cargar por ejemplo la extensión para conectarse a una base de datos mysql haríamos:

if(!extension_loaded("mysql")){
  dl("php_mysql.".PHP_SHLIB_SUFFIX);
}

El valor de la constante PHP_SHLIB_SUFFIX almacena la extensión que tendría una librería dependiendo el sistema operativo en el que corra nuestra aplicación.

Saludos, Asier Marqués

Disponible el SDK para Powershell 2.0

Publicado en Sistemas TI en diciembre 23, 2009 7:08 pm

Microsoft ha publicado la descarga del sdk para powershell 2.0, viene con ejemplos de código y documentación en los que se muestra cómo atacar a las diferentes APIs de powershell, y como usar características como acceso remoto, eventing, transactions y jobs en tus aplicaciones.

Ordenar arrays asociativos contenidos en otro array con php

Publicado en Desarrollo web en diciembre 23, 2009 4:27 pm

Algunas veces disponemos de un array que contiene a su vez varios arrays asociativos, que contienen por ejemplo datos obtenidos tras una consulta a la base de datos.

Puede que dicho array esté cacheado y no queramos atacar a la base de datos para ordenar esos resultados, por lo que nos vendría genial poder ordenar los arrays asociativos que contenga dicho array, en base a los valores que contenga una de las claves de los mismos.

Lo vemos más claro en un ejemplo. Tenemos el siguiente array:


$resultados = array(

array(

      'id' => 1,
      'nombre' => 'Enjuto',
      'apellido' => 'Mojamuto'

     ),

array(

      'id' => 2,
      'nombre'  => 'Marlo',
      'apellido'  => 'Brando'

     )

);

En php disponemos de la función usort(), que ordena en base a una función de comparación que nosotros especifiquemos.

Por ejemplo si quisiéramos ordenar en base a la clave id, en orden descendiente, la función sería:


function comparar($x, $y){

          if ( $x['id'] == $y['id'] )
             return 0;
          else if ( $x['id'] > $y['id'] )
             return -1;
          else
             return 1;

}

Y ahora llamamos a usort para que utilice dicha función:


//si no estamos en un entorno Orientado a Objetos
usort($resultados, array('comparar'));

//si estamos en un entorno Orientado a Objetos
usort($resultados, array('nombreDeClase','comparar'));

¿Por qué contratar nuestros servicios?

Publicado en Desarrollo web Nuestros servicios Sistemas TI en diciembre 22, 2009 9:06 pm

En Blackslot nos dedicamos a dos cosas: a la gestión de sistemas TI y el desarrollo avanzado de aplicaciones web para nuestros clientes.
Nuestro enfoque consiste en crear soluciones conjuntas o específicamente para cada uno de esas áreas sin salirnos del ámbito de internet.

Gestión de infraestructuras TI

En internet es clave disponer de una óptima infraestructura técnica de sistemas, que no sólo englobe la instalación y configuración del servidor o servidores involucrados en un proyecto. Nuestra apuesta es una gestión de sistemas en la que los profesionales encargados de administrar las infraestructuras de nuestros clientes o nuestras propias soluciones platform as a service, tengan siempre un punto de vista crítico sobre las necesidades reales que pueda tener el proyecto, ofreciendo un know-how junto a las tecnologías de desarrollo más vanguardistas disponibles en éste momento.

Desarrollo avanzado de aplicaciones para internet

Hoy en día, el desarrollo de un proyecto en internet requiere un punto de vista global que abarca más disciplinas que el diseño y desarrollo de una aplicación web. Además de contar con una buena arquitectura de software, que escale adecuadamente y sea fácilmente mantenible, nos enfrentamos con la problemática de conseguirlo haciendo un buen uso de los recursos de los que precisamos, tanto económicos como tecnológicos, tanto a medio como a largo plazo.

En Blackslot desarrollamos bajo plataformas maduras, como .net o php, haciendo uso de herramientas y frameworks como asp.net mvc y symfony que nos permiten desarrollar aplicaciones de una forma ágil, dotadas de una arquitectura sólida, escalable y de gran nivel de calidad.

Además podemos asegurar un gran nivel de estabilidad y fiabilidad tanto a medio como a largo plazo en nuestras aplicaciones, al realizar despliegues sobre nuestra propia infraestructura de sistemas. Este punto es nuestra mayor baza para poder asegurar un servicio completo y de gran calidad, sin importar lo ambicioso que pueda llegar a ser el proyecto.

Instalar WordPress desde nuestro panel de control

Publicado en Nuestros servicios Sistemas TI en diciembre 22, 2009 7:46 pm

1) En  el panel de control de nuestro dominio, seleccionamos la opción Aplicaciones web.

image

2) Seleccionamos Instalar aplicación web.

image

3) Localizamos la aplicación WordPress y pinchamos en Instalar.

image

4) En este punto se revisarán los requisitos de WordPress y si falta algo, el asistente nos avisará de ello. Tendremos que resolver el problema para poder continuar.

image

Nota: Para resolver este problema de Safe Mode, visita este artículo.

5) Aceptamos el texto legal.

Hosting WordPress en Blackslot 1

6) Ahora vamos a la parte más importante del proceso de instalación.

  1. Botón personalizado para acceder a la aplicación: Creará un botón de acceso a la aplicación en el panel de control.
  2. Directorio de destino: Si queremos que el blog aparezca como página principal de nuestro dominio, entonces hay que elegir la opción Carpeta raíz (/). Esto instalará WordPress directamente en el directorio /httpdocs de nuestro alojamiento.
    Si por el contrario queremos meterlo en un subdirectorio, como http://midominio.com/wordpress le indicamos en la opción otros el lugar deseado.
  3. Servidor de la base de datos: Lo normal es dejar el que viene por defecto.
  4. Nombre de la base de datos: Autogenera un nombre bastante difícil de recordar. Se puede sustituir por algo más sencillo, lo mismo para el usuario.
  5. Contraseña: Será la del usuario que se crea para la base de datos.
  6. Administrator´s login: Será el usuario administrador de WordPress (wp-admin), es importante recordarlo, así como la contraseña que le pongamos.
  7. Weblog title: Finalemnte ponemos el título de nuestro blog y ya podemos pinchar en instalar.

Hosting WordPress en Blackslot 2

7) Una vez tenemos la aplicación instalada, podemos verla desde el panel y acceder a la misma.

Hosting WordPress en Blackslot 3

Hosting WordPress en Blackslot 4