Month: January 2007

Finalmente Linux rodando no PSP da Sony

Um hacker chamado Chris Mulhearn conseguiu portar o uClinux (também usado no iPodlinux) para o PSP da Sony.
O cara criou um adaptador para ligar no conector que é usado para acessar o controle remoto, que normalmente vem com o PSP. A comunicação entre o controle remoto e o PSP é baseado no padrão RS232 porém ao invés de +12V e -12V utiliza 0V e +2.5V.

Então ele criou uma imagem do kernel do Linux mais o rootfs e carregou esta imagemn usando o próprio sistema de atualização do PSP, o bootloader do PSP carrega e executa este arquivo de imagem e envia a saída pela serial.

O porte está em fase inicial, mas já é possível acessar o terminal via serial, o próximo passo será criar os drivers para os demais periféricos do dispositivo.

Mais informações:
http://df38.dot5hosting.com/~remember/chris/

Gnopernicus falando português

Hoje em dia está se tornando comum o uso de computadores por deficiente visuais, porém estes recursos nem sempre estão disponíveis para todos, devido aos altos custo de equipamentos e softwares para este fim. Visando diminuir este hiáto a empresa Romena “Baum Engineering SRL” desenvolveu o Gnopernicus, que pode ser utilizado gratuitamente por qualquer usuário Linux.

O Gnopernicus é um software de tecnologia assistiva que permite a um deficiente visual utilizar o computador.
O programa possui suporte a dispositivos Braille, síntese de voz, entre outros recursos interessantes. Porém, até então o Gnopernicus só poderia ser utilizado por usuários de língua inglesa e de outras línguas suportadas pelo Festival ou por outro TTS comerciais.

O foco principal deste tutorial é explicar como integrar o festival em português com o Gnopernicus, para que deficientes visuais Brasileiros, ou de países de língua portuguesa, possam também usar computadores. Espero que este tutorial possa incentivar grupos de desenvolvedores a criar uma distribuição Linux customizada para deficientes visuais.

