Archive

Archive for the ‘Explanations’ Category

Script for downloading LFPW

November 23, 2012 1 comment

Today I needed to download (thus parse) the Labeled Face Parts in the Wild (LFPW). Although it seems an straight forward task, as the datasets have the urls, many of them are dead/broken or pointing to something else.

I thought it will take me a couple of minutes to put an script an have everything running smoothly. However, I found that the urls sometimes download html files, or garbage gifs. So I need to analyze the output and then choose some files and discard the others. And because I don’t want to do it manually, I put a script to achieve it.

My solution is in awk, probably it may be easier in pearl or python but I started with awk and stick with it.

To run it, you should be in the directory in which you want the images to end up.

awk '/average/ {
  result = ""
  download = ""
  name = ""
  cmd = "wget -t 1 -nv " $1 " 2>&1"
  while ( (cmd | getline line) > 0 )
    result = result " " line
  close(cmd)
  print "res: " result > "/dev/stderr"
  if (result != "" && match(result,/ERROR/) == 0) {
    match(result,/".+"/);
    downloaded = substr(result,RSTART+1,RLENGTH-2)
    print "file: " downloaded > "/dev/stderr"
    if (match(downloaded,/\.(htm|php|gif)/) != 0) {
      print "deleting: " downloaded > "/dev/stderr"
      system("rm \"" downloaded "\"")
    } else {
      if( match(tolower(downloaded),/\.(jpg|jpeg|bmp|png)$/) == 0 ) {
        if( match(tolower(downloaded),/\.(jpg|jpeg|bmp|png)/) != 0 )
          downloaded_fix = substr(downloaded,1,RSTART) substr(downloaded,RSTART+RLENGTH+1,length(downloaded))
        else
          downloaded_fix = downloaded
        name = downloaded_fix ".jpg"
        print "adding ext: " downloaded_fix > "/dev/stderr"
        system("mv \"" downloaded "\" \"" name "\"")
      } else
        name=downloaded
      print "writting: " name > "/dev/stderr"
      print name, $0
    }
  } else
    print "skipping: " name > "/dev/stderr"
  print "\n" > "/dev/stderr"
}' ../kbvt_lfpw_v1_train.csv > ../fixed_train.txt 2> ../train.log

Some comments about the code:

  • I’m processing only the “average” worker, and ignoring all the other (3) entries.
  • I choose to change the extension of the files that download without one to jpg (you may change it to something else if needed—line 23).
  • Also I’m deleting all the htm(l), php, and gifs that may be downloaded (line 14).
  • I’m checking the extensions directly, as the files that download have really random names (and I’m mean it: 86f6ec6e-9de5-11de-805f-588d52b6bd80, how is that an image name?… moving on), but you may add another ones if needed (I didn’t check thoroughly)—line 18.
  • When a downloaded file name already exist wget adds a suffix .# to the file. Thus, I’m stripping the possible extensions from each file, if it doesn’t end with a valid extension but contains such extension (line 20).
  • All the log messages (print ... > "/dev/stderr") are redirected to the standard error. That’s why at the end you get them with “2> ../<yourfile>” (line 28).
  • And to get the new list of files that were downloaded you redirect the standard output to your file by “> ../<fixed-file>” (line 34).

I haven’t checked all the files, but that is the first version. Any improvements are welcomed. :mrgreen:

Crowdfunding: una alternativa para Guatemala

July 17, 2012 6 comments

Una de las barreras: financiamiento

En mi post anterior hablaba de las posibilidades de realizar investigación en Guatemala. Uno de los principales problemas es el financiamiento. Aunque no todas las ramas de la investigación requieran grandes y complejas máquinas, muchos químicos, u otros aparatos raros, todas necesitan personas capacitadas que puedan hacer investigación: investigadores, y necesitan acceso a librerías actualizadas (acceso a los artículos publicados, y que tienden a ser muy caros debido a los editoriales que mantienen un monopolio—pero de eso en otra ocasión). Entonces,  ¿como podemos atraer capital de riesgo o bien tener instituciones que den subsidios científicos?

Si bien es difícil obtener inversiones en proyectos nuevos, en los cuales los inversionistas buscan equidad en la nueva compañía, y saben que tendrán un retorno de la inversión cuando esta tenga éxito. Que pasaría con la investigación, que en su mayoría avanza el conocimiento de la humanidad, pero no es siempre comerciable. Lo que implica que no hay retorno de inversión, y pues nuestros inversionistas desaparecen tan rápido como los resultados fallidos en dicha investigación.

En los países en los que el gobierno invierte en investigación, una solución es aplicar a subsidios científicos, que son manejados a través de las universidades. Éstas toman una parte de los subsidios, y lo utilizan para mantener las bibliotecas actualizadas (entiéndase acceso a revistas científicas—¿todavía compran libros?), servicios, y muchas otras cosas. Luego, las universidades crean un fondo para el investigador, le dan acceso, y mantienen un tipo de auditoria sobre los investigadores (para asegurar que los fondos sean invertidos sabiamente). Sin embargo, en Guatemala no tenemos un gobierno que apoye la investigación, ni mucho menos universidades que estén listas para manejar estos fondos.

