quarta-feira, 26 de junho de 2013

O gerenciamento do escopo do projeto

Veja neste artigo que de acordo com PMBOK, o Gerenciamento do Escopo do Projeto é composto dos processos para garantir que o projeto inclua todo o trabalho exigido, e somente o trabalho exigido, para completar o projeto com sucesso.


O plano de gerenciamento do escopo do projeto é uma ferramenta de planejamento que descreve como a equipe irá definir o escopo do projeto, desenvolver a declaração do escopo detalhada do projeto, definir e desenvolver a estrutura analítica do projeto, verificar o escopo do projeto e controlar o escopo do projeto. O desenvolvimento do plano de gerenciamento do escopo do projeto e o detalhamento desse escopo se iniciam pela análise das informações contidas no termo de abertura do projeto, pela declaração do escopo preliminar, pela última versão aprovada do plano de gerenciamento do projeto, pelas informações históricas contidas nos ativos de processos organizacionais e por quaisquer fatores ambientais relevantes para a empresa:

Coletar os requisitos: criação de um plano de gerenciamento do escopo do projeto que documenta como o escopo do projeto será definido as funcionalidades projeto e do produto, onde será necessário para atender as partes interessadas, sendo eu o sucesso depende totalmente no recolhimento das informações, por isso deve ser documento todas as expectativas do patrocinador, cliente e outras partes interessados no projeto. Sempre verificando e controlado a estrutura analítica do projeto EAP (Estrutura Analítica do Projeto) será criada e definida.

Definição do escopo: o escopo de um projeto descreve todos os seus produtos, os serviços necessários para realizá-los e resultados finais esperados. Descreve também o que é preciso fazer para que alcance seus objetivos com os recursos e funções especificados desenvolvidas de uma declaração do escopo detalhado do projeto, como a base para futuras decisões do projeto. Os riscos existentes, premissas e restrições são analisados para verificar a integridade do projeto, aonde o riscos adicionais, premissas e restrições vão sendo adicionados conforme há necessidade.

Criar EAP: subdivisão das principais entregas do projeto e do trabalho do projeto em componentes menores e mais facilmente gerenciáveis. A EAP é uma decomposição hierárquica orientada à entrega do trabalho a ser executado pela equipe do projeto, para atingir os objetivos do projeto e criar as entregas necessárias. A EAP organiza e define o escopo total do projeto. A EAP subdivide o trabalho do projeto em partes menores e mais facilmente gerenciáveis, em que cada nível descendente da EAP representa uma definição cada vez mais detalhada do trabalho do projeto. É possível agendar, estimar custos, monitorar e controlar o trabalho planejado contido nos componentes de nível mais baixo da EAP, denominados pacotes de trabalho. A EAP representa o trabalho especificado na declaração do escopo do projeto atual aprovada. Os componentes que compõem a EAP auxiliam as partes interessadas a visualizar as entregas do projeto.

Verificação do escopo: formalização da aceitação das entregas do projeto terminadas. A verificação do escopo é o processo de obtenção da aceitação formal pelas partes interessadas do escopo do projeto terminado e das entregas associadas. A verificação do escopo do projeto inclui a revisão das entregas para garantir que cada uma delas foi terminada de forma satisfatória. Se o projeto foi finalizado antes do término (abortado), o processo de verificação do escopo do projeto deve determinar e documentar o nível e a extensão do término. A verificação do escopo difere do controle da qualidade porque a verificação do escopo trata principalmente da aceitação das entregas, enquanto o controle da qualidade trata principalmente do atendimento aos requisitos de qualidade especificados para as entregas. A inspeção inclui atividades como medição, exame e verificação para determinar se o trabalho e as entregas atendem aos requisitos e aos critérios de aceitação do produto. As inspeções recebem vários nomes, como revisões, revisões de produto, auditorias e homologações. Em algumas áreas de aplicação, esses vários termos possuem significados específicos e restritos. As entregas aceitas temo processo de verificação do escopo documenta as entregas terminadas que foram aceitas. As entregas terminadas que não foram aceitas são documentadas, juntamente com as razões da não aceitação. A verificação do escopo inclui a documentação de apoio recebida do cliente ou patrocinador e o reconhecimento da aceitação das entregas do projeto pelas partes interessadas. As mudanças solicitadas podem ser geradas a partir do processo de verificação do escopo e são processadas para revisão e destinação pelo processo de controle integrado de mudanças. As ações corretivas recomendadas são atualização dos documentos como o resultado do processo, verificar os documentos que definam o produto e o progresso da conclusão do produto.

Controle do escopo: controle das mudanças no escopo do projeto. O controle do escopo do projeto trata de influenciar os fatores que criam mudanças no escopo do projeto e de controlar o impacto dessas mudanças. O controle do escopo garante que todas as mudanças solicitadas e ações corretivas recomendadas sejam processadas por meio do processo de controle integrado de mudanças do projeto. O controle do escopo do projeto também é usado para gerenciar as mudanças no momento em que efetivamente ocorrem e é integrado a outros processos de controle.

As mudanças não controladas são frequentemente chamadas de aumento do escopo do projeto. As características e funções que descrevem um produto, serviço ou resultado. O trabalho que precisa ser realizado para entregar um produto, serviço ou resultado com as características e funções especificadas.

