terça-feira, 13 de abril de 2010

Groups vs AssociatedGroups no Sharepoint 2007 (MOSS)

Programaticamente ao acedermos a um SPWeb temos duas colecções AssociatedGroups e Groups:

A principal diferença é: Groups são grupos que realmente tem algum tipo de permissão efectiva e os AssociatedGroups são na mesma grupos que podem estar criados, terem utilizadores, mas que não dão acesso a nada, apenas existem.

Portanto a colecção Groups é um sub-conjunto de AssociatedGroups.

Ao percorrer a colecção .Groups estamos a ver grupos que tem algum tipo de acesso (read, full control, etc). Se for criado um grupo e atribuir um nível de permissão, este apenas fica nos AssociatedGroups; o que quer dizer que apesar de ter um nível de permissão pré-definido não dá acesso a nada.

Ao adicionarmos esse AssociatedGroup ao SPWeb este passa a estar também nos Groups.

Para mapear estes conceitos com a interface do Sharepoint, os AssociatedGroups são os "Grupos" onde temos por omissão os proprietários, contribuintes, etc. e outros grupos criados por quem administra o site.
O facto de de estes grupos existitem não dão acesso ao utilizadores que lá se encontram adicionados.

Para um utilizador do grupo ter acesso é necessário adicionar o grupo na opção "Permissões do Site" que realmente reflecte as permissões efectivas do SPWeb.



Os AssociatedGroups depois podem ser usados para dar permissões  especificas num sub-site, lista, etc. Assim os associated groups são uma boa forma de ter uma gestão centralizada de permissões de uma aplicação baseada em moss, o problema é que a interface do moss causa alguma confusão a quem começou à pouco tempo a mexer nas permissões/segurança.

quinta-feira, 8 de abril de 2010

Como fazer nível de permissões "personalizadas" no Sharepoint 2007 sem necessidade de programação

No outro dia pediram-me para criar o seguinte cenário com os respectivos níveis de permissão para cada um dos SPGroups em cima de uma Document Library do MOSS.
  • Um grupo que pode editar a estrutura da lista de documentos, adicionar/remover colunas etc, mas não pode ver os conteúdos (documentos e dados do SPListItem)
  • Um grupo de utilizadores contribuintes que não podem modificar a estrutura das listas mas podem ver, listar, apagar, modificar.
As permissões do 2º grupo são fáceis de definir, no entanto as do 1º não. Para o efeito comecei por criar um nível de permissão no sharepoint:

Acções do Site >  Pessoas e Grupos > Permissões do Site > Niveis de Permissão > Adicionar um nível de Permissão


O problema é que ao escolher a opção "Gerir Listas - ..." automaticamente é escolhida a opção "Ver Itens - ...", o que faz sentido porque, se é possível eliminar colunas que já contém informação, pelo menos deveria ser possível ver o que se está a apagar. Mas foi expressamente pedido para fazer dessa forma, sendo assim comecei a pensar em fazer uma aplicação que programaticamente me criasse o nível pretendido. Antes de começar a programar, reparei que o Sharepoint não estava a fazer nenhum postback quando seleccionava a checkbox "Gerir Listas". Inspeccionando com o Firebug vi que a validação das dependências era feita em Javascript. Assim sendo experimentei o seguinte:
  • Removi os vistos em todas as checkbox e marquei apenas a opção "Estruturar listas..." para seleccionar as dependências usuais inerentes a esta permissão
  • Usando o firebug, editei o html da checkbox com a opção "Ver Itens - ..." e removi o visto retirando o html: checked=""
  • Guardei as alterações...


Para minha surpresa não existe nenhuma validação do lado do servidor  do Sharepoint e realmente as alterações foram salvas, assim conseguir criar um Nível de Permissão que normalmente não conseguiria fazer OOTB (out-of-the-box).

Penso que programaticamente deveria ser possível fazer exactamente o mesmo que fiz manipulando o HTML das páginas de administração do sharepoint, realmente não faz muito sentido gerir listas sem pode ver os itens, mas como me aconteceu, o cliente pode pedir isso.

domingo, 7 de fevereiro de 2010

IE6: Background-image pisca (CSS)

Mais um bug do IE6 que me deixou piurso.
O problema é o seguinte: quando se adiciona por uma imagem em background por CSS (background-image) numa ancora (tag a) a imagem pisca quando se passa o rato por cima da ancora.
Acontece que o IE6 não faz cache da imagem e faz um novo pedido o que resulta no piscar da imagem.

Para resolver esta situação podemos incluir o seguinte no header da página.
<!--[if IE 6]>
  <script type="text/javascript">
    try {
      document.execCommand("BackgroundImageCache", false, true);
    } catch(e) {}
  </script>
<![endif]-->
Para quem precisa de uma solução que funcione sem javascript tem as seguintes hipóteses:
  • Passar a imagem (background-image) para um elemento pai. Ex: ul li a , adicionar a imagem ao elemento li.
  • Substituir a imagem em background por uma tag img.

Ficheiros duplicados

[27-02-2010 edit: correcção de alguns bugs e algumas melhorias]

