Subscribirse al RSS Feed
(CodeAR)

codeAR es un Agregador de Noticias que intenta capturar los blogs de los desarrolladores Argentinos. Para saber que piensan, que están desarrollando, que están leyendo, que están imaginando.
Si tenes un blog sobre desarrollo de sistemas o relacionado al tema, te invitamos a participar de este Planeta, envianos un mail con la dirección de tu blog.

Imperdibles (octubre 15th – octubre 21st)

desde Hipertextos (desde La Plata) por Christian Silva

Algunos vínculos interesantes que voy coleccionando en Delicious

  • Data Visualization with JavaScript – It’s getting hard to ignore the importance of data in our lives. Data is critical to the largest social organizations in human history. It can affect even the least consequential of our everyday decisions. And its collection has widespread geopolitical implications. Yet it also seems to be getting easier to ignore the data itself. One estimate suggests that 99.5% of the data our systems collect goes to waste. No one ever analyzes it effectively.
  • Por una ley de encuestas (Uruguay) – La aplicación de probabilidad elemental muestra que los resultados que publicitan las encuestadoras son tan erróneos como improbables. Es imperiosa la promulgación de una Ley de Encuestas que defienda a la sociedad de semejante abuso.
  • PreD8 – This distribution aims to pull in many of the modules that have been gobbled up into D8 core, giving you close to feature parity with the upcoming release.
  • Alfabetismo transmedia: un programa de investigación – Los cruces entre medios y educación son muchos y no siempre han funcionado. En la primera parte de este post repasaré muy rápidamente algunos de esos cruces para después centrarme en un proyecto de investigación internacional dedicado a los alfabetismos transmedia (transmedia literacy).
  • The Guide to UX Design Process & Documentation – A master collection of frameworks, examples, and expert opinions at every stage. The process and byproducts of building great products quickly and thoroughly as researched across the web and practiced by industry leaders.

Conferencias en Argentina: Ruby, Python, Smalltalk, PHP, Uqbar, JSConf

desde Angel "Java" Lopez por lopez

Esta es la época de las conferencias, en la primavera de mi pais, Argentina. Tenemos para todos los gustos. Las que tengo presentes son:

RubyConf 2014
http://rubyconfargentina.org/
Octubre 24, 25, Buenos Aires

PyCon 2014
http://myconference.co/pyconar2014/
del Jueves 13 de Noviembre al Sábado 15, Rafaela, Santa Fé

Smalltalks 2014
http://www.fast.org.ar/smalltalks2014
Noviembre 5 al 7, Córdoba, Córdoba

PHP Conference 2014
http://2014.phpconference.com.ar/
Noviembre 7 y 8, Buenos Aires

Uqbar WISIT 2014
http://www.uqbar-project.org/events/wisit-2014
Noviembre 28 y 29, 2014, Buenos Aires

JSConf 2014
http://www.jsconfar.com/
Noviembre 29, Buenos Aires (parece que es un solo día)

Nos leemos!

Angel “Java” Lopez
http://www.ajlopez.com
http://twitter.com/ajlopez

Pure feeling

desde Gastón Ramos por Gastón Ramos

La otra vez escuchando una entrevista a la nueva banda “Resistencia” antes llamada “Resistencia Suburbana” escuché que el nuevo batero antes tocaba en una banda de Brasil llamada “Pure Feeling”, se me ocurrió buscar esta banda en youtube, como siempre. La verdad me encantó, es el tipo de Reggae que más me gusta, bien Hipnótico, creo que la definición sería Root Reggae, pero no estoy seguro.


Tagged: gustos, musica, reggae

D3 en sandro

desde aurelianito por aurelianito (noreply@blogger.com)
Basándome en la integración a sandro de domino, y el módulo comoTeDire, ¡hice andar d3 en el server en sandro! Con esto espero que podamos generar SVGs y visualizaciones indistintamente en cliente y server, y también quiero basar el sistema de templating de sandro en eso.
¿Alguien quiere financiar el proyecto? ¡Ya sandro hace cosas que ningún otro framework hace!

0-day para FreePBX

A inicios del mes se descubrió una vulnerabilidad en el FreePBX, uno de los entornos web de programación de una centralita Asterisk, y que ha sido catalogado como 0-day.

Una vulnerabilidad 0-day indica que es super critica, que tiene que ser algo resuelto ahora, que se deben tomar medidas de seguridad urgente porque estamos susceptible a ataques.

Con este bug es posible tomar control administrador sin tener que autenticarnos y luego se podrá tener acceso total a la central telefónica y la posible ejecución de comandos.

La vulnerabilidad es para todas las versiones de FreePBX y como medida de contingencia hay que bloquear el acceso web a terceros de nuestra red.

Estuve leyendo un foro sobre el tema y comentan que hay detectado robots que van escaneando las redes en Internet para encontrar centrales IP vulnerable para luego atacarlas.

Como medida simple de protección es solo necesario bloquear el acceso web de la central y solo dejar los de la VoIP únicamente abierto.

  • Para esto hay que bloquear el TCP 80 para redes externas de nuestra red interna
  • Abrir unicamente y si es necesario los puertos SIP/5060 y RTP/10000-20000

Recuerden que es 0-day y si tienes una centralita asterisk de cara a internet puedes ser atacado!

Mas información sobre la vulnerabilidad en el sitio de FreePBX

La entrada 0-day para FreePBX aparece primero en Un Sanjuanino en Rio Cuarto.

Domino en sandro!

desde aurelianito por aurelianito (noreply@blogger.com)
Acabo de hacer el primer POC de manejo del DOM en el server con el mismo API que en el cliente. Para eso, porté domino a mi sistema de módulos e hice un POC.
¡Esto está tomando forma! ¿Cuántos frameworks web hay que puedas hacer código de presentación que corra tanto en el cliente o en el server?

¿Quién quiere ser early adopter?

Un buen regalo

desde aurelianito por aurelianito (noreply@blogger.com)
Dentro de poco es mi cumpleaños, así que hay personas que están pensando en qué regalo hacerme (espero!). Para ayudar o quizás complicar a ell@s, voy a escribir lo que creo que es un buen regalo.
Un buen regalo es aquel que l@ agasajad@ no compra pero querría tener.
Esto tiene dos corolarios:
  • Generalmente un juguete es un buen regalo para un@ niñ@, ya que no tienen plata y generalmente les gustaría tener juguetes.
  • Salvo que seas millonari@, es muy raro que tu presupuesto para un regalo exceda la cantidad de plata que una persona adulta puede gastar en sí misma.
Entonces, ¿cómo se hace un buen regalo a un@ adult@? Encontrando algo que l@ agasajad@ querría tener pero no compraría. Voy a dar ejemplos:
  • Cosas que no se consiguen en la ciudad donde vive l@ agasajad@.
  • Cosas que es ilegal comprar.
  • Cosas que son imposibles de comprar.
  • Cosas que no se permite comprarse pero pensás que querría tener.
    • Incluye cosas que l@ agasajad@ dice que no quiere pero pensás que le gustaría hacer/tener.
  • Cosas que no conoce, pero vos sí, y que pensás que querría tener.
  • Cosas que vos sabés dónde comprar y l@ agasajad@ no.
Cosas es en sentido amplio, o sea, pueden ser también servicios y actividades. Por ejemplo, a una amiga le regalaron un día en un spa para su cumpleaños hace poco.
Estas reglas descartan rápidamente la mayoría de los libros y discos. En mi caso solo regalame uno de ellos solamente si pensás que me interesaría particularmente.

Y si no encontrás nada, un buen abrazo y un "feliz cumpleaños" es mucho mejor que un regalo de compromiso ;). Ya que es algo que no puedo comprar pero quiero tener.

¿Qué es un buen regalo para vos?

Abrazo,
Aureliano.

Módulos AMD en sandro

desde aurelianito por aurelianito (noreply@blogger.com)
Ayer implementé en sandro módulos AMD, como los de requirejs. Esto debería hacer más fácil el uso de bibliotecas que usen commonjs. Acá les dejo el changeset donde está la implementación (con tests!).

Happy hacking,
Aureliano.

Imperdibles (octubre 14th – octubre 15th)

desde Hipertextos (desde La Plata) por Christian Silva