Então finalizamos aqui este breve artigo. Quaisquer dúvidas, sugestões ou críticas podem ser registradas na seção de comentários, abaixo.

Um grande abraço!

 

Analista de Negócio em TI e Programador em JAVA, PHP e C#. Graduado em Análise e Desenvolvimento de Sistemas, ULBRA – Torres/RS - 2012/2. Trabalhando atualmente com o planejamento e gerenciamento para implementação de projetos de sistemas web, visando satisfazer as expectativas dos clientes, buscand...

FONTE: O gerenciamento do escopo do projeto http://www.devmedia.com.br/o-gerenciamento-do-escopo-do-projeto/28418#ixzz2XLE8RmiT

sábado, 8 de junho de 2013

Os 12 mandamentos para o Profissional de Segurança

Segundo a Bíblia, os 10 Mandamentos resumem a Lei, dada por Deus ao povo de Israel por meio de Moisés, apresentando os mandamentos do amor a Deus (os quatro primeiros) e ao próximo (os outros seis). Se para salvar o povo de Israel e orientar a Cristandade durante mais de 2000 anos foram suficientes 10 mandamentos, o desafio da Segurança da Informação é de tal forma exigente que são necessários pelo menos 12 princípios orientadores para os profissionais de segurança garantirem a criação de valor nas suas organizações. Essa é pelo menos a convicção das organizações globais ISACA, Information Security Forum (ISF) e (ISC)2 expressa no documento “Principles for information security practitioners”!

Os princípios foram desenhados para ajudar os profissionais de segurança da informação a Apoiar e Defender as suas Organizações de uma variedade de ameaças. Adicionalmente, estes princípios contribuem para Promover a segurança da informação através de uma maior consciencialização e responsabilidade de todos aqueles que, direta ou indiretamente, intervêm no sistema de informação das Organizações. De seguida apresentam-se os 12 princípios e algumas das vantagens da sua adoção nas Organizações:

A. Suportar a Organização

1. Manter o foco no negócio da Organização.
2. Entregar qualidade e valor para os stakeholders.
3. Cumprir com os requisitos legais e regulamentares.
4. Fornecer informações atempadas e precisas sobre o desempenho da segurança.
5. Avaliar as ameaças atuais e futuras à Informação.
6. Promover a melhoria contínua da segurança da informação.

Benefícios da sua adoção:

Integração da segurança da informação em atividades essenciais do negócio;
Demonstração do valor da segurança da informação, ajudando a satisfazer os requisitos de negócios;
Cumprimento das obrigações legais ou normativas e das expectativas dos stakeholders, evitando sanções civis ou penais;
Apoio dos requisitos dos negócios e gestão dos riscos da Informação;
Análise e avaliação das ameaças à segurança da informação;
Redução dos custos, melhoria da eficiência e aumento da eficácia da segurança organizacional;

B. Defender a Organização

7. Adotar uma abordagem orientada ao Risco.
8. Proteger a Informação classificada.
9. Concentre-se nas aplicações críticas para o negócio.
10. Desenvolver sistemas seguros.


Benefícios da sua adoção:

Tratamento dos riscos de uma forma consistente e eficaz;
Não divulgação de informações classificadas (por exemplo confidenciais ou sensíveis) a indivíduos não autorizados;
Direcionar os recursos escassos de segurança de informação para as aplicações de negócio onde os incidentes de segurança teriam um maior impacto no negócio;
Desenvolvimento de sistemas com qualidade e rentáveis ​​em que as pessoas podem confiar.

C. Promover a Segurança da Informação

11. Atuar de forma ética e profissional.
12. Promover uma cultura de segurança positiva.

Benefícios da sua adoção:

Realização das atividades de segurança de forma confiável, responsável e eficaz;
Influência positiva dos comportamentos de segurança dos usuários, reduzindo a probabilidade de incidentes de segurança e limitando o seu impacto potencial; 

Conclusão

A importância da adoção de princípios orientadores para os profissionais de Segurança da Informação está sobretudo relacionada com a necessidade de harmonizar comportamentos para que seja possível o desenvolvimento de uma verdadeira cultura de valorização da Informação como ativo crítico das Organizações e consequentemente da importância de garantir a sua confidencialidade, integridade e disponibilidade.

Como qualquer outra lei escrita por Homens e para Homens terá as suas vulnerabilidades e estará exposta a ameaças. No entanto, qualquer organização deverá começar por definir e comunicar as suas Leis para que todos os envolvidos possam pelo menos saber qual a regra para tomarem consciência de quando as estão a cumprir ou a infringir.


quarta-feira, 5 de junho de 2013

Ponteiros em C#

C# é uma linguagem de programação que foi criada junto com/para a arquitetura .NET da Microsoft. O foco inicial de C# foi o de resolver os problemas que existiam no antigo Visual Basic. O "produto" ficou tão bom que toda a arquitetura .NET foi desenvolvida através dessa linguagem.

