martes, 13 de diciembre de 2016

Usa Libib para organizar tu colección de libros


Tengo un problema que me encanta: soy adicto a los libros. Cada que veo un libro interesante lo compro y lo agrego a mi colección para leerlo ya sea en seguida o en un momento posterior. Sin embargo, con el crecimiento de mi colección viene otro problema: empiezo a perderle la pista a los libros que tengo.

Buscando alguna solución para ponerle orden a mi biblioteca personal, me encontré con Libib, un fantástico servicio online gratuito que permite organizar colecciones personales no sólo de libros, sino también de música, películas o videojuegos. 

Con Libib podemos crear colecciones de libros e incluir en cada colección todos los títulos que tenemos disponibles; para agregar un título, sólo basta introducir su ISBN para que se haga la búsqueda en la base de datos del servicio y con eso nuestro libro queda añadido a la colección. Luego podemos visualizar todos los libros de nuestra colección en orden alfabético ya sea con o sin detalles.


Para cada uno de los títulos de nuestra colección, contamos con una serie de opciones adicionales como escribir una reseña, calificar su contenido, indicar cuántas copias poseemos, añadir notas, etiquetas y mucho más.


Y eso no es todo, pues Libib cuenta con su propia aplicación para Android e iOS con la cual podemos organizar nuestra colección e incluso nos permite añadir libros con sólo escanear el código de barras que contiene el ISBN de nuestro libro. ¡Es muy sencillo!

El servicio de Libib es totalmente gratuito, aunque cuenta con una versión de paga que nos permite crear más librerías así como usar algunas funciones adicionales.

Definitivamente encontré en Libib justo la herramienta que estaba buscando. Espero que de ahora en adelante sea mucho más sencillo mantener orden en mi biblioteca personal. ¡Vale la pena probarlo!








jueves, 1 de diciembre de 2016

La Navidad de las Máquinas



Dos investigadores de la Universidad de Toronto que trabajan en una red neuronal de aprendizaje que interpreta imágenes un día se preguntaron cómo reaccionaría su plataforma a la música, por lo que la "alimentaron" con más de 100 horas de música pop y luego le pidieron que compusiera una canción basándose en la imagen de un árbol de navidad.

El resultado fue el primer villancico creado por una inteligencia artificial y suena absolutamente escalofriante, escuchen:


Neural Story Singing Christmas from Hang Chu on Vimeo.


Los investigadores aclaran que la computadora no sabe de música y por lo tanto la "canción" puede no tener tanto sentido ni estética musical, pero sin duda es un interesante ejercicio que demuestra el potencial de la inteligencia artificial aplicada a las artes. Imaginen que esta tecnología fuera aplicada a algún servicio de música como Pandora o Spotify para que dichas aplicaciones crearan canciones específicas para cada usuario según alguna fotografía que el mismo coloque en la plataforma. Sería una aplicación por demás interesante.



Fuente: MI-PRO

lunes, 28 de noviembre de 2016

Los cómics podrían salvarnos de la Rebelión de las Máquinas...



Es verdaderamente sorprendente (y completamente terrorífico) lo que la Inteligencia Artifical puede hacer en nuestros días: desde crear su propio algoritmo de cifrado que nadie puede descifrar o crear verdaderas Máquinas de Pesadillas hasta predecir quién es un criminal en potencia con base en sus rasgos faciales. Todos estos avances son impresionantes y, a pesar de su utilidad, podrían representar un grave (y muy real) peligro para la humanidad. Incluso el filósofo y neurocientífico Sam Harris (al igual que muchos otros especialistas del tema) ha advertido que debemos buscar pronto un modo de protegernos de la amenaza de una Inteligencia Artificial que se salga del control de la humanidad y comience a tomar acciones por sí misma que podrían conducir a nuestra aniquilación. Suena a ciencia ficción, pero el peligro es MUY real.



Afortunadamente, un curioso experimento llevado a cabo por un grupo de investigadores de la Universidad de Maryland podría arrojar una forma de defensa ante tal amenaza: descubrieron que una Inteligencia Artificial no puede entender el lenguaje visual de los cómics.

Para dicho experimento, los investigadores alimentaron a la I.A. con más de 1.2 millones de viñetas de la galería de imágenes del Digital Comics Museum y descubrieron que era extremadamente difícil que la I.A. pudiera predecir la imagen o texto de un personaje en un cómic que no hubiera analizado antes. La razón de ello es que los humanos comprendemos el complejo lenguaje formado por las secuencias de imágenes y textos de un modo que una I.A. (todavía) no puede comprender. En palabras de los propios investigadores:

Ninguna de las arquitecturas de IA ha logrado superar a los seres humanos en la tarea asignada, lo que dice mucho de la complejidad de los cómics. Los rasgos aprendidos de otras historietas no logran capturar la enorme variación de estilos de dibujo, y los modelos de interpretación de texto se ven incapaces de procesar la riqueza y ambigüedad de un lenguaje coloquial que además depende completamente del contexto visual.



Aún cuando seguramente en el futuro podría surgir una I.A. que interprete de un modo mucho más eficiente el lenguaje de las viñetas de un cómic, de momento podemos guardar la esperanza de que, de verse dominada por una eventual Rebelión de las Máquinas, la humanidad podría descansar en las habilidades de los creadores del noveno arte para que les ayuden a cifrar sus comunicaciones de modo que una I.A. no los pueda comprender.

