¿Quien alguna vez ha borrado algo accidentalmente y ha deseado recuperarlo? Pocas personas. Pero, ¿a quien le han dejado un pendrive y ha tenido ganas de husmear a ver que ha contenido? Seguro que muchas más.
Llegados a este punto, uno, lo primero que hace es buscar en internet, software, que nos permite recuperar archivos borrados. Pero, cuando llegamos a una página estilo softonic y tenemos tantos para elegir, ¿cual deberiamos cojer? Lo primero que hacen algunos es irse a los freeware o a los que se encuentran en español, pero realmente, lo que nos interesa es saber la capacidad que cada uno tiene, para poder recuperar la mayor cantidad de datos.
A continuación, realizaré una comparativa entre 4 herramientas que nos permiten recuperar archivos, dos de ellas son freeware:
Para realizar las pruebas, usé un viejo MP3 que tenía por casa, ya que necesitaba algo por donde hubieran pasado muchos archivos a lo largo del tiempo. Antes de realizar la comparativa de resultados, escribiré notas personales acerca de cada uno de los programas utilizados.
TuneUp Undelete
+Español
+Es parte de una Suite
-Shareware
Características de los archivos:
Nombre
Directorio
Tamaño
Tipo
Fecha de modificación
Estado
FileRestorePlus
+Árbol gráfico de los tipos de archivos y carpetas que hay
+Previsualización de los archivos
-Shareware
Características de los archivos:
Nombre
Directorio
Estado
Tamaño
Fecha de creación
Fecha de modificación
Recuva
+Español
+Interfaz grafica
+Asistente muy útil
Características de los archivos:
Nombre
Directorio
Última modificación
Tamaño
Estado
Comentario
Clusters y offsets
Restoration
+Portable, no requiere instalación
+Búsqueda Cluster por Cluster
+Se pueden restaurar carpetas enteras con su contenido
-Interfaz gráfica
Características de los archivos:
Nombre
Directorio
Tamaño
Fecha de modificación
Cluster
Tras las tablas de características de los cuatro programas que usamos para la comparación, pasamos a realizar las pruebas:
Programas
Archivos Encontrados
TuneUp Undelete
1271 archivos
FileRestorePlus
1259 archivos
Recuva
1259 / 1464 archivos (1*)
Restoration
3157 / 13833 archivos (2*)
(1*) Recuva tiene dos tipos de scan, el normal y el profundo
(2*) Restoration tiene dos tipos de scan, el normal y uno cluster por cluster
El siguiente análisis, lo realizaremos sobre el mismo dispositivo, tras realizarle un formateo rápido:
Programas
Archivos Encontrados
TuneUp Undelete
0 archivos
FileRestorePlus
0 archivos
Recuva
0 / 622 archivos (1*)
Restoration
0 / 24667 archivos (2*)
Nota: como podemos observar, TuneUp Undelete y FileRestorePlus, no encuentran ningún archivo tras este formateo rápido, en cambio, Recuva y Restoration si. Lo más llamativo puede ser, es que el Restoration encuentre más archivos ahora que antes. ¿Cómo es posible? Los archivos que encuentra posteriormente, son archivos del tipo FILEXXXX.CHK, que contienen restos de otros archivos. A pesar de poder recuperar estos archivos, no recuperamos los demás, aunque no todos son del tipo FILEXXXX.CHK, sino que también encuentra algunos que pueden ser restaurados.
Ahora, realizaremos un formateo normal:
Programas
Archivos Encontrados
Recuva
0 archivos
Restoration
0 archivos
Ooops, no encontramos nada, ni siquiera mediante una búsqueda cluster por cluster con el Restoration. Esto quiere decir, que para evitar que alguien husmee nuestros antiguos datos mediante herramientas normales, nos serviria realizarle un formateo normal a nuestro dispositivo. Sin embargo, dicho sea de paso, la única manera de borrar totalmente un archivo de un sistema de almacenamiento, es sobreescribirlo varias veces.
Conclusión personal
Partiendo de que los dos únicos freeware son Restoration y Recuva, se podria decir que el que primero usaria para realizar este tipo de análisis es el Recuva. No solo es gratis, sino que su interfaz gráfica y sobre todo, su asistente personalizable, hacen de él un programa muy atractivo, además, no olvidemos que está en completo castellano. Por otra parte, si no encontrásemos algo que buscamos con el Recuva, probaría el Restoration con una búsqueda Cluster por Cluster.
Por último, señalar lo curioso que es, que los dos únicos programas de pago de este análisis, no detectan ningún archivo tras un leve formateo.
1.-Introducción: ¿Qué es exactamente el Spoofing?
El IP (Internet Protocol) Spoofing (Suplantación) consiste básicamente en el engaño mediante alguna técnica de una lo que queramos suplantar, a cualquier tipo de receptor. Este concepto apareció originariamente debido a la necesidad que tenían los delincuentes de ocultar su rastro de internet, al igual que, fuera de internet, actualmente los delincuentes usan técnicas para tratar de no ser descubiertos. La primera vez que se usó el término de ‘Spoofing’ se remonta a los años ochenta, por Robert Morris, creador del primer gusano de internet.
2.-IP Spoofing
Para poder hablar acerca del IP Spoofing debemos de tener unos mínimos conocimientos acerca del funcionamiento de los protocolos TCP/IP, encargados de la transmisión de datos entre ordenadores.
2.1.-¿Para qué se usa?
El principal uso que se le da al IP Spoofing es para la realización de ataques DoS, los cuales se basan en inundar de paquetes un servidor para intentar saturarlo y que no pueda recibir más. Para el atacante tiene dos ventajas respecto este ataque. El primero de ellos es la ocultación de su propia identidad para que no le descubran. El segundo, es poder enviar paquetes con distintas direcciones de origen para que al receptor le resulte más difícil defenderse.
Otro objetivo menos común, puede ser el conseguir loguearse en un sistema de autentificación basado en las direcciones IP. Resultaría bastante difícil encontrar alguno entre ordenadores alejados (físicamente hablando) y además, para poder realizarlo deberíamos ser capaces de modificar miles de paquetes a la vez. Por otro lado, es más frecuente encontrarlo en redes locales (como las existentes en oficinas), la cual nos permitirían loguearnos sin un usuario y contraseña, solo mediante la IP del tipo 192.168.XXX.XXX
Otro último uso que se le puede dar al IP Spoofing, es el engaño a servidores que tienen censurado o limitado su contenido dependiendo del país del visitante. Para esto último es muy frecuente usar proxies que nos aseguran el mismo resultado.
2.2.-Protocolos TCP/IP
El protocolo IP, es un protocolo de transferencia débil (hablando en términos de seguridad), ya que una vez completada la transferencia, no tenemos conocimiento del estado de transacción de los datos. Lo entenderemos mejor si vemos y explicamos un poco su cabecera:
Por otra parte, el protocolo TCP, usa conexión orientada al diseño. Esto es debido a que su conexión (mucho más segura que la del protocolo IP) se asegura, entre otras cosas, del establecimiento de la conexión entre el emisor y el receptor en 3 etapas distintas:
-En primer lugar, el cliente envía al servidor un paquete SYN.
-Después, el servidor revisa si el puerto correspondiente se encuentra abierto o cerrado. En el caso de encontrarse cerrado, el servidor envía un paquete de respuesta rechazando la conexión. En el caso de que se encuentre abierto, el servidor envía un paquete de respuesta SYN/ACK.
-Finalmente, cuando el emisor recibe la respuesta afirmativa con el paquete SYN/ACK, éste envía al receptor un paquete ACK completando así el establecimiento de conexión.
Hasta aquí, encontramos la primera diferencia con respecto el protocolo IP, que este último no usa ningún sistema como tal, para establecer una conexión correcta con el servidor.
Por último, mencionar también que el protocolo TCP también es el encargado de reordenar los paquetes de la transferencia, detectar errores, paquetes duplicados y múltiples cosas más que podemos ver en la cabecera de este protocolo.
Para concluir con esta parte, solo me queda por decir, que el funcionamiento de una transferencia de datos tiene el siguiente orden: primero, las aplicaciones traspasan los datos a la capa TCP. TCP divide los datos y añade a cada segmento su cabecera. Después, se pasa a la capa IP, donde a través de la red, llega a la capa TCP de destino. Aquí, TCP comprueba que no se ha perdido ningún elemento y que todo está en orden. Finalmente, desde esta última capa TCP del receptor, se envía al emisor un paquete que confirma la perfecta llegada de los datos.
2.2.-Seguridad al respecto y anotaciones
El IP Spoofing fue un problema importante hace unos años, sin embargo a día de hoy es más complicado realizar esta práctica, debido a que los routers modernos bloquean la salida de paquetes con dirección de origen falsa. A pesar de ello existen medidas para protegernos contra cualquier posible amenaza relacionada con el Spoofing.
La creación de filtros de entrada y salida en los routers pueden ayudar a combatir esta amenaza. Configurando una lista de control de acceso (ACL) y restringiendo el rango de IPs privadas, ya que es común que el origen suplantado en la transferencia de paquetes de los ataques de Spoofing sean direcciones de IP locales, con lo que fácilmente podrían atravesar el firewall.
3.-ARP Spoofing
El protocolo ARP, protocolo de resolución de direcciones, nace de la necesidad existente de traducir la dirección IP en la dirección MAC, para que, entre equipo y router, puedan transmitir paquetes (ya que no se podrían entender entre ambos).
Para entender cómo se produce el Spoofing sobre el protocolo ARP, me limitaré primeramente a explicar cómo funciona el protocolo ARP encargado que existe entre la conexión de un portátil y un router.
El portátil manda paquetes (ARP request) con la dirección a la que se lo quiere enviar. Los ordenadores que no sean los receptores desecharán este paquete, y cuando el receptor objetivo (router) ha recibido esta petición, manda una respuesta (ARP reply). Una vez relacionadas, el portátil puede acceder a internet mandando maquetes a la MAC del router. Esta relación se guarda en la caché de las máquinas, en una tabla denominada, tabla ARP.
El ARP Spoofing se basa sencillamente, en el engaño de un terminal con conexión inalámbrica, al que hacemos creer que la MAC del router al que envía los paquetes, es otra inexistente, por lo que, los paquetes que envía el terminal se pierden y no llegan al router (desconexión de internet). Por otra parte, se le puede enviar a este terminal que quiere acceder a internet, un paquete para que piense que la MAC de una tercer máquina (equipo atacante) sea la del router (este proceso es posible, debido a que el protocolo ARP puede recibir respuestas (reply) sin emitir preguntas (request)), y así, la máquina víctima estaría enviando paquetes al atacante, mientras este decide si solamente quiero verlos y reenviarlos al router, o incluso si el atacante quiere modificarlos para posteriormente enviarlos al router, lo que nos permite la redirección de equipos a una página antes de permitirles el acceso a la red.
La tabla ARP de la que hablábamos antes la podemos visualizar en la consola de Windows con la línea “arp –a”. A continuación veremos su funcionamiento de un modo práctico.
3.1.-Defensas
El uso de tablas ARP estáticas nos permitiría no generar esa caché que es vulnerable de ser suplantada. Para ello, desde la consola de Windows escribimos: arp –s [IP] [MAC]. NOTA: la dirección MAC se tiene que escribir de la siguiente forma 00-11-22-33-44-55.
Otro método que se podría usar, sería el RARP, protocolo usado para consultar a partir de una dirección MAC su dirección IP correspondiente. De tal manera que si el RARP devuelve más de una dirección IP, significa que esa dirección MAC ha sido clonada.
Mencionar un último método, que sería el reconocimiento de cualquier cambio en las tablas ARP mediante programas como ArpWatch.
3.2.-Herramientas
Existen diversas herramientas que nos permiten realizar el ARP Spoofing, quizás unas de las más famosas sea ettercap, la cual nos ayuda a realizar un posterior Man In the Middle (esto nos permite “escuchar” lo que un terminal manda a un router)
4.-Email Spoofing
Este es sin duda el más sencillo de entender. Simplemente se basa en la suplantación de una dirección de correo, en la que suelen tener diversos objetivos, como el phising (por ejemplo, pueden intentar suplantar el email de una página web importante como puede ser paypal y nos mandan a una web falsa para que pongamos los datos y el atacante reciba la información) pero en general, mediante la ingeniería social pueden intentar sacar diversa información a la víctima.
4.1.-Defensas
El método más eficaz y fácil para defenderse frente al Email Spoofing es comparar la IP del email recibido con la IP del servicio que intentan suplantar.
4.2.-¿Cómo se realiza?
Existen diversas maneras para realizar correctamente esta práctica. Una de ellas, sería montarse un servidor de correo casero y usarlo para mandar emails, pudiendo modificar configuraciones que nos permitirían esta suplantación. Otra sería mediante telnet usando un servidor de correo de alguna página en la que nos permita hacerlo y el cual hay cientos de tutoriales circulando por internet. Pero el método que considero más fácil sería directamente hacerlo con un script en PHP, el cual mediante la función mail (más información: http://php.net/manual/en/function.mail.php) nos permite configurar el correo emisor (correo spoofeado), el correo receptor (víctima), el cuerpo del mensaje, el asunto, un correo de copia oculta, etc.
4.3.-Anotación
Primeramente me gustaría recordar que la suplantación de identidad de una persona está totalmente penada por la ley. Puede parecer antiguo, pero todo lo contrario, a día de hoy se siguen intentando spoofear páginas importantes. Sin ir más lejos, en mi caso personal recibo emails de supuestamente paypal, pidiéndome datos (por correo) bastante importantes, y aquí adjunto una foto del susodicho email.
Strcspn nos devuelve el número de caracteres que hay en una cadena que no aparecen en otra. Es complicado de explicar pero fácil de entender con algún ejemplo.
Su sentencia es:
$var = strcspn($cadena1, $cadena2);
?>
Cadena1 será la cadena de texto que compararemos. Cadena2 será la cadena de texto que tendrá los caracteres que no queremos contar.
Ejemplo
$texto = "xyzmnoptq"; //esta cadena de texto tiene 9 caracteres
$noContables = "abcdefg";
echo strcspn($texto, $noContables);
//Imprime 9, porque se han contado todos los caracteres del texto
$noContables = "abco";
echo strcspn($texto, $noContables);
//Imprime 5, porque cuenta caracteres hasta que llega al caracter "o", y ahí para de contar.
?>
Strip_tags nos permite controlar los tags que queremos mostrar de una cadena de texto, incluso eliminarlos todos.
Su sentencia es:
$var = strip_tags($cadena, ($tagsPermitidas));
?>
Cadena es la cadena de texto entrante a la que vamos a realizarle los cambios. tagsPermitidas es la cadena de texto en la que ponemos las tags que si que queremos permitir. Este parámetro es opcional, y si no ponemos nada, no se filtra ninguna y se eliminan todas.
Ejemplo
$cadena = "Textodeejemplo";
echo strip_tags($cadena) . " ";
echo strip_tags($cadena, "");
//Solo vamos a filtrar la negrita, el resto no aparecerá.
?>
Devuelve:
Texto de ejemplo Texto de ejemplo
Stripcslashes nos permite traducir a los símbolos unicode. Con un ejemplo se entiende:
echo stripcslashes("\xb6");
?>
Nos devuelve: ¶
Stripos nos devuelve la posición en la que se encuentra uno o varios caracteres dentro de una cadena.
echo stripos("Hola mundo", "u")
?>
Nos devuelve 6. En caso de no encontrar nada, no devuelve nada.
Stripslashes nos devuelve la cadena de texto introducida sin los caracteres de la barra inclinada \
Stristr nos permite, dado un caracter o cadena de texto, obtener lo que hay detrás o lo que hay delante.
$email = 'correo@dominio.com';
echo stristr($email, '@') . " ";
echo stristr($email, '@', true); //Esta función solo funciona de la versión 5.3.0 hacia adelante
?>
Encontré en esta web un listado bastante completo de cámaras que tienen autobracketing, traducido al español como horquillado automático.
El autobracketing, nos permite obtener fotos de manera automática con distinta apertura del diafragma de la lente. Cuanto más cerrado esté, menos luz entra y más oscura se ve la foto, y viceversa.
Esto, cada vez se usa con mayor frecuencia para obtener imágenes HDR (high dynamic range). Para ello, tenemos que obtener exáctamente la misma foto con distintos valores de apertura del diafragma. Luego las juntamos con algún tipo de software como el Photoshop de Adobe, y el resultado es esa imagen, con un balance de colores impresionante.
Aquí tenemos un ejemplo:
Podemos realizar imágenes HDR sin necesidad de una cámara con autobracketing, pero teniendo una facilita muchísimo las cosas. Y aquí dejo la lista:
Camera Model
Auto-bracketed frames
Maximum EV step
Maximum EV range with AEB
Maximum burst rate
Canon 1D MKII / MKII N
3, 5 or 7
3
18
8.5 fps
Canon 1D MKIII
2, 3, 5 or 7
3
18
10 fps
Canon 1D MKIV
2, 3, 5 or 7
3
18
10 fps
Canon 1Ds MKII
2, 3, 5 or 7
3
18
4 fps
Canon 1Ds MKIII
2, 3, 5 or 7
3
18
5 fps
Canon 5D
3
2
4
3 fps
Canon 5D Mark II
3
2
4
3.9 fps
Canon 7D
3
3
6
8 fps
Canon 10D
3
2
4
3 fps
Canon 20D
3
2
4
5 fps
Canon 30D
3
2
4
5 fps
Canon 40D
3
2
4
6.5 fps
Canon 50D
3
2
4
6.3 fps
Canon 300D / Digital Rebel
3
2
4
2.5 fps
Canon 350D / Digital Rebel XT
3
2
4
3 fps
Canon 400D / Digital Rebel XTi
3
2
4
3 fps
Canon 450D / Digital Rebel XSi
3
2
4
3.5 fps
Canon 500D / Digital Rebel T1i
3
2
4
3.4 fps
Canon 550D / Digital Rebel T2i
3
2
4
3.7 fps
Canon 1000D (Rebel XS)
3
2
4
3 fps
Canon 2000D (from submitted info, may be incorrect)
str_split nos permite dada una cadena de texto, obtener una matriz cuyos valores sean cada carácter de la cadena, e incluso poner un límite numérico para que por ejemplo, cada elemento de la matriz contenga N caracteres.
Su sentencia es:
$matriz = str_split($cadena, ($limite));
?>
Cadena es la cadena de texto que vamos a dividir en la matriz. Límite es el número máximo de caracteres que puedo contener cada elemento de la matriz. Es opcional.
str_word_count nos permite contar las palabras que existen en una cadena, separadas por cualquier caracter que no sea una letra. Por ejemplo, en la frase: OLPC tiene 3 años, diria que solo existen 3 palabras, OLPC, tiene, y años. Tambien podriamos hacer la prueba con la frase: OLPC t1ene 3 años, diciendo que tendria 4 palabras, OLPC, t, ene, y años. Es decir, cualquier caracter que no sea una letra, actúa como separador entre palabras, aunque podemos añadir excepciones.
Cadena es la cadena de texto en la cual vamos a contar el número de palabras existentes. Formato es un número del cero al dos, que nos permite personalizar el resultado. Si ponemos un 0, devuelve el número de palabras (por defecto), si ponemos un 1, devuelve un array cuyos elementos sean las palabras encontradas, y si ponemos un 2, devuelve un array cuyos elementos sean las palabras encontradas y cuyo índice es la posición de la letra de cada palabra. Lista es la lista de caracteres que queremos excepcionar para que no sean separadores de palabras. Por defecto son todos, salvo las letras mayúsculas y minúsculas (incluyendo la Ñ y las vocales con acentos)
Ejemplo
$cadena = "OLPC tiene 3 años";
$resultado1 = str_word_count($cadena);
//Simplemente obtenemos el número de palabras
$resultado2 = str_word_count($cadena, 1);
//Obtenemos cada palabra en un elemento del array resultado2
$resultado3 = str_word_count($cadena, 2, "3");
//Hacemos que '3' se convierta en una excepcion (osea que hay 4 palabras) y cada elemento del array pertenece a cada palabra de la cadena, cuyos indices son la posicion de la primera letra de cada palabra
echo $resultado1 . "
";
foreach($resultado2 as $clave => $valor)
echo "Clave: $clave y Valor: $valor ";
echo " ";
foreach($resultado3 as $clave => $valor)
echo "Clave: $clave y Valor: $valor ";
?>
Nos devuelve:
3
Clave: 0 y Valor: OLPC
Clave: 1 y Valor: tiene
Clave: 2 y Valor: años
Clave: 0 y Valor: OLPC
Clave: 5 y Valor: tiene
Clave: 11 y Valor: 3
Clave: 13 y Valor: años
strcasecmp nos permite comparar el primer caracter de dos cadenas de texto, y obtener la diferencia de posiciones (respecto la tabla ASCII) que hay entre ellas. No distingue entre mayúsculas o minúsculas en el caso de las letras. En caso de que la cadena sea de más de un carácter y el primer carácter sea igual, pasará al segundo carácter (lo veremos más claro con el ejemplo)
Su sentencia es:
$resultado = strcasecmp($cadena1, $cadena2);
?>
Cadena1 y Cadena2 son las cadenas de texto, cuyos primeros caracteres se van a comparar.
Ejemplo
$resultado = strcasecmp("a", "b");
//Se resta el primero menos el segundo, por eso el resultado saldrá negativo
echo $resultado . " ";
$resultado2 = strcasecmp("hola", "Hona");
//Aqui, como h es igual a H, pasa a comprobar el siguiente caracter, y como también es igual, pasa a comprobar el tercero, entre 'l' y 'n'. Podemos observar que hay una diferencia de 2 posiciones entre ambos
echo $resultado2 . " ";
$resultado3 = strcasecmp("=", "-");
echo $resultado3 . " ";
//Ahora, pasaremos los caracteres = y - a ASCII y los restaremos, para ver que nos da el mismo resultado:
$otro = ord("=") - ord("-");
echo $otro;
?>
Nos devuelve:
-1
2
16
16
strchr y strstr (usaré strstr para los ejemplos pero funcionan de manera idéntica) nos permiten obtener una cadena de texto posterior o anterior a un separador.
Cadena es la cadena de texto que vamos a dividir. Separador es la cadena de texto que nos permitirá dividir la otra cadena de texto entrante. Bool es un valor, que puede ser true o false. Por defecto está en false. Es opcional. Nota: el último parámetro solo funciona a partir de la versión de PHP 5.3.0
strcmp y strcoll funcionan de una manera parecida a strcasecmp. Devuelve 0 si las cadenas son iguales. Devuelve 1 si la el carácter de la segunda es mayor (en la table ascii) que el de la primera cadena, y -1 en caso contrario.
Su sentencia es:
$resultado = strcmp($cadena1, $cadena2);
?>
Cadena1 y Cadena2 serán las cadenas cuyos primeros caracteres se compararan. Es sensible a mayúsculas y minúsculas, al contrario que strcasecmp.
La computación en la nube, es un tipo de computación o modelo basado en la compartición de recursos y datos a través de internet.
Se podría dividir en varias capas:
El cliente: es el terminal (conjunto de hardware y software) que accede y confia en el sistema cloud computing suministrado por un proveedor.
El SaaS (Software as a Service, Software como un servicio): elimina la necesidad de tener que instalar y correr aplicaciones en un ordenador. Usa un software como un servicio a través de internet. Un ejemplo de este servicio podría ser Google Docs (aunque en general, Google Apps) ya que podemos usar un editor de texto sin tener que instalar nada en nuestros ordenadores.
El PaaS (Platform as a Service, Plataforma como un servicio): es un ambiente de desarrollo, que consiste en un software básico con una base de datos y herramientas de desarrollo. Un ejemplo sería Google AppEngine, que está basado en Python y Java.
El IaaS (Infrasctructure as a Service, Infraestructura como un servicio): en vez de tener que comprar servidores, software, espacio (discos duros), y equipamiento, los clientes alquilan estos servicios. Además, el empresario puede elegir quien quiere que sea su proveedor (lo cual quiere decir que existirá competencia en el mercado). Como ejemplo de almacenamiento, tenemos los servicios de servidores de almacenamiento online, como Megaupload o Rapidshare, y como ayuda o mantenimiento, dispondriamos de una ayuda online las 24 horas (aunque esto depende del proveedor) sin tener que contratar a un servicio especializado por nuestra cuenta. También eliminaría le necesidad de mantener el hardware y software de la empresa (que siempre tiene que estar actualizado)
Esquema de las capas
La computación en la nube reduce los costes de las empresas y el presupuesto que necesita cada una para ser desarrollada (lo que aumentaría el número de empresas). Por un lado, el empresario necesitaría menos expertos cualificados en temas como aplicaciones (por falta de tales), seguridad, mantenimiento o administración, ya que en todo momento dispondría de un servicio técnico totalmente gratis (contratando los servicios).
Otro efecto considerable, sería el descenso de programadores (orientados a desarrollar aplicaciones) que necesitarían las empresas. Esto, por el lado de las empresas es bueno ya que reduce los costes, pero por el lado de los programadores es sin duda malo, debido a que reduciría la demanda de sus servicios, que a su vez generaría un abaratamiento de estos (lo cual vuelve a ser bueno para las empresas que los quieran contratar).
Como dije anteriormente en la descripción de las capas, no serían necesarias la creación de aplicaciones personalizadas, ya que estas aplicaciones son online, a las cuales accederían las empresas mediante una subscripción (mensual, anual..). Es interesante pararnos en este último punto. A la larga, para las empresas grandes, importantes y que llevan muchos años en el mercado, puede ser una desventaja, ya que seguramente a lo largo de los años, pagarían más por esa subscripción, que a un grupo de programadores para realizar la aplicación que quieran. Sin embargo, para las empresas que están empezando, es algo bastante positivo, porque la inversión es mínima comparado con el hecho de tener que comprar la aplicación o contratar a un grupo de programadores para crearla.
Aumentaría desde luego, la rapidez con la que las empresas adquieren y usan las aplicaciones, ya que al ser una subscripción, las aplicaciones se mantendrían online y quedarían a expensas de la personalización (a partir de un estandar) que cada empresa quiera realizar sobre esta. Al ser aplicaciones online, también aumenta la facilidad con la que podriamos generar reportes.
Otra pesadilla de todo empresario que dispone de una aplicación es la actualización de la misma, ya que muchas de ellas, requerirían tener que usar una base de datos desde cero, es decir, que se perderían los datos ya guardados. Con Cloud Computing este problema quedaría solventado ya que asegura mantener los datos ya guardados.
Sin embargo, a pesar de todas estas ventajas, la computación en la nube también dispone de varias desventajas, sobre todo al sector de los expertos.
Por un lado, está el problema de la privacidad y almacenamiento de datos. Cuando un empresario o propietario guarda datos en su base de datos, como los de los clientes propios, con datos muy personales como nombres, apellidos, teléfonos y direcciones, estos datos quedan en propiedad de este dueño. Sin embargo, con Cloud Computing, además de conocer estos datos el dueño, los conocería también la empresa encargada de proporcionarles servicios (como almacenamiento) a este empresario, es decir, que estos propietarios que alquilan los servicios a una empresa de Cloud Computing dejan su información a sus proveedores.
Otro tema bastante serio, es el comentado anteriormente. La demanda de expertos en ámbitos de seguridad, mantenimiento y aplicaciones por parte de las empresas decaería sustancialmente.
Como SaaS, tenemos de ejemplo a SalesForce.com, la cual nos deja un video muy completo y sencillo de entender, en el que comprenderemos la función de esta empresa:
Una matriz, no es más que una variable con una o varias dimensiones, en la que podemos almacenar el mismo tipo de datos que en una variable normal y corriente, pero nos permite acceder a contenido de una manera mucho más simple y fácil.
Para declarar una variable lo hacemos del siguiente modo:
Para acceder a su contenido tenemos dos opciones. Por un lado, podemos acceder a el contenido entero de la matriz:
Que nos devuelve: uno,dos,tres,cuatro
O acceder al contenido de cada elemento de la matriz uno a uno:
Que nos devuelve: uno
Para recorrer todos los valores de la matriz es recomendable hacerlo mediante un bucle, como for o while.
¿Qué es lo que podemos hacer con un array? A continuación explicaré los siguientes métodos con ejemplos: concat, join, pop, push, shift, unshift, slice, splice, reverse y sort.
Concat nos sirve para unir en una nueva matriz, los valores de otras matrices.
Join nos permite obtener una matriz separada por un separador que nosotros queramos. Recordemos que por defecto salen separadas por comas.
Nos devuelve: uno – dos – tres – cuatro
Pop nos permite eliminar y obtener el último valor de una matriz.
Nos devuelve: cuatro
y: uno,dos,tres
Push nos añade un nuevo elemento a la matriz por detrás, y nos dice cuantos elementos existen (tras añadirlo).
Nos devuelve: 5
y: uno,dos,tres,cuatro,cinco
Shift nos permite eliminar y obtener el primer valor de una matriz.
Nos devuelve: uno
y: dos,tres,cuatro
Unshift nos añade un nuevo elemento a la matriz por delante, y nos dice cuantos elementos existen (tras añadirlo).
Nos devuelve: 5
y: cero,uno,dos,tres,cuatro,cinco
Slice nos permite obtener una matriz cuyos valores sean los de otra matriz, delimitados por un inicio y un fin.
Nos devuelve: dos,tres,cuatro,cinco,seis
Splice nos permite introducir en una matriz valores nuevos, a partir de la posición que queramos, incluso si queremos sobreescribir algunos ya existentes. También se puede usar para borrar los valores existentes entre un rango de índices.
Su sentencia es la siguiente:
Inicio es la posición en donde empezará a añadir o borrar. Borrados es el número de elementos que se quieren borrar. Si ponemos un 0, solamente añadirá valores. Valor1, valor2, …, valorN son los valores que deseamos añadir.
Nos devuelve: uno,dos,dos y medio,tres,cuatro,cinco,seis,siete,ocho
Nos devuelve: uno,dos,siete,ocho
Nos devuelve: uno,two,three,four,seis,siete,ocho
Reverse nos permite intercambiar el orden de los elementos de una matriz, de forma que el primero pasa a ser el último, el segundo el antepenúltimo.. etc.
Nos devuelve: cuatro,tres,dos,uno
Sort nos permite ordenar la matriz alfabéticamente.
Objeto es el string que queremos encontrar para cambiarlo. Remplazo es el string sustituto de lo que vamos a cambiar. Cadena es el string en donde va a buscar. Nueva es la nueva cadena de texto que se va a formar.
Ejemplo
$cadena = "Esta es una cadena de texto de ejemplo";
$nuevaCadena = str_ireplace("de", "DE", $cadena);
echo $nuevaCadena;
?>
El resultado será: Esta es una caDEna DE texto DE ejemplo
str_pad nos permite, dada una cadena, rellenarla con caracteres hasta alcanzar cierta longitud. Podemos elegir por donde queremos rellenarlo (izquierda, derecha, ambos), y también el/los carácter(es) con los que lo vamos a rellenar.
Cadena es la cadena de texto en la que vamos a rellenar. Longitud es el número de caracteres que queremos tener al final, una vez rellenado. Caracter es el caracter (o caracteres) con los que vamos a rellenar nuestra cadena. Es opcional, por defecto se rellena con espacios en blanco. Lugar es por donde se va a rellenar la cadena, izquierda, derecha, o ambos.
Ejemplo
echo str_pad("ejemplo1", 15, "*");
echo " ";
echo str_pad("ejemplo2", 13, "=______________=", STR_PAD_LEFT);
//Nota: aquí se nota que va a sobrar. Lo veremos reflejado en el resultado.
echo " ";
echo str_pad("ejemplo3", 20, "-", STR_PAD_BOTH);
?>
Devuelve:
ejemplo1*******
=____ejemplo2
——ejemplo3——
str_repeat nos permite multiplicar una cadena de texto tantas veces como queramos.
Su sentencia es:
echo str_repeat($cadena, $veces);
?>
Cadena es la cadena de texto que se repetirá. Veces es el número de veces que se repetirá.
Ejemplo
echo str_repeat("(*)", 5);
?>
Nos devuelve:
(*)(*)(*)(*)(*)
str_replace funciona de manera exactamente igual que str_ireplace, aunque a continuación escribiremos un ejemplo si se dieran matrices como cadena.
$cadena[] = "Esta es una cadena de texto de ejemplo";
$cadena[] = "Esta es otra cadena de texto dedede ejemplo";
$nuevaCadena = str_ireplace("de", "DE", $cadena);
echo $nuevaCadena[0];
echo " ";
echo $nuevaCadena[1];
?>
Resultando: Esta es una caDEna DE texto DE ejemplo
Esta es otra caDEna DE texto DEDEDE ejemplo
str_rot13 nos permite cifrar mediante ROT13. Es un tipo de encriptación César (denominado así porque el primero en usar este tipo de encriptación fue Julio César. Se encarga de usar las letras del abecedario que se encuentran en otra posición). Es decir, que nos devuelve caracteres que se encuentran 13 posiciones antes (en el abecedario, sin contar la Ñ). Funciona con mayúsculas y minúsculas, y todo lo que no sean letras, se queda exactamente igual.
Su sentencia es:
echo str_rot13($cadena);
?>
Cadena es la cadena de texto que se va a cifrar.
Ejemplo
echo str_rot13("abCD12ñ");
?>
Nos devuelve: noPQ12ñ
str_shuffle nos permite desordenar aleatoriamente los caracteres de una cadena.
Su sentencia es:
echo str_shuffle($cadena);
?>
Cadena es la cadena de texto que se desordenará aleatoriamente.
preg_grep nos permite, a partir de un array, generar otra matriz que tenga los valores del array que coinciden con un patrón.
Su sentencia es:
$matriz = preg_grep($patron, $otraMatriz);
?>
Patrón es el parámetro expresado mediante expresiones regulares que nos permite encontrar algo definido dentro de, en este caso, una matriz dada. otraMatriz es la matriz principal en la que tenemos diversos valores y en donde vamos a buscar, mediante el patrón, las coincidencias que queramos.
Si recordemos que en expresiones regulares se distinguen mayúsculas de minúsculas, y para evitar esa distinción ponemos una i al final del patrón, quedando: $patron = ‘/hola/i’;
preg_quote nos devuelve una cadena de texto con los caracteres especiales de las expresiones regulares escapados, por lo que es útil para combinarlo con estas.
Estos caracteres especiales son: . \ + * ? [ ^ ] $ ( ) { } = ! < > | : –
Su sentencia es:
$resultado = preg_quote($cadena, ($caracter));
?>
Cadena es la cadena de texto que introducimos. Caracter es un carácter que introducimos si también queremos escaparlo (es opcional). Resultado es la cadena de texto de salida, que se encuentra con los caracteres escapados (mediante la barra \)
Nos devuelve: Ej\emplo\-nu\evo
Porque escapa el carácter especial por defecto “-” y el que queriamos nosotros, ‘e’.
preg_replace_callback nos permite, al igual que preg_replace, reemplazar datos, pero en este caso, lo podemos realizar a través de funciones, siendo el resultado más personalizable y complejo.
Patrón es la expresión que nos permite encontrar los datos que queremos. Función es el nombre de la función que utilizaremos. Input es el valor que introduciremos en la función anterior.
Ejemplo
$cadena = "El pasado día 15 hubo una revuelta";
function cambiar($ejemplo) {
return $ejemplo[0]+2;
//ejemplo[0] vale 15, que es el número encontrado por el patrón.
}
echo preg_replace_callback("/\d{2}/", "cambiar", $cadena);
//Se encarga de cambiar el número 15, por 15+2 (es decir, 17), junto con el resto de la cadena.
?>
El objetivo de esta función es añadir 2 días más a la fecha que pone en la cadena. Nos devuelve: El pasado día 17 hubo una revuelta
preg_split nos permite partir una cadena de texto, dando como resultado una matriz en donde se guarde en cada clave esos valores.
Patrón es el conjunto de expresiones regulares a partir de las cuales, cuando encuentre una coincidencia partirá la expresión, almacenando el resultado en una matriz. Cadena es la cadena de texto que deseamos partir. Límite es el número máximo de cadenas que queremos obtener. Este parámetro es opcional. Si se escribe un 0, o no se pone, se entiende que no hay límite. Opciones nos permite personalizar el resultado de la matriz resultante. Explicaré las 3 opciones más comunes.
Ejemplo
$cadena = preg_split("/(a)/", "Esta es una cadena de texto de ejemplo.", 0);
//No me complico la vida con el patrón, pero podría usar cualquier tipo de expresión regular válida
foreach($cadena as $clave => $valor)
echo "Valor: $valor ";
?>
Nos devuelve: Valor: Est
Valor: es un
Valor: c
Valor: den
Valor: de texto de ejemplo.
Podemos observar que cada valor de la matriz, corresponde al trozo de cadena partida (sin el separador).
Ahora explicaré las diferentes opciones que podríamos añadir: PREG_SPLIT_NO_EMPTY se encarga de que la matriz no tenga ningún elemento vacio. ¿Cómo es posible que tenga elementos vacios la matriz?
Imaginemos que usamos de patrón un punto, y de cadena, una frase terminada en punto: “Esto es un ejemplo.”
preg_split separa en dos trozos lo que hay antes, y lo que hay detrás del punto. Como detrás del punto no hay nada, se guarda un valor vacio (null).
PREG_SPLIT_DELIM_CAPTURE se encarga de que nuestra matriz venga con los delimitadores como valores nuestra propia matriz (esto solo funciona si se han usado paréntesis en la expresión regular de patrón). Es decir, en nuestro anterior ejemplo nos devolvería lo siguiente: Valor: Est
Valor: a
Valor: es un
Valor: a
Valor: c
Valor: a
Valor: den
Valor: a
Valor: de texto de ejemplo. PREG_SPLIT_OFFSET_CAPTURE genera una matriz de dos dimensiones, de manera que, en cada coincidencia nos muestra la posición del primer carácter de la cadena partida. Lo veremos claramente mediante un ejemplo:
$cadena = preg_split("/(a)/", "Esta es una cadena de texto de ejemplo.", 0, PREG_SPLIT_OFFSET_CAPTURE);
foreach($cadena as $clave => $valor)
echo "Valor: $valor[0] y $valor[1] ";
?>
Nos devuelve: Valor: Est y 0
Valor: es un y 4
Valor: c y 11
Valor: den y 14
Valor: de texto de ejemplo. y 18
Repito, el número obtenido es la posición del primer carácter de cada uno, respecto la cadena original.
preg_match_all nos sirve para cuando queremos buscar algo en una cadena de texto, y queremos que nos devuelva eso que ha encontrado. Nos podría servir por ejemplo, para saber todas las imágenes que hay en una página web o sencillamente, para recoger fechas y cosas definidas desconocidas.
Patron serán los filtros que pongamos para que busque dentro del string. Este patrón se expresa con expresiones regulares. String es la cadena de texto en donde vamos a buscar lo que necesitamos. Salida será la matriz final en la que tengamos los resultados de la búsqueda y algunos otros resultados. Opciones será el parámetro que nos permita ordenar en el array de salida los elementos obtenidos (son opcionales). Por ejemplo:
$cadena = '18/01-85 26/01/92';
preg_match_all('/[0-9]{2}(\/|\-)[0-9]{2}(\/|\-)[0-9]{2}/', $cadena, $salida, PREG_PATTERN_ORDER);
//Este script nos sirve para sacar las fechas y saber qué separador usan.
echo $salida[0][0] . " y " . $salida[0][1];
echo " ";
echo $salida[1][0] . " y " . $salida[1][1];
echo " ";
echo $salida[2][0] . " y " . $salida[2][1];
?>
Nos devuelve:
18/01-85 y 26/01/92
/ y /
– y /
El siguiente ejemplo:
$cadena = '18/01-85 26/01/92';
preg_match_all('/[0-9]{2}(\/|\-)[0-9]{2}(\/|\-)[0-9]{2}/', $cadena, $salida, PREG_SET_ORDER);
//Solo cambia el patrón y lo de abajo
echo $salida[0][0] . " y " . $salida[1][0];
echo " ";
echo $salida[0][1] . " y " . $salida[1][1];
echo " ";
echo $salida[0][2] . " y " . $salida[1][2];
?>
Devuelve: 18/01-85 y 26/01/92
/ y /
– y /
preg_match lo usaremos para saber simplemente, si en una cadena de texto se encuentra lo que buscamos. Si hemos entendido preg_match_all, con este no deberia de haber ningún problema. Usa una sentencia igual (en los dos primeros parámetros) que preg_match_all:
preg_match_all($patron, $string)
?>
Usaremos un ejemplo para explicar su funcionamiento:
Nos devuelve 1, porque lo ha encontrado. Si no lo hubiera encontrado nos habria devuelto 0.
preg_replace nos permite, a partir de una cadena dada, reemplazar, reordenar y cambiar datos de esta cadena de forma sencilla.
Su sentencia es:
preg_replace($patron, $sustitucion, $cadena)
?>
Patrón se expresa mediante Expresiones Regulares. Sustitución es la cadena ordenada y reorganizada a la que dará resultado. Usaremos $N en donde N serán números indicadores de la posición de los patrones, por los que sustituiremos (con el ejemplo se ve mucho más fácil). Cadena es la cadena de texto a la que realizaremos la edición.
$cadena = 'Enero 26, 1992';
$patron = '/(\w+) (\d+), (\d+)/i';
$sustitucion = 'Nací el $2 de $1 de $3';
echo preg_replace($patron, $sustitucion, $cadena);
?>