miércoles, 6 de marzo de 2013

PHP Y LOS TEXTOS EN ESPAÑOL


El lenguaje PHP no gestiona bien los caracteres con tilde que usamos en español (castellano).
Me refiero a los caracteres á é í ó ú Á É Í Ó Ú. Y también por extensión a ñ Ñ y otros similares.


Por ejemplo, la funcion stripos($pajar,$aguja) debería buscar la aguja en el pajar ignorando mayúsculas y minúsculas. Y efectivamente lo hace, pero con los caracteres ordinarios del idioma inglés, que no incluyen los caracteres españoles.

Así que la línea
$pos=stripos($pajar,$aguja);
no funciona cuando el pajar y la aguja contienen caracteres españoles.

La primera idea para adaptar el código al español podría ser
$pos=stripos(strtolower($pajar),strtolower($aguja));
pero esto sigue fallando, porque la funcion strtolower() no convierte a minúsculas los caracteres españoles. Tampoco la función strtoupper() convierte a mayúsculas el texto en español.

Hay mucha documentación de PHP que remite al uso de una declaración del idioma en uso para estas funciones. Dice que se incluya una línea con el contenido siguiente:
setlocale(LC_ALL,'es_ES');
Bien, ésto sencillamente no funciona: ver http://www.rojasdelgado.com/kkk/setlocale

así que finalmente la solución pasa por currárselo uno mismo:

function SINTILDES($texto)
{
$r=$texto;
$listatildes = array(
      'a' => array('á','à','â','ä'),
      'e' => array('é','è','ê','ë'),
      'i' => array('í','ì','î','ï'),
      'o' => array('ó','ò','ô','ö'),
      'u' => array('ú','ù','û','ü'),
 'A' => array('Á','À','Â','Ä'),
 'E' => array('É','È','Ê','Ë'),
 'I' => array('Í','Ì','Î','Ï'),
 'O' => array('Ó','Ò','Ô','Ö'),
 'U' => array('Ú','Ù','Û','Ü')
);
foreach($listatildes as $sintilde=>$contilde)
{
    $r = str_replace($contilde,$sintilde, $r);
}
return $r;
}

function MAYUSCULAS($texto)
{
$r=$texto;
$listacambios = array(
 'Á' => 'á',
 'É' => 'é',
 'Í' => 'í',
 'Ó' => 'ó',
 'Ú' => 'ú',
 'Ñ' => 'ñ'
);
foreach($listacambios as $mayusculas=>$minusculas)
{
    $r = str_replace($minusculas,$mayusculas, $r);
}
return strtoupper($r);
}

function MINUSCULAS($texto)
{
$r=$texto;
$listacambios = array(
 'Á' => 'á',
 'É' => 'é',
 'Í' => 'í',
 'Ó' => 'ó',
 'Ú' => 'ú',
 'Ñ' => 'ñ'
);
foreach($listacambios as $mayusculas=>$minusculas)
{
    $r = str_replace($mayusculas,$minusculas, $r);
}
return strtolower($r);
}

miércoles, 20 de febrero de 2013

CSS - EVITAR QUE UNA DIVISION QUEDE CORTADA AL SALTAR DE PAGINA IMPRESA

No es habitual que se imprima una página web, al menos en papel.
Pero sí que es habitual que se considere importante la versión impresa de una página web, si otra cosa no, porque es mejor prevenir que curar, y la optimización de la versión impresa
¡  AHORRA MEDIO AMBIENTE  !
 
Es apreciable y deseable que se ahorren páginas de impresión (se ahorra papel), pero a veces es mejor considerar el esfuerzo de lectura posterior. Por ejemplo, si una división, en general un conjunto de párrafos con un título de apartado, se imprimiera a caballo entre dos páginas, este esfuerzo de lectura se verá incrementado. En ese caso ¿cómo se puede evitar que el contenido entre <div> y </div> se quede cortado?
 
CSS tiene la solución: basta con incluir estas lineas en el código css de tu página: 
 
@media print
{
     div
     {
        page-break-inside: avoid;
     }
}

domingo, 17 de febrero de 2013

EL REGISTRO DE WINDOWS - ELIMINAR ENTRADAS DESHABILITADAS CON MSCONFIG

Hacer cambios en el Registro de Windows no es una tarea fácil. No en vano en el Registro se guarda toda (o casi toda) la configuración del sistema operativo y del resto de los programas.
Para acceder al Registro basta con ejecutar REGEDIT.EXE, pero insisto, no es recomendable para usuarios sin experiencia. Léete primero algun libro. Lo agradecerás. De lo contrario puede que dejes tu sistema en un estado no utilizable.