Nos dias em C que era a principal linguagem de programação, os ponteiros significavam programação e vice-versa. Agora, em linguagens mais sofisticadas como C#, os ponteiros são apenas um recurso fornecido, mas não é realmente incentivado.
Em uma linguagem moderna, o argumento é que você nunca precisará descer ao nível de ponteiros, porque isto simplesmente mostra que você está pensando em um nível muito primitivo e pode por em perigo a união com o hardware. Embora isto seja verdade, ainda há momentos quando em que você tem que interagir com o hardware de uma forma que só pode ser alcançada usando ponteiros. Além disso, há todos aqueles programas em C/C++ que usam ponteiros e precisam ser convertido para algo mais polido e seguro. Em resumo, você certamente deve saber sobre ponteiros mesmo esperando que você nunca irá realmente usa-los em um programa real. Se você acha que os ponteiros são essenciais para algo de baixo nível que você está tentando implementar, em seguida, também é importante que você saiba como implementá-los em um possível método seguro.

Referência, ponteiro e endereço

Primeiro precisamos esclarecer algumas confusões que existe entre os três termos “referência”, “ponteiro” e “endereço”. Começando como o mais básico “endereço”, é o número do endereço de algo que está armazenado. A maioria dos hardwares do computador atribui endereços usando um esquema simples de incremento a partir de algum valor e continuam até outro valor, por exemplo, 0-1000, e cada endereço corresponde a uma posição de memória capaz de armazenar alguns dados com um determinado número de bits. Esta ideia simples tornou-se cada vez mais complicada com a evolução do hardware e a introdução do mapeamento de memória de hardware. Agora o endereço que os dados são armazenados é mudado sem que eles sejam movidos, devido à utilização de hardware de conversão de endereços. Mesmo que o hardware não possa mudar o endereço, ele pode ser mudado quando o aplicativo for executado, pelo sistema operacional ou o sistema de coleta de lixo, que normalmente efetua algumas mudanças para o sistema ficar mais eficiente. O ponto é que embora uma vez que o endereço de memória era uma forma fixa e confiável de acesso, hoje é cercado por uma serie de problemas.
O “ponteiro” é a abstração de um endereço. Na sua forma mais básica, um ponteiro é simplesmente uma variável que pode ser usada para armazenar o endereço de alguma coisa. Você pode usar um ponteiro para acessar o índice do dado que ele está apontando – um processo chamado desreferenciamento. Você também pode utilizar o ponteiro para fazer operações aritméticas, que podem mudar sua localização no armazenamento ou memória. Ou seja, se na memória os objetos são armazenados um após o outro, você pode executar a “aritmética de ponteiro” para alterar o objeto que está sendo apontado. Aritméticas de ponteiro é a razão pela qual, muitos programadores gostam de ponteiros, mas também é a razão pela qual os ponteiros são perigosos. Um erro no cálculo pode resultar em que o ponteiro aponte para um lugar onde ele não deve estar apontando e todo o sistema pode falhar com o resultado. Não há realmente nenhuma razão para que um ponteiro não deva ser basicamente a abstração de um endereço, mas na maioria dos casos, os ponteiros são apenas invólucros para endereços da máquina e isto também levanta a questão sobre o que acontece se o sistema fizer algo que mude o endereço de um objeto. Veremos mais sobre isso posteriormente.
Finalmente chegamos ao ponto mais alto da abstração de endereço na forma de uma “referência”. Uma referência é apenas isso – uma referência a um item de dados ou um objeto. Se isso soa como um ponteiro, há um sentindo, já que isto é verdade, mas a ideia fundamental é que você não pode manipular uma referência diretamente. Ou seja, enquanto há certamente uma aritmética de ponteiros, não pode haver uma aritmética de referência. Tudo o que você pode fazer com uma referência é passá-la para outro usuário ou referenciá-lo e acessar os dados que ele faz referência. Como no caso dos ponteiros, não há razão para que uma referência, não deve ser uma abstração do endereço da máquina subjacente, mas na maioria dos casos, e em C#, em particular, a referência é apenas um invólucro para um endereço. Em futuras implementações, contudo, uma referencia pode ser implementada como um identificador para uma tabela, em outra tabela, a um índice de recursos e assim por diante, até que finalmente o hardware converta a referência em um endereço de objeto dados reais. O ponto é que, enquanto sabemos que é uma referência, e para que serve um ponteiro, em C#, eles são simplesmente um invólucro para um endereço e este é um detalhe de implementação, e não algo que você deva se apegar.

Ponteiros

Em C# podemos fazer uso de referências o tempo todo, sob a forma de variáveis que são atribuídas qualquer tipo de referência. Por exemplo, se você criar uma instância de uma classe, a variável de instância não é um objeto, mas uma referência a um objeto. Isto é:

        MyClass MyObject = new MyClass();
Então MyObject é uma referência a uma instância de MyClass. Na prática, contém o endereço da ocorrência, mas como já foi explicado, você não deve contar com essa forma de execução. Este armazenamento de uma referencia no MyObjeto invés de um valor é mais evidente se você criar uma outra variável que referencia o mesmo objeto de MyObject:

        MyClass MyObject2 = MyObject;
