quarta-feira, 27 de março de 2013

Habilitar Cores no Terminal do Mac (OSX)

Habilitar Cores no Terminal do Mac (OSX)

Quem gosta de brincar no terminal de comandos do Ubuntu, já percebeu que o mesmo apresenta cores para identificar os tipos de arquivo quando executamos o comando "ls".

Significado das Cores (Padrão no terminal do Ubuntu)

Azul Diretório (directory)
Azul Claro 
Atalho (linked file)
Verde 
Arquivo Executável ou Arquivo de Dados (executable or recognized data file)
Red 
Arquivo Compactado [*.rar | *.zip] (archive file)
Rosa
Arquivo de Imagem (graphic image file)
Amarelo com fundo preto
Dispositivo Externo (external device) 

Não seria legal se fosse possível utilizar esse recurso no OSX também? Acontece que é possível, basta abrir o arquivo .profile - executando a instrução open .profile no terminal - e adicionar as instruções abaixo.

export CLICOLOR=1  #Habilita utilização de cores
export LSCOLORS=exfxcxdxbxegedabagacad #Gera um esquema de cores

Execute o comando source ˜/.profile ou source .profile para recarregar o arquivo, atualizando essas informações no sistema operacional e o novo esquema de cores já vai estar valendo! Have Fun ;)

Dica 01: Execute os comandos apresentados diretamente no terminal para habilitar as cores imediatamente.

Dica 02: Após executar a instrução export CLICOLOR=1, execute a instrução ls -l -a para ver o resultado.

Dica 03: Use o link http://geoff.greer.fm/lscolors/ para gerar um esquema de cores como desejar.


segunda-feira, 25 de março de 2013

Obter nome de todos os inputs de HTML com jquery

O código abaixo é capaz de obter os nomes de todos os objetos input de uum documento HTML. (entenda por objetos inout, objetos representados pelas tag input, select, checkbox, radio, textarea, button).

var HTMLObjects = $.find(':input');
for (var i = 0;i < $(HTMLObjects).length; i++) {

console.log($(HTMLObjects[i]).attr('name'));

// alert($(HTMLObjects[i]).attr('name'));

}

Esse trecho de código pode aprestar outros atributos, por exemplo, se quiser ver todos os ids troque .attr('name') por .attr('id') e seja feliz! :)

segunda-feira, 18 de março de 2013

RAD 7.5 não realiza publish no Ubuntu

Este post tem o objetivo de apresentar um erro bastante incomum  para o desenvolvedor que trabalha com a IDE RAD no Linux(Ubuntu). A Figura 1 mostra a seguinte mensagem: Failure uploading archive to server: 504 Gateway Time-out (for:  /home/<usuario>/Desktop/workspace/.metadata/.plugins/com.ibm.etools.wrd.websphere.v7/tmp<timestamp>/update.zip).

Toda vez que o desenvolvedor tenta realizar o republish o RAD exibe tal mensagem.

Figura 1 - Erro ao tentar realizar a operação de publish

Esse erro pode ter diversos motivos, contudo, no meu caso ocorre por causa do plugin subclipse (plugin para trabalhar com projetos que utilizam o versionador SVN).  Se você não quiser ter esse problema disconecte o projeto do SVN sem deletar os arquivos (.svn). Para isso clique com o botão direito no projeto, selecione a opção Team > Disconnect, confirme a operação assegurando que a opção "Do not delete de SVN meta information (e. g, SVN sub-directories)" esta marcada.

Seguindo esses passos você poderá alterar e publicar o projeto a vontade, e quando chegar o momento de commitar as alterações basta associar o projeto ao SVN novamente.


sexta-feira, 8 de março de 2013

MAC OSX - Atalhos Úteis

Como usuario de MAC só tenho elogios a usabilidade do sistema operacional. Ainda sim passei por algumas situações chatas no que diz respeito a usabilidade sem o mouse.  

Quando acaba a pilha do Magic Mouse ou simplesmente perde a conexão com o iMac, bom, isso é um saco. 

Resolvi criar esse post para apresentar alguns atalhos que podem ajudar muito nessas horas.

Control + F2: Acessa o menu Apple.



Control + F3: Acessa o menu Dock.



Control + F8: Acessa o menu Bar


Caso o teclado NÃO esteja configurado para utilizar as teclas F1, F2 ... F3 como padrão será necessário  utilizar a tecla Fn para utilizar estes atalhos.

