Feeds:
Posts
Comments

AI 5 na internet?

A internet não é mais como era antes, e o Tim Berners Lee deve está chorando agora. SOPA/PIPA, siglas e mais siglas de pura hipocrisia e burrice humana. A desculpa para limitar e censurar, derrubar sites que disponibilizam conteúdo é que “os ladrões estrangeiros estão roubando a propriedade intelectual dos estadusunidenses”. Tudo como se só eles fossem capazes de criar algo, completa baboseira.

Quanto ao DMCA, e empresas de mídia, é bom que se saiba que os que mais lucram com direitos autorais são os produtores, estúdios e afins. O artista, coitado, é o que menos ganha. Um cantor por exemplo faz sua fortuna por meio de shows, porque se fosse fazer via a venda de CDs seria pobre pelo resto da vida dele.  Já trabalhei em um blog de música e sei bem do que falo. Alguns artistas realmente pensam que vender cd é bom, mas na verdade não é, não é mais. O melhor jeito de cair no gosto popular é se divulgar na internet, disponibilizar material e vê no que dá. Muitos pensam assim  e são super bem. Lembram do que o Radiohead fez com o Rainbonws? Primeiro deixaram o cd para download free e você só pagaria quanto quisesse, achasse que o cd valia, depois venderam um outro album…Expertos não? Tudo questão de saber fazer a coisa funfar.

Hoje me deparei com dois sites de compartilhamento e hospedagem de arquivos fora do ar, no caso não disponibilizando mais nenhum link para download.  E também me deparei com a seguinte mensagem na base do site do google:

Devido a uma queixa que recebemos de acordo com a lei americana Digital Millennium Copyright Act (Lei de Direitos Autorais do Milênio Digital), 1 resultado(s) foram removidos desta página. Para ler a queixa DMCA que causou a remoção, acesse ChillingEffects.org.”

É amigos, a internet acabou. Do meu ponto de vista, se continuar como está vai acabar, porque o bom da internet era ter conteúdo free para que todos pudessem ter acesso, mas infelizmente pessoas burras, artistas burros, empresas burras são souberam se adequar a ela. Uma pena. Vamos todos para Deepweb onde o crime rola solto e ninguém dá conta de nada, talvez.

How many time mates?

Nesse post vou mostrar como criar o mais simples plugin no Rhythmbox. Vou narrar meu passo a passo nessa odisseia.

Tudo começa no lastfm, alguns de vocês  talvez saibam o que é isso. O Lastfm é um site, rede social para amantes de música. Nele você tem seus amigos, vizinhos que são listados com base no grau de afinidade musical e claro tem uma lista com as músicas e bandas que você mais ouve, está ouvindo ou já ouviu. O Rhythmbox atual já vem com um plugin do lastfm que quando você ativa pode marcar as suas músicas favoritas e ter uma lista de bandas similares, etc.  Todo esse plugin foi feito claro com a API do  last  que se encontra totalmente disponível para que você brinque. Mas o ponto não é usar a API do lastfm e sim usar alguém que já usa este recurso. “Como assim Kirotawa?”. Vou explicar, existem inúmeros recursos oferecidos por terceiros no last um deles é adicionar gráficos das bandas mais ouvidas por nomes ou gênero. Veja esse exemplo abaixo:

O que estes recursos fazem é calcular através do seu login do lastfm  os estilos musicais que mais gosta (a imagem acima) e criar um link para uma imagem com o gráfico. Feito isso tudo que você tem a fazer é copiar o link e adicionar no seu perfil e páh! Esta feito.

