domingo, 7 de novembro de 2010

Pra que serve o Page_PreRenderComplete afinal?

Bom,
Sabe aquele papo que todo problema serve para você aprender? Então, passei por um destes na semana passada que me fez pesquisar um pouco para conseguir resolver, e a solução foi um tanto curiosa por isso eu vou explicar cada ponto:

O Problema:
Tenho uma página onde utilizo um UpdateProgress, e dentro dele tenho um Label onde deverei informar o que esta acontecendo para o usuário, algo do tipo: "Buscando Empresa", "Vinculando Contatos", etc...
Alguém aí já tentou fazer um UpdateProgress.FindControl("ID_Controle")? você não pode fazer isto porque quando você acessa isto nos metodos que precedem ou até mesmo no próprio Page_Load(), o componente não foi renderizado e o que existe nele ainda é um Template.

Se você quer recaptular um pouco sobre os eventos disparados no post, dá uma olhada neste link do MSDN: Page Object Model

O Motivo:
Como eu disse antes, durante um page_load(), ou qualquer metodo de changed/click, o componente UpdateProgress ainda está com seu conteúdo na forma de um template. tornando a chamada de UpdateProgress.FindControl("ID_Controle") completamente ineficaz, pois sempre ela retornará null.


A Solução:
Após todas as alterações que são feitas no "HTML" pelos metodos de Page_Load, Changed ou Click, o framework ainda dispara alguns metodos que não estão por padrão assinados no seu arquivo de Code_Behind( .cs ou .vb). E o metodo que me salvou o dia é justamente um destes. Page_PreRenderComplete.

Este metodo é disparado logo após a renderização de todos os objetos estiver finalizada, porém ele ainda consegue referenciar cada objeto por seu Id (ainda pelo lado do servidor, não estou falando de ClientId).
Portanto se você precisar fazer algo neste sentido, utilize o Page_PreRenderComplete para fazer a chamada de FindControl no seu UpdateProgress.

C# Sintaxe:
protected void Page_PreRenderComplete
(object sender, EventArgs e)
{
//seu codigo aqui
}

VB Sintaxe:
Protected Sub Page_PreRenderComplete(ByVal sender As Object, 
ByVal e As System.EventArgs) Handles Me.PreRenderComplete 
'seu codigo aqui
End Sub


Se tiverem algum problema para resolver isto, por favor entrem em contato. Terei prazer em ajudar.

quinta-feira, 29 de abril de 2010

Você acha que trabalha com pessoas estúpidas?

Li alguns artigos interessantes sobre o tema, e adaptei um pouco à realidade que encontro em meu trabalho, acho que vale à leitura.

Se você acha que alguém de seu trabalho é estúpido, pense bem quais os motivos que o levaram a este julgamento. A menos que você seja uma pessoa com uma inteligência de um gênio (além de estatisticamente improvável, é possível que você não estivesse lendo este artigo), talvez você esteja julgando mal seu colega.

Vamos dizer que você não está apenas taxando seus colegas com este rótulo de modo à tentar se proteger e esconder suas próprias inseguranças(de qualquer forma faça esta pergunta à si mesmo, honestamente). Vamos assumir que você realmente acredita que as pessoas são estúpidas, provavelmente porque não consegue conversar, debater ou concordar com elas.

O que você realmente precisa analisar é o julgamento que elas fazem. Divergências nos julgamentos raramente são causadas por estupidez – seja no trabalho, em casa, na política ou qualquer outro ponto. Como sabemos, não podemos resolver nenhum problema sem encontrarmos sua causa, e chamarmos as pessoas de estúpidos nos impede de seguir à diante nos próximos pontos deste artigo.

Ao invés de chamá-los de estúpidos, vamos levar em conta os seguintes pontos:

1 – Antes de divergir de alguém, trabalhe para entender seu posicionamento:

Você entendeu completamente o que ele está falando? Ou você está falando do passado de cada um?

Você está respondendo à mesma pergunta?  Às vezes as pessoas respondem as perguntas de prismas variados. Por Exemplo: “Qual é o próximo passo?” contra “Qual é a solução em longo prazo?”

Vocês estão utilizando os termos da mesma maneira? As divergências podem surgir pelo uso de diferentes definições e terminologias.

Você está falando com o máximo de abstração? Dar e pedir exemplos e analogias ajuda a deixar a questão mais clara para ambos.

