Monday, November 26, 2007

Power Toys XP

Divulgou um colega uma pequena ferramenta, ou melhor, um conjunto de ferramentas que podem ser bastante úteis.

Tratam-se de ferramentas / brinquedos que trabalham em cima de aplicações já deployed.

Experimentei esta: Alt-Tab Replacement

E é engraçado! :) Trata-se de uma variante ao habitual alt-tab, mas com a particularidade de ver um screenshot da aplicação por onde 'passamos'.

A janela é qualquer coisa como isto (trata-se da janelita azul por cima do wexplorer):

Mas há mais!

Cá fica o link: http://www.microsoft.com/windowsxp/downloads/powertoys/xppowertoys.mspx

Tecniquem! ;)

Friday, July 27, 2007

SQL: Actualizar um campo do tipo Text ou NText

Um campo Text ou NText é tratado de forma um pouco diferente dos datatypes mais habituais do SQL (os int, varchar, char, etc...). Uma das diferenças é precisamente na forma como são feitas actualizaçãoes dos conteúdos de campos deste tipo.

O exemplo seguinte mostra um replace sobre um campo do tipo varchar:

create table #minhatabela (meucampo varchar(50))

insert #minhatabela values('meu teste')
select * from #minhatabela


update #minhatabela set meucampo = replace(meucampo, 'meu ', 'meu novo ')
select * from #minhatabela


drop table #minhatabela

No entanto, fazer a mesma coisa sobre um campo do tipo Text ou Ntext retorna um erro, como mostra o exemplo seguinte:

create table #minhatabela (meucampo text)

insert #minhatabela values('meu teste')
select * from #minhatabela

update #minhatabela set meucampo = replace(meucampo, 'meu ', 'meu novo ')
select * from #minhatabela

drop table #minhatabela

Este pequeno script SQL retorn o seguinte erro:

Msg 8116, Level 16, State 1, Line 6
Argument data type text is invalid for argument 1 of replace function.


Actualizar o campo do tipo Text ou NText

Então para actualizar um campo do tipo Text ou NText, é necessário utilizar um apontador para o campo a actualizar. Esse apontador deverá ser do tipo binary.
É ainda necessário identificar a posição a partir da qual se pretende actualizar.
Depois, identificando a tabela a actualizar, o apontador, a posição inicial, e o que se pretende fazer, utilizamos a instrução UPDATETEXT.

A instrução UPDATETEXT pode ser utilizada de diferentes formas: para inserir caracteres no inicio, no meio, no fim do campo, ou simplesmente para eliminar dados.

Segue-se um exemplo que inclui as diferentes utilizações da instrução UPDATETEXT:

create table #minhatabela (meucampo ntext)

insert #minhatabela values('bd')

DECLARE @ptrval binary(16), @i int

SELECT @ptrval = TEXTPTR(meucampo) FROM #minhatabela

-- Insere o caracter 'a' no inicio do conteudo do campo
UPDATETEXT #minhatabela.meucampo @ptrval 0 0 'a'
select * from #minhatabela

-- Insere o caracter 'c' no meio do conteudo do campo
UPDATETEXT #minhatabela.meucampo @ptrval 2 0 'c'
select * from #minhatabela

-- Insere o caracter 'e' no fim do conteudo do campo
set @i=(select DATALENGTH(meucampo) from #minhatabela)/2 -- Utilizar 2 apenas se se tratar de um campo do tipo NText (2 bytes/character)
UPDATETEXT #minhatabela.meucampo @ptrval @i 0 'e'
select * from #minhatabela

-- Elimina o primeiro caracter do conteudo do campo
UPDATETEXT #minhatabela.meucampo @ptrval 0 1
select * from #minhatabela

drop table #minhatabela

Length de campos Text ou NText

Apenas uma nota final. Mais uma das diferenças no tratamento deste tipo de datatypes é na utilização de instruções que permitam obter o tamanho do conteudo do campo. Usualmente é utilizada a instrução LEN, mas com campos do tipo Text e NText, a utilização desta instrução devolve um erro. Assim, a instrução a utilizar para obter o tamanho do conteúdo de um campo do tipo Text ou NText é a instrução DATALENGTH, de resto já utilizada nos exemplos acima.


E pronto! Estas foram algumas considerações sobre a manipulação de campos do tipo Text ou NText.
Um site que contém mais informação sobre a manipulação de campos deste tipo é este: http://msdn2.microsoft.com/en-us/library/aa175795(sql.80).aspx

Have fun! :)

Monday, June 4, 2007

DTS no SQL Server 2005

Para quem ainda não "domina" a construção de DTS com o SQL Server 2005, aqui ficam uns links que podem ser úteis.

Creating your first DTS Project:
http://www.extremeexperts.com/sql/Yukon/YukonDTS.aspx

Introduction to DTS in SQL Server 2005:
http://www.sqlservercentral.com/columnists/vkumar/introductiontodtsinsqlserver2005.asp

E já agora, por curiosidade...

O Yukon:
http://www.codeproject.com/useritems/Features_of_Yukon.asp

Divirtam-se! ;)

Tuesday, May 22, 2007

O protocolo HTTP - um pequeno review...

O protocolo HTTP disponibiliza dois tipos de operações:

- HTTP Requests
- HTTP Responses

Em que consistem? Ora então, muito resumidadmente...

HTTP Requests
Um HTTP Request consiste num request method, um request URL, header fields, e um body.

O HTTP 1.1 define os seguintes request methods:
GET: Devolve o recurso identificado pelo request URL
HEAD: Devolve os headers identificados pelo request URL
POST: Envia dados de tamanho ilimitado para o Web Server
PUT: Armazena um recurso sob o request URL
DELETE: Remove o recurso identificado pelo request URL
OPTIONS: Devolve os HTTP methods que o servidor suporta
TRACE: Devolve os header fields enviados com o TRACE request

O HTTP 1.0 inclui apenas os seguintes request methods: GET, HEAD e POST.

HTTP Responses
Um HTTP response contém um result code, header fields e um body.

O protocolo HTTP espera que o result code e todos os header fields sejam devolvidos antes de qualquer conteúdo do body.

Alguns dos status code mais usados incluem:
404: O recurso solicitado não está disponivel
401: O request exige HTTP authentication
500: Ocorreu um erro no HTTP server que impediu que este respondesse ao request
503: O HTTP server está temporariamente overloaded e indisponivel para atender o request