La mayoría de los cambios que se requiere hacer en el Registro son del tipo
  • deshabilitar algún programa al arrancar windows
  • deshabilitar algún servicio al arrancar windows
  • otros...
Estos cambios pueden hacerse más cómodamente desde el Configurador de Microsoft. Para acceder a esta configuración basta con ejecutar MSCONFIG.EXE, aunque debo decir que esta tarea tampoco es recomendable para usuarios sin experiencia ni formación previa. Soy muy pesado pero léete primero algun libro...
Aquí puedes deshabilitar programas y servicios con solo quitar la marca de selección que les corresponda.

El problema aparece cuando, tras algún tiempo, se empieza a llenar esta lista con entradas deshabilitadas. El Configurador de Microsoft no tiene ninguna opcion para eliminar definitivamente las entradas deshabilitadas. Para eliminarlas tenemos que hacer uso de algun programa de utilidad que hay por ahí, o bien ejecutar regedit.exe y eliminar las entradas de las ramas del registro
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Shared Tools\MSConfig\startupfolder
ó
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Shared Tools\MSConfig\startupreg

 
En estas ramas están las entradas deshabilitadas con msconfig.exe
 
Tened cuidado al borrarlas, porque no se pueden recuperar. Os aconsejo hacer primero una copia del registro entero, o mejor de la rama HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Shared Tools\MSConfig entera, así si luego hay algún problema podréis recuperarla.
 


miércoles, 30 de enero de 2013

ANDROID: GUARDANDO PREFERENCIAS


La celebérrima aplicacion holamundo suele saludar al mundo anglosajón con un

Hello, world!

y al mundo hispano parlante con un

¡Hola, mundo!

Pero esa aplicación ya la genera automáticamente el entorno de desarrollo Eclipse cuando empezamos una nueva aplicación para Android.

Es un saludo muy cariñoso que, además, puede ser generalizado mediante una preferencia guardada en el directorio protegido de la aplicación, en la memoria del teléfono, de una manera muy sencilla. Tras dibujar la disposición gráfica que genera un TextView llamado rotulo en medio de la pantalla, se llama a una función  que se encargará de todo:


@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
saludarsegunpreferencias();
}


1.- Esa función, saludarsegunpreferencias(), obtiene una instancia al objeto PreferenciasCompartidas mediante la llamada:

SharedPreferences pref=PreferenceManager.getDefaultSharedPreferences(this);

2.- Usando ese objeto se puede obtener una cadena de caracteres llamando a la función getString(nombreCadena, valorPorDefecto), así:

String objetoasaludar=pref.getString("destinodelsaludo", "mundo");

3.- Así ya podemos saludar según las preferencias almacenadas o, en su defecto, usar el valorPorDefecto:


TextView rotulo=(TextView) findViewById(R.id.rotulo);
rotulo.setText("¡Hola, "+objetoasaludar+"!");


4.- Al pulsar en el menú Preferencias se debe lanzar la ejecución de la actividad que guardará las preferencias.


@Override
    public boolean onOptionsItemSelected(MenuItem item)
{
        switch (item.getItemId())
        {
        case R.id.menu_settings:
            Intent intento = new Intent(this, PreferenciasActivity.class);
                startActivityForResult(intento,0);
                break;        }
        return true;
    }

5.- La actividad que guarda las preferencias queda tan sencilla como:

public class PreferenciasActivity extends PreferenceActivity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        addPreferencesFromResource(R.xml.preferencias);
    }
}

que requiere un fichero llamado preferencias.xml en la ruta relativa del proyecto /res/xml/preferencias.xml
Este archivo contiene la especificación gráfica de las preferencias:

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" >
    <EditTextPreference android:dialogTitle="¿A QUIEN SALUDO?" android:title="¿A QUIEN SALUDO?" android:summary="Escribe a quén tiene que ir dirigido el saludo" android:key="destinodelsaludo"/>

</PreferenceScreen>

y genera ese aspecto visual común a todas las típicas pantallas de configuración de las aplicaciones de Android



OPTIMIZACIÓN NÚMERO 1:

Lo que ocurre es que, tal y como está escrito este código, al aceptar y pulsar el botón Atrás, volvemos a la actividad principal, donde sigue mostrándose el saludo antiguo. El saludo nuevo solo se muestra si cerramos y volvemos a abrir la aplicación.
Para que se repinte el saludo con las preferencias de configuración actuales, hay que añadir el siguiente código a la clase principal:


    @Override
    protected void onResume()
    {
        super.onResume();
        saludarsegunpreferencias();
    }

