Recent blog entries for acs

Hello, advogato

Well, after a long time I’ve seen that Advogato site has returned and I return too with this post!!! I’ve trying again make more posts here

See ya!!!


Syndicated 2013-06-10 20:10:09 from Jumpi's Notepad

Testando a aplicacao em um iPhone/iTouch com Jailbreak sem o certificado da Apple


Well, aqui estou eu de volta, postando sobre um problema que já tive no passado e devido a escassa documentação e inclusive, hoje me deparei com a mesma pergunta que fiz no passado em uma das listas na qual participo.

“Eu tenho um device (iPhone/iTouch) com jailbreak, porem eu quero testar as minhas aplicacoes que desenvolvi com tanto suor no XCode diretamente no device, afinal de contas, estou cansado de testes no simulador, no simulador tudo funciona, tudo e tao simples, eu quero mesmo e testar no Hardware!!! “comofas”??

Simples, porem nem tanto, por isso que criei uma lista passo-a-passo de como executar essa tarefa tao árdua!!!

1) Certificar-se de que você tem o SSH instalado e habilitado para poder jogar a partir do SCP a sua aplicação, como fazer isso??? Basta acessar o cydia que tem um guia passo-a-passo de como fazer

2) Usar o xcode para compilar a sua aplicação, lembrando-se de alguns fatores importantes

– Mudar para Device
– Observar a versão (2.2, 2.2.1 ou 3.0), lembrando que tem que ser a mesma versão que esta rodando no seu iPod/iPhone
– Decidir se quer em modo debug ou release, como você não vai poder debugar no device dessa maneira, recomendo compilar em release

3) O xcode vai acusar erro porque você não possui o certificado, porem não se preocupe, basta seguir os passos abaixo:

- Acessar o diretorio_da_sua_aplicacao/build/Debug-iphoneos ou diretorio_da_sua_aplicacao/build/Release-iphoneos
- Verificar a existência do arquivo com o nome_da_sua_aplicacao.app

4) Eu costumo dentro do device, ate por organização e recomendação da grande padroeira dos usuários/desenvolvedores de aplicações em modo de jailbreak Erica Sadun, realizar os seguintes passos:

- Acessar o device: ssh root@ip_do_device (ele vai pedir a senha, caso não tenha mudado, 99% das pessoas não mudam, ela sera alpine)
- Criar um diretório dentro de /var, por exemplo, crio um /var/Applications para jogar os meus testes la, portanto se quer seguir o meu conselho, antes acesse o device e crie um diretório dentro de var: mkdir /var/Applications

4) Mas Alan, eu não sei como eu verifico qual o IP do meu device para acessar??? O que eu faco??? Well, vou passar aqui 2 formas de como realizar essa tarefa

- Instale o programa bossprefs, ele esta disponível no seu repositório Cydia, ele e bem interessante pois permite controlar diversas coisas e ate mesmo dar um reboot no springboard, passo necessário para reconhecimento da nossa aplicação
- Tente acessar via settings ou preferencias – wi-fi – e clique na rede que você estiver conectado, vai ter o IP Address la, basta anotar

5) Então agora, já sabemos onde esta a aplicação, já criamos o diretório e temos o IP, hora de copiar o app para o device, você vai fazer agora um scp para o seu device (iPhone/iTouch) da seguinte maneira: scp sua_aplicacao.app root@ip_que_detectamos:/var/Applications e ele vai pedir a senha, como quase 99% dos usuários não modificam a senha, a senha default e alpine… acredito que eu já havia dito isso la em cima, não??? :D

6) Agora hora de acessar o device, voce vai dar um ssh no seu device, e executar as seguintes tarefas:

– Seguindo o primeiro item do passo 4, voce vai dar um ssh e acessar a pasta /var/Applications
– Agora você vai dar um ls para ter certeza de que a aplicação que você copiou esta la, ela esta la?
– Se sim, vamos agora criar uma “assinatura fake”, para isso você vai usar o programinha ldid que gera uma assinatura fake na sua app: ldid -s sua_aplicacao.app

7) Terminadas as verificações e assinaturas, hora de acessar a pasta /Applications, verificando o conteúdo dela, você vai perceber que existem varias aplicações nessa pasta, agora e hora de acrescentar a sua também, ai você pode me perguntar, mas Alan? A gente já não copiou para o /var/Applications, e eu te respondo, sim, porem agora e que vem o pulo-do-gato, lembra das aulinhas de linux/unix??? do tal do ln para criar link simbólico ??? Exatamente ele que você vai utilizar agora: ln -sf /var/Applications/sua_aplicacao.app .

