set host=localhost
set user=youruser
set password=yourpassword
set file=%appdata%\Bitcoin\bitcoin.conf
set pf=%programfiles(x86)%
set start=start ""
if "%pf%"=="" set pf=%programfiles%
echo rpcuser=%user% > %file%
echo rpcpassword=%password% >> %file%
%start% "%pf%\Bitcoin\Bitcoin.exe" -server
for /l %%X in (0,1,1) do %start% poclbm.exe -o %host% -d%%X -u %user% --pass=%password%
quarta-feira, 6 de julho de 2011
Automatizando a mineiração de Bitcoins no Windows
Criei um pequeno script para facilitar a mineiração de Bitcoins no Windows
terça-feira, 8 de fevereiro de 2011
Como hospedar serviços WCF no IIS
Para o IIS 6.0 é necessário um comando a mais que para o IIS 7.0
"%windir%\Microsoft.NET\Framework\v2.0.50727\aspnet_regiis" -i "%windir%\Microsoft.NET\Framework\v3.0\Windows Communication Foundation\ServiceModelReg.exe" -i
Para no IIS 7.0 para Windows 64 bits é necessário adaptar o caminho
"%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_regiis" -i
"%windir%\Microsoft.NET\Framework64\v3.0\Windows Communication Foundation\ServiceModelReg.exe" -i
terça-feira, 1 de fevereiro de 2011
Hudson CI versus Jenkins CI
Kohsuke Kawaguchi criou o Hudson-CI quando trabalhava na Oracle, mas a mesma licenciou o software como livre, com a exceção do nome “Hudson” que é propriedade da empresa.
Depois que Koshuke mudou de empresa, ele e a maioria esmagadora dos desenvolvedores queriam mover o repositório do site Java.net para o Github por causa do baixo percentual de disponibilidade do primeiro e das migrações com outages. A Oracle não concordou. Por isso agora o há um novo branch do Hudson. O mantido pelo desenvolvedor original e pela maioria da comunidade se passará a chamar Jenkins. Como ainda não há diferença entre as duas versões, tanto faz escolher. Mas como o Jenkins provavelmente terá mais desenvolvedores eu pretendo utilizá-lo.
Depois que Koshuke mudou de empresa, ele e a maioria esmagadora dos desenvolvedores queriam mover o repositório do site Java.net para o Github por causa do baixo percentual de disponibilidade do primeiro e das migrações com outages. A Oracle não concordou. Por isso agora o há um novo branch do Hudson. O mantido pelo desenvolvedor original e pela maioria da comunidade se passará a chamar Jenkins. Como ainda não há diferença entre as duas versões, tanto faz escolher. Mas como o Jenkins provavelmente terá mais desenvolvedores eu pretendo utilizá-lo.
Linq e seu filho mais famoso Linq-to-SQL
Com o .NET 3.0 e com o C# 3.0 foram introduzidas extensões à linguagem C# que mudou a forma de programar de muita gente. Uma das adições é uma syntaxe parecida com o SQL:
Mas também foram adicionados os Extension Methods:
Antes o tipo
int[] numbers = { 1, 2, 3 }; var numbersPlusOne = from n in numbers select n + 1;
Mas também foram adicionados os Extension Methods:
int[] numbers = { 1, 2, 3 }; var numbersPlusOne = numbers .Select(n => n + 1);
Antes o tipo
int[]
não possuía o método Array.Select(Func<T, TResult>)
. Mas esse método pôde ser adicionado sem modificações à classe original através dos Extension Methods. Note que os dois trechos de código acima são equivalentes, apenas escritos de forma diferente, ambos em C# 3.0.
Breve introdução ao Mapeamento Objeto-Relacional para .NET
Antes do Mapeamento Objeto-Relacional (ORM em inglês) automatizado surgir tínhamos que desenvolver nossas classes de acesso a dados manualmente.
Esta classe é responsável por:
Esta classe é responsável por:
- expor métodos para consulta ou atualização do banco, e para cada um destes métodos:
- serializar os parâmetros
- gerar e executar o código SQL
- deserializar o resultado
E pelo fato da linguagem SQL mudar de um SGBD para outro, se ela for gerada manualmente a migração de bancos ficava muito difícil. Com a introdução dos ORMs estas classes não precisam mais serem escritas nem precisamos nos preocupar com migração de bancos.
Os principais ORMs para .NET são
- NHibernate (FOSS)
- Linq-to-SQL (.NET 3.0)
- Entity Framework 1.0 (.NET 3.5)
- Entity Framework 4.0 (.NET 4.0)
O que é o Windows Communication Foundation (WCF)?
O WCF é uma biblioteca de comunicação introduzida a partir da versão 3.0 do .NET Framework que permite isolar a "implementação do serviço" do "protocolo de comunicação". Além de facilitar a serialização e deserialização dos dados, esta biblioteca também disponibiliza implementações intercambiáveis dos principais protocolos de comunicação. por exemplo:
O WCF exige que os dados a serem comunicados e os métodos de comunicação sejam definidos em tempo de compilação, mas os protocolos de comunicação, endereços, métodos de autenticação, métodos de serialização, método de criptografia e outros detalhes da comunicação podem ser definidos em tempo de execução. A configuração destes itens pode ser feita sem escrever código, pois para a maioria das opções mais populares basta apenas mudar uma entrada no arquivo de configuração.
Alguns protocolos no WCF foram implementados para a interoperabilidade com outras linguagens e plataformas de desenvolvimento, além de poderem ser consumidos por clientes implementados em .NET. O WCF também permite expor metadados sobre o serviço, facilitando o consumo destes.
Serviços que utilizam WCF podem rodar no IIS ou em aplicações normais, sejam elas de linha de comando, aplicações gráficas ou serviços do Windows. O WCF pode ser usado em vários cenários, permitindo uma rápida e eficiente implementação de:
O WCF também foi implementado no framework Mono, mas apenas parcialmente.
- TCP
- HTTP - REST
- SOAP
- Named Pipes
- Message Queues
O WCF exige que os dados a serem comunicados e os métodos de comunicação sejam definidos em tempo de compilação, mas os protocolos de comunicação, endereços, métodos de autenticação, métodos de serialização, método de criptografia e outros detalhes da comunicação podem ser definidos em tempo de execução. A configuração destes itens pode ser feita sem escrever código, pois para a maioria das opções mais populares basta apenas mudar uma entrada no arquivo de configuração.
Alguns protocolos no WCF foram implementados para a interoperabilidade com outras linguagens e plataformas de desenvolvimento, além de poderem ser consumidos por clientes implementados em .NET. O WCF também permite expor metadados sobre o serviço, facilitando o consumo destes.
Serviços que utilizam WCF podem rodar no IIS ou em aplicações normais, sejam elas de linha de comando, aplicações gráficas ou serviços do Windows. O WCF pode ser usado em vários cenários, permitindo uma rápida e eficiente implementação de:
- comunicação entre processos da mesma máquina (ex: pipes nomeados)
- webservices
- web APIs
- comunicação desconectada (ex: message queue, envie e esqueça)
- comunicação bi-direcional (ex: assinatura e publicação)
O WCF também foi implementado no framework Mono, mas apenas parcialmente.
sábado, 29 de janeiro de 2011
As 4 componentes da programação Web
Sempre é bom relembrar: uma aplicação HTML é composta de 4 elementos:
- Conteúdo (strings)
- Estrutura (HTML)
- Comportamento (JavaScript)
- Apresentação (<br>, <font>, <center>, style e CSS)
Normalmente se separam estas partes nos seguintes arquivos:
- arquivos server-side: .php, .cs, .py, .java, .resources, etc - suporta HTML, JavaScript e CSS
- .html - suporta HTML, JavaScript e CSS
- .js - suporta HTML, JavaScript e estilos
- .css - suporta CSS
Como vocês podem ver, é possível incluir CSS em todo tipo de arquivo. Agora imagine-se desenvolvendo ou mantendo um programa que mistura tudo e põe as coisas erradas nos arquivos errados, fica uma bagunça. Então mais uma vez: ponha cada coisa no seu lugar. Essa mania de por tudo num arquivo só é coisa de quem não tem uma IDE decente e fica usando editores de texto simples para programar.
- Conteúdo no .html dificulta a internacionalização.
- Javascript no .html dificulta a compreensão e depuração do código, mesmo que seja um simples onclick.
- HTML no script do servidor ou no .js dificulta a leitura de código e formação correta do markup. Para contornar isso use um view engine. Ex: pure para JavaScript.
- CSS ou style no .html ou no .js dificulta a atualização de layout. Lembre-se: o layout ou design de uma página sempre muda.
Marcadores:
boas práticas,
css,
desenvolvimento web,
html,
javascript
terça-feira, 25 de janeiro de 2011
Extensões grátis para o Visual Studio
O Visual Studio nas versões pagas aceita plugins. Os mais úteis na minha opnião são:
- PowerCommands - adiciona comandos úteis aos menus de contexto, como por exemplo "Remove and Sort Usings" para a solução ou projeto inteiro.
- GhostDoc - Adiciona uma tecla de atalho que documenta automaticamente em inglês o método ou classe que o cursor está focando
Productivity Power Tools - entre outras funcionalidades fornece um "Solution Navigator" alternativo ao "Solution Explorer" que permite, entre outras coisas, encolher todos os projetos da solution com um clique- Collapse Selection In Solution Explorer - adiciona uma opção ao menu de contexto do "Solution Explorer" que permite encolher os projetos. Substitui a funcionalidade que eu mais usava do Productivity Power Tools sem os bugs daquele
- Solution Load Manager - Permite definir gatilhos de carregamento para os projetos de uma solution. Assim a solution carrega e roda mais rapidamente.
Marcadores:
ide,
mercurial,
plugin,
subversion,
visual studio
segunda-feira, 24 de janeiro de 2011
Desalocação de recursos em .NET
Graças ao Garbage Collector (GC) entre outras funcionalidades, no .NET a desalocação de recursos é simplificada em relação às plataformas não gerenciadas, como o Win32 C/C++, onde princípios como RAII são essenciais para a gerência de recursos.
O GC desaloca todos os recursos para os quais não há mais referência, assim as variáveis locais não necessitam que removamos as referências manualmente. Os objetos de determinado escopo, delimitado pelas chaves ('{' e '}'), são coletáveis assim que o escopo de execução é encerrado, e o GC, que é executado periodicamente, desalocará os recursos na próxima iteração.
Porém isso não ocorrerá se um objeto com tempo de vida maior guardar uma referência para o mesmo objeto:
O GC desaloca todos os recursos para os quais não há mais referência, assim as variáveis locais não necessitam que removamos as referências manualmente. Os objetos de determinado escopo, delimitado pelas chaves ('{' e '}'), são coletáveis assim que o escopo de execução é encerrado, e o GC, que é executado periodicamente, desalocará os recursos na próxima iteração.
{ Object objeto = new Object(); // código objeto = null; //desnecessário } //fim do escopo e o objeto é liberado para a coleta
Porém isso não ocorrerá se um objeto com tempo de vida maior guardar uma referência para o mesmo objeto:
private KeyValuePairMas alguns objetos utilizam recursos que não são gerenciados pelo GC. Um exemplo de um recurso não gerenciado é a exclusividade de acesso a um arquivo, ou outro tipo de Handle fornecido pela WinAPI. Para estes objetos é necessário executar o método Dispose:
StreamReader arquivo = new StreamReader(@"c:\autoexec.bat"); //código arquivo.Dispose();Mas se surgir uma exceção no meio do caminho, o método "Dispose" não será invocado. Portanto é necessário envolver o código num try-finally que garantirá que o recurso será liberado mesmo havendo exceções
StreamReader arquivo = new StreamReader(@"c:\autoexec.bat"); try { //código } finally { arquivo.Dispose(); }A linguagem C# possui um atalho para tal construção que é IL-equivalente à construção acima:
using(StreamReader arquivo = new StreamReader(@"c:\autoexec.bat")) { //código }Esta função "using" aceita como parâmetro qualquer objeto que implemente a interface
IDisposable
. Por padrão todos os objetos que herdem esta interface devem ser instanciados em blocos using, direta ou indiretamente.
Quando o escopo do objeto não for terminar imediatamente para algumas classes do .NET é necessário também remover a referência. Costuma-se utilizar tal procedimento com a classe System.Threading.Timer no caso a seguir:
public class Servico : ServiceBase { private Timer timer; protected override void OnStart(string[] args) { this.timer = new Timer(delegate { }); } protected override void OnStop() { this.timer.Dispose(); this.timer = null; } }A implementação acima falhará no caso de uma exceção, pois o método
timer.Dispose()
não será invocado. Para corrigir deveríamos sobrescrever o método Dispose(bool disposing)
implementado pela classe ServiceBase
:
protected override void Dispose(bool disposing) { if (disposing) { this.timer.Dispose(); } base.Dispose(disposing); }Que é equivalente a:
protected override void Dispose(bool disposing) { if (disposing) { using(this.timer) { } } base.Dispose(disposing); }Algumas outras classes do .NET não possuem uma implementação do método
Dispose()
da forma esperada, por exemplo as classes que herdam da interface ICommunicationObject. Para elas cria-se um wrapper que corrige este algoritmo:
public sealed class CommunicationObjectWrapper : IDisposable { public ICommunicationObject CommunicationObject { get; private set; } public CommunicationObjectWrapper(ICommunicationObject communicationObject) { CommunicationObject = communicationObject; } public void Close() { if (CommunicationObject != null) { CommunicationObject.Close(); } } public void Dispose() { if (CommunicationObject != null) { try { ((IDisposable)CommunicationObject).Dispose(); } catch (CommunicationException) { CommunicationObject.Abort(); } catch (TimeoutException) { CommunicationObject.Abort(); } catch (Exception) { CommunicationObject.Abort(); throw; } } } }
sexta-feira, 7 de janeiro de 2011
Registrando a extensão SVC no IIS (mapa MIME)
Se você obtiver o seguinte erro:
Basta executar como administrador
E reiniciar o IIS
Erro HTTP 404.3 - Not Found
A página que você está solicitando não pode ser servida devido à configuração da extensão. Se a página for um script, adicione um manipulador. Se for necessário baixar o arquivo, adicione um mapa MIME.
Basta executar como administrador
"%windir%\Microsoft.NET\Framework\v3.0\Windows Communication Foundation\ServiceModelReg.exe" -i
E reiniciar o IIS
quarta-feira, 5 de janeiro de 2011
Assinar:
Postagens (Atom)