OPTIMIZACIÓN NÚMERO 2: (...y la más importante)

Como hemos llegado a la "aparente" ejecución correcta a base de sucesivas mejoras (bueno, en este caso, una mejora) hemos cometido el error de ejecutar dos veces el código saludarsegunpreferencias() al arrancar por primera vez la aplicación:

  1. La primera vez llamándolo desde el método onCreate
  2. La segunda vez llamándolo desde el método onResume
Así que el código siguiente es erróneo:



@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
                saludarsegunpreferencias();
}

@Override
    protected void onResume()
    {
        super.onResume();
        saludarsegunpreferencias();
    }




y debería anularse la llamada en el método onCreate, quedando correctamente así:


@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}

@Override
    protected void onResume()
    {
        super.onResume();
        saludarsegunpreferencias();
    }



viernes, 25 de enero de 2013

ANDROID: ARCHIVO_PARA_GUARDAR_ALGO


Lo confieso. Soy un novato en programar android. Me paso las horas viendo códigos escritos por otras personas que saben más que yo. Veo cosas escritas como

File miarchivo=new File(Environment.getExternalStorageDirectory()+"/micarpeta/archivo.txt");
guardartexto("hola que tal", miarchivo);

que seguro que produce un error si el móvil donde se ejecuta no tiene tarjeta de expansión de memoria.
También dará error si el móvil tiene tarjeta pero no está montada, si está montada en modo solo lectura, etc... En estos casos sería lógico usar la memoria del teléfono en lugar de la memoria de la tarjeta de expansión.

Pero, en mi opinión, el problema no es que dé errores de ejecución, el problema es que los que estamos aprendiendo android nos acostumbramos a escribirlo así, tal cual, y luego ya va dando errores por ahí.

Además, el problema se agraba cuando quieres aprender a guardar fotos de la cámara programáticamente, y entonces veo cosas escritas como

File mifoto=new File(Environment.getExternalStorageDirectory()+"/DCIM/Camera/foto.jpg");
guardarfoto(data, mifoto);

¡Qué maravilla de códigos fuente! ¡Qué didáctica! ¡Qué buen modelo de aprendizaje!
Esto produce error cuando el móvil no tiene tarjeta de expansión de memoria, por supuesto, y además cuando el modelo de móvil no guarda las fotos en /DCIM/Camera, por ej. el HTC Desire las guarda en /DCIM/100MEDIA, ya que la carpeta "Camera" no estará creada.

Total, que tienes la captura en byte[] data y no hay manera de conseguir tener un archivo mifoto que funcione en todos los teléfonos y en todas las configuraciones. 

¿acaso a nadie de Google se le ha ocurrido que lo único que necesitamos los novatos aprendices de android es un simple archivoParaGuardarAlgo? Para usarlo así:

File miarchivo=new archivoParaGuardarAlgo("/micarpeta/", "archivo.txt");
guardartexto("hola que tal", miarchivo);

File mifoto=new archivoParaGuardarAlgo("/", "foto.jpg");
guardarfoto(data, mifoto);

Mientras no aparezca esta class mágica, ahí van mis intentos:

     public static File ALMACEN()
    {
        if(Environment.getExternalStorageState()==Environment.MEDIA_MOUNTED)
        {

            //Si hay tarjeta de memoria y está montada para lectura y escritura
            return Environment.getExternalStorageDirectory();
        }
        else
        {
            //Si no hay tarjeta de memoria, devuelve la zona de almacenamiento del telefono
            return Environment.getDataDirectory();
        }
    }


     public static File ArchivoParaGuardarAlgo(String rutarelativa, String nombrearchivo)
    {
        File directorio=new File(ALMACEN()+rutarelativa);
        if(directorio.exists() && directorio.isDirectory())
        {
            File r=new File(ALMACEN()+rutarelativa+nombrearchivo);
            return r;
        }
        else
        {
            boolean rutacreadaok=directorio.mkdirs(); //crea el directorio y todos los subdirectorios que falten
            if(rutacreadaok)
            {
                File r=new File(ALMACEN()+rutarelativa+nombrearchivo);
                return r;
            }
            else
            {
                return null;
            }
        }
    }

Otro día le pongo los try/catch y lo vuelvo a publicar.
   



sábado, 2 de junio de 2012

LOS VALORES null EN ACTIONSCRIPT 3