Naturalmente, agora nós não temos outra cópia completa e independente do objeto referenciado porMyObject, ao invés de referência, temos a variável na mesma instância. Se você fizer uma alteração na instância usando MyObject2, as mesmas alterações serão encontradas através de MyObject. A diferença entre uma referência e um valor, basicamente se resume a esta semântica, a referencia não cria uma copia dos dados/objetos originais. Se isso acontecer, então temos um valor semântico, se não temos semântica de referência.
Os ponteiros são uma generalização de um modelo de referência para incluir a aritmética de ponteiro. Ponteiros são tão perigosos que devem ser colocados em quarentena dentro do seu código. Primeiro, o projeto tem que ser marcado como não seguro (usafe) usando as propriedades do projeto para definir o Build como, Allow Usafe Code. Então, qualquer uso de ponteiros tem que ser incluído no blocousafe{} para marca-lo ainda mais claramente. Ainda mais restritivo é o fato de que você não pode usar a memória para fazer uso do ponteiro menos complicado. Essencialmente, você só pode criar um ponteiro para qualquer tipo de valor simples, por exemplo, intfloadcharenum, para outro ponteiro ou struct que não contenha outros tipos gerenciados. Então você não pode ter um ponteiro para um objeto, ou um delegate ou uma referência. Isto é bastante restritivo e basicamente, não permite que se criem ponteiros para qualquer coisa criada no heap (pilha de memória) ou algum objeto que usa uma gestão dinâmica de memória. No entanto, você pode ter um ponteiro para uma struct que contém tipo de valores simples e você pode criar ponteiros para arrays de tipos de valores simples. Você também pode ter um ponteiro do tipo void, ou seja, um ponteiro para um tipo desconhecido, mas para ser de alguma utilidade, por exemplo, para usar a aritmética de ponteiros, você precisa converter um ponteiro do tipo void para um ponteiro de um determinado tipo.
Para declarar um ponteiro em C#, usa-se a mesma sintaxe do C++:
tipo * variavel;
O asterisco (*) é o operador de referência ou operador indireto, e geralmente é usado em conjunto com o endereço do operador e que como o próprio nome sugere, retorna o endereço de uma variável (sua referência). Por exemplo:

unsafe
{
     int* pMyInt;
     int MyInt;
     pMyInt = &MyInt;
}
O código acima cria um ponteiro de inteiro, ou seja, pMyInt armazena no ponteiro o endereço do inteiro MyInt. A primeira coisa importante, é que um ponteiro não herda de um objeto e assim não há métodos associados a ele ou boxing e unboxing. Por exemplo, você não pode usar um método toString() para mostrar o valor do ponteiro.O que você pode fazer, é converter o ponteiro para um tipo simples e assim usar os métodos associados a este tipo, como no exemplo abaixo:

MessageBox.Show(((int)pMyInt).ToString());
Claro que isto pressupõe que no int caberá o ponteiro, ou seja, um endereço de memória.
O operador de referencia, também retorna os valores armazenados no endereço que o ponteiro está apontando. Por exemplo:

MessageBox.Show((*pMyInt).ToString());
O código acima mostra o conteúdo de MyInt. Um ponteiro pode ser nulo e se neste caso for aplicado o operador de referencia (*), gera uma exceção. Obviamente não faz sentido querer exibir o conteúdo de um ponteiro nulo, mas você sempre pode converter um ponteiro void e então evitar o engano. Em alguns casos, você pode produzir um “erro” de converter incorretamente um ponteiro. Por exemplo:

void* pMyData = &MyInt;
MessageBox.Show((*(double*)pMyData).ToString());
No código acima é definido um ponteiro nulo para apontar para um inteiro, ou seja, um número inteiro de 32 bits, em seguida, ele é convertido para um ponteiro de double, ou seja, double *, e finalmente é aplicado o operador de referência para retornar o valor apontado. Se você tentar fazer isso, verá que ele funciona, mas gera um resultado inesperado, porque o int original era de apenas 4 bytes de armazenamento e do double é de 8 bytes. De onde é que será adicionado os 4 bytes? A resposta é de um local de memória vizinho, um que você não seria capaz de acessar só apontando para o inteiro. Ler uma posição de memória que você não conhecida até pode ser seguro, mas quem sabe que efeitos isto pode trazer para o seu código ou sistema operacional. Por exemplo, tente:

int MyInt2 = 0;
int MyInt=1234;
void* pMyData = &MyInt;
*(double*)pMyData = 123456.789;
MessageBox.Show(MyInt2.ToString());
Você pode se surpreender ao descobrir que o valor de MyInt2 mudou e já não é mais zero, embora não seja atribuído um novo valor para ela dentro do programa. A explicação é simples, o armazenamento do  MyInt2 é alocado ao lado de MyInt e quando vamos atribuir um valor de 8 bytes para MyInt os4bytes extras substituem de MyInt2. Isto é claramente perigoso, inesperado e indesejado, geralmente por este tipo de comportamento que o código é considerado “inseguro”.
Um uso muito comum de ponteiros é para manipular a estrutura de um tipo de dado. Por exemplo, suponha que você deseje recuperar os quatro bytes que compõem um número inteiro de 32 bits:

int MyInt = 123456789;
Sempre podemos usar um ponteiro nulo para obter o endereço de qualquer variável:

