quarta-feira, 9 de dezembro de 2009

XML

Pessoal,



Atualmente venho trabalhando com a revisão da arquitetura dos sistemas da empresa na qual trabalho e por conta disso venho utilizando bastante WEBSERVICES para integrar e/ou compartilhar informações entre esses sistemas.



Para realizar o transporte dessas informações, obviamente estamos utilizando o XML. Assim, tive que voltar a estudar essa meleca e gostaria de compartilhar esses estudos com vocês.



O que é o XML:


  • É o acrônimo de eXtensible Markup Language
  • Foi projetado para transportar e amarzenar dados diferetemente do HTML cuja finalidade é a apresentação dos dados.
  • Suas tags não são pré definidas como as tags do HTML quem define estas é o programador
  • Possui metadados (dados sobre os dados). É auto explicativo
  • É utilizada para a escrita de novas linguagens web(XHTML,WSDL etc)
Estrutura do XML
  • Possui um elemento raiz e vários elementos filhos
  • elementos podem possui subelementos e/ou atributos
  • subelementos de mesmo nível são considerados irmãos
Regras de sintaxe:

  • Todos os elementos devem possuir tags de fechamemento
  • tags são case sensitive e devem estar devidamente aninhadas
  • atributos devem vir entre aspas
Elementos versos Atributos

  • Atributos não podem conter múltiplos valores
  • Atributos não possui estrutura de árvore
  • Atributos não são expansíveis
XML válido e bem formado

  • XML com sintaxe correta é considerado bem formado
  • XML validado contra um DTD ou contra um SCHEMA é considerado válido
  • O propósito de um DTD é definir a estrutura de um documento xml (semelhante a uma DDL no SQL)
Esquema de apresentação do XML

  • Para formatar a apresentação  dos dados de um XML podemos utilizar XSLT, CSS, javascript
Para se comunicar com servidores podemos fazer uso do componente XMLHTTP da Microsoft que apesar de não ser um padrão W3C funciona em qualquer browser.

Esses navegadores possui um analizador XML que interpreta o conteúdo do XML e o transforma em objeto (XMLDOM). Assim devemos instanciar um objeto do tipo XMLHTTPRequest e instanciar um objeto XMLDOM para "atravessar" o arquivo XML.

O XMLDOM apresenta uma maneira padrão para acessar e manipular os dados de um arquivo XML.

Namespaces fornecem um método para evitar conflito de nomes de elementos no arquivo XML

Bom, aqui fizemos um apanhado dos conceitos e caracteríticas do XML. Nos próximos posts falaremos mais sobre o assunto

terça-feira, 1 de dezembro de 2009

RESUMO JAVA

Java é muita coisa:
  • A Linguagem de programação Java;
  • O ambiente de execução Java;
  • O kit de desenvolvimento Java;
  • Uma biblioteca de classes (API) Java.

Desde a versão 1.2, passou a ser chamada de “Java 2”e foi dividida em:

  • Java 2 Platform Standard Edition (JavaSE);
  • Java 2 Platform Enterprise Edition (JavaEE);
  • Java 2 Platform Mobile Edition (JavaME).
  • Cada uma tem sua API;

A JavaSE é base para as outras.

A partir da versão 6, tira-se o “2”:
  • Java Platform, Standard Edition 6 ou Java SE 6;
  • Java Platform, Enterprise Edition 6 ou Java EE 6;
  • Java Platform, Mobile Edition 6 ou Java ME 6.
O “Java2” permanece na versão 1.5 e anteriores.


J2SE

Ferramentas de desenvolvimento + API núcleo da plataforma Java;

Permite o desenvolvimento de aplicações desktop, inclusive com interface gráfica, acesso à banco de dados, I/O, rede, etc.

Dividida em:
  • JDK = Java Development Kit;
  • JRE = Java Runtime Environment.
JDK

Somente para os programadores;

Contém:
  • Ferramentas de desenvolvimento;
  • Ambiente de execução (JRE);
  • API Java SE (compilada e código-fonte);
  • Programas de demonstração;
  • Bibliotecas adicionais;
  • Documentação (obtida separadamente).

JRE

Necessária para rodar programas Java, pois além de compilada, Java também é interpretada;

É a única parte da plataforma Java que os clientes necessitam instalar;

Em alguns sistemas operacionais (ex. MacOS X) já vem instalada.

Implementação da Sun: ~ 15 MB.
  • Compilador (javac);
  • Interpretador (java);
  • Gerador de documentação (javadoc); 
  • Depurador (jdb); 
  • Gerador de pacotes (jar);
  • Outros:
  • Visualisador de applets (appletviewer);
  • Criptografia (keytool, jarsigner, etc.);
  • Etc.

A Sun dá suporte às seguintes plataformas:
  • Windows i586 / AMD64;
  • Linux i586 / AMD64;
  • Solaris SPARC / x86 / x64.
A Apple desenvolveu versão para MacOS.

Outras:

HP UX, FreeBSD, OS/2, AIX, AS/400, OS/390, IRIX, Alpha, SCO, NetWare, etc.;

Nem todas são atuais ou completas

Escreva uma vez e execute em qualquer lugar


Java é compilada e interpretada:
  1. Códigos das classes são compilados para uma linguagem intermediária chamada Bytecode;
  2. O Bytecode é interpretado por uma “máquina virtual”: a JVM;
  3. A JVM envia comandos específicos da plataforma para o sistema operacional

Principais API's
  • AWT/Swing: interfaces gráficas;
  • Java2D: desenho;
  • JDBC: acesso a bancos de dados;
  • JNDI: acesso a servidores de nomes;
  • RMI: invocação remota de métodos;
  • Beans: padrão JavaBeans;
  • i18n: suporte a internacionalização;
  • I/O: entrada e saída (arquivos);
  • JNI: integração com linguagens nativas;
  • Math: cálculos matemáticos;
  • Networking: transmissão pela rede;
  • Security: segurança;
  • Serialization: persistência por serialização;
  • XML: processamento de XML e afins;
  • Lang & Util: núcleo da linguagem, utilitários (coleções, datas, compactação, etc.);
  • Concurrency: programação concorrente (threads);
  • Logging: funções de relatório (log);
  • Reflection: reflexão e instrospecção.

J2EE


Permite o desenvolvimento de aplicações corporativas:

  • Multi-camada, distribuídas, centradas em servidores, altamente robustas, estáveis e escaláveis;
  • Inclui as especificações para desenvolvimento Web: Servlets, JSP, Web Services.

Servlets e JSPs:


Componentes que respondem à requisições web, usados para construir páginas dinâmicas e Web Services.


EJBs:


Componentes gerenciados integrados a outras tecnologias Java EE para prover acesso remoto, persistência e transações transparentes, processamento assíncrono, etc.


Java EE não é só Servlets e EJB:
  • RMI/IIOP e Java IDL: conectividade;
  • JNDI: serviço de nomes;
  • JAC e JNI: acesso a sistemas legados;
  • JAAS: segurança;
  • JTA: transações em bancos de dados;
  • JMS e JavaMail: envio de mensagens;
  • E tudo mais que já temos no J2SE...

Servidores web:
  • Apache Tomcat, Caucho Resin, Jetty, etc.

Servidores de aplicação:
  • BEA WebLogic, Borland Enterprise Server, JBoss Application Server, Oracle Application Server, IBM WebSphere, GlassFish, Geronimo, etc.;

 Bom, nos próximos posts vamos nos aprofundar nos itens constantes nesse resumo.

Grande abraço à todos!




segunda-feira, 30 de novembro de 2009

Instalando o Java

Existem uma série de acrônimos relacionados ao java. vamos mencionar uns aqui:
  • JVM (Java Virtual Machine) apenas a virtual machine;
  • JRE (Java Runtime Environment), ambiente de execução Java, formado pela JVM e bibliotecas, tudo que você precisa para executar uma aplicação Java.
  • JDK (Java Development Kit) Nós, desenvolvedores, faremos o download do JDK do Java SE (Standard Edition).
Antes de instalar, baixe o JDK 5.0 ou superior, do site do Java da Sun, em
http://java.sun.com . Pegue a versão internacional e cuidado para não baixar o que tem mais de 90 megas, que é a primeira opção na página de download: esta versão vem com o Netbeans(IDE de desenvolvimento), que é uma ferramenta da Sun, e não nos interessa no momento. Mais para baixo da página existe uma versão menor, algo em torno de 60 megas, sem essa ferramenta.

Esse software disponível na Sun é gratuito, assim como as principais bibliotecas Java e ferramentas.

É interessante você também baixar a documentação do JDK 5.0, o link se encontra na mesma página e possui outros 40 megas.

O procedimento de instalação no Windows é muito simples: basta você executar o arquivo e seguir os passos. Instaleo no diretório desejado.

Depois disso, é necessário configurar algumas variáveis de ambiente, para que você possa executar o compilador Java e a máquina virtual de qualquer diretório. Em cada Windows você configura as variáveis de ambiente de uma maneira diferente. São duas as variáveis que você deve mudar:

  • CLASSPATH=.
  • PATH=;c:\diretorioDeInstalacaoDoJava\bin
A variável PATH provavelmente já tem muita coisa e você só precisa acrescentar. Já a variável CLASSPATH deve ser criada. No Linux, são as mesmas variáveis, mas o PATH é separado por :. Nos Windows velhos, como o 98, você deve alterar isso no autoexec.bat.

Nos Windows mais novos, como NT, 2000, e XP, procure onde você pode adicionar novasvariáveis de ambiente (em Iniciar Painel
de Controle – Sistema – Avançado Variáveis de
Sistema).
No Linux, geralmente a alteração deverá ser feita no arquivo ~/.bashrc se você  não tiver privilégios de administrador.

sábado, 14 de novembro de 2009

JVM? JRE? JDK? e como escrever classes no JAVA

Bom, dando continuidade ao nosso estudo de java, falaremos sobre o processo de compilação e execução de programas desenvolvidos nessa linguagem.

O Java é mantido pela SUN e para trabalharmos com a aludida linguagem, necessitamos das ferramentas fornecidas por essa empresa. vamos a elas:

  • JVM = apenas a virtual machine, esse download não existe
  • JRE = Java Runtime Environment, ambiente de execução Java, formado pela JVM e bibliotecas, tudo que você precisa para executar uma aplicação Java.
  • JDK = Java Development Kit: Nós, desenvolvedores, faremos o download do JDK do Java SE (Standard Edition).
Quando compilamos um código escrito com a linguagem, o compilador gera um arquivo que chamamos de Bytecode.Uma espécie de código ou linguagem intermediária que é interpretado pela máquina virtual (JVM) essa máquina virtual tem diversas implementações, uma para cada plataforma (Windows, MAC OS, java entre outras).

Para compilar utilizamos o programa javac presente no JDK e para executar os programas utiliza-se o programa java.

Os arquivos escritos pelo programador deverão conter a extensão .java. Após a compilação, o compilador gerará um arquivo com a extensão .class


javac nomePrograma.java       java nomePrograma.classe

Colocado os "pingos nos is", cabe a nós mostrarmos as estrutura ou a sintaxe de como escrever classes em java:

//nome do pacote com a função de organizar classes com mais ou menos a mesma
package nomeDoPacote função

//indica os pacotes e as respectivas classes com as quais a classe em questão trocará mensagens



import nomeDoPacote.nomeDaClasse

//aqui definimos a classe

