Mostrando postagens com marcador Desenvolvimento. Mostrar todas as postagens
Mostrando postagens com marcador Desenvolvimento. Mostrar todas as postagens

Como criar um EventHandler que altera as permissões do próprio item

Criando um EventHandler que altere as permissões do próprio item do SharePoint

Eu pensei que fosse mais simples. Até parece simples, mas quando vc dá o BreakRoleInheritance o SharePoint exige que se tenha uma permissão maior. Assim, se um usuário comum tentar usar, não funciona.

Uma solução óbvia para isto é usar o Runwithelevated que também não funciona. Porque ele eleva o privilégio autorizando a execução desta tarefa. Mas, como está num EventHandler, o seu contexto já está fixado no próprio usuário. Então, o BreakRoleInheritance com o Runwithelevated retiraria a permissão para a execução do próprio evento. Então não funciona.

Se tentar, terá o seguinte erro:

"Access is denied. (Exception from HRESULT: 0x80070005 (E_ACCESSDENIED))

ou melhor

Access is denied. (Exception from HRESULT: 0x80070005 (E_ACCESSDENIED)) at Microsoft.SharePoint.SPGlobal.HandleUnauthorizedAccessException(UnauthorizedAccessException ex) at Microsoft.SharePoint.Library.SPRequest.UpdateRoleAssignment(String bstrUrl, Guid& pguidScopeId, Int32 lPrincipalID, Object& pvarArrIdRolesToAdd, Object& pvarArrIdRolesToRemove) at Microsoft.SharePoint.SPRoleAssignmentCollection.UpdateAssignment(Int32 principalId, SPRoleDefinitionBindingCollection bindings, Boolean addOnly) at Microsoft.SharePoint.SPRoleAssignmentCollection.Add(SPRoleAssignment roleAssignment) at MYDLL.MYDLLHandler.ItemAdded(SPItemEventProperties properties)

Para resolver esta questão, tem que fazer algumas coisas.
O evento possui o properties que possui o ListItem, etc. Você deve ignorar isto e criar um novo ListItem, em um novo contexto. E esta criação deve estar com privilegio elevado.
Após isto, a função BreakRoleInheritance também deve estar com contexto elevado. Veja um exemplo a seguir:


public override void ItemAdded(SPItemEventProperties properties)
{

base.ItemAdded(properties);
SPSecurity.RunWithElevatedPrivileges(delegate()
{

Guid MywebGuid = properties.Web.ID;
Guid MysiteGuid = properties.Site.ID;

this.Web = new SPSite(MysiteGuid).OpenWeb(MywebGuid);
this.ListItem = Web.Lists[properties.ListId].GetItemById(properties.ListItemId);
this.CurrentUserId = properties.CurrentUserId;
ListItem.BreakRoleInheritance(false);
});

}

Utilizando computação paralela massiva para cálculos pesados (C++ AMP)


Trabalhando com cálculos diretamente na placa de vídeo

 
Comparando computação tradicional com a computação paralela massiva na placa de vídeo

Entendendo o Cenário

O C++ AMP é uma extensão do C++ para prover melhor aproveitamento do processador da placa de vídeo. O C++ AMP não é uma linguagem: são algumas bibliotecas de C++ que prontas para trabalhar com a placa de vídeo, intermediada pelo Direct X 11.

O computador pode ter vários aceleradores para cálculos matemáticos. O WARM é um acelerador emulado criado pela Microsoft. A placa de vídeo é outro. Como a placa de vídeo possui centenas de núcleos, o desempenho para cálculos paralelos é notavelmente maior do que o desempenho da CPU.
Em C++ escreve-se códigos com algumas alterações indicando que cálculos devem ser movidos para ser calculados na placa de vídeo e quais não vão. Existem códigos que facilitam esta sincronização.

O exemplo deste artigo é um algoritmo que realiza a multiplicação de matrizes quadradas com diferentes tamanhos. Um temporizador fica ligado enquanto a execução ocorre. Após isto tem-se o tempo necessário para execução direta na CPU, para execução direta na GPU.

 