void* MyPointer;
MyPointer = &MyInt;
Então podemos atribuí-lo a qualquer ponteiro de qualquer um dos tipos padrão e usar aritmética de ponteiro, como no exemplo abaixo, onde um byte, é convertido para um char:

byte* pMyByte = (byte*)MyPointer;
char MyChar = (char)*(pMyByte + 3);
MessageBox.Show(MyChar.ToString());
A razão porque não atribuímos diretamente para um ponteiro de char é que um char tem dois bytes de tamanho e estamos convertendo um inteiro ASCII de 4 bytes para caracteres Unicode.
Na maioria dos casos, são existem maneiras de ter acesso à estrutura interna dos tipos de dados comuns usando as classes Converter ou BitConvertor. No caso do BitConvertor o método GetBytespode ser usado para converter o int para um array de bytes e então qualquer um dos bytes pode ser convertida para um caractere usando a classe Convert:

Byte[] Bytes = BitConverter.GetBytes(MyInt);
MyChar = Convert.ToChar(Bytes[3]);

Múltipla referência

Se você tiver alguma dúvida, então esta é a hora de tirar todas. Porque se você entender como funciona um ponteiro, vai entender como lidar com ponteiro de ponteiro, e ponteiro de ponteiro de ponteiro, e assim por diante. Em teoria, isto é fácil, na prática não tão complicado como você deve pensar. Por exemplo:

int** ppMyInt;
int* pMyInt;
int MyInt=1234;
pMyInt = &MyInt;
ppMyInt = &pMyInt;
MessageBox.Show((**ppMyInt).ToString());
No código acima, declaramos um ponteiro de ponteiro, ou seja, ppMyInt e usamos ele para apontar para pMyInt. Para exibir o valor apontado por pMyInt, ou seja, o valor de MyInt, usamos dois níveis de referência, **ppMyInt. Neste caso a referência dupla é fácil de entender, mas em casos reais, ela pode se tornar difícil de trabalhar, quando você precisar de um ponteiro de ponteiro de ponteiro e assim por diante.

Ponteiros, arrays e fixed

Existe uma relação muito estreita entre ponteiros e arrays, realmente pode-se dizer que os ponteiros em linguagens como C e C++ foram introduzidos apenas para permitir que se criassem arrays. Em principio, o endereço do primeiro elemento de um array pode ser usado para localizar qualquer elemento do array, mas as coisas são um pouco mais complicadas. Por exemplo:

    int[] MyArray = new int[10];
    for (int i = 0; i < 10; i++)
        MyArray[i] = i;

    int* pMyArray = &MyArray[0];
    MessageBox.Show((*pMyArray).ToString());
Isso deve criar um ponteiro para o primeiro elemento do array, mas se você tentar executar, vai descobrir que na verdade obterá um erro, já que você não pode pegar o endereço de uma expressão não corrigida. A razão é que enquanto MyArray[0] é apenas uma variável int, o compilador sabe que oarray é um objeto gerenciado e pode ser movido a qualquer momento. Se você pegasse o endereça de um array e em seguida, o endereço se tornaria inútil. Para ter um endereço de um array, você tem que usar a palavra-chave fixed:

     fixed (declaração de ponteiro)
     {
          // instruções a serem realizadas
     }
Por exemplo:

     fixed (int* pMyArray= &MyArray[0])
     {
         MessageBox.Show((*pMyArray).ToString());
     }
O código acima irá mostrar o conteúdo do primeiro elemento do array. Você também pode usar o nome do array como uma abreviação para &MyArray[0]:

     fixed (int* pMyArray= MyArray)
     {
          MessageBox.Show((*pMyArray).ToString());
     }
Observe que o ponteiro declarado no fixed, deixa de existir assim que o fixed é executado, assim você não pode usar pMyArray fora do fixed.
Se você deseja acessar outros elementos do array, basta usar a aritmética de ponteiro:

     fixed (int* pMyArray= MyArray)
     {
          MessageBox.Show((*pMyArray+5).ToString());
     }
Ele mostra MyArray[5]. Observe que adicionamos 5 no endereço de inicio do array, realmente isto funciona porque o array é de inteiro, ou seja, estamos adicionando 5 inteiros no endereço do array. Mas e se o array fosse de double? É para esses casos que existe o operador sizeof, que retorna o valor do tamanho de qualquer tipo e isso é usado para descobrir o que acrescentar a um ponteiro. Ou seja, ponteiro+5 é traduzido para ponteiro+5*sizeof(tipoponteiro).
Para completar a conexão entre arrays e ponteiros você também pode usar a indexação de arraycomo atalho para aritmética de ponteiros. Isso porque, ponteiro[5] é um sinônimo de *ponteiro+5

      fixed (int* pMyArray = &MyArray[0])
      { 
           MessageBox.Show(pMyArray[5].ToString());
      }
Há uma restrição sobre o uso do ponteiro declarado na declaração do fixed. Mas não há nenhum problema de fazer uma cópia dele:

      fixed (int* pMyArray = MyArray)
      {
           int* ptemp = pMyArray;
           MessageBox.Show((*++ptemp).ToString());
      }
Mostra o conteúdo de MyArry[1].
Este tipo de manipulador de ponteiro trabalha com arrays. Por exemplo:

     int[,] MyArray = new int[10,10];

     fixed (int* pMyArray= &MyArray[0,0])
     {
         for (int i = 0; i < 100; i++)
         {
              *(pMyArray + i) = i;
         }
     }