Vocês dois estão sendo claros e precisos em seus questionamentos? É comum que as pessoas soltem frases soltas, ou metáforas que não serão interpretadas corretamente, e em alguns casos nem se deve.
Faça estas perguntas e compreenda atentamente o resultado, se mesmo assim a divergência continua acontecendo.

2 – Estamos discordando ainda! Então tente entender a linha de pensamento dele

Quais são as razões para a conclusão que ele expõe?

Qual é a prova que ele oferece para exemplificar sua conclusão? Que dados ou observações ele está levando em conta para chegar a esta conclusão?

Qual premissa ou lição ele considera relevante? Quais princípios, quadros, ou as teorias que ele aplica?

Quais objetivos e valores ele está utilizando em sua abordagem?

Pergunte isso diretamente, mas tente não ser agressivo nem intimidador. Sua opinião pode mudar durante este processo. Se não mudar, pelo menos você vai conseguir entender melhor as razões deles:

Você viu a importância dos fatos que eles mostram? Talvez falte a eles um fato fundamental, ou apenas eles não viram a amplitude e profundidade dos fatos que você tem! Informe-os sobre isto, e veja o resultado.

Você possui alguma experiência relevante que eles não tenham? Mostre-lhes suas observações, lições aprendidas que te levam à sua conclusão, e faça isso sem ser didático ou condescendente.

Você está trazendo fatos e lições de outras origens? Se sim, qual o contexto se aplicam? Talvez um de vocês tenha trabalhando em empresas que começaram pequenas e cresceram, e outro só tenha trabalhado em empresas grandes. Qual o contexto mais relevante?

Vocês são guiados por objetivos e valores diferentes? Se sim, é lógico que vocês chegarão a conclusões e soluções diferentes! O alinhamento de objetivos é crucial para bons resultados.

Vocês defendem premissas diferentes? Se sim, é possível que vocês dois não consigam uma solução rápida para o impasse, portanto, será preciso tomar outra abordagem (por exemplo, apliquem as idéias em menor escala de forma razoável para medir os resultados, ou peça para um terceiro auxiliar na tomada de decisão)

3 – Leve sempre em conta o contexto emocional 

Ele está com MEDO da conclusão? Talvez isto ameace seu trabalho, sua reputação ou auto-estima. Não há nenhuma desculpa para isto, porém sempre acontece. Bons profissionais reconhecem isto cedo ou tarde, e deixam as emoções de lado. Às vezes um amigo do trabalho o faça perceber isso com uma conversa simpática (é importante que você também faça esta pergunta a si mesmo).

O ambiente é estressante, degradando seu julgamento? Pressão pela escassez de tempo ou por uma carreira que está por um fio torna difícil um bom trabalho.

Ele está intimidado por você? Se ele te vê como mais inteligente ou mais bem quisto poderá ser invadido por uma maré de sentimentos de incertezas e inseguranças, o que dificultam seu pensamento. Você pode involuntariamente deixá-lo “pra baixo”. Use um tom de voz mais baixo, e seja mais polido em suas colocações, sempre demonstrando que vocês têm direito de defender o que acham melhor, mas precisam chegar a um consenso.

Se vocês ainda não chegaram a nenhum entendimento, seu problema pode ser de ordem cognitiva ou até mesmo psicológica:

Eles podem ter bom senso, mas baixa capacidade de comunicação. Se você achar que concorda com ele após resolver os problemas de alinhamento inicial, mantenha sempre isso em mente. Pode ser muito frustrante e é necessário paciência, mas é melhor do que discutir à toa, e no fim poderá até mesmo ganhar a admiração deles.

Eles podem ter uma inteligência “crua”, mas seus pensamentos habituais são pobres, os padrões de absorção, processamento e arquivamento de informações. Cognitivamente falando, eles não estão configurados para chegar ao cerne da questão, distinção de elementos essenciais e acidentais, para formar e aplicar uma generalização válida. Isso também pode exigir paciência. Isto não é bom, eu sei, mas ele não é intencionalmente irracional, ou o vulgar burro. Concentre-se em outras qualidades e virtudes que eles trazem para a discussão, como criatividade, diligência ou construção de relacionamentos.

Eles podem ter uma insegurança geral que estas discussões os façam parecer ignorantes, ou estúpidos. Este é outro item sem desculpa, mas você pode ajudar a trabalhar esta deficiência para que eles evoluam desde que você não vire o “pai desta criança”.

