19 de marzo de 2011

[PHP] Arrays pasados por parámetro ¿copias o referencias? (2/2)

conjuntoEntradas() {
  [PHP] Arrays pasados por parámetro ¿copias o referencias? (1/2)
  [PHP] Arrays pasados por parámetro ¿copias o referencias? (2/2)
}


El rendimiento

Hasta aquí podía apaliar una de mis inquietudes, que era el nivel de integridad de los atributos de un objeto para cada una de las maneras de tratar los parámetros de los métodos y su asignación a estos, pero todavía me quedaba otra pendiente, que era saber el rendimiento de cada una de estas formas.

Ya se que en el rendimiento de una aplicación están involucrados muchos factores y cuando tu escribes un código, el orden de ejecución de las instrucciones puede ser alterado por el compilador con el objetivo de optimizar el código para una ejecución más eficiente, no obstante siempre que programa y me encuentro delante de los ojos que el orden de ciertas instrucciones podría ser cambiado, a priori por una más optima, si no me aleja enormemente de lo que estoy haciendo, hago el refactoring, o sino me lo marco con @todo; ya sé que ha veces esto puede ser un poco de maniático o de paranoico, pero es algo intrínseco en mi personalidad junto con la concepción de que las pequeñas cosas forman el todo, por lo que si ese pequeño cambio puede llegar a optimizar una mil millonésima parte de la ejecución, lo aplico de todas formas, siempre pienso “mejor eso que nada”.

Bueno dejando de lado mis paranoias, os dejo la modificación del código de la prueba anterior de manera que me permitiera analizar la carga de ejecución de cada manera de pasar parámetros y de asignación de estos atributos.

class A {
    private $arrValor;
    private $arrValorToRef;
    private $arrReferencia;
    private $arrRefToRef;
    

    public function setArrayByValue(array $setArr) {
        $this->arrValor = $setArr;            
    }

    public function setArrayByValueToRef(array $setArr) {
        $this->arrValorToRef = &$setArr;            
    }

    public function setArrayByRef(array &$setArr) {
        $this->arrReferencia = $setArr;
    }

    public function setArrayByRefToRef(array &$setArr) {
        $this->arrRefToRef = &$setArr;        
    }

}


$numIt = 1000000;
$arr = array('key0' => 'value0');
$objA = new A();

for ($it = 0; $it < $numIt; $it++) {
    $objA->setArrayByValue($arr);
    $objA->setArrayByValueToRef($arr);
    $objA->setArrayByRef($arr); 
    $objA->setArrayByRefToRef($arr);
}

La modificación del script de prueba está clara, solo he dejé en los métodos de las clases declarada la asignación del parámetro al atributo, que es lo que quería comparar a nivel de coste de ejecución, y en la ejecución del script iterar unas cuantas vueltas dentro de un bucle la llamada a los cuatro métodos.

Para saber el coste de ejecución lo que hice es ejecutar el script en un profiler, concretamente el de xdebug; hice dos pruebas, una con 1.000.000 iteraciones y otra con 3.000.000 de iteraciones; ¿porqué tantas? para que el profiler pudiese medir con mayor precisión la diferencia entre cada llamada y ¿porqué dos veces?, para ver si los valores se obtenidos daban valores diferenciales similares entre las llamadas de los distintos métodos.

El resultado que obtuve fue el siguiente:

 Gráfico de llamadas a los métodos con 1.000.000 de iteraciones


Tabla de porcentaje de tiempo de carga sobre el total de llamada a los métodos con 1.000.000 de iteraciones

Gráfico de llamadas a los métodos con 3.000.000 de iteraciones

Tabla de porcentaje de tiempo de carga sobre el total de llamada a los métodos con 3.000.000 de iteraciones

Después de los resultados obtenidos a partir de los ficheros generados por el profiler con la ejecución del script, y haber sacada los gráficos y las tablas anteriores de cada ejecución con el visor kcachegrind, me decidí a poner los valores en un hoja de cálculo para poder analizar de manera más cómoda los resultados.

 Valores de los resultados, medias y diferencias entre ellos

Como podemos observar, y era de esperar, el método más eficiente es pasar el parámetro por referencia y asignar la referencia al atributo, ya que no se hace ninguna copia del array pasado por parámetro. Lo más curioso es que el siguiente más eficiente es el método que se pasa el parámetro por valor y se asigna por valor (setArrayByValue), estando por delante de los otros dos, yo, si no hubiese hecho esta prueba, hubiese intuido que éste sería el menos eficiente, ya que debería estar haciendo dos copias del array, una cuando lo pasa por parámetro y la otra cuando lo asigna a la variable, mientras que los otros dos deberían tener costes similares ya que hacen una copia del array.

Conclusiones

Después de lo visto tengo claro que para mantener la integridad y el encapsulamiento de los atributos de una clase en PHP, tengo que pasarlo por parámetro y asignarlos por parámetro, ya que si todo son referencias (parámetro y asignación al atributo), como ya suponía, los valores pueden ser modificados desde fuera; además después, de lo observado, también tengo claro que de nada sirve pasar el parámetro o asignarlo al atributo por referencia, ya que no introduce optimización ninguna, es más, el rendimiento disminuye, ya que la ejecución es más costosa.
Además de todo esto, me puedo despreocupar de que ciertas referencias queden apuntando espacios de memoria liberados, ya que el interprete garantiza la destrucción de los espacios de memoria, solo cuando no haya ninguna variable que pueda referenciar a éste.


Hasta la próxima enfermos.

12 de marzo de 2011

[PHP] Arrays pasados por parámetro ¿copias o referencias? (1/2)

conjuntoEntradas() {
  [PHP] Arrays pasados por parámetro ¿copias o referencias? (1/2)
  [PHP] Arrays pasados por parámetro ¿copias o referencias? (2/2)
}


Introducción

Realizando mis jugueteos con la programación en PHP, una de las cosas que necesitaba hacer era pasar arrays a objetos de clases creadas por mi mismo; en algunas de estas clases he considerado oportuno mantener los valores que se pasan por parámetro a través de un array en uno de los atributos de la clase debido a que me pueden ser necesarios para realizar operaciones futuras con o sobre esos valores.

Hasta aquí nada nuevo, ya que es una práctica muy utilizada; pero a mí, que no soy, para nada, un “ninja” del PHP, me hizo pensar que realmente sucedía al pasar un array por parámetro de las distintas maneras que permite el lenguaje, valor o referencia y la manera de asignarlo a un atributo, valor o referencia. Por mis conocimientos, sabía los distintos comportamientos que podían suceder pero, al no estar seguro de cual sería el que se aplicaría en PHP, y si teniendo lo muy claro en otros lenguajes donde tu puedes controlar las posiciones de memoria con referencias y, con mayor control, con punteros, como es el caso de C y su hermano C++.

