Archivo de la categoría: Discución.

Filosofía a la orden del debate.

Una breve actualización general

Hola a todos, he vuelto después de un largo tiempo sin publicar nada por acá; no estaba muerto y desgraciadamente tampoco andaba de parranda.

Decidí por primera vez, en un tiempo aún más largo, que es momento de publicar un post un tanto más personal de actualización. Y es que desde que definí el tema que seguiría este blog, al principio y por mucho tiempo lo considere únicamente como un medio de consulta; que ha funcionado bastante bien, pero creo que justamente ese crecimiento implica que las cosas tendrán que ir cambiando poco a poco.

Y por cosas, me refiero a los otros instrumentos que utilizo para difundir y compartir sobre computación, software libre y tecnología; como Gitlab y mi página web, hasta ahora cada uno de estas herramientas se han relacionado poco y cada una parece tener un rumbo especial.

En los últimos años mi vida a dado varios giros; unos más bruscos que otros, y ahora creo tener un panorama más amplio y un enfoque más claro de lo que busco en diferentes aspectos principalmente en lo que quiero en mi vida profesional, que en consecuencia me ha llevado a pensar qué rumbo tendrán estas publicaciones.

Quiero compartir un poco sobre estos giros; en parte porque creo que puede ser una buena experiencia y reflexión, y para mí han sido una serie de experiencias que cambiaron mi perspectiva sobre muchas cosas.

A finales del año pasado deje el trabajo en el que estaba. Al principio todo parecía ir de maravilla; pero al final tuve varios desencantos bastante fuertes que se sumaron a otras experiencias similares que voy a resumir más adelante. Así que con toda la presión que significa el desempleo; al final me decidí a hacerlo.

Aproximadamente un mes después me encontré con mi entonces tutor de la licenciatura; tenía más de un año de haber registrado mi proyecto de tesis y tenía hecho todo el proyecto, teníamos las pruebas, tenía casi la mitad de la tesis hecha y por más de un año no había podido hacer mucho.

Aprendí a la mala que no es posible hacer una tesis con solo dos horas diarias.

Un trabajo de calidad, de la importancia y el significado que tiene una tesis, difícilmente puede realizarse con todo el esmero y calidad que merece con solo dos horas diarias. Cuando menos es un trabajo de medio tiempo. Idealmente es un trabajo de tiempo completo.

Cada vez veo más memes y comentarios acerca de la terrible cultura laboral que tenemos aquí en México. Como aquél que dice

mexico-pais-donde-no-pagarte-las-horas-extras-se-le-llama-ponerse-la-camiseta-id-ggdcg

Y es que es solo uno de los factores que hacen a nuestra cultura laboral terrible. Quizá este y el problema salarial sean los factores más escandalosos en nuestra cultura laboral, pero no son los únicos aspectos negativos; quizá solo son dos aspectos de los más rezagados en cuanto a derecho laboral.

Al principio te venden los empleos con las mejores proposiciones: horarios flexibles, bonos, valoración del desempeño, buen ambiente, etc. En cuanto te contratan los problemas suelen salir al aire inmediatamente; pero llegamos con una imagen que nos hace ignorarlos y creer que son parte del ambiente de trabajo.

Hace alrededor de 13 años tuve mi primer trabajo. Era menor de edad, mi situación familiar era complicada y conseguí un empleo en una cocina. Trabajaba duro haciendo de todo. Picaba verduras, preparaba las aguas, ayudaba a preparar la comida; salía a repartir, tomar pedidos, hacer limpieza…

Y entre todas esas actividades yo pensaba en mi ingenuidad: cuando termine la prepa me va a ir mejor. Durante el bachillerato tuve al rededor de cuatro empleos más; todos los dejé por que me exigían más tiempo del que estaba dispuesto a darles (no porque fuera un vago, sino porque me interesaba tomar mis clases y hacer mi tarea). Y en todo caso, ¿el esparcimiento no es un derecho humano? ¿una persona; independientemente de su situación económica, no tendría derecho a disfrutar de un tiempo para ella misma?

El punto es que hasta hace unos años, mis empleos casi siempre eran de medio tiempo; pero por diversas causas, llegaba un punto en el que se empezaban a convertir en trabajos de tiempo completo. Algunos de ellos los dejé también por malas condiciones laborales, principalmente el que no te den el material o la preparación necesaria para desempeñar tus tareas y por su puesto las clásicas condiciones para que te paguen a tiempo y de forma integra.

Quizá a algunos les suene extraño que exija preparación; pues se supone que se contrata personal ya capacitado para realizar sus tareas. Pero dependiendo que hagas, puede ser necesario recibir capacitación o preparación, y tu empleador debe cubrir esos gastos. De hecho en software esto es muy común, puesto que las tecnologías avanzan; así como las metodologías de uso de las plataformas y de desarrollo también cambian, todos los profesionales de las TIC y campos afines tienen derecho a recibir preparación continua por parte de su empleador (su empleador no se tiene que convertir en escuela, pero puede pagar cursos en línea, contratar consultores o a entrenadores).

Además, puesto que el tiempo de preparación es destinado a realizar sus actividades, esas horas de estudio deberían de alguna forma formar parte de las horas productivas de los empleados. De esta forma, ese tiempo no impactaría de forma directa en el tiempo personal de los empleados; y así lo puede aprovechar de otras maneras, incluyendo aprendiendo otras tecnologías que le parecen atractivas en lo personal.

