Data-show en GNU/Linux like a boss!

Antes de comenzar… debería aclarar que, aquí en Bolivia, le decimos data-show al proyector? :D

Es fácil con XRandR!!, (es la herramienta oficial para configurar el RandR).

xrandr tiene muchas utilidades, pero en esta ocasión, intentaré proveer un tutorial sobre cómo conectar tu computadora con GNU/Linux a un proyector (comúnmente llamado data-show, aquí en Bolivia XD). Este tutorial también te ayudará a conectar tu computadora a un televisor, o cualquier otra pantalla. Si quieres más información, RTFM! Comenzamos? :D

Antes que nada, verifica si tienes la herramienta (estoy 100% casi segura de que la tienes si usas GNU/Linux Debian XD).

  
    $ xrandr -v
  

Al ejecutar este comando, debería aparecerte la versión de tu xrandr. Si te aparece

  
    bash: xrandr: command not found
  

es porque no tienes xrandr y tendrás que instalarlo ·n·

Buscando el nombre del data-show

Necesitamos saber el nombre con el que la computadora detectó el data-show! para esto, sigue estos pasos…

Ejecuta este comando

  
    $ xrandr
  

Te saldrá una lista de los dispositivos de salida de video (proyectores, pantallas, etc) que estén conectados a tu computadora. La lista se verá algo así:

  
LVDS1 connected 1280x800+0+0 (normal left inverted right x axis y axis) 286mm x 17900mm
   1280x800       60.0*+
   1024x768       60.0  
   800x600        60.3     56.2  
   640x480        59.9  
  

En este caso LVDS1 es la pantalla de mi laptop. No olvides este nombre! este es el NOMBRE-DE-TU-PANTALLA

Conecta tu equipo al proyector o pantalla, y ejecuta:

  
    $ xrandr
  

de nuevo saldrá la lista de los dispositivos de salida de video conectados a tu computadora, pero esta vez, un nuevo dispositivo aparecerá en la lista.

¿Recuerdas el nombre del dispositivo de video de tu laptop? en mi caso, se llama LVDS1… el otro dispositivo es la pantalla o data-show al que quieres conectar tu laptop. En mi caso, el dispositivo se llama VGA1. Este es el nombre que estabamos buscando!! el NOMBRE-DEL-DATA-SHOW

  
LVDS1 connected 1280x800+0+0 (normal left inverted right x axis y axis) 286mm x 17900mm
   1280x800       60.0*+
   1024x768       60.0  
   800x600        60.3     56.2  
   640x480        59.9  
VGA1 connected (normal left inverted right x axis y axis)
   1440x900       59.9 +   59.9  
   1400x1050      60.0  
   1280x1024      60.0  
   1280x960       60.0  
   1360x768       60.0  
   1280x800       74.9     59.8  
   1152x864       75.0  
   1280x768       74.9     59.9  
   1024x768       75.1     75.0     70.1     60.0  
   800x600        72.2     75.0     60.3     56.2  
   848x480        60.0  
   640x480        75.0     72.8     60.0     59.9  
   720x400        70.1  
HDMI1 disconnected (normal left inverted right x axis y axis)
  

Conectando el equipo al data-show

Ahora sí, con esta información, podemos conectar nuestra computadora al dispositivo de video! Solo tienes que ejecutar el siguiente comando:

  
    xrandr --output NOMBRE-DEL-DATA-SHOW --same-as NOMBRE-DE-TU-PANTALLA
  

Y tadah! tu laptop estará conectada al data show!

BONUS

Y como “yapa” XD un poco más de información…

Si las letras están muy pequeñas, intenta cambiar la resolución, así:

  
    xrandr --output NOMBRE-DEL-DATA-SHOW --mode 640x480
  

y si quieres ver cosas distintas en tu proyector y en tu laptop, usa esto:

  
    xrandr --output NOMBRE-DEL-DATA-SHOW --left-of NOMBRE-DE-TU-PANTALLA
  

y si quieres más información RTFM! ^ w ^ o intenta…

  
    xrandr --help
    man xrandr
  