Como después de buscar y revisar un poco la documentación y algunos enlaces de cuatro búsquedas por Internet no me continuaba sin quedar del todo claro, decidí hacer un script PHP muy simple que me permitiera observar el comportamiento del lenguaje antes esta común situación.
La pequeña prueba
El script que cree, hace lo siguiente:
  1. Declara una clase con:
    • Tres atributos; uno para almacenar el parámetro que se pasará a a cada uno de los tres métodos declarados.
    • Tres métodos, cada uno recibe un array por parámetro, pero uno lo recibe por valor y los otros dos por referencia; la diferencia entre los dos métodos que reciben el array por referencia está en su interior, además de que cada uno asigna el array a un atributo distinto, uno lo asigna el valor y otro asigna la referencia.
      Cada método, además de asignar el array a un atributo, realiza una modificación (añade un nuevo valor) en el array pasado por parámetro.
    class A {
        private $arrValor;
        private $arrValorToRef;
        private $arrReferencia;
        private $arrRefToRef;
        
    
        public function setArrayByValue(array $setArr) {
            $this->arrValor = $setArr;
            $setArr['keyMarkClassAValue'] = 'valueMarkClassA';
            $this->arrValor['keyClassA'] = 'valueClassA';
        }
    
        public function setArrayByValueToRef(array $setArr) {
            $this->arrValorToRef = &$setArr;
            $setArr['keyMarkClassAValueToRef'] = 'valueMarkClassA';
            $this->arrValor['keyClassA'] = 'valueToRefClassA';
        }
    
        public function setArrayByRef(array &$setArr) {
            $this->arrReferencia = $setArr;
            $setArr['keyMarkClassARef'] = 'refMarkClassA';
            $this->arrReferencia['keyClassA'] = 'refClassA';
        }
    
        public function setArrayByRefToRef(array &$setArr) {
            $this->arrRefToRef = &$setArr;
            $setArr['keyMarkClassARefToRef'] = 'refToRefMarkClassA';
            $this->arrRefToRef['keyClassA'] = 'refToRefClassA';
        }
    
    }
    
  2. Declara una array con un valor en su interior, el que se utilizará para pasarlo a los tres métodos de un objeto, de la clase declarada, creado.
    $arr = array('key0' => 'value0');
    
  3. Se van realizando dumpeos del array utilizado como parámetro y del objeto a medida que se van ejecutando los métodos para observar comportamiento.
    print "Contenido del array \$arr antes de asignarlo a la clase: \n";
    var_dump($arr);
    print "\n";
    
    $objA = new A();
    $objA->setArrayByValue($arr);
    
    print "Contenido del array \$arr despues de asignarlo a la clase por valor: \n";
    var_dump($arr);
    print "\n";
    
    $objA->setArrayByRef($arr);
    
    print "Contenido del array \$arr despues de asignarlo a la clase por referencia: \n";
    var_dump($arr);
    print "\n";
    
    $objA->setArrayByValueToRef($arr);
    $objA->setArrayByRefToRef($arr);
    
    print "Contenido del object de A despues de asignarle el array (valor y referencias): \n";
    var_dump($objA);
    print "\n";
    
    $arr['newKey'] = 'newValue';
    
    print "Contenido del object de A despues de ejecutar \$arr['newKey'] => 'newValue': \n";
    var_dump($objA);
    print "\n";
    
    unset($arr);
    
    print "Contenido del object de A despues de ejecutar un unset() del array: \n";
    var_dump($objA);
    print "\n";
    

El encapsulamiento

Con la salida que genera el script podemos llegar a ciertas conclusiones sobre lo que sucede con la asignación del array pasado por parámetro a los atributos del objeto, con las distintas maneras que se permiten, y ver si realmente el atributo del objeto mantiene una referencia a esa posición de memoria o copia el valor, desde el punto de vista de utilización habitual del lenguaje, es decir sin buscar saltarnos lo establecido, ya que al referirme que se puede estar copiando el valor del array a otra posición de memoria, me refiero a la percepción que se tiene como desarrollador, dejando de lado el funcionamiento interno del interprete, ya que este podría estar optimizando el rendimiento de la ejecución demorando la copia de los valores a una nueva posición de memoria hasta el momento antes de que alguno de los valores de la variable sufra una modificación, garantizando e esta manera la integridad de los valores de cada variable.

El resultado obtenido es el siguiente:
  1. Parámetro por valor y asignación por valor. Variable pasada por parámetro y atributo utilizan su propio espacio de memoria.
  2. Parámetro por valor y asignación por referencia. Variable pasada por parámetro es copiada a un nuevo espacio de memoria ya que cuando se asigna por referencia al atributo (su dirección de memoria), los cambios en los datos de cada variable son independientes.
  3. Parámetro por referencia y asignación por valor. Variable pasada por parámetro, supuestamente no es copiada, ya que se está pasando por referencia, pero al asignarla al atributo es cuando se realiza una copia de los datos de esta variable a nuevo espacio de memoria que será donde apuntará el atributo al que se está asignando.
  4. Parámetro pasado por referencia y asignación por referencia. No hay copias de los datos a nuevos espacios de memoria por lo que, tanto la variable pasada por parámetro como el atributo apuntan al mismo espacio de memoria.

Con las cuatro pruebas anteriores se puede deducir que las referencias en PHP son tratadas como en otro lenguaje, como C/C++ (donde el control de la memoria depende totalmente del desarrollador), pero con algo menos de liberta, ya que el lenguaje controla el número de variables que apuntan al mismo espacio de memoria y bajo la existencia de una sola, se imposibilita su liberación impidiendo que una variable haga referencia a un espacio de memoria destruido (caso b), además de también imposibilitar la liberación solicitada explícitamente (unset).

Esto ya me permitía saber que sucedía, en PHP, con los arrays, cuando son utilizados como parámetro en una función/método y en las asignaciones a nuevas variables, pudiendo decidir como hacerlo, si por valor o por referencia, en función de lo que realmente quiero hacer con ellos.
Este tipo de dudas siempre se me plantean con los lenguajes, donde el control de la memoria se hace automáticamente mediante un garbage collector, ya que en algunos, como Java, que aunque no existe el concepto de referencia y valor, si que existen los immutable objects en el mismo JDK, provocando un comportamiento distinto, en objetos de ciertas clases, delante de estos casos.

Hasta la próxima enfermos.

19 de febrero de 2011

Multilingüismo intrínseco


Desde que aprendí a programar, siempre me han interesado conocer distintos lenguajes de programación.
Aunque el conocimiento de distintos lenguajes me interesa, también me interesan muchas otras cosas, es que soy un poco todo terreno, así que no dedico todo mi tiempo libre al aprendizaje de estos, más bien los aprendo cuando tengo una necesidad ya sea de interés propio o bajo encargo.

Recuerdo cuando aprendí a programar, no hace tanto tiempo, fue durante mi primer año de universidad, ya que yo no soy de los que en mi casa hubo un ordenador desde los inicios, porque no había una cultura tecnológica, y aunque si que es cierto que tuve un ordenador unos años antes de empezar en la universidad, solo mantuve unos pequeños contactos con la programación, pero nada serio, así que para mí, mis inicios fueron durante el primer curso universitario.

Yo soy de esos a los que le enseñaron a programar en PASCAL; aunque cuando yo empecé a estudiar en la universidad el lenguaje ya estaba un poco “desfasado”, aunque ahora he descubierto que parece que no tanto, y muchos nos preguntábamos porque cojones nos enseñaban a programar con este lenguaje, he de reconocer que después de terminar el trimestre y empezar el segundo trimestre con C, agradecí que me hubiesen enseñados las bases de la programación (imperativa) con este, ya que la sintaxis es muy parecida a pseudo código, y eso te permitía aislarte de la sintaxis del lenguaje y centrarte en lo que realmente había que aprender, que era la lógica de programar, es decir la elaboración del algoritmo que debía cumplir que a partir de unas precondiones se obtuvieran las postcondiciones.

Después de todo esto y de haber saltado de lenguaje en lenguaje (no han sido tantos como pueda parecer la expresión) te das cuenta que, si no tenemos en cuenta un cambio de paradigma, todo es más de lo mismo:
  1. Aprender la sintaxis a medida que escribes las primeras linea de código, consultando código ya escrito para las instrucciones más utilizadas y la documentación para las instrucciones que se usan menos.
  2. Aprender la API básica de las estructuras de datos y funciones compuestas ya implementadas que se ofrece con el propio lenguaje, para ver que podemos hacer en una sola llamada y no tener que estar consultando la documentación en todo momento.

Está claro que ese aprendizaje requiere un tiempo, y que dependiendo del lenguaje y de los lenguajes que ya conoces, por similitudes de sintaxis que se dan entre ciertos lenguajes, la curva de aprendizaje será más o menos pronunciada; no obstante es solo dedicar un poco de tiempo, sin mucha más complejidad, estás últimas vienen más de la mano del objetivo a acometer, es decir de la funcionalidad de lo que quieres desarrollar.

No obstante, cuando ya conoces un lenguaje y saltas a la aventura de uno nuevo, a mí se me plantean ciertas incógnitas que o bien las resuelvo con la documentación o buscando un poco en Internet o si no lo encuentro o veo que me va a costar más encontrar la respuesta que hacer una pequeña prueba, paso a elaborar, yo mismo, dicha prueba.
Este tipo de incógnitas suelen ser aspectos simples, como ya hace mucho tiempo se me planteo que pasaba con los parámetros pasados a un método en JAVA, si se pasaban por referencia o en copia, ya que no es algo que tu puedas indicar como en otro lenguajes, como sería C++; a mí estas cosas me inquieta no saberlas porque en este caso concreto si se pasa de una manera o de otra me determina si el estado de los objetos que se están pasando pueden cambiar o no, y si es por referencia, como es el caso de JAVA, si ese código es de un tercero y no lo tienes accesible, te tienes que fiar, a priori, de lo que se diga en la documentación, eso si existe.

