14 de septiembre de 2015

Buscar en Windows 10 deja de responder

Después de actualizar a Windows 10 surgieron varios inconvenientes en general relacionados con drivers.

  • El adaptador wifi TL-WND3200 no mostraba ninguna conexión en la banda de 5 Ghz. En la página del fabricante no hay drivers actualizados para Windows 10. En los foros sugerían instalar los drivers para Windows 8.1 de otro modelo, tampoco funcionó. Otra sugerencia era instalar los drivers del fabricante del chipset Mediatek, tuve que registrarme en la página para poder bajar los drivers. Luego de desintalar todos los drivers que había probado además de el que instala Windows, reiniciar e instalar los de Mediatek por fin pude conectarme.
  • La webcam no era detectada, ni desde Chrome, ni desde Skype. Una rápida búsqueda por los foros de soporte del fabricante de la notebook sugieren desinstalar el driver desde el Administrador de Dispositivos de Windows, reiniciar y dejar que instale drivers nuevos. Efectivamente esto arreglo los problemas de la webcam.
  • También ocurrió un duelo entre Nvidia y Microsoft por quién tiene que instalar los drivers, y cuál es la versión correcta. Luego de un par de días y demasiados reinicios paraece que llegaron a una tregua.

La búsqueda deja de responder

Para lanzar una aplicación la manera más rápida es usar Buscar en Windows. Que deje de responder es es muy desagradable. Buscando en los foros parece que es algo que viene ocurriendo desde las versiones beta y rc. Este no es mi caso, ya que actualicé desde Windows 7 a la versión final.

Ninguna de las sugerencias resolvían el problema, a veces reiniciar lo arreglaba pero luego de un tiempo volvía a ocurrir. Al empezar a tipear aparece una animación y luego los primeros resultados inmediatamente, pero cuando no funciona la animación continua reproduciendo y no aparece ningún resultado.

Finalmente más adelante alguien de Micrsoft sugiere, sin explicación alguna, la siguiente línea a ejecutar desde un powershell como administrador.
Get-AppxPackage -AllUsers | Where-Object {$_.InstallLocation -like "*SystemApps*"} | Foreach {Add-AppxPackage -DisableDevelopmentMode -Register "$($_.InstallLocation)\AppXManifest.xml"}
Lo que pareciera que esta haciendo ese código es registrar de nuevo las aplicaciones que estan en SystemApps, pero deshabilitando el modo desarrollo.

El menú de aplicaciones de Windows 10 es difícil de usar con sólo teclado y mouse. Aún peor que el menú de Windows 7. Es pequeño, tiene un tamaño fijo, aunque ahora se ordenan alfabéticamente. En Windows 7 había soporte de carpetas anidadas, de modo que se podía acceder fácilmente a la aplicación principal y en una subcarpeta las estaban las utilidades accesorias. Ahora sólo hay un nivel de subcarpetas. .Si tenían organizados sus accesos directos en carpetas anidadas ahora estan todos juntos ordenados alfabéticamente, igonrando la estructura de carpetas.

En Windows 10 la manera de lanzar una aplicación es a través de la búsqueda del menú inicio. La búsqueda es mucho más rápida que en Windows 7. Una diferencia con Windows 7 es que en éste la búsqueda sigue habilitada mientras navegamos las Todas las Aplicaciones, si empezamos a tipear empezará a buscar. En cambio Windows 10 si estamos navegando Todas la Aplicaciones la búsqueda se deshabilita.

Cada vez que tengo que ir a navegar Todas las Aplicaciones, porque no recuerdo el nombre de una aplicación o porque recién la instalé y Windows insiste en mostrar cualquier otro cosa menos la aplicación, siento que me enfrento a una experiencia muy ingrata.

3 de septiembre de 2015

Mi configuración de Debian Jessie

Habilitar Tap en Touchpad

Los drivers de touchpad tienen el tap deshabilitado. Casi todos los escritorios como KDE, Gnome, XFCE, etc. tienen la opción de configurar desde una aplicación. Desde la línea de comandos se puede ejecutar synclient TapButton1=1 al inicio de cada sesión.