Uma pequena aplicação bastante útil para ver (entre outras coisas) o tráfego HTTP é o Fiddler (http://www.fiddlertool.com/fiddler/). Sugiro que façam o download e experimentem! É freeware!

E pronto!

Divirtam-se! ;)

Tuesday, May 15, 2007

Programação Orientada ao Negócio (PON)?

Sim, fui eu que inventei o termo! :) (Se bem que já espreitei este tema na net e acho que o termo não é lá muito original :))

Também podia ser BOP (Business Oriented Programming), p'ra dar um ar mais académico à coisa! :))

O que é?

Esta estratégia de desenho/implementação parece estar a ganhar cada vez mais força. Trata-se de pensar num sistema pensando primariamente nas necessidades de negócio, ie, nas necessidades dos clientes (utilizadores) do sistema.

Não é fácil! Muda um pouco (muito!) o algoritmo mental, habituado a pensar mais em pormenores técnicos do que na vertente de negócio.

Li uma noticia na net sobre um empresário da Escandinávia que reformulou uma companhia aérea, focando a estratégia da organização nos passageiros, e não tanto nos aviões, nas infraestruturas e outros factores que para o cliente não interessam primariamente.

Cito: "Hoje, nas reuniões de planeamento de sites, felizmente vejo uma preocupação maior em servir o usuário. Antes, as reuniões eram sobre o servidor X ou tecnologia Y. Por que hão-de o servidor X e a Tecnologia Y ter impacto na satisfação do meu utilizador?"
http://webinsider.uol.com.br/index.php/2007/05/14/web-20-oferece-momento-unico-a-cada-acesso

Como é que isso afecta a minha forma de programar?

Bem, são inúmeras as coisas que 'mudam' ao adoptar esta abordagem. Eu própria ainda ando a descobrir algumas! :)

Mas aqui ficam já algumas dicas.

- Nomes dos objectos:
. Os nomes que damos aos objectos devem reflectir aquilo que eles de facto são. Por exemplo, o objecto Produto diz-nos que a sua responsabilidade é lidar com as funcionalidades de manipulação de Produtos.

- Nomes dos métodos:
. Os métodos devem ter nomes significativos para o negócio, nao para o código! Por exemplo, nomes como somarValores(), ou adicionarLinha() não dizem muito sobre o negócio. Mas por exemplo, nomes como calcularPreco() ou adicionarProduto() são já mais elucidativos.

- Trabalhar a partir do Domain Model, não das Vistas:
. Aprendi da pior forma que esta é a abordagem correcta! :) Lembram-se do MVC (alguns posts atrás)? Pois então! A vista é manipulada pelo Controlador, com base no Modelo. Não o contrário! Há alguns dias tive de implementar uma alteração (de negócio!) a um sistema, e comecei por onde? Pela Vista... Pois! Devia ter começado pelo Modelo, porque se o tivesse feito iria perceber que as horas que perdi a mexer na Vista quase não teriam sido necessárias, já que se tratava de uma alteração ao Modelo, que iria afectar a Vista. Não o contrário!

Estas são apenas algumas dicas, de entre muitas.

O cerne da questão é a orientação ao negócio como ponto de partida. Ao pensar assim, o passo seguinte é olhar para o Modelo, que, precisamente(!), modela o negócio. Tudo o resto acaba depois por fluir.

Não é muito fácil, porque é acima de tudo uma mudança de mentalidade. Mas compensa!

Divirtam-se! ;)

Monday, May 14, 2007

"Tecnicisses" ou "Tecnicices"?

Pois é... Mudei de endereço...

O "Tecnicisses" não me soava nada bem. Este já me parece melhor! :))

Bem vindos!! (outra vez... :))

Friday, May 11, 2007

Google-it!!

Os senhores da Google realmente não param de surpreender!

Agora é possivel personalizar a página inicial do Google, fazendo o acesso pela conta do GMail.
Conseguimos ter na página inicial as ultimas noticias, o tempo, as horas, conseguimos monitorizar a mailbox do GMail, e tudo de forma muito facilmente configurável! É só fazer drag-and-drop e já está!

Cá fica o link: http://www.google.pt/ig

Divirtam-se! ;)

Monday, May 7, 2007

SQL - Que colunas devo indexar? (Optimização de Indexes)

Uma das dificuldades com que os programadores de bases de dados se deparam é saber escolher quais as colunas de uma tabela que devo escolher para indexar de forma a conseguir optimizações de performance quando a query é executada.

Espreitei um site que tem alguns guidelines que podem ajudar, e que aqui enumero resumidamente.

- Antes de começar a indexar tabelas, perceber os tipos de queries que serão executadas sobre elas.

Como identificar as queries mais frequentes: correr um Profiler sobre a Base de Dados
Após identificar as queries principias, como decidir quais os melhores indexes a criar: correr cada query no Query Analizer, examinando o seu Execution Plan.

Quando os indexes necessários tiverem sido identificados, então começar a indexar!

- Cada tabela deve ter, pelo menos, um clustered index.

O clustered index deve ser construido sobre uma coluna cujos valores se autoincrementam e são unicos. Regra geral, as chaves primárias são ideais para isso.

- Deve considerar-se a hipotese de indexar todas as colunas que sejam acedidas através de WHERE, ORDER BY, GROUP BY, TOP, e DISTINCT.

Sem um index, estas colunas são potenciais alvos de table scans, que afectam a performance. No entanto, há que ter em atenção diferentes queries que utilizam as mesmas colunas. Um index para uma query pode não ser o melhor index para outra query. É necessário algum bom senso.

- Indexes que podem não ser optimizados.

Há diferentes formas de indexar colunas: clustered, non-clustered, indexes compostos por várias colunas, definição do FILLFACTOR (parâmetro que define a percentagem de ocupação de cada 'página' do index), definição do PAD_INDEX (parâmetro que define quanto espaço livre é deixado em cada 'página' do index). Não há uma resposta fácil para decidir qual o melhor método, pelo que o ideal é fazer várias tentativas, e perceber qual o index mais optimizado.

- Criar apenas os indexes necessários.

Criar apenas os indexes que serão de facto utilizados nas queries de que estas tabelas serão alvo.

- Tabelas estáticas.

