How to create modbus rtu request

If you have serial Modbus/RTU slaves attached to embebbed serial modules, then you'll need to create the original Modbus/RTU requests to send. This is quite easily done with Python.

Projeto utilizando Device Drivers

Go to Blogger edit html and find these sentences.Now replace these sentences with your own descriptions.

quinta-feira, 15 de setembro de 2011

OpenCV : Guia de sites úteis



  O OpenCV (Open Source Computer Vision Library) é uma biblioteca multiplataforma com um conjunto bem definido de funções, totalmente livre (open source) ao uso acadêmico e comercial, para o desenvolvimento de aplicativos na área de Visão Computacional 

  É uma biblioteca originalmente desenvolvida pela Intel, mas agora com suporte  da Willow Garage. É open source, multiplataforma, principalmente com foco no processamento de imagem em tempo real.

   Exemplos de aplicação da biblioteca OpenCV são Human-Computer Interaction (HCI); identificação de objetos, Segmentação e Reconhecimento; Face Recognition, Reconhecimento de gestos; Rastreamento de Movimento, Movimento Ego, Compreensão de Movimento; Estrutura De Motion (SFM); Calibração Stereo e Multi-Camera Profundidade e Computação Robótica Móvel.

A biblioteca OpenCV fornece muito bem as funções avançadas para armazenamento de imagens, manipulação e objeto de identificação tornando as coisas mais simples. Por exemplo: Com apenas 2  funções simples cvHaarDetectObjects() e cvGetSeqElem () são suficientes para realizar o reconhecimento facial!!

Eu passei por muitos links para meus preparativos iniciais sobre OpenCV. Existem muitos tutoriais por aí, mas eu consegui reunir alguns dos melhores que eu encontrei e pensei em publicá-las aqui. A ideia deste post é fornecer um bom material para iniciar um estudo sobre openCV.


Links
 
  1. Tutorial por Noah Kuntz
    • Eu encontrei este tutorial OpenCV melhor para um iniciante. Ele nos mostra todos os detalhes, juntamente com programas de exemplo.
    • Ele categorizou o tutorial em 11 partes e cada parte é explicado muito bem.
    • No caso de você não ser familiarizado com linguagem de programação C há um tutorial para isso também.
    • Clique aqui para ver o tutorial  


2. Tutorial sobre Sourceforge.net
    • Este tutorial faz uso do plugin Flowdesigner em conjunto com OpenCV. Você pode baixar o plugin aqui (open source).
    • Tutorial fornece uma explicação detalhada de todas as funções da biblioteca básica.
    • Melhor parte é que as funções da biblioteca são explicados, juntamente com amostras de imagem. Que pode realmente ajudar no melhor entendimento do conceito.
    • Clique aqui para ver o tutorial
3. Guia OpenCV
    • Este tutorial fornece programas de exemplo para mostrar para você algumas das aplicações do OpenCV. Por exemplo. Captura de um quadro da câmera de um robô, trabalhando com histogramas, detectando linha e círculos em uma imagem, etc..
    • Clique aqui para ver o tutorial
 
4. Processamento de imagens e Análise de guia de referência

    • Este link nos fornece uma explicação detalhada das funções da biblioteca.
    • Cada parâmetro das funções são bem explicados.
    • Clique aqui para ir para pagina  


5. Referência OpenCV Willowgarage
    • Este é o site de referência oficial do OpenCV.
    • Fornece informações sobre funcionalidades Core, imgproc, highgui, e detecção de recurso.
    • Clique aqui


6. Introdução ao OpenCV
    • Este guia começa com a introdução básica e, em seguida passa a explicar alguns dos comandos gui e estruturas de dados básicos.
    • Também oferece programas de exemplo que explica como trabalhar com seqüências de imagens, vídeo e matrizes.
    • Clique aqui para ir para pagina

7. CV Manual de referência

    • Este manual trata de alguns mecanismos avançados.
    • Se você pretende fazer alguma imagem séria de processamento este link vai te ajudar.
    • Clique aqui para o manual


8. AI Shack
    • Este site tem alguns programas de referência que nos mostra a implementação de alguns mecanismos de visão computacional.
    • Clique aqui para ir para o site


9. Site do Nashruddin
    •  Se você pesquisar no google programas relacionados opencv este é o site que você verá no top 10. O site fornece a implementação de algumas consultas de processamento de imagem bastante comuns.
    • Programas como detecção de rosto e olhos, os valores de pixels de leitura de imagem, eye tracking em tempo real são alguns programas interessantes que o site proporciona.
    • Clique aqui para ir para o site


10. Site do Damiles
Se você ainda não começou sua programação OpenCV então aqui está um guia de introdução para a programação OpenCV

OBS: Lembrando que todos os links estão em inglês. Caso necessite de uma tradução "não muito confiável" dependendo do conteúdo utilize o famoso google translator , colando o link e abrindo ja traduzido para pt.

Espero ter ajudado alguém com esse guia de sites sobre openCV.





quarta-feira, 14 de setembro de 2011

Monte o seu Arduino!

  

 O que é Arduino e como funciona?

 Para saber detalhes de seu funcionamento e entender o que é o arduino, tem um  site excelente que mostra detalhadamente como funciona, os modelos, componentes,pinos, instalação e a parte de software.

Monte seu Arduino Severino 

Hoje eu estava pesquisando na net sobre arduino, preços e tudo mais, porém um projeto me chamou a atenção: Monte seu arduino severino (adotada placa oficial do arduino team). Neste link do projeto você vai ter acesso ao manual, diagrama, esquema eletrico, etc. Todo suporte pra você montar o seu. ( Arduino Single-Sided Serial version 3)

