trim(), un gran amigo (PHP, C++, C)

Miércoles, 10 de Marzo de 2010 admin Sin comentarios

A mi entender, es una de las funciones más útiles que se han inventado, como programador de PHP estoy harto de utilizarlo para filtrar información (caracteres a la derecha y a la izquierda, ya sean espacios, caracteres especiales o algún carácter que yo utilice para el control de la información).
Sabemos que el usuario final no nos va a dejar las cosas fáciles, puesto que a veces, nos llena un campo con “intros” al principio y al final; o la información, después de pasar por HTTP, lectura de un archivo XML o por otros tratamientos, tal vez tenga un retorno de carro al final; por eso, a veces es útil hacer:

1
$cadena=trim($cadena);

Pero ahora estamos en C++, bien quería postear también el código en C++, así que decidí googlear un poco para ver esto:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <string>
const std::string whiteSpaces( " \f\n\r\t\v" );

void trimRight( std::string& str,
      const std::string& trimChars = whiteSpaces )
{
   std::string::size_type pos = str.find_last_not_of( trimChars );
   str.erase( pos + 1 );
}

void trimLeft( std::string& str,
      const std::string& trimChars = whiteSpaces )
{
   std::string::size_type pos = str.find_first_not_of( trimChars );
   str.erase( 0, pos );
}

void trim( std::string& str, const std::string& trimChars = whiteSpaces )
{
   trimRight( str, trimChars );
   trimLeft( str, trimChars );
}

Con esto podemos jugar con nuestros textos…

Ahora vamos al caso de C, muchos se siguen preguntando… pero si C es un lenguaje muy antiguo, ¿aún se sigue usando? Pues sí ! Aunque muchas cosas sean horribles de programar en C, a pelo, se sigue usando, y aún le queda mucha vida a este lenguaje. Por eso, veremos dos funciones trim() especiales para C:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
#include <stdio.h>
#include <string.h>

char *trim(char *s)
{
  char *start = s;

  /* Nos comemos los espacios al inicio */
  while(*start && isspace(*start))
    ++start;

  char *i = start;
  char *end = start;

  /* Nos comemos los espacios al final */
  while(*i)
  {
    if( !isspace(*(i++)) )
      end = i;
  }

  /* Escribimos el terminados */
  *end = 0;

  return start;
}

char *trim2(char *s, const char *trimChars)
{
  char *start = s;

  /* Nos comemos los caracteres al principio */
  while(*start && strpbrk((const char*)start, trimChars)==start)
    ++start;

  char *i = start;
  char *end = start;

  /* Nos comemos los caracteres al final */
  while(*i)
  {
    if( strpbrk(i++, trimChars)!=i-1 )
      end = i;
  }

  /* Coloramos el perminador */
  *end = 0;

  return start;
}

int main()
{
  char mi_cadena[30]="\f\n Cadena; \tSucia \n\t ;";
  printf("Mi cadena inicialmente: \"%s\"\n", mi_cadena);
  printf("Mi cadena tras trim(): \"%s\"\n", trim(mi_cadena));
  printf("Mi cadena tras trim2(): \"%s\"\n", trim2(mi_cadena,";\f\n\t"));
}

En C también podremos tener nuestro trimleft y nuestro trimright y creo que es fácil sacarlo desde esta función general, ya que *start se mueve indicando el principio de la cadena, y con end, y es ese movimiento (que aunque perdemos algo de memoria) el que hace que se recorte la cadena; además, como buena función de C, perdemos la cadena que inicialmente teníamos.

Categories: C/C++ Tags: , , ,

Comprobación de IP invertida / Reverse IP Lookup

Martes, 16 de Febrero de 2010 admin Sin comentarios

Desde hace mucho tiempo he utilizado CuWhois para hacer esta comprobación, ofrece muchos servicios interesantes para Webmasters y recomendaciones para posicionar mejor las webs, aunque desde hace tiempo, la comprobación de IP invertida no es tan completa como antes. Por ejemplo, hace unos años, probándola sobre este mismo dominio, daba unos 70 resultados de páginas que compartían esta misma IP (tengo un hosting compartido para esta web); ahora me dice que tengo 8 vecinos, y sólo me dice 6 de ellos.