Inicializa um array bidimensional, acessando-o como um bloco linear de memória. Naturalmente, a ordem que o array é inicializado depende de como ele é armazenado na memória e deixo isto para execução do exemplo e veja se ele é armazenado como uma linha ou uma coluna. É esse tipo de truque, ou seja, o acesso a um array 2D como se fosse uma estrutura 1D, que fez (e ainda faz alguns) ponteiros tão atraentes.
Observe que você pode inicializar vários ponteiros dentro de uma instrução fixed, desde que todos eles sejam do mesmo tipo. Para inicializar vários ponteiros de tipos diferentes, você tem que usar declarações fixed aninhadas para cada tipo.

Structs

Agora é hora de olharmos para as structs (estruturas) e ponteiros para structs. Você deve imaginar que assim como array, para usar ponteiro para structs, temos que coloca-lo em um bloco fixed, mas você não precisa porque uma struct é um tipo de valor e é alocado na pilha. Então podemos usar assim:

      public struct MyStructType
      {
           public int x;
           public int y;
      };
      MyStructType MyStruct=new MyStructType();
      MyStructType* pMyStruct = &MyStruct;
Agora, como você acessa um campo usando um ponteiro? A coisa mais óbvia:

      (*pMyStruct).x = 1;
Ou seja, o ponteiro pode usar o habitual ponto. No entanto, em uma homenagem ao C++, você também pode escrever:

     pMyStruct->y = 2;
     MessageBox.Show(pMyStruct->x.ToString());
Ou seja, o -> desreferencia o ponteiro e seleciona o campo de uma vez.

Strings

Costuma-se dizer que você não pode ter um ponteiro para uma string, porque a string é um objeto gerenciado, mas assim como no array, você pode usar o fixed para transformar a string em um arrayde char e então você pode inicializar um ponteiro de char para o primeiro caractere na string. Por exemplo:

     string MyString = "Hello pointer world";
     fixed (char* pMyString = MyString)
     {
         MessageBox.Show((*(pMyString + 6)).ToString());
}
Cria uma sequencia de forma habitual, corrige-o e obtém um ponteiro char ao seu primeiro char. Então podemos executar a aritmética de ponteiros para acessar o sexto elemento na string.

A alocação de memória

Bem como trabalhar com tipo de valor que você pode criar seus próprios tipos de dados primitivos usando a pilha. A declaração stackalloc tipo[n] aloca n bytes para o tipo e retorna um ponteiro. Você não precisa se preocupar com o armazenamento, a pilha não é modificada, ou a coleta de lixo, enquanto as variáveis estão no escopo de execução. Você também não precisa se lembrar de desalocar a memória, porque a pilha é automaticamente limpa quando as variáveis saem do âmbito da aplicação, geralmente quando o método que as declarou retorna. Por exemplo:

int* pMyArray = stackalloc int[100];
pMyArray[10] = 34;
MessageBox.Show(pMyArray[10].ToString());
Aloca 100 números inteiros, ou seja, 400 bytes, na pilha e usa o ponteiro para armazenar 34 em 4bytes começando no byte 40 e exibe este valor.
Observe que usamos a indexação do array, para fazer a atribuição e para exibir o valor, exatamente com em um array padrão. No entanto, o bloco de memória é apenas um bloco de memória que você pode fazer o que quiser com ele. Por exemplo:
public struct MyStructType
{
    public int x;
    public int y;
};
MyStructType* pMyDataBlock = stackalloc MyStructType[1];
pMyDataBlock->x = 34;
Aloca uma strutc na pilha, mas isso é, aloca o tamanho do struct que possui dois números inteiros, ou seja, 8 bytes.
Podemos usar o ponteiro para a struct de forma habitual para definir e acessar um campo. Ou seja, podemos usar o bloco como se fosse uma estrutura, mas se quisermos podemos simplesmente tratá-lo como um bloco de 8 bytes e utilizá-lo como outras estruturas de dados. Por exemplo, se você quiser tratar os dados como um array de int, você pode:

*((int*)pMyDataBlock) = 36;
Esta expressão pode ser difícil de entender, então vamos por partes:

int* pMyArray = (int*)pMyDataBlock;
pMyArray[0] = 36;
Cria um ponteiro para inteiro, e usa indexação de array para acessar o primeiro elemento do array que é o mesmo do campo x da estrutura.
Observe que essa forma depende de como a estrutura é organizada em memória e atualmente, o compilador do C# armazena os campos na ordem em que eles são declarados. Uma serie de atributos podem ser usados para pedir ao compilador para usar layouts especiais de memória especial para umastruct, consulte Mastering structs in C# para mais informações, mas mesmo assim você está fazendo uso de detalhes de implementação que podem mudar e tornar o seu programa inválido.

O que é tudo isto?

