2007 August 30 17:33:21 BRT

Tu-tu-tu-tu-tu

Pois é, funcionário público também trabalha de vez em quando. E enquanto eu tou atolado de serviço, fico sem tempo pra blog(g)ar (em português, blogar tem um ou dois gs?)!

Então acho que vou voltar ao modo "use seu blog como diário" que é pra que ele foi inventado (abaixo a web 2.0, viva o capitalismo monopolista, e deixe que os outros ditem o que você quer!)

Querido diário

Estou atolado de serviço, te vejo mais tarde! Beijos!

--girino 17:41, 30 Agosto 2007 (BRT)

P.S.: O Paulosta vem pra BSB semana que vem, minha mãe está aqui essa semana e eu tive 3 reuniões de uma tarde inteira nos últimos 3 dias!

2007 August 27 00:10:38 BRT

Resumo da semana

Bom, eu fiquei sem assunto pra falar aqui, então acabei resolvendo retomar um projeto que eu deveria ter feito a anos atrás: Meu segundo projeto de final de curso (eu tive 3 projetos, o único que terminei foi o terceiro). Bom, eu nem sei se ainda tenho algum dos documentos que produzi na época. Provavelmente só escrevi o resumo inicial do projeto, porque logo logo eu abandonei (como sempre).

A idéia era basicamente uma variação de algoritmo genético que funcionasse de forma assíncrona. Mais ou menos assim:

Um GA tradicional tem uma geração de tamanho fixo. A partir dela você aplica operações de "mating" (como chama isso? cruzamento?) de mutação e de cópia, para formar uma nova geração, com novos indivíduos, e do mesmo tamanho da anterior. Aí você repete geração por geração até cansar ou achar o resultado desejado.

No GA assíncrono, os indivíduos da nova geração "convivem" com os indivíduos da geração anterior. A população não tem tamanho fixo. Aí você precisa de um novo operador, o operador de "morte", que é responsável por se livrar dos indivíduos "ruins" pra que a população não cresça demais.

Na minha implementação simplória do negócio, eu associei uma "idade" com cada indivíduo, e eu "mato" eles quando ficam velhos demais. Cada "rodada" do algoritmo passa por 3 etapas:

  • "mating"
  • mutação
  • morte

E em cada etapa eu atuo sobre a população como um todo. A solução é bem diferente do que eu tinha pensado em 99, quando era preu ter feito isso. Na época eu pensava em associar probabilidades pras operações e aplicar elas nos indivíduos isoladamente. Não cheguei a nenhuma solução prática pra isso, entretanto, porque abandonei antes...

A separação em rodadas também ajuda a fazer comparativos com o GA tradicional: uma rodada pode ser comparada com uma geração do GA tradicional.

A "expectativa de vida" dos individuos é um parâmetro do sistema. Eu usei nos testes o valor de 10 rodadas. Esse valor define também o número de indivíduos novos em cada geração na minha versão simplista: Eu produzo sempre tfrac{mbox{Numero inicial de individuos}}{mbox{Expectativa de vida}} indivíduos novos a cada rodada.

A mutação é aplicada com probabilidade igual na população inteira.

Na hora da morte eu implementei duas soluções:

  • morte por idade
  • morte por idade ponderada pela função objetivo

Na morte por idade, tudo vai muito bem. A população sempre tem tamanho constante, etc e tal.

Quando se pondera a idade com a função objetivo, os "mais aptos" vivem mais tempo enquanto os menos aptos vivem menos. Por enquanto esta estratégia tem dado bons resultados, mas não fiz nenhum teste "sério" com ela. Eu usei as funções f1 e f2 de De jong[1] só pra ver como a coisa ficaram e "me pareceu" que a convergência é mais rápida (na verdade a convergência leva o mesmo número de rodadas, mas as rodadas do assíncrono são mais curtas).

Agora é ver o que mais de idéias eu vou ter em cima disso e rodar uns testes de verdade (pelo menso com todas as 5 funções de De Jong).

Links

Notas

  1. ? De Jong, K. A.. An analysis of the behaviour of a class of genetic adaptative systems. Dissertação de doutorado, University of Michigan, 1975. in Goldberg, David E.. Genetic Algorithms in Search, Optimization, and Machine Learning. EUA: Addison-Wesley, 1989.

--girino 00:41, 27 Agosto 2007 (BRT)

Update

O código está sob licença MIT no Google Code, mas só porque não tinha a opção de usar a Girino's Anarchist License. Considerem o produto duplamente licenciado (MIT ou Girino's Anarchist License).

2007 August 22 18:10:06 BRT

Poço cartesiano

