The Eudyptula Challenge – Part #2

Last post.

Hello there. Little is back, and so is me. I’m returning to the eudyptula challenge, restarting from task #06. By the way, I just sent it to Little a few minutes before writing this post — I hope it is right…

Okay, so after 3 months I forgot a few things. The Linux Kernel is tricky but it is very well designed. Let’s document a few resources here — they might be useful in the future:

Note: this is not in a tutorial style; it is more in a reference style.

Coding your module

  • This vim plug-in by Vivien Didelot — the same author of i3blocks — is very nice to force the usage of the linux kernel coding style. I added it to my pathogen setup.
  • Also, don’t forget to double check that your C code is valid in terms of formatting and style! Use:
    scripts/checkpatch.pl -f code.c
  • checkpatch.pl also contains a –fix command. But you should try to manually fix errors yourself first. And also note that this –fix thing is still experimental.
  • There is also a scripts/cleanfile program to fix any messes about line endings (\r\n vs \n for example) and similars.
  • The best source of documentation I’m using right now is ack + find + tmux. I tried to quickly set up NetBeans and Qtcreator just for documentation purposes — not for Linux coding! — but they do not work out of the box. I believe it is better to stick to a ‘manually search for documentation’ approach. IDEs don’t scale well for this task — at least for kernel and systems programming; I wouldn’t say the same about Java or other very IDE-friendly programming languages.

Testing your module

  • make, make, make!
  • make will create a *.ko module, which you will load with insmod *.ko.
  • Alternatively, you can make modules_install your module, which will be put at /lib/modules//extra. Then you can load it with modprobe *.ko.
  • Always remember unloading your module (rmmod *.ko) before reloading it. It is a good practice: clean before beginning again!
  • To check debug messages, use either dmesg or journalctl -xn — supposing you’re using a systemd-based daemon for your system (it is the case of Arch right now).

Building your kernel

Use:

  • make localmodconfig. You don’t want to create a .config file from scratch!
  • make nconfig to tweak the settings of your .config file.
  • make to build the kernel
  • make modules to build the kernel modules
  • sudo make modules_install will install your modules. Very important to boot into it later on!
  • sudo make install
  • It is important to create a boot entry for your kernel. syslinux users will probably find this task trivial (it is just a matter of mimicking the configuration from your current kernel on /boot/syslinux/syslinux.cfg); grub users should edit /etc/grub.d/40_custom and create a menuentry based on an already existing entry on /boot/grub/grub.cfg.  After that, update your config file with sudo grub-mkconfig -o /boot/grub/grub.cfg
  • You should also pay attention if your linux distribution uses an initramdisk. Arch does, so I created another config file on /etc/mkinitcpio.d/ just for the eudyptula kernel (and then a mkinitcpio -p linux-eudyptula).
  • Use uname -a to check your new kernel after booting into it.

Sending non-HTML mail

  • Mutt is still the best option for me for this.
  • Use ‘m’ to create a new e-mail.
  • Use ‘a’ to add attachments.
  • Use ‘y’ to send your e-mail.
  • Now, if you need to create a .muttrc file from scratch…I’d recommend you to (for example) to use mine as an inspiration.

And let’s see if this thing will keep going on. See you later :)


Filed under: Sem categoria Tagged: challenge, eudyptula, kernel, Linux

Divisão do pacote Pulseaudio

Leandro Inácio escreveu:

Alguns módulos foram retirados do pacotes pulseaudio para evitar problemas de referência a libs dinâmicas. Por favor verifique qual o módulo que você precisa e reinstale-o.

A divisão ficou:

  • pulseaudio-bluetooth: suporte a Bluetooth (Bluez)

  • pulseaudio-equalizer: Equalizer sink (qpaeq)

  • pulseaudio-gconf: suporte a GConf (paprefs)

  • pulseaudio-jack: JACK sink, source e detecção jackdbus

  • pulseaudio-lirc: Infrared (LIRC) volume control

  • pulseaudio-xen: Xen paravirtual sink

  • pulseaudio-zeroconf: suporte a Zeroconf (Avahi/DNS-SD)

URL da notícia: https://www.archlinux.org/news/pulseaudio-split/

Puppet 4.0 entrou no [community]

Leandro Inácio escreveu:

Puppet 4 foi disponibilizado e quebra compatibilidade com a versão 3. Portanto os usuários precisarão atualizar o servidor para o Puppet 4 antes de atualizarem seus clientes. Observe que se tiver apenas o servidor Puppet 4 disponível, os clientes Puppet 3 não irão funcionar. Os locais para as algumas coisas também mudaram incluindo as configurações, manifestos e arquivos de módulos. Você precisará seguir as instruções de atualização para seus servidores e clientes:

URL da notícia: https://www.archlinux.org/news/puppet-40-enters-community/

[Status] LVM and GPT/UEFI paradise

I’m now using LVM on my linux installations and there is no looking back. I also migrated to GPT/UEFI — instead of MBR, and I have to say it is not that hard. Pretty easy, actually, unless your system have some problem with secure boot.

The ESP (EFI system partition), formatted as FAT-32, should have something between 250 and 500MB of allocated space; this is enough in most cases. GRUB and syslinux are well-known to boot (U)EFI systems. I’m using GRUB2 right now, but later on I’ll try syslinux too (I used it before, but for MBR).

I’d recommend to you everything I talked about in this post.


Filed under: Sem categoria

Representação do mundo de jogos Bomberman-like

Existem aqueles problemas não-imediatos como desempenho, elegância ou outros que apenas ficam no caminho para a primeira solução funcional. Há aqueles que condenam a prática de preocupação prévia e insistem em resultados imediatos. Estou trabalhando no desenvolvimento de um jogo similar ao Bomberman e precisei desenvolver uma solução para representar o mapa onde o mundo do jogo é executado. E, é claro, acabei tendo o luxo de escolher a abordagem de desenvolvimento onde a preocupação com problemas não-imediatos ocorre mais cedo que a entrega do produto.

Introdução

Para que o problema não fique muito abstrato, considere a imagem abaixo, retirada do jogo BlowThemAll.

shot-2015-05-09_14-08-52

O mapa do jogo possui uma implementação similar ao conceito de uma matriz, onde os elementos do mapa possuem uma posição <x, y> tal que essa posição não pode ultrapassar os limites da matriz e os índices x e y são números discretos, naturais. Cada posição no mapa é um tile e cada tile pode conter vários elementos.

O mapa contém elementos imóveis, tais como blocos a serem explodidos, e elementos móveis, tais como bombas e avatares. Avatar é um personagem que representa a conexão do jogador com o mundo virtual de BlowThemAll.

Há ainda blocos eternos, que não podem ser explodidos.

No jogo original, Bomberman, uma bomba explode e a explosão tem o alcance baseado em tiles. Itens aparecem somente em tiles específicos. Há muitas observações que sugerem fortemente o uso de uma matriz como uma representação eficiente para o jogo.

Problema

Jogando-se Bomberman é possível observar que um avatar pode estar entre dois tiles, então você não pode representá-los como um elemento em uma sequência que faz parte de algum tile, pois um avatar pode estar entre dois tiles. Logo, o avatar precisa ser independente dessa matriz e não pode ter sua posição representada por números discretos.

Abordagens iniciais

A primeira abordagem para o problema foi utilizar uma lista separada para esses elementos do mapa que podem assumir posições entre dois tiles e armazenar suas respectivas posições usando valores do tipo double (ou parecidos).

Entretanto, eu não me sinto confortável usando valores do tipo double em um jogo em rede. Primeiro, porque o comportamento de doubles não é trivial, e segundo, porque é difícil garantir reprodutibilidade/previsibilidade usando doubles, então  eu não quero lidar com o problema desses números sendo utilizados numa parte principal de um jogo em rede. Lembrando que o double que você está usando pode nem ser o IEEE floating point. É claro que eu iria ler o “what every computer scientist should know about floating point numbers” caso o projeto precisasse, mas eu queria, ao menos, considerar uma abordagem alternativa.

A minha ideia foi usar números discretos para as posições dos elementos não-fixos no mapa, e fazer numa escala diferente (se o mapa era 13×11 tiles, os elementos não-fixos estariam em uma matriz virtual 130×110) para permitir um valor mais granular (que emularia o fato do avatar poder estar entre dois tiles). Essa abordagem não me contentou, pois ela levantava outras perguntas (ex.: quão granular devo permitir a posição para permitir uma experiência de jogo agradável?), não era elegante e tirava a simplicidade que eu tinha na solução inicial, onde, era barata, a operação de encontrar quais os avatares eram atingidos por uma explosão.

Pensando nas restrições

Eu voltei ao problema inicial para pensar nas restrições que ele apresentava. A depender de suas restrições, o algoritmo poderia resolver um problema menor e mais simples. Foi essa a abordagem que me permitiu desenvolver a libdepixelize com menos código e mais rápido, e é isso que decidi também fazer no BlowThemAll, entender melhor o problema.