El problema de configurarlo por sesión es que en la ventana de logueo no esta habilitado. Para que este siempre habilitado lo que podemos hacer es crear un archivo de configuración 50-synaptics.conf en /etc/X11/xorg.conf.d/ que tenga lo siguiente:
Section "InputClass"
        Identifier "touchpad tweaked catchall"
        MatchIsTouchpad "on"
        Driver "synaptics"
        Option "TapButton1" "1"
EndSection

Audio Surround por HDMI

Esta receta es más dificil de lo que debería ser, entre otras razones porque estoy usando el driver privativo fglrx, porque mi equipo de audio no cumple con los estándares. Es un caso de opción de último recurso, vamos a establecer la configuración de manera estática. Si cambiamos el equipo de audio o la placa HDMI es posible que falle y no aparezca ningún mensaje de error.

La idea es que cuando la salida de audio sea detectada pasarle suficiente información para que pulseaudio pueda configurarla como surround, por ejemplo 5.1.

Primer hay que averiguar el vendorId y el deviceId de la salida HDMI. Por ejemplo el comando lspci -vnn | grep -i hdmi. Produce la salida:
00:01.1 Audio device [0403]: Advanced Micro Devices, Inc. [AMD/ATI] Trinity HDMI Audio Controller [1002:9902]
En negrita resalté los valores que estamos buscando.

Hay que crear un archivo de reglas 95-local-pulseaudio.rules en /etc/udev/rules.d/ por ejemplo, que contenga lo siguiente:
ATTRS{vendor}=="0x1002", ATTRS{device}=="0x9902", ENV{PULSE_PROFILE_SET}="/etc/pulse/my-hdmi.conf"
En negrita los valores encontrados en el paso anterior (El archivo consta de una sola línea que blogspot insiste en separar en dos). En esa línea le estamos indicando a pulseaudio que archivo va a utilizar para el profile de la salida HDMI.

Mi archivo contiene lo siguiente:
[General]
auto-profiles = yes

[Mapping hdmi-stereo]
device-strings = hdmi:%f
description = Digital Stereo (HDMI)
paths-output = hdmi-output-0
priority = 4
direction = output

[Mapping hdmi-surround-51]
description = Digital Surround 5.1 (HDMI)
device-strings = hdmi:%f
paths-output = hdmi-output-0
channel-map = front-left,front-right,rear-left,rear-right,front-center,lfe
priority = 3
direction = output
Este archivo hay que modificarlo de acuerdo a la configuración de nuestro equipo de audio. Pueden usar el archivo /usr/share/pulseaudio/alsa-mixer/profile-sets/extra-hdmi.conf como template en otros casos.

Queda por último agregar las siguientes líneas al archivo de configuración de pulseaudio /etc/pulse/daemon.conf.
enable-lfe-remixing = yes
default-sample-rate = 48000
alternate-sample-rate = 44100
default-sample-channels = 6
default-channel-map = front-left,front-right,rear-left,rear-right,front-center,lfe



3 de julio de 2015

Cambio de tamaño de una partición en un disco GPT

Si disponemos de un entorno gráfico podemos usar la interfaz gráfica GParted para realizar los cambios de manera sencilla. Si por el contrario no tenemos acceso a un entorno gráfico podemos recurrir a la utilidad parted. El comando parted tiene disponible la orden resizepart para cambiar el tamaño de una partición, pero no soporta todos los formatos de sistemas de archivos.

Usaremos el comando parted, ya que fdisk no soporta discos en formato GPT. Una aclaración importante, a diferencia de fdiskparted ejecuta inmediatamente cada orden. Es más que recomendable hacer una copia de seguridad. Además de revisar todos los comandos antes de empezar.

  • Empezamos abriendo el disco donde esta la partición que queremos modificar
    bash# parted /dev/sdX
  • Ahora le indicamos a parted que use sectores, como unidad de medida, en vez de bytes
    (parted) unit s
  • Imprimimos las particiones disponibles en el disco
    (parted) print
  • Anotamos los valores de inicio y fin de cada partición
  • Borramos la partición que queremos cambiar de tamaño. CUIDADO: ¡Este comando hace cambios en el disco!
    (parted) rm NNN
    donde NNN es el númer de partición.
  • Recreamos la partición con el tamaño deseado
    (parted) mkpart TIPOPART INICIO FIN
    o Donde TIPOPART es el tipo de partición, puede ser primary, logical o extended
    o INICIO y FIN son el inicio y fin de la partición en sectores, podemos usar -1 para indicar el último sector.
  • Podemos hacer print de nuevo para ver como quedo la tabla de particiones
  • Para terminar
    (parted) quit