segunda-feira, 4 de março de 2013

iOS - Marcar área em torno de um ponto no mapa

Esse post tem como objetivo apresentar como podemos demarcar uma área qualquer em torno de um ponto utilizando Objective-C.

Figura 1 - Área Delimitada

A Figura 1 mostra bem o quero apresentar com esse post. Neste figura, existem 7 pontos. O ponto azul simboliza o ponto onde esta o smartphone. Os 4 pontos vermelhos unidos por um quadrado tracejado representam uma área definida em torno do ponto azul. 

Imagine a seguinte situação: O ponto azul sendo uma pessoa, os quatro pontos vermelhos unidos por um quadrado tracejado sendo uma área de 1 mil metros quadrados. Você seria capaz de informar para a pessoa diversos tipos de serviços dentro de uma área específica.

Para isso é necessário obter localização do smartphone, isso pode ser realizado implementado o método  - (void) locationManager:(CLLocationManager *) manager didUpdateToLocation:(CLLocation *) newLocation fromLocation:(CLLocation *) oldLocation do protocolo CLLocationManagerDelegate.

Uma vez que saibamos onde esta o smartphone é possível definir os quatro pontos que definem a área em torno do ponto azul. Para isso deve-se criar uma região utilizando o método  MKCoordinateRegion MKCoordinateRegionMakeWithDistance passando o ponto de origem do smartphone e o quanto deseja de distância, para latitude e longitude.

Nesse momento é possível calcular os pontos extremos que definem a área de deseja, calculando o mínimo e o máximo de latitude e longitude. Cada um dos pontos corresponde a seguinte combinação: (mínimoLatitude, mínimoLongitude); (mínimoLatitude, máximoLongitude); (máximoLatitude, máximoLongitude) e (máximoLatitude, mínimoLongitude).

Abaixo segue código em Objective-C capaz de gerar a figura apresentada

TMKViewController.h

#import <UIKit/UIKit.h>
#import <MapKit/MapKit.h>
#import <CoreLocation/CoreLocation.h>

@interface TMKViewController : UIViewController <MKMapViewDelegate, CLLocationManagerDelegate>

@property (weak, nonatomic) IBOutlet MKMapView *viewMap;

@property (weak, nonatomic) IBOutlet UITextField *labelLatitude;

@property (weak, nonatomic) IBOutlet UITextField *labelLongitude;

- (IBAction) getPosition:(id)sender;

@end

TMKViewController.m

#import "TMKViewController.h"

@interface TMKViewController ()

@end

@implementation TMKViewController

@synthesize labelLatitude, labelLongitude, viewMap;

CLLocationManager *locationManager;

CLLocation *currentLocation;

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
    }
    return self;
}

- (void)viewDidLoad
{
    [super viewDidLoad];
 
    /*
     * INICIALIZANDO LOCATION MANAGER
     */
    locationManager = [[CLLocationManager alloc] init];
    [locationManager setDelegate: self];
    [locationManager setDesiredAccuracy: kCLLocationAccuracyBest];
    [locationManager startUpdatingLocation];
}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
}