oh btw… la otra vez estaba ejecutando el evince para visualizar las diapositivas en el datashow, desde la consola, y los chicos creyeron que estaba hackeando el proyector o__O funny huh? XD

Longest Zig Zag Subsequence: Análisis de la solución

Ayer el M.Sc. Jorge Terán, en la materia INF-143 nos planteó este problema… la solución se realizaba mediante dos vectores de tamaño n (donde n es la cantidad de datos). Sin embargo, también se puede solucionar mediante un solo vector de tamaño n, con una complejidad algorítmica de O(n)…

Ahora que tengo tu atención, voy a explicar cómo llegar a esta solución, y luego explicaré cómo es que esta solución funciona XD

Pero primero, sobre lo que encontrarás, y lo que no encontrarás aquí: Si estás esperando encontrar deliciosa copy-pasta del código para terminar tu tarea, te haz equivocado de post! por el contrario, si lo que buscas es entender la solución del problema, este post es para tí!

Statement: (Resúmen)

Para una descripción completa del problema, puedes ver el enunciado que M.Sc. Terán nos pasó en clases

Dada una secuencia de números en determinado orden, esta secuencia se denomina “secuencia zig-zag” si el número que resulta de restar el primer número del segundo, es de un signo distinto que el número que resulta de restar el segundo número del tercero… y este a su vez, es de signo distinto que el resultado de la resta del tercero con el cuarto… y así sucesivamente.

Se asume que el 0 es positivo y negativo ( demostración matemática), por lo que tiene el mismo signo que un número positivo y que un número negativo, y por lo tanto, cualquier secuencia que tenga dos números iguales seguidos, no es una secuencia zigzag.

Por ejemplo:


Datos:   1    5    3   30    8    16  15
Restas:   -4    2   -27   22  -8    1
Signos:   (-)  (+)  (-)  (+)  (-)  (+)

Esta es una secuencia zigzag, porque los signos de sus restas están intercalados.

Dada una secuencia de números, determinar la longitud de la subsequencia zig-zag más grande que se pueda formar con éstos números

una subsecuencia se puede formar eliminando cualquier número de cualquier posición de la secuencia original.

Buscando una solución

cómo sabemos si una secuencia de números es una secuencia zig-zag?

Para determinar esto, necesitamos la resta de los números de la secuencia…


Datos:   1    5    3   30    8    16  15
Restas:   -4    2   -27   22  -8    1

Más concretamente, necesitamos saber la polaridad


Signos:   (-)  (+)  (-)  (+)  (-)  (+)

Eso es! negativo, positivo, negativo, positivo, … eso es lo que buscamos en los números: que:
si hay una resta negativa: después tiene que haber, o bien nada, o bien una resta positiva.

Si hay una resta positiva: después tiene que haber, o bien nada, o bien una resta negativa.

De vuelta al problema… hay que encontrar la subsecuencia zig-zag más larga dentro de una secuencua dada de números. Puedo hacer esto si lo veo como un juego:

¿Cómo convierto una secuencia de números cualquiera, en una secuencia de números zig-zag eliminando la menor cantidad de números posible? Si de convertir se trata, entonces necesitaremos algo más que la polaridad de las restas: también necesitaremos la cantidad de las restas, para saber cuándo un (+) se puede convertir en un (-) luego de eliminar algún número de la secuencia.

Intentemos resolver un problema usando nuestro razonamiento… veamos este caso:


indice: 0   1   2   3   4   5   6   7    8   9
Datos:  1   17  5   10  13  15  10  5    16  8 
Restas:  -16  12  -5  -3  -2  5   5   -11   8
Signos:  (-)  (+) (-) (-) (-) (+) (+) (-)  (+)

Comenzando de izquierda a derecha, podemos ver: -, +, -, ¡-! y encontramos la primera incongruencia en el índice 4! ¿Qué hacemos? tenemos dos opciones:
1 STEP-FORWARD: borrar el índice 4
2 STEP-BACKWARD: borrar el índice 3

¿Cuál de estas dos nos conviene más? no lo sabemos: hay que probar ambas, y ver con cuál se realizarían menos eliminaciones… probemos step-forward: eliminaremos el índice 4:

