Microsoft Azure e a subscrição Dreamspark

Microsoft Azure e a subscrição Dreamspark

Quem é estudante e tem acesso ao Microsoft Azure e a subscrição Dreamspark para este mesmo serviço, através do Ensino Superior, concerteza deparou-se com alguns problemas:

Problema 1 – Caso tenham um email Microsoft institucional ( empresas ou escola ), ao tentarem activar a vossa subscrição Azure DreamsSpark, irão verificar que é impossível activar a subscrição na vossa conta Azure da vossa escola.

 

Problema 2– Como está mencionado pela Microsoft: “Visual Studio Online Continuous Integration is not currently compatible with our Azure offer”. E de facto é verdade, se formos ao VisualStudioOnline e tentar-mos fazer deployments na nossa conta Azure, iremos encontrar uma mensagem igual a apresentada em baixo

message

Como podem ver aqui diz que as contas não irão conectar-se a vossa conta Azure LiveID.

É possivel criar um setup de integração continua entre o VSO e o Azure sem recursos externos!!!

Solução – Ao criarem a conta Dreamspark, mesmo que com o vosso email institucional (OrgID), a Microsoft cria uma conta LiveID associada à mesma. Assim sendo se tiverem iniciado a sessão na vossa conta Azure OrgID, vai aparecer uma fatídica mensagem de erro a dizer que a vossa conta não tem uma conta Dreamspark associada!
Como tal, precisam fazer login no Dreamspark com um browser em modo anónimo, e activar a subscrição desta forma! No passo seguinte irá ser criado uma conta Azure associada à vossa conta liveID.

 

Agora para fazer a integração continua.

No vosso projecto no Visual Studio 2015, se tentarem fazer um deploy no Azure, irá funcionar sem problemas. Quando o fazem dentro da pasta properties ira aparecer uma pasta chamada PublishProfiles e dentro da mesma ira existir um ficheiro *.pubxml.

Esse ficheiro tem os detalhes necessarios para fazer um deployment no Azure, este ficheiro terá de ser commitado no projecto para podermos fazer deployment a partir do VSO.

ATENÇÃO: O vosso repositorio deve ser privado pois esse ficheiro irá conter a vossa password de deploy.

howto

Neste ficheiro devem alterar a linha que contem o elemento: <_SavePWD> e substituir por <Password>.

Para obterem a password, vão ao portal Azure, abre a vossa web app e clicam aqui

howto2

 

Isso irá fazer download de um ficheiro com os dados para fazer deploy do vosso site. La dentro irá aparecer uma password que estará salted, é só colocarem agora a password no elemento xml <Password>

Para finalizar no VSO fazem os seguintes passos:

Quando fazem build ou release adicionem um Visual Studio Builder

howto3

 

E definem as seguintes opções:

howto4

 

Onde diz “StreetFood – Web Deploy.pubxml devem colocar o nome do vosso Publisher Profile, desta forma, sempre que a build é executada, os ficheiros são logo actualizados na conta azure.

Vamos ver uma demonstação:

Temos o seguinte site no azure:

howto5

Vamo então mudar o texto “All Users” para “All Test Users”

Neste caso vamos abrir pagina index.html e vamos alterar o texto que pretendemos mudar:

howto6

 

Após gravar o ficheiro e fazer commit o build foi disparado

howto7

O build correu sem problemas e o deploy foi feito!

howto8

 

 

 

 

 

 

 

 

 

 

 

 

Finalmente vamos fazer refresh a nossa pagina inicial alojada no azure para ver se o texto foi alterado como queríamos:

howto9

 

E pronto, o deployment foi feito com sucesso.

Neste exemplo nem estamos a testar ou validar nada, apenas estamos a compilar e a fazer deploy. Num ambiente de desenvolvimento real não deve ser feito desta maneira pois se alguma coisa falhar vão deixar o vosso site comprometido.

CryptoEscudo

CryptoEscudoNos últimos tempos tem havido um zum-zum muito grande a volta das crypto-moedas, fala-se muito sobretudo acerca do BitCoin.

Soube na semana da passada da existência de um projecto chamado CryptoEscudo, basicamente alguém se lembrou de criar a crypto-moeda portuguesa com fé que esta pode ser a solução para os problemas do nosso pais.

Recomendo vivamente a visita ao site do CryptoEscudo pois é extremamente interessante a ideia. Eu próprio já alinhei no esquema, e recentemente fiz a uma pré-release de um pequeno programa para tornar a tarefa de “mining” um pouco mais simples a todos os utilizadores

