domingo, 27 de dezembro de 2009

Recuperando Dados Apagados no Oracle

Sabe quando você acidentalmente apaga as informações de um banco de dados? E agora, como recuperar? Veja:

Sempre existe a opção de restaurar um backup para fazer esse tipo de coisa, mas isso costuma demorar muito, então, que tal uma consulta que já te retorna os dados apagados?

O nome deste recurso é Flashback Query. Com ela você pode fazer uma consulta atrás no tempo. Fantástico isso, não? Mas o recurso precisa estar previamente habilitado em seu banco de dados.
INSERT INTO USUARIOS
 (SELECT  * FROM USUARIOS AS OF TIMESTAMP
 TO_TIMESTAMP ('22-ABR-03 9:04:58','DD-MON-YY HH24: MI: SS')
 MINUS

 SELECT * FROM USERS);
O que esse comando faz? Vamos por partes.
SELECT  * FROM USUARIOS AS OF TIMESTAMP
 TO_TIMESTAMP ('22-ABR-09 9:04:58','DD-MON-YY HH24: MI: SS')
O trecho acima seleciona todos os dados da tabela de usuário em um determinado dia. É a foto da tabela no momento que você pediu.
SELECT  * FROM USUARIOS AS OF TIMESTAMP
    TO_TIMESTAMP ('22-ABR-03 9:04:58','DD-MON-YY HH24: MI: SS')
 MINUS
 SELECT * FROM USERS;
Este outro código seleciona todos os registros em um determinado momento já fazendo a diferença com o momento atual. Se algo foi apagado, é exatamente isso que vai aparecer.
Por fim, o comando abaixo grava os dados apagados de volta na tabela.
INSERT INTO USUARIOS
Muito bom né? Restaurar um backup pode demorar muito. Se for usar esse comando, não espere muito, porque existe um limite de rollbacks configurado pelo administrador.

DB2 - Assignment of a NULL value to a NOT NULL column

Sabe aquele erro que o DB2 informa dizendo que uma coluna está NULA mas que ela é NOT NULL, mas não diz qual é a coluna? Veja como descobrir qual é a colunar utilizando as informações que ele fornece: TBSPACEID, TABLEID e COLNO.

O erro é o seguinte: Assignment of a NULL value to a NOT NULL column TBSPACEID=?, TABLEID=?, COLNO=? is not allowed. SQLSTATE=23502

Você deve olhar para isso e ficar se perguntando: "Porque eles não dizem qual é o maldito campo que não aceita nulo?" Eu também me faço essa pergunta toda vez que isso acontece, mas para resolver o problema, você pode utilizar o select abaixo. Ele te informa isso.

select
    c.TABNAME,
    c.COLNAME
from
    SYSCAT.COLUMNS c inner join
    SYSCAT.TABLES t on c.TABNAME = t.TABNAME
where
    c.COLNO = ? and
    t.TABLEID = ? and
    t.TBSPACEID = ?


Isso me ajuda muito, principalmente quando estou usando Hibernate ou fazendo migração via ETL. Não preciso ficar debugando para saber qual é o campo.

Postgres - Ultima Chave Primária Inserida (Auto-incremento)

Quando se utiliza um auto-incremento em em um banco de dados sempre existe a necessidade se fazer a inserção em uma tabela e utilizar a ultima chave inserida para fazer o insert em uma segunda tabela.

Nesse caso, um SELECT MAX não é uma opção porque não oferece nenhuma garantia quanto à concorrência. O que você consulta pode não ser o que você acabou de inserir.
A solução para isso no Postgres é bem simples, mas a aborgagem é outra. Você não vai inserir e depois buscar a chave para inserir em outra tabela.

No Postgres, um campo de auto-incremento, na verdade, possui uma associação a uma sequência e o que você precisa fazer é consultar essa sequência para saber qual o próximo número a ser usado. Ao fazer isso, a própria sequência se encarregará de fazer o incremento, sem que você corra o risco de outra linha de execução consultar o mesmo número que você acabou de receber. Esse é um processo atômico (indivisível), feito pelo próprio SGBD do Postgres.

Utilize o comando abaixo para consultar a próxima chave:

select nextval('NomeDaChave')

Pronto, você irá receber uma chave única, ninguém mais conseguirá utilizá-la. Dai em diante, basta você inserir esta mesma chave na tabela mãe e na filha.

