Thursday, June 30, 2011

Android SDK on Windows for Dummies: A focus on the debuggin part


I have recently started developing android apps on Windows 7 (life sucks, everyday I wish I were on Linux, but it is what it is). Today for testing my apps I was given a very unique smart phone from a dubious manufacturer. Since it was not the typical android phone, the normal procedures from : http://developer.android.com/sdk/win-usb.html#WinUsbDriver did not seem to work :( I followed all of Google's instructions. But when I tried to update the driver I encountered a few problems: windows asked me where to search for the driver software, and I selected: "Browse my Computer for driver software", then clicked "Browse" and Explore to C:\Android\usb_driver. I also checked the "Include Subfolders", clicked Next and... I got the following error message: "Windows was unable to install your android phone"

After hours and hours of working around it, I finally found a solution to the problem and thought I'd share it, so people can avoid some of the pitfalls I encountered and the installation will hopefully not be as challenging as it was for me.

Basically what worked for me was to download PdaNet for android from : http://www.junefabrics.com/android/download.php . I installed PdaNet with the phone connected to the PC and android was up and running (and not suspended).

PdaNet is technically a tool for supplying Internet access to an unconnected device from a device (such as a mobile phone) which does have Internet access. I believe PdaNet is useful in this case, because it automatically sets up all of the environment for having communication between the computer and the phone.

Once PdaNet has been successfully installed, I ran from a windows command propt "adb.exe" and "fastboot.exe". Now, when I ran the latter, I received a message stating that a .dll file was not found, I search for that file, and added its location to my path.
Here it might be important to state that adb.exe is the "android debug bridge", a tool that can deal with the emulator or the device. Fastboot on the other hand, is a diagnostic protocol used primarily to modify the flash file system in Android smart phones from another computer over a USB connection.

With this,I had communication with my android phone!

One can test it out, by typing in a command propt: adb devices and obtain a list of connected devices, including the phone. With that communication between our device and our computer is achieved, so running and testing our application is now a cinch.
happy hacking :)

Monday, May 16, 2011

LDA is not Ladies Ditching Apes

I have recently been working on Topic Modelling and thought I'd do a brief tutorial on how to automatically divide a text into a series of relevant topics.

Before we dive into our coding, let's give a brief overview of the topic so we are all on the same page:

Topic Modelling is all about automatically finding the thematic structure of a document or a series of documents.

Topic modelling specifies a probabilistic method through which documents can be created. Initially a distribution over topics is selected. For example, the topics of Love and Mexico could be chosen, but each assigned a certain weight or probability. If it was sought for the article to have a greater political inclination, Mexico would be assigned a greater weight than Love. Whereas if the purpose was to write a romantic novel, Love would have a much higher weight or probability assigned than Mexico. Once the topics along with their corresponding probabilities have been assigned, a topic is chosen randomly according to the distribution, and a word from that topic is drawn. This process of randomly choosing a word from a topic is done iteratively until the system has finished "writing" the article.

Besides creating documents automatically ( Hasta la vista estudiantes de Literatura :P) Topic Modelling can also infer the set of topics responsible for generating a collection of documents.
We care about Topic Modelling because it can enhance search in large archives of texts, it also permits for better similarity measures: given two documents exactly how similar are they?

Different algorithms exist for finding the thematic structure of a document. Today we will focus on one particular algorithm called Latent Dirichlet Allocation (LDA). Which is a "...generative probabilistic model for text corpora...".
The intuition behind LDA is that a document is conformed of a series of different topics, and each topic is a probability distribution over words. Each document is a random mixture of corpus-wide topics, where each word of a document is drawn from one of these topics. LDA intents to infer how the documents are divided according to these topics, and what the topics are. The only information LDA has, are the documents.

In the following, we will use THE FORMAL notation of LDA, (mathematical style!) to make things a bit more clearer:
P(z) denotes the topic distribution z of a particular document. P( w | z ) is the probability distribution of words w given topic z. LDA assumes each word wi in a document (where the index refers to the ith word token) is generated by first sampling a topic from the topic distribution, then choosing a word from the topic-word distribution. We write P( zi = j ) as the probability that the jth topic was sampled for the ith word token and P( wi | zi = j ) as the probability of word wi under topic j.