Daí, percebi algo enquanto jogava bomberman. O avatar pode sim, estar entre duas posições, mas caso ele esteja entre duas posições, ainda há um “tile principal” ao qual ele pertence. Isto é, ele só é atingido por uma explosão caso apenas um dos tiles, o “tile principal”, seja incendiado. Além disso, há a restrição de que ele só pode estar entre dois tiles, não entre quatro tiles. Todas essas informações me inspiraram o suficiente para pensar numa solução alternativa.

Solução final

A ideia-chave da solução que acabei adotando é armazenar os elementos na “matriz”, como estava inicialmente planejado, porém adicionar um atributo “filled”, que representava o quanto  daquele tile o elemento ocupa, e um atributo direção, que representa qual o próximo tile a ser ocupado, quando o elemento atual chegar no limite de desocupação do tile atual.

Conceitualmente, 1 representa o estado onde o elemento está ocupando somente aquele tile, 0 representa o estado onde ele não está ocupando nada daquele tile e temos também todos os valores intermediários (como ocorre em contas de probabilidade). Entretanto, queremos usar valores discretos, então usamos inteiros simples e usamos seus limites (0 e 255) para representar os limites conceituais (0 e 1).

Um elemento é transferido para o próximo tile, quando, conceitualmente, ele desocupa mais da metade do tile atual. Se mapearmos o comportamento conceitual para o comportamento em código, então haverá um desperdício de bits, pois o valor de filled nunca seria inferior a 127. Assim sendo, o valor 255 continua representando o conceitual 1, mas o valor 0 representa o conceitual 1/2.

E a solução ficou bem legal até, mas eu ainda queria mais. Uma granularidade de 256 valores possíveis parecia um desperdício para mim e eu queria usá-los para mais informações. Foi então que eu decidi separar preenchimento/ocupação/”filled” por dimensão. “dir” se transformou nos atributos “is_up” e “is_left”, enquanto “filled” se transformou nos atributos “y_filled” e “x_filled”. Usando campos de bits, consegui armazenar toda essa informação em um único byte.

Os atributos “is_up” e “is_left” podem lembrar o bit de sinal da representação de inteiros por complemento de 1, que desperdiça um valor possível, porém eu quero preservar a simetria, então esse desperdício é aceitável.

Essa separação por dimensão, entretanto, faz com que o objeto sempre assuma uma direção para cada dimensão. Se antes as opções de direção eram norte, sul, leste e oeste, agora as direções são nordeste, noroeste, sudeste, sudoeste. Essa característica não é um problema, mas é preciso manter ela em mente quando for implementar funcionalidades que dependem da direção do personagem (socos, por exemplo).

Outra consequência da separação é que o jogo volta a apresentar a possibilidade inicial onde um personagem pode assumir uma posição de estar entre quatro tiles. Essa é uma característica positiva, pois impõe menos restrições e dá mais liberdade artística aos autores de mapas. Essa possibilidade também está presente no jogo Bomberman Tournament e eu não quero fazer menos que os competidores.

E, assim, eu fiquei satisfeito, e surgiu o código do BlowThemAll para tratar mapas. É claro que eu não acho que usaria essa solução para um jogo estilo “The Legend of Zelda: A Link to the Past“, mas eu acho que ficou bem adequada a um jogo ao estilo de Bomberman. Pode ser que você ache interessante pesquisar também sobre Quadtree Collision detection.

Programação em tempo real

Caso não fosse um jogo em rede e que possui algumas características que eu não detalhei, eu estaria também mantendo a preocupação de fazer uma solução para programação em tempo real, afinal, é um jogo e queremos previsibilidade nos tempos de respostas máximos. Sem essa preocupação, a única modificação que pensei para melhorar a previsibilidade nos tempos de resposta seria usar a função vector::reserve para pré-alocar um pouco de memória para a lista de elementos em cada tile.

Final

E para acabar o post, deixo um vídeo de alguns segundos demonstrando o resultado:


Arquivado em:computação, pt-BR Tagged: blowthemall, C++, gamedev, games

Game of Codes: A Parody of Game of Thrones

Hilário!!


Serviços gratuitos para Streaming de música

Youzeek

O Youzeek aposta no Youtube como sua fonte interminável de música, a vantagem é que o serviço consegue identificar e organizar tudo por título da faixa, autor e álbum, além disso ele conta com a possibilidade de ver ou não o vídeo, dessa forma é possível fazer o streaming de somente o áudio, tornando seu funcionamento igual ao de qualquer outro serviço de streaming de música.

Como o Youzeek consegue organizar tudo de forma exemplar, você consegue ouvir álbuns inteiros, colocar para tocar as músicas de um único artista, usar o sistema de busca de similares, criar playlists, entre outros. O serviço ainda conta com a possibilidade de executar faixas armazenadas no Google Drive, OneDrive ou Dropbox.

