segunda-feira, 27 de janeiro de 2014

Finanças - Teorema de Bayes na HP-12C

Na Wikipédia vemos que em teoria da probabilidade o Teorema de Bayes (criado por Thomas Bayes) mostra a relação entre uma probabilidade condicional e a sua inversa; por exemplo, a probabilidade de uma hipótese dada a observação de uma evidência e a probabilidade da evidência dada pela hipótese. Concursos adoram a Estatística Bayesiana pois permite a associação de uma probabilidade a qualquer grau de crença ou incerteza sobre uma quantidade aleatória, evento ou hipótese.

Sua fórmula é dada por:
P(X|V) = P(X ∩ V)
           P(V)
Calma que a coisa não é tão feia assim, vamos começar com um problema, em uma Empresa de Informática existem 3 tipos de profissionais Analistas, Desenvolvedores e Testadores, o índice de falta mensal (para o IFM é anotado simplesmente se o funcionário falta ou não durante o período de um mês e não a quantidade de faltas) entre eles varia conforme a seguinte tabela:

Profissionais IFM
Analistas 440 13
Desenvolvedores 860 28
Testadores 520 72

OK, os testadores são os que mais faltam, mas isso é apenas um exemplo e não precisa brigar comigo. Vamos agora adicionar mais alguns dados interessantes nessa tabela, usando a HP12C podemos obter os valores em percentual. Primeiro vamos adicionar mais uma coluna da tabela com o somatório desses valores:

Total 1820 113

E podemos completar nossa tabela com a seguinte sequência para adicionarmos os percentuais:
Digite o total a coluna do N° Profissionais (i.e: 1820)
Pressione STO 0
Pressione o primeiro valor (i.e: 440)
Pressione %T (aparece o resultado: 24,18%)
Pressione RCL 0
Pressione o segundo valor (i.e: 860)
Pressione %T (aparece o resultado: 47,25%)
Pressione RCL 0
Pressione o terceiro valor (i.e: 520)
Pressione %T (aparece o resultado: 28,57%)
Continue este procedimento com a coluna do IFM (não modifique o valor gravado em STO 0) para completar a tabela da seguinte forma:

Profissionais IFM % Profissionais % IFM
Analistas 440 13 24,18% 0,71%
Desenvolvedores 860 28 47,25% 1,54%
Testadores 520 72 28,57% 3,96%
Total 1820 113 100% 6,21%

Devemos lembrar que o percentual de faltas é obtido em relação ao todo, lê-se assim: Dos 1.820 profissionais da empresa 6,21% faltam no mês.

Vamos obter mais alguns dados através do Teorema de Bayes, queremos saber qual a chance de contratarmos um Desenvolvedor que tenha pelo menos uma falta no mês:
28 ENTER       -> Total de Desenvolvedores com pelo menos uma falta
1820 ÷         -> Total de Profissionais da Empresa
Aparece no visor o resultado 0,015 ou 1,5% de chance, isso então significa que 98,5% dos desenvolvedores que contratarmos não faltarão nenhuma vez no mês, certo? Infelizmente não pois nem todo profissional é desenvolvedor, se quisermos saber isso, basta:
860 ENTER      -> Total de Profissionais que são desenvolvedores
28 -           -> Retirada dos desenvolvedores que faltaram
1820 ÷         -> Total de Profissionais da Empresa
E temos que a chance de obtermos um desenvolvedor que não faltará é de 0,457 ou 45,70% pode-se dizer que é quase metade das possibilidades. Divirta-se realizando outras estastísticas.

Obrigado e até a próxima
Fernando Anselmo

sábado, 18 de janeiro de 2014

Gimp - Criando um Reflexo de Água

Vamos retomar nossas aulas com o Gimp, recomendo que (se não viu acesse as outras aulas). Nesta aula vamos criar um interessante efeito de reflexo de água que pode ser bem útil para vários tipos de imagem. Siga os passos:

1. Obter uma imagem que ache interessante
2. Duplicar a camada, na janela Layers clicar com o botão direito do mouse e selecionar "Duplicate Layer"
3. Selecionar a camada original e no menu principal selecionar Image | Canvas Size, modificar a propriedade Height para perto do dobro do tamanho e a propriedade Resize Layers para "Image-sized Layers".
4. Selecionar a camada de cópia e no menu principal selecionar Layer | Transform | Flip Vertically.

O resultado será uma imagem de cabeça para baixo da imagem original. Agora vem a parte mais divertida (e criativa):

