Arquivos de Categorias: Computação - Page 3

Pedra na Janela

Achei aqui um “macumba” pra resolver alguns erros estranhos do Windows:


ipconfig /flushdns
Cd %windir%
del /s *.chk;*.rip;*.tmp;~*.*
msiexec /regserver
sc config msiserver start= auto
net stop msiserver
msiexec /unreg
msiexec /regserver
regsvr32 msi.dll /s
regsvr32 msihnd.dll /s
net start msiserver
Regsvr32 wuaueng.dll /s
net stop wuauserv
cd /d %windir%
rmdir /s /q softwaredistribution
net start wuauserv
sc config eventlog start= auto obj= Localsystem
net start eventlog
regsvr32 qmgr.dll /s
regsvr32 qmgrprxy.dll /s
sc sdset bits D:(A;;CCLCSWRPWPDTLOCRRC;;;SY)(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;BA)(A;;CCLCSWLOCRRC;;;AU)(A;;CCLCSWRPWPDTLOCRRC;;;PU)
regsvr32 wuaueng.dll /s
sc sdset wuauserv D:(A;;CCLCSWRPWPDTLOCRRC;;;SY)(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;BA)(A;;CCLCSWLOCRRC;;;AU)(A;;CCLCSWRPWPDTLOCRRC;;;PU)
sc config wuauserv start= auto obj= Localsystem
net stop wuauserv
sc config bits start= DEMAND obj= Localsystem
net stop bits
regsvr32 msxml.dll /s
regsvr32 msxml2.dll /s
regsvr32 msxml3.dll /s
regsvr32 msxml4.dll /s
regsvr32 qmgr.dll /s
regsvr32 qmgrprxy.dll /s
regsvr32 muweb.dll /s
regsvr32 winhttp.dll /s
regsvr32 wuapi.dll /s
regsvr32 wuaueng.dll /s
regsvr32 wuaueng1.dll /s
regsvr32 wucltui.dll /s
regsvr32 wups.dll /s
regsvr32 wups2.dll /s
regsvr32 wuweb.dll /s
net start wuauserv
net start bits
sc config cryptsvc start= auto
net stop cryptsvc
cd %windir%\system32\catroot2
del *.* /f/q/s
regsvr32 cryptdlg.dll /s
regsvr32 cryptui.dll /s
regsvr32 dssenh.dll /s
regsvr32 gpkcsp.dll /s
regsvr32 initpki.dll /s
regsvr32 mssip32.dll /s
regsvr32 sccbase.dll /s
regsvr32 softpub.dll /s
regsvr32 slbcsp.dll /s
regsvr32 rsaenh.dll /s
regsvr32 winhttp.dll /s
regsvr32 wintrust.dll /s
net start cryptsvc
cd\
sc config ose start= demand
net start ose
regsvr32 qmgr.dll /s
regsvr32 qmgrprxy.dll /s
regsvr32 es.dll /s
pause

Como identificar pen drive pirata

Muitos do pen drives vendidos na Santa Efigênia ou no Mercado Livre são falsificados, principalmente os Kingstons e Sony. Os próprios lojistas falam que existe de 1ª linha a 4ª linha e qualquer um pode ser vítima de falsificação.

A falsificação chegou a um nível que a própria Kingston lançou um site para verificar se um pendrive é falso. O ruim é que precisa do blister (embalagem) pra verificar.

Acho que essa onda de pirataria surgiu por conta dos pen drives de 16gb ou até 32gb, que se popularizaram pra carregar filmes, músicas MP3 ou até mesmo fotos de câmeras digitais. Como não precisa de driver pra instalar pen drive USB no Windows XP, é muito mais prático usar um pendrive que um CD ou DVD…

Hoje também fiquei sabendo que pra um pen drive funcionar em som de carro tem de formatar em FAT32, se for formatado em NTFS ou o EXT do Linux não funciona.

O meu de 8gb é original, ufa!