As tabelas que praticamente não são mexidas (por exemplo, as tabelas de metadados) podem ser alvo de mais indexes, o que não quer dizer que se indexem todas as colunas! Devem ser criados apenas os indexes necessários, porque cada index que é adicionado aumenta o tempo de execução de operações como INSERTs, UPDATES e DELETES. Estas tabelas devem ser criadas com um FILLFACTOR de 100, para garantir que não há desperdício de espaço.

- Não adicionar o mesmo index duas vezes.

Acontece, por exemplo, quando criamos uma chave primária, que automaticamente cria um index para essa coluna. Ao criar um novo index que inclui a mesma coluna, estamos a duplicar o index, já que o SQL permite ter indexes 'repetidos', desde que o nome dos indexes seja diferente.

- Eliminar indexes que não são utilizados.

Porque:
. Atrasam as operações de alteração de dados
. Causam acessos desnecessários ao disco
. Desperdiçam espaço na base de dados
. Aumentam o tempo de backup e restore de base de dados

E ainda, uma sugerida por um colega de trabalho:

- Indexar colunas com maior numero de valores diferentes.

Dentre as colunas existentes na instrução de SELECT, verificar as que apresentam maior disparidade de valores, e indexá-las.

E pronto!

Estas e outras guidelines em:
http://www.sql-server-performance.com/optimizing_indexes.asp

Divirtam-se ;)

Tuesday, April 17, 2007

Ainda Design Patterns...

Ainda no seguimento do tópico Patterns, resolvi abordar um pouco mais os Design Patterns. Estou a ler algumas passagens do livro do GoF e aqui estão algumas impressões gerais, que podem ser interessantes.

O que é um Design Pattern?

Cristopher Alexander, um arquitecto que trouxe à tona este topico na decada de 70, no contexto da construção, dá uma definição de Patterns: "Each pattern describes a problem which occurs over and over in our environment, and then describes the core of the solution to that problem, in such a way that you can use this solution a million times over, without ever doing it in the same way twice."

Os Patterns recorrentes pretendem resolver problemas de desenho e construir desenhos orientados a objectos mais flexiveis, elegantes, e reutilizaveis. Ajudam a construir novos desenhos baseados em experiencias anteriores de desenho e arquitecturas de sistemas.

Em geral, um pattern tem quatro elementos essenciais:
- Nome: descreve o problema de desenho, as suas soluções e consequencias, numa palavra ou duas. Dar nome a um pattern aumenta o nosso vocabulario de desenho!
- Problema: descreve quando aplicar o Pattern. Explica o problema e o seu contexto.
- Solução: descreve os elementos que constituem o desenho, as suas relações, responsabilidades e colaborações. Não descreve um desenho ou uma implementação em concreto, porque um Pattern é uma especie de template que pode ser aplicado em diferentes situações. O Pattern fornece uma descrição abstracta de um problema de desenho e como uma organização genérica dos elementos o resolve.
- Consequências: são o resultado e as vantagens de aplicar o Pattern. Dado que a reutilização é importante no desenho orientado a objectos, as consequências de aplicar um Pattern devem incluir o impacto que tem a solução.

Esta abordagem a Design Patterns (a feita no livro do GoF) descreve-os como "descrições de objectos e classes que comunicam entre si, customizados para resolver problemas de desenho genéricos num contexto especifico". No entanto, num tema tão aberto como este, as abordagens acabam por também variar. Há que escolher a mais adequada ao nosso contexto em cada momento.

Assim.....

Como escolher um Design Pattern

Há MUITOS Design Patterns catalogados, uns mais divulgados que outros. Por isso, como escolher dentre uma miriade de Patterns, a maioria deles provavelmente sendo novidade para nós? (Ok, são só umas dezenas valentes... mas pronto... :))

O GoF dá uma ajudinha, fornecendo diferentes abordagens para encontrar o Design Pattern mais adequado.

- Analiza como os Design Patterns resolvem problemas de desenho
- Percebe o objectivo do Pattern
- Estuda como os Patterns se relacionam entre si
- Estuda Patterns de objectivos similares
- Examina a causa que levou à necessidade de redesenhar
- Considera o que deve ser variável no desenho sem ter de redesenhar

Esta abordagem aos Design Patterns é naturalmente muito vocacionada ao contexto apresentado pelo GoF. Mas mesmo generalizando, há pontos em comum com as nossas realidades que podem até ser um pouco diferentes, mas às quais podemos adaptar alguns destes principios.


Espero que pelo menos sirvam como bom ponto de partida para passarmos a utilizar Patterns em geral!

Divirtam-se! :)

Wednesday, April 11, 2007

Patterns - Architectural, Design e outros...

Estive a preparar uma pequena apresentação sobre Patterns, um tópico alvo de algumas discussões e diferenças de opinião, já que não é ainda um conceito 'completo', está ainda em evolução e é susceptivel de diferentes abordagens!

Mas alguns (sub?) conceitos começam já a tomar forma, e é sobre esses que escolhi falar.
Cá vai então um resumo do tema.

O que são Patterns?
Há várias definições à volta desse termo.
"Uma solução para um problema num dado contexto"
"Formas de dividir um problema"
"Desenho que endereça um problema recorrente em sistemas OO"
"Orientada à resolução de problemas em design mode"

Escolhi os seguintes tópicos, que creio definem bem o que são Patterns:
- Menos focado em tencologia, e mais numa cultura de documentação e suporte de desenho
- Cada padrão é uma regra de 3 partes, que expressa a relação entre um determinado contexto, um problema e uma solução
- Um padrão faz mais do que identificar uma solução; tambem explica porque a solução é necessária!

Porque usar?
Parte do interesse em Patterns advem de "observarmos que o projecto falha, apesar de utilizar a ultima tecnologia, porque tem falta de soluções comuns!"

São "best practices"
Permitem definir regras no desenho de soluções
Fornece uma base de trabalho, onde tudo 'encaixa'

Tipos de Patterns
Devido à grande aceitação do livro do Gang of Four, os design patterns tornaram-se comuns. São OO Design Patterns (há outros tipos de patterns)


Os que escolhi:
- Architectural Patterns:
. Expressam uma organização estrutural fundamental ou um esquema para sistemas de software. . Fornecem um conjunto de subsistemas predefinidos, especifica as suas responsabilidades, e inclui regras e guidelines para organizar as relações entre eles.

- Design Patterns:
. Fornece um esquema para refinar os subsistemas ou componentes de um sistema de software, ou as relações entre eles.
Descrevem a estrutura recorrente de comunicação entre componentes que resolve um problema de desenho num dado contexto.