Agora vamos entender o que o meu simples plugin faz, quais os recursos que eu usei e como ele funciona. O site que gera a imagem que vai pro meu plugin é esse aqui sivy.net. Este site gera uma imagem, neste caso, com a capa dos cds dos artistas que mais escuto, o top 10. Gerando um link que se posto no lastfm mostra a imagem.  Até aqui tudo bem. O problema é que este site cobra para ficar atualizando, ou seja, se você quer que a imagem mude sempre você terá de pagar ou ficar atualizando na mão. Eu até sou a favor de pagar, mas sou liso e queria que a minha imagem se atualizasse sem eu ter que pagar. Como eu sabia exatamente como fazer isso, crawleando o site e pegando o link e depois só teria que injetar no lastfm, bem, não deu muito certo. Primeiro tentei fazer isso usando o GAE  (google app engine) como intermediário, mas graças ao tempo que o sky.net leva para gerar a imagem, mais de 5/10 segundos, o GAE me xinga e não resolve o meu problema, pois dá time expired.  Usei o urllib open, depois o urlfetch do próprio GAE e nadas! Foi então que desisti de fazer um webcrawler pra por a imagem atualizada no meu lastfm =/ e pensei – horas bolas porque não tacar isso no rhythmbox. Foi o que fiz. Mas antes vou descrever tudo que fiz, alguns passos devem ser inúteis, mas eu precisava testar cada um deles, eu simplesmente gosto de ver como as coisas funfam ;) .

Passos.:
1) Usei uma bazuka para matar uma mosca. Como o sky.net faz post dos dados eu precisava saber o que tanto ele passava para poder preencher o form do jeito certo. Para descobrir isso eu apelei ao wireshark um sniffer que me mostra todos os dados que estão sendo passados por post. Bastou usar esse filtro: http.request.method == “POST”. Assim eu pude ver tudo que era necessário a ser passado no form e páh, só precisei nomear as variáveis e preencher elas em um dicionário.

values =
    {
     'nick':'kirotawa','type':2,'period':'3month','count':10, 'align':1,
     'font':20,'font_zoom':100,'generate':'Generate', 'colortext':'0;0;0',
     'colorbackground':'255;255;255'
    }

2) Criar o webcrawler usando o urlopen e o BeautifulSoup. Deem uma lida neste blog e vão saber do que estou falando.

3) Com o link para a imagem eu só precisei salvá-la ou usar o link e carregar ela no pixbuf do gdk (como eu já testei e deu paw quando tento carregar ela via url no pixbuf eu preferi salvá-la).  A mágica para fazer ela, a imagem, ser sempre atualizada com minha lista, é gerar  uma nova imagem sempre que entro no rhythmbox pela primeira vez. “Como você fez isso?”. Usei a força, joguei a imagem salva na pasta /tmp e pronto :P . Ele só gera uma vez a cada entrada no rhythmbox pela primeira vez após login. Porém isso tem um custo, um preço caro. Como disse antes o sivy.net é lento, logo a resposta pro urllib é lenta, logo o rhythmbox fica ? LENTO, isso se não trava. Pesquisando achei algo falando de um tal de rb.get_url, mas a documentação do rhythmbox é pobre e não me ajudou muito, por isso o plugin vai ficar lento por enquanto até que eu descubra como esse trem (get_url) funciona. Afinal eu preciso passar tudo via post, recuperar o html todo e filtrar só minha IMAGE_URL.

Finalizando, o plugin não é lá essas coisas, é o mais simples e burro, mas tive de revisar tanta coisa e estudar outras (GAE, urllib, BeautifulSoup, gtk, gdk ) que valeu muito a pena. Segue abaixo o código do meu plugin :P .


import os
import urllib
import urllib2
from BeautifulSoup import BeautifulSoup
from gi.repository import GdkPixbuf, GObject, RB, Peas, Gtk, Gdk

IMAGE_PATH = "/tmp/top10.jpeg"

class Load(object):
    ''' Class load and make the low level that is necessary '''

    url = "http://lastfm.sivy.net/?do=albumForm-submit"

    values = {
        'nick':'login_here','type':2,'period':'3month','count':10, 'align':1,
        'font':20,'font_zoom':100,'generate':'Generate', 'colortext':'0;0;0',
        'colorbackground':'255;255;255'
    }

    def __init__(self):

        data = urllib.urlencode(self.values)
        request = urllib2.Request(self.url, data)

        response = urllib2.urlopen(request)
        document = response.read()
        soup = BeautifulSoup(document)

        image = soup.find('textarea').contents[0]
        image = image.split('[img]')[1].split('[/img]')[0]

        file_image = open(IMAGE_PATH,'wb')
        file_image.write(urllib.urlopen(image).read())
        file_image.close()