Neste albúm no flickr você pode visualizar as pessoas que desenvolveram seu proprio arduino mundo afora :) aventure-se também e agradeçam ao Adilson Akashi.




segunda-feira, 12 de setembro de 2011

PandaBoard - kit de desenvolvimento ARM



Hoje vou falar um pouco de um kit que pretendo adquirir mês que vem e porque eu escolhi este.
O kit PandaBoard é projetado para ser uma atualização (sucessor) da plataforma BeagleBoard.

Caracteristicas:
BeagleBoard são baseados em ARM Cortex-A8 SoCs e orientadas para o mercado de dispositivos gerais incorporado, o 4,0 x 4,5 polegadas. Já a PandaBoard sobe para o Cortex-A9-base de 1 GHz OMAP4430 SoC e é mais utilizada para desenvolvimento de smartphones e outros dispositivos móveis . A placa pode gravar e reproduzir vídeo com qualidade de 1080p a 30 frames por segundo, diz PandaBoard.org.


A idéia é que o uso desta plataforma acelera o desenvolvimento Linux  embarcado e se você sempre quiser entrar nessa de sistemas embarcados, os kits BeagleBoard e PandaBoard são altamente recomendados, lembrando que meu projeto eu fiz no kit ARM Mini 2440 ( e realmente é um kit muito didatico com muitos modulos prontos e faceis de entender) . Porém este kit pandaboard não perde nada em termos de suporte, existem muitas comunidades e muitos projetos open source no qual podemos utilizar para o aprendizado.



 
Como observado na foto ao lado e detalhadamente o diagrama de blocos abaixo, o PandaBoard está equipada com 1GB de DRAM LPDDR2 e um cartão SD / MMC slot para cartão de memória. Um slot de expansão LCD é fornecido, bem como HDMI 1.3 e portas DVI, com suporte simultâneo a dual displays.


O PandaBoard é equipado com chip de múltiplos propósitos da TI sem fio, a 7,0 WILINK . O WILINK fornece a placa com 802.11b/g/n Wi-Fi, bem como Bluetooth 2.1 + EDR, rádio FM, e um receptor GPS.
Também possui uma porta Ethernet 10/100, duas portas USB 2.0 Host, e uma porta USB 2.0 OTG. Uma porta RS-232, câmera de conector, porta JTAG, e áudio estéreo E / S estão disponíveis, junto com um "conector de expansão genérica" ​​que suporta interfaces como SD / MMC, USB, GPMC, DSS, ETM, McSPI , I2C, e UARTs.
O PandaBoard  possui medidas de 4,5 x 4,0 polegadas (114,3 x 101,6 milímetros), acima dos 3,25 × 3,25 centímetros para o BeagleBoard-XM. Equipado com uma fonte de alimentação cinco Volt.





Software
O PandaBoard está otimizado para rodar vários sistemas operacionais de código aberto . Estes incluem Ubuntu 10.10 e também Angstrom :distribuição Linux. Há também um port de Android chamado Android Pandroid.
Além disso, a plataforma está a ser dito, geralmente, compatíveis com as distribuições Linux, como MeeGo e Chrome.
Projetos listados no site da comunidade PandaBoard.org incluem RISC OS na OMAP4, XBMC, Wireless sniffer, Gentoo Linux, MeeGo, GeeXboX, OpenBricks, Pandroid e Ubuntu em PandaBoard.

 Disponibilidade
A PandaBoard esta disponivel por $174 pela Digi-Key, aqui.  Mais informações sobre a pandaboard pode ser encontrada  aqui, e mais sobre a comunidade de software (projetos) pode ser encontrado aqui

segunda-feira, 22 de agosto de 2011

Programação Python Networking














O Python fornece dois níveis de acesso aos serviços de rede. Em um nível baixo, você pode acessar o suporte de socket básicos no sistema operacional subjacente, que permite implementar clientes e servidores para ambos os protocolos orientado a conexão e sem conexão.
Python também tem bibliotecas que fornecem o acesso de nível superior  a protocolos específicos em nível de aplicativo de rede, como FTP, HTTP, e assim por diante.
Este post tem como objetivo falar sobre programação de socket.

O que são sockets?
Sockets são interfaces para a comunicação via rede, quando se cria um socket,se está criando um canal de comunicação bidirecional entre o cliente/servidor.

Eles podem se comunicar dentro de um processo, entre processos na mesma máquina, ou entre processos em diferentes continentes.
Pode ser implementado ao longo de vários tipos de canais diferentes: sockets de domínio Unix, TCP, UDP, e assim por diante. A biblioteca de sockets fornece classes específicas para lidar com o transporte comum, bem como uma interface genérica para lidar com o resto.

  • Domain : A família de protocolos que serão utilizados como mecanismo de transporte. Estes valores são constantes, tais como AF_INET, PF_INET, PF_UNIX, PF_X25, e assim por diante.
  • Type : O tipo de comunicação entre os dois terminais, normalmente SOCK_STREAM para orientação a conexão protocolos e SOCK_DGRAM para protocolos de conexão.
  • Protocol :  Geralmente nulo, este campo pode ser usado para identificar uma variante de um protocolo dentro de um domínio e tipo.
  • Hostname :  O identificador de uma interface de rede.
  • Port : Cada servidor lista clientes "chamando" em uma ou mais portas. Uma porta pode ser um número de porta Fixnum, uma string contendo um número de porta, ou o nome de um serviço. 