Configuração do computador(CPU)

Este exemplo foi executado num notebook acer Intel Core i3 com 6 GB de memória RAM, rodando o Windows 8. Mais detalhes estão disponíveis a seguir:
Time of this report
01/10/2013, 15:09:33
Operating System
Windows 8 Enterprise 64-bit (6.2, Build 9200) (9200.win8_gdr.130531-1504)
Language
Portuguese (Regional Setting: Portuguese)
System Manufacturer
Acer
System Model
Aspire E1-471
BIOS
InsydeH2O Version 03.72.02V1.24
Processor
Intel(R) Core(TM) i3-2328M CPU @ 2.20GHz (4 CPUs), ~2.2GHz
Memory
6144MB RAM
Available OS Memory
5980MB RAM
Page File
4703MB used, 2236MB available
DirectX Version
DirectX 11
System DPI Setting
96 DPI (100 percent)
DxDiag Version
6.02.9200.16384 64bit Unicode

 

Configuração da Placa gráfica (GPU)

A Placa de vídeo utilizada para o cálculo é uma Intel(R) HD Graphics 3000, onboard, comum de vários notebooks atuais do mercado. Para mais detalhes veja a seguir:
Card name
Intel(R) HD Graphics 3000
Manufacturer
Intel Corporation
Chip type
Intel(R) HD Graphics Family
DAC type
Internal
Device Type
Full Device
Display Memory
1760 MB
Dedicated Memory
128 MB
Shared Memory
1632 MB
Current Mode
1366 x 768 (32 bit) (60Hz)
Monitor Name
Monitor Genérico PnP
Monitor Model
Unknown
Monitor Id
AUO183C
Native Mode
1366 x 768(p) (60.098Hz)
Output Type
Internal
Driver File Version
9.17.0010.2932 (English)
Driver Version
9.17.10.2932
Graphics Preemption
DMA
Compute Preemption
DMA
Driver Attributes
Final Retail
Driver Date/Size
12/14/2012 02:42:34, 12615680 bytes
D3D9 Overlay
Supported
DXVA-HD
Supported
DDraw Status
Enabled
D3D Status
Enabled
AGP Status
Enabled

 

Algorítmo

O algoritmo foi construído com base em exemplos disponíveis gratuitamente na internet e com base na minha experiência.

 

Multiplicação de matriz na CPU

Um método chamado multiply_matrix_cpu é o responsável por realizar a multiplicação de matrizes na CPU.

Multiplicação de Matrizes pela CPU


Multiplicação de Matriz na GPU

Um método chamado multiply_matrix_gpu é o responsável por realizar a multiplicação de matrizes na GPU.

Multiplicação de Matrizes pela GPU


Método Principal

No método principal um temporizador é ligado antes e depois de cada execução. Foram separadas 3 execuções, uma para cada tipo: CPU e GPU. Na tela da aplicação o tempo corrido fica disponível.

Tempo de execução

A tabela a seguir é uma amostra de tempo em segundos para a execução.
Tabela comparativa para multiplicação de matrizes na CPU e na GPU


O gráfico valoriza a diferença de tempo de execução entre a CPU e a GPU. A execução na GPU mostra um desempenho mais acentuado quando comparada a CPU na matriz de 1024x1024 com a diferença de 12,1s entre a CPU e a GPU.
    
A execução tradicional da CPU mostrou-se o pior cenário. Chegando a 13940s (3,8 horas) para multiplicar uma matriz de 8192x8192 contra 9981,02s (2,7 horas) da GPU.

Gráfico comparativo para multiplicação de matrizes na CPU e na GPU

Conclusão

A utilização do C++ AMP para multiplicação de matrizes quadradas garante uma eficiência de até 1.1 hora para amostras grandes como 8192x8192, que é computado em quase 4 horas na CPU e em quase 3 horas na GPU.
Este exemplo mostra com clareza que a GPU possui considerável superioridade à CPU para realização de cálculos matemáticos.