O Festival possui suporte ao idioma português graça a um projeto desenvolvido por professores e alunos da UFRGS, porém ele utiliza as ferramentas da OGI (http://cslu.cse.ogi.edu/tts) e portanto está submisso à licença OGI que é muito restritiva, sendo seu uso permitido apenas para uso acadêmico e uso pessoal. Qualquer outra utilização é considerado uso comercial.

Instalando o Festival em Português

Notas: A compilação do festival-1.95 com o gcc-3.x ou 4.x, g++-3.x ou 4.x gera erros de compilação, porém utilizando-se o gcc-2.95 e g++-2.95 pode-se compilá-lo corretamente.
Caso não tenha estas versões instale-as:
# apt-get install gcc-2.95
# apt-get install g++-2.95

E em seguida mude o link simbolico do gcc e g++ para usarem a versão 2.95:
# cd /usr/bin
# rm gcc
# ln -s gcc-2.95 gcc
# rm g++
# ln -s g++-2.95 g++

DOWNLOAD
Baixe os seguintes arquivos do site do Festival e do OGI:
http://www.cstr.ed.ac.uk/downloads/festival/1.95/festival-1.95-beta.tar.gz
http://www.cstr.ed.ac.uk/downloads/festival/1.95/festlex_CMU.tar.gz
http://www.cstr.ed.ac.uk/downloads/festival/1.95/festlex_OALD.tar.gz
http://www.cstr.ed.ac.uk/downloads/festival/1.95/festlex_POSLEX.tar.gz
http://www.cstr.ed.ac.uk/downloads/festival/1.95/festvox_kallpc16k.tar.gz
http://www.cstr.ed.ac.uk/downloads/festival/1.95/festvox_kedlpc16k.tar.gz
http://www.cstr.ed.ac.uk/downloads/festival/1.95/festvox_rablpc16k.tar.gz
http://www.cslu.ogi.edu/tts/download/data/OGIresLPC-2.0.7.tar.gz
http://www.cstr.ed.ac.uk/downloads/festival/1.95/speech_tools-1.2.95-beta.tar.gz

Baixe a arquivo de fonemas em português:
http://node1.nirvanix.com/e566Ah03~bUhklTTFPm~4qN817n4~nZwtbetzVY~MicwvaQ/FreeDrive/fd_61647/festival/festival_portuguese.tar.gz

DESCOMPACTAÇÃO

Crie um diretório para instalar o Festival(ex. /tts)

Entre dentro deste diretório e extraia todos os arquivos acima para o diretório que você criou:

# cd /tts
# tar zxvf /caminho/arquivos/festival/arquivo.tar.gz

CONFIGURAÇÃO

Edite o arquivo /tts/festival/config/config.in, acrescentando nas ultimas linhas deste
arquivo:

ALSO_INCLUDE += OGIcommon
ALSO_INCLUDE += OGIdbase
ALSO_INCLUDE += OGIresLPC
ALSO_INCLUDE += OGIinsert

INSTALAÇÃO
Entre no diretório /tts/speech_tools e execute:
# ./configure
# make

Entre /tts/festival e faça o mesmo:
# ./configure
# make

Testando

Entre no diretório /tts/festival/bin e execute o comando “./festival”.

Aparecerá o prompt <festival>, então digite: (voice_aga_diphone) <ENTER>

Faça um pequeno teste: (SayText “Olá Mundo Cruel!”)

Criando link
Entre em /usr/bin e crie um link simbólico para o festival:
# ln -s /tts/festival/bin/festival .

Modificando a libgnome-speech para suportar o festival em Português

Baixe o código fonte do libgnome-speech:
# apt-get source libgnome-speech3

Baixe o patch http://www.freedrive.com/files/8jzusx06weo80/gnome-speech-ptbr.diff

Aplique-o:
# patch -p0 < gnome-speech-ptbr.diff

Entre em gnome-speech-0.3.6 e compile, caso seu sistema não tenha o fakeroot instalado, instale-o antes:
# apt-get install fakeroot
# cd gnome-speech-0.3.6
# dpkg-buildpackage -rfakeroot -uc -b

Retorne ao diretório anterior e veja que o libgnome-speech3_0.3.6-1_i386.deb foi criado, então instale-o
# cd ..
# dpkg -i libgnome-speech3_0.3.6-1_i386.deb

Instalando o Gnopernicus

O Gnopernicus possui como dependência os seguintes programas:
cspi-1.0 (at-spi package)
gconf-2.0
gtk+-2.0
gtk -doc (opcional)
libglade-2.0
libgnome-2.0
libgnomeui-2.0
libxml-2.0
gnome-speech
gnome-mag (opcional)
festival

Das dependências acima apenas a at-spi não é instalada automáticamente pelo Debian, porém ela é necessária para que o suporte a voz do Gnopernicus funcione, portanto deve-se instala-la manualmente:

# apt-get install at-spi

Como nós instalamos o Festival a partir do código fonte, não devemos permitir que o Debian tente instalar o pacote Festival padrão que funciona apenas em inglês.

Vamos resolver isso criando um pacote festival vazio, vamos usar o equivs para isso:
# apt-get install equivs

Entre num diretório qualquer com permissão de escrita (ex. /tmp) e execute:
# cd tmp
# equivs-control festival

Edite o arquivo “festival” criado da seguinte forma:

Section: misc

Priority: optional

Standards-Version: 3.5.10Package: festival

Version: 2.0.0

Maintainer: Your Name <yourname@foo.com>

Pre-Depends:

Depends:

Recommends:

Suggests:

Provides: festival

Architecture: all

Copyright:

Changelog:

Readme:

Extra-Files:

Description: Festival local

long description and info

.

second paragraph

Agora crie o pacote festival:
# equivs-build festival

E instale:
# dpkg -i festival_2.0.0_all.deb

Pronto, agora podemos instalar o Gnopernicus:
# apt-get install gnopernicus

Execute o gnopernicus, vá em Preferências -> Síntese de Voz -> Vozes -> Editar Absoluto:
Driver do Mecanismo: Festival GNOME Speech Driver
Locutor do mecanismo: V2 Aga

Clique no botão “Forçar o driver e o locutor selecionados para todas as vozes”

Alan Carvalho de Assis
acassis@gmail.com

Interfaceando GTK + SNMP + Lintouch

Há algum tempo atrás fiz um programa para controlar um velocimetro no Lintouch, o objetivo era ter o servidor SNMP pegando dados de um programa visual (GTK) e enviando estes mesmos dados para visualização no Lintouch.

Como tudo que não é documentado se perde, resolvi discutir a implementação aqui.
O MIB é simples:

UFRGS-MIB DEFINITIONS ::= BEGIN

IMPORTS
MODULE-IDENTITY, OBJECT-TYPE, Integer32,
Counter32, IpAddress, enterprises FROM SNMPv2-SMI
MODULE-COMPLIANCE, OBJECT-GROUP FROM SNMPv2-CONF;
--
-- A brief description and update information about this mib.
--

ufrgs MODULE-IDENTITY
LAST-UPDATED "0104010000Z" -- 01 Apr 2001, midnight
ORGANIZATION "UFRGS"
CONTACT-INFO
" Author: Alan Carvalho de Assis
UFRGS, Departamento de Engenharia Eletrica
Av. Oswaldo Aranha
Porto Alegre
BRAZIL
email: acassis@gmail.com
tel: +55-051-3316-3561"

DESCRIPTION "MIB Agent for Baja-by-Wire"
::= { enterprises 12619 }

-- the meters group
meters OBJECT IDENTIFIER ::= { ufrgs 1 }
reserved OBJECT IDENTIFIER::= { ufrgs 2 }

--
-- The Speed (to speedometer)
--
speed OBJECT-TYPE
SYNTAX Integer32
MAX-ACCESS read-write
STATUS current
DESCRIPTION
"The speed variable."
DEFVAL { 0 }
::= { meters 1 }

--
-- The RPM (to tachometer)
--
rpm OBJECT-TYPE
SYNTAX Integer32
MAX-ACCESS read-write
STATUS current
DESCRIPTION
"The engine rotation variable."
DEFVAL { 0 }
::= { meters 2 }

--
-- The temperature variable
--
temperature OBJECT-TYPE
SYNTAX Integer32
MAX-ACCESS read-write
STATUS current
DESCRIPTION
"The engine temperature."
DEFVAL { 0 }
::= { meters 3 }

END

Na inicialização do MIB (init-ufrgs) eu crio uma área de memória compartilhada:

typedef struct {
int speed;
int rpm;
int temperature;
}meter;

#define SHM_SIZE 12  /* 12 bytes (meter struct size) */

static u_long speed;
static u_long rpm;
static u_long temperature;

meter *m;

void init_ufrgs(void)
{
static oid speed_oid[] = { 1,3,6,1,4,1,12619,1,1 };
static oid rpm_oid[] = { 1,3,6,1,4,1,12619,1,2 };
static oid temperature_oid[] = { 1,3,6,1,4,1,12619,1,3 };

key_t key;
int shmid;
int *data;
int mode;
FILE *f;


/* create the identifier file*/
if((f=fopen("/tmp/meter","w")) == NULL)
{
perror("fopen");
exit(1);
}

/* close it*/
fclose(f);

/* make the key: */
if ((key = ftok("/tmp/meter", 'R')) == -1) {
perror("ftok");
exit(1);
}

/* connect to (and possibly create) the segment: */
if ((shmid = shmget(key, SHM_SIZE, 0644 | IPC_CREAT)) == -1) {
perror("shmget");
exit(1);
}

/* attach to the segment to get a pointer to it: */
data = shmat(shmid, (void *)0, 0);
m = (meter *) data;

if (data == (int *)(-1)) {
perror("shmat");
exit(1);
}


DEBUGMSGTL(("ufrgs", "Initializing\n"));

}

E na requisição MODE_GET de cada variável lemos o valor que nos foi enviado pela aplicação GTK (discutida abaixo):

case MODE_GET:

speed = (u_long) m->speed;
snmp_set_var_typed_value(requests->requestvb, ASN_INTEGER, (u_char *) &speed, sizeof(speed));
break;

Na aplicação GTK abrimos a região de memória (mesmo código de init_ufrgs) compartilhada e escrevemos os valores lidos dos sliders:

void on_hscale1_value_changed(GtkRange *range, gpointer user_data){
gdouble vel;
vel = gtk_range_get_value(range);
m->speed = (int)vel;
}


void on_hscale2_value_changed(GtkRange *range, gpointer user_data){
gdouble rot;
rot = gtk_range_get_value(range);
m->rpm = (int)rot;
}


void on_hscale3_value_changed(GtkRange *range, gpointer user_data){
gdouble temp;
temp = gtk_range_get_value(range);
m->temperature = (int)temp;
}

Configurando placa Gigabit no Linux

A configuração da placa Broadcom NetXtreme BCM5705 Gigabit Ethernet no Linux é um processo simples.

Na configuração do kernel vá em “Device Driver” -> Ethernet (1000 Mbit) e marque a opção “Broadcom Tigon3 support”.

Compile o kernel normalmente, para carrega execute:

modprobe tg3

Pronto, pena que a rede aqui não funciona a 1Gigabit ainda 😦

Ubuntu fixando as interfaces de rede ao MAC

De repente você troca sua placa de rede e nada da Internet ou a rede funcionar. Você verifica os módulos, e vê que tudo está certo, mas nada da rede funcionar, o que será?

Simples, o Ubuntu criou um arquivo chamado /etc/iftab para associar as interfaces de rede ao seu número MAC, veja o conteúdo desse arquivo:

# This file assigns persistent names to network interfaces.
# See iftab(5) for syntax.
eth0 mac 00:50:BF:38:A1:0B arp 1

Se quiser sua nova placa de rede funcionando terá que adicionar o número MAC dela no lugar do MAC da placa de rede antiga.

Atualizacao: nas versoes mais novas do Ubuntu este arquivo foi alterado para um regra do sistema de hotplug, o arquivo em questão e’ /etc/udev/rules.d/70-persistent-net.rules

EXPRESSÕES IDIOMÁTICAS

Estas dicas foram retiradas do site English Home, pelo menos a grande maioria, algumas eu mesmo adicionei:

A:
An eye for an eye, a tooth for a tooth. = Olho por olho, dente por dente.
As busy as a bee. = Muito ocupado
As far as = tanto quanto
Assortative mating = acasalamento

B:
Be in for a treat = De deleitar, se surpreender
Be sure to… = Não deixe de…
Bend to threats = curvar às ameaças
Better lose the saddle than the horse. = vão-se os anéis, mas ficam os dedos.
Blood is thicker than water. = Os laços sanguíneos são mais fortes.
Bode ill = mau sinal, mau agouro
Bode well = bom sinal, bom presságio
Break a leg. = Boa sorte.
By the book = De acordo com as regras

C:
Care About. = Importar com alguém
Churn out = despejar
Come in handy. = Vir a calhar.
Cook the books = fraldar, alterar os registros de ganhos da empresa
Crowning achievements = conquistas, realizações
Cut to the chase = ir direto ao ponto

D:
Dark horse = azarão
Do without. = Passar sem
Don’t buy that! = Não caia nessa!
Don’t give me that! = Essa não!
Draw blood = tirar sangue
Drink like a fish. = Beber como um gambá

F:
Feel like. = Estar disposto a
Feel sorry. = Sentir muito, arrepender-se
Feel sorry for … = Ter pena de…
For a change. = para variar
From all walks of life = De todas as esferas da vida

G:
Get lost! = Desapareça!
Get out of my sight. = Saia da minha frente.
Give someone the cold shoulder. = Tratar alguém com pouco caso.
Go for a walk. = Dar um passeio
Goes haywire = dá errado

H:
had taken a liking to someone= tinha gostado de alguém
Hand over fist = “a rodo”, ganhando ou perdendo dinheiro em grande quantidade
Has a bone to pick with = ter uma reclamação ou uma queixa com alguém
Head Over Heels. = loucamente apaixonado, de ponta cabeça, confuso.
Help yourself. = Sirva-se
Hit the road. = Pegar a estrada.
Hurry on = Apressar

I:
I don’t give a damn = Eu não dou a mínima
I hope so. = Eu espero que sim.
I relate too much = Eu me identifico muito.
I think so. / I don’t think so. = Acho que sim. / Acho que não.
If you will = Se quiser
I’ll cheer you on = Eu irei torcer por você.
I’ll do my best = Farei o possível
I’m afraid not = Acho que não.
In effect = na realidade
In lieu of the = no lugar de / ao invés de
Inside out = do avesso
In spite of the = apesar de
In the short / long run. = A curto / longo prazo.
It’s up to you = Fica a seu critério
It’s not my business. = Não é da minha conta.
It’s raining cats and dogs. = Está chovendo canivete.
It’s a piece of cake. = É muito fácil.
I was dumbstruck = Eu fiquei pasmo
I was dumbfounded = Eu fiquei pasmo

J:
Jump in the lake! = Vá para o inferno!

K:
Keep yourself to yourself. = Fique na sua.
Kick the bucket. = Morrer, bater as botas.
Kill two birds with one stone. = Matar dois coelhos com uma cajadada só.

L:
Lay it on = dizer, explicar
Leave me alone. = Me deixe em paz.

M:
Make yourself comfortable. = Fique a vontade.
Mind your own business. = Não se meta.

N:
n-fold = n vezes (ex. 5-fold é 5 vezes)
needle in a haystack = agulha num palheiro
no matter what happen. = não importa o que aconteça.
no pun intended = sem trocadilhos.

O:
On the sly = Às escondidas
Opposite the = Em frente ao. (ex. The park is opposite the… = O parque fica em frente ao…)
Out of the blue. = De repente.

P:
Pay a compliment. = Elogiar

R:
Round (around) the clock = Durante 24 horas, disponível 24 horas.
Run an errand = executar uma missão
Runs rings around = é muito mais inteligente/melhor que a outra pessoa

S:
Sell like hot cake. = Vender muito.
Set an example. = Dar um exemplo.
Sets off = desencadeia
Sleep like a log = dormir como uma pedra
Slug it out = Atracar, engalfinhar
(I) Stumbled upon an = deparei com um(a)
Stand out like a sore thumb = ser diferente, se destacar em relação aos outros

T:
Take it easy = Calma
Take for granted. = Considerar natural
That will do. = Isso serve.
There are none so blind as those who will not see = Mais cego é quem não quer ver.
Thrown in = incluso, jogado dentro, anexado.
To whom it may concern. = A quem possa interessar.

W:
Was still getting used = ainda estava se acostumando
Wee but of = um pouquinho de
What the future holds = o que o futuro reserva
Will kick off = terá início
Willy-nilly = quer queira quer não, à toa
With baited breath = com ansiedade
Worth a damn = Ter valor
Write in full. = Escrever por extenso.

Y:
You’re pulling my leg! = Você está de brincadeira comigo