Números Primos em Python

Utilizando meu tempo nerd ocioso, criei um algoritmo linear para descobrir números primos e implementei em Python.

Deixei ele calculando todos os números primos até 10 milhões (em um Pentium 4 3.00GHz com 1Gb de RAM) e chegou ao resultado:

  • existem 664.580 números primos entre 0 e 10.000.000;
  • os últimos 5 números primos nesse intervalo são 9.999.937, 9.999.943, 9.999.971, 9.999.973 e 9.999.991;
  • o programa demorou 12.980 segundos (pouco mais de 3 horas e meia) pra calcular esses 664.580 números primos;
  • a média de cálculo foi de 195ms por número primo.

Bug no Google App Engine

Esses dias eu não postei nada no blog pois estou criando uma aplicação em Python utilizando o Google App Engine.

Uma parte da aplicação retorna um XML. No ambiente de desenvolvimento (meu computador) o código abaixo retorna corretamente o XML para o browser:

[code lang=”python”]self.response.headers.add_header(“Content-Type”, “text/xml”)
self.response.out.write(rstr)[/code]

No entanto, em produção (no servidor appspot.com), o browser exibia o XML como se o content-type fosse text/html e não text/xml. Ou seja, tinha de ficar indo em “exibir código fonte” pra poder ver o XML gerado.

Para funcionar, tive de mudar o código acima para o abaixo:

[code lang=”python”]self.response.headers[“Content-Type”] = “text/xml”
self.response.out.write(rstr)[/code]

Deve ser algum bug no response da biblioteca webapp do GAE

Como são os nerds de TI?

Meu xará do Revolução ETC. listou as 50 características do nerd de TI.

Concordo com a maioria… e também tenho a maioria das características…

Tendências de tecnologia para 2009

Eu trabalho principalmente como desenvolvedor devido à minha natureza nerd, mas algumas vezes sou alocado para fazer trabalhos de analista, designer (de software) ou arquiteto.

No entanto, a equipe tem o Sr. Biscoito, arquiteto de cacife que está sempre atualizado com as últimas novidades tecnologógicas, tanto do mundo .NET quanto da vertente Java. No início do ano ele me passou uma lista com sua previsão para tendências de 2009, que listo abaixo.

  • Processo de Desenvolvimento
    • Scrum
    • TDD
    • MDD
    • Refatoração
  • Frameworks e Tecnologias
    • NHibernate, JPA
    • Linq (Linq, Linq-SQL, Linq-XML e a extensão PLINQ)
    • Entity Framework
    • WCF
    • WPF, Silverlight, JavaFX e Adobe Flex
    • Expressões Lambda e Closures
    • AOP (Programação Orientada a Aspecto)
    • EAI (Enterprise Application Integration), Padrões de Projeto de Integração
    • Injeção de Dependência (conceitos e frameworks: Castle Windsor e Spring.NET)
    • Metadados de Classes e Reflexão: Anotações (Java Annotations) e Atributos (.NET Attributes)
  • Tendências
    • Python, DJango e Google Apps
    • Ruby on Rails
    • Linguagens Funcionais: F# e Scala

Pretendo fazer um post com uma análise de cada item desses ao longo do ano.

Acesso negado ao gerenciar serviço no Windows

Depois do cansativo dia de ontem, quando saí do confortável mundo da progração C# e fui para o tenebroso território das permissões, autorizações, auditoria e configurações de arquivos, usuários, serviços e grupos, finalmente cheguei em uma solução para meu problema (exceção System.InvalidOperationException, com a seguinte mensagem: Não é possível abrir o serviço RoboMovimentacaoServico no computador ‘‘nome_servidor’ sendo que a InnerException foi Access is denied).

Segui o conselho do Craig Box e baixei o SubInAcl pra dar permissões no windows service, mas o que mais me ajudou foi uma página da Microsoft ensinando a conceder aos usuários direitos para gerenciar os serviços no Windows 2000, mas que também é válido para o Windows 2003.