Como exibir uma lista de um site SharePoint em outro site SharePoint?

Como faz para exibir listas do SharePoint em outros sites SharePoint?

Este é um problema bastante comum. A falta de um mecanismo simples que possibilite esta estrutura gera alguns problemas graves na disposição das informações dentro do portal. Em algumas situações, portais guardam listas em sites que não fazem sentido, apenas para linkar com colunas de consulta (Lookup).

Este tópico mostra um método utilizado para mostrar uma lista do SharePoint, com capacidades plenas, em qualquer site SharePoint do mesmo site collection. O exemplo exibido mostra 2 subsites. Um deles com uma lista e uma biblioteca. Tanto a lista quant a biblioteca serão, também, exibidos no site raiz.

1 - Um site SharePoint de teste é exibido. Nele pode-se ver 2 subsites, chamados Subsite1 e Subsite2

2 - Dentro do subsite1 pode-se ver uma lista de exemplo com 3 colunas, e vários ítens.
3 - Também dentro do subsite1 pode-se ver uma biblioteca com alugumas colunas sendo exibidas, com 5 documentos.
4 - Agora. abra o SharePoint Designer 2010.
5 - No SharePoint Desiner 2010, o subsite1 é aberto.
6 - Após, a lista de teste é aberta.
7 - Mais a seguir, após clicar na lista, abre-se a aba 'WebPart' e entra na opção 'Para Arquivo'.
8 - Salva o arquivo *.webpart gerado a partir da lista.
9 - Após, a biblioteca de teste é aberta.
10 - Mais a seguir, após clicar na biblioteca, abre-se a aba 'WebPart' e entra na opção 'Para Arquivo'.

11 - Mais a seguir, abre-se a pagina default.aspx do site raiz. E a coloca em modo de edição.

12 - Abre-se a tela de modo de edição.
13 - Na tela de edição, utiliza-se o 'Carregar uma Web Part'
14 - A webPart gerada da lista de teste é selecionada e exibida na lista de 'WebParts importadas'.
15 - A WebPart que refere-se a lista é exibida na pagina.
16 - Abre-se a tela de modo de edição.
Na tela de edição, utiliza-se o 'Carregar uma Web Part'
É selecionada a WebPart que refere-se a biblioteca.
17 - A WebPart da biblioteca é exibida na primeira pagina, na WebPartZone  direita.

Como configurar um serviço do windows via linha de comando?

Instalando Windows Service por Command-line

Como instalar um Windows Service qualquer com linha linha de comando?

Muitas vezes é necessário instalar Serviços do Windows. Serviços construídos em C#, em C++, em VB, ou qualquer outra linguagem. A construção de instaladores nem sempre é a mais simples ou eficiente no momento. A utilização de linhas de comando torna simples a manipulação dos serviços.

Como fazer a instalação de um windows service via linha de comando?

SC CREATE "Nome do Windows Service" binpath= "C:\caminhoDoWindowsService\WindowsService.exe"

Como desinstalar um windows service via linha de comando?

SC DELETE "Nome do Windows Service"

Como dar Start em um windows service via linha de comando?

SC START "Nome do Windows Service"

Como parar um windows service via linha de comando?

SC STOP "Nome do Windows Service"

Como reiniciar um windows service pausado via linha de comando?

SC CONTINUE "Nome do Windows Service"

O que é Mock em Teste Unitário?

O que é Mock?

Como mockar uma classe em C# .NET ?

Mock é uma técnica para simular o comportamento de estruturas de programação. A utilização desta técnica é fundamental para a validação do layout do código sem afetar ou depender o ambiente em questão.O termo Mock vem do ingles e significa algo como imitação, zombaria, falsidade.

Os testes unitários têm a responsabilidade de garantir que os retornos dos métodos estejam de acordo com as expectativas.Os testes unitários não podem depender da rede estar ativa, ou pastas de rede, servidores ou quaisquer outras dependencias externas. Os testes de integração são responsáveis por testar tais características do ambiente.

