Posted: fevereiro 18th, 2009 | Author: Carlan Calazans | Tags: aprendizado, dev, iphone, mac, objectivec, ubuntu | 6 Comments »
Objective-C pode ser considerado um cinto de utilidades baseado no C. Isso significa que todo o poder da linguagem pai está disponível, incluindo as diversas bibliotecas. Em todos os meus testes, quando precisei de tipos numéricos usei os tipos primitivos do C. A pouco tempo descobri que existe um problema nessa abordagem.

4 8 15 16 23 42
Dependendo do uso, acredito que os tipos numéricos do C sejam mais indicados, mas ao desenvolver utilizando algumas classes, como NSArray onde não podemos incluir elementos que não sejam objetos, a coisa começa a complicar. O problema em questão não é a linguagem ou os seus criadores e sim a falta de conhecimento do programador.
Olhando a documentação, depois de uma boa garimpada, é possível encontrar referências que chamam atenção. NSNumber (subclasse de NSValue), NSInteger, NSUInteger. A primeira é a mais utilizada e é uma classe (imutável), o resto são somente sinônimos (typedef) para os tipos numéricos já conhecidos do C. Podemos criar um objeto da classe NSNumber através dos tipos signed (ou unsigned) char, short int, int, long int, float, double e BOOL.
Exemplos:
int i
= 123;
float f
= 123.45;
char c
= 'c';
NSNumber * intObject
= [NSNumber numberWithInt
:i
];
NSNumber * floatObject
= [NSNumber numberWithFloat
:f
];
// isn't useful to me
NSNumber * yesObject
= [NSNumber numberWithBool
:YES];
NSNumber * noObject
= [NSNumber numberWithBool
:NO];
NSNumber * doubleObject
= [NSNumber numberWithDouble
:123.456];
NSNumber * charObject
= [NSNumber numberWithChar
:c
];
NSLog
(@"intObject class = %@",
[intObject className
]);
NSLog
(@"floatObject class = %@",
[floatObject className
]);
NSLog
(@"yesObject class = %@",
[yesObject className
]);
NSLog
(@"noObject class = %@",
[noObject className
]);
NSLog
(@"doubleObject class = %@",
[doubleObject className
]);
NSLog
(@"CharObject class = %@",
[charObject className
]);
// string representation
NSLog
(@"\n");
NSLog
(@"String value of intObject = %@",
[intObject stringValue
]);
NSLog
(@"String value of floatObject = %@",
[floatObject stringValue
]);
NSLog
(@"String value of yesObject = %@",
[yesObject stringValue
]);
NSLog
(@"String value of noObject = %@",
[noObject stringValue
]);
NSLog
(@"String value of doubleObject = %@",
[doubleObject stringValue
]);
NSLog
(@"String value of CharObject = %@",
[charObject stringValue
]);
// comparing
// the return will be NSOrderedAscending (greated than), NSOrderedSame (equal to)
// and NSOrderedDescending (less than).
[intObject compare
:floatObject
];
[floatObject compare
:intObject
];
Posted: fevereiro 12th, 2009 | Author: Carlan Calazans | Tags: dev, dica, mdbtools, rapidinha | No Comments »
Esta semana precisei exportar o schema e os dados de um arquivo MDB (MS Access) para um formato que o MySQL pudesse entender.
No ubuntu, podemos contar com a ajuda de um pacote (via apt-get) chamado mdbtools. Com o pacote instalado, é possível realizar operações no arquivo MDB como: exportar schema e dados, listagem de tabelas, executar um comando SQL, etc. Abaixo, segue alguns exemplos de uso.
Exportando o schema
$ mdb-schema database.mdb mysql > schema.sql
Exportando os dados de uma tabela no formato SQL
$ mdb-export -I -R';\n' database.mdb table > table.sql
Exportando os dados de uma tabela no formato CSV
$ mdb-export database.mdb table > table.sql
Executar um SQL no arquivo MDB
$ echo "describe table table1" | mdb-sql database.mdb
Lista as tabelas
$ mdb-tables database.mdb
Depois dessa, MDB nunca mais!
Posted: fevereiro 9th, 2009 | Author: Carlan Calazans | Tags: aprendizado, dev, ruby | 6 Comments »
A (PC)² consultoria lançou um serviço chamado Cep Livre a algumas semanas atrás. O serviço tem por objetivo fornecer informações sobre CEPs brasileiros. O funcionamento é similar aos serviços já existentes, você faz uma chamada em uma URL e recebe os dados em um formato que escolher (XML ou CSV). Acredito que não vai demorar para fornecerem o formato JSON já que ele é amplamente utilizado hoje em dia, inclusive em aplicações móveis (XML não pelo-amor-de-deus).
A diferença em relação aos serviços que conheço é a possibilidade de adicionar um CEP a base de dados preenchendo um formulário, ou seja, qualquer um pode fazer. Ah, o mais importante, o serviço é gratuito e a (PC)² consultoria afirma que não tem intenção de cobrar pelo serviço no website deles.
Agora a parte divertida. Fiz uma classe que busca as informações de CEP, faz o parser e apresenta em dois formatos: Array e Hash.
#!/usr/bin/env ruby
# 9/2/2009
# Carlan Calazans (carlancalazans at gmail.com)
require 'net/http'
require 'rexml/document'
class CepLivre
URL_CEP_LIVRE = 'http://ceplivre.pc2consultoria.com/index.php?module=cep&formato=xml&cep='
FIELDS = %w(tipo_logradouro logradouro bairro cidade estado_sigla)
def initialize(cep)
@cep = cep
get_data
end
def to_array
@result = []
process_a
end
def to_hash
@result = {}
process_h
end
private
def get_data
@data = Net::HTTP.get_response(URI.parse("#{URL_CEP_LIVRE}#{@cep}"))
raise "Connection error." unless @data.kind_of?(Net::HTTPSuccess)
@xml = REXML::Document.new(@data.body)
end
def process_a
FIELDS.each do |f|
field = REXML::XPath.match(@xml, "//#{f}").first
@result << field.text
end
@result
end
def process_h
FIELDS.each do |f|
field = REXML::XPath.match(@xml, "//#{f}").first
@result[f] = field.text
end
@result
end
end
# Array
puts CepLivre.new("29040-470").to_array
# Hash
puts CepLivre.new("29040-470").to_hash
[Update]
Faça o download da versão rexml e libxml-ruby.
Posted: fevereiro 6th, 2009 | Author: Carlan Calazans | Tags: aprendizado, dev, iphone, mac, objectivec | No Comments »
Quando falamos de String em Objective-C estamos nos referindo as classes NSString e NSMutableString. Como no C, Strings são basicamente um array de caracteres Unicode.