class Top10Plugin(GObject.Object, Peas.Activatable):
    object = GObject.property(type=GObject.GObject)

    def __init__(self):
        super(Top10Plugin, self).__init__()

        if not os.path.exists(IMAGE_PATH):
            Load()

    def do_activate(self):
        shell = self.object
        self.image = Gtk.Image()
        self.pixbuf = GdkPixbuf.Pixbuf.new_from_file (IMAGE_PATH)
        self.image.set_from_pixbuf(self.pixbuf) # , 175, 328)

        self.container = Gtk.VBox ()
        self.container.pack_start (self.image, True, True, 6)

        shell.add_widget(self.container, RB.ShellUILocation.RIGHT_SIDEBAR, False, True)
        self.container.show_all()

    def do_deactivate(self):
        shell = self.object
        shell.remove_widget(self.container, RB.ShellUILocation.RIGHT_SIDEBAR)
        self.image = None
        self.pixbuf = None
        self.container = None

O que faz o plugin…

Olhe e aprenda

Isso é mais do que comum com quem está iniciando em C, ou com quem faz computação ou curso que paga C. Segfault é tipo o pesadelo de todo aluno de estrutura de dados quando ele tem que fazer seus trabalhos em C. Entretanto, ao contrário do que muitos pensam este não é um erro insolúvel, ou mistico. O segfault quer dizer simplesmente que você é noob em C e sim, você fez merda! Agora pare de programar, olhe o seu código e tente descobrir onde e porque essa mensagem, chamada carinhosamente de mensagem da morte, apareceu na hora de executar o seu programa que compilou bonito em seu pc.

Você talvez não tenha descoberto e seu código deve ter vários módulos,  cada .c várias linhas e você está entrando em desespero. Se acalme, eu vos apresento Valgrind.
O valgrind é a ferramenta que todo programador C deve conhecer. Por que? Ora, ora, porque ele te mostra detalhadamente a merda que você andou fazendo na hora de manusear com a memoria. Sim, o segfault foi, provavelmente alguma falha sua usando malloc, ou ponteiros.
Eu não vou mostrar como se usa o valgrind, nem vou dizer onde baixá-lo, vou usar a metodologia que meus professores da graduação usavam com minha turma, Se vira sozinho, aprenda, dê seus pulos!
Mas antes de terminar vou dizer o que certa vez aconteceu comigo programando em C. Eu precisava fazer um trabalho de algoritmos avançados, um Grasp pra um caixeiro viajante. E eis que dias antes de entregar o trabalho o segfault me bate a porta. Como na época era noob level 2 (não sabia pn) usava o método ninja (e sofrível) do debug a lá printf. Em uma dessas printadas na tela, acrescentei um printf em dada linha e magicamente o segfault sumiu. Pensei comigo, é macumba? Mas não tem nada a ver com macumba, outra vez não vou dizer o que era, HAHA, mas busquem sobre contexto de memoria e vão descobrir.
Boa sorte e por favor usem o valgrind, mas não só pra corrigir seus erros ao lidar com memoria, mas pra se certificar que você fez o certo, aprendam com ele como manusear memoria e ponteiros em C, não façam os foguetes caírem na casa de gente de bem, blz =P.

Referências

[1]  http://valgrind.org/docs/manual/quick-start.html

Python para Kinect

Você é um Pythonista, mas também é um jogador fanático pelo tecnologia do Kinect e você ficava triste por não ter como usar Python + PyGame e o kinect, bem, você ficava.

Leiam: http://channel9.msdn.com/coding4fun/kinect/PyKinect-Yep-Python-and-Kinect-in-Visual-Studio-yet e rolem na grama como eu =].

  • Quando eu digo por onde vou que em Python você pode voar, para isso basta usar o import fly.antigravity, eu não estou brincando :P . Esses dias pesquisando sobre aplicação de tiles em PyGame encontrei um tutorial bacanudo que me apresentou um modulo muito útil, o  ConfigParser. Este modulo ler um arquivo (txt) digamos assim, e faz o parser através de seções definidas no arquivo e dos seus valores. Mas como é isso Kirotawa? Veja o exemplo abaixo.

[level1]
map = @@@@
      ####
      ####
      @@@@
