Essa é uma apresentação que fiz na iMasters em abril último, no evento 7Masters sobre python.
Não é um curso de python, nem nada próximo disso, mas apenas uma visão de que telecom é na verdade um grande TI, com aplicações que todos nós já conhecemos bem.
Era uma apresentação que deveria levar 7 minutos. Gastei 20.
UPDATE: 2021-12-23 troquei o arquivo embedded de flash pra um gif animado uma vez que nenhum browser sério ainda suporta swf.
Quem acessou essa página (ou site) deve ter notado falhas constantes. Não sei dizer se é por causa de ataques DDoS ou mesmo se é alguma falha de sistema ou de hardware, uma vez que não administro o sistema, que fica num provedor de um amigo.
Olhei a estatística de acessos, que conta os acessos válidos (não mostraria um DDos), e não existe nenhum crescimento de tráfego que devesse impactar na performance. Mas algo está ruim.
Então aumentei o tempo de cache das páginas (sem consultar o BD) de 3 minutos para 15. Espero que isso melhore no tempo de resposta do site como um todo.
Depois de anos usando meu roteador wireless Netgear WGR614v7, os recentes problemas do Net Virtua o levaram ao uso excessivo de CPU e um eventual defeito de uso: simplesmente morreu. Não liga mais.
Então reativei meu D-Link DI-524, um roteador wireless que eu deixava de backup e para uso em outros eventos como treinamentos e até mesmo churrascos.
Pra minha infeliz surpresa, descobri que não conseguia mais configurar WPA-PSK no D-Link (sempre o deixava em rede aberta). Simplesmente a configuração, feita via web browser, não é salva tanto no Firefox quanto no Chrome.
Uma pequena pesquisa no Google mostra rapidamente que a situação é "lugar comum" de quem tem esse equipamento. O chineses que desenvolveram a GUI web só se preocuparam em dar suporte ao Internet Explorer, esqueçendo padrões e não melhorando seu suporte com o tempo.
Pra fugir do uso de um Windows, e do Internet Explorer, abri o código fonte da página e verifiquei os parâmetros pra configurar o uso de WPA-PSK. Apesar de utilizar um método POST, funciona perfeitamente com um GET, sendo possível abrir um browser, conectar-se na página do modem (que exige login e senha) e modificar pela URL sua configuração.
A URL fica da seguinte forma:
http://192.168.0.1/h_wireless.cgi?wirelessESSID=MinhaRede&wpapsk1=senhasecreta&
wpapsk2=senhasecreta&channel=8&apply=1
Onde:
Feito isso, o DI-524 já sai funcionando corretamente. E com menor uso de CPU se comparado ao NetGear, que demorava uns 40 minutos pra pegar endereço IP por DHCP no Net Virtua, enquanto que o D-Link só leva uns 5.
Sobre o problema do Net Virtua, é comum a rede inteira fica aberta com um imenso \20 em bridge. Com isso temos 4094 possíveis endereços de máquinas numa mesma rede, todos jogando tráfego de broadcast, criando um uso intenso de CPU por justamente existir mais tráfego em camada de enlace (L2 do modelo RM-OSI), de frames, que na camada de rede (L3).
Mas com certeza vou investir algum dinheiro pra comprar um roteador compatível com open-wrt ou dd-wrt.
Não é de hoje que me deparo com esses erros de unicode em python.
Em algumas funções que uso, principalmente as que lêem de timeline de redes sociais, tenho problemas com caracteres. Dessa vez eu estava fazendo um programa que lê a timeline da rede social da empresa, que é baseada num produto lixo da Microsoft, o ShamePoint, digo, SharePoint, que publica a API de mensagens no formato RSS. A função é pra gerar um gráfico de mensagens a cada 5 minutos para verificar o andamento da rede social (que passou do momento de hype). Então como o ShamePoint é limitado em suas funções, resolvi fazer um "tracking" de posts através de uma função com um hash MD5 da mensagem postada.
A idéia não é muito complexa, mas eis que fazendo o hash eu achei um:
helio@shibboleet:pynet$ ./mynet_tag_posts.py
Getting posts
Reading output and rss
Traceback (most recent call last):
File "./mynet_tag_posts.py", line 106, in
main()
File "./mynet_tag_posts.py", line 103, in main
RSS = RSS_parser(XML)
File "./mynet_tag_posts.py", line 60, in RSS_parser
key = md5sum(rss.summary_detail.value)
File "./mynet_tag_posts.py", line 19, in md5sum
m.update(msg)
UnicodeEncodeError: 'ascii' codec can't encode character u'\xc5' in position 96: ordinal not in range(128)
E a função de hash MD5, a md5sum(), é super simples:
def md5sum(msg):
m = hashlib.md5()
m.update(msg)
return m.hexdigest()
Só que mensagens com caracteres não ASCII, como em português ou suéco, simplesmente matam o processamento do MD5.
Em outros scripts eu contornei isso fazendo uma análise por caractere e substituindo todo aquele que tivesse valor maior que 128 por seu semelhante não acentuado na tabela ASCII. Trabalho tosco, mas funcional.
Dessa vez resolvi procurar como corrigir isso. E pra sempre. Procurei na documentação do python sobre tratamento de unicode.
E não é que achei a solução do jeito mais simples e pythonista possível? Basta forçar um atributo de formato de caractere no texto, como texto.encode(formato). No caso, mudei a função para essa abaixo, usando formato de caracteres "utf-8":
def md5sum(msg):
m = hashlib.md5()
msg = msg.encode('utf-8')
m.update(msg)
return m.hexdigest()
E o problema foi resolvido. Sem mais chororo de formatos iso-8859-1 e utf-8.
Hoje pela manhã (ou quase isso), fui surpreendido pelo mau funcionamento da minha placa de rede cabeada, uma placa gigabit. Não é uma placa que eu tenha escolhido, pois faz parte do notebook, um Sony Vaio VPC-S110GB.
Como a placa não tem led de indicação de funcionamento, eu só consegui identificar que não estava operando pela mensagem abaixo:
root@shibboleet:~# dmesg | grep -i eth
[45263.845838] ADDRCONF(NETDEV_UP): eth0: link is not ready
Após algumas tentativas infrutíferas de colocar e tirar o cabo (acabei até quebro o clipezinho que segura o cabo), dei uma olhada como estava a camada de enlace ethernet.
root@shibboleet:~# mii-tool eth0
SIOCGMIIREG on eth0 failed: Input/output error
SIOCGMIIREG on eth0 failed: Input/output error
SIOCGMIIREG on eth0 failed: Input/output error
SIOCGMIIREG on eth0 failed: Input/output error
SIOCGMIIREG on eth0 failed: Input/output error
SIOCGMIIREG on eth0 failed: Input/output error
SIOCGMIIREG on eth0 failed: Input/output error
SIOCGMIIREG on eth0 failed: Input/output error
SIOCGMIIREG on eth0 failed: Input/output error
SIOCGMIIREG on eth0 failed: Input/output error
SIOCGMIIREG on eth0 failed: Input/output error
SIOCGMIIREG on eth0 failed: Input/output error
eth0: negotiated 1000baseT-HD flow-control, link ok
Esse "Input/output error" já me deu uma dica que algo tinha acontecido com o driver da placa. Como estou usando um kernel-pf, e compilado por mim, esse tipo de erro pode mesmo surgir. Claro que existe a possibilidade de ser um defeito da placa, mas prefiro acreditar que o erro é meu, pois esse eu consigo consertar.
Então dei uma olhada na placa de rede.
root@shibboleet:~# ifconfig eth0
eth0 Link encap:Ethernet HWaddr 00:24:be:65:5a:ab
UP BROADCAST MULTICAST MTU:1500 Metric:1
RX packets:4294957164 errors:4294906502 dropped:4294947030 overruns:4294957163 frame:4294967295
TX packets:4294957163 errors:4294926764 dropped:0 overruns:4294957163 carrier:4294967295
collisions:4294916631 txqueuelen:1000
RX bytes:4294957164 (4.2 GB) TX bytes:4294957163 (4.2 GB)
Interrupt:43
É notável a quantidade de colisões na placa, além de erros, que mostram que realmente alguma coisa não estava certa.
Em outros sistemas (nem preciso mencionar), a única solução seria a de... rebootar. Mas como é um Linux, com kernel modular, bastou fazer o seguinte:
root@shibboleet:~# ifconfig eth0 down
root@shibboleet:~# rmmod atl1c
root@shibboleet:~# modprobe atl1c
root@shibboleet:~# ifconfig eth0 up
Em seguinda, testando o meio físico...
root@shibboleet:~# mii-tool eth0
eth0: negotiated 1000baseT-FD flow-control, link ok
E nada de reboot. Nada como usar unix. Pode não ser perfeito, mas também não é windows.
Que o mundo corporativo é cheio de antas, todo mundo já sabe. Não é de hoje que as tirinhas do Dilbert contam as coisas mais bizarras e estúpidas desses ambientes hostis.
Mas eu cansei. Não do mundo corporativo, pois ele ainda paga meu salário, mas das antas que por lá habitam e simplesmente compram "soluções Microsoft" que só funcionam com... Windows! É incrível a falta de tato e conhecimento das pessoas de alto escalão que definem o que será utilizado por T.I. na empresa. Simplesmente incrível.
Então resolvi iniciar uma pequena campanha, pra ajudar esse povo todo entender que padrões são bons, e que soluções com padrões, seja Microsoft, seja IBM, seja Oracle, ou seja mesmo um software livre, permitem que QUALQUER sistema conecte e funcione, não forçando o usuário a nenhuma restrição de sistema operacional ou navegador Internet específico.
É um grito na multidão. Mas temos de começar a gritar.
Gosto do jogo UFOAI, de UFO Alien Invasion. É um jogo de estratégia que joguei pela primeira vez nos tempos do DOS e do "Windows 3.11 for Workgroups". Nessa época era um outro jogo, pago, e que se chamava X-Com Unknown Enemy, ou algo assim. Com o avanço dos sistemas, computadores, e jogos, obviamente ficou obsoleto e esquecido. Então alguns fãns resolveram fazer uma versão opensource do jogo, e claro, com esteróides.
O jogo exige OpenGL pra rodar, pois usa massivamente o "quake engine" pra renderizar os ambientes. E é fantástico, e difícil, pois tem uma inteligência artificial aprimorada, que faz com que seus soldados saiam correndo de medo no meio de algumas batalhas.
Fazia tempo que não jogava, mesmo porque jogo mais em console que no PC, mas essa semana resolvi brincar um pouco. Eis que descubro um problema de OpenGL no meu laptop:
helio@shibboleet:~$ ufo +set vid_ref sdl
---- filesystem initialization -----
Adding game dir: /usr/share/games/ufoai/base
Added packfile /usr/share/games/ufoai/base/0base.pk3 (9 files)
Added packfile /usr/share/games/ufoai/base/0maps.pk3 (544 files)
Added packfile /usr/share/games/ufoai/base/0materials.pk3 (45 files)
Added packfile /usr/share/games/ufoai/base/0media.pk3 (10 files)
Added packfile /usr/share/games/ufoai/base/0models.pk3 (2015 files)
Added packfile /usr/share/games/ufoai/base/0music.pk3 (49 files)
Added packfile /usr/share/games/ufoai/base/0pics.pk3 (2114 files)
Added packfile /usr/share/games/ufoai/base/0shaders.pk3 (26 files)
Added packfile /usr/share/games/ufoai/base/0snd.pk3 (266 files)
Added packfile /usr/share/games/ufoai/base/0ufos.pk3 (97 files)
Adding game dir: ./base
Added packfile ./base/0base.pk3 (9 files)
Added packfile ./base/0maps.pk3 (544 files)
Added packfile ./base/0materials.pk3 (45 files)
Added packfile ./base/0media.pk3 (10 files)
Added packfile ./base/0models.pk3 (2015 files)
Added packfile ./base/0music.pk3 (49 files)
Added packfile ./base/0pics.pk3 (2114 files)
Added packfile ./base/0shaders.pk3 (26 files)
Added packfile ./base/0snd.pk3 (266 files)
Added packfile ./base/0ufos.pk3 (97 files)
Adding game dir: /home/helio/.ufoai/2.3.1/base
using /home/helio/.ufoai/2.3.1/base for writing
executing default.cfg
couldn't execute config.cfg
----- network initialization -------
libcurl/7.21.6 OpenSSL/1.0.0e zlib/1.2.3.4 libidn/1.22 librtmp/2.3 initialized.
------ server initialization -------
added 7 maps to the mapcycle
----- console initialization -------
Console initialized.
------- video initialization -------
SDL version: 1.2.14
I: desktop depth: 32bpp
I: video memory: 0
I: Available resolutions: 1366x1792 1366x768 1360x768 1024x768 800x600 640x480 (6)
I: video driver: x11
I: setting mode -1
I: set swap control to 0
X Error of failed request: GLXUnsupportedPrivateRequest
Major opcode of failed request: 155 (GLX)
Minor opcode of failed request: 16 (X_GLXVendorPrivate)
Serial number of failed request: 25
Current serial number in output stream: 26
Tentei forçar o sistema a inicializar sem o uso de OpenGL, com o parâmetro "+set vid_ref sdl", mas nem isso resolveu. Como não existe nada mais sagrado ao homem que seus jogos eletrônicos, resolvi consertar o problema. Ou ao menos tentar.
Não vou escrever sobre vídeos de pornografia ou de pessoas xingando, nada disso. Vou falar de novo dos "padrões Microsoft". Não é de hoje que a Microsoft cria aplicativos não padronizados e que fazem questão de não funcionar em outros sistemas além do Windows.
Num desses dias me deparei com um danado de um arquivo de vídeo, WMV, que não funcionava de jeito nenhum.
helio@shibboleet:tmp$ mplayer sound_of_music.wmv
mplayer: Symbol `ff_codec_bmp_tags' has different size in shared object, consider re-linking
MPlayer SVN-r33713-4.6.1 (C) 2000-2011 MPlayer Team
mplayer: could not connect to socket
mplayer: No such file or directory
Failed to open LIRC support. You will not be able to use your remote control.
Playing sound_of_music.wmv.
ASF file format detected.
[asfheader] Video stream found, -vid 1
[asfheader] Audio stream found, -aid 2
VIDEO: [WMV3] 352x264 24bpp 1000.000 fps 336.0 kbps (41.0 kbyte/s)
Load subtitles in ./
open: No such file or directory
[MGA] Couldn't open: /dev/mga_vid
open: No such file or directory
[MGA] Couldn't open: /dev/mga_vid
[VO_TDFXFB] Can't open /dev/fb0: Permission denied.
[VO_3DFX] Unable to open /dev/3dfx.
NVIDIA: could not open the device file /dev/nvidiactl (No such file or directory).
[vdpau] Error when calling vdp_device_create_x11: 1
==========================================================================
Opening video decoder: [dmo] DMO video codecs
DMO dll supports VO Optimizations 0 1
DMO dll might use previous sample when requested
MPlayer interrupted by signal 11 in module: init_video_codec
Não é a primeira vez que pego desses arquivos WMV que morrem com essa mensagem "MPlayer interr'upted by signal 11 in module: init_video_codec". Aliás o sinal 11 de saída significa, de acordo com o /usr/include/asm-generic/errno-base.h":
#define EPERM 1 /* Operation not permitted */
#define ENOENT 2 /* No such file or directory */
#define ESRCH 3 /* No such process */
#define EINTR 4 /* Interrupted system call */
#define EIO 5 /* I/O error */
#define ENXIO 6 /* No such device or address */
#define E2BIG 7 /* Argument list too long */
#define ENOEXEC 8 /* Exec format error */
#define EBADF 9 /* Bad file number */
#define ECHILD 10 /* No child processes */
#define EAGAIN 11 /* Try again */
#define ENOMEM 12 /* Out of memory */
#define EACCES 13 /* Permission denied */
#define EFAULT 14 /* Bad address */
o que não quer dizer nada para mim. Aliás quem criou esse código de erro de saída tava trollando, com certeza.
Mas voltando ao vídeo, que eu queria assistir de qualquer jeito, consegui resolver depois de um Googlada profunda. Foi difícil achar referências, mas encontrei um alternativa pra assistir o vídeo, lá no launchpad. Estava no bug descrito como "mplayer crashes opening wmv files encoded with DMO codec".
A solução foi usar o parâmetro "-vc ffwmv3". Com isso pude assistir ao vídeo que fizeram durante a Mobile World Congress, em Barcelona. Muito bonitinho por sinal.
helio@shibboleet:tmp$ mplayer -vc ffwmv3 sound_of_music.wmv
mplayer: Symbol `ff_codec_bmp_tags' has different size in shared object, consider re-linking
MPlayer SVN-r33713-4.6.1 (C) 2000-2011 MPlayer Team
mplayer: could not connect to socket
mplayer: No such file or directory
Failed to open LIRC support. You will not be able to use your remote control.
Playing sound_of_music.wmv.
ASF file format detected.
[asfheader] Video stream found, -vid 1
[asfheader] Audio stream found, -aid 2
VIDEO: [WMV3] 352x264 24bpp 1000.000 fps 336.0 kbps (41.0 kbyte/s)
Load subtitles in ./
open: No such file or directory
[MGA] Couldn't open: /dev/mga_vid
open: No such file or directory
[MGA] Couldn't open: /dev/mga_vid
[VO_TDFXFB] Can't open /dev/fb0: Permission denied.
[VO_3DFX] Unable to open /dev/3dfx.
NVIDIA: could not open the device file /dev/nvidiactl (No such file or directory).
[vdpau] Error when calling vdp_device_create_x11: 1
==========================================================================
Forced video codec: ffwmv3
Opening video decoder: [ffmpeg] FFmpeg's libavcodec codec family
Unsupported PixelFormat 61
Unsupported PixelFormat 53
Unsupported PixelFormat 61
Unsupported PixelFormat 53
[wmv3 @ 0xb657c180]Extra data: 8 bits left, value: 0
Selected video codec: [ffwmv3] vfm: ffmpeg (FFmpeg WMV3/WMV9)
==========================================================================
==========================================================================
Opening audio decoder: [ffmpeg] FFmpeg/libavcodec audio decoders
AUDIO: 44100 Hz, 2 ch, s16le, 64.0 kbit/4.54% (ratio: 8003->176400)
Selected audio codec: [ffwmav2] afm: ffmpeg (DivX audio v2 (FFmpeg))
==========================================================================
AO: [pulse] 44100Hz 2ch s16le (2 bytes per sample)
Starting playback...
Movie-Aspect is undefined - no prescaling applied.
VO: [xv] 352x264 => 352x264 Planar YV12
A: 7.2 V: 7.2 A-V: -0.000 ct: -0.046 108/108 9% 1% 0.3% 4 0
Nota: Antes que perguntem, não posso publicar o vídeo. Não é nada de tão sério ou secreto, mas uma vez que envolve a marca da empresa e foi feito por outras pessoas, eu preciso que elas primeiro publiquem no Youtube, ou algum outro site, pra depois publicar aqui. E não vou pagar nada pro ECAD.
Já tinha feito referência anteriormente sobre o sistema de monitoração MUNIN principalmente quando escrevi sobre o ataque DDoS que sofri, mostrando os gráficos gerados por ele, mas até agora não tinha escrito nada sobre o mesmo. Então é hora de tentar me redimir sobre isso.
Descobri o MUNIN por acaso. Eu não sou muito fã de sistemas de monitoração pois toda vez que ouço a palavra "monitoração" já penso logo em Nagios ou algo do gênero, que tem um belo apelo visual e poder de monitoração, mas que é complicado para configurar e colocar em produção pela primeira vez, com arquivos de configuração baseados em um XML ou algo próximo disso. Sem falar no consumo de CPU. Eu buscava algum sistema de monitoração de mail enviados pelo mailman, para apenas visualizar a quantidade de mensagens enviadas numa lista de mail que participo e ajudo a administrar.
Buscando algum sistema que apenas apresentasse os dados de uso do mailman em forma fácil como um CSV, para importar em algum outro sistema como MRTG ou RDDTool, encontrei um link na lista de desenvolvimento desse sobre o MUNIN. Primeiramente olhei um screenshot do mesmo e fiquei surpreso pelo belo gráfico gerado, mas não achei que o mesmo criava tudo sozinho e auto-magicamente.
A página do projeto diz que o nome Munin vem das lendas nórdicas: Munin e Hugin são os corvos que ficam nos ombros de Odin (pai de Thor) e vão de tempos em tempos à Midgard, o nosso mundo, para visualizar e lembrar de fatos, e depois reportar os mesmos à Odin. Segundo a página do projeto o nome Munin também significa memória, , provavelmente em línguas nórdicas (leia-se vikings).
E novamente as redes sociais mostram sua força. Após a série de protestos no dia 18, onde até mesmo esse site ficou fora do ar, contra o SOPA, os políticos norte americanos resolveram voltar atrás e não mais apoiar a lei que iria acabar com a liberdade da Internet.
De minha parte, foi uma experiência de abstinência de Internet. Passei o dia sem acessar mail, twitter, facebook, e quase qualquer dispositivo de rede. Mas não fiquei sem mexer no computador, pois aproveitei pra fechar uns trabalhos pendentes (trabalho de casa de contabilidade, do MBA) e minha mãe pediu ajuda pra comprar umas passagens pra uma viagem de ônibus até o Rio de Janeiro, via site da empresa de ônibus. E pedido de mãe a gente não nega. Então minha abstinência foi mais em relação às redes sociais.
A imagem abaixo, que apareceu no FaceBook, ilustra bem a mudança de posicionamento dos políticos após o dia 18 de janeiro de 2012.
Tudo seria vitória, linda e maravilhosa, se não fosse o caso do Megaupload. Megaupload é, ou era, um famoso site onde se hospedava dados para download. Apesar da política do site, de não permitir pirataria, era comum encontrar links de filmes, músicas, vídeos e jogos que apontavam para esse site. O truque era simples: quebrar o conteúdo em vários arquivos protegidos por senha. Mas mesmo sendo contra pirataria, e atuando contra essa uma vez que detectada, o site foi fechado pelo FBI. E o mais absurdo: seus donos foram presos na Nova Zelândia.
Então em teoria ganhamos contra o SOPA, que foi arquivado, mas na prática o mesmo já está sendo aplicado, sendo votado ou não. É a mesma história da invasão americana no Iraque. Quem não se lembra de que os EUA acusaram o Iraque de possuir armas de destruição em massa, e mesmo sendo votado contra qualquer intervenção naquele País, o EUA tomou a dianteira e o invadiu, sem nunca prestar contas nem encontrar nada de armas de destruição e massa? E agora vemos a mesma manipulação maniqueísta americana em relação à Internet. Para quem não percebeu ainda: estamos em perigo.
Para quem ainda não sabe, amanhã, dia 18 de janeiro, é o dia em que a Internet vai parar. Não vai parar por qualquer motivo, mas para chamar atenção quanto a aprovação da chamada SOPA, Stop Online Piracy Act. Para quem ainda não sabe o significado do SOPA, recomendo a leitura desse artigo: Como estou aderindo aos protestos, amanhã o site também estará em modo "off-line", apresentando o logo do SOPA. |
Um pouco atrasado em relação à mídia em geral, que ansiosamente lança esse tipo de reflexão logo na última semana do ano, ou no máximo nos primeiros dias do ano que recém chega, aqui estou eu falando do ano que se foi, 2011. E no dia 11 de janeiro! Não tenho mesmo aquele "timing" jornalístico.
Deixando de lado a discussão sobre certo ou errado em relação a tais publicações, estou escrevendo aqui como foi o ano de 2011 aqui nesse site. Com a ajuda do JoomlaStats ficou bem fácil de ver a quantidade de acessos, páginas mais acessadas, sistemas operacionais, navegadores, etc. Então vamos lá!
Com uma média de aproximadamente 1000 visitas por mês, não tenho do que reclamar em relação à quantidade. Foram mais ou menos 33 visitantes por dia. Uma boa média para quem não tem um grande acervo de material, nem marketing direcionado. Achava que eu só atraia os spammers, mas vejo que tenho algo a mais que um endereço de e-mail valioso (pros spammers).
Não sou grande fã de padrinhos mágicos. Não que o seriado seja ruim, mas não tenho assistido muito televisão. Mas esse vídeo foi apresentado durante a aula de Marketing do MBA, com o professor Peruzzo, que por si só já é um show à parte.
É um vídeo interessantes pois mostra o Flappy Bob, um cara de uma família de palhaços, que se perdeu dos pais e foi criado pelos duendes, verdadeiros burocratas.
Notem como o vídeo é a própria realidade de nossas vidas, onde se não escolhemos o que queremos, as escolhas são feitas por nós. E nós as engolimos sem nem mesmo contestar. Vídeo forte.
A letra:
Timmy: Ei, Flappy Bob olha que situação
Você foi usado apenas como peão
As suas roupas de palhaço
Eles tiraram sem razão
Cai na real isso não é diversão
Desde pequeno manipularam você
Escolhiam seu carro e o que devia comer
Sei que é difícil enxergar
Que é tudo um plano pra te enganar
É hora de parar antes de se arrepender
DC e Sanderson:Ei Flappy Bob, o que é que tá havendo?
Você tá escutando mentiras sem sentido
Pra encher o teu ouvido
Te botando contra nós
Abafando a nossa voz
É, mas vê se não esquece
Foi você, Flappy Bob!
É, foi só você!
Que protegemos, respeitamos!
Como um filho especial.
E agora o que é que temos?
Seja grato pelo menos!
Assinando esse contrato
Tudo vai ficar legal!
Timmy: Cadê a diversão?
Flappy Bob: Em quem acredito?
Duendes: Cadê a diversão?
Flappy Bob: Estou em conflito!
Timmy: Quem vai dizer o que na verdade é diversão?
Timmy: Cadê a diversão?
Flappy Bob: Faz uma pausa!
Duendes: Ele é o vilão!
Flappy Bob: Por sua causa
Quase perdi tudo que eu sempre achei diversão.
Timmy: Ei, Flappy Bob! Ouça o seu coração!
Não é nada disso a sua verdadeira missão!
Eu sei que agora eu tô numa fria
Mas os seus pais, o que diriam
Sobre o caminho que você escolheu sem razão?
Timmy: Cadê a diversão?
Flappy Bob: Em quem acredito?
Duendes: Cadê a diversão?
Flappy Bob: Estou em conflito!
Timmy: Quem vai dizer o que na verdade é diversão?
Timmy: Cadê a diversão?
Flappy Bob: Eu tô confuso!
Duendes: Mas ele é o vilão!
Flappy Bob: É só um intruso!
Duendes: Não merece atenção!
Flappy Bob: Vou agora assinar é minha decisão!
Timmy: Não!
Flappy Bob: Pode até ser um erro que cometi
Duendes: Ha! Ha! Ha! Ha!
Flappy Bob: Mas tudo mudar é muito arriscado pra mim
As coisas que eu usei são do passado eu já deixei!
Eu quero meu mundo como eu me acostumei!
Com toda proteção
Duendes: O perdedor vai pro chão!
Timmy: Ah!
Flappy Bob: Valeu pela caneta!
Page 21 of 33