intentando step-forward


indice: 0   1   2   3   4   5   6   7    8   9
Datos:  1   17  5   10  13  15  10  5    16  8 
Restas:  -16  12  -5  -3  -2  5   5   -11   8
Signos:  (-)  (+) (-) (-) (-) (+) (+) (-)  (+)

*luego de eliminar el índice 4*


indice: 0   1   2   3   4   5   6    7   8 
Datos:  1   17  5   10  15  10  5    16  8 
Restas:  -16  12  -5  -5   5   5   -11   8
Signos:  (-)  (+) (-) (-) (+) (+) (-)  (+)

AAAJÁ!!!!! vieron lo que pasó? lo vieron?! cada vez que eliminas al iésimo número del vector de datos, el iésimo-1 número del vector de restas se suma con el número que tiene a su derecha :D

Ahora, parece obvio que no necesitaremos el vector de datos (de hecho, tampoco necesitaremos un vector de índices ni de signos, pero los dejaremos visibles, ya que ayudan a entender el problema). todo lo que necesitamos es un vector en el que almacenamos las restas de los números!

volvamos a intentar solucionarlo… luego de eliminar el índice 4, se resolvió el problema? parece que no: el problema no se va a solucionar, hasta que el signo del 3er elemento del vector de restas cambie a positivo… así que volvamos a eliminar al índice 4, y hagámoslo hasta que el 3er elemento en el vector de restas se vuelva positivo no olviden que solo hemos eliminado 1 item


indice: 0   1   2   3   4    5    6    7 
Datos:  1   17  5   10  10   5    16   8 
Restas:  -16  12  -5  0    5   -11   8
Signos:  (-)  (+) (-) (?) (+)  (-)   (+)

nope… hay que volver a eliminar el 4… ya llevamos 2 eliminados


indice: 0   1   2   3   4    5    6  
Datos:  1   17  5   10  5    16   8 
Restas:  -16  12  -5  5   -11   8
Signos:  (-)  (+) (-) (+) (-)  (+)

esto sí soluciona el problema! y hemos eliminado a 3 números

¿Qué habría pasado si hubieramos intentado step-backward?

intentando step-backward…

En este camino, intentamos eliminar al número índice 3…


indice: 0   1   2   3   4   5   6   7    8   9
Datos:  1   17  5   10  13  15  10  5    16  8 
Restas:  -16  12  -5  -3  -2  5   5   -11   8
Signos:  (-)  (+) (-) (-) (-) (+) (+) (-)  (+)

luego de eliminar el índice 3…


indice: 0   1   2   4   4   5   6   7    8  
Datos:  1   17  5   13  15  10  5    16  8 
Restas:  -16  12  -8  -2  5   5   -11   8
Signos:  (-)  (+) (-) (-) (+) (+) (-)  (+)

esto no solucionó el problema… ¿Cuándo se solucionará el problema? cuando el número que está a la derecha del índice 3 del vector de las restas cambie de signo! así que vamos a repetir éste proceso, hasta que el 4to índice del vector de restas se vuelva positivo…

 

¿Qué problemas podrían surgir aquí? podría suceder que… de pronto, en una de las eliminaciones, el número del vector de restas que estamos analizando (el que está en negrillas en el código de arriba), cambie de signo, porque entonces, ya no sería congruente con el número anterior, y tendríamos que volver a analizar tooodo el vector. Pero esto no va a pasar porque, para que esto pase, es necesario que el número que está a la derecha de él tenga un signo diferente al número que estamos analizando, y cuando esto suceda, el problema se habrá solucionado, por lo que no sería necesario eliminarlo!

hasta ahora hemos eliminado 1 número

eliminamos el 4to…


indice: 0   1   2   4   4   5   6   7  
Datos:  1   17  5   15  10  5    16  8 
Restas:  -16  12  -10  5   5   -11   8
Signos:  (-)  (+) (-)  (+) (+) (-)  (+)

Esto soluciona el problema! hemos eliminado 2 números