Anti-patterns:
Se um Pattern representa "best practices", um anti-pattern representa "lessons learned".

Duas abordagens comuns de anti-patterns:
- a que descreve uma má solução para um problema que resultou numa má situação
- a que descreve como sair de uma má situação e avançar para uma boa situação

Porque "Identificar más práticas pode ser tão valioso como identificar boas práticas".

Em Detalhe - Design Patterns:

- Definição simplista: "Um design pattern consiste em vários objectos que colaboram entre si (classes, relações, etc...). Fornecem soluções para problemas de desenho comuns. Oferecem um idioma consistente entre quem desenha e quem implementa (permitem comunicar utilizando nomes bem conhecidos para as interações de software).
- Não é código. É uma abordagem, um template, um modelo, que pode ser utilizado para resolver um problema.
- (Algoritmos nao sao Design Patterns, porque resolvem problemas computacionais e nao problemas de desenho)
- O principio basico da utilização de patterns é a reutilização.

Exemplo de um design pattern utilizado num projecto da Lucent:

Description
Name:
Try All Hardware Combos
Problem: The control complex of a fault-tolerant system can arrange its subsystems in many different configurations. There are many possible paths through the subsystems. How do you select a workable configuration when there is a faulty subsystem?
Context: The processing complex has several duplicated subsystems including a CPU, static and dynamic memory, and several busses. Standby units increase system reliability. 16 possible configurations (64 in the 4 ESS) of these subsystems give fully duplicated sparing in the 5ESS. Each such configuration is called a configuration state.
Forces: You want to catch and remedy single, isolated errors. You also want to catch errors that aren't easily detected in isolation but result from interaction between modules. You sometimes must catch multiple concurrent errors. The CPU can't sequence subsystems through configurations since it may itself be faulty. The machine should recover by itself without human intervention, many high-availability system failures come from operator errors, not primary system errors. We want to reserve human expertise for problems requiring only the deepest insights.
Solution: Maintain a 16-state counter in hardware called the configuration counter. There is a table that maps that counter onto a configuration state. The 5ESS switch tries all side 0 units (a complete failure group), then all side 1 units (the other failure group), seeking an isolated failure. When a reboot fails, the state increments and the system tries to reboot again. The subsequent counting states look for multiple concurrent failures caused by interactions between system modules.
Resulting Context: Sometimes the fault isn't detected during the reboot because latent diagnostic tasks elicit the errors. The pattern Fool Me Once solves this problem. And sometimes going through all the counter states isn't enough; see the patterns Don't Trust Anyone and Analog Timer.
Rationale: The design is based on hardware module design failure rates (in Failures in a trillion (FITs)) of the hardware modules. The pattern recalls the extreme caution of first-generation developers of stored program control switching systems.


Porque é considerado um bom Pattern:
- Resolve um problema concreto
- É fundamentado e documentado
- Como a solução não é óbvia, fornece a abordagem necessária à solução do problema
- Descreve relações
- Tem uma componente humana significativa (o software é feito para humanos)

Em Detalhe - Architectural Patterns
- São padrões de software que oferecem soluções estáveis para problemas de arquitectura.


- Alguns exemplos de Architectural Patterns:
- Three-tier: aplicação de 3 camadas (user interface, lógica de negócio e acesso a dados, e camada de dados)
- Model-View-Controller: separa o modelo de dados da user interface. Introduz um componente pelo meio, que tem a responsabilidade de controlar os dois anteriores.
- PAC / HMVC: utiliza uma estrutura hierarquica de agentes, cada um consistindo num trio de componentes (apresentação, abstracção e controle)
. PAC: os agentes comunicam entre si através do controlador
. HMVC: os agentes comunicam entre si através do controlador, e tambem através da vista e do modelo
- SOA: Service-Oriented Architecture, que utiliza loosely-coupled services para dar suporte ao negócio
- ...

Vantagens reais:
- Maior estruturação do código
- Maior escalabilidade
- Código com mais qualidade
- Tudo ‘encaixa’ no Pattern

E pronto! foram algumas dicas sobre Patterns, mas não se entusiasmem! Há muito mais sobre Patterns para alem disto!
Incluo algumas referencias que podem ser uteis e ajudar a continuar a partir daqui!

References
http://www.cmcrossroads.com/bradapp/docs/patterns-intro.html
http://www.martinfowler.com/articles/writingPatterns.html
http://wi.wu-wien.ac.at/home/uzdun/publications/ArchPatterns.pdf
http://www.martinfowler.com/eaaCatalog/
http://hillside.net/patterns/definition.html
http://www.codefarms.com/publications/papers/patterns.html
http://www.castleproject.org/monorail/gettingstarted/firstcontroller.html

Divirtam-se! ;)

Friday, March 23, 2007

Microsoft TechDays - Conclusões

E foi o TechDays 2007!

Entre conceitos, alguns novos, outros nem por isso, alguns mais interessantes que outros, destacaria os seguintes:
- Expression Blend
- XAML/XOML
- a familia W*F
- a abordagem a algumas particularidades do .Net 3.0, que inclui o C# 3.0
- o LINQ!!!
- o ORCAS
- algumas metodologias ágeis, como o XP (não o SO :), mas o eXtreme Programming), o SCRUM e o MSF Agile
para referir apenas alguns...

Foram três dias interessantes, cheios de informação nova ou semi-nova, e que serviram sobretudo para dar um pequeno fôlego ao nosso dia-a-dia como developers! ;)

Podem consultar mais detalhes no link do TechDays 2007:
http://www.microsoft.com/portugal/techdays/2007/temas.mspx

E acima de tudo, divirtam-se! :)

Microsoft TechDays - Dia 3

E eis-nos chegados ao terceiro desta edição do TechDays!

Deste ultimo dia, destaco estas duas apresentações, ainda na linha do que designei de W*F (aka, Windows "qualquer coisa" Foundation :)):

DEV020 - Extensibilidade do Windows Workflows Foundation com Custom Activities
DEV024 - Construir Serviços WCF com WWF - Presente e Futuro

E sobretudo estas duas, que gostei bastante:

DEV027 - LINQ - .NET Language Integrated Query Framework
DEV025 - Segurança na Windows Communication Foundation: objectivos, modelos, padrões e pontos de extensão

Cá seguem os meus resumos:

DEV020 - Extensibilidade do Windows Workflows Foundation com Custom Activities

O WWF foi lançado em Novembro/06 como parte do Windows Vista/.Net 3.0.

Nesta sessão foi relembrado o conceito de Workflow como implementação de processo ou lógica de negócio. Foi ainda relembrado o concieto de actividade, um passo no workflows (e/ou uma classe .Net)

Fazendo a analogia com a UI:
- workflow = form
- actividade = controls

As Custom Activities são escritas quando há necessidade de reutilização.

Como fazer uma Custom Activity:
- derivar da base-class Activity
- usar o namespace System.Workflows.ComponentModel

É possivel tirar partido do XAML.

Sequência do workflow: é colocada no ficheiro XOML (o editável do XAML), na forma de tags

A máquina de estados da actividade inclui o seguinte:
- Initialize()
- Execute()
- Cancel()
- Compensate()

Uma excepção no workflow é uma Fault, que é passada para a actividade Faulting, onde é depois tratada.

Uma actividade é single threaded, logo não convém colocar nada pesado no workflow.

Benefícios do WWF:
- transparência
- serviços
- modificação dinâmica

As actividades são unidades fundamentais de Execução, Reutilização e Composição.

DEV024 - Construir Serviços WCF com WWF - Presente e Futuro

O que é o WCF e o WWF? E o que não são?


- são Frameworks de desenvolvimento de vanguarda
- não são pensadas para trabalhar em conjunto, dado que foram desenvolvidas em paralelo
- não são produtos! São frameworks.

Arquitecturas sincronas:
- utilizam o paradigma pergunta-resposta
- não utilizam toda a funcionalidad WWF.
- dificuldades:
. passagem de parâmetros
. leitura/resposta
. sincronização de threads

Arquitecturas assíncronas:
- permitem usar todas as funcionalidades do WWF
- o WWF foi pensado para esta abordagem
- o que preciso ter mais?
. passo o id do workflow que quero executar (formas de passar o id: com cookies, soap header, customizada - ie, passo o id como parte da interface, mas não é uma boa solução - )
- mapeamento de inputs/outputs: External Data Exchange (construido para o SharePoint, é complexo de usar; válido mas limitado em termos de evolução futura; não vai ser abandonado)´

Como configurar uma External Activity:
- definir a interface
- criar um objecto que implementa a interface

Class MyFile PersistenceService: classe que permite guardar os dados em File System (ie, em suportes de dados persistentes)