name = Fublasterdanger

[level2]
map =@@@@
     ####
     @@@@
     @@@@
name = Easy for girls

Esse é o arquivo de configuração, ou o seu load para jogos. O arquivo possui as seguintes características.

  • Seções ou ‘section’: define, como o nome já diz, uma seção e é representada por [nome_seção].
  • Opções ou ‘option’ ou itens: define os itens de uma dada seção. No nosso exemplo os itens são ‘nome’ e ‘map’.
Pronto, é só isso, nada mais. E com esses dados definidos para manusear é mais fácil ainda, veja o exemplo abaixo.

# -*- coding: utf-8 -*-

import ConfigParser

parser = ConfigParser.ConfigParser()

# Lê o seu arquivo com as definições de seções e itens.
parser.read("my_file_config")

# Retorna uma lista de seções
parser.sections()

# Retorna uma lista de tuplas dos itens da seção e o seus valores -> (item, valor)
parser.items('nivel')

# ... etc

Para ver o restante dos métodos basta usas as facilidades do python, nesse caso o help(ConfigParser).

E agora você me perguntar, “mas Kiro, o que eu vou fazer com isso?”. Como disse em Python a gente pode fazer tudo, eu vou usar para carregar configurações prévias de joguinhos ou aplicações GUI. Atrelado ao fato que posso criar o arquivo de config em tempo de execução e/ou alterar isso é uma boa, para o que quero fazer. Agora o que você vai fazer…Use sua imaginação =], ela será sempre o limite quando nos referimos a programar em Python. Então é isso, see ya later!

Referencias:

[1] http://wiki.sheep.art.pl/Tiled%20Map%20in%20PyGame

Faz pouco mais de duas semanas que mudei de cidade, mudei de empresa, de paradigma profissional, em resumo virei o meu mundinho de cabeça pra baixo para uma posição que não tinha explorado ainda. Em Natal eu trabalhava com desenvolvimento web prioritariamente (Python + Django), o que não me impedia de trabalhar com desenvolvimento de camadas mais abaixo no processo de desenvolvimento.

Trabalhar (ganhar dinheiro profissionalmente) com Python sempre foi um sonho e um luxo para mim. Nos poucos meses em que pude trabalhar lá em Natal me diverti bastante não só com as tecnologias, mas com a equipe com a qual trabalhava. Lá eramos uma pequena empresa composta por 4 funcionários, e mesmo de porte pequeno era uma empresa cheia de projetos interessantes. Meu chefe sentava do meu lado e sempre contava algumas piadas, era um ambiente ótimo, descontraído, divertido, às vezes estressante por termos que lidar com clientes, mas isso faz parte. Tínhamos às vezes as visitas do CLX, um dos desenvolvedores que mais admiro não só pelo cabeção (inteligencia = cabeção, pra não achar que to xingando hehe) que tem, mas pela simplicidade e humildade que transmite, bem diferente de muitos colegas da área que são uns malas, infelizmente. Sai de lá no momento em que a empresa iria investir em projetos novos e nos quais estava muito afim de trabalhar, afinal envolvia desenvolvimento em baixo nível usando C, linguagem com a qual gosto muito de codar. Fiquei bem triste por sair nesse momento, por perder a chance de programar em C profissionalmente e não só “hobisticamente”. Mas o mundo chama né.

Hoje me encontro em Londrina, a empresa na qual trabalho é de porte médio, possui várias divisões, recentemente anunciou planos de investimentos nos funcionários como incentivos a produção, participação nos lucros da empresa, etc. Meu chefe não senta mais do meu lado nem conta mais piadas, o ambiente não é tão descontraído quanto o da empresa de Natal, mas também não chega a ser chato. Aqui as pessoas passam horas na frente do PC e só se levantam pra tomar água, algumas poucas para jogar conversa fora e no intervalo depois do almoço jogam algum jogo em rede, mas como sou noob acabou quase nunca jogando. Em Natal costumava sair da sala da empresa pra tomar água, esticar as pernas e sempre parávamos para ver algum vídeo tosco e dar boas risadas ou xingar alguém. Por mais descontraído que fosse o ambiente sempre cumpríamos nossos prazos e estávamos sempre elétricos para cumprir nossas tarefas (afinal como dizia meu chefe “somos jovens”), ah e todas as sextas era dia de dorgas com muita ênfase na cerveja (embora nunca tivesse saído com o pessoa da empresa de Natal, sabia que o pessoal de lá era bem entrosado e costumava sair pra um bar e tomar todas).