Así que comparemos: qué solución es mejor en este caso?
STEP-BACKWARD: elimina 2 números.
STEP-FORWARD: elimina 3 números.

Creo que es mejor quedarnos con STEP-BACKWARD, ya que solo elimina 2 números.

Más adelante, nos queda un problema por resolver: dos signos + repetidos! creo que la lógica se ha entendido, así que, no lo resolveré paso por paso.

La Secuencia Zig-Zag más larga que se puede formar, es esta:


indice: 0   1   2    4   4   5    6  
Datos:  1   17  5    15  10  16   8 
Restas:  -16  12  -10  5   -6   8
Signos:  (-)  (+) (-)  (+) (-) (+)

y se forma luego de realizar 3 eliminaciones… su longitud es 7=10-3;

La Solución

“Pero dijiste que era una solución que funcionaba en O(n)!! yo solo veo una gran y obvia recurrencia…”

Con este razonamiento, se puede lograr una solución que funciona en O(n)… en serio! no es tan complicado como parece…

Ya que nos convencimos de que no necesitaremos el vector de los datos, transformaremos esto:


indice: 0   1   2   3   4   5   6   7    8   9
Datos:  1   17  5   10  13  15  10  5    16  8 
Restas:  -16  12  -5  -3  -2  5   5   -11   8
Signos:  (-)  (+) (-) (-) (-) (+) (+) (-)  (+)

en esto


indice:  0    1   2   3   4   5   6   7     8
Restas:  -16  12  -5  -3  -2  5   5   -11   8

Como solo vamos a recorrer el vector una vez, imagina que este eres tú: ·u· y que estás en el primer elemento del vector:


indice:  0    1   2   3   4   5   6   7     8
Restas:  -16  12  -5  -3  -2  5   5   -11   8
TÚ:      ·u·

Así que vas a recorrer el vector hasta que encuentres la primera incoherencia, así:


indice:  0    1   2   3   4   5   6   7     8
Restas:  -16  12  -5  -3  -2  5   5   -11   8
TÚ:      ·u·


indice:  0    1   2   3   4   5   6   7     8
Restas:  -16  12  -5  -3  -2  5   5   -11   8
TÚ:           ·u·


indice:  0    1   2   3   4   5   6   7     8
Restas:  -16  12  -5  -3  -2  5   5   -11   8
TÚ:               ·u·

¡haz encontrado tu primera incoherencia! tienes dos opciones: step-forward o step-backward… así que te declaras dos variables: fw=0 (para step-forward) y bw=0 (para step-backward), también te creas otra variable llamada j… y las inicializas así:


bw+=restas[j-1]; fw+=restas[j]
indice:  0    1   2   3   4   5   6   7     8
Restas:  -16  12  -5  -3  -2  5   5   -11   8
TÚ:               ·u·
J:                     j

mientras vas incrementando j… ¿Hasta cuándo hay que repetirlo? hasta que j se salga del vector, o mientras bw tenga el mismo símbolo que restas[j+1] o mientras fw tenga el mismo símbolo que restas[·u·]

¿Por qué? porque bw indica cómo quedaría el número con índice 2 si decides tomar la solución step-backward, así que, en cuanto el número de la derecha (luego de sumarle ‘j’ números) cambie de signo, entonces el problema se habrá solucionado, y se asumirá que se han hecho ‘j – ·u·’ eliminaciones.

Mientras que fw indica cómo quedaría el número con índice 3 si decides tomar la solución step-forward… es casi la misma lógica…

si j se sale del rango, es porque hay que eliminar a todos los que están a partir de tu posición.


bw+=-5; fw+=-3;
indice:  0    1   2   3   4   5   6   7     8
Restas:  -16  12  -5  -3  -2  5   5   -11   8
TÚ:               ·u·
J:                     j


bw+=-8; fw+=-5;
indice:  0    1   2   3   4   5   6   7     8
Restas:  -16  12  -5  -3  -2  5   5   -11   8
TÚ:               ·u·
J:                        j