WWF/WCF em .Net 3.5:
- duas novas actividades: send e receive (correlation tokens: associam a pergunta à resposta
- porque na versão 3.0 não é muito simples de implementar, a versão 3.5 traz algumas vantagens:
. queues (transparentes para o user)
. suporte a gestão de permissões
. suporte a conversações

Com o ORCAS (futura versão do Visual Studio) há problemas actuais que são resolvidos. A integração com o WCF e WWF passa a ser mais natural.

DEV027 - LINQ - .NET Language Integrated Query Framework

O LINQ é uma nova linguagem de query integrada na plataforma de desenvolvimento.


Não exige alterações à plataforma, mas às linguagens de programação (outra forma de fazer as coisas).

Efectua queries sobre objectos, e funciona com extensões ao C# 3.0.

Inovações no C# 3.0:
- inferência no tipo de variáveis locais
- expression tree
- tipos anónimos
- métodos de extensão

Os Standard Query Operators são os métodos disponiveis. Os Extension Methods podem ser utilizados acrescentando a referência de onde os métodos se encontram (ex.: System.Query).

Utiliza Deferred Query Execution, ie, a query só é executada quando tento iterar sobre os dados.

LINQ para SQL:
- actualmente:
. mando os dados da BD para um objecto (com open, datareader, etc...)
. desvantagens: pode haver incompatibilidades de data types (não há verificação em compile time)
- com o LINQ:
. os dados também são enviados para objectos
. as classes descrevem os dados (a classe é Strongly Typed)
. as tabelas são apenas colecções
. a ligação também é Strongly Typed (ex.: Northwind db = new Northwind(........);)
. a linguagem suporta sintaxe para queries

O ORCAS foi referido como facilitador para a integração com o LINQ.

Grande vantagem do LINQ: unifica o modelo de programação (não necessito saber XML, ou SQL, ou o que quer que seja, para aceder aos dados)

Outras vantagens:
- compile-time type checking
- intellisense

LINQ para XML:
- actualmente:
. modelo imperativo
. centrado no documento
. não tem querys integradas
. o DOM carrega tudo para memória (torna-se pesado)
- com o LINQ:
. centrado nos elementos
ex.:
xElement contacts = new xElement("contacts",
from c in customers
where c.Country = "USA"
Select new xElement("contact",
new xElement("nome", c.CompanyName),
new xElement("phone", c.CompanyPhone)
)
);
. modelo declarativo
. queries integradas
. menos código. E mais eficiente.

Principais caracteristicas:
- linguagem integrada de query (XPath, XQuery)
- melhor manipulação do DOM

Arquitectura LINQ:
- source implementa a IEnumerable (faz com que o código funcione à base de delegates, etc...)
- source implementa a IQueryable (gera uma árvore de objectos)

DEV025 - Segurança na Windows Communication Foundation: objectivos, modelos, padrões e pontos de extensão

Objectivos na troca de mensagens:

- confidencialidade
- autenticidade
- integridade
- autorização
- ...

Transporte vs. mensagem:
- segurança ao nivel da mensagem (XML-DSIG, XML-ENC, WS-*)
- segurança ao nivel do transporte (SSL, Kerberos, ...)
Ambos têm vantagens e desvantagens.

Segurança na WCF - é implementada ao nivel do channel Stack:
- Binding: define o formato da pilha de protocolos
. stack do cliente tem de igual ao stack do servidor
. não é no binding que defino o ssecurity token a usar (quem o define são os behaviors - clientCredentials, ServiceCredentials - ao nivel do Protocolo e do Transporte)
- authorization behaviors (definidos no Dispatcher, do lado do serviço)

Modos de binding:
- Transporte
- Mensagem (username, certificados X.509, Herberos, IssuedToken)
- Hibrido

Credenciais do cliente:
- ao definir as credenciais do cliente, defino também as credenciais do serviço
- qual escolher? Depende do cenário: Internet, Intranet, ambos, Federação

Componentes de um cenário de Autorização:
- Bindings
- Source Credentials
- ServiceAuthorizationBehaviors

Padrões de Autenticação:
- Arquitectura
- Desenho
- Implementação

WSSF - Web Service Software Factory:
- implementação de padrões para a WCF

NTLM: um protocolo de segurança que pode ser usado em alternativa ao Kerberos, mas é menos seguro => realça a importância de usar padrões, soluções testadas, em vez de usar configurações ad-hoc (exemplo de alteração de parâmetros de false para true, quando o Kerberos não funcionou. Passou a usar NTLM, baixando os niveis de segurança)

"O Admirável Mundo Novo" da Segurança:
- IdentityMetaSystem (entidades externas que verificam a identidade - IdentityProvider)
- a identidade é constituida por um conjunto de claims, transportadas em SecurityTokens, e representam uma identidade digital (como que um documento de identificação digital - tipo um BI digital, um Contribuinte digital, etc...)

Federação - um cenário mais complexo:
- posso criar uma cadeia de identity providers
- a comunicação é feita por WS-Trust
- como funciona:
. WSDL + WS-Policy (WS-MEX): para representar as politicas de segurança (obter metadata)
. WS-Trust: para enviar as mensagens (comunicar)

Pontos de extensão - autorização baseada em claims:
- claim: "the expression of a right with respect to a particular value"
- são implementadas em claimsets (o SecurityToken tem um claimset)

IdentityModel: utilizado para implementação de segurança com autorização baseada em claims

Pontos de extensão no WCF:
- validação de SecurityTokens (username tokens, validação de certificados X.509)
- definição de Thread.CurrentPrincipal (associação de roles)
- politicas de autorização
- SecurityTokens proprietários (Provider, Serializer, Authenticator)
- Canais de protocolos

Microsoft TechDays - Dia 2

Neste segundo dia, das apresentações a que assisti, destaco as seguintes:

DEV012 - Windows Presentation Foundation II
DEV013 - Own3d: Hacking ainda mais fácil em AJAX Web Sites?
DEV015 - Introdução ao Windows Communication Foundation

Cá vai um pequeno resumo!

DEV012 - Windows Presentation Foundation II

"Programming is an art form that fights back."


Foi assim que se iniciou a 2ª parte da sessão sobre WPF, tendo decorrido a 1ª na véspera.

Nesta sessão, falou-se de WPF Everywhere (WPFE), que é um subset do WPF. É XAML-based e tem como plataformas target a Web e o MobilePhone.

WPFE vs. WPF - o WPFE:
- não tem 3D
- tem UI controls minimo
- não tem suporte GPU
- pretende correr no browser

O Web Programming Model é XAML e Javascript, ou XAML e .Net

Objectivo do WPFE:
- enhance de páginas Html: foi mostrado um exemplo de uma página html normal com um script javascript pelo meio, que não faz mais que instanciar uma classe js

Falou-se do MS Expression Design, uma ferramenta para design com a possibilidade para XAML. Falou-se também do XAMLPad, que corre como uma aplicação e permite gerar código XAML a partir de objectos gráficos.

WPFE vs. Flash - o WPFE:
- é XAML-based
- permite tirar partido do Javascript
- permite tirar partido do CLR (C#, VB.Net, VisualStudio)
- é searchable (XML)

Como instalar o WPFE:
- autoinstalation
- windows update? eventualmente num futuro próximo será um dos updates do windows. O utilizador te-lo-á sem sequer se aperceber. Para já não é possivel.
- tamanho: inferior a 2Mb
- não exige .Net/WPF

DEV013 - Own3d: Hacking ainda mais fácil em AJAX Web Sites?

Nesta apresentção, alertou-se para algumas situações que podem gerar insegurança em sites web.

Cuidados a ter:
- não expôr um web service (expôr apenas, por exemplo, só os web methods usados pelo AJAX)
- não usar callbacks passados por parâmetro na Query String (já que a função de callback pode ser 'roubada' e utilizada de forma nociva)
- atenção ao cross-site-scripting (agora ainda mais vulnerável com as tabs dos novos browsers)

Falou-se do Cross Site Request Forgery, que explora a relação de confiança de um site nos seus utilizadores. Uma técnica para o evitar é garantir que um Post vem da minha máquina. Se não vier, não executo. Outra técnica é tornar as páginas minimamente imprevisiveis.
Potencial:
- ataques IP internos
- configuração de routers, impressoras, etc...
- "qualquer endpoint http standard que possa ser automatizado"
Reforçou-se ainda que a minima falha XSS derrota a maioria das técnicas de prevenção.

Como conclusão, foram referidos alguns pontos:
- os browser worms, CSRF, XSS, podem ser explorados em ataques na web 2.0
- a promiscuidade entre tabs no browser torna os sites ainda mais vulneráveis a ataques
- boas práticas:
. privilégios mínimos de acesso a BDs
. não usar frameworks AJAX 'caseiras'
. validar todos os inputs
. cuidado com a exposição de web services

DEV015 - Introdução ao Windows Communication Foundation

Esta sessão apresentou o Windows Communication Foundation (WCF), uma nova abordagem na relação cliente-servidor (ou cliente-serviço).


O WCF pertence à framework 3.0, e possui uma API comum a todas as tecnologias (WSE, Remoting, etc). Reforça o conceito de separação entre interface e implementação.

Como é distribuido?
- hosting no IIS (exige a utilização do ficheiro .svc, que identifica o service type)
- WAS (Windows Activation Service) - no Windows Vista ou no "Longhorn"

Bindings:
- BasicHttpBinding: interoperabilidade com WCF (o WCF garante maior interoperabilidade e maior garantia de conformização aos standards que o WSE)
- os bindings podem ser customizados (no ficheiro de configuração) - neste ponto foi referida a importância das configurações. São muito poderosas e por isso é preciso manipulá-las com cuidado e com a certeza do que se está a fazer.

Contratos:
- serialização do MyOutputType e MyInputType
- serialização feita por:
. DataContractSerializer (default)
. XML Serializer (é mais lento)

Transacções:
- suporta WS-AT
- gestores de transacção:
. LTM (LightWeight Transaction Manager) - um AppDomain, um serviço
. DTC (que pode usar o WS-AT ou o OleTx) - quando temos AppDomains diferentes, uma LTM passa automaticamente a DTC
. KTM (Kernel Transaction Manager) - para o Vista e "Longhorn"

Segurança:
- Autenticação (Security Token; suporte built-in para windows - kerberos e NTLM, Certificados X.509, tokens de Cardspace, tokens de SAML, autenticação de user e pwd)
- Autorização (ServiceAuthorizationBehavior)

A administração WCF pode ser feita com PowerShell.

Interoperabilidade e integração:
- cliente asmx (WCF) e serviço WCF (asmx): estratégia de integração BasicHttpBinding com o WCF
- cliente WCF e serviço COM+: estratégia de integração ComSvcConfig.exe para wrap do COM+ num WCF endpoint
- cliente WCF e serviço COM: estratégia de integração ServerMonikers
- ...entre outras...

Conclusões:
- WCF é uma DSL para comunicação (message-based)
- API consistente e unificada
- vem com o Framework .Net 3.0

Microsoft TechDays - Dia 1

Este primeiro dia começou com uma sessão de abertura onde se pretendeu fazer uma resanha dos vários pontos a abordar ao longo do evento.

Deste primeiro dia, as sessões que considerei mais interessantes, e sobre as quais me debruçarei de forma algo resumida (!!), foram as seguintes:

SRV002 - Nova geração de Arquitectura de Infra-Estrutura: Service Oriented Architectura (SOI)
DEV005 - Team System: Extensibilidade e Integração Continua
MGT004 - Windows PowerShell (ex-"Monad"): a próxima geração de Command Line Scripting

Segue um pequeno resumo destas sessões!

SRV002 - Nova geração de Arquitectura de Infra-Estrutura: Service Oriented Infrastructure (SOI)

Esta sessão centrou-se na Service Oriented Architecture, agora em voga, que consiste, de forma muito resumida, em ter uma serie de aplicações que são clientes de mais do que um serviço.

Ressaltou-se a importancia de conhecer a infraestrutura-alvo e de ter um catálogo de serviços.

Foi referido o WSRM (Windows System Resource Manager) para facilitar a gestão de recursos, e que já vem incluido no Windows Server 2003, Enterprise Edition.

Por onde começar?
Foram sugeridos um conjunto de pontos:
- definir e prioritizar os serviços (conceito "low hanging fruit" - começar pelos serviços mais à mão) - não esquecer os ambientes de teste e controlo de qualidade
- definir a experiência do utilizador (comunicação não tecnológica)
- desenhar a arquitectura de referência (abstrair e normalizar; categorizar subscritores como alto, médio ou baixo, por: capacidade, carga, performance, disponibilidade)
- evoluir para a gestão de serviço (garantir que cada serviço tem um gestor, que faça a gestão entre o fornecedor do serviço e o consumidor, que faça a gestão da entrega do serviço e que garanta o suporte ao serviço)

Foram referidos como facilitadores de SOI algumas tecnologias:
- virtualização (utilização de máquinas virtuais -exige gestão e pode apresentar alguns problemas de performance)
- clustering (tem custos elevados - compensa se se pretende ganhar em capacidade)
- SAN (flexibilidade, capacidade, replicação, backup)

Em resumo:
- não é uma nova tecnologia. é uma nova abordagem (uma mudança de pensamento, se quisermos...)
- depende da capacidade do gestor do serviço
- inclui gestão de perfis (roles)
- deve ser adoptada gradualmente (conceito "low hanging fruit")

DEV005 - Team System: Extensibilidade e Integração Continua

Esta apresentação focou-se sobre os conceitos de Integração Contínua (IC), já familiares para alguns.


Foi referido um conjunto de boas práticas, como:
- ter um Sistema de Controlo de Versões (VSS, TFS, ...)
- ir buscar sempre a ultima versão do projecto ("Get latest version")
- integrar uma vez por dia

Como beneficios da IC, foram listados os seguintes:
- reduz o esforço de integração
- permite a automatização de tarefas
- permite a detecção mais rápida de erros
- diminui ciclos de feedback
- permite a monitorização dos estados dos projectos
- mais qualidade no código (com ferramenta de qualidade)

Foram citadas algumas ferramentas que possibilitam a IC:
- NAnt e MSBuild
- NAntContrib (complementa o NAnt)
- NUnit (testes unitários)
- NCover (estatisticas sobre o código - permite, por exemplo, saber que % do código está abrangida por testes unitários)
- NDepend (análise de dependências entre source e assemblies)
- FxCop (análise de boas práticas no código - convenções, performance, etc...)
- Simian (detecção de duplicação de código)

Como implementar a IC - a sugestão dada inclui os seguintes pontos:
- criar em File System uma estrutura do tipo:
...\CruiseControlNet\server
...\projectos\build\application
...\projectos\build\source

...\projectos\web
- instalar o CC.Net e o CC.Tray
- instalar o TFSCCNetPlugIn (colocar em ...\CruiseControlNet\server)
- alterar o CCNet.exe.config - alterar o xml:
. configuração do projecto
. configuração do SSControl
. configuração do Build
- start ao serviço CCNet
- verificar o Web Dashboard
- verificar o deploy no ambiente de destino

Outra aplicação de IC referida é o Automaton.

MGT004 - Windows PowerShell (ex-"Monad"): a próxima geração de Command Line Scripting

A nova shell de scripting do Windows dá pelo nome de PowerShell, e vem já incluida com o Exchange Server 2007.


Porquê uma nova shell?
Porque muitos dos Win IT Professionals usam os CMD, BAT, VBScripts, ....

Funcionalidades mais valorizadas:
- é fácil de escrever sem saber programação
- shell única para todos os componentes Windows e Microsoft
- é compativel com outros scripts que já existam

Benefícios do PowerShell:
- fácil de usar e de aprender (sintaxe "verbo-sujeito" - ex.: get-process)
- acelera a automação de tarefas administrativas

Principios do PowerShell:
- preserva o investimento feito
- poderosa manipulação de objectos
- facilita a vida aos Admins (personalização de comandos, construção rápida de scripts, criação e partilha de ferramentas - cmdlets)

Caracteristicas:
- fácil de usar: suporte nativo e uniforme para ADSI, WMI, COM, XML, ADO, HTML, CSV
- fácil de adoptar:
. download gratuito
. funciona em XP, WinServer 2003, Vista, e WinServer "longhorn"
. comandos e scripts mais rápidos
- fácil de aprender:
. guias de aprendizagem "Getting started"
. livros, web casts
. scripts de exemplo
. suporte da comunidade

Produtos que tiram partido da PowerShell:
- Exchange Server 2007
- System Center
- Windows Server

Blog da comunidade:http://blogs.technet.com/powershell

Microsoft TechDays 2007

Esteve aí!

Foi esta a semana que a comunidade Microsoft se reuniu em Lisboa para (re)descobrir as novas tendencias tecnológicas para os próximos tempos!

Falou-se muito de WCF/WPF/WWF, de novas formas de desenhar camadas de apresentação, etc etc....

Os meus próximos posts vão resumir um pouco do que ouvi e anotei nas apresentações, pelo menos das que considerei mais interessantes!

Naturalmente, estes posts são apresentados ASIS.

É já a seguir! ;)

Wednesday, February 28, 2007

VBScript Classes - Porque não??

E se…

…em vez de, nos nossos ASP's, usarmos funções e variaveis globais e asp's disto e daquilo, e de estruturas definidas com base apenas no bom senso (o que pode ser bom! Ou não… :)), utilizássemos classes??