LDA assumes that the topics present a Dirichlet distribuition, i.e. the mixture weights θ are generated by a Dirichlet prior on θ. Each topic is modelled as a multinomial distribution
over words.
Hopefully this brief overview will allow us to have some Python coding fun for our next post!

Saturday, March 05, 2011

How to use Machine Learning to boost up your Parallel Computing

In the past, programmers would find reassurance to their problems of running extremely large programs in the yearly speed up of computer processors. Every year or so, the speed of computers would double and a faster computer would be in the market which would be able to rapidly execute their large sized code. But, in today's world this is not the case, analysing the GHz speed of the processors in a desktop computer of 2 years ago, versus the speed new desktop computers present, proves that it has barely, if any, increased, this mainly due to the fact that it is very difficult to build reliable low-cost processors that run significantly faster. This is the reason why, the solution to running faster code has focused on doubling the number of processors that exist on a single chip. Actually researchers believe, that in the following years we will have systems, which present twice the number of cores with every new technology generation.

It is important to note, that these multi-processors have laid the road for using parallel computing, in which a large program can be divided into smaller programs, each of which is then assigned to a processor with shared or independent resources. Parallelism is what is generally used today, for providing Performance improvement.

This approach although generally highly functional, has shown in some cases to degrade the performance considerably! The problem is that the scheduling of parallel jobs is a very complicated task which is highly dependent on a series of different factors: the workload, the blocking algorithm being utilised, the local operating system, the parallel programming language and the machine architecture. Expert humans are who tend to make the design specifications for these highly complicated tasks,and as a result they tend to be somewhat rigid and unsophisticated [1].

Because of this, machine learning techniques have in recent years provided a solution to this problem. Machine learning is a field which intends to build computer systems that automatically improve with experience. Researchers have been applying machine learning algorithms to problems of resource allocation, scheduling, load balancing, and design space exploration, among other things.

Such is the work done, in Cost-Aware Parallel Workload Allocation Approach based on Machine Learning Techniques. Here the authors tackle the problem of finding adequate workload allocations in a cost-aware manner, by learning from training examples how to allocate parallel workload among Java threads.
Given a program, their system computes its feature vectors, and utilising a nearest neighbour approach finds from the training examples, the best parallel scheme for this new program.

One may initially wonder, what type of training examples were utilised for this problem and how were they generated?
The training examples came from a series of programs coded in java, which presented different for loops. From each for loop its corresponding feature vector was calculated along with its associated label, this conformed each training example. In this case, the feature vector corresponded simply to the workload the for loop presented, and the label to the optimal number of threads that should be utilised with that specific workload.
The programs which were utilised for the training examples were manually selected, each had the purpose of bringing a certain workload variety to the training pool.The labels were set by an automatic program, which tested each workload (loop description) with a different number of threads, and then calculated what was the optimal thread number required for that specific workload to achieve optimal performance. It is important to note, that in this approach the computation cost of calculating the feature vectors was diminished by calculating an implicit estimate of the workload, the features which conformed the workload were: 1) loop depth; 2) loop size; 3) number of arrays used; 4) number of statements within the loop body, and 5) number of array references.

Since not all program features play an equal role in workload estimation different weights were assigned to different features during classification, with higher weights given to feature 1), 2) and 4). Within the paper it was not clearly explained how the values of these weights were assigned or what their values were. It might have been adequate to also utilise a learning algorithm which was capable of finding the most adequate weights given a certain training example, because it might be the case that under certain conditions a feature might be weaker for classification than an other, and therefore other weights need to be utilised. A broader explanation on the weight manner could have provided more insight and restricted this speculation, but it is interesting to ponder none the less.

On the other hand, in this example the authors opted for a supervised learning approach, where each training example that was handed to the system was manually selected and labelled. This is clearly a tedious task to do, and at times may not be the most optimal, since manually finding which examples provide more information for the learning process in comparison to other possible training examples is difficult and non-trivial. One therefore wonders if an unsupervised learning algorithm could have provided better results. In this type of approach, the machine can be "thrown into the wild" and through observations discover previously unknown structures or relationships between instances or their components, this could eliminate the problems mentioned previously, but has the shortcoming that if the learning phase is done online the algorithm might take much longer than if an instance based learning approach had been taken.