class NomeDaClasse{

//Assim definimos um atributo


modificadorDeAcesso tipoDoAtributo nomeAtributo;

//Assim definimos um método

modificadorDeAcesso tipoDeRetorno nomeDoMetodo( TipoDoParametro nomeDoParametro)
{
       //Aqui escrevemos a implementação do método
}


}

Cabe aqui ressaltarmos algumas características importantes:

  • O Java é case sensitive, ou seja, um atributo chamado valor será diferente de VaLoR. Exemplo: Contato;
  • Por convensão, utiliza-se a notação CamelCase;
  • Nome de classe se inicia com letra maiúscula e nomes de atributos e métodos inciam-se com letra minúscula. exemplos: getNome, nome
Exemplo prático:

class TestaIdade {



public static void main(String[] args) {


// declara a idade


int idade;


idade = 15;


// imprime a idade


System.out.println(idade);


// gera uma idade no ano seguinte


int idadeNoAnoQueVem;


idadeNoAnoQueVem = idade + 1;


// imprime a idade


System.out.println(idadeNoAnoQueVem);


}


}
 
  • Salve o código como TestaIdade.java
  • Compile o código digitando no console javac TestaIdade.java
  • Execute o programa digitando no console java TestaIdade.class
Nos próximos Posts falaremos mais sobre o JAVA

segunda-feira, 9 de novembro de 2009

A IDE Eclipse

O Eclipse (http://www.eclipse.org) é uma IDE (integrated development environment). Uma IDE tem o objetivo de auxiliar o programador no desenvolvimento de sistemas.
O Eclipse é a IDE líder de mercado. Formada por um consórcio liderado pela IBM, possui seu código livre.

A última versão é a 3.5. Precisamos do Eclipse 3.1 ou posterior, pois a partir dessa versão é que a plataforma dá suporte ao java 5.0. Você precisa ter apenas a Java RE instalada.

Veremos aqui os principais recursos do Eclipse. Você perceberá que ele evita ao máximo te atrapalhar
e apenas gera trechos de códigos óbvios, sempre ao seu comando. Existem também centenas de plugins
gratuitos para gerar diagramas UML, suporte a servidores de aplicação, visualizadores de banco de dados e
muitos outros.

Baixe o Eclipse do site oficial http://www.eclipse.org/. Apesar de ser escrito em Java, a biblioteca gráfica
usada no Eclipse, chamada SWT, usa componentes nativos do sistema operacional. Por isso você deve baixar a versão correspondente ao seu sistema operacional.

Descompacte o arquivo e pronto: agora basta rodar o executável.

Outras IDEs

Uma outra IDE open source famosa é o Netbeans, da Sun. (http://www.netbeans.org/).

Além dessas, Oracle, Borland e a própria IBM possuem IDEs comerciais e algumas versões mais
restritas de uso livre.

Pronto! Agora já estamos com o ambiente montado e já podemos brincar de programar em JAVA.

Até a próxima!

Instalando e configurando o ambiente de desenvolvimento JAVA no Windows

A JVM (Java Virtual Machine) é apenas uma especificação e devemos baixar uma implementação. Há muitas empresas que implementam uma VM, como a própria Sun, a IBM, a BEA e outras.


A da Sun é a mais usada e possui versões para Windows, Linux e Solaris. Você pode baixar o SDK deles
acessando:


http://java.sun.com/javase/downloads/index.jsp


Nesta página, você tem a opção de baixar o JDK, JRE, JDK+Java EE, Documentação, Código Fonte e
outras coisas.

Para instalar o JDK no Windows, primeiro baixe-o no site da Sun. É um simples arquivo executável que
contém o Wizard de instalação.

Instalação


1) Dê um clique duplo no arquivo “jdk--windows-i586-p.exe” e espere até ele entrar no wizard de
instalação.

2) Nesta tela, aceite o contrato da Sun, clicando em Accept:

3) Agora, devemos selecionar quais recursos instalaremos junto com o java (ferramentas de desenvolvimento,demonstrações, o código fonte e o próprio java) e onde ele será instalado (guarde esse caminho porque usaremos ele mais pra frente). Deixe como está e clique em “Next”.

4) Pronto, agora ele instalará o JDK, apenas aguarde.


5) Agora ele começará a instalar o JRE (Java Runtime Environment), se você já não tiver instalado. Assim
como o JDK, ele também tem algumas opções. Deixe como está e clique em “Next”.

6) Aguarde até o fim da instalação e clique em Finish.


Configurando

Precisamos configurar algumas variáveis de ambiente após a instalação.



1) Clique com o botão direito em cima do ícone “Meu Computador” e selecione a opção “Propriedades”.

2) Agora escolha a aba “Avançado” e depois clique no botão “Variáveis de Ambiente”


3) Nesta tela, você verá, na parte de cima, as variáveis de ambiente do usuário corrente e, embaixo, as variáveis de ambiente do computador (servem para todos os usuários). Clique no botão “Nova” da parte de baixo

4) Agora em “Nome da Variável” digite JAVA_HOME e, em valor da variável, digite o caminho que você anotou na instalação do Java. Provavelmente, será algo como: C:\Arquivos de programas\Java\jdk1.6.0_03

E, depois, clique em OK.

5) Crie uma nova variável de ambiente repetindo o passo 11, porém, agora, defina o nome da variável como
CLASSPATH e o valor com . (só um ponto).

6) Agora, não vamos criar outra variável, mas sim alterar. Para isso, procure a variável PATH, ou Path (dá no mesmo), e clique no botão de baixo “Editar”.

8) Agora abra o prompt. Vá em Iniciar, Executar e digite cmd.

9) No console, digite javac -version. O comando deve mostrar a versão do Java Compiler e algumas opções.


Caso isso não aconteça, reveja os passos e confira se não esqueceu ou pulou nenhum deles.


7) Não altere o nome da variável! Deixe como está e adicione no final do valor ;%JAVA_HOME%\bin, não esqueça do ponto-e-vírgula - assim, você está adicionando mais um caminho à sua variável Path.

Bom, o próximo passo é fazer a instalação da IDE de desenvolvimento, mas isso é assunto para outro post.

Inté!!!

quarta-feira, 21 de outubro de 2009

O JAVA

Em alguns posts, falamos sobre a Orientação a Objetos e sobre UML, ou seja, a parte de modelagem de sistemas foi bem comentada, entretanto acho importante matar a cobra e mostrar o pau. Desta forma a partir deste post iremos brincar com o java. Farei resumos sobre as coisas que venho estudando sobre o assunto.

Mas por que o JAVA? Tenho participado de algumas palestras sobre SOA. Vi soluções propostas pela Microsoft, pela SAP e pela ORACLE e com exeção da Microsoft, em todas as soluções vistas, o java estava por trás. Isso mostra o grande poder da linguagem e nos remete a visão de que a linguagem em questão possui um futuro promissor.

Primeiramente vamos aquela babaquice da definição do que é a linguagem java.

O java é uma linguagem de programação considerada  orientada a objetos, pois com ela conseguimos implementar quase todos os itens do paradigma da O.O (encapsulamento, polimorfismo, herança...).É de certa forma interpretada, pois o código gerado na compilação dos programas feitos com ela (bytecode) roda sobre o que chamamos de máquina virtual. Essa máquina possui implementação para vários sistemas operacionais o que torna o java multiplataforma. Isso quer dizer que você escreve um programa que pode rodar no windows, no linux ou no mac OS.

Pelo fato de ser orientado a objetos, o java promove o reúso de código aumentando exponencialmente a produtividade de uma equipe no desenvolvimento de um sistema. O desenvolvimento segue padrões (design patterns) que facilitam a vida do desenvolvedor na realização de manutenções corretivas e evolutivas. O ponta pé inicial é trabalhoso, mas depois é só correr para o abraço!

Acho que isso aí é o suficiente, mas o que é preciso para desenvolver sistemas utilizando java?

A SUN (comprada pela Oracle recentemente) disponiliza uma série de ferramentas para o desenvolvimento e execução de sistemas desenvolvidos em java. Para execução necessita-se do JRE (Java Runtime Enviroment) e para o desenvolvimento temos que ter em mãos o JDK (Java development KIT) que além do compilador possui uma série de classes (bilioteca de classes) prontas para reúso de código.

Existem uma porção de IDE que facilita o desenvolvimento de sistemas. O Eclipse, sem dúvida é a mais utilizada hoje em dia. E o melhor: é gratuíta!

Outra coisa que não podemos esquecer é que existem várias sabores de desenvolvimento. Uma aplicação desktop fará uso do Java2SE, uma aplicação distribuida usará o Java2EE e uma aplicação que roda em dispositivos móveis utilizará o java2ME. Respectivamente Standart Edition, Entreprise Edition e Mobile Edition.

Para facilitar o desenvolvimento existem uma série de frameworks com a função de facilitar o desenvolvimento de aplicações. Podemos citar aqui o hibernate, o struts, o maven, o wicket entre outros.

No próximo post, vamos ensinar a montar o ambiente de desenvolvimento (como instalar o jdk e o jre e como configurar a IDE eclipse).

Grande abraço!

sábado, 26 de setembro de 2009

Entendendo o Extreme Program

Kent Beck, autor de Extreme Programming Explained, diz, "XP é uma metodologia peso-leve para equipes pequenas e médias que desenvolvem software a partir de requisitos vagos ou que mudam rapidamente".

Simplesmente declarado, XP é um conjunto de valores, direitos, e melhores práticas que se suportam mutuamente no desenvolvimento incremental de software.

Quando uma equipe está desenvolvendo software com XP, o cliente cria histórias que descrevem a funcionalidade do software. Estas histórias são casos de uso muito leves. Elas são pequenas unidades de funcionalidade que necessitam de menos de uma ou duas semanas para implementação. Os programadores estimam as histórias e, com base nessas estimativas, o cliente decide quais histórias serão construídas primeiro.

O desenvolvimento é feito iterativamente e de forma incremental. A cada duas semanas, a equipe de programação entrega ao cliente histórias que estejam funcionando.

Então o cliente escolhe mais duas semanas completas de trabalho. O sistema cresce em funcionalidade, pedaço por pedaço e dirigido pelo cliente. O progresso é monitorado e medido com base no comportamento observável da equipe.

XP se baseia em técnicas de design e testes evolutivos que mantêm um design de alta qualidade, enquanto novas funcionalidades estão sendo adicionadas. Estas técnicas evitam o caos de código não manutenível através de revisões contínuas, ênfase na simplicidade e a quase universal cobertura de testes.

Os programadores executam as suas tarefas de programação em pares. O par compartilha uma única estação de trabalho e trabalha junto para escrever uma única parte do código. Ambos estão igualmente empenhados na escrita. O teclado se move freqüentemente de um lado para o outro entre eles.

Os programadores XP praticam o Desenvolvimento Orientado a Testes (TDD - Teste Driven Development). Em suma, eles escrevem testes de unidade antes de escrever o código de produção. Entretanto, isso é feito em incrementos muito pequenos. Pequenas partes de um teste são escritas primeiro e, depois, é escrito apenas código de produção suficiente para fazer essas partes passarem no teste. Isto continua iterativamente até que tudo, que praticamente possa ser testado, tenha sido testado.

O XP foca na entrega contínua, do primeiro dia do projeto até o último, de software testado e que esteja funcionando. A entrega de software real, combinado com planejamento simples, mas freqüente, fornece aos Stakeholders uma visão clara do que foi feito e do que será feito. Isso permite que a empresa dirija o projeto para uma entrega pontual do melhor software possível que pode ser concluído no prazo disponível.