Yo creía que a estas santas alturas de la evolución de los lenguajes de programación todo estaba ya más que trillado. La teoría de compiladores que estudiábamos en la Universidad permitía que un autómata programable pasara de un estado a otro al encontrarse con la siguiente entrada. Todo parecía indicar que el autómata tiene que estar siempre en algún estado, aunque dicho estado sea el "estado de error", que puede ser causado por un fallo en la sintaxis o en los valores autorizados de una entrada.

Hoy he descubierto que esto no es cierto para el lenguaje ActionScript 3 (AS3)

En este lenguaje, como en muchos otros, una variable puede tener un valor conocido, o bien un valor null que indica que el valor es desconocido.
Esperaba que un valor null se evaluara a falso en una asignación a una variable booleana.
Esperaba que un valor null se evaluara a falso en una expresión condicional.
Esperaba que un valor null, evaluado a falso, se pudiera comparar con otro valor constante o con otra variable, dando como resultado una falsedad.
...
Esperaba en vano, quizá confiado en los resultados de otros lenguajes como el C.
Y debo admitir que AS3 tiene razón: NO ES EVALUABLE A VERDADERO O FALSO UN VALOR NULO, NO ES ASIGNABLE UN VALOR NULO A UNA VARIABLE LOGICA, NI SE PUEDE CONOCER EL RESULTADO LOGICO DE UNA COMPARACION CON UN VALOR NULO.

Pero, por favor, LOS PROGRAMADORES NECESITAMOS QUE NULL Y SUS COMBINACIONES EN EXPRESIONES LÓGICAS SE EVALUEN A "ALGO", A LO QUE SEA, A NULL, POR EJEMPLO.

Me parece increíble que, al día de hoy, el Flash Player 11 (la última versión) y el plugin para todos* los navegadores se quede parado, sin emitir ningún mensaje de error, cuando se necesita evaluar una comparación con un valor null. No puedo creer que cosas como ésta sucedan hoy en día.

Enfin, paciencia. Ahora que ya lo sé, o mejor dicho, ahora que ya lo sabemos, podremos escribir mejores códigos.

* (he probado con las últimas versiones de Internet Explorer, Firefox y Google Chrome, y algunas otras versiones anteriores de éstos)

jueves, 19 de enero de 2012

GENERADOR DE CONTRASEÑAS SEGURAS

Por supuesto que 2000, José Antonio, Almería, Madrid, tu nombre o el nombre de tu pueblo, o una palabra que exista en el diccionario, o una palabra corta que contenga solo letras minusculas son ejemplos de contraseñas inseguras. Eso ya lo sabemos. También sabemos que es inseguro usar la misma contraseña para todos los sitios. ¿De qué servirá que Google, Facebook o algun otro de los "grandes" tengan complejos sistemas para gestionar tus contraseñas, si luego usas la misma para otro sitio web que no dedica tanto esmero en mantenerlas a salvo? Como una cadena es tan fuerte como el más débil de sus eslabones, cualquier ataque que consiguiera romper la seguridad de ese sitio web débil conseguiría dar acceso al atacante a los otros sitios más fuertes.

Pero es que en los momentos actuales tenemos que recordar tantas contraseñas que nos tienta a usar siempre la misma, o a usar la misma con leves diferencias, como JOSEANTONIOFACEBOOK, JOSEANTONIOGMAIL, JOSEANTONIOCAJAMAR, ... Al final hay tantas que se torna difícil recordarlas todas.
Usar un programa para recordarlas... va a ser que no. Es como tener una caja fuerte para guardar todas las llaves. Pasaría a ser el primer lugar que intentarían atacarnos. Máxime si resulta que el programa es de fuente abierta. ¡Encima con pistas sobre cómo está hecha la caja fuerte!. (-Es que el código fuente lo que implementa es Rijndael, que incluye dentro de sus características el ser un método de cifrado de fuente pública ¿Qué más dá que dejemos ver el código? -Pues que los códigos fuente son pistas innecesarias como las que daba el entorno de desarrollo de fuente abierta de Flex para facilitar los ataques XSS del pasado mes de diciembre. A pesar de ello sigo recomendando el software libre y el Flashdevelop como entorno de desarrollo AS3 para Flash. El agujero de seguridad ya ha sido corregido en la versión actual.)