Algunos vínculos interesantes que voy coleccionando en Delicious

  • Si cada vez más internautas bloquean la publicidad, ¿por qué los anuncios siguen dando tanta guerra? – La publicidad web puede convertirse en la pesadilla de los navegantes, así que muchos deciden cortan de raíz: la única solución pasa por instalar un complemento en el navegador que inhabilite los anuncios. Desde el año pasado, hay un 134% más de usuarios españoles que recurren a esta medida de bloqueo. Las campañas invasivas en internet tienen cada vez menos audiencia, pero no todas las marcas pueden permitirse recurrir a la creatividad para promover acciones más respetuosas.
  • Colegios de la UNLP: debutó con algunas fallas la inscripción digital #ux – La nueva modalidad de inscripción a los colegios de la Universidad, que requiere rellenar una planilla de preinscripción por internet, no resultó sencilla para muchos padres, que se vieron obligados a llamar a los establecimientos -o a concurrir personalmente- para quitarse dudas. Dudas que, directamente, no les permitían completar el formulario.
  • Datafest 2014: En la Rural de Palermo – El 31 de octubre y 1 de noviembre, LA NACION y la Universidad Austral (Facultades de Comunicación e Ingeniería) realizarán la tercera edición del Datafest, el primer evento de apertura, minería y visualización de datos públicos del país, que en 2012 y 2013 reunió a más de 300 participantes.
  • 35 Useful HTML5, JavaScript Tools and jQuery Plugins – Web development is always play a dynamic role in the internet world. There is lots of HTML5 tool, J-query plugins and Javascript resources are available on the web to get started with the latest development in the Web. In this post we come with the cool collection of 35 useful web development tools and resources that you can use in your daily project building and to serve your clients best

Imperdibles (octubre 10th – octubre 14th)

desde Hipertextos (desde La Plata) por Christian Silva

Algunos vínculos interesantes que voy coleccionando en Delicious

  • Creating Your First Prototype with Framer – No longer can your product just be usable and look good. Beautiful, subtle movement enhances the user experience and makes products more engaging, dynamic, and memorable. Paul Stamatiou, designer for Twitter, recently wrote that motion design is now a required skill for designers.
  • Technarte 2015, Conferencia Internacional de Arte y Tecnología. Call for Papers 2015 – Technarte lanza una nueva convocatoria de ponencias para su nueva edición del 2015 coincidiendo con el 10º aniversario de las Conferencias. Estamos buscando ponentes que quieran mostrar al mundo sus creaciones innovadoras en las que la tecnología es la protagonista en alguna etapa de su proceso de creación o producción.
  • Crowdfunding, la modalidad 2.0 para financiar emprendimientos – Conseguir dinero es, probablemente, el principal obstáculo con que se topa la producción cultural en el país, en especial en lo que se refiere a proyectos independientes. Pero no solo en ese ámbito. Muchas personas también tienen dificultades para conseguir un capital inicial con el que comenzar sus emprendimientos. Sin embargo, desde hace un tiempo internet ofrece una solución. Libros, revistas, películas, documentales, obras de teatro o incluso un pequeño negocio de crochet o de manualidades pueden encontrar ese puntapié material con el que ser concretados gracias al crowdfunding.
  • VOSE (Documental interactivo) – Versión Original Subtitulada en Español · Documental interactivo que apropiándose de diálogos de películas, juega con las relaciones entre palabras e imágenes y los nuevos sentidos que genera su mezcla. ¿Por qué se van nuestros ojos tras los subtítulos sin que nos demos cuenta? Hagamos como Rembrandt, miremos a los seres humanos atentamente.

Emacs, show trailing whitespace

desde Gastón Ramos por Gastón Ramos

Hace un tiempo que estaba buscando una forma de mostrar los trailing whitespaces en emacs y no encontraba una forma decente de hacerlo, hasta el momento estaba usando

 whitespace-mode

pero me mostraba muchas cosas que yo no quería, cómo los saltos de línea y los espacios en blanco, todos, no sólamente los trailing. La solución es esta, agregar esta línea al init.el:

;; show trailing whitespaces                                                                               
(show-ws-toggle-show-trailing-whitespace)

Además podemos configurar una combinación de teclas para eliminar los trailing whitespaces:

(global-set-key (kbd "C-c x") 'whitespace-cleanup)

El cable submarino que le brinda internet a la Argentina

Allá por el 2008 había escrito sobre un video de como se extienden los cables submarinos por el mundo y las herramientas, robots y demás que se utilizan en la tarea.

Hoy día el portal MinutoUno ha colocado un artículo que explica como le llega a la Argentina uno de los cables submarinos que tiene, particularmente habla del punto de Las Toninas, lugar donde llega la fibra óptica submarina.

El cable del cual habla el artículo es el de Level3, uno de los carrier mas grande del mundo, el cual hace unos años compro a Global Crossing, otro gran carrier que por cierto tenía presencia mundial y varios cables submarinos por ahí; al momento de la compra / fusión, Level3 aumento su tamaño y su red también.

En la nota se comenta que el cable de fibra óptica tiene unos 7cm de diámetro con 4 pares de pelos -fibra óptica- que logran transferir unos 1.6TB por segundo. También informa sobre que sucede cuando se corta un cable y como es el proceso de detectar dicho corte y su reparación. Por suerte en Argentina si se llega a cortar uno de los cables submarinos internacionales del Atlántico, tenemos contingencia por el lado del Pacifico vía Chile.

Esta buena la nota para leerla y enterarnos uno poco mas sobre como nos llega el internet a nuestro país.

Vía MinutoUno

La entrada El cable submarino que le brinda internet a la Argentina aparece primero en Un Sanjuanino en Rio Cuarto.

Imperdibles (octubre 8th – octubre 9th)

desde Hipertextos (desde La Plata) por Christian Silva

Algunos vínculos interesantes que voy coleccionando en Delicious

  • El software como hecho cultural – A partir de la lectura del libro Software takes command de Lev Manovich –disponible online en formatos Word y PDF– emerge una nueva cuestión: la necesidad de realizar estudios culturales sobre el software.
  • Understanding UX Skills – User experience design is a multidisciplinary field. A well-designed product must be visually appealing and simple, and easy to understand, learn, and use. Creating a well-designed product is an endeavor that requires technical skills — an understanding of computer science, human computer interaction, and visual perception and cognition — and tremendous creativity. User experience requires analytical thinking directed toward a great user experience, and that user experience has to be grounded in a deep understanding of what people need, how they think, and why they behave the way they do.
  • Tim Berners-Lee, el creador de la WWW, en defensa de la neutralidad de la red – Tim Berners-Lee el creador de la World Wide Web, subraya la gran importancia que tiene un acceso neutral al contenido albergado en la red y que los usuarios tengan mayor control sobre cómo las compañías y gobiernos usan sus datos.
  • Upgrade Your Brain: Resources for Coding Beginners – Anyone who’s paying attention these days has probably figured out that computer programming is fast becoming the new standard of literacy in our technology-driven economy.

Resoluciones del Nuevo Mes: Octubre 2014

desde Angel "Java" Lopez por lopez

Hora de escribir las resoluciones del nuevo mes. Pero antes, repasar las de septiembre:

- Aktores con ejemplo distribuido [completo] ver repo
- AjErl con ejemplo distribuido [pendiente]
- Soporte web y ejemplo para RuScript [parcial] ver repo
- Completar Mochy [parcial] ver repo
- Mejorar RSharp [completo] ver repo
- Trabajar con NodeJs en los temas Deep Learning, Internet of Things, Artificial Intelligence [pendiente]
- Trabajar en Code Generation usando AjGenesis para Node [completo] ver repo principal ver repo Express ver repo Sinatra ver repo Laravel
- Trabajar en Liqueed Project [completo] ver repo

También estuve trabajando en:

- Mejorar AjScript [completo] ver repo
- Refactor BasicScript tests para usar SimpleUnit [completo] ver repo
- Crear SimpleColls, simple collection functions in JavaScript, alone or a la Linq [completo] ver repo
- Refactor SimpleStore tests para usar SimpleUnit [completo] ver repo
- Mejorar AjTalkJs, Smalltalk in JavaScript, soporte de primitiva super, primeros ejemplos Express 4 [completo] ver repo
- Refactor MProc tests para usar SimpleUnit [completo] ver repo
- Refactor AjLogoJs tests para usar SimpleUnit [completo] ver repo
- Refactor SimpleKeeper tests para usar SimpleUnit [completo] ver repo
- Refactor SimpleTags tests para usar SimpleUnit [completo] ver repo
- Mejorar SimpleUnit, publicar nueva versión [completo] ver repo
- Refactor SimplePipes tests para usar SimpleUnit, y publicar nueva versón [completo] ver repo

Las resoluciones de este nuevo mes:

- Dar una charla de introducción a Aktores, actor model distribuido en C#
- Armar AjErl ejemplo distribuido
- Más ejemplos Express en AjTalkJs
- Explorar redes neuronales en JavaScript
- Explorar algoritmos genéticos en JavaScript
- Explorar otros temas de Inteligencia Artifical en JavaScript
- Más Aktores distribuidos
- Comenzar Distributed Smalltalk en AjTalkJs

Nos leemos!

Angel “Java” Lopez
http://www.ajlopez.com
http://twitter.com/ajlopez

La mudita & Windows 8.1

laMuditaHace un tiempo que tengo una máquina nueva dando vueltas pero que por una cosa u otra no me decidía a pasarla a “producción”.

La máquina en si es una Acer Aspire M5-481T, pero le puse LaMudita porque el sistema de sonido no le funciona (recientemente descubrí que sí le funciona el sonido por HDMI, así que tan mal no está la cosa). Viene con un I3 y 4Gb de RAM, los cuales en poco tiempo se convirtieron en 6Gb que es lo máximo que admite.

El principal problema de la máquina es su sistema operativo, el cual sobrevivió a las primeras 48hrs de estar conmigo gracias a su característica uEFI. Básicamente me complicó tanto bootearla desde otro sistema operativo que no fuera Windows, que me dió tiempo a encontrarle utilidad a tenerlo instalado (punto para la gente de marketing de MS).

Dado que estoy teniendo problemas con los programas desktop viejos en Windows 8.1 (siempre hay algo que no les funciona), el tener una máquina para desarrollar con esto me gustó bastante. Para el día a día, podría tener Ubuntu en una máquina virtual y tendría lo mejor de los dos mundos en un equipo extremadamente portatil (mi otra maquina tiene 17″).

Pero a mi falta de práctica en el mundo Windows, se sumó una intefaz de usuario totalmente cambiada (algo parecido a lo que pasó con Ubuntu y Unity). Bastante perdido, los primeros días me la pasé aprendiendo atajos de teclado y personalizando la intefaz (el nuevo menú de programas es al día de hoy que sigue sin gustarme).

El problema empezó cuando intenté montar una infraestructura de desarrollo usando vagrant+fabric+virtualbox2. La instalación en Windows da para un post aparte, que en algún momento publicaré. Mi primer intento fue el de instalar todo esto en una máquina virtual con ubuntu a fin de mantenerme trabajando igual que antes del cambio de máquina, pero francamente no pude hacer funcionar la conexión ssh con el servidor creado por vagrant. Tras navegar un poco, parece que es un error común con los usuarios Windows, así que pasé al plan B. Instalar todo en Windows.

La instalación en Windows tuvo sus bemoles, pero finalmente quedó andando. Los servidores se instalaron y parecieron funcionar… hasta que llegué al servidor que tiene Nginxs. Hasta este momento no encontré la forma de evitar un error de archivo inexistente que me aparece cada vez que quiero levantar el servicio. La instalación es correcta y la VM funciona perfectamente en MAC y Linux, pero sobre Windows hay problema. Tras ver en Google que el problema es bastante común con Windows, voy a tener que ver cómo solucionarlo de alguna manera poco ortodoxa (o montando ese servidor en otra máquina o pasando todo el desarrollo a otro equipo).

En resumen, llevo aproximadamente quince días siendo usuario de Windows, y sigo sumando. La experiencia me demostró que para el usuario promedio Windows 8.1 no es tan malo como lo pintan, pero que para el desarrollador  “promedio” es excesivamente controlador (ni a la BIOS se puede acceder sin pasar por el SO), generando problemas sin sentido en las aplicaciones. Si bien todavía se mantiene firme como SO base, no descarto la posibilidad de tenerlo virtualizado y volver a linux como sistema base, pero para eso falta un tiempo, ya que los dolores de cabeza que me está dando hoy día son los que quiero tener frescos para la actualización de los viejos programas a Windows 8.1

 

Imperdibles (septiembre 29th – octubre 6th)

desde Hipertextos (desde La Plata) por Christian Silva

Algunos vínculos interesantes que voy coleccionando en Delicious

  • La tecnología que nos aísla – A comienzos de septiembre, Verizon, uno de los principales operadores de móviles de Estados Unidos, dio discretamente a conocer un nuevo servicio llamado Auto Share. Su lanzamiento está previsto para finales de año y convierte en algo trivialmente fácil reservar y abrir un coche de alquiler por medio de un teléfono inteligente: basta con escanear y validar un código QR que hay en el parabrisas.
  • La dimensión política ignorada de cultura digital – En esta segunda década del siglo XXI se viene consolidando un discurso crítico de la fase más comercial del digitalismo. Considero a esta visión muy valiosa para entender la evolución tecnológica con una mirada de mayor perspicacia, que ponga en perspectiva la brecha entre la rápida evolución tecnológica con la lenta adaptación cognitiva, y alerte a la opinión pública sobre los NUEVOS problemas de la cultura digital. Algunos de estos teóricos críticos son Cass Sunstein, Lev Manovich, Evgeni Morozov, Nicholas Carr, Jaron Lanier, Andrew Keen, Umberto Eco, Ulrich Beck, por citar solo algunos fuera del exitismo digital.
  • Big Data ¿Cómo gestionar la gran ola de información en pos del negocio? – En tiempos de pleno crecimiento de la información, de la mano del auge expansivo de Internet, cómo trabajan las compañías para sacar el mayor provecho posible de esta tendencia llamada Big Data para mantener el negocio de forma eficaz, hacerlo sustentable e incrementar los ingresos.
  • The Next Big Thing In Responsive Design | Co.Design | business design – Responsive design, which allows designers and developers to build websites that adapt to every screen size, is one of the most empowering web tools to be adopted in the last decade. "Responsive philosophy is not just about designing websites that adapt to screen size." But adapting to the screen is only the first frontier of a new, responsive web. Today, users expect online experiences that not only respond to what device they're using, but also their location, time of day, what they’ve already read, and events happening in real time. To capture a user’s attention for the next generation of the web, you’ll need more than just responsive design. You’ll need a responsive philosophy.
  • Arduino, la revolución de las placas azules que se gestó en un bar italiano – Revolucionar el 'hardware' libre es lo que han conseguido Massimo Banzi, David Cuartielles y los otros tres cofundadores de Arduino, que jamás imaginaron la dimensión global que iba a adquirir su proyecto cuando, en 2005, comenzaron a trabajar en una placa barata y sencilla para enseñar electrónica a los alumnos del Instituto de Diseño Interactivo de Ivrea. El nombre homenajea a un bar, pero también a un rey, y el azul salió de las paredes de una antigua fábrica de Olivetti.

Code Coverage y Calidad de Código

desde Angel "Java" Lopez por lopez

Voy a usar directamente la expresión en inglés “code coverage” para lo que en español es cubrimiento de código. La pregunta de hoy es ¿hay relación entre un gran nivel de code coverage y calidad de código?

Primero, el code coverage es una métrica: simplemente eso, ni más ni menos. Si conseguimos el porcentaje de code coverage luego, digamos, de ejecutar todos los tests del sistema, un alto porcentaje con todos los tests en verde sólo indica que al ejecutar los tests pasamos por una gran cantidad de líneas de nuestro código, sin provocar un error.

Pero cualquiera que se ponga a meditar sobre eso, no puede concluir así por que sí, que eso indique una buena calidad de código. Bien podemos imaginarnos código que cumpla con todo eso (buen métrica, pruebas que pasan) y que NO TENGA UNA BUENA CALIDAD de código. Por ejemplo, bien podemos refactorizar todo el sistema para que el código quepa en una clase, con cientos de métodos, y el code coverage seguirá alto y las pruebas pasarán. Y así se nos pueden seguir ocurriendo refactorizaciones, que bajen la calidad de código, sin que la métrica de code coverage se vea afectada en gran medida.

Tenemos que ponernos de acuerdo en qué es calidad de código, pero para este post, podemos tomar algunas cualidades:

- Que el código ejecute lo que se espera
‘- Que sea modificable/extensible de una forma accesible

Vean que no pongo que sea “entendible” porque me imagino que esa cualidad es un requisito de la segunda que puse arriba. La primera cualidad se puede dividir en:

- Que el código de el resultado esperado ante las entradas correctas
- Que el código reaccione de la manera esperada ante las entradas incorrectas

y así podríamos seguir refinando. Igual es tema para discutir. Pero aún no podemos esperar, con las cualidades de arriba u otras que se nos ocurran, que ante un gran nivel de code coverage obtengamos, de forma casi mágica, una buena calidad de código.

Entonces, si alguien espera que subiendo el code coverage de una aplicación/sistema/librería, escribiendo pruebas para subir esa métrica, de esa forma vamos a obtener/mejorar la calidad de código, les digo una cosa: es loable lo suyo, pero es tan inútil como alinear las sillas en la cubierta del Titanic. Están haciendo algo que parece bueno, pero no es lo que hay que hacer.

Alguien podría decir: ¿pero acaso las pruebas que acompañan al aumento de code coverage, no nos aseguran que el código inicial tenga la calidad esperada? Si hacen las pruebas DESPUES de escribir el código, muchas veces eso no se cumple. Porque se van a ver motivados a elevar la métrica, no la calidad del código. Pongamos un ejemplo en concreto. Sea un método que recibe los argumentos a y b, y revuelve a/b (su división). Al principio no está cubierta, agregamos una prueba que invoca a ese método pasando a=1, b=2 y vemos que devuelve 0.5. Ahora el code coverage subió, de 0 a 100%. Las pruebas pasan. Pero no tenemos idea de haber cubierto los (MINI)CASOS DE USO de ese método. Por ejemplo, nunca probamos que pasa cuando b=cero.

Ese es uno de los problemas de los “pruebas después”. No se cubren los casos de uso de nuestra aplicación. Y si encima nos dejamos guiar por aumentar el code coverage, menos vamos a concentrarnos en los casos de uso. Y si siguen el camino “pruebas después” también se encontrarán, más frecuentemente de lo necesario, que el código ya armado es difícil de probar, o lo van a modificar de formas extrañas para que podamos tener la recompensa del día: uy! aumentamos el code coverage! ¡Qué buenos programadores que somos, qué buena calidad de código!

No me malinterpreten: el code coverage sirve, pero NO ASEGURA calidad de código. Ni siquiera la mantenibilidad de un sistema. No es difícil encontrar sistemas con alto code coverage, uno los modifica, las pruebas pasan, pero luego, el sistema web vuela luego de dos clicks en las páginas. ¿Por qué? De nuevo, porque el code coverage alto y las “pruebas después” no aseguran para nada que hayamos contemplado todos los casos de uso (como el simple de más arriba, dividor por b igual a cero, el método tiene 100 por ciento de code coverage, pero no tiene el 100 por ciento de los casos de uso).

Algo de valor agrega el subir el code coverage, porque al final, alguna de las pruebas adicionales algo nuevo cubre. Pero es lo que alguien ha llamado “pica pica bajada de cordón (de vereda)”, trabajo que agrega poco valor en general a lo que programamos, y que lleva tiempo.

Bueno, luego de esta larga diatriba, algo de agua para mi molino:

Si en vez de intentar subir el code coverage con pruebas después, seguimos el FLUJO DE TRABAJO de Test-Driven Development, el code coverage alto es como que viene de la mano de ese flujo de trabajo, sin gran esfuerzo. Si aplicamos ese flujo a cubrir cada caso de uso, vamos construyendo software que va creciendo, como un organismo, paso a paso, de la manera más simple, y asegurándonos que cada prueba que agregamos responde a una necesidad del sistema que estamos armando. El código va fluyendo, naciendo, transformándose, y la etapa de refactor es de importancia para aumentar la calidad, no para el code coverage.

Espero que se haya entendido: sin TDD, no hay paraíso :-)

