Posted: abril 10th, 2009 | Author: Carlan Calazans | Tags: aprendizado, dev, dica, rapidinha, ruby, ubuntu | No Comments »
A Páscoa é uma data comemorativa que serve de referência para datas comemorativas móveis como Carnaval, Quaresma, Corpus Christ e outras. Por isso é importante saber quando a Páscoa vai ser comemorada. Além de interessante, serve como uma brincadeira para os garotos(as) de programa de plantão que não tem nada para fazer no feriado.
Cálculo
No total são três formas de calcular a data da Páscoa. A primeira é recorrendo a uma tabela, a segunda é através ao algorítimo de Gauss para o intervalo de anos que se inicia em 1900 e termina em 2099 e a terceira com o algorítimo de Meeus / Jones / Butcher. Como exemplo, optei pela segunda forma por ter umas condições e por ela ser mais elaborada. Para quem se interessar, os algorítimos serão relacionados no final deste texto.
#!/usr/bin/env ruby
require 'date'
FIELDS = %w{Carnaval Pascoa Corpus\ Christ}
ano = 2009 #change me
x = 24
y = 5
a = ano % 19
b = ano % 4
c = ano % 7
d = (19 * a + x) % 30
e = (2 * b + 4 * c + 6 * d + y) % 7
if (d + e > 9)
#april
dia = d + e - 9
mes = 4
#exceptions
dia = 19 if (dia == 26)
dia = 18 if (dia == 25 && d == 28 && a > 10)
else
#march
dia = d + e + 22
mes = 3
end
dt = Date.new(ano, mes, dia)
result = []
result << dt - 47
result << dt
result << dt + 60
FIELDS.each do |d|
puts "#{d}: #{result.shift.strftime("%d-%m-%Y")}"
end
Este texto tem uma pegadinha. Na verdade, meu intuito com ele não é ensinar Ruby nem mostrar como se calcula o dia da Páscoa. Foi uma forma que encontrei de mostrar como a linguagem chega perto do idioma, como poucas linguagens o fazem. Qualquer pessoa é capaz de entender as fórmulas matemáticas e relacioná-las com o exemplo mostrado. Sim, existe um açúcar, mas é fácil de entendê-lo também.
A maior parte do tempo, parece que estamos conversando com um editor de textos.
Referências:
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 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