Você pode estar animando para aprender tudo sobre ponteiros, mas como você deve ter percebido, eles não são uma boa ideia. Programadores C e C++ que mudaram para C# tendem a pensar em aplicar ponteiros, mas na prática quase nunca você vai precisar deles. Se você necessita fazer uma conversão rápida de um programa C/C++ que usa ponteiro, então pode ser aceitável usar ponteiros emC#, mas você deve considerar apenas como uma medida temporária até que você possa implementar tudo sem ponteiros.
A única vez que os ponteiros podem ser necessários é para fazer uso de chamadas de API no âmbito do subsistema de P/Invoke. Mesmo assim geralmente alternativas, e muitas vezes passando por referencia resolve o mesmo problema de ponteiro para ponteiro. As coisas ficam mais complicadas quando você precisa passar um ponteiro para um bloco de memória e neste caso você pode ter que usar fixed com um array ou alocar memória na pilha e passá-lo diretamente para a chamada da API.

FONTE: http://www.treinaweb.com.br/ler-artigo/25/ponteiros-em-c

Linguagem de Progração C#

O C# (pronuncia-se "C sharp") é uma linguagem de programação criada para o desenvolvimento de uma variedade de aplicações que executam sobre o .NET Framework. C# é uma linguagem simples, poderosa, com tipagem segura e orientada a objetos. As várias inovações no C# permitem o desenvolvimento rápido de aplicações, mantendo a expressividade e a elegância das linguagens C-style.

Feramenta Microsoft Visual C# 2010 Express
Clique na figura para aumentar

Visual C# é uma implementação da linguagem C# pela Microsoft. Visual Studio suporta Visual C# com um editor de código completo, compilador, modelos de projetos, designers, assistentes de código, um depurador poderoso e fácil de usar e outras ferramentas. A biblioteca de classes do .NET Framework fornece acesso a vários serviços do sistema operacional e outras classes úteis e bem estruturadas que aceleram significativamente o ciclo de desenvolvimento.


Feramenta Microsoft Visual C# 2010 Express


Características essenciais do C#: 

Simplicidade: os projetistas de C# costumam dizer que essa linguagem é tão poderosa quanto o C++ e tão simples quanto o Visual Basic;

Completamente orientada a objetos: em C#, qualquer variável tem de fazer parte de uma classe;

Fortemente tipada: isso ajudará a evitar erros por manipulação imprópria de tipos e atribuições incorretas;

Gera código gerenciado: assim como o ambiente .NET é gerenciado, assim também o é C#;

Tudo é um objeto: System.Object é a classe base de todo o sistema de tipos de C#;

Controle de versões: cada assembly gerado, seja como EXE ou DLL, tem informação sobre a versão do código, permitindo a coexistência de dois assemblies homônimos, mas de versões diferentes no mesmo ambiente;

Suporte a código legado: o C# pode interagir com código legado de objetos COM e DLLs escritas em uma linguagem não-gerenciada;

Flexibilidade: se o desenvolvedor precisar usar ponteiros, o C# permite, mas ao custo de desenvolver código não-gerenciado, chamado “unsafe”;

Linguagem gerenciada: os programas desenvolvidos em C# executam num ambiente gerenciado, o que significa que todo o gerenciamento de memória é feito pelo runtime via o GC (Garbage Collector).


domingo, 2 de junho de 2013

Código de Ética para Profissionais de TI

A ética (palavra originada diretamente do latim ethica, e indiretamente do grego ηθική, ethiké), estuda a natureza do que é considerado adequado e moralmente correto. Muito se fala sobre a ética (ou a falta de ética) no Brasil, mas a ética também é muitas vezes violada em TI.

A ACM (Associaction for Computing Machinery ) possui um excelente código de ética para profissionais de engenharia de software, baseado em oito princípios. Para quem não conhece a ACM, ela é a primeira sociedade dedicada a computaçào no mundo e mantém, junto com a IEEE, os principais periódicos, jornais e revistas de computação do mundo.


1. PÚBLICO - Engenheiros de software devem agir de forma coerente com o interesse público.

2. CLIENTE E EMPREGADOR - Engenheiros de software devem agir de uma maneira que é no melhor interesse de seus clientes e empregadores e de acordo com o interesse público.

3. PRODUTO - Engenheiros de software devem assegurar que seus produtos e modificações relacionadas atendam aos mais altos padrões profissionais possíveis.

4. JULGAMENTO - Os engenheiros de software manterão integridade e independência em seu julgamento profissional.

5. GESTÃO - gerentes de engenharia de software e os líderes devem assinar e promover uma abordagem ética para a gestão de desenvolvimento de software e manutenção.

6. PROFISSÃO - Engenheiros de software devem avançar a integridade e reputação da profissão de acordo com o interesse público.

7. COLEGAS - Engenheiros de software devem ser justos e apoiar os seus colegas.

8. SELF - Engenheiros de software devem participar na aprendizagem ao longo da vida em relação à prática de sua profissão e devem promover uma abordagem ética à prática da profissão.

Uma versão mais extensa deste código pode ser encontrada aqui. Um bom passo que profissionais de TI podem fazer para criar um Brasil mais ético é criar uma TI mais ética, onde desenvolvedores busquem incessantemente a qualidade, gerentes sejam mais líderes do que feitores de escravo e que diretores evitem negócios excusos pelo simples prazer do dinheiro pelo dinheiro.