terça-feira, 15 de dezembro de 2009

JQuery - Extraindo o HTML de um DIV dentro de um each()

Eu já vi que muita gente que está começando a usar JQuery ter esse problema e eu também tive.

Você pegou vários DIV's e iterou através da função each() e na função de callback você quer ler o conteúdo do HTML para fazer algo com ele.

DIV -> each() -> this -> html()

Você leu no tutorial do Jquery que o this é a referencia para o objeto atual da iteração.
ai você tentou isso:

 $(document).ready(function(){
   $("div.classeDiv").each(function (i) {
     alert(this.html());
   });
 });

E deu erro. O browser disse que html() is not a function e você ficou morrendo de raiva. Pois é, eu também fiquei.

Me parece que o this referencia o objeto HTML mesmo, no meu caso, um DIV e esse objeto não tem a função html(). O que você precisa fazer é:

 $(this).html()

Agora vai funcionar porque this será transformado em um objeto do JQuery e esse possui a função html() e todas as outras que você viu na API do JQuery

domingo, 13 de dezembro de 2009

Motivos Para Não Usar o Plone

Se tem um CMS que eu me adaptei e gostei de usar foi o Plone. Uso o 2.5 a algum tempo para determinadas coisas. Não para tudo.

Alguns sites que fiz são em Plone e eu fazia tudo muito rápido, ou já tinha muita coisa pronta para usar. Era difícil mexer profundamente nele, mas no geral, ele atendia as necessidades de quem queria mexer com conteúdo.

A minha primeira atitude para sair do Plone, que me atendia bem, foi retirar meu site e transformar em um Blog. Mas porque eu decidi abandoná-lo? Muito simples.

Precisa-se ter um cuidado absurdo com o cosumo de memória. Aquilo é uma maquina de comer memória, é como um carro 4.0 e pior. Muitos produtos não se preocupam com isso e consomem bastante. No meu caso, que uso o Plone para coisas simples e rápidas, e não quero me aprofundar na arquitetura dele (não é essa a proposta da ferramenta), o bicho começou a pegar quando meus acessos começaram a subir.

5 mil impressões de páginas em 1 dia com 6 plone sites no ar já era suficiente para o bicho piar. E quanto mais memória eu tinha, mais ele comia. Não tinha sobra. Os planos de hospedagem plone não estão preparados para esta realidade. Memória custa dinheiro e não compensa a renda dos meus sites.

A solução foi: sempre que ele atingir o nível de memória, reinicia o servidor e espera ele estourar novamente. E olha que os sites estavam atrás de um squid com cache muito bem implementado e com Cache FU. Eu também tinha um certa preocupação em evitar consumo de memória, evitando a todo custo as chamados getObject.

Ai decidi migrar para outras ferramentas, vai ser custoso e espero que vália a pena.

Google appengine ImportError: "No module named os" - Vista

Erro ao iniciar o servidor de desenvolvimento do Google Appengine localmente no Windows Vista, talvez no XP também.

Se você está encontrando este erro, é praticamente certo que ao digitar o comando abaixo, a versão 2.4 do Python foi invocada, ao invés da 2.5.

dev_appserver.py helloworld/

No meu caso, eu havia instalado o plone 2.5 na máquina a um tempo. As minhas variáveis de ambiente, mais especificamente a PATH estava apontando para o diretório do python contido no plone. Quando eu executava o comando. Pronto, dava erro.

O módulo "os" parece não estar disponível na versão 2.4. Apenas na 2.5. Para resolver o problema, você tem que fazer duas coisas:

1) Altere a variável de ambiente PATH para buscar no diretório do python 2.5. No meu caso, o caminho é c:/python25. Em seguida, vá até a pasta onde seu AppEngine está instalado digite o comando da seguinte forma:

python dev_appserver.py helloworld/

Assim, o python invocado foi exatamente o 2.5 e não o outro. Pronto seu servidor vai rodar.
2) Se você quiser rodar o comando como no manual do Google. Exatamente como está lá no início. Sem precisar chamar o python. O que você precisa fazer é associar os arquivos de extensão .py com o python 2.5. Da mesma forma que ao abrir um arquivo .doc o windows invoca o Word. Quando você chama um arquivp .py, o windows vai invocar o python 2.4.
Considero que alterar variável de ambiente e associar extensões de arquivos a programas são coisas básicas. Por isso, nem entrei no mérito.

quarta-feira, 9 de dezembro de 2009

Recuperando o MBR/Bootloader do Vista

Você tentou instalar dois sistemas operacionais na máquina e perdeu o boot. Ou está de saco cheio do Linux e quer remover o Grub ou o Lilo. Ou quer seu Windows Vista de volta.

Para resolver o problema você precisa do DVD de instalação do Vista. Se você não tem um, use outro computador e pergunte ao Google que ele te diz onde conseguir um. Não precisa de serial para isso.

1. Coloque o DVD do Vista e dê o boot por ele.
2. Eu deixo em inglês mesmo e escolho "Repair your computer"
3. Selecione a instalação do Vista e continue
4. Abra o Prompt de Comando e digite os comandos abaixo

  • Bootrec /fixboot
  • Bootrec /fixmbr
O area de boot (MBR - Master Boot Record)  foi refeita. Você pode reiniciar seu computador e o dual boot foi para o saco. Você terá somente o boot do vista. Não esquece a que a outra partição continuaŕa lá. Você terá que apagá-la depois.

Isso já me salvou algumas vezes. Deixava os comandos sempre no meu e-mail, ai resolvi colocar aqui no blog.

Erro 22 no Grub - Ubuntu Koala, Windows, HD IDE E SATA

Esse erro me deu trabalho e eu acabei resolvendo por acaso.

O que aconteceu foi o seguinte: Eu tinha 2 HDs IDE e 1 HD SATA na minha maquina. Rodava o Ubuntu Jaunty e o Vista numa boa, o Grub funcionava perfeitamente (O Grub tinha sido instalado antes de eu comprar meu SATA). Um belo dia eu adiquiri um SATA de 1.5 TB e resolvi instalar o Ubuntu (9.10) Karmic Koala no lugar do Jaunty.

Reinstalei o linux do zero, não migrei como tinha feito antes. E ele colocou o Grub 2. Ai apareceu o erro maldito erro 22. Eu mexi, mexi, mexi, mexi e foi pro erro 15 ou simplemente não achava o Grub. Instalei o Linux novamente e coloquei o GRUB no SATA1. Não funcionou. Desisti, recuperei o boot do Vista e fiquei sem o Ubuntu por alguns meses.

Em um belo dia (bela magrudada na verdade), um dos meus hds antigos deu pau e eles sempre dão pau de madrugada, quando eu estou precisando muito mexer. Foi então que eu resolvi o problema e consegui voltar a usar o Ubuntu.

Eu tirei os dois HDs IDE (sabia que era um dos dois) e carreguei o DVD de recuperação do Vista. A recuperação não achou a instalação do Vista, que estava no SATA1. Isso aconteceu porque a tabela de partição principal estava em um dos IDEs. O Vista não entrava porque a maquina não achava a partição dele, nem o Ubuntu.

Utilizei a recuperação do Vista e digitei o comando

Bootrec /fixmbr

E reiniciei.

Quando fiz isso, a recuperação do Vista apontou a tabela de partições do SATA1 como tabela principal e o GRUB apareceu e achou minhas partições. Dei um trato nos IDE's e os coloquei de volta. Pronto, funcionou. Estava com meu Koala Karmico e o Vista funcionando finalmente.

Resumindo a novela, se o GRUB não está achando as partições por um BUG que parece ter algo relacionado com HDs IDE e SATA juntos na mesma máquina, você instala o GRUB no seu SATA1, retira seu IDE (nessa ordem), use o comando para arrumar o MBR sem o IDE na máquina e coloque o HD IDE na máquina de volta. Pronto, quando você reiniciar o GRUB vai funcionar e você terá os dois sistemas.

Isso deve funcionar para o Windows XP e para o Windwos 7 também.

Deve existir uma maneira mais fácil de fazer isso, mas eu não conheço e não achei ninguém que tenha resolvido o problema.

sábado, 5 de dezembro de 2009

Como Usar JQuery com JBOSS Seam

Uma coisa que parece tão simples, usar o JQuery em um projeto java fica um pouco complicado quando se está usando o JBOSS SEAM.

Para usar JQuery no SEAM sem fazer uso da tag rich:jQuery, que é forma como todo programador usava a biblioteca javascript até então, você precisa contornar alguns problemas: 