Alguien se puede preguntar a que viene todo esto, pues el post es una introducción para unos cuantos posts que iré escribiendo sobre ciertas incógnitas del lenguaje de programación (PHP) que estoy utilizando para el desarrollo de un “proyecto” personal que hace tiempo que tenía en mente, y a raíz de haberme metido a desarrollarlo (aunque en con este lenguaje ya lo había utilizado en una versión anterior a la actual y no de manera muy amplia) me he topado con incógnitas en la ejecución de ciertas instrucciones, algunas resueltas con la documentación y otras a base de hacer alguna pequeñas pruebas, que son las que quiero publicar en siguientes posts.


Hasta la próxima enfermos.

29 de enero de 2011

Borrados suaves


Después de haber dado con la característica de "borrados suaves" (Soft Deletions) de las BBDD de Lotus Notes, me puse a mirar a lo largo de los días, entre los pocos minutos de "relax" que quedan entre las constantes intervenciones, a mirar y probar un poquito el funcionamiento de esta característica, ya que parece que se puede usar de manera intrínseca en las BBDD de Lotus Notes de la versión 8.5.
El objetivo del que partía en dedicarle esos poco minutos era el de valorar el coste (en horas de trabajo), de ponerla a funcionar, que nos requeriría dotar a las prehistóricas BBDD que pululan por la empresa.
Mis intuiciones, parecieron estar por el buen camino, cuando descubrí esta Technote. Una vez que la leí, todo parecía indicar de podríamos hacer que las prehistóricas BBDD pudiesen “borrar suavemente”, sin a penas la necesidad de tener que modificar su implementación.
Visto esto, antes de empezar a modificar la “genética de los dinosaurios”, quise hacer un test sobre una simple nueva BBDD; así que a continuación dejo el simple test que realicé.

  1. Creé una nueva simple BBDD utilizando una de las plantillas que vienen con la instalación del cliente Lotus Notes (Microsoft Office Library).

    Dialogo de creación de una nueva BBDD de Lotus Notes

    No obstante antes de aceptar la creación, me puse a revisar las opciones avanzadas.

    Dialogo de creación de una nueva BBDD de Lotus Notes

    Como se puede observar en la imagen anterior, es posible activar, en su creación, el “borrado suave” y el tiempo en el que será posible recuperar los documentos eliminados, es decir que estarán en la “papelera”, antes de ser eliminados por completo.

  2. Con la BBDD creada, metí algo de información para empezar a hacer las pruebas.

    La BBDD con la información de de test que he metido

  3. Sin haber activado el "Soft Deletions", eliminé un documento (con los nombres tan explícitos que les puese a cada una de la entrada de datos ya podeis ver quien era el candidato).

  4. Activé el "Soft Deletions", y repetí la operación del paso 3, esta vez con otro documento (como el anteior documento borrado, se puede intuir de cual se trata).

  5. Lo siguente fué realizar la modificación en el diseño de la BBDD que indica la Technote.

    Abrí la BBDD con el designer (cliente de Lotus Notes para desarrollar nuevas aplicaciones Lotus) y cree la vista, del tipo indicado, que va a permitir visualizar los documentos eliminados “suavemente” y cuyo periodo de cuarentena no ha vencido, es decir que no haya caducado y por lo tanto no se ha eliminado definitivamente.

    Dialogo de creación de una nueva vista

    Árbol de recursos de la BBDD con la nueva vista creada (Basura)

  6. Guardé los cambios en el diseño dela BBDD y cerré el designer.

  7. Abrí de nuevo la BBDD en el cliente de Notes, viendo que aparecía la vista creada anteriormente, que había denominado Basura.
    Pinché en la vista y en ella, pude visualizar el documento que había borrado, después de haber activado el “Soft Deletions”, por otra parte y esperando que así pasara, el documento que había eliminado antes activarlo no aparecía en lugar alguno.

  8. Para rematar el test también probé de eliminar, ahora que el “Soft Deletions” estaba activado y la vista estaba creada, el documento que había creado para ser eliminado bajo esta situación y como era de esperar, el documento se había eliminado pero era visible a través de la vista “Basura”.

  9. Por último también comprobé, como también era de esperar, que pasado el periodo de vencimiento del borrado, es decir el tiempo que se había indicado que permanecerían los documentos eliminados antes de su destrucción permanente, los documentos habían desaparecido de la vista “Basura”.


Hasta la próxima enfermos.

22 de enero de 2011

La vista de Timofone


Hace un mes atrás llamó por teléfono a casa mis padres un individuo dándose a conocer como un empleado de la compañía Vodadone; hasta aquí todo normal ya que el servicio de conexión a Internet esta contratada a esta compañía.

El personaje mencionado preguntó por el Sr. Fraixedes, es decir en un principio por mí porque la línea esta contratada a mi nombre. Mi madre, que fue quien atendió esa llamada, le sorprendió que al preguntar por a quien se refería con el Sr. Fraixedes, es decir por el nombre para diferenciar entre mi padre o o yo, el tipo divagó, hasta que mi madre le soltó el nombre de mi padre, y entonces asintió; luego le soltó un rollo de que tenía que venir a cambiar el router porque habían cambiado la tecnología de conexión ahora que la compañía Tele2 había sido absorbida por Vodadone.

Para aclarar el lió de compañías que habré montado diciendo que el servicio que hay contratado pertenece a Vodadone pero luego he indicado que el personaje hizo un comentario de un cambio desde la compañía a Tele2 (creo que el nombre real era Comunitel), os informo que hará un par o más de años el grupo Vodadone adquirió la compañía Tele2, y como es habitual, pasó a ser el propietario de los servicios, cartera de clientes, etc. Es decir que yo inicialmente contraté el servicio a Tele2 y después de unos años el servicio pasó a pertenecer a Vodadone.
Hecho la aclaración continuó con la historia del personaje mencionado.

Mi madre, aunque el se refirió a mi padre, ignoro este matiz, y concreto la vista para una hora para la que pensaba que estaría en casa.

Al llegar a casa ese día mi madre me explicó la historia, y como ya os imagináis, le indiqué que todo esto me parecía muy extraño:
  1. ¿como puñetas el tío conocía el nombre de mi padre, ya que lo asintió?
  2. ¿me van a cambiar el router gratis?
Comentándole que esto me olía a timo, y ella me comentó que también le pareció todo un poco raro.

Dejando el juego de las intuiciones, y viendo que no tenía disponibilidad para verme a esa hora con tal individuo, me propuse llamar al servicio de atención al cliente para indicar que no iba a estar y que no pasaran, siendo un posible timador o no y basándome en la presunción de inocencia, doy por supuesto que no lo es, así que lo correcto es avisar de la anulación de la vista; la llamada no fue muy fructífera, ya que según indicó el operado no había contacto entre ellos y las visitas de los técnicos.
Mala suerte, el tío tendrá que venir y volverse, porque aunque alguien pudiese estar en esa hora, nadie va a tocar el router sin estar yo presente, dando le la posibilidad de dejarlo y yo mismo ya me encargaré de cambiarlo.

El momento llegó, y el tío se presentó, indicándole que se pasará a otra hora, que yo informé que si que podía atenderle, así que se marchó.

