thegoodfellas/blogset-br huggingface dataset:
Pornophonic e uma banda alema de um estilo alternativo, que mistura rock e musica eletronica com sons de jogos de Gameboy e Commodore 64! Alem de ter um pouco de pr0n como inspiracao nas musicas!Gostei de quase todas as musicas do album 8-bit lagerfeuer, mas posso destacar Sad Robot e Space Invaders como minhas preferidas. Inclusive todas as musicas estao disponiveis para download no site do Pornophonic. Descobri essa banda ha quase um ano, enquanto eu navegava no Jamendo, que e uma especie rede social onde musicos podem publicar seus trabalhos. O interessante do Jamendo e que as musicas sao todas distribuidas pela licenca Creative Commons, todas com permissao para ouvir e redistribuir. Alem disso, existe a possibilidade de os usuarios se inscreverem num programa para receberem uma parte dos lucros obtidos com anuncios do site.No final desse post tem um aplicativo do Jamendo para tocar o album, mas caso ele nao funcione, na pagina do album no Jamendo tem varias alternativas para ouvir a musica, desde o download de mp3 ou ogg via bit torrent ou ate a possibilidade de integrar o site com o Rhythmbox ou Amarok. Muita gente anda empolgada demais com Playstation 3, Xbox 360 e com o Nintendo Wii e se esqueceram do antigo PS2. Apesar de o PS3 ter sido lancado ha alguns anos, o Playstation 2 continua vivo, muitos jogos interessante foram feitos e, incrivelmente, muitas empresas continuam lancando jogos para o PS2.O IGN, que e um site sobre entretenimento que da atencao especial a videogames, possui uma lista com varios jogos de PS2 que serao lancados em 2009 e nos proximos anos. Um dos jogos que provavelmente fara sucesso e o X-Men Origins: Wolverine, com lancamento marcado para o dia 1 de maio de 2009. Mas tem varios outros jogos na fila para serem lancados, eu contei 137 jogos para serem lancados ate maio de 2012!Alem disso, existem varios jogos muito bons que foram lancados para PS2 nos ultimos anos. Eu gostei dos seguintes:BlackBlack, jogo de tiro em primeira pessoa desenvolvido pela Criteriom Games, a mesma empresa que desenvolveu a fantastica serie de jogos Burnout. A acao do jogo tem um estilo muito proximo dos filmes de acao de Hollywood, com direito a armamento pesado, muitas explosoes e inimigos morrendo cinematograficamente.Confira tambem o meu review de Black.Burnout Takedown 3Com o mesmo espirito de "Black" esse jogo da Criteriom Games consegue, mesmo indo contra o paradigma dos jogos de corrida, ser incrivel e alucinante.Ao contrario dos jogos de corrida mais populares como Gran Turismo, o realismo nao e importante na serie Burnout: a alta velocidade e colisoes entre os carros sao os atrativos do jogo. Ao fazer manobras arriscadas, andar na contra mao ou jogar os oponentes para fora da pista, ganha-se um combustivel especial que pode ser usado para atingir uma velocidade impressionante, o que torna o jogo muito empolgante e desafiador.Dragon Ball Z - Tenkaichi 3Esse e um dos poucos jogos de luta que gostei de jogar. Adorei poder brigar com e contra os meus personagens favoritos do anime Dragon Ball, relembrei um
pouco da historia no modo history e pude me divertir com jogando contra os meus amigos. Um otimo jogo para se jogar sozinho ou com uma galera!Metal Gear Solid 3 - SubstanceSou um grande fa de toda a serie Metal Gear, mas Metal Gear Solid 3 - Substante e o meu favorito. O jogo e, em essencia o, mesmo que o Metal Gear Solid 3 - Snake Eater, mas com a possibilidade de usar uma camera 3D, que melhora muito a jogabilidade, facilita a visualizacao dos inimigos e ainda melhora a contemplacao dos belos cenarios do jogo.Esse foi o jogo mais interessante que joguei ate hoje no PS2, terminei o jogo varias vezes e nao me cansei ate terminar o jogo no modo Extreme, sem matar nenhum personagem, sem acionar nenhum alerta e em menos de 5 horas! Obtive o melhor rank, o Fox Hound!God of War I & IIGod of War IGod of War IIMais dois jogos onde a acao e a violencia estao em primeiro lugar, mas, ao contrario do que se pode esperar, isso torna o jogo muito empolgante, do inicio ao fim. Com inimigos desafiadores e varios puzzles para serem resolvidos, God of War I e II estao entre os jogos de Playstaion 2 que fazem mais sucesso.Persona 4Jogo de RPG que sai bastante do padrao dos jogos desse genero. A historia se passa na Tokio de 2011, e tem uma trama policial, que envolve sequestros e assassinatos. Esse jogo e bem longo, estou em mais de 70 horas de jogo e ainda nao consegui terminar!
Pretendo fazer uma pequena comparacao entre algumas linguagens de programacao, so para tentar mostrar um pouquinho de como cada uma tende a fazer com que o programador pense nas solucoes de uma determinada maneira.Para tal, vamos comecar com uma pergunta bem simples: quem negaria que o conceito de somatorio e importante em qualquer ciencia exata? Se voce nao se lembra do somatorio, de uma olhada no artigo sobre somatorio da Wikipedia.Ou seja, essa e uma notacao para a soma de f(1) + f(2) + ... + f(m). Um conceito bem simples que torna um monte de coisas bem mais praticas. Se tiver algum matematico lendo esse texto, certamente vai lembrar como o somatorio e importante na hora de formalizar o conceito de serie de numeros reais, de serie de funcoes. Ate mesmo a integral pode ser definida como um limite de somatorios. Falo da soma de Riemann.Calma, esse texto nao vai ser sobre matematica, nao se desanimem. Vou comecar com um objetivo bem simples: como levar naturalmente o conceito de somatorio para a programacao? Em linguagens como em C normalmente o somatorio fica escondido dentro dos for's e dos while's, ou da para fazer um hack usando ponteiros para funcoes, ja em outras linguagens, como Python, Ruby e Scheme o somatorio pode ser implementado de uma maneira bem elegante.Mas antes de comecar a implementar, vamos tentar formalizar um pouco o conceito de somatorio. Podemos pensar no somatorio como uma funcao que recebe dois numeros inteiros e uma funcao e entao devolve o resultado da soma da funcao calculada em cada um dos numeros inteiros entre os dois inteiros dados.Como isso ficaria em pseudocodigo? Para quem programou muito em C, eu acho que o codigo ficaria assim:real soma(inteiro ini, inteiro fim, funcao f){ inteiro i = ini; real r = 0; enquanto(i <= fim) { r = r + f(i) i = i + 1; } devolve r;}Mas, sera que e facil implementar algo assim em C? Nao e complicado, mas tem uns probleminhas e limitacoes que ficarao bem obvios, vejam:float soma(int ini, int fim, float (*f)(float x)){ int i = ini; float r = 0; while(i <= fim) /* while e mais compreensivel do que o for! */ { r = r + f(i); i = i + 1; } return r;}Mas, tio, quale a desse float (*f)(float x)?! - E um ponteiro para uma funcao! Sim, existe esse treco e da tanta dor de cabeca quanto voce pode imaginar. :DO problema aqui e que em C funcoes sao diferentes dos dados comuns. Outro problema chato e que a soma funciona para um tipo especifico de funcao e tentar aumentar a flexibilidade so causaria mais dor de cabeca, mais nauseas - deixa eu explicar com termos "tecnicos" - voce teria que usar mais ponteiros. Sim, nada e tao complicado e estranho que nao possa ser piorado.Agora vamos dar uma olhada como essas coisas ficam em Python:def soma(ini, fim, func): r = 0 for i in range(ini, fim + 1): r = r + func(i) return rUm amigo sugeriu que a maneira mais
pythonica de fazer isso e:def soma(ini, fim, func): return sum(func(i) for i in range(ini, fim+1))A primeira coisa que notamos e como a sintaxe e simples e elegante e o codigo, menor! Mas acho que todo mundo ja esta cansado de saber como Python e uma linguagem linda e elegante. Vamos para a parte que importa.Alem disso a funcao func e tratada como um dado normal, que pode ser passada como parametro e depois pode ser chamada como funcao. Alem disso, outra vantagem obvia do Python e que nao precisamos nos preocupar demais com o tipo de dado que a funcao fim devolve. Basta que ela devolva tipos de dados somaveis. Em C teriamos que fazer uma funcao de soma para funcoes que devolvem inteiros, depois outra que soma (concatena) strings ou algum outro tipo de dado em que seja possivel definir uma soma.Vamos ver como o mesmo codigo fica em Scheme?(define (soma ini fim f) (if (> ini fim) 0 (+ (f ini) (soma (+ ini 1) fim f))))Nao e simples e bonito? O que eu achei mais interessante e que pela maneira com que o scheme foi desenvolvido, nao ha a necessidade coisas como o while e o for do C. E, ao contrario do que parece, esse codigo nao acaba ficando lento, nem consome muita memoria por ser uma recursao, pois, gracas a uma tecnica chamada de tail recursion, a funcao recursiva e executada como se fosse iterativa.Tambem tem a beleza matematica: a funcao em Scheme segue exatamente a definicao por inducao finita! Eu convido o leitor para tentar definir a soma de n numeros inteiros usando inducao para entao se convencer que a maneira com que Scheme trabalha e realmente natural, pelo menos natural para os iniciados na linguagem matematica.O que eu acho mais fantastico em Scheme e a possibilidade de criar funcoes durante o periodo de execucao e sem a necessidade de ter que dar nomes para as funcoes. A vantagem de nao precisar das nomes e que nao precisamos dar nomes para funcoes que nao merecem um nome! :DEm Scheme a funcao soma poderia ser chamada assim:(soma 1 10 (lambda (x) (* x (+ x 1))))Isso ai chama a funcao soma passando uma funcao que recebe x e devolde x*(x + 1). Bem divertido, hein? Scheme coloca em evidencia a criacao de funcoes em tempo de execucao e acho que essa e justamente a graca do Scheme. Tem muito mais coisas legais que podem ser feitas com essa brincadeira de criar funcoes em tempo de execucao: da para usar funcoes para representar pares ordenados e ate listas encadeadas. Voce consegue fazer isso? Alias, acho que a maior graca das linguagens funcionais e a separacao entre o conceito de "dado" e "funcao" acaba nao fazendo mais muito sentido.Bem, eu tinha citado Ruby como exemplo de linguagem interessante para escrever o somatorio, entao vamos la. Mas antes, deixa eu so eu fazer um comentario: um monte de gente fala que Ruby e uma linguagem que suporta o paradigma funcional e isso ainda me parece meio estranho. Em Ruby, apesar
de ser possivel criar metodos em tempo de execucao, as funcoes nao sao normalmente tratadas como dados. O codigo a seguir, por exemplo, nao funciona:def soma(ini, fim, func) r = 0 for i in (ini...(fim + 1)) r = r + func(i) endendExiste uma maneira de passar funcoes como parametros, mas eu acho feio e tao antipatico quanto passar funcoes em C usando ponteiros. Matz, o criador do Ruby, diz ter um bom motivo para escolher como os blocos e closures funcionam em Ruby, mas nao gostei muito nao. Talvez eu nao tenha entendido. :)Acho que muita gente concorda comigo, tanto que ha um incentivo para que funcoes nao sejam passadas como argumentos, mas sim que blocos de procedimentos sejam criados em tempo de execucao e que esses blocos sejam passados como argumentos. Na verdade passar blocos e passar uma funcao como argumento mas... Ahn, ficou confuso? O codigo fica assim:def soma(ini, fim) r = 0 for i in (ini...(fim + 1)) r = r + yield(i) end rendAqui yield representa o bloco passado como argumento e a maneira de chamar a funcao soma e:soma(1, 10) do |i| func(i)endMas eu desconfio que um rubysta faria a coisa confusa:r = 0(1...11).each do |i| r = r + i*iendTalvez essa brincadeira de passar blocos e criar funcoes em tempo de execucao que seja a parte dita funcional de Ruby, mas ainda nao sei. Se voce tiver alguns exemplos de praticas bem funcionais em Ruby ou Python, por favor, participe nos comentarios.Algo muito parecido pode ser feito com Python, fica como exercicio para o leitor implementar e se divertir. =)Espero que essas comparacoes entre as linguagens tenham sido interessantes e tenha acrescentado algo na vida dos leitores. Quem sabe nao consegui ajudar algum iniciante a escolher qual linguagem aprender primeiro ou ate mesmo a um programador mais experiente a aprender a olhar outras linguagens para descobrir outras maneiras de resolver os problemas que aparecem no dia a dia.Sintam-se livres para criticar o codigo acima, sugerir outras implementacoes ou ate mesmo mostrar como voces fariam o somatorio na sua linguagem preferida. Ah! Fico devendo uma cerveja para o primeiro que mostrar a implementacao do somatorio em brainfuck!
Black e um jogo de tiro em primeira pessoa desenvolvido pela Criteriom Games, a mesma empresa que desenvolveu a fantastica serie de jogos Burnout.O jogo tem um estilo muito proximo dos filmes de acao de Hollywood, com direito a armamento pesado, muitas explosoes e inimigos morrendo cinematograficamente. Por exemplo, se voce jogar uma bomba ou atirar um missil em uma pequena sala com janelas, a parte de dentro da sala sera completamente destruida e os ocupantes serao lancados pela janela de uma maneira espetacular!Para completar a dinamica hollywoodiana, o ambiente e extremamente destrutivel, e depois do combate a devastacao e evidente. Carros acabados, colunas caidas, marcas de explosao e muito mais. Uma grande injecao de adrenalina, certamente.Alem do estilo cinematografico, o jogo tem graficos incriveis, comparaveis aos graficos de jogos de Xbox 360 e PS3 e a trilha sonora e bem empolgante. Ter um bom home theater certamente vai incrementar muito a diversao.Infelizmente existem uns problemas: o jogo e bem curto, sao apenas 7 missoes que podem ser terminadas em 1 ou 2 horas, o jeito e colocar no hard logo no inicio para tentar aproveitar o jogo por um tempo maior. Alem disso, a IA do jogo nao e das melhores, mais um motivo para iniciar o jogo em um modo mais dificil.Sendo um jogo voltado a acao e a adrenalina, nao da para esperar uma historia muito profunda. Eu mesmo ignorei completamente a historia quando joguei. Ate fiquei meio cansado de assistir os videos, que infelizmente nao podem ser pulados, antes do comeco de cada fase.Apesar dos defeitos citados, acho que vale a pena conferir o jogo, pois a adrenalina realmente compensa, os graficos sao excelentes e a dificuldade pode render uma ou duas tardes de muita diversao. Nunca tive duvidas que no transito de Sao Paulo existem muitos motoristas mal educados, que compraram suas carteiras e nao possuem nenhum respeito pelos outros motoristas, pelos pedestres e que, alem disso, nao fazem nenhuma questao de seguir as leis de transito.Normalmente eu percebia erros "bobos" como carros estacionados em locais proibidos, ou em cima da faixa de pedestres, so que recentemente percebi algo ainda mais chato que isso: os motoristas abusam do uso da buzina do carro.Acho que por serem apressados e estressados demais, acabam ficando irritados sempre que o transito fica um pouco mais lento e, se um carro na frente demora um pouco para manobrar e estacionar, o motorista do carro de tras buzina, mas nao e uma buzinada qualquer, e uma buzinada longa, bem longa.O que mais me incomoda e que isso parece contaminar os carros que estao por perto, assim um, ou mais, carros acabam buzinando, seja por incentivo do primeiro mal educado, seja pela incrivel perda de alguns segundos da vida deles. As vezes, ate carros da outra pista acabam buzinando tambem, aumentando, e muito, a poluicao sonora da cidade.Algumas pessoas podem achar que estou reclamando de uma coisa a toa, sem importancia, mas nao e, imagine a seguinte cena: pessoas estao andando numa calcada muito cheia e uma pessoa derruba alguma coisa e demora alguns
segundos para se abaixar, pegar, levantar e voltar a andar. Entao o cara que estava logo atras da um grito - Seu filho da puta, voce esta me atrasando - e outros gritam tambem. Seria extremamente constrangedor e irritante, nao concorda?Essa tremenda falta de educacao nao ocorre no dia a dia com pessoa normais caminhando na rua, mas acontece com motoristas, por que? Eu acho que a resposta e simples, o carro e como se fosse uma couraca, uma protecao e como o motorista sabe que dificilmente seria fisicamente agredido, ele parte para a ignorancia da buzina, do insulto.Quando eu mostrei um rascunho desse texto para um amigo, ele me mandou um video do Pateta, chamado "Pateta no transito" que ilustra o que eu queria dizer, e, alem disso, me deu um otimo titulo para esse texto. Vejam abaixo o video:
O Scheme e um dialeto da famosissima linguagem LISP, criada pelo cientista da computacao John McCarthy, inspirada pela teoria matematica chamada de calculo lambda. LISP tambem foi amplamente utilizada em pesquisas na area de inteligencia artificial e foi provavelmente dela que surgiu o conceito de lista encadeada.Eu nao faco a menor ideia de como e hoje a linguagem LISP para quem quer trabalhar como programador, mas eu resolvi aprender essa linguagem devido ao fato dela ser uma linguagem que implementa muito bem o paradigma de programacao funcional e como ate hoje eu so aprendi um pouco de linguagens estruturadas, como a linguagem C, e um pouco de linguagens orientadas a objetos, como Python e Ruby, resolvi conhecer quale a desse paradigma. Ta, eu sei que Python e Ruby sao multi paradigma, mas elas dao enfase na programacao orientada a objetos!Mas, voltando ao assunto original, como nao quero trabalhar como programador, acho que posso me dar ao luxo de aprender qualquer tipo de linguagem, por menos pratica que ela seja, apenas pelo prazer de aprender. E um outro motivo para eu querer aprender Scheme e que o Emacs usa elisp, mais um dos dialetos de LISP, e aparentemente tem uma galera querendo fazer o Emacs funcionar tambem com Scheme. So que nao faco a menor ideia de como e a compatibilidade do Scheme com Elisp...Obviamente, Emacs tambem e uma excelente ferramenta para programar em Scheme! Ouvi falar que muita gente, mesmo os defensores da seita do VI, largam seus editores/IDEs/SOs favoritos apenas para programar Scheme no Emacs!Aprendo Scheme por causa do Emacs, e aprendo Emacs por causa do Scheme, parece que cai num ciclo vicioso, mas nao, eu queria aprender ambas as coisas desde o inicio.Bem, deixa de enrolacao, esse texto era sobre o que eu tenho feito feito para aprender Scheme, usando o Emacs e por que tudo isso e muito divertido. Entao, como usar decentemente o Emacs para programar em Scheme?A primeira coisa e decidir qual interpretador de Scheme usar, eu escolhi o Guile. O interpretador GNU Guile, nao o personagem do street fighter!Agora basta configurar o Emacs para usar o Guile, para tal, basta colocar no ~/.Emacs a seguinte linha:(setq Scheme-program-name "guile") ;; Sonic boom!Entao basta recarregar o Emacs ou ir deixar o cursor no final da linha anterior e mandar o Emacs executar o codigo elisp: C-x C-e.Agora vem a parte mais legal, que e a integracao do Emacs com o interpretador guile, que funciona bem que e uma maravilha! Eu faco assim, sempre que vou estudar Scheme eu abro duas janelas no Emacs, deixo uma para escrever o codigo e outra com o interpretador Scheme.Conforme eu programo, eu peco para o Emacs enviar uma linha ou um bloco de texto direto para o guile, assim eu consigo testar pedacos do programa em tempo de programacao, sem ter que ficar montando um programa inteiro para so depois analisar o que um trecho de codigo faz.Bem, pode ter sido confuso isso que descrevi acima, mas funciona assim, eu primeiro digito C-x C-3 para abrir uma janela nova, entao vou na
segunda janela, executando C-x o, nessa segunda janela eu executo o comando M-x run-Scheme e o interpretador fica rodando. Voltando para a primeira janela ja podemos comecar a programar, entao vamos tentar digitar o mais classicos programa de todos os tempos, um hello world em Scheme! Digite o seguinte codigo na janela para programar:(display "Hello World!")Agora, com o cursor no final da string, execute C-x C-e, e tcharam! o Emacs enviou a linha inteira para o interpretador, que, err, interpretou o codigo e mostrou a saida! Bem legal, hein?E ainda da para fazer mais, da para enviar um bloco de texto inteiro para o interpretador, e e bem facil, primeiro voce escreve um codigo que tem mais de uma linha, entao seleciona o bloco e em seguida voce roda C-x C-r. Aqui vai um exemplo de codigo para voce testar:(define (factorial n) (if (= n 1) 1 (* n (factorial (- n 1)))))(factorial 30)Se voce nao se lembra como se seleciona um trecho de codigo usando Emacs isso e realmente muito simples, basta apertar M-x espace com o cursor onde voce quer que o bloco comece, entao movimente o cursor ate o final do bloco e toda a regiao delimitada pela posicao atual do cursor e a parte onde o inicio do bloco foi marcado. Agora e so executar C-c C-r.Espero que as informacoes acima sirvam para quem esta comecando com Scheme e queira usar Emacs para programar e, caso voce comece a estudar Scheme tambem, fale comigo e podemos aprender um pouco juntos, discutir umas ideias, trocar uns codigos e coisas assim. Se tiver curiosidade, deixe um comentario ou entre em contato.
Para entender esse texto, o leitor deve estar familiarizado com o conceito de topologia.Frustenberd é um matemático israelense muito respeitado pelos resultados que obteve na teoria de probabilidade e teoria ergódica. Ele ficou famoso logo no começo da carreira ao publicar, em 1955, quando ele era apenas um aluno de graduação, uma demonstração da infinitude dos primos usando apenas a definição de topologia e algumas propriedades de sequências infinitas de números inteiros. Essa demonstração ficou famosa pois ela está bem longe das demonstrações rotineiras da área de topologia: trata-se de uma técnica topológica aplicada à teoria dos números! Por isso mesmo é considerada muito estranha e fascinante. Inclusive ela está listada entre outras 6 demonstrações da infinitude dos números primos que aparece no livro Proofs from THE BOOK.Vou começar definindo uma topologia sobre o conjunto dos números inteiros e então, usamos as propriedades dos abertos dessa topologia para mostrar que existem infinitos números primos.Uma topologia em ZDados dois inteiros a,b, com a positivo, considere o conjunto:Diremos que um subconjunto A de Z é aberto se, qualquer que seja a em A, existe b inteiro positivo, que depende de a, tal que, Na,b é subconjunto de A.Não é difícil demonstrar que de fato definimos uma topologia sobre Z. Convido o leitor a verificar esse fato.Observe que os abertos da topologia de Z possuem as seguintes propriedades:Se A é aberto e não vazio, então A é infinito.Cada Na,b, por definição, é aberto. Também é fechado, já que é complementar de um aberto. Veja:Como todo número inteiro difernet de -1 e 1 pode ser dividido em duas classes, a dos números primos e a classe dos números compostos (isto é, números que podem ser fatorados em números primos), temos a seguinte igualdade:Suponha, por absurdo, que exista apenas um número finito de números primos. Então temos que o lado esquerdo da igualdade acima é fechado. Logo {-1,1} é um conjunto aberto, o que contradiz a propriedade 1 da topologia de Z. Portanto, é um absurdo supor que o conjunto P dos números primos é finito.A demonstração acaba aqui, mas espero que o interesse do leitor pela topologia e suas técnicas não. Para os interessados, vale a pena ler a página da Wikipédia sobre Topologia. To muito puto da vida, eu estava muito feliz com a quantidade de jogos que serao lancados para Playstation 2. Eu fiquei pensando "po, se Black ficou lindao assim, entao os novos jogos devem ter uma qualidade parecida", mas eu estava enganado!Tive duas desilusoes, primeiro vi o lancamento Star Wars: The Force Unleashed, vi que uma das plataformas do jogo era o PS2 e resolvi testar o jogo. Achei meio sem graca, meio travado. Os graficos ate que eram legais, mas eu sentia que faltava alguma coisa. Acabei concluindo que a falta de um processador potente impedia uma simulacao fisica mais detalhada e isso tirava um pouco da graca do jogo. Nunca mais peguei o DVD para jogar.Agora algo parecido aconteceu novamente, peguei o DVD do X-Men Origins: Wolverine para Playstation 2. Porra, ao inves de trabalharem o jogo direito para ter