Furthermore it does not seem that their approach accounts for any long-term consequences. Each decision within a for loop was done independently of what had been decided for the other for loops within the program, this might mean, the decision to use X amount of threads for that workload might be locally optimal but not globally optimal, this could in the long run deteriorate the performance. This situation seems to suggest that for this problem instead of using instant based learning, a better approach would have been to use Reinforcement Learning. In Reinforcement Learning, the machine is not told which actions to take, but rather must infer them, by analysing what yields the best reward. The following figure presents an overview of how reinforcement learning works


For this particular case, if they authors had used this other learning method, it could have been possible for the machine to analyse the program as a whole, and decide then what the best long-term thread allocation for each workload would be. In specific, the machine would have interacted with the "environment" (in this case the supplied java program) over a discrete set of time steps. In each step the machine would have "sensed" the environment's current state (which would match the number of threads being used in each for loop) and executed an action(an action would correspond to assigning or removing more threads to certain for loops). This action would modify the environment’s state (which the machine could sense in the next time step) and produced an immediate reward (The reward would be the overall performance obtained for that particular thread assignation).
The machine’s objective would be to maximise its long-term cumulative reward by learning an optimal policy that maps states to actions.
In its most basic form, Reinforcement Learning brings a knowledge-free trial-and-error methodology in which the machine intents various actions in numerous system states, and learns from the consequences of each action.
From this, it is clear that the advantage of using this learning method is that no explicit model of either the computing system being managed or of the external process that generates workload or traffic are necessary.Additionally, Reinforcement Learning is capable of treating dynamical phenomena in the environment, as mentioned before, it can analyse how current decisions may have delayed consequences in both future rewards and future observed states.

Now, while this can sound very promising, it is necessary to also take into consideration, the challenges which Reinforcement Learning faces in the real world. Firstly, Reinforcement Learning can suffer from poor scalability in large state spaces, furthermore in times the performance obtained during online training can be below average, due to the lack of domain knowledge or good heuristics. In addition, because reinforcement learning procedures need to include "exploration" of actions, the selection of actions can be exceedingly costly to implement in a live system. This is the reason why, many modern applications that utilise reinforcement learning in order to address the above practical limitations,take a hybrid approach. Such an example, is the work done in A Hybrid Reinforcement Learning Approach to Autonomic Resource Allocation. Here the authors propose for the machine to have an offline training phase. They suggest that given enough training examples which follow a certain optimisation policy , the learner (machine) using reinforcement learning will be able to converge to the correct value function, it will be able to find a new policy which greedily maximises the value function and is able to improve the original policy that was given. In this form, the poor performance that is obtained by using live online training is avoided. Another benefit of their method is that multiple iterations can be done: Through training a new policy, which is the improved version of the original policy, is obtained. This improved policy can then be feed into the system again, acting as the original non-optimal policy, with this second policy a second data set is collected, which can then be used to train a further improved policy. This enables the possibility of running the algorithm iteratively till a desired "reward" is obtained.

It was mentioned before that reinforcement learning, presents the problem of having expensive exploration of actions, the authors tackled this problem by replacing the generally used lookup table for representing the value function with a nonlinear function approximator, in particular a neural network. A function approximator provides a solution to the mentioned issue, because it is mechanism for generalising training experience across states, therefore it is no longer necessary to visit every state in the state space. It also allows for generalisation across actions, so that the need for exploratory off-policy actions is also greatly reduced.

Their hybrid Reinforcement Learning approach was tested on realistic prototype Data Center, which dynamically allocates servers among multiple web applications so as to maximise the expected sum of SLA (service level agreement) payments in each application.