Nos leemos!

Angel “Java” Lopez
http://www.ajlopez.com
http://twitter.com/ajlopez

Cortando la cola del pavo

desde Angel "Java" Lopez por lopez

Había una vez una familia que se reunía una vez por año, para celebrar juntos. La dueña de casa solía cocinar al horno un pavo relleno. Una receta que habia pasado de generación a generación, por vía oral, especificaba qué colocarle, cuánto tiempo cocinarlo, cómo preparar el relleno. Pero había algo que hacía siempre: cortarle la cola al pavo. Alguien preguntó: “¿Por qué hay que cortarle la cola al pavo? ¿Por qué está esa instrucción en la receta?”. Sorprendentemente, la cocinera sólo atinó a responder: “No sé, así lo hacía mi mamá, así me lo enseñó”. Fueron a preguntarle a la madre: “No sé, a mí también me lo enseñó así mi mamá”. Le preguntaron a la abuela: “Yo tampocó sé, así me lo enseñó mi mamá, en mi infancia”. Y al final, llegaron a la bisabuela: “Bueno, cuando vivíamos en Europa, en una casita en el campo, el pavo no entraba en el horno, y teníamos que cortarle la cola”.

¿Cuántas veces nos pasa, en nuestras actividades, profesionales o no, “cortar la cola al pavo”, sin notar que las fuerzas que llevaban a esa conducta ya desaparecieron?

Para poner un poco de contexto, veamos un ejemplo en el desarrollo de software. Cuando aparecieron las primeras microcomputadores, no había discos duros, solamente discos flexibles. Y muchas veces, la computadora sólo tenía disponible una dispositivo de discos flexibles (la “diskettera”). Recuerdo un sistema de sueldos y jornales, a principio de los ochenta. A fin de año había que calcular por empleado cuánto tenía que abonarse de aguinaldo. La ley había cambiado: ya no era un monto asociado al último sueldo, sino lo que había cobrado por cada cada mes. No había forma que un disco flexible tuviera toda esa información. Así que el operador, para calcular el aguinaldo, tenía que introducir y retirar uno por uno los discos de las liquidaciones mensuales. Eran las limitaciones de esos tiempos.

Y en minicomputadores, los discos duros no eran el último lugar de resguardo. Se usaban cintas, para sacar copias de los programas y los datos.

Desde los “mainframes” fue llegando la implementación de bases de datos (relaciones, jerárquicas, en red, aunque sólo sobrevivieron las primeras; la nueva “onda” de NoSQL no es tan nueva :-). Y la próximas implementaciones de los sistemas en computadores personales pasaron a usar bases de datos, en general relacionales.

Y siguió el progreso. Pero algo quedó de resabio, de reliquia, algo como “cortar la cola del pavo”: hoy se piensa en tener todo en la base de datos. Pero hoy tenemos gran cantidad de memoria disponible. Muchas veces, podemos tener nuestro dominio TOTALMENTE en memoria, y muchos casos de uso son de “muchas lecturas, escrituras esporádicas”. Pero en vez de aprovechar directamente la memoria (vean que puse TODO el dominio en memoria, no estoy hablando de “cache” selectivo), todavía se inicia el desarrollo de un sistema viendo el esquema de base de datos.

No digo que sea aplicable a todos los casos, pero en muchos sistemas, la base de datos (o el disco, al final), es la “nueva cinta”: la forma de resolver la persistencia. Pero la operación bien podría hacerse completamente en memoria. Aún en memoria distribuida. Por ejemplo, en Facebook, en su implementación, todo es un objeto (una persona, una relación, un mensaje, una foto, …), y se almacena en un sistema que llaman TAO (de The Abstract Object). Usan MySql (muchas bases) sólo para persistencia. La operación la resuelvan en memoria: TAO corre en multitud de máquinas distribuidas en varios data center, y usa MySQL principalmente para persistencia, y replicación, apenas para el negocio.

No hace falta ser Facebook para aprovecharse de “primero la memoria”, en vez de “hay que cortar la cola del pavo, hay que usar base de datos relacionales”. En un sistema que estuve examinando, con un caso de “muchas lecturas, pocas escrituras”, pude implementar el caso de uso principal en memoria, quedando CUATROCIENTAS VECES más rápido (no digo 400 por ciento, digo 400 VECES). Y otro proceso, que tardaba en el orden de las ocho horas, paso a ejecutarse en minutos, adoptando un modelo en memoria.

Y ése es sólo un ejemplo. Ahora, agua para mi molino:

Test-Driven Development (TDD), al empujarme, como flujo de trabajo, hacia la implementación más simple, casi como que me impide complicarme con soluciones que níngún caso de uso pidió. Sólo se adopta una base de datos relacional, o un NoSQL, cuando el caso de uso lo pide. Y siguiendo TDD he notado que esa decisión, que puede ser diferida, aún cuando se tome, se puede cambiar en el futuro. Por eso soy escéptico cuando alguien quiere plantear cuáles herramientas usar ANTES DE PASAR por los casos de uso.

Con el caso de uso “nuevo horno más grande” desde el principio, nunca se llega a implementar “cortar la cola del pavo”.

Nos leemos!

Angel “Java” Lopez
http://www.ajlopez.com
http://twitter.com/ajlopez

Colectivos Rio Cuarto, aplicación si vives en la ciudad

Un proyecto que surgió de unos estudiantes de la Universidad Nacional de Rio Cuarto -UNRC- terminó siendo una aplicación con un gran potencial.

Esta aplicación llamada Colectivos Rio Cuarto, que también puede ser consultada vía web, permite conocer el horario y los recorridos de los colectivos urbanos de la ciudad.

A través de Google Maps se puede seleccionar una linea en particular y conocer las calles por las que hace su recorrido, así también como el horario del mismo.

Según comenta la página, la idea surgió entre los creadores en momentos de tiempo libre y deliberar propuestas para desarrollar una aplicación para Android.

Los datos con lo que se ha realizado la aplicación fueron obtenidos de la empresa SAT -Sociedad Anónima de Transporte-.

Esta aplicación es muy útil para estudiantes, trabajadores y cualquier persona que se movilice por el transporte público, para no tener que estar esperando mucho tiempo en la parada y poder coordinar los viajes.

La entrada Colectivos Rio Cuarto, aplicación si vives en la ciudad aparece primero en Un Sanjuanino en Rio Cuarto.

Git tip: Deshacer un “git add”

desde Gastón Ramos por Gastón Ramos

Siguiendo con la traducción del man de git-reset:

$ edit                                     (1)
$ git add frotz.c filfre.c
$ mailx                                    (2)
$ git reset                                (3)
$ git pull git://info.example.com/ nitfol  (4)

1. Estás felizmente trabajando en algo, y vez que los cambios en esos archivos están bien. No querés seguir viéndolos cuando hacés “git diff”, por que planeás trabajar en otros archivos y cambios mientras que estos archivos te distraen.