- (void) getPosition:(id)sender
{

 // GERANDO COORD
    CLLocationCoordinate2D theOrigin = CLLocationCoordinate2DMake(currentLocation.coordinate.latitude, currentLocation.coordinate.longitude);
    
    // GERANDO REGIÃO DE MIL METROS QUADRADOS EM TORNO DO PONTO DE ORIGEM
 MKCoordinateRegion region = MKCoordinateRegionMakeWithDistance(theOrigin, 1000.0, 1000.0);
    
    // CALCULANDO MÍNIMOS E MÁXIMOS DE LATITUDE E LONGITUDE
    double minLat = region.center.latitude - (region.span.latitudeDelta / 2.0);
    double maxLat = region.center.latitude + (region.span.latitudeDelta / 2.0);
    
    double minLong = region.center.longitude - (region.span.longitudeDelta / 2.0);
    double maxLong = region.center.longitude + (region.span.longitudeDelta / 2.0);
    
    // MARCANDO PONTOS NO MAPA
    CLLocationCoordinate2D coordinate;
    MKPointAnnotation *pointAnnotation = nil;
    
    coordinate = CLLocationCoordinate2DMake( minLat, minLong);
    pointAnnotation = [[MKPointAnnotation alloc] init];
    [pointAnnotation setCoordinate:coordinate];
    [pointAnnotation setTitle:@"Sudoeste"];
    [viewMap addAnnotation:pointAnnotation];
    
    
    coordinate = CLLocationCoordinate2DMake( minLat, maxLong);
    pointAnnotation = [[MKPointAnnotation alloc] init];
    [pointAnnotation setCoordinate:coordinate];
    [pointAnnotation setTitle:@"Sudeste"];
    [viewMap addAnnotation:pointAnnotation];
    
    
    coordinate = CLLocationCoordinate2DMake( maxLat, maxLong);
    pointAnnotation = [[MKPointAnnotation alloc] init];
    [pointAnnotation setCoordinate:coordinate];
    [pointAnnotation setTitle:@"Nordeste"];
    [viewMap addAnnotation:pointAnnotation];
    
    
    coordinate = CLLocationCoordinate2DMake( maxLat, minLong);
    pointAnnotation = [[MKPointAnnotation alloc] init];
    [pointAnnotation setCoordinate:coordinate];
    [pointAnnotation setTitle:@"Noroeste"];
    [viewMap addAnnotation:pointAnnotation];
    
    [viewMap setRegion:region animated:YES];
    [viewMap setCenterCoordinate:theOrigin];
    [viewMap setShowsUserLocation:true];
    [viewMap setUserTrackingMode:MKUserTrackingModeFollowWithHeading];
    
    NSLog(@" Noroeste, Lat: %2.4f, Long: %2.4f ", maxLat, minLong);
    NSLog(@" Nordeste, Lat: %2.4f, Long: %2.4f ", maxLat, maxLong);
    NSLog(@" Sudoeste, Lat: %2.4f, Long: %2.4f ", minLat, minLong);
    NSLog(@" Sudeste , Lat: %2.4f, Long: %2.4f ", minLat, maxLong);
    
}

- (MKOverlayView *)mapView:(MKMapView *)map viewForOverlay:(id <MKOverlay>)overlay
{
    MKCircleView *circleView = [[MKCircleView alloc] initWithOverlay:overlay];
    circleView.strokeColor = [UIColor redColor];
    circleView.fillColor = [[UIColor redColor] colorWithAlphaComponent:0.4];
    return circleView;
}


#pragma mark - CLLocationManagerDelegate
- (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error
{
    NSLog(@"didFailWithError: %@", error);
    UIAlertView *errorAlert = [[UIAlertView alloc]
                               initWithTitle:@"Error" message:@"Failed to Get Your Location" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
    [errorAlert show];
}

- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation
{
    currentLocation = newLocation; // ATUALIZANDO VÁRIAVEL QUE GUARDA LOCALIZAÇÃO CORRENTE
    
    if (currentLocation != nil) {
        
        [labelLongitude setText: [NSString stringWithFormat:@"%.8f", currentLocation.coordinate.longitude]];
        
        [labelLatitude setText: [NSString stringWithFormat:@"%.8f", currentLocation.coordinate.latitude]];
    }
    
}

@end


Java - Testando Web Services (SOAP) manualmente

É muito comum para desenvolvedores que trabalham com WebService utilizar a ferramenta soapUI para testar um WebService que utilize o protocolo SOAP. Afinal trata-se de uma ferramenta poderosa e muito útil para testar seus WebServices.

A grosso modo a ferramenta soapUI, funciona enviando um XML via HTTP e recebendo uma resposta também em XML, ou seja, utilizando o WebService em sua forma mais "pura". Normalmente os desenvolvedores utilizam algum framework capaz de converter objetos em XML e XML em objetos,  diminuindo consideravelmente a complexibilidade do código. Pois, torna desnecessário escrever os XMLs manualmente.

O que vamos ver neste post é um exemplo de utilização de WebServices em sua forma "pura", ou seja , sem a conversão para objetos, tanto para o envio bem como para recuperação dos dados. O código a seguir apresenta como realizar essa operação.

/**
  * @param args
  */
 public static void main(String[] args) {

  try {

   URL url = new URL("[URL DO SERVIÇO SEM (?wsdl): Exemplo: http://localhost/WebServiceTest/DataAtualService"]);

   URLConnection urclConnection = url.openConnection();

   HttpURLConnection connection = (HttpURLConnection) urclConnection;

   connection.setDoOutput(true);

   connection.setDoInput(true);

   connection.setAllowUserInteraction(true);

   connection.setRequestMethod("POST");

   /**
    * Necessário quando se trata da versão 1.1 do protocolo SOAP
    */
   connection.setRequestProperty("SOAPAction", "");

   connection.setRequestProperty("Host", "http://localhost");

   connection.setRequestProperty("Content-Type", "application/soap+xml; charset=utf-8");

   OutputStreamWriter infWebSvcReqWriter = new OutputStreamWriter(connection.getOutputStream());

   String infWebSvcRequestMessage = [XML];

   infWebSvcReqWriter.write(infWebSvcRequestMessage);

   infWebSvcReqWriter.flush();

   BufferedReader reader = null;

   /**
    * Verifica sucesso da requisição, em caso positivo obtém XML esperado em caso negativo
    * obtém XML de Erro
    */
   if (connection.getResponseCode() == 200) {

    reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));

   } else {

    reader = new BufferedReader(new InputStreamReader(connection.getErrorStream()));
   }

   String line;

   String infWebSvcReplyString = "";

   while ((line = reader.readLine()) != null) {

    infWebSvcReplyString = infWebSvcReplyString.concat(line);

   }
   
   infWebSvcReqWriter.close();

   reader.close();

   connection.disconnect();
   
   /**
    * Apresenta no console do Java o XML de recuperado
             */
   System.out.println(infWebSvcReplyString);

  } catch (Exception e) {

   System.out.println(e);
   
  }
 }

