Testing

Esto es solo una prueba de enlace a cualquier sitio

Tags:

Virtual Hosts de Apache con XAMPP en OSX

Trabajar con Virtual Hosts de Apache bajo el entorno de XAMPP en Mac OSX puede ser un quebradero de cabeza si no se siguen ciertas pautas muy sencillas. Si no se hace bien, lo más normal es acabar obteniendo errores 403 Forbidden,  redirecciones al directorio xampp o cosas similares.

El procedimiento a seguir es el siguiente. En primer lugar, hay que habilitar en el fichero httpd.conf:

sudo vi /Applications/XAMPP/etc/httpd.conf

Para ello, habilitamos el include de los virtual hosts, descomentando esta línea:

# Virtual hosts
Include etc/extra/httpd-vhosts.conf

A continuación, hay que editar el fichero httpd-vhosts.conf donde se definen los virtual hosts de Apache:

sudo vi /Applications/XAMPP/etc/extra/httpd-vhosts.conf

Aquí lo que haremos será un host virtual que responderá a las peticiones que vengan bajo http://localhost y otro host virtual que responderá a las peticiones que vengan a un dominio concreto (en el ejemplo, foobar.com) y las redireccionará a una carpeta dentro del directorio htdocs del XAMPP:

<VirtualHost *:80>
    ServerName localhost
    DocumentRoot "/Applications/XAMPP/xamppfiles/htdocs"
    <Directory "/Applications/XAMPP/xamppfiles/htdocs">
        Options Indexes FollowSymLinks Includes execCGI
        AllowOverride None
        Order Allow,Deny
        Allow From All
    </Directory>
</VirtualHost>

# mysite1.com
<VirtualHost *:80>
    ServerName foobar.com
    DocumentRoot "/Applications/XAMPP/xamppfiles/htdocs/foobar.com"
    <Directory "/Applications/XAMPP/xamppfiles/htdocs/foobar.com">
        Options Indexes FollowSymLinks Includes execCGI
        AllowOverride None
        Order Allow,Deny
        Allow From All
    </Directory>
</VirtualHost>

Después de esto ya sólo nos queda reiniciar el Apache utilizando el manager-osx de XAMPP o la línea de comandos para que todo funcione

Tags:

Cómo instalar el repositorio EPEL en CentOS 6 y 7

Para instalar muchas utilidades usando yum, nos va a hacer falta instalar el repositorio EPEL. Hacerlo es muy sencillo en CentOS, en sus versiones 6 y 7:

CentOS 6

wget http://mirror.pnl.gov/epel/6/x86_64/epel-release-6-8.noarch.rpm
rpm -Uvh epel-release-6-8.noarch.rpm

Centos 7

wget http://mirror.pnl.gov/epel/7/x86_64/e/epel-release-7-5.noarch.rpm
rpm -Uvh epel-release-7-5.noarch.rpm
Tags: ,

Regalos de navidad baratos

Si en estas navidades quieres que tu rey mago favorito se gaste lo mínimo posible en tus regalos, te recomiendo las siguientes tiendas:

  1. Amazon.es: la tienda online por excelencia. Ideal si quieres comprar tecnología o libros, aunque tienen de todo como seguramente ya sabrás.
  2. El Corte Inglés: un clásico de toda la vida que está invirtiendo cada vez más en su tienda online. Ideal si quieres comprar ropa.
  3. Fnac: otra buena opción en cuanto a tecnología se refiere. Se hicieron famosos por su política de precio mínimo garantizado. Suelen tener mucho material de fotografía.
  4. Mediamarkt: aunque no sea un día SIN IVA, en Media Markt puedes encontrar buenos precios para estas navidades. De nuevo, ideales para temas tecnológicos.
  5. PC Componentes: si quieres algo de informática, no dejes de visitar a esta tienda murciana. Gran cantidad de productos a precios realmente interesantes.
  6. Casa del Libro: otro clásico. A pesar de la dura competencia de Amazon, aquí podrás encontrar esos libros ideales para leer al calorcito de la estufa.
Tags:

Comprimir todas las imágenes de un directorio recursivamente

Con este código se pueden volver a comprimir con una calidad determinada todas las imágenes de un directorio y de sus subdirectorios. Nótese que es sensible a mayúsculas y minúsculas, por lo que habrá que utilizarlo con .jpg, .JPG, etc.

find ./ -name “*.jpg” -exec mogrify -quality 70 {} \;

Tags:

Error 500 en cPanel tras svn checkout

Si tras hacer un svn checkout en un servidor con panel de control WHM/cPanel te da error 500, puede ser por muchas cosas. Pero si estás seguro de que no es un error del .htaccess ni cosas similares, entonces es recomendable ejecutar este comando:

/scripts/chownpublichtmls

¡Magia!

Tags: , , ,

Codigo Promocional Amazon 50€

¿Estás buscando un código promocional de Amazon? La verdad es que no es fácil encontrarlos, puesto que los códigos promocionales de Amazon no es algo que ofrezcan con frecuencia.

Sin embargo, pulsando este enlace, podrás obtener hasta 50€ de descuento dependiendo del importe de tu compra.

Tags:

Medios de pago offline y Google Universal Analytics