Fonte: Eclipse Process Framework Compose

sábado, 12 de setembro de 2009

Processos no linux

Um programa em execução é considerado um processo em qualquer sistema operacional. São os processos que consomem os recursos do computador (processador, memória e etc).

É o processador que fica responsável pela priorização da execução desses processos, porém existem programas que possibilitam a manipulação e o gerenciamento de processos.

O sistema operacional lida com uma infinidade de processos e, por isso, é necessário ter meios que permitam controlá-los. Para isso, os processos contam com um conjunto de características, dentre as quais:

- Proprietário do processo;
- Estado do processo (em espera, em execução, etc);
- Prioridade de execução;
- Recursos de memória.

PID e PPID

Um PID (Process Identifier) é um número de identificação que o sistema dá a cada processo. Para cada novo processo, um novo número deve ser atribuído, ou seja, não se pode ter um único PID para dois ou mais processos ao mesmo tempo.

Os sistemas baseados em Unix precisam que um processo já existente se duplique para que a cópia possa ser atribuída a uma tarefa nova. Quando isso ocorre, o processo "copiado" recebe o nome de "processo pai", enquanto que o novo é denominado "processo filho". É nesse ponto que o PPID (Parent Process Identifier) passa a ser usado: o PPID de um processo nada mais é do que o PID de seu processo pai.


UID e GID

Conforme já mencionado, cada processo precisa de um proprietário, um usuário que seja considerado seu dono. A partir daí, o sistema saberá, através das permissões fornecidas pelo proprietário, quem pode e quem não pode executar o processo em questão. Para lidar com os donos, o sistema usa os números UID e GID.

O Linux gerencia os usuários e os grupos através de números conhecidos como UID (User Identifier) e GID (Group Identifier).

Os números UID e GID variam de 0 a 65536. Dependendo do sistema, o valor limite pode ser maior. No caso do usuário root, esses valores são sempre 0 (zero). Assim, para fazer com que um usuário tenha os mesmos privilégios que o root, é necessário que seu GID seja 0.

Sinais de processos

Os sinais são meios usados para que os processos possam se comunicar e para que o sistema possa interferir em seu funcionamento. Por exemplo, se o usuário executar o comando kill para interromper um processo, isso será feito por meio de um sinal.

Quando um processo recebe um determinado sinal e conta com instruções sobre o que fazer com ele, tal ação é colocada em prática. Se não houver instruções pré-programadas, o próprio Linux pode executar a ação de acordo com suas rotinas.

Entre os sinais existentes, tem-se os seguintes exemplos:

  • STOP - esse sinal tem a função de interromper a execução de um processo e só reativá-lo após o recebimento do sinal CONT;
  • CONT - esse sinal tem a função de instruir a execução de um processo após este ter sido interrompido;
  • SEGV - esse sinal informa erros de endereços de memória;
  • TERM - esse sinal tem a função de terminar completamente o processo, ou seja, este deixa de existir após a finalização;
  • ILL - esse sinal informa erros de instrução ilegal, por exemplo, quando ocorre divisão por zero;
  • KILL - esse sinal tem a função de "matar" um processo e é usado em momentos de criticidade.

O kill também é um comando que o usuário pode usar para enviar qualquer sinal, porém, se ele for usado de maneira isolada, ou seja, sem o parâmetro de um sinal, o kill por padrão executa o sinal TERM.

A sintaxe para a utilização do comando kill é a seguinte:

kill -SINAL PID

Como exemplo, vamos supor que você deseja interromper temporariamente a execução do processo de PID 4220. Para isso, pode-se usar o seguinte comando:

kill -STOP 4220

Para que o processo 4220 volte a ser executado, basta usar o comando:

kill -CONT 4220

Se o sinal precisa ser enviado a todos os processos, pode-se usar o número -1 no lugar do PID. Por exemplo:

kill -STOP -1

Como já dito, usar o comando kill isoladamente - por exemplo, kill 4220 - faz com que este use o sinal TERM por padrão. Esse sinal, no entanto, pode ser ignorado pelos processos. É por isso que é boa prática usar o comando "kill -9 PID" para "matar" um processo, pois o número nove representa o sinal kill e este não pode ser ignorado. Isso deixa claro que se você conhecer o número que é atribuído a um sinal, você pode usá-lo no lugar de seu nome. Com exceção de alguns sinais, a numeração de cada um pode mudar de acordo com a distribuição ou com a versão do kernel.

Também é comum usar o kill da seguinte forma: kill -l PID. A opção "-l" (letra L minúscula) é usada para listar os processos que aceitaram o kill.

Agora, imagine que você não saiba qual o PID de um processo e tenha se esquecido que o comando ps (visto mais à frente) descobre tal informação. Neste caso, pode-se usar o comando killall, desde que você saiba o nome do processo. A sintaxe é:

killall -SINAL processo

Por exemplo:

killall -STOP vi

Estado dos processos

Quando um processo é criado, isso não significa que ele será imediatamente executado. Além disso, determinados processos podem ser temporariamente paralisados para que o processador possa executar um processo prioritário. Isso quer dizer que os processos, em certos momentos, podem estar em situações de execução diferentes. O Linux trabalha, essencialmente, com quatro tipos de situação, isto é, estados:

  • Executável: o processo pode ser executado imediatamente;
  • Dormente: o processo precisa aguardar alguma coisa para ser executado. Só depois dessa "coisa" acontecer é que ele passa para o estado executável;
  • Zumbi: o processo é considerado "morto", mas, por alguma razão, ainda existe;
  • Parado: o processo está "congelado", ou seja, não pode ser executado.

Comandos nice e renice

Ao abordarmos os comandos nice e renice é necessário entender o conceito de gentileza. Um processo pode ter prioridade em relação a outros em sua execução. Quando um processo é gentil, significa que ele "oferece a gentileza" de permitir que um processo com prioridade maior que a sua seja executado antes dele. Os níveis de gentileza, também chamados de nice, são determinados através de números. Quanto mais alto for o valor nice, mais gentil é o processo. Geralmente, o intervalo de números usados no nice são os inteiros entre -19 e 19.

Embora determinar a prioridade de um processo não seja uma prática comum, afinal, o próprio Linux faz muito bem essa tarefa, isso pode ser necessário em alguma situação. Para isso, utiliza-se um comando que recebe o mesmo nome do conceito: nice. A sintaxe é:

nice -n prioridade processo

Por exemplo:

nice -n -5 ntpd

No exemplo, o ntpd recebe prioridade -5. Trata-se de uma prioridade alta, afinal, como já dito, quanto menor o número menor sua gentileza.

Se um determinado processo está em execução, isso acontece com uma prioridade já definida. Para alterar um processo nessa condição, usa-se o comando renice, cuja sintaxe é:

renice prioridade opção processo/destino

As opções do renice são:

-u - a alteração ocorrerá nos processos do usuário informado;
-g - a alteração ocorrerá nos processos do grupo indicado;
-p - a alteração ocorrerá no processo cujo PID for informado.

Um exemplo:

renice +19 1000 -u infowester

Neste caso, o comando renice alterou a prioridade do processo 1000, assim como a prioridade dos processos do usuário infowester.

Verificando processos com o ps

O ps é um comando de extrema importância para o gerenciamento de processos. Por ele, é possível saber quais os processos em execução atualmente, quais os UIDs e PIDs correspondentes, entre outros.

Se somente ps for digitado na linha de comando, geralmente o sistema mostra quais os processos do usuário. É preciso usar uma combinação de opções para obter mais detalhes.

As opções mais importantes são os seguintes:

  • a - mostra todos os processos existentes;
  • e - exibe as variáveis de ambiente relacionadas aos processos;
  • f - exibe a árvore de execução dos processos;
  • l - exibe mais campos no resultado;
  • m - mostra a quantidade de memória ocupada por cada processo;
  • u - exibe o nome do usuário que iniciou determinado processo e a hora em que isso ocorreu;
  • x - exibe os processos que não estão associados a terminais;
  • w - se o resultado de processo não couber em uma linha, essa opção faz com que o restante seja exibido na linha seguinte.

Das opções acima, a combinação mais usada é aux:

ps aux

Usando a combinação lax, o resultado mostra mais detalhes:

ps lax

Essa combinação de comandos mostra uma série de informações sobre os processos, segue a descrição dos campos mostrados anteriormente e alguns que só são mostrados com a combinação lax:

  • USER - nome do usuário dono do processo;
  • UID - número de identificação do usuário dono do processo;
  • PID - número de identificação do processo;
  • PPID - número de identificação do processo pai;
  • %CPU - porcentagem do processamento usado;
  • %MEM - porcentagem da memória usada;
  • VSZ - indica o tamanho virtual do processo;
  • RSS - sigla de Resident Set Size, indica a quantidade de memória usada (em KB);
  • TTY - indica o identificador do terminal do processo;
  • START - hora em que o processo foi iniciado;
  • TIME - tempo de processamento já consumido pelo processo;
  • COMMAND - nome do comando que executa aquele processo;
  • PRI - valor da prioridade do processo;
  • NI - valor preciso da prioridade (geralmente igual aos valores de PRI);
  • WCHAN - mostra a função do kernel onde o processo se encontra em modo suspenso;
  • STAT - indica o estado atual do processo, sendo representado por uma letra: R - executável; D - em espera no disco; S - Suspenso; T - interrompido; Z - Zumbi. Essas letras podem ser combinadas e ainda acrescidas de: W - processo paginado em disco; < - processo com prioridade maior que o convencional; N - processo com prioridade menor que o convencional; L - processo com alguns recursos bloqueados no kernel.

Verificando processos com o top

O comando ps trabalha como se tirasse uma fotografia da situação dos processos naquele momento. O comando top, por sua vez, coleta as informações, mas as atualiza regularmente. Geralmente essa atualização ocorre a cada 10 segundos.

A sintaxe do comando top é a seguinte:

top -opção

Entre as opções, tem-se as que se seguem:

-d - atualiza o top após um determinado período de tempo (em segundos). Para isso, informe a quantidade de segundos após a letra d. Por exemplo: top -d 30;
-c - exibe a linha de comando ao invés do nome do processo;
-i - faz o top ignorar processos em estado zumbi;
-s - executa o top em modo seguro.

É possível manipular alguns recursos do comando top através de teclas de atalho. Por exemplo, para atualizar imediatamente o resultado exibido, basta pressionar a tecla de espaço. Se pressionar a tecla q, o top é finalizado. Pressione a tecla h enquanto estiver utilizando o top para ver a lista completa de opções e teclas de atalho.

Os recursos jobs, fg e bg, fuser, pstree, nohup

Para ter ainda mais controle sobre os processos executados no Linux, pode-se utilizar os seguintes comandos: jobs, fg e bg, fuser, pstree, nohup. Cada um é descrito a seguir:

jobs - serve para visualizar os processos que estão parados ou executando em segundo plano (background). Quando um processo está nessa condição, significa sua execução é feita pelo kernel sem que esteja vinculada a um terminal. Em outras palavras, um processo em segundo plano é aquele que é executado enquanto o usuário faz outra coisa no sistema. Uma dica para saber se o processo está em background é verificar a existência do caractere & no final da linha. Se o processo estiver parado, geralmente a palavra "stopped" aparece na linha, do contrário, a palavra "running" é exibida. A sintaxe do jobs é:

jobs -opção

As opções disponíveis são:

  • -l - lista os processos através do PID;
  • -r - lista apenas os processos em execução;
  • -s - lista apenas os processos parados.

Se na linha de um processo aparecer o sinal positivo (+), significa que este é o processo mais recente a ser paralisado ou a estar em segundo plano. Se o sinal for negativo (-), o processo foi o penúltimo. Note também que no início da linha um número é mostrado entre colchetes. Muitos confundem esse valor com o PID do processo, mas, na verdade, trata-se do número de ordem usado pelo jobs.

fg e bg: o fg é um comando que permite a um processo em segundo plano (ou parado) passar para o primeiro (foreground), enquanto que o bg passa um processo do primeiro plano para o segundo. Para usar o bg, deve-se paralisar o processo. Isso pode ser feito pressionando-se as teclas Ctrl + Z no teclado. Em seguida, digita-se o comando da seguinte forma:

bg +número

O número mencionado corresponde ao valor de ordem informado no início da linha quando o comando jobs é usado.

Quanto ao comando fg, a sintaxe é a mesma:

fg +número


fuser: o comando fuser mostra qual processo faz uso de um determinado arquivo ou diretório. Sua sintaxe é:

fuser -opção caminho (do arquivo ou diretório)

Entre as opções, tem-se:

  • -k - finaliza o processo que utiliza o arquivo/diretório em questão;
  • -i - deve ser usada em conjunto com a opção k e serve para perguntar se a finalização do processo deve ser feita;
  • -u - mostra o proprietário do processo;
  • -v - o resultado é mostrado em um padrão de exibição semelhante ao comando ps.

pstree: esse comando mostra processos relacionados em formato de árvore. Sua sintaxe é:

pstree -opção PID


Entre as opções, tem-se:

  • -u - mostra o proprietário do processo;
  • -p - exibe o PID após o nome do processo;
  • -c - mostra a relação de processos ativos;
  • -G - usa determinados caracteres para exibir o resultado em um formato gráfico.

Um detalhe importante: se ao digitar o comando pstree o PID não for informado, todos os processos serão listados.

nohup: o comando nohup possibilita ao processo ficar ativo mesmo quando o usuário faz logout. É da natureza dos sistemas baseados em Unix interromper processos caso seu proprietário não esteja mais ativo, por isso, o nohup pode ser muito útil. Sua sintaxe é:

nohup comando

Aparentemente, não utilizamos com muita frequência os comandos descritos aqui e caso o computador trave podemos utilizar ferramentas gráficas como o xkill, entretanto fiz questão de pesquisar o assunto e compartilho com vocês essa pesquisa.

Tchau!

quinta-feira, 10 de setembro de 2009

Permissões de acesso a arquivos e diretórios

A permissão de acesso protege o sistema de arquivos Linux do acesso indevido de pessoas ou programas não autorizados.

Donos, grupos e outros usuários

O princípio da segurança no sistema de arquivos do Linux é definir o acesso aos arquivos por donos, grupos e outros usuários.

O Dono é a pessoa que criou o arquivo ou o diretório. O nome do dono do arquivo/diretório é o mesmo do usuário usado para entrar no sistema. Somente o dono pode modificar as permissões de acesso do arquivo. As permissões de acesso do dono de um arquivo somente se aplicam ao dono do arquivo/diretório. A identificação do dono também é chamada de user id (UID).

A identificação de usuário e o nome do grupo que pertence são armazenadas respectivamente nos arquivos /etc/passwd e /etc/group.

Estes são arquivos textos comuns e podem ser editados em qualquer editor de texto, mas tenha cuidado para não modificar o campo que contém a senha do usuário encriptada (que pode estar armazenada neste arquivo caso não estiver usando senhas ocultas).

O grupo serve para permitir que vários usuários diferentes tenham acesso a um mesmo arquivo (já que somente o dono poderia ter acesso ao arquivo).

Outros é a categoria de usuários que não são donos ou não pertencem ao grupo do arquivo.

Um usuário pode fazer parte de um ou mais grupos e então acessar arquivos que pertençam ao mesmo grupo que o seu (mesmo que estes arquivos tenham outro dono).

Permissões de acesso a arquivos e diretórios

Cada um dos tipos acima possuem três tipos básicos de permissões de acesso:

  • r - Permissão de leitura para arquivos. Caso for um diretório, permite listar seu conteúdo (através do comando ls, por exemplo).
  • w - Permissão de gravação para arquivos. Caso for um diretório, permite a gravação de arquivos ou outros diretórios dentro dele. Para que um arquivo/diretório possa ser apagado, é necessário o acesso a gravação.
  • x - Permite executar um arquivo (caso seja um programa executável). Caso seja um diretório, permite que seja acessado através do comando cd.

As permissões de acesso a um arquivo/diretório podem ser visualizadas com o uso do comando ls -la.

As 3 letras (rwx) são agrupadas da seguinte forma:

-rwxrwxrwx gleydson users teste

A seguir uma explicação das 10 letras da esquerda para a direita:

A primeira letra diz qual é o tipo do arquivo. Caso tiver um “d” é um diretório, um “l” um link a um arquivo no sistema (veja ‘ln’ on page 70 para detalhes) , um “-” quer dizer que é um arquivo comum, etc.

  • O primeiro grupo(rwx) refere-se a permissão de acesso ao dono do arquivo.
  • O segundo grupo(rwx) refere-se as permissões de acesso ao grupo do arquivo.
  • O terceiro grupo(rwx) diz qual é a permissão de acesso para os outros usuários.
  • gleydson é o dono do arquivo.
  • users é o grupo do arquivo.
  • e teste é o nome do arquivo


OBSERVAÇÕES:

Para listar os arquivos, permissões e respectivos grupo e dono use o comando ls -la

O usuário root não tem nenhuma restrição de acesso ao sistema.

Se você tem permissões de gravação no diretório e tentar apagar um arquivo que você não tem permissão de gravação, o sistema perguntará se você confirma a exclusão do arquivo apesar do modo leitura. Caso você tenha permissões de gravação no arquivo, o arquivo será apagado por padrão sem mostrar nenhuma mensagem de erro (a não ser que seja especificada a opção -i com o comando rm).

Por outro lado, mesmo que você tenha permissões de gravação em um arquivo mas não tenha permissões de gravação em um diretório, a exclusão do arquivo será negada.

Isto mostra que é levado mais em consideração a permissão de acesso do diretório do que as permissões dos arquivos e sub-diretórios que ele contém. Este ponto é muitas vezes ignorado por muitas pessoas e expõem seu sistema a riscos de segurança. Imagine o problema que algum usuário que não tenha permissão de gravação em um arquivo mas que a tenha no diretório pode causar em um sistema mal administrado.


Comandos chmod,chgrp,chown e unmask


chmod (muda a permissão de acesso)

Muda a permissão de acesso a um arquivo ou diretório. Com este comando você pode escolher se usuário ou grupo terá permissões para ler, gravar, executar um arquivo ou arquivos. Sempre que um arquivo é criado, seu dono é o usuário que o criou e seu grupo é o grupo do usuário.


chmod [opções] [permissões] [diretório/arquivo]

Onde:

diretório/arquivo Diretório ou arquivo que terá sua permissão mudada.

opções

-v, –verbose Mostra todos os arquivos que estão sendo processados.

-f, –silent Não mostra a maior parte das mensagens de erro.

-c, –change Semelhante a opção -v, mas só mostra os arquivos que tiveram as permissões alteradas.

-R, –recursive Muda permissões de acesso do diretório/arquivo no diretório atual e subdiretórios.

ugoa+-=rwxXst • ugoa - Controla que nível de acesso será mudado. Especificam, em ordem, usuário (u), grupo (g), outros (o), todos (a).

• +-= - + coloca a permissão, - retira a permissão do arquivo e  define a permissão exatamente como especificado.

• rwx - r permissão de leitura do arquivo. w permissão de gravação. x permissão de execução (ou acesso a diretórios).

chmod não muda permissões de links simbólicos, as permissões devem ser mudadas no arquivo alvo do link.