Quando existe a necessidade de testar unitáriamente um método que realize uma tarefa que dependa de algum recurso externo é necessário o uso de um Mock. É comum utilizar o neologismo mockar ("...é necessário mockar esta classe").

A seguir pode-se ver um exemplo de classe. Este exemplo refere-se ao código de uma aplicação que guarda um arquivo texto em um local temporário da maquina. A classe Archiver implementa a interface IArchiver. Ela é especialmente útil para que seja possível mockar esta classe.

namespace Anselme.Mock
{
    public class Archiver : Anselme.Mock.IArchiver
    {
        public ArchiverState Save(string filename, string file)
        {
            string path = System.IO.Path.GetTempPath();
            string completeFileName = string.Concat(path,filename);

            using (System.IO.StreamWriter sw = new System.IO.StreamWriter(completeFileName))
            {
                sw.Write(file);
            }
            return ArchiverState.Saved;
        }
        public string Load(string filename)
        {
            string path = System.IO.Path.GetTempPath();
            string completeFileName = string.Concat(path, filename);

            using (System.IO.StreamReader sr = new System.IO.StreamReader(completeFileName))
            {
                return sr.ReadToEnd();
            }
        }
    }
}

A inteface IArchiver, como eu disse, é um requisito para que eu possa testar unitariamente esta classe com Mock. A seguir, veja o código dela.

namespace Anselme.Mock
{
    public interface IArchiver
    {
        string Load(string filename);
        ArchiverState Save(string filename, string file);
    }
}

Note que o método Save possui um retorno do tipo ArchiverState. Este ArchiverState é uma Enumeração. Ela foi utilizada intensionalmente para gerar algum retorno nesta classe para que ela possa ser testada unitariamente sem a necessidade de verificar se o arquivo está armazenado no disco. Segue o código da enumeracao ArchiverState.

namespace Anselme.Mock
{
    public enum ArchiverState
    {
        Saved
    }
}

O que é MOQ?

Existem vários frameworks para auxiliar na criação de simulações de classes, ou mock. Estes frameworks são de empresas ou grupos independentes. Este tópico utiliza o Framework MOQ que é de simples utilização, bastante eficiente e gratuíto.

O moq possui estruturas para você simular alguma classe por meio da interface que a classe implementa. Com este framework é possível, por exemplo, configurar uma estrutura para que, toda vez que um determinado cenário for criado, um determinado retorno ocorra.

O framework moq pode ser baixado no link: MOQ Framework. Este tópico é feito com base na versão Moq.4.0.10827.Final, Checksum: c9626fcdd253c5a6e33056a2670911b6340cc302

 

Como funciona o Teste unitário com Mock, utilizando o Framework MOQ?

Para ver detalhes sobre como criar um teste unitário veja o link: O que é teste unitário? 
 
O teste unitário a seguir utiliza o Framework MOQ. Ele mostra um exemplo simples de teste do método Save, visto no código do inicio do post.

namespace ArchiverTest
{
    [TestClass()]
    public class ArchiverTest
    {
        [TestMethod()]
        public void Salvando_Um_Arquivo_Com_Texto_Pequeno()
        {

            string filename = string.Format("{0}.{1}",TestUtil.CreateRandomString(5), TestUtil.CreateRandomString(3));
            string file = TestUtil.CreateRandomString(5);

            var target = new Mock();
            target.Setup(t => t.Save(filename, file))
                .Returns(ArchiverState.Saved);

            IArchiver target_mock = target.Object;
            ArchiverState state = target_mock.Save(filename, file);
            Assert.AreEqual(ArchiverState.Saved, state);
        }
     }
}

Principais linhas comentadas

var target = new Mock();
Cria-se o Mock da interface IArchiver. Com isto é possível simular os método, propriedade e eventos contidos na interface.

target.Setup(t => t.Save(filename, file))
                .Returns(ArchiverState.Saved);
Com isto, toda vez que se chamar o método Save seu retorno será  ArchiverState.Saved, como já implementado.

IArchiver target_mock = target.Object;
Cria-se um Archiver mockado.

