segunda-feira, 26 de dezembro de 2016

Gamemaker: Guia Rápido de termos ao usar a engine física e o que influencia

Bem, vamos deixar simples para quem já sabe mexer na engine física, mas vive esquecendo os termos.

  • Density (densidade): Define a massa de um objeto. Um círculo de 10 pixel de raio com uma densidade alta vai ter mais massa do que um círculo do mesmo tamanho. Assim como dois círculos de tamanho diferentes, mas com a mesma densidade, o maior vai ter mais massa do que o menor. E quanto mais massa, mais difícil é aplicar alguma aceleração, seja para aumentar a velocidade, seja para frear a velocidade;
  • Restitution (Restituição): Define o quanto de energia é perdido em uma colisão. Para os leigos, pense na capacidade da bola "quicar". Um valor baixo de restituição, a bola quica baixo, sendo que no caso do 0, ela nem quica. No valor 1, indica que não há perda de energia, ou seja, a bola vai quicar na mesma altura na qual ela foi solta. Valores acima de 1, a bola vai ganhar energia, ou seja, é como se ela ganhasse um impulso quando colidiu com outra coisa;
  • Collision Group (Grupo de colisão): Usado para agrupar os elementos que podem colidir entre si. O Grupo 0, a colisão ocorrerá somente se houver um evento especificando a colisão. Se um grupo é positivo, todos que tiver o mesmo grupo colidirão entre si, mesmo não havendo especificação. Se o grupo é negativo, o elemento nunca colidirá, mesmo havendo evento especificando a colisão;
  • Linear Damping (Amortecimento Linear): Ok, amortecimento não é a melhor tradução, mas também não encontrei melhor. Seria algo como o atrito no chão: pense que um cubo de gelo vai deslizando numa superfície: conforme vai movendo, vai perdendo a velocidade. Essa taxa é o Linear damping;
  • Angular Damping (Amortecimento Angular): O mesmo para o linear, só que para objetos que giram. Uma manivela pode ser girado rapidamente e continuar girando quando solta, mas com o tempo, ela para de girar;
  • Friction (Atrito): É a perda de momento causada pela colisão. Quanto mais alto o valor, mais perda de energia ocorre. 

terça-feira, 20 de dezembro de 2016

segunda-feira, 19 de dezembro de 2016

Java: Valores Máximos e Mínimos de um JSpinner

Estava trabalhando com Spinner e precisava limitar o valor mínimo e máximo. Entretanto o Spinner é uma interface genérica e possui alguns tipos específicos de Spinner. Vou mostrar como é possível definir.

sexta-feira, 16 de dezembro de 2016

Java: JProgressBar - Mostrando Porcentagem

Algo mais simples, mas que pode ser bom para consultar: vamos ver como mostrar a porcentagem do ProgressBar. Para isso é algo bem simples: ative a propriedade stringPainted.

seuJProgressBar.stringPainted(true);

E o interessante é que nem precisa definir string ou nada, pois por padrão já mostra a porcentagem.

quinta-feira, 15 de dezembro de 2016

Java: Validar URL (Gambiarra? Ou não?)

Um dos desafios no Java que encontrei foi a de validar URL. Ok, antes que fale "use a biblioteca do Apache", no meu caso, era um que não era viável, precisava ser Java puro, sem bibliotecas externas. Entretanto, validar a URL, como disse, não é fácil. Um bom validador de URL tem um RegExp enorme se for seguir as normas, e os RegExp mais simples, acabam rejeitando muitas URL válidas (a maioria se esquece que nem todos os sites são .com, .net ou .org, mas que também existe o .co, entre outras).

quarta-feira, 14 de dezembro de 2016

Java: Verificando se o Sistema Operacional é 32 ou 64 bits no Windows

Outro caso que se assemelha ao anterior é verificar se o sistema operacional é 32 ou 64 bits. O Java possui um comando que é o "System.getProperty("os.arch")", mas existe um problema nele: ele verifica se a máquina virtual é 32 ou 64bits, mas não o sistema em si. O que isso significa? Significa que eu posso ter um sistema 64 bits rodando um JVM de 32 bits, e nesse caso, o comando vai retornar 32 bits.
Mas como posso resolver esse problema? Novamente, vamos requisitar na linha de comando do Windows. Vejo o código abaixo:

terça-feira, 13 de dezembro de 2016

Java: Verificando se o programa tem acesso de administrador no Windows

Precisando programar um automatizador para instalar um certo programa, eu preciso certificar que o usuário está rodando o instalador com acesso privilegiado, rodar como administrador. O problema é que muitas informações do JAVA não está 100% correto. Ele te dá informações sobre a máquina virtual, mas não do sistema em si, e são poucas informações reais que te ele te dá. Uma delas é o que acabei de dizer, se o programa está rodando com privilégios de administrador: eu posso ver se um usuário é administrador, mas não se o programa tem tal privilégio. Para resolver o problema, achei várias abordagens, a maioria consistia em criar arquivos em pasta que exige privilégio e sabemos, que manipulação de arquivo não é algo que ajuda o desempenho, mas consegui achar o código abaixo que tem uma abordagem bem mais interessante:

01. public boolean isRunningAsAdmin()throws IOException{
02.    ProcessBuilder builder = new ProcessBuilder("cmd.exe",
              "/c",
              "whoami /groups | find \"12288\" && echo ELEVATED");
03.    builder.redirectErrorStream(true);
04.    Process p = builder.start();
05.    InputStream is =  p.getInputStream();
06.    BufferedReader br = null;
07.    StringBuilder sb = new StringBuilder();
08.    String line;
09.    try {
10.       br = new BufferedReader(new InputStreamReader(is));
11.       while ((line = br.readLine()) != null) {
12.          sb.append(line);
13.       }
14.    } finally {
15.       if (br != null) {
16.          br.close();
17.       }
18.    }

19.    String result = sb.toString();
20.    return result.contains("ELEVATED");
21. }
               
Aqui nós usamos a classe ProcessBuilder para chamar o "cmd.exe" com os parâmetros "/c", que é para terminar após executar e aí vem o parâmetro chave para verificarmos: "whoami /groups | find "12288" && echo ELEVATED", vamos por parte:  o comando "whoami" ser para verificar informações sobre o próprio usuário, e o "/groups" serve para ver as informações dos grupos de usuários. Com o resultado, vamos encontrar (find) um código: 12288, esse código só aparece no comando se você tiver executando como administrador. Então o restante do parâmetro, estamos só personalizando a mensagem de confirmação.
O restante do código se resume em executar a ação (linha 04), ler a resposta do programa (linha 09 até 20) e verificar se a resposta é o que definimos na linha 02.


quarta-feira, 7 de dezembro de 2016

.NET: Configurando o Microsoft Speech

Esses dias precisei utilizar o Microsoft Speech para usar o sintetizador de voz: a tarefa é simples: o programa precisava ler em voz alta uma mensagem. Então, vamos ver o que precisa para executar esta tarefa.

terça-feira, 6 de dezembro de 2016

C#: Invocar Métodos Asíncronos sem estar dentro de um async

Pesquisando sobre como usar o Microsoft Speech, um framework para sintetizador de voz e comando de voz, aconteceu de que não conseguia uma instância da engine porque o construtor era um método assíncrono, e por eu não estar invocando dentro de um método assíncrono, ocorria uma Exception.

sexta-feira, 25 de novembro de 2016

Javascript: Substituir todas ocorrências de uma expressão numa string

Para substituir todas as ocorrências de uma expressão dentro de uma string, você pode utilizar a função replace da seguinte forma:

var str = "Gato rato gato rato gato rato gato rato";
str.replace(/gato/g, "rato");

No exemplo acima, usamos uma expressão regular para reconhecer a palavra gato, e o "g" após o fechamento da "/" vai indicar que vai ser aplicado todas as palavras "gato". Entretanto, a expressão é case-sensitive, portanto não irá se aplicar a palavra "Gato", por causa do caractere "G" ser maiúsculo. Se quiser ser indiferente para maiúsculo ou minusculo, use o exemplo abaixo:

str.replace(/gato/gi, "rato");

Aí vai pegar todas as palavras "gato" indiferente da letra ser maiúscula ou minúscula.

sexta-feira, 18 de novembro de 2016

C# - Entity Framework: System.TypeLoadException

Estava eu precisando fazer o deploy de um site num servidor e eis que o site veio com este erro: "System.TypeLoadException: Could not load type 'System.Data.Entity.Infrastructure.TableExistenceChecker'".

Foi difícil entender o que aconteceu, mas esse é um erro que ocorre muito comum quando se usa a Entity Framework de diversas versões. No meu caso, aconteceu que o framework instalado no servidor era de uma versão diferente das que eram usados no projeto, e isso causava este erro.

quinta-feira, 10 de novembro de 2016

MySQL: Limite dos 838:59:59 nas Operações de Tempo

Um caso que aconteceu é que eu precisava fazer uma operação em que precisava ver a duração de tempo entre dois tempos, e não pensei duas vezes em usar a função TIMESTAMPDIFF() no MySQL. Só que percebi que algumas linhas me apresentava este valor específico: 838:59:59. Achei muita coincidência ter várias linhas com a mesma duração e descobri o que temia: a função tem esse limite de quase 35 dias. 

terça-feira, 25 de outubro de 2016

MySQL: Introdução aos Stored Procedure

Stored Procedure são procedimentos/rotinas que são pré-compilados e podem ser usado para manipulação de dados e que podem retornar ou não algum valor. Pense como se fosse uma função/método de alguma linguagem de programação, mas neste caso, seria para o banco de dados. No caso do MySQL, o Stored Procedure está disponível desde a sua versão 5.0.


segunda-feira, 24 de outubro de 2016

JQuery + ASP.NET: Chamando um WebMethod usando JQuery.ajax

Hoje vamos ver uma coisa simples, mas que pode confundir alguns desprevinidos ao tentar usá-lo: chamar um WebMethod com Ajax. Um WebMehtod é um método que é disponibilizado como um XML Web Service (mas que não necessáriamente retorna um XML) e é muito utilizado no ASP.Net para fazer requisições no banco de dados, entre outros tipos de requisições sem ter que recarregar a página totalmente.


terça-feira, 18 de outubro de 2016

Javascript: Transformando em String um Objeto

Por questões de debug, as vezes você deseja visualizar o conteúdo de um objeto, seja num Alert ou alguma inserção num quadro de mensagem. Para fazer isso, você pode usar o método stringify do JSON. 

JSON.stringify(varObjeto);