sexta-feira, abril 07, 2006

Meu último post

Vou aposentar meu blog. É isso mesmo. ("Grandiscoisa", né?) Depois de ouvir muita piada do Bart e do Marlus sobre como eu só posto reclamações, resolvi assumir que sou um resmungão mesmo. Então estou aposentando esse blog.... ... e criando outro :D Agora sim o blog vai ficar bom: http://josebuscape.blogspot.com Poisé... é isso :)

quinta-feira, abril 06, 2006

Web tranqueiras úteis

Engraçado, tou cada vez mais usando coisas web e menos aplicativos locais. Eles são muito mais simples e com menos recursos que os aplicativos locais, mas o fato de você poder compartilhar as coisas faz toda a diferença. Aqui estão algumas web tranqueiras que eu ando usando: del.icio.us (http://del.icio.us/rmuliana) -> Meu "bookmark social". Já não vivo sem isso. blog (http://mecanicamente.blogspot.com) -> Uso mais pra compartilhar idéias com colegas e frequentemente, comigo mesmo. flickr (http://flickr.com/photos/rmuliana) -> Compartilhar fotos. Uso pouco, mas quando uso, vem muito a calhar. writely (http://writely.com) -> Escrever e compartilhar documentos de texto. Estou "começando a começar" a usar agora. jobby (http://www.gojobby.com/Jobby/Resume/?user=986) -> Site para empregos utilizando a filosofia "Web 2.0". Meu currículo está lá e eu assino o RSS com programadores Java no Brasil. Cada indíviduo com o perfil que eu quero que entra lá, meu RSS já "apita".

segunda-feira, abril 03, 2006

Justo quando estou tentando fazer as pazes com Java...

Essa eu até tinha esquecido até 5 minutos atrás quando precisei de novo: "Como você copia um arquivo em Java?" Resposta: Abra dois streams e copie bytes de um para o outro.... COPIAR BYTES!!!!!! Ahhhh... Fala sério!!! Entrou pra minha lista negra, junto com Calendar e Date: File

quinta-feira, março 23, 2006

Parei de brigar com Java

Tem um monte de coisas que eu não gosto no Java. Collections meia boca, Date e Calendar cretinos, falta de closures, "estupidamente" tipado e outras coisas mais. Porém, tenho que reconhecer que ele tem partes excelentes, a nova api para concorrência (do Doug Lea), muitas APIs pra tudo que você puder imaginar, uma comunidade grande (Apache inclusa), excelente IDEs (como o Eclipse, IntelliJ, Netbeans). Sem falar que eu trabalha fazem muitos anos com Java, então tenho um domínio da linguagem muito bom. Então, decidi que ao invés de ficar reclamando como sempre, vou implementar as idéias que eu gosto (a maioria roubada de Smalltalk e Ruby) e fazer o melhor possível com o Java, usando o que é bom dele. Não dá pra fazer milagres, mas dá pra melhorar bastante. Minha Wishlist: - Collections: Por enquanto, acho q vou me limitar a usar o Apache commons - Date e Calendar: ("muitas APIs") vou começar a usar Joda-Time. Parece muito boa! - Closures: Isso não tem muito jeito. Já via algumas libs legais pra Closures (tem uma aqui muito boa) Mas Closures em Java continua não sendo fácil de usar. Principalmente porque a sintaxe fica desajeitada e porque as coleções não suportam elas (justamente onde são mais úteis). Vou usar o que tem do Apache e provalemente criar uns helpers para classes anônimas, se eu já não achar isso na net. - Structs: Tipo beans, mas dinâmicos. Tem o Apache commons pra beans, bem útil. Mas vou criar umas pequenas estruturas para mim. Ia ser legal achar um nome tipo "Beans" :D Sei lá... o que é menor que um feijão (ou grão) e mais gostoso? "Berries"? "Café solúvel"? Vou ver se junto tudo, faço um Jar legal e adiciono nos meus projetos. Aquela história: "não adianta reclamar se você não vem com alguma solução"

quinta-feira, fevereiro 23, 2006

Onde estão os web designers? (Reclamação!!!)

Eu costumo dividir os caras que fazem o visual da página em 3 categorias: "Fazedor de HTML" não sabe HTML. Usa só Dreamweaver, ou pior, FrontPage. Não tem noção de cores, uso de espaço em branco, fonte, nem nada. No nível avançado, conhece as tags FONT e TABLE, e sabe fazer borda arredondada. Usa o Photoshop só para fazer as bordas e botões. O layout das páginas desses caras costuma ter um monte de coisas, todas competindo pela sua atenção. E mesmo qdo parece boa, tem um "ar" de amador, mas não dá pra definir bem o porquê. "Designer" fez ou faz faculdade de publicidade e propaganda, marketing ou alguma coisa relacionada. Tem noção de design e ama Mac de paixão, mas continua usando Photoshop no Windows XP da empresa. Volta e meia usa o Dreamweaver. Mas faz o design obrigatoriamente no Photoshop. Conhece um pouco de HTML e um pouco de CSS. Manda bem no Flash. O layout desses aí é muito profissional. Mas costuma ter 4 problemas: - É pesado pra carvalho - Se o usuário não estiver rodando 800x600 com fonte padrão no Internet Explorer (800x600 pro cara é "ser compatível), o layout fica um lixo ou então arrebenta de vez. - Usar ele pra programar é um inferno, porque o HTML é tosco e bagunçado (padrão Dreamweaver e FrontPage, muito obrigado) - Se for atualizar o conteúdo, melhor republicar a página toda. Não tem como "só alterar um pedacinho". "Web-Designer" nunca fez faculdade, ou se fez, fez de alguma área de informática, mas sempre gostou mais de fazer interfaces do que chafurdar no código. Conhece HTML bem, CSS como a palma da mão e um bom tanto de Javascript. Acha falhas no Dreamweaver e excomunga o FrontPage. Rabisca o layout no papel antes de fazer qualquer coisa e quando faz, passa mais tempo mexendo na visão "source code", que na "layout". Os problemas desse cara? É muito difícil de encontrar um cara desse tipo, e quando se acha, não se paga o que ele merece. Até hoje, encontrei muito poucos raríssimos dessa espécie. O layout do cara costuma ser leve e limpo, com comentários e ótimo para programar. Sem falar que ele sabe fazer layout líquido numa boa, e a página não estoura se você usar o Ópera ou se seu padrão de fonte for um pouco diferente. Fora isso, é do tipo do cara que se você explicar uma linguagem de template pra ele (qq uma, Velocity, JSP, XSLT) ele não só sabe fazer o layout usando ela, como descobre novos e melhores jeitos de usar que você nunca pensou. Se você é ou conhece um desses, me avisa. Tou precisando conhecer mais!!!

quinta-feira, fevereiro 16, 2006

Gerentes querem linguagem dinâmica e não sabem.

Ando trabalhando com Java e Ruby pra web recentemente e não dá pra evitar notar certas coisas. Em Ruby, posso alterar o servidor de produção sem parar nada. Em Java, se altero uma classe, toca reiniciar o servidor pra pegar alterações. Meu chefe fica muito P da vida toda vez que preciso subir uma correção e tenho que fazer isso. Ele fica me torrando pra usar JSP ao invés de classes Java pra não ter que reiniciar :| (Acho que ele gostaria que eu usasse uma linguagem de script e não sabe disso...) Em Ruby, se eu restarto o servidor de produção por algum motivo, ninguém perde sessão. No máximo a página fica fora alguns segundos. Tem gente que nem percebe... Em Java, tenho que ter o maior cuidado com isso :| Se restarto com muitos usuários online a aplicação redireciona todo mundo pra tela de login... Não que não dê pra fazer um esquema para persistir, o Tomcat até tem um. Mas não é default, tem que configurar e tudo que tem na sessão tem que ser serializable. Meu chefe, DE NOVO, me torra as paciências pra eu evitar restartar... (Continuo achando que ele quer é uma linguagem de script e não sabe). O que eu acho mais engraçado é que você vai procurar por session persistence e a primeira coisa que você acha é cluster de servidores. Será que ninguém pensou que serializar sessão é muito útil por si só? Vai ver, como sempre, sou simplista demais. Isso sem falar em regras dinâmicas muito loucas que apareceram em um projeto. Tive que usar o BeanShell (muito bom, aliás, bom MEEESMO), senão ia ficar maluco... O chefe adorou! (É... tenho _realmente_ a impressão que ele gostaria de usar uma linguagem de script) Não me entenda mal, eu gosto de Java, é uma boa linguagem. Mas é muito mais complicada do que poderia ser. Questões de design da linguagem, eu acho... Só sinto realmente falta de três coisas no Java: Closures, reflexão de verdade e um pouco menos de "estupidamente" tipado... Cansa ficar falando a mesma coisa o tempo todo pro compilador (Usuario usuario = new Usuario(); por exemplo.). Com generics então, que eu achei que ia facilitar isso, só deixou a coisa mais insana: Map<String, List<String>> map = new HashMap<String, List<String>>(); Experimente um Map de Map, então :D. Too much fun!

terça-feira, fevereiro 14, 2006

Como traduzir um papo técnico

Eu imagino que esses papos técnicos são um tormento pra que não conhece. Eu que sei do que ele tá falando já me embananei...
De: Usuário Interessado Para: Programador Nerd Assunto: pLACA de video Você tem alguma info ou dica de placa para me dar? Please -------------------------------------------------------------------------------- De: Programador Nerd Para: Usuário Interessado Assunto: RES: pLACA de video Usuário Interessado, Seguinte placa de vídeo é algo complicado e uma das coisas mais caras num micro, hoje em dia como eu já te disse tem placas para todos os gostos e bolsos. Eu posso te dar uma dica melhor se eu souber quais os tipos de jogos que ele gosta e o quão fissurado por “beleza” dos gráficos ele é, eu mesmo não sou muito exigente só preciso de uma placa que rode o jogo, não preciso de algo que me encha os olhos, então eu aconselho algo da linha ATI 9600, modelo PRO ou XT, essas saem por volta de 350 a 400 reais, não tenho muita certeza. As NVidia Geforce 5700 ou 5900 também são muiiiito boas, procure evitar a 5200, no mainstream tem placas de 800 a 1000 que são da linha ATI X800 ou NVIDIA 6000, mas creio que essas não são o seu alvo... Resumindo sem enrolar muito eu aconselho uma ATI 9600 PRO ou XT, eu, Zé e Jão temos essas ai, eu tenho uma 9600 PRO de 128mb o Jão uma PRO de 256mb e o Zé uma XT de 256mb, que é melhor, eu com a minha sendo piorzinha estou muito bem obrigado, hoje em dia acho que por volta de 400, se quiser bater perna na santa ifigênia sempre tem bons negócios... Desculpa o email enorme, tentei dar uma geral e não uma opinião especifica, de qualquer forma se quiser pede pra ele falar comigo no msn ou email mesmo para eu ver o que ele quer e tal :) []s Programador Nerd --------------------------------------------------------------- De: Usuário Interessado Para: Programador Nerd Assunto: RES: pLACA de video Programador, não consegui entender seu email...veja se a tradução está correta! Então....eu estou com os olhos cheios de lagrimas e de orelhas compridas, porque a beleza dos gráficos me fazem pensar em mulher, porem mulher ao custo de 5200 eu acho caro pacas, não preciso de algo que me encha os olhos,já o preço de ATI 9600,eu fico 3 noites sem sair de cima com mais de 20 garotas , modelo PROputas ou XoXoTas, essas saem por volta de 350 a 400 reais/por vez,acho.... não tenho muita certeza. As NinfetasVadias 5700 ou 5900 também são muiiiito boas porem muito, muito caras, procure evitar as vagabas de 5200, no mainstream da Republica do Libano tem de 800 a 1000 que são da linha AToxI 800 ou NasVaDIAs 6000, mas creio que essas não são o seu alvo... Resumindo sem enrolar muito eu aconselho uma boa bronha com mão adormecida e camisinha Jontex 9600 o Tião, Zé e Jão temos essas ai, vagabas 9600 PRO de 128 de rola,já o Jão uma PRO de 256 e o Zé uma de 256, que é melhor, eu com a minha boa maozinha sendo piorzinha estou muito bem obrigado, hoje em dia acho que por volta de 400, se alguém quiser bater uma na santa ifigênia sempre tem bons negócios...

segunda-feira, janeiro 30, 2006

OffTopic: Filme bom pra caramba

Cinema nacional finalmente está saindo daquela utopia de "Cinema Arte" que só agrada aos cinéfilos. Principalmente daquele tipo que adora falar dos filmes usando termos como: "crítica da sociedade", "uma visão diferente", "belo" e por aí vai. "Se Eu Fosse Você" cai num tema muito batido (troca de corpos :D ), extremamente comercial, mas é MUITO BOM!!!! O filme é realmente divertido pra quem já levou (ou leva) uma vida a dois. Fazia tempo que eu não ria tanto com um filme. Não tem pornografia, não pretende ser "artístico", é leve, bem-humorado e tem até a característica "lição de moral" no finalzinho. :) Glória Pires nem convence tanto, mas manda bem. Agora o Tony Ramos tá MUITO perfeito e MUUUUUUITO engraçado. Eu não botava tanta fé no cara antes, mas depois desse filme, tenho que rever meus conceitos. Parece que dá até pra ver a Glória Pires dentro do cara. Assistam, eu recomendo.