Eles podem ter um problema PESSOAL com você. Talvez eles te achem “arrogante” ou obstinado, ou até mesmo estão magoados, pois sabem que você os julga como imbecis. Em todo o caso, isto fará com que eles fiquem mais propensos a não te escutar e discutir mais com você. Eles podem pegar no seu pé ou apenas descontar a raiva pelo julgamento que você fez. De qualquer forma você precisa ADMITIR que é parte do problema e precisa se reciclar, caso queira reverter este quadro.

Conclusão:

A estupidez explica apenas uma pequena parte das discussões e divergências das pessoas. Chamar alguém de “burro” é um beco sem saída, você não pode corrigi-lo. Em vez disso tente descobrir o que realmente está acontecendo.

Conselhos para seu ambiente de trabalho.

Certifique-se de que seu ambiente promova decisões objetivas. Se as decisões são tomadas com base em personalidade e emoções ao invés de levantamento de dados e debates, este ambiente tornará todas as pessoas “imbecis” e “estúpidas”. Procure outro lugar!

Escolha suas batalhas. Você não tem que tomar lado em todas as discussões. Deixe as outras pessoas fazerem suas próprias lutas. Lute apenas nas decisões importantes e difíceis de reverter.

Ganhe uma reputação ao longo do tempo através de um excelente trabalho. Isto é muito mais poderoso para requisitar a atenção do que capacidade intelectual.


Eu realmente não consigo aplicar, ainda, todos estes itens no meu ambiente de trabalho, mas estou trabalhando de forma firme e objetiva para alcançar um bom nível de entendimento com meus colegas.
Espero sinceramente que este artigo ajude vocês à repensar sobre seus colegas estúpidos.

segunda-feira, 26 de abril de 2010

Codeshow 2010

Depois de milênios sem postar, um post pra lá de interessante...

Palestras sobre desenvolvimento, o que isso lembra você?
Pra mim só lembra de malucos que não sabem falar direito, tentando fazer isso durante mais de 3 horas, mostrando códigos e mais códigos em telonas e no final tu não leva nada de conhecimento pra casa.