Si en tu negocio dispones de medios de pago offline (pago por transferencia, pago en un cajero, pago por TPV físico), probablemente te hayas planteado cómo haces para reflejarlos como transacciones en Google Analytics. A mí se me ocurrían hasta hace poco tres formas:

  1. Meter el código de seguimiento de transacciones en la página de pedido realizado pero pendiente de pago. Este método tiene el problema de que estás contando a la gente que finalmente no va a pagar (que puede ser mucha debido a gente que simplemente está probando).
  2. Meter el código de seguimiento de transacciones en la página de pedido pagado (la típica de gracias por su compra). Sin embargo, es muy probable que el usuario no vea dicha página, aunque le enviemos un e-mail confirmando el pago.
  3. Lanzar el código de seguimiento desde la Intranet de la empresa para que Analytics contabilice la venta, pero se perderá toda la referencia a la fuente de la que venía y se le asignará a la cookie que tenga el usuario de la Intranet.

Por lo tanto, hasta hace poco no había manera buena (o yo no la había encontrado) de notificar a Analytics de transacciones de comercio electrónico pagadas offline manteniendo correctamente la fuente/medio de la visita.

Measurement Protocol API

Con el lanzamiento de Google Universal Analytics, apareció también una API denominada Measurement Protocol. Esta API permite enviar datos a Google Analytics por medio de peticiones POST. Lo bueno de este método, es que podemos indicarle a Google Analytics el ID de la cookie del usuario, por lo que no perdemos la fuente y el medio de origen. Es decir, es la solución para notificar de transacciones offline a Google Analytics.

Implementación

Ya sabemos lo que tenemos que hacer, ahora vamos a ver cómo hacerlo desde PHP.

1) Cuando el usuario realiza el pedido, tenemos que quedarnos con su identificador de Google Analytics. Su valor lo podemos encontrar en la cookie:

list($x,$y,$cid1,$cid2) = explode(".",$_COOKIE['_ga']);
$cid = $cid1.".".$cid2;

2) Cuando marcamos el pedido como pagado en el sistema, hay que enviar una petición POST a una URL de Google para el pedido, y una petición POST por cada item, de manera muy similar a como lo hacemos con el código de seguimiento en Javascript. Os pongo el ejemplo de un pedido con un item:

// Convierte un array de variables a formato GET
function variables($variables)
{
	$elementos = array();
	foreach($variables as $key=>$value){
		array_push($elementos,$key."=".$value);
	}
	return implode("&",$elementos);
}

// Realiza una peticion CURL y devuelve el contenido
function peticion($url,$opciones=NULL)
{
	// Inicio la petición
	$conexion = curl_init($url);
	curl_setopt_array($conexion,$opciones);
	return curl_exec($conexion);
}

// Transaccion de Google Analytics
$variables = array(
	"v" => 1,
	"tid" => "UA-XXXXXXX-X",
	"cid" => $cid,
	"t" => "transaction",
	"ti" => NUMERO_DE_PEDIDO,
	"ta" => "",
	"tr" => TOTAL,
	"ts" => 0,
	"tt" => IMPUESTOS,
	"cu" => "EUR",				
);
$opciones = array(
	CURLOPT_POST => 1,
	CURLOPT_POSTFIELDS => variables($variables),
	CURLOPT_RETURNTRANSFER => true,
);
peticion("http://www.google-analytics.com/collect",$opciones);

// Item de la transaccion
$variables = array(
	"v" => 1,
	"tid" => "UA-XXXXXXX-X",
	"cid" => $cid,
	"t" => "item",
	"ti" => NUMERO_DE_PEDIDO,
	"in" => DESCRIPCION_ITEM,
	"ip" => TOTAL,
	"iq" => CANTIDAD,
	"ic" => ID_DE_PRODUCTO,
	"iv" => CATEGORIA,
	"cu" => "EUR"
);	
$opciones = array(
	CURLOPT_POST => 1,
	CURLOPT_POSTFIELDS => variables($variables),
);
peticion("http://www.google-analytics.com/collect",$opciones);

Y con esto tendríais listo vuestro seguimiento de transacciones offline. Google Analytics asignará la fuente de tráfico de la transacción a la última que tuviera almacenada para esa cookie. Detectaréis que alguna vez patina un poco al asignar la fuente (por ejemplo si el usuario accedió alguna vez a la web entre que realizó el pedido y realizó el pago por medio de una fuente distinta), pero en general es bastante fiable y desde luego una mucha mejor opción que las que contemplábamos al principio del artículo. Para que os hagáis una idea, sobre un volumen de 1.000 transacciones, las diferencias entre facturación real y facturación reflejada por Analytics eran de menos de un 2%.

Tags: , ,

RinoCamaras, ¿es una estafa?

Mañana os contaré lo que me pasó intentando comprar un Flash Canon MT 24 EX en RinoCamaras.

Tags:

Transponer array con PHP

Hoy os traigo un post rápido. Realizando algunos gráficos con Google Charts, me he dado cuenta de que me resultaba mucho más fácil rellenar el array multidimensional de datos de una manera y después transponerlo.

He encontrado en Stackoverflow un código para hacer esto de una manera muy elegante, que os dejo aquí por si os es interesante. A continuación, cómo transponer un array multidimensional con PHP:

function transpose($array) {
    array_unshift($array, null);
    return call_user_func_array('array_map', $array);
}
Tags: