Category Archives: programação

Day Against DRM

PacktDayAgainstDRM2014Recebi outra promoção da editora Packt, dessa vez relacionada com o #DayAgainstDRM. No dia 6 de maio (Dia Internacional Contra DRM), ela estará vendendo os e-books e vídeos por USD10.

Engraçado é o banner dizendo “Download, Keep, Share” (acho que pagar realmente vale só para uma minoria aqui no Brasil, enquanto a maioria prefere fazer exatamente o que o banner diz, não?)

Segue press release em inglês.

Packt celebrates International Day Against DRM, May 6th 2014

According to the definition of DRM on Wikipedia, Digital Rights Management (DRM) is a class of technologies that are used by hardware manufacturers, publishers, copyright holders, and individuals with the intent to control the use of digital content and devices after sale.

However, Packt Publishing firmly believes that you should be able to read and interact with your content when you want, where you want, and how you want – to that end they have been advocates of DRM-free content since their very first eBook was published back in 2004.

To show their continuing support for Day Against DRM, Packt Publishing is offering all its DRM-free content at $10 for 24 hours only on May 6th – that’s all 2000+ eBooks and Videos. Check it out at: http://bit.ly/1q6bpha.

Be Sociable, Share!

Promoção da Packt (2000th book)

Packt2000thBookEsses dias recebi outro press release da editora Packt, com uma promoção “compre um (e-book) e leve outro” em comemoração ao lançamento de número 2000 (!).

Segue press release (em inglês).

Packt Publishing celebrates their 2000th title with an exclusive offer – We’ve got IT covered!