De lo contrario, solo le quitamos su valioso tiempo a las personas; parece que los empleadores creen que las personas aparecen y desaparecen del universo cuando entran y salen de los espacios de trabajo; pues esas personas tienen que invertir su tiempo en dormir, transportarse de su hogar al espacio de trabajo, se tienen que preparar para salir de su casa y al regresar del trabajo; hay un gran numero de actividades que consumen una parte significativa de un día y ni siquiera forman parte de la jornada laboral.

Y si encima tienes que llegar a casa a aprender un montón de cosas de forma autodidacta, a revisar pendientes, resolver bomberazos (no me hagan empezar con los bomberazos, cualquier problema urgente o situación no prevista, es muestra de una estructura débil de la organización y su mala administración en uno o más niveles) o hacer reportes; solo se extiende el espacio de trabajo y la jornada laboral de esa persona y su vida se convierte en su vida laboral.

Creo que en cierto punto, la mayoría de las personas pasamos por esa etapa; en la que nuestra vida es nuestra vida laboral. Y eso no es sano. Al principio puede parece ser lo mejor; todo promete, pero luego las cosas se quedan en promesas. A veces  dan probaditas, como aumentos, o vacaciones o un puesto. Pero cuando lo analizas fríamente, te das cuenta de que casi siempre (en mi experiencia siempre, pero les daré el beneficio de la duda; aunque no mi confianza); es puro atole con el dedo.

Por allí escuchas que pese a tu aumento, sigues estando por abajo del promedio salarial de otras personas en tu mismo puesto. O que van a dividir tu aumento entre varias personas. Descubres que tus logros y propuestas se mancharon con el nombre de alguien arriba de ti; que solo está allí por que como tú ha habido mucho otros que cayeron en su trampa y algunos siguen esperando que se cumplan sus promesas.

Promesas vacías que se mezclan con eterno ruido de las ciudades. Al final, te encuentras con un montón de metas sin cumplir, ¿y todo a cambio de qué? La experiencia siempre es buena y se agradece, porque al final nos dan conocimiento. Pero como dicen no solo de amor vive el hombre.

Y aunado a todo esto, siempre he sentido que mi salario jamás ha reflejado el valor de mi trabajo. Y por un margen importante, aún considerando todas las prestaciones que he llegado a tener (que tampoco es que sean muchas). Al final, con toda mi preparación, cuando pongo en retrospectiva mi vida laboral; he alcanzado puestos y nombramientos bastante altos pese mi edad y otros factores, pero la realidad es que mis condiciones laborales han cambiado muy poco en los últimos 13 años. Así que ¿porqué debería seguir ese camino?

Sé que mi caso no es el de todos; pese a la realidad asquerosa de nuestra cultura laboral (pues la he confirmado con todos mis conocidos), aún es posible que una buena vida laboral trabajo, sea el resultado de una buena trayectoria escolar. Pero en todo caso, lo más importante es no dejar de aprender; porque solo el conocimiento nos hace íntegros y nos hace libres; la mejor forma de explotar tu libre albedrío es con un panorama amplio que solo el conocimiento puede aportar, para así llegar a metas más altas.

Ahora sé que quiero dedicarme por completo a la academia; donde si bien muchos de estos problemas están presentes, y existen otras formas de injusticia laboral, me he identificado mucho con el equipo con el que desarrollé mi tesis y en los últimos meses he estado colaborando con ellos en una forma que me es muy agradable.

Al final, me siento muy satisfecho y contento de haber alcanzado esta meta que me puse hace tantos años en medio de una situación complicada, titularme ha sido lo mejor que me ha pasado en mucho mucho tiempo. Una parte de mi quisiera haber tenido la oportunidad de trabajar en mi tesis tiempo completo y haber realizado más pruebas, más versiones del proyecto y un texto con resultados más contundentes; pero tuve que tomar una decisión y al final estoy satisfecho con mi trabajo.

Así que, con la nueva visión y objetivos que tengo planteados; como comenté al principio, también tengo un nuevo panorama. Así que; qué sigue, que va a pasar con este blog y las otras herramientas.

El blog puede que no tenga cambios mayores; hasta ahora me ha gustado como a ido creciendo y los recursos que ofrece, así que trataré de publicar al menos cada una o dos semanas como hacía hace tiempo. Lo que si pienso cambiar es el estilo del blog, me gusta pero la letra es muy pequeña y tengo la impresión de que tiene una experiencia ya gastada.

La página web sí pienso reformarla un poco. Redistribuir el contenido y reflejar los objetivos de este proyecto de divulgación y promoción de forma más clara en su portal. Con este post, también me doy cuenta que el sitio web es quizá uno de los lugares inapropiados para poner los consejos y hints que pretendo compartir (por ejemplo, en este post acabo de contar cómo es que un trabajo de tiempo completo y un proyecto de tesis son muy difíciles de tener en paralelo; más una pequeña vociferación sobre cultura laboral en México). Así que esa sección va a desaparecer de la página y aparecerán en formato de historias o fábulas aquí en el blog.

También, desde diciembre tengo unos vídeos sobre armado de computadoras en los que explico de forma general los componentes de la PC que armo en los videos: vamos desde qué es el software, hasta los orígenes del teclado y el funcionamiento de un monitor. No estoy seguro de cuando podrá estar lista toda la serie (son cuatro videos), pero es posible que lance los primeros antes de septiembre (tengo varios proyectos; ¿entienden mi problema en participar en proyectos con horarios indeterminados espontáneos?)