Hoy gracias al página de Facebook de Hostarting he descubierto YouGetSignal, y aquí hay un listado más completo de las webs que encontramos en el servidor (dependiendo de con quién tengamos contratado el dominio nos convencerá mejor mirar en una u otra página, y siempre está bien que si encontramos información interesante la comprobemos a mano), y si tenemos un hosting compartido podemos ver cuánto se aprovecha nuestra empresa de hosting de nosotros y a veces, estimar más o menos cuánto están cobrando por un mismo servidor. :S Pero al menos nos da una idea aproximada de la carga que puede tener.

La web a mi gusto: Descargar contenidos de Moodle rápidamente

Viernes, 12 de Febrero de 2010 admin Sin comentarios

Quiero continuar con una serie de posts que llevarán una temática parecida: muchas páginas web funcionan de una forma fija, pero a mí me incomoda bastante esa forma de funcionar, pero como necesito cubrir mis necesidades, intento que funcionen como yo quiero.
Tras esa gran descripción, quiero introducir mi problema:
Moodle es un sistema ampliamente aceptado como solución web académica, tiene muchas opciones y está muy bien, personalmente, en la Universidad, los profesores cuelgan apuntes, ejercicios y más material a la web, lo malo es que cuando llego a una página, me gusta descargar a mi disco duro todos los contenidos (pdfs, documentos, etc), y para ello invierto mucho tiempo.
Para ello viene bien una extensión para Firefox: Chickenfoot, también podemos utilizar Greasemonkey (también hay extensiones para IE y Safari).

Sin más preámbulos, el script utilizado para que Moodle descargue los contenidos más rápido es el siguiente:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
var alltags = new Array();

function detecta_pdf(cont)
{
  var url_match = /https?:\/\/([-\w\.]+)+(:\d+)?(\/([\w/_\.]*(\?\S+)?)?)?/;
  var contenido=cont.match(url_match);
  document.location=contenido[0];
}

function pdfplay(que)
{
  var cont=que.innerHTML;
  que.innerHTML='';
  detecta_pdf(cont);  
}

function CogeElementoPorClase(tipo, clase, quehacer)
{
  var alltags=document.getElementsByTagName(tipo);

  for (i=0; i<alltags.length; i++)
  {
    if (alltags[i].className==clase)
    {
    quehacer(alltags[i]);
    }
  }
}

CogeElementoPorClase('div', 'resourcepdf', pdfplay);

La función CogeElementoPorClase() es la misma que utilicé en este post anterior para modificar la web de mi proveedor de hosting.

Tras ello debemos crear un trigger, es decir será el evento con el que se disparará automáticamente el script que acabamos de hacer; por ejemplo, para la Universidad de Málaga podemos decir que el script se dispare cuando la página a la que accedemos sea: http://*.cv.uma.es/mod/resource/view.php?id=*.

En principio el script fue pensado para los PDFs (el acrobat reader tarda bastante en abrirse cuando tienes que abrir más de 10 PDFs), pero puede servir para cualquier contenido. Por otra parte, aunque no está muy optimizado (la necesidad me llevó a hacer el script rápidamente) espero que os sea útil.

Andanzas en Facebook: Diálogos

Miércoles, 10 de Febrero de 2010 admin Sin comentarios

Una de las posibilidades que nos brinda la plataforma Facebook para crear aplicaciones es la de tener diálogos con el Look&Feel de la propia red social. Y todo esto sin crujirnos la cabeza para hacerlos. Podemos hacer diálogos simples (con un botón) o de decisión (con dos botones), y además pueden ser pop-ups:

Diálogo Pop-upo contextuales:

Diálogo contextual de FacebookPara ello sólo bastan algunas líneas de FBJS:

1
2
3
4
5
6
7
var usuario_pulsa_ok = function() {
 // Ejecutaremos este código cuando el usuario acepte el diálogo
         };
         
         var dialog = new Dialog(Dialog.DIALOG_POP);
         dialog.onconfirm = usuario_pulsa_ok;
         dialog.showMessage('Test de diálogo', 'Sólo tienes una salida ! Pulsar Ok', 'Ok');

