Arquivos Mensais: março 2009

Da possibilidade de usar uma wiki

Esses dias estive pensando em usar uma Wiki ao invés de blag (quem lê xkcd vai entender :P). O motivo é simples: vejam meus últimos artigos, são textos expositivos, e não textos pessoais que precisem aparecer em uma ordem cronológica. Com uma Wiki eles estaria melhor categorizados, seria mais fácil de ligar as páginas entre si e… e é isso.

Existe uma segunda questão, que não é o blog em si, mas o wordpress.com (não o programa, o site). Com ele eu posso escolher temas já prontos de uma lista, mas não posso criar novos (nem usar CSS para alterar um já pronto). Também, com ele só posso fazer upload de certos tipos de arquivos (nada de .tar.gz, por exemplo).

Estando meio decidido a usar uma wiki, fui atrás de um site que hospedasse de graça e encontrei a wikidot.com , o tipo de site que faz você pensar “isso é bom demais para ser verdade”. Tenho hospedagem gratuita sem limite de banda ou de número de páginas. Tenho liberdade de alterar o layout como quiser, e posso fazer upload de qualquer tipo de arquivo. Tudo bem que tenho direito a apenas 300MB, e aqui no wordpress a 5GB, mas atualmente eu não passo de 1MB.

Além disso, eles facilitam a integração com o google analytics e o google adsense e permitem a instalação de um fórum! Como eu disse, parece bom demais para ser verdade…

Porém, existe o outro lado também. Não sei, por exemplo, como o google determina o idioma de uma página e se isso pode diminuir o número de pesquisas que chegam ao meu site. Outra questão é que alguns artigos meus já foram linkados de outras páginas, então eu perderia alguns poucos visitantes que chegam ao site assim. Por último, tem o trabalho de passar todo o conteúdo daqui para lá, o que seria um processo um tanto lento.

Não sei quantos acompanham o blog, mas se acharem que exista algum outro ponto que eu deva levar em consideração, pelo sim ou pelo não, comentem. Nem que seja para dizer ‘Vai lá! Te dou todo o apoio (moral)!’ ou ‘NÃÃÃÃÃÃOOO!!11’ :P.

O novo endereço é http://aleteia.wikidot.com

Publicidade

Derivadas e Lisp

Com algumas poucas linhas de código pode-se ter uma implementação de derivadas em Common Lisp. Claro que com tão pouco código não teremos a derivada em si, mas o valor dela para aquele x. Essa implementação serve como demonstração de como funções que retornam funções podem ser úteis.

Saiba mais

C: Calculadora (simples) com notação polonesa reversa

Analisando as estatísticas do blog, percebi que uma grande parte das pesquisas que caem aqui são sobre “implementação notação polonesa reversa”. Por isso, decidi mostrar como fazer uma em C, usando a biblioteca termios.h que eu mostrei no artigo anterior.

Ela é bem simples, trabalha com ints apenas e com as quatro operações básicas: adição, subtração, multiplicação e divisão. Quem estiver atrás de algo mais usável (para Linux), eu recomendo uma chamada “galculator”.

Saiba mais

C: Detectando eventos no terminal

O C por padrão apresenta algumas funções para entrada e saída de dados. Entre elas, as mais famosas talvez sejam printf() e scanf(). Elas funcionam bem na maioria dos casos e são portáveis.

Entretanto, quando nós sabemos qual será nossa plataforma de desenvolvimento, nós podemos sair um pouco dos padrões* para adicionar algumas funcionalidades, como faremos agora.

Digamos que um software esteja sendo desenvolvido (para o terminal) e que em um dado momento, o usuário deve escolher uma opção, alguma coisa parecida com isto:

Houve um erro na hora de executar asdf:
[R]epetir    [C]ontinuar    [A]bortar

Usando getchar ou scanf ou qualquer outra função da biblioteca stdio.h, a leitura será feita linha por linha. Por isso, mesmo que nós queiramos apenas um caractere, o usuário terá que apertar esse caractere e depois Enter.

Eu queria uma forma de fazer isso em que o usuário simplesmente digitasse ‘r’ ou ‘c’, enfim, apenas uma tecla. Pensei em usar ncurses até, mas achei essa solução exagerada, e além disso, como o ncurses faz isso?

Pensando nisso, cheguei à biblioteca termios.h (na verdade eu já a havia utilizado no meu programa de criptografia usando xor). E junto a ela, usaremos funções de leitura e escrita de mais baixo nível, read e write.

*Com isso, nós saímos dos padrões do C, mas continuamos dentro dos padrões POSIX.

Saiba mais

C: Escrevendo um daemon

Post curtinho só para mostrar como fazer um programa “soltar” o shell, indo para o background. Ou seja, como fazer um daqueles famosos daemons. A mágica mesmo acontece com o fork(), mas existe uma função determinada pelo padrão POSIX e presente no header unistd.h que torna o processo mais fácil.

Saiba mais

C: Usando Threads

Hoje comecei a ler o man pthreads e resolvi tentar criar um programa que fizesse uso delas. Dependendo do que será feito não há muitas complicações, apesar do que pode parecer. Os problemas surgem quando, por exemplo, uma thread depende do resultado de uma outra, que ainda não terminou.

De qualquer forma, só vou demonstrar o básico aqui, como criar uma thread e pegar o valor que ela retorna.

Saiba mais

Notas sobre optimizações II: Os resultados

Parte I: O código

A metodologia foi basicamente a mesma da primeira vez, um arquivo aleatório de 200.000 linhas que depois foi editado para conter a opção “message” em diferentes lugares do arquivo. A diferença que dessa vez eu usei um script para agilizar as coisas um pouco.

Saiba mais

Notas sobre optimizações II: O código

Creio que essa revisão do primeiro artigo sobre optimizações acabará ficando grande, por isso separei-a em algumas partes. Primeiro, o código, claro.

O script que usei para os benchmarks está no artigo anterior a este, e vamos usar patches algumas vezes. O código em si é aquele para ler arquivos de configuração, mas com algumas alterações. Além disso, eu usei aquele mesmo código do primeiro artigo para criar um arquivo de configuração aleatório.

Saiba mais

Fazendo Benchmarks em Python

Um pequeno script que fiz em python. Para usá-lo, rode:

python time-it.py <número de vezes> <comando>

Por exemplo, para a continuação do artigo sobre optimizações eu usei várias vezes alguma coisa como:

./time-it.py 5 ./tree example.cfg

Ele calcula o tempo que demorou para executar o comando e depois calcula uma média aritmética e uma média desconsiderando o valor mais alto e o mais baixo.

Saiba mais

C: Lendo arquivos de configuração

Esse é um programa mostrando como implementar a leitura de arquivos de configuração simples em C, com “variáveis” sendo criadas na hora. Foi esse o código que eu usei no artigo sobre optimizações e que acabou me surpreendendo por as listas serem mais rápidas que árvores binárias neste caso.

Talvez se na função main() nós realizássemos mais buscas, depois de um tempo as árvores começassem a ganhar, mas ainda sim, as árvores foram duas vezes mais lentas que listas.

Saiba mais