Aqui o pessoal é legal, mas ainda não tive a oportunidade de conhecer e conversar de boa com eles, talvez me sinta um tanto perdido no espaço maior, diferente de como era antes. Aliás, aqui trabalhamos com tecnologias pagas (é, traí o movimento), trabalhamos com C#, Unity 3D e salve o Blender que é free. Além dessas ainda trabalhamos com C++ (eu não, prefiro C) e C, nesse caso em C só eu. Ganho mais do que ganhava em Natal, mas se quisesse ganharia o mesmo em Natal que ganho aqui. A verdade é que vim para Londrina pelo desafio, pelo aprendizado, pela mudança, pelo novo, jamais irei deixar de programar em Python, de apoiar o software livre, de viver essa filosofia que vivo desde 2003, jamais! Mas acho que todo profissional deve bagunçar um pouco seu mundo de conforto, sua posição tranquila e se largar em um novo desafio, ver o que será, aprender, quebrar a cara, lidar com cultura e pessoas diferentes, mostrar o que você sabe, ensinar o que sabe e aprender o que os outros passam de novo para você. Eu vejo muita gente valorizando apenas o dinheiro na vida profissional, só pensando em quantos K’s a mais vai ganhar, e esquece que a vida profissional é bem mais que o dinheiro, é satisfação, é paixão pelo que se faz. Sou apaixonado por desenvolvimento, por codar, sempre quis trabalhar com desenvolvimento de simuladores e jogos e cá estou, não sei se vai ser fácil no que concerne a adaptação as pessoas daqui, ao ambiente profissional que é bem diferente, as sextas sem dorgas, ao calor humano que os nordestinos têm (às vezes que chegava todo suado de andar no sol pela pele de Natal) realmente não sei, o tempo vai me dizer isso. Entretanto, como diria Felipe Barros, salve onde você estiver!, somos/sou um cientista da computação, sou capaz de fazer tudo senão mais. Confio no meu taco, sei que posso aprender em pouco tempo o que não sei, sei que posso me surpreender e surpreender aos que me cercam, desafios são sempre bem-vindos, e para quem gosta de debugar como eu, corrigir erros da vida ou dos códigos é moleza. No mais, se não der certo por aqui volto pra Natal com a mala cheia de aprendizado, sorrindo e acenando como me ensinaram meus amigos preto e branco de Madagascar. =P

E se você enxergasse apenas em preto e branco?

No terminal do linux/unix a saída dos seus programas em C geralmente tem somente uma cor, aquela que o terminal disponibiliza. Mas e se você pudesse colorir mais a saída dos seus programas. É, eu sei, isso talvez seja um detalhe pequeno, mas e se você pudesse mudar? Criar um programa onde a “interface” para o usuário tivesse cores que destacassem o tipo de dado a ser apresentado ou a entrar no programa?

É, em uma noite longa de insônia ideias costumam vim a mente das pessoas, a minha pelo menos. Em poucas linhas de código a gente constrói um simples e bobo brinquedo novo, mas que pode ter sua utilidade no futuro, no presente, ou do modo criativo que você quiser usar.

Pensando em por mais cores na saída dos programas em C eu escrevei um .h chamado colors que definem uma serie de cores que podem ser setadas para a saída do seu terminal. Lembrando que só pode ser usado no linux/unix, infelizmente para os que usam Win/OS. Para os interessados vai abaixo o código de uso deste  .h e uma imagem que mostra como a saída é mostrada na tela.


  #include "src/colors.h"
  #include <stdio.h>

  int main(void){
      /** foreground function change the letter of color **/
      foreground(BLUE);
      printf("Testing...");
      foreground(GREEN);
      printf("\nOne");
      foreground(YELLOW);
      printf("\nTWO");
      foreground(CYAN);
      printf("\nThree\n");
      foreground(WHITE);
      /** background function change the back(ground - obviously) of print **/
      background(GREEN);
      printf("The background color is green! And the foreground is white!");
      /** I believe that dont say what style do, right? - change the style **/
      style(RESETALL);
      printf("\nNow, no more colors from colors.h\n");

      return 0;

  }