O módulo de socket 

Para criar um socket, você deve usar a função socket.socket () disponível no módulo de socket, que tem a seguinte sintaxe:

s = socket.socket (socket_family, socket_type, protocol=0)

Parâmetros:
- socket_family : Este é ou AF_UNIX ou AF_INET.
- socket_type : Este é ou SOCK_STREAM ou SOCK_DGRAM.
- protocol : = 0 descartado.

Depois de ter objeto socket, então você pode usar as funções necessárias para criar o seu cliente ou o programa servidor. A tabela a seguir contem a lista de funções necessárias:

























 


Um servidor simples: 


Para escrever servidores de Internet, nós usamos a função de socket disponíveis no módulo para criar um objeto. Um objeto é então usado para chamar outras funções para configurar um servidor socket.
Agora chamar bind (função, hostname porta para especificar uma porta para o seu serviço na máquina host).
Em seguida, chamar o método de aceitar o objeto retornado. Este método aguarda até que um cliente se conecta à porta que você especificou, e retorna um objeto de conexão que representa a conexão com esse cliente.




#!/usr/bin/python           

import socket               # Importa o modulo de socket

s = socket.socket()         # Cria um objeto de socket
host = socket.gethostname() # Retorna o nome da máquina local
port = 12345                # Reserva uma porta para o seu serviço
s.bind((host, port))        # Bind para a porta

s.listen(5)                 # Esperar a conexão do cliente
while True:
   c, addr = s.accept()     # Estabelecer conexão com o cliente
   print 'Recebeu a conexão de', addr
   c.send('Conexão deu certo')
   c.close()                # Encerra a conexão

Um cliente simples: 

Agora vamos escrever um programa cliente muito simples que vai abrir uma conexão com uma determinada porta 12345 e determinado host.
O Socket.connect (hosname, porta) abre uma conexão TCP para o nome na porta.
Depois de ter um socket aberto, você pode lê-lo como qualquer outro objeto IO. Quando terminar, lembre-se de fechá-lo.
O código a seguir é um cliente muito simples que se conecta a um determinado host e porta, lê todos os dados disponíveis a partir do socket, e depois sai:

#!/usr/bin/python           

import socket             

s = socket.socket()         # Cria um objeto de socket
host = socket.gethostname() # Retorna o nome da máquina local
port = 12345                # Reserva uma porta para o seu serviço

s.connect((host, port))
print s.recv(1024)
s.close                     # encerra

Agora execute este server.py ( em background) e em seguida, execute client.py para ver o resultado.

# Após iria iniciar um servidor em background:
 $ Python server.py & 

 # Uma vez servidor é iniciado cliente executado:

 $ Python client.py
 
 Resultado: 

Recebeu a conexão de ('127.0.0.1', 48437) 
Conexão deu certo

quarta-feira, 17 de agosto de 2011

Device Drivers em Linux Embarcado

Recentemente apresentei na faculdade meu ultimo projeto ( trabalho de conclusão de curso) , onde tive a felicidade de poder escolher o tema desejado, eu escolhi : Device Drivers em Linux Embarcado. O desafio estava lançado. A ideia era conseguir explicar o que são device drivers porem voltado para um projeto prático colocando todos os detalhes de implementação.

Parte 1 - Bibliografia
Como já não é novidade , bons materiais sobre device drivers são em inglês, a maioria dos livros que abordam bem especificado este tema . Somente alguns artigos na internet e alguns blogs contém alguma informação util valida para um projeto maior, recomendo o  blog do Sergio Prado .  Como o projeto é uma monografia devemos evitar ao máximo sites, no meu  caso eu utilizei somente sites referente as especificacoes da placa que nós utilizamos e o webserver.

Parte 2 - Teoria
Primeiramente o desafio foi : Como abordar um tema destes de uma forma que qualquer leitor entenda? Não é uma tarefa simples, devemos seguir uma linha lógica de tópicos até chegarmos aonde queremos. No caso deste tema primeiramente, a ideia foi especificar seus métodos de funcionamento, como é a estrutura basica de um device driver , a maneira que ele interage com o sistema ( kernel space / user space) , dentre outras caracteristicas importantes para entendermos a parte prática.

Parte 3- Projeto Prático
O projeto prático foi feito da seguinte forma, com a ajuda do meu colega Ramon, nós escolhemos o kit Friendly ARM Mini 2440 onde decidimos fazer um device driver para a porta GPIO. Como podemos ver na figura abaixo:


O que esta porta irá controlar? Motores ( carro ) . Foi ai que a ideia se concretizou, batizamos de PorscheARM. A ideia era o seguinte : Controlar o carro via browser , ou seja, nós teriamos um webserver embarcado nesta placa, então nós utilizamos um webserver que é pequeno e eficiente para isto o Boa webserver . O sistema que utilizamos foi o Linux 2.6 baixado o ultimo kernel do proprio site da ARM. Para mostrar didaticamente o funcionamento de um device driver criamos um nó device para cada direção : direita, esquerda, pra baixo , pra cima . A pagina web (feita em CGI) mandava os comandos para o device driver que controlava os motores. (WEB) -> DEVICE -> Motores . Abaixo fotos do projeto











 Parte 3 - Utilizando o acelerometro do iphone como controle
Com o intuito de aprimorar mais o sistema foi feito um código em javascript que capturava a posição X,Y,Z do iphone e mandava pro nosso webserver e com isso atraves do device driver comunicava com os motores indo pra direção conforme orientava o celular. Note que não observamos nenhum atraso com este teste.