ArchiverState state = target_mock.Save(filename, file);
Obtem-se o resultado do método Save, já configurado.

Assert.AreEqual(ArchiverState.Saved, state);
Verificação se o retorno é o esperado.



Como funciona a arquitetura do Windows Workflow Foundation?

O Windows Workflow Foundation é um dos pilares do .NET Framework presente desde a versão 3.0. Ele foi desenhado para trabalhar em conjunto com os pilares de Apresentação (WPF), comunicação (WCF) e de gerenciamento de identidade (WCS que evoluiu para WIF).

O Windows Workflow Foundation foi desenhado para possibilitar uma manipulação mais eficiente das execuções das regras de negócio, em especial quando existe interação humana no decorrer. A colaboração é um dos principais motores do uso do WF.

O Windows Workflow Foundation foi imaginado inicialmente para quarto cenários básicos. Em todos os cenários os workflows são capazes de executar tarefas colaborativas como: roteamento de solicitações entre usuários, atribuição de atividades, definição de processos de aprovação, procedimento em escala (paralelização de atividades), colaboração com documentos e dados, entre outros.

 

SharePoint 2007 e Workflow

Os fluxos hospedados no SharePoint podem ser construídos no Visual Studio, no SharePoint Designer ou nativamente no próprio SharePoint. A escolha varia de acordo com a complexidade do fluxo em questão.

 

Workflow e Serviços WCF

É possível construir fluxos que fazem acesso a serviços WCF, ou serviços WCF que hospedem Workflows.

 

Apresentação de fluxo coordenado

Aplicações Windows, Web, Mobile ou quaisquer outras ferramentas de apresentação podem ser utilizadas como camadas de apresentação para workflows.

 

Projeto de workflow Re-hosting

Aplicações podem hospedar o Workflow Designer e possibilitar a edição de fluxos sem dependência de ferramentas como o Visual Studio. Isto é especialmente útil para usuários da área de processos.

 

Topologia

 

Divisão de camadas

Os workflows do .NET Framework possui uma topologia que garante que sempre sejam estruturados em pelo menos 3 camadas: Presentation Layer, Workflow Runtime e Business Logical Layer.

 

Presentation Layer

A camada de apresentação pode ser uma aplicação em ASP.NET, Windows Forms, WPF, Windows Mobile, Email ou outros. A apresentação pode exibir notificações enviadas pela Workflow Runtime para alertar sobre a mudança de alguma característica relevante de algum fluxo.

 

Workflow Runtime

Este é a principal camada sistêmica. Ela possui as definições específicas do workflow e suas regras. E ele é o responsável por realizar a persistência de seus dados e informações, além de persistir a história do fluxo.

 

Business Logical Layer

A camada de negócios é a responsável por aplicar regras inerentes ao negócio, chamadas a estruturas externas, chamadas a outros serviços, etc.

 

Conceitos importantes

Tasks / Notifications

O sistema possui duas formas de se comunicar com o humano em workflows do WF: Tarefas e Notificações. Quando o workflow solicita algo ao usuário ele gera uma tarefa, que cabe ao usuário resolver; quando o sistema deseja informar o usuário sobre alguma mudança ocorrida em algum fluxo faz-se uma notificação.

 

Activity

Atividades são blocos de códigos estruturados que possuem funções e parâmetros próprios. Um workflow é composto de várias atividades. A notificação ou a atribuição de uma tarefa para o usuário é uma atividade.

 

Persistence

A persistência é feita pelo WF quando as estruturas de código estão prontas para serem serializadas. Isto é especialmente importante em fluxos que podem demorar. Isto porque o workflow para de consumir a memória do computador para utilizar o banco de dados. Quando o dado em questão for novamente necessário ele é desserializado e reutilizado pelo workflow. O processo de serialização é conhecido como ‘Desidratação do código’ e o processo de desserialização é conhecido como ‘Reidratação do código’.

 

Tracking

À medida que as atividades vão acontecendo o Workflow Runtime pode armazenar estes dados para fins de auditoria, isto é chamado de tracking.