- 08/05/2020
- 12:44 pm
- marcofbb
Dejo un código para firmar URL para google storage con el lenguaje de programación PHP
<?php
/*
DOCS:
https://cloud.google.com/storage/docs/access-control/signed-urls
https://cloud.google.com/storage/docs/access-control/signing-urls-manually
Translate to PHP of code Python: https://github.com/GoogleCloudPlatform/python-docs-samples/blob/master/storage/signed_urls/generate_signed_urls.py
*/
function generate_signed_url_google($service_account_file, $bucket_name, $object_name, $subresource = null, $expiration=604800, $http_method='GET', $query_parameters = array(), $headers = array()){
date_default_timezone_set('UTC');
if($expiration > 604800){
echo 'Expiration Time can\'t be longer than 604800 seconds (7 days).';
return;
}
$google_credentials = json_decode(file_get_contents($service_account_file), true);
if(empty($google_credentials)){
echo 'Error credentials.';
return;
}
$escaped_object_name = implode('/', array_map('rawurlencode', explode('/', $object_name)));
$canonical_uri = '/'.$escaped_object_name;
$datetime_now = time();
$request_timestamp = date('Ymd\THis\Z', $datetime_now);
$datestamp = date('Ymd', $datetime_now);
$client_email = $google_credentials['client_email'];
$credential_scope = $datestamp.'/auto/storage/goog4_request';
$credential = $client_email.'/'.$credential_scope;
$host = $bucket_name.'.storage.googleapis.com';
$headers['host'] = $bucket_name.'.storage.googleapis.com';
$canonical_headers = '';
$signed_headers = '';
$ordered_headers = $headers;
ksort($ordered_headers, SORT_STRING);
foreach($ordered_headers as $key => $value){
$key = strtolower($key);
$value = ($value);
$canonical_headers .= $key.':'.$value."\n";
$signed_headers .= $key.';';
}
$signed_headers = substr($signed_headers, 0, -1);
$query_parameters['X-Goog-Algorithm'] = 'GOOG4-RSA-SHA256';
$query_parameters['X-Goog-Credential'] = $credential;
$query_parameters['X-Goog-Date'] = $request_timestamp;
$query_parameters['X-Goog-Expires'] = $expiration;
$query_parameters['X-Goog-SignedHeaders'] = $signed_headers;
if(!empty($subresource)){
$query_parameters[$subresource] = '';
}
$canonical_query_string = '';
$ordered_query_parameters = $query_parameters;
ksort($ordered_query_parameters, SORT_STRING);
foreach($ordered_query_parameters as $key => $value){
$key = rawurlencode($key);
$value = rawurlencode($value);
$canonical_query_string .= $key.'='.$value.'&';
}
$canonical_query_string = substr($canonical_query_string, 0, -1);
$canonical_request = implode("\n",array($http_method, $canonical_uri, $canonical_query_string, $canonical_headers, $signed_headers, 'UNSIGNED-PAYLOAD'));
$canonical_request_hash = hash('sha256', utf8_encode($canonical_request));
$string_to_sign = implode("\n",array('GOOG4-RSA-SHA256', $request_timestamp, $credential_scope, $canonical_request_hash));
$pkeyid = $google_credentials['private_key'];
if(!openssl_sign($string_to_sign,$signature,$pkeyid,'sha256')) {
$signature = 'none';
} else {
$signature = bin2hex($signature);
}
$scheme_and_host = 'https://'.$host;
$signed_url = $scheme_and_host.$canonical_uri.'?'.$canonical_query_string.'&x-goog-signature='.$signature;
return $signed_url;
} |
<?php
/*
DOCS:
https://cloud.google.com/storage/docs/access-control/signed-urls
https://cloud.google.com/storage/docs/access-control/signing-urls-manually
Translate to PHP of code Python: https://github.com/GoogleCloudPlatform/python-docs-samples/blob/master/storage/signed_urls/generate_signed_urls.py
*/
function generate_signed_url_google($service_account_file, $bucket_name, $object_name, $subresource = null, $expiration=604800, $http_method='GET', $query_parameters = array(), $headers = array()){
date_default_timezone_set('UTC');
if($expiration > 604800){
echo 'Expiration Time can\'t be longer than 604800 seconds (7 days).';
return;
}
$google_credentials = json_decode(file_get_contents($service_account_file), true);
if(empty($google_credentials)){
echo 'Error credentials.';
return;
}
$escaped_object_name = implode('/', array_map('rawurlencode', explode('/', $object_name)));
$canonical_uri = '/'.$escaped_object_name;
$datetime_now = time();
$request_timestamp = date('Ymd\THis\Z', $datetime_now);
$datestamp = date('Ymd', $datetime_now);
$client_email = $google_credentials['client_email'];
$credential_scope = $datestamp.'/auto/storage/goog4_request';
$credential = $client_email.'/'.$credential_scope;
$host = $bucket_name.'.storage.googleapis.com';
$headers['host'] = $bucket_name.'.storage.googleapis.com';
$canonical_headers = '';
$signed_headers = '';
$ordered_headers = $headers;
ksort($ordered_headers, SORT_STRING);
foreach($ordered_headers as $key => $value){
$key = strtolower($key);
$value = ($value);
$canonical_headers .= $key.':'.$value."\n";
$signed_headers .= $key.';';
}
$signed_headers = substr($signed_headers, 0, -1);
$query_parameters['X-Goog-Algorithm'] = 'GOOG4-RSA-SHA256';
$query_parameters['X-Goog-Credential'] = $credential;
$query_parameters['X-Goog-Date'] = $request_timestamp;
$query_parameters['X-Goog-Expires'] = $expiration;
$query_parameters['X-Goog-SignedHeaders'] = $signed_headers;
if(!empty($subresource)){
$query_parameters[$subresource] = '';
}
$canonical_query_string = '';
$ordered_query_parameters = $query_parameters;
ksort($ordered_query_parameters, SORT_STRING);
foreach($ordered_query_parameters as $key => $value){
$key = rawurlencode($key);
$value = rawurlencode($value);
$canonical_query_string .= $key.'='.$value.'&';
}
$canonical_query_string = substr($canonical_query_string, 0, -1);
$canonical_request = implode("\n",array($http_method, $canonical_uri, $canonical_query_string, $canonical_headers, $signed_headers, 'UNSIGNED-PAYLOAD'));
$canonical_request_hash = hash('sha256', utf8_encode($canonical_request));
$string_to_sign = implode("\n",array('GOOG4-RSA-SHA256', $request_timestamp, $credential_scope, $canonical_request_hash));
$pkeyid = $google_credentials['private_key'];
if(!openssl_sign($string_to_sign,$signature,$pkeyid,'sha256')) {
$signature = 'none';
} else {
$signature = bin2hex($signature);
}
$scheme_and_host = 'https://'.$host;
$signed_url = $scheme_and_host.$canonical_uri.'?'.$canonical_query_string.'&x-goog-signature='.$signature;
return $signed_url;
}
Gist: https://gist.github.com/marcofbb/97c875bb51f2dc9740588f8e550aac77
- 27/05/2015
- 10:53 pm
- marcofbb
El siguiente script lo que hace es pixelar una imagen con PHP. Utiliza la librería GD de PHP para pixelar la imagen.


