quarta-feira, 16 de abril de 2008

Python é muito porco!

Depois de receber um e-mail do chefe dizendo "ainda vão ouvir falar muito de Python" resolvi ler um tutorial para não ficar com cara de tacho nas conversas do café.

Já no capítulo 4 me deparo com a seguinte bizarrice: o escopo é definido a partir da identação do código! Até pode parecer uma idéia interessante mas se com marcações explicitas, como chaves ou as palavras chave "begin" e "end", já cometemos erros imagine sem!

Sem falar que usar identação automática em Python nem pensar.

Se liga no exemplo:

print "Imprime os números pares até 20"
n = 1
while n <= 20:
if n % 2 == 0:
print n
n = n + 1
print "Saiu do 'while' porque não está identado!"

segunda-feira, 7 de abril de 2008

O cara é notícia em Ribeirão Preto!


Saimos na capa deste domingo no jornal local de Ribeirão Preto! No alto está o Cerqueira e carregando ele o Júnior. Ao lado sou eu, sou eu, sou euuuu!

sexta-feira, 4 de abril de 2008

Salvar como...

Nota rápida: para forçar o browser abrir a janela de "salvar como" em ASP.NET basta usar o header Content-Disposition passando como valor attachment; filename="nome_do_arquivo":


string path = "caminho_do_arquivo.txt";
Response.AddHeader("Content-Disposition", "attachment; filename=\"" + path + "\"");
Response.TransmitFile(MapPath(path));
Response.End();

quarta-feira, 2 de abril de 2008

Parâmetros de métodos não admitem valores padrão em C#

Dei de cara com esta mensagem hoje ao tentar criar um método com um parâmetro com valor padrão assim como costumava fazer em C++.

Metodo(string p1, bool p2 = false)


Em C++ é possível chamar apenas:

a.Metodo(p1);

Pois o compilador gera na verdade:

a.Metodo(p1, false);


Em C# isto não é permitido já que o correto é usar sobrecarga:

class A
{
public void Metodo(string p1, bool p2)
{
// (...)
}
public void Metodo(string p1)
{
// O valor do segundo parametro pode vir de um arquivo de configuração
Metodo(p1, false);
}
}


É menos conveniente implementar mais um método, ainda mais em um método com muitos parâmetros. No entanto, desta maneira o valor padrão pode ser carregado de uma arquivo de configuração podendo ser alterado sem a necessidade de recompilar o programa.

http://blogs.msdn.com/csharpfaq/archive/2004/03/07/85556.aspx

terça-feira, 1 de abril de 2008

Atribuição dinâmica de valor em atributos usando reflection

Estamos criando uma classe responsável por carregar os campos de um arquive de lote. Para cada atributo desta classe desejamos atribuir um campo do arquivo. Como é muito trabalhoso criar, uma a uma, as atribuições de um layout de mais de 80 campos uptamos por usar reflection.

Segue um exemplo simplificado da solução que adotamos:

class Teste
{
public int attrib1 = 0;
public string attrib2 = null;
}

class Program
{
static void Main(string[] args)
{
Teste teste = new Teste();

FieldInfo fiAttrib1 = teste.GetType().GetField("attrib1");
fiAttrib1.SetValue(teste, 0);

FieldInfo fiAttrib2 = teste.GetType().GetField("attrib2");
fiAttrib2.SetValue(teste, "abc");

Console.WriteLine("Attrib1: {0}\nAttrib2: {1}", teste.attrib1, teste.attrib2);
}
}


Na pratica os campos do arquivo são lidos de um arquivo de configuração. Ainda, como os atributos da classe são privados se faz necessário passar BindingFlags.Instance BindingFlags.NonPublic como parametro do método GetField

segunda-feira, 24 de março de 2008

Como validar um formulário do lado do cliente usando o JavaScript gerado pelos componentes Validation do ASP.NET

Felizmente esta manhã resolvemos um problema que nos atormentava desde quinta-feira. Queriamos lançar um ModalPopup em um WebForm somente se o formulário fosse preenchido corretamente. No entanto o ModalPopupExtender é lançado sempre que o botão identificado por TargetControlID é pressionado, independentemente da validação dos campos do formulário.

A solução foi criar um outro botão auxiliar em HTML e repassar o evento de clique apenas quando o formulário fosse válido. Para isso usamos a função WebForm_OnSubmit que retorna o status do form, segue um exemplo:

<script type="text/javascript">
function Popup_SeFormValido() {
WebForm_DoPostBackWithOptions(new WebForm_PostBackOptions('', '', true, '', '', false, false));
if (WebForm_OnSubmit()) {
document.getElementById('<%=Button1.ClientID%>').click();
}
}
</script>

<asp:TextBox
ID="TextBox1" runat="server"></asp:TextBox>
<asp:RequiredFieldValidator ID="RequiredFieldValidator1"
runat="server" ErrorMessage="RequiredFieldValidator"
ControlToValidate="TextBox1"></asp:RequiredFieldValidator>
<div style="display: none">
<asp:Button
ID="Button1" runat="server" Text="Button"
/></div><br />
<input
id="htmlButton" type="button" value="Button" onclick="Popup_SeFormValido();"
/>
<asp:Panel ID="Panel1" runat="server">
<strong>PopUp</strong>
</asp:Panel>
<ajaxToolkit:ModalPopupExtender
ID="ModalPopupExtender1" runat="server" PopupControlID="Panel1"
TargetControlID="Button1">
</ajaxToolkit:ModalPopupExtender>

sexta-feira, 14 de março de 2008

Heroes {Community} Launch bem no dia do Cocobambu!

Eu até estava interessado em participar do Heroes {Community} Launch amanhã dia 15 de março, mas bem no dia do Cocobambu Folia (Asa de Águia)?


Pior foi semana passada em que o show do Iron Maiden calhou bem no Chicleteiro Fest! Foi a maior correria. Não pretendo repetir o mesmo erro.