Although their proposed solution resolves most of the problems encountered with reinforcement learning, we can observe an aspect of their work, that might call for improvement: In their algorithm with each iteration, the model of the system is modified. They always assume the model "learned" from the use of a certain set of policies can never be applied to a set conformed of other policies. The authors never explored if this is always the case, could a model learned with certain policies still be valid under other policies which hold a degree of similarity to the original policies, or is it always necessary to learn from scratch the model, as a result of changes to an active set of policies?
Additionally, the authors utilised a neural network for finding the states to explore, and although this did solve the exploratory problem mentioned before, because the neural network has hidden states it is not possible to determine beforehand exactly how many states will be explored given the current used policies, knowing beforehand this number could improve computational costs as better planning can be done. In the work done in "An Adaptive Reinforcement Learning Approach to Policy-driven Automatic Management", the authors addressed this problems and show how a Reinforcement Learning Model can be adapted to accommodate this.
The authors analysed how previously learned information about the use of policies can be effectively used in a new scenario. For this, they consider policy modifications as well as the amount of time used to form the model before the changes. Similarly to the work in Hybrid Reinforcement Learning Approach to Autonomic Resource Allocation, a state transition model, which uses a set of active expectation policies is defined, but in difference to Hybrid Reinforcement Learning Approach to Autonomic Resource Allocation, instead of using a neural network, the authors capture the management system's behaviour through a state-transition graph, what their system is lacking and could be beneficial in the future is mapping directly how changes in policies effect the state-transition models

Monday, January 24, 2011

Soñando con Tacos en la ciudad de las estrellas de cine rodeada de angeles

(Este post es dedicado a mi lectora favorita!)
Mi lectora favorita, (ya que parece ser la unica que tengo..jajaja :P) Me recomendo ayer una cancion alemana ochentera. En general odio la musica ochentera, I'm all about the sixties man! Pero dado que tenia un estilo peculiar y fue recomendada por mi lectora favorita, decidi hacer un post de Musica Alemana al alcanze Mexicano!
Mi traduccion de D.A.F. KEBAB TRäUME!

Version Alemana:


Kebabträume in der Mauerstadt,
Türk-Kültür hinter Stacheldraht
Neu-Izmir ist in der DDR,
Atatürk der neue Herr.
Miliyet für die Sowjetunion,
in jeder Imbißstube ein Spion.
Im ZK Agent aus Türkei,
Deutschland, Deutschland, alles ist vorbei.

Kebabträume..

Miliyet...

Kebabträume...

Miliyet...

Wir sind die Türken von morgen.
Wir sind die Türken von morgen..


Version En Espa~ol!

Sue~os de Kebabs en la ciudad del Muro (Los Kebabs son un platillo tipico turco, usualmente llamado por ellos Döner kebab, la ciudad del Muro se podria referir a Berlin. )
Cultura turca atras de ese alambre de puas.
La nueva capital Turca esta en el este de alemania
Atatürk el nuevo Se~or ( Atatürk fue el primer presidente de Turquia!)
"nacionalidad" para la Union Sovietica. ( La palabra Miliyet no esta en aleman, sino en turco y significa Nacionalidad)
en cada cafeteria un espia
La administracion de los partidos comunitas regidos por alguien de Turquia. ( En la cancion usan la abreviacion ZK que es Zetralkomitee, el cual representaba el cuerpo administrativo de los partidos comunistas en Alemania- De acuerdo a Wikipedia)
Alemania Alemania, Todos esta perdido.
Sue~os con Kebabs...
Nacionalismo (en turco)
Sue~os con Kebabs...
Nacionalismo (en turco)
Nosotros somos los Turcos de Ma~ana,
Nosotros somos los Turcos de Ma~ana....


...wow...debo admitir que ME ENCANTO hacer esta traducccion! Muchas gracias a quien la recomendo!
No solo me sirivio para recordar el aleman, sino para aprender un poco de historia.

Considero que es duro como se refieren los turcos que viven en Alemania a ALemania: " Todo esta perdido." No se si yo me podria atrever a decir algo similar de un pais viviendo alli.
Muchos Mexicanos viven en EUA, pero no se si piensen o canten: EUA todo esta perdido...EUA todo esta perdido. Es una cancion muy nacionalista turca, que hace menos a la cultura alemana. Los demas que opinan?