¡aquí se cumple una condición de salida!
bw es de diferente signo que restas[j+1], por lo tanto, la mejor solución, es backward, en la que se realizan 2 eliminaciones.

Añades las 2 eliminaciones al contador de eliminaciones, saltas hasta j, y continúas tu camino hasta volver a encontrar una incoherencia… si vuelves a encontrar una incoherencia, repites el proceso…


contador de eliminaciones: 2;
indice:  0    1   2   3   4   5   6   7     8
Restas:  -16  12  -5  -3  -2  5   5   -11   8
TÚ:                       ·u·

¡Eso es todo! ahora… a codificar! :D

Si se fijan con atención, con este algoritmo, únicamente es necesario recorrer una vez el vector de restas (que tiene una longitud de n-1), lo cual nos da una complejidad algoritmica de O(n-1) = O(n). Además, si al momento de la lectura de los datos, en vez de almacenarlos en un vector, se restan y estas restas se almacenan directamente en un vector, este algoritmo ocuparía un espacio de O(n).

Steam in-home streaming

El in-home streaming es una característica del Steam, que conectará de forma inalámbrica tu pc con tu televisión (o con cualquier otra pantalla), permitiéndote jugar los juegos instalados en tu computadora con Linux, Microsoft, Mac, o cualquier sistema operativo, en tu televisión, desde la comodidad de tu sofá, y sin tener que mover tu computadora o conectar cables!

Fue anunciado en la jornada de anuncios de Valve, cuando anunció el nuevo SteamOS (un sistema operativo libre basado en Linux, hecho especialmente para videojuegos).

Esto se logrará mediante dispositivos PC-to-TV streaming. Cualquier pantalla que esté conectada a la red local (y que cuente con PC-to-TV streaming devices), podrá acceder a tus juegos en Steam.

Pese a que Valve ha estado muy reservado respecto a esta noticia, los chicos de SteamDB se las han arreglado para sacar un poco de información! :D

Gracias a ellos, les puedo adelantar un poco de cómo funcionará el Steam in-home streaming: básicamente, puedes instalar de forma remota videojuegos, desde tu televisión (o pantalla) a tu PC… luego, puedes jugarlos desde tu televisión, mediante streaming desde tu PC.

Para conseguir esto, necesitarás un dispositivo pc-to-tv streaming, el cual viene en el SteamMachine.

Valve se topará con algunos obstáculos para conseguir esto, uno de ellos es la velocidad de conexión, ya que necesitará transportar (en tiempo real) cientos de imágnes, desde tu computadora hasta tu pantalla, todo esto, de forma inalámbrica.

Sin embargo, circula el rumor de que el LiFi permitirá velocidades exageradamente altas en conexiones inalámbricas, así que, la velocidad no debería ser ningún problema ~_^.

Por último, y como el SteamMachine y el SteamOS van a ser libre, ¡el dispositivo pc-to-tv tiene posibilidades infinitas!

¿Podrá Valve superar los problemas de LAG? ¿Podrá el LiFi desarrollarse en el tiempo oportuno para complementar al pc-to-tv streaming device? ¿Podrá el SteamMachine patear el trasero de las consolas privativas? no te pierdas el siguiente episodio!! XD

P.S.: El in-home streaming aún no ha sido desarrollado por completo, pero Valve está buscando beta-testers, por si te interesa ;)

FUENTES:
http://www.extremetech.com/gaming/168772-can-valve-actually-pull-off-steam-machine-in-home-game-streaming
http://www.destructoid.com/here-s-what-steam-s-in-home-streaming-looks-like-263614.phtml
http://steamdb.info/blog/30/

LaTeX: Problemas con tex-common

¿Tienes problemas al instalar tex-common?

¿Cada vez que intentas compilar con pdflatex aparece este error?

kpathsea: Running mktexfmt pdflatex.fmt
I can't find the format file `pdflatex.fmt'!

¿Cuando intentas re-instalar texlive y tex-common, saltan varios errores del dpkg? ¿y casi al principio del mensaje sale esto?

Sometimes, not accepting conffile updates in /etc/texmf/updmap.d
causes updmap-sys to fail. Please check for files with extension
.dpkg-dist or .ucf-dist in this directory