2. Alguien te pide que hagas “git pull” y los cambios son dignos de ser mergeados.

3. Sin emargo ya ensuciaste el índice (tu índice ya no apunta al HEAD commit). Y sabes que el pull no va a afectar a frotz.c o filfre.c, entonces reviertes el índice para estos dos archivos. Los cambios en el directorio de trabajao siguen ahí.

4. Entonces podés hacer pull y merge, dejando que los cambios de frotz.c y filfre.c sigan en el directorio de trabajo.

Nota del traductor:
La verdad excelente, no sabía esta forma de usar reset :).


Tagged: git, man, traducciones

El Mundo Según JuanCPovE: Día de la Tierra, ese pequeño punto azul pálido en...

desde Bunker Blog por Sergio Alonso (noreply@blogger.com)
El Mundo Según JuanCPovE: Día de la Tierra, ese pequeño punto azul pálido en...: Siempre en este día cito a Carl Sagan y su obra "Pale Blue Dot". Una buena razón para reflexionar y cambiar de una buena vez nue...

Mis próximas Charlas en Buenos Aires: Actores en C#, Single Page Applications

desde Angel "Java" Lopez por lopez

Tengo varios temas que quiero tratar, en distintos lenguajes y tecnologías. Hoy quiero comentar dos charlas que se vienen, que puedo dar gracias al Microsoft User Group:

Aplicaciones Distribuidas en C#, un modelo de actores

http://www.mug-it.org.ar/Event.aspx?Event=180

Lugar: Auditorio del MUG, Rivadavia 1479 Primer Piso “A”, Buenos Aires.
Fecha y Horario: Miércoles 8 de octubre de 2014 de 18:30 a 20:30 hs.

La idea es presentar conceptos de actores, y actores distribuidos, comentar la principal implementación en Java: Akka. Y luego pasar a discutir y mostrar una implementación en C#

Luego

Desarrollando Single Page Applications con JavaScript

http://www.mug-it.org.ar/Event.aspx?Event=181

Lugar: Auditorio del MUG, Rivadavia 1479 Primer Piso “A”, Buenos Aires.
Fecha y Horario: Miércoles 29 de octubre de 2014 de 18:30 a 20:30 hs.

Veremos las fuerzas que llevan a la aparición de aplicaciones web compuestas de una sola página, con dinámica en JavaScript. Siguiendo “baby steps” y simplicidad, exploraremos cómo podemos armar algún ejemplo con simple JavaScript y JQuery, cómo alimentar los datos desde un servidor con una API expuesta (agnóstico de la tecnología) y luego visitaremos algunas librerías JavaScript del lado cliente que nos ayudan, como Angular y Backbone.

Espero que estas charlas aporten algo a estos temas, entre tantos que son interesantes en estos tiempos. Estoy preparando otras charlas, como Inteligencia Artificial en JavaScript para la JSConf 2014 de Argentina. Y espero que me aceptan alguna más, sobre JavaScript y Ruby, en la RubyConf 2014 de Argentina.

Nos leemos!

Angel “Java” Lopez
http://www.ajlopez.com
http://twitter.com/ajlopez

Git tip: Deshacer un merge o pull

desde Gastón Ramos por Gastón Ramos

Lo que sigue es una traducción hecha por mí de una parte de “man git-reset”, es útil por ejemplo cuando estamos en una rama local
y hacemos git pull y tenemos un conflicto y en el caso de que nuestros cambios locales no nos interesen:

               $ git pull                         (1)
               Auto-merging nitfol
               CONFLICT (content): Merge conflict in nitfol
               Automatic merge failed; fix conflicts and then commit the result.
               $ git reset --hard                 (2)
               $ git pull . topic/branch          (3)
               Updating from 41223... to 13134...
               Fast-forward
               $ git reset --hard ORIG_HEAD       (4)

1. Intentar actualizar desde el upstream resultó en montón de conflictos; vos no estás listo para perder un montón de tiempo en mergear ahora, entonces decides hacer esto más tarde.

2. “pull” no ha hecho el merge commit, entonces “git reset –hard” que es sinónimo de: “git reset –hard HEAD” limpia el desorden desde el índice en el working tree.

3. Mergear el topic-branch en el branch actual resultó en un fast-fordward.

4. Pero decidiste que el topic- branch no está listo para abrirlo al público aún. “pull” o “merge” siempre dejan el tip original del branch actual en ORIG_HEAD, entonces haciendo reset hard hacia este va a dejar tu archivo de índice y el working tree de nuevo en ese estado, reseteando el tip del branch a ese commit.

Qué es el archivo índice de git?


fast-forward-git-merge


Tagged: git, tip

Pasión, el mundo de los hackers

desde Gastón Ramos por Gastón Ramos

Hace un tiempo bastante considerable tuve que ir a trabajar a las oficinas de una empresa de desarrollo bastante conocida de USA, era mi primer viaje fuera del país. Acortando todos los trámites del viaje Santa Fe – Bs As – Bs As – Estados Unidos, en realidad fué mucho más complicado dado que mi vuelo tenía 3 combinaciones. Al llegar a la empresa en cuestión me presenté y me llevaron con dos tipos, no importa los nombres, pero eran dos tipos con cargos mas o menos altos ahí adentro, ellos me preguntaron que era lo que yo hacía, mi experiencia, entonces les conté un poco lo que me acordé y lo que pude explicarles en el idioma de ellos (inglés) que en ese momento creo que era bastante peor que mi nive actual que ya es bastante malo.
Luego me llevaron al lugar dónde se trabajaba, que era una oficina gigante con más de 50 personas trajando juntas (primer punto en contra). La cuestión que después de que estos dos grandes genios de la programación decidieran cual era el equipo más adecuado, yo ya estaba laburando ahí. Fueron pasando los días y yo pasaba mi tiempo adentro de una oficina muy lujosa, dónde podías desayunar una comida espectacular si llegabas a las 8:30, dónde había heladeras con frutas, snacks y gaseosas gratis todo el tiempo, programando con tipos que no conocía.
La forma de trabajo era la siguiente: Llegábamos y teníamos una reunión stand up general que terminaba con un aplauso único motivador, en esta reunión se comentaban las cosas que de interés para todos los equipos, cosas nuevas, problemas solucionados, etc. luego de esta reunión cada equipo se iba la reunión stand up particular, con la típica estructura (qué hice ayer, que voy hacer hoy, que problemas tuve) luego de la stand up se armaban los pares, a… no les dije? en esta empresa se trabajaba de a pares siempre, y trabajar solo en algo era algo raro y hasta te diría no muy bien visto. Luego de estas reuniones
existían otras, de las que me acuerdo: IPM, Retro, Post-Mortem, Charlas de mediodia (durante el almuerzo), seguramente me estoy olvidano varias.
Continuando covenciendo-hackers-600x310n las prácticas, que eran: Test Driven Development (No tan test driven), poco y nada de refactoring, diría más nada que poco, miedo a cambiar, jugar al ping pong (esta es la que sí me gustó) etc.
Ahora bien, pese a todas estas prácticas de desarrollo “ágil” y todas las cosas extras, comida, ping pong, guitarra, charlas, etc, etc.
Hay algo que no pude encontrar en ninguna de las personas que trabajaba ahí y es Pasión, podemos hacer todas las prácticas que se nos antoje pero si no estamos entusiasmados y en consecuencia motivados con lo que estamos haciendo es muy difícil que las cosas salgan bien, el código que escribían ahí era un código de mierda, nadie estaba entusiasmado por mejorar nada y ni que hablar de cambiar una gema o intentar un refactoring.
Parece que esta empresa tiene buen marketing, hay otras empresas que intentan hacer el mismo proceso con la misma cantidad absurda de reuniones, con horarios extremadamente duros, estructuras, jefes, cosas que no se pueden tocar. Amigo, el mundo de los hackers no funciona así y eso se ve claramente reflejado en el código.


Tagged: hackers, pasión, programación

Billetera, galán, pedazo

desde aurelianito por aurelianito (noreply@blogger.com)
Rebranding del piedra, papel o tijera.

Hay 3 elecciones posibles: "billetera", "galán" o "pedazo".

Billetera mata galán.
Galán mata pedazo.
Pedazo mata billetera.

Igual que en el piedra papel o tijera, hay que hacer un gesto con la mano para simbolizar la elección
Billetera
Galán
Pedazo  
Mecánica de juego:
L@s dos jugador@s, simultáneamente, gritan "billetera, galán, pedazo" y justo cuando terminan de decirlo elijen una de las 3 opciones (igual que el "piedra, papel o tijera"). Gana l@ jugador@ que mata a l@ otr@, si elijen la misma opción es empate. Al igual que en el piedra papel o tijera, se puede jugar muchas veces seguidas.

Diviértanse,
Aureliano.

An in-depth analysis of SSH attacks on Amazon EC2

