02/12/2007
Economia de 9 megabytes no banco de dados
Trago aqui nessa postagem um conhecimento completamente inútil, mas inédito: o ENEM não tem um campo de senha de acesso na tabela de participantes da prova no seu banco de dados. Com isso ele economiza 9 mb e em troca um monte de gente fica feliz "hackeando" seu sistema.
Vejam: a senha tem oito dígitos.
2^26 = 67108864 é o maior número de oito dígitos feito a partir de potências de dois.
Ou seja, se o banco de dados tivesse este campo senha, seriam gastos 26 bits a mais para cada um dos milhões de participantes. Segundo a página inicial deles, foram 2.738.610 pessoas que fizeram a prova, o que significa que seriam mais...
26/8 * 2738610 / (1024*1024) = 8.488 megabytes
(dividi por oito para converter de bit pra byte, multipliquei pelo número de participantes e dividi por 1024 ao quadrado para ter o resultado em megabytes)
Ao invés de gerar um inteiro aleatório (a solução mais óbvia, na minha opinião), eles trabalham com um algoritmo muito simples: o número de inscrição é no formato 2007.ABCDEFG-H, onde as letras são algarismos de 0 a 9. Os algarismos da senha são: 9-E F 9-G H 9-A B 9-C D.
É só. Ou, para rubeiros:
puts "Digite seu número de inscrição e pressione 'Enter'." a=gets.gsub(/^2007/, '').gsub(/[^0-9]*/, '').split('') puts "#{9-a[4].to_i}#{a[5]}#{9-a[6].to_i}#{a[7]}#{9-a[0].to_i}#{a[1]}#{9-a[2].to_i}#{a[3]}"
Exemplo prático: meu número de inscrição é 2007.3210403-6 e minha senha é 50666280.
Nunca trabalhei num sistema com tantos cadastrados, mas quero saber das pessoas mais capacitadas que lêem esse humilde blog: vale a pena fazer essa economia de alguns megabytes e em troca ingenuamente deixar as pessoas saberem das senhas umas das outras? IMHO, até que alguém me convença do contrário, isso não é boa programação.
PS: Não fui eu que descobri isso, mas acho que eu fui o primeiro a compartilhar essa descoberta dessa maneira. Quem descobriu foi um cara que divulgou um binário de Windows aqui. Eu emulei via Wine e fui simplesmente adicionando e subtraindo dos algarismos pra chegar a essa conclusão óbvia.
Technorati Tags: enem, inep, brasil, programação, ruby, algoritmos
Compare Preços de: notebooks, acer aspire, hp pavilion, computadores, pentium 4, nintendo wii, ps3, celulares, câmeras digitais
30/11/2007
eRuby na Dreamhost
Depois de várias tentativas sem sucesso, enfim consegui rodar o eruby na Dreamhost. A solução foi compilar o source no servidor (via SSH), copiar o binário eruby para eruby.cgi dentro da pasta do domínio e escrever:
DirectoryIndex index.rhtml index.html index.htm
AddHandler rubypage .rhtml
Action rubypage /eruby.cgi
... no .htaccess na raiz do domínio.
A confusão aconteceu por causa de algum defeito no /usr/bin/eruby padrão da Dreamhost. Agora o servidor já está erubyado.
Technorati Tags: ruby, eruby, web, programação, dreamhost, hosting, cgi
Compare Preços de: notebooks, acer aspire, hp pavilion, computadores, pentium 4, nintendo wii, ps3, celulares, câmeras digitais
29/11/2007
Utilizando Ruby, ruby-dbus e librmpd para exibir “o que estou ouvindo” no Pidgin (Gaim)
Ok, acho que vocês já devem ter percebido que virou moda desde que ressucitei este blog usar uns títulos enormes cheios de nomes estranhos e só falar de Ruby. Bem... a descoberta de uma linguagem nova e seu estudo são sempre fascinantes, ainda mais com algo maravilhoso como o Ruby... é apaixonante.
Pra começo de conversa, esse post se propõe a criar um programa em Ruby que mostre a música que você está ouvindo no MPD (Music Player Daemon) no Pidgin. Não sei se a situação é comum, mas é a minha situação e não tinha encontrado outra solução antes, o que me levou a criar um script rubyano.
Para falar com o Pidgin, precisaremos de DBus. DBus é uma maneira inovadora de fazer dois ou mais programas se comunicarem. O HAL (Hardware Abstraction Layer - você provavelmente usa ele e não sabe) usa para fazer aquelas mágicas de montagem e desmontagem automáticas nas distribuições mais novas (inclusive no Slackware 12, e o Slackware tem fama de malvadão) e o Pidgin (nova versão do Gaim) também, para fazer quase tudo. Para acessar o DBus a partir do Ruby, usamos o ruby-dbus. É um projeto em desenvolvimento, que tem alguns bugs, mas nesse caso funciona como esperado.
Para falar com o MPD, precisaremos da libr(uby)mpd. É uma biblioteca extremamente simples de usar e vale a pena ler o código de sua classe pra descobrir suas várias funções e também conferir seus exemplos.
Instaladas essas duas coisas, lá vamos nós:
#!/usr/bin/ruby # MPD2Pidgin (por Tiago Madeira em 29/11/2007) # http://tiagomadeira.net/mpd2pidgin # # (cc) http://creativecommons.org/licenses/by-nc-sa/2.5/ require "dbus" require "rubygems" require "librmpd" class Pidgin2MPD def initialize @b=DBus::SessionBus.instance @s=@b.service("im.pidgin.purple.PurpleService") @o=@s.object("/im/pidgin/purple/PurpleObject") @o.introspect @i=@o["im.pidgin.purple.PurpleInterface"] end def change(msg) status=@i.PurpleSavedstatusFind("MPD2Pidgin").to_s.to_i if status==0 @i.PurpleSavedstatusNew("MPD2Pidgin", 2) status=@i.PurpleSavedstatusFind("MPD2Pidgin").to_s.to_i end @i.PurpleSavedstatusSetMessage(status, msg) @i.PurpleSavedstatusActivate(status) end end class MPD2Pidgin def initialize(host="localhost", port="6600") @host,@port=host,port @mpd=MPD.new @host, @port @mpd.register_callback(self.method('callback'), MPD::CURRENT_SONG_CALLBACK) end def start @mpd.connect true puts "Ctrl+D para fechar" t=Thread.new do readlines self.stop end t.join end def stop @mpd.disconnect end def callback(c) @current=c msg="♫ #{@current.title} - #{@current.artist}" # Personalize essa linha, é divertido. if !@pidgin @pidgin=Pidgin2MPD.new end @pidgin.change msg end end mpd=MPD2Pidgin.new # "127.0.0.1", "6600" # os argumentos são host e porta, para quem precisar mpd.start
Download: mpd2pidgin.rb
Não é brilhante? Só mandar rodar (salve em /usr/bin/mpd2pidgin pra facilitar) e ele mantém sua mensagem de exibição atualizada em todos os protocolos do Pidgin simultaneamente sem nenhum esforço. Qualquer dúvida, comentem.
Technorati Tags: ruby, programação, dbus, mpd, pidgin, gaim, im, music, ruby-dbus, librmpd
Compare Preços de: notebooks, acer aspire, hp pavilion, computadores, pentium 4, nintendo wii, ps3, celulares, câmeras digitais
Assine via RSS
Assine gratuitamente o meu blog e receba todas as atualizações na hora, em seu agregador de feeds favorito.
Busca no blog
Escreva palavras-chave para buscar e clique em Pesquisar.
Veja também...
Blogs de minha autoria
- 1001 Gatos de Schrödinger (discordianismo e mindfuck)
- Algoritmos computacionais (estudo para olimpíadas e aprendizagem sobre lógica de programação)
Artigos por mês
- July 2008
- June 2008
- May 2008
- April 2008
- February 2008
- December 2007
- November 2007
- August 2007
- July 2007
- June 2007
- May 2007
- April 2007
- March 2007
- February 2007
- January 2007
- December 2006
- October 2006
- September 2006
- August 2006
- June 2006
- May 2006
- April 2006
- March 2006
- February 2006
- January 2006
- December 2005
- November 2005
- October 2005
- September 2005
- August 2005
- July 2005
- June 2005
- May 2005
- April 2005
- March 2005
- February 2005
- January 2005
tiagomadeira.net © Todo o conteúdo deste blog, exceto quando especificado o contrário, está licenciado sob uma Licença Creative Commons por Tiago Madeira.
Os comentários são de responsabilidade de seus respectivos autores.