Continuar leyendo..
- 06/01/2014
- 9:15 pm
- marcofbb
Este tutorial es muy útil para los que recién empiezan con el mundo de los VPS, hoy vamos a enseñarles a instalar Apache y montar su sitio web en CentOS 6 32bit y 64bit.
Primero nos tenemos que conectar vía SSH, como les enseñamos en este articulo.
Luego en consola tenemos que ejecutar los siguientes comandos
Continuar leyendo..
- 15/11/2013
- 9:36 pm
- marcofbb
Les dejo un código para pasar del formato UNIX time(); a días, horas, minutos y segundos. La función es muy sencilla, es simplemente matemática básica. Se puede modificar para crear una función que diga “Hace n tiempo” para darle un toque personalizado a las fechas.
function hace($time){
//
$time = time() - $time;
//
if($time < 10) $dato_dia = number_format(($time / (60*60)) / 24,6); else $dato_dia = ($time / (60*60)) / 24;
$data = explode('.',$dato_dia);
$dato_dia = $data[0];
$dato_hora = ('0.'.$data[1])*24;
$data = explode('.',$dato_hora);
$dato_hora = $data[0];
$dato_min = ('0.'.$data[1])*60;
$data = explode('.',$dato_min);
$dato_min = $data[0];
$dato_seg = ('0.'.$data[1])*60;
$data = explode('.',$dato_seg);
$dato_seg = $data[0];
if($dato_dia < 10) $dato_dia = '0'.$dato_dia;
if($dato_hora < 10) $dato_hora = '0'.$dato_hora;
if($dato_min < 10) $dato_min = '0'.$dato_min;
if($dato_seg < 10) $dato_seg = '0'.$dato_seg;
//
if($dato_dia == '00'){
return $dato_hora.':'.$dato_min.':'.$dato_seg;
} else {
return $dato_dia.' days '.$dato_hora.':'.$dato_min.':'.$dato_seg;
}
}
echo hace(1384428541);
// 01 days 13:01:39 |
function hace($time){
//
$time = time() - $time;
//
if($time < 10) $dato_dia = number_format(($time / (60*60)) / 24,6); else $dato_dia = ($time / (60*60)) / 24;
$data = explode('.',$dato_dia);
$dato_dia = $data[0];
$dato_hora = ('0.'.$data[1])*24;
$data = explode('.',$dato_hora);
$dato_hora = $data[0];
$dato_min = ('0.'.$data[1])*60;
$data = explode('.',$dato_min);
$dato_min = $data[0];
$dato_seg = ('0.'.$data[1])*60;
$data = explode('.',$dato_seg);
$dato_seg = $data[0];
if($dato_dia < 10) $dato_dia = '0'.$dato_dia;
if($dato_hora < 10) $dato_hora = '0'.$dato_hora;
if($dato_min < 10) $dato_min = '0'.$dato_min;
if($dato_seg < 10) $dato_seg = '0'.$dato_seg;
//
if($dato_dia == '00'){
return $dato_hora.':'.$dato_min.':'.$dato_seg;
} else {
return $dato_dia.' days '.$dato_hora.':'.$dato_min.':'.$dato_seg;
}
}
echo hace(1384428541);
// 01 days 13:01:39
- 13/11/2013
- 10:03 pm
- marcofbb
En muchos casos necesitamos recorrer el directorio para obtener los archivos de la carpeta con PHP, a continuación le dejo el código para lograrlo. Con el siguiente código vamos a poder leer y/o explorar X carpeta para listar todos los archivos.
$dir = "carpeta";//Especifica el directorio a leer
$rep = opendir($dir);//Abrimos el directorio
while ($arc = readdir($rep)) {//Recorremos el array
// No mostramos los archivos .. ; . y ''
if($arc != '..' && $arc != '.' && $arc != ''){
echo "<a href=".$dir."/".$arc." target='_blank'>".$arc."</a><br />"; //Imprimimos el nombre del archivo con un link
}
}
closedir($rep);//Cerramos el directorio
clearstatcache(); //Limpia la caché de estado de un archivo |
$dir = "carpeta";//Especifica el directorio a leer
$rep = opendir($dir);//Abrimos el directorio
while ($arc = readdir($rep)) {//Recorremos el array
// No mostramos los archivos .. ; . y ''
if($arc != '..' && $arc != '.' && $arc != ''){
echo "<a href=".$dir."/".$arc." target='_blank'>".$arc."</a><br />"; //Imprimimos el nombre del archivo con un link
}
}
closedir($rep);//Cerramos el directorio
clearstatcache(); //Limpia la caché de estado de un archivo
- 24/10/2013
- 12:15 am
- marcofbb
Este código php es para crear una tabla de multiplicar de tamaño 10×10, véase imagen. El código es muy sencillo, por ahí aburrido para la gente medianamente experimentada con el PHP, pero siempre es bueno recordar y practicar.
Continuar leyendo..
- 06/07/2013
- 6:22 pm
- marcofbb

