Começando em Objective-C

Nesse post irei colocar um dos exemplos que fiz quando comecei a estudar a linguage Objective-C, 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. :(

class diagram people

Não vou ficar explicando para que serve exatamente cada parte do código para nao alongar muito o post e para ter assuntos para outros posts também! :D

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

//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

Comments »


Atualizei o IPhone para a versão 3.0

Ontem vi a noticia da liberação de uma nova versao do sistema operacional do iphone e assim que cheguei em casa coloquei o iphone para atualizar.

O Download demorou um pouco, afinal a atualizacao tem cerca de 230mb. Depois disso foi mais uns 10 minutos aguardando o iphone atualizar-se.

Depois de tudo pronto, o iphone reinicia e começo a procurar novidades no meu gadget.

IMG_0169

Meu iphone estava com jailbreak e a primeira mudança que notei foi que todos os aplicativos que instalei via Cydia/Installer foram perdidos ( os únicos que sentirei falta serão o Sycoder para filmar e um outro que funcionava como um terminal Unix  :( ).

Mas não tem problema, afinal eu já sabia que iria perder tudo que instalei com o jailbreak.

A primeira coisa que “estranhei” foi que os icones ficaram todos bagunçados, mas nada que uma rapida organizada nao resolva.

Depois disso vi uma pequena lupa abaixo dos aplicativos, trata-se de um Spotlight ( recurso já existente no Mac OS X ) para o iphone. Um recurso bem legal onde podemos pesquisar qualquer coisa (Aplicativos, Contatos, Musicas e etc) dentro do iphone.

IMG_0168

Em seguida abri a camera com esperança de poder filmar com software nativo do iphone, mas infelizmente isso não foi possivel.

Testei o novo Voice Memos e funciona muito bem, agora posso gravar audio! :D

Testei tambem o Copiar/Colar ( Copy/Paste ) e foi bem fácil de utiliza-lo nas mensagens assim como o envio de fotos nas mensagens tambem é possivel.

Em geral nao percebi mudanças de performance na atualização, mas uma coisa que notei que melhorou bastante foi o GPS, agora meu iphone está apontando sua localizacao no Google Maps bem mais rápido do que antes e parece estar mais preciso tambem, mas ainda preciso testar mais este recurso.

Senti falta do Voice Control, a apple poderia ter incluso este recurso na atualizacao! :(

Aproveitei e também já baixei e instalei o novo SDK 3 do iphone e esse sim demorou bem mais para baixar e atualizar, pois ele tem 2.1gb.

Comments »


Fui no Falando em Java 2009

Dia 24/05/2009 passei praticamente o dia todo (domingo) assistindo as palestras do evento Falando em Java 2009 realizado pelo pessoal da Caelum.

O evento comecou com um apresentação sobre a evolução da Caelum, de seu ambiente de trabalho (Deu vontade de enviar meu curriculo! :D ) e das novidades para os cursos. 

img_0138

Depois comecaram as palestras mais tecnicas e a primeira foi otima! Realizada pelo Jim Webber sobre SOA, onde ele apresenta seu ponto de vista sobre esta tecnologia e como esta é vendida pelas “grandes” empresas do mercado.

Em seguida Paulo Silveira e o Rafael Cosentino apresentaram algumas ideias de porque adotar determinada solução para um tipo de caso e não para outro, foi muito boa tambem( embora eu particularmente pensei que iria ver outro tipo de assunto nessa palestra, acho que o titulo não bateu muito com o conteudo da palestra).

Antes de uma parada para o lanche (muito bom por sinal tirando o problema do tumulto! :D ), Alessandro Lazarotti e Ricardo Nakamura fizeram uma divertida e otima palestra sobre JBoss Seam e WebBeans e mostrar alguns exemplos de utilizacao do Seam. Faz um tempo que nao utilizo o Seam, mas parece que ele esta bem melhor do que quando utilizei.

img_0145Depois de tomo mundo detonar o lanche, Felipe Sabella e Guilherme Silveira palestraram sobre o VRaptor 3 e sinceramente eu me impressionei com o potencial deste framework. Ja baixei a a versao beta para alguns testes aqui! Recomendo ficarem atento a este framework, pois ele esta muito bom.

Logo depois Guilherme Moreira e Sergio Lopes apresentaram sobre Arquitetura e o JBoss rodando em Cluster nao colaborou muito, mas as dicas de Hibernate que eles deram ja valeram e muito a palestra.

O Anderson Leite e Fabio Kung fizeram uma exploracao dentro da JVM, mostrando novas funcionalidades e como algumas coisas funcionam por dentro, foi bem legal pena ter pouco tempo para falar sobre Java FX e Java TV.

Infelizmente Bill Burke nao conpareceu no evento, mas o Jim realizou a palestra e mais uma vez ele foi sensacional falando e explicando sobre REST!

img_0141

Uma novidade que vi no evento e que me deixou contente foi o anuncio de um livro escrito pelo pessoal da Caelum sobre arquitetura de software, pena que so sera lançado em novembro. Agora é aguardar! :(

Foi muito bom participar do evento, encontrar o pessoal do GUJ e outras pessoas com quem ja trabalhei e estudei.

Em resumo o evento foi muito bom, so nao gostei do gerador em ruby que nao sorteou meu numero e assim nao ganhei o Wii sorteado.. :(

Comments »


Inscricoes abertas para o Google Developer Day 2009

Abriram as inscrições para o evento GDD - Google Developer Day 2009, que será realizado em São Paulo no dia 29 de junho no Sheraton São Paulo WTC Hotel. 

Este evento vai abordar diversos assuntos relacionados com os produtos do Google, como maps, app engine, android e GWT. Eu fui neste evento realizando em 2008 e digo que vale muito a pena ir.

Veja meu relato sobre o evento realizando em 2008. 

Minha dica é que os interessados façam a inscrição o mais rapido possivel, pois as vagas se esgotam rápido. ;)

Já fiz minha inscrição e você esta esperando o que? :D

Comments »


Resolvendo problema do MySQL5 com Ruby on Rails no Mac OS X

Estou fazendo alguns pequenos testes em Ruby on Rails utilizando sqlLite3 e até ai tudo ok.Foi quando resolvi utilizar o MySQL5 em um projeto que meus problemas começaram! :(

Primeiro criei um projeto:

1
_rails algum_projeto --database=mysql_

Depois criei um model, um controller e executei a migration, com isso recebi a mensagem indicando a falta de driver para o MySQL:

1
_The bundled mysql.rb driver has been removed from Rails 2.2. Please install the mysql gem and try again: gem install mysql._

Ok a mensagem é bem clara, então fui instalar o driver, e:

1
2
3
4
5
6
7
8
9
10
11
_MacBook:projectTest rodrigo$ sudo gem install mysql
Building native extensions.  This could take a while...
ERROR:  Error installing mysql: ERROR: Failed to build gem native extension.
/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/bin/ruby extconf.rb install mysql
checking for mysql_query() in -lmysqlclient... nochecking for main() in -lm... yes
checking for mysql_query() in -lmysqlclient... nochecking for main() in -lz... yes
checking for mysql_query() in -lmysqlclient... nochecking for main() in -lsocket... no
checking for mysql_query() in -lmysqlclient... nochecking for main() in -lnsl... no
checking for mysql_query() in -lmysqlclient... no
Gem files will remain installed in /Library/Ruby/Gems/1.8/gems/mysql-2.7 for inspection.
Results logged to /Library/Ruby/Gems/1.8/gems/mysql-2.7/gem_make.out_

Ops, não deu certo! Pesquisando na internet, encontrei algumas formas em que consegui instalar a extensão, porem ao iniciar o servidor e tentar acessar meu projeto o servidor retornava o seguinte erro:

1
2
3
_dyld: Symbol not found: _mysql_init
Referenced from: /Library/Ruby/Gems/1.8/gems/mysql-2.7/lib/mysql.bundle
Expected in: dynamic lookup_

Pesquisando mais um pouco, vi que o problema era o MySQL instalado no meu Mac, pois este era para a plataforma 64bits e o Rails so aceita a versão 32bits (Pelo menos no Mac OS X :( ) do MySQL.

Com isso, removi a instalação atual do MySQL assim:

1
2
3
4
5
6
7
8
9
10
_sudo gem uninstall mysql
sudo rm /usr/local/mysql
sudo rm -rf /usr/local/mysql*
sudo rm -rf /Library/StartupItems/MySQLCOM
sudo rm -rf /Library/PreferencePanes/My*

edit /etc/hostconfig and remove the line MYSQLCOM=-YES-

sudo rm -rf /Library/Receipts/mysql*
sudo rm -rf /Library/Receipts/MySQL*

Baixei e instalei a mesma versão do MySQL porem para 32bits e adicionei o driver novamente, com esse comando:

1
sudo env ARCHFLAGS="-arch i386" gem install mysql -- --with-mysql-dir=/usr/local/mysql --with-mysql-lib=/usr/local/mysql/lib --with-mysql-include=/usr/local/mysql/include --with-mysql-config=/usr/local/mysql/bin/mysql_config_

Pronto, agora consegui criar um projeto Rails e fazer ele funcionar perfeitamente com o MySQL, então fica aí esta dica para quem passar por este problema. ;)

Comments »