Este script permite descargar as fotos na calidade orixinal dun álbum de Picasa (noso ou calquera público).
#!/bin/sh folder=`date +%Y%m%d%H%M%S` echo '' echo 'As fotos serán gardadas no directorio '$folder echo '' mkdir $folder cd $folder curl -s "$1" | xmlstarlet fo | grep "<enclosure" | sed 's/.*url="\(.*JPG\)".*/\1/gi' | sed 's#\([^/]\+\)$#d/\1#gi' | wget -nc -i - echo '' echo 'Proceso rematado' echo ''
O uso é sinxelo, simplemente debemos lanzalo indicando como primeiro parámetro a URL do RSS dese álbum, por exemplo:
sh picasa.sh "https://picasaweb.google.com/data/feed/base/user/112055619243168541088/albumid/5379685537144742993?alt=rss&kind=photo&hl=es"
Isto creará un directorio coa data e hora actual e gardará dentro as fotos descargadas.
Precisades un listado de imaxes que conteñan simplemente un número, ou 100 imaxes con números do 1 o 100?
Con este sinxelo script de PHP poderedes facelo :)
<?php
$draw = new ImagickDraw();
# Indicamos a cor do texto
$draw->setFillColor('black');
# Indicamos a tipografía
$draw->setFont('Arial');
# Indicamos o tamaño do texto
$draw->setFontSize(300);
# Centramos o texto na imaxe
$draw->setGravity(Imagick::GRAVITY_CENTER);
for ($i = 1; $i <= 300; $i++) {
$image = new Imagick();
# Indicamos o tamaño da imaxe, neste caso 798x798 (+ os dous do borde) e fondo branco
$image->newImage(798, 798, 'white');
# Metemos o número na imaxe
$image->annotateImage($draw, 0, 0, 0, $i);
# Dámoslle un borde de 1 píxel de cor negra
$image->borderImage('black', 1, 1);
# Dámoslle formato PNG
$image->setImageFormat('png');
# Gardamos a imaxe nun arquivo
$image->writeImage(sprintf('%03d', $i).'.png');
}
?>
Este exemplo crea 300 imaxes que conteñen do número 1 ata o 300.
A execución deste script da o seguinte resultado http://dl.dropbox.com/u/1050738/1-300.zip
Un dos problemas de subir as nosas fotos a varios servizos diferentes (Picasa, Flickr, Facebook, Panoramio, …) é a sincronización dos mesmos.
O meu problema concreto foi que tiña todo subido a Picasa e distribuido en Álbumes e quería pasalo a Facebook, xa que prefería tela nun sitio donde a xente se poidera etiquetar (Isto é porque as fotos están asociadas ao meu club deportivo) e comentar dentro da rede social.
Ademais, todas estas fotos as teño nun directorio do meu ordenador, que sincroniza de xeito automático con Picasa a través da súa aplicación.
Despois de darlle bastantes voltas a Internet na busca dunha aplicación para Linux que funcione de xeito correcto, optei por un script de PHP que sube de automáticamente todas as fotos dun directorio ou directorios a unha conta ou páxina de Facebook.
Hai outras alternativas que seguramente funcionen para Windows, como é a extensión de Facebook para Picasa (https://apps.facebook.com/picasauploader/) pero que non funciona correctamente en Linux.
Este script de PHP podedes descargalo en GitHub (https://github.com/jedediahfrey/Facebook-PHP-Batch-Picture-Uploader) e instalaríase do seguinte xeito (lóxicamente para executar este comando temos que ter previamente as ferramentas GIT):
git clone git://github.com/jedediahfrey/Facebook-PHP-Batch-Picture-Uploader.git php_batch_uploader cd php_batch_uploader
Unha vez descargado, xeramos un código de autenticación a través da seguinte URL:
http://www.facebook.com/code_gen.php?v=1.0&api_key=c6e96655073cb303448fcb5144d810c1
Con este código, lanzamos o script de PHP para autenticarnos:
php php_batch_uploader.php -a 'CODIGO'
Isto debería abrir o navegador para aceptar a conexión entre a nosa conta e a aplicación, e aceptamos esa conexión.
Para evitar que nos solicite autorización cada vez que subimos algo, podemos aceptar a subida directa dende a seguinte URL:
E se a subida vai ser nunha páxina que nós administramos, autorizamos a publicación nelas por parte desta aplicación na seguinte URL:
Agora xa temos todo listo para poder subir as fotos a través da execución da aplicación.
Hai que ter en conta de que as fotos as creará co nome da foto máis o seu MD5 na descrición da mesma, cousa que queda reguleira as veces. Para evitar isto, podemos tocar o arquivo includes/upload.inc.php e na liña 60 engadimos a seguinte liña:
$temp["caption"] = $caption.($nohash?"":"\n\n\n".$md5); $temp["caption"] = ''; // Disable photo description
Isto sempre e cando queiramos evitar que na descrición da foto poña nada, se simplemente non queremos que poña o hash MD5, só temos que pasar o parámetro -nohash na execución do script.
O problema de desactivar esta opción é que se volvemos a lanzar o proceso, non poderá sincronizar as fotos ao non dispoñer do hash das que están subidas e volverá a subilas todas de novo.
Agora podemos executar o script do seguinte xeito (O meu directorio que contén todos os Álbumes para subir é Upload2Facebook):
php php_batch_uploader.php -nohash -m 1 -p everyone -u club.seo -hd 1 /home/lito/Pictures/Upload2Facebook/*
Isto explicado é:
# O script de subida php php_batch_uploader.php # Non meter o hash MD5 na descrición da foto -nohash # Crear un album novo por cada directorio -m 1 # Que todo o mundo poida visualizar estes Álbumes (O poño así por que é unha páxina pública) -p everyone # É o identificador da páxina na que quero crear o álbum. Se non indico nada subirías o meu perfil de usuario. -u club.seo # En calidade HD -hd 1 # O directorio que contén todos os demais directorios que queremos subir como Álbumes /home/lito/Pictures/Upload2Facebook/*
Dispoñedes da información completa de parámetros de execución e configuración no arquivo README.TXT incluido co propio script ou no enderezo https://raw.github.com/jedediahfrey/Facebook-PHP-Batch-Picture-Uploader/master/README.txt
Moitas veces precisamos meter imprimir só certas partes da nosa web, como por exemplo listados dentro de seccións máis complexas ou táboas de datos e o problema que temos é que a impresión vai ser sempre da páxina completa.
Facer un estilo propio para a impresión soluciónase de xeito sinxelo coa creación dunha folla de estilos que nos oculte o que non queremos sacar no papel, pero isto moitas veces é máis complexo que isto xa que soen estar pensadas para o contido completo e non para partes concretas.
Onte acabei de ler o libro “Desnudando a Google” (Edicións Deusto) e a verdade é que me esperaba bastante máis del.
O resumo do mesmo é moi sinxelo: Estás disposto a usar os grandiosos productos de Google de xeito gratuito (monetariamente falando) a cambio de permitirlles traficar cos teus datos. Básicamente o libro repite esta mesma consigna de principio a fin.
A exploración do libro relata varios episodios, entre os seus inicios ata a actualidade, nos que tanto fala de como naceu e foi crecendo á sombra de Microsoft ou Yahoo!, de como se aproveita dos productos de outras empresas coas que colabora para despois darlle un sachazo e sacar eles unha mellor, dos extraordinarios productos que fai e que non teñen competencia en calidade (ese é un dos problemas) como do oscuro que é obter datos sobre eles, pese a que pregoan que a transparencia e apertura é clave en Internet (para todos menos para min).
Como usuario avanzado de Internet, entendo e acepto estas condicións, sei que xogan con vantaxe, pero coño, están facendo os mellores productos que existen para comunicación en Internet (a excepción de Facebook e Twitter)! Estou seguro que isto mesmo pasaría se Microsoft fora a raiña neste mundo, e ademais, habería que pagar por eles.
Que Google fai presión e chantaxe a empresas e colectivos contrarios ás súas prácticas (se fas iso non saes no noso buscador), é algo en certo modo aceptable (el buscador es mío y me lo follo cuando quiero). Ou acaso podemos impoñerlle que listar e que non nos resultados das buscas do SEU producto?
O problema, según o libro, é que esa xente non ten capacidade de decisión debido ao dominio absoluto que ten na maior parte do mundo (excepto Rusia e China), sen embargo, existen alternativas (peores) que os usuarios non usan, precisamente por que non son tan boas. A xente aposta polo cabalo gañador.
Estou de acordo nos puntos relativos a que se salta á torera as leis sobre privacidade (e en moitos casos casos sobre propiedade intelectual) que é algo en donde se debe incidir nas esixencias dos usuarios e autoridades, pero iso non quita todo o demais.
Durante todo o libro critica que faga uns productos tan bos que é case imposible non usalos ou usar os da competencia (Google Search, Gmail, Google Analytics, Google Docs, Google AdWords, …) xa que usar os da competencia fará que che coste máis tempo e recursos sacarlle o mesmo resultado ou peor que usando os de Google, pero… é iso culpa de Google? Gracias a esa calidade de productos conseguiron un certo monopolio con algunhas das súas ferramentas (Google Search, Google Analytics e Google AdWords por exemplo) pero creo que é máis “incompetencia da competencia” que mérito seu. Eles non nos poñen unha pistola na cachola para que os usemos! somos libres de escoller se queremos realizar as nosas pesquisas dende Google, Yahoo! ou Bing, o problema é que os outros non dan tan bos resultados.
Agora o gran problema de Google é Facebook, básicamente por que teñen unha base de datos de usuarios (que este ano podería achegarse aos 1.000 millóns) PECHADA e donde Google non pode meter man.
O futuro está na loita directa entre estas dúas empresas por quen pode acaparar e vender máis información e o máis precisa posible de cada un de nós.
Google non fai nada (a nivel de maldade) que as 50 primeiras empresas tecnolóxicas do mundo non fagan, simplemente que a maiores, fai productos de calidade. Aínda que igual deberían cambiar o slogan de “Don’t be evil” por outro como “O de o lado tamén o fai!”.
En resumo, unha pataleta dun usuario e ex-colaborador de Google por algún motivo que ó mellor non coñecemos.
Os que traballaran nalgun momento con jQuery ou javascript saberán que existe o concepto de parentesco para referirse a un elemento con respecto a outro. Por exemplo, se un párrafo está dentro dun div, ese párrafo será “child” e o div o “parent”. E se existen varios elementos “child”, dise que son “siblings”.
En Galicia o tema do parentesco tamén está moi presente na típica pregunta “e ti de quen ves sendo?” Por iso fixen fai tempo un plugin de jQuery que agora pretendo rescatar chamado “eTiDeQuenVesSendo” que che devolve toda a familia dun elemento (pais/nais, avos/as, bisavós/as, irmáns, fillos/as, tios/as, etc). Ademáis ven complementada con dúas funcións extra: “eLojoQuenETeu” para recoller só un tipo de parente e “eTiNonSeras” para comprobar que tal elemento é parente de outro.
Debido a que en html non existen xéneros, os pais e as nais devolven os mesmos elementos, así como fillos/fillas, tios/tias, etc.
Exemplos:
var familia = $('#elemento').eTiDeQuenVesSendo();
//Coller parte da familia
var fillos = familia.fillos;
var nai = familia.nai;
var sobrinhos = familia.sobrinhos;
//etc...
//Coller só un parentesco:
var pai = $('#elemento').eLojoQuenETeu('pai');
var tias = $('#elemento').eLojoQuenSonAsTuas('tias');
//Comprobar un parentesco
if ($('#elemento').eTiNonSeras('bisneto', '#outro-elemento')) {
alert('Pois si');
}
Podes descargar o código aqui:
Función para montarte un calendario en 0.5
<?php
/**
* function calendario (string $ym, [array $eventos])
*
* Función que constrúe un táboa de calendario engadindo eventos con link nas datas indicadas
*
* return string
*/
function calendario ($ym, $eventos = array()) {
list($ano, $mes) = explode('-', $ym);
$dia = 1;
$mes = intval($mes);
$ano = intval($ano);
if (!checkdate($mes, $dia, $ano)) {
$mes = date('m');
$ano = date('Y');
}
$mes = sprintf('%02d', $mes);
$tempo = mktime(0, 0, 0, $mes, $dia, $ano);
$semana = date('N', $tempo);
$dias = date('t', $tempo);
$anterior = date('Y-m', strtotime('-1 month', $tempo));
$seguinte = date('Y-m', strtotime('+1 month', $tempo));
$anterior = http_build_query(array('data' => $anterior ) + $_GET);
$seguinte = http_build_query(array('data' => $seguinte ) + $_GET);
$calendario = '<table>';
$calendario .= '<caption>';
$calendario .= '<h2>';
$calendario .= '<a href="?'.$anterior.'"><img src="/imx/esqueda.png" alt="Anterior" /></a>';
$calendario .= ' <span>'.date('F Y', $tempo).'<span> ';
$calendario .= '<a href="?'.$seguinte.'"><img src="/imx/dereita.png" alt="Seguinte" /></a>';
$calendario .= '</h2>';
$calendario .= '</caption>';
$calendario .= '<thead>';
$calendario .= '<tr>';
$calendario .= '<th>Luns</th>';
$calendario .= '<th>Martes</th>';
$calendario .= '<th>Mércores</th>';
$calendario .= '<th>Xoves</th>';
$calendario .= '<th>Vénres</th>';
$calendario .= '<th>Sábado</th>';
$calendario .= '<th>Domingo</th>';
$calendario .= '</tr>';
$calendario .= '</thead>';
$calendario .= '<tbody>';
$calendario .= '<tr>';
if ($semana > 1) {
$calendario .= '<td colspan="'.($semana - 1).'"> </td>';
}
while ($dia <= $dias) {
if ($semana > 7) {
$semana = 1;
$calendario .= '</tr><tr>';
}
$data = $ano.'-'.$mes.'-'.sprintf('%02d', $dia);
$calendario .= '<td rel="'.$data.'">'.$dia.($eventos[$data] ? ('<div>'.implode('<hr />', (array)$eventos[$data]).'</div>') : '').'</td>';
$semana++;
$dia++;
}
if ($semana != 8) {
$calendario .= '<td colspan="'.(8 - $semana).'"> </td>';
}
$calendario .= '</tr>';
$calendario .= '</tbody>';
$calendario .= '</table>';
return $calendario;
}
echo calendario($_GET['data'], array(
'2012-05-17' => '<a href="http://www.diadasletrasgalegas.com/">Día das Letras Galegas</a>',
'2012-07-25' => '<a href="http://www.festalabs.es/231-Festival/A-Coru%C3%B1a/Santiago-de-Compostela/Festas-de-Santiago-Ap%C3%B3stol---O-Ap%C3%B3stolo">Santiago Apóstolo</a>'
));
?>
Este é un pequeno script que podemos instalar como cron e que nos permitirá crear copias de seguridade das nosas bases de datos de Mysql e manter un histórico de X días:
#! /bin/sh
# -------------------------------------
# Script to do a full databases backup
# and store it X days
#
# A Navalla Suiza 08/03/2010
#
# This script is freely distributed under the GPL
# -------------------------------------
echo ""
echo "Start at: `date "+%Y-%m-%d %H:%M:%S"`"
echo ""
# Configuration variables
# -------------------------------------
USER='root'
PASS='MYSQL-ROOT-PASS'
HOST='localhost'
BACKUPDIR='/var/backups/mysql'
DAYS=7
# Script execution
# -------------------------------------
data=`date +%Y%m%d`
for i in `mysql -h$HOST -u$USER -p$PASS -Bse 'show databases'`; do
echo 'Processing '$i
mysqldump --add-drop-table -h$HOST -u$USER -p$PASS $i | gzip -9 > $BACKUPDIR/$data-$i.sql.gz
done
find $BACKUPDIR -type f -mtime +$DAYS -exec rm -f {} \;
echo ""
echo "End at: `date "+%Y-%m-%d %H:%M:%S"`"
echo ""
Se o que queremos instalar como cron no servidor:
$ crontab -e
00 02 * * * /root/shells/backup-mysql.sh >> /root/logs/backup-mysql.log 2>> /root/logs/backup-mysql.err
Unha función en PHP moi útil para poñer nos vosos blogs, foros, etc para adaptar todos os galicia/galiza ás vosas respectivas ideoloxías:
<?php
function galizanizer ($texto, $partido = '') {
switch (strtolower($partido)) {
case 'bng':
return preg_replace('/galicia/i', 'Galiza', $texto);
case 'pp':
return preg_replace('/gali(z|ci)a/i', 'la región gallega', $texto);
default:
return preg_replace('/galiza/i', 'Galicia', $texto);
}
}
//Probando a función:
echo galizanizer('Galicia mola millóns', 'bng').'<br>';
echo galizanizer('Galicia mola millóns', 'pp').'<br>';
echo galizanizer('Galicia mola millóns').'<br>';
?>
O resultado da funcion sería:
Galiza mola millóns
la región gallega mola millóns
Galicia mola millóns
Unha función sinxela en PHP para obter a IP do usuario que nos visita:
<?php
/**
* function ip (void)
*
* return string
*/
# Versión optimizada
function ip1 () {
if (!empty($_SERVER['HTTP_CLIENT_IP'])) {
return $_SERVER['HTTP_CLIENT_IP'];
} else if (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
return $_SERVER['HTTP_X_FORWARDED_FOR'];
} else {
return $_SERVER['REMOTE_ADDR'];
}
}
# Versión simplificada
function ip2 () {
return $_SERVER['HTTP_CLIENT_IP'] ?: $_SERVER['HTTP_X_FORWARDED_FOR'] ?: $_SERVER['REMOTE_ADDR'];
}
# Versión alternativa
function ip3 () {
foreach (array ('HTTP_CLIENT_IP', 'HTTP_X_FORWARDED_FOR', 'REMOTE_ADDR') as $var) {
if (!empty ($_SERVER[$var])) {
return $_SERVER[$var];
}
}
}
# Probamos o rendimento con un millón de iteracións por función
$time1 = microtime(true);
for ($i = 0; $i < 1000000; $i++) {
ip1();
}
$time2 = microtime(true);
for ($i = 0; $i < 1000000; $i++) {
ip2();
}
$time3 = microtime(true);
for ($i = 0; $i < 1000000; $i++) {
ip3();
}
$time4 = microtime(true);
echo '<pre>';
echo '<h1>Tempos de execución</h1>';
echo '<h2>ip1: '.($time2 - $time1).' segundos</h2>'; # 0,50202989578247
echo '<h2>ip2: '.($time3 - $time2).' segundos</h2>'; # 1,6342899799347
echo '<h2>ip3: '.($time4 - $time3).' segundos</h2>'; # 1,69167304039
echo '<pre>';
?>