segunda-feira, 31 de março de 2014

Criar link do Android SDK (Eclipse - Android Studio)

Crie um link simbólico entre o diretório do SDK do Android do Eclipse e o diretório do Android Studio.

$ cd /Applications/Android\ Studio.app/ $ ln -s /Users/{usuario}/Dev/Android/SDK sdk
Simples assim =)

Exibir/ocultar arquivos ocultos no Mac

No terminal use os seguintes comandos:
Exibir:
$ defaults write com.apple.finder AppleShowAllFiles -bool true
$ KillAll Finder
 
Ocultar:
$ defaults write com.apple.finder AppleShowAllFiles -bool false
$ KillAll Finder


Simple!

Como abrir mais de uma instância do Eclipse (OSX) ?

Quando eu preciso trabalhar com mais de um workspace no Eclipse, é interessante conseguir abrir mais de uma instância dele. No Mac OSX é bem fácil...
Basta fazer o seguinte...
  1. Click no menu Help > Eclipse Marketplace
  2. Pesquise por "OS X Eclipse laucher utility"
  3. Instale o plugin
  4. Reinicie o Eclipse
Pronto... agora basta ir em File > Open Workspace para poder abrir mais de uma instância! =)
E no "ALT+TAB" ele mostra um label vermelho com o nome do Workspace.

Erro ao fazer deploy no Google App Engine

Hoje estava tentando publicar um atualização serviço do aplicativo Mídia Palestrina, mas tive alguns problemas de comunicação com o Google App Engine. Depois de tanto insistir, consegui iniciar o deploy... Porém, chegou em 86% e travou. Fui forçado a parar e recomeçar, tendo que dar um force close no Eclipse.
Quando tentei novamente o deploy, recebi o erro:
Unable to update app: Error posting to URL:
https://appengine.google.com/api/appversion/create?app_id=appname&version=1&
409 Conflict
Another transaction by user userid is already in progress for app: s~appname, version: 1.
That user can undo the transaction with "appcfg rollback".
See the deployment console for more details
Unable to update app: Error posting to URL:
https://appengine.google.com/api/appversion/create?app_id=appname&version=1&
409 Conflict
Another transaction by user userid is already in progress for app: s~appname, version: 1.
That user can undo the transaction with "appcfg rollback".
A mensagem me pareceu bem clara, como forcei o stop, a transação ficou aberta e precisava fecha-la antes de realizar o novo deploy.
Pesquisando um pouco na net, achei o seguinte tutorial que funcionou perfeitamente pra mim:
  1. Abra o console e entre no diretório BIN do App Engine SDK, no meu caso:  /Applications/Eclipse/eclipse/plugins/com.google.appengine.eclipse.sdkbundle_1.8.8/appengine-java-sdk-1.8.8/bin
  2. $ sudo chmod a+x appcfg.sh (torna o appcfg.sh em 'executável')
  3. Identifique o diretório war do seu projeto. No meu caso: /Users/rafaelbarrelo/Dev/Eclipse/workspace/MidiaPalestrinaServerV2/war/
  4. $ ./appcfg.sh rollback /Users/rafaelbarrelo/Dev/Eclipse/workspace/MidiaPalestrinaServerV2/war/
  5. Ele irá iniciar o processo... Coloque o e-mail e senha!
  6. Fim, processo concluído e deploy "liberado"!
Obs: No meu caso, como uso Google Authenticator, tive que criar uma senha de aplicativo quando o script solicitou a senha do e-mail. Apenas criei a senha e depois de finalizado excluí-la.

Como identificar LOCK e UNLOCK do Windows em .NET? E o Screen Saver?

Para identificar os comandos de LOCK e UNLOCK do Windows em .NET basta implementar o seguinte:
//Habilita controle do bloqueio de tela Microsoft.Win32.SystemEvents.SessionSwitch += new Microsoft.Win32.SessionSwitchEventHandler(SystemEvents_SessionSwitch); //Trata os eventos void SystemEvents_SessionSwitch(object sender, Microsoft.Win32.SessionSwitchEventArgs e) { if (e.Reason == SessionSwitchReason.SessionLock){ //Bloqueou estação } else if (e.Reason == SessionSwitchReason.SessionUnlock){ //Desbloqueou estação } }
Mas... Se entra o ScreenSaver, ele não bloqueia a tela imediatamente. O comando de bloquei só ocorre quando o ScreenSaver fecha. Assim, podemos "saber" se o ScreenSaver está ativado e tomar uma ação:
using System.Runtime.InteropServices; const int SPI_GETSCREENSAVERRUNNING = 114; [DllImport("user32.dll", CharSet = CharSet.Auto)] private static extern bool SystemParametersInfo(int uAction, int uParam, ref bool lpvParam, int flags);
// Retorna TRUE se estiver executando public static bool GetScreenSaverRunning() { bool isRunning = false; SystemParametersInfo(SPI_GETSCREENSAVERRUNNING, 0, ref isRunning, 0); return isRunning; }
Assim, pode-se criar uma thread para monitorar o screensaver. Talvez não seja a solução ideal, mas por enquanto está funcionando.