Pronto, ele vai criar um link simbólico para a sua aplicação no diretório de leitura do springboard. Quem e o springboard??? E o cara que gerencia todas as suas aplicações ai no seu “mobile desktop”…

8 ) Mas Alan, o que acontece que a minha aplicação ainda não apareceu no springboard??? E que agora tem uma coisinha básica, o springboard não e plug-in-play, ou seja, você tem que dar um restart no menino, existem 2 formas de se fazer isso,

- Ou você instala uma app que faz isso, eu por exemplo utilizo o Respring que se encontra no cydia
- Ou então você reboota o seu iPhone/iPod.

9) Apos o restart, você vai perceber que a sua aplicação aparece na tela e agora e só executar!!!! :D

E com esses passos, enfim, agora da testar a aplicação que você acabou de desenvolver em um aparelho com jailbreak efetuado e sem pagar pelo certificado da apple… :D

Ta vendo só??? Se você não fosse tao pão-duro, compraria o certificado da Apple por apenas 99 doletas e não passaria por esse parto, pois o XCode faria tudo para você, só faltaria o cafezinho básico… :D

Espero ter ajudado na sua diversão, lembrando que qualquer falha de sua parte, não e de minha responsabilidade,

Abraços e ate a próxima !!!

Syndicated 2009-08-21 05:28:28 from Jumpi's Notepad

Visualizing Floats


Continuing the posts about data types and your characteristics, I read a nice article about Floating point numbers published by gamasutra:

http://www.gamasutra.com/view/feature/1965/visualizing_floats

See ya!!!

      

Syndicated 2009-01-14 15:50:50 from Jumpi's Notepad

Numeros complexos vs NaN (Not-a-Number)


Lendo uma thread em uma lista de discussão que acompanho, surgiu uma duvida bem interessante sobre NaN e em uma das mensagens me deparei com a seguinte afirmação.

“Números imaginários são um exemplo, sqrt (-1) retorna NaN. Outro é dividir zero ou +/- infinito por zero.”

Vamos analisar essa frase começando pelo fim.

De acordo com a IEEE 754, se eu tenho uma variável a = 0 e divido a mesma por 0, vai dar um NaN, porem se eu tenho em a um valor positivo que tende ao infinito, o valor vai ser positivo e se o valor de a for negativo, logo essa divisão vai resultar em um valor negativo.

Ok, até aqui nenhuma objeção, tudo nos conformes. Porém, porém… agora vamos a primeira afirmação.

“Números imaginários são um exemplo, sqrt (-1) retorna NaN.”

Ooopss…. Sinto que houve um equivoco ai, pois não foi definido pelo autor da frase em qual conjunto numérico ele está trabalhando, penso que ele se limitou a qualquer conjunto no qual sqrt(-1) realmente não tem solução (Q, R, Z…), porém, existe também o conjunto dos complexos e nesse conjunto, existe solução para sqrt(-1). E vamos provar isso utilizando o nosso velho amigo C++, pois ele possui uma classe/template por padrão que trabalha com números complexos usando tipos de ponto flutuante, ou seja, utilizando o nosso amigo, podemos provar que existe sim solução para sqrt(-1) no campo dos complexos

Listarei logo abaixo um código simples que demonstra a nossa teoria em C++, ou seja, provar que existe sim resposta para sqrt(-1) e que ela é diferente de NaN

(jumpi@Painkiller:~)$ vi complex.cpp


#include <iostream>
#include <complex>

using namespace std;

int main(int argc, char **argv)
{
    complex<float> res = sqrt(complex<float>(-1));
    cout << res << endl;
    return(0);
}

(jumpi@Painkiller:~)$ ./complex
(0,1)
(jumpi@Painkiller:~)$

Antes recapitulando, a forma geral de um numero complexo no seu plano obedece a forma a + b*i, onde a representa o numero real e b um numero imaginário, ou seja, o retorno do tipo complex em C++ retorna as coordenadas de um numero complexo no plano.

No nosso caso, substituindo na fórmula, teremos a + b*i == 0 + 1*i que equivale a i.