Primeiro: não use $( ). user jQuery( ). Aparentemente existe um conflito com o prototype e por isso você não deve usar $. Parece que existe uma forma de usar o $, mas eu não quis saber. 

Segundo: os IDs são um problema, porque o SEAM parece colocar IDs de acordo com elementos no Form. Então, se você tem um form em sua página sem um ID, o framework lixo (JBOSS SEAM) vai colocar um id para você. E pior, ele vai alterar o id de todos os elementos do form.
Exemplo: Você tem um textarea com ID text1 dentro de um form. Se você não colocar o ID no form, o text1 aparecerá no html com um ID mais ou menos assim:  j126:text1
Não faço nem idéia da regra que ele usa para gerar este ID. Também não sei se isso acontece só com o FORM ou se acontece com outros elementos também.
Ai, para resolver o problema, você colocar um ID no seu FORM. No meu caso, form1. Agora o seu elemento textarea vai se chamar form1:text1. E no javascript você vai precisar usar \\ para fazer scape. O seletor ficaria assim: #form1\\:text1. Essa é a solução para você poder buscar elementos pelo ID. O ID, por si só, já deveria ser único, mas esse ai é o JBOSS SEAM, "o melhor framework do universo". 

Terceiro: Você precisa colocar seu javascript dentro de um //<![CDATA[ ] ]> caso coloque ele em sua página. Porque? Bom, ele usa um parser de XHTML ou XML, não sei ao certo, que vai ler o seu javascript e se ele achar if (variavel < 1) ele vai reclamar de um HTML mal formado por causa do < e vai dar erro de compilação. Acreditem.

Abaixo, um exemplo de um pequeno código com um contador de textarea usando JQuery no JBOSS Seam. Eu copiei esse código de outro lugar e só adaptei para a nova sintaxe.

<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE composition PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    
<ui:composition xmlns="http://www.w3.org/1999/xhtml"
    xmlns:s="http://jboss.com/products/seam/taglib"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:rich="http://richfaces.org/rich"
    xmlns:a4j="http://richfaces.org/a4j"
    xmlns:m="http://www.ninthavenue.com.au/blog/composing_components"
    template="/layout/template.xhtml">

    <ui:define name="body">
    
    <script type="text/javascript" >
        //<![CDATA[
        jQuery(document).ready(    function() {
               var tarea = jQuery("#form1\\:text1") 
            tarea.keyup(function (event) {
                var msg = jQuery(this).val();
                var maxText = 10;
                var numChar = msg.length;
                jQuery("#MsgCount").text("Total de caracteres: " + numChar);                
    
                if (numChar <= maxText){
                    jQuery("#MsgCount").css("color","#0000ff");
                }else
                     jQuery("#MsgCount").css("color","#ff0000");
                }
            });
        });
        //]]>
    </script >



    <h:form id="form1">
        TextArea <h:inputTextarea id="text1" 
                                  styleClass="textAreaPadrao" 
                                  value="#{blablabla}" ></h:inputTextarea>
        <div id="MsgCount"></div>
    </h:form>            
    </ui:define>
</ui:composition>

Erro Valor Inválido na Tag "h:selectOneMenu"


Um erro no Seam/JSF quando a pessoa tenta preencher um combo box com um objeto persistente. Não aparece nenhuma stack trace, apenas uma mensagenzinha de erro "Valor Inválido".

    O cenário é o seguinte: Você carregou sua lista de objetos entidades (@Entity) em um combo box usando h:selectOneMenu. Quando foi fazer um submit, apareceu a mensgem "valor inválido" ou "javax.faces.component.UISelectOne.INVALID". Ai você surtou porque o console não mostra nenhum outro erro.

    O problema acontece antes de chegar no seu bean/action e você nem sabe por onde começar a debugar. Ja tentou de tudo.

   Faça o seguinte: Implemente o equals e o hashCode nas suas classes de persistência. Pronto. Milagrosamente está tudo resolvido.
    Vale lembrar que o Hibernate recomenda fortemente que estes métodos sejam implementados. Tem como fazer o sistema sem isso se você não estiver usando o Seam, mas você acabará tento problemas

Erro __cmp__(x,y) requires y - Busca no ZOPE 2

O cenário é o seguinte: Você fez um ZSQL Method. Testou com um registro e estava tudo funcionando. Quando começou a testar com mais de um registro no banco de dados. Tudo parou de funcionar. Que lindo. O erro é algo parecido com:
mybrains.__cmp__(x,y) requires y to be a 'mybrains', not a 'ImplicitAcquirerWrapper'
ou
r.__cmp__(x,y) requires y to be a 'r', not a 'ImplicitAcquirerWrappe
Obviamente, as pessoas normais, como eu, não fazem nem idéia do que aconteceu, mas após pesquisar na Internet, descobri que é um BUG que afeta versões do Zope posteriores a 2.8.

O problema tem relação com a ordenação da busca (Order By). Então, você pode optar por não ordernar na consulta e fazer isso depois, via Python, mas não é uma boa idéia.
Que tal corrigir o problema? Não é difícil. Basta substituir uns códigos.

Acesse o diretório do seu ZOPE, não é da sua instância, é o diretório do ZOPE mesmo.
A partir desta pasta, encontre o arquivo abaixo:

lib/python/Shared/DC/ZRDB/Results.py

Você precisará fazer algumas modificações neste arquivo. Coisa simples, nada muito complexo. Procure pela linha
from Acquisition import Implicit
E substitua por:
from Acquisition import Implicit, aq_base
Depois de substituir este import, vamos ao próximo passo. Procure pela classe com a seguinte assinatura:
class r(Record, Implicit, brains, zbrains)
    'Result record class'
Procure pela ltrecho de código abaixo, deve estar um pouco logo em seguida a definição da classe "r":

%blocoHCodigoProgramacao%
r.__record_schema__=schema
         for k in Record.__dict__.keys():
-            if k[:2]=='__':
                 setattr(r,k,getattr(Record,k))

Substitua a terceira linha, que está sinalizada com um sinal de - pelo código a seguir:
if k[:2]=='__' and k!='__cmp__':
Preste atenção na endentação do arquivo. Se colocar errado, nada vai funcionar e você irá arrancar os cabelos.

Eu ainda executei uma outra modificação. Apesar de não saber se ela é realmente necessária, mas funcionou e não sou eu quem vai retirá-la de lá.

Procure o seguinte arquivo para alterar:
SOFTWARE_HOME/lib/python/Products/ZCatalog/CatalogBrains.py
Dentro dele, localize a classe AbstractCatalogBrain e adicione o método abaixo:
def __cmp__(self, other): return 0
Novamente: CUIDADO COM A ENDENTAÇÃO.

Depois disso, salve o arquivo, reinicie sua instância e pronto. O problema está corrigido.

sexta-feira, 4 de dezembro de 2009

Como Jogar Street Fighter 4 On-Line no Brasil

Se você é como eu e nunca compra jogo de PC, é um jogador de console, mas acabou comprando Street Fighter 4 (Versão PC), deve ter ficado louco da vida quando não conseguiu jogar no LIVE. Leia abaixo então.

Eu sou jogador de console e não de PC, mas diante dos altos preços dos novos consoles e de seus jogos, lá fui eu baixar Street Fighter 4 piratão. Baixei, funcinou bem, jogo maravilhoso, mas como não dá para acessar o LIVE da maldita Microsoft, também não da para salvar o jogo e os jogadores que você abre após zerar, desaparecem quando você desliga, resolvi comprar o original.


Inconformado, fui comprar um jogo original de PC pela primeira vez desde 95, quando ganhei meu primeiro computador. Só para jogar on-line e antes de comprar ainda verifiquei se tinha acesso ao LIVE, tem uma parada enorme no alto da capa original escrito GAME FOR WINDOWS LIVE. Comprei na Saraiva e cheguei em casa para jogar. Abri o DVD e fui olhar o serial. Bem abaixo tem uma mensagem: "A LIVE não está disponível para usuários com endereço no Brasil". O sangue subiu. Eu fiquei puto. Queria devolver, mas resolvi tentar mesmo assim e advinhem o que aconteceu? Não funcionou. Apareceu essa maravilhosa mensagem:



   Você deve ter passado por isso né? Mas tem uma manha e lá fui eu pesquisar no todo poderoso Google, o mesmo que trouxe você aqui. E ele me deu a resposta. Era o que eu já imaginava. O problema não está no seu jogo ou no seu serial, mas sim no seu cadastro no LIVE. Você se cadastrou como brasileiro, ou a Microsoft te identificou assim. O seu cadastro já era, não adianta mudar o país. Você precisa de um novo cadastro. No meu caso eu perdi minha conta de Snap Noris, tive que criar um Snap Noris 0 que reside nos Estados Unidos e não no Brasil. Po! Snap Noris só tem um, sou eu. Em qualquer lugar sou eu. E graças a esses malditos, não vou poder usar meu nick preferido.
    Vamos a forma como você deve proceder, leia abaixo, não é difícil.
    A saída, encontrada é: simplesmente criar uma nova conta baseada em outro país.

   1. Vá ao site da LIVE, e clique no botão Join Now;
   2. Coloque um e-mail que não seja Hotmail, e clique em Assinar;
   3. Provavelmente, a página seguinte estará em português. Aconteceu comigo, mesmo eu usando um Windows em inglês. O campo país ficará bloqueado para edição e estará escrito Brasil. Se isso acontecer, vá na sua na barra de endereços do navegador e troque o termo pt-BR por en-US, e pressione Enter;
   4. Com isso, o campo dos países ficará desbloqueado e estará escrito United States (English) e você poderá escolher qualquer um. Deixa como está, preencha o formulário e clique em I Accept, no final.
    Não esqueça de confirmar sua conta, através de um link presente no e-mail que é enviado assim que o cadastro é feito.
    Sem esse login você não vai conseguir nem salvar seu jogo. Os personagens que forem revalados após zerar o jogo serão perdidos. Ou seja, é um absurdo que se venda um jogo no Brasil por 90 reais e que não seja possível para os brasileiros jogá-lo completamente e que para jogar on-line, seja necessário fazer uma gambiarra e se fingir de americano.
    Temos que ir ao PROCON e o nome da empresa a criticar é Synergex. Vamos atrás dela, vamos pedir multa, vamos pedir para que seja colocado um aviso na capa do jogo, e para que seja retirado o logotipo da LIVE nos jogos vendidos no país.
    Antes, dava para mudar a localização da sua conta, agora não funciona mais. Hoje, existe essa solução, mas a Microsoft sabe muito bem de qual país você acessa. E se amanhã, a política mudar? Como ficamos?
    PS: se quiser apanhar um pouco é só procurar o Snap Noris 0.

terça-feira, 1 de dezembro de 2009

Fungido da Programação

The agile methods are a reaction to the processes that look good in theory but that do not hold up in practice. The agile methods are therefore described as empirical – they are based entirely on practical experiences and work methods that are proven to work.

Quem já trabalhou com processos pesados em documentação sabe o quanto isso é verdade. Eles parecem que funcionam, mas são lentos e não deixam a equipe empolgada.

Quem gosta de metodos com documentação pesada são as pessoas que não gostam de programar. Nas metodologias ágeis eles não têm muito para onde fugir, por isso resistem.

Já vi gente pedindo demissão porque teria que programar. Jogou currículo na praça, foi chamado(a) e depois o chefe pediu para pessoa ficar e disse que não precisaria programar. Porque o chefe pediu para ficar? Bom, isso é outra história.

sexta-feira, 27 de novembro de 2009

Metodologias Ágeis São Lindas

Sabem porque as metodologias ágeis são lindas? Porque no início era assim e as coisas pareciam funcionar. Afinal, o windows existe. Doom existiu e eles não começaram usando RUP, disso eu tenho certeza.

Depois inseriram muitos processos, papeis e profissionais desnecessários. As coisas começaram a falhar feio. Ai, alguém pensou e falou: "Gente, lá no início as coisas já funcionavam, só precisamos arrumar um pouquinho."


O lindo é que o SCRUM dispensa kilometros de papel e funciona melhor. É simples e funciona.

segunda-feira, 23 de novembro de 2009

Porque eu Gosto do Scrum?

"Um princípio chave do Scrum é o reconhecimento de que desafios fundamentalmente empíricos não podem ser resolvidos com sucesso utilizando uma abordagem tradicional de "controle". Assim, o Scrum adota uma abordagem empírica, aceitando que o problema não pode ser totalmente entendido ou definido, focando na maximização da habilidade da equipe de responder de forma ágil aos desafios emergentes."

Dificilmente saberemos como as coisas vão acontecer antes que elas aconteçam, a menos que estejamos fazendo um projeto que já fizemos antes, mas mesmo assim, pode acontecer algo de diferente. E se eu soubesse prever o futuro não estaria programando, mas teria jogado na mega sena.

