sexta-feira, setembro 02, 2016

De volta a ativa

E aí, pessoal, tudo bem?

Sim, meu blog está mais abandonado que cachorro de rua, mas vou tentar (novamente) deixá-lo atualizado. Irei começar organizando as ideias que quero discutir futuramente, mas não necessariamente nesta ordem:

  1. Dotnet core (hein?!!);
  2. A evolução do C# - Versão 7 está vindo!!
  3. A linguagem Kotlin e sua próxima versão 1.1 (Muito top!);
  4. A poderosa linguagem F# e sua louca sintaxe;
  5. Do JavaScript para o ES6 e TypeScript 2+ (Não olhe para trás!);
  6. Aurelia Framework;
  7. React;
  8. Moby vs Redux;
  9. Akka;

Nesse semestre, estou ministrando aulas de Computação Gráfica e Sistemas Distribuídos, para Graduação, então devo postar vários tópicos relacionados, até pra ajudar os meus alunos e quem estiver interessado no conteúdo. Mas lembrem-se, este é um blog pessoal, então, não esperem de mim muito formalismo nas postagens. Também estou ministrando aulas na Pós-Graduação, mais precisamente a disciplina de "Desenvolvimento Web para Dispositivos Móveis", logo, teremos tópicos relacionados aqui também; 