Creo que es dificil ser extranjero en Alemania, se que en los trenes los policias tienen derecho a interrogar y pedir boletos a los que vean sospechosos y usualmente la selecion se hace de modo racial. Entonces ha de ser incomodo, no tener los ojos claros y el pelo rubio y verse como un tipico aleman. Talvez de alli viene ese sentimiento de enojo hacia Alemania y decirle que esta acabado, que quienes tienen el poder son ellos.
Alguien mas siente que la cancion es extremadamnete agresiva hacia los alemanes?

A veces pienso que si me gusta gritarle a los extranjeros el amor que tengo por Mexico, por nuestros tacos al pastor, la barbacoa, los corridos, los sones jaroches, por todas las cositas que son Mexico. Pero no se si me iria al extremo de decirles que su pais esta terminado. Se que por ejemplo, varios federales de EU han matado de modo violenta a la juventud mexicana. Pero aun no siento en mi sangre, tanto odio para cantarles que su pais ya cayo, ya termino.
Los Mexicanos que opinan?
Sue~o con Tacos..Sue~o con Tacos en la ciudad llena de estrellas de cine y rodeada de Angeles...

Thursday, November 25, 2010

Talk to me baby




I finally got running on my n900 code that converts text to voice. For it, I'm using eSpeak, which "is a compact open source software speech synthesizer for English and other languages, for Linux and Windows."
Today I will explain the steps I took to accomplish this.
One can first check out examples of this software in action by downloading from the application manager of the n900 espeak applications. I downloaded the server and the client, which includes a nifty UI with some mad and sexy lips MMMMm!
If you want to create your own application that does similar things to what eSpeak does,one must:
  1. Install PortAudio. Download PortAudio from: http://www.portaudio.com/download.html But pick the 18th version portaudio_v18_1.zip, since the 19th one has problems with the code from eSpeak and you will get many random errors. ( A coffee and a beautiful afternoon later I figured that out :(
  2. Copy the zip file to your scratch box and unzip it with:
    unzip -a portaudio_v18_1.zip
  3. Then do: ./configure && make
  4. type:make install
  5. type:ldconfig
With that you should have portaudio working within scratchbox, and you are now ready to start working with eSpeak!
  1. Download eSpeak from http://espeak.sourceforge.net/download.html. I personally picked the latest stable version they were offering.
  2. Uncompress it and move it to scratchbox .
  3. Enter the src folder and the easiest thing to do is to modify the Makefile, change the binDirectory and the LibDirectory so it points to where you have your PortAudio folder. In my case, I changed it to something like:
    BINDIR="/home/saiphcita/portaudio_v18_1/bin" and
    LIBDIR="/home/saiphcita/portaudio_v18_1/lib"
  4. Type: Make

With that you should have been able to compile eSpeak, you can now send to the n900 the eSpeak binary you have just created, execute it and test it out!
You can now modify the code and do as you please n_n.
i'm using this for an awesome eyes free application! =D (you know because instead of having to display the text or what not to the user, one can now read back to the user, and allow for their eyes to concentrate on more important things, such as driving or their lover's lovely smile! <3 ;)
Let me know if you have any troubles and we can try to solve them.

Friday, August 13, 2010

Visual Studio and Qt.

In this post we will explain how to get Qt installation for visual studio.

1. Download Qt source code. This is currently available in the nokia website: http://qt.nokia.com/downloads,
Unzip the file into e.g. c:\qt\4.6.1-vc. Important to use a path with no embedded spaces, as the Qt build tools have problems with them.
Install the SDK completely. Install also the plugin for Qt in visual studio.



2. Add these 3 paths to the Environment Variables: “C:\Qt\2009.01\bin” ,
“C:\Qt\2009.01\qt\bin” and \VC\bin .


3. Run the Visual Studio Command prompt. Start > Program Files > Visual Studio > Visual and go to the Qt installation directory. Type vcvars32.bat.
This will create the environment variables required for the next step. The batch file resides in the VC\bin directory of your Visual Studio installation.

4. Type configure -platform win32-msvc2008. (will take a long time)
This will tell Qt to prepare itself for being compiled by the Visual Studio compiler. Again, if you use another version of VS than 2008, replace win32-msvc-2008 with the makespec appropriate for you. We need to this, because the prebuilt binaries that come with the Open Source Qt distribution for Windows cannot be used by the Visual Studio compiler.So to fix this, we have to build those files from the Qt sourcecode using the Visual Studio compiler.