A melhor coisa a fazer é manter sua equipe no mais alto nível possível. Profissionais capacitados terão maior possibilidade de resolver problemas de forma mais rápida.

Minha sugestão é: mantenha uma equipe de pessoas inteligentes e adaptáveis. Essas pessoas podem ter uma especialidade (naquilo que você precisa), mas devem ser generalistas. Mantenha uma equipe unida e deixe que ela se organize da forma que achar melhor.

E se a forma de organização da sua equipe refletir a preguiça e nada estiver sendo produzido? Bom, isso quer dizer que você precisa trocar a equipe.

É melhor ter um cara muito bom e pagar muito a ele, do que pagar pouco a dois idiotas.

sábado, 21 de novembro de 2009

Mantendo a Versão Mais Atual do Firefox no Ubuntu


Na verdade, esse post deveria se chamar: Mantendo as versões mais atuais dos softwares da Mozilla no Ubuntu.

Você já tentou atualizar seu firefox no Ubuntu? Já viu que instala o 3.5 mas o menu fica configurado para o Firefox 3.0? Pois é. Que saco.

Eu não sei porque isso acontece. Eu até consigo instalar o 3.5 e utilizá-lo através do Shiretoko. Eu não manjo muito de linux ainda. Porque nunca usei muito a plataforma, mas recentemente eu decidi colocar no meu micro do trabalho porque não preciso de nenhum software exclusivamente windows aqui. E também não instalo coisas piratas nesse micro.

Ai eu quis atualizar o Firefox para versão mais atual e descobri o UBUNTUZILLA. É um software que cuida disso para você. Com ele você pode manter o Thunderbird, o Firefox e o Seamonkey atualizados, inclusive no seu menu. Eu uso os dois primeiros.

Então, ai vai: Baixe o Ubuntuzilla aqui. Não esqueça de pegar a versão certa para a sua arquitetura. i368 é para quem NÃO colocou o Ubuntu 64.

Depois de baixar, como é um pacote .DEB, basta dar dois cliques e instalar o programinha. Até agora, nenhum milagre acontece, mas vai acontecer.

Então você abre o terminal e digita:

ubuntuzilla.py -a install -p firefox

O software vai te fazer perguntas, você responde SIM ou Y. Depois ele vai perguntar sua localidade de uma lista de 70 e tantas possíveis. Não esqueça de selecionar PT-BR, que na minha instalação é o número 55 se não me engano. Depois, seu password e responda sim.

A mágica vai acontecer e tudo será instalado e configurado.

Para atualizar os outros softwares da Mozilla, use:

ubuntuzilla.py -a install -p thunderbird
ubuntuzilla.py -a install -p seamonkey

Belkin Router, Net Virtua, Torrent e Conexão Caindo

Você tem um roteador Belkin, uma conexão do Virtua, está tentando baixar um arquivo Torrent e sua conexão sempre cai alguns mintuos depois? Como resolver esse problema? Você não vai acreditar na minha solução.

Eu tentei de tudo, mas nada resolveu. Modifiquei meu Belkin inteirinho, o Wireless 11g e nada. E ai? Eu não sei qual é o problema específicamente. Dizem que é uma espécie de flood, que o roteador entende assim e desativa. Pode ser que o modem do Virtua ou o próprio Virtua estejam fazendo isso, mas não creio.

Esse Belkin funcionava perfeitamente com a ADSL da Brasil Telecom (Oi) e GVT, isso começou a acontecer com o maldito Net Virtua (Detesto a NET e o serviço de Internet deles). Eu pluguei o cabo direto na maquina e funcionou perfeito, mais de 300k de download por horas e horas. Só que o roteador não segura a onda.

Ai meu chefe me emprestou o roteador wireless D-Link dele. O cara odiava o D-Link porque um dos notebooks dele não conectava. Aqui funcionou perfeito. Nunca mais caiu nada. E ele adorou o Belkin. Claro, ele não usa Virtua

O problema é alguma incompatibilidade do Cable Modem ARRIS Virtua com o Belkin. Solução, poe outro roteador wireless. Aqui tá o D-Link 802.11g e ta indo numa boa.

Eu liguei para os malditos do NET Virtua pedindo para trocar o ARRIS por um Motorola, mas eles se recusaram. Eu juro que quase fritei o ARRIS com corrente elétrica só para obrigá-los a trocar, mas eu ia ficar uns dias sem conexão e não da para viver assim.