Parte 4 - Testes
Os testes do projeto foram feitos e filmados pelo Ramon , podemos ver os videos abaixo:

E testado no ginásio da faculdade




Quer ver mais detalhado?
Estou disponibilizando neste link o trabalho completo deste projeto, teórico e prático, onde os códigos fontes estão no anexo deste pdf compartilhado ou no github, segue o link do PDF :  TCC_Device Drivers em Linux Embarcado 

Espero ter ajudado alguém com este post . É uma área que tenho muito interesse e estou sempre disposta a compartilhar conhecimento sobre isto e espero que vocês compartilhem também. =)

 

 



segunda-feira, 15 de agosto de 2011

GIT - Breve guia para iniciantes

  Como foi falado anteriormente no post sobre controle de versões , o GIT é o sistema de controle de revisão/versão criado pelo  Linus Torvalds: famoso devido à falta de satisfação com as soluções existentes. A ênfase principal no projeto foi na velocidade, ou mais especificamente, a eficiência. GIT aborda muitas das deficiências dos sistemas anteriores, e faz tudo isso em muito menos tempo.


O que o GIT faz?
Vamos dizer que você está trabalhando na criação de um site para clientes. Eles afirmam o  que eles querem, você projetá-o, eles analisam e fazem revisões. Com cada conjunto de revisões do cliente, o site muda e cresce. Mais tarde, o cliente pode dizer "Eu gosto mais do jeito que estava em setembro do ano passado". Em circunstâncias normais, você tem um problema. Você não pode ter todos os arquivos e dados a partir desse momento, e seu código pode ter mudado tanto que reverter seria difícil ou impossível.
  O ponto de um sistema de controle de versões é a de resolver quase todos os problemas no parágrafo acima. Você pode acompanhar cada mudança no seu código e arquivos, e reverter em qualquer ponto de volta(point back) como as coisas eram.

Como o GIT funciona? 

O diretório de cada projeto tem seu repositório git próprio. Você mantem todos os seus arquivos para esse projeto nesse diretório, e, periodicamente, diz para o git  atualizar suas informações com o estado atual dos arquivos. Esse processo de mandar gravar o estado dos arquivos é um commit. Cada vez que você ''comitar'' (que deve ser frequentemente) git varre sobre todos os arquivos que ele foi instruído a rastrear e salva as diferenças nesses arquivos para o diretório git.. Cada commit torna-se um ponto para salvar novos pontos de desenvolvimento do seu projeto.
Opcionalmente, você pode empurrar seu repositório git locais para um host ( diretório online), como GITHUB. Isto permite que vários colaboradores mexam em um mesmo  projeto, em seguida, agrupar todos os commits locais em uma única atualização para o repositório online. Esta é uma das coisas que faz Git mais rápido de usar do que alguns outros VCS sistemas: você pode "comitar" com freqüência para seu repositório local sem desperdiçar tempo e largura de banda ter que fazer o upload para um servidor de cada para cada um. O que diferencia o git de outros sistemas é exatamente a velocidade.

Instalando GIT 


A maioria dos usuários Linux devem ter Git (ou git-core) disponíveis nos repositórios padrões de sua distro. Os usuários do Ubuntu podem instalá-lo clicando aqui , ou no terminal:
sudo apt-get install git-core 
 
  Estes exemplos são destinados para Linux, mas é bem parecido para todas as plataformas suportadas pelo Git.

Usando o GIT 


O processo de criação de um repositório Git local é rápido e fácil. Crie um diretório que você pretende usar para o seu projeto e abra seu terminal para esse local. Na linha de comando (terminal), digite o comando:
git init 
Isso irá criar o diretório git para manter suas informações repositório. Provavelmente, você vai querer começar a adicionar alguns arquivos. Vamos começar criando um arquivo README de teste, adicionando a lista do repositório de arquivos para assistir, então commitar o nosso arquivo para o repositório.
# Inserir um texto em um novo arquivo
 echo "TODO: Criar documentação" > README.txt

 # Agora diga ao Git para acompanhar as mudanças deste arquivo
 # Isso só precisa ser feito uma vez por arquivo
 git add README.txt

 # E agora salvar o estado no repositório
 git commit README.txt 
Você será levado para uma tela de editor de texto onde você deve digitar qualquer nota sobre este commit (log). Estes são geralmente breves resumos das mudanças que ocorreram desde o último commit. Uma vez que você salve e saia do editor de texto a confirmação deve ser concluída com êxito.
Adicionando e comprometendo cada arquivo individualmente ( se forem muitos),  pode ser entediante. Para contornar isso, você pode adicionar de uma só vez todos os arquivos no diretório atual com o comando:
# Observe a direita "."
 git add. 