FONTE: http://marcomendes.com/blog/2011/08/codigo-de-etica-para-profissionais-de-ti/
Publicado em 7 de agosto de 2011 por Marco Mendes

sábado, 1 de junho de 2013

PRÁTICA ÉTICA NAS ORGANIZAÇÕES

Ética é um tema fascinante, mas complexo. Fascinante porque em teoria é compreensível e inspirador e complexo porque se dá na prática por meio das pessoas. A Ética é, portanto, um produto das relações humanas. De forma pragmática, a ética se apresenta como o assunto cujo estudo tem tornado possível maximizar a eficácia das relações humanas nas organizações. Em seu sentido mais abrangente, a ética significa o conjunto de valores e da moral que conduzem um indivíduo a tomar decisões, no que se refere principalmente às suas relações com o mundo. Não se pode estudar a ética de forma isolada, mas com foco no ambiente e nas relações humanas ali existentes.

Na busca de facilitar o convívio em sociedade são criadas normas formais, que podem estar escritas ou normas morais, que são simbólicas e se manifestam por comportamentos fortalecidos nas teias sociais ao longo dos anos e é devido a esses atributos que a empresa “Nossa Locadora de Livros” esta no mercado desde 1990. O objetivo das normas é o de se tentar prever, racionalizar e evitar que conflitos éticos ocorram.

A questão ética nas organizações passa pela compreensão da sua cultura organização. Quais os valores e crenças desta organização e como suas questões do cotidiano são resolvidas? Com esse intuito a empresa “Alunos da UNOPAR” patrocinou um seminário a todos os funcionários da empresa “Nossa Locadora de Livros”.

Edgar Schein (1982) define cultura organizacional como sendo um padrão de suposições básicas inventadas, descobertas ou desenvolvidas pelos membros de uma empresa para lidar com problemas de adaptação externa e integração interna.  Estes padrões funcionam com eficácia suficiente para serem considerados válidos e, em seguida, ensinados aos novos membros como a maneira correta de perceber, pensar e sentir esses problemas.

Observa-se que a prática da ética nas organizações, por caminhos formais ou informais, instala-se por referências ideais de comportamentos e procedimentos que servem de guia, modelo e exemplo de ações ou atitudes tidas como aceitas ou recomendadas.

A formalização de um Código de Ética enfrenta um difícil caminho de construção, implementação e manutenção nas organizações.

Na construção, o desafio está em tornar perceptível o que, de fato, se constitui como valor a serviço da visão e da missão da Empresa. A fronteira entre o código de ética de uma empresa e o ideal de comportamento humano pode levar à construção de um produto incompatível com a gestão corporativa. Assim, o produto (código de ética) pode surgir fadado a ser um mero instrumento ilustrativo ou, no máximo, uma ferramenta a serviço da divulgação de imagem da corporação.

Na implementação, o risco consiste em ter um código de ética elaborado, bem redigido, inserido em manuais, mas que não seja do conhecimento das pessoas ou ainda, não seja aceito como padrão efetivo de diretrizes da ação profissional. A implementação de um Código de Ética pressupõe a elaboração de um projeto específico, com ações de treinamento e endomarketing para divulgação e fixação de seu conteúdo como valor para a organização.

Na manutenção de um código de ética é necessário que se tenham os guardiões que, em geral, compõem o Conselho de Ética e têm por objetivo: analisar os casos discrepantes ou não descritos e auxiliar na identificação das necessidades de revisão dos itens existentes, sugerindo acréscimos ou mudanças.

Mesmo quando uma organização não tem um código de ética formal, sempre existe um conjunto de princípios e normas que sustentam as suas práticas.

A maneira como a organização opera, a partir da experiência em diferentes situações, reflete a crença de cada instituição. Essa crença é detalhada no Modelo de Gestão (Fornari, 2004) que tem como ponto de partida a visão e a missão da organização.

Na manutenção, o risco é não manter este código atual e aderente à cultura organizacional da empresa.

Os Valores são afirmações sobre as crenças fundamentais, princípios que podem ser compartilhados, aprendidos e formam a base a partir da qual as ações e decisões organizacionais serão tomadas. O conjunto de valores orienta a definição de políticas e diretrizes, que se consolidam nos hábitos e costumes. Os valores servem de guia para definição de prioridades e de como todos devem se conduzir na busca dos objetivos da organização. Embora tenham caráter permanente, os valores devem ser periodicamente revisitados, para evoluir com a sociedade e com as necessidades da empresa, formando um conjunto vivo de crenças.

Em torno dos valores, as pessoas, constroem modelos de referência para atuar de forma independente e delegada, respeitando seus interesses, crenças e as variações culturais.

Além da declaração de valores, outros artefatos culturais contribuem para disseminar os princípios éticos de uma organização (exemplo dos líderes; código de ética e o conselho de ética).

A ética numa organização, seja ela empresarial ou governamental, deve ser pautada pelos mesmos princípios. Qualquer ação ou decisão, coletiva ou pessoal, não pode prescindir de um comportamento ético, já que os códigos de conduta devem ser uma ferramenta de gestão para estabelecer e articular os valores corporativos, as responsabilidades sociais, e as obrigações da organização que, em última análise, vão definir a forma como atua para atingir os fins coletivos a que se propõe.