5. Type nmake (will take even longer)

6. It will stop after a LONG while with an error

7. Delete all the instances of mocinclude.tmp, they are usually in:
src/3rdparty/webkit/WebCore/tmp/moc/{debug,release}_shared

8. Run nmake again

9. Go to your qt app and run qmake –t vcapp

10. This should create a sln for the project

You should now be able to build your Qt project in visual studio



References:
http://tom.paschenda.org/blog/?p=28
http://www.qtforum.org/article/31561/error-when-building-libraries.html
http://dcsoft.wordpress.com/2010/01/30/how-to-setup-qt-4-5-visual-studio-integration/
http://docs.google.com/viewer?a=v&q=cache:3e0M85Vdd3wJ:portfolio.delinkx.com/files/Qt.pdf+qt+visual+studio&hl=en&gl=us&pid=bl&srcid=ADGEEShHdqxYfPWGn-PCxWty0Z9ehLVLaPv-qlpDeaLAlcohpIxHFWMw-PqM4N5euTpmRrxOA5fSX8l6KJZmq-ttAfPgNqt8io-kjHQt5j3RWQgySF5MFnXGeXufW6jEipZCRVuZ8yqA&sig=AHIEtbRYvPmPZUfMm1fb0SVKaSjfYX_BVg

Watching some QT movies with a cute chic

Recientemente me vi con el problema de que queria hacer una aplicacion que tocara videos con extension .mov (Un archivo de tipo MOV representa un formato especial de QuickTime para guardar audio y video ) dentro de una aplicacion hecha con Qt. (Qt es un framework para el desarrollo de aplicaciones para que corran en multiples plataformas (Linux, windows, mac etc) y comunmente se suele usar hacer apliaciones graficas, esto es, aplicaciones que tienen ventanitas, menucitos etc.)

La documentacion para hacer programas que toquen videos de tipo .mov no es NADA amigable, por lo que decidi hacer este peque~o tutorial respecto a como se puede lograr esto.

Qt posee una clase llamada QMovie,con la cual se pueden mostar aniamciones sencillas que no cuentan con sonido ( lo cual estaba perfecto para lo que yo queria hacer) En resumen QMovie permite leer y cargar una aniamcion simple, como una animacion de tipo .GIF. Por lo cual si lograramos convertir nuestras aniamciones en formato .MOV a .GIF nuestro problema estaria resulto. Y bien, gracias a Google, encontre esta peque~a applicacion que justamente lleva esto acabo: http://www.geovid.com/VidGIF
Y ya con nuestro video convertido en .GIF el codigo para hacer una ventanita que toque nuestro video es muy sencillo:

#include qtgui qapplication
#include qwidget
#include qhboxlayout
#include qlabel
#include qmovie
#include qpushbutton
#include qslider
int main(int argc, char *argv[])
{

QApplication a(argc, argv);
QWidget *win=new QWidget();
QHBoxLayout *lay=new QHBoxLayout();
QPushButton *play=new QPushButton("PLAY");
QPushButton *stop=new QPushButton("STOP");
QLabel *label=new QLabel;
QMovie *movie = new QMovie("Resources/musica.GIF");
movie->start();
label->setMovie(movie);
QObject::connect(play,SIGNAL(clicked()),movie,SLOT(start()));
QObject::connect(stop,SIGNAL(clicked()),movie,SLOT(stop()));

lay->addWidget(label);
lay->addWidget(play);
lay->addWidget(stop);
win->setLayout(lay);
win->show();
return a.exec();
}



Basicamente estoy cargando la pelicula, la agrego a una etiqueta la cual despues es agregada al widget, tambien agrego dos botones, los cuales sirven para detenerla y tocarla y finalmente presento al usuario la ventanita.
Esta es una manera sencilla de correr en QT peliculas de tipo .mov, aunque solo es valido si no nos interesa el audio que tiene la pelicula, para cosas mas complicadas que involucran audio es necesario checar otras clases que proporciona qt.
Los dejo con la ventanita que se crea, asi como con una imagen de la pelicula que esta tocando:
Arnie de Californiavspace=10 width="400" height="135">