Known for their extensive range of pragmatic IT ebooks, Packt Publishing are celebrating their 2000th book title `Learning Dart’– they want their customers to celebrate too.

To mark this milestone Packt Publishing will launch a ‘Buy One Get One Free’ offer across all eBooks on March 18th – for a limited period only.

Packt is one of the most prolific and fast-growing tech book publishers in the world. Originally focused on open source software, Packt contributes back into the community paying a royalty on relevant books directly to open source projects. These projects have received over $400,000 as part of Packt’s Open Source Royalty Scheme to date.

Their books focus on practicality, recognising that readers are ultimately concerned with getting the job done. Packt’s digitally-focused business model allows them to quickly publish up-to-date books in very specific areas across a range of key categories – web development, game development, big data, application development, and more. Their commitment to providing a comprehensive range of titles has seen Packt publish 1054% more titles in 2013 than in 2006.

Here are some of the best titles across Packt’s main categories – but Buy One, Get One Free will apply across all 2000 titles:
Web Development
Big Data & Cloud
Game Development
App Development

Be Sociable, Share!

Here is a Selfie C++ class example.

AKA Singleton (because “Selfie is so 2013″, people are saying).

// Ego.h
class Ego
{
public:
  static Ego *Selfie();

  uint32_t GetLikes() const { return mLikes; }
  void Like() { ++mLikes; }

private:
  uint32_t mLikes;

  Ego() : mLikes(0) { }
  Ego(const Ego&);
  Ego& operator=(const Ego&);
  ~Ego() { }
};

// Ego.cpp
Ego *Ego::Selfie()
{
  static Ego selfie;
  return &selfie;
}

// anywhere_you_go.cpp
#include "Ego.h"
Ego::Selfie()->Like();
Be Sociable, Share!

Windows Media Player, WM_MOUSEMOVE e seu aplicativo

Hoje me deparei com um comportamento estranho num projeto Windows nativo: no começo não tinha percebido, mas o aplicativo estava processando o movimento do mouse constantemente (cerca de 1,5 vezes por segundo). Na Win32 API, isso significa que o loop do aplicativo estava obtendo (do sistema) e despachando a mensagem WM_MOUSEMOVE, que passaria pela WindowProc do aplicativo. O pior é que o mouse estava parado e as coordenadas do mouse sempre vinham iguais.

Verifiquei se o mouse estava com problema e também desconectei dispositivos USB da máquina. Nada. Verifiquei se poderia ser bug introduzido no código depois de algumas alterações recentes e certifiquei que o loop do aplicativo estava correto. Aparentemente, o código estava OK.

Resolvi ver quais aplicativos e serviços estavam rodando no sistema e fui encerrando um por um. Estava ouvindo música no Windows Media Player e, assim que fechei o Media Player, meu aplicativo parou de processar o WM_MOUSEMOVE. Hum, quem diria.

Já percebeu que quando o Windows Media Player está tocando algum arquivo de mídia, o screensaver nunca é executado? Porém, quando o Media Player está aberto mas não está tocando nada, o screensaver chega a ser executado. Aí está a explicação tanto do comportamento do Windows Media Player vs Screensaver como do “bug” do meu aplicativo: o Media Player fica gerando a mensagem WM_MOUSEMOVE a todo momento (simulando que o mouse se movimentou), enquanto algum arquivo de mídia estiver sendo executado.

Fica a dica caso o seu aplicativo/jogo realize muito processamento em resposta ao movimento do mouse ou tenha alguma operação que dependa do movimento do mouse. Dependendo do quão crítico esse tipo de interferência seja para o seu projeto, é melhor responder ao movimento do mouse somente quando o mesmo se deslocar acima de um threshold.

Esse comportamento também é interessante para evitar que o screensaver seja ativado no meio de uma partida do seu jogo, por exemplo. Entretanto, não recomendo essa abordagem, principalmente para mobile, pois isso consumirá mais bateria do aparelho (acho melhor lidar com as interrupções do aparelho e com o ciclo de vida do aplicativo).

PS: antes que alguém me diga para usar outro aplicativo como Winamp ou VLC, vale lembrar que os seus usuários podem estar usando o Windows Media Player junto com seu aplicativo/jogo ou mesmo ter outros aplicativos que interferem de maneira similar ao comentado aqui.

Be Sociable, Share!

Análise de livro: Instant HTML5 2D Platformer (Packt Publishing)

BookInstantHTML5PlatformerEsse é o primeiro livro da série “[Instant]” da Packt que leio (existem vários livros da mesma série) e de cara você percebe que o livro consiste de uma série de “receitas” sequenciais (não sei se outros títulos da série possuem a mesma estrutura).

O livro foca em desenvolver de maneira progressiva um framework HTML5/JavaScript para jogos 2D, usando um jogo de plataforma como exemplo. Discute o básico como elemento canvas, sprite e animação, input, parallax, física (colisão e pulo), inimigos e objetos, áudio e GUI. Cada receita é composta de duas seções: “How to do it” e “How it works”. A primeira seção possui uma abordagem passo-a-passo para implementar um determinado tópico, com código, enquanto a segunda seção explica um pouco mais sobre o código previamente apresentado.

Conforme mencionado no livro, o autor assume que o leitor já possua conhecimento em HTML e JavaScript (básico para intermediário) e foca apenas no código apresentado no livro. Apesar de não explicar as tecnologias, acredito que o texto e código sejam fáceis para entender e acompanhar, assim como portar o código para outra tecnologia, se você quiser.

Minha opinião sobre o livro é dividida; isto é, ele cobre vários aspectos para começar a desenvolver um jogo 2D, mas não vai além do básico: a seção “How it works” explica o código e inclui pouca teoria; não há nenhuma explicação detalhada sobre o tópico e nem são mencionados eventuais problemas que o leitor pode encontrar. Exemplos: como tocar uma música de fundo em loop? Todos os navegadores suportam áudio? Em um jogo de plataforma (gênero do livro), como lidar com plataformas flutuantes ao invés de definir o jogador numa posição fixa no eixo Y? O jogo em HTML5 roda igual no desktop e em smartphones?

Poderiam existir duas seções adicionais, “There’s more” (mais detalhes teóricos e de implementação) e “See also” (referências para aprofundar os estudos ou mesmo libs JS que poderiam ajudar o desenvolvimento), que já vi em outros livros da mesma editora.

Gostei que o código-fonte aplica orientação a objetos e possui gerenciadores (ObjectManager e AnimationManager). Realmente oferece um ponto de partida para um framework de jogos, apesar de existirem alguns bugs, como uso de frameWidth e frameHeight ao invés de texture.width/.height no AnimationManager.BoundingBox (depois que enviei uma errata pelo site, o autor corrigiu essa parte).

Esse é um bom livro se você é novo em desenvolvimento de jogos e quer começar a desenvolver em HTML5/JS, mas tenha em mente que, por causa da abordagem “short, fast, focused guide” (conforme mencionado no site do livro), você terá que procurar por informações detalhadas em outro lugar.

Link para a página do livro no site da editora.

Be Sociable, Share!

Promoção de fim de ano da Packt (e-books por USD5)

PacktUSD5BonanzaRecebi um press release da editora Packt, que publica e-books e livros impressos sobre diversos assuntos de computação (incluindo desenvolvimento de jogos), informando sobre uma promoção de fim de ano chamada “eBook Bonanza”: de 19/12/2013 até 03/01/2014, qualquer e-book ou vídeo-aula da editora por apenas USD5.

Vi que há vários livros sobre diferentes tecnologias para jogos, como: AndEngine (engine de Android), Cocos2d-X, CryEngine, HTML5, SFML, SDL, UDK, Unity, XNA, entre outros. Para Unity tem vários, inclusive vídeo-aula. Para artistas, há vários livros de Blender, incluindo um escrito pelo brasileiro Allan Brito (Blender 3D Architecture, Buildings, and Scenery). Achei um de ZBrush, um de Mudbox e um de modo também.

Eu, em particular, gosto dos livros de OpenGL (inclusive notei que pre-order também estão na promoção, tem um sobre GLSL lá).

Segue press release (em inglês) com link para mais informações:

Packt’s $5 eBook Bonanza is back!
Following on from the success of last year’s festive offer, the publisher will be celebrating the holiday season with an even bigger $5 Bonanza.

From December 19th, customers will be able to get any eBook or Video from Packt for just $5. This sale covers every title in the 1700+ range and customers can grab as many as they like until January 3rd 2014 – more information is available at http://bit.ly/1jdCr2W

Be Sociable, Share!

Os 10 mandamentos do rei da biblioteca (de programação)

Nesses últimos dias muita gente comentou sobre o rei do camarote. Eu assisti o vídeo e… bom… Mas o que isso tem a ver com qualquer coisa desse blog?

Duas frases chamaram a minha atenção, acho que pela quantidade de piadas que apareceram na minha timeline do Facebook: “Isso agrega a tudo” e “Comprar um Boing e colocar um piloto de teco-teco para pilotar”. E como esses tempos eu escrevi review de alguns livros e amigos me pediram indicações de livros de programação, acho que as coisas se misturaram um pouco… e então, sei lá exatamente por qual motivo (acho que o vídeo acabou afetando meu cérebro), resolvi fazer uma versão focada em livros, criando:

“Os 10 mandamentos do rei da biblioteca (de programação)”


10m-Book#1 Livros
Você tem que estudar os melhores livros das melhores editoras, que são: AK Peters/CRC Press, Morgan Kaufmann, Addison Wesley, O’Reilly, Packt Publishing, The Pragmatic Bookshelf


10m-Polishop#2 Poltrona
Você tem que ter uma poltrona, uma poltrona confortável. E a poltrona massageadora que vende na Polishop é um mito né, um sonho de consumo de qualquer pessoa, que chama atenção, que toda mulher gosta.


10m-PersonalLibrary#3 Biblioteca pessoal
Quando você está na biblioteca pública ou da faculdade, você é mais um. Todo mundo quer ter sua biblioteca pessoal, é uma questão de “statis”, algo que todo leitor quer. Pode variar desde empilhar algumas caixas de feira e colocar seus livros lá dentro até ao infinito… e além, como alguns exemplos desse site aqui.


10m-YouveGotMail#4 Serviços exclusivos: Amazon e pequenas livrarias (contraditório…)
Na Amazon você cria sua própria wishlist, tem descontos exclusivos e até algoritmos que geram recomendações baseadas nas suas compras e itens vistos, assim como em pequenas livrarias que você tem atendimento mais humano e dependendo pode até se tornar amigo(a) do(a) dono(a).


10m-Tirinhas-DoisIdiotas#5 Integridade física: sua e dos livros
Ao ler um livro, é bom estar confortável em uma poltrona e estar num ambiente bem iluminado, pra manter sua integridade física. Sobre os seus livros, infelizmente, algumas pessoas acabam – por bobeira, acidente ou inveja – não cuidando dos livros que você emprestou, dos seus bens.


10m-Tea#6 Café ou chá
Vou ser muito sincero, eu gosto mais de tomar vodka, mas café e chá caem bem melhor pra uma leitura. E tem toda uma preparação com o coador, o pó, o aroma, colocar no fogo…


10m-Knuth#7 Clássicos
Outra coisa importante é você ter livros clássicos (The Art of Computer Programming, The Mythical Man-Month, Effective C++, …), de autores famosos (Knuth, GoF, Cormen, Stroustrup, Meyers, …), na sua biblioteca pessoal, isso com certeza agrega a tudo, aos seus estudos, sua formação, tudo.


10m-Estudar#8 Estudos
Não faz sentido você ter tudo aquilo ali e não estudar nem praticar. É como você licenciar uma game engine C++ e colocar um “programador HTML5″ pra programar.


Uma coisa que acho que é pesada pra falar: Eu já li bastante.

100m-Banheiro



10m-MarshallAmp#9 Música
As músicas que gosto de ouvir quando estou lendo um livro são: … Muitas vezes é difícil se concentrar na leitura ouvindo música =P.


10m-Kindle#10 Kindle
Quem tem biblioteca pessoal, tem que ter um Kindle. Se você não tem um Kindle, não é legal, você tem que ter, tem que ler, colocar seus mobi’s, livros…


Quem não queria sentar numa poltrona confortável, ler bem, estar numa biblioteca cheia de conhecimento, bebendo um chá ou cafezinho…?

Imagens:
Pessoal (#1, #3, #6, #9)
http://www.pronz.com.br (#5, #8)
http://www.polishop.com.br/14313_poltrona-massageadora-luxury/p (#2)
http://nomorepopcorn.wordpress.com/2011/01/19/shot-for-shot-the-shop-around-the-corneryouve-got-mail/ (#4)
http://www.computerhistory.org/fellowawards/hall/bios/Donald,Knuth/ (#7)
http://www.amazon.com.br/gp/feature.html?docId=1000841461&ie=UTF8 (#10)
http://reidocamarote.tumblr.com/ (gif)

Be Sociable, Share!

Análise de livro: Getting Started with C++ Audio Programming for Game Development (Packt Publishing)

BookCppAudioProgramming

Esse é um livro introdutório para desenvolvedores C++ (intermediário) que querem iniciar em programação de áudio, mais especificamente usando FMOD. O autor começa apresentando no primeiro capítulo alguns conceitos universais de áudio, como volume, pitch, frequência, bit depth e formatos de arquivos de áudio. Em seguida, introduz o FMOD e explica como adiciona-lo a um projeto (Visual Studio C++), como iniciar o FMOD, carregar e reproduzir áudio e verificar erros. Após essa introdução do FMOD, há um projeto para criar um simples gerenciador de áudio através de uma classe C++. No capítulo 3, o autor expande o gerenciador para incluir controle de áudio, isto é, playback, controle de volume, pitch, panning, agrupamento de canais.

Com o básico de áudio explicado, o autor parte para áudio 3D e como trabalhar com áudio posicional, reverb e efeitos no FMOD. Ao trabalhar com áudio posicional, o desenvolvedor precisa lidar com oclusão e obstáculos que afetam a maneira como o áudio é percebido pelo jogador. Este é um tópico que poderia ser explorado com mais detalhes pelo autor, pois ele comenta sobre o assunto em apenas duas páginas. O mesmo vale para efeitos via DSP (processamento de sinais digitais), que é comentado nas 3 últimas páginas do mesmo capítulo de áudio 3D.

A ferramenta FMOD Designer também é apresentada. É uma ótima ferramenta da Firelight Technologies (desenvolvedora do FMOD) para aqueles que são mais focados em design. O autor explica como criar eventos simples de som (como efeitos de passos e vidro quebrando), evento multi-trilha (passos interativos, motor de carro) e música interativa, além de como chamar os eventos via código. Para projetos maiores ou que precisam de algo além do controle básico de áudio, essa ferramenta é obrigatória (ou ao menos valerá muito a pena usa-la).

O último capítulo envolve programação de áudio em baixo nível, isto é, como trabalhar com os bytes de um arquivo de som digital – carregar, tocar, alterar propriedades, etc. Embora FMOD ainda seja usado para o controle de áudio, o leitor tem uma visão “por trás dos panos” sobre APIs de áudio de alto nível.

Com ~100 páginas, esse é um bom livro introdutório para desenvolvedores que não estão familiarizados com programação de áudio, principalmente porque não há muitos livros sobre o assunto (há alguns que focam em programação DirectSound/XACT, mas essas tecnologias parecem estar mortas -ou estão morrendo- e são apenas para plataforma Microsoft). É um livro de C++, mas desenvolvedores de outras linguagens (como C#) também podem se beneficiar do conteúdo, uma vez que o FMOD suporta outras linguagens. A decisão do autor em usar o FMOD é boa também: é uma tecnologia multiplataforma, suporta vários formatos de áudio e é adotado em vários jogos de sucesso, por empresas e game engines (como Unity e UE3). Eu já trabalhei em um jogo multiplataforma usando FMOD para áudio e os resultados foram muito bons.

Para iniciar com programação de áudio, acho que o conteúdo e tamanho do livro estão OK, embora o autor poderia se aprofundar mais em áudio 3D e efeitos via DSP (e incluir código de áudio 3D na classe gerenciadora de áudio; o código-fonte só está disponível para os capítulos 2, 3 e 6).

Vale a pena mencionar que o FMOD Studio não é discutido no livro e, para qualquer tarefa não relacionada a áudio (gerenciamento de janela, render e input), o autor usa o SFML (Simple and Fast Multimedia Library).

Gostaria de ver outro livro do autor/editora com assuntos mais avançados de programação de áudio, como mais detalhes sobre como trabalhar com áudio 3D (e suas implicações), efeitos DSP em tempo real, áudio dinâmico e performance. Seria bom também ver um projeto que inclui FMOD Designer (ou FMOD Studio) e código, não apenas exemplos no livro.

Be Sociable, Share!

Análise de livro: Windows Phone 8 Game Development (Packt Publishing)

No meu antigo blog, vez e outra fazia breves análises sobre livros de desenvolvimento de jogos e artbooks. Nesse novo blog, não cheguei a fazer nenhuma análise – até agora. Eu até poderia escrever sobre algum livro que tenho ou que comprei recentemente, mas… Bom, há alguns dias atrás, surgiu a oportunidade de eu escrever um review, pois a editora Packt Publishing me enviou a versão digital do Windows Phone 8 Game Development (Marcin Jamro) para avaliar. Espero que com essa análise, eu volte a escrever mais sobre livros.

BookWindowsPhone8GameDevelopment

Conforme a descrição do livro, este é um guia prático para desenvolvimento de jogos para Windows Phone 8. Diferente de alguns livros que apresenta um “Hello, World!” para cada tópico apresentado, o autor escolheu desenvolver o projeto de um jogo completo (apresentado no primeiro capítulo), que é incrementado a cada capítulo.

O autor mostra uma visão geral da plataforma Windows Phone 8, do ciclo de vida dos aplicativos, assim como das diferentes maneiras de desenvolver (managed, nativa e híbrida). A abordagem híbrida, usada no livro, me chamou a atenção, pois como desenvolvedor cross-platform acostumado com C++ (ou mesmo C#/XNA), acho interessante ter uma maneira mais fácil/rápida de criar a UI ao mesmo tempo em que é possível desenvolver nativo para performance e processamento mais pesado.

Nesse sentido, o livro usa um misto de C#, C++, C++/CX, XAML e Direct3D, algo que achei meio incomum. C# e XAML para UI, C++/CX e Direct3D para o core do jogo, com uma classe Direct3DInterop fazendo a comunicação entre código nativo e gerenciado.

A abordagem passo-a-passo é boa para iniciantes e há algumas dicas que podem economizar tempo de desenvolvedores com mais experiência (mesmo avançados que vêm de outras plataformas). Há um capítulo sobre o padrão de projeto MVVM (model-view-view model), aplicado ao jogo, e o último capítulo lida com a parte de publicação.

Sobre tópicos atuais, o livro trabalha com localização, mapas, geolocalização, web services e redes sociais (usando API’s do Facebook e Twitter). O jogo desenvolvido no livro também implementa leitor de RSS. Duas features que gostaria de ver rodando em aparelhos reais são realidade aumentada e reconhecimento de voz, pois pareceram ser fáceis de implementar.

Há duas coisas que poderiam ter no livro:
- Algumas features são implementadas só com código gerenciado: o autor poderia explicar brevemente como implementar nativamente ou dar direções (apesar que há alguns links no apêndice), ou mesmo implementar a versão nativa e disponibilizar no código-fonte do livro;
- Apesar de ser um livro de Windows Phone 8, poderia ter alguma discussão (ou comparação) sobre como cada feature do aparelho/SO está relacionado com os concorrentes (iOS e Android), pois atualmente é muito comum o lançamento de apps e jogos em diferentes SO’s e stores.

No geral, o livro cumpre o que promete e recomendaria para qualquer um que tem interesse em aprender a desenvolver jogos para Windows Phone 8.

Be Sociable, Share!

Quando alocação de memória falha (C++)

Talvez por costume com linguagem C e trabalhar com legacy code (alocando com malloc), já vi (e também fiz) isso em alguns projetos:

#include <iostream>

int main(int argc, char *argv[])
{
  const int MB = 1048576;

  char *mem = new char[2047 * MB];

  if (mem)
  {
    std::cout << "Almost 2GB of memory successfully allocated!" << std::endl;
    delete[] mem;
  }
  else
  {
    std::cout << "Bad allocation!" << std::endl;
  }
}

Verificar se a variável mem é válida após alocar memória é algo correto a se fazer, não? Quase. No código C++ acima, o else nunca será executado: quando os quase 2GB alocados acima são realmente alocados, o if é executado. Mas quando não é possível alocar a memória, o que ocorre é uma exceção (std::bad_alloc) e o else não é executado.

Poderia reescrever com um try-catch:

#include <iostream>

int main(int argc, char *argv[])
{
  const int MB = 1048576;

  try
  {
    char *mem = new char[2047 * MB];

    if (mem)
    {
      std::cout << "Almost 2GB of memory successfully allocated!" << std::endl;
      delete[] mem;
    }
  }
  catch(const std::bad_alloc &exception)
  {
    std::cerr << "Exception: " << exception.what() << std::endl;
    return 666;
  }
}

Ou então poderia alocar usando new(std::nothrow), que retorna um ponteiro null quando não é possível alocar memória:

#include <iostream>

int main(int argc, char *argv[])
{
  const int MB = 1048576;

  char *mem = new(std::nothrow) char[2047 * MB];
  
  if (mem)
  {
    std::cout << "Almost 2GB of memory successfully allocated!" << std::endl;
    delete[] mem;
  }
  else
  {
    std::cout << "Bad allocation!" << std::endl;
    return 666;
  }
}
Be Sociable, Share!