Agora temos uma realidade bem melhor que esta: CodeShow 2010(http://codeshow.visie.com.br/),um workshop interessantíssimo, e com um preço pra lá de chamativo: apenas 30 pila!

O que mais achei interessante é que ele consegue, em um único evento, reunir os dois lados do desenvolvimento web, designers e programadores, com matérias distintas para cada um. Veja abaixo o que cada equipe irá debater:

Designers:
  • Construção e publicação de layout mobile,
  • HTML5, CSS3, 
  • Media queries, 
  • Semântica

Programadores:
  • Git, 
  • web2py, 
  • MongoDB, 
  • Publicação de vídeo com ffmpeg, 
  • PagSeguro, 
  • Processamento distribuído, 
  • mobile
E no fim da brincadeira ainda será lançado um sistema! É exatamente isso, um sistema desenhado e programado em um único dia! você tem que conferir!

Como? Onde?
Dia 27 de Maio de 2010.
 
Espaço Apas
Rua Pio XI, n° 1200
Alto da Lapa - São Paulo - SP
CEP 05060-001
Mapa de como chegar

Contato Apas:
Tel.: + 55 11 3647 5041 / 5000
Fax: + 55 11 3647 5209

Contato Visie:
Tel.: 11 3477 3347
codeshow@visie.com.br 

segunda-feira, 31 de agosto de 2009

Session Transfer

Bom Galera,
Um tempo atrás tive de desenvolver uma aplicação híbrida, que integrava o velho ASP com .NET2.0, porém como todos sabem, estas tecnologias não compartilham as sessions, e então? como fazer o .net ler as sessions do asp?
Pra resolver isto tive de apelar para uma metodologia que usa banco de dados, vou explicar tudo, passo-a-passo logo, mas antes irei apresentar algumas características deste projeto para que vocês entendam as limitações que a solução deveria respeitar.1º. O projeto se trata de um sistema modular feito em ASP.
2º. Os módulos novos deveriam, mandatoriamente, sem feitos em .net VB 2.0
3º. O banco deve seguir a arquitetura posta no projeto inicial, que é MS-SQL 2000
Depois destas noticias desanimadoras, vamo à solução.
Devo criar uma tabela no banco de dados com a seguinte modelagem:
O Script para a criação da tabela é:
CREATE TABLE [dbo].[SessionTransfer] (
[IdSecao] [varchar] (50) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL ,
[Chave] [varchar] (100) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL ,
[Valor] [text] COLLATE SQL_Latin1_General_CP1_CI_AS NULL ,
[Data] [datetime] NOT NULL 
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO
ALTER TABLE [dbo].[SessionTransfer] ADD 
CONSTRAINT [DF_SessionTransfer_Data] DEFAULT (getdate()) FOR [Data]
GO


Vamos para os codigos em ASP e .NET:
Após o sistema principal em ASP fazer a criação das sessions que o projeto precisa, tais como permissões de acesso, regras de hierarquia, etc, eu chamo o arquivo "sessiontransfer.asp".
ATENÇÃO:
O código demonstrados neste post são apenas didáticos e não devem ser utilizados da forma como são apresentados, pois possuem diversas falhas de segurança como SQL-Injection por exemplo. Caso você queira utilizá-lo, apenas baseie sua lógica neste exemplo, mas construa um código seguindo as condutas de boas práticas.

< ! - - #include file="../_include/_abreconexao.asp"  - -  >
< %
For i = 1 to (Session.Contents.Count -1)
strSql = "INSERT INTO SessionTransfer (IdSecao, Chave, Valor) VALUES ('" &
strSql = strSql & Session.SessionID & "', '" & Session.Contents.Key(i) & "', '" & Session.Contents.Item(i) & "')"
DBCon.Execute (strSql)
Next
Response.Redirect("SessionTransfer.aspx?IdSecao=" & Session.SessionID)
% >

Como vocês percebem, este código varre todas as chaves de sessions da aplicação e as envia para o banco. Após este processo ele redireciona para o arquivo em .NET "SessionTransfer.aspx", com a devida parametrização de identificação da Session.
Segue o código do "SessionTransfer.aspx":
Imports System
Imports System.Data
Imports System.Data.SqlClient
Imports System.Configuration
Imports System.Collections
Imports System.Web
Imports System.Web.Security
Imports System.Web.UI
Imports System.Web.UI.WebControls
Imports System.Web.UI.WebControls.WebParts
Imports System.Web.UI.HtmlControls

Partial Public Class SessionTransfer
Inherits System.Web.UI.Page
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
Dim objConn As SqlConnection = New SqlConnection(SqlHelper.m_strConn)
Dim objCmd As SqlCommand = New SqlCommand()
Dim objAdap As SqlDataAdapter = New SqlDataAdapter()
Dim objDataSet As DataSet = New DataSet()
Dim strIdSecao As String = Request.QueryString("IdSecao").ToString()
Dim i As Integer = 0
objConn.Open()
objCmd.CommandTimeout = 300
objCmd.CommandType = CommandType.Text
objCmd.Connection = objConn
objCmd.CommandText = "SELECT Chave, Valor FROM SessionTransfer WHERE IdSecao = '" + strIdSecao + "'"
objAdap.SelectCommand = objCmd
objAdap.Fill(objDataSet)
For i = 0 To objDataSet.Tables(0).Rows.Count - 1
If (Session(objDataSet.Tables(0).Rows(i)("Chave").ToString()) <> Nothing) Then
Session.Remove(objDataSet.Tables(0).Rows(i)("Chave").ToString())
End If
Session.Add(objDataSet.Tables(0).Rows(i)("Chave").ToString(), objDataSet.Tables(0).Rows(i)("Valor").ToString())
Response.Write(objDataSet.Tables(0).Rows(i)("Chave").ToString())
Response.Write(objDataSet.Tables(0).Rows(i)("Valor").ToString())
Next
        objCmd.CommandText = "DELETE FROM SessionTransfer WHERE IdSecao = " + strIdSecao
        objCmd.ExecuteNonQuery()
        objCmd.CommandText = "DELETE FROM SessionTransfer WHERE DATEDIFF(hh, Data, GETDATE()) >= 1"
        objCmd.ExecuteNonQuery()
End Sub
End Class

Neste arquivo eu recupero os valores baseado na SessionID passada por parâmetro, crio as Sessions para o .NET e após eu deleto do banco todas as chaves da session que busquei.
Notem que também faço uma segunda exclusão procurando por sessions cadastradas com mais de 1 dia.

Para exemplo isso serve, mas lembrem-se de que isso é só um exemplo!!! muito cuidado ao usarem querys SQL que são concatenadas com parâmetros query-string! Ainda mais sem tratamento como o do exemplo.
Na realidade, meu conselho é: Nunca façam isso! =D Mas para didática isso já ajuda banstante.

abraços!

quinta-feira, 27 de agosto de 2009

Rumo ao MCPD

Há muito tempo que eu não posto nada no meu blog, mas vou reiniciar este processo.

Começo com uma novidade, acabo de entrar em um desafio onde meus colegas de trabalho Rafael Ribas e Luis Eduardo e eu iremos entrar em uma odisséia de estudos para buscarmos nossa certificação MCPD.

Lançamos um blog(rumoaomcpd.blogspot.com) que será nosso diário de bordo, onde postaremos nossas impressões sobre os conteúdos das provas necessárias para a certificação MCTS e depois a MCPD.

Visitem e acompanhem este desafio!

terça-feira, 21 de outubro de 2008

problemas de debug no VS2005

pois é gente,
passei por um aperto estes dias, mas consegui achar o problema.

eis que quando eu ia debugar um projeto que estou tocando aqui aparecia o seguinte alert:

---------------------------
Microsoft Visual Studio
---------------------------
The following module was built either with optimizations enabled or without debug information:

c:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files\root\d33c2b62\ba11b592\assembly\dl3\7153188f\fbed248c_8933c901\BookEngine.DLL

To debug this module, change its project build configuration to Debug mode. To suppress this message, disable the 'Warn if no user code on launch' debugger option.
---------------------------
OK
---------------------------

pois finalmente descobri o que é e como resolver.

o fato é que dentro da minha solution eu possuo dois projetos, o WebSite e o BookEngine.
o BookEngine é apenas uma série de classes que eu importo no WebSite e utilizo ele instanciando meus objetos.

Para fazer o relacionamento eu apenas adicionei uma referência diretamente na DLL do outro projeto, e por isso dava errado.

O erro acontece pois na hora de compilar, a DLL do BookEngine não estava sendo atualizada no bin do projeto.

Para solucionar eu apenas excluí a relação e em references eu utilizei a aba de projetos, relacionei o projeto do BookEngine e pronto!

Tudo funcionando perfeitamente e sem problemas de debug.


Eras isso,
qualquer duvida só me enviar um mail.

ab.

sábado, 6 de setembro de 2008

O Chrome não quer dizer muita coisa

Li este post no blog http://www.tableless.com.br/ e achei muito interessante, pois concordo em 100% com o que foi dito pelo Diego Eis, e acho muita fumaça pra pouco fogo.... enfim... segue abaixo o texto.



O Google lançou sua presença no mercado de browsers. Atitude interessante mas que para mim não quer dizer muita coisa. Ter um novo browser não muda muito (a minha) a vida dos desenvolvedores. Lembre-se que não importa quão bom seja o Firefox, Safari ou o Google Chrome, nós, desenvolvedores temos sempre que nivelar tudo por baixo, pelo Internet Explorer 6. Se o Chrome ou qualquer outro novo navegador ajudar com que o IE6 seja definitivamente descontinuado, eles serão bem-vindos. Caso contrário, o lançamento de bons browsers só vai, por assim dizer, brochar a vontade dos profissionais que querem utilizar recursos mais avançados do CSS mas não podem por conta do IE6. O IE7 foi um avanço interessante. O IE8 está pretendendo ser. Mas até mesmo o IE8 não vai ser muito útil enquanto ele não tomar a o lugar do Internet Explorer 6. O mesmo vale para qualquer outro browser.

Do que adianta eu utilizar PNG transparente para os browsers que suportam canal alpha e ter que continuar recortando imagens para fazer um bom trabalho no IE6? A Microsoft sabe que ela criou um monstro, e ainda bem que ela reconheceu isso e tomou alguma atitude.

Vou ter muito mais prazer de trabalhar quando ouvir a notícia da descontinuação do IE6, do que sobre o lançamento de um novo browser. Por isso eu não fico 100% satisfeito com o Chrome, nem com o Firefox 3, nem com atualizações do motor WebKit. Não porque não quero, mas porque vou continuar tendo o mesmo trabalho que sempre tive para fazer sites.

Vou continuar tendo as mesmas preocupações, vou continuar fazendo as mesmas técnicas manjadas e trabalhosas. O problema continua sendo o passado. É o IE6 que ainda dita as regras.


Fonte: http://www.tableless.com.br/chrome-nao-quer-dizer-muita-coisa