Vamos fazer o teste para confirmar?? Utilizando o google, sim… o google, pois a busca serve como uma excelente calculadora e vai nos ajudar com a prova, digite sqrt(-1), qual a resposta??? Sim… sim… sqrt(-1) equivale a i, mesmo resultado apresentado pelo nosso simples programinha em C++.

Q.E.D.

Logo, sqrt(-1) = i e não um NaN conforme foi dito na thread.

Essa foi apenas uma demonstração de que não podemos esquecer da base matemática para formular uma resposta, principalmente no que envolve recursos que podem ser representados pela linguagem.

Maiores informações podem ser encontradas nos seguintes sites:

Wolfram Complex Number
Wolfram Complex Plane
C plus plus complex reference

      

Syndicated 2009-01-06 03:45:04 from Jumpi's Notepad

When SHA-3 collides


Caramba…

Não sei se todos os leitores sabem, porém, o NIST esta fazendo um campeonato para promover um novo algoritmo de hash para incorporar o padrão SHA-3 e já temos algumas submissões de algoritmos de hash, para ser mais exato, 64 submissões ate o presente momento, sendo que algumas das submissões podem ser encontradas aqui.

Bizarro isso, em 2 papers/prototipos postados para o novo padrão SHA-3, 2 já foram quebrados… isso mesmo!! Colisões já foram encontradas… no Sgàil e no WaMM e o mais engraçado é que no caso do Sgàil, foi o próprio autor que conseguiu detectar a colisão no hash.

Seguem os links para quem estiver interessado em mais detalhes:

WaMM Collision e Sgàil Collision e as respectivas propostas do WaMM e do Sgàil.

Para quem curte, vale a pena dar uma olhada nas propostas, até mesmo nas que já foram quebradas e em seus protótipos de implementação.

Ate a próxima…

      

Syndicated 2008-11-06 18:07:35 from Jumpi's Notepad

Atalhos no MacOS X


Hail pessoas,

Conforme prometido, estou voltando a postar aqui novamente

Dessa vez o post vem para abrir uma nova seção em meu blogue, que e a seção apple e vem com algo que acredito que assim como tem enorme utilidade para mim, também vai ter para outras pessoas.

Bem, vamos ao que interessa, todos que mexemos constantemente com o computador, adoramos atalhos de teclado, pois eles otimizam e facilitam muito a vida da gente quando aprendemos, correto??? Enfim… estarei aqui postando alguns atalhos que acredito que sejam uteis no MacOS (sistema que eu utilizo no dia-a-dia)

Enfim, vamos as explicações básicas, e que tinha muitas duvidas no comeco de tudo

⌘ = Command, e como se fosse a tecla windows do seu PC, sim… aquela com o desenho da janelinha.
⌥ = Option ou Alt.
⇧ = Shift
^ = Control

E agora segue a lista com os atalhos básicos e que eu frequentemente utilizo no meu dia-a-dia.

⌘ + Q = Sai da aplicação

⌘ + W = Fecha a janela
⌘ + O = Abre um arquivo

⌘ + P = Imprime

⌘ + C = Copia (o CTRL+C do mac)

⌘ + V = Cola (o CTRL+V do mac)

⌘ + X = Recorta

⌘ + S = Salva

⌘ + Z = Desfaz a ultima alteração
⌘ + A = Seleciona todo o texto

⌘ + Y or Space = Quicklook

⌘ + Tab = Alterna entre as janelas

E para completar esse post, criei uma lista simples, porem usual em pdf a partir desse post que estarei disponibilizando aqui no rapidshare

Ate a próxima!!! :D

      

Syndicated 2008-10-21 13:38:15 from Jumpi's Notepad

Quinto Encontro de Programadores C/C++ Brasil


Olá pessoas,

Após muito tempo ausente, resolvi atualizar esse blogue…

Bem… posso dizer que foi uma ausência significativa, afinal de contas, aconteceram diversas coisas que não me deixaram ter mais tempo para atualizar esse blogue…

Enfim… vamos deixar de “chorumelas” (será que e assim que escreve isso???) e vamos ao que interessa…

Ontem tive um dia bem divertido, ao lado de grandes amigos programadores de C e C++, sim… fui em um evento muito legal na Microsoft, onde só tinham caras muito bons e pessoas de altíssimo nível palestrando e nesse post irei fazer um pequeno resumo do que foi o nosso encontro.