Lo convencional

En el resto del mundo, el modelo actual de subsidios científicos es similar a un grupo de caza talentos. Debido a la falta de fondos, que provienen del gobierno o de algunas minorías que invierten esperando algún retorno, y a la creciente cantidad de científicos, obviamente, no todos podrán llevarse una parte a su casa. ¿Y entonces, como funciona? Todos los interesados escriben una propuesta, ésta es evaluada, y si promete (entregar resultados, y no morir en el intento) es financiada. Algunas veces, tener una gran carrera, ideas que suenan sensatas y seguras, conocer y llevarse bien con los que evalúan suele ayudar.

Sin embargo, hay un gran problema. ¿Qué pasa con las ideas que no son “tan sensatas”, las ideas revolucionarias? Estas ideas la mayoría del tiempo son dejadas de lado porque no aseguran que los fondos se utilicen correctamente. ¿No sería magnifico que todos pudieran jugar, sin importar lo loco que suene (al menos por ahora)? El dejar que un grupo reducido decida quienes obtienen o no los fondos, y que ideas son las que pueden seguir adelante puede ser un poco peligroso, ¿no lo creen?

Las ideas que desentonan con lo común (o con lo que los evaluadores consideran “común”) y las ideas pequeñas, son dejadas de lado. Y peor aún, la innovación se entorpece. El modelo actual prefiere mantener ideas que se construyen progresivamente sobre otras ideas (y no es que este mal), pero podríamos dar algún salto de vez en cuando (podríamos tirar un poco de mutación en el asunto—para los que creen en la evolución).

¿Tenemos alguna alternativa?

¿Crowdfunding?

Que tal si pensamos en el colectivo, y eliminamos al intermediario: los que financian dichos subsidios. Últimamente, los subsidios provienen del pueblo a través de impuestos. Podríamos de igual manera pedir ese dinero directamente al pueblo (aunque tengan que seguir pagando impuestos 😦 , o no?). El crowdunding puede resumirse como la cooperación (donación) de un colectivo para financiar algún proyecto. En concreto la wikipedia lo define como:

Financiación en masa (del inglés crowdfunding), […] es la cooperación colectiva, llevada a cabo por personas que realizan una red para conseguir dinero u otros recursos, se suele utilizar Internet para financiar esfuerzos e iniciativas de otras personas u organizaciones. Crowdfunding puede ser usado para muchos propósitos, desde artistas buscando apoyo de sus seguidores, campañas políticas, financiación del nacimiento de compañías o pequeños negocios.

Wikipedia, 2012

Entonces, si tenemos un colectivo que este dispuesto a apoyarnos podemos recolectar la misma cantidad que un inversionista, o incluso aún más. Adicionalmente, todo lo que se recauda no es visto como una inversión como tal, sino como una donación. Por ejemplo, en el caso de un inversionista, él querrá llevarse la mitad (o más) de la compañía, de las ganancias, y de todo lo que se produzca. Por otro lado, el colectivo esta donando y apoyando por que cree en el proyecto, y no espera ninguna ganancia de ello. Actualmente, el modelo de crowdfunding, premia a los donadores con artículos únicos, o al menos diseñados para reflejar el proyecto, para motivarlos a participar en el futuro.

Este modelo suele utilizar el internet como plataforma para alcanzar la mayor cantidad de personas, y entre los mayores sitios se encuentran Kickstarter, RocketHub, IndieGoGo, entre otros.

Crowdfunding science

La mayoría de proyectos de los sitios dedicados al crowdfunding están orientados a vídeos, música, arte, juegos electrónicos, y publicaciones (ver la figura de abajo). Es interesante notar que, aunque las donaciones eran constantes, no superaban las cantidades que los inversionistas proveían. Sin embargo, todo eso cambió con un proyecto que logro pasar de $99 a 7 millones de dolares, en 18 días, y que al momento de escribir este post tiene más de 10 millones de dolares en donaciones. Este hito marca el inicio de una nueva era en donde ya no es necesario un intermediario (un inversionista y su capital de riesgo) para lanzar proyectos o compañías con capital igual o mayor al obtenido a través de otros medios.

kickstarter 3 years summary

3 años de Kickstarter (vean el link de la imágen para más detalles)