Y lo que sí va a estar apareciendo a partir de hoy (o el lunes en el pero caso), es que voy a empezar a publicar las notas sobre un curso de Android en el que estoy participando actualmente. Esto es algo que había querido hacer hace unos años; pero por distintos motivos, no es sino hasta ahora que tuve la oportunidad de colaborar en un curso llamado “Programación de Dispositivos Móviles” para la licenciatura en Ciencias de la Computación que ofrece la Facultad de Ciencias de la UNAM.

El número de borradores para este blog también ha ido creciendo durante todo este tiempo; como siempre, encuentro un tema interesante en el proyecto en el que este trabajando y empiezo a planear un post; pero por muchos de los factores que describí en párrafos anteriores, me quedaba corto el tiempo y tuve que dejar inconclusas todas esas publicaciones, pero espero en las próximas semanas también comenzar a retomarlos.

En fin, ya saque lo que tenía que sacar. Espero encuentren interesante estas anécdotas y mis ideas. Por lo pronto, es momento de comenzar a publicar las notas del curso de Android; así que, como siempre, el límite es la imaginación.

Y tu capacidad de crédito.

 

Vociferación: Frameworks y plataformas de desarrollo simultáneo

Hola a todos,

Durante el último año, en diversos proyectos y por diversas razones he tenido que usar frameworks. No estoy seguro de qué tan importante pueda ser o qué tan impresionante sea el hecho; pero nunca antes había usado uno.

Sí, los conozco desde hace muchos años; sé para qué sirven y porqué se usan. Pero si decidí estudiar ciencias de la computación sobre todas las demás carreras afines a las TIC y/o la informática; fue porque quería aprender… Aún quiero aprender. Quiero saber muchas cosas; aún cuando soy consciente de mi efímera existencia en este universo vasto y dinámico, quiero tratar de aprender todo lo que pueda que me ayude a entenderlo mejor, a entenderme mejor y a desarrollar software de muy alta calidad.

También es cierto que soy muy práctico y a diferencia de muchos de mis colegas, prefiero trabajar en proyectos de desarrollo de software y/o hardware antes que realizando investigación y escribiendo artículos científicos; supongo que es lo único que puedo agradecer a mi último empleador: me enseño que es posible desencantarse por la industria y la academia al mismo tiempo (¡una condición de carrera salvaje ha aparecido!).

Pero por ahora quiero dejar eso de lado y enfocarme a los framworks y el desarrollo de sistemas computacionales…

¿Qué es un framework?

Para aquellos; estimados lectores, que no estén familiarizados con un framework, va una breve descripción.

Se conoce como “framework” a un conjunto de bibliotecas que resuelven; usualmente, más un problema.

A su vez, una biblioteca es un conjunto de rutinas/métodos/funciones y constantes que conforman un programa de computadora. Sin embargo, conforman un programa que no tiene un propósito especifico y que no está diseñado para ser ejecutado por sí solo.

Las bibliotecas las usamos casi todo el tiempo; seguramente todos hemos hecho algo por el estilo:

#include <stdio.h>

import java.io.PrintWriter;

library(Rlab)

require “template.php”;

Son ejemplos de importación de bibliotecas. Esto nos permite usar funciones definidas en ellas sin tener que implementarlas nosotros mismos. Esto es muy útil porque normalmente sólo podemos hacer llamadas al sistema a través de bibliotecas. Estas llamadas al sistema pueden ser: imprimir algo en la pantalla o en impresora, leer datos del teclado, dibujar en pantalla, abrir un archivo, escribir un archivo, etc… Y no nos tenemos que preocupar por como funcionan y mucho menos por tener que implementarlas.

También nos permiten usar instrucciones recurrentes en nuestros programas; como convertir una variable de tipo numérico a cadena de texto, usar funciones trigonométricas y calcular potencias.

Las bibliotecas tienen propósitos muy bien definidos y no suelen ser muy extensivas. Incluirlas en nuestros programas suele ser seguro, no los hace pesados ni ineficientes. Al contrario, muchas veces es recomendado usar las bibliotecas del sistema o del lenguaje antes de hacer nuestras propias implementaciones, ya que contienen software robusto y eficiente que hace los mejores usos de la plataforma en cuestión.

Ahora bien; por otro lado,

¿Qué es una plataforma de desarrollo paralelo?

Usualmente es todo un IDE (entorno de desarrollo integrado); que nos permite desarrollar aplicaciones para más de una plataforma. Típicamente se desarrolla en paralelo para Windows y Mac, Android y iOS. Además de tener editores de texto especiales para los lenguajes de programación para los que están orientados (rara vez el oficial de alguna de las plataformas objetivo), cuentan con una serie de bibliotecas y representan también un o varios frameworks…

Frameworks…

Oh los frameworks…

Aún en una carrera con un enfoque más teórico que práctico, una de las primeras cosas que nos hicieron entender muy en claro en la carrera, es que un computólogo debe aprender a diseñar, desarrollar y mantener software (yo agregaría que hardware también; luego creen que sólo es posible programar modelos de cómputo y se les olvida que la máquina donde los escriben es hardware y para el colmo: máquinas de registros) de calidad, eficiente y robusto.

Hay muchos problemas con los frameworks, que trataré de desglosar a continuación y empezando por continuar la idea de las bibliotecas.

Los frameworks son monstruos.

Cuando el Dr Frankenstein puso en práctica sus conocimientos de química para jugar el papel de dios y crear vida, dando origen a su monstruo (que ni nombre tiene); al darse cuenta de lo que había hecho, tuvo un miedo terrible y auténtico. Un miedo que lo llevó a tratar de matarlo y destruirlo; que lo llevó al fin del mundo y luego a la muerte del doctor.