No código apresentado, a linha 33 String infWebSvcRequestMessage = [XML]; representa que o conteúdo de um XML é passado para a váriavel infWebSvcRequestMessage. Esse conteúdo pode ser escrito diretamente na variável ou pode ser lido através de um arquivo. O XML abaixo representa um exemplo do que poderia ser passado para a variável infWebSvcRequestMessage.

 <SOAP-ENV:Envelope xmlns:
  SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" 
  SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"> 
  
  </SOAP-ENV:Header/>
  <SOAP-ENV:Body>
      <m:recuperaDataAtual>
       <format>dd/MM/yyyy HH:mm:ss</format>
   </m:recuperaDataAtual>
  </SOAP-ENV:Body>
 </SOAP-ENV:Envelope>


Uma vez que o código é executado com o XML acima, é possível obter um retorno positivo ou negativo da requisição, afinal, trata-se de uma requisição HTTP. Assim o desenvolvedor pode receber um XML com o retorno esperado assim como um XML representando uma ocorrência de erro. Abaixo apresento exemplos de retorno para as duas situações.

 <SOAP-ENV:Envelope xmlns:
  SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" 
  SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
 </SOAP-ENV:Header/>
   <SOAP-ENV:Body>
     <m:recuperaDataAtualResponse>
        <string>14/05/1986 22:37:00</string>
     </m:recuperaDataAtualResponse>
   </SOAP-ENV:Body>
 </SOAP-ENV:Envelope>
XML com retorno esperado


 <soap:Envelope 
  xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
  xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  
  </SOAP-ENV:Header/>
  <soap:Body>
      <soap:Fault>
         <faultcode>1234</faultcode>
         <faultstring>Não foi possível chamar o método recuperaDataAtual</faultstring>
      </soap:Fault>
    </soap:Body>
 </soap:Envelope>

XML de erro

Java - Convertendo java.io.File para java.lang.String

O código a seguir mostra como converter o conteúdo de uma arquivo para uma String.

Não utilize esse código para arquivos demasiadamente grandes, pois provavelmente receberá OutOfMemoryError da JVM.

    /**
     * Tranforma o arquivo em String
     *
     * @param file
     *          Caminho do arquivo que deve sofrer a conversão
     *          
     * @return  String representando o conteúdo do arquivo
     */
    public static String fileToString(String file) {
        String result = null;
        DataInputStream in = null;
        try {
            File f = new File(file);
            byte[] buffer = new byte[(int) f.length()];
            in = new DataInputStream(new FileInputStream(f));
            in.readFully(buffer);
            result = new String(buffer);
        } catch (IOException e) {
            throw new RuntimeException("IO problem in fileToString", e);
        } finally {
            try {
                in.close();
            } catch (IOException e) {
             /* ignorar */
            }
        }
        return result;
    }