segunda-feira, 28 de setembro de 2009

O que eu aprendi nessa semana...

Python
  • Para compilar no PY2EXE, no lugar de Console= usar Windows=, assim para de exibir a tela de prompt a cada execução.
  • Entre dois códigos compilados a diferença está no EXE e no Library.zip....
jQuery
  • Funções Personalizadas se faz através da seguninte chamada: $.fn.FuncaoNova = function() { $(this).datepicker(); }
  • this no caso acima é o troço que chamou, e não a si mesmo, útil para fazer outra chamada;
Pouca coisa, é que eu esqueci o resto...

domingo, 27 de setembro de 2009

WebApp, por favor...

Programadores, ao criarem uma aplicação que tenha apenas a intenção de processar dados, como os programas da Receita Federal, porque não disponibilizar os programas em uma versão Web, mantendo a versão desktop para quem não quiser usá-la, ou mesmo um WebApp de código aberto, que poderia ser executado na máquina do cliente, caso este saiba instalá-lo, poderia ser, em PHP, por exemplo...
Ficaria muito mais simples, alternar de sistema operacional, alterar a resolução da tela, já que a maioria dos browsers atualmente suporta zoom decente...
Já um aplicativo Java, fica limitado à sua janela, que é por padrão 800x600, e em um monitor mais novo, fica em 1/4 da tela...
Uma janelinha mini, com letras pequenas...

segunda-feira, 21 de setembro de 2009

MySQL - Corrigindo o Evil BLOB

Problema

Bom, eu havia convertido um DBF do DBase para uma tabela do MySQL. Como estava dando erro com o campo TEXT, criei campos BLOB.
O problema que eu esqueci que havia feito isso, o sistema estava operando normalmente.
Só apareceu o problema quando resolvi migrar o site para UTF-8, o site era Latin1 (ISO-8859-1)...
Todos os campos TEXT estavam corretos, mas os campos BLOB não...
Ao tentar converter com MODIFY o erro era algo do tipo:
ERROR 1366 (HY000): Incorrect string value: '\xC7\xC3O' for column 'HIST' at row 5
O problema é que no campo BLOB estavam salvos os dados em Binário, e o MySQL não sabia o que fazer com os caracteres com acentos.
Solução usada
Rodei no PHP o seguinte código:
$mysqlA = new mysqli("localhost","user","
senha","db");
$mysqlB = new mysqli("localhost","user","senha","db");
$sql = "SELECT * FROM table";
$queryA = $mysqlA->query($sql);
while ($line = $queryA->fetch_array(MYSQL_ASSOC))
{
 $histnew = $mysqlB->real_escape_string(utf8_encode($line["HIST"]));
 $ID = $line["TableID"];
 $sql = "UPDATE table SET HIST = \"$histnew\" WHERE
TableID = $ID";
 $mysqlB->query($sql);
}
Depois de executá-lo, rodei o seguinte código no MySQL:
ALTER TABLE tbllancamentos MODIFY HIST TINYTEXT
E pronto, os acentos estavam corretos bastando apenas escolher o charset pelo MySQL no PHP...

Plugins do Firefox

Lista de Complementos que utilizo no Firefox
  • Firebug - Para programação HTML e teste de tempo;
  • Gmail Notifier - Para verificar se há novos e-mails;
  • PDF Download - Impede a abertura direta de arquivo PDF dando opção de abrir ou baixar (não está funcionando direito);
  • Print/Print Preview 0.6 - Altera botão de imprimir para um botão maior com opção de visualizar a impressão;
  • QuickPageZoom 1.6.2 - desativo opção de contexto - Fica na barra de Status, opção de Zoom por mouse, bom para usuários que não decoram o Ctrl + e -;
  • TabPopup 1.2.1 - Espécie de Aero Peek do Vista pro Firefox;
  • Tamper Data 10.1.0 - Consultar os headers HTTP;
  • TwitterFox 1.8.3 - Twitter na StatusBar com avisos de novos twitts;
  • Compact Menu 2 2.3.2 - Esconde a MenuBar e Cria um ícone que permite o seu acesso;

O que eu aprendi hoje...

PHP
  • Usando Unicode (UTF-8) a função strtoupper tem problemas com "ú", transforma em "ê", não sei porque.
  • Fix: utf8_encode(strtoupper(utf8_decode($str));
Python
  • É diferente o código do 3.1 pro 2.6, de preferência tente programar para o 2.6 que tem maior suporte e ajuda.
  • Rodar o PY2EXE criou uma pasta de 10Mb, com um EXE de 20kb...
  • Usando  Psyco no meu código, aumentou 200kb a pasta do EXE...
  • Fiz meu App pra executar programar direto do browser, talvez eu tente fazer em C. 
  • Usar Import Modulo sempre, nada de From Module Import X - porque;
jQuery
  • É muito simples, vou ver de rewrite all my Javascript com jQuery, vai reduzir bastante a complexidade do código.
  •  Não sei porque comprei o livro de tão simples que é, mas o livro me ajudou muito a entender...
HTML
  • Ancora # procura pelo ID, não precisa daquela tag A;
Meu App
  • Eu converti todo o processamento do meu App para UTF-8, até as páginas são UTF-8...
  • Deixei o código compilant com PHP 5.3.
  • Criei o gerenciador de arquivos.
  • Fazer lista do que fazer acelera a execução do projeto.

sábado, 19 de setembro de 2009

Projeto: Extreme File Compression

Esse projeto permite comprimir arquivos de qualquer tamanho para arquivos de menos de 1KiB.
Impossível? É claro que não, mas também não espere que a decompressão demore menos de uns 10 milênios...

Como?
Acredito que você saiba o que é um algoritimo de file hashing, simplificado é algo como tirar um resumo (hash) de um arquivo X, aquele arquivo X só pode ter aquele resumo W, mas um resumo W pode ser o resumo de vários arquivos X Y Z.
Então, podemos dizer que é possível reconstruir um arquivo X, simplesmente sabendo seu hash W.
É claro que esse processo pode demorar muito tempo, pois temos que rodar por brute-force (força bruta), todas as combinações possíveis, e corremos o risco de achar diversos falsos positivos.
Também armazenamos no arquivo comprimido, o tamanho do arquivo X, assim evitamos correr por todos os tamanhos possíveis de arquivos até chegar ao destino.
Como resolver então?
Tenho duas idéias de como resolver esse problema:
A - Executar o Hashing de todos os arquivos possíveis desde 0 até chegarmos ao arquivo desejado, contando quantas vezes o hash do arquivo foi repetido, a descompressão se daria da mesma forma, até encontrar o arquivo desejado. - O tempo da compressão neste caso é igual ao tempo da descompressão, muitos anos mesmo.
B - Usar vários algoritmos de hasing diferentes sobre o arquivo desejado, a fim de evitar a ocorrência de falsos positivos, assim, somente o arquivo X, teria os hashs A, B, C, D, E, F, G, H, I, J, K, L, M e assim por diante. - Neste caso o tempo de compressão pode demorar apenas 1 hora, dependendo da quantidade de hashs usados... Há apenas um pequeno risco de haverem falsos positivos, mas nesse caso depende da matemática pura e simples....
Exemplo
Aqui um exemplo do que é brute-force, vamos exemplificar que nosso arquivo em 5 digitos, e por serem digitos ele é composto apenas de número, vamos procurar o CRC32 a3bff1c0, então vamos:
  1. 00000 - 4adc54f5
  2. 00001 - 3ddb6463
  3. 00002 - a4d235d9
  4. 00003 - d3d5054f
  5. 00004 - 4db190ec
  6. 00005 - 3ab6a07a
  7. 00006 - a3bff1c0 - achamos o arquivo contém 00006
Viva!!! Descomprimimos o arquivo, sorte a nossa que ele era o 7º da fila....
Mas no mundo real pode ser na trilionésima tentativa, ou um número que nem sei escrever por extenso.
No exemplo acima o arquivo comprimido poderia ter esse conteúdo:
EFC-#-5-CRC32-a3bff1c0-1
Não parece muito eficiente né, mas imagine um DVD de 4.7GB, no arquivo a seguir:

EFC-bin-4700000000-CRC32-d113d346-7872298821547701824
53 bytes contra 4700000000 bytes, um arquivo de 88.679.245 de vezes menor.
Quem sabe um HD de 2TiB:

EFC-bin-2199023255552-CRC32-1afd250-27819858736306.....296621735144842438121298
Mesma coisa, cortei o último item que é o repetições senão o blog não ia exibir, mas faz de conta que o file ficou com 1KiB, um arquivo 2.147.483.648 de vezes menor!!!!

Conclusão
O meu algoritmo de compressão é extremamente eficiente, mas não é eficaz, pois o tempo necessário para a descompressão é exageradamente grande, talvez com a computação quantica ele se torne viável.
Uma última vantagem dele, é que ele pode ser rodado em paralelo sem qualquer perda de eficiência, cada CPU pode rodar um range de arquivos...

quinta-feira, 17 de setembro de 2009

Guia para pensar fora da caixa

Pegue uma serra, corte seu crânio, tire seu cerébro.
Pronto, se você sobreviveu, estará pensando fora da caixa.

Brincadeira, não faça isso, a sujeira vai ser enorme, o sangue espirrará para todos os lados e é dificil de limpar, além da dor na hora do corte, e dos problemas de remover o cerebro do crânio, pois os cabos não são compridos o bastante, e geralmente são do tamanho exato para ficar lá dentro...

Para pensar fora da caixa, primeiro você tem de aprender a ver o mundo como outra pessoa.
Se para você isso é fácil, aprenda também a esquecer quem você é, e tentar descobrir o que a pessoa alvo pensaria.
Se é dificil isso, imagine ser um animal, algum animal que você pode observar o comportamento, interaja com ele, faça ele de idiota, e veja suas reações.
Aprenda.
Ao conseguir pensar como outra pessoa, veja o seu problema, se você pensar como um cachorro, provavelmente o problema deixará de existir.... Um cachorro não tem idéia do aquecimento global, ele só se importa em enterrar seu osso, e brincar, fazendo isso ele é feliz, nem se lembra das vacinas e termometros...
Pense se o mundo fosse acabar em 60 segundos, o problema é importante?
Se for importante, como resolver ele de uma forma definitiva?
O que Chuck Norris faria? E o Jack Bauer?
Pense em soluções idiotas como, vamos organizar um suícidio de toda a raça humana para salvar o planeta, isso ajuda o cerébro a enfretar o problema por outros ângulos, encontrando soluções para qualquer problema inexistente.
Lembre-se que o problema só existe porque você está lá para dizer que ele existe...
A Terra seria apenas um monte de rocha coberta com material estranho se não estivessemos aqui para dizer que é um planeta com vida.

Propriedade Intelectual

O que fazer com a propriedade intelectual em um mundo em que a maioria dos jovens vêm ao mundo com a idéia de que a propriedade intelectual é inexistente?
Jovens copiam músicas, filmes, seriados, programas livremente na internet, isso é um problema para indústria, mas ela provavelmente encontrará uma solução para isso... Talvez remunerando-se por vias indiretas.
O problema mais importante está na concepção de que patentes são um mal ao mundo.
O processo movido contra o twitter por uma empresa que patenteou um modelo parecido para situações de emergências, ou a patente do Google de sua página inicial. Algumas pessoas veêm essas práticas com maus olhos.
Mas o que seria do mundo sem as patentes?
Se você acha que os inventores são movidos simples e apenas pela boa vontade de ajudar o mundo, lembre-se que eles precisam se sustentar, não podem viver de vento.
E se tiverem de trabalhar em outra coisa para se sustentar, não terão tempo livre o bastante para inventar.
De onde viria o dinheiro para remunerar os inventores, e também para incentivar as invenções? Do governo?
E o tempo que você gastou, os materiais gastos, na milhares de tentativas até chegar num produto que funciona?
Para ser inventor você teria de ser também filantropo, ou seja, quem não é filantropo não poderia inventar, ou seja, menos invenções no mundo, menos avanço...
Lembre-se que as patentes tem prazo de validade, o Gilete, aquela lamina de cortar a barba expirou alguns anos atrás. Porque você acha que as industrias farmaceuticas tem nomes compostos? Porque suas patentes estão vencendo, e como não conseguem encontrar novos medicamentos, têm de aumentar seu portifólio de medicamentos.
Assim, durante sua validade, o inventor tem direito a receber royalities por sua invenção, mas depois desse período a invenção passa a ser de domínio público.

É claro que algumas patentes parecem não fazer sentido, mas se os escritórios de patentes aceitarem, porque não patentear? Se você for esperto o bastante pode fazer um pé de meia sem qualquer esforço... E com esse pé de meia poderá ajudar quem quiser, sejam crianças da Africa, sejam os desabrigados de sua cidade.



Estou testando escrever sobre temas polêmicos para ver como os acessos do blog reagem...

quarta-feira, 16 de setembro de 2009

Projeto: Invisibilidade

Este é uma idéia de como poderia ser um sistema de invisibilidade, com funcionamento diferente daquele que tem um projetor em uma roupa, eis que aquele só funciona de um ângulo exato, o meu funciona em qualquer direção...

Montagem

A idéia é baseada naqueles abajour de fibra ótica, imagine que aquilo foi reduzido para, digamos, 1/10 de milimetro, e que a quantidade de filamentos seja de aproximadamente 20.000 filamentos de fibra ótica cobrindo uma área de 140º quadrados...
Embaixo desse dispositivo que vamos chamar de abajour, no lugar de uma lâmpada de uma única cor, teremos na ponta de cada filamento, um gerador de luz LED, que produzirá todas as cores disponíveis, com um nível de contraste altíssimo...
Além, do LED em cada ponta dos filamentos, teremos também nele um sensor de luz, que captará o retorno das fibras... E a ponta dos filamentos deve conter um filtro polarizador de luz, só permitindo a entrada de luz perpendicular à direção da fibra...
A montagem seria realizada sobre um material sólido ou flexível, claro que no caso do sólido é mais simples que no caso do flexível...
Seriam colocados lado a lado sobre o material, permitindo a ocorrência de sobreposição de filamentos, permitindo que no lugar de termos uma série de VVVVVV, tenhamos vários XXXXXX, aumentando assim a densidade por cm²...
Após seria despejado algum fluído que tornasse a posição dos filamentos fixa, tipo um silicone ou algo do tipo, para evitar que eles apontem para um lado diferente com o movimento...
No caso do material ser flexivel, cada abajour teria de ter uma espécie de GPS ativo, para saber sua exata localização em relação aos demais... No caso de usar um material sólido, as medições de posicionamento só seriam necessárias na fabricação....
É importante que todo o material seja da cor preta, e que caso seja iluminado com um fundo preto, não haja reflexos da luz... O material tem de funcionar como um buraco negro se não estiver ativo...
E o material tem de ser coberto como dupla face, assim, caso não haja um filamento distante oposto, usa-se o filamento próximo...

Funcionamento
O funcionamento do sistema é simples...
Cada filamento de fibra ótica recebe a luz perpendicular e transmite ao gerador do filamento que esta apontando na exata direção oposta da luz de entrada, ou seja, é como se a luz passasse direto pelo objeto, ou melhor dizendo é como se ele não estivesse lá...
É claro que se o material for flexivel, como uma capa, o sistema GPS teria de calcular qual filamento está na ponta oposta do outro, teria de ser um sistema bem eficiente e rápido...
A pior parte seria a rede necessária para transportar as informações de uma ponta a outra, só para ter uma idéia, se cada abajour medir 1mm, e isso é bem grande, para esconder um cubo de 1cm³, com uma gama de cores CMYK (32 bits), e uma taxa de quadro de apenas 15 fps, a rede de dados tranportaria algo em torno de 5.3 gigagabits por segundo (ou 686 megabytes/s)...
É claro que se o material for sólido, poderiamos em tese usar uma rede totalmente ótica, sem a presenta de geradores LED, mas isso demandaria um processo de montagem preciso, pois cada filamento deveria ser posicionado no ângulo oposto exato de sua outra ponta...
Mas voltando à rede de dados, os 5.3gbits são apenas para um cubo de 1cm³, para objetos maiores a quantidade de dados é bem maior, e com uma taxa de 30fps é o dobro ainda, lembrando que eu calculei um abajour de 1mm, que é de certa forma grande demais, e acabaria gerando uma imagem pixelada já que os 20.000 filamentos apontam cada um para uma direção diferente...
Em processamento nem ouso calcular, mas cada roteador ou seja lá o que for usado tem de ter sua própria CPU, se não o delay e a quantidade de dados vai para as alturas...

Falhas
Um dos problemas do projeto é a necessidade de gerar a luz LED, mesmo sendo uma opção econômica e pequena o bastante, a luz LED se tentar imitar uma fonte poderosa de luz como o sol ou refletores de luz, pode não ter força o suficiente, e acabar gerando uma sombra...
E mesmo que tivesse potência o bastante, o calor gerado acabaria por facilitar sua localização...
Também há o fato da energia, para alimentar tantas lampadas, seria necessário uma usina de energia...
Outro detalhe é o excesso de sinal de rádio nos casos dos modelos flexiveis, que exigiriam um sistema de GPS pessoal...

Estimativas
Acredito que com um abajour de 1/10 de milimetro, seja possível obter uma invisibilidade de 96% sob a luz solar, e 99% a noite, a uma distância de 30cm, mais que isso a pessoa ouve sua respiração...

Custo
O custo de uma capa de corpo inteiro, incluindo a arma, ficaria na faixa de uns 100 bilhões de doláres...

Uso
Isso é simples, em caso de situações com reféns, em missões de reconhecimento, espionagem, sabotagem entre outras coisas interessantes, :P...

Exemplo Gráfico
==== ( :P ) ========
Luz    Você Luz gerada

E este é meu projeto de invisibilidade, caso tenha interesse favor entrar em contato... :P - Quero meus royalities...

segunda-feira, 14 de setembro de 2009

Banco App

Bem que os bancos podiam liberar um acesso via XML aos extratos, todos de preferência num formato padronizado, fazendo isso, e permitindo que o app baixe os extratos automaticamente, permitiriam diversos serviços, como controle unificado das contas correntes, sem a necessidade do usuário entrar em cada um dos sistemas diariamente, baixar o arquivo e importar no sistema...
Isso é muito chato, dificuldando o ingresso de aplicações desse tipo no mercado, pois exige que o usuário tenha interesse ativo no uso do sistema.
Acredito que um dos fatores para que os bancos não façam isso seja a segurança, mas bastaria criar uma senha exclusiva para o sistema, e pronto, sem poderes para transações...
Um recurso futuro interessante seria o sistema enviar para o banco as transações, e o usuário acessando o internet banking confirmar as operações a serem realizadas.