String Theory from xkcd.com
Por que duas classes?
A diferença entre elas é que uma é imutável ( NSString ) e a outra ( NSMutableString ) pode ser modificada. No entanto, é possível atribuir uma nova string em um ponteiro para a classe NSString. Dito isso, fica claro distinguir quando usar as classes mencionadas.
Abaixo temos pedaços de códigos com algumas (não todas) operações disponíveis.
// creation
NSString *firstName
= @"Carlan";
NSString *lastName
= [NSString string];
// or [[NSString alloc] init]
lastName
= @"Calazans";
char cStr
[15] = "An old C string";
NSString *cString
= [NSString stringWithCString
:cStr
];
NSMutableString *fullNameMutable
= [firstName mutableCopy
];
// interpolation
NSString *fullName
= [NSString stringWithFormat
:@"%@ %@", firstName, lastName
];
NSLog
(@"My name is: %@", fullName
);
printf("%s",
[fullName cString
]);
// basic operations
//[firstName appendString:@" Calazans"]; // wont compile
[fullNameMutable appendString
:lastName
];
[fullNameMutable lowercaseString
];
[fullNameMutable uppercaseString
];
[fullNameMutable capitalizedString
];
[fullNameMutable length
];
[fullName writeToFile
:@"/tmp/test.txt" atomically
: YES];
[fullNameMutable replaceString
:@"Carlan" withString
:@"Alan"];
NSRange r
= NSMakeRange
(0,
4);
// NSRange is not a class!
[fullNameMutable substringWithRange
:r
];
[fullNameMutable substringToIndex
:4];
[fullNameMutable substringFromIndex
:4];
NSMutableString *stringWithSpaces
= [@" my string " mutableCopy
];
[stringWithSpaces trimLeadSpaces
];
[stringWithSpaces trimTailSpaces
];
[stringWithSpaces trimSpaces
];
NSString *strA
= @"stringA";
NSString *strB
= @"stringB";
[string1 compare
:string2
];
[string1 caseInsensitiveCompare
:string2
];
NSString *splitMe
= @"carlan:calazans:29:brasileiro";
[splitMe componentsSeparatedByString
:@":"];
Procurei deixar bem poucos comentários para não sujar muito o código. Não fica tão complicado de ler por que o nome dos métodos já dizem o que eles fazem.
Posted: fevereiro 4th, 2009 | Author: Carlan Calazans | Tags: aprendizado, dev, mac, objectivec, ubuntu | No Comments »
Desde ontem estava tentando pegar o conteúdo de uma url qualquer e imprimir no console. Até que não é tão complicado comparando com Ruby ou Python. Minha maior dificuldade foi converter de NSMutableData para NSString. Também não sei por que cargas d’águas não está funcionando para todas as urls, a do google, por exemplo.
Estou gostando de Objective-C, mas sinto falta das facilidades de Ruby e Python, provavelmente por estar mais acostumado a elas. E é muito fácil se perder na chamada a métodos utilizando a sintaxe dos colchetes, pior se eles estiverem aninhados. Como estou programando utilizando o ubuntu a “dot-syntax” não está disponível, acredito que somente no Mac Os. É nessa hora que um bom editor de textos faz toda a diferença.
Pra quem se interessar, segue o código.
#import <Foundation/Foundation.h>
// 03-02-2009
// Carlan Calazans (carlancalazans at gmail.com)
//connection.h
@interface Connection
: NSObject
{
NSString *strUrl;
NSMutableData *myReceivedData;
}
-(void) initialize;
@end
//connection.m
@implementation Connection
-(void) initialize
{
NSLog
(@"Started...");
strUrl
= [NSString stringWithFormat
:@"http://carlancalazans.com"];
NSLog
(@"URL: %@", strUrl
);
myReceivedData
= [[NSMutableData dataWithContentsOfURL
:[NSURL URLWithString
:strUrl
]] autorelease
];
NSLog
(@"Received %d bytes of data.",
[myReceivedData length
]);
NSString *content
= [[NSString alloc
] initWithData
:myReceivedData encoding
:NSUTF8StringEncoding
];
NSLog
(@"Content received: %@", content
);
NSLog
(@"Finished...");
[content release
];
}
@end
//main.m
int main
(int argc,
const char *argv
[])
{
NSAutoreleasePool *pool
= [[NSAutoreleasePool alloc
] init
];
Connection
*con
= [[Connection alloc
] init
];
[con initialize
];
[con release
];
[pool release
];
return 0;
}
Posted: janeiro 29th, 2009 | Author: Carlan Calazans | Tags: dev, iphone, mac, objectivec, ubuntu | No Comments »
Após ter lido alguns how-to’s aqui e ali, resolvi testar. Segui os seguintes passos:
sudo apt-get install gnustep gobjc gnustep-make libgnustep-base-dev
gnustep-netclasses gnustep-dl2
sudo chmod +x /usr/share/GNUstep/Makefiles/GNUstep.sh
Editei o ~/.bashrc e adicionei no final do arquivo:
#gnustep
GNUSTEP_ROOT=/usr/share/GNUstep
export GNUSTEP_ROOT
source $GNUSTEP_ROOT/Makefiles/GNUstep.sh
E agora eu consigo fazer isto:
dog.m
#import <Foundation/NSObject.h>
#import <stdio.h>
// 29-01-2009
// Carlan Calazans (carlancalazans at gmail.com)
// dog.h
@interface Dog
: NSObject
{
// instance variables
}
-(void) bark;
-(void) eat;
-(void) chaseCat;
@end
// dog.m
@implementation Dog
-(void) bark
{
printf("Ruff, ruff, ruff...\n");
}
-(void) eat
{
printf("Im hungry, i love dog food.\n");
}
-(void) chaseCat
{
printf("I think i saw a pussy cat.\n");
}
@end
// main.m
int main
( int argc,
const char *argv
[] )
{
Dog
*zorro
= [[Dog alloc
] init
];
[zorro chaseCat
];
[zorro bark
];
[zorro eat
];
[zorro release
];
return 0;
}
Compilar com o gcc e rodar
Posted: novembro 17th, 2008 | Author: Carlan Calazans | Tags: aprendizado, curso, pesquisa, ruby, ruby learning | No Comments »
Ruby Learning é um website que oferece cursos baseados em Ruby online, em inglês. O curso em si é muito divertido e muito bem feito para ser um curso online e de graça, até os exercícios são bem bolados. Há a possibilidade dos alunos se interagirem uns com os outros através de fóruns e com os Assistentes de professor, que nada mais são do que alunos mais experientes. O conteúdo de um lição é liberado todo o Sábado, o aluno tem a semana inteira para estudar e fazer os exercícios, é bem tranquilo. Outro incentivo é que o curso é curto, ou seja, tem duração de somente 2 meses.
Aproveitando, o Satish criou uma pesquisa para a criação de novos cursos. O Ruby Learning já tem algumas sugestões e deseja saber o que a comunidade pensa sobre isto. Portanto, citando o Satish em seu blog:
We’re rapidly expanding our course offerings here at RubyLearning, trying to keep up with the enormous and ever-growing interest in Ruby. But we need your YOUR help because, as you know, Ruby is a big subject, and we’d like to be sure to focus in on the areas of most interest to you. (link para a pesquisa).
Posted: novembro 12th, 2008 | Author: Carlan Calazans | Tags: clockingit, dev, gerencia, timetracker, trabalho | 2 Comments »
Clocking it é um aplicativo para gerência de projetos que tenho utilizado com o pessoal do trabalho. Em comparação com o dot project e o redmine, é o que eu mais gosto. Me sinto muito a vontade utilizando ele no meu dia-a-dia e já estou usufruindo dos benefícios, no meu caso é sair com a cabeça limpa do trabalho e ir pra casa sem preocupações e com o bolso/mochila sem as milhares de anotações em papel. Uma curiosidade, o clocking it e o redmine, foram desenvolvidos em Rails, o framework da moda (não se engane com a minha forma de me expressar, eu também o utilizo).
Uma coisa que acredito ser primordial para o meu tipo de trabalho, desenvolvimento de software, é um time tracker ou gerenciador de tempo, como preferir. Com um aplicativo deste instalado na máquina, acabou aquelas anotações em papel ou em editor de textos com informações sobre aquilo que você está trabalhando no momento. Nada contra quem gosta de papel, mas eu não gosto, não combina comigo. Como desenvolvedor, eu tenho a necessidade de aplicativos (ou scripts) mais simples (fáceis de usar) e que simplifiquem o meu trabalho, tanto na empresa quanto em casa.
Voltando ao assunto do gerenciador de tempo, isto me deixava muito frustrado. Tentei alguns aplicativos, foram úteis por um período de tempo, mas eu me dei conta que estava trabalhando com 02 softwares: um para gerenciamento de projetos e outro para gerenciamento de tempo.
Comecei a pesquisar a forma de juntar estas duas ferramentas em uma só, na época o time tracker do redmine não era exatamente o que eu estava procurando. A coisa boa era que o código estava disponível, mas eu estava engatinhando em Ruby e em Rails, nem tinha feito o curso do Ruby Learning e nem era um Assist. Teacher como hoje. Após muita pesquisa, encontrei o clocking it.
Acho muito bacana o esquema de time tracker dele, onde o desenvolvedor pode simplesmente dar um play em uma tarefa, um pause para o café e pode também terminar o seu dia de trabalho ou simplesmente fechar a tarefa em que estava trabalhando. O tempo vai sendo contado e você não precisa mais se preocupar com ele, seu foco fica na tarefa ou nos comentários ao fechá-la. E como se não bastasse, tem outras funcionalidades muito úteis como: wiki, chat, fórum, relatórios e etc ( mais aqui ).
O tempo de adaptação no sistema é extremamente curto. Esta semana lançaram dois screencasts (primeiro e segundo), em inglês, explicando o básico do sistema. Por enquanto estou utilizando o serviço gratúito disponilizado pelo site, mas já estou pensando em instalar ele em um dos servidores da empresa.