Logo pela manha, tivemos a abertura com o Otavio Pecego da Microsoft que deu uma boa introdução sobre a sua experiência e seu contato inicial com C e C++ e foi ilustrando toda a sua caminhada com os livros que foram importantes na jornada… inclusive, ate peguei algumas sugestões como o livro do John Lakos e o livro do Plauger de STL que eu não conhecia, tenho o C Standard Library que gosto muito… :D

Em seguida, foi a vez do Rodrigo Strauss, um velho conhecido da comunidade falar sobre as ferramentas utilizadas por ele para facilitar o processo de programação e detecção de problemas, ele comentou desde as ferramentas da sysinternals ate o windbg, tirando os problemas que ocorreram com o microfone (dizem que foi sabotagem dos programadores C#) a palestra foi muito produtiva, principalmente para o pessoal que era mais iniciante.

Depois tivemos uma verdadeira aula de Concepts com o Leandro, enfim, posso dizer que já havia tentado ler o livro do Alexandrescu e quando vi isso, fiquei meio aterrorizado, porem, como o tempo era curto, não deu para o palestrante demonstrar tudo o que sabia sobre o assunto, enfim, percebi que preciso ler e dar uma pesquisada melhor nisso.

Well… hora do almoço… e logo apos o mesmo, tivemos uma palestra bem diferente e interessante com o Felipe Almeida, que nos falou sobre Linguagens Embutidas em C++, confesso que a palestra foi bem interessante, porem, achei o exemplo meio que inusitado para a ferramenta especificada, mais enfim… e bom saber que existe esse tipo de coisa na boost…

Depois foi a vez do “meu irmão” a.k.a. Fabio Galuppo dar uma palestra sobre C++ Nativo no Windows Vista e Server 2008 e mostrar coisas bem legais como NTFS Transacional e Thread Pools… e claro, se tratando do nosso amigo Galuppo, não poderia terminar sem o interop de C++, porem, um assunto que muito me interessa e que ele tratou na palestra e que me fez correr atrás das palestras do Gamefest, afinal, já tinha guardado o link aqui e não tinha visto, foi o lance do PPL (Parallel Pattern Library) que e a nova lib de paralelismo que substitui a antiga TPL. Isso pareceu ser bem interessante… :D

E para terminar o set de palestras com chave de ouro, foi a vez do nosso amigo e grande colaborador do grupo, Basílio Miranda falar sobre File Mapping no Windows em C++ e demonstrar exemplos interessantes sobre o assunto… :D

Em seguida, foi a vez dos lighting talks onde o Andre e o Lamarão falaram sobre os seus respectivos projetos em conjunto com a comunidade, sendo que o foco principal foi a otimização da pixman pelo André e a convocação ao publico para trabalharmos em conjunto.

Logo após, houveram os sorteios e dessa vez quem levou a premiação de ajuda a comunidade foi o Pedro Lamarão que ganhou o livro autografado do Sutter

E apos isso, fomos ao bar para poder dialogar sobre o que mais gostamos e um fato curioso foi que pela primeira vez, apareceu uma garota na nossa ida ao bar… sim!!! Para mostrar que nessa comunidade também existem mulheres!!! Porem, o fato mais interessante foi que compareceram varias pessoas novas e as mulheres dessa vez estavam em um numero bem admirável no evento, espero que aumente ainda mais e que as mulheres realmente mostrem a sua forca e parem com esses bla-bla-bla e autopromoções… :D

Enfim, que venha o próximo encontro… que vai ser o encontro de Embarcados…

See ya in the next event!!! :D

      

Syndicated 2008-10-06 00:01:32 from Jumpi's Notepad

Mais Fibonacci: Usando Memoize com map em C++


Há alguns dias atrás, novamente em uma discussão em um dos coffeetime que normalmente ocorrem na empresa, que por sinal são muito produtivas, estávamos eu e mais dois amigos programadores discutindo sobre a técnica de tail recursion, que ajuda bastante na otimização de funções recursivas, porem, estava matutando e me lembrei que existe uma outra técnica, também muito utilizada, principalmente em programas que exigem recursividade e implementam Programação Dinâmica, que é a técnica do “Memoization”.

Mais, resumindo, o que seria esse tal de memoization??? como a própria palavra diz, memoize e um termo que deriva do latim memorandum, ou seja, relembrando, exatamente como essa técnica faz, ela armazena em cache as chamadas de função que são repetidas em varias vezes, economizando assim um tempo precioso no acesso dessas informações.

Exemplos clássicos de demonstração dessa técnica são as implementações recursivas de Fibonacci e calculo de fatorial, no nosso caso, iremos utilizar Fibonacci, por estarmos mais familiarizados com essa função nesse humilde blog.

Suponha, que temos uma implementação recursiva de Fibonacci:

int fib( int n )
{
   if ( n <2 )
     return 1;
   else
     return fib( n - 1 ) + fib( n - 2 );
}

Implementaremos o memoization nessa função, utilizando uma implementação com map da seguinte maneira:

std::map<int,int> resultado;
int fib( int n )
{
  if ( n == 0 || n == 1 )
    return 1;
  std::hash_map<int,int>::iterator it = resultado.find( n );
  if ( it != resultado.end() )
    return it.second;
  else
    return resultado[ n ] = fib( n -1 ) + fib( n - 2 );
}

Ou seja, na primeira vez que esse código for executado, por exemplo, para um fib(4), ele vai ter que calcular respectivamente o fib(2) e fib(3), porem, quando eu chamar um fib(5), como os resultados anteriores ja estarão armazenados no map e o valor será retornado sem nenhum calculo adicional, e com isso, teremos um bom ganho no tempo de execução.

Esse pode ser um recurso muito útil quando estamos lidando com algoritmos que lidam com recursividade, onde a programação dinâmica pode ser aplicada, como por exemplo, uma multiplicação de cadeia de matrizes, um alinhamento de sequência ou ate mesmo um algoritmo de otimização para busca em arvores binárias.

Syndicated 2008-01-23 16:49:13 from Jumpi's Notepad

O Python e a sua misteriosa otimização de chamada de função


Continuando a saga de Fibonacci, eu e meu amigo Marcio fizemos algumas correções e tcharam… devo reconhecer… o script python quando faz chamada de função consegue ser incrivelmente mais rápido que o script perl, também fazendo chamada de função. Porem descobrimos uma coisa muito bizarra e que nos chamou a atenção enquanto realizávamos os testes e por isso foco a minha atenção em relação ao teste feito com python…

Rodando o seguinte código, feito inline em python:

#!/usr/bin/python
for i in range(1000000):
a, b = 0, 1
for j in range(71):
a, b = b, a+b
return b

Profiling do código com chamada de função:


alan@desenv:~$ python -m cProfile fibo.py
1000005 function calls in 86.083 CPU seconds
Ordered by: standard name
ncalls tottime percall cumtime percall filename:lineno(function)
1 0.000 0.000 86.083 86.083 :1()
1 57.280 57.280 86.083 86.083 fibo.py:7()
1 0.000 0.000 86.083 86.083 {execfile}
1 0.000 0.000 0.000 0.000 {method ‘disable’ of ‘_lsprof.Profiler’ objects}
1000001 28.802 0.000 28.802 0.000 {range}

E agora o mesmo código, só que realizando chamada de função:


#!/usr/bin/python
import sys
#import psyco
def fib(n):
a, b = 0, 1
for j in range(n):
a, b = b, a+b
return b

x = int(sys.argv[1])
y = int(sys.argv[2])
for i in range(x):
fib(y)

Profiling do código com chamada de função:


alan@desenv:~$ python -m cProfile fibo.py
2000005 function calls in 35.174 CPU seconds
Ordered by: standard name
ncalls tottime percall cumtime percall filename:lineno(function)
1 0.000 0.000 35.174 35.174 :1()
1 4.785 4.785 35.173 35.173 fibo.py:6()
1000000 25.671 0.000 30.327 0.000 fibo.py:6(fib)
1 0.000 0.000 35.174 35.174 {execfile}
1 0.000 0.000 0.000 0.000 {method ‘disable’ of ‘_lsprof.Profiler’ objects}
1000001 4.718 0.000 4.718 0.000 {range}

Ou seja, tirando o tempo de overhead do profile, o programa que realiza a chamada de função, consegue ser incrivelmente mais rápido que o programa inline, mesmo efetuando mais chamadas.

Bem… achei isso muito bizarro, sendo que, teoricamente o esperado era que o inline fosse mais rápido. Bem, se alguém puder me explicar isso eu agradeço bastante, pois a única conclusão que consegui tirar ate aqui, e que o python, mesmo sem usar otimizadores, vide psyco, já tem uma otimização natural de funções, o que torna as chamadas de função extremamente rápidas, porem eu queria entender essa otimização de chamada de funções, pois gostei bastante e fiquei interessado em saber como tal feature funciona.

E agora a minha conclusão em relação ao que eu aprendi com esse teste ate aqui, se você precisa fazer um programa bem rápido para testar qualquer coisa, use perl, resolve na maioria dos casos, agora se você precisa de um teste mais elaborado, com chamada de função, vou começar a pensar em usar o python…

Syndicated 2008-01-11 03:06:23 from Jumpi's Notepad

Fibonacci Series Test (Perl and Python)


Post in portuguese about my tests with Fibonacci Series using perl and python…

Esses dias, para ser mais exato, na segunda-feira, o meu colega de trabalho marcio a.k.a. tio estava falando sobre a sua escolha para criar um projeto de site que ele esta fazendo e para testar ele implementou o algorítimo de Fibonacci usando C, C++, Ruby e Python e mediu o tempo utilizando o comando time… C e C++ entraram na lista so para ele poder criar um parâmetro. E então ele decidiu escolher pelo python devido ao tempo, porem, ele esqueceu do nosso velho amigo Perl e eu disse a ele que perl executava o mesmo teste mais rápido que python e ele me desafiou, ou seja, estou fazendo esse teste para demonstrar que o nosso velho amigo perl pode ser bom, lembrando que não sou um bom programador python, mais tentei deixar o código o mais próximo possível entre ambas as linguagens para que nenhum boi-corneta (como diria o meu amigo Caloni, gostei da expressão, por isso a utilizei aqui também) venha se espantar aqui…

Bem… para a realização desse teste, utilizei o meu laptop, um macbook com perl 5.8.8 e python 2.5.1 como podem ver abaixo:

[jumpi@Painkiller]~/Sources: perl -v
This is perl, v5.8.8 built for darwin-thread-multi-2level (with 1 registered patch, see perl -V for more detail)
Copyright 1987-2006, Larry Wall
[jumpi@Painkiller]~/Sources: python -V Python 2.5.1

Para fazer os testes, utilizei uma versão iterativa do algorítimo de Fibonacci (afinal de contas, poderia apelar para a recursiva, porem achei melhor utilizar essa para o teste), segue abaixo o código:

Em perl:

#!/usr/bin/perl  use strict; my $n = shift; my ($a,$b)=(1,2);

print "$a\n$b\n";

for(1..$n-2) {

  ($a,$b) = ($b,$a+$b);

  print "$b\n"

}

Em python:

#!/usr/bin/python import sys def fib(n):

 a, b = 0, 1

 for i in range(n):

 	print b

 	a, b = b, a+b n = int(sys.argv[1])

fib(n)

E executei ambos os códigos, fazendo 10000 iterações e medindo o tempo usando o comando time, onde obtive o seguinte resultado:

Em perl:

real	0m0.188s

user	0m0.054s

sys	0m0.047s

Em python:

real	0m10.778s

user	0m8.104s

sys	0m0.231s

Well… ai esta a prova, pelo que posso ver o nosso velho amigo rabugento perl terminou a sua tarefa em um tempo menor que o python, pelo que posso enxergar, 10x mais rápido???

Brincadeiras a parte, através desse teste simples, podemos perceber que o perl, mesmo estando ultrapassado na visão de muitos, ainda executa muito bem o serviço, logico que poderíamos utilizar n técnicas em ambas as linguagens. Porem, como eu disse no principio, tentei simplificar ao máximo para não criar vantagens para nenhum dos lados.

Hey tio, esse post vai em sua homenagem… se quiser, te ajudo a utilizar perl com catalyst para criar o site…

Brincadeirinha… ;D

Syndicated 2008-01-09 04:07:53 from Jumpi's Notepad

42 older entries...

New Advogato Features

New HTML Parser: The long-awaited libxml2 based HTML parser code is live. It needs further work but already handles most markup better than the original parser.

Keep up with the latest Advogato features by reading the Advogato status blog.

If you're a C programmer with some spare time, take a look at the mod_virgule project page and help us with one of the tasks on the ToDo list!