Podem encontrar o código e os binários aqui: https://github.com/killercode/CryptoEscudoMinerTools/

E já agora podem fazer os vossos donativos em CESC, aqui: http://geek-press.com/donations.html

Arduino + WebCam = Volumetria

Um dos projectos que tenho trabalhado ocasionalmente nos ultimos meses foi arranjar maneira de medir volumes com material “low-cost”!

Pensei no desafio e comecei a meter mãos ao trabalho e consegui resultados surpreendentes a usar um webcam comum e um arduino com um sensor.

Para começar vamos falar do hardware:

– Arduino + Sharp Distance Sensor GP2Y0A02 (20-150cm)  : Devo dizer que pensei que era o mais simples mas falhei redondamente.

Para conseguir resultados aceitaveis (cerca de 1 centimetro de desvio em distancias perto do limite do sensor) tive de seguir um conjunto de procedimentos manhosos isto porque o sensor tende a retornar montes de ruido e assim não temos resultados precisos.

Primeiro faço 10 leituras do valor e determino a media, seguindamente determinamos o limite superior e inferior de valores a partir desta primeira media, exluimos os valores que ultrapassam este valor capturamos mais uns 10 valores e fazemos a media de tudo.

Devo dizer que isto resultou muito bem

 

float GetAverage(float * _values, uint8_t size)
{
	float avg = 0;
	for(int i = 0; i< size; i++)
	{
		avg += _values[i];
	}
	avg = avg / size;

	float setMax = avg * 1.15;
	float setMin = avg * 0.85;
	float precisionAvg;
	int counter = 0;
	for(int i = 0; i < size; i++)
	{
		if((setMin < _values[i]) && (_values[i] < setMax))
		{
			precisionAvg += _values[i];
			counter++;
		}
	}
	return precisionAvg / counter;
}

Para conseguir volumetria usei a biblioteca Emgu e uns quantos filtros para conseguir encontrar os contornos do objecto com base numa mascara. Ou seja temos de ter uma mascara do ambiente de fundo para poder fazer a exclusão do que ja la estava e ficarmos apenas com o novo objecto na imagem. Usamos uns quantos truques de image processing, uns calculos trigonometricos e voilá aqui esta o resultado  

meo|kinect @ codebits 2011

Mais uma vez o SAPO Codebits 2011 foi bestial, o unico senão foi a minha apresentação de projecto que teve de passar por “pequenas” dificulades.

Bom vou então falar do pojecto e depois da desastrosa apresentação

Meo|Kinect

Um dia antes do concurso vi na pagina do codebits o seguinte post e no post logo a seguir a falarem que estaria la uma equipa da Microsft para dar o suporte necessário!

ora bem: 1+1= meo|Kinect

O objectivo estava decidido,  fazer um interface entre o kinect e a meo box usando um pc no meio para fazer a comunicação entre os dois dispositivos

Desde o primeiro dia o Gonçalo Basto (um os membro da minha equipa), estava a fazer uns widgets para a meo box de modo a que pudéssemos explorar ainda mais o uso do kinect. Falamos várias vezes com o pessoal da PT Inovação, Microsoft,  sapo.labs teams e gradualmente fomos nos apercebendo que teríamos de mudar de ideias e que a apresentação no Main Stage estava um pouco comprometida. Disseram que não era impossível fazer a apresentação com uma box no palco, e que isso iria dar algum trabalho a organização. E as ultimas palavras que nos deram foi:
– Mantém-te em contacto connosco que nos vamos ver o que podemos fazer, entretanto falem com a organização.

Perdemos bastante tempo de desenvolvimento com estas questões burocráticas.

Mesmo assim conseguimos desenvolver o interface de gestos usando hotspot que iriam enviar comandos para a box. O tempo para terminar o pojecto estava a terminar mas conseguimos ir testar os resultados finais no equipamento de demonstração da PT Inovação.

Foi um sucesso, mas apenas faltavam 4 horas para a apresentação e nada estava feito para nos no palco.

Fomos para o palco para testar tudo 1 hora antes das apresentações e só nessa altura mandaram alguém ir buscar um router a meo com um cabo de rede e uma box. Montaram tudo mas mesmo assim não estava a funcionar.

Falei com o  Celso sobre as nossas dificuldades e ele disseque era tarde demais para resolver problemas destes. Eu disse-lhe que andava desde quinta-feira a tentar resolver este problema e expliquei a nossa situação. Ele agarrou no telefone e disse que ia ver o que era possível fazer…mas que não prometia nada.

 