5. Selecionar a ferramenta Blend (L). Definir o grau de opacidade (Opacity - algo em torno de 60 a 70) e posicionar o mouse no centro (ou mais abaixo) da segunda imagem, segurar o botão, arrastar até o final e soltar.
6. Para finalizar com um efeito de distorção de água, podemos utilizar um dos seguintes filtros (ou mesmo combiná-los):
    a. No menu principal selecionar Filter | Blur | Gaussian Blur.
    b. No menu principal selecionar Filter | Distorts | Ripple. Se for utilizar este, recomendo utilizar a ferramenta Smudge (S) para arrumar os cantos.
7. Também é possível brincar um pouco com a cor para obter mais efeitos interessantes. No menu principal selecionar Colors | Hue-Saturation, diminua o valor das propriedades Lightness e Saturation.

E pronto como resultado temos efeito de reflexo de água, este efeito é ideal para ser aplicado em frases (em campos textos) e fotos claras ou escuras.

Obrigado e até a próxima
Fernando Anselmo

quinta-feira, 16 de janeiro de 2014

Historinhas - Quanto vale sua hora?

Sei que faz tempo que não publico nenhuma historinha, mas sabe como é, o tempo não dá perdão a ninguém. Pensando em tempo e dedicação me lembrei dessa historinha...

FILHO: Pai, posso fazer uma pergunta?
PAI: Sim, claro, o que é?
FILHO: Pai, quanto você ganha em uma hora?
PAI: Isso não é da sua conta, por que você pergunta uma coisa dessas?
FILHO: Eu só quero saber, por favor me diga, quanto você ganha em uma hora?
PAI: Se você quer saber, eu ganho R$ 100 por hora.
FILHO: Oh! - e baixa a cabeça. - Pai, posso pedir por favor R$ 50,00? - E, O pai se enfurece.
PAI: Se a única razão que você perguntou é essa , para conseguir algum dinheiro e comprar mais um brinquedo ou alguma outra coisa sem sentido?
PAI: Vá direto para o seu quarto, para a cama e pense o por que você está sendo tão egoísta. Eu trabalhando duro todos os dias para ver tal comportamento infantil.

O menino foi calado para o seu quarto e fechou a porta. O homem sentou e começou a ficar ainda mais nervoso sobre as questões do menino e pensou: "Como ele ousa fazer tais perguntas só para conseguir algum dinheiro?". Depois de cerca de uma hora, o homem tinha se acalmado e começou a pensar mais friamente: "Talvez houvesse algo que ele realmente precisasse comprar com esses R$ 50 ,e ele realmente não pedia dinheiro com muita freqüência". O homem então foi até a porta do quarto do menino e abriu a porta.

PAI: Você está dormindo, meu filho?
FILHO: Não pai, estou acordado.
PAI: Eu estive pensando, talvez eu tenha sido muito duro com você antes. Tive um longo dia, e não deveria ter descontado meu stress em você aqui estão os R$ 50,00 que você pediu... - O menino se levantou sorrindo.
FILHO: Oh, obrigado pai!

Então, tirando seu travesseiro ele puxou mais alguns trocados amassados. O homem viu que o menino já tinha algum dinheiro e começou a se enfurecer novamente. O menino lentamente contou o dinheiro, e em seguida olhou para seu pai.

PAI: Por que você quer mais dinheiro se você já tem?
FILHO: Porque não tinha o suficiente, mas agora tenho. Papai, aqui tem R$ 100,00 posso comprar uma hora do seu tempo? Por favor, venha para casa amanhã mais cedo pois gostaria de jantar com você.

O pai foi esmagado. Ele colocou os braços em volta de seu filho, e pediu o seu perdão. Isto é apenas uma pequena lembrança a todos vocês que trabalham arduamente na vida para não permitir que o tempo passe através dos nossos olhos sem ter passado algum tempo com aqueles que realmente nos importam.

Obrigado e até a próxima
Fernando Anselmo

terça-feira, 7 de janeiro de 2014

Curiosidade - Conhece Malbolge?

Malbolge, foi criada para ser a linguagem mais difícil de ser programada (e pensava que era Python ou Assembly). Sério mesmo, não estou brincando, essa coisa foi criada por Ben Olmstead em 1998, como (pode rir) uma Linguagem de Programação Esotérica.