The research study investigates Secure Shell (SSH) attacks on Amazon EC2 cloud instances across different AWS zones by means of deploying Smart Honeypot (SH). It provides an in-depth analysis of SSH attacks, SSH intruders profile, and attempts to identify their tactics and purposes.

desde Blog de UsabilidadWeb.com.ar por Carlos (noreply@blogger.com)

Curso Full Stack Python, Estándares Web W3C y Javascript

Descripción del curso:

Full Stack Python El entrenamiento comienza con el estudio de Python, luego su asociación con la base de datos MySQL, luego se accede al desarrollo basado en el Sofware de Desarrollo de Código Abierto web2py. Lo que debe quedar claro es que no usaremos un Framework porque desconocemos Python, sino a pesar de ello. Se incluye el estudio detallado de los Estándares web W3C, HTML5, CSS3 y Javascript en Usabilidad Web - Full Stack Python, Estándares Web W3C y Javascript

Comparando costos de Amazon EC2 y Google Computing Engine

Estuve mirando y por suerte son prácticamente similares las tablas disponibles en cada site (EC2 / GCE) y es relativamente sencillo compararlas [1][2].

Para sus Data Centers en USA, establecí las siguientes relaciones:

  • En las versiones de VMs “standard“, los precios son exactamente iguales, con configuraciones llamativamente similares.
  • En las versiones “high memory“, es más barato Google (la mitad), aunque Amazon te da el doble de CPUs por una VM con la misma cantidad de memoria.
    Ej: Google te da 4 CPUs / 26 GB de RAM y Amazon en cambio te da 8 CPUs para su configuración de 26 GB de RAM. Dado que estamos en “high memory“, igualé a cantidad de memoria disponible para luego decir “Google es la mitad de barato”.
  • En las versiones “large” (“high cpu” de Google), Amazon es un 15% más caro para igual cantidad de CPUs, pero te da el doble de memoria en sus VMs.

Observaciones:

  • Se desprende de lo anterior Amazon EC2 ofrece perfiles más simétricos que Google comparando la relación de cantidades de CPU/Memoria. Puede ser útil para algunas aplicaciones o no, ya que va obviamente asociado al costo.
  • Amazon tiene configuraciones con más CPUs ya que llega a 32 CPUs y más memoria también: 244 GB; Google llega a 16 CPUs y 104 GB de memoria.
  • No comparé tamaños de almacenamiento, asumo que no tiene tanta relevancia para nuestra aplicación (se disponen de varias decenas de GB en disco en ambos).
  • Amazon dice que te incluye discos de estado sólido (SSD). Google te cobra ambos (?) 0,04 USD por GB/mes el disco estándar, 0,325 USD GB/mes el SSD.
  • Fundamental para la región en la que vivo: Amazon tiene Data Center en San Pablo (Brasil), Google no; sólo sirve VMs desde USA, Europa y Asia/Pacífico.
  • Amazon tiene diferentes tipo de instancias, en este caso comparé las “Bajo demanda” aka “Dedicadas” (según el lugar que se mire en la documentación), que son las más caras. Las otras son tipo prepagas (“Instancias Reservadas”), donde según entiendo, uno abona un importe fijo y después usa X cantidad de tiempo y se descuenta del fijo.
    Hay otros tipos de instancias pero no se ajustan a nuestro uso (“Instancias Puntuales” y “Instancias optimizadas para EBS”). En este apartado, pareciera que Amazon tiene largamente muchas más ofertas y más desarrollo del negocio que Google.

Bonus Track: versus Linode.com

  • Linode tiene hasta 20 CPUs / 96 GB RAM máximo [3].
  • Linode es mucho más barato que ambos; es más simple su tabla de precios y más “1 a 1″ la distribución de CPUs / RAM (4GB / 4CPUs, 8 GB / 6 CPUs, y así hacia arriba), además de que da bastante más storage en SSD.
    Por ejemplo, 4 GB / 4 CPUs en Linode: USD 0,06/hora (USD 40/mes), mientras que en Amazon estamos en USD 0,28/hora por 15GB / 4 CPUs o USD 0,105/hora por 3,75GB / 2 CPUs. Eso sí, Linode está en USA (Newark/Atlanta/Dallas/Fremont), Europa (Londres) y Asia (Tokio), no en Sudamérica.
  • Comparando Linode contra GCE:
    • 1 Linode (2 GB de RAM/ 2 CPUs / 3 TB transfer / 48 GB SSD): U$S 20/mes.
    • 1 GCE (1,70 GB RAM / CPUs “shared” (?) / 48 GB SSD): U$S 33.29/mes (no dicen si hay límite de transferencia).
  • A Linode lo conocemos los que estamos “en la pomada”, y hay casos en donde suena mucho mejor “lo tengo repartido en la nube de Amazon/Google”, nobleza obliga.

[1] http://aws.amazon.com/es/ec2/purchasing-options/dedicated-instances/
[2] https://cloud.google.com/products/compute-engine/
[3] https://www.linode.com/pricing

¿Sugerencias, comentarios?

Saludos

Se viene el Emprender 2014 Rio Cuarto

El evento emprendedor mas importante del interior de Argentina se realizará el 26 de Septiembre en el Teatro Municipal de Río Cuarto, se trata del Emprender 2014.

Tal como se viene realizando hace un par de años, éste evento esta dirigido a jóvenes emprendedores o aspirantes, empresarios y estudiantes de secundario / universidad, profesionales y quien sea que tenga espíritu emprendedor.

Como siempre la entrada es libre y gratuita, lo que si por un tema de lugar físico (se realiza en el Teatro Municipal) es que se requiere una inscripción previa para poder confirmar el lugar.

Dentro del mismo sitio web, se encuentra el formulario de inscripción y mas información sobre el evento.

La entrada Se viene el Emprender 2014 Rio Cuarto aparece primero en Un Sanjuanino en Rio Cuarto.

desde Blog de UsabilidadWeb.com.ar por Carlos (noreply@blogger.com)

Curso Full Stack JavaScript MEAN: MongoDB, Express, AngularJS, Node.js

Curso Integral Estándares Web W3C y Full Stack JavaScript MEAN (MongoDB, Express, Angular, Node). Desarrollo de Aplicaciones Web Escalables.

MEAN hace referencia a las Arquitecturas desarrolladas con la base de datos noSQL MongoDB, Express.js , Angular.js y Node.js, con estas tecnologías tenemos todo lo necesario para desarrollar aplicaciones web Frontend, Backend y Base de Datos.

MEAN permite escribir una aplicación web de principio a fin usando sólo javascript, con sus diferentes librerias. El stack MEAN permite escribir aplicaciones SPA (Single Page Application) en las que el cliente web mantiene gran parte de la lógica de aplicación y el lado del servidor implementa la API necesaria para darle soporte, evitando así los continuos requests HTTP de todo el documento html. Node.js permite el uso de JavaScript en el servidor y establece el concepto de programación no-bloqueante. Curso Full Stack JavaScript MEAN: MongoDB, Express, AngularJS, Node.js

Sudoers en Ldap

desde El blog de Pablo por pablo

Agregar el esquema Sudoers desde un archivo .ldif

Descargamos sudo.ldif y lo copiamos a /opt/sudo.ldif

dn: cn=sudo,cn=schema,cn=config
objectClass: olcSchemaConfig
cn: sudo
olcAttributeTypes: ( 1.3.6.1.4.1.15953.9.1.1 NAME 'sudoUser' DESC 'User(s) who may  run sudo' EQUALITY caseExactIA5Match SUBSTR caseExactIA5SubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )
olcAttributeTypes: ( 1.3.6.1.4.1.15953.9.1.2 NAME 'sudoHost' DESC 'Host(s) who may run sudo' EQUALITY caseExactIA5Match SUBSTR caseExactIA5SubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )
olcAttributeTypes: ( 1.3.6.1.4.1.15953.9.1.3 NAME 'sudoCommand' DESC 'Command(s) to be executed by sudo' EQUALITY caseExactIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )
olcAttributeTypes: ( 1.3.6.1.4.1.15953.9.1.4 NAME 'sudoRunAs' DESC 'User(s) impersonated by sudo (deprecated)' EQUALITY caseExactIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )
olcAttributeTypes: ( 1.3.6.1.4.1.15953.9.1.5 NAME 'sudoOption' DESC 'Options(s) followed by sudo' EQUALITY caseExactIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )
olcAttributeTypes: ( 1.3.6.1.4.1.15953.9.1.6 NAME 'sudoRunAsUser' DESC 'User(s) impersonated by sudo' EQUALITY caseExactIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )
olcAttributeTypes: ( 1.3.6.1.4.1.15953.9.1.7 NAME 'sudoRunAsGroup' DESC 'Group(s) impersonated by sudo' EQUALITY caseExactIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )
olcObjectClasses: ( 1.3.6.1.4.1.15953.9.2.1 NAME 'sudoRole' SUP top STRUCTURAL DESC 'Sudoer Entries' MUST ( cn ) MAY ( sudoUser $ sudoHost $ sudoCommand $ sudoRunAs $ sudoRunAsUser $ sudoRunAsGroup $ sudoOption $ description ) )