sexta-feira, janeiro 27, 2006

Auto-crítica é uma droga mesmo

Já fui pior, estou melhorando, mas ainda não cheguei lá. http://www.hacknot.info/hacknot/action/showEntry?eid=81 Tem um pouco de vários, pode me chamar de Henry Kevin Zachary :p Inda chego a ser Quincy.

terça-feira, janeiro 24, 2006

Arrumando a casa

Poisé! Andei dando uma garibada no Blog. Cansei um pouco de ficar colocando minhas viagens aqui. De cara, mudei o modelo do blog (de novo), e agora vou começar a postar mais códigos e menos papo, basicamente, utilidades para Java e Ruby. Talvez eu comece a escrever em inglês, não sei alguém mais vai ler a bagaça, e com certeza vou perder umas piadas. Mas nunca fui bom piadista mesmo, nem em português nem em qualquer língua.

quinta-feira, janeiro 12, 2006

Duck Type em Java

Como o Java é uma linguagem boa e com excelentes APIs, mas muito tosca em algumas coisas básicas (como manipulação de Strings e Coleções), volta e meio fazemos alguns utilitários estúpidos pra facilitar a vida. Aqui vai um dos meus, um simples wrapper para facilitar a chamada de métodos dinâmicos.
package common;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

/**
 * Executes a method in an object dinamically. It's a wrapper to the java
 * reflection way of execute methods dinamically.
 */