Ahora podemos usar el comando resize2fs para agrandar el sistema de archivos en caso de usar ext4.

7 de noviembre de 2014

Configurando MariaDB y Apache en Fedora 20

MariaDB

MariaDB es un 'fork' de MySQL por el autor original de MySQL luego de que Oracle haya adquirido los derechos de MySQL a través de la adquisición de Sun. En todos los aspectos MariaDB es un reemplazo de MySQL. Pero según el autor no es una prioridad tener una compatibilidad del 100% con futuras versiones.

Primero arrancamos el servicio MariaDB
# systemctl start mariadb.service

Opcionalmente podemos configurar para que sea más seguro
# mysql_secure_installation

Ahora lo habilitamos desde el arranque
# systemctl enable mariadb.service

Apache

Para arrancar el servicio
# systemctl start httpd.service

Para que este habilitado desde el arranque
# systemctl enable httpd.service

Ahora sólo podemos acceder a la página de prueba de Apache desde la computadora donde esta intalado. Para que se puede acceder desde otras computadoras tenemos que permitir las conexiones en el firewall.
# firewall-cmd --permanent --add-service=http



17 de octubre de 2013

How to mock a template method with gmock?

With stern voice you have to say:
"You're a stupid template! and your mother dressed you funny! who could use such a stupid stupid template?" –  B. Postow
Ref: http://stackoverflow.com/questions/3426067/how-to-mock-templated-methods-using-google-mock

12 de agosto de 2013

Pasos para migrar MoinMoin a Nginx en Debian/Ubuntu

Ayuda memoria para cuando lo tenga que volver a hacer
  1. Primero los paquetes obvios nginx-full y python-moinmoin.
  2. Ahora estos paquetes uwsgi y uwsgi-plugin-python.
  3. Configurar Uwsgi. Por ejemplo (/srv/wiki/ es donde esta el wiki):
    <uwsgi>
      <uid>www-data</uid>
      <gid>www-data</gid>
      <plugin>python</plugin>
      <wsgi-file>/srv/wiki/moin.wsgi</wsgi-file>
      <memory-report />
      <vhost />
      <no-site />
    </uwsgi>
    
  4. Configurar MoinMoin. Editar /etc/moin/mywiki.py y agregar por lo menos estas líneas
    sitename = u'Mi super Wiki'
    interwikiname = u'SuperWiki'
    data_dir = '/srv/wiki/data/'
    data_underlay_dir = '/srv/wiki/underlay'
    
  5. Configurar Nginx. Crear un archivo "wiki" en /etc/nginx/sites-available con el siguiente contenido
    server {
      server_name wiki;
      root /usr/share/moin/htdocs;
    
      location /moin_static194 {
        access_log off;
        alias /usr/share/moin/htdocs;
      }
    
      location = /favicon.ico {
        rewrite "/favicon.ico" /moin_static194/favicon.ico;
      }
    
      location / {
        gzip off;
        include uwsgi_params;
        uwsgi_param SCRIPT_NAME /;
        uwsgi_modifier1 30;
        uwsgi_pass unix:/run/uwsgi/app/moin/socket;
      }
    }

20 de mayo de 2013

Usando cálculo numérico para mejorar un programa

