miércoles, 17 de agosto de 2016

Formularios con PHP + Html (III). Creación del PHP.


Bueno, por fin tras plantear el script y hacer el Hmtl, pasamos a escribir el código PHP para nuestro formulario, podéis verlo completo en este enlace de Pastebin. Os recomiendo que empecéis la serie desde el primer post para que podáis ver el proceso de creación de mi web de prueba, al final de este post os dejaré los enlaces. Voy a ir presentándolo por secciones numeradas para coincida con el esquema que vimos en el capítulo anterior de esta serie.

Probando el formulario


(1.-)

if (($_FILES['adjunto']['size'] > 0) AND ($_FILES['adjunto']['size'] <= $_POST['tamanomaximo'])) {

Con un condicional if y la variable $_FILES* comprobamos que la variable “adjunto” es mayor que cero, o sea, que la variable tiene contenido, y que es menor que el tamaño máximo permitido, que hemos definido con la variable “tamanomaximo” en el formulario. Al usar el operador AND establecemos que se tienen que cumplir las dos condiciones para obtener TRUE, en caso de que alguna de las dos (o las dos) sean falsas obtendremos FALSE. * la variable $_FILES es un array asociativo de elementos subidos al script en curso a través del método POST, podéis ver mas detalles sobre $_FILES en este enlace.

(2.-)

$tamano = $_FILES['adjunto']['size'];
$tipo = $_FILES['adjunto']['type'];
$archivo = $_FILES['adjunto']['name']; echo "Nombre de archivo: " , $archivo , "
";
echo "Tipo de archivo: " , $tipo , " ";
echo "Tamaño del archivo: ", $tamano , " ";

$prefijo = substr(md5(uniqid(rand())),0,8);
$destino = "adjuntos" . "/" . $prefijo .'_'. $archivo;
echo "Ruta de copiado: " , $destino , " ";

 
Este bloque corresponde al punto dos del diagrama, aquí procesamos el archivo adjunto si el condicional if del punto 1 ha resultado TRUE. Primero creamos tres variables $tamano (tamaño del archivo) $tipo (tipo de archivo) $archivo (nombre del archivo); luego mostramos el contenido de estas variables que se extrae del array $_FILES y por ultimo creamos un nombre para el archivo y establecemos una ruta para subirlo a nuestro server. ¿Para que ponerle un nombre? Imaginaros que dos usuarios diferentes suben un archivo que con el nombre igual, entonces se sobreescribirian. ¿Archivos diferentes que se llamen igual? Imaginaros que estos dos usuarios diferentes descargan un archivo de internet con nombre download.pdf por ejemplo y luego intentan subirlo a la web...

Resultado del proceso y envio de un mensaje con adjunto


Para crear un nombre aleatorio usamos las funciones rand() y md5() concatenadas para obtener una cadena de caracteres aleatoria y con unas probabilidades mínimas de que se repitan los caracteres, quizá en otro post os hable de esta cuestión que para mi ha sido muy apasionante de investigar estas últimas semanas.

Después le aplicamos la función substr() para obtener una cadena de N caracteres, en este caso 8. Al final mostramos al usuario el directorio donde vamos a guardar el archivo. Esto último quizá no sea necesario, no se hasta que punto podría ser inseguro mostrar carpetas de nuestro servidor, supongo que dependerá del uso que le demos al formulario. Sin embargo puede ser interesante que mientras probamos nuestro código PHP, este nos vaya mostrando mensajes de este tipo como mensajes de control, útiles para saber que el proceso se esta ejecutando de forma correcta.

(3.-)

if (move_uploaded_file($_FILES['adjunto']['tmp_name'] , $destino)) {

En este punto con otra condicional if comprobamos si se ha cargado el archivo correctamente al servidor, si hubiera algún problema en la subida resultara FALSE y mostraremos un mensaje de error, y si todo va bien un mensaje confirmando la subida.

Vista de la carpeta de adjuntos y podéis ver que efectivamente ha llegado



(4.-)

elseif ($_FILES['adjunto']['size'] == 0 ) {

En este bloque analizamos si el tamaño del adjunto es igual a 0. Fijaros que en vez de if he usado elseif, así que este condicional se ejecutara en caso de que alguna condición anterior* sea FALSE (ver enlace); o lo que es lo mismo comprobamos si realmente el usuario ha añadido algún adjunto. Por simple lógica, si no es mayor que cero pero es menor que el tamaño máximo permitido tiene que ser igual a 0. En caso afirmativo mostraremos un mensaje “no hay adjuntos” antes de pasar a enviar el mensaje. En el caso contrario mostramos el mensaje “tamaño de adjunto no permitido”.

*(recordamos que para que 1 sea TRUE se tienen que cumplir las dos condiciones unidas por AND) 

Mensaje obtenido con un adjunto mayor que el límite



(5.-) Y bien, por fin tras todo el proceso del adjunto, por fin llegamos a los que es el correo propiamente dicho, para esto usamos la función mail, esto será mas fácil pues simplemente con otro condicional if compruebo que las variables “nombre” y “email” del formulario Html tienen algún contenido, en caso afirmativo enviamos el mensaje en caso negativo, mostramos un mensaje con la incidencia al usuario y le damos la opción de volver al formulario. Vamos a ver este bloque de código mas al detalle:

if (!empty($_POST['nombre']) AND !empty($_POST['email'])) {

/* comprobamos que los campos nombre y email NO estan vacios */

$destino ="info@probandohtml.esy.es";

/* el mail al que enviaremos el mensaje, que es el que tenemos alojado en nuestro servidor */

$remitente = "Content-Type: text/html; charset=utf-8";
$remitente .= "From:".$_POST['nombre']."\r\n";

/* Aqui lo que hacemos es darle a la variable $remitente el valor “Content-Type: text/html; charset=utf-8” . From:".$_POST['nombre']."\r\n" con el operador . juntamos los dos valores en uno solo */

$tema="Contacto desde tu Sitio Web";             // asunto del mensaje

$mensaje=$_POST['nombre']." ".$_POST['email']." ".$_POST['comentario'];

@mail($destino,$tema,$mensaje,$remitente);      // enviamos el mensaje


Mensaje recibido en la bandeja de entrada

Y ahora para terminar, unas consideraciones finales:

  • Para guardar los ficheros adjuntos he creado en el servidor una carpeta "adjuntos" donde almacenar los ficheros que vayan enviando los usuarios. 
  • Como podéis comprobar los mensajes presentados por el script no respetan el estilo de la web y quedan bastante "sosos"; haría falta aplicarles un formato igual o similar y "adornarlo" un poco. No hay problema, en PHP se pueden  aplicar estilos a los textos, crear tablas y usar Html en general como veremos en un próximo post. También se puede aplicar formato Html al mensaje que recibimos en la bandeja de entrada de nuestro mail.
  • Cuando hagáis un script en PHP, ojo con las comillas dobles y simples.
  • Otra comprobación que se podría añadir es que en los campos de texto solo haya caracteres "permitidos", letras mayúsculas y minúsculas números, espacios en blanco, arrobas, y/o paréntesis, para evitar alguien intente pasar un código malintencionado dentro del texto.
  • Os vuelvo a recordar que depende de el servicio de host que estéis utilizando, tendréis ciertas limitaciones con el tema de los adjuntos y con el uso de ancho de banda disponible; cuando vosotros o algún usuario se pase de esos límites probablemente obtendrá un lacónico "access denied"

Y por fin termino, me ha quedado un poco largo para mi gusto, pero el tema es complejo y no quería dejaros a medias; Saludos y hasta la próxima. 

La serie completa:

  1. Creando una web con HTML(IV): Formularios con mailto.
  2. Formularios simpáticos con HTML
  3. Formularios con PHP + Html. Introducción al lenguaje.
  4. Formularios con PHP + Html(II). Planteamiento y código Html. 
  5. Formularios con PHP + Html (III). Creación del PHP.


miércoles, 3 de agosto de 2016

Las mejores Apps de menos de 10 Mb para Android.

En esta entrada veremos algunas de las aplicaciones mas ligeras para tu smartphone pero que además son muy útiles; para algunas apps, el tamaño no importa!!

Empecemos:

Ballistic

Juego de plataformas 3D en el que el jugador pilota una canica por laberintos con todo tipo de obstáculos, es destacable el realismo de las dinámica gravitacionales.

  • 5.3 MB.
  • Rated: 4.6 con 970 descargas.
  • Completamente gratis - no hay anuncios y no hay compras in-app. 
AIMP
Captura de pantalla de Aimp

Reproductor de música ultraligero, solo 3,9Mb. Tiene las opciones justas sin frivolidades y con un consumo mínimo de memoria del dispositivo.



APKPure 

Una alternativa a Google Play store con solo 2.81MB.
  • Descarga paquetes apk con aplicaciones gratuitas.  
  • No se pueden comprar aplicaciones con esta store. 
  • Ésta no es una tienda de aplicaciones piratas.  Puedes descargar versiones anteriores de las aplicaciones, las discontinuadas, aplicaciones bloqueadas regionalmente, no necesita la app Google play services.





CCleaner

Supongo que esta aplicación ya la conocéis de Windows y su calidad está mas que contrastada. Solo pesa  4.50MB, si quieres mantener en línea tu Android, déjate de rollos y prueba esta app.

Logo EveryWiki
EveryWiki

Alternativa a la app oficial de Wikipedia. Soporta muchas otras wikis como uncyclopedia, wikiquote, wikiviajes etc..  1.82MB.









Multiling O Keyboard

Teclado muy muy ligero, con esquemas de teclado personalizable. No os pongo capturas de pantalla de la app para que no os lleve a engaño, la lista de opciones de esta app es largísima (QWERTY, QWERTZ, AZERTY, DVORAK, 200 idiomas, soporte para todo tipo de emoticonos, herramienta de transformación de texto, temas y colores ilimitados con posibilidad de crear temas personalizados...) La pregunta después de probarla es: ¿Como han metido esto en 455kb??



qPDF Viewer

Visor PDF ultraligero -  6.32MB.

Brave

Abre los enlaces en una pequeña ventana emergente, puedes abrir varias ventanas emergentes, muy práctica para consultas rápidas. Imprescindible una pantalla de dimensiones generosas. Solo  3.27MB.
 


Native Clipboard

Bloc de notas que puede salvar infinitos textos, soporta temas y con un agradable interfaz emergente. Solo se hecha de menos algun tipo de sincronizacion online multi-plataforma (como Evernote o el de Microsoft, One Note). Solo 2.03MB

SD Maid

5.59MB. Limpieza de memoria y gestión de recursos mas poderosa y con mejor interfaz que CCleaner. Peroooo.. viendo el feedback de los usuarios con la ultima actualización ha dejado de funcionar en muchos Android anteriores al Lollipop, asi que si tienes una versión de Android anterior, mantengo mi recomendación de Ccleaner. Podéis dejarle mensajes directamente al desarrollador en Reddit      /r/SDMaid
 
Smart Launcher 3

Tiene muchas características y personalizaciones y aun así se las arregla para gastar pocos recursos. Para los bloqueos de pantalla y barras de notificaciones tienes que instalar plugins por separado. Soporta temas, gestos, widgets emergentes, modo para zurdos, barra de búsqueda inteligente y sobre todo con una presentación muy simple ideal para las personas mayores y para los amantes de la sencillez. Es gratuita con accesorios de pago y solo ocupa 5.15MB.




Torrent Search Engine

El nombre ya lo dice todo, solo  2.20MB.

Web PC Suite

Comparte archivos con tu PC, 4.15MB.

AndSMB
Logo AndSMB

Compartición de archivos con el protocolo Samba, hace tiempo que lo uso y va de cine. 3,1MB.

Automate

Automatiza distintas tareas en su teléfono inteligente o tableta Android. Crear sus automatismos con flowscharts, cambiar automáticamente la configuración como Bluetooth, GPS, Wi-Fi, NFC o realizar acciones como el envío de SMS, correo electrónico, basado en su ubicación, la hora del día o cualquier otro evento programado. Puede automatizar casi todo, incluso Automate soporta plug-ins para Tasker y Locale. ¿Suena bien no? 4.3MB

Naked Browser

Navegador muy ligero con especial atención a la privacidad; es de pago pero puedes probar la versión gratuita antes de comprar.
Bueno, y de momento termino aquí para no alargar demasiado el post. Os he dejado una buena lista de aplicaciones para probar ¿Cuales conocéis vosotros?
Podéis dejármela en los comentarios y así ampliamos la lista. 
Saludos y hasta el próximo post.



Formularios con PHP + Html(II). Planteamiento y código Html.

Como ya os expliqué en un post anterior, el objetivo de mi web de prueba es crear una especie de biblioteca virtual para poder compartir libros. Hasta ahora hemos visto como hacer el Html de la web con su formulario de contacto, pero como ya os comenté, este formulario distaba de tener un funcionamiento ideal, así que dejamos pendiente hacerlo usando PHP + Html.


Además, voy a incluir algunas funciones mas a este formulario:

  • Adjuntar archivos. Para que los usuarios no solo descarguen de la web si no también carguen archivos al servidor.
  • Comprobar el tamaño de los archivos. Es para una biblioteca así que se supone que solo se van a subir ebooks que por lo general pesan muy poquito.
  • Comprobar que los campos del nombre y el correo no estén vacíos.
De momento, aunque esté los segundo en el título, veamos primero el código Html del formulario:

 <form action="prueba-mail.php" METHOD="POST" enctype="multipart/form-data">

      <label>Nombre <span>(requerido)</span></label>
      <input type="text" name="nombre" maxlength="30" />


<!-- Campo "nombre" -->

      <label>Correo-e <span>(requerido)</span></label>    
      <input type="text" name="email" />


<!-- Campo email -->

      <label>Comentario</label>    
      <textarea name="comentario"rows="12" cols="60" ></textarea>
      <input class="btn" type="submit" name="enviar" />


<!-- Campo para el texto o comentario -->

      <label>Envíanos tu libro <span>tamaño máximo 2MB</span></label>
      <input type="file" name="adjunto" />


<!-- Adjuntar un archivo -->

      <input type="hidden" name="tamanomaximo" value="2100000" />


<!-- Atención a esta línea -->

 </form>



Es el típico formulario en html solo con algunas puntualizaciones:
  • En "action" pongo el scipt en PHP, en este caso prueba-mail.php
  • El "method" tiene que ser "POST" para que las variables puedan ser leídas por el script en PHP.
  • "enctype" debe ser "multipart/form-data" para poder envía un archivo adjunto.
  • Al final creamos una variable del tipo "hidden" (no es visible para el usuario) y con un "value" de 2100000, aproximadamente 2 MB que es el límite que voy a ponerle al adjunto. En este último punto hay que tener en cuenta que el servicio de host ya tiene un límite para subidas de archivos al servidor que depende del servicio que estéis pagando, gratuito o de pago, y dentro de los de pago, dependerá del servicio que tengáis contratado. 
Ahora vamos con el planteamiento del script, esta fase yo la veo imprescindible antes de hacer algún programa en cualquier lenguaje orientado a objetos, porque si lo empezáis de cero sin ningún tipo de esquema o diagrama, va a ser una locura pues entramos en los escabrosos terrenos de las estructuras lógicas. Una vez que se tiene algo mas de rodaje se es capaz de crear programas desde cero o copiando y pegando bloques de código que ya hayas usado y que se pueden reutilizar.

Este es el diagrama:

Haz clic para hacer zoom

Lo he dividido en cuadros numerados para mejorar la explicación. Antes de empezar recomendaros que os leáis mi anterior post de introducción al PHP si habéis venido a parar por aquí por primera vez.


  1. En este primer bloque analizamos el contenido del adjunto, con un condicional if nos preguntamos si el tamaño del adjunto es mayor que cero Y(AND) si el tamaño del adjunto es menor o igual que la variable tamanomaximo que hemos declarado en el formulario en Html, al usar el operador de comparación AND se tienen que cumplir las dos condiciones para que el resultado del condicional sea TRUE. En caso de FALSE vamos al bloque 4, en caso TRUE seguimos al bloque 2.
  2. Proceso del adjunto, mostramos algunos mensajes de control, tanto para el usuario como para nosotros, pero ya veremos mas al detalle este punto en el siguiente post.
  3. Una vez procesado el adjunto lo subimos al server, es conveniente crear una carpeta en el mismo que contenga los archivos que suben los usuarios y que no se mezclen con los de nuestra web. Aquí incluyo otro condicional If para comprobar que efectivamente se ha producido la subida, en caso TRUE se muestra un mensaje afirmativo y en caso FALSE un mensaje de error.
  4. A este punto llegamos si el punto 1 ha dado FALSE, aquí con otro condicional comprobamos si el tamaño del adjunto es igual a cero, en caso TRUE mostramos el mensaje "no hay adjuntos" en caso FALSE, es que el adjunto no es igual a cero, ni menor o igual que el tamaño máximo así que por lógica es mayor, con lo que la subida no esta permitida y mostramos el mensaje correspondiente.
  5. Tras terminar con el fichero adjunto (si lo hay) pasamos a comprobar el nombre del usuario que nos deja un mensaje y su dirección de correo, si hay algo escrito, obtenemos TRUE, se envía el mensaje y damos la opción de volver al inicio; en caso FALSE mostramos mensaje de error y damos la posibilidad de volver al formulario.

Y bueno de momento lo dejamos aquí, en un siguiente post os mostraré como me ha quedado el script en PHP y podréis probarlo, un saludo a tod@s!!




    martes, 2 de agosto de 2016

    Personajes ilustres. Ada Lovelace. (10.10.1815 - 27.11.1852)

    Hoy os traigo un personaje muy desconocido, pero imprescindible para la aparición de la informática aunque viviera durante el s. XIX, Ada Lovelace.

    Ada Byron era la hija de un breve matrimonio entre el poeta romántico Lord Byron y Anne Isabelle Milbanke, que se separó de Byron sólo un mes después de Ada nació. Cuatro meses más tarde, Byron dejó Inglaterra para siempre. Ada nunca conoció a su padre (que murió en Grecia en 1823) y fue criada por su madre, Lady Byron. Su vida fue una apoteosis de la lucha entre la emoción y la razón, subjetividad y objetividad, la poética y la matemática, la mala salud y ráfagas de energía.

    Retrato de Ada Lovelace.


    La señora Byron deseaba que su hija fuera diferente de su padre poeta, y se encargó de que Ada recibiera formación en matemáticas y la música, como disciplinas para contrarrestar tendencias poéticas peligrosas. Pero la herencia compleja de Ada se hizo evidente ya en 1828, cuando hizo el diseño para una máquina voladora. Fueron las matemáticas que dieron alas a su vida.


    La señora Ada Byron se movió en la sociedad de la élite de Londres, en la que los caballeros eran bastante mas probable que estuvieran muy ocupados con la política o con los asuntos militares que gastaran su tiempo y fortuna persiguiendo la botánica, la geología o astronomía. A principios del siglo XIX no había científicos "profesionales" (de hecho, la palabra "científico", sólo fue acuñada por William Whewell en 1836) -, y la participación de las mujeres de la nobleza en la búsqueda intelectual no se fomentó ampliamente.


    Uno de los caballeros científicos de la época llegó convertirse en amigo de Ada, Charles Babbage, profesor lucasiano de matemáticas en Cambridge, era conocido como el inventor del motor de diferencias, una máquina calculadora que operaba elaborado por el método de las diferencias finitas. Ada conoció a Babbage en 1833, cuando tenía sólo 17 años, y comenzaron una voluminosa correspondencia sobre los temas de las matemáticas, la lógica, y en última instancia todas las materias.


    En 1835, se casó con William King, que heredó un título nobiliario en 1838, se convirtió en el conde y Ada en la condesa de Lovelace y fruto de ese matrimonio Ada tuvo tres hijos.

    El profesor Babbage había hecho planes en 1834 para un nuevo tipo de máquina de cálculo (aunque el motor de diferencia no fue terminado), una máquina analítica. Sus patrocinadores parlamentarios se negaron a apoyar una segunda máquina con la primera sin terminar, pero Babbage encontro simpatía por su nuevo proyecto en el extranjero. Babbage alistó a Ada como traductora para el libro de memorias, y entre 1842 y 1843, tradujo un artículo del ingeniero militar italiano Luigi Menabrea sobre la máquina, que complementó con un amplio conjunto de notas propias, denominadas simplemente "Notas". Estas notas contienen lo que se considera como el primer programa de ordenador, esto es, un algoritmo codificado para que una máquina lo procese. Estos son la fuente de su fama perdurable.





    Ada llama a sí misma "un analista (y metafísica)," y ella entendió los planes para el dispositivo, así como Babbage, pero era mejor en la articulación de su promesa. Ella lo vio acertadamente como lo que llamaríamos hoy una computadora de propósito general. Se ajustó para "desarrollando [sic] y la tabulación de cualquier función de lo que sea... El motor [es] la expresión material de cualquier función indefinida de cualquier grado de generalidad y complejidad." Sus notas anticipan desarrollos futuros, incluyendo la música generada por computadora.

    Sugirió el uso de tarjetas perforadas como método de entrada de información e instrucciones a la máquina analítica. Además introdujo una notación para escribir programas, principalmente basada en el dominio que Ada tenía sobre el texto de Luigi Menabrea de 1842 (que comentó personalmente completándolo con anotaciones que son más extensas que el texto mismo) sobre el funcionamiento del telar de Jacquard así como de la máquina analítica de Babbage. Es reseñable además su mención sobre la existencia de ceros o estado neutro en las tarjetas perforadas siendo que las tarjetas representaban para la máquina de Babbage números decimales y no binarios (8 perforaciones equivaldrían entonces a 8 bits).


    Ada murió de cáncer en 1852, a la edad de 37 años, y fue enterrada al lado del padre que nunca conoció. Sus contribuciones a la ciencia fueron resucitadas sólo recientemente, y ha sido en los últimos 20 años cuando ha empezado a hacerse conocida su figura.

    El lenguaje de programación Ada, creado por el Departamento de Defensa de los Estados Unidos, fue nombrado así en homenaje a Ada Lovelace. El manual de referencia del lenguaje fue aprobado el 10 de diciembre de 1980, y al Estándar de Defensa de los Estados Unidos para el lenguaje MIL-STD-1815 se le dio el número del año de su nacimiento y en 1998, la British Computer Society creó la Lovelace Medal (medalla Lovelace) y en 2008 iniciaron una competición anual para mujeres estudiantes de la informática.