Pueden leer todos los interesantes detalles de este curioso experimento aqui.




domingo, 10 de julio de 2016

Patrones de diseño: herramientas fundamentales para el programador



Ya sea que seas un desarrollador de software experimentado o que a penas comiences tus primeros pasos en este apasionante mundo, seguramente en más de una ocasión te toparás con el término "patrones de diseño". O si no lo has escuchado como tal, seguramente ya estás usando alguno sin darte cuenta.

Los patrones de diseño son una de las herramientas más útiles que deben encontrarse en el arsenal de todo programador. Y si bien hay bastantes patrones distintos, no está de más que todo desarrollador conozca, al menos, los más utilizados.


¿Qué son los patrones de diseño?


Los patrones de diseño fueron definidos por primera vez por Christopher Alexander en 1977 de la siguiente forma:

Un patrón describe un problema que ocurre una y otra vez en nuestro entorno, y luego procede a describir la esencia de la solución a dicho problema de un modo tal que uno puede utilizar la solución un millón de veces, pero sin aplicarla dos veces de la misma manera.

Lo interesante de la definición anterior es que Alexander no está hablando sobre diseño de software sino sobre arquitectura (como en la construcción de edificios, casas, puentes, etc.). Tomemos un momento para analizar la definición a fin de comprender su significado.

Un patrón describe un problema que ocurre una y otra vez en nuestro entorno...

