Posted: novembro 13th, 2012 | Author: Carlan Calazans | Tags: aprendizado, bash, corre, dev, dica, mac, minecraft, rapidinha, script, ubuntu | No Comments »

Your token has already been used
No dia 12 de Novembro de 2012, o game Minecraft alcançou a quantidade de 8 milhões de cópias vendidas para PC. Na página da Mojang, foi dito que este número ultrapassou a quantidade vendida de alguns jogos como Wow, CS, Diablo 2 e etc. Realmente o game é muito legal e interessante (não se deixe enganar pelo gráfico ruim).
Agora vem a parte interessante. O seu criador Markus “Notch” Persson, respondeu a notícia da seguinte maneira:
69I960EHE0A4A0IVG0EHE02500R4R0G1T30PLJ00V6V0EHE0V1U01V10U5U0VGV0V4R
É óbvio que é uma resposta encriptada. Após algumas tentativas de decifrar o segredo, desisti. Embora, tenha ficado de olho em uma página do reddit onde algumas pessoas também estavam tentando descobrir o significado dos caracteres acima.
Hoje, enquanto estávamos trabalhando, meu amigo Léo, já tinha compartilhado o link acima com ele, me disse que tinham descoberto o segredo. A resposta leva a um arquivo .7z protegido por senha contendo 1000 gift codes para um jogo que está sendo desenvolvido pelo Notch há algum tempo. Trata-se do 0x10c.
É bem provável que todos eles já tivessem sido utilizados, mas eu gostaria de tentar recuperar pelo menos um. Para esta tarefa preparei um script em bash (bem porco) para ler os códigos de um arquivo em texto, logar na página da mojang e submeter os dados em um formulário para a obtenção de gift codes.
#!/bin/bash
#account.mojang.com
USERNAME="user"
PASSWORD="passwd"
# loga e armazena o cookie
curl -s \
--data "username=${USERNAME}" \
--data "password=${PASSWORD}" \
--cookie-jar session \
--cookie session \
--user-agent "Mozilla/5.0 (X11; U; Linux x86_64; en-US; ..." \
--location \
https://account.mojang.com/login
# obtem o auth token do campo hidden
curl -s \
--cookie session \
--cookie-jar session \
--user-agent "Mozilla/5.0 (X11; U; Linux x86_64; en-US; ..." \
--header "Keep-Alive: 300" \
--header "Connection: keep-alive" \
--location \
https://account.mojang.com/redeem -o redeem.txt
TOKEN=$(sed -n -e 's/<input type="hidden" name="authenticityToken" value="\(.*\)" />/\1/p' redeem.txt | tr ">" "\n" | tail -n 1 | tr -d " ")
# testa os gift codes
for l in $(cat codes)
do
echo "Testing $l"
curl -v \
--cookie session \
--cookie-jar session \
--user-agent "Mozilla/5.0 (X11; U; Linux x86_64; en-US; ..." \
--data "code=${l}" \
--data "authenticityToken=${TOKEN}" \
--header "Keep-Alive: 300" \
--header "Connection: keep-alive" \
--location \
https://account.mojang.com/redeem/validate >> resposta.txt
echo "Done."
done
Aproveito para compartilhar
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 | 8 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