O primeiro passo foi dar permissão total para o usuário da aplicação (sendo nome_servidor o nome do servidor, nome_usuário o nome do usuário,  nome_grupo o nome do grupo e RoboMovimentacaoServico o nome do serviço):

[code]subinacl.exe /service \\nome_servidor\RoboMovimentacaoServico /GRANT=nome_usuário[/code]

Não funcionou. Então tirei essa permissão e dei permissão pro grupo do usuário:

[code]subinacl.exe /service \\nome_servidor\RoboMovimentacaoServico /REVOKE=nome_usuário
subinacl.exe /service \\nome_servidor\RoboMovimentacaoServico /GRANT=nome_grupo[/code]

Também não funcionou, então tirei essa autorização e dei autorização para os usuários autenticados:

[code]subinacl.exe /service \\nome_servidor\RoboMovimentacaoServico /REVOKE=nome_grupo
subinacl.exe /service \\nome_servidor\RoboMovimentacaoServico /GRANT=”authenticated users”[/code]

Funcionou! Consegui iniciar, parar e ver o status do serviço RoboMovimentacaoServico no servidor de COM através da página em ASP.NET no servidor web!

O próximo passo foi tirar a autorização full e deixar apenas as que eu necessitava. Na tentativa e erro descobri que as necessárias são:

S : Query Service Status (para consultar o status do serviço)
E : Enumerate Dependent Services (para parar o serviço)
T : Start Service (para iniciar o serviço)
O : Stop Service (para parar o serviço)

Então o comando ficou assim:

[code]subinacl.exe /service \\nome_servidor\RoboMovimentacaoServico /GRANT=”authenticated users”=SETO[/code]

Isso seria o mesmo que utilizar o comando abaixo:

[code]sd.exe sdset RoboMovimentacaoServico D:(A;;CCLCSWRPWPDTLOCRRC;;;SY)(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;BA)(A;;CCLCSWLOCRRC;;;IU)(A;;CCLCSWLOCRRC;;;SU)(A;;LCSWRPWP;;;AU)(A;;CCLCSWRPWPDTLOCRRC;;;PU)S:(AU;FA;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;WD)[/code]

Esse comando mudaria o default (A;;U;;;AU) para (A;;LCSWRPWP;;;AU).

Em desenvolvimento não tive de alterar nada, em TI tive todo esse trampo. Em homologação, certificação e produção muito provavelmente nada poderei fazer… não sei como é a configuração dos ambientes e muito menos terei acesso para executar o SC.exe, pois o SubInAcl.exe não está instalado nesses servidores.

Amanhã tentarei conceder essas autorizações sem precisar autorizar todos os usuários autenticados.

ASP.NET, Serviço do Windows e permissões