Em homenagem ao tfrac{1}{2} kg vou explicar a estória do poço cartesiano.

Como vocês já devem ter lido por aí, eu tenho uma tia que é matemática (i.e. ela é professora e pesquisadora na área de matemática, ela não é a própria matéria não). Ela uma vez pegou uma prova de um aluno onde o professor perguntava quem era Descartes, ou algo que o valha. No que o aluno respondeu que:

  • Descartes foi o inventor do poço cartesiano.

Pronto, tá explicado!

E já que estou falando besteira de alunos em provas mesmo, tem aquela famosa da época do COLTEC:

Pergunta
O que é a mais valia segundo Marx?
Resposta do aluno
Mais valia um pássaro na mão do que dois voando.

--girino 18:16, 22 Agosto 2007 (BRT)

P.S.: tou sem idéia pra blogar nos últimos dias, por isso o blog tá meio parado mesmo.

2007 August 16 10:33:25 BRT

Fontes sambadas no Firefox/ubuntu

Eu sempre reinstalava o Firefox "por fora" no Ubuntu porque as fontes
dos menus ficavam sambadas (grandes demais ou pequenas demais,
deformadas etc). E também as fontes nas caixas de texto e algumas
outras coisinhas.

Isso causava um monte de encheções de saco (o Firefox não estava no
path, então eu mudava o link em /usr/bin pra apontar pra versão
correta, mas o ubuntu desfazia o link sempre que atualizava a versão
do Firefox no update automático).

Saí fuçando na internestica e descobri a solução:

  • Acesse
    about:config

    (URL de configuração do Firefox) e mude a propriedade

    layout.css.dpi

    para o valor

    96

    .

(veja na imagem abaixo)

Tela de propriedades do Firefox

Tela de propriedades do Firefox

Basta reiniciar o Firefox que tudo se resolve!

--girino 10:36, 16 Agosto 2007 (BRT)

P.S.: isso deve funcionar em outras versões de linux onde esse problema ocorrer também... quem tiver experimentado, deixe comentário avisando qual distro tem esse problema também.

2007 August 14 14:38:35 BRT

Salve os dados

Tirinha Salve os Dados --by girino. Clique para ampliar.

Tirinha Salve os Dados --by girino. Clique para ampliar.

Essa tirinha foi uma homenagem ao Dr. Lazzeri que numa dessas listas de email, fez a "piadinha":

«Eu preciso me tratar. Por um instante, imaginei alguém do alto de um abismo, lançando dados (aqueles cubinhos mesmo) lá embaixo, e alguém gritando: "Super-homem! SALVE OS DADOS!". 🙂» by Lazzeri.

--girino 14:44, 14 Agosto 2007 (BRT)

2007 August 11 22:25:16 BRT

Pedidos desesperados

Fui ver o que tinha de novo no meu site/blog hoje, e achei o seguinte comentário em Discussão:Fractal - Um tutorial:

Para quem entanda de Fractais e saiba programar!!!!!

eu estou tentando aprender a programar fractais, tenho estudado bastante numeros complexos, e visto muitos artigos e imagens de fractais, (Mas nao consigo instalar java pra programar e visualizar os fractais), queria ajuda para instalar(PROGRAMA) e programar fractais (ja li sua pagina inteira ensinando sobre fractais, e como programar, é vc mesmo, que tem a mae que intende de teoria do caos!!!!!!)

ESTOU LOUCO PARA ENTRAR A FUNDO, MAS EU TENHO QUE CONSEGUIR INSTALAR ALGUMA LINGUEM DE PROGRAMACAO BOA PRA PROGRAMAR FRACTAIS!!!!!!

ajuda, AJUDA!!!!!

Deixado por um anônimo IP.

Não tenho a menor idéia de onde eu deixo um resposta pra ele, então vou deixar aqui no Blog, na esperança que ele consiga ler...

Resposta

Caro anônimo, algumas linguagens são mais fáceis de aprender que outras. A linguagem que eu utilizo para programar fractais é particularmente difícil, principalmente para inciantes: Java. Se quiser aprender Java e souber inglês, recomendo os tutoriais presentes no site da Sun: http://java.sun.com/docs/books/tutorial/. O tutorial ensina inclusive como instalar as ferramentas que serão necessária para programar em Java. Se não souber inglês, aconselho que procure no google, porque não sei a qualidade dos tutoriais em português.

Se quiser, começar por uma linguagem mais fácil de aprender, entretanto tão rica e poderosa quanto o Java, tente começar pelo python. Python também tem um excelente tutorial em inglês: http://docs.python.org/tut/tut.html. Para tutoriais em português fico no mesmo problema: não sei indicar!