Pois é, é extremamente fácil utilizar classes em VBScript, ainda que de forma limitada, mas que nos permite tirar partido de muitas vantagens de programar utilizando o paradigma OO!

Para declarar uma classe em VBScript com, por exemplo, 1 atributo privado, 1 atributo publico, 1 metodo privado e 1 metodo público, precisamos apenas disto:

<%
Class minhaClasse

'Atributos
Private meuAtribPrivado
Public meuAtribPublico

'Métodos privados
Private Sub meuMetodoPrivado
meuAtribPrivado = "
este é o atributo privado"
End Sub

'Métodos publicos
Function meuMetodoPublico
meuMetodoPrivado
Response.Write meuAtribPrivado
End Function

End Class
%>


E para utilizar a classe, precisamos apenas disto:

<%
Dim minhaInstanciaClasse
Set minhaInstanciaClasse = New minhaClasse
minhaInstanciaClasse.meuMetodoPublico
minhaInstanciaClasse.meuAtribPublico = "
este é o atributo publico"
Response.Write minhaInstanciaClasse.meuAtribPublico
%>


O output deste pequeno exemplo é este:

este é o atributo privado
este é o atributo publico

Simples, não é?? E o código fica claramente mais organizado! Experimentem colocar todo este codigo no mesmo asp para testar e podem tirar vantagens da utilização do Intellisense.