Para mí siempre será más práctico usar las iniciales de una frase que tenga que ver con el sitio web. Por ejemplo, FaceBook es importante para mi porque me permite leer lo que publica mi hermano que está en Barcelona. La contraseña podría ser MPLLQPMHQEEB, que son las iniciales de las palabras "Me Permite Leer Lo Que Publica Mi Hermano Que Está En Barcelona". Lo podemos combinar con un par de números, por ej. el ordinal de la ultima letra de la contraseña (2 para la B de Barcelona) y el ordinal de la primera letra del sitio web, (6 para la F de Facebook). Quedaría PLLQPMHQEEB26. Le ponemos un simbolo gráfico por medio, por ejemplo un dólar $, un guión - o un porciento %, y quedaría MPLLQPMHQEEB$-%26. Esto daría la friolera de 13 trillones de años para encontrar la clave usando la capacidad de cómputo de un ordenador personal, según dicen en http://howsecureismypassword.net/ .
Incluso la simple clave MPLLQPMHQEEB llevaría 12 años para encontrarla, y con solo añadirle un guión al final, MPLLQPMHQEEB-, llevaría 117 mil años.
Es importante la longitud porque JOSE- llevaría 0.46 segundos, pero JOSEANTONIO- llevaría 2000 años.

Es obvio que ésto son solo ejemplos, válidos claro está, siempre que sea fácil recordar la frase de la que se obtienen las iniciales. Espero vuestros comentarios.

miércoles, 4 de enero de 2012

ROOTKITS Y LA LUCHA DEL BIEN CONTRA EL MAL

Un rootkit es un programa que está oculto o enmascarado en el sistema, y puede acceder a partes de éste de un modo privilegiado de modo que es difícil de detectar y más difícil aún de eliminar mientras está en ejecución.
Hasta este momento nada he dicho sobre su naturaleza o sobre su comportamiento. Este recurso puede ser empleado para bien y para mal, como las armas, internet, los libros, las palabras y tantas otras facetas cotidianas.
Por ejemplo, lo ideal es que un programa antivirus permanente funcione como un rootkit benigno:
  • oculto, que no se pueda detectar, o sea, que los programas virus no puedan detectarlo
  • enmascarado en el sistema, o sea, que el sistema siga funcionando y que el antivirus aparentemente sea como cualquier otro programa residente y activo del sistema
  • que pueda acceder a partes del sistema de modo privilegiado, es decir, que se ejecute con más privilegios que cualquier programa virus, para que pueda imponerse a éstos, pararlos, borrarlos de memoria, borrarlos de disco duro, sin tener que pedir constantemente permisos para hacer estas tareas privilegiadas.
  • que sea muy difícil de eliminar, para que los programas virus no puedan borrarlo de disco duro, parar su ejecución o borrarlo de la memoria.
En general, no obstante, se asocia un rootkit con un comportamiento maligno.

Para conseguir estar activo y en ejecución, un rootkit debe formar parte del sistema operativo como si se tratara de un servicio o módulo en ejecución del núcleo del sistema. Y claro, ésto solo se consigue arrancándose y poniéndose en ejecución con el propio sistema, es decir, arrancando con el nucleo del sistema. El núcleo es la primera parte que se carga en memoria cuando una partición formateada y activa toma el control del arranque de la máquina. Lo primero que se carga son los drivers o controladores de dispositivos, en particular el driver del disco duro. Si enmedio de alguno de esos códigos estuviera un trozo de código rootkit (infectado e insertado por algún medio vírico, troyano, gusano, etc...) este código permanecería activo y en ejecución todo el tiempo que la máquina estuviera encendida. Porque el driver del disco duro siempre está usándose. Si mientras que está activo se le intentara detectar o eliminar mediante otro programa, pongamos un antivirus, este propio antivirus tendría que usar el driver del disco duro para borrar el rootkit, pero el código del rootkit está enmedio del código del driver del disco duro, así que podría enmascararse para ser detectado, o aparentar su borrado. En efecto, el antivirus trata de ver el mundo con unas gafas pero las gafas le dejan ver todo menos lo importante: las propias gafas.

jueves, 15 de diciembre de 2011

MENTIRAS EN INTERNET - HOAX

Nos conectamos a internet, usamos nuestro navegador favorito, nuestro buscador de contenidos favorito y tecleamos lo que buscamos. Como respuesta encontramos gran cantidad de información.
Todos esperamos que dicha información sea confiable, fidedigna, clara, concisa, que no cause confusión ni sea susceptible de ser malentendida. En definitiva, que sea VERDAD.

Buscamos la verdad, la necesitamos, es una característica humana que ya nos enganchó algún filósofo de la antigüedad. Tan deseable que su omisión aparece en los escritos bíblicos como un pecado que ofende a Dios. Pero en internet lo que se publica no obedece siempre al octavo mandamiento.

Circulan mediante correo electrónico ciertos bulos y falsedades que confunden y perjudican a todo el mundo que se los cree y los redistribuye, y benefician de algún modo a quienes los crean. Son los HOAX. Todos hemos recibido alguna vez alguno, y muchos hemos recibido y recibimos habitualmente muchos.