Agora resta lembrar que aprender a programar não é que nem andar de bicicleta: você vai levar semanas, quem sabe meses, até conseguir fazer algo sozinho. Para fazer algo minimamente útil, estimo que levará uns 2 anos. Para fazer algo comercialmente viável, 5 a 10 anos. Não se desespere, é assim mesmo! Insista e quem sabe, prove me wrong.

--girino 22:45, 11 Agosto 2007 (BRT)

O que não fazer

Bom, ali em cima dei as dicas de linguagens "úteis" para se programar fractais. Agora neste update vou dar as dicas das inúteis:

  • PHP e ASP: São linguagens específicas para produzir conteúdo web. Apesar de muito populares, não são boas para "desenhar" absolutamente nada, simplesmente porque elas não tem (de forma fácil) como gerar uma interface gráfica pro seu programa.
  • Javascript: apesar de eu ter feito isso, não recomendo. Era simplesmente uma "prova de conceito". Desenhar em javascript é difícil e ineficiente. Gastei toda minha experiência para passar por cima das dificuldades mais básicas. Para um novato, desenhar em Javascript é simplesmente suicídio.
  • COBOL, FORTRAN, ALGOL e outas linguagens da idade da pedra: pode até ser fácil (em fortran deve ser facílimo) programar e desenhar fractais, mas as linguagens são tão ultrapassadas que você vai ficar "preso" no mundo de 1984 pra sempre. Já que vai aprender, aprenda algo que vai ser útil no futuro.
  • C e C++: A primeira é abstrata (ou concreta, depende do ponto de vista) demais para quem está aprendendo, a segunda difícil demais. Ambas são péssimas pra se começar por darem margem a erros exotéricos e inexpugnáveis. Recomendo que aprenda C só depois de ter aprendido outra linguagem.
  • Perl: existem 1000 maneiras de se programar em perl, invente uma. Perl é legal, mas tem a incrível propriedade de tornar o melhor dos códigos (programas) ilegível. Típica filosofia: write once, read never!
  • PL/SQL, TransactSQL e outras linguagens de stored procedure: precisa falar? quem quer um elefante pra matar uma formiga? Se é que tem como fazer, o que eu acho que não.
  • VBA (linguagem de macros do office): Tá loco? Quer programar um fractal dentro do word? Perdeu a cabeça né?

Outras opções

Claro que existem milhares de outras opções de linguagens, pode sempre escolher a que mais combina com você. Alguns exemplos de outras linguagens que podem ser usadas para programar factais:

  • Delphi e Visual Basic: São ótimas para criar interfaces gráficas, o que pode facilitar a vida dos iniciantes. Mas geram vícios de programação horrorosos, por isso não recomendo. Melhor aprender "bem" com uma linguagem mais difícil do que aprender mal aprendido com uma linguagem mais fácil.
  • Matlab, scilab e outras linguagens matemáticas: São ótimas para se trabalhar com qualquer coisa que envolva matemática, mas não servem pra mais nada. Se quer fazer apenas factais e mais nada, é uma boa opção. Mas pra qualquer outra coisa, desista.
  • C#: Eu pessoalmente não conheço, mas como já li bastante a respeito, acho que pode ser uma opção razoável para quem vive no mundo windows.
  • Flash: Também não conheço, mas como é própria pra desenhos, acho que deve facilitar bem o trabalho. Ou não, vá saber! Taí... Vou começar a estudar essa porqueira pra ver se faço fractal em flash.

Enfim, linguagem de programação é que nem bunda: Cada um tem a sua! Eu mesmo tenho a sua há algum tempo, mas estou enrolando pra comer!

Se eu pensar em mais besteira eu escrevo aqui depois de novo!

--girino 23:36, 11 Agosto 2007 (BRT)

2007 August 06 16:04:50 BRT

Porque o Virtua Chupa tempo grande

Eu assinava Virtua como banda larga. Foi muito bom enquanto durou, paguei R$ 39,90 por 2Mb de banda durante 1 ano. Depois subiu, R$79,90. Ainda assim era um preço bacana. A brasil telecom cobra R$ 89,90 pela mesma velocidade. Então porque eu vou mudar? Simples: o virtua só é bom quando funciona, mas quase nunca funciona.

Deixa eu tentar ser claro: A NET acha que internet e TV a cabo são a mesma porcaria. Infelizmente tenho uma péssima notícia pra eles: Não é! Algumas diferenças que básicas que eu identifico (entre as milhares) e o porque a NET errou nesse ponto vão abaixo:

O usuário de banda larga sabe o que faz

Quem tem banda larga sabe usar um computador. Quem tem tv a cabo sabe usar uma TV. A diferença pode parecer sutil, mas não é. Uma TV é passiva, você senta a bunda no sofá e liga, o conteúdo vem até você e você "engole". O que pode dar errado? A imagem some ou fica ruim. O som some ou fica ruim. Mais nada.

A internet é uma coisa bem mais ampla. Tem milhares de sites, milhares de formas de interação entre sites e usuários e entre usuário e usuário (os famosos p2p). Na internet, tudo pode dar errado, desde um único link quebrado até um modem queimado, um cabo partido na central, um erro de configuração do roteador, e todos esses afetam o usuário de forma diferente. E principalmente: o usuário sabe o que deu errado.

Quando eu ligo pro suporte da TV a cabo eu digo: estou sem imagem e aguardo resposta. Quando eu ligo pro suporte da Net eu digo: Tem alguns sites que não entram, o ping é tal, o tracert[1] é tal. Vocês devem ter um problema de roteamento, um técnico pode dar uma olhada? Nesse ponto eu sei que a solução não é imediata e nem envolve reiniciar meu micro e meu modem, coisas que já fiz. Eu espero anotar um número de protocolo e receber um prazo para obter a resposta.

Mas o que a NET faz? O de sempre:

  • Vamos estar reiniciando o seu modem e vamos estar monitorando[2].
  • Infelizmente nós não estamos detectando nenhum problema com seu modem, por favor aguarde enquanto eu estarei entrando em contato com a equipe de apoio.

(Música durante cerca de 15 a 20 minutos)

  • Senhor, não estamos detectando nenhum problema no site, o problema deve ser na residência do senhor.

(Alguns minutos explicando novamente o problema e mostrando que outros usuários do Virtua tem o mesmo problema, e que usuários de outros provedores não tem o problema)

  • Senhor, eu estarei transferindo o senhor para nossa equipe de apoio, eu peço que aguarde.

(música por 30 min. até que a ligação cai ou a atendente retorna para te informar que o ramal está ocupado).

No fim, você consegue simplesmente que eles solicitem uma verificação da rede (que sempre resolve o problema).

Resultado: 1h (ou 3h no meu último caso) de telefonema para conseguir exatamente o mesmo que se consegue com as companhias telefônicas em 5 minutos.

Os problemas com banda larga são invariávelmente na rede

Ao contrário da TV a cabo em que os problemas são quase sempre de sincronia do decodificador, os problemas de internet são quase sempre de roteamento, e muitas vezes não tem nada a ver com modem ou micro do usuário. Todo usuário sabe reiniciar o modem e o micro. Usuário de banda larga sabe o que faz.

Os atendentes de primeiro nível não sabem (ou podem) fazer nada

O que deixa a gente na mão do suporte de segundo nível, ou equipe de apoio, que nunca está disponível (claro, deve ficar altamente sobrecarregada).

Até aí nada de mais, anota-se o chamado e a resposta vem mais tarde, quando a equipe de apoio puder, certo? Errado! A NET não deixa abrir esses chamados, temos de aguardar na linha até falar com o suporte de segundo nível, momento em que a ligação invariávelmente cai.

As chamadas caem quando demoram a ser atendidas

Sim, o sistema de telefonia deles deve ser um lixo. Depois de exatos 15 minutos em espera a música acaba, e depois de cerca de 3 min de telefone mudo a ligação termina com um tom de ocupado.

Se isso é por incompetência dos atendes que não sabem transferir as ligações ou porque o sistema em si é ruim, não sei, mas faz com que a gente tenha de ligar 3 ou 4 vezes e reclamar que a ligação cai sempre pra que alguém leve o atendimento até o final.

Os técnicos não tem acesso as informações

Aparentemente os técnicos que são enviados a sua casa para resolver os problemas não são informados do que se trata de forma correta. Eles são em geral super competentes e por várias vezes foram a minha casa para depois dizer:

  • O problema era isso? Ah, isso eu resolvo é lá na central.

No que ele telefona para a central e resolve o problema em segundos.

Mas ele só fica sabendo o problema quando chega na minha casa! Se a atendente passasse pra ele (ou ao menos anotasse, porque eles não anotam, dá pra perceber isso quando as ligações caem e eles não sabem o que eu conversei com o atendente anterior, apesar de saber até quem era) o problema, ele resolvia sem nem mesmo ir na minha casa. Economizava tempo meu, dele e dinheiro da NET.

Sugestões par a NET