Tras algunos meses de trabajo intenso, versiones beta y algunos retrasos en la fecha de lanzamiento previsto, el pasado viernes 21/06/2013 se anuncia la inmediata disponibilidad de PHP 5.5.
Esta nueva actualización trae varias mejoras y correcciones a la versión anterior (5.4), entre ellas se encuentran la integración de Zend Optimizer + o la inclusión de la función “array_column” para mejorar la extracción de columnas.
En esta nueva versión se añade generadores que proporcionan una manera fácil de implementar itenadores, además de esto, se añade una nueva API que hace más fácil la seguridad y el manejo de contraseñas usando la misma biblioteca subyatente crypt () añadida en PHP.
También ha sido actualizada la libreria GD a la versión 2.1, añadiendo nuevas funciones y mejorando algunas ya existentes.
Con la llegada de PHP 5.5 ha sido liberada una versión beta del sitio php.net, esperada por muchos desarrolladores que usan día a día éste sitio, además se ha eliminado el soporte para Windows XP y Windows 2003.
Si deseas tener más información y seguir conociendo las características de PHP 5.5, así como acceder a su descarga, puedes visitar: php.net
- 31/03/2013
- 11:47 am
- marcofbb
El foro creció mucho en el desarrollo de Stream, ya sea con PHP y/o JAVA. En esta oportunidad el usuario “xlfederalelk0lx” descubrió una forma para burlar el sistema de GkPlugins, logrando sacar la limitación de una hora para los usuarios que no poseían licencias y poder utilizarlo sin limite. Es decir van a tener el stream GkPlugins nulled.
Hilo oficial en el foro, para soporte y/o dudas: https://www.marcofbb.com.ar/foro/stream/soporte-pack-gkplugins-liberados/
Lista de servidores soportados para el stream: http://gkplugins.com/
PD: Si le gusta como funciona GkPlugins recomiendo comprarlo, si nos ponemos a pensar en una web de películas online por ejemplo es muy necesario y si todo va bien, el valor de la licencia no seria un problema. Pueden comprar la lincencia desde http://gkplugins.com/order/