Existe um chat onde é possível não só conversar com quem está online, como amigos que você adicione do Facebook e compartilhar o que está ouvindo.

O Youzeek também tem um aplicativo para Android que traz todas as funções do serviço para seu dispositivo mobile, para assinantes ainda é possível usar o modo offline. Para conhecer sobre o aplicativo e efetuar o download, clique aqui.

Movinx

Esse segue o mesmo estilo do Youzeek, a diferença fica por conta do visual, o Movinx é mais bonito, com uso do preto e verde o layout do mesmo dá uma maior sensação de organização. O serviço também conta com um sistema de chat, mas esse serve apenas para conversar com pessoas que você busque ou amigos e não de forma global.

O sistema de buscas do Movinx funcionou bem para faixas, mas não para artistas, na hora deste o campo de resultados não restringiu-se a mostrar apenas os artistas similares ao que foi buscado, ao invés disso misturou com prováveis faixas e álbuns que correspondessem com o que foi digitado. Em compensação o recurso de rádio funciona com ótima perfomance, bastou clicar em “Rádio” quando estávamos no perfil do artista que buscamos, para que fossemos contemplados com uma excelente playlist com artistas similares.

Na barra inferior o usuário encontrará os controles do player, assim como um ícone do Youtube para abrir o vídeo correspondente, também temos assim como Grooveshark, um botão de “Download” que na verdade redireciona para o Amazon Music ou Itunes. O Movinx não conta com um aplicativo para dispositivo mobile, mas adequa-se a telas menores quando aberto pelo navegador tornando-se um serviço de streaming de música adequado para qualquer momento.

Musicplayr

Este usa não só o Youtube como fonte de conteúdo, mas também o Soundcloud, Videomotion, blogs de áudio e até mesmo conteúdos que foram upados para o serviço. No entanto ele peca agressivamente em sua organização e interface, ao efetuar uma busca no Musicplayr ele tentrega ao usuário uma página de resultados com os links dos conteúdos encontrados, nada de faixas e álbuns organizados, apenas separado por serviço.

Recursos como montar sua playlist e seguir usuários do serviço estão presentes, também temos uma aba que divulga novas faixas e conteúdos, mas não temos a função de rádio como a presente no Movinx.

A barra superior do Musicplayr mantém as funções básicas e informações do que está sendo executado, no entanto, ao contrário dos dois anteriores, o Musicplayr não é capaz de fazer o streaming apenas do áudio quando o conteúdo estiver no Youtube, portanto uma pop up do vídeo será mantida na parte superior.

O Musicplayr possui aplicativo para dispositivo mobile, mas exclusivo ao IOS, o serviço não adequa-se aos navegadores de dispositivos mobiles, tornando inviável seu uso em smartphones de outras plataformas.

Stereomoood

Esse procura diferenciar-se dos demais serviços de streaming e volta-se mais para o recurso de rádio, no entanto com um diferencial, as rádio são montadas conforme o que você está sentindo. Sim o serviço com base em um sentimento, entrega faixas relacionadas.

O usuário pode escolher rádios já prontas e disponibilizadas na tela principal, entre elas temos “Woorking (Trabalho)”, “Melancholy(Melancolia)”, “Winter(Inverno)” e assim por diante, ou simplesmente digitar um sentimento na caixa de busca que já possui a frase pré determinada “I fell..(Eu sinto..)”.

O funcionamento é bem interessante e rápido, basta digitar uma palavra para termos uma playlist pronta e executada imediatamente. Apesar disso o serviço possibilita a busca de faixas e artistas, para isso conta com uma outra barra de busca, mais discreta, ao lado do nome de usuário. Porém o Stereomood é um serviço desenvolvido em cima do Soundcloud, por isso não espere encontrar artistas famosos e os hits do mês, em grande peso as faixas encontradas são de artistas e compositores indies, que disponibilizam seu trabalho no Soundcloud.

O serviço não conta com aplicativos mobiles e nem adequa-se a telas menores, tornando inviável seu uso em smartphones.

FONTE


AVISO DE AUSÊNCIA

Por razões de saúde, o blog terá postagens  mais…lentas, ainda assim, interessantes.

doubleband-aid-plain


Amnésia policial

Após o “massacre de Curitiba”, o governador Beto Rixa afirmou que “não se lembrava das ordens que ele dera ao comando da PM, sobre como deveriam ser “tratados” os professores em greve.

tropa_de_choque_atacam_servidores_2


Citando Adorno

“Barbárie é pensar que nada faço para que o outro morra, mas também nada faço para que ele viva.” Adorno