Importamos el esquema a nuestra base Ldap

ldapadd -Y EXTERNAL -H ldapi:/// -f /opt/sudo.ldif
service slapd restart

Generamos una Unidad Organizacional y la configuración para el usuario Usuario1

##########################################
# ARCHIVO /opt/crearSudoers.ldif 
##########################################
dn: ou=Sudoers,dc=midominio,dc=com,dc=ar
objectClass: organizationalUnit
ou: Sudoers
 
dn: cn=defaults,ou=Sudoers,dc=midominio,dc=com,dc=ar
objectClass: top
objectClass: sudoRole
cn: defaults
description: Default sudoOption's go here
sudoOption: env_keep+=SSH_AUTH_SOCK
 
dn: cn=seguridad,ou=Sudoers,dc=midominio,dc=com,dc=ar
cn: seguridad
objectclass: top
objectclass: sudoRole
sudocommand: /sbin/iptables -L -n
sudohost: ALL
sudouser: usuario1

Agregamos dicha estructura al Ldap

ldapadd -x -D cn=admin,dc=midominio,dc=com,dc=ar -W -f /opt/crearSudoers.ldif

Debería quedar algo similar a la siguiente captura

Captura de pantalla de 2014-09-10 13:10:59

Configuracion del lado del cliente

Instalamos el sudo modificado para ldap, para esto debemos permitir que se elimine sudo

export SUDO_FORCE_REMOVE=yes
apt-get install sudo-ldap

Si ejecutamos sudo -V como root, vemos sus parámetros aplicados, buscamos “–with-ldap-conf-file=NOMBRE_ARCHIVO” (en mi caso /etc/sudo-ldap.conf) que es de donde toma el archivo de configuración y creamos un enlace simbolico a /etc/ldap.conf

ln -s /etc/ldap.conf /etc/sudo-ldap.conf

Definimos el path donde se encuentra la UO de sudoers agregando la siguiente linea en /etc/ldap.conf

sudoers_base ou=Sudoers,dc=midominio,dc=com,dc=ar
sudoers_debug 1

Solo falta modificar la configuración del nsswitch (en /etc/nsswitch.conf) para que busque primero en el archivo /etc/sudoers y en caso de no existir en el directorio Ldap.

sudoers: files ldap

desde Blog de UsabilidadWeb.com.ar por Carlos (noreply@blogger.com)

Cursos Full-Stack JavaScript MEAN y Full Stack Web Developer (Python/web2py)

Curso Desarrollo Full-Stack JavaScript MEAN (MongoDB - Express - Angular - Node). Javascript en Frontend, Backend, Base de datos. Curso Full Stack Web Developer (Python/web2py) en usabilidadweb.com.ar

Como bootear tus antiguas aplicaciones para Ms-DOS en CD o USB “Bien Facil”

desde Blog tech-nico.com por soporte

En este paso a paso, vamos a ver como crear un disco booteable en CD para levantar tu viejo sistema hecho para correr en DOS.

Tendremos el beneficio de que emularemos el floppy disk “driver A” por medio del BIOS (unidad 0). Utilizaremos un software que se llama BCD/BFD con el agregado de algunos driver de CDROOM para que permita ademas bootear en dispositivos SCSCI.

Paso 1, descomprimimos esto (descargar).

Paso 2, pegamos los archivos y/o carpetas de nuestro viejo software en la ruta: tech-nico_boot\cds\cdromsi\files\

Paso 3, vamos a la consola de windows. —- Inicio – Ejecutar – cmd

Paso 4, nos movemos con “cd” a la carpeta “tech-nico_boot”

command

Paso 5, Ejecutamos el comando “bcd cdromsi”

Paso 6, si queremos grabar el ISO en un CD presionamos “Enter” y ponemos un CD en blanco (el mismo software se ocupa de grabarlo), y si no lo queremos quemar en CD y solo nos interesa el ISO, miramos cual es la ruta del ISO y lo buscamos antes de presionar cualquier tecla, ya que al presionar “A-abort” nos elimina el ISO.

iso_path

Ya tenemos nuestro disco listo para bootear. Facil no?.
Con el ISO podriamos crear un USB boot. (No lo probe pero deberia funcionar).

Como tip adicional. Si queremos que se auto ejecute un exe o bat al iniciar el CD tenemos que editar el archivo tech-nico_boot\cds\cdromsi\files\autorun.bat

Fuente: http://www.nu2.nu/

Este post se publico primero en tech-nico.com

Noticias relacionadas

Configurar un cliente Linux para autenticar contra un servidor Ldap

desde El blog de Pablo por pablo

Instalamos los paquetes necesarios del lado del cliente

sudo apt-get install ldap-auth-client nscd

Captura de pantalla de 2014-09-10 13:10:59

Captura de pantalla de 2014-09-10 13:10:59

Captura de pantalla de 2014-09-10 13:10:59

Captura de pantalla de 2014-09-10 13:10:59

Captura de pantalla de 2014-09-10 13:10:59

Captura de pantalla de 2014-09-10 13:10:59

Captura de pantalla de 2014-09-10 13:10:59

Captura de pantalla de 2014-09-10 13:10:59

sudo auth-client-config -t nss -p lac_ldap

En el archivo /etc/ldap.conf modificamos las siguientes lineas:

host IP_SERVIDOR_LDAP
base dc=midominio,dc=com,dc=ar
uri ldapi://IP_SERVIDOR_LDAP
uri ldap://IP_SERVIDOR_LDAP/
ldap_version 3
rootbinddn cn=admin,dc=midominio,dc=com,dc=ar
pam_password md5
nss_base_passwd	ou=Users,dc=midominio,dc=com,dc=ar?one
nss_base_shadow	ou=Users,dc=midominio,dc=com,dc=ar?one
nss_base_group	ou=Groups,dc=midominio,dc=com,dc=ar?one

Montar un servidor LDAP en Linux

desde El blog de Pablo por pablo

Si llegaste acá buscando como instalar un Ldap, es porque ya sabes que se trata de una base de datos en forma de árbol, bla, bla, bla… así que vamos al grano.

Instalación del servidor Ldap

Lo primero que hay que hacer es instalar el demonio slapd del servidor OpenLdap e instalar ldap-utils, un paquete que contiene utilidades de administración de LDAP.

Esto se hace mediante el siguiente comando, y aunque en la instalación solo nos pide definir la password de administrador (admin), debemos inmediatamente reconfigurarlo para setear algunos parámetros mas.

apt-get install slapd ldap-utils
dpkg-reconfigure slapd

Captura de pantalla de 2014-09-10 13:10:59

Ingresamos el dominio

Captura de pantalla de 2014-09-10 13:11:04

…el nombre de la organización

Captura de pantalla de 2014-09-10 13:11:09

…la contraseña de administrador

Captura de pantalla de 2014-09-10 13:11:17

…repetimos dicha contraseña

Captura de pantalla de 2014-09-10 13:11:25

Escogemos el tipo de base de datos backbend. Si se lee la explicación que da el cuadro de diálogo se observa que se recomienda utilizar la base de datos HDB y no la BDB, además de la justificación de porque escoger dicha opción.

Captura de pantalla de 2014-09-10 13:11:31

…si desea que se borre la base de datos cuando se purgue el paquete slapd

Captura de pantalla de 2014-09-10 13:11:36

Captura de pantalla de 2014-09-10 13:11:40

Captura de pantalla de 2014-09-10 13:11:45

Agregar usuarios, grupos o modificar contraseñas mediante LdapScripts

El paquete ldapscripts contiene scripts configurables para facilitar la gestion de usuarios y grupos LDAP.

apt-get install ldapscripts
cat /etc/ldapscripts/ldapscripts.conf
 
SERVER="ldap://localhost"
BINDDN="cn=admin,dc=midominio,dc=com,dc=ar"
BINDPWDFILE="/etc/ldapscripts/ldapscripts.passwd"
USHELL="/bin/bash"
PASSWORDGEN="pwgen"
RECORDPASSWORDS="no"
PASSWORDFILE="/var/log/ldapscripts_passwd.log"
LOGFILE="/var/log/ldapscripts.log"
TMPDIR="/tmp"
LDAPSEARCHBIN="/usr/bin/ldapsearch"
LDAPADDBIN="/usr/bin/ldapadd"
LDAPDELETEBIN="/usr/bin/ldapdelete"
LDAPMODIFYBIN="/usr/bin/ldapmodify"
LDAPMODRDNBIN="/usr/bin/ldapmodrdn"
LDAPPASSWDBIN="/usr/bin/ldappasswd"
echo -n 'pass' -- /etc/ldapscripts/ldapscripts.passwd
chmod 400 /etc/ldapscripts/ldapscripts.passwd

