Tudo Sobre Nada

Áudio 3D

Este clip é um dos melhores exemplos de áudio 3D que já ouvi... não necessitando de mais do que uns simples auscultadores.

Praticamente todo o clip é o som de alguém a chocalhar uma caixa de fósforos enquanto se desloca de um lado para o outro e de cima para baixo.

Para melhores resultados, usar phones dos pequenos e desligar quaisquer efeitos sonoros que possam estar activos nos drivers da placa de som, caso contrário não se consegue um posicionamento perfeito do som, ou o efeito perde-se por completo.

Sim, mais Python!

Se precisarem de criar uma instância de uma classe cujo nome só será conhecido em run-time, mas assumindo que essa classe já foi importada de alguma forma, basta fazer:

instancia = globals()["NomeDaClasse"]()

RTFM

Acabei de passar mais de uma hora a tentar perceber porque é que uns cálculos que estava a fazer - a partir de dados contidos no /proc/stat - não estavam a dar certo...

Bastou um simples man proc para descobrir que afinal o formato dos dados não era bem como eu pensava.

Read The Fscking Manual!

Expressões geradoras em Python

Além das funções geradoras, o Python 2.4 disponibiliza outro tipo de geradores, as expressões geradoras. Estas são bem mais sucintas, e potencialmente mais úteis para filtrar listas.

Tomemos então uma lista aList, contendo inteiros aleatórios positivos e negativos. Para obtermos o somatório de todos os elementos positivos poderíamos fazer*...

s = sum(filter(lambda x: x > 0, aList))
print s

Mas... como a função filter() retorna uma nova lista, estamos a consumir memória desnecessariamente. Especialmente grave se a lista aList for muito grande.

Com uma expressão geradora nunca é criada uma nova lista, sendo esta substituída por um iterador que apenas retorna os elementos que verificam a condição dada. Assim, o mesmo resultado obter-se-ia fazendo...

s = sum(item for item in aList if item > 0)
print s

O que, usando funções geradoras, seria equivalente a escrever...

def positive(aList):
for item in aList:
if item > 0:
yield item

s = sum(positive(aList))
print s

Vá lá... toca a aprender Python. Se estão a usar Linux ou MacOS X já o devem ter instalado, se estão a usar Windows é só fazer o download...

Referências:



* A expressão "lambda x: x > 0" cria uma função anónima que aceita um parâmetro x, e retorna o resultado da expressão "x > 0".

Não dá não...

Para todos aqueles que esboçam um esgar de gozo sempre que se diz que uma máquina com Linux pode fazer o mesmo trabalho que uma firewall da Cisco ou da Checkpoint, deixo os seguintes números:

brick:~# iptables-save|wc -l
4207
brick:~# iptables-save|grep ^-A|wc -l
3072

Tudo isto gerado com a ajuda do FireHOL, que me permite manter a sanidade mental mesmo considerando que o ficheiro de configuração já tem uma dimensão bastante jeitosa...

brick:/etc/firehol# wc -l /etc/firehol/firehol.conf
1001 /etc/firehol/firehol.conf

Eles compram tudo, eles compram tudo...

Primeiro compraram a Innobase (que desenvolve o motor InnoDB), depois correram rumores de que estavam interessados em comprar a JBoss, e agora compraram a Sleepycat (que desenvolve o motor Berkeley DB).

Não sei bem qual é o objectivo que a Oracle pretende atingir com estas aquisições, mas não tarda nada controlam todos os backends (importantes) do MySQL...

[via: slashdot]

Quem não tem cão (performance)...

Parece que a AMD ganhou mais uma caixa de munições para usar no seu processo contra a Intel...

A Intel chegou a acordo com a Skype para que esta limite artificialmente o número máximo de participantes em conferências quando detecta um processador não-Intel. Assim, numa máquina com processador Intel dá para fazer uma conferência com 10 participantes, e numa máquina com um processador da AMD (por exemplo), não se pode passar dos 5.

Man... uma Microsoft já era suficiente, não precisávamos de outra...

[via: Mário Lopes]