É isso, a ideia é simples, o uso mais simples ainda, mas lembre-se são as ideias mais simples que fazem sucesso hoje em dia.

Referência
[1] https://github.com/kirotawa/Scripts/tree/master/C/colors

E aê, quem já andou brincando com o QML por aqui? Eu lembro que quando fui o forum do KDE no último EPSL/ENSL eu olhei para o QML sem entender nada tão pouco sem entender porque os caras do KDE falavam como drogados ecstasy. Eles diziam que o KDE novo vinha por ai e vinha com novidades que estavam revolucionando tudo, que o uso do QML (linguagem declarativa do Qt) iria mudar os paradigmas, que não existiria mais programação para desktop como antes. E eu ouvia tudo isso perplexo, com medo dos caras também, e com preconceito, afinal gosto do Gnome e os caras tiraram moh sarro com o bichinho.   Mas então, o tempo vai e o tempo volta, eis que resolvo brincar com esse novo brinquedo que o pessoal do KDE falou tanto. Olhei, olhei e olhei, vi que era possível escrever coisas com python usando o qt e qml , vi que era possível usar C++, por fim, vi o que eu talvez quisesse e não sábia que queria, que era possível usar apenas QML + JavaScript.

Se você olhar para um código QML a primeira vista você vai, talvez, achar estranho, ou dizer, ué isso é JSON? É JavaScript? Que bicho é esse? Depois de um tempo você vai entender tudo, vai entender que o QML é fortemente baseado em JavaScript e para quem gosta de JavaScript isso é magavilhoso (como diria o cara dos melhores do mundo).

Deixando de enrolar vamos ao assunto tema do post. Brincando pra lá e para cá com o QML resolvi criar um joguinho da memória bem simples. Eu não vou descrever o jogo aqui no post nem mostrar códigos porque já tem tudo isso no meu github =]. Vou só postar aqui a imagem desse joguinho bobo, mas que me deu muito prazer de fazer, pois foi leve e fácil. Como se não bastasse ainda uso o python para servir de lançador ou de ponte pra lançar o jogo. Vejam com os seus olhos e se a curiosidade for atiçada dêem um olhada no github .

Kanji Memo Game - QML + JavaScript

Depois que um amigo criou uma extensão pro Chrome, que pegava uma url e invertia ela, aquelas urls de downloads que até discuti aqui como reverter em python, eu decidi fazer minha extensão, só que para Opera. Criar extensões para o Opera é muito fácil, muito mesmo. Eu não vou ensinar como vocês vão criar as suas, hehe, esse post é só pra fazer a propaganda da minha extensão :D .

Para usá-la basta ir no meu github e fazer o download, depois dê dois clicks nela, ou um, ou arraste para o opera. Quando estiver querendo baixar aquele arquivo daquele site mala que inverte a url e exige que você se cadastre nele, clique na extensão conforme a imagem, cole sua url e click em abrir =]. Simples não? Depois eu mostro como fazer essas tais extensões. Até +.

Essa sem dúvida é a notícia mais feliz que li essa semana. Depois de toda a decepção com a Nokia e de não saber se continuo investindo meu tempo de estudo no Qt + QML ou não, vagando por aí tropecei nessa notícia [1]  sobre um port de Qt para Android. A notícia é realmente boa, depois da morte do symbian o que Qt (“kyut”) ficaria órfão de smartphones. O bom mesmo desse port é que ele é algo completo, pois até mesmo o QtCreator vai ser possível usar para criar suas aplicações, testar e debugar, para daí portar para o seu Android tudo bonitinho.

Eu vou deixar de falar e deixar que vejam por si.

Fonte:

[1] http://mynokiablog.com/2011/02/28/video-qt-for-android-comes-to-alpha-stage-qt-qml-apps-on-android/

Older Posts »

Follow

Get every new post delivered to your Inbox.