public class DuckType {

  public static  T execute(Object object, String methodName, Object ... parameters) {

    if (object == null) return null;
    if (methodName == null || methodName.equals("")) return null;
    
    Class[] classes = extractClassesFromParameters(parameters);
    
    try {
      
      return (T) executeEasyWay(object, methodName, classes, parameters);

    } catch (NoSuchMethodException e) {
      
      return (T) executeHardWay(object, methodName, classes, parameters);
      
    } catch (SecurityException e) {
      return null;
    } catch (IllegalArgumentException e) {
      return null;
    } catch (IllegalAccessException e) {
      return null;
    } catch (InvocationTargetException e) {
      return null;
    }
  }

  private static Object executeEasyWay(Object object, String methodName, Class[] classes, Object... parameters) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException {
    
    Method method = object.getClass().getMethod(methodName, classes);
    return method.invoke(object, parameters);
  }

  private static Object executeHardWay(Object object, String methodName, Class[] classes, Object... parameters) {
    
    // it didn't find the method in the easy way, trying the hard way
    Method[] methods = object.getClass().getMethods();
    
    for (Method method : methods) {
      Class[] methodTypes = method.getParameterTypes();
      
      // Ignore methods with different names
      if (!methodName.equals(method.getName())) continue;
      
      // Ignore methods with different number of parameters 
      if (methodTypes.length != classes.length) continue;
      
      boolean isMethodExecutable = true;
      for (int i = 0; i < methodTypes.length; i++) {
        Class methodType = (Class) methodTypes[i];
        Class parameterType = classes[i];
        
        if (!methodType.isAssignableFrom(parameterType)) {
          isMethodExecutable = false;
          break;
        }
      }
      
      try {
        
        if (isMethodExecutable) return method.invoke(object, parameters);
        
      } catch (IllegalArgumentException e1) {
        return null;
      } catch (IllegalAccessException e1) {
        return null;
      } catch (InvocationTargetException e1) {
        return null;
      }
    }
    
    return null;
  }