En la siguiente hora acordada, se volvió a presentar, así que le atendí. Dejándole en la puerta en un primer momento y echándome un rollo de que iban a cambiar el router y que si le podía meter en casa para ver el router, le dejé pasar para verlo.
Visto este me dijo que todo esto venía por las absorción de Tele2 y para tal cambio había que firmar un nuevo contrato, “¿nos podemos poner en una mesa y te lo explico todo?”
Nos sentamos en la mesa y me saca las 4 hojas de papel que tenía la formalización de dicho cambio, tres copias de un formulario y una hoja de letra pequeña, es decir las clausulas de contrato. Después de sacar esto me empieza a soltar el rollo de que me va dar el router con módem 3G integrado y con no se cuantos minutos de llamadas a móviles gratis y no sé que más (más información en www.vodafone.es) y sin tocarte la permanencia (algo que ya no tengo de hace mucho tiempo).

  • Yo – Yo no firmo nada sin leermelo
  • Sr. Timofone- No te preocupes que te lo explico rápido. También necesitaré una fotocopia del DNI y de la página inicial de libreta la cuenta bancaria
  • Yo – No tengo ni fotocopia del DNI, ni tengo libreta de la cuenta, utilizo la entidad X que solo opera on-line
  • Sr. Timofone – No te preocupes, me puedes enviar la copia del DNI y de los datos de la cuenta por e-mail y si no sabes, nos metemos ahora mismo y yo mismo te índico como sacar una copia de la información que necesito
  • Yo – Ya te lo envío yo si hace falta
  • Sr. Timofone – Haber … tu nombre es …. Todo lo otro ya lo lleno yo, tu firma aquí.
  • Yo – Ya te he dicho que no firmo nada sin leermelo, ya me he llevado algún que otro palo por imbécil, y como comprenderás toda esa hoja llena de letra pequeña no me la voy a leer ahora, si quiere me la dejas y si todo es correcto, te llamaré y pasas recogerla, ¿y lo de respetar la permanencia, donde aparece?
  • Sr. Timofone – No lo pone pero es así, (sacando una hoja con una lista de nombre y días y horas) y sobre lo de dejarte el contrato no puede ser, yo tengo una agenda muy apretada y como puedes ver he podido pasar a esta nueva hora porque justo tenía un hueco; tendías que firmarlo ahora porque sino te van a cortar la conexión y luego te vas a quedar sin Internet varios días.
  • Yo – No te preocupes, tu déjamelo, si me quedo sin conexión ya me aguantaré y denunciaré a quien toque, y si tu no puedes pasar, si estoy de acuerdo con el contrato, yo mismo me iré a un punto de servicio Vodadone y allí mismo formalizaré la situación.
  • Sr. Timofone – No puedo dejartelo, solo puedes firmarlo ahora y que yo me lo lleve, si quieres puedes ir tu mismo a un punto de servicio Vodadone y allí te lo darán, pero conmigo te ahorras todo ese tiempo.
  • Yo – No te preocupes tampoco por eso, prefiero leerlo.
  • Sr. Timofone - Bueno hazlo así, entonces yo no cobro la comisión pero no pasa nada. Bueno entonces me voy, adiós.
  • Yo – Adiós.

Dicho esto y viendo claramente que se trataba de un timo, porque como una empresa no te va a querer dejar la copia de un contrato que tienes que firmar, si es un documento que no contienen nada más que clausulas, no hay nada confidencia ni que comprometa a la compañía; claramente el tío no quiere dejar nada para no quedar comprometido con el timo, “te van a cortar la conexión y tienes que firmar el nuevo contrato para hacer el cambio del servicio con la nueva tarifa”, además de que seguramente no es Vodadone, es uno de los múltiples distribuidores, que van con la etiqueta de esta, como hacen todas las otras operadores de comunicaciones, esto último no es que le vaya a penalizar, a mi me molesta, prefiero que me digan “soy Z y somos distribuidores autorizados de Vodadone” antes que decir que son Vodadone.

Para asegurar el tiro y con el objeto de denunciar el timo puesto en práctica, contacté con el servicio de atención al cliente, sin mucho éxito; el operador que me atendió me comunicó que es una practica muy extendida y que el cliente no está obligado a cambiar, puede seguir manteniendo el plan de precios de Tele2, no obstante por tu voluntad puedes optar al cambio.

Después de todo esto, me doy el lujo de especular, si esta práctica es potenciada por la propia compañía como una táctica para migrar los antiguos contratos a los nuevos sin obligar al cliente, ya que si no es así, si saben que se realizan este tipo de prácticas, ¿porqué no envían un comunicado informando de esto?, no será por ahorrar gastos en papel, ya que con cada factura me envían un folleto de una o varias hojas a todo color y papel satinado con publicidad de servicios, tarifas, ofertas, etc.


Hasta la próxima enfermos.

14 de enero de 2011

Sin papelera de reciclaje en el buzón de correo de Notes


En el post que comentaba la historia del regreso de los buzones de correo electrónico, de ciertos empleados de la empresa donde trabajo, al "Bing Bang", comenté que escribiría alguna entrada sobre aspectos del funcionamiento de Lotus Notes que desconocía y que me sorprendieron.
Una de esos posts fue Autenticación de Lotus Notes Server y otra de las que tenía pendiente es esta.

Después de recrear los buzones de correo de los empleados que lo perdieron, me avisaron de que cuando eliminaban correos, se eliminaban de manera permanente, es decir que no iban a la típica "papelera de reciclaje".
Observando el comportamiento que me habían indicado, observé que en la barra de herramientas del buzón de correo no aparecía el típico icono de una papelera y en vez de él aparecía una X.

Barra de herramientas del buzón de correo con el icono en X para la acción de eliminación

A raíz, de esto, lo primero que se me ocurrió mirar es en las preferencias de la aplicación haber si se tenía que activar algo para que la funcionalidad de reciclaje estuviese activa, aunque eso tenía que ser extraño ya que no se había hecho ninguna intervención en las aplicaciones clientes (por ejemplo una resinstalación), por lo que no tenía mucho sentido que la configuración se hubiese alterado; no obstante, lo hice (cosas más raras he visto), sin llegar a obtener mucho éxito.
Lo de revisar la configuración de la aplicación cliente, es lo más habitual, cualquier aplicación con las que tratamos, cambiamos su comportamiento a través de algún menú de preferencias ( análogamente opciones), pero como el cliente de Notes no solo es una aplicación de cliente de correo, sino es más bien una aplicación cliente de acceso aplicaciones de Lotus, es normal que las preferencias que dependen exclusivamente de una aplicación en concreto no aparezcan dentro de la configuración de las preferencias de la aplicación cliente, sino en las preferencias de la configuración de la aplicación de Lotus. Dicho esto me puse a revisar las preferencias de laaplicación de Lotus, en este caso un buzón de correo, sin tampoco obtener mucho éxito.

Menú de acceso a las preferencias de aplicación de Lotus de correo

Lo siguiente que se me ocurría era que al crear los nuevos buzones, la hubiera cagado no seleccionando la plantilla correcta. Para los que no estén en la onda de Lotus Notes, yo solo lo estoy un poco, a mí entender las aplicaciones Lotus Notes se componen de un formato único de fichero (extensión nsf) que almacena en su interior todo lo relacionado a a la aplicación (vistas, formularios, procedimientos, etc.), parte que se llama, o yo le llamo plantilla, y los datos de la aplicación; es decir que en este caso, estoy hablando de una aplicación que tiene una plantilla de buzón de correo y como datos va a tener correos electrónicos, entradas de agenda, etc.
Revisé que la plantilla que se estaba aplicando fuera la correcta, y que fuera la última versión, ya que la plantilla que se utiliza en la empresa es una modificación de la plantilla estándar de Lotus Notes, para permitir exportar los e-mails al servidor de ficheros; todo era correcto. Luego pasé a preguntarle a mi compañero, que se encarga de programar las modificaciones de las plantillas, si dicho comportamiento podía tener que ver con las modificaciones que el hace en la plantilla, pero su respuesta fue que no, a no ser que hubiese modificado algo sin darse cuenta, algo que descartaba porque la plantilla que yo había aplicado era la misma que estaba aplicada a los buzones de correo que no se perdieron, y el borrado de datos en estos últimos se comportaba de manera habitual, es decir enviándolos a la papelera.
Ya empezaba a estar un poco hasta los hue... del tema; intenté utilizar el Sr. Google, haber si él podía resolvernos el problema, pero era complicado como formularle las preguntas correctas, porque no encontré nada de interés.
Dándole vueltas a la cabeza y repasando que no me hubiese dejado nada importante en la creación de los nuevos buzones, se me ocurrió que no había mirado en las propiedades de una aplicación de Lotus, así que me puse a ello; entonces descubrí que había una propiedad que se llamaba "Soft Deletions" y que estaba deshabilitada, así que por el nombre (“borrados suaves”) se puede intuir que tienes que ver con la salvaguarda de los borrados de datos, así que la activé.

 Acceso a las propiedades de una aplicación de Lotus
 Dialogo de Propiedades de una aplicación de Lotus (Pestaña avanzado)
Una vez activada y después de cerrar y abrir la aplicación, el icono de la X se había cambiado por una papelera y cuando borrabas correos estos se iban a la "papelera de reciclaje".

Barra de herramientas del buzón de correo con el icono de la papelera para la acción de eliminación

Además dentro de las preferencias de la aplicación de correo habían aparecido nuevas opciones de configuración sobre el eliminado, una de estas la misma que la que se podía indicar en las propiedades, la de el tiempo límite de permanencia de los datos eliminados.

Dialogo de preferencias de aplicación de Lotus de correo con la opción “Soft Deletions” deshabilitada
Dialogo de preferencias de aplicación de Lotus de correo con la opción “Soft Deletions” habilitada