Aquí voy a daros unas recomendaciones, tan importantes como simples, para distinguir la verdad entre tantas mentiras:
- lo primero, un hoax nunca irá firmado. Será anónimo o identificará como origen a una organización, que puede ser que exista, pero no a una persona concreta y real de dicha organización.
- lo segundo, no llevará fecha. Así parecerá válido en cualquier momento.
- lo tercero, el correo electrónico pedirá que sea a su vez reenviado masivamente. Así se espera lograr su amplia difusión. Un hoax es como un virus, pero necesita nuestra colaboración para reproducirse y duplicarse. Un poco de observación nos facilitará la desinfección simplemente porque no lo reenviaremos.
- lo cuarto, no fiarse más de una noticia porque sean varias las páginas en donde aparece. Puede que sea un bulo que está consiguiendo difusión.
- lo quinto, informarse sobre los responsables de la publicación. Si la noticia la leemos en una página web, mirad si es un periódico o revista online, o por el contrario es un foro donde cualquiera puede participar sin siquiera identificarse. 

viernes, 4 de noviembre de 2011

¿ES LO MISMO UN CERTIFICADO DIGITAL QUE UNA FIRMA DIGITAL?

Simplificando todo lo que puedo, un certificado digital contiene dos claves, una clave pública y una privada, ambas relacionadas por un algoritmo de cálculo que no permite en tiempo computacionalmente aceptable el obtener la clave privada (información confidencial y sensible) a partir de la publica (información no sensible).

La clave publica se la puedes entregar a cualquier persona (si sabes cómo hacerlo, claro, de lo contrario no lo intentes). Si esta persona escribe un mensaje y lo cifra con tu clave publica, entonces sólo tú, utilizando tu clave privada, podrás descifrarlo y leerlo en claro. Esto le asegura a tu amigo que nadie más aparte de tí va a poder leer el mensaje. Esto también te asegura a tí que nadie ha podido leer ni cambiar el mensaje que te envió tu amigo.

La clave privada no debes entregársela a nadie (eso se generaliza, obviamente, a que tu certificado digital no debes entregárselo a nadie). Si le escribes un mensaje a tu amigo y lo cifras con tu clave privada, entonces cualquier persona incluyendo tu amigo, utilizando tu clave publica, que como es publica la puede tener cualquier persona incluyendo tu amigo, puede descifrar el mensaje y leerlo. Esto le asegura a cualquier lector que has sido tú, y solo tú, quien ha escrito ese mensaje. Como esta seguridad es como la de tu firma, al proceso de cifrar tu mensaje con tu clave privada se le llama Firmar Digitalmente y se dice que tu mensaje cifrado con tu clave privada contiene tu firma digital.

Más información en http://es.wikipedia.org/wiki/Certificado_digital

jueves, 3 de noviembre de 2011

DROPBOX (DISCO DURO REMOTO, 2 GB GRATIS)

http://www.dropbox.com

Esta aplicacion te genera un disco virtual de 2 Gb al que puedes acceder desde cualquier ordenador conectado a internet. Te registras con un correo electronico y una contraseña y allí puedes guardar lo que quieras. Puedes instalar el programa en multiples ordenadores, incluso en smartphones con el sistema operativo ANDROID como el Galaxy 3, y cualquier cambio desde cualquier equipo se sincroniza en todos ellos. Recuerda que la información está físicamente guardada en el servidor y en cada equipo PC. No ocurre así con la versión para android, que solo guarda en la scard los archivos a los que accedas realmente, aunque puedes visualizar el directorio completo. Enfin, es una opción de disco duro remoto muy práctica y aconsejable.

LA NUBE CONTRA LA FILOXERA (UN CUENTO DE ANTIVIRUS)