Fiz esta pequena aplicação para me ajudar a encontrar alguns ficheiros mp3 repetidos, mas é aplicável a qualquer outro tipo de ficheiros. É necessário ter instalado a framework .net 2.0.
Se alguém estiver com vontade de melhorar a aplicação é só mandar um email* que trato de mandar o código fonte (C#).
*O contacto está no "sobre..." da aplicação, evitei colocar publicamente na net porque podia ser apanhado por algum bot e já chega de spam.

quarta-feira, 27 de janeiro de 2010

Algumas considerações sobre Progressive Enhancement e Graceful Degradation

Aconselharam-me a leitura deste artigo sobre Progressive Enhancement vs. Graceful Degradation, já tinha alguns conceitos sobre estas duas aproximações ao desenvolvimento web mas, acho que mesmo para quem já conheça, trata-se de uma leitura agradável.

Tentando definir rapidamente: são duas filosofias com abordagens diferentes sobre a maneira de desenvolver páginas web (desde html, css, javascript, etc.) de forma a conseguir abranger o maior número de browsers.

O progressive enhancement sugere que se deve começar  pelo browser target mais fraco, por exemplo, o site deve ser desenvolvido tendo por base um dispositivo móvel com capacidades limitadas de navegação e sem javascript/css, e a partir daí acrescentar funcionalidades/estilo como se estivessemos a adicionar camadas.

O graceful degradation sugere começar pelo topo, isto é, apontar para o nosso browser target moderno, por exemplo, HTML5/CSS3 em Firefox/Chrome/Safari e desenvolver de forma a que cada página seja tolerável a falhas dos browsers. Isto quer dizer se o browser não entender uma determinada regra de CSS ou javascript deve ser possível garantir o mínimo indispensável de navegação e funcionalidades, estas vão diminuindo conforme o browser cliente.

Estas duas filosofias parecem misturar-se um bocado, pegando por exemplo numa textbox que deverá ser um input para uma data. Podemos adicionar comportamento e estilo com CSS e javascript de forma a que esta textbox só aceite datas num determinado formato (tipo uma textbox com filtro, calendário, icon, etc). Se o browser cliente não suportar javascript não existirá nenhum problema, a textbox continuará a fazer aquilo que é preciso mas de uma forma menos elegante. Técnicas deste género podem ser usadas em ambas as filosofias, a diferença é como abordar o desenvolvimento desde o ínicio.

Na minha opinião pessoal, o progressive enhancement deve ser usado para construir sites internet (sobretudo se tiverem algum nível de acessibilidade), assim conseguimos atingir um maior público alvo, será um site bastante funcional num dispositivo mais fraco e além disso terá muitas funcionalidades/aspecto extras num browser moderno. Esta forma de desenvolver parece-me boa sobretudo se houver tempo e orçamento adequado.
Por outro lado, no desenvolvimento de uma intranet/extranet o conjunto de browsers é mais homogéneo e normalmente o orçamento será mais apertado, numa situação destas diria que adoptar  uma estratégia de graceful-degradation parece ser mais adequado. É possível desenvolver rapidamente para um browser target e usando técnicas como mencionei em cima permitir que mesmo browsers mais antigos (IE6, pda's, etc.) sejam capazes de renderizar as páginas com eficácia e serem completamente funcionais.

Sugiro que, mesmo depois desta introdução, leiam o artigo mencionado no início porque, entre outras coisas, o autor fala dos prós e contras de cada uma das aproximações de uma forma mais detalhada.

terça-feira, 26 de janeiro de 2010

SQL Server 2008, Saving changes is not permited...

Quem começa a usar o designer do SQL Server 2008 depara-se com o erro quando está a alterar a estrutura de uma tabela existente: "Saving changes is not permited..."


Por pré-definição  a opção "Prevent saving changes that require table re-creation" está activa, isto parece-me ser muito bom para ambientes produtivos mas durante a fase de desenvolvimento chateia um bocado. A solução é fazer os scripts à mão tipo alter table... ou ir às opções e desactivar a opção.


MeasureIt - Firefox web development plugin

Encontrei esta pequeno plugin para o Firefox que apesar de não parecer nada importante tem dado jeito em muitas situações, é um must-have para quem desenvolve para a web.

Permite medir distâncias, em pixeis, numa página web. Muito simples e fácil de usar, para quem não conhece para activar a régua é preciso carregar no novo ícone no canto inferior esquerdo do firefox.

measureit icon

.NET: Servidor web devolve resposta vazia com o WebClient

Hoje deparei-me com o seguinte problema: ao fazer um pedido para obter uma página web, usando a classe WebClient do .NET (System.Net.WebClient ), o servidor devolveu uma resposta vazia.

Após alguma pesquisa descobri que alguns servidores podem não responder se faltar o user agent no header do pedido.
Como a classe WebClient não possui nenhuma propriedade para especificar o user agent, é necessário adicionar o user agent ao header :

Exemplo:
WebClient client = new WebClient();
client.Headers.Add ("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; .NET CLR 1.0.3705;)");

sábado, 23 de janeiro de 2010

Concatenar um array de strings

Já estava preparado para fazer um "foreach" para concatenar um array de strings, com ponto-e-virgula como separador, quando encontrei, por acidente, o método string.Join(...) que nunca tinha visto e até pensei que só existia  na framework .net 3.5 mas afinal já existe desde a .net 2.0... fico a pensar que outras funções existirão na framework que não conheço?!

Digam qual foi o última funcionalidade porreira com que se depararam no asp.net... (se alguém se der ao trabalho de ler este blog eheh)

Mais detalhes:
http://msdn.microsoft.com/en-us/library/57a79xd0.aspx

sexta-feira, 22 de janeiro de 2010

Problema no Firefox 3.6 e autenticação repetida no Proxy

Se é como eu e gosta de usar o Firefox no seu local de trabalho, para aceder à internet poderá ter que passar por um proxy antes de chegar ao conteúdo desejado.

Acontece que tive dificuldades porque o proxy do meu local de trabalho estava constantemente a pedir-me autenticação tornando o uso do FF impraticável. Como nos restantes browsers estava tudo bem andei à procura um bocadinho na net e encontrei um post que dizia para mexer nas variáveis ntlm. Ao fim de algumas tentativas esta configuração deixou o FF novamente a funcionar bem com apenas uma autenticação no proxy inicial.

Instruções: escrever na barra de endereço about:config e alterar os settings para o seguinte: