Thursday, October 09, 2008

Novo blog

Com o passar do tempo, fiquei entediado com esse blog. Na verdade, fiquei entediado com o fato de usar o blogger.com como plataforma de blogging, então decidi criar minha propria plataforma :-)

Até o final do mês devo colocar no ar. Na verdade será mais do que um blog, mas nessa primeira etapa, só o blog irá ao ar.

Apesar de ser desenvolvido em ruby on rails, o blog não será somente sobre "how sexy ruby is". Ainda não decidi se escrevo em português, inglês ou alemão, mas como não falo nenhuma das 3 linguas direito, provavelmente escreverei nas 3 :-)

O engraçado sobre ruby, é que quase todo livro, screencasting ou tutorial, eles mostram "veja, você cria um blog em 20 minutos", o que na verdade é uma falácia. Em 20 minutos você cria um esqueleto (bem tosco) de um rascunho de blog. De qualquer forma, rails é um excelente framework que oferece muitas facilidades no desenvolvimento muitas vezes abrindo mão da melhor performance. O Twitter por exemplo, que sempre foi desenvolvido em ror, abriu o bico e agora pensa em migrar para php ou java

Friday, September 19, 2008



Eu não podia deixar de posta aqui

Fucs e Augusto em algum lugar em amsterdam :-)

Friday, September 12, 2008

Gmail é ignorante?
Não sei por que, uma das minhas contas do gmail tem português configurado como lingua, e para minha surpresa, o Google, traduz "me" para "mim"? Isso está correto? Que coisa horrivel!



Saturday, September 06, 2008

Pluging de autenticação OTP para o joomla.

Para aqueles que utilizam joomla e desejam um segundo fator de autenticação para os usuários administradores, desenvolvi um plugin que permite isso. Como é um port de outro projeto que eu fiz, tem alguns pedaços faltando que com o passar do tempo, vou adicionando ao repositório.

A parte de geração e envio dos OTPs (neste caso, feito por e-mail) e a stored procedure pra limpar os OTPs antigos eu vou adicionar na sequencia.

Para quem quiser, algo especifico ou dar alguma sugestão, me contate.

Link: http://code.google.com/p/joomla-otp-auth/

Monday, July 21, 2008

Stored Procedures: Não é somente best-pratices, é necessidade!

Um cliente meu, me pediu para corrigir um modulo asp que ele tem em seu sistema, que tem como função adicionar usuário. Além de criar o usuário, existe uma copia de perfil, que consiste basicamente em copia de registros SQL (entre 80 e 200 registros). A reclamação do meu cliente, era que essa criação de registro estava levando em torno de 10 - 12 minutos para ser executado. Uma eternidade para uma aplicação web.

Quando abri o código para analisar, encontrei algo assim:

sSQL = "SELECT NEWSLETTER_SUBSCRIPTION_ID,NEWSLETTER_SUBSCRIPTION.SUBSCRIPTION_END_DATE, NEWSLETTER_SUBSCRIPTION.SUBSCRIPTION_START_DATE, NEWSLETTER_SUBSCRIPTION.SUBSCRIPTION_MONTH FROM NEWSLETTER_SUBSCRIPTION INNER JOIN ORGANIZATION_CONTACT ON ORGANIZATION_CONTACT.CONTACT_ID = NEWSLETTER_SUBSCRIPTION.CONTACT_ID WHERE ORGANIZATION_CONTACT.ORGANIZATION_ID=" & session("OrgID")
rsTemp.Open sSQL, conn,1,3
set rsTemp2=server.CreateObject("ADODB.Recordset")
while Not rsTemp.eof
start_date = rsTemp("SUBSCRIPTION_START_DATE")
subscription_id = rsTemp("NEWSLETTER_SUBSCRIPTION_ID") + 1
end_date = rsTemp("SUBSCRIPTION_END_DATE")
subscription_month = rsTemp("SUBSCRIPTION_MONTH")
tSQL = "INSERT INTO NEWSLETTER_SUBSCRIPTION(NEWSLETTER_SUBSCRIPTION_ID,SUBSCRIPTION_START_DATE,SUBSCRIPTION_END_DATE,SUBSCRIPTION_MONTH) VALUES(" & subscription_id & nUSERID &"," & subscription_start_date & "," & subscription_end_date & ",'" & subscription_month & "')"
rsTemp2.Open tSQL, conn,1,3
Wend

Um select, percorre-se todos recordsets e se faz um novo insert com os dados do select. Isso funciona, para 5 registros, 10 registros, mas para aplicações onde o volume de dados é alto, isso acaba se tornando um problema.

Solução: através de uma simples stored procedure usando tabelas temporarias, o tempo de execução, caiu de 10 - 12 minutos para 3 segundos :-)

Codigo da stored procedure:

USE [bowersp_testdb]
GO
/****** Object: StoredProcedure [bowersp_testuser].[setnews] Script Date: 07/19/2008 09:49:13 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:
-- Create date: <18/06/2008>
-- Description:
-- =============================================
ALTER PROCEDURE [bowersp_testuser].[setnews]
@OrgID int,
@UserID int
AS
CREATE TABLE #TEMPTABLE (CONTACT_ID INT,NEWSLETTER_SUBSCRIPTION_ID INT,SUBSCRIPTION_END_DATE datetime, SUBSCRIPTION_START_DATE datetime, SUBSCRIPTION_MONTH varchar(10),NEWSLETTER_ID varchar(5))

INSERT INTO #TEMPTABLE(CONTACT_ID,NEWSLETTER_SUBSCRIPTION_ID,SUBSCRIPTION_END_DATE, SUBSCRIPTION_START_DATE, SUBSCRIPTION_MONTH,NEWSLETTER_ID) SELECT NEWSLETTER_SUBSCRIPTION.CONTACT_ID,NEWSLETTER_SUBSCRIPTION_ID,NEWSLETTER_SUBSCRIPTION.SUBSCRIPTION_END_DATE, NEWSLETTER_SUBSCRIPTION.SUBSCRIPTION_START_DATE, NEWSLETTER_SUBSCRIPTION.SUBSCRIPTION_MONTH,NEWSLETTER_SUBSCRIPTION.NEWSLETTER_ID FROM NEWSLETTER_SUBSCRIPTION INNER JOIN ORGANIZATION_CONTACT ON ORGANIZATION_CONTACT.CONTACT_ID = NEWSLETTER_SUBSCRIPTION.CONTACT_ID WHERE ORGANIZATION_CONTACT.ORGANIZATION_ID=@OrgID

UPDATE #TEMPTABLE SET CONTACT_ID = @UserID

INSERT INTO NEWSLETTER_SUBSCRIPTION(CONTACT_ID,NEWSLETTER_SUBSCRIPTION_ID,SUBSCRIPTION_END_DATE, SUBSCRIPTION_START_DATE, SUBSCRIPTION_MONTH,NEWSLETTER_ID) SELECT CONTACT_ID,NEWSLETTER_SUBSCRIPTION_ID,SUBSCRIPTION_END_DATE, SUBSCRIPTION_START_DATE, SUBSCRIPTION_MONTH,NEWSLETTER_ID FROM #TEMPTABLE

Claro que passou pela minha cabeça, tirar todo código asp (45p 5uck5, L1nux Rul3z) e colocar o mod_security, mas isso é papo para outra conversa :-PPPPP

Monday, October 15, 2007

Estamos mal na fita heim

Estava este fim de semana, fui colocar o Tor pra funcionar com Skype (Gugu, bots saindo via TOR, heim, heim, heim) e passeando no FAQ deles achei uma coisa curiosa:

Abuse FAQ for Tor Server Operators

Doesn't Tor enable criminals to do bad things?
Criminals can already do bad things. Since they're willing to break laws, they already have lots of options available that provide better privacy than Tor provides. They can steal cell phones, use them, and throw them in a ditch; they can crack into computers in Korea or Brazil and use them to launch abusive activities; they can use spyware, viruses, and other techniques to take control of literally millions of Windows machines around the world.

Monday, August 20, 2007

ASP.NET x WEB.CONFIG
Eu existo!! Embora continue no barco, atolado de trampo (e sem paciencia para postar aqui) achei uma coisa interessante enquanto desenvolvia uma aplicação web ASP.NET

Sabe aquele dilema sobre "o que fazer com as informações de ConnectionString, credencial de contexto e etc" ?

Então, descobri que é possivel criptografar o web.config (todo ou só alguns campos). Não acho interessante criptografar tudo, mas pelo menos o usuário utilizado para rodar o ASP.NET e a ConnectionString (caso sua aplicação fale com banco de dados).

Alias, eu rodo a aplicação ASP.NET sob o contexto de um usuário de rede, dou permissão customizada para este usuário no banco e criptografo as seguintes partes do web.config:

identity
connectionStrings
Para utilizar isso fica muito facil:
Alterar o web.config incluindo a sua connectionString (servidor, datasource, etc, etc):
<connectionStrings> <add name="MainConnectionString" connectionString="server=foobar.tralala-br.com;database=SEGURANCA;Trusted_Connection=yes" providerName="System.Data.SqlClient" /> </connectionStrings>

E basta alterar a sua aplicação para utilizar as informações do web.config (C#):
SqlConnection myConnection = new SqlConnection(ConfigurationManager.ConnectionStrings["MainConnectionString"].ConnectionString);
Agora basta criptografar: Pode se utilizar chaves RSA ou a chave DPAPI da maquina (Que é a opção que escolhi) através do aspnet_regiis.exe:
aspnet_regiis.exe -pef "connectionStrings" "C:\Inetpub\wwwroot\MeuSite" –prov "DataProtectionConfigurationProvider"
Observação: Esta tecnica protege contra quem consegue ter acesso ao arquivo web.config. Caso a pessoa tenha acesso a máquina, é possivel rodar novamente o aspnet.regiis.exe e decifrar o arquivo sem problemas. Caso rode o aspnet_regiis.exe em outra máquina, não conseguirá pois a chave DPAPI é diferente.
VP