Por fim, vou tentar compartilhar com vocês experimentos que eu ando fazendo envolvendo linguagens de programação, ambientes de desenvolvimento, devops, arquitetura de software e de sistemas, minha amada área de desenvolvimento de jogos (I'm back!) e algumas soluções e protótipos meio malucos, mas que poderiam servir pra algo (ou não). Quem sabe não virem projetos de extensão e/ou de iniciação científica...


quinta-feira, julho 12, 2012

Languages, languages and more languages...

After playing a lot with C#, Java, Javascript, CoffeeScript, ActionScript, Groove, C/C++... and a little with Boo, Ruby, Cobra, Objective C, Python and possible another one that I already forget it is time for more languages (I am feeling like a polyglot here hehe):

  • Kotlin
  • Scala
I have to say that besides I work and use Java on my work, my preference is still C#, which is the de facto language for my home projects.

This could change a little in the future, where I will try to put aside the Java and use something more elegant and productive. Enter Scala!! This language is great, statically typed, allows a lot of stuff that I can do in C# and not in Java, and others things that I don't. It's elegant, productive, scalable, but... yeah, there is a but in the story, I don't like the way of how the contruction of the objects is done.

In Scala, I can create a class, define a constructor, but the code of the constructor is mixed with the fields, properties, methods... When working in more complex scenarios, like when working with ScalaFx to create some Controls, the code could easily be hard do understand. (And could be worst if you use the crazy variance of the generic types with inheritance and mixing of traits).

class MySuperButton(label:String) extends Button(label) {

   // fields

   val someVariable:Int = label.hashCode()

   var labelControl:Label = null

   // part of the initialization of the object

   content = List(

      new Label {

         labelControl = this

         text = label

      },

      new Image { ... }

   )

   labelControl.text.onInvalidated = {

      // do something

   }

   // methods

   def someAction() {

   }

}

I think you got the idea! Anyway this is nothing that could make that language a bad choise.

Enter the Kotlin! This programming language is a mix of C#, Java, Scala and Groove. But maybe I am wrong, but this language has a lot of features that mimics the C#. It is a simplified Scala with C# features on it, like properties and automatic properties.

The language is more easy to understand than the Scala because it does not allows you to mix code and structure of code in the same place (which is positive point for me! Programmers, in general, tend to make a mess in the code... I know a lot of people that just write the code, but don't mind how it is looking for another person...). A language should not restrict the programmer, but with a good syntax it could help with the mess that the programmer will do, anyway.

The Kotlin is less powerfull than the Scala language and is a lot more young, but looking at it now and the team that are creating it, I think that it will be a very pleasant language to work soon.

Anyway, for now... Java is being retired for me, at least the language, because the JVM is getting more strong with the new languages coming. :D

segunda-feira, novembro 28, 2011

Playing with Script#

Pesquisando novas tecnologias para o desenvolvimento Web, eu reencontrei o Script# (http://projects.nikhilk.net/ScriptSharp). E como a curiosidade foi grande, resolvi dar uma "brincada" com o projeto.

O Script# é basicamente um compilador para código em C#, algo próximo da especificação do C# 2.0. Então ao invés de gerar bytecode CIL, gera Javascript. E tenho que falar, gostei da maneira como funciona.

Irei postar mais informações e um exemplo em breve.

sexta-feira, fevereiro 25, 2011

Dicas de Inglês

Encontrei o seguinte site (http://www.englishexperts.com.br/category/curso-avancado-gramatica/), por acaso. Esse site trás dicas sobre a escrita correta (grafia) da língua inglesa. Gostei muito do conteúdo, assim como das explicações.

Fica a dica! Aproveitem!

quinta-feira, fevereiro 24, 2011

.NET C++ Wrapper, Mixed Managed C++, C#, Mono, OGRE... e SWIG!

Como parte do meu projeto do mestrado, eu tenho que escolher uma game engine para o desenvolvimento de um protótipo de um framework adaptável de um jogo. Depois de feita algumas análises, eu optei por trabalhar com a OGRE3D, uma excelente engine de renderização 3D, escrita em C++, e completar o resto das funcionalidades com outras bibliotecas.

O projeto é escrito em C# 4, visando o MS .NET Runtime e o Projeto Mono como máquina virtual, e como a biblioteca OGRE3D é escrita em C++, as funcionalidades não podem ser acessadas diretamente, sendo necessária a utilização de um wrapper para a interoperabilidade. Assim sendo, existem duas escolhas a disposição para dar acesso a tais bibliotecas:
  • MOGRE - Um wrapper feito em Mixed Managed C++, com excelente desempenho, e;
  • OGRE.NET - Outro wrapper, que realiza as chamadas através de P/INVOKE, sendo gerado através do SWIG.
Acontece que a MOGRE, apesar de ser uma ótima biblioteca, somente provê suporte para o sistema operacional Windows, justamente por ter sido escrita utilizando código misto. Assemblies em Mixed Managed C++ são basicamente uma mistura de código nativo em C/C++ (x86 ou x86-64) com código gerenciável (managed code ou CIL). Como o código nativo é específico da plataforma que foi compilado, o Mono não consegue executá-lo, pois chamadas a funções do Windows estão presentes somente no Windows (bom isso é uma das limitações).

Uma alternativa seria utilizar compilação condicional, assim como é feito em C++ para portar uma biblioteca para diversas plataformas (a OGRE faz isso!). Ainda, assim, seria necessário que o GCC emitisse CIL e que gerasse um assembly em Mixed Code que fosse suportado pelo Mono, o que não é possível no momento.

O projeto requer que este o seja portável entre várias plataformas, afinal existem várias universidades, cada uma com sua escolha de sistema operacional (Windows, Linux, MacOSX). Sendo assim, a MOGRE passa a ser uma escolha limitada. Desse forma, resta analisar a biblioteca OGRE.NET. 

Por sua vez, a OGRE.NET é um projeto que aparenta estar morto. A última biblioteca criada somente dá suporte a versão 1.4 da OGRE, que já se encontra na versão 1.7.2. Sendo assim, não é interessante utilizá-la.

Se ambas propostas não são aceitáveis ao projeto, só resta criar uma alternativa, criar uma nova biblioteca que faça o trabalho. Tal biblioteca deve ser baseada em P/INVOKE que nada mais é do que um modo de se acessar bibliotecas dinâmicas (.dll, .so, .dylib etc) presentes no sistema operacional, através de chamadas a métodos estáticos externos.

Criar tal wrapper para uma biblioteca como a OGRE é um trabalho extremamente penoso (e como é!!), pois toda a funcionalidade dessa deve ser exposta como chamadas de função em C, imagine então portar todos os métodos de cada classe da OGRE; um grande trabalho, com certeza! Além disso, existem algumas situações onde é necessário manter o polimorfismo entre as classes e não somente criar Proxies (criação de Directors, como definida pelo SWIG).

Uma alternativa para se realizar tal tarefa é utilizar o SWIG, um gerador que pode ler o código em C++ (headers no caso) e gerar os wrappers necessários em C++ e C# automaticamente. E realmente, pra boa parte do trabalho, o SWIG consegue prover bons resultados, gerando um bom código.

Como em tudo existe um porém, o SWIG visa portar a biblioteca para a linguagem de destino (nesse caso, C#), mas não se preocupa muito em como tal biblioteca irá parecer perante os olhos de um programador acostumado a plataforma de destino. Surgem algumas construções estranhas na linguagem final; tipos com nomes estranhos, exposição de funcionalidades que parecem com as providas pelo framework mas que não o são, sendo incompatíveis algumas vezes, como em Listas, Dicionários etc.

Adicionalmente, o SWIG aparenta não suportar a criação de tipos de valor (structs) em C#, tudo é gerado como uma classe (uma das maiores limitações, em minha opinião). Isso provoca um efeito negativo alto no desempenho final da aplicação, que já está prejudicada pela utilização de P/INVOKE. Afinal, cada chamada a um método externo requer de 10 a 30 instruções somente para tal invocação; um constante desperdício de tempo de processamento para cada chamada externa.

Dessa forma, a construção de código manualmente, apesar de ser extremamente trabalhosa, é a melhor alternativa no momento para realizar tal tarefa. Uma possível alternativa, seria gerar com o SWIG o máximo possível de funcionalidades e deixar somente as mais problemáticas sendo realizadas manualmente. Mas o código do SWIG nem sempre é compatível com tal situação, ainda assim é um teste que irei realizar.

quinta-feira, dezembro 09, 2010

Férias chegando?!

Dificilmente... tenho que terminar a minha dissertação até Fevereiro maio (consegui a prorrogação!!)... sendo assim, é botar fogo nos dedos enquanto digitando heheh...

Área de pesquisa: Sistemas de Informação
Subárea: Jogos
Tema: Jogos na educação
Título: Um framework para construção de jogos educacionais.




Square, EA, GameLoft vamos trabalhar juntos?! heheh ;)

Aulas de multimídia

E as aulas acabaram... agradeço aos alunos que participaram até o final pela oportunidade.

Ainda assim,  como sempre acontece, pessoas levaram na brincadeira ou privilegiaram outras disciplinas pelo fato de ser um "aluno" ou "amigo" que estava dando as aulas... bom, o negócio não acabou muito bem pra esses.

Ao final, somente 10 pessoas tiverem notas, pois entregaram os trabalhos. Engraçado que depois do prazo final, entrega de notas, sempre tem alguém correndo atrás do prejuízo. Várias chances foram dadas, agora acho que já não posso fazer muita coisa ;)