Actualmente, un experimento (#SciFund) intenta promover proyectos científicos a través de estas plataformas (ellos usan RocketHub), y lo están logrando. Ya lograron financiar al menos 43 proyectos exitosamente. Inclusive, ya hay precedentes de que este tipo de subsidios puede usarse en el modelo existente de subsidios científicos. En este ejemplo, la universidad toma el dinero, lo pone a disposición de los investigadores, y proveerá la transparencia para que los beneficiarios de las donaciones (los investigadores) puedan obtener el dinero—como lo nota una investigadora que participa en #SciFund. Además, esto les da garantías y beneficios a los estudiantes que trabajan con ella. Esto demuestra que cuando hay voluntad puede hacerse mucho.

Como bien lo dicen en #SciFund, el futuro esta en el crowdfunding. Acá puedes motivar a tu público, mostrarles que lo que haces vale la pena, y conseguir donaciones si logras motivarlos. Ya no hay que esperar a que “nos den permiso”, ni mucho menos esperar a ser el “escogido” según los estándares de la ciencia actual. Puedes proponer ideas revolucionarias, que mientras sean coherentes y motiven al colectivo, vas a tener fondos para seguir trabajando.

Crowdfunding en austeridad

En Guatemala no creo que estemos lejos de todas estas ideas. Los guatemaltecos tenemos innovación, y sed de crear (sino miren la chispa del chapin para inventar cada vuelta a la realidad en la que vivimos). Más aún, los guatemaltecos podemos apoyarnos unos a otros y ayudarnos a salir adelante. Ya va siendo hora de romper el paradigma de “la olla de cangrejos”. Además, estas plataformas nos permiten alcanzar a un publico global; que sí logramos motivarlos pueden apoyarnos también.

El secreto de el crowdfunding es motivar a un grupo de personas a que crean en el proyecto, y que crean en los que lo están desarrollando. Es una cuestión de construir una “red de fans” que nos van a apoyar en los momentos difíciles. Y de igual manera les vamos a recompensar por su apoyo. Para poder alcanzar al publico no hace falta más que las ganas de comunicar y de compartir. Y de esto hay muchos ejemplos de personas que comparten la ciencia al publico en general: minute physicsVi Hart, sixty symbols, y otros que lo hacen con más sátira, xkcd, abstruse goose, the oatmeal, entre otros. Y no es que todo tenga que ser 100% jerga y tecnicismos, sino que tiene que ser 100% corazón. Como dijo Einstein (creo), sino se lo puedes explicar a tu abuela, entonces no lo sabes. La idea es la misma, hay que comunicar.

Conclusión

Si bien la solución a falta de fondos locales puede ser el crowdfunding, el camino para llegar ahí aún esta lejos. Para poder siquiera pensar en iniciar una campaña se necesita construir una red que apoye el proyecto en donde se necesiten los fondos. Se necesita estar en contacto con el colectivo, y compartir los avances. Luego de tener esa plataforma inicial, podemos pensar en iniciar a recaudar fondos. Y las metas iniciales no tienen que ser astronómicas, podemos iniciar con una recaudación tan simple como una computadora, o el dinero para una publicación, y luego irnos moviendo a ligas mayores.

Esto me pone a pensar, tenemos ya varios sitios de divulgación científica, incluso un grupo en facebook, pero el alcance que tienen otros sitios no se asemeja. Tal vez es momento de detenernos y preguntar: ¿Qué estamos haciendo mal? ¿Qué necesitamos hacer para poner en marcha una reacción en cadena, que motive a las personas a apoyar la ciencia en Guatemala? O tal vez, ¿qué acciones hay que tomar para posicionarla a nivel mundial?

Sueño muy alto, pensaran algunos, pero son los que creen que pueden cambiar el mundo, los que terminan haciéndolo (o algo así). No digo que lo vaya  a hacer, al menos solo, pero juntos, creo que es posible. Mi conclusión con más preguntas que respuestas, pero hay que hacerlas.

Using TikZ Chains Library with labeled edges extension

January 19, 2012 1 comment

The other day I need to create a diagram, and went in the TikZ way. I was using the chains library to produce the diagram. But I face some problems, I needed to add labels to the edges created by the chain. However, this is not supported natively by the library.

I found a cool code that exemplifies how to add the edges to the chain, but it removes the old notation

\chainin (node) [join=with srcNode by style]

and make you use a new definition. However, I still need to use the styles and the source node notation. So, I start digging in the chains library code and modify it to allow the use of the label notation from other examples. The fix is

\makeatletter
\def\tikz@lib@parse@join#1{%
  \def\tikz@temp{#1}%
  \ifx\tikz@temp\pgfutil@empty%
    \tikz@lib@parse@join@by by \pgf@stop%
  \else%
    \pgfutil@in@{with }{#1}%
    \ifpgfutil@in@% 'with [by] [label]'
      \pgfutil@in@{by }{#1}%
      \ifpgfutil@in@% 'with by [label]'
        \pgfutil@in@{label }{#1}%
        \ifpgfutil@in@% 'with by label'
          \tikz@lib@parse@join@with@by@label#1\pgf@stop%
        \else% 'with by'
          \tikz@lib@parse@join@with@by#1\pgf@stop%
        \fi%
      \else% 'with [label]'
        \pgfutil@in@{label }{#1}%
        \ifpgfutil@in@% 'with label'
          \tikz@lib@parse@join@with@label#1\pgf@stop%
        \else% with
          \tikz@lib@parse@join@with@by#1 by \pgf@stop%
        \fi%
      \fi%
    \else% '[by] [label]'
      \pgfutil@in@{by }{#1}%
      \ifpgfutil@in@% 'by [label]'
        \pgfutil@in@{label }{#1}%
        \ifpgfutil@in@% 'by label'
          \tikz@lib@parse@join@by@label#1\pgf@stop%
        \else% 'by'
          \tikz@lib@parse@join@by#1\pgf@stop%
        \fi%
      \else% '[label]'
        \pgfutil@in@{label }{#1}%
        \ifpgfutil@in@% 'label'
          \tikz@lib@parse@join@label#1\pgf@stop%
        \else%
          \tikz@lib@parse@join@by#1 by \pgf@stop%
        \fi%
      \fi%
    \fi%
  \fi%
}
\def\tikz@lib@parse@join@with@by@label with #1 by #2 label #3\pgf@stop{%
  \tikzset{after node path={(#1)edge[every join,#2]#3(\tikzchaincurrent)}}%
}
\def\tikz@lib@parse@join@with@label with #1 label #2\pgf@stop{%
  \tikzset{after node path={(#1)edge[every join]#2(\tikzchaincurrent)}}%
}
\def\tikz@lib@parse@join@by@label by #1 label #2\pgf@stop{%
  \tikzset{after node path={\ifx\tikzchainprevious\pgfutil@empty\else(\tikzchainprevious)edge[every join,#1]#2(\tikzchaincurrent)\fi}}%
}
\def\tikz@lib@parse@join@label label #1\pgf@stop{%
  \tikzset{after node path={\ifx\tikzchainprevious\pgfutil@empty\else(\tikzchainprevious)edge[every join]#1(\tikzchaincurrent)\fi}}%
}
\makeatother

This allows one to use the chains like:

\chainin (node) [join=with anotherNode by myStyle label {node[above] {some Tag}}];
\chainin (node) [join=by myStyle label {node[above] {some Tag}}];

Note that the order needs to be maintained, so you can use [with] [label] [tag] and omit any of those, while the order is maintained. A minimal working example is below:

\documentclass{standalone}

\usepackage{tikz}
\usetikzlibrary{shapes,% for the rectangle
                chains,% provides the chains
                scopes}% allows to replace \begin{scope} \end{scope} with {}

\makeatletter
\def\tikz@lib@parse@join#1{%
  \def\tikz@temp{#1}%
  \ifx\tikz@temp\pgfutil@empty%
    \tikz@lib@parse@join@by by \pgf@stop%
  \else%
    \pgfutil@in@{with }{#1}%
    \ifpgfutil@in@% 'with [by] [label]'
      \pgfutil@in@{by }{#1}%
      \ifpgfutil@in@% 'with by [label]'
        \pgfutil@in@{label }{#1}%
        \ifpgfutil@in@% 'with by label'
          \tikz@lib@parse@join@with@by@label#1\pgf@stop%
        \else% 'with by'
          \tikz@lib@parse@join@with@by#1\pgf@stop%
        \fi%
      \else% 'with [label]'
        \pgfutil@in@{label }{#1}%
        \ifpgfutil@in@% 'with label'
          \tikz@lib@parse@join@with@label#1\pgf@stop%
        \else% with
          \tikz@lib@parse@join@with@by#1 by \pgf@stop%
        \fi%
      \fi%
    \else% '[by] [label]'
      \pgfutil@in@{by }{#1}%
      \ifpgfutil@in@% 'by [label]'
        \pgfutil@in@{label }{#1}%
        \ifpgfutil@in@% 'by label'
          \tikz@lib@parse@join@by@label#1\pgf@stop%
        \else% 'by'
          \tikz@lib@parse@join@by#1\pgf@stop%
        \fi%
      \else% '[label]'
        \pgfutil@in@{label }{#1}%
        \ifpgfutil@in@% 'label'
          \tikz@lib@parse@join@label#1\pgf@stop%
        \else%
          \tikz@lib@parse@join@by#1 by \pgf@stop%
        \fi%
      \fi%
    \fi%
  \fi%
}
\def\tikz@lib@parse@join@with@by@label with #1 by #2 label #3\pgf@stop{%
  \tikzset{after node path={(#1)edge[every join,#2]#3(\tikzchaincurrent)}}%
}
\def\tikz@lib@parse@join@with@label with #1 label #2\pgf@stop{%
  \tikzset{after node path={(#1)edge[every join]#2(\tikzchaincurrent)}}%
}
\def\tikz@lib@parse@join@by@label by #1 label #2\pgf@stop{%
  \tikzset{after node path={\ifx\tikzchainprevious\pgfutil@empty\else(\tikzchainprevious)edge[every join,#1]#2(\tikzchaincurrent)\fi}}%
}
\def\tikz@lib@parse@join@label label #1\pgf@stop{%
  \tikzset{after node path={\ifx\tikzchainprevious\pgfutil@empty\else(\tikzchainprevious)edge[every join]#1(\tikzchaincurrent)\fi}}%
}
\makeatother

\begin{document}
\begin{tikzpicture}[
  nonterminal/.style={
    rectangle,
    minimum size=6mm,
    very thick,
    draw=red!50!black!50,
    top color=white, % a shading that is white at the top...
    bottom color=red!50!black!20, % and something else at the bottom
    font=\itshape
  },
  terminal/.style={
    rectangle,minimum size=6mm,rounded corners=3mm,
    very thick,draw=black!50,
    top color=white,bottom color=black!20,
    font=\ttfamily
  },
  every on chain/.style={join}, every join/.style={->}
]

\matrix[column sep=4mm] {
  % First row:
  & & & & \node (plus) [terminal] {+};&\\
  % Second row:
  \node (ui1)   [nonterminal] {unsigned integer};&
  \node (dot)   [terminal]    {.};               &
  \node (digit) [terminal]    {digit};           &
  \node (e)     [terminal]    {E};               &
  & % space in between
  \node (ui2) [nonterminal] {unsigned integer};\\
  % Third row:
  & & & & \node (minus)[terminal] {-};&\\
  };

{ [start chain]
  \chainin (ui1);
  \chainin (dot);
  \chainin (digit);
  \chainin (e);
  { [start branch=plus]
    \chainin (plus) [join=label {node[above left]{a label}}];
  }
  { [start branch=minus]
    \chainin (minus);
  }
  \chainin (ui2) [join=with chain/plus-end label {node[above right] {plus label}}, join=with chain/minus-end by dashed label {node [below right]{minus label}}];
}
\end{tikzpicture}
\end{document}

MWE of the code aboveHTH… :mrgreen:

PS. This post was inspired by this TeX.SX question, and I put this answer also there. You can found more about (La)TeX there.

Decimal alignment in LaTex tables

October 11, 2011 1 comment

So, I always look for this when I need it. However, I always keep forgetting it. So I decide to put it here for a little reminder.

Have you tried to align decimal in LaTex before? Did you do like this:

\begin{tabular}{r@{.}l}
  Heading\\
  3&14159\\
  16&2\\
  123&456\\
\end{tabular}

Have you try to type a lot of numbers using this notation? Painful, isn’t it? Is there an easier way?, you may ask. Yes there is, dcolumn to the rescue! The package dcolumn can save you a lot of typing time. The way to use it is really simple.

\usepackage{dcolumn}
\begin{tabular}{D{.}{.}{3.5}}
  \multicolumn{1}{c}{Heading}\\
  3&14159\\
  16&2\\
  123&456\\
\end{tabular}

Notice that in this example you need to use \multicolumn in the heading of that column. Nevertheless, dcolumn has a big notation, but you can replace it by a new definition using the \newcolumntype command. Then you would have something like this:

\usepackage{dcolumn}
\newcolumntype{d}[1]{D{.}{.}{#1}}
\begin{tabular}{d{3.5}}
  \multicolumn{1}{c}{Heading}\\
  3&14159\\
  16&2\\
  123&456\\
\end{tabular}

Hope this helps! :mrgreen:

TEDxCaltech: Quantum Computing

February 28, 2011 Leave a comment

Retos demográficos

February 28, 2011 1 comment

Los países desarrollados se están volviendo viejos! Y los países en desarrollo estamos emergiendo, somos países jóvenes, y de jóvenes. Este fin de semana que paso estuve viendo el programa de redes Envejecemos y seremos menos. Y toca el tema del cambio demográfico, que ya esta sucediendo en países europeos y pronto le tocará a China; y que tarde o temprano nos llegará a todos conforme vayamos desarrollándonos.

El desarrollo envejece

El desarrollo conlleva una mejor calidad de vida; con este aumento las personas llegan a vivir más y mejor, y con esto se reduce la cantidad de hijos que cada pareja tiene. En Europa, ya se tiene un hijo (y decimales) por pareja. Y no digamos en China, donde la tasa esta reduciéndose mucho más. Es natural el que la natalidad disminuya, porque los padres tendrán más recursos para disfrutar su vida, con lo que se dedicarán a ellos y al final podrán dedicarse a tener hijos. Pero, a diferencia de antes, no es necesario el tener muchos hijos para asegurar la progenie; ahora un hijo asegura la descendencia.

Los jóvenes mantendrán a los viejos

Todas estas personas mayores, una vez terminado su tiempo laboral, se jubilaran.  Serán los jóvenes, los que estén trabajando, los encargados de mantener en movimiento la máquina de la economía. Aunque se tienen ideas de que este sistema no es sostenible; ya que los jóvenes son menos y los viejos aumentan más cada día. De modo que, una solución, y sera la clave para la sostenibilidad de los países, es la mezcla de estos relativos “viejos” con los jóvenes para mantener la economía andando.

Equipos mixtos, pueden ser la clave para el desarrollo. Incluyéndole a esto la mejora en la salud, pueden ser las claves para que las personas mayores puedan trabajar más, y mantener el sistema, tanto económico como de pensiones, funcionando.

En un futuro, se necesitaran profesionales

Si pensamos en que mantendremos equipos mixtos, en donde jóvenes y viejos trabajaran de la mano, para poder mantenerse competentes necesitaran tener las herramientas para estar a la altura. Necesitaremos ser productivos y creativos, cuando viejos, para no perder el trabajo. A pesar de que estas personas, las mayores, ocupen puestos de trabajo, no implica que desplacen los trabajos de los jóvenes; al contrario, al tener más experiencia, pueden crear nuevas posiciones de trabajo e incrementar la demanda.

En este marco de trabajo, se necesitaran profesionales para poder satisfacer la demanda de trabajos cada vez más intelectuales. Donde las personas posean ciertas características, modelos mentales y habilidades específicas que les permitirán desarrollarse y mantener cierto nivel durante más tiempo.

Migración de profesionales

Hace unas décadas, en los países desarrollados se necesitaban inmigrantes para poder hacer las tareas que los locales no querían realizar. Necesitaban mano de obra para trabajos manuales, que nadie estaba dispuesto a realizar; esto abrió las puertas a otros países para poder entrar y conseguir trabajo. De igual manera, una nueva migración iniciará, pero esta sera de mentes brillantes. Todo esto se traducirá en que, esta generación de potenciales profesionales, que se esta preparando, podrá ser la generación que vea el cambio. Será la generación que verá las puertas abrirse de par en par, con oportunidades en los países desarrollados.

Y será esta generación la que tendrá que sentar las bases para que las generaciones que vienen detrás puedan desarrollar competencias que les permitan mantenerse activas durante más tiempo. Activas, en el sentido intelectual, ya que tendrán que producir ideas para poder mantener la economía andando. Estas bases iniciaran una reforma educativa, en donde las futuras generaciones verán nuevos paradigmas, equipos mixtos, donde la experiencia se transmite entre todos, donde el trabajar con personas mayores, que no son necesariamente tus jefes sino tus pares, enriquecerá la experiencia, y donde las ideas tendrán un mayor valor.

Me pregunto sí nuestra generación, esta generación que se esta preparando y que esta pronta a salir al mercado, será la que vera el cambio; o estaremos en la frontera y tendremos tiempos difíciles en los que sino te adaptas pereces. El tiempo dirá.

Fixing textext on Inkscape 0.48

November 13, 2010 101 comments

I encounter one problem today. My textext didn’t work on Inkscape 0.48, I get the error

textext.py:55: DeprecationWarning: the md5 module is deprecated; use hashlib instead import os, sys, tempfile, traceback, glob, re, md5, copy
Traceback (most recent call last): File "textext.py", line 306, in <module>
raise RuntimeError("Neither pygtk nor Tkinter is available!")
RuntimeError: Neither pygtk nor Tkinter is available!

The error is due to a module depreciated on the python version used on Inkscape, and that Textext uses. However, it was pretty easy to solve.

  • First you need to download the python packages that are missing, thanks to David Gleich whom packed everything together, avoiding us the trouble of download them and put the pieces together.
  • Unzip them C:\Program Files\Inkscape\python\Lib\site-packages

Then you need to update your textext files,  thanks to Pascal Schulthess for the solution.

  • Go to C:\Program Files\Inkscape\share\extensions, and open textext.py file
  • Now replace
    import inkex
    import os, sys, tempfile, traceback, glob, re, md5, copy
    from lxml import etree
    

    and replace it for

    import inkex
    import os, sys, tempfile, traceback, glob, re, copy
    import hashlib
    from lxml import etree
    
  • And replace this
        def __init__(self, document):
            PdfConverterBase.__init__(self, document)
            self.hash = None
    
        def convert(self, *a, **kw):
            # compute hash for generating unique ids for sub-elements
            self.hash = md5.new('%s%s' % (a, kw)).hexdigest()[:8]
            return PdfConverterBase.convert(self, *a, **kw)
    
        def pdf_to_svg(self):
            exec_command(['pdf2svg', self.tmp('pdf'), self.tmp('svg'), '1'])
    

    for

        def __init__(self, document):
            PdfConverterBase.__init__(self, document)
            self.hash = None
            USE_GTK = False
    
        def convert(self, *a, **kw):
            # compute hash for generating unique ids for sub-elements
            m = hashlib.md5()
            m.update('%s%s' % (a, kw))
            self.hash = m.hexdigest()[:8]
            return PdfConverterBase.convert(self, *a, **kw)
    
        def pdf_to_svg(self):
            exec_command(['pdf2svg', self.tmp('pdf'), self.tmp('svg'), '1'])
    

Restart Inkscape and that would do the work. :mrgreen:

Inkscape in Windows Command Line

July 11, 2010 3 comments

Inkscape

Inkscape is a great tool to draw excellent pictures, and is open source. Although it has some problems when working in Windows, nevertheless there are plenty solutions.

One of those problems is the command line. In Windows the command line doesn’t give any output because everything is redirected to the stdout and stderr. In the documentation they mention that they are working on it, but there are some solutions already. Is just about wrap Inkscape to other software.

Now that we can see the output when we try to work in batches or simple files you will notice that Inkscape does not produce any results or give some error about the files do not exist. That is because it uses the path of where is installed and not the current directory. To solve this — and avoid writing the full path all the time — we can use the %CD% windows variable which holds the current directory full path. For example to convert the figure.png to eps we will input

inkscape -f "%CD%\figure.png" -E "%CD%\figure.eps"

the inkscape command could be replaced by the command that you use once the Inkscape executable is wrapped to show output, the -f option sets the input file, and the -E option is for set the export as eps file. Note that the %CD% option uses an aditional backslash (‘\’) at the end to create a correct path for the files.

Funcionamiento: CNot

April 20, 2008 1 comment

Una de las compuertas cuánticas más importantes es la CNot, esta compuerta es de dos qubits; quiere decir que opera sobre dos qubits. El funcionamiento de la CNot es verificar el valor del primer qubit si este es 1 entonces invierte el valor del segundo qubit. Se dice que es una compuerta controlada, a partir de esta lógica se puede generalizar para cualquier tipo de operador U, de modo que tendriamos cualquier operador controlado.

Podriamos decir que la CNot es un tipo de condicional estático, ya que en computación cuántica no podemos realizar un control de flujo como el que conocemos o estamos acostumbrados a ver en la computación clásica.

Vamos a denotar el funcionamiento de la CNot con sus dos quibtis de la siguiente manera CNot |x, y \rangle = | x , y \oplus x \rangle , esto significa que la compuerta CNot actua sobre los qubits x e y. Llamaremos a x el qubit de control y a y el qubit objetivo, el funcionamiento de la compuerta es realizar un o exclusivo (si lo vemos como lógica booleana) o bien una suma modulo 2 (que es lo que denota \oplus ). La matrix del operador es:

CNot = \begin{pmatrix} 1 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0  \\ 0 & 0 & 0 &  1 \\ 0 & 0 & 1 & 0 \end{pmatrix}

Veamos unos ejemplos:

  • CNot | 0, 0 \rangle  = | 0, 0 \rangle
  • CNot | 1, 0 \rangle  = | 0, 1 \rangle

Ahora, veamos la demostración para un qubit cualquiera. Supongamos que tenemos un qubit | \psi \rangle = \alpha | 0 \rangle + \beta | 1 \rangle = \begin{pmatrix} \alpha \\ \beta \end{pmatrix} y su qubit invertido | \phi \rangle = \beta | 0 \rangle + \alpha | 1 \rangle = \begin{pmatrix} \beta \\ \alpha \end{pmatrix} , y las bases estan dadas por | 0 \rangle = \begin{pmatrix} 1 \\ 0 \end{pmatrix} y | 1 \rangle = \begin{pmatrix} 0 \\ 1 \end{pmatrix} .

Vamos a empezar por aplicar

CNot | 0 , \psi \rangle

para poder aplicar la CNot es necesario realizar el producto tensorial primero, de modo que si lo realizamos tenemos

| 0 \rangle \otimes | \psi \rangle = \begin{pmatrix} 1 \begin{pmatrix} \alpha \\ \beta \end{pmatrix} \\ 0 \begin{pmatrix} \alpha \\ \beta \end{pmatrix} \end{pmatrix}

| 0 \rangle \otimes | \psi \rangle = \begin{pmatrix} \alpha \\ \beta \\ 0 \\ 0 \end{pmatrix}

ahora, aplicamos el operador al producto tensorial

CNot  | 0 , \psi \rangle = \begin{pmatrix} 1 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 0 & 1 \\ 0 & 0 & 1 & 0 \end{pmatrix} \begin{pmatrix} \alpha \\ \beta \\ 0 \\ 0 \end{pmatrix}

CNot | 0 , \psi \rangle = \alpha \begin{pmatrix} 1 \\ 0 \\ 0 \\ 0 \end{pmatrix} + \beta \begin{pmatrix} 0 \\ 1 \\ 0 \\ 0 \end{pmatrix}

si trabajomos sobre la base podemos observar que

| 0 0 \rangle = | 0 \rangle \otimes | 0 \rangle = \begin{pmatrix} 1 \\ 0 \\ 0 \\ 0 \end{pmatrix}

| 0 1 \rangle = | 0 \rangle \otimes | 1 \rangle = \begin{pmatrix} 0 \\ 1 \\ 0 \\ 0 \end{pmatrix}

entonces podemos sustituir y tendremos

CNot | 0 , \psi \rangle = \alpha | 0 0 \rangle + \beta | 0 1 \rangle

CNot | 0 , \psi \rangle = | 0 \rangle \otimes ( \alpha | 0 \rangle + \beta | 1 \rangle

CNot | 0 , \psi \rangle = | 0 \rangle \otimes | \psi \rangle

que era lo que queriamos demostrar, de modo que no varia el qubit objetivo. Ahora para demostrar que si lo invierte con 1

CNot | 1 , \psi \rangle

obtenemos del producto tensorial

| 1 \rangle \otimes | \psi \rangle = \begin{pmatrix} 0 \\ 0 \\ \alpha \\ \beta \end{pmatrix}

aplicamos CNot al producto y tenemos

CNot | 1 , \psi \rangle = \begin{pmatrix} 1 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 0 & 1 \\ 0 & 0 & 1 & 0 \end{pmatrix} \begin{pmatrix} 0 \\ 0 \\ \alpha \\ \beta \end{pmatrix}

CNot | 1 , \psi \rangle = \alpha \begin{pmatrix} 0 \\ 0 \\ 0 \\ 1 \end{pmatrix} + \beta \begin{pmatrix} 0 \\ 0 \\ 1 \\ 0 \end{pmatrix}

de manera analoga que en la primera parte, al trabajar sobre la base tenemos

| 1 0 \rangle = | 1 \rangle \otimes | 0 \rangle = \begin{pmatrix} 0 \\ 0 \\ 1 \\ 0 \end{pmatrix}

| 1 1 \rangle = | 1 \rangle \otimes | 1 \rangle = \begin{pmatrix} 0 \\ 0 \\ 0 \\ 1 \end{pmatrix}

entonces podemos sustituir y tendremos

CNot | 1 , \psi \rangle = \alpha | 1 1 \rangle + \beta | 1 0 \rangle

CNot | 1 , \psi \rangle = | 1 \rangle \otimes ( \alpha | 1 \rangle + \beta | 0 \rangle

CNot | 1 , \psi \rangle = | 1 \rangle \otimes | \phi \rangle

entonces podemos ver que al aplicar el CNot al qubit | \psi \rangle con el qubit de control en 1 lo convierte en | \phi \rangle que es el qubit invertido del primero, esto lo podemos verificar al aplicar el operador Not a | \psi \rangle .

Basics: QC 101 [Parte II]

April 18, 2008 1 comment

Como ya vimos los conceptos matemáticos en la primera parte de una forma simple, voy a continuar explicando un poco de los conceptos que hacen a la computación cuántica tan grandiosa.

Veamos un poco sobre la superposición. Esta no es más que la capacidad que tienen los qubits de estar en más de un estado a la vez, donde los estados son las combinaciones de las bases posibles. Por ejemplo sí tenemos el qubit | \psi_a \rangle = {1 \over \sqrt{2}} ( | 00 \rangle + | 11 \rangle ) decimos que se encuentra en una superposición de los estados equiprobables (por que poseen la misma probabilidad) | 00 \rangle y | 11 \rangle .

Cuando medimos uno de los dos qubits que forman a | \psi_a \rangle colapsamos la función de onda del qubit, obteniendo así un valor discreto sobre los estados posibles del qubit. Por ejemplo si obtenemos el valor 0 en la medición del primer qubit | \psi_a \rangle estaría entonces en el estado | 00 \rangle , en cambio si obtenemos 1 estaría en el estado | \psi_a \rangle .

Consideremos otro qubit, por ejemplo | \psi_b \rangle = {1 \over 2} ( | 00 \rangle + | 01 \rangle + | 10 \rangle + | 11 \rangle ) ; ahora al medir éste si obtenemos 0 en el primer qubit | \psi_b \rangle estaría en el estado | 00 \rangle + | 01 \rangle luego al medir nuevamente, solo que ahora el segundo qubit tenemos que esta en el estado | 00 \rangle si medimos un 0 o bien en el estado | 01 \rangle si medimos un 1.

Al igual que en el modelo clásico en la computación cuántica tenemos un modelo para la generación de circuitos. En este modelo tenemos compuertas cuánticas que tiene la caracteristica de ser matrices unitarias que cumplen con la condición M^\dagger M = I , donde M es una matriz cualquiera e I la matriz identidad. Estas matrices son llamadas operadores (unitarios).

Los operadores de un qubit más comunes son:

Hadamard

Genera una superposición de estados, la matriz es:

H = {1 \over \sqrt{2}} \begin{pmatrix} 1 & 1 \\ 1 & -1 \end{pmatrix}

y se comporta así:

  • H | 0 \rangle = {1 \over \sqrt{2}} ( |0 \rangle + | 1 \rangle )
  • H | 1 \rangle = {1 \over \sqrt{2}} ( |0 \rangle - | 1 \rangle )

Identidad

Este operador deja al qubit intacto luego de aplicarselo, se utiliza cuando tenemos que aplicar ciertos operadores a registros y desesamos que ciertos qubits queden intactos.

I = \begin{pmatrix} 1 & 0 \\ 0 & 1 \end{pmatrix}

Negación

Este operador invierte las probabilidades de obtener el estado 0 o 1 del qubit al que se le aplique.

X = \begin{pmatrix} 0 & 1 \\ 1 & 0 \end{pmatrix}

En general podemos decir que:

  • X | 0 \rangle =  | 1 \rangle
  • X | 1 \rangle =  | 0 \rangle

Estos son algunos de los operadores más utilizados aunque también tenemos por ejemplo el operador de cambio de fase y el de negación y cambio de fase. También tenemos operadores que se aplican a dos qubits (estos los tocaremos en otro post).

Es importante recalcar tres propiedades principales de la computación cuántica gracias a los operadores

  • Reversivilidad: dado que los operadores son unitarios existen operadores inversos, por lo tanto las opearaciones se pueden realizar para un lado y para el otro. Esto asegura una mejor eficiencia y no exitirá perdida de energia.
  • Superposición: como ya explicamos anteriormente, la posibilidad de un qubit de estar en más de un estado a la vez permite un mayor poder de computo, para lograr esto se utiliza la transformada de Hadamard.
  • Paralelismo: a través de crear qubits en superposición y aplicar operadores podemos operar todos los estados a la vez!! lo que nos da un mayor poder de computación y un verdadero paralelismo.