Estava desesperado….O resto da nossa equipa desmotivada, pensei em desistir, mas alguém da organização apareceu e disse que iriam fazer com que fosse possível apresentar a nossa aplicação.

O Miguel Vicente da Microsoft, a quem a nossa equipa agradece por toda a atenção, esteve sempre a dar-nos bons conselhos e a dizer para não desistir-mos, a PT Inovação estava muito interessada que a apresentação fosse feita e de repente, fez luz e as coisas começaram a acontecer.

A organização moveu o nosso projecto para o ultimo da lista a ser apresentado para dar mais um tempo extra, a PT Inovação enviou um membro da equipa deles para fazer o setup no palco, e ficamos no chão a frente do palco a configurar todo o hardware e a rede para que tudo funciona-se na apresentação, apesar de não estar nada testado e não sabermos se as coisas iriam funcionar.

Acabamos o setup quando faltavam 5 minutos para a nossa vez no palco, o nosso “porta-voz” estava muito nervoso e nos não acreditávamos que tudo pudesse funcionar mas FUNCIONOU!!!, contudo o nosso orador estava sobre uma pressão enorme acreditando que tudo ia falhar diante aquelas 800 pessoas e acabou por não conseguir fazer o melhor discurso na apresentação… bloqueou e só disse palha para encher os 90 segundos… A apresentação que preparamos acerca de fazer da TV Interactiva um novo conceito, falar acerca do reconhecimento de gestos e voz, um novo mercado possível, etc tudo foi deixado de lado e ficamos a ouvir apenas: “como podem ver eu vou-me mexendo e tal, e entrei num menu… isto é porreiro porque até da para fazer exercício…”

A apresentação foi um fracasso, embora tudo estivesse funcional.

Quero então agradecer a toda a organização do codebits que fizeram o impossível acontecer, a equipa da PT Inovação por nos terem dado uma valiosa ajuda (não é todos os dias que metemos um dos top developers de Portugal em MediaRoom, no chão a configurar DNS’s), ao Migue Vicente por toda a motivação que nos deu, a para a minha equipa que apesar de grande pressão até se portou bem.

Mais tarde irei publicar aqui o projecto, incluindo vídeos dele a funcionar.

Foi um excelente codebits e um desafio brutal.

A Primeira Demo

Ok, aqui fica a minha primeira demonstração… É so uma coisa simples, basicamente tenho 2 views uma com o VideoStream RGB e outra com o DepthFieldStream.

É um exemplo bastante semelhante ao tutorial do Channel9 com alguma alterações pelo meio. Por exemplo não estou a usar apenas 3 distancias chave para desenhar as cores, em vez disso implementei a coloração em escala de cinzentos dependendo da distancia, assim da um efeito mais agradavel

Aqui esta o video:

Kinect + Emgu

Descupem lá a inactividade nos ultimos tempos. mas ter um trabalho a tempo inteiro e ter namorada as vezes deixa-nos sem tempo.

Comecei a brincar com Computer Vision e Kinect, não fiz grande coisa e desconhecia por completo como CV funciona e depois de ler um um pouco soube que o Emgu é um grande wrapper para a biblioteca do OpenCV.
De facto é possivel fazer reconhecimento facial sem grandes stresses.
Vamos la meter as mãos à obra neste biblioteca
Para este exemplo precisamos de:
e para tornar as coisas ainda mais faceis Coding4Fun Kinect Toolkit
Este ultima dll é excelent para passar os dados raw do kinect para bitmaps
Recomendo vivamente a lerem a documentação do Emgu, pode ser tricky para usar.
Então vamos começar por criar um novo windows project, depois vamos inserir todas as referencias
Adicionamo o Microsoft.Research.Kinect que pode ser encontrado nas referencias .NET. Depois é Coding4Fun dll, e todas as dlls necessarias para o Emgu.
Como podem ver o Emgu tem montes de referencias na pasta bin e devem colocar tambem as unmanage libraries como a
cvextern.dll, opencv_calib3d220 e por ai a fora… Como já referi, leiam a documentação do emgu…
Na vista de design adicionei o controlo EmguCV.UI.ImageBox e chamei-o de imageBox1.
No codigo adicionei isto:
using Emgu.CV;
using Emgu.CV.UI;
using Emgu.CV.Structure;
using Emgu.Util;
using Emgu.CV.CvEnum;
using Microsoft.Research.Kinect.Nui;
using Coding4Fun.Kinect.WinForm;
Estes são os usings que necessitam
e para isto tudo funcionar precisam destes objectos
Kinect.Nui.Runtime,
Emgu.CV.Image
e visto que vamos tentar detectar caras usando o algoritmo HaarCascade vamos usar o objecto HaarCascade.
O algortimo HaarCascade necessita de um ficheiro xml para aprender os padrões de moo a reconhecer caras, existem montes de ficheiros desses na internet e podem criar o vosso proprio ficheiro usando este  guia como exemplo (Existem muitos mais guias acerca deste topico)
ok então…
haar = new HaarCascade("haarcascade_frontalface_alt_tree.xml");