Algumas sugestões:
- criar um ficheiro asp por cada classe. Podem incluir os ficheiros de classes com a instrução ""
- atribuir ao nome do ficheiro o mesmo nome da classe
- trabalhar apenas com classes, excepto no entry point do sistema, que instancia a(s) classe(s), por exemplo, num main.asp (resistir à tentação de usar o paradigma procedimental! :))
- utilizar o padrão MVC! :) Ajuda a organizar a cabecita!! Parafraseando: "The MVC paradigm is a way of breaking an application, or even just a piece of an application's interface, into three parts: the model, the view, and the controller." Experimentem, experimentem!

Alguns sites que podem consultar:
- VBScript Classes:
http://www.4guysfromrolla.com/webtech/092399-1.shtml (uma introdução simples à utilização de OO e VBScript Classes)
http://www.activexperts.com/axscript/vbscriptclasses/ (outro artigo muito incisivo sobre a utilização de classes)
http://www.google.pt/search?hl=pt-PT&q=vbscript+classes&meta= :)
- MVC:
http://en.wikipedia.org/wiki/Model-view-controller (uma introdução)
http://ootips.org/mvc-pattern.html (outra introdução)
http://www.google.pt/search?hl=pt-PT&q=mvc&meta= :))

Divirtam-se!

:)



Wednesday, February 21, 2007

O meu MVC!

Tadaaa!....

Fiz o meu primeiro MVC 'pensado' from head to toe! :))

É verdade que já tinha feito umas experiencias...
É verdade que nao correram muito bem :)
É verdade que esta também não é a solução proximo do BOM!
É verdade que ainda tenho algumas duvidas..... :S

Mas é o que é!! :))

Então cá vai o que foi feito:

Utilizei o esquema de relacionamento MVC demonstrado na imagem ao lado.



Criei um conjunto de pastas no meu projecto com a seguinte estrutura:
mvc
-> controller
classe que representa o controlador
-> model
conjunto de classes que modelam o problema
-> view
conjunto de vistas, neste caso xsl

Depois, foi só utilizar um main.asp como entry point do sistema, que instancia o controller, e a partir daí entro na engrenagem do MVC!



Portanto, o main.asp instancia a classe controller, que instancia as classes pertencentes ao model, e que me 'dizem' quais as views a utilizar.


E voilá! Tenho um MVC! :)


:)

Wednesday, February 14, 2007

MVP (aka Model-View-Presenter)

O MVP é uma derivação do MVC, concentrando-se essencialmente no "modelo" do MVC.

Em vez de um Controller, temos um Presenter, responsável por coordenar a aplicação.
O objectivo do Presenter é interpretar eventos e executar a lógica que mapeia os eventos com o Model. O Presenter 'conhece' a View e fornece-lhe instruções. A vista é responsável por gerir os eventos despoletados pelo user (que no MVC são da responsabilidade do Controller), e o Model torna-se exclusivamente um Domain Model.

Resumidamente, as responsabilidades de cada um dividem-se da seguinte forma:
Presenter - representa e coordena a aplicação. À semelhança do Controller, liga a View e o Model.
Model - representa os dados do Domain.
View - representa a parte 'visivel' do Model (o layout!).

:)

MVC (aka Model-View-Controller)

O MVC (aka Model-View-Controller) é um padrão de desenho de sistemas.

No MVC, as responsabilidades dos tres componentes principais sao as seguintes:
- Model: modela o desenho do sistema
- View: layout do sistema
- Controller: identifica eventos e notifica a View

De forma simplista, uma maneira de compreender o MVC é a seguinte:
- o Model é uma representação dos dados
- a View é a user interface
- o Controller é a cola entre os dois anteriores! :)

"the View is the user's eyes, the Controller is his hands and the Model is his mind"

:)

Tecnicisses

Ora cá está!

(Mais um) blog de coisitas técnicas :)

Um blog onde vou escrevendo detalhes daqui e dali, desta ou daquela tecnologia, sempre relacionadas com programação.

Para já vou começar com um tópico que me despertou muito interesse nos ultimos meses: MVC/MVP

Novidades para breve!! :)