En el desarrollo de software, sin importar la aplicación que estemos desarrollando, siempre nos encontramos con la misma clase de problemas: tal vez necesitamos recibir una notificación cuando un proceso termine (como cuando se completa una llamada asíncrona), o tal vez necesitemos ser notificados cuando el estado de una propiedad particular cambie. Tal vez tenemos una API compleja que queremos compartir con otros desarrolladores, pero deseamos que sea fácil interactuar con ella, de modo que no se necesiten comprender los detalles complejos de dicha API. Tal vez queremos añadir funcionalidades aun objeto existente aún cuando no tenemos el código fuente de dicho objeto o somos incapaces de heredarlo (como en el caso de las clases selladas en C#). Tal vez queramos recorrer los elementos de una colección de modo que podamos mostrarlos o realizar alguna otra acción sobre ellos. Estos son sólo algunos de los problemas comunes con los que nos encontramos al desarrollar software, pero puede haber muchísimos más.

...y luego procede a describir la esencia de la solución a dicho problema...

Los patrones de diseño no nos dan una implementación específica, sino que nos describen simplemente las partes que debe incluir una solución y la interacción entre ellas. En otras palabras, son sólo el esqueleto de la solución a problemas comunes en el desarrollo de software. Los patrones de diseño, pues, brindan una solución ya probada y documentada a problemas de desarrollo de software que están sujetos a contextos similares.

...de un modo tal que uno puede utilizar la solución un millón de veces, pero sin aplicarla dos veces de la misma manera.

Este es un aspecto importante de los patrones de diseño: nosotros elegimos cómo implementarlos. Los patrones son conceptuales en naturaleza, por lo que su implementación concreta depende de la necesidad particular que queramos resolver. Por ejemplo, en el mundo de la arquitectura podemos tener un problema común: la necesidad de colocar un techo sobre un espacio abierto. Para resolverlo, podemos contar con diferentes patrones de techo: abovedado, con arcos, plano, de dos aguas, etc. Y cuando vamos a cada uno de estos patrones, podemos encontrarnos con aplicaciones más especificas para cada uno; por ejemplo, si elegimos el techo de dos aguas, este puede ser piramidal, en forma de cruz, con capo, etc. Y aún cuando seleccionemos uno de estos patrones, no tenemos todavía una implementación particular del mismo, como las consideraciones sobre la superficie a cubrir, los materiales a usar, los ángulos en los que se levantarán los techos, etc. Dada su naturaleza conceptual, los patrones de diseño serán interpretados e implementados de manera diferente por personas diferentes. No hay ningún problema en ello, pues los patrones sólo nos muestran la esencia de la solución y no sus detalles particulares.





Partes de un patrón de diseño.


Los patrones de diseño se encuentran descritos usualmente en catálogos, libros y artículos especiales sobre el tema y siempre poseen varios elementos en comun:


  • Nombre del patrón. Este es el nombre particular con el cual se identifica al patrón en las conversaciones entre desarrolladores. Algunos ejemplos de nombres de patrones de diseño son: Fábrica abstracta (Abstract Factory), Método de Fabricación (Factory Method), Fachada (Facade), Observador (Observer), Singleton, Cadena de Responsabilidad (Chain of Responsibility) entre muchos otros.
  • Descripción del problema. Como descubrimos en la definición de Alexander, existen problemas comunes en el desarrollo de software con los que nos toparemos en más de una ocasión, y en esta parte del patrón se define dicho problema a detalle.
  • Solución al problema. Consiste en la descripción de los elementos que conforman el diseño de la solución incluyendo las relaciones entre ellos, sus responsabilidades y la forma en que colaboran entre si para resolver el problema. Recordemos que esta es sólo la esencia de la solución y no una implementación concreta. Le toca al desarrollador determinar qué implementación es la más apropiada para un problema específico.
  • Consecuencias. Cada patrón tiene un costo, el cual es frecuentemente ignorado. Como desarrolladores acostumbramos hablar de las ventajas de un patrón en particular y de cómo representa la solución perfecta a un problema. Pero la realidad es que cada beneficio tiene un costo asociado. Cuando se trata de patrones de diseño, el costo suele ser un incremento en la complejidad de nuestro código. Debemos conocer bien las consecuencias de un patrón para sopesarlas cuidadosamente contra los beneficios de su implementación.



Clasificación de los patrones de diseño

Dado que el desarrollo de software es una disciplina que se encuentra en constante evolución, existen muchos patrones de diseño distintos que se aplican a distintos problemas comunes. Sin embargo y a pesar de su diversidad, los patrones de diseño pueden clasificarse en tres grandes grupos:

  • Patrones creacionales: Tratan sobre la mejor forma de instanciar, inicializar y configurar objetos en una aplicación.
  • Patrones estructurales: Se utilizan para separar la interfaz de la implementación. Se ocupan de cómo las clases y objetos se agrupan, para formar estructuras más grandes.
  • Patrones de comportamiento: Se usan para definir cómo las clases y los objetos interactúan entre ellos.



Esta clasificación aparece por primera vez en el libro Design Patterns: Elements of Reusable Object-Oriented Software, escrito en 1994 por un grupo de autores conocidos como The Gang of Four: Erich Gamma, Richard Helm, Ralph Johnson y John Vlissides. Este libro se ha convertido en el referente obligado sobre el tema y permanece vigente hasta hoy, por lo que debería formar parte de la biblioteca personal de cualquier desarrollador de software.

¿Por qué usar patrones de diseño?

Existen varias razones por las cuales un desarrollador debe aprender, comprender e implementar el uso de los patrones de diseño en su práctica diaria de escritura de código:


  • Los patrones de diseño son soluciones probadas. Alguien más listo que nosotros ya analizó el problema y desarrolló una solución. No hay necesidad de que reinventemos la rueda. Lo mejor que podemos hacer es comenzar con la solución de alguien más y ajustarla a las necesidades específicas de nuestra aplicación.
  • Los patrones de diseño nos proveen un vocabulario común. Todas las profesiones poseen términos especializados que emplean para comunicar conceptos específicos entre especialistas. Los patrones de diseño le dan a los desarrolladores de software esa misma clase de lenguaje especializado. Un vocabulario común nos permite usar lenguaje preciso cuando nos comunicamos con otros desarrolladores.
  • Hablar de patrones de diseño anima a otros desarrolladores a investigar y aprender sobre el tema. Después de todo, si un desarrollador escucha a otros hablando sobre el patrón de fachada y cómo resultó ser una buena solución para una aplicación particular, entonces dicho desarrollador probablemente será lo suficientemente curioso como para averiguar qué es ese patrón y por qué es tan bueno. Esto ayuda a difundir el uso de los patrones de diseño en nuestra industria y, por lo tanto, a mejorar la calidad del software que construimos.


En conclusión

El uso de patrones de diseño nos ayudará a estandarizar nuestro código de modo que sea más entendible para otros programadores (y aún para nosotros mismos). Si nunca has usado patrones de diseño, es hora de comenzar a hacerlo.


Enlaces




Aprende lo que quieras ¡en sólo 20 horas!



Josh Kaufman es un autor que se dedica a escribir sobre temas como emprendimiento, administración personal, fundamentos de negocios y otros temas bastante útiles. También ha invertido una buena parte de su tiempo investigando cómo ser más eficientes cuando se trata de adquirir nuevas habilidades y conocimientos.

En su libro "En sólo 20 horas. Aprende lo que quieras de manera rápida", Kaufman describe un proceso de 4 pasos que nos puede ayudar a aprender las habilidades necesarias para desempeñarnos de manera más o menos eficiente en cualquier cosa que deseemos aprender: desde cómo programar una computadora hasta dibujar, tocar la guitarra o navegar en velero.

El método de Kaufman se divide en 4 pasos:

1. Fragmentar la habilidad


Cada habilidad puede ser fragmentada y dividida en pequeñas habilidades, de las cuales sólo debemos enfocarnos en las que son estrictamente necesarias y descartar las que no nos ayudarán en nuestro objetivo. Mientras más descompongamos las habilidades, será más fácil identificar aquellas que realmente necesitamos.


2. Aprender lo suficiente para poder autocorregirse

El siguiente paso es recopilar información sobre la habilidad que queremos desarrollar. Aquí entran los libros, páginas web, cursos, etc. Este aprendizaje tiene que estar enfocado en las pequeñas habilidades que se detectaron en el paso anterior. No se trata de pasar horas y horas leyendo, sino que se debe determinar aquello que realmente es necesario aprender. 


3. Eliminar las barreras que no nos permiten practicar

En este paso se deben eliminar todas las distracciones que podrían atentar contra nuestro propósito y desconcentrarnos de la práctica. Por eso, durante los momentos de entrenamiento, debemos alejarnos de la televisión, internet, smartphones y todas las cosas que son un obstáculo al momento de sentarse a trabajar. Cuanta más voluntad tengas para deshacerte de  las barreras que te impiden practicar, más posibilidades habrán de que realmente puedas hacerlo.


4. Practicar al menos 20 horas

Por último, aunque suene reiterativo, debes cumplir con las 20 horas de entrenamiento. Kaufman señala que la parte más difícil de esto es vencer la barrera de la frustración. Esta es una limitante que nosotros mismos nos ponemos. Es la fase en que sabemos que somos incompetentes e inútiles en lo que queremos hacer y es la razón más potente que nos lleva a desertar. Lo importante es no darse por vencido y lograr superar esta barrera. Kaufman dice que el mayor obstáculo para aprender algo nuevo no es intelectual, como muchos piensan, sino que es emocional.



En el siguiente video pueden ver una charla completa de Josh Kaufman describiendo este proceso e incluso mostrando cómo él mismo lo aplicó para aprender a tocar el ukulele. La charla tiene una duración de casi 20 minutos y pueden activarse los subtítulos en español.




¿Qué es lo que quieren aprender?


Enlaces:




jueves, 30 de junio de 2016

Orígenes VIII: Las antiguas unidades de cinta magnética



Cada día vemos nuevos y emocionantes avances en el campo de la tecnología informática, de modo que su avance parece ir cada día más rápido dejando obsoleto lo que a penas hace unos años se consideraba como vanguardista. Y cuando volteamos a ver a la tecnología que reinaba durante los (en realidad ni tan) lejanos años 50-60 del siglo pasado, no podemos sino asombrarnos con lo mucho que han cambiado las cosas desde entonces.

Tal es el caso de las enormes máquinas que se empleaban para leer cintas de datos en aquellos años, como la unidad de cinta magnética IBM 729 que data de 1959, la cual pueden conocer a detalle en el siguiente video, el cual muestra una de esas míticas unidades en funcionamiento dentro del Museo de Historia de la Computación (pueden activar subtítulos en inglés):



¡Cómo han cambiado las cosas!

jueves, 23 de junio de 2016

¿Como convertirse en un desarrollador web? - eBook gratis


El sitio Web Code Geeks se especializa en compartir recursos para desarrolladores web, tanto los que a penas van iniciando en este mundillo hasta los más avanzados. Entre los muchos tutoriales y tips que comparten, destacan algunos eBooks gratuitos que pretenden ser manuales de introducción rápida al desarrollo web: desde los fundamentos de lenguajes como HTML o CSS hasta lenguajes de programación de backend como PHP o Ruby. 

El eBook que les recomiendo hoy será particularmente útil a quienes pretenden iniciarse en el desarrollo web. Se titula "How to become a web developer?" y en tan sólo 15 paginas cubre temas como:

  • ¿Qué hace un desarrollador web?
  • Pasos para convertirse en un desarrollador web
  • "Dos and Don'ts" del desarrollo web
  • Tendencias actuales
Definitivamente es una lectura fundamental para quien desee convertirse en desarrollador web o para quien simplemente tiene la curiosidad de saber qué hace uno en realidad.

Pueden leer (y descargar) el PDF gratuito en este enlace, aunque vale la pena registrarse al newsletter de Web Code Geeks para recibir acceso a muchos otros eBooks gratis y a sus excelentes tutoriales y tips.




Enlaces:

Aprende a programar apps para Android... ¡gratis!


Gracias a Internet, hoy es más fácil que nunca adquirir nuevos conocimientos y habilidades: desde aprender a planchar una camisa (créanme, en YouTube hay tutoriales para hacerlo) hasta programar aplicaciones sencillas y complejas para dispositivos móviles.

Ahora, gracias a una alianza entre Google y Udacity, podemos aprender a programar aplicaciones para Android mediante el curso "Android development for beginners", el cual es totalmente gratuito, aunque ofrece la opción de obtener un título (y otros beneficios) si se paga una cuota mensual de 199 usd.



El curso ha sido desarrollado por gente de Google, por lo que los contenidos que obtendremos vienen directamente de la compañía origen del sistema operativo, lo que garantiza que aprenderemos contenidos muy pertinentes. Además, está diseñado para principiantes, por lo que requiere muy pocos conocimientos previos para poder iniciar a estudiarlo. Si aun así sienten que necesitan aprender los prerrequisitos más esenciales, Udacity también ofrece gratuitamente los cursos introductorios para prepararse mejor.



En México, el salario mensual promedio de un desarrollador de aplicaciones Android es de 24,000 pesos (segun el más reciente estudio de salarios de profesionales de IT en México de la revista Software Guru) mientras que en países como EU, el salario anual promedio ronda los 94,000 dólares. Bastante bien como motivación para animarse a entrarle a aprender esta tecnología que pareciera estar hasta en los calcetines.

Si se animan a tomar el curso con todo y certificación, pueden entrar en este enlace. Pero si lo suyo es tomar sólo las clases del curso completo de manera gratuita, entren por acá.



Enlaces:








viernes, 8 de abril de 2016

Bing añade una fabulosa herramienta para desarrolladores



Sin duda alguna Bing, el buscador de Microsoft, está lejos de ser un rival digno para el aparentemente omnipotente Google. Sin embargo, de vez en cuando a los de Redmond se les ocurren muy buenas ideas y esta es una de ellas.

Se trata de una interesante característica del buscador que será de bastante utilidad a quienes nos dedicamos al desarrollo de software. Y es que en más de una ocasión acudimos a los todopoderosos motores de búsqueda buscando algún snippet para alguna tarea simple y repetitiva que podamos implementar sin mayores complicaciones. La mayoría de las veces, nuestra búsqueda nos lleva a foros de ayuda como Stack Overflow en los cuales solemos encontrar lo que buscamos.

Pero ahora Bing, en colaboración con HackerRank, ha incluido en los resultados de búsqueda un editor de código interactivo cuyo resultado puede ejecutarse directamente desde esa página para entender cómo funciona. Si, por ejemplo, busco "array C#" en Bing, obtengo algo como esto:



Cabe mencionar que por ahora la funcionalidad regresa resultados para los lenguajes C, C++, C#, Python, PHP y Java (aunque incluirán más en el futuro) y que para que podamos ver estos resultados debemos especificar nuestra ubicación como EU y el lenguaje inglés en las preferencias del sitio, a las cuales accedemos mediante el ícono de un engrane ubicado en la esquina superior derecha.

Dudo mucho que alguien cambie de Google a Bing por esto, pero no deja de ser una herramienta bastante útil a tener en cuenta.






miércoles, 6 de abril de 2016

Rembrandt vuelve a pintar... con una computadora.

Puede que Rembrandt haya muerto en 1669 pero ahora, gracias al proyecto The Next Rembrandt, su genialidad vuelve a la vida (al menos en parte) con el trabajo de un conjunto de historiadores, desarrolladores de software, científicos, ingenieros y analistas de datos, quienes durante 18 meses enfocaron sus esfuerzos en "destilar el ADN de la obra de Rembrandt" mediante el análisis de cientos de las obras del artista, pixel por pixel, con el objetivo de imitar lo más cerca posible los trazos y las técnicas de Rembrandt.



¿El resultado? Un retrato de un hombre caucásico con vello facial, de entre treinta y cuarenta años, que usa ropa negra, un collar blanco y un sombrero, realizado con un estilo extremadamente similar al de Rembrandt.






Si bien el trabajo del algoritmo no es 100% correcto, sí es lo bastante cercano como para hacernos notar el avance de la tecnología de análisis de datos y su potencial para crear obras artísticas con el mero uso de técnicas computacionales avanzadas.



Enlace: The Next Rembrandt





jueves, 11 de febrero de 2016

Tema obscuro para las herramientas para desarrolladores de Chrome



Una de las peticiones más recurrentes que ha recibido el equipo de desarrollo de Google Chrome es la de un tema oscuro para las herramientas para desarrolladores que se incluyen con el navegador.

Pues bien, las plegarias de los developers han sido escuchadas y a partir de la versión 50 del navegador, se incluirá la posibilidad de cambiar el tema a su versión oscura para utilizarlas con más comodidad en esas jornadas nocturnas de desarrollo que solemos tener la mayoría de los devs.




Además del tema oscuro, se incluirá la posibilidad de usar variables CSS para hacer más efectiva nuestra labor como desarrolladores web.


Fuentes: TNW, Google Developers




jueves, 21 de enero de 2016

Crea logos gratis con estos útiles sitios web

Crear un buen logotipo es un arte que pocos dominan. Y es que no sólo se necesita saber manejar algún programa de diseño como Illustrator o CorelDraw, sino que se debe tener la habilidad de saber combinar formas, colores y tipografías para que el logo transmita el mensaje adecuado. Usualmente, la chamba de creación de logotipos se la dejamos a los diseñadores gráficos.

Pero si no tienen uno a la mano o si no tienen recursos para invertir en pagarlo, aquí les presento 3 útiles sitios web en los cuales podemos crear y personalizar nuestros logotipos de manera extremadamente sencilla y lo mejor: totalmente gratis. ¡Chéquenlos!

1. Squarespace logo
Basta con introducir el nombre de nuestra empresa para que Squarespace nos muestre un logo minimalista que podemos personalizar con íconos, fuentes, colores, etc. Incluso nos muestra una vista previa de cómo se vería nuestro logo en una tarjeta de presentación, sitio web o playera. Muy simple y útil.

2. Zillion Designs Free Logo Maker


Este útil sitio nos permite elegir una plantilla de logotipo en base a la categoría a la que pertenece nuestra empresa; una vez seleccionado un diseño, podemos personalizarlo añadiendo el nombre de nuestra empresa, cambiando formas, colores, fuentes, efectos y un sinnúmero de opciones en una herramienta bastante completa para generar el mejor logo posible.




Similar a las anteriores, pues con sólo introducir el nombre de nuestra compañía y la categoría a la que pertenece obtenemos cientos de propuestas de logotipos que podemos personalizar hasta el más mínimo detalle. Cuenta con el plus de tener versión en español, por si la lengua de Shakespeare no se les da mucho.



¿Cuál de estos sitios les pareció la mejor opción? ¿conocen algun otro que deba estar en este listado? ¡Déjenmelo saber en sus comentarios!






lunes, 9 de noviembre de 2015

Comparte presentaciones de PowerPoint en Facebook y Twitter



Microsoft ha lanzado, a través del equipo de Microsoft Garage, un plug-in para Office llamado Social Share, el cual permite compartir presentaciones de PowerPoint en Twitter o Facebook en forma de imagenes, galerías de fotos o videos.

A través de este plug-in, también es posible dar seguimiento o responder a usuarios que han interactuado con el contenido compartido, ya sea en Facebook o Twitter.

En este video corto pueden ver el sencillo funcionamiento de Social Share:









Aprende a programar con Star Wars



Code.org es una organización no lucrativa cuya misión es fomentar el aprendizaje de la programación por parte de niños de todo el mundo. A través de cursos sencillos e iniciativas como la "Hora del Código", los niños pueden aprender los conceptos básicos de programación de computadoras para que descubran que cualquiera puede aprender a programar de una manera fácil y divertida.

Grandes nombres de la tecnología han aportado recursos para que esta Code.org lleve a cabo su labor, entre los que se cuentan a Microsoft, Google o Facebook. Y ahora, Disney ha decidido colaborar también permitiendo el uso de los personajes de Star Wars, y en especial del droide BB8, para enseñar a los niños a programar. Vean la introducción del curso:



Sin duda esta interesante iniciativa servirá para interesar a cada vez más niños en el mundo de la programación de computadoras, un campo en constante crecimiento y que cada vez demanda más y más profesionales dedicados a tal labor.



Enlace: Code.org





Orígenes VII: Hedy Lamarr, la actriz e inventora que cambió la historia



Aunque es más conocida por sus incursiones en el cine, la actriz austriaca Hedy Lamarr también fue una pionera en el campo de las comunicaciones inalámbircas tras emigrar a los Estados Unidos durante la Segunda Guerra Mundial. Lamarr, junto al inventor George Anthiel, desarrolló un "Sistema de Comunicaciones Secretas" para ayudar a combatir a los Nazis. El invento evitaba que los mensajes clasificados fueran interceptados por ejércitos enemigos manipulando frecuencias de radio a intervalos irregulares entre la transmisión y la recepción, formando asó un código inquebrantable que evitaba la desencriptación de los mensajes.

Lamarr y Anthiel recibieron una patente de su invento en 1941, pero su enorme significado no fue comprendido sino hasta varias décadas después. Primero fue implementado en buques de guerra durante la Crisis de los Misiles en Cuba y posteriormente en muchas otras aplicaciones militares. Pero aún más importante es el hecho de que la tecnología de "amplio espectro" que Lamarr ayudó a inventar propiciaría el 'boom' de las comunicaciones digitales, creando los fundamentos que permiten el funcionamiento de los teléfonos celulares, las máquinas de fax y otras operaciones inalámbricas (como el Wi-Fi y el Bluetooth).

Como sucede con muchas famosas mujeres inventoras, Lamarr recibió muy poco reconocimiento por su talento innovador en su tiempo, pero recientemente ha sido reivindicada y alabada por su invención. En 1997, ella y George Anthiel fueron honrados con el premio "Pioneer Award" de la "Electronic Frontier Foundation (EFF)". Asimismo, Lamarr se convirtió en la primera mujer en recibir el "BULBIE™ Gnass Spirit of Achievement Award", un prestigioso premio que es comparado con el "Oscar" para inventores.

Demostrando que era mucho más que sólo otra cara bonita del cine, Lamarr rompió todos los estereotipos de su tiempo y se ganó su lugar entre las mujeres inventoras más importantes del siglo XX y cuya visión tecnológica estuvo muy adelantada a su tiempo.

Hoy, Google ha dedicado un bonito doodle a Hedy Lamarr en el 101 aniversario de su nacimiento. Sin duda una mujer ejemplar y excepcional a quien debemos mucha de la tecnología que hoy usamos día a día.


jueves, 1 de octubre de 2015

Microsoft te enseña a crear aplicaciones universales para Windows 10 ¡gratis!


Si alguna vez han deseado iniciarse en el desarrollo de aplicaciones para Windows pero no tienen absolutamente ninguna experiencia, Microsoft les tiene una solución.

A través del blog de Windows, la compañía ha puesto a disposición de todo el que quiera aprender el curso llamado "Windows 10 development for absolute beginners". Como su nombre lo indica, el curso (proporcionado en inglés, por supuesto) va orientado a principiantes absolutos, aunque se asume que el participante tiene algún conocimiento básico del lenguaje C#. Ahora bien, si no cumplen con este prerrequisito no hay problema, pues también está disponible una serie de videos de entrenamiento en C# para principiantes absolutos.

El curso trata sobre la creación de apps Universales para Windows que pueden funcionar por igual tanto en PCs como en teléfonos, tablets e incluso dispositivos como el Xbox y los próximos HoloLens. El contenido se divide en dos partes. Primero el enfoque se centra en aprender las habilidades básicas para la creación de apps simples. Después, se centra en el desarrollo de cuatro apps completamente funcionales:
  • Un tablero para reproducir sonidos divertidos cuando se hace clic en un icono
  • Una aplicación para mostrar el clima con mapas incluidos
  • Un juego para reconocer portadas de discos
  • Una enciclopedia de personajes de Marvel (usando la API oficial de Marvel Comics) que incluye integración con Cortana.


Además, en las lecciones aprendemos desde la planeación y la codificación de una aplicación hasta la publicación de nuestra app en la Windows Store.

Esta es sin duda una gran oportunidad para aprender de manera gratuita los fundamentos del desarrollo de apps para Windows 10 y vale la pena aprovecharla.


Enlaces: 





Skype integra traducciones en tiempo real



A través de su blog oficial, la gente de Skype anuncia la incorporación de las funciones de traducción en tiempo real para la app de Skype para Windows. Con esta actualización se incluyen seis lenguajes de voz (Inglés, Francés, Alemán, Italiano, Mandarin y Español) y 50 lenguajes para conversaciones escritas para traducciones instantáneas en nuestras conversaciones.

Esta fabulosa característica convierte a Skype en una aplicación de mensajería todavía más eficiente y podemos verla en acción en el siguiente vídeo corto:



La actualización de Skype para incorporar las funciones de traducción ya está disponible y se irá instalando en nuestros equipos en los próximos días. Sabremos que la nueva función está disponible cuando veamos que se muestran los iconos de traducción en la parte superior derecha de la ventana de conversación:





Fuente: Blog de Skype



martes, 29 de septiembre de 2015

Color Hunt, nuevas paletas de colores cada dia

Color Hunt es un curioso pero muy útil sitio web de reciente creación cuya finalidad es muy simple: proporcionar a los visitantes ideas de paletas de colores diferentes cada día. Esto es especialmente útil cuando necesitamos encontrar la combinación perfecta de colores para un diseño, sitio web, logotipo, etc.

El funcionamiento del sitio es extremadamente simple: desde que accedemos al sitio web podemos ver una gran cantidad de combinaciones de colores sugeridas por otros visitantes así como su nivel de popularidad, medido en 'likes'. Si queremos ver las combinaciones mejor votadas por los usuarios, basta con hacer clic en la sección "Popular" para ver el listado de las paletas más gustadas. Nosotros mismos podemos votar por cada una de las combinaciones haciendo clic en el icono de corazón situado debajo de cada paleta de colores.



Para ver los detalles de cada combinación, basta un clic en cada una de ellas para conocer los códigos RGB de cada uno de los colores que forman la paleta para que podamos usarlos en nuestro editor gráfico favorito.


También podemos colaborar en el sitio creando nuestras propias paletas de colores y poniéndolas a disposición de otros visitantes para que voten por ellas. Al hacer clic en "Create" accedemos a la interfaz para definir cada uno de los colores de nuestra paleta sugerida.



Todo esto puede hacerse de modo totalmente gratuito e incluso sin necesidad de crear una cuenta de usuario. Cabe destacar que el sitio es bastante nuevo (a penas tiene 1 mes de existencia) pero ya cuenta con una gran cantidad de visitantes (más de 100,000 según su blog).

También a través de sus cuentas sociales en Facebook y Twitter los creadores de Color Hunt hacen algunas sugerencias de paletas de colores basadas en escenas naturales como esta belleza:


Color Hunt es en definitiva uno de esos sitios que debería tener un lugar entre nuestros favoritos, pues seguramente nos sacará de más de un apuro cuando se trata de hacer algún diseño.


Enlace: Color Hunt







lunes, 28 de septiembre de 2015

Lógica de programación (31) - Operaciones con vectores



Como ya mencionamos en la lección anterior, un vector es una secuencia ordenada de elementos. A fin de cuentas, los vectores son variables con las que podemos realizar diferentes operaciones como son:
  • Declaración
  • Asignación/Escritura de valores
  • Recorrido
  • Actualización
  • Ordenación
  • Búsqueda


En esta lección daremos un recorrido por las primeras cuatro de estas operaciones y dejaremos la Ordenación y la Búsqueda para lecciones posteriores.

Declaración

Por lo general, un array se declara en la sección de variables de un programa. La forma de declarar un array de elementos de un determinado tipo es muy variada en los distintos lenguajes de programación. Sin embargo, para los efectos de este curso, esta es la sintaxis que estaremos siguiendo:

array[num] de tipo : nombre_array

donde
  • num es la cantidad de elementos que tendrá el array
  • tipo es el tipo de datos de los elementos del array (entero, booleano, cadena, etc)
  • nombre_array es el nombre del arreglo


Asi pues, la expresión:

array[10] de entero : números

representa la declaración de un arreglo de 10 elementos de tipo entero, cuyos índices irán del 0 al 9.

Una vez declarado el arreglo, nos es posible acceder a cada uno de sus elementos usando el nombre del arreglo seguido del índice del elemento al cual deseamos acceder, como lo estudiamos en la lección anterior.

Asignación/Escritura de valores

Una forma de asignar valores a un elemento del vector es mediante la instrucción de asignación simple; por ejemplo, la expresión números[3] <- 5 asigna el valor 5 al elemento de índice 3 dentro del vector números.

Otra forma de hacerlo es usando la instrucción leer() como con cualquier otra variable, por ejemplo:

leer(números[0])
leer(números[1])

En cada una de las dos formas descritas podemos asignar valores a sólo uno de los elementos del vector a la vez. Si quisiéramos asignar valores a todos los elementos del vector, tendríamos que recurrir a estructuras repetitivas como en el siguiente ejemplo, en el cual usamos un ciclo desde para asignar a cada uno de los elementos del vector números un valor dado por el usuario:

algoritmo Ejemplo_Vector
var
    array[10] de entero: números
    entero: i
inicio
    desde i <- 0 hasta 9 hacer
        escribir("Proporciona un valor para el elemento con índice " + i + " del arreglo: ")
        leer(números[i])
    fin_desde
fin


Recorrido (acceso secuencial) del vector

Lo que hicimos en el ejemplo anterior fue un recorrido del vector para escribir datos en él. Se le llama recorrido a la operación de efectuar una operación general sobre todos los elementos del vector, ya sea escribir datos o leer su contenido. Estas operaciones se realizan utilizando estructuras repetitivas, cuyas variables de control se usan como índices del vector. El incremento del valor de la variable de control permite que podamos acceder secuencialmente a cada uno de los elementos del vector.

Complementaremos el ejemplo anterior para incluir ahora un recorrido de lectura que se efectuará inmediatamente después de que el usuario haya terminado de introducir valores en el vector.

algoritmo Ejemplo_Vector
var
    array[10] de entero: números
    entero: i
inicio

    //Asignar valores a cada elemento del vector
    desde i <- 0 hasta 9 hacer
        escribir("Proporciona un valor para el elemento con índice " + i + " del arreglo: ")
        leer(números[i])
    fin_desde

    //Recorrer el vector para mostrar los números introducidos
   desde i<-0 hasta 9 hacer
        escribir(números[i])
    fin_desde

fin


En este otro ejemplo solicitamos al usuario un conjunto de 15 calificaciones que almacenamos en un vector. Luego recorremos ese vector para calcular la suma de todas las calificaciones y finalmente calculamos y mostramos el promedio de las mismas:

algoritmo Promedio
var
    array[15] de real: calif
    entero: i
    real: suma, promedio
inicio
    //Asignar calificaciones al vector
    desde i <- 0 hasta 14 hacer
        escribir("Escribe una calificación")
        leer(calif[i])
    fin_desde

    //Recorrer el vector para calcular la suma de las calificaciones
    suma <- 0
    desde i <- 0 hasta 14 hacer
        suma <- suma + calif[i]
    fin_desde

    //Calcular y mostrar el promedio
    promedio <- suma / 15
    escribir("El promedio de las calificaciones proporcionadas es " + promedio)
fin


Actualización

La actualización de un vector puede constar a su vez de tres operaciones elementales que son: añadir, insertar o borrar elementos.

Añadir datos consiste en agregar un nuevo elemento al final del vector. La única condición necesaria para llevar a cabo esta operación es que exista espacio suficiente en el vector para recibir al nuevo elemento, es decir, que el vector no esté lleno. Si esta condición se cumple, basta con referirnos a la posición en la que deseamos insertar el nuevo elemento para agregarlo. Ahora bien, si esta posición no se conoce y se desea agregar un elemento nuevo al final del vector verificando de antemano si existe lugar para ello, puede realizarse con un algoritmo como el del siguiente ejemplo:

algoritmo Añadir
var
   array[5] de cadena: colores
   entero: i
inicio
   //Asignar algunos valores al arreglo 'colores'
   colores[0] <- "verde"
   colores[1] <- "rojo"
   colores[2] <- "azul"
   
   //Insertar un nuevo color al final
   desde i<-0 hasta 4 hacer
      si (colores[i] <- nulo) entonces
         colores[i] <- "amarillo"
         interrumpir
      fin_si
   fin_desde
fin

En el ejemplo anterior recorremos el arreglo colores hasta encontrar una casilla cuyo valor sea nulo y en ella insertamos un nuevo color, terminando el recorrido en el proceso. Una vez que termina el algoritmo, nuestro arreglo contendrá los siguientes elementos:

colores[0] = verde
colores[1] = rojo
colores[2] = azul
colores[3] = amarillo
colores[4] = *nulo*

Si bien esta no es la única forma de insertar un nuevo elemento en un arreglo, es una solución sencilla y rápida para lograrlo.

A diferencia de la operación de Añadir, cuando ejecutamos una operación  Insertar lo que buscamos es colocar un nuevo elemento dentro de un arreglo en una posición específica y no necesariamente al final del mismo. En este caso aplica la misma condición que con la operación Añadir: debe existir espacio suficiente en el arreglo para insertar un nuevo elemento. Con unos pequeños ajustes, podemos emplear el algoritmo del ejemplo anterior para demostrar la operación de inserción:

algoritmo Añadir
var
   array[5] de cadena: colores
   entero: i
inicio
   //Asignar algunos valores al arreglo 'colores'
   colores[0] <- "verde"
   colores[1] <- "rojo"
   colores[3] <- "azul"
   
   //Insertar un nuevo color al final
   desde i<-0 hasta 4 hacer
      si (colores[i] <- nulo) entonces
         colores[i] <- "amarillo"
         interrumpir
      fin_si
   fin_desde
fin

Este algoritmo inserta algunos valores en las posiciones 0, 1 y 3 del arreglo y luego lo recorre para insertar un nuevo elemento en la primera posición vacía que se encuentre (en este caso, será la posición 2), quedando finalmente nuestro arreglo con los siguientes elementos:

colores[0] = verde
colores[1] = rojo
colores[2] = amarillo
colores[3] = azul
colores[4] = *nulo*

Finalmente, la operación de Borrar consiste en eliminar de un arreglo un elemento ya sea indicando su posición dentro del mismo o realizando primero una búsqueda y eliminando el elemento una vez que se ha localizado dentro del arreglo. Existen varias formas de realizar el borrado de un elemento de un arreglo, pero dejaremos los ejemplos para cuando aprendamos a realizar búsquedas dentro de un vector.


ACTIVIDADES DE APRENDIZAJE


  1. Escribe un algoritmo que lea los valores de 100 temperaturas y a partir de ellas: (a) Calcule y muestre el promedio de las temperaturas y (b) muestre todas las temperaturas que se encuentran por encima del promedio.
  2. Escribe un algoritmo que te permita calcular la desviación estándar del conjunto de temperaturas del problema anterior, sabiendo que la desviación se calcula con la fórmula siguiente:


     


Enlace: Índice del curso




Copyright © Mi rincón del código Compartido por Gooyaabi Templates | Powered By Blogger

Design by Anders Noren | Blogger Theme by NewBloggerThemes.com