  private static Class[] extractClassesFromParameters(Object[] parameters) {
    
    Class[] classes = new Class[parameters.length];
    
    for (int i = 0; i < parameters.length; i++) {
      Object parameter = parameters[i];
      classes[i] = parameter.getClass();        
    }
    
    return classes;
  }
}

quarta-feira, janeiro 11, 2006

Controle de versão para os dados

Quanto mais eu penso, mais acredito que preciso experimentar essa idéia o mais rapidamente possível. Outro dia estava mexendo com as "rules" do PostgreSQL (triggers) para fazer log de uma tabela essencial do sistema. Qualquer alteração criava um registro em uma tabela gêmea, com a data da alteração e o usuário. Comecei a pensar o que aconteceria se eu fizesse isso para TODAS as tabelas do sistema. Acho que ia virar uma espécie de controle de versão dos dados, e melhor ainda, acho que consigo criar toda essa estrutura, tabelas gêmeas e triggers, com um simples script. Ainda não pensei direito o efeito disso sobre as tabelas de relacionamento N-M, mas acho q também funciona. Talvez fiquem gigantes, mas não vejo problema nisso. E com certeza, as gêmeas não podem ter "constraints" como "unique" e coisas do tipo, mas também acho isso contornável. Resta o problema de manutenção, triggers sempre são complicadas. Mas como as tabelas gêmeas não fazem parte realmente do sistema e nenhuma delas vai ter triggers, acho que não vou ter problemas de atualizações em cascata que o pessoal tanto abomina nas triggers. Acho que dá pra fazer um Engine no Rails (ActiveRecord) pra isso. Já tem um plugin pra isso: acts_as_versioned Quem sabe? Só estou jogando idéias pra cima.