- 25/02/2013
- 11:47 pm
- marcofbb
Para obtener la url de un Thumbnail de WordPress para poder utilizarlo en tu tema, vamos a utilizar la función que nos brinda WordPress, una de ellas es wp_get_attachment_image_src y get_post_thumbnail_id.
$foto = wp_get_attachment_image_src( get_post_thumbnail_id($post->ID), 'thumbnail' );
$src = $foto['0'];
echo '<img src="'.$src.'">'; |
$foto = wp_get_attachment_image_src( get_post_thumbnail_id($post->ID), 'thumbnail' );
$src = $foto['0'];
echo '<img src="'.$src.'">';
En vez de thumbnail podemos utilizar medium, large or full.
La forma tradicional que nos da WordPress para obtener la imagen destacada del post, es la siguiente
if ( has_post_thumbnail() ) {
the_post_thumbnail('thumbnail'); // Nos devuelve <img src="IMAGEN" class="TAMAÑO" />
} |
if ( has_post_thumbnail() ) {
the_post_thumbnail('thumbnail'); // Nos devuelve <img src="IMAGEN" class="TAMAÑO" />
}
- 06/01/2013
- 4:55 pm
- marcofbb
En esta oportunidad les traigo un clon de Tinypaste programado por mi, espero que les guste.
– Sistema MVC propio
– Misma funciones que Tinypaste excluyendo el sistema de publicidad
– Mismo diseño que Tinypaste
– No sistema de administración
Continuar leyendo..
Páginas: 1
2
3
4
5
6
7
8
Siguiente