Este es el problema que teníamos era el siguiente al intentar leer un archivo desde una posición p0 fallaba, pero desde otras posiciones todo funcionaba correctamente.
El archivo en cuestión era un .mpg que contenía un video con audio. Estos archivos no están pensados para que se pueda acceder de manera aleatoria, sino para ser usado en modo de streaming.
Podemos pensar el problema del siguiente modo, queremos encontrar la función h(t) = p tal que dada un tiempo t, nos devuelva la posición donde empieza el cuadro de video t.
Pero lo que podemos averiguar es g(p) = t, es decir dada una posición p a que tiempo t de cuadro de video corresponde. Podemos suponer que al principio tenemos g(0) = 0, y que si P es la posición máxima de video, y T es el tiempo máximo entonces tenemos g(P) =T.
Luego dado un tiempo t intermedio entre 0 y T, podemos aplicar cualquier método de búsqueda de raíces a f(x) = g(x) - t.
En nuestro caso lo que sucedía es que la función g no se comportaba muy bien el la cercanía de la posición problemática. La función g es monótona y creciente, pero la convergencia era lenta, y el programa para evitar demorar demasiado y parecer colgado generaba un error.

19 de mayo de 2013

Pasos para usar ssh sin ingresar un password

  1. Generamos un par de clave privada/pública:
    $ ssh-keygen [-t tipo] [-b longitud]
    Opcionalmente podemos especificar la longitud de la clave y el tipo. El tipo puede ser rsa, dsa, ecdsa. Con longitud especificamos la cantidad de bits de la clave. Podemos presionar Enter cuando nos pide un palabra de paso para cifrar la clave privada, si queremos más seguridad podemos ponerle una palabra de paso y usar ssh-agent para cargar la clave privada.
  2. Copiamos la clave pública a la computadora donde queremos ingresar.
    $ ssh-copy-id -i ~/.ssh/id_rsa.pub
    El par de claves se crean dentro de ~/.ssh, la clave pública en id_rsa.pub y la clave privada en id_rsa. El comando ssh-copy-id agrega la clave pública a , en el archivo ~/.ssh/authorized_keys donde se guardan las de claves autorizadas una por renglón. 

18 de febrero de 2013

Arrancando un pendrive desde Grub2

Si desde el menú del BIOS no podemos arrancar un pendrive, pero tenemos instalado grub2 podemos tipear lo siguiente desde la consola de grub, para arrancar
grub> set root='(hd1,msdos1)'
grub> chainloader +1
grub> boot
Para acceder a la consola aprentamos la tecla c, en la pantalla de inicio. Para saber que particiones estan disponibles tipeamos ls en la consola.

7 de enero de 2013

Configurar una conexión ad-hoc para compartir internet

La idea es que tenemos dos computadoras, una con acceso a internet, y queremos que la otra también puede conectarse a internet, pero no contamos con un router.

Lo primero que vamos a hacer es conectar las dos computadoras, luego vamos a configurar esta conexión para que la segunda computadora pueda acceder a internet.

Ahora en la máquina que tiene la conexión a internet, que vamos a llamar Servidor, ponemos la conexión inalámbrica en modo ad-hoc, con el nombre MYSID, usando WEP con la clave 12345 (algunas versiones de windows sólo funcionan con claves de longitud 5 ó 10), usando como IP 192.68.22.1.
# iwconfig wlan0 mode ad-hoc
# iwconfig wlan0 essid MYSID
# iwconfig wlan0 key s:12345
# ifconfig wlan0 192.168.22.1 up
En la otra computadora, que vamos a llamar Cliente, repetimos estos pasos (cambiando el IP pero dentro del mismo rango por ejemplo 192.168.22.2). Sólo falta configurar Cliente para que use la conexión de Servidor como salida.
# route add default gw 192.168.22.1
Después de estos pasos deberiamos tener conectividad entre las dos computadoras.

Para compartir la conexión de internet de la computadora Servidor con la Cliente, tenemos que configurar Servidor para que pueda enrutar correctamente los paquetes de Cliente, y luego pueda reenviar la respuesta. Este tipo de conexión se llama NAT.
# sysctl -w net.ipv4.ip_forward=1
# iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
# iptables -A FORWARD -i wlan0 -j ACCEPT
El primer comando habilita en el núcleo el reenvio de paquetes. El segundo y tercero habilitan que Cliente se pueda conectar a internet usando la IP de Servidor y poder recibir las respuestas.