¿y al final, sale esto?

Errors were encountered while processing:
tex-common
texlive-latex-base
texlive-latex-recommended
latex-xcolor
pgf
latex-beamer
texlive-generic-recommended
texlive-pstricks
prosper
texlive-fonts-recommended
texlive
texlive-extra-utils
texlive-font-utils
texlive-luatex
tipa

Antes de intentar instalar un nuevo font en tu LaTeX todo corría de maravilla, y después, misteriosamente dejó de funcionar?

entonces… tienes el mismo problema que yo tuve!! intenta seguir estos pasos:

abre con tu editor favorito este archivo:

/etc/texmf/web2c/updmap.cfg

Ese archivo debe contener una línea que está causando el error; más concretamente, una línea que se verá algo así:

Map *.map

Pero, el archivo *.map no existe. Comenta esa línea (probablemente la única del archivo) así:

#Map *.map

luego, ejecuta esto en la terminal (como root):

#updmap-sys
#dpkg --configure -a

y listo! tu pdflatex debería funcionar bien ahora :3

Para más información, lee esto:  https://bugs.launchpad.net/ubuntu/+source/tex-common/+bug/1017675/comments/5  btw, gracias a @shakaran87 por tan brillante análisis :D

Hola WordPress!

Adiós Tumblr!

Me estoy mudando a WordPress! y esta es la antigua dirección de mi blog: http://bengalaa.tumblr.com/

Por qué? bueno.. hay muchas razones… empezando por:

Tumblr no es Opensource. WordPress sí lo es

luego de leer esto me convencí de que tumblr no es opensource, lo cual tiene mucho sentido! está muy bugueado… la pantalla de mi laptop es un poco más pequeña que las pantallas promedio. Y siempre tengo problemas escribiendo en tumblr! la página no se ajusta correctamente a mi tipo de pantalla.

Además, tarda mucho en cargar… su página es endemoniadamente pesada, y tengo que esperar varios minutos para que cargue la interfaz para publicar blogs :S

Por otro lado, WordPress es OpenSource, y es un sistema bastante popular entre usuarios… cómo lo digo? bueno, usuarios “hardcore”, pueden leer más sobre WordPress si están interesados.

¿Comentarios?

Tumblr no ofrece un sistema de comentarios, para permitir comentarios en el blog, hay que confiar en 3th party hosts. Yo uso Disqus, y últimamente me ha estado dando problemas, no he podido revisar los últimos comentarios que han entrado a mi blog ·n·

Publicar Código

ES UNA PESADILLA! creo que tumblr fue diseñado para que niñitas adolescentes hablen sobre sus delirios de farándula. Su interfaz es muy sencilla, y no te deja hacer nada más que: insertar fotos, links, tachar, bold e itálica, para insertar código, deberás acudir a su interfaz html (que también está muy bugueada, por cierto) e insertar las etiquetas por tu cuenta.

Por otra parte, WordPress, ofrece esto Writing Code in Your Posts para publicar código, (aún no lo leo por completo XD, pero se ve bastante prometedor).

Además… WordPress es Opensource… lo que quiere decir que es más personalizable y que estará menos buggy (etc)

That’s it folks! gracias por seguirme, y espero que me sigan en mi nuevo blog también = ^ w ^ =

(Migración de Tumblr a WordPress, fecha original: 2013-09-10)

emacs + YASnippet

Estuve buscando por todas partes un .el que, cada vez que escribiera el principio de un tag, este plugin autocompletara el final del tag, y pusiera mi cursor al medio.

Al final lo encontré en la forma de una herramienta mucho más completa, que no solo funciona con tags, sino con  C, C++, C#, Perl, Python, Ruby, SQL, LaTeX, HTML, CSS y más~, dejaré aquí las instrucciones para instalarlo… si todo lo que dije aquí no funciona, o si quieres aprender más sobre YASnippet y cómo añadirle la opción popup, no olvides ver los enlazes en la última sección “fuente”…

¿Cómo? :D

En realidad, es bastante fácil ~_^