segunda-feira, janeiro 09, 2006

O que me imcomoda em Linguagens e APIs

Sabe, Tava organizando os pensamentos aqui e finalmente achei o motivo pelo qual não simpatizo muito de certas Linguagens e APIs. O que me torra o saco é quando os designers delas tem a genial idéia de proibir coisas na linguagem para evitar "más práticas". Só que más práticas dependem do contexto onde são usadas. Eu vejo frequentemente que o resultado disso cai em dois casos: - Programadores imbecis continuam fazendo imbecilidades de outras formas. ("É muito difícil fazer algo a prova de idiotas, eles são muito imaginativos") - Programadores menos imbecis tem que fazer imbecilidades para fazer o código funcionar como querem. Quantas vezes você já "hackeou" o Java porque ele não deixava você fazer o que queria de um jeito simples. A lição que eu tiro disso? Você não pode prever como seus usuário vão usar suas coisas, então é melhor não tentar. "AH! Mas os outros programadores são muito estúpidos, se eu não travar isso, vão fazer cagada" -- Típico pensamento arrogante que nós programadores temos. Devíamos ser mais humildes ou pelo menos não subestimar nossos pares. (Já ouvi um "Se você fizer algo achando que seus usuário são ignorantes, eles terão de ser ignorantes pra usar o que você fez") No fim das contas, se o outro programador fizer cagada com sua API/Linguagem, de quem é o problema? Do designer da API?! Isso só pode ser o cúmulo da arrogância, meio querer ser "oniscente e onipotente". Se o imbecil faz imbecilidades, sinceramente, problema dele, devia ter estudado mais antes de ser programador. Se não fizer, tanto melhor!!! Li em um blog outro dia uma coisa muito legal: "Fazer uma boa linguagem de programação 'segura' é como fazer uma faca afiada que nunca corte o dedo de quem usa". Mas sabe, eu estava no açougue outro dia e vi o açougueiro estripando a carne com fé e vontade. Fiquei pensando como é que ele não picava os dedos juntos, tal o empenho que ele estava em estripar a pobre peça de carne (acho que era uma costela, sei lá). Aí vi o motivo: ele estava usando uma luva de metal na mão que segurava a carne... Que isso tem a ver com programação? Que a faca tem que ser a mais afiada possível para você fazer um bom trabalho. E se não quiser cortar os dedos use a porcaria da luva! Imagino que nossas "luvas" sejam testes de unidade, mas não sei ao certo. Só garanto que se a linguagem é realmente afiada, use alguma proteção ao invés de querer fazer a linguagem "perder o fio".