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.