Fiz no trabalho uma aplicação em ASP.NET (com C# no server side) que consulta o status de um Windows Service que eu havia criado, podendo pará-lo ou iniciá-lo.

Como nós temos balanceamento de carga em produção, o serviço será instalado em 4 servidores mas em apenas um deles ele será iniciado para ficar em execução. A página que criei permite escolher em qual servidor iniciar/parar o serviço, bem como ver o status em tempo real e não deixar iniciar em mais de um servidor ao mesmo tempo.

Criei os métodos abaixo pra controlar o serviço (tirei o tratamento de erro para ficar mais claro):

[code lang=”C#”]using System.ServiceProcess;

public void IniciarServico(string nomeServico, string nomeServidor)
{
ServiceController servico = new ServiceController(nomeServico, nomeServidor);
if (servico.Status == ServiceControllerStatus.Stopped)
{
servico.Start();
servico.WaitForStatus(ServiceControllerStatus.Running);
}
}

public void PararServico(string nomeServico, string nomeServidor)
{
ServiceController servico = new ServiceController(nomeServico, nomeServidor);
if (servico.CanStop)
servico.Stop();
}

public string StatusServico(string nomeServico, string nomeServidor)
{
return new ServiceController(nomeServico, nomeServidor).Status.ToString();
}[/code]

Tudo funcionou muito bem nos testes unitários e no ambiente de desenvolvimento, mas no ambiente de TI (Testes Integrados), começou a retornar exceção System.InvalidOperationException, com a seguinte mensagem: Não é possível abrir o serviço RoboMovimentacaoServico no computador ‘‘xxxxxxxxxx’ sendo que a InnerException foi Access is denied.

Pesquisando na Internet achei um problema muito semelhante ao meu, onde um tal de Charlie dá uma resposta sugerindo modificar o security descriptor (DACL) para incluir permissões de SERVICE_START, SERVICE_STOP e, opcionalmente, GENERIC_READ.

Segundo ele existem duas formas de fazer isso:

  • através de linha de comando utilizando o SC do Windows
  • criando um programa em C++ e utilizando a API SetNamedSecurityInfo

Resolvi procurar por uma solução em C# e achei no stackenbloggen… mas além de não funcionar por falta de permissão, excluiu todos os acessos ao serviço! Não conseguia iniciar, parar, ver as propriedades, desinstalar, excluir… sempre dava erro “5 – Access Denied“. Na hora pensei: f*deu!

Felizmente outro cara já havia passado por isso e deu as dicas de como redefinir uma DACL vazia em um descritor de segurança de um serviço em um computador Windows Server 2003:

  • abrir um prompt de comando no modo interativo, para ficar logado com o usuário NT AUTHORITY\SYSTEM (conta de sistema). O comando pra fazer isso é: “at 18:05 cmd.exe /interactive” (sem as aspas, onde 18:05 é a hora daqui a 1 minuto)
  • utilizar o comando “sc sdset service_name D:(A;;CCLCSWLOCRRC;;;AU)(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;BA)(A;;CCDCLCSWRPWPDTLCRSDRCWDWO;;;SO)(A;;CCLCSWRPWPDTLOCRRC;;;SY)S:(AU;FA;CCDCLCSWRPWPDTLOCRSDRCWDWO;;WD)” (sem as aspas, onde service_name é o nome do serviço)

Obs.: pro prompt abrir, tive de deixar aberta a tela de tarefas agendadas (Start -> Programs -> Accessories -> System Tools -> Scheduled Tasks).

O comando SC é meio cavernoso, então vou partir para o SubInAcl, que descobri nessa página do Craig Box.

Ele teve um problema idêntico ao meu e chegou à conclusão de que no teste unitário o serviço é controlado interativamente e pelo site o processo do IIS utiliza uma conta de usuário, que não tem acesso ao serviço. Pelo SubInAcl (assim como pelo SC) é possível incluir essa autorização, sendo que pelo SubInAcl é muuuuito mais fácil. A única desvantagem do SubInAcl é que ele não vem instalado no Windows, ao contrário do SC…

Amanhã brinco um pouco com o SC, o SubInAcl e o código em C# pra configurar esse serviço…

Update: consegui conceder o acesso utilizando tanto o SC quanto o SubInAcl.

Aprendendo Python e números primos

Hoje chegou o livro Learning Python, do Mark Lutz, que comprei na Amazon no dia 21 de Novembro.

Comecei a ler no metrô e vou deixar o Dracula de lado pra ler este livro. Vou tentar terminar até o fim do ano e para isso teria de ler dois capítulos por dia. Hoje já fiz a minha parte e li os dois primeiros!

O único exemplo que teve até agora foi o trivial Hello World e me empolguei tanto que já fiz um programa que calcula números primos. A linguagem realmente é uma delícia! Fácil de aprender, rápido de implementar e o código fica bem legível.

Tive a idéia desse algoritmo para calcular números primos em um sonho… nerd é foda! Não sei se ele é tão eficiente quanto os que existem por aí, mas uma coisa posso garantir, ele usa 100% de CPU e vai comendo a memória lentamente. Em 4 minutos calculei todos os números primos entre 1 e 100.000 e o consumo de memória subiu de 2Mb para 6Mb…

Prendo fazer uma interpolação do consumo de memória e tempo de processamento para ter uma estimativa de em quanto tempo eu conseguiria calcular todos os primos até 1.000.000 ou mais.

Resultados do Google Code Jam

Hoje achei um site com estatísticas dos resultados do Google Code Jam 2008. Vi minhas colocações, e a popularidade de cada linguagem de programação.

Como era de se esperar, C++ é a linguagem mais utilizada, mas eu não imaginava que era assim tão mais usada.

No entanto, o que mais me impressionou é que dos 104 países que tiveram competidores, o Brasil foi o quinto com maior número de participantes na etapa de qualificação e no primeiro round, ficando atrás só de Índia, Estados Unidos, China e Rússia. No entanto, quantidade não é qualidade, pois dos que participaram, poucos avançaram para as próximas etapas.

Pro ano que vem quero me preparar pra ver se avanço para a terceira fase, pois esse ano parei na segunda.

Projeto: Tikuna

Nasceu ontem (mas como o blog ficou “morto” nessas últimas 24 horas só noticio agora) o Tikuna.

Será um site de comparação de preços com foco no Submarino e muitas diferenças para sites tradicionais de comparação de preços, como Bondfaro/Buscapé e Jacotei.

Desejem-me sorte!

Como subir código fonte para o Google Code

Assim que eu coloquei o ticker de Consulta Cotação Bovespa no Google Code, a primeira dificuldade que tive foi para colocar o código fonte dele no repositório do Google Code, que é usa o SVN (evolução do CVS, que mexi por alto no tempo de faculdade).

Como eu uso Windows e quero facilidade acima de tudo, nada de ficar digitando linha de comando, instalei o TortoiseSVN.

  1. No Windows Explorer, clica-se com o botão direito na pasta onde está o código fonte da aplicação e vai na opção TortoiseSVN -> Import…
  2. Abre-se uma tela onde pede para digitar a URL, que é a que fica na aba “Source” no projeto, no meu caso é https://cotacao.googlecode.com/svn/trunk/
  3. Nessa tela tem um campo para digitar uma mensagem, que pode ser “Versão inicial” ou algo do gênero.
  4. Pede login e senha. O login é o nome do Google Account, que também está na aba “Source” e no meu caso é cintra. Para descobrir a senha é só clicar no link googlecode.com password, nessa mesma aba.
  5. Pronto, agora os arquivos estão no repositório.

Como pela opção “Import…” todos os arquivos dentro da pasta são enviados, é interessante verificar antes se não tem “lixo” na pasta, como arquivos temporários ou binários. O repositório de código é para armazenar apenas código!

No Google Codes existem 4 pastas:

  • branches (galhos): são versões derivadas de outras versões. Pode ser uma versão intermediária, que ainda não está estável. Não é uma cópia física da versão, apenas um “link”.
  • tags (etiquetas): no Source Safe era chamado de Labels, servem para identificar uma versão. Também não é uma cópia física da versão, apenas um “link”.
  • trunk (tronco): é a versão principal da aplicação e não deixa de ser um “branch”
  • wiki: é onde ficam as páginas wiki do site do projeto.

Então após ter subido o código fonte para a pasta trunk, eu criei uma tag para a versão que eu subi, que é a 2.4.1 e o procedimento também é muito simples.

  1. No Windows Explorer clicar com o botão direito do mouse em uma pasta e ir em “SVN Checkout…” e fazer o checkout da pasta trunk do projeto
  2. Clicar novamente na pasta e ir em “TortoiseSVN” -> “Branch/tag…”
  3. Digitar a URL de destino (no meu caso deixei como https://cotacao.googlecode.com/svn/tags/2.4.1/)
  4. Informar o “Create copy in the repository from:”. Como no meu caso é para usar a última versão, eu marquei a opção “Head”
  5. Informar uma mensagem e mandar bala!

Não acho que o TortoiseSVN seja o melhor programa, vou tentar outros também. Minha busca é para um que funcione atrás de proxy.

Google Code Jam 2008

Acabou-se o que era doce… não passei para a segunda fase online do Google Code Jam 2008

Na sexta feira teria passado se tivesse usado variável long no lugar de int… deu overflow e o Visual Studio não sobe exceção de overflow automaticamente… então o teste longo não passou 🙁

No sábado consegui terminar o segundo exercício 2 minutos depois do fim do tempo, mas mesmo se tivesse entregado, não ficaria entre os 840 primeiros…

Fica para o ano que vem…

Cotação Bovespa

Consulta Cotação BovespaSou computeiro nerd e quando terminei um curso de Web Services em C# .NET, no dia seguinte já comecei a fazer um webservice para consultar e retornar cotação Bovespa.

O webservice já está pronto e funcionando (de forma gratuita), podendo consultar as cotações de uma ou mais ações por vez. Ele retorna preço de abertura, preço médio, preço mínimo, 5 melhores ofertas de compra, 5 melhores ofertas de venda, descrição da ação, data do pregão, valor médio, valor atual, variação (em porcentagem) e volume.

Também fiz uma espécie de ticker/monitor de cotação Bovespa, para poder acompanhar a evolução das ações durante o dia, que é um cliente que acessa o webservice que criei, tudo isso de graça.

A última utilidade que dei para o webservice foi uma planilha de Excel para controle de ações compradas e vendidas, bem como acompanhar o preço das ações em carteira, atualizando o preço das ações em carteiras (ainda não vendidas) automaticamente. Essa eu ainda vou disponibilizar disponibilizei for free!

Update: o download da planilha pode ser feito aqui.

Update 2: o código fonte do ticker pode ser baixado aqui.

Mover blog do Blogger para o WordPress

Uma das vantagens de mudar de hospedagem é que saí de um servidor Windows com IIS e fui para um Linux com Apache, podendo utilizar o famoso mod_rewrite para definitivamente migrar meu blog do Blogger para o WordPress.

Eu tinha mantido os arquivos .html e .php no site, colocando um redirecionador nos .php, mas o Google e todo mecanismo de procura continuava enxergando as três versões (do Blogger em PHP, do Blogger em HTML e do WordPress). Chegava ao cúmulo de aparecerem comentários na versão do Blogger!

A migração foi bem simples:

  1. mudar o permalink de “/index.php/%year%/%monthnum%/%postname%/” para “/%category%/%postname%/”
  2. instalar o plugin Dean’s Permalinks Migration (existe um bug na versão 1.0 e eu instalei a versão 1.1-gx)
  3. colocar o antigo permalink no plugin acima
  4. acrescentar as linhas abaixo no início do arquivo .htaccess

[code]RewriteRule ^([0-9]{4})/([0-9]){2}/(.+)\.(php|html)$ index.php/$1/$2/$3 [R=301,NC,L]
RewriteRule ^([0-9]{4})_([0-9]){2}_01_(holococos_)?archive\.(php|html)$ index.php/$1/$2/$3 [R=301,NC,L][/code]

A primeira linha redireciona permanentemente links do tipo https://holococos.sjdr.com.br/2007/01/ano-novo.php ou https://holococos.sjdr.com.br/2007/01/ano-novo.html para https://holococos.sjdr.com.br/index.php/2007/01/ano-novo/ que, pelo fato de seguir o antigo permalink, será redirecionado permanente pelo plugin Dean’s Permalinks Migration para https://holococos.sjdr.com.br/nonsense/ano-novo/

A segunda linha redireciona as antigas páginas de arquivo do Blogger, utilizando a mesma lógica.