De forma que o motivo principal de eu sair da NET é o atendimento. Enquanto eles tratarem usuário de banda larga igual usuário de TV a cabo, vão ter um atendimento inútil, custoso e que só traz raiva pro usuário. Se alguém da NET ler isso, por favor, siga as seguintes sugestões:

  1. Usuário de banda larga sabe o que esta fazendo, por favor ouça e anote o que ele diz.
  2. O suporte de nível 2 não dá conta de responder em tempo real. Internet é algo complexo. Anote o chamado e faça o suporte de nível 2 entrar em contato mais tarde.
  3. Usuário não gosta de musiquinha. Se precisar esperar, prefira anotar os contatos do usuário e voltar a ligar mais tarde.
  4. Obrigue os atendentes a anotar os detalhes do chamado. É desses detalhes que os técnicos precisam. Esses detalhes poupam tempo quando as ligações caem.
  5. Melhorem o sistema de telefonia As ligações SEMPRE caem quando a gente é transferido. Descubram se é culpa da máquina ou dos operadores, mas por favor, façam funcionar.

Gostaria muito de voltar pra NET, mas do jeito que está, ficou impossível!

Notas

  1. ? ou traceroute, ou mesmo tracepath, no linux/unix
  2. ? Que diabos de tempo verbal é esse? Esses caras não sabem que gerúndio é particípio do presente, que não existe um "futuro contínuo" em português?

--girino 16:52, 6 Agosto 2007 (BRT)

Update

Estou, neste exato momento, no telefone com os operadores da net cancelando meu virtua. --girino 09:36, 10 Agosto 2007 (BRT)

Cancelado. --girino 09:39, 10 Agosto 2007 (BRT)

2007 August 07 17:22:58 BRT

implementação da transformada discreta de cosseno em java

Mais uma busca que caia no meu site. Provavelmente por causa do artigo Transformada discreta de cosseno, e dos diversos artigos com código java. Para não deixar o público na mão, resolvi implementar 🙂

Quem quiser mais detalhes sobre o que é isso e pra que serve leiam o artigo:

public class dct {
 
   /**
    * Calcula a DCT (Transformada Discreta de Cosseno) de uma matriz 
    * quadrada NxN.
    * Este código não é otimizado, para possíveis otimizações, 
    * definições e detalhes, veja
    * http://www.girino.org/mediawiki/index.php/Transformada_discreta_de_cosseno
    *
    * @param img a matriz (imagem) a ser codificada.
    * @param size o tamanho da matriz.
    * @return a matriz transformada.
    **/
   public static double[][] dct(double[][] img, int size) {
      double[][] ret = new double[size][size];
      for (int i = 0; i < size; i++) {
         for (int j = 0; j < size; j++) {
            ret[i][j] = 0;
            for (int x = 0; x < size; x++) {
               for (int y = 0; y < size; y++) {
                  double tmp = img[x][y];
                  tmp *= Math.cos((2*y + 1) * j * Math.PI/(2*size));
                  tmp *= Math.cos((2*x + 1) * i * Math.PI/(2*size));
                  ret[i][j] += tmp;
               }
            }
            ret[i][j] *= 1.0/Math.sqrt(2*size);
            ret[i][j] *= i==0?1.0/Math.sqrt(2):1.0;
            ret[i][j] *= j==0?1.0/Math.sqrt(2):1.0;
         }
      }
      return ret;
   }
 
   /** Matriz de exemplo usada no método main() **/
   public static double[][] test = {
      {1. ,     19. ,    37. ,    55. ,    73. ,    91. ,    109. ,   127.},
      {19. ,    37. ,    55. ,    73. ,    91. ,    109. ,   127. ,   145.},
      {37. ,    55. ,    73. ,    91. ,    109. ,   127. ,   145. ,   163.},
      {55. ,    73. ,    91. ,    109. ,   127. ,   145. ,   163. ,   181.},
      {73. ,    91. ,    109. ,   127. ,   145. ,   163. ,   181. ,   199.},
      {91. ,    109. ,   127. ,   145. ,   163. ,   181. ,   199. ,   217.},
      {109. ,   127. ,   145. ,   163. ,   181. ,   199. ,   217. ,   235.},
      {127. ,   145. ,   163. ,   181. ,   199. ,   217. ,   235. ,   253.}
   };
 
   /** Exemplo. Executa o DCT na matriz de exemplo e imprime o resultado **/
   public static void main(String[] args) {
      double[][] tmp = dct(test, 8);
      for (int i = 0; i < 8; i ++) {
         for (int j = 0; j < 8; j++) {
            System.out.print(tmp[i][j]);
            System.out.print(", ");
         }
         System.out.print("n");
      }
   }
}

--GirinoVey 17:32, 7 Agosto 2007 (BRT)