En resumen, la opción de “Soft Deletions” es una propiedad de cualquier aplicación de Lotus, por lo que se debería poder hacer uso de esta característica en cualquiera de ellas.


Hasta la próxima enfermos.

12 de enero de 2011

Más de un mes en silencio


Ahora mirando la fecha del último post, me mosquea, ver que ha pasado más de un mes desde que lo publiqué.
La verdad, es que no he estado inactivo todo este tiempo, casi más bien lo contrario, he estado metido en un proyecto personal, no sé si más bien podríamos decir paja mental, que ya hace bastante tiempo que lo tengo metido en mi cabeza y que una vez empecé pero no lo continué por mucho tiempo; ahora he querido continuar con él, pero después de tanto tiempo, se puede decir que he tenido que volver a documentarme y testear gran parte del framework que quiero utilizar en su implementación para poder ver las capacidades que tiene y conocerlo, si no profundamente, más profundamente que la visión superficial que te puedes llevar realizando el típico manual Quick Start. 
Como este post no es para explicar nada sobre mi paja mental, no anticipo nada más, porque por el momento, aunque llevo algo más de un mes con esto, no deja de navegar a la deriva, ya que es posible que no llegue a buen puerto, perdiéndose en el océano por alguna circunstancia con mayor preferencia, como ya pasó en el primer intento. No obstante, solo decir, que todo el tiempo que suelo invertir en estas cosas siempre me aportan nuevos conocimientos, ya entre todas mis pajas mentales siempre busco dobles vertientes, para optimizar el tiempo empleado.

Bueno quien haya leído hasta aquí, ya puede deducir que este post es más bien para retomar el contacto de nuevo con el blog y ver si de esta manera consigo volver a escribir con un poco más de frecuencia, como y había hecho hasta el post anterior a este, ya que no ha sido por falta de cosas de la que escribir, más bien por falta de tiempo1.


Hasta la próxima enfermos.

1Lo de falta de tiempo, es una manera corta de decir que has tenido preferencia por hacer otras cosas antes que hacer esas, ya sean por interés propio o ajeno, por obligación, por compromiso o porque la naturaleza humano te ha obligado ha hacer, así que no me estoy excusando.

7 de diciembre de 2010

Autenticación de Lotus Notes Server

El día que tuve que ir por la empresa, donde actualmente trabajo a tiempo completo, a restaurar el servidor de correo Lotus Notes, de la oficina de Barcelona, aprendí a marchas forzadas a instalar un servidor de Lotus Notes desde 0.

En la fase de restauración tuve que registrar un nuevo elemento servidor en el Domino, ya que en la instalación del servidor se requiere que le indiques el nombre que tiene en el Domino y también le proporciones su ID.

Hasta la fecha, yo sabía que el ID, era un fichero que lleva los credenciales de autenticación de un usuario registrado en el Domino, siendo necesario cuando el usuario abre sesión desde de el cliente de escritorio, ya que el acceso desde un cliente web (navegador) no es necesario. Podéis encontrar algo de información de este inusual sistema de autenticación, aquí. Ahora que me encontré con esta situación, he sabido que los ficheros IDs no solo se usan para autenticar a los usuarios, sino también a los servidores.

De mis rutinarias tareas de administración de usuarios en el Domino, se que cuando se registra un usuario el ID se almacena en el names (BBDD donde Domino gestiona todos los elementos registrados), o eso es lo que pensaba, ya que cuando en la empresa registramos a los usuarios, siempre marcamos esa opción.

Formulario de registro de servidor en Domino de Lotus Notes.

Pero resulta que aunque se indique dicha operación, no siempre se puede llevar a cabo, porque si lamentablemente se ha indicado un nivel 0 de complejidad de contraseña, el sistema no permite realizar la operación.

Selección de nivel de complejidad de contraseña

Alerta de obligación de contraseña para adjuntar un ID en el Domino

Por esta razón, o la menos esa es mi deducción, ningún servidor registrado en el Domino de la empresa, tiene adjunto su ID.
Este hecho me provoco ciertos dolores de cabeza, ya que al no tener ese ID y no encontrarlo por ningún directorio de los distintos servidores, ni en los espacios de datos compartidos que utilizamos en el departamento de TI, perdón, de sistemas y cosas varias, tuve que registrar de nuevo un servidor en el Domino, generando de esta manera su ID correspondiente, y esta vez sí, adjuntado al registro del servidor en el names.

Sorprendentemente, por el momento no hemos detectado ninguna anomalía correspondiente a que el Domino no identifique el servidor como tal, ya que en sí, debería ser otro servidor, con un mismo nombre de un servidor que ya existía; como es normal, ser perdieron configuraciones que el antiguo servidor tenía, ya que debían estar almacenadas en su propio disco local, pero los clientes que atacan a las BBDD, ya sean de correo o de otros menesteres, han continuado operando sin problema alguno.

Para finalizar, me autorespondo, en base a mis propias deducciones, a ciertas preguntas que yo me hice en su momento:
  • ¿Porque si se indica el nivel de seguridad 0 de contraseña (nivel que permite dejar la contraseña en blanco) no se permite adjuntar el ID al registro del elemento en el names?
    La deducción más obvia, es porque el nivel de seguridad de acceso a ese fichero ID, debe ser muy débil; y claramente es así, el names es una BBDD accesible por cualquier usuario registrado, sea administrador o el usuario con menor privilegio; así que cualquier usuario registrado puede acceder a ese registro y extraer el ID, y si no tuviese contraseña, suplantar la identidad del elemento en cuestión.

  • Si el ID del servidor, tienen una contraseña ¿cómo puedo configurar el arranque del servidor de manera automática (arranque al inicia Windows, desde un cron, etc.)?
    Es posible que esta pregunta tenga varias respuestas, pero en mi caso, lo solucioné, autenticándome desde un cliente de escritorio de Notes con el ID del servidor y cambiando la contraseña del ID, por ninguna; esta operación cambia la contraseña de esa copia del ID, no de ninguna otra copia, ni del fichero original adjunto en el registro del servidor en el names.


Hasta la próxima enfermos.

27 de noviembre de 2010

Sincronizando Thunderbird y iPhone

Después de que uno de mis clientes decidiese implantar el uso del Open Source en su empresa, en parte culpa mía, me ha tocado aparear un Thunderbird y un iPhone.

Con lo sencillo que es que MS Outlook y iPhone se juren amor eterno; solo tienes que instalar iTunes, luego conectar el iPhone al ordenador y posteriormente desde iTunes acceder a las preferencias de iPhone, que aparece como dispositivos conectado, para acabar indicando en una de las pestañas de las preferencias que  quieres que sincronicen el calendario, los contactos y el correo. En cambio todo esto se convierte en algo bastante más complicado cuando decides que tu iPhone se sincronice con Thunderbird, ya que entre ambos, todavía no hay manera, o al menos de una manera estable y sin tener que hacer juegos de malabares, de que lo hagan a través de la conexión USB, y lo único que te queda es hacerlo on the air usando un "midleware" compatible con los dos.

Uno de los empleados de Mozilla declarando que la sincronización con iPhone y Thunderbird no está planeada


Sincronizando on the air
Maneras de sincronizar el calendario, los contactos y los correos on the air hay varias y entre ellas algunas que se pueden hacer con distintas herramientas.

Después de buscar durante un rato encontré las siguientes:
Mi situación
En mi caso, yo tenía que conseguir sincronizar el calendario y los contactos entre iPhone y Thunderbird. El correo no era necesario ya que mi cliente accede a sus 3 cuentas de correo bajo sus 3 dominios administrados en unos servidores de un proveedor de servicios externo y a los cuales yo no tengo ni acceso, ni tampoco información ni potestad para indicar si activar o desplegar nuevos servicios sobre ellos; además accede al correo bajo demanda manual, aunque tienen un tarifa plana de datos 3G , es decir que no el iPhone no descarga correo hasta que el lo solicita.
Es decir que lo que necesitaba es hacer lo mismo que hacía conectando el iPhone con USB al equipo para sincronizarlo con MS Outlook. 

Para conseguirlo lo que he hecho es crear una cuenta de google mail, con el objetivo de tener un calendario y una agenda de contactos en la nube y de esta manera sincronizar todo esto con el iPhone. El caso del correo era indiferente, ya que seguía manteniendo sus cuentas de correo y accediendo a este a través de POP3, y en el caso que descargase correo a la vez desde el equipo y el iPhone y se quisiera mantener una sincronización de las cuentas, entonces se tendrían que configurar con IMAP, también soportados por los servidores del proveedor externo. 
Aunque para sincronizar calendarios desde iPhone se podría hacer mediante CalDAV y no haría falta configurar la conexión a gmail en modo Exchange, nos faltaría poder sincronizar los contactos, así que es más apropiado hacer en modo Exchange y dejar la opción de correo desactivada.
Elementos a sincronizar en modo Exchange