Hay muchos que todavía usan programas antivirus. Ya es bastante seguro tener internet en tu equipo de casa a través de un router ADSL con todos los puertos de entrada cerrados. Pero aun así es conveniente pasarle el antivirus a algún programa que nos descarguemos o que nos pasen en un CD o DVD. Esta conveniencia aumenta exponencialmente cuando el programa es "gratuito". Ya me entendéis. Tanto si es freeware descargado de una web privada particular, como si es software de pago descargado junto a un crack o un serial que no caduca porque estará crackeado, estamos metiendo en nuestro sistema una potencial amenaza. Pasarle el antivirus por lo menos nos permite quedarnos tranquilos y no tener que formatear el disco duro principal cada 3 meses y reinstalarlo todo. Que deberíamos. Yo a estos programas que tienen dudosa reputación los llamo "programillas". Así que aconsejo pasarle un antivirus a los programillas, antes de instalarlos y después.
Hay quienes todavía usan la económica técnica de descargarse un antivirus crackeado o con un serial que no caduca, o que caduca en el año 2480. Que viene bien saber que mi obsoleto equipo y sistema operativo van a estar defendidos en el 2480, no como mis huesos que estarán para esa fecha ya bastante desnutridos y deshidratados. Y con ese antivirus tendrán la osadía de comprobar si un programilla de nueva adquisición está desinfectado o no. jejejeje. Un programilla testeando a otro programilla... enfin ... tiene que haber de todo en esta viña del Señor, incluso filoxera.
Afortunadamente ya existe solución. Existen antivirus gratuitos, que no son cortafuegos, que funcionan solo cuando estás conectado a internet, que no son pesados en ejecución y no frenan tu sistema, y que se ejecutan, descargan y actualizan desde la nube. Son los cloud antivirus.
Un cloud antivirus que funciona bien es el Panda Cloud, que podéis descargar de http://www.cloudantivirus.com/es/ y usar gratuitamente hasta que Panda decida convertirlo en software de pago, cosa que dudo.

AUDACITY Y LA LICENCIA GPL DE GNU ¿ES GRATIS?

Simplificando mucho, sin entrar en detalles de licencias, el software libre es siempre posible obtenerlo gratis (y también es posible obtenerlo pagando por ello). Pero eso no significa que libre sea equivalente a gratis, ni que gratis sea equivalente a libre.
En Audacity por ejemplo, podemos tener garantía de que la más avanzada de las versiones publicadas siempre será posible obtenerla gratis. Voy a intentar explicar de modo sencillo por qué esto es así, pero ya tendremos que entrar en detalles de licencias:

La licencia de Audacity es la GPL de GNU.
Esta licencia, por ser de software libre, concede los siguientes permisos:

- Libertad 0 del software libre: usar el programa, con cualquier propósito.
Cualquiera, si lo desea, puede ser usuario de la versión del programa que posea, sin importar cómo la haya obtenido (tanto si la versión que pueda usar la ha obtenido gratuitamente como si la ha programado, como si ha pagado a un programador para que se la programara), y usar el programa para lo que quiera, personalmente o para su negocio, sin restricciones de propósito.

Si la ha obtenido de una publicación, evidentemente será gratis.
Si es una versión propia, la versión original podría haber sido de una publicación, y haber sido gratis.

Si es una versión realizada por encargo, evidentemente no tiene por qué ser gratis. Pero no hay obligación de encargar versiones.

Podría darse el caso de que un programador intente vender un programa libre sin modificarle nada. Hay muchas formas de hacerlo. Pero el comprador podría haberlo obtenido gratis si hubiese accedido al lugar correcto de internet donde se podía descargar, hubiese configurado su equipo para cumplir con los requisitos de instalación y se lo hubiese instalado él mismo. En muchos casos es posible que el técnico informático cobre por grabarlo en un soporte (CD, DVD…), o por instalarlo, o por formación para el uso, … en general por cualquier servicio añadido, pero el programa en sí es gratis.

- Libertad 1 del software libre: estudiar cómo funciona el programa y modificarlo, adaptándolo a las necesidades de cada uno.
Se necesita tener acceso al código fuente del programa.

Cualquiera, si lo desea y tiene los conocimientos adecuados (es programador de C++, …), puede generar nuevas versiones mejoradas de la versión del programa que posea, sin importar cómo la haya obtenido, modificando el código fuente de cualquiera de las versiones publicadas anteriormente (evidentemente no va a poder tener acceso a las versiones no publicadas). No tiene la obligación de publicar ni de vender sus versiones mejoradas.

- Libertad 2 del software libre: distribuir copias del programa.
Cualquiera, si lo desea, puede publicar gratuitamente la versión del programa que tenga y/o su código fuente, sin importar cómo la haya obtenido.

- Libertad 3 del software libre: mejorar el programa y hacer públicas las mejoras, de modo que toda la comunidad se beneficie.
Cualquiera, si lo desea, puede ejercer la libertad 1 con el objetivo de adaptar el programa a una amplia variedad de usuarios y de publicar las versiones mejoradas.

Esta licencia, por ser GPL de GNU, tiene las siguientes restricciones, permisos y obligaciones, y matices sobre las libertades del software libre:
- Si se publica, se debe ofrecer tanto el programa como su código fuente.
Esto implica que cualquiera que adquiera el programa adquirirá también el código fuente. Y por la libertad 2 podrá, si lo desea, publicarla, de modo que los demás lo podrán obtener gratis.