Con este código vemos un diálogo simple con un texto y un mensaje de Ok, si quisiéramos hacer este diálogo contextual deberíamos cambiar DIALOG_POP por DIALOG_CONTEXTUAL. Y si quisiéramos que el diálogo se cerrara automáticamente pasados unos segundos:

1
setTimeout(function(){ dialog.hide(); }, 2000); // Cerrar tras 2 segundos

Un diálogo de dos botones sería también así de fácil (basta con cambiar de método a la hora de mostrarlo:showMessage por showChoice. Quedaría así:

1
2
3
4
5
6
7
8
9
10
11
12
13
var cerrar = function()
    {
       // Se ejecutará esto cuando el usuario cancele el diálogo (responda no a la pregunta, o lo cierre)
    }
    var aceptar = funcion ()
    {
       // Se ejecutará esto cuando el usuario acepte la pregunta.
    }
    var dialog = new Dialog(Dialog.DIALOG_POP);
    dialog.oncancel = cerrar;
    dialog.onconfirm = aceptar;
   
    dialog.showChoice('¿Esta seguro?', '¿De verdad que no te gusta la nueva versión de Facebook?', 'Sí, prefiero la anterior', 'No, renovarse o morir');

Ahora sólo queda una cuestión pendiente, estos diálogos aún tienen más posibilidades, aunque están llenas de bugs, dentro de los diálogos se acepta texto, imágenes, divs, tablas y lo que queramos, aunque hay que introducirlo todo de una forma especial y no siempre va a funcionar. Sólo necesitamos crear una fb-string:

1
<fb:js-string var="loquequierodentrodeldialogo"><div><img src="imagen.jpg" />Esto es lo que podemos hacer con el diálogo</div></fb:js-string>

Y podemos hacer esto más sencillo con una función en PHP que introduzca los contenidos dentro del tag:

1
2
3
4
function facebook_fbstr($var, $string)
{
  echo '<fb:js-string var="'.$var.'">'."\n".$string."\n".'</fb:js-string>'."\n";
}

Así cuando llamemos al diálogo, sólo tendremos que poner:

1
dialog.showMessage(loquequierodentrodeldialogo, 'Pulsa Ok', 'Ok');

Aunque esta última característica es muy bonita, puede ser que en ocasiones necesitemos para que funcione correctamente eliminar las cookies del navegador, o incluso cerrar y reabrir sesión, y ya sabemos que a un usuario normal no le podemos decir eso, ya que se cabrearía y no usaría nuestra aplicación (a no ser que fuera vital para su existencia); tampoco le podemos decir que la culpa la tiene Facebook ya que aunque los usuario vean todos los días fallar a Facebook, cuando pasa en tu aplicación, la culpa la tienes tú… por lo tanto, me reservo para una futura entrega una solución un poco más original para hacer que siempre funcionen los diálogos más complicados.

Hacer que Facebook coja una buena imagen de nuestra web cuando nos enlacen

Miércoles, 10 de Febrero de 2010 admin Sin comentarios

fb_publishFacebook es la red de moda, y si queremos promocionar nuestra web o nuestros servicios, éste es un buen punto de partida. Por otra parte, puede ser que usuarios de Facebook enlacen a nuestra web o nuestro blog y para tener nuevos visitantes queremos hacer nuestro link atractivo: poner una imagen y una descripción es muy interesante. (En la imagen, tenemos el contraejemplo (un link poco atractivo para nuevos visitantes).

Pero todo esto se puede arreglar con dos líneas en el header de nuestra web:

1
2
<link rel="image_src" type="image/jpeg" href="http://midominio.com/imagen.jpg" />
<meta name="description" content="Descripción de mi web" />

Aunque el metadato description es muy utilizado; decido incluirlo aquí ya que Facebook es de donde extrae información. La línea anterior sirve para especificar una imagen; así nuestro enlace quedará de la siguiente manera:

fb_publish2

Para buscar imágenes más originales podemos hacer una captura de pantalla de nuestra web, o una fracción de nuestro logotipo, eso sí, la imagen tampoco debe pesar demasiado y la relación de aspecto debe ser 1:1, es decir, una imagen cuadrada.

Día de buenas noticias para el software libre

Jueves, 4 de Febrero de 2010 admin Sin comentarios

Hoy parece que es un  buen día, me he levantado con dos buenas noticias.

aplicaciones-symbianSymbian ya es Software Libre, una muy buena noticia, ya podemos investigar cómo está hecho y desde luego quieren que la comunidad intervenga en hacer mejoras. Podemos ver más información acerca de esto: PC World, Symbian Developer Community.

La segunda gran noticia de hoy es que la Administración española, está obligada a comunicarse entre administraciones y con los ciudadanos utilizando estándares abiertos. Lo leí aquí esta mañana, y tal y como dicen, ahora mismo la página del Defensor del pueblo, si queremos utilizar nuestro certificado digital necesitamos Internet Explorer, mientras cada vez más gente rechaza el uso de este para cosas serias; puede que ese antiguo sistema tenga los días contados. Por otra parte, como ciudadanos deberíamos ver más a menudo cómo se comunican con nosotros con documentos OpenDocument, y deberían aceptarnos a nosotros estos documentos. Toda esta parrafada (es un PDF del BOE) es muy bonita, deberíamos esperar antes de cantar victoria a ver la implementación de todo esto, tal vez luego encontremos desarrollos hechos sin mucha gana con respecto a las webs y firmas digitales, y documentos OpenDocument (muy bien) que se note a la legua que están hechos con MS. Word y luego copiados y pegados (mal). De todas formas, enhorabuena, es un buen primer paso.

Una idea acerca de la web de RENFE

Miércoles, 3 de Febrero de 2010 admin Sin comentarios

Todos los que hemos tenido que utilizar la web de Renfe alguna vez, hemos sufrido sus daños y seguimos con sus secuelas.

Encontraréis un nuevo rediseño de la web aquí.

Porque encima de que algunas empresas quieren vender un producto o servicio, y nosotros queremos comprarlo, no se preocupan de mejorar sus webs para hacerlo posible. Podríamos tener la posibilidad de contratar los servicios con otra empresa que tuviera una web mejor, pero como ocurre en este y otros muchos casos suelen ser las empresas únicas empresas que lo ofrecen.

Es el caso de ALSA o grupo Avanza, con algunos trayectos, canal cliente Movistar sólo funciona en IE (y a veces); cuyas webs a veces dan más de un calentamientos de cabeza al usuario; y muchas tiendas online…

Categories: Interneteando Tags: , ,

Web hosting: Malas experiencias con Honesting

Sábado, 30 de Enero de 2010 admin Sin comentarios

hostingDe esto hace ya algún tiempo (Enero-Febrero de 2006), pero aún sigo dolido.

Tenía un proyecto web, que estaba tomando algo de forma, tenía un número considerable de visitas, y estaba muy contento con él, me costó mucho esfuerzo y aunque el hosting no era caro, era lo que me podía permitir. Bien, empecé con esta empresa un tiempo antes y todo fue bien, hay que reconocer que llegué a mandar tickets de soporte a las 4:00 AM y me respondían enseguida; pero en verano de 2005, un exploit de Joomla se cargó todas las webs del servidor (curioso, una seguridad tremenda), y no restauraron mi copia de seguridad porque tenían webs más prioritarias (bueno, pasa)… y a finales de 2005, empecé a notar cómo no se leían los tickets que enviaba, es decir, cuando tenía algún problema, yo detallaba las pruebas que ya había hecho, y me empezaban a repetir lo que había puesto, es más en las respuestas no tenían en cuenta lo de los mensajes anteriores, por lo que al final debía resumir en cada mensaje todo lo hablado anteriormente, y cualquier problema se convertía en un calvario de varios días (al menos tardaban relativamente poco en contestar).

Pero un día me encuentro con que no puedo ver mi correo (y ya que, aunque tenían teléfono nunca lo cogían), accedo al panel de control, envío un ticket, y me habían cortado el servicio (la web tampoco funcionaba) por enviar SPAM… luego me dicen que excedí la transferencia de correo (cosa improbable porque en las estadísticas de correo saliente todo era normal), la reactivan y a los dos días me cortan de nuevo el servicio, y me cuesta 5 tickets que me lo rehabiliten, pero a la tercera vez que me lo quitan no me dicen nada, tardan todo el día en contestar para decirme que he excedido el uso de CPU y que… mi página estaba mal diseñada (a ellos no les importaba cómo estuviera diseñada mi web); por lo de la CPU es relativo, es normal que si intentan meter a 2000 usuarios en la misma máquina, el servicio no vaya todo lo bien que debería, llevaba 2 años con la web con ellos sin problemas. Pero lo más curioso es que todos los problemas empezaron 15 días después de pagar la cuota anual…

Después de muchos tickets (que borraron antes de que pudiera copiarlos) conseguí que me subieran una copia de seguridad a la red para poder descargarla, eso sí, durante el tiempo que estuvo la copia de seguridad colgada, no tuvo ningún sistema de seguridad (ni contraseña para descargar ni nada), es decir, dejaron mis contraseñas, mis mails, información privada mía y de casi 2000 usuarios de la web descargable por todo el mundo. Tras haberme quejado mil veces por toda la red, aquí va la 1001, no es una empresa seria y menos aún honesta. Y además, no soy el único que lo ha pasado mal con esta gente. Aunque, según veo comentarios, todavía sigue haciendo de las suyas.

Fui a la oficina del consumidor, y me dijeron que la única solución era poner una denuncia porque la oficina era ilocalizable, le mandaron una carta oficial y llegó de vuelta, y a los teléfonos que les dí no les cogieron ni una vez.

Una cosa más, el encargado de esta pseudoempresa, se crea mil perfiles en foros, Ciao, y mil sitios, pero si os paráis a leer tranquilamente, esos clones no aportan mucha información y lo único que aportan es repetido, no viene a cuento y da la casualidad de que sólo entran para hacer ruido.

Foto original de John Seb.

Categories: General Tags: , ,

Crea tu avatar en 3D

Viernes, 29 de Enero de 2010 admin 2 comentarios

Nacen cientos de servicios web al mes, pero hoy, vía rm -rf /, he descubierto uno que me ha sorprendido!

En principio, parece la típica página para crear avatares, pero con un detalle añadido, son en 3D, queda bien, queda gracioso, pero es que además están animados (son animaciones de unos 5 segundos, no es mucho, y a lo mejor cuando las veas 5 veces ya cansan, pero mira)…

Pero al entrar en la página, hay una opción que me agrada: Your own photo; y sí, te permite subir tu foto y crearte un carácter en 3D, como tú, no es instantáneo, pero en unos 10 minutos (siguiendo unas instrucciones) tienes un muñecajo en 3D personalizado… y todo gratis (no sé qué tratamiento harán con la imagen, pero para poner una foto en Facebook está muy bien).

La web es: www.avatara.com

Yo tuve que subir la foto 3 veces porque me falló, supongo que será un poco la saturación del servidor, ya que crear los avatares 3D no tiene que ser una tarea muy ligera, y si además hay muchas peticiones de lo mismo, llegará un momento que no se pueden atender todas.

Os dejo aquí el mío:

yo_wink

Identificar si estamos en el servidor local o no

Lunes, 25 de Enero de 2010 admin Sin comentarios

A veces es interesante saber en qué servidor estamos, si en nuestro servidor local para hacer pruebas, o en el remoto (y será la web definitiva); puede que porque las claves de mi servidor MySQL local son diferentes, o porque en local activamos automáticamente el modo de depuración, o símplemente porque en nuestro servidor local tenemos todos nuestros proyectos como http://localhost/proyecto1/ y en el servidor se ejecutarán como http://www.proyecto1.com/.

Para ello nos vale esta línea que podemos incluir en nuestra biblioteca de funciones personal en PHP:

1
$serv_local = (file_exists($_SERVER['DOCUMENT_ROOT']."/serv_local"));

Ahora en nuestro servidor local (valga la redundancia en todo el post) hacemos un touch en nuestro DOCUMENT_ROOT (por ejemplo /home/www/public_http/):

1
2
$ cd /home/www/public_http
$ touch serv_local

Con esto siempre que ejecutemos nuestros scripts buscaremos el fichero serv_local, si se encuentra, estamos seguros de que estamos en nuestro ordenador, si no, estamos en el servidor remoto.

Categories: PHP Tags: , ,
Easy AdSense by Unreal