Lo que ahora solo faltaba era configurar Thunderbird. Lo de las cuentas de correo, no lo voy a explicar, ya que es tan sencillo como configurar cuentas de correo POP3, además de alejarse del objetivo del post.

Primero, para que Thunderbird tenga calendario hay que utilizar un add-on llamado Lightning, que lo que hace es incorporar Sunbird (aplicación de calendario Open Source de Mozilla) sobre Thunderbird, todo en uno. Lo que tenía que hacer con Thunderbird era, básicamente, acceder a la a esa cuenta de gmail y sincronizar el calendario y los contactos. Sunbird, permite consultar calendarios a través de CalDAV, así que, aunque hay add-ons para acceder a los calendarios de gmail desde el propio Thunderbird, yo no he usé ninguno y configure el calendario de gmail directamente con CalDAV desde propio Sunbird.

Para los contactos no hay mas remedio que sincronizarlos a través de un add-on. Yo probé primeramente el Zindus pero no luego me di cuenta que no sincronizaba las direcciones postales, y vi que si lo hacía pero para ello los distintos campos de la dirección postal tenían que ir taggeados con etiquetas xml porque gmail guarda esa información en un mismo campo y Thunderbird en distintos; así que si no tenía las etiquetas, la información no se sincronizaba desde gmail a Thunderbird y si sincronizabas esa información desde Thunderbird a gmail, entonces te aparecen las etiquetas, que si hubiese sido para mi, tampoco me importa tanto, pero para una persona con casi ningún conocimiento técnico, es un poco dramático.
Debido a esto busque otro add-on, y encontré Google Contacts, el cual si que permite sincronizar las direcciones postales, aunque te mete toda la información (calle, número, código postal) en el campo dirección de la pestaña trabajo y si en Thunderbird lo metes todo allí, entonces también se sincroniza de este a gmail; no he probé que pasaba si en gmail o thunderbird metes varias direcciones, ya que todos los contactos que tenía mi cliente, o no tenía información postal o solo tenía una.

Días más tarde escribiendo este post he encontrado otro add-on, gContactSync; este, aunque no lo he probado, parece que tiene una pestaña más en la ficha del contacto de Thunderbird para meter la información postal que se sincroniza con gmail; así que es posible que hubiese sido mejor solución, así sabes donde hay que poner esa información si realmente quieres que se sincronice con gmail y posteriormente con tu iPhone.


Y de esta manera conseguí que mi cliente pudiese cambiarse de MS Outlook a Thunderbird y continuando manteniendo sus contactos y calendario sincronizado con su iPhone.

A mi cliente, esto ya le ha parecido una buena manera, pero no tiene porque ser buena para otros, ya que es posible que el usuario de iPhone no quiera pagar por tarifa plana de datos o que no quiera meter su información en google, así que en ese caso se tendría que buscar otro de las soluciones que hay o indagar un poco más y con un poco de ingeniería inversa implementar una solución estable de sincronizar estos dos vía cable USB, ya que Mozilla, por ahora, no parece que tenga prioridad alguna (y totalmente lícito, ya que el  software es gratis) en implementar este tipo de funcionalidad.

Hasta la próxima enfermos.

21 de noviembre de 2010

Mi mailbox ha regresado al “Big Bang”


Descripción del entorno
Lotus Notes es una aplicación que se clasifica dentro de la categoría de colaboración de grupos o equipos de trabajo.
En la empresa, en la cual empleo la mayor parte de mi tiempo, utiliza esta herramienta desde hace mogollón de años, aunque parece que a nadie le acabe de satisfacer, la herramienta sigue ahí y bien viva ya que se van pidiendo la implementación de nuevas funcionalidades sobre ella.

Nosotros, los del departamento de TI, tenemos que sufrir las constantes críticas de la mayor parte de los usuarios, incluyendo usuarios con potestad para impulsar un cambio (la dirección), pero este nunca llega, ya que aunque nosotros no somos unos fans de Notes, somos realistas y exponemos las realidades que hay cuando se nos dice “¿por que no ponemos Outlook?” (He dicho Outlook, porque para el usuario es Outlook y nada más, es decir Exchange no existe).
En resumen, el cambio nunca llega porque cuando empiezan a sonar los números, los que pagan ya se echan para tras, y eso que solo llegan a escuchar el dinero de adquisición de la licencia de Exchange, sin haber escuchado lo que cuesta otra herramienta que supla las funcionalidades que ofrece Notes y no Exchange, desarrollo de aplicaciones y BBDD de “negocio” y su migración.

En fin dentro de este berenjenal a nosotros nos toca lidiar con la administración de Notes y las constante insatisfacción y todo eso con una política, de puertas hacia dentro, de inversión mínima en TI.

Como de costumbre, el gran perjudicado en una insuficiente inversión en el importante ámbito actual de las TI, no se lo lleva el personal del departamento de TI que tenemos que plantarnos fuera de horarios para apagar fuegos, aprender de manera autodidacta y normalmente a base de “ostias”, etc., sino que se lo lleva los usuarios y sobre todo la continuidad de negocio de la empresa.

Regresando al “Big Bang”
Hace poco más de una semana, el servidor de Notes de Barcelona dejó de funcionar, al estropearse dos discos de un RAID 5, así que los datos se quedaron en el limbo, ya que no hay tiempo para mandar esos discos a un empresa de recuperación de datos, ya que el servidor se tiene que restablecer lo antes posible; el tema económico, ni lo menciono ya que no lo llegamos ni a consular, pero con la política de inversión mencionada anteriormente, se puede prever con cierta exactitud la respuesta.

La incidencia hasta aquí la normal, no hay disco hot spare, así que a reinstalar servidor y su servicio, después de cambiar los dos discos.

Lo que sucedió, es que ciertos usuarios no tenían una copia de su BBDD de correo, así que volvieron a “Big Bang”, buzón vacío y si tenías algo importante te las apañas para recuperar lo o continuas tu actividad sin esa información como puedas. He dicho ciertos usuarios, por otros si tenían una copia, ya que usan correo web y para eso necesitamos tener replicada su BBDD en otro servidor Notes, y casualidad o no, suele coincidir con el correo de los usuarios de mayor importancia (hablando en términos organizativos).

Restableciendo el servidor
Yo, que de administrar el Notes, sé lo del día a día, ya que el tiempo de la extendida jornada laboral, con el personal que somo en TI, no deja para estar jugando con los sistemas, e invertir en formación del personal de TI (y otros tantos departamentos, más bien casi todos a excepción uno y medio) no cabe en los presupuestos de la empresa; tuve que reinstalar un servidor de Notes entero y meterlo en el Domino existente, sin más ayuda hasta la fase de poner la guinda al pastel, ya que mi compañero no estaba localizable.

La verdad es que el Notes, as nivel de interfaz y de la lógica de ejecutar las acciones es rebuscado, de ahí su baja popularidad entre los usuarios, pero para administrarlo no lo es mucho, aunque la lógica de ejecución y realización de operaciones sobre él sigue siendo la misma, pero para los IT Pros no hay mucho problema ya que nos dedicamos a probar lo todo.

En resumen, la instalación del software, es un siguiente, siguiente, siguiente, … si no te encuentras que te falta algo como me pasó a mí. Como tenía que restaurar un servidor, necesitaba conseguir el ID (fichero de registro de los elementos registrados en el Domino: máquinas, servidores, etc.) del servidor antiguo y justo este ni estaba en el names (BBDD donde Domino gestiona todos los elementos registrados) y menos lo encontré perdido por algún directorio de los múltiples que tenemos en la empresa.
De tenerlo, creo que hubiese podido asociar esa nueva instalación al servidor ya registrado, pero al no ser así tuve que crear un nuevo servidor, al cual le puede poner el mismo nombre que antiguo, préviamente habiendo renombrado al antiguo, y no hizo falta mucho más para que el Domino continuara tratando el nuevo servidor como el servidor existente.