Exemplos de permissões de acesso:

  • chmod g+r * Permite que todos os usuários que pertençam ao grupo dos arquivos (g) tenham (+) permissões de leitura (r) em todos os arquivos do diretório atual.
  • chmod o-r teste.txt Retira (-) a permissão de leitura (r) do arquivo teste.txt para os outros usuários (usuários que não são donos e não pertencem ao grupo do arquivo. teste.txt.
  • chmod uo+x teste.txt Inclui (+) a permissão de execução do arquivo teste.txt para o dono e outros usuários do arquivo.
  • chmod a+x teste.txt Inclui (+) a permissão de execução do arquivo teste.txt para o dono, grupo e outros usuários.


chgrp (muda o grupo)

Muda o grupo de um arquivo/diretório.

chgrp [opções] [grupo] [arquivo/diretório]

Onde:

  • grupo Novo grupo do arquivo/diretório.
  • arquivo/diretório Arquivo/diretório que terá o grupo alterado.

opções

-c, –changes Somente mostra os arquivos/grupos que forem alterados.

-f, –silent Não mostra mensagens de erro para arquivos/diretórios que não puderam ser alterados.

-v, –verbose Mostra todas as mensagens e arquivos sendo modificados.

-R, –recursive Altera os grupos de arquivos/sub-diretórios do diretório atual.



chown (muda o dono)

Muda dono de um arquivo/diretório. Opcionalmente pode também ser usado para mudar o grupo.

chown [opções] [dono.grupo] [diretório/arquivo]

onde:

  • dono.grupo Nome do dono.grupo que será atribuído ao diretório/arquivo. O grupo é opcional.
  • diretório/arquivo Diretório/arquivo que o dono.grupo será modificado.

opções

-v, –verbose Mostra os arquivos enquanto são alterados.

-f, –supress Não mostra mensagens de erro durante a execução do programa.

-c, –changes Mostra somente arquivos que forem alterados.

-R, –recursive Altera dono e grupo de arquivos no diretório atual e sub-diretórios.



O dono.grupo pode ser especificado usando o nome de grupo ou o código numérico correspondente ao grupo (GID).

Você deve ter permissões de gravação no diretório/arquivo para alterar seu dono/grupo.

Exemplos:

  • chown joao teste.txt - Muda o dono do arquivo teste.txt para joao.
  • chown joao.users teste.txt - Muda o dono do arquivo teste.txt para joao e seu grupo para users.
  • chown -R joao.users * - Muda o dono/grupo dos arquivos do diretório atual e subdiretórios para joao/users (desde que você tenha permissões de gravação no diretórios e sub-diretórios).



Modo de permissão octal

Ao invés de utilizar os modos de permissão +r, -r, etc, pode ser usado o modo octal para se alterar a permissão de acesso a um arquivo. O modo octal é um conjunto de oito números onde cada número define um tipo de acesso diferente.

É mais flexível gerenciar permissões de acesso usando o modo octal ao invés do comum, pois você especifica diretamente a permissão do dono, grupo, outros ao invés de gerenciar as permissões de cada um separadamente.

O uso de um deste números define a permissão de acesso do dono, grupo ou outros usuários. Um modo fácil de entender como as permissões de acesso octais funcionam, é através da seguinte tabela:

  • 0 = Nenhuma permissão de acesso
  • 1 = Executar
  • 2 = Gravar
  • 4 = Ler
Para Dono e Grupo, multiplique as permissões acima por x100 e x10.

Basta agora fazer o seguinte:

  • Somente permissão de execução, use 1.
  • Somente a permissão de leitura, use 4.
  • Somente permissão de gravação, use 2.
  • Permissão de leitura/gravação, use 6 (equivale a 2+4 / Gravar+Ler).
  • Permissão de leitura/execução, use 5 (equivale a 1+4 / Executar+Ler).
  • Permissão de execução/gravação, use 3 (equivale a 1+2 / Executar+Gravar).
  • Permissão de leitura/gravação/execução, use 7 (equivale a 1+2+4 / Executar+Gravar+Ler).

Exemplos: chmod ogd

"chmod 764 teste"

Os números são interpretados da direita para a esquerda como permissão de acesso aos outros usuários (4), grupo (6), e dono (7). O exemplo acima faz os outros usuários (4) terem acesso somente leitura (r) ao arquivo teste, o grupo (6) ter a permissão de leitura e gravação (w), e o dono (7) ter permissão de leitura, gravação e execução (rwx) ao arquivo teste.

"chmod 40 teste"

O exemplo acima define a permissão de acesso dos outros usuários (0) como nenhuma, e define a permissão de acesso do grupo (4) como somente leitura (r). Note usei somente dois números e então a permissão de acesso do dono do arquivo não é modificada.

"chmod 751 teste"

O exemplo acima define a permissão de acesso dos outros usuários (1) para somente execução (x), o acesso do grupo (5) como leitura e execução (rx) e o acesso do dono (7) como leitura, gravação e execução (rwx).

Umask

A umask (user mask) são 3 números que definem as permissões iniciais do dono, grupo e outros usuários que o arquivo/diretório receberá quando for criado ou copiado. Digite umask sem parâmetros para retornar o valor de sua umask atual.

A umask tem efeitos diferentes caso o arquivo que estiver sendo criado for binário (um programa executável) ou texto (‘Arquivo texto e binário’ on page 23) .

Um arquivo texto criado com o comando umask 012;touch texto.txt receberá as permissões -rw-rw-r--, pois 0 (dono) terá permissões rw-, 1 (grupo), terá permissões rwe 2 (outros usuários) terão permissões r--. Um arquivo binário copiado com o comando umask 012;cp /bin/ls /tmp/ls receberá as permissões -r-xr--r-x

Por este motivo é preciso um pouco de atenção antes de escolher a umask, um valor mal escolhido poderia causar problemas de acesso a arquivos, diretórios ou programas não sendo executados. O valor padrão da umask na maioria das distribuições atuais é 022. A umask padrão no sistema Debian é a 022 .

A umask é de grande utilidade para programas que criam arquivos/diretórios temporários, desta forma pode-se bloquear o acesso de outros usuários desde a criação do arquivo, evitando recorrer ao chmod.

Aqui listamos os comandos relativo a permissionamento de arquivos no Linux no próximo post falaremos sobre os comandos relacionados a processos.

Um abraço!

quarta-feira, 9 de setembro de 2009

Administrando usuários e grupos no linux

Dando continuidade aos estudos de linux, veremos aqui os comandos para administração de usuários e grupos nesse sistema operacional.

Como no Windows, os usuários no Linux são organizados em grupos.

Para criar um grupo digite o comando:

  • groupadd novo_grupo

para alterar o nome de um grupo ja criado:

  • groupmod novo_nome nome_antigo
para deletar um grupo

  • groupdel nome_grupo 

Como tudo que se cria no linux é gravado em arquvos de configuração, o arquivo de configuração dos grupos fica em /etc/group.

Grupo criado, iremos agora ver como criar e deletar usuários do sistema.

Para criar um usuário de modo simples no Linux utilizamos os seguintes comandos:

  • adduser usuarioX - cria o usuário
  • passwd  usuarioX - cria a senha do usuário

Assim o usuário usuarioX será criado, e por padrão ja que não especificamos o diretório home, o shell, e nem o ID, esse usuário ficará em /home/usuarioX, o seu shell será o /bin/bash e um ID disponível foi criado para ele.Mas nós podemos específicar todos esses parametros com o seguinte comando:

  • adduser -m -c 'usuarioX da Silva' -d /home/usuarioX -s '/bin/sh' usuarioX -g usuários

Assim, estamos dizendo que o diretório home de usuarioX será em /home/usuarioX,com o parâmetro -d, que o shell padrão para esse usuário será o /bin/sh,com o parâmetro -s, e que ele será criado no grupo usuários, com o parâmetro -g.

Para deletarmos um usuário utilizamos o seguinte comando:
  • userdel usuarioX- deleta o usuário
  • userdel -r usuarioX - deleta o usuário  junto com o diretório home.

Modificando uma conta de usuário

Para você modificar uma conta você tem que editar o arquivo /etc/passwd

Original (nome da conta = usuarioX)

usuarioX:x:591:502:usuarioX:/home/usuarioX:/bin/bash

Modificar para: (nome da conta = usuarioX)

usuarioX:x:591:502:Joao Carlos:/home/usuarioX:/bin/bash

usuarioX é o nome da conta
x indica que está sendo utilizado o método shadow de encriptação de senhas
591 é o ID do usuário (UID = user identification)
502 é o ID do grupo (GID = group identification)
Joao carlos é o nome completo
/home/usuarioX é o diretório home do usuário usuarioX
/bin/bash  é o shell padrão do usuário usuarioX

Listando os usuários de um grupo

  • cat /etc/group

Exemplo de retorno
...
firebird:x:1001:
bind:x:104:
administrativo:x:1002:angelica,paul o,luizosni
fotos:x:1003:angelica,paulo,luizosn i,joyce,rafael
dados:x:1004:angelica,paulo,luizosn i,joyce
...

Ou se preferir você pode fazer:

  • egrep "nome_do_grupo" /etc/group

vai retornar somente o grupo escolhido.

Aqui mostramos os comandos para administração de usuários e grupos no Linux.

Inté!!!

segunda-feira, 7 de setembro de 2009

Comandos do Linux

Sempre tive o linux e o Windows instalado no meu note, porém nunca usava o Linux até ter um problema com a partição que continha o Windows.

Por conta da preguiça de reinstalar o windows, e devido a estudar para um concurso no qual vai cair o referido assunto, resolvi que ia começar a aprender um pouco mais sobre o maldito sistema operacional. Que fique bem claro que não tenho nada contra o Linux. Não usava esse sistema operacional por falta de costume.

Aqui eu vou listar os comandos que vão permitir a um usuário "se virar" com o sistema.

Interpretador de comandos

Também conhecido como shell. É o programa responsável em interpretar as instruções enviadas pelo usuário e seus programas ao sistema operacional (o kernel). Ele que executa comandos lidos do dispositivo de entrada padrão (teclado) ou de um arquivo executável.

O Linux possui diversos tipos de interpretadores de comandos, entre eles posso destacar o bash, ash, csh, tcsh, sh, etc. Entre eles o mais usado é o bash.

O interpretador de comandos do DOS é o command.com.


Entendendo os diretórios

No linux, não existe o conceito de unidades que temos no Windows (Ex. C:.D:, etc.). Existe na verdade um diretório raiz ("/") no qual constam uma série de outros subdiretórios sobre os quais explanamos abaixo:

/bin - Armazena os executáveis de alguns comandos básicos do sistema (su, tar,cat, rm, pwd, etc)

/usr - É onde fica o grosso dos programas instalados. O subdiretório /usr/bin é o diretório mais populado (cerca de 2000 programas), ou seja, se você não souber aonde encontrar um programa, use esse subdiretório como ponto de partida para a procura.

/usr/lib -  contem as bibliotecas (parecidas com as dlls do Windows) utilizadas pelos programas. Existem dois tipos de bibliotecas: As utilizadas por um programa apenas (extensão .a) e as que são compartilhadas por vários programas (extensão .so).

/dev - contem os devices (links para os dispositivos do sistema CD, HD, Floppydisks, etc)

/etc - concentra os arquivos de configuração do sistema (é como se fosse o registry do Windows).

/mnt - é o subdiretório que serve de ponto de montagem para os dispositivos.

/home - é a pasta meus documentos do linux. Esse subdiretório é criado para cada usuário do sistema, visto que o linux é multiusuário. Para usuários que não seja o root, o linux só permite a escrita em arquivos que estão dentro desse subdiretório.

Utilizando o terminal (o modo console do Linux)

O teminal no linux é equivalente ao modo console do Windows (executar > cmd), mas antes de explanarmos sobre o uso do terminal é importante listarmos fazermos algumas ponderações.

O Linux é Case Sensitive ou seja, ele diferencia letras maiúsculas e minúsculas nos arquivos.

O arquivo "historia" é completamente diferente de "Historia". Esta regra também é válido para os comandos e diretórios. Prefira, sempre que possível, usar letras minúsculas para identificar seus arquivos, pois quase todos os comandos do sistema estão em minúsculas.

Um arquivo oculto no Linux é identificado por um “.” no início do nome (por exemplo,.bashrc). Arquivos ocultos não aparecem em listagens normais de diretórios. Para listar esses arquivos use o comando ls -a.

Existem duas formas de se chamar o terminal:
  • CTRL + ALT + F1 - abre um terminal puro
  • ALT + Fn - alterna entre terminais
Quando abrimos um terminal, o prompt se apresenta com um $ a partir do qual podemos digitar os comandos.

O aviso de comando do usuário root é identificado por uma # (tralha), e o aviso de comando de usuários é identificado pelo símbolo $. Isto é padrão em sistemas UNIX. Para alternar entre esses usuários digite o comando su ou sudo su.

O comando gimp imagem.jpg abre o programa gimp que é um editor de imagens com o arquivo imagem.jpg carregado.

Digitar comandos é um saco, porém o linux possui um recurso do tipo auto-completar. Para fazer uso deste recurso devemos digitar parte do nome do comando e pressionar a tecla TAB.

Alguns atalhos úteis

Você pode retornar comandos já digitados pressionando as teclas Seta para cima / Seta para baixo.

A tela pode ser rolada para baixo ou para cima segurando a tecla SHIFT e pressionando PGUP ou PGDOWN. Isto é útil para ver textos que rolaram rapidamente para cima.

Abaixo algumas dicas sobre a edição da linha de comandos (não é necessário se preocupar em decora-los):

  • Pressione a tecla Back Space (<--) para apagar um caracter à esquerda do cursor.
  • Pressione a tecla Del para apagar o caracter acima do cursor.
  • Pressione CTRL+A para mover o cursor para o inicio da linha de comandos.
  • Pressione CTRL+E para mover o cursor para o fim da linha de comandos.
  • Pressione CTRL+U para apagar o que estiver à esquerda do cursor. O conteúdo apagado
  • é copiado para uso com CTRL+y.
  • Pressione CTRL+K para apagar o que estiver à direita do cursor. O conteúdo apagado é
  • copiado para uso com CTRL+y.
  • Pressione CTRL+L para limpar a tela

Extensão dos  arquivos

A extensão serve para identificar o tipo do arquivo. A extensão são as letras após um “.” no nome de um arquivo, explicando melhor:

  •  relatório.txt - O .txt indica que o conteúdo é um arquivo texto. script.sh - Arquivo de Script (interpretado por /bin/sh).
  • system.log - Registro de algum programa no sistema.
  • arquivo.gz - Arquivo compactado pelo utilitário gzip.
  • index.html - Página de Internet (formato Hypertexto). 
A extensão de um arquivo também ajuda a saber o que precisamos fazer para abri-lo. Por exemplo, o arquivo relatório.txt é um texto simples e podemos ver seu conteúdo através de um editor de textos kedit, já o arquivo index.html contém uma página de Internet e precisaremos de um navegador para poder visualiza-lo (como o lynx, Firefox ou o Konqueror).

A extensão (na maioria dos casos) não é requerida pelo Linux, mas é conveniente o seu uso para determinarmos facilmente o tipo de arquivo e que programa precisaremos usar para abri-lo.

Navegando entre os diretórios


Quando se utiliza um sistema operacional, essencialmente navega-se entre os diretórios e subdiretórios, edita-se arquivos e abre-se programas. Abaixo vamos falar sobre os comandos que nos permite realizar essas atividades.

  • pwd - para saber em que diretório o usuário se encontra;
  • cd (change diretory) - utilizado para navegar entre diretórios;
  • ls ou dir - permite listar os arquivos que constam em um diretório;
  • cp - permite copiar arquivos de um diretório para outro;
  • mv - move arquivos de um diretório para outro; o mv também é utilizado para renomear arquivos (na verdade o Linux move) um arquivo para outro.
  • rm - serve para remover um arquivo;
  • mkdir - permite criar um diretório;
  • rmdir - remove diretórios;
  • locate - busca em base de dados por um arquivo ou diretório (updatedb é utilizado para atualizar a base);
  • find - também utilizado para buscar arquivos ou diretórios. Só que desta vez no sistema de arquivos;
Todos esses comandos podem ser executados em sequência utilizando-se o ";" entre os comandos.

Outra observação importante a ser feita é que os comandos podem vir seguido s de argumentose/ou parâmetros  que mudam o comportamento dos mesmos.

O comando CAT permite visualizar o conteúdo de um arquivo: cat nome_arquivo 

Utiliza-se o pipe "|"  para combinar comandos. Exemplo: (comando1|comando2 > arquivo.txt  ) neste caso o resultado dos comandos 1 e 2 estão sendo redirecionados para um arquivo.

O Comando grep permite filtrar a saída de um comando. Por exemplo: O Linux mantem um histórico dos últimos 500 comandos digitados. Caso você queira visualizar apenas os comandos cp digitados nesta lista, basta digitar history | grep cp para mostrar todas as entradas onde foi usado o comando cp.

Criando links  (atalhos do windows)

Existem dois tipos de atalho no Linux: os hard links e o links simbólicos.

A diferença entre eles é que se o arquivo muda de lugar o link simbólico fica quebrado. Já o hard link não, este continua funcionando. Os dois links são criados através do comando ln:

  • hard link - ln /home diretorioHome
  • link simbólico - ln -s  /home diretorioHome (note que a diferença tá no argumento -s)
Você pode ainda criar links que podem ser evocados a partir de qualquer diretório. Basta que esse seja criado no diretório /usr/bin. No windows fazemos isso editando a variável PATH.

Reiniciando e desligando o micro

Existem comandos para desligar ou reiniciar o micro, mas por uma questão de segurança é necessário estar logado como root para que esses comandos funcionem. Para isso use o comando su ou sudo (a diferença entre os dois é que o primeiro pede senha e o segundo não).
  • reboot - reinicia o micro;
  • halt - desliga o micro;
  • shutdown -h now - permite um desligamento programado idêntico a um timer.


Os comandos mencionados aqui estão relacionados a manipulação de arquivos e diretórios. Em outro post falarei sobre outros comandos.

Até lá!

sábado, 5 de setembro de 2009

O SCRUM

SCRUM é um processo ágil e leve que pode ser utilizado para gerenciar e controlar o desenvolvimento de software utilizando práticas iterativas e incrementais.

Baseado em práticas de gerenciamento já fundamentadas no Extreme Programming e no RUP, o SCRUM produz os benefícios do desenvolvimento ágil com a vantagem de ser uma implementação bem simples.

O SCRUM aumenta significativamente a produtividade e reduz o tempo para obter resultados, pois facilita a adaptação a processos empíricos de desenvolvimento de sistemas.

Elementos do SCRUM


O SCRUM como qualquer outra metodologia é baseada em papéis e responsabilidades, porém, os papéis do SCRUM são bem abrangentes e direcionados para um propósito comum: O SUCESSO DO PROJETO.

Papeis

Product Owner
  • Define as funcionalidades do produto;
  • Concentra as informações vindas de usuários, stakeholders ou do mercado de maneira que se obtenha uma visão única dos requisitos do sistema;
  • Sua maior responsabilidade é o ROI do projeto
  • Prioriza o Product Backlog
  • Pode alterar as prioridades fora do Sprint
  • Aceita ou rejeita os resultados dos trabalhos
O Time (Team)

O Time é o grupo de pessoas diretamente ligadas ao trabalho a ser feito que garantirá que o projeto seja entregue com todas as funcionalidades necessárias. Suas características são:

  • Multi-functional 
  • Formado por até 7 pessoas 
  • Define o objetivo do Sprint e especifica os resultados dos trabalhos
  • Faz aquilo que é necessário dentro das diretrizes do projeto para alcançar o objetivo do Sprint 
  • Auto-organizável 
  • Demonstram o resultado do Sprint (ver definição abaixo) para o Product Owner e outros Stakeholders
A idéia por trás dos conceitos MULTI-FUNCIONAL e AUTO-ORGANIZÁVEL é que o time deve ter a capacidade e o conhecimento técnico sobre TODO o processo de desenvolvimento do produto. No caso de um projeto de desenvolvimento de software, o time deve ter pessoas capazes de analisar a solução, codificá-la e testá-la sem necessitar de outros times ou outras pessoas.

SCRUM Master

O SCRUM Master desempenha um papel de liderança, gerenciando os interesses do Product Owner mediante o Time. Numa abordagem tradicional de gerenciamento de projetos, o SCRUM Master seria um Gerente de Projetos, porém, essa nomenclatura foi substituída para diferenciar o foco de liderança necessário para que um processo empírico funcione. Um SCRUM Master eficiente deve:

  • Melhorar a vida e a produtividade do time de desenvolvimento promovendo a criatividade e o conhecimento
  • Estimular uma comunicação e cooperação muito próxima entre todas as pessoas do time
  • Proteger o time de interferências externas
  • Remover Impedimentos ("Impediments")
  • Garantir que o processo está sendo respeitado
  • Convidar pessoas apropriadas para as reuniões de acompanhamento (Daily SCRUM, Sprint Review e Sprint Retrospective)
  • Remover barreiras entre o desenvolvimento e o cliente para garantir que realmente é o cliente que está direcionando as funcionalidades desenvolvidas
  • Auxiliar o Product Owner a maximizar o ROI atingindo os seus objetivos com o SCRUM
  • Promover práticas de engenharia para que cada pedaço de funcionalidade seja potencialmente implantável.
Fases

O SCRUM também possui fases para definição da visão do projeto e também para um estudo de viabilidade.

Nível Estratégico (Product Owner)

1.Definir os problemas a serem resolvidos
2.Estabelecer a visão e um escopo de alto nível
3.Investigar a viabilidade do projeto
4.Fornecer esforço e prazo preliminares
5.Conseguir recursos como financiamento

Produto: visão e backlog inicial

Nível Tático (SCRUM Master)


1.Planejar Objetivos dos Sprints
2.Resolver Impedimentos
3.Liderar a Equipe
4.Promover a Comunicação


Produto: Backlog

Nível Operacional (team)


1.Realizar Objetivos dos Sprints
2.Aplicar Boas Práticas de Engenharia
3.Adequar mudanças
4.Garantir a Qualidade
Produto: Sprint Backlog e Software funcionando

Sprint (a iteração do SCRUM)

No SCRUM, a iteração é chamada de SPRINT. Durante esse período o TIME trabalha nos objetivos determinados para o SPRINT. Esse período de tempo pode variar, mas geralmente é um período de 30 dias.

Um projeto é composto por vários sprints do mesmo tamanho.

TIME-BOXING: Período Fechado de Tempo

Outro conceito importante para as práticas do SCRUM é o TIME-BOXING. Um SPRINT de 30dias é um TIME-BOX. O planejamento que ocorre no primeiro dia do SPRINT ocorre num TIME-BOX de 1 dia. As reuniões diárias com a equipe devem demorar no máximo 15 minutos. Tudo que acontece dentro da metodologia SCRUM tem o espaço de tempo definido e cronometrado.

Todos os Sprints possuem uma estrutura exatamente igual, o primeiro dia você planeja,durante o Sprint você cumpre o planejamento, no último dia você avalia o resultado e ajusta o processo buscando uma melhoria contínua. A simplicidade do modelo de papéis, artefatos e estrutura do processo SCRUM é uma das razões da sua eficácia.

O Planejamento do Sprint

No primeiro dia do Sprint é feito o planejamento do trabalho a ser desenvolvido. Esse planejamento é feito através de uma reunião composta de duas partes.

Na primeira parte da reunião de planejamento o SCRUM Master reúne-se com o Product Owner para verificar qual é o Product Backlog. O Product Backlog é um artefato do SCRUM, uma planilha onde constam todas as funcionalidades de alto nível do sistema. Lá estão todas as funcionalidades desejadas pelos Stakeholders ordenadas pela prioridade. Aquilo que é mais prioritário está no topo da lista, e aquilo que é menos prioritário vai para o fim da lista.

Abaixo um exemplo de Product Backlog.



Na segunda parte do dia do planejamento, o SCRUM Master se reúne com o time e com o Product Owner (opcionalmente) para planejar o Sprint baseado no Product Backlog criado ou atualizado. O trabalho nessa segunda parte é estabelecer e firmar os objetivos do Sprint, selecionando quais itens prioritários do Backlog serão implantados completamente até o fim do Sprint.

Para isso, métricas são adotadas para quantificar o esforço de cada item do Backlog a fim de estimar a velocidade da equipe.

Note que é importante ressaltar que o Product Owner e o SCRUM Master somente definiram a ordem das coisas, mas não cabe a eles definir os prazos. Os prazos, como boa prática de todas as metodologias de gerenciamento de projeto, são dados pelo Time que é responsável pela parte produtiva do projeto.

Após ter selecionado quais itens potencialmente implantáveis serão resolvidos neste Sprint, o Time quebra cada item selecionado em tarefas menores que podem ser cumpridas em um dia (desejável). Esta quebra de cada item é chamado SPRINT BACKLOG e o time define que cada uma dessas tarefas menores esclarece tudo que é necessário ser feito para implantar os itens do
PRODUCT BACKLOG selecionados para esse Sprint.

Abaixo o sprint backlog



Com o Sprint Backlog definido a idéia é que os integrantes do Time peguem tarefas para realizar. Isso consiste em retirar o post-it da coluna “Pendente” e colocá-lo na coluna “Alocado”,
conforme a figura a seguir:

Como os itens estão ordenados de acordo com a prioridade do Product Backlog, é importante que os itens no topo da lista sejam resolvidos primeiro. Se o foco é resolver os itens em ordem, seria estranho que um post-it do item “Integração com ERP” estivesse alocado no início do Sprint.

Uma característica importante é que o membro do Time é quem seleciona a tarefa que ele vai fazer. Isso permite que as pessoas tenham um maior controle e comprometimento sobre o
próprio trabalho, sem que alguém esteja delegando tarefas repetidamente de uma maneira prescritiva. Um time multi-funcional e auto-organizável traz um ótimo ambiente de trabalho e uma melhor performance no desenvolvimento.

Reunião Diária (Daily SCRUM)

Um evento importante que ocorre todos os dias durante o Sprint é a REUNIÃO DIÁRIA. A reunião diária (Daily SCRUM) é um encontro entre o SCRUM Master, o Time e qualquer pessoa interessada no projeto. As reuniões diárias ocorrem num TIME-BOX de 15 minutos no máximo. É comum ocorrer algumas reuniões com menos de 5 minutos, porém, faça todos se concentrarem naquilo que realmente é importante para que esse encontro não dure 2 ou 3 horas comprometendo a produtividade da equipe.

A reunião diária são 15 minutos onde cada membro da equipe dará as suas impressões a respeito do projeto, respondendo a três perguntas importantes:
  1. O que eu fiz desde a última reunião diária?
  2. O que eu pretendo fazer até amanhã?
  3. Tem alguma coisa impedindo o meu trabalho?

É aconselhável que a reunião diária ocorra todo o dia no mesmo horário. Neste momento o SCRUM Master verifica o andamento do trabalho, observando problemas, verificando a continuidade do processo, resolvendo mal-entendidos e principalmente liderando as pessoas.

Esses 15 minutos diários são preciosos para manter a comunicação e a sincronização do status do projeto entre os membros da equipe. A reunião diária promove a auto-organização, um maior comprometimento das pessoas e um compartilhamento das responsabilidades.


O estado de pronto

Quando as tarefas constantes na coluna alocado passarem para a coluna pronto (ver figura abaixo), finalizamos aquele item do backlog.


A definição de “pronto” é um importante aspecto para avaliação no andamento do projeto, isso porque a metodologia SCRUM não considera as funcionalidades 50% realizadas como é comum nas abordagens tradicionais de gerenciamento de projeto. Para o SCRUM, um item só está pronto quando atende à definição de “pronto” do time e o projeto só avança quando itens são dados como completamente “prontos” no Product Backlog. No SCRUM, 20% da codificação feita não significa nada para o andamento do projeto.

Sprint Review


Ao final do Sprint é feito o Sprint Review. A Revisão é um importante ponto de inspeção da metodologia SCRUM. Esta reunião ocorre no último dia do Sprint e representa o momento que a equipe e o SCRUM Master demonstram as funcionalidades potencialmente implantáveis executadas para o Product Owner.

Sprint Retrospective

O SCRUM é um conjunto de práticas focadas em melhoria contínua do processo. O SCRUM, como um controle empírico, não prega uma rigidez do processo, ao invés, o SCRUM promove a constante adaptação das práticas mesmo durante o projeto. O processo pode mudar de um Sprint para o outro sempre buscando uma melhoria na produtividade ou qualidade do produto final. A retrospectiva do Sprint é uma reunião entre SCRUM Master e a equipe onde duas perguntas são feitas:
  1. O que foi bom durante o Sprint?
  2. O que pode ser melhorado?

Nessa reunião o objetivo é a transparência interna da equipe. O SCRUM Master deve avaliar friamente os pontos apresentados e prover os recursos necessários para que as mudanças ocorram.

Um dos problemas mais comuns é a equipe não buscar ou não se empenhar para que essas
mudanças no processo ocorram. A adaptação contínua é um fundamento importante para controlar
projetos críticos e esses pontos de melhorias devem ser valorizados.

As lições aprendidas é um fundamento em muitas metodologias de gerenciamento de projeto. Elas representam a memória corporativa e promovem uma maneira para que os projetos não sofram sempre dos mesmos problemas. Se sua empresa tem muitos projetos ou projetos
simultâneos essas lições aprendidas devem ser compartilhadas em toda a organização.

Neste post tentamos  mostrar a essência do SCRUM.

Até a próxima!

Metodologias Ágeis de desenvolvimento

Nos últimos posts eu venho falando do RUP que é considerado um processo pesado por conta da quantidade de elementos envolvidos nele. 
Existem outras formas de se pensar e por conta disso, acho importante avaliar outras formas de se gerenciar o trabalho de desenvolvimento de software.


O método ágil é um conjunto de metodologias de desenvolvimento de software. O desenvolvimento ágil, tal como qualquer metodologia de software, providencia uma estrutura conceitual para reger projetos de engenharia de software. Entre elas podemos citar o SCRUM, Programação Extrema, FDD, OpenUP, DSDM, Crystal entre outras.


Nos próximos posts, além do RUP, falaremos também sobre o SCRUM.


Grande abraço!

sexta-feira, 4 de setembro de 2009

As fases e disciplinas do RUP

O ciclo de vida de desenvolvimento de software proposto pelo RUP é composto por 4 fases (Iniciação, Elaboração, Construção e Transição).

Cada fase é basicamente um intervalo de tempo entre dois marcos principais. Ao final de cada fase é executada uma avaliação (Atividade: Revisar Marcos do Ciclo de Vida) para determinar se os objetivos da fase foram alcançados. Uma avaliação satisfatória permite que o projeto passe para a próxima fase.

Uma passagem pelas quatro fases é um ciclo de desenvolvimento; cada passagem pelas quatro fases produz uma geração do software. A menos que produto "desapareça", ele irá se desenvolver na próxima geração, repetindo a mesma seqüência de fases de iniciação, elaboração, construção e transição, mas agora com ênfase diferente nas diversas fases. Esses ciclos subseqüentes são chamados de ciclos de evolução. À medida que o produto atravessa vários ciclos, são produzidas novas gerações.


Em cada uma dessas fases é realizada um série de atividades agrupadas por disciplinas. A intensidade dessas atividades varia de acordo com a fase em que esta é realizada.

O RUP conta com 10 disciplinas. São elas: Modelagem de Negócios, Requisitos, Análise e Design, Implementação, Teste,Implantação,Ambiente,Gerenciamento de Projeto,Gerenciamento de Configuração e Mudança

Uma disciplina mostra todas as atividades que você deve realizar para produzir um determinado conjunto de artefatos. Essas disciplinas são descritas em nível geral — um resumo de todos os papéis, atividades e artefatos envolvidos.

Também é mostrado, em um nível mais detalhado, como ocorre a colaboração entre papéis e de que forma eles usam e produzem artefatos. Os passos nesse nível detalhado são chamados de "detalhamentos do fluxo de trabalho".

O passo seguinte é detalhar as fases e disciplinas presentes no RUP.

Até lá

domingo, 30 de agosto de 2009

O RUP

Voltando a falar sobre Engenharia de Software, iniciaremos aqui uma série de posts sobre um processo de desenvolvimento bastante difundido no mercado - o RUP.

O RUP, abreviação de Rational Unified Process (ou Processo Unificado da Rational), é um processo proprietário de Engenharia de software criado pela Rational Software Corporation, adquirida pela IBM, ganhando um novo nome IRUP que agora é uma abreviação de IBM Rational Unified Process, fornecendo técnicas a serem seguidas pelos membros da equipe de desenvolvimento de software com o objetivo de aumentar a sua produtividade.

Essa metodologia é tida pelo mercado, como "pesada" em nível de atividades,processos, artefatos, etc, porém por ser uma metodologia adaptável, pode se adequar a projetos de qualquer magnitude.

O Rup toma como premissa 6 práticas de engenharia de software. São elas:

  • Desenvolvimento iterativo;
  • Gerenciamento de requisitos;
  • Arquitetura baseada em componentes;
  • Modelagem utilizando a UML como ferramenta;
  • Melhoria contínua de processos e produtos de software;
  • Configuração e gerenciamento de mudança.
Além dessas práticas existem outras premissas que o RUP segue:

  • Desenvolvimento orientado por caso de uso - Os casos de uso são o alicerce para o processo;
  • Configuração de processo - O processo é adaptável, podendo ser usado em pequenos e grandes projetos;
  • Suporte a Ferramentas - A Rational possui uma suite de ferramentas com objetivo de apoiar o processo.
O modelo RUP é constituído por três entidades fundamentais: trabalhadores (papéis), atividades e artefatos.

Fluxogramas relacionam as atividades e os papéis em sequências que produzem valiosos resultados.

Recomendações, modelos de documento e ferramentas complementam a descrição do processo fornecendo orientação detalhada aos profissionais que usam o RUP.

O modelo do RUP se baseia no modelo incremental e iterativo e procura resolver problemas clássicos do desenvolvimento de sistemas como: a mudança de requisitos, a falta de gerência de riscos, o estouro de prazos, a falta de produtividade e a falta de atualização de documentos.

Esses problemas são resolvidos pelo RUP, promovendo o desenvolvimento iterativo, o controle do processo através de fases e fatos e focando nas mudanças de ciclo das atividades de desenvolvimento.

O processo conta com 4 fases:
  • Concepção - levantar requisitos, definir o escopo do produto;
  • Elaboração - analisar os requisitos, modelar o produto a ser entregue e definir a arquitetura sobre a qual o produto será construído;
  • Construção - Implementação do produto;
  • Transição - produz a entrega do produto final.
Como o produto de software passa por vários ciclos de evolução, a cada iteração se passa por essas 4 fases produzindo-se sempre novas gerações mais evoluídas do produto em questão.

Em cada uma dessas 4 fases, são realizadas uma série de atividades(requisitos,projeto,implementação e avaliação) e essas atividades são revisitadas a cada iteração.

Na imagem abaixo, temos uma noção do processo como um todo e da intensidade das atividades no decorrer das fases do processo.


O RUP é entregue aos profissionais como um Web site interativo no qual se explica todo o método. Além desse web site, encontra-se informação sobre o RUP no livro "Introdução ao RUP Rational Unified Process" do autor Philippe Kruchten, traduzido e publicado pela editora Ciência Moderna.

Nos próximos posts, vamos falar detalhadamente sobre cada uma das fases presentes no processo de desenvolvimento de software proposto pelo RUP.

Até lá!

Projeto Físico de Banco de dados

Após a criação do modelo lógico de banco de dados, partimos para a construção do modelo físico, ou seja, produzimos um desenho com a definição das tabelas e de suas colunas com os tipos de dados, de seus índices , visões, relacionamentos, etc.

Cabe aqui colocarmos algumas regras para criação das tabelas.

Quando temos um relacionamento um para um entre duas entidades, devemos avaliar a necessidade de criarmos duas tabelas. Geralmente quando se tem um relacionamento deste tipo entre duas entidades cria-se apenas uma tabela.

Para os relacionamentos um para muitos entre duas entidades, devemos criar duas tabelas onde a chave primária ficará do lado um e a chave estrangeira no lado muitos.

Nos relacionamentos muitos para muitos, além das duas tabelas representando as duas entidades que se relacionam, cria-se uma terceira tabela que recebe a chave das duas tabelas criadas para as entidades em questão.

No caso de entidade com auto-relacionamento um para muitos, cria-se uma tabela com uma chave estrangeira que receberá valores da chave primária da própria tabela.

Para auto-relacionamento muitos para muitos cria-se duas tabelas onde um delas recebe a duas chaves de uma mesma tabela.

Em casos de relacionamento ternário, utiliza-se a tabela associativa criada para associar tabelas cujo relacionamento é muitos para muitos inserindo uma nova chave a essa tabela.

Em caso de Generalização/Especialização, podemos optar por duas alternativas. A primeira é adicionar os atributos das entidades especializadas na tabela da entidade genérica. A segunda é criar uma tabela para a entidade generalizada e tabelas para as entidades especializadas.

Após a criação das tabelas devemos definir os tipos de dados das colunas que as constituem.

Após a conclusão do modelo físico, devemos elaborar um script em linguagem SQL para a criação das tabelas no banco de dados. Existem uma série de ferramentas de apoio que auxíliam ao analista na elaboração desses scripts. Erwin, Power Designer são alguns exemplos de ferramenta CASE para este propósito.

É possível também realizar o que chamamos de engenharia reversa, ou seja, a partir de um banco de dados já implementado, gerar os modelos físico e lógico do banco de dados.

Bom, é isso aí!

Abraço!

HUGO

Projeto lógico de Banco de dados

No último post falamos sobre alguns conceitos importantes sobre bancos de dados. Aqui iremos apontar quais etapas devem ser realizadas para criação de um modelo conceitual de um banco de dados.

O projeto lógico de banco de dados consiste na análise e modelagem utilizando o modelo de entidade e relacionamento e normalização de dados.

Copiando Peter Chen, as principais etapas para construção de um projeto lógico de banco de dados são:

  1. Identificar as entidades;
  2. Identificar os tipos de relacionamentos entre essas entidades;
  3. Desenhar o diagrama de entidade X relacionamento prevendo os itens acima;
  4. Identificar os atributos que as entidades terão;
Nomalização de dados

A normalização é o processo pelo qual são aplicadas regras a um conjunto de dados para se obter uma estrutura de dados quase livre de redundâncias. Ao final do processo de normalização, deve-se valida-lo com o modelo de entidade e relacionamento.

Esse processo pode ser feito em até seis etapas, mas geralmente, ao se chegar a terceira etapa( terceira forma normal) já se obtem um modelo de dados estável.

As três fases de normalização de dados são:

  • primeira forma normal - O objetivo aqui é eliminar grupos de dados repetitivos da estrutura e coloca-los em uma nova entidade.
Vamos analisar uma nota fiscal. Nesta existem uma série de produtos (itens repetitivos). Neste caso vamos criar uma nova entidade PRODUTO para inclusão desses itens.
  • segunda forma normal - Deve-se localizar dados que não dependa única e exclusivamente da chave primária da entidade em questão. Ao se identificar grupos de dados independentes dessa chave deve-se separá-los em outras entidades.
Os dados do cliente na nota fiscal não dependem única e exclusivamente da chave primária da Nota fiscal, assim devem ser colocados em uma nova entidade (CLIENTE).
  • terceira forma normal - Nessa etapa, devemos localizar atributos com dependência transitiva. São atributos que podem ser obtidos através de outros e que portanto não precisam existir fisicamente. Deste modo devem ser excluídos.
No exemplo da nota fiscal tempos o campo valor total. O valor desse campo é obtido através da soma do valor unitário de cada produto na nota, portanto não há a necessidade de se criar um campo para guardar esse valor.

Após a construção do modelo conceitual, partimos para a construção do modelo físico, e para a criação do script de criação dos objetos que constituirão o banco de dados

sábado, 29 de agosto de 2009

Conceitos de Banco de dados

Um sistema de informação tem o objetivo de receber dados, processa-los e gerar informação.

O usuário "entra" com dados, o sistema "processa" esses dados e produz uma "saída".

Mas vamos com calma! Qual é a diferença entre dado e informação? De forma simplista, podemos dizer que o dado é um fato ou característica isolado referente a algum objeto, coisa ou entidade. Já a informação é um conjunto de dados relacionados. Por exemplo, uma pessoa possui nome, telefone, endereço entre outros dados. O nome é um dado, já o conjunto nome, telefone, endereço é uma informação.

Todo o processamento de dados é feita na memória principal do computador, porém como sabemos essa memória é volátil, ou seja, é apagada quando se desligar o computador e é aí que entra em cena os bancos de dados.

Você poderia dizer o seguinte: por que não gravar essas informações em arquivos? Bom, respondendo a essa pergunta com outra pergunta. Como organizar esses arquivos se o volume das informações for muito grande e com taxa de crescimento for constante? O banco de dados é a solução para o problema.

Armazenar informações organizadas e recuperá-las sem faltar um pedacinho sequer, sempre que necessário é a função principal dos bancos de dados.

Todo mundo que usa telefone costuma ter uma agenda telefônica. Nela cada amigo tem nome, endereço, número da linha, aniversário e nos tempos atuais e-mail e quando precisamos ligar para alguém, vamos à letra incial do nome e buscamos o número do telefone.

Essa "agendinha" expressa bem o conceito de banco de dados - um armazém de informações relevantes, organizadas de maneira coerente e lógica, que precisa ser recuperadas com frequência.

Esse universo envolve conceitos importantes que precisamos entender para torna-lo útil. Vamos a eles:

Sistema de gerenciador de banco de dados e Banco de dados

É importante não confundir os conceitos de sistema gerenciador de banco de dados e banco de dados.

O primeiro refere-se a programas que auxiliam ao usuário na tarefa de manipular e administrar os dados contidos em um banco de dados. Esses programas promovem os controles de acesso, redundância, integridade e o mecanismo de cópias de segurança dos dados presentes em um banco de dados.

Se você perguntar a um DBA com que banco de dados ele trabalha ele poderá responder que trabalha com o MySQL, Oracle, Sql server e por aí vai, porém se você fizer essa pergunta a um analista de sistemas ou a um analista de negócios, este poderá lhe responder que trabalha com o banco de dados do RH ou com o banco de dados acadêmico, por exemplo.

Modelagem de dados

A modelagem de dados é o processo pelo qual trabalham-se os dados de modo a promover estruturas de amazenamento estáveis. Esse processo se por meio da criação de modelos conceituais de entidade e relacionamento ou pela nomalização de dados, fazendo com que essas estruturas possam evoluir com o tempo, sem prejudicar o desenvolvimento de sistemas.

Entidade

Entende-se como um grupo de coisas semelhantes. Essas coisas podem ter uma existência física (pessoa, carro) ou abstrata (pedido, ordem de serviço). Cada entidade possui diversar instâncias do objeto que o representa.

Quando se transpõe a entidade para um modelo físico, criamos uma tabela. Já no modelo Orientado a objeto, temos o que chamamos de classe.

Atributo

O atributo é um qualificador lógico de um objeto. É um dado e como tal, serve para descrever o caracterizar o objeto em questão.

Quando se transpõe para o modelo físico o atributo torna-se um campo. No modelo orientado a objeto é conhecido com propriedade ou atributo mesmo.

Tupla

Uma tupla é o conjunto de características do objeto. No modelo físico uma tupla é um registro presente em uma tabela. No modelo orientado a objetos, dizemos que esta é uma instância de um objeto.

Tabela

A tabela é uma estrutura composta por registros compostos por linhas e colunas. A linha representa um objeto do mundo real e as colunas servem para qualificar esse objeto.

Chave

A chave é um qualificador único de um registro. É o campo escolhido para identificar exclusivamente um registro e por conta disso esse campo não poderá conter valores em branco ou repetidos.

Vamos imaginar qual atributo de uma pessoa seria a melhor opção para ser um chave. O campo nome com certeza não seria a opção a ser escolhida visto que existem pessoas com nomes homônimos. O CPF talvez seja um atributo candidato, pois é um documento obrigatório para uma pessoa adulta, porém esse documento não é obrigatório para crianças.

Nos casos em que nenhum dos atributos sejam qualificados para ser o campo chave do registro, deve-se criar um campo específico para isto (ex: matrícula). As chaves podem ser classificadas nos tipos abaixo:

  • Primária - Classificam unicamente um registro. Toda tabela deve possuir uma chave primária.
  • Estrangeira - Servem para relacionar as tabelas do banco de dados. Por exemplo temos duas tabelas: CLIENTE e NOTA_FISCAL. Cada tabela tem um chave primária , porém para relacionar essas tabelas a tabela nota fiscal deverá possuir a chave estrangeira CLIENTE que possuirá como valor um código de um cliente.
  • Secundária - São os demais campos do registro que possui a função de subclassificar esses registros. É muito utilizado nos índices de uma tabela (falaremos sobre eles daqui à pouco).
Relacionamento

Os objetos do mundo real apesar de distintos guardam um certo grau de relacionamento com outros objetos.

Voltando ao exemplo do cliente/nota fiscal notamos que existe uma relação de interdependência entre essas duas entidades, ou seja, para emitirmos uma nota fiscal é necessária a existência de um cliente. A essa interdependência, damos o nome de relacionamento e este pode ser classificado de duas formas:

  • Opcionalidade - indica se é obrigatória ou não a ocorrência ou indicação de um registro no outro.
  • Cardinalidade - A cardinalidade indica quantas ocorrências de um registro podem se relacionar com outro registro.
Existem 3 tipos de cardinalidade:

  • Um para um (1:1) - é quando cada tupla de uma entidade está relacionada a apenas uma tupla de outra entidade.
  • Um para muitos (1:M) - é quando cada tupla de uma entidade pode estar relacionada a muitas tuplas de uma outra entidade.
  • Muitos para muitos (M:M) - Neste caso várias tuplas de uma entidade podem estar relacionadas a várias tuplas de uma outra entidade.
Integridade referencial

A integridade referencial é o mecanismo utilizado pelos gerenciadores de bancos com o objetivo de manter a consistência dos dados do banco.

Digamos que um usuário tente emtir uma nota fiscal com um código de cliente inexistente? Ou ainda apagar registro de um cliente que possui diversas notas fiscais cadastradas? Como ficaria a consistência dessas tabelas? Um bom SGBD deve garantir a integridade referencial do banco.

Restrições (Constraints)

As restrições são utilizadas para melhorar a qualidade da informação guardada nas tabelas do banco. Já falamos sobre duas restrições: chaves primárias e estrangeiras, contudo existem outras restrições muito importantes:

  • Nulos - servem para determinar se é permitido a inserção de um valorou não em um determinado campo;
  • Exclusivos (unique) - servem para determinar se o campo pode ou não receber valores repetidos;
  • Padrão - Serve para informar um valor padrão quando um valor não é informado pelo usuário;
  • Domínio - Serve para limitar os valores a serem inseridos em um campo. Exemplo: O campo Sexo só pode receber dois valores (Masculino ou Feminino).
Transação

Sempre que ocorrer a alteração no conteúdo de uma ou mais tabelas de um banco de dados. Deste modo sempre que houver uma inclusão, alteração ou exclusão em um registro é gerada uma transação. O usuário ou o sistema gerenciador de banco de dados, nomento da operação, pode optar pela efetivação (COMMIT) ou pelo abandono da mesma (ROLL-BACK).

Procedimentos armazenados

São pequenos códigos executados em um banco de dados que fim guardados para posterior utilização. São eles:

  • Stored Procedures - código que realiza operações no banco de dados. Não retornam valor;
  • Functions - idêntico a uma Stored procedures exceto por retornar valor;
  • Triggers - são procedimentos disparados por eventos (a inclusão, alteração ou exclusão de um registro).
Algum desses conceitos são vistos como objetos em um banco de dados (tabelas, constraints, índices, stored procedures, usuários etc).

Bom, acho que com esses conceitos já dá para praticarmos um pouco de modelagem de dados, mas isso será assunto para outro post.