Un comprador de una versión a medida no tiene la obligación de publicar lo que ha comprado. Pero si lo hace, no puede publicar sólo el programa, tiene que publicar también el código fuente.
- Si se publica, la licencia con la que se publique debe ser GPL de GNU.
Es decir, Audacity nunca podrá convertirse en software de pago, ya que siempre habrá una última versión publicada bajo la licencia GPL de GNU.

En http://audacity.sourceforge.net/about/license podemos conocer más detalles.

CÓMO SER UN BUEN MAESTRO

En mi opinión, los criterios decisivos para ser un buen maestro son:

1.- Admitir que los alumnos pueden ser más inteligentes, hábiles y creativos, y pueden tener más base de conocimientos que uno mismo, y dejarles tomar parte en su propio proceso de aprendizaje. Comportarse con humildad respecto a lo que se conoce es la mejor manera de acceder a conocer cosas nuevas. Es una actitud necesaria para un maestro y es lo primero que éste debe enseñar a sus alumnos.

2.- De ocurrir espontáneamente este proceso en el aula, dedicarse a observar, dinamizar y evaluar este proceso. De no ocurrir, diseñar acciones de formación para que ocurra.

3.- Si existieran dificultades, tratar de aportar la ayuda mínima necesaria para que los alumnos lleguen por sí mismos a la solución. Sin esfuerzo no se interioriza.

miércoles, 2 de noviembre de 2011

Breve historia de INTERNET

Simplificando mucho, Internet se creó para enviar y recibir (transmitir) datos (ficheros) desde un equipo terminal a otro. El primer servicio globalmente importante fue el FTP, empleado todavía hoy para transferir ficheros. Si quieres un fichero lo buscas y cuando sabes su dirección exacta te conectas al servidor, te identificas con usuario y contraseña y te lo descargas. Si alguien te quiere mand ...ar algo se conecta a tu servidor, se identifica con usuario y contraseña y lo sube.

Si varias personas quieren mandarte varias cosas ya empieza a parecer un poco cargante gestionar lo que sube cada uno en una carpeta distinta del servidor, etc… Por eso se creó el segundo servicio globalmente importante, el POP/SMTP, que se emplea para transmitir correos electrónicos.
El servidor de correo se encarga de separar y clasificar lo que te llega, sea quien sea quien te lo mande y sean los archivos que sean (texto, adjuntos,…). Es mucho más cómodo que el FTP.
Si toda la información generada por toda la humanidad, susceptible de interesar a alguien, se almacenara en cada buzón de correo (o servidor de ftp) de cada uno, multiplicaríamos innecesariamente las copias de información que necesitarían ser guardadas. Los inicios de la web tuvieron sentido cuando fue necesario distribuir la información entre un gran número de personas de modo que el origen de la información pudiera cambiar sin necesidad de proceder a enviar la actualización a todos los interesados en recibirla.
Así surgió la web 1.0, un conjunto de páginas web que solo son informativas, como un cartel.
Los autores de una web, autores de la información que quieren publicar, solo tienen que subirla a un servidor web. Estas páginas están preestablecidas, estáticas, guardadas como archivos. Los servidores web 1.0 solo tienen que enviar estas páginas cuando se las soliciten, normalmente a través de un programa navegador. Quien las recibe las lee y normalmente las descarta, con lo que no se duplica la información guardada. El problema del envío masivo de correo había terminado y empezó a considerarse basura (spam).


Después los servidores evolucionaron y empezaron a poder enviar páginas de formulario y recibir los datos rellenados, a la vuelta. Como consecuencia de la recepción de datos, las siguientes páginas se pueden construir dinámicamente utilizando los datos que previamente llegaron. Pensemos por ejemplo cómo funciona un buscador como Google: recibe una cadena de búsqueda y te envía una página especial, construida dinámicamente, con la lista de páginas relacionadas con tu cadena de búsqueda. Esa página que te envía no estaba preestablecida ni era estática. ¿Cómo podría google saber de antemano que alguien iba a buscar una cadena de texto determinada?. Tiene que construirla dinámicamente antes de enviarla. Esta evolución marca el inicio de la interacción con la web. Las páginas ya no son estáticas, son dinámicas. La web 2.0 en su versión beta estaba surgiendo.
La Web 2.0 es el resultado de la evolución de aquellos primeros sencillos formularios para dar lugar a aplicaciones web completas.