Descarga del paquete

Puedes descargar un .zip de esta dirección: https://github.com/capitaomorte/yasnippet/archive/master.zip y luego descomprimirlo en tu ~/.emacs.d/plugins/ (si la carpeta plugins no existe, créala)

También puedes clonar el repositorio en tu ~/.emacs.d/plugins con un


 $ cd ~/.emacs.d/plugins/
 $ git clone https://github.com/capitaomorte/yasnippet.git
 $ cp -r ~/.emacs.d/plugins/yasnippet/snippets ~/.emacs.d/plugins/

Instalación

Luego, solo añades éstas líneas a tu .emacs:

;;YASnippet
(add-to-list 'load-path "~/.emacs.d/plugins/yasnippet") (require 'yasnippet)
(yas-global-mode 1)

;;popup on YASnippet
(require 'popup)
(require 'yasnippet)

;; add some shotcuts in popup menu mode
(define-key popup-menu-keymap (kbd "M-n") 'popup-next)
(define-key popup-menu-keymap (kbd "TAB") 'popup-next)
(define-key popup-menu-keymap (kbd "<tab>") 'popup-next)
(define-key popup-menu-keymap (kbd "<backtab>") 'popup-previous)
(define-key popup-menu-keymap (kbd "M-p") 'popup-previous)

(defun yas/popup-isearch-prompt (prompt choices &optional display-fn)
(when (featurep 'popup)
(popup-menu*
(mapcar
(lambda (choice)
(popup-make-item
(or (and display-fn (funcall display-fn choice))
choice)
:value choice))
choices)
:prompt prompt
;; start isearch mode immediately
:isearch t
)))

(setq yas/prompt-functions '(yas/popup-isearch-prompt yas/no-prompt))

y listo · w ·

Uso…

para usarlo… tienes que escribir una “palabra clave” y luego presionar TAB. Por ejemplo, crea un archivo .html y escribe “div”, luego, presiona tab y selecciona el esqueleto que quieras usar :D

O… entra a un archivo .cpp, escribe “main” y presiona TAB…

Para ver cuáles son palabras clave disponibles, puedes revisar el menú YASnippet (dentro de emacs, la barra superior), y en la primera parte del menú (antes de la primera división de “——————-“) puedes ver *-mode >, y cuando pongas tu cursor sobre eso, aparecerán todos los “snippets” disponibles para el modo de edición en el que estás, y a la derecha de cada uno, la palabra clave que debes insertar, seguido de un “=>”.

Si algo falla, o si quieres aprender más sobre este plugin, te recomiendo estos links:

https://github.com/capitaomorte/yasnippet <— Github de YASnippet
http://iany.me/2012/03/use-popup-isearch-for-yasnippet-prompt/ <— explicación de popups para YASnippet

(Migración de Tumblr a WordPress, fecha original: 2013-09-01)

Emacs: Autocomplete

MasterCard propaganda

Tener Emacs configurado a tu medida: NO TIENE PRECIO

Finalmente logré configurar mi emacs para que funcione con autocomplete! Es fácil, y escribiré un mini tutorial de cómo hacerlo. (Si esto no funciona, talvez deberías leer esto: http://cx4a.org/software/auto-complete/manual.html#Installation ).

Lo primero es descargar el autocomplete. Para hacerlo, sigue este link: http://cx4a.org/software/auto-complete/index.html#Latest_Stable y descarga el *.tar.bz2 Una vez descargado, descomprímelo, para descomprimirlo mediante la consola, accede al directorio en el que descargaste el paquete, y escribe estas líneas:

~/Downloads/ $ tar jxf auto-complete-x.x.x.tar.bz2

Una vez descomprimido, puedes ejecutar el script de instalación (lo cual simplifica muuuucho~ las cosas) el script se encuentra en auto-complete-x.x.x/etc/install.el

Para ejecutar el script, entra a la carpeta auto-complete-x.x.x y haz lo siguiente:

$ make install DIR=$HOME/.emacs.d/

(DIR=$HOME/.emacs.d/ sirve para indicar en dónde está tu emacs).

Por último, para que tu emacs cargue el auto-complete cada vez que arranque, deberás modificar tu .emacs

Para hacer esto, recomiendo fuertemente que hagas un backup, así (tienes que estar como root):

# cd ~
# cp .emacs .emacs.bk

Hasta aquí, hemos creado un backup del archivo, si todo sale mal no entres en pánico!Siempre puedes volver al backup que haz hecho ejecutando:

# cp .emacs.bk .emacs (en caso de pánico)

Ahora sí, vamos a modificar el archivo de arranque del emacs, configurándolo para que cargue el auto-complete… Abre el archivo para su edición con tu editor favorito (por ejemplo, emacs)

$ emacs .emacs & (yo dawg, I herd you like emacs…)

Añádele las siguientes líneas al archivo:

;; Autocomplete
(add-to-list ‘load-path “/home/vg/.emacs.d/”)
(require ‘auto-complete-config)
(add-to-list ‘ac-dictionary-directories “/home/vg/.emacs.d//ac-dict”)
(ac-config-default)

El ‘;;’ es un comentario para documentar. Puedes no documentar, pero no es recomendable, a menos que quieras tener una sopa de código ilegible en el futuro ~_^

y eso es todo~~ si quieres aprender más sobre emacs:

RTFM! (sobre cc mode: http://cc-mode.sourceforge.net/html-manual/ )

Estaré publicando algunas cosas que aprenda sobre configurar el .emacs, pero hasta entonces, estaré RTFM XD Suerte con eso! Y recuerda… para todo lo demás, existe MasterCard ~_^

(Migración de Tumblr a WordPress, fecha original: 2013-10-15)

Competitive Programming

“Given well-known Computer Science (CS) problems, solve them as quickliy as possible!”

Durante todo el 1er semestre (y de hecho, incluso ahora) estuve obsesionada con encontrar mi propia solución a muchos problemas de algoritmia, nunca busqué en internet la solución a ningún problema de programación (a excepción del problema de pasar de notación INFIX  a POSTFIX). Pero en estos últimos días me di cuenta de algo: no tiene sentido continuar así · n ·

Pero, antes de que muchos de mis amigos que aún persisten en la insesante lucha de encontrar sus propias soluciones saquen sus antorchas y quieran quemarme en una hoguera por hereje (Gustavo Callejas :D), permítanme explicar el fundamento de tan herética proposición:

Como desarrolladores, tenemos que ser rápidos, tenemos que encontrar la solución más apropiada para los problemas, pero, si cada vez que nos topamos con algún problema, pretendemos querer solucionarlo desde 0, no solo tardaremos mucho, sino que también, nuestra solución podría no ser la más adecuada.

Podremos ver nuevos horizontes, si y solo si, nos paramos sobre los hombros de los gigantes.

Hay que aceptar que, gran parte de los problemas de algoritmia, ya fueron solucionados por otros programadores brillantes, quienes a su vez, también utilizaron, entendieron y adaptaron, las soluciones de otros programadores brillantes.

¡Ya habrá tiempo para solucionar problemas de algoritmia sin solución! por ahora, es mejor entender todas las soluciones que ya han sido planteadas para poder proponer las nuestras en un futuro (espero, no muy lejano), y que estas soluciones que nosotros contribuyamos (en el futuro), ayuden a otros programadores novatos a solucionar problemas “solucionables” en los contests.

¿Pero… si esto fuera cierto, entonces la ACM-ICPC (y todos los contests de competitive programming) se reducen a copiar, pegar y ver quién typea más rápido? ¡no del todo!

Como desarrolladores, en los contests, tenemos que llevar a los límites nuestro conocimiento de algoritmos, identificando problemas, encajándolos en algoritmos conocidos… está de más decir que, para hacer esto, es necesario conocer muy bien las limitaciones y ventajas de cada uno de los algoritmos, así como su funcionamiento ~_^

Así que, con este post, quiero despedirme de mi orgullo (infundado)… de ahora en adelante, bucaré soluciones parciales!

(Migración de Tumblr a WordPress, fecha original: 2013-10-04)