e você pode cometer todos os conhecidos, os arquivos modificados de uma vez com
git commit-a 
Algumas outras opções de comando git útil incluem:
# Fazer um clone completo de repositório existente, como a partir do site
 #de um projeto de software
 git clone (git URL, ou seja:. //github.com / github/ linux-2.x.git ) 
note que 2.x , x é a versão que você esta utilizando no meu caso aqui 
é linux-2.6.git
 
# Mover / renomear um arquivo.  Isto poupa-lo de ter de remover e
 # adicionar novamente o arquivo
 # Se tivesse sido movido pelo bash
 git mv (fonte) (destino)

 # Apagar um arquivo e retire do repo Git
 rm git (target)

 # Veja ramos neste repositório
 git branch

 # Criar um novo ramo da árvore Git
 git branch (new branch name, ou seja, "experimental")

 # Mude de um ramo para outro
 git checkout (branch name, ou seja, "experimental")

 # Mesclar ramo (branch) em árvore atual
 git merge (branch) 

Isso, é claro, é apenas o começo do que Git pode fazer. Se você achar que é útil, eu recomendo o livro oficial da comunidade git  para ter uma idéia muito mais profunda de como usar esta ferramenta inteligente de software.



 

Curso online de Stanford grátis


Atualmente a tendência é termos uma série de cursos e aulas online facilitando o aprendizado em qualquer lugar do mundo. Uma novidade imperdivel é que professores da Universidade Stanford disponibilizaram gratuitamente o curso oficial de Introdução a Inteligência Artificial .

Cadastre no site : www.ai-class.com e espere as aulas a partir do dia 10 de outubro. As inscrições vão até o dia 20 de setembro, não perca esta chance!

2 semanas após anunciar o curso já tinha 56.000 estudantes cadastrados.



sábado, 30 de julho de 2011

Como restaurar o sistema do iphone

Acredito que muitas pessoas já tentaram fazer o Jailbreak no iphone. Eu não possuo iphone mas vou relatar um problema que resolvi recentemente para um amigo.  O problema foi o seguinte, no meio do processo do jailbreak a conexão parou e corrompeu algo do IOS , pois o aparelho não ligava mais ficava só no simbolo de conexão do cabo com o itunes. Quando abria o itunes falava pra fazer um update de 666,7MB porém dava erro ao baixar esse update.

Melhor solução para este problema foi baixar o firmware para o iphone 4 .  Para fazer esse restore no firmware: primeiramente deve-se fazer o download do firmware correspondente no site (arquivo .ipsw) e depois você deve abrir o itunes e clicar com o shift pressionado em cima do botão restore  ( pois ele da a opção de voce selecionar o arquivo .ipsw do seu computador). Como visto na tela abaixo:

 Bom espero ter ajudado de alguma forma, já adianto que nenhum dado foi perdido nesse processo de restore.

domingo, 24 de julho de 2011

Como criar aplicativos no Facebook





Primeiramente, devemos saber, que o Facebook permite criação de vários aplicativos de terceiros porém não hospeda estes aplicativos em seu servidor, por isso devemos ter um servidor nosso para hospedar nosso app.

O processo de criação é bastante simples pode ser acessado pela pagina de desenvolvimento : Facebook Developers
 
Para criar um post via ( nome do seu app ) basta utilizar um plugin chamado Live Stream e hospedar o codigo gerado em seu servidor/blog ( é só entrar com a url do seu aplicativo a App ID key ( chave que ja é gerada quando se cria o app em developers ( my apps) )


Abaixo um video tutorial de como criar rapidamente um aplicativo:

sábado, 12 de fevereiro de 2011

Porque utilizar o controle de versões



Um sistema de controle de versão, VCS (do inglês version control system) ou ainda SCM (do inglês source code management), é um software com a finalidade de gerenciar diferentes versões no desenvolvimento de um documento qualquer. Esses sistemas são comumente utilizados no desenvolvimento de software para controlar as diferentes versões – histórico e desenvolvimento – dos códigos-fontes e também da documentação.
Esse tipo de sistema é muito presente em empresas e instituições de tecnologia e desenvolvimento de software. É também muito comum no desenvolvimento de software livre. É útil, em diversos aspectos, tanto para projetos pessoais pequenos e simples como também para grandes projetos comerciais.
Principais Vantagens
Imagine o seguinte:
Você chega lá na empresa que você está desenvolvendo um projeto, passou dias desenvolvendo e logicamente há outras pessoas alterando os arquivos do projeto, porém nenhuma delas utilizaram o controle de versão para informar a você das modificações atuais, ou seja você está la com a sua versão porém já pode ter ocorrido uma série de alterações. Isso nos mostra como é importante termos o controle de versão , uma que sem ele você pode afetar o prazo de entrega já que ficou todo bagunçado e você vai ter todo um trabalho de ir atrás dos arquivos modificados para um futuro merge ( em outro post falarei de umas ferramentas boas para isto) na qual demanda muito tempo e sujeito a mais erros.
A principal função do sistema de controle de versão é armazenar todo o histórico de desenvolvimento do documento ( todas suas modificações nos arquivos são registradas), desde o primeiro envio até sua última versão. Isso permite que seja possível resgatar uma determinada versão de qualquer data mais antiga, evitando desperdício de tempo no desenvolvimento para desfazer alterações quando se toma algum rumo equivocado.
Alguns exemplos de softwares que fazem controle de versoes
Soluções comerciais
  • Microsoft Visual SourceSafe (VSS) – produto da Microsoft para controle de versão, integrado a muitas IDEs da Microsoft.
  • Rational ClearCase – produto da IBM para controle de versão.
  • Borland StarTeam – produto da Borland para controle de versão e de equipe.
Soluções livres
  • Concurrent Version System (CVS) – software livre clássico e bem testado.
  • Subversion (SVN)
  • Git – Software para controle de versão distribuído com foco na velocidade.
  • MediaWiki – software livre que possui um sistema integrado de controle de versões. Sites com os projetos da Wikimedia, tal como a Wikipédia mantém o sistema MediaWiki para o controle das versões dos documentos. Esse sistema permite o trabalho simultâneo de milhares de voluntários.
  • GNU CSSC
  • Revision Control System (RCS)
  • Bazaar
  • Darcs
  • Mercurial
  • Monotone
  • SVK
    Eu fiz o uso do GIT  e do SVN, ambos me trouxeram uma prática muito boa de versionamento, no meu caso eu estava trabalhando com linux embarcado, caso acontecesse algum erro aparentemente “irreparavel” ou então se eu tivesse meus arquivos atuais corrompidos, ao invés de ter que reinstalar o kernel ou ir atras destes arquivos com alguém, era só eu voltar para uma versão anterior que estaria lá no meu git ( falarei mais do git em breve) .
    Fica aqui mais uma dica, o projeto sem estas boas práticas de software pode comprometer a confiabilidade/qualidade do seu projeto.

sexta-feira, 11 de fevereiro de 2011

Confiabilidade de software

 

1 - Introdução: Software Embarcado - Desastres?

Com o advento da era tecnológica, computadores, bem como os softwares que rodam neles, estão desempenhando um papel vital em nossa vida diária. Podemos não ter notado, mas aparelhos como máquinas de lavar, telefones, televisões e os relógios, estão tendo os seus componentes analógicos e mecânicos substituído pelos processadores e software.
A indústria de computadores/tecnologia está crescendo exponencialmente. Com um custo reduzido e controle melhorado, processadores e sistemas controlados por software oferecem um design compacto, manipulação flexível, ricos em recursos e custo competitivo. As pessoas costumavam acreditar que o "software nunca quebra." Intuitivamente, ao contrário de peças mecânicas, tais como parafusos, alavancas, ou componentes eletrônicos como transistores, software, capacitor vai ficar "como está" se não houver problemas de hardware que altera o conteúdo ou o caminho de armazenamento de dados. Software não enferruja, não tem idade, e nem desgaste. Não há nenhuma restrição ambiental para operar o software, enquanto o processador é executado em hardware podem operar. Além disso, o software não tem forma, cor, material e massa. Ele não pode ser visto ou tocado, mas tem uma existência física e é crucial para a funcionalidade do sistema. Sem ser provado o contrário, as pessoas otimistas que pensam que uma vez que o software foi criado pode ser executado corretamente para sempre. Uma série de tragédias e caos causado pelo software comprova que isso é errado. Esses eventos sempre terão seu lugar na história. Software pode tomar decisões, mas pode apenas com pouca confiabilidade ( sujeito a bugs/crash) , como seres humanos erram. O destróier britânico Sheffield foi afundado porque o sistema de radar identificou um míssil como "amigável". O que foi uma tragédia para o sistema de defesa.
O software também pode ter pequenos erros imperceptíveis ou desvios que podem culminar em um desastre. Em 25 de fevereiro de 1991, durante a Guerra do Golfo, o erro corte que perdeu 0,000000095 segundos na precisão, fez o míssil Patriot errar em interceptar um míssil Scud. 28 vidas foram perdidas. Corrigir problemas pode não necessariamente tornar o software mais confiável. Pelo contrário, novos problemas sérios podem surgir. Em 1991, depois de mudar três linhas de código em um programa de sinalização, que contém milhões de linhas de código, os sistemas de telefonia local na Califórnia e ao longo da costa leste parou. (interrupção por telefone) .Uma vez funcionando perfeitamente software também pode quebrar se o ambiente de execução for modificado. Depois do sucesso do foguete Ariane 4, o vôo inaugural do Ariane 5 acabou em chamas, enquanto defeitos de projeto no software de controle foram revelados pela rápida velocidade horizontal do novo foguete.
Há histórias muito mais assustadoras para contar. Isto faz-nos saber se o software é confiável em tudo, se devemos usar o software de segurança, aplicações críticas. Aviões, marca passos , máquinas de radioterapia entre varias outras aplicações dentro da área da biomedicina e etc, um simples erro de software pode facilmente reivindicar as vidas das pessoas. A confiabilidade do software é simplesmente uma questão de vida ou morte. Será que estamos incorporando potenciais catástrofes enquanto incorporamos o nosso software em sistemas?

Conceitos-chave:

Definição
De acordo com ANSI, Confiabilidade de Software é definido como: A probabilidade de software operar sem falhas durante um determinado período de tempo em um ou mais ambientes especificados. Apesar de confiabilidade de software ser definida como uma função probabilística, e vem com a noção de tempo, devemos notar que, diferente da tradicional confiabilidade de Hardware, confiabilidade de software não é uma função direta do tempo. Eletrônicos e peças mecânicas podem tornar-se "velho" e se desgastam com o tempo e uso, mas o software não irá enferrujar ou desgastar durante seu ciclo de vida. O software não irá mudar com o tempo a menos que intencionalmente modificado ou atualizado. ( Aqui sim entram as N questões da fase de testes)
Confiabilidade de software é um importante atributo de qualidade de software, juntamente com a funcionalidade, usabilidade, desempenho, facilidade de manutenção, capacidade, instalabilidade, manutenção e documentação. É difícil de alcançar, porque a complexidade do software tende a ser elevada. Embora qualquer sistema com um alto grau de complexidade, será difícil chegar a um certo nível de confiabilidade, desenvolvedores de sistemas tendem a empurrar a complexidade para a camada de software, com o rápido crescimento do tamanho do sistema e a facilidade de fazê-lo através da sua modernização . Apesar da complexidade do software estar inversamente relacionado com a confiabilidade, ele está diretamente relacionado a outros importantes fatores de qualidade de software, especialmente a funcionalidade, capacidade e etc. Ressaltando essas características tendem a adicionar mais complexidade ao software.

Insuficiência no mecanismos de Software

As falhas de software pode ser devido a erros, ambigüidades, omissões ou má interpretação da especificação de que o software deve satisfazer, descuido ou incompetência na escrita de código, testes inadequados ou inesperados uso incorreto do software ou outros problemas imprevistos.Software e hardware têm diferenças fundamentais que as tornam diferentes mecanismos de falha. Falhas de hardware são principalmente falhas físicas , enquanto que falhas de software são falhas de concepção , que são mais difíceis de visualizar, classificar, detectar e corrigir. Falhas no projeto estão intimamente relacionadas com fatores humanos e do processo de design, que não temos uma sólida compreensão. Em hardware, defeitos de projeto também podem existir, mas falhas físicas normalmente dominam.
Software x Hardware  :
Falha : defeitos de software são principalmente erros na sua fase de concepção.
Desgastar-se : Software não desgasta porem erros podem ocorrer sem aviso prévio.
Conceito de sistemas reparáveis : reiniciar periódicamente pode ajudar a resolver problemas de software.
Tempo de dependência e de ciclo de vida : a confiabilidade do software não é uma função do tempo operacional.
Fatores ambientais : Não afetar a confiabilidade do software, exceto que ele pode afetar as entradas do programa.
Previsão Confiabilidade : confiabilidade de software não pode ser previsto a partir de qualquer base física, já que depende totalmente sobre fatores humanos em design. ( Fase de projeto)
Redundância : não é possível melhorar a confiabilidade do software se os componentes de software idênticos são usados.
Interfaces : interfaces de software são puramente conceitual diferente visual.
Taxa de falhas : Normalmente não é previsível a partir de análises separadas.
Construído com componentes padronizados : Bem-entendido e amplamente testada peças padronizadas irá ajudar a melhorar a durabilidade e confiabilidade. Mas, na indústria de software, não observamos esta tendência. A reutilização de código tem sido em torno de algum tempo, mas a uma extensão muito limitada.
Melhoria de Software  - Técnicas de Confiabilidade

Métodos de engenharia de boa qualidade podem melhorar a confiabilidade do software em grande parte.
Antes da implantação de produtos de software, verificação, teste e validação são etapas necessárias. O teste de software é muito utilizado para acionar, localizar e remover os defeitos de software.  Várias ferramentas de análise, tais como análise de tendências, análise de árvore de falhas, defeitos classificação ortogonal e métodos formais, etc, também podem ser usados para minimizar a possibilidade de ocorrência de defeito após o lançamento e, portanto, melhorar a confiabilidade do software.
Após a implantação do produto , dados de entrada/saida podem ser reunidas e analisadas para estudar o comportamento do sistema. Tolerância a falhas ou  previsão de falhas será útil para minimizar a ocorrência de falhas ou o impacto da falha no sistema.

Conclusões

Confiabilidade de software é uma parte fundamental na qualidade do sistema. O seu estudo pode ser categorizadas em três partes: a medição, modelagem e aperfeiçoamento.
Software de modelagem  amadureceu a tal ponto que resultados significativos podem ser obtidos através da aplicação de modelos adequados para o problema. Há muitos modelos existentes atualmente, mas nenhum modelo pode capturar uma quantidade necessária das características do software. Suposições e abstrações devem ser feitas para simplificar o problema. Não existe um modelo único, que é universal a todas as situações.
Software de medição de confiabilidade é ingênuo. Medição está longe de ser comum em software, como no campo da engenharia. "Como é bom o software, quantitativamente?" Tão simples como a pergunta é: ainda não há uma boa resposta.
Confiabilidade de software não pode ser medido diretamente, então outros fatores relacionados são medidos para estimar a confiabilidade do software e compará-lo entre os produtos. Processo de desenvolvimento, faltas e falhas encontradas são todos fatores que garantem a boa qualidade do sistema.
Como o software cada vez mais está se arrastando em sistemas embarcados, devemos nos certificar de que não estamos incorporando catástrofes. Se não for analisada com cuidado, a confiabilidade do software pode ser o gargalo da confiabilidade do sistema como um todo. Garantir isto não é tarefa fácil. Por mais difícil que o problema seja jamais deixe de lado esta questão da qualidade do sistema, pois sem isso não podemos garantir um produto livre de prejuizos e possiveis acidentes irreparaveis.Vamos todos utilizar varios processos já existentes no campo da engenharia de software.

Chato?

Sempre escuto pessoal comentando "ah documentação é chato!" , "pra que eu preciso disso? é só implementar isto e mais aquilo" , ah pergunta é: Você tem certeza que só você irá mexer no sistema? Você vai se lembrar de todas as alterações feitas? . Devemos praticar todos os métodos de engenharia de software se desejamos ter qualidade no nosso sistema, pois é mais facil corrigir uma falha do presente do que ignora-lo e no futuro a somátoria das pequenas falhas tornar um buraco enorme que irá até depreciar a imagem da empresa e dependendo da área que ele for implementado colocar em fase de risco para os utilitarios deste.

Fonte: http://www.ece.cmu.edu/~koopman/des_s99/sw_reliability/

Utilizando jExcelAPI


JExcel é uma biblioteca para integração do Microsoft Excel para aplicações Java .Com esta biblioteca você possui classes que nos fornecem funções para a criação, escrita e leitura de arquivos para o excel em tempo real. A vantagem é que dependendo da aplicação que desejamos não necessitamos de um banco de dados já que no caso seria a propria planilha o armazenamento das informações que queremos. A plataforma requerida é a JVM (Java Virtual Machine) que significa que o código desenvolvido com JExcel pode ser executado em diferentes sistemas operacionais sem nenhuma modificação. O exemplo a seguir é uma aplicação que cria um novo documento em excel e escreve os dados em diferentes folhas deste.
   1: import java.io.*;
   2: import jxl.*;
   3: import java.util.*;
   4: import jxl.Workbook;
   5: import jxl.write.DateFormat;
   6: import jxl.write.Number;
   7:  
   8: import jxl.write.*;
   9: import java.text.SimpleDateFormat;
  10:  
  11: class  create
  12: {
  13:   public static void main(String[] args) 
  14:   {
  15:     try
  16:     {
  17:       String filename = "entrada.xls";
  18:       WorkbookSettings ws = new WorkbookSettings();
  19:       ws.setLocale(new Locale("en", "EN"));
  20:       WritableWorkbook workbook = 
  21:         Workbook.createWorkbook(new File(filename), ws);
  22:       WritableSheet s = workbook.createSheet("Folha1", 0);
  23:       WritableSheet s1 = workbook.createSheet("Folha1", 0);
  24:       writeDataSheet(s);
  25:       writeImageSheet(s1);
  26:       workbook.write();
  27:       workbook.close();      
  28:     }
  29:     catch (IOException e)
  30:     {
  31:       e.printStackTrace();
  32:     }
  33:     catch (WriteException e)
  34:     {
  35:       e.printStackTrace();
  36:     }
  37:   }
  38:  
  39:   private static void writeDataSheet(WritableSheet s) 
  40:     throws WriteException
  41:   {
  42:  
  43:     /* Formata a fonte */
  44:     WritableFont wf = new WritableFont(WritableFont.ARIAL, 
  45:       10, WritableFont.BOLD);
  46:     WritableCellFormat cf = new WritableCellFormat(wf);
  47:     cf.setWrap(true);
  48:  
  49:     /* Cria um label e escreve a data em uma célula da folha*/
  50:     Label l = new Label(0,0,"Data",cf);
  51:     s.addCell(l);
  52:     WritableCellFormat cf1 = 
  53:       new WritableCellFormat(DateFormats.FORMAT9);
  54:  
  55:     DateTime dt = 
  56:       new DateTime(0,1,new Date(), cf1, DateTime.GMT);
  57:  
  58:     s.adCell(dt);
  59:     
  60:     /* Cria um label e escreve um float numver em uma célula da folha*/
  61:     l = new Label(2,0,"Float", cf);
  62:     s.addCell(l);
  63:     WritableCellFormat cf2 = new WritableCellFormat(NumberFormats.FLOAT);
  64:     Number n = new Number(2,1,3.1415926535,cf2);
  65:     s.addCell(n);
  66:  
67: n = new Number(2,2,-3.1415926535, cf2);
  68:     s.addCell(n);
  69:  
  70:     /* Cria um label e escreve um float number acima de 3 decimais 

  71:        em uma célula da folha*/
  72:     l = new Label(3,0,"3dps",cf);
  73:     s.addCell(l);
  74:     NumberFormat dp3 = new NumberFormat("#.###");
  75:     WritableCellFormat dp3cell = new WritableCellFormat(dp3);
  76:     n = new Number(3,1,3.1415926535,dp3cell);
  77:     s.addCell(n);
  78:  
  79:     /* Cria um label e adiciona 2 células na folha*
  80:     l = new Label(4, 0, "Add 2 cells",cf);
  81:     s.addCell(l);
  82:     n = new Number(4,1,10);
  83:     s.addCell(n);
  84:     n = new Number(4,2,16);
  85:     s.addCell(n);
  86:     Formula f = new Formula(4,3, "E1+E2");
  87:     s.addCell(f);
  88:  
  89:     /* Cria um Label e mulpiplica o valor de uma célula da folha por 2 */
  90:     l = new Label(5,0, "Multiplica por 2",cf);
  91:     s.addCell(l);
  92:     n = new Number(5,1,10);
  93:     s.addCell(n);
  94:     f = new Formula(5,2, "F1 * 3");
  95:     s.addCell(f);
  96:  
  97:     /* Cria um Label e divide o valor de uma célula da folha por 2.5 */
  98:     l = new Label(6,0, "Divide por 2.5",cf);
  99:     s.addCell(l);
 100:     n = new Number(6,1, 12);
 101:     s.addCell(n);
 102:     f = new Formula(6,2, "F1/2.5");
 103:     s.addCell(f);
 104:   }
 105:  
 106:   private static void writeImageSheet(WritableSheet s) 
 107:     throws WriteException
 108:   {
 109:     /* Cria um label e escreve uma imagem em uma célula da folha*/    
 110:     Label l = new Label(0, 0, "Imagem");
 111:     s.addCell(l);
 112:     WritableImage wi = new WritableImage(0, 3, 5, 7, new File("imagem.png"));
 113:     s.addImage(wi);
 114:  
 115:     /* Cria um label e escreve hyperlink em uma célula da folha*/
 116:     l = new Label(0,15, "HYPERLINK");
 117:     s.addCell(l);
 118:     Formula f = new Formula(1, 15, 
 119:       "DevMedia(\"http://www.devmedia.com.br\", "+
 120:       "\"Portal DevMedia\")");
 121:     s.addCell(f);
 122:     
 123:     }
 124: }

Download : Download Fonte do Código exemplo : How-to-create-an-excel-file Este é o guide do site oficial : JExcel-PGuide Tutorial: Tutorial