Mas como posso resolver esse problema? Novamente, vamos requisitar na linha de comando do Windows. Vejo o código abaixo:
Blog onde registro todas as minhas pesquisas e compartilhando as mesmas para quem esteja interessado.
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.
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.
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.
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.
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.
Assinar:
Postagens (Atom)