Agregar usuario

ldapadduser usuario grupo

Cambiar password

ldapsetpasswd usuario

Migrar usuarios/contraseñas y grupos de Linux y generar el ldif

MigrationTools es un paquete de herramientas que nos ayudaran a agregar los objetos al dominio con plantillas predefinidas, para utilizarlas ejecutaremos los siguientes comandos.

apt-get install migrationtools
cat /etc/migrationtools/migrate_common.ph
 
$NAMINGCONTEXT{'passwd'} = "ou=Users";
$NAMINGCONTEXT{'group'} = "ou=Group";
 
$DEFAULT_MAIL_DOMAIN = "midominio.com.ar";
$DEFAULT_BASE = "dc=midominio,dc=com,dc=ar";
 
$IGNORE_UID_BELOW = 1000;
$IGNORE_UID_ABOVE = 30000;
/usr/share/migrationtools/migrate_passwd.pl /etc/passwd -- /opt/usuariosMigrados.ldif

Instalar phpLdapAdmin, un administrador web

phpLDAPadmin también conocido como PLA, es una herramienta para la administración de servidores LDAP escrito en PHP, disponible bajo licencia GPL, basado en interfaz Web. Trabaja en varias plataformas, pudiendo acceder al servidor LDAP desde cualquier lugar en Internet usando un navegador Web.

Posee una vista jerárquica basada en árbol en donde se puede navegar por toda la estructura de directorio. Permite ver los esquemas LDAP, realizar búsquedas, crear, borrar, copiar y editar entradas LDAP, incluso copiar entradas entre servidores LDAP.

apt-get install phpldapadmin

Editar /etc/phpldapadmin/config.php y modificar las variables “server” y “login”

$servers-- setValue('server','base',array('dc=midominio,dc=com,dc=ar'));
$servers-- setValue('login','bind_id','cn=admin,dc=midominio,dc=com,dc=ar');

Se accede vía ldap.midominio.com.ar/phpldapadmin

Captura de pantalla de 2014-09-10 13:10:59

Captura de pantalla de 2014-09-10 13:10:59

Captura de pantalla de 2014-09-10 13:10:59

Añadir Unidades Organizacionales, Grupos y Usuarios

#####################################################################################
#		ARCHIVO /opt/crearOU_Grupos_Usuarios.ldif
#####################################################################################
#		UNIDADES ORGANIZACIONALES
dn: ou=Users,dc=midominio,dc=com,dc=ar
objectClass: organizationalUnit
ou: Users
#		GRUPOS
dn: ou=Groups,dc=midominio,dc=com,dc=ar
objectClass: organizationalUnit
ou: Groups
 
dn: cn=administradores,ou=Groups,dc=midominio,dc=com,dc=ar
objectClass: posixGroup
cn: administradores
gidNumber: 26000
 
#		USUARIOS
dn: uid=usuario1,ou=Users,dc=midominio,dc=com,dc=ar
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: shadowAccount
uid: usuario1
sn: usuario1
givenName: usuario1
cn: Pepe Puertas
displayName: Pepe Puertas
uidNumber: 26001
gidNumber: 26000
userPassword: {crypt}$1$hzFrywwZ$QLx4hBHkTS9NaG.C6bkwe.
gecos: Pepe Puertas
loginShell: /bin/bash
homeDirectory: /home/usuario1
ldapadd -x -D cn=admin,dc=midominio,dc=com,dc=ar -W -f /opt/crearOU_Grupos_Usuarios.ldif

Con esto deberíamos tener andando el servidor Ldap, con el usuario Pepe integrante del grupo Administradores

MKE Solutions se incorpora al Cluster Tecnológico Rio Cuarto

Una noticia que me llena de orgullo es la incorporación de MKE Solutions al Cluster Tecnológico Rio Cuarto a partir de este mes (Septiembre).

Este es un paso importante ya que le permite a MKE Solutions incorporarse a una asociación civil que se dedica a impulsar el desarrollo y estimular el crecimiento regional.

Estuve leyendo algunos números en una nota de La Voz que comenta que hay unas 25 empresas tecnológicas en Río Cuarto que facturan unos 30 millones de pesos (no dice en que periodo) pero estimo que será anual; es un número importante que inyecta en la región dinero y toma mano de obra especializada y calificada, algo que abunda en este ciudad gracias a las ofertas universitarias y tercearias que hay.

Hay una nota en MKE Solutions que habla al respecto.

La entrada MKE Solutions se incorpora al Cluster Tecnológico Rio Cuarto aparece primero en Un Sanjuanino en Rio Cuarto.

Rock n' Linux: Instalación y puesta a punto de ArchLinux

desde Bunker Blog por Sergio Alonso (noreply@blogger.com)
Publicado por Alejandro Cobo - enlace original presente en http://rocknlinux.blogspot.com.es/2013/01/instalacion-y-puesta-punto-de-archlinux.html

Rock n' Linux: Instalación y puesta a punto de ArchLinux: Lo que empezó siendo un guión para uso propio de los pasos a seguir durante la instalación y post-instalación de ArchLinux , ha ido creciend...

Inside Google Brain Founder Andrew Ng's Plans To Transform Baidu

Little known outside China, the Chinese search engine Baidu scored a coup earlier this year when it hired Andrew Ng to be chief scientist and open a new artificial intelligence lab in Silicon Valley. Ng, a Stanford computer science professor who headed the Google Brain AI project and then cofounded the online education startup Coursera, is the foundation for Baidu’s plan to transform itself into a global power.

Instalar DNSCache de D. J. Bernstein

desde El blog de Pablo por pablo

Instalar un cache de DNS sobre Ubuntu es realmente sencillo gracias a los paquetes de D.J.Bernstein.

En primer lugar debemos instalar el paquete dnscache-run y sus dependencias (daemontools daemontools-run djbdns dnscache-run ucspi-tcp)

apt-get install dnscache-run

El svscan verifica dentro del directorio /service los programas a ejecutar, pero como esta carpeta no es creada durante el proceso de instalación arreglarlo y generar un enlace simbólico a /etc/dnscache

mkdir /service
ln -s /etc/dnscache /service

Ahora debemos configurar las variables de entorno de la siguiente manera:

Editamos /etc/dnscache/env/IP y modificamos el valor por defecto con nuestra IP.

vi /etc/dnscache/env/IP
192.168.1.10

y declaramos que redes pueden utilizar nuestro cache de DNS

touch /etc/dnscache/root/ip/192.168.1
touch /etc/dnscache/root/ip/10.10

El tamaño por default del cache es de 1M, se puede agrandar un poco cambiando las siguientes variables:

echo 100000000 > /service/dnscache/env/CACHESIZE
echo 104857600 > /service/dnscache/env/DATALIMIT

para ponerlo en funcionamiento debemos arrancar el servicio

/sbin/start svscan
update-service --add /etc/dnscache

Si queremos hacerla completa, podemos generar un script que actualice periódicamente los Root Hints. Si pegamos el siguiente código en /opt/actualizar_root_servers.sh y le damos permiso de ejecución (chmod +x /opt/actualizar_root_servers.sh) se puede agregar en el crontab para que se ejecute automáticamente.

#!/bin/bash
# Fuente: http://thedjbway.b0llix.net/djbdns/dnsroots.html
 
dnsip `dnsqr ns . | awk '/answer:/ { print $5; }' |sort` > /opt/root_servers_temp.txt 2>> /opt/actualizar_root_servers.log
echo "`date` - Listado de root servers obtenido:" >> /opt/actualizar_root_servers.log
cat /opt/root_servers_temp.txt >> /opt/actualizar_root_servers.log
echo "`date` - Fin del listado de root servers obtenido" >> /opt/actualizar_root_servers.log
 
# Si la cantidad de root servers es mayor que 8 cambiar la configuración
NRO_ROOT_SERVERS=`wc -l /opt/root_servers_temp.txt |cut -d' ' -f 1`
if [ $NRO_ROOT_SERVERS -ge 8 ]; then
    # echo $NRO_ROOT_SERVERS es mayor o igual que 10
    echo "`date` - Se obtuvieron $NRO_ROOT_SERVERS servidores de DNS raiz que se usaran para actualizar la conf. de root servers" >> /opt/actualizar_root_servers.log
    cp /etc/dnsroots.global /etc/dnsroots.global.old
    cp /opt/root_servers_temp.txt /etc/dnsroots.global
    cp /etc/dnsroots.global /service/dnscache/root/servers/@
    svc -du /service/dnscache
else
    echo "`date` - Se obtuvieron $NRO_ROOT_SERVERS servidores de DNS raiz, no se modifica la conf. de root servers" >> /opt/actualizar_root_servers.log
#    echo $NRO_ROOT_SERVERS es menor que 10
fi

Referencias:

 

Living with Web Apps

I decided to spend a day using only the web for all the tasks that people use their mobile phone for. No exceptions. Everything interaction that I do must be via the web.

Construido con Eco v0.1