AMD vs. Intel (virtualização)

Se querem saber em que pé estão as tecnologias de apoio à virtualização da Intel e da AMD, leiam este artigo:

E se querem saber o que diferencia a implementação da AMD, da implementação da Intel, leiam esta série de artigos:

A propósito, o VMware Server (beta) já está disponível para download...

Funções geradoras em Python

Para quem sabe alguma coisa de Python, os geradores não são propriamente uma novidade, mas mesmo assim não deixam de ser uma das funcionalidades mais interessantes desta linguagem.

def powers():
n = 1

while (1):
yield 2**n # um "return" que não termina a função
n += 1


if __name__ == "__main__":
i = powers()

for n in range(16):
print i.next() # 2 4 8 16 32 64 128 ...

Para todos os efeitos são apenas iteradores, mas permitem separar conceptualmente o percorrer dos valores gerados da forma como vão ser utilizados, o que permite até encará-los como ciclos infinitos, como se pode ver pelo código acima.

Python is fun!

Ora aqui está um aparelho interessante...

A Soekris fabrica uma série de pequenos PCs baseados em processadores Geode, que me parecem ser perfeitos para a tarefa de gateway/servidor caseiro. Não têm a capacidade de uma máquina baseada em mini-ITX, mas não necessitam de cooling activo (ventoínhas) e consomem apenas 5W, o que é positivo.

A versão mais interessante, o Soekris net4801 baseia-se num processador AMD Geode a 266MHz, com 128/256Mb de RAM. Tem ainda três interfaces Ethernet, uma tomada USB (1.1), uma slot CompactFlash, e uma interface IDE para discos de portátil. Não tem placa gráfica nem tomada para teclado, mas tem uma consola série.

O preço também não é muito mau, uns 300€ (com caixa e fonte de alimentação), o que me deixa com alguma vontade de comprar um brinquedo destes... :)

Referências:


Nice...

Estes vídeos estão mesmo impressionantes. Realmente as coisas não estão paradas no mundo dos gráficos em Linux...

Propriedades em Python

Não fazia ideia de que a forma de criar classes em Python normalmente descrita nos livros dava origem a classic classes, e que afinal existe outro formato de classes com algumas potencialidades extra, as chamadas new-style classes.

Uma destas potencialidades extra é a criação de properties - que permitem usar métodos "get/set" como se fossem atributos da classe.

class PropertiesExample(object):
def __init__(self):
self.value = 0

def setx(self, value):
self.value = value * 2

def getx(self):
return self.value

x = property(getx, setx)


if __name__ == "__main__":
p = PropertiesExample()
print p.x # mostra "0"
p.x = 3 # "x" é uma propriedade, e não um atributo
print p.x # mostra "6"

No código acima, PropertiesExample é uma new-style class simplesmente porque deriva da classe object, que é uma new-style class. Se não fizermos isto, não obtemos nenhum erro mas também não obtemos os resultados esperados, pois os métodos getx() e setx() nunca são invocados.

Para terminar, algures no futuro as classic classes deixarão de existir, mas aparentemente não antes do Python 3.0.

Referências:


Fábrica de rumores lança novo produto

Segundo esta notícia da C|Net, a VMware está a preparar-se para tornar gratuito o VMware GSX Server.

A confirmar-se, seria um passo interessante. O GSX Server é um produto intermédio, e com o aparecimento de ferramentas avançadas de administração para o Xen, vai ganhar uma concorrência ainda mais forte. Faz algum sentido colocá-lo como rebuçado para atrair clientes para a versão high-end, o VMware ESX Server.

Seja como for, para mim seria bom... No DQ temos uma máquina(*) a correr o GSX Server, e isto significaria upgrades de borla.

(*) Um dual-Opteron 242 (1.6GHz), com 4Gb de RAM, a correr 5 VMs (duas Linux e três Windows).

Actualização:

Segundo este artigo no The Register, é o novo produto VMware Server que será gratuito, e não o existente VMware GSX Server. Ainda segundo o The Register, o VMware Server poderá, eventualmente, vir a tomar o lugar da versão GSX.