Pasa algo similar con los frameworks… No puedo simplemente vociferar contra ellos y afirmar que sus creadores deberían sentirse mal de lo que hacen, porque en muchos casos se tratan de proyectos de software libre impulsados por las comunidades que fomento, admiro y participo. Pero somos nosotros; los desarrolladores de cualquier índole, los que estamos dándoles un mal uso, abusando de ellos y trayendo sus problemas a nuestro trabajo.

Al ser un conjunto de bibliotecas y al tener un propósito que escala con el número de ellas, se vuelve difícil tanto su diseño; como API, como su integración en sí misma y es común que los usuarios de las frameworks descubran que si llamas ciertas rutinas en un orden particular, causas estados de memoria incorrectos y al final tu aplicación crashea o empieza a producir comportamientos inesperados.

Me gusta la forma en la que Joel on Software habla de esto (aquí la fuente: http://discuss.joelonsoftware.com/?joel.3.219431.12). Usa como analogías los martillos. Hay martillos de muchos tipos y cada tipo de martillo tiene propósitos específicos; como clavar un clavo o encajar estacas especiales en concreto o asesinar a tu exnovia (¿y el dolido?).

Pero crear un martillo universal no es buena idea porqué resulta que lo que tener un martillo que hace de todo, resulta en un martillo con mal desempeño en todas sus funciones.

Aumentan la curva de aprendizaje de una tecnología innecesariamente

Si no eres un experto en redes pero tienes que desarrollar un software que se debe comunicar por red, es posible que uses un framework. No tienes idea de como funcione, pero sabes que si usas ciertas rutinas de configuración, puedes empezar a pasar mensajes a otras rutinas y ¡voila!

En papel y platicado se escucha muy bien y hasta dan ganas de experimentar con diferentes frameworks para desarrollar pronto y fácil diversos tipos de aplicaciones… Hasta que empiezas a aprender un framework.

¿cuanto tiempo puede tomar aprender a usar un framework? Depende de la persona y del framework; pero yo me atrevería a decir que este tiempo puede ir de una semana a unos dos meses. ¿alguien se ha puesto a pensar que es aproximadamente el mismo tiempo en el que podrías haber aprendido a no sé… usar sockets? De hecho, aprender a usar sockets puede tomar solo una tarde (quizá larga, pero si a sabes programar, sólo una tarde sin entrar en detalles).

En este sentido, me gusta como Tomas Petricek nos deja bien en claro que es mejor diseñar y desarrollar bibliotecas antes que frameworks; porque los frameworks, son del diablo (http://tomasp.net/blog/2015/library-frameworks/).

¡Nos están haciendo más flojos de lo necesario! Y además, tontos…

La gente ajena a la programación y el desarrollo de software se está acostumbrando a que la única forma de crear software/hardware (arduino, ¿estas oyendo?) es a través de un framework, y tienen la idea de que programar es tedioso y tremendamente complicado.

Como lo ha dicho antes Linus Torvalds; yo también quisiera que más personas descubrieran lo divertido que es programar.

Los programadores se sienten cada vez menos capaces e interesados por aprender nuevas tecnologías, lo cual terminará por acortar sus vidas laborales mucho antes de lo normal.

¿para que aprender Android si Corona te produce simultáneamente aplicaciones para iOS también? Aprender Android debe ser muy difícil, mejor uso Corona…

Pareciera que los desarrolladores ahora se sienten menos capaces de hacer algo por ellos mismos y prefieren usar algún framework… Vamos chicos, que la satisfacción por un trabajo bien hecha no te la da nadie.

Los framworks y plataformas de desarrollo paralelo siempre van atrás de la demanda real

Y lo entiendo, tener que desarrollar una plataforma que tantas cosas es complicado y resulta en una arquitectura compleja. Pero mientras sale la nueva versión de la plataforma de desarrollo paralelo que soporta la última versión de Androd o iPhone (o las últimas actualizaciones); puede estar dejando a tras a los proyectos que quieren usar las nuevas tecnologías que implementen estas nuevas versiones de las tecnologías objetivos (Android/iPhone en este ejemplo) hasta por 6 meses… Y todo por no querer aprender Java, Objective-C o lo que se necesite…

Este es un problema porque también deja atrás a los desarrolladores que no se acostumbran a los cambios. La plataforma de desarrollo paralelo puede abstraer tan bien las operaciones subyacentes, que la forma de crear aplicaciones en cada versión es casi la misma; mientras que los desarrolladores nativos sabemos que cada versión trae cosas nuevas y en algunos casos, deja morir cosas viejas.

De hecho, aprendí Android inmediatamente después de haber aprendido Java Micro Edition: noté que estaba habiendo un cambio en el mercado y que el número de usuarios en Android parecía crecer mientras que el de Java ME disminuía.

Y fue una experiencia provechosa, haber sabido Java ME primero, me ayudó bastante a entender los conceptos y formas de trabajo de la plataforma Android; siento que en realidad fue un plus y una buena experiencia. Y desde el día que empecé a leer cómo programar en Android, estaba consciente de que un día, vendrá otra cosa y Android quedará olvidado y tendremos frases equivalentes para “¿se acuerdan cuando los celulares no soportaban operaciones de punto flotante por hardware..?”.

De verdad, no debemos tener miedo a aprender cosas nuevas, ni al constante ritmo cambiante de la tecnología. No podemos depender de los frameworks y plataformas de desarrollo paralelo para resolver este problema; porque no sólo llegan tarde, también…

Estamos creando software de mala calidad y además nos atrevemos a cobrar por él

Por diversas causas; como ya he comentado, los frameworks suelen traer bugs y cuando los insertamos en nuestros proyectos; no estamos más que haciendo herencia de sus bugs.

Además, el desarrollar sin comprender las capas subyacentes no nos permiten ni aprovechas sus  fortalezas, ni evitar sus debilidades: dependemos de la plataforma abstracta de trabajo; y no queda más asumir que funciona 100% bien… Lo cual no es cierto del todo.

Es bien sabido por un desarrollador, que es una mala práctica importar bibliotecas que al final no usas, ya que sólo se integrarán al código y lo harán más pesado y en algunos casos, lento. Afortunadamente, muchos compiladores resuelven esto y no incluyen en el código funciones que no se usen nunca. Pero dependiendo la plataforma y la estrategia de trabajo, esto puede ser difícil de evaluar y normalmente incluyen todo.

Esto escala cuando usamos frameworks.

Al ser un conjunto de bibliotecas, traen muchísimas cosas encima y normalmente no vamos a usarlas todas ellas; y por la forma en la que se estructuran: al compilar obtenemos una aplicación inmensa, y por las capas de abstracción; irresponsiva.

Recuerdo cuando empecé a desarrollar en Android y muchos lo criticaban; argumentando que iOS era mejor porque no usaba virtualización. Para mi Android siempre ha sido mejor por diversos motivos; empezando porque es software libre. Pero ahora con un mercado lleno de aplicaciones hechas en plataformas paralelas, iOS sufre de un problema similar por las capaz de abstracción de las plataformas de desarrollo paralelo y los dispositivos Android, parece ser una plataforma más lenta de lo que en realidad es.

En consecuencia, el usuario no disfruta al 100% de la experiencia que le puede ofrecer su dispositivo y los vendedores se cuelgan de esta situación para venderte uno con mejores características de hardware… Entiendo completa y perfectamente el hecho de que las computadoras tienen una vida útil limitada; principalmente por el mal uso de los usuarios y porque conforme avanza la tecnología, el software quiere hacer mejor uso de las nuevas capacidades que un modelo de hace algunos años no soportaba… Ahora parece que el hardware tiene que ajustarse al software (al menos en los móviles).

Esto no es justo. Estamos desangrando sin necesidad a los usuarios y sin ninguna razón ni justificación válida. ¿acaso se nos ha olvidado que también somos usuarios?

Pareciera que producir software de calidad ya no es importante; lo importante es sacarle al usuario todo lo que tenga, así nuestro sistema se una completa porquería.

¿quieren un ejemplo?

La aplicación de facebook. Facebook es una empresa de poder adquisitivo inmenso. Y aún así, se atreven a desarrollar y publicar la aplicación que da acceso a su red social en plataforma de desarrollo paralelo. ¿El problema? no solo es lenta; es inútil. Cuando abres un enlace en la aplicación, encima una pestaña que muestra la página web del enlace. Para esto, usa el navegador por defecto del sistema.

Peor aún. Si la página tiene un enlace a facebook; para los comentarios, para darle like o por alguna razón; ¡abre facebook en el navegador embebido! ¿que les cuesta diseñar correctamente su aplicación para que se cierre la pestaña del navegador y se muestre el contenido en la aplicación! Se supone que quiero la aplicación de facebook porque así navegar por la susodicha red social es más cómodo, rápido y eficiente; pero hey, ¿sabes qué?

Acércate.

Un poco más.

Sin miedo; sí, me falta un tornillo, pero no estoy tan loco.

La aplicación es inútil porque no cumple su propósito. Si quiero ver el contenido en un navegador, mejor uso el de mi preferencia… Y ni eso puede hacer bien. Para el colmo la app es mundialmente famosa por atascar la memoria de cache y pesar muchísimos megas. Ese mal gestión de memoria y excesivo tamaño son el resultado de una compilación en plataforma de desarrollo paralelo (y un grupo de desarrollo con decisiones extrañas). Contraste el desempeño, tamaño y cache de la aplicación de Facebook, con la de Google+ (hint, una de las dos es desarrollo nativo).

Pero las aplicaciones para móviles no son el único sector afectado por esta situación. Hay otro que en lo personal me parece más interesante: los videojuegos.

visage-bug-assasin-screend-unity-03

I’M ERROR UNITY. Screenshot de Assassin’s Creed Unity: un producto de usuario final con etiqueta de precio de venta no negociable.

Tanto los juegos de consola, como los de PC y los de móviles se han visto afectados por este tipo de problemas. ¿recuerdan que Pokémon Go; el juego que parecía el prometido, comenzó a perder usuarios por las constantes fallas y malas decisiones de Niantic? Pues quizá la primera de todas las malas decisiones fue desarrollar un juego de realidad aumentada; que va a exigir mucho a los GPU de los móviles, usando Unity: un framework de peso completo.

pokemon-go-elegido

Pokémon Go, eras el elegido…

Y aún siendo un producto por el que se cobra licencia bajo ciertas condiciones, el soporte para Unity es muy limitado; muchísimo más que para casi cualquier plataforma de dearrollo libre.

Finalmente, tengo que aceptar que hay buenos juegos hechos con frameworks y plataformas como Unity, los cuales acepto que disfruto; pero parecen ser exactamente el tipo de juegos para el que fue diseñado en engine o son suficientemente simples y la plataforma no cumple su promesa de ser general y aún así un juego que nativamente podría pesar apenas lo que los recursos gráficos, sonidos y otros medios, termina pesando hasta 1Gb por también incluir tooodo el engine; aunque no lo use y en tiempo de ejecución así se comportan.

En conclusión

Los frameworks tienen utilidad al desarrollar prototipos; no creo que puedan usarse para publicar productos de usuario final, sin importar que el usuario final sean otros desarrolladores; tanto de software como hardware. Los frameworks nos pueden ayudar a crear software modular, que después debe ser revisado y corregido por expertos en las áreas para las que se utilizó el framework en primer lugar y poder desecharlo.

Los frameworks sirven para ayudar a adentrarse en el desarrollo a personas ajenas a las tecnologías informáticas; como los artistas que desean adentrarse en el desarrollo de videojuegos; y otros interesados.

Pero tarde o temprano; y siempre antes de distribuir un producto, debe de sustituirse el framework por software funcional, probado, eficiente y orientado al propósito que se desea satisfacer.

En lo personal creo que es un insulto hacerme trabajar con frameworks. Si hay algo que se hacer bien, es programar, diseñar y desarrollar sistemas computacionales. Si estoy equivocado, que me aquellos que me conocen y que en cualquier forma hayan trabajdo con migo, me corrijan.

No sé porqué tirar a la basura mi conocimiento y mi trabajo por usar el software que está de moda.

En fin, tratemos de usar los frameworks en casos donde sean realmente necesarios y usar el framework adecuado; que el límite sea la imaginación, no la escasa documentación…. y soporte…. De productos por los que al final tienes que pagar… sigh

Desarrollo tecnológico: trenes de levitación magnética (maglev) operados por computadora

Saludos amigos!

Ha pqsado un tiempo considerable desde mi última publicación. Y para varear les traigo algo de interes tecnológico.

Resulta que estuve trabajando en una propuesta para implementar trenes de levitación magnética como proyecto academico, el cual ha mostrado ser interesante y eficiente.

Anexo a éste post esta el reporte del proyecto para que cualquiera pueda estudiarlo y desarrollarlo.

El sistema desarrollado es básicamente para el control y operación de un maglev de la mabera más simple y económica posible.

Plantea la construcción, operación y funcionamiento de una máquina electrónica digital para operar el tren; el cual debe cumplir con ciertos requisitos de implementación mínimos.

Además, fija las ideas que posteriormente pueden implementarse para la construcción de un monorraíl con esta tecnologia.

El desarrollo es casi 100% teórico, se buscaba construir un modelo funcional, pero por falta de tiempo y dado que eso ya queda fuera de los propósitos de mi área de eestudio, no concluí con el modelo…

Lesdejo unas imagenes referentes a la implementación

image

image

Veran en el documento que se implementó el sistema en un PIC, al cual se le conectaron LEDs en lugar de electroimanes para verificar el funcionamiento y éste ni solo mostro un comportamiento adecuado, si no pasar todas las pruebas. Por lo que el algoritmo de control es completo y correcto.

La idea era que el monorraíl se viera algo así:

image

image

Pero en fin; el desarrollo está 😉

Reporte

Como calcular la regla de la cadena; así sea en un punto dado.

Saludos!

Ahora compartiendoles un pequeño escrito sobre cálculo que hice tratando de resolver una tarea; donde encontré al menos 2 maneras de calcular la regla de la cadena de una función y una tercera que no he podido terminar… Supongo que ninguno de los métodos es inédito así que si alguien sabe como se concluye el que no he podido concluir avíseme porfa!!

 

Regla de la cadena

Números Primos

Ayer escribí una entrada sobre un algoritmo para encontrar números primos y hablo mucho de ellos, pero realmente no defino nada ni entro en tema. Así que creo que es un buen pretexto para en éste momento que tengo mucho tiempo libre y aburrición para hablar un poco sobre los números primos. A diferencia de lo usual no voy a hacer un gran ensayo con profundo análisis… puesto que la verdad me da flojera entrar a la biblioteca aunque esté bajando las escaleras XD

Primero que nada,  debemos restringir nuestro dominio de discución a los números enteros. Recordemos que éste es el conjunto de “números” (lo que sea que eso sea) que contiene a todos los números naturales y además sis inversos aditivos (el conjunto este que se representa con una Z y tiene al 4, 8, 10000, 9999, 666, 1, 0, -6, -354643 y todos los números enteros valga la tautología).

Un número (entero) es primo sí y sólo sí sólo es divisible entre el neutro multiplicativo y su inverso aditivo (i.e. {1, -1}) y el mismo número y su inverso aditivo. A diferencia de lo que dicen las malas lenguas el 1 NO es primo, porque 1 es el neutro multiplicativo en los enteros y no es distinto de sí mismo. Por lo tanto sólo tiene 2 divisores y por definición debería tener 4 muy específicos. Así que si alguien te dijo que el 1 es primo (muy seguramente un profe de primaria o secundaria) A LA HOGERA!!!!!

Nah tampoco.. Mal chiste..

Bueno, bueno… El 2 por ejemplo SI es primo, pues es divisible entre 1 y -1, por 2 y -2 y ningún otro número entero. Creo que estoy pasando por alto la definición de divisibilidad.. Y podría hacerlo ya que de ella hablo MUCHO en mi artículo sobre “Álgebra Modulo 2” pero; ¡qué diablos!

Definición. Divisibilidad. Se dice que un número entero a divide a otro entero b si existe un entero c tal que: a*c = b y se denota a|b.

…Si, tengo flojera de editar una definición bonita con símbolos lógicos y matemáticos.

De la definición, notamos que todo número es divisible por 1, -1 y sí mismo y su inverso aditivo, pues 1|a ya que existe a en los enteros tal que 1*a=a. Luego -1|a ya que existe -a en los enteros tal que -1*-a=a, además a|a ya que existe 1 en los enteros tal que a*1=a y finalmente -a|a ya que existe -1 en los enteros tal que -a*-1=a.

Note de lo anterior que encontrar un primo… No es nada fácil.

El 3 es primo, el 5, el 7, 11, 13, 17, 19… y también …-19, -17, -13, -11, -7, -5, -3, -2. Es un conjunto infinito y la demostración… bueno… La verdad nunca he visto la demostración que nos asegura que el conjunto de los primos es inifinito. Vamos a hacerla de cualquier modo.

Por demostrar. El conjunto de los números primos es infinito.

Demostración  por contradicción. Suponemos que el conjunto de los números primos NO es infinito. I.e. Es finito.

Como el conjunto de los números primos es finito, y además es un subconjunto de los enteros; existe un orden definido en los elementos del mismo. (Estamos presuponiendo que conocemos la relación de orden de los números enteros, que usualmente se usa de manera infija y con la notación a < b que quiere decir “a es menor que b”; así como los abusos de notación con la relación de equivalencia conocida como igualdad donde a <= b quiere decir “a es menor o igual que b”; donde ” o ” refiere a un o inclusivo y además los abusos de notación donde se usa también a > b y a >= b análogamente interpretados y/o definidos).

De lo anterior, entonces podemos encontrar un número en el conjunto de los primos tal que; sea a ese número, a cumple la propiedad de que para todo b en el conjunto de los números primos con b distinto de a, b < a. I.e. el conjunto de los primos al ser finito, tiene un elemento mayor a cualquier otro en ellos puesto que existe un orden total definido. Y además, existe otro c diferente de b tal que c < b, para todo b en el conjunto de los primos.

Como el conjunto de los primos es un subconjunto de los enteros, esto quiere decir que existe un entero arbitrario c del que cualquier otro entero menor que él; ninguno de esos menores es primo, y por otro lado existe otro arbitrario a del que cualquier otro entero mayor que él; ninguno de esos mayores es primo.

Eso quiere decir que existe un intervalo de menos infinito a c; abierto donde todos esos elementos tienen no sólo más 4 divisores, si no que menos; porque al menos esos números son divisibles entre 2; pues cada 1 entero es par y todo número par es múltiplo de 2 (se define número para como usualmente; 2k, con k en los enteros) y pasa lo mismo con el intervalo abierto de a a infinito. Sabemos que c < -11 pues -11 es primo; así como a > 11 pues 11 es primo. Notemos que todos los enteros menores que c tienen más de 4 divisores pues hasta el -8; ya tiene más de 4 divisores: 1, -1, 2, -2, 4, -4; y lo mismo para 8. Por lo tanto ningún número par menor que c es primo y ninguno par mayor que a es primo.

(Ahora sólo nos falta preocuparnos por los números impares, que se definen como usualmente: 2k +1, con k en los enteros).

Bajo éstas hipótesis y conjeturas, observemos que pasa con un elemento de los enteros impar. Notemos que no es divisible por ningún múltiplo de 2 al no ser par. Y sólo es divisible por números menores o iguales que su mitad, excepto por él mismo. De hecho, sólo es divisible por un número estrictamente menor que su mitad, pues de ser divisible por su mitad, sería múltiplo de 2 (i.e. número par).

Observación. Todo número es múltiplo de algún primo (excepto el 1 y el -1), perno ningún número primo es múltiplo de otro número que no sea 1, -1, el mismo y su inverso aditivo. Bajo un pequeño análisis, es posible notar que para comprobar si un número es primo o no, basta con identificar si es divisible por algún primo. Afortunadamente para nosotros, sabemos que el conjunto está acotado por c interiormente y por a superiormente.

Como estamos tomando un número impar fuera de los primos, entonces ES FORZOSAMENTE divisible por alguno de ellos; que no es 2 por supuesto. Entonces, a partir de c y a, podemos construir a los enteros con múltiplos de los primos. Entonces tenemos a todos los pares, que son múltiplo de 2. Tenemos los múltiplos de 3, de 5, de 7… Y así mismo para los negativos. Note que a pesar que existen números múltiplos de primos iguales, así como 6 es múltiplo de 2 y a su vez es múltiplo de 3; o 10 es múltiplo de 5 y a su vez es múltiplo de 2; si tomamos todos sus múltiplos como un conjunto, veremos que la unión de todos ellos generan un subconjunto propio de los enteros!

Contradicción. Pues con el conjunto de los primos acotados, no podemos generar a todos los enteros. :. Existen números que no son divisibles por ningún primo; por lo cual sólo tienen 4 divisores: -1, 1, el mismo y su inverso aditivo.

:. El conjunto de los primo NO es finito.

:. El conjunto de los primos es infinito. QED

Feeling like a boss!

Es difícil imaginar un número entero con cientos de miles de millones de googoles de cifras; y aún éste número no es divisible más que por el 1, -1, el mismo y su inverso aditivo y ningún otro entero. Sorprendente!

…Y sí se que e la demostración doy varias cosas por hecho, y no me detengo a explicarlas, pero en algún momento quizá complete todos esos “hoyos”.

Un simple algoritmo para encontrar números primos

Discutiendo en mi tiempo libre con mi hermano sobre los números primos, él me comentaba que encontrar el siguiente primo de cualquier número es casi imposible; pero yo estuve firme en mi posición de que no era así; sabiendo por supuesto que el conjunto de los números primos es infinito. Entonces sugerimos hacer un algortimo que encontrara el siguiente primo del valor absoluto un número entero dado.

Buscando la mayor eficiencia posible, logramos reducir mucho el tiempo de ejecución que requiere para encontrar el primo que le sigue a un número entero dado. La idea es la siguiente:

  • Si un número NO es divisible por 2, entonces no es divisible por ninguno de sus múltiplos (por ningún número par).
  • Si un número NO es divisible por 3, entonces NO es divisible por ninguno de sus múltiplos.
  • No es necesario comprobar para 4 pues 4 es múltiplo de 2.
  • Si un número NO es divisible por 5, entonces NO es divisible por ninguno de sus múltiplos.
  • Siguiendo ésta idea que es válida; de acuerdo al estudio de la Teoría de Números, específicamente el álgebra modular, para comprobar que un número es primo BASTA con comprobar que no es divisible por ningún primo menor que ese número entre 2; pues un número sólo es candidato a ser divisible por otro si ese otro es menor que su mitad. Para cualquier “otro”, no tiene sentido comprobar divisibilidad porque no lo será (puede demostrarse, refiérase a la teoría de números). Excepto claro, si ese número mayor que la mitad es igual al que se quiere comprobar divisibilidad: Pues todo número se divide a sí mismo.

Recordemos que un número es primo sí y sólo si es divisible únicamente por el valor absoluto del neutro multiplicativo y de él mismo.

Entonces, el programa cuenta con una base de datos que el mismo va creando. El archivo contiene un montón de números primos ordenados de menor a mayor y los va leyendo para comprobar que ninguno de ellos es divisor del número candidato a primo (el número mayor al que fue dato de entrada). Si se acaban los primos para comprobar, genera un primo nuevo y lo almacena en la base y comprueba y así hasta llegar al número entre dos.

Aquí les paso el algoritmo principal:  Nota. Es una version “beta”. Aún falta “sacarle punta”. Presuponemos que el programa sabe cual es el primo más grande en la base de datos y es un atributo llamado “primoMayor” de tipo cadena de caracteres, y una estructura de datos como atributo de nombre “basePrimos” que mantiene la base de datos en memoria.

buscaPrimo(Integer natural)
BEGIN
   IF(natural < 0)
   THEN
      natural *= -1
   END IF
   IF(natural = 0 || natural = 1)
   THEN
      RETURN 2
   END IF
   Integer proximoPrimo <- natural +1
   String cadenaPrimo <- StringValue(proximoPrimo)
   Integer n <- 2
   Boolean pasoLimpio <- FALSE
   IF(proximoPrimo <= IntegerValue(primoMayor))
   THEN
      RETURN buscaPrevio(proximoPrimo) {Suponemos que hay un
algoritmo implementado
que busca el primo previo al numero entero
dado en la base de datos} END IF Iterator i <- basePrimos.getIterator() DO IF(¬pasoLimpio) THEN IF(IntegerValue(cadenaPrimo.substring
(cadenaPrimo.length)) module 2 = 0) THEN proximoPrimo++ cadenaPrimo <- StringValue(proximoPrimo) CONTINUE ELSE IF(cadenaPrimo.substring
(cadenaPrimo.length).equals("5")) IF(proximoPrimo = 5) THEN RETURN 5 ELSE proximoPrimo++ cadenaPrimo <- StringValue(proximoPrimo) CONTINUE ELSE IF(proximoPrimo = 3) THEN RETURN 3 END IF Integer sumaDigitos <- 0 FORALL(Integer index <- 0; index <
cadenaPrimo.length; index++) DO sumaDigitos += IntegerValue
(cadenaPrimo.substring(index, index +1)) END FORALL IF(sumaDigitos module 3 = 0) THEN proximoPrimo++ cadenaPrimo <- StringValue(proximoPrimo) CONTINUE END IF END IF pasoLimpio <- TRUE IF(¬(proximoPrimo module n = 0) & (n < proximoPrimo /2)) THEN n++ FORALL(Integer index <- 0; index < 3; index++) DO IF(i.isThereNext()) i.next() END FORALL WHILE(¬(i.currentElement() = null)) DO IF(n module IntegerValue(i.currentElement()) = 0) n++ i.reset() FORALL(Integer index <- 0; index < 3; index++) DO IF(i.isThereNext()) THEN i.next() END IF END FORALL ELSE i.next() END IF END WHILE ELSE IF(n >= proximoPrimo /2) THEN basePrimos.add(basePrimos.size(), StringValue(proximoPrimo)) primoMayor <- StringValue(proximoPrimo) RETURN proximoPrimo ELSE proximoPrimo++ cadenaPrimo <- StringValue(proximoPrimo) n <- 2 pasoLimpio <- FALSE i.resetear() END IF WHILE(TRUE) {Antes de las críticas. Revisen el algoritmo.
El do - while NUNCA se cicla a infinito.} END. Aquí les dejo unos cuantos resultados en la base de datos:
(Sí, es impresionante: todos son números primos)

2
5’555,567
555,557
777,781
1,009
10,007
101
666,119
5’000,011
7’500,013
8’000,009
850,0007
9’000,011
9’000,041
13
17
19
23
29
31
37
41
9’750,001
83