Faz um certo tempo que venho querendo desenvolver algo para o iPhone, mas ultimamente tenho estado meio ocupado por inúmeros motivos, agora felizmente ja me livrei de algumas coisas que consumiam meu tempo e pude começar a brincar com a linguagem Objective-C que é utilizada para desenvolver aplicativos para o iphone, então abri o XCode e alguns pdf’s sobre Objective-C e comecei a testar a linguagem.
Nesse post irei colocar um dos exemplos que fiz, procurei comentá-lo bastante (em inglês :D ) para facililar o entendimento do código.
Basicamente criei uma classe Pessoa com duas variaveis de instancia (nome e data de nascimento), um metodo estático (class method) e três métodos de classe. Criei uma representação UML utilizando tipos do Java para representar a classe, pois não achei como utilizar os tipos do ObjC no argoUML. :(
Não vou ficar explicando para que serve exatamente cada parte do código para nao alongar muito o post.
Todo o codigo pode ser colocado em um único arquivo (algumNome.m) ou em arquivos separados @Interface ( algumNome.h) @Implementation e metodo main (algumNome.m).
Com este pequeno exemplo já pode-se entender de uma forma simples como trabalhar com classes e suas instancias, Strings, Datas e algumas definições OO em Objective-C.
Finalmente vamos ver o exemplo, vou começar pela @Interface (É diferente de uma interface Java) que especifica o que a classe People irá conter:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#import <Foundation/Foundation.h>
//Interface of the class People
@interface People : NSObject
{
//defining the instance variables as private
@private
NSString *name;
NSDate *birthDate;
}
//static method or class method
+ (void) doSomething;
//instance method
- (void) sayMyName;
- (void) sayMyAge;
- (int) calculateMyAge;
//properties (getters and setters)
@property (readwrite, copy) NSString *name;
@property (copy, readwrite) NSDate *birthDate;
@end
Agora vou mostrar como ficou a implementação da classe People (antes que alguém reclame o calculo da idade so esta sendo feito ate o nivel Mês, ou seja, nao esta utilizando o dia do aniversario, apenas ano e mes para calcular a idade):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
//Implementation of the class People
@implementation People
/*
tell the compiler that it should synthesize
the setter and/or getter methods for the property
*/
@synthesize name;
@synthesize birthDate;
//implementation of the method class
+ (void) doSomething {
printf("Do something!n");
}
//implementation of the instance method class
- (void) sayMyName {
printf("Hi, my name is %sn", [name UTF8String] );
}
//implementation of the instance method class
- (void) sayMyAge {
NSString *myBirthDay = [birthDate descriptionWithCalendarFormat:@"%d/%m/%Y" timeZone:nil locale:nil];
printf("Hi, my birth day is %s ", [myBirthDay UTF8String]);
printf("and i have %i years", [self calculateMyAge]);
}
//implementation of the instance method class
- (int) calculateMyAge {
NSDate *currentDate = [NSDate date];
int birthYear = [[birthDate descriptionWithCalendarFormat:@"%Y" timeZone:nil locale: nil] intValue];
int birthMonth = [[birthDate descriptionWithCalendarFormat:@"%m" timeZone:nil locale:nil] intValue];
int currentYear = [[currentDate descriptionWithCalendarFormat:@"%Y" timeZone:nil locale:nil] intValue];
int currentMonth = [[currentDate descriptionWithCalendarFormat:@"%m" timeZone:nil locale:nil] intValue];
int age = currentYear - birthYear;
if (currentMonth <= birthMonth) {
age--;
}
return age;
}
@end
Pronto, já temos a classe pronta! Agora vou testá-la:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
int main (int argc, const char * argv[]) {
//call class method
[People doSomething];
//create a instance of People
People *rodrigo = [[ People alloc] init];
//set the name
[rodrigo setName: @"Rodrigo Lazoti"];
//set the day of birth. Format: month/day/year
[rodrigo setBirthDate: [NSDate dateWithNaturalLanguageString:@"08/08/1981"]];
//call instance method
[rodrigo sayMyName];
//call instance method
[rodrigo sayMyAge];
//end program
return 0;
}
O resultado do código executado será:
1
2
3
4
5
6
Do something!
Hi, my name is Rodrigo Lazoti.
Hi, my birth day is 08/08/1981
and i have 27 years
Como tinha um voucher vencendo decidi fazer a prova agora no começo de abril, depois de duas semanas me dedicando ao estudo do conteúdo cobrado pela certificação SCBCD 5 - Sun Certified Business Component Developer Java EE Platform 5 e retorno agora de um centro Prometric feliz da vida por ter passado na certificação.
Não tive muito tempo pra me dedicar e estudar tudo sobre a prova, por isso estudei basicamente o conteudo do livro Enterprise Javabeans 3 de Bill Burke & Richard Monson-Haefel. O livro em si tem um bom conteudo, mas nao abrange completamente a prova. Prova disso foi que desconhecia algumas questoes mais teoricas e outras acabei aprendendo no simulado.
O que utilizei para estudar:
Sobre o livro:
Como disse anteriormente, embora o livro seja bom ele não abrenge todo o conteudo cobrado no exame, pois se você pretende se preparar totalmente para a prova recomendo a leitura da especificao EJB3.
Sobre o simulado:
Realmente este simulado é muito bom, valeu a pena os $29,00 gastos nele e embora eu não consegui utiliza-lo muito, pois realizei apenas 4 testes (iniciei com o score de 54% e no ultimo fiquei com 75%), mas mesmo assim recomendo.
Sobre a prova:
Cairam muitas questoes de transactions, exceptions, session beans (SFSB, SLSB e MDB) e JPA. Interceptors e timers foram muito poucas. Cairam algumas que cobravam um pequeno conhecinhento de tags XML. Security foi bem tranquilo tambem. Uma ultima dica é que treine bastante seu ingles, pois diferente das outras provas que fiz, esta tem questoes com enunciados maiores e uma palavra entendida de forma errada pode fazer voce marcar uma alternativa incorreta.
Agora é descançar um pouco e comemorar a nova conquista! :D
Ruby é uma linguagem que tem aparecido bastante e obtido um grande destaque no mundo do desenvolvimento de software por sua agilidade e simplicidade, assim como muitos desenvolvedores acabei estudando a linguagem por curiosidade e tenho gostado dos resultados.
Mas voltando ao foco do post, vou apresentar de uma forma resumida como a linguagem Ruby lida com o tratamento de exceptions utilizando os comandos Rescue, Retry e Ensure.
rescue: fornece uma forma de tratar uma exception lançada, ele é parecido com o catch do Java.
Exemplo de rescue:
1
2
3
4
5
6
begin
eval algumaCoisaQueNaoExiste
rescue NameError => boom
puts "variavel local ou metodo indefinido."
end
ensure: fornece uma forma de garantir que o código sempre irá rodar independente de uma exception ser lançada ou não. Parecido com o finally do Java.
Exemplo de ensure:
1
2
3
4
5
6
7
8
9
begin
eval algumaCoisaQueNaoExiste
rescue NameError => boom
puts "variavel local ou metodo indefinido."
ensure
puts "fim do programa."
end
retry: este certamente é o comando mais interessante de todos, pois com ele podemos “dar uma segunda chance” para o método caso ocorra alguma exception.
Para exemplificar o retry vou criar uma classe com um unico metodo que tem por finalidade somar dois numeros positivos. Inicialmente não irei utilizar o retry para ver como o código irá se comportar.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class Calculator
def sum_positive_numbers(first_number, second_number)
begin
if first_number < 0 or second_number < 0
raise ArgumentError, "The value can not be less than zero."
else
return "#{first_number} + #{second_number} = #{first_number + second_number}"
end
rescue ArgumentError => exception
if first_number < 0
puts "#{exception} Current Value = #{first_number}"
end
if second_number < 0
puts "#{exception} Current Value = #{second_number}"
end
end
end
end
Agora vamos testar o método e ver seu resultado
1
2
3
4
5
6
calculator = Calculator.new
puts calculator.sum_positive_numbers( 0, 0 )
puts calculator.sum_positive_numbers( 5, 2 )
puts calculator.sum_positive_numbers( -5, 2 )
puts calculator.sum_positive_numbers( 5, -2 )
puts calculator.sum_positive_numbers( -5, -2 )
Resultado:
1
2
3
4
5
6
7
8
9
0 + 0 = 0
5 + 2 = 7
The value can not be less than zero. Current Value = -5
nil
The value can not be less than zero. Current Value = -2
nil
The value can not be less than zero. Current Value = -5
The value can not be less than zero. Current Value = -2
nil
Agora vou fazer uma pequena alteração no método para caso algum de seus argumentos seja negativo, o mesmo receba o valor 0 e seja refeito o cálculo.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
class Calculator
def sum_positive_numbers(first_number, second_number)
begin
if first_number < 0 or second_number < 0
raise ArgumentError, "The value can not be less than zero."
else
return "#{first_number} + #{second_number} = #{first_number + second_number}"
end
rescue ArgumentError => exception
if first_number < 0
puts "#{exception} Current Value = #{first_number} | New Value 0"
first_number = 0
end
if second_number < 0
puts "#{exception} Current Value = #{second_number} | New Value 0"
second_number = 0
end
#aqui eu peço para tentar novamente
retry
end
end
end
Finalmente vamos testar no metodo utilizando o comando retry.
1
2
3
4
5
6
calculator = Calculator.new
puts calculator.sum_positive_numbers( 0, 0 )
puts calculator.sum_positive_numbers( 5, 2 )
puts calculator.sum_positive_numbers( -5, 2 )
puts calculator.sum_positive_numbers( 5, -2 )
puts calculator.sum_positive_numbers( -5, -2 )
O resultado será:
1
2
3
4
5
6
7
8
9
0 + 0 = 0
5 + 2 = 7
The value can not be less than zero. Current Value = -5 | New Value 0
0 + 2 = 2
The value can not be less than zero. Current Value = -2 | New Value 0
5 + 0 = 5
The value can not be less than zero. Current Value = -5 | New Value 0
The value can not be less than zero. Current Value = -2 | New Value 0
0 + 0 = 0
Um único problema é que se não tormar cuidado, podemos fazer o software entrar em um retry infinito. Para entender o que estou dizendo basta alterar umas das atribuições de valor 0, como por exemplo first_number = 0 para um valor negativo como first_number = -10. Rode o programa e veja o que acontece. :D
Com isso já deu para conhecer um pouco do que a linguagem Ruby é capaz! ;)
Sou um grande defensor do Linux e usuário durante alguns anos, passando desde ubuntu até slackware, como já tinha abandonado meu windows mobile (HTC Touch) e partido para o iphone, resolvi também migrar meu note com linux para um macbook.
Assim como sempre vi outras pessoas comentanto, digo que o macbook é muito bom, tando em hardware como em software.
A migração foi bem tranquila, me acostumei rápido ao novo SO e ao macbook. Então comecei a “caçar” programas similares aos que usava no Linux para a plataforma da Apple. Em 95% dos casos encontrei um software similar ou até o mesmo utilizado no linux para o Mac OS.
O mais problemático foi achar um programa similar ao DeVeDe do linux, um programa extraordinário para conversão de vídeos e criação de imagens para serem gravadas em DVD (com menu e tudo).
Resolvi postar aqui uma pequena lista de 12 softwares que recomendo para utilizar no Mac OS X. Agora vamos a lista:
Adium: comunicador instantâneo, suporta msn, gtalk, entre outros. Pena que não oferece suporte para webcam, mas é muito bom e tem um interface bonita.
AppCleaner: excluir aplicativos no mac os é muito facil, mas as vezes acabam ficando arquivos perdidos, este programa procura por arquivos do programa que você pretende excluir.
Burn: otimo gravador de cd/dvd. Também converte alguns formatos de video.
OpenOffice/BrOffice: já utilizava no linux, então já estava acostumado com ele. Faz tempo que abandonei o MS Office.
DiskAid: esse é muito util para quem tem iphone/ipod touch, como ele pode-se transferir arquivos via usb entre o mac e o gadget.
FileZilla: outro que veio da migração do linux. Este programa de ftp é muito bom, recomendo.
iAlertU: esse é bem interessante, funciona como um alarme para seu macbook. Assim com um leve deslocadomento do macbook de seu local já é o bastante para o alarme disparar.
Kigo Video Converter: tenho muitos arquivos em RMVB e estava tendo problemas para converter e gravar no dvd, depois de testar vários programas para converter, acabei encontrado este que é o melhor de todos. (Agora posso continuar assistindo Naruto e Lost tranquilamente na TV :D ).
Smultron: seria algo similar ao notepad++ ou gedit. Simples mas funcional, bem melhor que o TextEdit.
TextMate: como sempre vi muito comentários recomendando este programa, resolvi testá-lo e realmente é muito bom, estou adorando programar em Ruby com o textMate, este app é totalmente clean.
Remote Desktop Connection: conexão remota para windows. tenho um Desktop utilizado pela minha esposa com windows XP e as vezes preciso acessa-lo.
FluidTunes: programa muito interessante onde podemos controlar o itunes com gestos utilizando a webcam, é bem legal para impressionar as pessoas. :D
Então fica aí a dica. ;)
Alguns dias atrás fui convidado pelo Tiago Baeta (coordenador da área de conteúdo do iMasters) para publicar artigos no imasters, resolvi aceitar o convite.
O primeiro artigo publicado foi um artigo copiado do blog, pois pretendo postar todos artigos que escrever tanto aqui no blog, como no imasters também.
Quem quiser conferir meus artigos publicados no imasters, o link é:
http://imasters.uol.com.br/indice/autor/113119/rodrigo_lazoti