Estava a fazer debug (attach) a um processo especifico w3wp.exe e o VS2010 arrancava diversos webdevelopment servers (cassini).
É bastante fácil desligar/ligar esta opção, basta ir a cada host e ligar ou desligar a opção "Always Start When Debugging". Para mim isto é chato mas pode ser útil para quem queira lançar automaticamente vários web servers com portos fixos clicando apenas no Play (Start Debugging).
quinta-feira, 24 de maio de 2012
quarta-feira, 18 de abril de 2012
SQL Server 2008 - Terminar processos que estão a usar uma BD
Eu estava habituado a usar o Activity Monitor no SQL Management Studio 2005 mas na versão 2008 está ligeiramente diferente e na minha opinião "demasiado escondido".
Basta clicar com o botão direito na instância SQL e selecionar "Activity Monitor" a partir daqui é possivel ver alguns gráficos com a performance, processos que estão a usar quais BDs e termina-los, entre outras informações de performance.
Basta clicar com o botão direito na instância SQL e selecionar "Activity Monitor" a partir daqui é possivel ver alguns gráficos com a performance, processos que estão a usar quais BDs e termina-los, entre outras informações de performance.
Etiquetas:
Activity Monitor,
SQL Management Studio 2008
terça-feira, 3 de abril de 2012
Recuperar acesso a uma instância SQL Server.
Para recuperar acesso a um SQL Server (por exemplo após mudar o nome da máquina), abrir o SQL Server Configuration Manager (All Programs > Microsoft SQL Server 2008 R2 > Configuration Tools).
Seleccionar o nó SQL Server Services > SQL Server (MSSQLSERVER) e abrir as propriedades.
Na tab Advanced adicionar ao Startup Parameters o sufixo ";-m" para correr em single user mode. Aí já é possível aceder à instância usando o SQL Server Management Studio e adicionar os users necessários para recuperar a instalação.
Mais detalhes no post original:
http://blogs.msdn.com/b/raulga/archive/2007/07/12/disaster-recovery-what-to-do-when-the-sa-account-password-is-lost-in-sql-server-2005.aspx
Seleccionar o nó SQL Server Services > SQL Server (MSSQLSERVER) e abrir as propriedades.
Na tab Advanced adicionar ao Startup Parameters o sufixo ";-m" para correr em single user mode. Aí já é possível aceder à instância usando o SQL Server Management Studio e adicionar os users necessários para recuperar a instalação.
Mais detalhes no post original:
http://blogs.msdn.com/b/raulga/archive/2007/07/12/disaster-recovery-what-to-do-when-the-sa-account-password-is-lost-in-sql-server-2005.aspx
sexta-feira, 9 de março de 2012
T-SQL tranformar os dados pedidos na query select para um tipo diferente
Ao construir uma query sql precisava de analisar um inteiro e devolver uma string (ou booleano ou outra coisa qualquer) e o melhor que encontrei que funcionasse tipo "IF" para Selects foi o CASE:
SELECT Id, Price, Name,
(CASE WHEN Stock > 0 THEN 'Em stock' ELSE 'Sem Stock' END)
FROM Produtos
where Category = 'Consolas'
SELECT Id, Price, Name,
(CASE WHEN Stock > 0 THEN 'Em stock' ELSE 'Sem Stock' END)
FROM Produtos
where Category = 'Consolas'
segunda-feira, 9 de janeiro de 2012
C#: Invocar um construtor (com parâmetros) a partir de um metodo genérico .Net
Exemplo para construir uma instância de uma classe a partir de um método genérico, isto pode ser útil para usar um design pattern tipo Factory.
/* O objectivo deste método é invocar o construtor de qualquer classe que seja MyClass1 ou que herde desta e que não tenha o construtor sem parâmetros porque, para isso, bastaria usar além do where a keyword new, ex: where T : ... new() */
public T myGenericMethod(string p1, int p2) where T : MyClass1
System.Reflection.ConstructorInfo constructorInfo =
typeof(T).GetConstructor(new Type[] { typeof(string), typeof(int) });
T myObject =
(T)constructorInfo.Invoke(new object[] { p1, p2});
return myObject;
}
Definindo esta função genérica posso instanciar qualquer classe derivada de myClass1 que tenha um construtor com uma string e um inteiro como parâmetros. Por exemplo, supondo que existe uma classe chamada MyClass2 que herde de MyClass1:
/* exemplo de classe */
public class MyClass2 : MyClass1 { ... }
/* exemplo como usar o método */
MyClass2 exemplo =
myGenericMethod("teste", 123);
Claro que isto não tem grandes vantagens assim à primeira vista, mas podemos centralizar operações criando o conceito de Factory.
/* O objectivo deste método é invocar o construtor de qualquer classe que seja MyClass1 ou que herde desta e que não tenha o construtor sem parâmetros porque, para isso, bastaria usar além do where a keyword new, ex: where T : ... new() */
public T myGenericMethod
System.Reflection.ConstructorInfo constructorInfo =
typeof(T).GetConstructor(new Type[] { typeof(string), typeof(int) });
T myObject =
(T)constructorInfo.Invoke(new object[] { p1, p2});
return myObject;
}
Definindo esta função genérica posso instanciar qualquer classe derivada de myClass1 que tenha um construtor com uma string e um inteiro como parâmetros. Por exemplo, supondo que existe uma classe chamada MyClass2 que herde de MyClass1:
/* exemplo de classe */
public class MyClass2 : MyClass1 { ... }
/* exemplo como usar o método */
MyClass2 exemplo =
myGenericMethod
Claro que isto não tem grandes vantagens assim à primeira vista, mas podemos centralizar operações criando o conceito de Factory.
quinta-feira, 5 de janeiro de 2012
Coded UI teclas especiais
No âmbito dos Coded UI (testes automáticos no Visual Studio 2010) ou de outras aplicações interactivas em que temos que simular comportamentos como se fossem o utilizador a escrever podemos usar a classe Keyboard:
Esta classe encontra-se no namespace: Microsoft.VisualStudio.TestTools.UITesting
Em conjunto com estas tabelas de referência:
http://msdn.microsoft.com/en-us/library/fx2k26ca%28v=vs.90%29.aspx
http://msdn.microsoft.com/en-us/library/dd433886.aspx
é possivel enviar comandos como se estivessemos a escrever no teclado, exemplos:
Keyboard.SendKeys("{DOWN}", ModifierKeys.Alt);
Keyboard.SendKeys("{RIGHT}");
Keyboard.SendKeys("{ENTER}");
Também é possivel definir o nº de repetições:
Keyboard.SendKeys("{LEFT 5}");
isto é o equivalente a pressionar a tecla para a esquerda 5 vezes.
Atualização:
Na assembly System.Windows.Forms.dll estão disponível os métodos equivalentes ao anterior:
Nota: esta última pode ser apenas dedicada aos WindowsForms...
#region Assembly Microsoft.VisualStudio.TestTools.UITesting.dll, v4.0.30319
// c:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE\PublicAssemblies\Microsoft.VisualStudio.TestTools.UITesting.dll
#endregion
Esta classe encontra-se no namespace: Microsoft.VisualStudio.TestTools.UITesting
Em conjunto com estas tabelas de referência:
http://msdn.microsoft.com/en-us/library/fx2k26ca%28v=vs.90%29.aspx
http://msdn.microsoft.com/en-us/library/dd433886.aspx
é possivel enviar comandos como se estivessemos a escrever no teclado, exemplos:
Keyboard.SendKeys("{DOWN}", ModifierKeys.Alt);
Keyboard.SendKeys("{RIGHT}");
Keyboard.SendKeys("{ENTER}");
Também é possivel definir o nº de repetições:
Keyboard.SendKeys("{LEFT 5}");
isto é o equivalente a pressionar a tecla para a esquerda 5 vezes.
Atualização:
Na assembly System.Windows.Forms.dll estão disponível os métodos equivalentes ao anterior:
Exemplo:
System.Windows.Forms.SendKeys.SendWait("{b 10}");
Nota: esta última pode ser apenas dedicada aos WindowsForms...
#region Assembly Microsoft.VisualStudio.TestTools.UITesting.dll, v4.0.30319
// c:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE\PublicAssemblies\Microsoft.VisualStudio.TestTools.UITesting.dll
#endregion
Etiquetas:
coded,
keyboard,
sendkeys,
testes,
testes automáticos,
ui,
visual studio 2010
segunda-feira, 2 de janeiro de 2012
.NET: Parsing e manipulação da QueryString
Em .NET existe o método HttpUtility.ParseQueryString quer permite efetuar o parsing da querystring devolvendo um objecto do tipo NameValueCollection.
O objecto, do tipo NameValueCollection, permite fazer a manipulação da querystring suportando as seguintes operações:
- adicionar, remover propriedades
- consultar e modificar o valor das propriedades.
Exemplo:
NameValueCollection queryString = HttpUtility.ParseQueryString("?displaycode=deseja&feliz=2011");
// Obter o valor da propriedade
string ano = queryString["feliz"];
// Alterar o valor da propriedade
queryString["feliz"]
= "2012";
// Remover a propriedade
queryString.Remove("feliz");
// Adicionar a propriedade
queryString.Add("feliz",
"2012");
// Resultado: displaycode=deseja&feliz=2012
string resultado = queryString.ToString();
quarta-feira, 14 de dezembro de 2011
Problema no TFS após resolução de conflitos, como encontrar código ou texto perdido
Nunca tive grandes problemas com o TFS nomeadamente a resolver conflitos, mas ontem aconteceu que perdi um teste automático depois de resolver um conflito ao fazer GetLatest, o projeto permite check-out não-exclusivos e, sem perceber muito bem o que aconteceu, hoje ao fazer GetLatest, surpresa minha, o código do teste tinha desaparecido.
Sem investigar muito a razão do que aconteceu encontrei o meu teste no folder:
%TMP%\TFSTemp
Basta introduzir isto no Run no menu Iniciar do Windows para abrir o folder temporário onde o Team Foundation Server (client) guarda o ficheiro após a resolução de conflitos. Bastou-me fazer um find para encontrar o código desaparecido.
Sem investigar muito a razão do que aconteceu encontrei o meu teste no folder:
%TMP%\TFSTemp
Basta introduzir isto no Run no menu Iniciar do Windows para abrir o folder temporário onde o Team Foundation Server (client) guarda o ficheiro após a resolução de conflitos. Bastou-me fazer um find para encontrar o código desaparecido.
Etiquetas:
checkout exclusivo,
código perdido,
problemas,
resolução conflitos,
TFS
segunda-feira, 12 de dezembro de 2011
Função genérica para converter string num enumerado.
Uma forma genérica para converter uma string num Enum, uso isto na forma de uma extensão.
Exemplo de utilização:
string s = "Primeiro";
PosicaoEnum teste = s.ToEnum<PosicaoEnum>();
Exemplo de utilização:
string s = "Primeiro";
PosicaoEnum teste = s.ToEnum<PosicaoEnum>
public static T ToEnum<T>(this string s)
{
T[] possibleValues = (T[]) Enum.GetValues(typeof(T));
foreach(T val in possibleValues){
string valString = val.ToString();
if (valString == s)
{
return val;
}
}
throw new ArgumentException(
string.Format(
"Cannot find \"{0}\" in the enum \"{1}\".",
s, typeof(T).ToString()));
}
{
T[] possibleValues = (T[]) Enum.GetValues(typeof(T));
foreach(T val in possibleValues){
string valString = val.ToString();
if (valString == s)
{
return val;
}
}
throw new ArgumentException(
string.Format(
"Cannot find \"{0}\" in the enum \"{1}\".",
s, typeof(T).ToString()));
}
sexta-feira, 25 de novembro de 2011
Google Maps v3: Problema ao renderizar mapa oculto
Recentemente tive que implementar uma página com vários mapas do google, cada um dentro do seu separador (Tab).
O problema surgiu quando clico num separador, o mapa não renderiza como devia e não fica centrado na posição indicada.
A solução encontrada foi a seguinte:
Quando ocorre o clique no separador efectuar o seguinte:
Aqui fica o código javascript com a solução.
function fixMap(map) {
O problema surgiu quando clico num separador, o mapa não renderiza como devia e não fica centrado na posição indicada.
A solução encontrada foi a seguinte:
Quando ocorre o clique no separador efectuar o seguinte:
- Guardar a posição.
- Disparar o evento resize para que o mapa redesenhe como devia.
- Centrar o mapa na posição que estava.
Aqui fica o código javascript com a solução.
var center = map.getCenter();
google.maps.event.trigger(map, "resize");
map.setCenter(center);
}
Etiquetas:
Google Maps,
Google Maps v3,
problema renderização
quinta-feira, 24 de novembro de 2011
SharePoint 2010: Operador In, Caml
O SharePoint 2010 apresenta um novo operador nas Caml queries.
O operador em questão é o operador In que evita que tenhamos de escrever múltiplos Or.
Como nem sempre as nossas queries são estáticas apresento uma forma de gerar o operador In dinamicamente através de uma coleção.
Exemplo de como chamar o método InCaml.
O operador em questão é o operador In que evita que tenhamos de escrever múltiplos Or.
Por exemplo, se tivermos o campo chamado Browser do tipo Text e quisermos procurar os registos que têm a palavra Firefox ou a palavra Chrome escrevemos a seguinte Caml query.
<Where>
<In>
<FieldRef Name='Browser' />
<Values>
<Value Type='Text'>Firefox</Value>
<Value Type='Text'>Chrome</Value>
</Values>
</In>
</Where>
public static string InCaml(IEnumerable<string> items, string
type, string name)
{
string inFormat = "<Value Type='{0}'>{1}</Value>";
var values = new StringBuilder();
values.Append("<Values>" );
foreach (string item in items)
{
values.AppendFormat(inFormat, type, item);
}
values.Append("</Values>");
var fieldRef = string.Format("<FieldRef Name='{0}' />" , name);
return string.Format("<In>{0}{1}</In> ", fieldRef,
values.ToString());
}
InCaml(new string[] { "Firefox", "Chrome" }, "Text", "Browser");
quinta-feira, 17 de novembro de 2011
Papercut - Servidor de SMTP
O Papercut é um servidor de SMTP que permite apenas receber e visualizar as mensagens.
É incrivelmente simples e prático, sendo bastante util para desenvolvimento de aplicações e não necessita de configurações.
É incrivelmente simples e prático, sendo bastante util para desenvolvimento de aplicações e não necessita de configurações.
quarta-feira, 16 de novembro de 2011
Deep compare de dois objectos em C#
Estava a implementar um teste e gostaria de comparar duas propriedades que eram classes complexas, no entanto é bastante complicado comparar todos os tipos de classes, sobretudo se forem colecções (IList, array, etc.). Após alguma pesquisa encontrei este projecto no codeplex que suporta a maioria dos tipos que uso no projecto:
http://comparenetobjects.codeplex.com/releases/view/47978
Este utilitário está todo implementado numa classe e usa reflection para correr as propriedades todas e é bastante fácil de usar com as opções default:
CompareObjects comparer = new CompareObjects();
return comparer.Compare(obj1, obj2);
http://comparenetobjects.codeplex.com/releases/view/47978
Este utilitário está todo implementado numa classe e usa reflection para correr as propriedades todas e é bastante fácil de usar com as opções default:
CompareObjects comparer = new CompareObjects();
return comparer.Compare(obj1, obj2);
domingo, 13 de novembro de 2011
Javascript: Converter uma string num array de caracteres
Em javascript para converter uma string num array de caracteres usamos o método split em que passamos por parametro uma string vazia.
Resultado:
Exemplo:
"123456789".split("")
["1", "2", "3", "4", "5", "6", "7", "8", "9"]
quinta-feira, 10 de novembro de 2011
Parse do request no evento IDispatchMessageInspector.AfterReceiveRequest
Uma das melhores funcionalidades dos WCF WebServices é sua flexibilidade e capacidade de adicionar código nosso em quase qualquer parte do ciclo de vida do Request. Uma das hipoteses é usar um "inspector" de mensagens para, por exemplo, validar segurança ou alterar conteúdos de um Request.
Quando o pedido é recebido ainda não está deserializado para a respectiva classe .Net, achei problemático fazer esta deserialização. Após alguma investigação uma das formas que encontrei foi usar a classe TypedMessageConverter.
Nota: atenção que ao deserializar a mensagem é preciso criar uma cópia da Message usando este código:
MessageBuffer msgBuffer = message.CreateBufferedCopy(MaxMessageSize);
mais detalhes: http://social.msdn.microsoft.com/Forums/en/wcf/thread/cfef6695-8f6d-468f-9db5-8a27ee5a4b8f
Depois é possível deserializar o body da message com um método genérico:
public static T ParseBody(Message message)
{ TypedMessageConverter converter =
TypedMessageConverter.Create(typeof(T), message.Headers.Action);
T body = (T)converter.FromMessage(message);
return body;
}
mais detalhes: http://social.msdn.microsoft.com/Forums/en/wcf/thread/fd7f8df9-4a83-4285-be91-b9adb0c1888a
Quando o pedido é recebido ainda não está deserializado para a respectiva classe .Net, achei problemático fazer esta deserialização. Após alguma investigação uma das formas que encontrei foi usar a classe TypedMessageConverter.
Nota: atenção que ao deserializar a mensagem é preciso criar uma cópia da Message usando este código:
MessageBuffer msgBuffer = message.CreateBufferedCopy(MaxMessageSize);
mais detalhes: http://social.msdn.microsoft.com/Forums/en/wcf/thread/cfef6695-8f6d-468f-9db5-8a27ee5a4b8f
Depois é possível deserializar o body da message com um método genérico:
public static T ParseBody
{ TypedMessageConverter converter =
TypedMessageConverter.Create(typeof(T), message.Headers.Action);
T body = (T)converter.FromMessage(message);
return body;
}
mais detalhes: http://social.msdn.microsoft.com/Forums/en/wcf/thread/fd7f8df9-4a83-4285-be91-b9adb0c1888a
Etiquetas:
AfterReceiveRequest,
behavior,
IDispatchMessageInspector,
WCF,
web services
domingo, 30 de outubro de 2011
SharePoint 2010: Esconder a Ribbon dos utilizadores anónimos
No SharePoint 2010, para esconder a ribbon dos utilizadores anónimos é necessário utilizar o controlo LoginView do ASP.net.
No AnonymousTemplate colocasse a seguinte regra de CSS #s4-ribbonrow { display: none;} para esconder a ribbon.
Exemplo:
No AnonymousTemplate colocasse a seguinte regra de CSS #s4-ribbonrow { display: none;} para esconder a ribbon.
Exemplo:
<asp:LoginView ID="Loginview1" runat="server">
<AnonymousTemplate>
<style type="text/css">
#s4-ribbonrow
{
display: none;
}
</style>
</AnonymousTemplate>
</asp:LoginView>
Etiquetas:
LoginView,
Ribbon,
SharePoint,
SharePoint 2010
quarta-feira, 19 de outubro de 2011
Lentidão no arranque do Firefox 7.0.1
Tenho notado alguma lentidão a abrir e a usar o Firefox 7.0.1, após alguma pesquisa no google a sugestão que funcionou para mim foi ir às Opções » Avançado » Geral » Desactivar Usar Aceleração por hardware quando disponível.
Realmente parece mais rápido tanto a abrir como a usar.
Realmente parece mais rápido tanto a abrir como a usar.
quinta-feira, 25 de agosto de 2011
Enumerações repetidas ao adicionar uma Service Reference no Visual Studio 2010.
Estava a criar um WCF WebService e estava a gerar enumerações duplicadas, exemplo: enum Tipo, enum Tipo2, enum Tipo3, etc.
Reparei que cada uma desta enumerações na Reference.cs tinha um namespace diferente. Após alguns testes, esta combinação funcionou para mim:
[System.Xml.Serialization.XmlRootAttribute(Namespace = "http://www.teste.pt/exemplo/Tipo", IsNullable = true)]
[DataContract(Namespace = "http://www.teste.pt/exemplo/Tipo")]
[XmlTypeAttribute(Namespace="http://www.teste.pt/exemplo/Tipo")]
public enum Tipo { ... }
O último atributo parece ter sido o que corrigiu a situação, as outras duas já existiam. Isto ainda precisa de mais uns testes mas pode ajudar alguém.
Reparei que cada uma desta enumerações na Reference.cs tinha um namespace diferente. Após alguns testes, esta combinação funcionou para mim:
[System.Xml.Serialization.XmlRootAttribute(Namespace = "http://www.teste.pt/exemplo/Tipo", IsNullable = true)]
[DataContract(Namespace = "http://www.teste.pt/exemplo/Tipo")]
[XmlTypeAttribute(Namespace="http://www.teste.pt/exemplo/Tipo")]
public enum Tipo { ... }
O último atributo parece ter sido o que corrigiu a situação, as outras duas já existiam. Isto ainda precisa de mais uns testes mas pode ajudar alguém.
Etiquetas:
enum,
enumeration,
WCF,
web development,
webservice
sexta-feira, 5 de agosto de 2011
Boot a partir de uma VM (apenas VHD).
Usar VMs normalmente pode ser um problema se o host não tiver recursos suficientes ou se pretendemos mais rapidez, um colega encontrou o seguinte blog que explica como criar uma VM na tecnologia VHD (usada pelo Virtual PC e Hyper-V por exemplo), e usar essa VM para fazer um boot alternativo ao Sistema Operativo instalado (Win7 64bits).
http://technet.microsoft.com/en-us/edge/ff944958
Desta forma usamos os recursos todos do host e, o melhor, podemos correr o ficheiro da VM a partir de um disco duro externo e ainda ter acesso aos discos que já existem na máquina.
Infelizmente não encontrei forma de converter VMs feitas para Virtual Box para VHD.
[Update]
Obrigado ao utilizador anónimo pela dica, vou experimentar este comando para transformar VMs feitas para VirtualBox para VHD...
Via cmd
VBoxManage clonehd source.vdi target.vhd --format vhd
http://technet.microsoft.com/en-us/edge/ff944958
Desta forma usamos os recursos todos do host e, o melhor, podemos correr o ficheiro da VM a partir de um disco duro externo e ainda ter acesso aos discos que já existem na máquina.
Infelizmente não encontrei forma de converter VMs feitas para Virtual Box para VHD.
[Update]
Obrigado ao utilizador anónimo pela dica, vou experimentar este comando para transformar VMs feitas para VirtualBox para VHD...
Via cmd
VBoxManage clonehd source.vdi target.vhd --format vhd
quinta-feira, 4 de agosto de 2011
SharePoint reserved querystring parameters
Para quem já teve más experiências a usar parâmetros num url para uma página customizada no SharePoint deixo um blog que indica algumas keywords reservadas para a construção de urls.
http://blogs.technet.com/b/stefan_gossner/archive/2009/01/30/querystring-parameters-you-should-not-use-in-your-sharepoint-application.aspx
Além das que o autor indica, também não aconselho muito usar a letra "k" como parâmetro porque é usada pelas webparts de resultados de pesquisa do SharePoint.
http://blogs.technet.com/b/stefan_gossner/archive/2009/01/30/querystring-parameters-you-should-not-use-in-your-sharepoint-application.aspx
Além das que o autor indica, também não aconselho muito usar a letra "k" como parâmetro porque é usada pelas webparts de resultados de pesquisa do SharePoint.
- FeatureId
- ListTemplate
- List
- ID
- VersionNo
- ContentTypeId
- RootFolder
- View
- FolderCTID
- Mode
- Type
Etiquetas:
keywords,
moss,
querystring,
sharepoint 2007
Subscrever:
Mensagens (Atom)