Isso mesmo, a mente criativa desse doido criou uma linguagem que é um misto entre "não sei o que" e "sei lá o que", não me acredita? Aqui está um programa que vai mostrar a palavra "Hello World":
('&%:9]!~}|z2Vxwv-,POqponl$Hjig%eB@@>}=<M:9wv6WsU2T|nm-,jcL(I&%$#"
`CB]V?Tx<uVtT`Rpo3NlF.Jh++FdbCBA@?]!~|4XzyTT43Qsqq(Lnmkj"Fhg${z@>
Muito fácil isso não? Já esse outro simples programa:
(=<`$9]7<5YXz7wT.3,+O/o'K%$H"'~D|#z@b=`{^Lx8%$Xmrkpohm-kNi;
gsedcba`_^]\[ZYXWVUTSRQPONMLKJIHGFEDCBA@?>=<;:9876543s+O<oLm
Mostra a mesma frase mas escrita da seguinte forma "HEllO WORld". Creia-me quando digo que não estou brincando, isso aí em cima é realmente um programa escrito nessa linguagem, por mais esquisito que possa parecer (não lhe aconselho a nem tentar interpretá-lo). Se deseja testar, este site possui um emulador onde é possível executar os programas.

Vejamos algumas curiosidades sobre essa linguagem:

  • Porque este maravilhoso nome? Bem, espero que tenha gostado do último livro de Dan Brown e a curiosidade de ler "O Inferno de Dante", pois bem o oitavo círculo do inferno é conhecido como Malebolge. Só que o criador da linguagem foi um pouco mais além, talvez por um erro de grafia, a palavra Malbolge foi utilizada para representar o sexto inferno no jogo Dungeons and Dragons.
  • Porque essa linguagem está se tornando conhecida? Existe uma série que passa no canal CBS chamada "Elementary" e no 10º Episódio da 1ª Temporada, a linguagem foi utilizada como pista para achar o assassino. 
  • Como posso executar programas? Neste site pode-se encontrar um compilador, interpretador e depurador feito em Java.
  • Como a linguagem trabalha? Com pilhas de memória e variáveis (como disse algo bem esotérico tentar entender).
  • Preciso aprender a programar nisso? Só se for por pura curiosidade (e muita falta do que fazer pois não vale o esforço), não creio que nem em um futuro muito distante vá existir qualquer demanda para contratar programadores para desenvolverem aplicações comerciais com essa linguagem (talvez no máximo 1 aviso de emprego - e para contratar apenas quem a criou).
  • É possível encontrar documentação para aprender essa linguagem? Existem vários sites disponibilizando programas (tudo ainda é muito novo) e tentando ensinar como programar (sem piada, Assembly torna-se brincadeira de criança perto disso), mas mesmo com todos esses avisos e deseja tentar quebrar a cabeça para aprender, então recomendo que comece pela Wikipedia.
Depois disso façamos apenas um acordo, nunca mais reclame das expressões regulares de Perl, do trabalho em memória de Assembly, da endentação de Python ou mesmo das milhares de classes existentes de Java. Porque existe inferno muito pior lá fora e perto dela essas outras não chegam nem ao status de purgatório. Como último endereço, o site 99Bottles disponibilizou em várias linguagens o programa que mostra a música 99 Garrafas completa, veja como fica em Malbolge e depois compare com as outras.

Obrigado e até a próxima
Fernando Anselmo

segunda-feira, 30 de dezembro de 2013

REST - Última Aula Prática - Resumo final

Vamos resumir essas doze aulas práticas que vimos e a partir do zero recriarmos todo nosso projeto (obviamente sem os fontes do CRUD, que como presente de Natal estão em um arquivo para ser baixado) através de 10 passos:

Passo 1: Instalar o Node.js.

Passo 2: Instalar o MongoDB.

Passo 3: Criar uma pasta para receber os dados do MongoDB (por exemplo C:\mongodb_data).

Passo 4: Levantar o MongoDB:
mongod --dbpath "C:\mongodb_data"
Passo 5: Instalar o Express:
npm install -g express@2.5.8
Passo 6: Criar a pasta do projeto (por exemplo app):
express app
Passo 7: Adicionar o Mongoose (biblioteca de conexão do banco) ao projeto no arquivo package.json na raiz do projeto:
...
  , "dependencies": {
      "express": "2.5.8"
    , "jade": ">= 0.0.1"
    , "mongoose": "2.6.5"
  }
}
Passo 8: Instalar o projeto, digitar o seguinte comando dentro da pasta app:
npm install
Passo 9: Baixar o arquivo com os fontes do projeto e descompactar substituindo os arquivos.

Passo 10: Na pasta app/server executar o servidor:
node server.js
Pronto já podemos ver nossa aplicação funcionando em qualquer navegador através do endereço http://localhost:3000/. Alguns detalhes bem impressionantes. Primeiro, toda a estrutura do banco de dados é criada automaticamente no momento do primeiro acesso. Segundo, é um sistema totalmente portátil, basta copiar essa pasta app completa para uma pendrive e executar novamente o servidor em qualquer máquina (desde que o MongoDB e o NodeJS estejam instalados - passos de 1 a 4).

Obrigado e até a próxima
Fernando Anselmo

domingo, 29 de dezembro de 2013

REST - Aula Prática - Excluir os Dados

Chegamos na última parte do nosso CRUD e para finalizarmos nosso projeto vamos eliminar os livros.

Mudar a Camada de Visão


Adicionamos mais um botão na tela da listagem dos dados. No arquivo index.html, na seção dos botões, inserimos a seguinte codificação:
   ...
    <div class="btn-group" ng-hide="nome == ''">
     <a class="btn btn-large" ng-click="excluir()">Excluir</a>
    </div>
   ...
Este botão será visível somente quando um livro for selecionado na listagem. Ao ser pressionado, chama a função excluir do arquivo controller.js. Adicionamos dentro da ListaCtrl (que controla a janela de listagem) uma função com a seguinte codificação:
function ListaCtrl($scope, $http) {
  ...
  $scope.excluir = function() {
    if ($scope.nome != '') {
      $http.delete('/excluir/' + $scope.nome)
        .success(function(data) {
          if (data == 'err') {
            alert("Houston, temos um problema");
          } else {
            alert("Livro Excluído...");
          }
          document.location.reload(true);
      })  
    }
  }  
}
Ao ser chamada, esta função executa o método delete da variável $http no qual é passado (como no processo da pesquisa da alteração) um caminho com o nome do livro selecionado. Verificamos a resposta se obteve ou não sucesso para eliminar o livro. O comando final reload é usado para reprocessar a página e fazer desaparecer da listagem o livro excluído.

Mudar a Camada de Dados


No arquivo funções do banco, adicionamos a função excluir (abaixo da função modificar):
exports.excluir = function (req, res) {
  livroModel.remove({nome: req.params.nom}).exec(function(err) {
    if (err) {
      callback(err);
    } else {
      res.send();
    }
  });
}
O comando remove do banco é usado para eliminar um registro com base nos parâmetros passados, funciona de mesma forma como o comando find já visto.

Mudar a Camada do Servidor


Adicionamos ao servidor a nova rota para exclusão:
app.delete('/excluir/:nom', routes.excluir);
E agora nos resta adicionar esse caminho no arquivo de rotas para disparar a função do banco, realizado através da seguinte codificação:
exports.excluir = function(req, res) {
  livro.excluir(req, res);
};
Pronto, observamos que a exclusão é o mais simples dos processos, assim, concluímos a letra D do nosso CRUD e com isso finalizamos nosso projeto. Espero que todas essas lições possam ser bem proveitosas para ajudar a divulgar a arquitetura REST.

Obrigado e até a próxima
Fernando Anselmo

quinta-feira, 26 de dezembro de 2013

REST - Aula Prática - Alterar os Dados (Parte 2)

Nesta segunda parte, iremos realizar a alteração dos dados a partir do formulário com o livro selecionado.

Mudar a Camada de Visão


Procedemos as seguintes adições no arquivo controller.js na função EditarCtrl:
function EditarCtrl ($scope, $http) {
  ... 

  $scope.modificar = function() {
    $http.put('/modificar/' + $scope._id, $scope.livro).success(function(data) {
      if (data == 'err'){
        alert("Houston, temos um problema");
      } else {
        alert("Livro Modificado...");
        window.location = '/';
      }
    })  
  }  
}
Esta função é chamada pelo botão Modificar do formulário que por sua vez passa o ObjectID e o livro modificado pelo formulário. Por que não passar o "nome"? Porque senão este campo não poderia ser alterado, a menos que optássemos por manter mais uma variável não editável contendo o nome não alterado. Após o livro ser alterado no banco retornamos (com o comando window.location) para a tela principal.

Mudar a Camada de Dados


Agora vamos proceder a modificação do livro no banco. No arquivo de funções, inserimos a seguinte função (abaixo da função procurar):
exports.modificar = function (req, res) {
  livroModel.update({_id: req.params.id},
    {nome: req.body.nome, autor: req.body.autor}).exec(function(err) {
    if (err) {
      callback(err);
    } else {
      res.send();
    }
  });
}
Com base no id passado, procedemos um comando update do banco. Este comando é dividido em duas partes, a primeira corresponde ao dado de localização e a segunda os campos a serem alterados. Se comparássemos com SQL a primeira parte seria o WHERE enquanto que a segunda os campos do SET.

Mudar a Camada do Servidor


No arquivo do servidor adicionamos a nova rota que recebe o parâmetro "id":
app.put('/modificar/:id', routes.modificar);
E terminamos com a adição do caminho para a chamada da tela no arquivo de rotas para chamar a função de banco criada:
exports.modificar = function(req, res) {
  livro.modificar(req, res);
};
Após o usuário alterar os dados na tela dispara a função modificar para a rota indicada passando a ObjectID e o livro como objeto encapsulado no corpo da requisição (request), exatamente por este motivo o método PUT é o mais indicado para alteração. Com essa concluímos a letra U e na próxima finalizaremos o nosso CRUD com a exclusão dos dados na tabela.

Obrigado e até a próxima
Fernando Anselmo