vai pupolar o objecto haar com o ficheiro xml

Bom agora vamos inicializar o kinect. Para isto apenas necessitamos da camera RGBpor isso vamos usar r RuntimeOption.UseColor.
Precisamos tambem de criar  evento VideoFrameReady para conseguir capturar a imagem e de seguia abrimos um VideoStream
Para quem não esta familiarizado com o metodo VideoStream.Open,  ele suporta 4 parametros: ImageStreamType, poolSize (o valor minimo é  2, isto vai funcionar como backbuffer para gravar dados em memoria), ImageResolution e finalmente ImageType:
kinect.Initialize(RuntimeOptions.UseColor);
kinect.VideoFrameReady += new EventHandler(kinect_VideoFrameReady);
kinect.VideoStream.Open(ImageStreamType.Video, 2, ImageResolution.Resolution640x480, ImageType.Color);
e pronto, o constructor deve ter este aspecto:
public Form1()
{
      InitializeComponent();
      haar = new HaarCascade("haarcascade_frontalface_alt_tree.xml");
      kinect.Initialize(RuntimeOptions.UseColor);
      kinect.VideoFrameReady += new EventHandler(kinect_VideoFrameReady);
      kinect.VideoStream.Open(ImageStreamType.Video, 2, ImageResolution.Resolution640x480, ImageType.Color);
}

Agora que ja temos o event hanler do VideoFrameReady, ele vai receber no ImageFreameReayEventArgs todos os dados relevantes acerca da imagem. A primeira tarefa vai ser converter a imagem capturada num bitmap e converte-la outra vez para uma imagem do Emgu, de modo a podermos processa-la

 

 

 Image kinImage = new Image(e.ImageFrame.ToBitmap());
Ok ja temos uma image RGB no emgu e agora temos de converte-la para uma imagem em escala de cinzentos de modo a que o processamento do Emgu seja feito com melhor performance
Image grayframe = nextFrame.Convert();
e usamos o haarcascade para detectar todas as faces num determinado frame
 grayframe.DetectHaarCascade(
                                    haar, 1.4, 4,
                                    HAAR_DETECTION_TYPE.DO_CANNY_PRUNING,
                                    new Size(grayframe.Width / 8, grayframe.Height / 8)
                                    )[0];
…desenhamos um rectangulo a volta de cada face
  foreach (var face in faces)
{                         
    nextFrame.Draw(face.rect, new Bgr(0, double.MaxValue, 0), 3);                    
}
e finalmente desenhamos a imagem na imageBox1
imageBox1.Image = nextFrame;
para quem não gosta de ter trabalho aqui esta a source completa para fazer copy/paste:
void kinect_VideoFrameReady(object sender, ImageFrameReadyEventArgs e)
      {
            Image kinImage = new Image(e.ImageFrame.ToBitmap());
            using (Image; nextFrame = kinImage)
            {
                if (nextFrame != null)
                {
                    // there's only one channel (greyscale), hence the zero index
                    Image grayframe = nextFrame.Convert();
                    var faces =
                            grayframe.DetectHaarCascade(
                                    haar, 1.4, 4,
                                    HAAR_DETECTION_TYPE.DO_CANNY_PRUNING,
                                    new Size(grayframe.Width / 14, grayframe.Height / 14)
                                    )[0];
                    foreach (var face in faces)
                    {
                        nextFrame.Draw(face.rect, new Bgr(0, double.MaxValue, 0), 3);
                    }
                    imageBox1.Image = nextFrame;
                }
            }
        }
Como podem ver é codigo facil 😀
podem fazer o download do ficheiro .cs
Aqui esta uma demo deste codigo a funcionar, peço desculpa pelo framerate baixo, o software de captura que usei é muito mau, tambem a luminusidade não é a melhor mas são 2 a manha e a minha namorada ja dorme no sofa ao meu lado por isso é melhor não meter mais luz a menos que queira levar com o rolo da massa.
No entanto é um excente proof-of-concept pois mesmo com má iluminação funcionou :)
Em excelentes condições de luminusidade a detecção de faces funciona na perfeição