Evaluación
Finalmente la experiencia no ha estado más, ahora ya sé instalar un servidor Lotus Notes, añadirlo a un Domino existente, además de haber aprendido y encontrado múltiples herramientas y operaciones de administración que Lotus Notes tiene.
Para los usuarios y la continuidad de negocio, ha sido un mal menor, ser perdió poca información importante, al menos para la empresa, para el usuario que la ha perdido parece algo más importante, y como siempre, si se hubiese tenido una copia de seguridad en toda regla el impacto de perdida de información hubiese sido minúsculo, pero si no la hay, puedo constatar que es por falta de inversión en TI, no solo en máquinas (que si que hace falta) sino en aplicaciones y en recursos humanos.

Tengo previsto, espero que sea en un breve espacio de tiempo, escribir alguna entrada sobre algunas cosas que he descubierto de Lotus Notes, que me han sorprendido como funcionan, y que me han tenido perdiendo una parte del tiempo, ya que remendando por Internet, en Google y en la documentación de IBM, no logré encontrar, con el objetivo de que a alguien le puedan ser útiles.


Hasta la próxima enfermos.

14 de noviembre de 2010

Open-Closed Source en la PymE


Sobre el uso del software Open Source frente al de Closed Source se ha hablado y se continua hablando mucho y mi objetivo aquí no es escribir un post a favor de uno o de otro sino más bien escribir una recomendación sobre pros y contras de la utilización de uno y otro en un entorno empresarial, concretamente en la PYME y más enfocado en la P que en la M, y aunque he mencionado el termino Source, más bien sería el uso de software con licencias que tienen un coste económico en entorno profesional frente a los que no.

Esta entrada tiene que ver con una de mis intervenciones profesionales independientes, en la que hace poco más de un par de meses, tuve que asesorar a uno de mis clientes sobre la inversión económica en software.
El detonante de esta toma decisión, en la que a mí se me pidió el papel de consultor tecnológico, ha sido la rotura con su socio, que ha conllevado que él se quede con una parte del negocio, estando el solo al pié del cañón, como tiempos atrás había sucedido. Con esta rotura, la toma de decisiones dependen única y exclusivamente de él, aunque su nuevo director ejecutivo ejerce una gran influencia.

Las separaciones siempre son duras y no me refiero a nivel de relación sino económico, sobre todo cuando te llevas una parte del negocio, ya que te toca hacer los liquidaciones pertinentes de las acciones y luego asumir los gastos de constitución de una nueva empresa, que muchas veces, y en este caso fue así, conlleva un cambio de oficina, adquisición de nuevos activos, etc., es decir, lo que en tiempo de crisis, a uno le viene muy bien.

Con tanto gasto, y estando en este España, uno ya se puede imaginar que cuando se le dice una cifra aproximada sobre la inversión necesaria en software de uso más extendido, a este se le entra fuertes dolores de barriga. La gran mayoría te dice, “no puede ser, tiene que haber otras soluciones”, y si eres profesional y velas por la seguridad del cliente, sobre todo en un entorno empresarial, no serás su vecino Carlos.

Así que le puedes decir que otras soluciones, legalmente hablando, las hay y aunque tienen la ventaja que las licencias de uso de ese software no tienen ningún coste económico directo, también tiene desventajas, y hay que tenerlas en cuenta antes de decidir si utilizas software con licencias con coste o sin coste, ya que las sin coste no te van a costar un dinero directo pero si otros compromisos, esfuerzos y es posible que también algo de inversión económica.

Así que aquí os dejo la parte de mi informe de consultoría tecnológica que habla de la infraestructura software a utilizar, para que pudiese tomar una decisión en base a este aspecto.
Dejo constancia que intenté ser lo más objetivo posible y la valoración la enfoque desde su situación, no obstante seguro que se puede mejorar y ampliar ciertos aspectos que en ese caso yo no indiqué.

“Se recomienda el uso de software con licencia libre de utilización frente al de licencia con coste de utilización, si las actividades y necesidades del negocio no lo requieren, ya que la diferencia de inversión económica es considerable.
La utilización del software con licencia con coste de utilización es necesaria cuando los elementos externos que interactúan con la actividad de la empresa requieren del uso de estos, ya sea por los formatos de documentos que genera una aplicación concreta y los cuales son intercambiados o porque se necesita un función muy específica que no se encuentra en cualquier otra aplicación con licencia de libre utilización.
Otro caso en el que el uso de software con licencia con coste de utilización es necesario es cuando los costes de parametrización y/o implantación de un software con licencia de libre utilización son elevados tanto en tiempo como económicos en el caso de necesitar soporte externo a los recursos de la organización; este caso es muy poco frecuente y se da en aplicaciones muy concretas y normalmente cuando se da ese caso en aplicaciones con licencia de libre utilización, difícilmente se encuentra una aplicación con licencia con coste de utilización que elimine esos costes, produciendo normalmente un coste económico más elevado ya que es necesario adquirir la licencia y contratar el soporte externo.
Otro impedimento al uso de aplicaciones con licencia de libre utilización es la reacción de los usuarios de estas, los empleados. Normalmente los usuarios son reacios al cambio y más cuando se les exige que el aprendizaje lo hagan manera autodidacta y se les exige el mismo rendimiento desde el primer momento, sin darle un periodo de tiempo de adaptación para alcanzar el rendimiento que tenían anteriormente con las aplicaciones que utilizaban anteriormente. Este caso no solo se da en la implantación de aplicaciones con licencia de libre utilización, también se da cuando se implantan nuevas aplicaciones con licencias con coste por utilización o incluso cuando se actualiza una aplicación que ya utilizan a una nueva versión. Normalmente lo que causa una reacción de oposición al cambio de aplicaciones es la interfaz de interacción con la aplicación, ya que durante el periodo de adaptación se sienten torpes y tardan mucho más tiempo en realizar sus labores, debido a que les cuesta encontrar en la interfaz la manera de ejecutar las acciones deseas; superado el periodo de adaptación las reacciones de oposición desaparecen.”


Hasta la próxima enfermos.

1 de noviembre de 2010

New release of “The Maze EV”

El jueves pasado recibí un e-mail de un colega muy especial, JavierLloret; un colega muy especial porque, aún habiendo lo conocido a los 18 años, pasamos muchas horas trabajando juntos a lo largo de 4 años que estuvimos juntos en la universidad.

Aún recuerdo esos tiempo, que nos pasábamos horas y horas currando en las prácticas de las asignaturas, unas totalmente por obligación de aprobar las asignaturas y otras prácticamente más por motivación que por el simple hecho de sacar las asignaturas.

En una de las prácticas que más curramos, fueron en un par de asignaturas optativas que coincidimos en el segundo trimestre de cuarto curso. Habíamos pasado trimestres con mucho overbooking de asignaturas, porque así lo marcaba el apretado temario de 4 años, de la Universidad Pompeu Fabra, para realizar una Ingeniería Informática; pero en el trimestre de estas dos asignaturas no era un trimestre muy apretado, ya que si no recuerdo mal, solo había una asignatura obligatoria y el resto era para realizar créditos de asignaturas optativas y libre elección y dedicarle tiempo al desarrollo del proyecto de fin de carrera. Es decir que fue un trimestre que curramos un motón, pero no por el hecho de sacar las asignaturas, sino prácticamente por pura motivación e interés.

El trimestre empezó como cualquier otro; parecía que se iba a presentar relajado, pero cuando empezamos a asistir a las primeras clases de prácticas y poco después se expuso lo que finalmente se tenía que hacer como proyecto de asignatura, el estado de relajamiento paso a ser todo lo contrario, un estado de euforia constante.
Empezamos pensando que hacer como proyecto de cada una de las asignaturas y acabamos entrando en un estado de delirio marcando metas por encima de nuestras posibilidades, tanto en recursos humanos como temporales. Fuimos demasiado optimistas pero finalmente aunque uno de los proyectos no se terminó, completamente, el otro en cambio se terminó en cuanto a funcionalidades, es el que recibió el nombre de “The Maze”.

Recuerdo que prácticamente la última semana nos encerramos en su habitación (15 m2 incluyendo el baño y cocina integrada), saliendo para lo estrictamente necesario, en mi caso incluía aparecer por el curro, llegando a estar las 48 últimas horas antes de la entrega sin salir apenas de allí, durmiendo 4 horas, antes de enlazar con las últimas, aproximadamente 27 horas delante del ordenador, programando, testeando, pegándonos de ostias con los problemas de compilación, de linkaje, … ya sabéis de que estoy hablando.

Bueno finalmente, después de todo esto nació la primera release de “The Maze”; un juego interactivo para dos jugadores; uno con el rol de construir un laberinto con unos recortes de cartulina sobre una mesa, en esa primera versión “muy alpha”, construida con una caja de cartón y un pedazo de plástico traslucido, de esos que se utilizan como portadas en las encuadernaciones de las papelerías y el otro jugador básicamente utilizaba un ordenador, como en cualquier juego que ves el personaje en primera persona, que tenía que salir del laberinto en un tiempo determinado, con el agravante que el laberinto podía ser alterado por el otro jugador.

No me voy a extender mucho sobre todos los matices técnicos, porque la nueva versión, seguramente, ha cambiado mucho de la primera, que es en la que yo participé como co-developer. El concepto era el mencionado, dos jugadores, cada uno con su rol; la mesa se conectaba a un ordenador que captaba el laberinto construido sobre la mesa y lo enviaba por red a otro equipo que era donde el otro jugador tenía que conseguir salir de él.
Para la captación de las paredes (cartulinas) puestas sobre la mesa de cartón se utilizaba una Webcam, de estar por casa, junto con un pequeño framework que nos cedieron para realizar las prácticas que permitía captar ciertas figurillas y reconocerlas, que se estaba desarrollando en uno departamento de la facultad y ha llegado a ser lo que se conoce como Reactable Live; pero nosotros nosotros desechamos todas esas funcionalidades, ya que no lo necesitábamos para nada reconocer figuras y, básicamente, solo utilizamos el framework para captar la presencia de más o menos luz, y así identificar las paredes.

Ahora todo esto ha evolucionado a una release mucho mejor, gracias a Javi, que desde que terminó con esa asignatura siempre ha dicho que tenía pendiente mejorarlo para obtener una versión mucho más decente, en cuanto a material físico empleado, como a tecnología de desarrollo utilizaba y el resultado has sido el que podéis ver en el siguiente vídeo:


Ya terminando, solo quiero reflejar, el mal sabor que nos dejó de boca, que después de tanto curro, el profesor de la asignatura ni si quiera se digno a pasarse por el aula, el día de la presentación, mandó al becario que hacía las sesiones de prácticas, el cual iba un poco perdido, ya que era extranjero y acababa de aterrizar por la facultad, ese mismo trimestre. Todo fue “muy motivador” por su parte, enzarzar a la gente a realizar cosas de interactivos para luego acabar valorando mucho más una mierda de presentación sobre un tema del ámbito de la interacción que se tenía que presentar en las sesiones de teoría, las cuales el no podía aludir, y que con todo el curro que tuvimos no le dedicamos prácticamente tiempo; vamos el pan del día a día, explicar cosas que ya existen en un formato PPT (bueno ahora PPTX) bien bonito, muchas de las cuales el que expone sabe de que coño está hablando, pero eso es indiferente, hay demasiado humanos que solo ven hasta donde los ojos alcanzan, sin traspasar a la actividad neuronal.

Hasta la próxima enfermos.

21 de octubre de 2010

No cON Name 2010 (2/2)



conjuntoEntradas() {
  No cON Name 2010 (1/2)
  No cON Name 2010 (2/2)
}

Hoy, como era de esperar, he estado en el segundo y último día de asistencia al No cON Name y este es mi resumen de las ponencias del día.

IP Fragmentation Overlapping
Jose Selvi nos ha dado toda una lección sobre IP Fragmentantion Overlaping.
Ha empezado dándonos los conceptos básicos del fingerprinting, mediante el comportamiento de la pila de red del implementador, obtenido a partir de la respuestas de las peticiones IP que quedan fuera de lo especificado en la RFC.

A partir de la técnica de IP Fragmentation Overlaping nos ha demostrado como poder hacer un pentest saltándonos un IDS si la configuración no está afinada a la arquitectura de red que pretende proteger.

Ha sido una muy buena ponencia, ya que parte de ella la ha dedicado a realizar tres demos de los conceptos explicados y de algunas de las casuísticas que te puede encontrar.

Reversing for goods: fixing security vulnerabilities in binaries
Sergi Álvarez (pancake) ha dado un ponencia muy técnica sobre el parcheado de binarios para mitigar 0 day, hacer jailbreak de dispositivos, creación de exploits, etc.

Sinceramente, yo estoy un poco verde en este aspecto, y aunque he podido seguir ciertas partes de la charla, no he podido llegar a comprender todos los aspectos o comprenderlos profundamente.

Ha explicado las distintas técnicas de parchear binarios usando la herramienta, Radare2, co-desarrollada por él mismo. También ha mostrado varios ejemplos simples de como parchear, con las distintas técnicas comentadas.
Y para finalizar ha comentado como se pueden parchear dos vulnerabilidades que han tenido bastante revuelo, sobre todo una de ellas que es la que utiliza el gusano Stuxnet.

Development of security-critical embedded systems
Lamentablemente sobre esta charla solo puedo decir “No comment”.

SMSspoofing: fundamentos, vectores de ataque y salvaguardas
Julían Díaz nos ha hablado, a partir de un estudio que llevan realizando hace tiempo, del SMS Spoofing muy focalizado en los servicios ofrecidos por proveedores de envío masivo de SMS.

Han explicado los conceptos generales y aplicaciones que pueden ser vulnerables y como y con que han realizado las pruebas, además de haber hecho algunas demos con esto.

Para finalizar han indicado sus recomendaciones para protegernos tantos los usuarios como las operadores sobre este tipo de ataques.

Resolución de concursos de la No cON Name 2010
Alejandro Ramos y Francisco Alonso han realizado la resolución de los concursos a los que nos podíamos a presentar como participantes.

Las resoluciones, aunque no he participado, me han parecido muy instructivas, he aprendido conceptos que pueden se aplicables en otros ámbitos, además de tener una visión de como abordar estos retos.

Concretamente me ha gustado mucho la resolución del concurso “Iluminación de Randa”, ya que estaba basado en un problema de carácter real. En él se ha explicado como bloquear el ataque y después como crear un informe detallado de lo sucedido, además para añadir la guinda al pastel, han comentado el el ataque que ellos mismos hiciero sobre la infraestructura de control del spyware, es decir el contraataque a los malos.

Ellos se habían presentado al consurso por hobby, es decir sin formar parte de los participantes que optan al premio, pero como nadie más se ha presentado, la organización ha decidido darles el premio ellos, aunque realmente se lo han bien mercido por el excelente trabajo que han hecho; hay que decir que son unos cracks!

Políticas llevadas a cabo en la Generalitat de Catalunya
Jordi Bosch ha explicado, como el título indica, políticas que llevan a cabo en la Generalitat; realmente no tengo mucho que decir, solo que tienen en cuenta aspectos que no me hubiese pensado que los tienen en cuenta, aunque no pongo la mano en el fuego, si realmente se ponen en práctica o solo se aplican a nivel de discurso.


Antes de terminar el post quier hacer un comentario sobre algo que sucedió ayer. El ppt de la ponencia "Aspectos organizativos ligados a la seguridad de la información", dada por Joan Ayerbe, estaba en catalán algo que me pareció fuera de lugar, ya que a mi parecer, el congreso estaba dirigido a la audiencia en general y no solo a la audiencia catalana, por lo tanto esto, desde mi punto de vista, ya me pareció un FAIL a la audiencia; pero la cosa no quedó en solo esto, luego me enteré que el acto de inauguración, el cual me salté, fue dado en catalán, así que si lo del ppt me pareció un FAIL, esto último me parece una falta de respeto, en toda regla, a la audiencia.

Parece que esto último llegó a oídos de los organizadores, ya que el último ponente, Jordi Bosh, antes de empezar comentó que le habían dicho que hiciera la ponencia en castellano, y que él, como era de esperar, la haría en castellano ya que el objetivo es la comunicación, vamos lo que para mí es, a nivel global, el objetivo principal de la lengua; a parte de esto pidió disculpas, por adelantado, si al darla en castellano pudiese llegar a soltar alguna catalana.

Hasta la próxima enfermos.

Actualización
La organización me ha aclarado como fue concretamente lo que realmente sucedió en la presentación del evento, que cómo ya dije no asistí, llegándome el feedback de terceros, y para la cual he manifestado que me pareció una falta de respeto a la audiencia.

Así que actualizo la entrada con este comentario para dejar claro como dio la situación y quien realmente tomó la iniciativa; la cosa fue así:
“El acto fue presentado y distendido en castellano tanto por presidente de la asociación y patrocinadores. La intervención en catalán fue del colaborador, el director del CESICAT”.