NuxKids - Uma distribuiç˜ao Linux para crianças

Transcrição

NuxKids - Uma distribuiç˜ao Linux para crianças
Herculano Oliveira
Jorge Sampaio
NuxKids - Uma distribuição
Linux para crianças
Departamento de Informática e Comunicações
Outubro 2008
NuxKids - Uma distribuição
Linux para crianças
Relatório da Disciplina de Projecto Integrado
Engenharia Informática
— Escola Superior de Tecnologia e de Gestão —
Herculano Oliveira, Jorge Sampaio
Outubro 2008
A Escola Superior de Tecnologia e de Gestão não se responsabiliza pelas opiniões
expressas neste relatório.
iii
Certifico que li este relatório e que, na minha opinião, é adequado no
seu conteúdo e forma como demonstrador do trabalho desenvolvido no
âmbito da disciplina de Projecto.
José Rufino Orientador
Certifico que li este relatório e que, na minha opinião, é adequado no
seu conteúdo e forma como demonstrador do trabalho desenvolvido no
âmbito da disciplina de Projecto.
Arguente
Aceite para avaliação da disciplina de Projecto Integrado.
iv
Prefácio
Este projecto, desenvolvido no âmbito da disciplina de Projecto, do 3º ano do Curso
de Engenharia Informática, da Escola Superior de Tecnologia e de Gestão, do Instituto
Politécnico de Bragança, teve como principal objectivo cativar a atenção das pessoas,
principalmente dos mais novos, para a utilização de Software Livre em ambiente Linux.
Neste contexto, demonstram-se as suas capacidades, não descurando o aspecto gráfico que,
hoje em dia, é cada vez mais importante. O foco principal da distribuição produzida, que
designamos por NuxKids, foram as crianças, tentando-se satisfazer ao máximo as suas
necessidades de aprendizagem e de entretenimento, e procurando-se diminuir as suas
dificuldades na utilização de um ambiente alternativo. Um outro objectivo do projecto,
embora secundário, era actualizar a distribuição EstigLive, que foi desenvolvida por outros
colegas no ano lectivo anterior, nesta mesma Instituição, e que serviu como base para a
criação do NuxKids.
v
Agradecimentos
Agradecemos a todos aqueles que nos ajudaram a realizar este projecto, em especial
ao nosso orientador Prof. José Rufino e à Prof. Luı́sa Miranda, aos colegas Pedro Pinto,
Tiago Pedrosa, Alberto Alves Ferreira(Beto), ao pessoal do NUX (Núcleo Estudantil de
Linux), aos nossos pais, namoradas, amigos e a todos aqueles que se disponibilizaram
prontamente a testar o nosso projecto.
vi
Conteúdo
Prefácio
v
Agradecimentos
vi
1 Introdução
1.1 Objectivos do Projecto . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.2 Organização do Relatório . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1
1
2
2 Enquadramento
2.1 Tecnologias de Código-Aberto . . . . . . . .
2.1.1 Vantagens e Desvantagens . . . . . .
2.2 Software Livre para a Educação . . . . . . .
2.2.1 Distribuições Linux para a Educação
2.3 Ponto de Partida do Projecto . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
3
3
4
5
5
6
3 Tecnologias de Base
3.0.1 Live CD/DVD .
3.0.2 Shell Scripts . . .
3.0.3 AuFS . . . . . .
3.0.4 Squashfs e LZMA
3.0.5 GTK+ 2 e Xfce .
3.0.6 Python e PyGTK
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
7
7
7
7
8
9
9
.
.
.
.
.
.
.
.
.
.
11
11
11
11
12
17
19
19
20
20
20
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
4 Produção das Distribuições
4.1 Desenvolvimento da NuxKids . . .
4.1.1 Ambiente Gráfico . . . . . .
4.1.2 Interface Gráfico . . . . . .
4.1.3 Funcionalidades da NuxKids
4.1.4 Selecção de Aplicações . . .
4.1.5 Principais Dificuldades . . .
4.2 Actualização da EstigLive . . . . .
4.3 Hardware Testado . . . . . . . . . .
4.3.1 Computadores de Secretária
4.3.2 Computadores Portáteis . .
vii
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
5 Avaliação dos Utilizadores
21
5.1 Apresentação e Experimentação . . . . . . . . . . . . . . . . . . . . . . . . 21
5.2 Avaliação Questionário . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
5.2.1 Resultados do Questionário . . . . . . . . . . . . . . . . . . . . . . 23
6 Conclusões
25
6.1 Perspectivas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
Bibliografia
27
Glossário
29
A Manual de Utilização
A.1 Requisitos Mı́nimos de Hardware
A.2 Download da Distribuição . . . .
A.3 Gravação da Distribuição . . . . .
A.4 Configuração do Arranque . . . .
A.5 Arranque do NuxKids . . . . . .
A.6 Barra de Botões Principal . . . .
A.7 Software Didáctico . . . . . . . .
A.8 Software Lúdico . . . . . . . . . .
A.9 Administração . . . . . . . . . . .
A.10 Aplicações de Sistema . . . . . .
A.11 Possı́veis Problemas e Soluções . .
B Código-Fonte
B.1 Navegador Gráfico
B.1.1 main.py . .
B.1.2 interface2.py
B.1.3 program.py
B.1.4 setup.py . .
B.1.5 bar setup.py
B.1.6 chave.py . .
B.1.7 password.py
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
C Scripts
C.1 Instalação . . . . . . . . . . . . . . . . . .
C.1.1 ZenWalk . . . . . . . . . . . . . . .
C.2 Configuração/Modificação . . . . . . . . .
C.2.1 Placa gráfica e Montagem da Swap
C.2.2 Ambiente gráfico . . . . . . . . . .
C.2.3 Configuração do Kernel . . . . . . .
C.3 Criação . . . . . . . . . . . . . . . . . . .
C.3.1 pkg e lzm . . . . . . . . . . . . . .
C.3.2 Kernel-2.6.25.4-i486.52.live.tgz . . .
viii
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
30
30
30
30
31
31
32
32
33
34
35
36
.
.
.
.
.
.
.
.
37
37
37
38
42
45
48
51
53
.
.
.
.
.
.
.
.
.
56
56
56
58
58
59
62
65
65
65
C.3.3 Converter pkg, lzm e directórios . . . . . . . . . . . . . . . . . . . . 66
D Modificação/Configuração Manual
68
D.1 Modificação do Código-Fonte do xfdesktop . . . . . . . . . . . . . . . . . . 68
D.2 Modificar Aplicações . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69
E Questionário
70
E.1 Enquadramento . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70
E.2 Objectivo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70
ix
Lista de Tabelas
3.1
Tabela de resultados. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
5.1
Resultados do Questionário. . . . . . . . . . . . . . . . . . . . . . . . . . . 24
x
9
Lista de Figuras
4.1
4.2
4.3
4.4
4.5
4.6
4.7
4.8
4.9
4.10
Área de Trabalho . . . . . . . . . . . . . . . . . . . . . . . .
Comentário Associado a um Ícone. . . . . . . . . . . . . . .
Barra das Aplicações Didácticas. . . . . . . . . . . . . . . .
Barra das Aplicações Lúdicas. . . . . . . . . . . . . . . . . .
Autenticação da Configuração. . . . . . . . . . . . . . . . . .
Barra Administrativa. . . . . . . . . . . . . . . . . . . . . .
Barra de Configuração das Aplicações Didácticas. . . . . . .
Barra de Configuração das Aplicações Lúdicas. . . . . . . . .
Barra que Permite Aceder à Internet e à Linha de Comandos
Caixa de Diálogo para Mudança da Palavra-Passe. . . . . . .
5.1
5.2
5.3
5.4
Turma
Turma
Turma
Turma
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
A.1
A.2
A.3
A.4
A.5
A.6
A.7
Inı́cio do NuxKids . . . . . . . . . . . . . . . .
Área de Trabalho . . . . . . . . . . . . . . . .
Barra de Software Didáctico . . . . . . . . . .
Barra de Software Lúdico . . . . . . . . . . .
Barra Administrativa . . . . . . . . . . . . . .
Barra de e Configuração de Software Didáctico
Menu Sistema . . . . . . . . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
de
de
de
de
2º
2º
4º
4º
Ano
Ano
Ano
Ano
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
xi
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
do Sistema
. . . . . . .
.
.
.
.
.
.
.
.
.
.
12
13
13
14
14
15
15
16
16
17
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
22
22
22
23
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
31
32
33
34
35
35
36
xii
Capı́tulo 1
Introdução
As novas Tecnologias de Informação e Comunicação (TIC’s) têm vindo a ser utilizadas
cada vez mais no sector da Educação. Neste contexto, o projecto actual, que desenvolveu
uma distribuição Linux para crianças, representa um contributo importante.
De facto, existem ainda grandes lacunas no que diz respeito às distribuições Linux
dedicadas à Educação, especialmente para idades compreendidas entre os 3 (três) e os
10 (dez) anos. Surge assim a distribuição NuxKids, na tradição de outras distribuições
já desenvolvidas por elementos do NUX (Núcleo Estudantil de Linux), como a EstigLive
[ePS07]. Precisamente, devido aos constantes avanços do software disponibilizado na EstigLive entendeu-se conveniente aproveitar a oportunidade para actualizar a mesma.
A distribuição NuxKids, bem como a EstigLive, poderá correr em qualquer computador que tenha um DVD-ROM1 , sem a intervenção de administradores ou qualquer tipo
de configuração.
1.1
Objectivos do Projecto
Com a distribuição NuxKids pretende-se cativar as crianças para o mundo do Software Livre e não só. Paralelamente, pretende-se também: a) fornecer novas ferramentas
aos educadores e aos pais, com a possibilidade de controlo das aplicações activas, para
deste modo orientarem a educação das crianças; b) mostrar alternativas a aplicações proprietárias, bem como as possibilidades abertas pelo Linux, e que ainda não estão a ser
exploradas da melhor forma.
Para que a distribuição EstigLive continue a servir os seus propósitos iniciais, como
distribuição orientada à realidade da Estig, a uma actualização, bem como a inclusão de
novas aplicações, era também um dos objectivos (embora secundário) do projecto.
1 Dispositivo
multimédia utilizado normalmente para armazenar vı́deo, música ou dados.
1
2
1.2
CAPÍTULO 1. INTRODUÇÃO
Organização do Relatório
O resto do relatório divide-se em 6 capı́tulos, onde são descritos todos os passos seguidos no desenvolvimento deste projecto. Assim, começamos por enquadrar o projecto
no capı́tulo 2. No capı́tulo 3 descrevem-se as tecnologias de base associadas ao desenvolvimento da NuxKids. O capı́tulo 4 explora o desenvolvimento da NuxKids, bem como
explora as decisões tomadas para a inclusão de aplicações, tanto na NuxKids como na EstigLive. No capı́tulo 5 apresenta-se e discute-se a avaliação dos utilizadores e, finalmente,
o capı́tulo 6 conclui.
O relatório inclui também os seguintes apêndices: A) Manual de Utilizador; B) CódigoFonte do Navegador Gráfico; C) Scripts; D) Modificação/Configuração Manual e E)
Questionário.
Capı́tulo 2
Enquadramento
Em face dos avanços tecnológicos constantes, as experiências realizadas até hoje na
área da Educação têm vindo a confirmar, dia após dia, que as TIC’s deixaram de ser
mais uma ferramenta que podemos usar ou não, para passar a ser uma ferramenta indispensável para o funcionamento das nossas escolas. Neste contexto, e a tı́tulo meramente
ilustrativo, reproduzimos de seguida o pensamento de quem acompanha esta área e tem
grande experiência.
“La oportunidad que ofrecen los materiales didácticos multimédia digitales e interactivos que presentamos en este trabajo gira en torno a las funciones básicas de las TICs en
el proceso de aprendizaje: la provisión de estı́mulos sensoriales y la mediación cognitiv”
[eCOC08, III Congreso Mundial de Estilos de Aprendizaje]
“Del mismo modo, se le demanda mayor formación en TIC, una ruptura de su cultura individualista por otra colectiva, una modificación en sus metodologı́as de enseñanza
donde prime el trabajo colaborativo por encima del individual y una apuesta firme por el
uso de materiales educativos digitales que, sin lugar a dudas, pueden combinarse con otros
de carácter más tradicional” [eCOC08, III Congreso Mundial de Estilos de Aprendizaje]
Um dos maiores problemas que os educadores enfrentam na educação das crianças com
recurso às TIC’s é a selecção das (poucas) ferramentas e aplicações apropriadas, para além
dos custos associados. Assim, com grande foco no Software Livre, pretendemos agrupar
um conjunto relevante de ferramentas já existentes, que ajudem na educação das crianças
e, desta forma, tornar mais fácil o trabalho de quem educa. A escolha do ambiente
Linux não foi por acaso, pois este é um sistema aberto, que se adapta facilmente a novas
situações, para além de ser gratuito.
3
4
CAPÍTULO 2. ENQUADRAMENTO
2.1
Tecnologias de Código-Aberto
O conceito de “Código-Aberto”1 foi criado pela Open Source Initiative [OSI08, OSI],
sendo também conhecido por “Software-Livre”. Este goza de quatro liberdades fundamentais, que são a liberdade de o executar, estudar, redistribuir e aperfeiçoar sem quaisquer
restrições. A forma mais usual do software poder ser distribuı́do livremente é através
de licenças General Public License [GNU08, GPL]2 e Berkeley Software Distribution
[BSD08, BSD]. Qualquer licença de Software Livre é também uma licença de CódigoAberto; a diferença entre os dois termos está no discurso associado. Enquanto a Free
Software Foundation [FSF08, FSF]3 usa o termo “Software Livre” para criar um discurso
baseado em questões éticas, direitos e liberdade, a OSI usa o termo “Código Aberto”
para discursar sobre um ponto de vista puramente técnico sem criar conflitos nem levantar questões éticas.
2.1.1
Vantagens e Desvantagens
A nı́vel económico, a utilização do Software Livre é atractiva, pois acarreta custos
muito inferiores aos do software proprietário; no entanto, não existe um vı́nculo com o
fornecedor ou fabricante, sendo cada um responsável pelos possı́veis riscos de utilização
deste tipo de software.
Quanto à funcionalidade e flexibilidade, qualquer pessoa tem a possibilidade de poder
alterar e melhorar este tipo de software, fazendo com que evolua e acompanhe a tecnologia.
No que diz respeito ao suporte, à medida que o número de utilizadores aumenta dentro da comunidade de Software Livre, aumenta significativamente o suporte às aplicações
mais usadas. Contudo, se uma dada aplicação não for muito comum entre a comunidade
de Software Livre, as pessoas que a utilizam e que desconhecem a arte da programação
ou configuração de sistemas, têm sérias dificuldades para conseguir adaptar as aplicações
às suas necessidades. Porém, existem sempre pessoas dentro da comunidade dispostas a
ajudar e isto por vezes acaba por não ser um problema.
Ao nı́vel da segurança as vantagens são muito grandes. Nas aplicações proprietárias,
mesmo depois de se detectar uma falha de segurança e de a reportar, temos de esperar
pacientemente que o problema seja resolvido pelo fabricante. No caso do Software Livre,
para além de muitas vezes existir uma comunidade de pessoas envolvidas num dado projecto muito superior às existentes nas empresas, também podemos “deitar mãos a obra”
e fazer as modificações necessárias.
Em relação à estabilidade, quando existem muitas pessoas a utilizarem estes projectos,
eventuais bugs 4 são mais rapidamente detectados e desta forma o produto ganha robustez.
1 Do
inglês Open-Source.
Pública Geral.
3 Fundação de Software Livre.
4 Falhas
2 Licença
2.2. SOFTWARE LIVRE PARA A EDUCAÇÃO
5
Por fim, a contribuição deste modelo de desenvolvimento para o conhecimento é muito
importante, pois existe partilha, discussão de ideias, inter-ajuda e colaboração entre os
utilizadores. É, portanto, uma forma muito democrática de disponibilizar informação e
conhecimento.
2.2
Software Livre para a Educação
Cada vez mais encontramos referências teóricas que nos levam a reflectir sobre a necessidade de procurar e de idealizar novas estratégias para a Educação. Os especialistas
nesta área entendem a necessidade de criar novos métodos que ajudem os jovens a aprender. A utilização das TIC’s associada ao Software Livre é sem dúvida um caminho ou
uma solução para alguns desses problemas dos educadores.
Com o Linux e a utilização de Software Livre estamos sempre confrontados com a
possibilidade de um processo de criação ou modificação. Isto traz imensas vantagens na
Educação, visto que o educador poderá modificar ou criar as suas próprias aplicações sem
ter a necessidade de pagar a alguém para modificar ou criar uma aplicação que vá de
encontro àquilo que se pretenda.
Outro ponto importante são as solicitações das próprias crianças. De facto, podem ser
elas a despoletar as alterações, pois todos nós sabemos que as crianças estão cada vez
mais à vontade com as novas tecnologias, por vezes mais do que os próprios educadores.
2.2.1
Distribuições Linux para a Educação
Existem, actualmente várias distribuições Linux orientadas para a Educação, tais como:
ˆ Edubuntu
ˆ DebianEdu / Skolelinux
ˆ openSUSE Education
ˆ Karoshi
ˆ K-12 Linux
ˆ Fiubbix
ˆ GPUL
ˆ EstigLive
ˆ Zenwalk-edu-2007
6
CAPÍTULO 2. ENQUADRAMENTO
Todavia, nenhuma destas é orientada ao nosso público-alvo especı́fico (crianças, na
faixa etária dos 3 aos 10 anos) e daı́ a oportunidade da distribuição NuxKids.
2.3
Ponto de Partida do Projecto
O número de distribuições de Linux existentes é muito vasto [Lis08]. Apesar de a
base ser sempre mais ou menos a mesma, a filosofia que lhes está associada é que as torna
diferentes. Este facto torna a escolha um pouco difı́cil pois, por vezes, não existe informação suficiente para saber se uma dada distribuição se adapta às nossas necessidades,
bem como à nossa filosofia de trabalho. Não nos podemos esquecer que, muitas vezes,
o problema passa pelos utilizadores que não sabem bem o que querem e por isso nunca
estão conformados com a solução que lhes é apresentada [Lin08].
Uma distribuição particularmente interessante para o nosso propósito é a ZenWalk
[Zen08], assente em Slackware [Sla08] (uma das distribuições mais antigas de Linux). De
facto, a Zenwalk procura ser suficientemente leve para executar confortavelmente em hardware mais antigo, ao mesmo tempo que suporta aplicações mais modernas. Desta forma,
recursos computacionais modestos serão suficientes para suportar o nosso propósito.
A escolha da distribuição ZenWalk como ponto de partida deveu-se também ao facto
de ter sido a base de trabalho da distribuição EstigLive, à qual se pretendeu dar alguma
continuidade e sequência, tirando partido da documentação então produzida.
A ideia base deste projecto é, portanto, herdar todas estas caracterı́sticas associadas ao
ZenWalk e criar uma distribuição focada na usabilidade, com interface simples e amigável,
tanto para as crianças como para educadores.
Capı́tulo 3
Tecnologias de Base
No desenvolvimento deste projecto foram exploradas diversas tecnologias de modo a
tornar possı́vel o cumprimento dos objectivos propostos. Discute-se, de seguida, as mais
relevantes.
3.0.1
Live CD/DVD
Um Live CD/DVD contém um sistema operativo que não precisa de ser instalado no
disco rı́gido do utilizador. O sistema operativo é executado directamente a partir do CDROM/DVD-ROM, usando a memória primária do computador (RAM) e, quando muito,
uma partição de swap disponı́vel no disco rápido [Neg06].
3.0.2
Shell Scripts
Uma shell interpreta e executa os comandos do utilizador, proporcionando um ambiente entre o utilizador e o computador, baseado em linha de comandos [Smi05]. Existem
várias implementações distintas cujas grandes diferenças são a facilidade que oferecem na
sua utilização, bem como a estrutura de comandos utilizada.
No desenvolvimento deste projecto usou-se a Bash [Bur04], por ser bastante amigável e
de uso frequente, para programar as scripts que tornam o processo de configuração/instalação
do NuxKids mais rápido, eficaz e autónomo. As scripts utilizadas para auxiliar a criação
desta distribuição encontram-se no apêndice C.
3.0.3
AuFS
O AuFS (AnotherUnionFS) [Oka08] é uma versão alternativa ao UnionFS (Unification
File System) [Uni08], que implementa a união de vários sistemas de ficheiros, mantendo
o seu conteúdo original. Por exemplo, se tivermos o conteúdo de vários CD-ROM’s distintos, podemos fundir esse conteúdo num único directório de montagem.
A vantagem do AuFS em relação ao UnionFS é melhorar a confiabilidade e o desempenho. Introduz novos conceitos como writable branch balancing e outras pequenas
melhorias que estão, também agora, a ser implementadas na versão 2.x do UnionFS. A
7
8
CAPÍTULO 3. TECNOLOGIAS DE BASE
grande desvantagem é que ao contrário do UnionFS, o AuFS não vem incorporado no
Kernel, tendo de se alterar/configurar este para poder suportar esta tecnologia.
A escolha deste tipo de tecnologias traz-nos imensas vantagens no que diz respeito à
criação de um LiveCD/DVD, pois podemos deixar de parte a necessidade de criar um único
ficheiro comprimido, que permite executar o sistema, e passamos a utilizar os chamados
módulos, que não são mais do que vários ficheiros comprimidos que se complementam
entre si. A utilização de módulos torna o sistema muito mais fácil de actualizar e de gerir,
pois só carregamos os módulos necessários à execução do sistema naquele momento.
O script que configura e altera o kernel para suportar o AuFS encontra-se disponı́vel
no apêndice C.2.3.
3.0.4
Squashfs e LZMA
O Squashfs [Squ08] é um sistema de ficheiro só de leitura para Linux, que implementa
compressão. O LZMA [LZM08] é um algoritmo de compressão bastante mais eficaz que
o usado pelo utilitário gzip, sendo usado pelo Squashfs. O Squashfs usa apenas um único
ficheiro comprimido. Em sistemas UNIX é comum gerar um ficheiro que contém outros
ficheiros/directórios com a aplicação tar, e depois comprimi-lo com o utilitário gzip, obtendo um ficheiro com a extensão .tar.gz. Com o Squashfs o processo é semelhante:
Criação do ficheiros:
bash# mksquashfs /dir dir.sqsh
Montagem do ficheiro para leitura.
bash# mkdir /mnt/dir
bash# mount -t squashfs -o loop dir.sqsh /mnt/dir
O Squash e o LZMA são usados para podermos compactar todos os ficheiros/directorias necessários ao sistema, e abri-los sem precisar de os descompactar, o que é ideal em
sistemas que apenas podem recorrer à memória principal do computador para executar,
como é o caso dos Live CD/DVD.
Neste contexto, e a tı́tulo meramente ilustrativo, a tabela 3.1 mostra os resultados
obtidos usando Squashfs mais Gzip e Squashfs mais LZMA [JOM08].
Como se pode verificar, a combinação entre o Squashfs e LZMA trás grandes vantagens
no que diz respeito à compressão dos dados, pois como todos nós sabemos, estamos sempre limitados ao espaço existente num CD-ROM (650MB) ou de um DVD-ROM (4.5GB).
O processo de modificação do kernel [BC05] de modo a suportar o Squashfs e o LZMA
não foi pacı́fico. Apesar dos autores da EstigLive já o terem documentado [ePS07], a
natural evolução do software necessário para a realização do mesmo criou obstáculos inesperados, que consumiram boa parte do tempo dedicado ao projecto.
9
Método
Tamanho do Bloco
Tamanho do Ficheiro
Percentagem
------
688 MB
100%
Squashfs+Gzip
64 KB
227 MB
34%
Squashfs+Gzip
1024 KB
222 MB
33%
Squashfs+LZMA
64 KB
191 MB
28%
Squashfs+LZMA
1024 KB
167 MB
25%
Sem Compressão
Tabela 3.1: Tabela de resultados.
O script que configura e altera o kernel para suportar Squashfs e LZMA encontrase no apêndice C.2.3. O que gera o Live CD/DVD, a partir de uma instalação do
ZenWalk, e que recorre aos módulos do kernel compilados, pode ser consultado em
http://www.linux-live.org/.
3.0.5
GTK+ 2 e Xfce
O GIMP Toolkit (GTK) é um conjunto de ferramentas multi-plataforma para a criação
de interfaces gráficas. O GTK+ 2 é um dos conjuntos de widgets 1 mais usados para a
plataforma X11. O GTK+ é muito popular, sendo usado em grande número de aplicações
e no ambiente de trabalho como o Xfce e Gnome. O GTK+ 2 é o sucessor do GTK+
tendo novas caracterı́sticas como a inclusão de um novo gestor de temas, novas acessibilidades e um ambiente mais flexı́vel. Todavia, as compatibilidades com o anterior não são
as melhores [GTK08].
O Xfce é um ambiente gráfico executado sobre um sistema de janelas2 . Assim como o
Gnome, o Xfce utiliza as bibliotecas do GTK+ 2 para fazer a interface com o utilizador,
o que os torna ligeiramente semelhantes. Mas, ao contrário do Gnome, o Xfce preocupase em ser o mais rápido possı́vel a executar aplicações e com a utilização eficiente dos
recursos do sistema [Xfc08].
3.0.6
Python e PyGTK
Neste projecto, houve a necessidade de programar um navegador gráfico para Xfce,
baseado em GTK+ 2. Essa programação foi feita em Python, com recurso a Wrappers
aproveitados (ver a seguir). O Python [Pyt08] é uma linguagem de programação de alto
1 Componente de uma interface gráfica do utilizador (GUI), janelas, botões, menus, icons, entre outros tipos de componentes.
2 X em sistemas Unix e similares.
10
CAPÍTULO 3. TECNOLOGIAS DE BASE
nı́vel, simples e agradável de ser utilizada. É intuitiva e quem aprende uma vez nunca
mais a esquece pois é muito próxima do pseudo-código3 . Esta linguagem é orientada a
objectos e pode ser usada para desenvolver vários tipos de aplicações. O Python oferece
um forte suporte para integração com outras linguagens e ferramentas, bem como extensas
bibliotecas predefinidas [NSA+ 05].
A linguagem foi projectada com a filosofia de enfatizar a importância do esforço do
programador sobre o esforço computacional. Dá prioridade à legibilidade do código sobre
a velocidade ou expressividade.
GTK+ 2 para Python [PyG08, PyGtk] é um wrapper 4 criado por James Henstridge,
construı́do sobre o GTK+ 2, sendo a biblioteca usada pelo Xfce, Gnome e muitas outras
aplicações para Linux. Tem óptimo desempenho e elementos visuais ricos e agradáveis. A
única desvantagem é o tamanho do código que, por vezes, chega a parecer excessivo. Por
exemplo, para usar um elemento qualquer precisamos criá-lo, configurá-lo, posicioná-lo e
por fim mostrá-lo. São, no mı́nimo, três chamadas havendo métodos para cada objecto.
Como resultado disso, temos ficheiros de código-fonte extensos [Lut06].
O código-fonte do navegador gráfico desenvolvido no projecto, sobre PyGTK, encontrase no apêndice B.
3 Forma
genérica de escrever um algoritmo.
que classes com interfaces incompatı́veis possam interagir.
4 Permite
Capı́tulo 4
Produção das Distribuições
Neste capı́tulo descrevem-se as etapas principais do processo que conduziu à produção
da distribuição NuxKids e à actualização da distribuição EstigLive.
4.1
Desenvolvimento da NuxKids
No caso da distribuição NuxKids, i) a selecção do ambiente gráfico, ii) a criação de um
navegador de aplicações à medida e iii) a selecção das aplicações a disponibilizar, foram
as questões essenciais a resolver.
4.1.1
Ambiente Gráfico
À partida pretendia-se uma solução que permitisse desabilitar funcionalidades que,
por norma, são muito úteis a utilizadores comuns, mas que no caso das crianças não se
pretendem disponı́veis. A necessidade de controlar e orientar a atenção das crianças para
a sua educação é um ponto chave para o NuxKids. Após algumas pesquisas e análises
a ambientes gráficos já existentes, confrontamo-nos com a realidade de não existir uma
solução que respondesse directamente aos nossos requisitos. A partir desta conclusão a
escolha tornou-se evidente: usar o ambiente Xfce fornecido de base e adaptá-lo às nossas
necessidades. O processo de alteração do Xfce, bem como as scripts desenvolvidas, para
a configuração do ambiente gráfico, estão descritas nos apêndices D.1 e C.2.2.
4.1.2
Interface Gráfico
Resolvido o problema do controlo do ambiente gráfico de base, foi necessário desenvolver um interface adequado para acesso às funcionalidades da distribuição NuxKids.
Numa primeira iteração verificou-se que o resultado final não era o pretendido, pois
tı́nhamos ficado com um ambiente gráfico “pobre”, sem “vida” e com pouca usabilidade, o
que representava um problema sério pois, como sabemos, no que diz respeito a ambientes
apelativos e usabilidade, não há clientes tão exigentes como as crianças.
11
12
CAPÍTULO 4. PRODUÇÃO DAS DISTRIBUIÇÕES
Numa segunda iteração desenvolveu-se um interface de navegação capaz de ir ao encontro dos requisitos ergonómicos do projecto: 1) grafismos apelativos; 2) boa usabilidade.
A figura 4.1 mostra o ambiente de trabalho resultante, com a barra de botões principal
do interface, a partir da qual se tem acesso às diversas funcionalidades da distribuição.
Figura 4.1: Área de Trabalho
O acesso às funcionalidades da distribuição faz-se através de barras de botões, organizadas num máximo de 3 nı́veis. A disposição das barras cria um efeito de escada, que
diferencia claramente os diversos nı́veis existentes. Esse feito é claramente visı́vel nas restantes figuras apresentadas nesta secção. A partir do segundo nı́vel, as barras apresentam
um botão especı́fico (com uma seta da direita para esquerda) que permite regressar ao
nı́vel anterior.
Na escolha dos ı́cones dos botões, levou-se em conta a sua simplicidade, a coerência do
seu design e o grau de evidência das suas funções. Para melhorar a compreensão da função
dos ı́cones, foram adicionados comentários1 que explicam sucintamente essa função. Os
comentários só se tornam visı́veis deixando ficar o ponteiro do rato em cima dos ı́cones.
A figura 4.2 mostra esta funcionalidade em funcionamento.
Todo o código-fonte gerado para a criação do navegador gráfico encontra-se no apêndice
B.1. O Manual de Utilização disponı́vel no apêndice A complementa a descrição mais
técnica do interface que se apresenta de seguida.
4.1.3
Funcionalidades da NuxKids
A partir da barra de botões principal da figura 4.1, é possı́vel aceder aos seguintes
tipos de funcionalidades: i) aplicações didáticas, ii) aplicações lúdicas, iii) configuração
do sistema, iv) controlo do volume, v) encerramento do sistema.
1 Normalmente
chamados de tooltips
4.1. DESENVOLVIMENTO DA NUXKIDS
13
Figura 4.2: Comentário Associado a um Ícone.
Aplicações Didácticas e Lúdicas
As figuras 4.3 e 4.4 mostram as barras de segundo nı́vel, que permitem lançar
as aplicações didácticas e lúdicas disponı́veis, respectivamente. A categorização das
aplicações em didácticas e lúdicas, e a selecção das aplicações concretas, são tópicos discutidos com mais detalhe na secção 4.1.4.
Figura 4.3: Barra das Aplicações Didácticas.
Configuração do Sistema
O acesso à configuração do sistema é protegido por uma palavra-passe, como ilustra a
figura 4.5. Dessa forma, o educador tem total controlo sobre as configuração do sistema.
Após uma autenticação bem sucedida, surge a barra de segundo nı́vel visı́vel na figura
4.6, que designamos de barra administrativa.
Os primeiros dois botões da barra administrativa permitem aceder a barras de terceiro
14
CAPÍTULO 4. PRODUÇÃO DAS DISTRIBUIÇÕES
Figura 4.4: Barra das Aplicações Lúdicas.
Figura 4.5: Autenticação da Configuração.
4.1. DESENVOLVIMENTO DA NUXKIDS
15
Figura 4.6: Barra Administrativa.
nı́vel, onde se faz a activação/desactivação individual de aplicações didácticas e lúdicas.
Estas barras de terceiro nı́vel são visı́veis nas figuras 4.7 e 4.8. A activação/desactivação
faz-se com um click de rato no botão de cada aplicação; as aplicações activas apresentam
ı́cones coloridos, e as inactivas apresentam ı́cones em tons de cinza; a passagem do ponteiro
do rato por cima de cada botão revela também o estado da aplicação respectiva. Por
omissão, todas as aplicações didácticas e lúdicas embutidas na NuxKids encontram-se
disponı́veis nas barras de segundo nı́vel respectivas (rever figuras 4.3 e 4.4).
Figura 4.7: Barra de Configuração das Aplicações Didácticas.
O terceiro botão da barra administrativa lança uma barra de terceiro nı́vel com aplicações
de sistema, designadamente: i) um browser de acesso à Web e ii) uma consola de texto
para operações na linha de comando (algumas destas operações podem necessitar de privilégios de super-utilizador, cuja palavra-passe é “estig”, por omissão). A figura 4.9)
16
CAPÍTULO 4. PRODUÇÃO DAS DISTRIBUIÇÕES
Figura 4.8: Barra de Configuração das Aplicações Lúdicas.
mostra a barra de terceira nı́vel em questão.
Figura 4.9: Barra que Permite Aceder à Internet e à Linha de Comandos do Sistema
Finalmente, o quarto botão da barra administrativa permite alterar a palavra-passe
que é pedida sempre que se pretende aceder a essa barra (rever a figura 4.5). A alteração
é feita através da caixa de diálogo que aparece na Figura 4.10.
Outras Funcionalidades
A figura 4.1 mostra ainda i) um botão que permite activar/desactivar o som, ii) um
controlo (slider) de volume de som e iii) um botão de encerramento do sistema.
4.1. DESENVOLVIMENTO DA NUXKIDS
17
Figura 4.10: Caixa de Diálogo para Mudança da Palavra-Passe.
4.1.4
Selecção de Aplicações
Como em qualquer distribuição, também no caso da NuxKids foi necessário seleccionar
um conjunto de aplicações coerente com a filosofia do projecto. Neste contexto, é de salientar que na selecção das aplicações levou-se sempre em consideração o público alvo, não
permitindo que as aplicações ferissem sensibilidades ou que afectassem a normal evolução
das crianças.
Categorias de Aplicações
O processo de selecção contemplou duas categorias de aplicações:
ˆ aplicações didácticas, que se prendem mais com os aspectos pedagógicos e que promovem métodos de ensino e aprendizagem diferentes do comum; a exercitação das
capacidades de memória, percepção auditiva, visual e raciocı́nio lógico/matemático
são pontos chave que estão muito presentes neste tipo de aplicações;
ˆ aplicações lúdicas, que se prendem essencialmente com actividades de diversão; apesar disso, não nos podemos esquecer que alguns jogos oferecem também valências
didácticas; o que marca a diferença em cada jogo é a importância que é dada a cada
uma destas componentes.
Aplicações Seleccionadas
Tendo em conta os requisitos do público-alvo do projecto e a verificação da viabilidade
de execução no ambiente Xfce, apresentam-se de seguida as aplicações seleccionadas.
Software Didáctico:
18
CAPÍTULO 4. PRODUÇÃO DAS DISTRIBUIÇÕES
ˆ Matemática
Tuxmath: Aprender matemática a defender o iglô dos pinguins, acertando nos
diferentes desafios de operações matemáticas.
Gmult: Acertar a que letra pertence determinado número e efectuar a multiplicação respectiva.
Tetravex: Puzzle para juntar números iguais face com face.
ˆ Literatura
TuxType: Aprender a conhecer as letras e a escrever no teclado.
ˆ Colecções de Aplicações
Gcompris: Diversas actividades na área da matemática, leitura, geometria com
jogos de cálculo, estratégia, puzzle e aprendizagem da manipulação do teclado e do
rato.
Childsplay: Conjunto de jogos educacionais sobre letras, números, através de
puzzles e jogos de memória e atribuição de sons para identificar objectos.
ˆ Desenho
TuxPaint: Programa de desenho com interface simples que motiva as crianças a
criarem a sua arte.
Software Lúdico
ˆ Aventura:
Supertux: Jogo de aventura com semelhanças ao conhecido jogo Super Mário.
Pingus: Cumprir variadas missões através da utilização de vários equipamentos.
SuperKart: Jogo de velocidade com variadas pistas.
ˆ Puzzle:
Same Gnome: Desmantelar o puzzle seleccionando blocos adjacentes da mesma
cor.
Gnometrics: Encaixar peças preenchendo linhas que desaparecem quando completas.
Frozen Bubble: Limpar os quadros através da junção de 3 bolas da mesma cor.
ˆ Estratégia:
Mahjongg: Desmantelar o puzzle juntando duas peças iguais de cada vez.
Four in Row: Juntar quatro peças em linha horizontal, vertical ou oblı́qua.
Monsterz: Criar linhas ou colunas de 3 ou mais monstros iguais.
Xbomb: Limpar o quadro evitando as bombas.
4.2. ACTUALIZAÇÃO DA ESTIGLIVE
4.1.5
19
Principais Dificuldades
Uma das principais dificuldades encontradas durante o desenvolvimento da NuxKids
derivou da necessidade/conveniência em criar um ambiente gráfico adaptado aos requesitos do projecto, tendo chegado mesmo a ser necessário alterar o código-fonte de partes
do Xfce.
Adicionalmente, para além da aprendizagem de programação em Python e Bash (para
desenvolver scripts que ajudam no processo de criação/configuração da distribuição),
também foi necessário aprender a programar PyGTK para desenvolver o interface de
barras.
Por fim, as constantes evoluções no repositório do ZenWalk a partir da qual se gerava
a distribuição NuxKids, criaram por vezes obstáculos inesperados, que exigiram alguma
persistência para se ultrapassar.
4.2
Actualização da EstigLive
Após uma análise ao trabalho realizado anteriormente pelos nossos colegas [ePS07], a
actualização da EstigLive parecia extremamente simples. O processo deveria passar apenas por substituir aplicações antigas, por novas versões. No entanto, após alguns testes,
rapidamente nos confrontamos com incompatibilidades diversas entre as aplicações que
pretendı́amos actualizar e alguns componentes do sistema base. A solução passou por
actualizar também o sistema base, o que permitiu actualizar as aplicações existentes e
incorporar novas aplicações, como:
ˆ Inkscape- Desenho vectorial.
ˆ Blender - Criação de animações 3D (aplicação semelhante ao 3D Studio).
ˆ Maxima- Manipulação de sı́mbolos e expressões numéricas.
ˆ Scilab- Software cientı́fico para computação numérica semelhante ao Matlab que
fornece um poderoso ambiente computacional aberto para aplicações cientı́ficas.
ˆ Celestia- Astronomia com recurso a modelos 3D.
ˆ Chemtool - Desenho de estruturas quı́micas.
ˆ Kompozer - Editor de HTML.
ˆ Stardict- Interface gráfica para dicionários.
ˆ Wesnoth- Jogo de estratégia baseado em turnos.
ˆ Lincity- Simulador de cidades semelhante ao conhecido SimCity.
A inclusão destas novas aplicações prendeu-se com a tentativa de tornar a EstigLive
mais aberta a outras comunidades estudantis, para além da comunidade da ESTiG.
20
CAPÍTULO 4. PRODUÇÃO DAS DISTRIBUIÇÕES
4.3
Hardware Testado
Durante o perı́odo de desenvolvimento do projecto, ambas as distribuições foram executadas, com sucesso, numa diversidade de hardware, incluindo sistemas com as seguintes
caracterı́sticas:
4.3.1
Computadores de Secretária
ˆ Placa Gráfica
nVidia Gforce 5200
nVidia Gforce FX 5700 Ultra
nVidia Gforce 8600 GT
nVidia Gforce 8800 GT
ATI Radeon 300 Serie
ˆ Placa de Som
Intel ICH5 Realtek ALC850
Intel HDA Realtek ALC885
Sound Blaster Audigy2 ZS 7.1
Sound Realtek Ae97
ˆ Processador
Intel P4 2.8Ghz
Intel P4 3Ghz
Intel Core2Duo
AMD 64 3200+ Ghz
4.3.2
Computadores Portáteis
ˆ Acer- travelmate 2413WLMI
ˆ Asus Z53Series - F3SV
ˆ Clasus Challenger SW14
ˆ Toshiba Satellite A300-18A
ˆ Toshiba PSM30E
ˆ Toshiba A200
Capı́tulo 5
Avaliação dos Utilizadores
Um dos aspectos fundamentais deste projecto é a avaliação da sua aceitação junto do
público alvo. Neste contexto, a Escola Básica Nº 3 do 1º Ciclo, do Agrupamento Vertical
de Escolas de Peso da Régua disponibilizou-se para testar o projecto.
5.1
Apresentação e Experimentação
Foram disponibilizadas duas turmas, uma do segundo e outra do quarto ano, para
realizar a apresentação do projecto. As apresentações iniciaram-se pela explicação do
propósito da nossa presença, compreenderam uma sessão de perguntas e respostas e a
experimentação da distribuição. A primeira apresentação, perante a turma do segundo
ano (ver figuras 5.1 e 5.2), decorreu com grupos de dois alunos por cada computador
disponı́vel. Após a utilização feita pelos primeiros grupos, as primeiras impressões foram
de espanto, alegria, novidade e principalmente de interesse por explorar mais e mais
funcionalidades. Contudo, perante algumas aplicações existentes apareceram algumas
dificuldades, pois estas não pertenciam à faixa etária dos utilizadores, mas as crianças
não desanimaram, e mostravam interesse em aprender. À medida que se trocavam os
utilizadores, os que já tinham utilizado as aplicações mostravam um forte interesse em
ensinar os colegas.
Na segunda apresentação (ver figuras 5.3 e 5.4) tudo decorreu de forma semelhante à
primeira, tirando o facto de estes alunos ganharem confiança mais facilmente, o que levou
a uma maior desorganização, e também a uma procura maior de aplicações lúdicas. Apesar da pequena adesão às aplicações didácticas, verificou-se a existência de um concurso:
o mais rápido a responder ganhava.
21
22
CAPÍTULO 5. AVALIAÇÃO DOS UTILIZADORES
Figura 5.1: Turma de 2º Ano
Figura 5.2: Turma de 2º Ano
Figura 5.3: Turma de 4º Ano
5.2. AVALIAÇÃO QUESTIONÁRIO
23
Figura 5.4: Turma de 4º Ano
No geral, e como era de esperar, a curiosidade das crianças era elevada mas, ao contrário
do que se esperava, o interesse de um dos educadores de uma das turmas não foi muito,
o que nos deixou um pouco desiludidos. Apesar disso, esta situação foi ultrapassada pelo
entusiasmo das crianças e por termos verificado que existiam alguns educadores “presos”
aos computadores a explorar as diversas funcionalidades da distribuição NuxKids.
5.2
Avaliação Questionário
Para sistematizar melhor a avaliação feita pelos utilizadores, realizou-se um Questionário, que pode ser encontrado no apêndice E. Este serviu para consolidarmos melhor
as nossas ideias e também para melhorarmos mais alguns aspectos que os educadores
pudessem sugerir. Porém, também nos serviu de alento para podermos seguir em frente,
visto obtermos uma aceitação unânime na necessidade de projectos como o que realizamos.
À margem do Questionário levantaram-se questões como a da linguagem das aplicações
(“não devemos usar a ortografia do português do Brasil”), a disposição das aplicações, a
usabilidade do navegador gráfico (“o navegador gráfico tem que ser tão fácil de utilizar
para as crianças como para os educadores”). Contudo, e para nossa tristeza, o Linux não
era um sistema operativo muito conhecido entre os educadores.
Podemos concluir que esta visita foi muito produtiva para o projecto que estávamos a
realizar, tendo muita vontade e esperança de realizar mais visitas como esta, mas a falta
de tempo foi uma forte barreira.
5.2.1
Resultados do Questionário
Os resultados obtidos em cada um das perguntas realizadas encontram-se resumidos
na Tabela 5.1:
24
CAPÍTULO 5. AVALIAÇÃO DOS UTILIZADORES
Pergunta 1
66,66%
(Sim)
33,33%
(Não)
------
------
Pergunta 2
33,33%
(Sim)
66,66%
(Não)
------
------
Pergunta 3
100.00%
(Sim)
0.00%
(Não)
------
------
Pergunta 4
66,66%
(Muito Boa)
33,33%
(Bom)
0.00%
(Suficiente)
0.00%
(Insuficiente)
Pergunta 5
100.00%
(Muito Boa)
0.00%
(Bom)
0.00%
(Suficiente)
0.00%
(Insuficiente)
Pergunta 6
100.00%
(Sim)
0.00%
(Não)
------
------
Tabela 5.1: Resultados do Questionário.
Em relação à questão 7 (”Da sua impressão sobre o CD tem alguma crı́tica? Algum
aspecto que gostaria de ver diferente?”), deixamos aqui algumas respostas obtidas.
”Não conheço o suficiente para poder adiantar algo. À partida parecem-me materiais
bastante motivadores.”
”Não. Acho o CD bem conseguido e que ajuda imenso as crianças tanto nas áreas
curriculares como nos jogos de entretenimento. Gostaria que as crianças tivessem mais
oportunidades para poderem desenvolver as suas competências.”
”Queria chamar a atenção para a incorrecção ortográfica de alguma palavras, mesmo
considerando que é uma tradução. Tirando este aspecto, penso que é atractivo visualmente e consegue motivar as crianças.”
Capı́tulo 6
Conclusões
A procura de novas soluções para a Educação é uma constante e o papel da TIC’s nesta
área é, sem dúvida, muito importante. Neste contexto, o projecto NuxKids representa
um contributo importante e, na nossa opinião, os seus principais objectivos foram atingidos. Estes, recorde-se, davam prioridade à usabilidade e à atractividade do interface,
qualidades que se puderam comprovar pela reacção dos utilizadores nos testes de campo
efectuados. Nos mesmos testes, os educadores mostraram-se agradados pela função e variedade das ferramentas seleccionadas, incluindo a possibilidade de controlar, de forma
administrativa, as ferramentas disponı́veis para diferentes públicos-alvo. O facto de a
distribuição NuxKids ser disponibilizada em formato Live foi também uma mais valia
apreciada, já que torna a utilização do produto fácil e inócua.
Relativamente à distribuição EstigLive, os objectivos eram mais modestos (actualização
do Kernel e das aplicações) mas mesmo assim foram cumpridos, apesar de algumas dificuldades inesperadas.
6.1
Perspectivas
Em termos estratégicos, com a realização do NuxKids fica o caminho aberto para
uma distribuição NuxJuniors, mais orientada ao Ensino Secundário. Outra alternativa
aliciante, em termos de público alvo, seria uma distribuição NuxSpecial, para pessoas
portadoras de deficiência ou com necessidades especiais. Futuras iterações deste projecto
deveriam também contar com uma cooperação mais estreita com especialistas da área da
Educação e da Informática para a Educação, permitindo dar um salto qualitativo importante.
Em termos técnicos, verificou-se que muitas das aplicações seleccionadas não tinham
tradução para a lı́ngua portuguesa, vertente que importa atacar em futuras versões do
NuxKids. A possibilidade de seleccionar automaticamente as aplicações acessı́veis por
25
26
CAPÍTULO 6. CONCLUSÕES
faixa etária é uma funcionalidade não implementada na versão actual e que facilitaria a tarefa dos educadores. Adicionalmente, é de equacionar a possibilidade de utilizar uma outra distribuição e ambiente gráfico de base, para além da ZenWalk e do
Xfce, de forma a facilitar a manutenção de versões actualizadas do sistema operativo
de base e permitir a execução de outras aplicações capazes de tirar partido de ambientes gráficos mais avançados, como o Gnome ou o KDE. Neste contexto, uma possibilidade interessante a explorar seria o ambiente Ubuntu MID Edition (Ver http:
//www.ubuntu.com/products/mobile).
Finalmente, numa altura em que existe uma aposta a nı́vel governamental em garantir
o acesso de alunos cada vez mais jovens a notebooks, a oportunidade de distribuições
orientada à Educação é indiscutı́vel.
Bibliografia
[BC05]
Daniel P. Bovet and Marco Cesati. Understanding the Linux Kernel, 3rd Edition. O’Reilly, November 2005.
[BSD08]
Wikipédia Licença BSD, 2008. http://pt.wikipedia.org/wiki/Licen%C3%
A7a_BSD.
[Bur04]
Ken O. Burch. Linux Shell Scripting with Bash. Developer’s Library, 2004.
[eCOC08] José Clares Lópes e Carlos Ongallo Chanclón. III Congreso Mundial de Estilos de Aprendizaje. In Libro de actas. Volumen V, Cáceres (España), 2008.
Universidad de Extremadura.
[ePS07]
Pedro Pinto e Pedro Sousa. Distribuição Linux para a ESTiG. Departamento
de Informática e Comunicações, Instituto Politécnico de Bragança, Escola Superior de Tecnologia e de Gestão, Setembro 2007.
[FSF08]
Free Software Foundation, 2008. http://www.fsf.org/.
[GNU08] GNU Operating System, 2008. http://www.gnu.org/licenses/licenses.
html.
[GTK08] GTK+, 2008. http://www.gtk.org/.
[JOM08] Igor Pavlov Junjiro Okajima, Phillip Lougher and Toms M. Squashfs LZMA,
2008. http://www.squashfs-lzma.org/.
[Lin08]
Linux, 2008. http://en.wikipedia.org/wiki/Linux.
[Lis08]
Lista de distribuições de Linux, 2008. http://pt.wikipedia.org/wiki/
Lista_de_distribui%C3%A7%C3%B5es_de_Linux.
[Lut06]
Mark Lutz. Programming Python, 3rd Edition. O’Reilly, August 2006.
[LZM08] LZMA, 2008. http://www.7-zip.org/sdk.html.
[Neg06]
Christopher Negus. Live Linux CDs : building and customizing bootables /
Christopher Negus. Prentice Hall, November 2006.
[NSA+ 05] Peter Norton, Alex Samuel, David Aitel, Eric Foster-Johnson, Leonard Richardson, Jason Diamond, and Michael Roberts Aleatha Parker. Beginning
Python. Wiley Publishing, Inc., 2005.
27
28
BIBLIOGRAFIA
[Oka08]
Junjiro Okajima. AuFS, 2008. http://aufs.sourceforge.net/.
[OSI08]
Open Source Initiative, 2008. http://www.opensource.org/.
[PyG08]
PyGTK: GTK+ for Python, 2008. http://www.pygtk.org/.
[Pyt08]
Python Programming Language, 2008. http://www.python.org/.
[Sla08]
Slackware, 2008. http://www.slackware.com/.
[Smi05]
Roderick W. Smith. LPIC-1 Linux Professional Institute Certification Study.
SYBEX, 2005.
[Squ08]
Squashfs, 2008. http://squashfs.sourceforge.net/.
[Uni08]
UnionFS, 2008. http://www.filesystems.org/project-unionfs.html.
[Xfc08]
Xfce, 2008. http://www.xfce.org/.
[Zen08]
ZenWalk Linux, 2008. http://www.zenwalk.org/.
Glossário
GNU gzip
Software livre de compressão de dados, criado por Jean-Loup Gailly e Mark
Adler. É baseado no algoritmo DEFLATE e a extensão gerada é .gz.
Kernel
O kernel que é o núcleo do sistema operativo é o programa mais importante
de um sistema operativo. Tem a responsabilidade de gerir os recursos do
sistema e a comunicação entre o hardware e software.
LZMA
Algoritmo Lempel-Ziv-Markov. É uma versão melhorada dos algoritmos
de compressão de dados LZ77. Desenvolvido para melhorar o nı́vel de
compressão de dados, mantendo alta taxa de compressão e baixo consumo
de memória.
Pseudo-Código
Forma genérica de escrever um algoritmo, utilizando uma linguagem simples, nativa a quem o escreve, de forma a ser entendida por qualquer pessoa
sem necessidade de conhecer a sintaxe, que não está associada a nenhuma
linguagem de programação.
Sistema Operativo
Conjunto de programas/aplicações, cuja função é servir de elo de ligação
entre o computador e o utilizador.
Software
É um conjunto organizado de instruções em liguagem natural ou codificada, que são seguidas e executadas na manipulação, redirecionamento ou
modificação de dados/informação.
Squashfs
Sistema de ficheiros para Linux que implementa compressão.
tar
Acrónimo de tape archive. É um formato de ficheiro que agrupa vários
outros ficheiros, mantendo as suas permissões e datas.
Writable Branch Balancing
Termo técnico que define o processo de configuração de várias partições
para escrita e que divide todos os ficheiros novos/modificados entre eles,
tendo em conta o espaço livre disponı́vel, o directório principal, e o acesso
aleatório ou combinatório.
29
Apêndice A
Manual de Utilização
O manual da distribuição NuxKids documenta os aspectos necessários à sua instalação
e utilização de uma forma simples e rápida.
A.1
Requisitos Mı́nimos de Hardware
ˆ Processador Pentium II a 300 Mhz
ˆ 128 MB de Ram
ˆ Drive DVD
ˆ Placa Gráfica de 32MB
ˆ Placa de Som
A.2
Download da Distribuição
O repositório oficial do NuxKids é:
ˆ ftp://ftp.nux.ipb.pt/pub/dists/nuxkids
O sı́tio oficial da distribuição é:
ˆ http://www.nux.ipb.pt/nuxkids
A.3
Gravação da Distribuição
Após o descarregamento da imagem em formato ISO, use um programa de gravação à
sua escolha, para produzir o Live CD/DVD.
30
A.4. CONFIGURAÇÃO DO ARRANQUE
A.4
31
Configuração do Arranque
Se o seu sistema não estiver configurado para arrancar em primeiro lugar a partir de
CD ou DVD, terá de activar essa funcionalidade na Bios. Após iniciar o computador
espere que a palavra setup apareça no monitor, seguida da indicação de uma tecla ou
combinação de teclas a premir para aceder à Bios, como por exemplo:
ˆ Del
ˆ F2
ˆ Ctrl+Alt+Esc
ˆ F1
ˆ F10
ˆ Ctrl+Alt+S
Depois de aceder à Bios, a activação do arranque via CD/DVD faz-se, em geral, no
menu Boot. Outra possibilidade por vezes disponivel é escolher o dispositivo de arranque
durante o inı́cio do sistema. Tipicamente, essa escolha faz-se através das teclas :
ˆ F8
ˆ F11
ˆ F12
A.5
Arranque do NuxKids
Figura A.1: Inı́cio do NuxKids
No seu inı́cio, o arranque do NuxKids apresenta o ecrã da Figura A.1, podendo o
arranque continuar de imediato premindo a tecla ENTER. Concluido o arranque, fica
acessı́vel o ecrã da Figura A.2, que mostra a área de trabalho NuxKids, com a sua barra
de botões principal.
32
APÊNDICE A. MANUAL DE UTILIZAÇÃO
A.6
Barra de Botões Principal
A barra de botões principal compreende botões que dão acesso às seguintes funcionalidades:
ˆ Software Didáctico
ˆ Software Lúdico
ˆ Menu de Administração
ˆ Botão de Volume (On/Off)
ˆ Barra de Volume
ˆ Encerramento do Sistema
Figura A.2: Área de Trabalho
A.7
Software Didáctico
O botão de Software Didáctico dá acesso a uma barra de botões (ver figura A.3) que
permite arrancar aplicações didácticas de diversas categorias:
ˆ Matemática
Tuxmath - Aprender matemática a defender o iglo dos pinguins acertando nos
diferentes desafios de operações matemáticas.
Gmult - Acertar que letra pertence a determinado número e efectuar a multiplicação.
Tetravex - Puzzle para juntar números iguais face com face.
A.8. SOFTWARE LÚDICO
33
ˆ Literatura
TuxType-Aprender a conhecer as letras e escrever com o teclado a brincar.
ˆ Colecções de Actividades
Gcompris - Diversas actividades na área da Matemática, leitura, geometria com
jogos de cálculo, estratégia, puzzle e aprendizagem da manipulação do teclado e do
rato.
Childsplay - Conjunto de jogos educacionais sobre letras, números, através de
puzzles e jogos de memória e atribuição de sons para identificar o objecto.
ˆ Desenho
TuxPaint-Programa de desenho com interface simples que motiva as crianças a
criar a sua arte.
Figura A.3: Barra de Software Didáctico
A.8
Software Lúdico
O botão de Software Lúdico permite aceder a uma barra de botões (ver Figura A.4)
que permite o inı́cio de aplicações lúdicas:
ˆ Aventura
Supertux - Jogo de aventura com semelhanças ao conhecido jogo Super Mário.
Pingus - Cumprir variadas missões através utilização de varios equipamentos
”escadas, páraquedas, etc..”.
SuperKart - Jogo de velocidade com variadas pistas
ˆ Puzzles
34
APÊNDICE A. MANUAL DE UTILIZAÇÃO
Same Gnome - Desmantelar o puzzle seleccionando blocos adajacentes da mesma
cor.
Gnometrics - Encaixar peças preenchendo linhas que desaparecem quando completas.
Frozen Bubble - Limpar os quadros através da junção de 3 bolas da mesma cor.
ˆ Estratégia
Mahjongg - Desmantelar o puzzle juntando duas peças iguais de cada vez
Four in Row - Juntar quatro peças em linha horizontal, vertical ou oblı́qua.
Monsterz - Criar linhas ou colunas de monstros iguais (3 ou mais).
Xbomb - Limpar o quadro evitando as bombas
Figura A.4: Barra de Software Lúdico
A.9
Administração
O botão de administração lança uma barra de 2º nivel (ver Figura A.5) com botões
que permitem:
ˆ Configurar Sofware Didáctico
ˆ Configurar Sofware Lúdico
ˆ Executar Aplicações de Sistema
ˆ Redefinir a palavra-passe de administração
A palavra-passe original que permite lançar a barra administração é ”nuxkids”.
A.10. APLICAÇÕES DE SISTEMA
35
Figura A.5: Barra Administrativa
Os botões de configuração Sofware Didáctico e de Software Lúdico dão acesso a barra
de 3º nı́vel especı́ficas, que permitem activar ou desactivar aplicações de cada uma dessas
categorias. Para tal, basta fazer click sobre botão de cada aplicação, que fica cinzento se
for desactivado. A Figura A.6 mostra a barra de configuração do Software Didáctico.
Figura A.6: Barra de e Configuração de Software Didáctico
A.10
Aplicações de Sistema
As aplicações de Sistema incluem um browser para navegação na Internet e um terminal
de texto para administração do sistema via linha de comandos (a palavra-passe de superutilizador pré-definida é ”estig”). A Figura A.7 mostra o acesso à barra de Aplicações
de Sistema.
36
APÊNDICE A. MANUAL DE UTILIZAÇÃO
Figura A.7: Menu Sistema
A.11
Possı́veis Problemas e Soluções
1. Não se efectou o arranque do Nux Kids.
Certifique-se de que o seu sistema está configurado para arrancar a partir de CD/DVD
(ver secção 1.4). Certifique-se também de que o seu sistema dispõe de placa de som.
2. A modificação de palavras-passe não é permanente.
A redefinição de palavras-passe é unicamente valida para cada sessão. Após desligar
ou reiniciar o sistema, as definições por omissão serão recuperadas.
3. O meu computador deixou de arrancar a partir do disco.
Ao reiniciar o seu computador não se esqueça retirar o NuxKids do leitor de CD/DVD.
4. O meu computador inicializa sempre o NuxKids.
Ver resposta questão anterior.
5. Algumas aplicações são lentas.
Verifique se a placa gráfica do seu sistema suporta aceleração.
6. O programa em execução desapareceu do ecrã.
Use a combinação de teclas ALT+TAB para recuperá-lo.
7. Desapareceu tudo do ambiente de trabalho.
Troque de ambiente de trabalho rodando o botão do rato e então volte a rodar; irá
encontrar seu ambiente de trabalho original.
Apêndice B
Código-Fonte
B.1
Navegador Gráfico
B.1.1
main.py
Gestor principal do navegador gráfico.
1
2
3
4
5
6
7
#! / u s r / b i n / env python
# −*− c o d i n g : u t f −8 −*−
#
#
# author
: H e r c u l a n o O l i v e i r a ( h e r c u l a n o . mc . o l i v e i r a @ g m a i l . com )
#
# description
:
8
9
import os , g t k
10
11
12
13
from i n t e r f a c e import i n t e r f a c e
from i n t e r f a c e 2 import i n t e r f a c e 2
from p a n e l import p a n e l
14
15
16
17
18
19
20
21
c l a s s main ( ) :
def
init
( self ) :
#edu = i n t e r f a c e ( ” e d u c a t i o n . j p g ” , ” e d u c a t i v o s p l a y ” , −150 , 0 , ” J o g o s D i d á c t i c o s ” )
#e n t = i n t e r f a c e ( ” i l u r e c r e i o . png ” , ” e n t r e t e n i m e n t o p l a y ” , +137 , 0 , ” J o g o s L ú d i c o s ” )
i n t e r= i n t e r f a c e 2 ( )
#p = p a n e l ( )
#o s . system ( ” python p a n e l . py&”)
22
def g e t p a n e l ( s e l f ) :
return ( p )
23
24
25
def
del ( self ) :
#Apagamos o s f i c h e i r o s t e m p o r á r i o s .
o s . system ( " rm - rf __ * " )
26
27
28
29
30
if
name
== " __main__ " :
31
32
33
m=main ( )
g t k . main ( )
37
38
APÊNDICE B. CÓDIGO-FONTE
B.1.2
interface2.py
Implementa a barra inicial do navegador gráfico. Esta barra possibilita o controlo do
volume, o acesso às aplicações disponı́veis para a utilização imediata, bem como o acesso
à área de configuração.
1
2
3
4
5
6
#! / u s r / b i n / env python
# −*− c o d i n g : u t f −8 −*−
#
# author
: H e r c u l a n o O l i v e i r a ( h e r c u l a n o . mc . o l i v e i r a @ g m a i l . com )
#
# description
:
7
8
9
10
import os , gtk , Image , a l s a a u d i o
from program import program
from chave import chave
11
12
13
c l a s s i n t e r f a c e 2 ( g t k . Window ) :
14
15
16
17
18
19
20
table = []
channel = [ ]
mixer = [ ]
pcm = [ ]
front = []
p = []
21
22
23
def
init
( self ) :
init
g t k . Window .
( s e l f , g t k .WINDOW TOPLEVEL)
24
25
26
27
28
29
30
#s e l f . r e s i z e ( 2 0 0 , 2 0 0 )
s e l f . set decorated ( False )
s e l f . set border width (4)
s e l f . c o n n e c t ( " destroy " , s e l f . d e s t r o y )
s e l f . c o n n e c t ( " delete_event " , s e l f . d e s t r o y )
#s e l f . p o s i t i o n ( 2 0 0 , 1 4 5 )
31
32
self .
alsa ()
33
34
35
36
37
38
39
#S l i d e r Bar .
s e l f . a d j u s t m e n t = g t k . Adjustment ( v a l u e =0 , l o w e r =0 , upper =100 , s t e p i n c r =1 , p a g e i n c r =1) ;
s e l f . s l i d e r = g t k . HScale ( s e l f . a d j u s t m e n t )
s e l f . s l i d e r . s e t s i z e r e q u e s t (100 ,70)
s e l f . s l i d e r . s e t d i g i t s (0)
s e l f . s l i d e r . set draw value ( False )
40
41
42
s e l f . s l i d e r . c o n n e c t ( " value - changed " , s e l f .
slider )
s e l f . s l i d e r . s e t v a l u e ( i n t ( s e l f . m i x e r . getvolume ( ) [ 0 ] ) )
43
44
self .
table
= g t k . Table ( 5 , 1 )
45
46
47
48
49
50
#Botão de d i d á t i c o s
[ button did ,
i m a g e d i d ] = s e l f . b u t t o n s ( " gnome - office . png " , 1 2 8 , 1 2 8 , 1 3 8 , 1 3 8 )
b u t t o n d i d . c o n n e c t ( " clicked " , s e l f . b u t t o n d i d a t i c o s )
t o o l t i p = gtk . T o o l t i p s ( )
t o o l t i p . s e t t i p ( b u t t o n d i d , " Programas Didáticos " , None )
51
52
s e l f . t a b l e . a t t a c h ( b u t t o n d i d , 1 , 2 , 2 , 3 , x o p t i o n s=g t k . FILL , y o p t i o n s=g t k . FILL ,
xpadding =0 , ypadding =0)
53
54
55
#Botão de l u d i c o s .
image lud ] = s e l f .
[ button lud ,
128 , 138 , 138)
b u t t o n s ( " gnome - fs - directory - games . png " , 1 2 8 ,
B.1. NAVEGADOR GRÁFICO
56
57
58
59
39
b u t t o n l u d . c o n n e c t ( " clicked " , s e l f . b u t t o n l u d i c o s )
t o o l t i p = gtk . T o o l t i p s ( )
t o o l t i p . s e t t i p ( b u t t o n l u d , " Programas Lúdicos " , None )
s e l f . t a b l e . a t t a c h ( b u t t o n l u d , 1 , 2 , 3 , 4 , x o p t i o n s=g t k . FILL , y o p t i o n s=g t k . FILL ,
xpadding =0 , ypadding =0)
60
61
62
63
64
65
#Botão de systema .
i m a g e s h u t ] = s e l f . b u t t o n s ( " gtk - preferences . png " , 1 2 8 , 1 2 8 , 1 3 8 ,
[ button shut ,
138)
b u t t o n s h u t . c o n n e c t ( " clicked " , s e l f . b u t t o n s y s t e m a )
t o o l t i p = gtk . T o o l t i p s ( )
t o o l t i p . s e t t i p ( b u t t o n s h u t , " Configurar " , None )
66
67
self .
t a b l e . a t t a c h ( b u t t o n s h u t , 1 , 2 , 4 , 5 , x o p t i o n s=g t k . FILL , y o p t i o n s=g t k . FILL ,
xpadding =0 , ypadding =0)
68
69
70
71
72
73
74
#Botão de sound .
i m a g e s o u n d ] = s e l f . b u t t o n s ( " multimedia - volume - control . png " ,
[ button sound ,
128 , 128 , 138 , 138)
b u t t o n s o u n d . c o n n e c t ( " clicked " , s e l f . b u t t o n a u d i o , " multimedia - volume - control . png
" , " multimedia - volume - control - off . png " , 1 2 8 , 1 2 8 ,
image sound )
t o o l t i p = gtk . T o o l t i p s ( )
t o o l t i p . s e t t i p ( b u t t o n s o u n d , " Volume [ Ligar / Desligar ] " , None )
s e l f . t a b l e . a t t a c h ( b u t t o n s o u n d , 1 , 2 , 5 , 6 , x o p t i o n s=g t k . FILL , y o p t i o n s=g t k . FILL
, xpadding =0 , ypadding =0)
75
76
77
78
79
#S l i d e r Bar
t o o l t i p = gtk . T o o l t i p s ( )
t o o l t i p . s e t t i p ( s e l f . s l i d e r , " Volume [ Aumentar / Diminuir ] " , None )
s e l f . t a b l e . a t t a c h ( s e l f . s l i d e r , 1 , 2 , 6 , 7 , x o p t i o n s=g t k . FILL , y o p t i o n s=g t k . FILL ,
xpadding =0 , ypadding =0)
80
81
82
83
84
85
86
#Botão de s a i r .
[ button ex ,
i m a g e e x ] = s e l f . b u t t o n s ( " gnome - session - halt . png " , 1 2 8 , 1 2 8 , 1 3 8 ,
138)
b u t t o n e x . c o n n e c t ( " clicked " , s e l f . b u t t o n e x i t )
t o o l t i p = gtk . T o o l t i p s ( )
t o o l t i p . s e t t i p ( b u t t o n e x , " Desligar Computador " , None )
s e l f . t a b l e . a t t a c h ( b u t t o n e x , 1 , 2 , 7 , 8 , x o p t i o n s=g t k . FILL , y o p t i o n s=g t k . FILL ,
xpadding =0 , ypadding =0)
87
88
89
90
91
s e l f . add ( s e l f . t a b l e )
s e l f . show all ()
[ k , w]= s e l f . g e t s i z e ( )
s e l f . p o s i t i o n ( k , w)
92
93
94
95
96
97
98
def
b u t t o n s ( s e l f , imagem , x , y , k , w) :
#Botão de shutdown .
imagem=" ____ " + imagem
Image . open ( imagem ) . r e s i z e ( ( x , y ) ) . s a v e (
i m a g e = g t k . Image ( )
b u t t o n = g t k . Button ( )
imagem )
99
100
101
102
b u t t o n . s e t s i z e r e q u e s t ( k , w)
i m a g e . s e t f r o m f i l e ( imagem )
b u t t o n . add ( i m a g e )
103
104
return (
button ,
image )
105
106
107
108
109
110
111
b u t t o n d i d a t i c o s ( s e l f , widget , data=None ) :
def
print " Didaticos "
p = program ( " ed uc a ti vo s_ p la y " )
p . s e t m o d a l ( True )
p . run ( s e l f )
[ k , w]= s e l f . g e t s i z e ( )
40
112
APÊNDICE B. CÓDIGO-FONTE
self .
p o s i t i o n ( k , w)
113
114
115
116
#s e l f . p =program ( ” e d u c a t i v o s p l a y ” )
#p . s e t t r a n s i e n t f o r ( s e l f )
#p . s e t m o d a l ( True )
117
118
119
120
121
122
123
124
def
b u t t o n l u d i c o s ( s e l f , widget , data=None ) :
print " Ludicos "
p = program ( " e n t r e t e n i m e n t o _ p l a y " )
p . s e t m o d a l ( True )
p . run ( s e l f )
[ k , w]= s e l f . g e t s i z e ( )
s e l f . p o s i t i o n ( k , w)
125
126
127
128
#s e l f .
#s e l f .
#s e l f .
p =program ( ” e n t r e t e n i m e n t o p l a y ” )
p . set transient for ( self )
p . s e t m o d a l ( True )
129
130
131
132
133
134
135
136
137
138
def
b u t t o n s y s t e m a ( s e l f , widget , data=None ) :
print " System "
c=chave ( )
c . s e t m o d a l ( True )
c . run ( s e l f )
[ k , w]= s e l f . g e t s i z e ( )
s e l f . p o s i t i o n ( k , w)
#c = chave ( )
#c . s e t m o d a l ( True )
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
def
b u t t o n a u d i o ( s e l f , widget , image on , image mute , x , y ,
print " Audio "
i f ( s e l f . m i x e r . getmute ( ) [0]==0) :
try :
s e l f . m i x e r . se t mu t e ( 1 )
except a l s a a u d i o . ALSAAudioError :
print " Master has no mute switch "
try :
s e l f . p c m . s et mu t e ( 1 )
except a l s a a u d i o . ALSAAudioError :
print " PCM has no mute switch "
imagem=" __ " + image mute
Image . open ( image mute ) . r e s i z e ( ( x , y ) ) . s a v e ( imagem )
i m a g e s o m . s e t f r o m f i l e ( imagem )
i m a g e s o m , data=None ) :
154
155
156
157
158
159
160
161
162
163
164
165
166
else :
try :
s e l f . m i x e r . se t mu t e ( 0 )
except a l s a a u d i o . ALSAAudioError :
print " Master has no mute switch "
try :
s e l f . p c m . s et mu t e ( 0 )
except a l s a a u d i o . ALSAAudioError :
print " PCM has no mute switch "
imagem=" __ " + image on
Image . open ( image on ) . r e s i z e ( ( x , y ) ) . s a v e (
i m a g e s o m . s e t f r o m f i l e ( imagem )
imagem )
167
168
169
170
171
172
173
174
175
176
def
b u t t o n e x i t ( s e l f , widget , data=None ) :
MessengeBox = g t k . D i a l o g ( )
MessengeBox . s e t d e c o r a t e d ( F a l s e )
Messenge = g t k . L a b e l ( " Quer mesmo sair ? " )
MessengeBox . s e t m o d a l ( True )
MessengeBox . vbox . p a c k s t a r t ( Messenge , True , True , 5 )
MessengeBox . a d d b u t t o n ( g t k . STOCK OK, g t k . RESPONSE ACCEPT)
MessengeBox . a d d b u t t o n ( g t k .STOCK CANCEL, g t k . RESPONSE CANCEL)
MessengeBox . s h o w a l l ( )
B.1. NAVEGADOR GRÁFICO
177
178
179
180
181
182
[ k , w]= MessengeBox . g e t s i z e ( )
MessengeBox . move ( ( ( g t k . gdk . s c r e e n w i d t h ( ) / 2 ) −(k / 2 ) ) , ( g t k . gdk . s c r e e n h e i g h t ( ) / 2 ) −(w
/2) )
#MessengeBox . move ( ( ( g t k . gdk . s c r e e n w i d t h ( ) / 2 ) −(k / 2 ) ) , ( g t k . gdk . s c r e e n h e i g h t ( ) ) −(w)
−100)
r e s p o n s e = MessengeBox . run ( )
i f ( r e s p o n s e == −6 ) :
MessengeBox . d e s t r o y ( )
183
184
185
186
187
188
i f ( r e s p o n s e == −3 ) :
print " Shutdown "
MessengeBox . d e s t r o y ( )
temp=" / sbin / shutdown -h now "
o s . system ( temp )
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
s l i d e r ( s e l f , widget , data=None ) :
def
print s e l f . s l i d e r . g e t v a l u e ( )
val = int ( s e l f . s l i d e r . get value () )
s e l f . m i x e r . setvolume ( val , s e l f . c h a n n e l )
s e l f . pcm . setvolume ( val , s e l f . c h a n n e l )
i f ( i n t ( s e l f . m i x e r . getvolume ( ) [ 0 ] ) == 0 ) :
try :
s e l f . m i x e r . se t mu t e ( 1 )
except a l s a a u d i o . ALSAAudioError :
print " Master has no mute switch "
try :
s e l f . p c m . se t mu t e ( 1 )
except a l s a a u d i o . ALSAAudioError :
print " PCM has no mute switch "
else :
try :
s e l f . m i x e r . se t mu t e ( 0 )
except a l s a a u d i o . ALSAAudioError :
print " Master has no mute switch "
try :
s e l f . p c m . se t mu t e ( 0 )
except a l s a a u d i o . ALSAAudioError :
print " PCM has no mute switch "
213
214
215
216
217
218
def
alsa ( self ) :
r e s u l t=True
master=True
pcm=True
f r o n t=True
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
s e l f . c h a n n e l = a l s a a u d i o . MIXER CHANNEL ALL
try :
s e l f . m i x e r = a l s a a u d i o . Mixer ( " Master " )
s e l f . m i x e r . setvolume (90 , s e l f . c h a n n e l )
except a l s a a u d i o . ALSAAudioError :
print " Master n~
a o existe "
master = F a l s e
try :
s e l f . p c m = a l s a a u d i o . Mixer ( " PCM " )
s e l f . pcm . setvolume (90 , s e l f . c h a n n e l )
except a l s a a u d i o . ALSAAudioError :
print " PCM n~
a o existe "
pcm = F a l s e
try :
s e l f . f r o n t = a l s a a u d i o . Mixer ( " Front " )
s e l f . f r o n t . setvolume (90 , s e l f . c h a n n e l )
except a l s a a u d i o . ALSAAudioError :
print " Front n~
a o existe "
front = False
41
42
APÊNDICE B. CÓDIGO-FONTE
i f ( ( master == F a l s e ) and ( pcm == F a l s e ) and ( f r o n t == True ) ) :
s e l f . mixer = s e l f . front
s e l f . pcm = s e l f . f r o n t
240
241
242
243
i f ( ( master == F a l s e ) and ( pcm == True ) and ( f r o n t == F a l s e ) ) :
s e l f . m i x e r = s e l f . pcm
s e l f . pcm = s e l f . pcm
244
245
246
247
i f ( ( master == F a l s e ) and ( pcm == True ) and ( f r o n t == True ) ) :
s e l f . m i x e r = s e l f . pcm
s e l f . pcm = s e l f . f r o n t
248
249
250
251
i f ( ( master == True ) and ( pcm == F a l s e ) and ( f r o n t == F a l s e ) ) :
s e l f . mixer = s e l f . mixer
s e l f . pcm = s e l f . m i x e r
252
253
254
255
i f ( ( master == True ) and ( pcm == F a l s e ) and ( f r o n t == F a l s e ) ) :
s e l f . mixer = s e l f . mixer
s e l f . pcm = s e l f . f r o n t
256
257
258
259
i f ( ( master == True ) and ( pcm == True ) and ( f r o n t == F a l s e ) ) :
s e l f . mixer = s e l f . mixer
s e l f . pcm = s e l f . pcm
260
261
262
263
#Método que t r a t a do p o s i c i o n a m e n t o da j a n e l a .
def
p o s i t i o n ( s e l f , k , w) :
s e l f . move ( 0 , 0 )
#s e l f . move ( 0 , ( g t k . gdk . s c r e e n h e i g h t ( ) / 2 ) −(w/ 2 ) )
264
265
266
267
268
269
#Método para d e s t r u i r a j a n e l a , d e p o i s da f e c h a r .
def
d e s t r o y ( s e l f , widget , data=None ) :
#g t k . m a i n q u i t ( )
s e l f . destroy ()
def
del ( self ) :
print " Adeus "
print s e l f . p
270
271
272
273
274
275
276
277
278
279
280
if
name
== " __main__ " :
win = i n t e r f a c e 2 ( )
g t k . main ( )
B.1.3
program.py
Implementa a leitura dos ficheiros que contêm as aplicações disponı́veis para serem
usadas.
1
2
3
4
5
6
#! / u s r / b i n / env python
# −*− c o d i n g : u t f −8 −*−
#
# author
: H e r c u l a n o O l i v e i r a ( h e r c u l a n o . mc . o l i v e i r a @ g m a i l . com )
#
# description
:
7
8
import os , gtk , Image , math , s t r i n g
9
10
11
12
13
14
c l a s s program ( g t k . Window ) :
table = []
program = [ ]
parent = [ ]
B.1. NAVEGADOR GRÁFICO
15
16
17
18
19
43
def
init
( self , programs file ) :
g t k . Window .
init
( s e l f , g t k .WINDOW TOPLEVEL)
s e l f . set decorated ( False )
s e l f . set border width (4)
#s e l f . m o d i f y b g ( g t k .STATE NORMAL, g t k . gdk . c o l o r p a r s e ( ” b l u e ” ) )
20
21
22
s e l f . c o n n e c t ( " destroy " , s e l f . d e s t r o y )
s e l f . c o n n e c t ( " delete_event " , s e l f . d e s t r o y )
23
24
25
26
27
28
s e l f . program = p r o g r a m s f i l e
f i l e ( s e l f . program )
self .
s e l f . show all ()
[ k , w]= s e l f . g e t s i z e ( )
s e l f . p o s i t i o n ( k , w)
29
30
31
32
33
34
35
36
37
38
imagem ( s e l f , p r e f i x , imagem , x , y , c o r ) :
imagem=p r e f i x + imagem
#I n d i s p o nı́ v e l imagem a p r e t o e br anc o .
i f ( c o r == " P " ) :
im = Image . open ( imagem ) . r e s i z e ( ( x , y ) ) . c o n v e r t ( " L " )
im . s a v e ( imagem )
#D i s p o nı́ v e l imagem a c o r e s .
i f ( c o r == " C " ) :
Image . open ( imagem ) . r e s i z e ( ( x , y ) ) . s a v e ( imagem )
def
39
40
return (
imagem )
41
42
43
44
45
46
47
48
49
50
def
b u t t o n ( s e l f , imagemA , imagemB , program , comment ) :
b u t t o n = g t k . Button ( )
b u t t o n . c o n n e c t ( " clicked " , s e l f . b u t t o n c l i c k e d , program )
i m a g e = g t k . Image ( )
b u t t o n . c o n n e c t o b j e c t ( " event " , s e l f . e v e n t s , s e l f . b u t t o n , imagemA , imagemB ,
image )
i m a g e . s e t f r o m f i l e ( imagemA )
b u t t o n . add ( i m a g e )
t o o l t i p = gtk . T o o l t i p s ( )
t o o l t i p . s e t t i p ( b u t t o n , comment , None )
51
52
return (
button )
53
54
55
56
57
58
def
b u t t o n c l i c k e d ( s e l f , widget , program , data=None ) :
i f ( program == " exit " ) :
s e l f . parent . show all ()
#g t k . m a i n q u i t ( )
s e l f . destroy ()
59
60
61
62
63
else :
temp=program + " & "
o s . system ( temp )
s e l f . destroy ()
64
65
66
67
68
69
def
e v e n t s ( s e l f , widget , event , imagemA , imagemB ,
i f ( e v e n t . t y p e == g t k . gdk . ENTER NOTIFY) :
i m a g e . s e t f r o m f i l e ( imagemB )
[ k , w]= s e l f . g e t s i z e ( )
s e l f . p o s i t i o n ( k , w)
70
71
72
73
74
i f ( e v e n t . t y p e == g t k . gdk . LEAVE NOTIFY) :
i m a g e . s e t f r o m f i l e ( imagemA )
[ k , w]= s e l f . g e t s i z e ( )
s e l f . p o s i t i o n ( k , w)
75
76
77
78
def
f i l e ( self , file open ) :
i = 0
k = 1
image ) :
44
APÊNDICE B. CÓDIGO-FONTE
w = 1
79
80
f i l e = open ( f i l e o p e n , " r " )
LineListes = f i l e . readlines ()
f i l e . close ()
81
82
83
84
#C a l c u l a r o número de c é l u l a s e c r i a m o s uma t a b e l a .
s e l f . t a b l e = g t k . Table ( 4 , i n t ( math . modf ( i n t ( l e n ( L i n e L i s t e s ) / 3 ) / 4 ) [ 1 ] ) +1 , F a l s e )
print l e n ( L i n e L i s t e s ) /3
f o r j in r a n g e ( 0 , l e n ( L i n e L i s t e s ) / 3 ) :
85
86
87
88
89
temp = L i n e L i s t e s [ i ]
imagem = temp [ : l e n ( temp ) −1]
#p r i n t imagem
90
91
92
93
i += 1
temp = L i n e L i s t e s [ i ]
program = temp [ : l e n ( temp ) −1]
#p r i n t program
94
95
96
97
98
i += 1
temp = L i n e L i s t e s [ i ]
comment = temp [ : l e n ( temp ) −1]
99
100
101
102
i +=1
#B o t õ e s .
103
104
105
s e l f . t a b l e . a t t a c h ( s e l f . b u t t o n ( s e l f . imagem ( " __ " , imagem , 1 3 0 , 1 4 2 , " C " ) ,
s e l f . imagem ( " ___ " , imagem , 1 3 0 , 1 4 2 , " P " ) , program , comment ) , k , k+1 , w, w+1
)
w += 1
i f (w > 4 ) :
k += 1
w = 1
106
107
108
109
110
111
s e l f . t a b l e . a t t a c h ( s e l f . b u t t o n ( s e l f . imagem ( " __ " , " previous . png " , 1 2 8 , 1 2 8 , " C
" ) , s e l f . imagem ( " ___ " , " previous . png " , 1 2 8 , 1 2 8 , " P " ) , " exit " , " Retroceder " ) , k
, k+1 , w, w+1 )
s e l f . add ( s e l f . t a b l e )
def
p o s i t i o n ( s e l f , k , w) :
s e l f . move ( 1 4 5 , 0 )
#s e l f . move ( 1 4 5 , ( g t k . gdk . s c r e e n h e i g h t ( ) / 2 ) −(w/ 2 ) )
#s e l f . move ( ( ( ( g t k . gdk . s c r e e n w i d t h ( ) ) / 2 ) −(k / 2 ) ) , ( g t k . gdk . s c r e e n h e i g h t ( ) / 2 ) −(w/ 2 ) )
#s e l f . move ( ( ( g t k . gdk . s c r e e n w i d t h ( ) / 2 ) −(k / 2 ) ) , ( g t k . gdk . s c r e e n h e i g h t ( ) / 2 ) −(w/ 2 ) )
112
113
114
115
116
117
118
119
def run ( s e l f , p a r e n t ) :
s e l f . p a r e n t = parent
#s e l f . p a r e n t . h i d e a l l ( )
120
121
122
123
def
d e s t r o y ( s e l f , widget , data=None ) :
#g t k . m a i n q u i t ( )
#s e l f . p a r e n t . s h o w a l l ( )
s e l f . destroy ()
124
125
126
127
128
def
del ( self ) :
print " Adeus "
#o s . system ( ” rm − r f
129
130
131
*”)
132
133
134
135
if
name
== " __main__ " :
edu = program ( " ed uc a ti vo s_ p la y " )
g t k . main ( )
B.1. NAVEGADOR GRÁFICO
B.1.4
45
setup.py
Implementa a configuração dos ficheiros que definem as aplicações que estão disponı́veis.
1
2
3
4
5
6
#! / u s r / b i n / env python
# −*− c o d i n g : u t f −8 −*−
#
# author
: H e r c u l a n o O l i v e i r a ( h e r c u l a n o . mc . o l i v e i r a @ g m a i l . com )
#
# description
:
7
8
import os , gtk , Image , s t r i n g , math
9
10
c l a s s s e t u p ( g t k . Window ) :
11
12
13
14
15
todos play = [ ]
table = []
program = [ ]
parent = [ ]
16
17
18
19
20
21
22
23
def
init
( self , file open ) :
g t k . Window .
init
( s e l f , g t k .WINDOW TOPLEVEL)
s e l f . set decorated ( False )
s e l f . set border width (4)
#s e l f . m o d i f y b g ( g t k .STATE NORMAL, g t k . gdk . c o l o r p a r s e ( ” r e d ” ) )
s e l f . c o n n e c t ( " destroy " , s e l f . d e s t r o y )
s e l f . c o n n e c t ( " delete_event " , s e l f . d e s t r o y )
24
25
26
self .
self .
program = f i l e o p e n
f i l e o p e n ( s e l f . program )
27
28
29
30
s e l f . show all ()
[ k , w]= s e l f . g e t s i z e ( )
s e l f . p o s i t i o n ( k , w)
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
c h a n g e ( s e l f , word ) :
def
f o r i in r a n g e ( 0 , l e n ( s e l f . t o d o s p l a y ) −1) :
temp = s e l f . t o d o s p l a y [ i ] [ 3 ]
program = temp [ : l e n ( temp ) −1]
i f ( program == word ) :
temp = s e l f . t o d o s p l a y [ i ] [ 1 ]
e s t a d o = temp [ : l e n ( temp ) −1]
i f ( e s t a d o == " disponivel " ) :
s e l f . t o d o s p l a y [ i ] [ 1 ] = " indisponivel \ n "
f i l e w r i t e ( s e l f . program )
self .
return ( i , e s t a d o )
i f ( e s t a d o == " indisponivel " ) :
s e l f . t o d o s p l a y [ i ] [ 1 ] = " disponivel \ n "
self .
f i l e w r i t e ( s e l f . program )
return ( i , e s t a d o )
47
48
49
50
51
def
file write ( self , file write ) :
t o d o s p l a y = open ( f i l e w r i t e , " w " )
i f ( " ludicos_setup " == s e l f . p r o g r a m ) :
e n t r e t e n i m e n t o p l a y = open ( " e n t r e t e n i m e n t o _ p l a y " , " w " )
52
53
54
i f ( " di da t ic os _s e tu p " == s e l f . p r o g r a m ) :
e d u c a t i v o s p l a y = open ( " ed uc a ti vo s_ p la y " , " w " )
55
56
57
58
59
f o r i in r a n g e ( 0 , l e n ( s e l f . t o d o s p l a y ) −1) :
temp = s e l f . t o d o s p l a y [ i ] [ 0 ]
t i p o = temp [ : l e n ( temp ) −1]
46
60
61
APÊNDICE B. CÓDIGO-FONTE
temp = s e l f . t o d o s p l a y [ i ] [ 1 ]
e s t a d o = temp [ : l e n ( temp ) −1]
62
63
64
65
i f ( t i p o == " en tretenim ento " and e s t a d o == " disponivel " and " ludicos_setup " == s e l f .
program ) :
f o r k in r a n g e ( 2 , 5 ) :
entretenimento play . write ( s e l f . todos play [ i ] [ k ] )
66
67
68
69
i f ( t i p o == " educativos " and e s t a d o == " disponivel " and " di da t ic os _s e tu p " == s e l f .
program ) :
f o r k in r a n g e ( 2 , 5 ) :
educativos play . write ( s e l f . todos play [ i ] [ k ] )
70
71
72
f o r j in r a n g e ( 0 , 5 ) :
todos play . write ( s e l f .
todos play [ i ] [ j ])
73
74
75
76
77
78
todos play . close ()
i f ( " di da t ic os _s e tu p " == s e l f . p r o g r a m ) :
educativos play . close ()
i f ( " ludicos_setup " == s e l f . p r o g r a m ) :
entretenimento play . close ()
79
80
81
82
83
84
85
86
87
file open ( self , file open ) :
def
f i l e = open ( f i l e o p e n , " r " )
LineListes = f i l e . readlines ()
f i l e . close ()
s e l f . t o d o s p l a y =[0]
i = 0
k = 1
w = 1
88
89
self .
table
= g t k . Table ( 4 , i n t ( math . modf ( i n t ( l e n ( L i n e L i s t e s ) / 2 ) / 4 ) [ 1 ] ) +1 , F a l s e )
90
91
92
f o r j in r a n g e ( 0 , l e n ( L i n e L i s t e s ) / 5 ) :
s e l f . t o d o s p l a y . i n s e r t ( j , [ L i n e L i s t e s [ i ] , L i n e L i s t e s [ i +1] , L i n e L i s t e s [ i +2] ,
L i n e L i s t e s [ i + 3 ] , L i n e L i s t e s [ i +4] ] )
93
94
95
temp = L i n e L i s t e s [ i +2]
imagem = temp [ : l e n ( temp ) −1]
96
97
98
temp = L i n e L i s t e s [ i +3]
program = temp [ : l e n ( temp ) −1]
99
100
101
temp = L i n e L i s t e s [ i +4]
comment = temp [ : l e n ( temp ) −1]
102
103
104
temp = L i n e L i s t e s [ i +1]
e s t a d o = temp [ : l e n ( temp ) −1]
105
106
107
108
109
110
#B o t õ e s .
i f ( e s t a d o == " disponivel " ) :
s e l f . t a b l e . a t t a c h ( s e l f . b u t t o n ( s e l f . imagem ( " __ " , imagem , 1 2 8 ,
s e l f . imagem ( " ___ " , imagem , 1 2 8 , 1 2 8 , " P " ) , program , comment ) , k ,
+1)
i f ( e s t a d o == " indisponivel " ) :
s e l f . t a b l e . a t t a c h ( s e l f . b u t t o n ( s e l f . imagem ( " __ " , imagem , 1 2 8 ,
s e l f . imagem ( " ___ " , imagem , 1 2 8 , 1 2 8 , " C " ) , program , comment ) , k ,
+1)
111
112
113
114
115
116
117
w += 1
i f (w > 4 ) :
k += 1
w = 1
i +=5
128 , "C" ) ,
k+1 , w, w
128 , "P" ) ,
k+1 , w, w
B.1. NAVEGADOR GRÁFICO
118
119
47
s e l f . t a b l e . a t t a c h ( s e l f . b u t t o n ( s e l f . imagem ( " __ " , " previous . png " , 1 2 8 , 1 2 8 , " C
" ) , s e l f . imagem ( " ___ " , " previous . png " , 1 2 8 , 1 2 8 , " P " , ) , " exit " , " Retroceder " ) ,
k , k+1 , w, w+1)
s e l f . add ( s e l f . t a b l e )
120
121
122
123
124
125
126
127
128
129
imagem ( s e l f , p r e f i x , imagem , x , y , c o r ) :
imagem=p r e f i x + imagem
#I n d i s p o nı́ v e l imagem a p r e t o e br anc o .
i f ( c o r == " P " ) :
im = Image . open ( imagem ) . r e s i z e ( ( x , y ) ) . c o n v e r t ( " L " )
im . s a v e ( imagem )
#D i s p o nı́ v e l imagem a c o r e s .
i f ( c o r == " C " ) :
Image . open ( imagem ) . r e s i z e ( ( x , y ) ) . s a v e ( imagem )
def
130
131
return (
imagem )
132
133
def
134
135
136
137
138
139
140
141
b u t t o n ( s e l f , imagemA , imagemB , program , comment ) :
b u t t o n = g t k . Button ( )
i m a g e = g t k . Image ( )
b u t t o n . c o n n e c t ( " clicked " , s e l f . b u t t o n c l i c k e d , program ,
button ,
image ,
imagemA , imagemB )
b u t t o n . c o n n e c t o b j e c t ( " event " , s e l f . e v e n t s , s e l f . b u t t o n , imagemA , imagemB ,
image )
i m a g e . s e t f r o m f i l e ( imagemA )
b u t t o n . add ( i m a g e )
t o o l t i p = gtk . T o o l t i p s ( )
t o o l t i p . s e t t i p ( b u t t o n , comment , None )
142
143
return (
button )
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
def
b u t t o n c l i c k e d ( s e l f , widget , program ,
data=None ) :
i f ( program == " exit " ) :
#s e l f . p a r e n t . s h o w a l l ( )
s e l f . destroy ()
else :
i f ( program == " iceweasel " ) :
temp=program + " & "
o s . system ( temp )
else :
i f ( program == " terminal " ) :
temp=program + " & "
o s . system ( program+" & " )
else :
[ i , e s t a d o ]= s e l f . c h a n g e ( program )
button ,
i m a g e , imagemA , imagemB ,
159
160
161
temp = s e l f . t o d o s p l a y [ i ] [ 2 ]
imagem = temp [ : l e n ( temp ) −1]
162
163
164
165
166
167
168
i f ( e s t a d o==" disponivel " ) :
s e l f . imagem ( " __ " , imagem , 1 2 8 , 1 2 8 , " P " )
s e l f . imagem ( " ___ " , imagem , 1 2 8 , 1 2 8 , " C " )
i f ( e s t a d o==" indisponivel " ) :
s e l f . imagem ( " __ " , imagem , 1 2 8 , 1 2 8 , " C " )
s e l f . imagem ( " ___ " , imagem , 1 2 8 , 1 2 8 , " P " )
169
170
171
172
173
174
def
e v e n t s ( s e l f , widget , event , imagemA , imagemB ,
i f ( e v e n t . t y p e == g t k . gdk . ENTER NOTIFY) :
i m a g e . s e t f r o m f i l e ( imagemB )
[ k , w]= s e l f . g e t s i z e ( )
s e l f . p o s i t i o n ( k , w)
175
176
177
i f ( e v e n t . t y p e == g t k . gdk . LEAVE NOTIFY) :
i m a g e . s e t f r o m f i l e ( imagemA )
image ) :
48
APÊNDICE B. CÓDIGO-FONTE
[ k , w]= s e l f . g e t s i z e ( )
s e l f . p o s i t i o n ( k , w)
178
179
180
p o s i t i o n ( s e l f , k , w) :
def
s e l f . move ( 2 9 1 , 0 )
#s e l f . move ( ( ( ( g t k . gdk . s c r e e n w i d t h ( ) ) / 2 ) −(k / 2 ) ) , ( g t k . gdk . s c r e e n h e i g h t ( ) / 2 ) −(w/ 2 ) )
#s e l f . move ( 2 9 1 , ( g t k . gdk . s c r e e n h e i g h t ( ) / 2 ) −(w/ 2 ) )
def run ( s e l f , p a r e n t ) :
s e l f . p a r e n t = parent
#s e l f . p a r e n t . h i d e a l l ( )
181
182
183
184
185
186
187
188
d e s t r o y ( s e l f , widget , data=None ) :
def
#s e l f . p a r e n t . s h o w a l l ( )
s e l f . destroy ()
189
190
191
192
del ( self ) :
def
print " Adeus "
#o s . system ( ” rm − r f
193
194
195
*”)
196
197
198
199
if
name
== " __main__ " :
s=s e t u p ( " todos_play " )
g t k . main ( )
B.1.5
bar setup.py
Implementa a barra de configuração do sistema que permite habilitar e desabilitar
aplicações, mudar a palavra-passe, bem como aceder à internet e ao terminal que possibilita alterações mais profundas ao sistema.
1
2
3
4
5
6
#! / u s r / b i n / env python
# −*− c o d i n g : u t f −8 −*−
#
# author
: H e r c u l a n o O l i v e i r a ( h e r c u l a n o . mc . o l i v e i r a @ g m a i l . com )
#
# description
:
7
8
9
10
import os , gtk , Image , s t r i n g , math
from s e t u p import s e t u p
from password import password
11
12
13
14
15
16
17
18
19
20
21
c l a s s b a r s e t u p ( g t k . Window ) :
table = []
parent = [ ]
def
init
( self ) :
g t k . Window .
init
( s e l f , g t k .WINDOW TOPLEVEL)
s e l f . set decorated ( False )
s e l f . set border width (4)
#s e l f . m o d i f y b g ( g t k .STATE NORMAL, g t k . gdk . c o l o r p a r s e ( ” r e d ” ) )
s e l f . c o n n e c t ( " destroy " , s e l f . d e s t r o y )
s e l f . c o n n e c t ( " delete_event " , s e l f . d e s t r o y )
22
23
self .
table
= g t k . Table ( 4 , 1 )
24
25
26
27
28
29
30
#Botão de d i d á t i c o s
[ button did ,
i m a g e d i d ] = s e l f . b u t t o n s ( " gnome - office - config . png " , 1 2 8 , 1 2 8 ,
138 , 138)
b u t t o n d i d . c o n n e c t ( " clicked " , s e l f . b u t t o n d i d a t i c o s )
t o o l t i p = gtk . T o o l t i p s ( )
t o o l t i p . s e t t i p ( b u t t o n d i d , " Programas Didáticos [ Activar / Desactivar ] " , None )
B.1. NAVEGADOR GRÁFICO
31
49
s e l f . t a b l e . a t t a c h ( b u t t o n d i d , 1 , 2 , 2 , 3 , x o p t i o n s=g t k . FILL , y o p t i o n s=g t k . FILL ,
xpadding =0 , ypadding =0)
32
33
34
35
36
37
#Botão de l u d i c o s .
i m a g e l u d ] = s e l f . b u t t o n s ( " gnome - fs - directory - games - config . png " ,
[ button lud ,
128 , 128 , 138 , 138)
b u t t o n l u d . c o n n e c t ( " clicked " , s e l f . b u t t o n l u d i c o s )
t o o l t i p = gtk . T o o l t i p s ( )
t o o l t i p . s e t t i p ( b u t t o n l u d , " Programas Lúdicos [ Activar / Desactivar ] " , None )
38
39
s e l f . t a b l e . a t t a c h ( b u t t o n l u d , 1 , 2 , 3 , 4 , x o p t i o n s=g t k . FILL , y o p t i o n s=g t k . FILL ,
xpadding =0 , ypadding =0)
40
41
42
43
44
45
#Botão de systema .
i m a g e s h u t ] = s e l f . b u t t o n s ( " fileshare - system . png " , 1 2 8 , 1 2 8 , 1 3 8 ,
[ button shut ,
138)
b u t t o n s h u t . c o n n e c t ( " clicked " , s e l f . b u t t o n s y s t e m a )
t o o l t i p = gtk . T o o l t i p s ( )
t o o l t i p . s e t t i p ( b u t t o n s h u t , " Aplicaç~
o es de Sistema " , None )
46
47
self .
t a b l e . a t t a c h ( b u t t o n s h u t , 1 , 2 , 4 , 5 , x o p t i o n s=g t k . FILL , y o p t i o n s=g t k . FILL ,
xpadding =0 , ypadding =0)
48
49
50
51
52
53
54
#Botão de mudar password .
i m a g e p a s s ] = s e l f . b u t t o n s ( " pass . png " , 1 2 8 , 1 2 8 , 1 3 8 , 1 3 8 )
[ button pass ,
b u t t o n p a s s . c o n n e c t ( " clicked " , s e l f . b u t t o n p a s s w o r d )
t o o l t i p = gtk . T o o l t i p s ( )
t o o l t i p . s e t t i p ( b u t t o n p a s s , " Alterar Palavra - Passe " , None )
s e l f . t a b l e . a t t a c h ( b u t t o n p a s s , 1 , 2 , 5 , 6 , x o p t i o n s=g t k . FILL , y o p t i o n s=g t k . FILL ,
xpadding =0 , ypadding =0)
55
56
57
58
59
60
61
#Botão de s a i r .
[ button ex ,
i m a g e e x ] = s e l f . b u t t o n s ( " previous . png " , 1 2 8 , 1 2 8 , 1 3 8 , 1 3 8 )
b u t t o n e x . c o n n e c t ( " clicked " , s e l f . b u t t o n e x i t )
t o o l t i p = gtk . T o o l t i p s ( )
t o o l t i p . s e t t i p ( b u t t o n e x , " Retroceder " , None )
s e l f . t a b l e . a t t a c h ( b u t t o n e x , 1 , 2 , 6 , 7 , x o p t i o n s=g t k . FILL , y o p t i o n s=g t k . FILL ,
xpadding =0 , ypadding =0)
62
63
64
65
66
s e l f . add ( s e l f . t a b l e )
s e l f . show all ()
[ k , w]= s e l f . g e t s i z e ( )
s e l f . p o s i t i o n ( k , w)
67
68
69
70
71
72
73
def
b u t t o n s ( s e l f , imagem , x , y , k , w) :
#Botão de shutdown .
imagem=" ____ " + imagem
Image . open ( imagem ) . r e s i z e ( ( x , y ) ) . s a v e (
i m a g e = g t k . Image ( )
b u t t o n = g t k . Button ( )
imagem )
74
75
76
77
b u t t o n . s e t s i z e r e q u e s t ( k , w)
i m a g e . s e t f r o m f i l e ( imagem )
b u t t o n . add ( i m a g e )
78
79
return (
button ,
image )
80
81
82
83
84
85
86
87
88
def
b u t t o n d i d a t i c o s ( s e l f , widget , data=None ) :
print " Didaticos "
s = s e t u p ( " di da t ic os _s e tu p " )
s . s e t m o d a l ( True )
s . run ( s e l f )
[ k , w]= s e l f . g e t s i z e ( )
s e l f . p o s i t i o n ( k , w)
50
APÊNDICE B. CÓDIGO-FONTE
#s=s e t u p ( ” d i d a t i c o s s e t u p ” )
#s . s e t m o d a l ( True )
#s e l f . d e s t r o y ( )
89
90
91
92
b u t t o n l u d i c o s ( s e l f , widget , data=None ) :
def
print " Ludicos "
s = s e t u p ( " ludicos_setup " )
s . s e t m o d a l ( True )
s . run ( s e l f )
[ k , w]= s e l f . g e t s i z e ( )
s e l f . p o s i t i o n ( k , w)
93
94
95
96
97
98
99
100
#s=s e t u p ( ” l u d i c o s s e t u p ” )
#s . s e t m o d a l ( True )
101
102
103
b u t t o n s y s t e m a ( s e l f , widget , data=None ) :
def
print " System "
s = s e t u p ( " system_setup " )
s . s e t m o d a l ( True )
s . run ( s e l f )
[ k , w]= s e l f . g e t s i z e ( )
s e l f . p o s i t i o n ( k , w)
104
105
106
107
108
109
110
111
#s=s e t u p ( ” s y s t e m s e t u p ” )
#s . s e t m o d a l ( True )
112
113
114
115
def
b u t t o n p a s s w o r d ( s e l f , widget , data=None ) :
print " Mudar password "
p = password ( )
p . s e t m o d a l ( True )
p . run ( s e l f )
[ k , w]= s e l f . g e t s i z e ( )
s e l f . p o s i t i o n ( k , w)
116
117
118
119
120
121
122
123
#p=password ( )
#p . s e t m o d a l ( True )
124
125
126
def
b u t t o n e x i t ( s e l f , widget , data=None ) :
#s e l f . p a r e n t . s h o w a l l ( )
s e l f . destroy ()
127
128
129
130
def
p o s i t i o n ( s e l f , k , w) :
s e l f . move ( 1 4 5 , 0 )
#s e l f . move ( 1 4 5 , ( g t k . gdk . s c r e e n h e i g h t ( ) / 2 ) −(w/ 2 ) )
#s e l f . move ( 7 0 , ( g t k . gdk . s c r e e n h e i g h t ( ) / 2 ) −(w/ 2 ) )
131
132
133
134
135
def run ( s e l f , p a r e n t ) :
s e l f . p a r e n t = parent
#s e l f . p a r e n t . h i d e a l l ( )
136
137
138
139
def
d e s t r o y ( s e l f , widget , data=None ) :
#g t k . m a i n q u i t ( )
s e l f . destroy ()
140
141
142
143
def
del ( self ) :
print " Adeus "
#o s . system ( ” rm − r f
144
145
146
*”)
147
148
149
150
if
name
== " __main__ " :
b=b a r s e t u p ( )
g t k . main ( )
B.1. NAVEGADOR GRÁFICO
B.1.6
51
chave.py
Método que realiza a autentificação do utilizador que possibilita o acesso à barra de
configuração do sistema.
1
2
3
4
5
6
#!/usr/bin/env python
# −*− coding: utf−8 −*−
#
# author
: Herculano Oliveira ( [email protected] )
#
# description
:
7
8
9
import gtk
from bar setup import bar setup
10
11
12
13
14
15
16
class chave(gtk.Dialog):
table = []
entry user = []
entry password = []
parent = []
val = False
17
18
19
20
def init ( self ) :
gtk.Window. init ( self , gtk.WINDOW TOPLEVEL)
self . set title ("Login")
21
22
23
24
25
26
27
self . set decorated(True)
self . set position (gtk.WIN POS NONE)
#self. set default size (300,300)
self . set resizable (False)
self .connect("destroy", self . destroy )
self .connect("delete_event", self. destroy )
28
29
30
31
self . table = gtk.Table(3, 1)
password = gtk.Label("Palavra-Passe: ")
button label = gtk.Label()
32
33
34
35
36
self .
# Faz
self .
self .
entry password = gtk.Entry()
os caracteres de entry parecer ****
entry password. set visibility (False)
entry password.connect(’key-press-event’, self. events )
37
38
39
40
# Cria botao e configura evento
button = gtk.Button("Validar")
button .connect("clicked", self . button clicked)
41
42
# Anexa os widgets na tabela
43
44
45
46
self .
self .
self .
table .attach( password , 1, 2, 2, 3)
table .attach( self . entry password, 1, 2, 3, 4)
table .attach( button , 1, 2, 4, 5)
47
48
self .vbox.pack start( self .
table , True, True, 5)
49
50
51
52
self . show all()
[k,w]=self. get size ()
self . position (k,w)
53
54
55
56
57
def events ( self , widget, event, data=None):
#print event.type
if (event.keyval == 65293):
self . button clicked("clicked")
58
59
60
# Função de click no botão
def button clicked( self , widget, data=None):
52
APÊNDICE B. CÓDIGO-FONTE
# Pega info das entrys quando botão eh clicado.
password text = self . entry password.get text ()
61
62
63
file = open ("password", "r")
LineListes = file . readlines ()
file . close ()
64
65
66
67
temp = LineListes[0]
password = temp[:len(temp)−1]
68
69
70
if ( password text == password):
self . val = True
b = bar setup()
b.set modal(True)
b.run( self . parent )
#b=bar setup()
#b.set modal(True)
self .destroy()
else:
# Altera texto do label3
MessengeBox = gtk.Dialog()
MessengeBox.set modal(True)
MessengeBox.set decorated(False)
Messenge = gtk.Label("Palavra-Passe Incorrecta")
MessengeBox.vbox.pack start(Messenge, True, True, 5)
MessengeBox.add button(gtk.STOCK DIALOG ERROR, gtk.RESPONSE ACCEPT)
MessengeBox.show all()
[k,w]=MessengeBox.get size()
#MessengeBox.move(((gtk.gdk.screen width()/2)−(k/2)+3), (gtk.gdk.screen height())−(w+138))
MessengeBox.move(((gtk.gdk.screen width()/2)−(k/2)), (gtk.gdk.screen height()/2)−(w/2)+10)
MessengeBox.run()
print "Informaç~
ao incorrecta"
MessengeBox.destroy()
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
def button2 clicked( self , button):
#self. parent . show all()
self .destroy()
95
96
97
98
def position ( self , k, w):
#self.move(((gtk.gdk.screen width()/2)−(k/2)), (gtk.gdk.screen height())−(w+140))
self .move(((gtk.gdk.screen width()/2)−(k/2)), (gtk.gdk.screen height()/2)−(w/2))
99
100
101
102
def run( self , parent):
self . parent = parent
#self. parent . hide all ()
103
104
105
106
def destroy ( self , widget, data=None):
#if( self . val == True):
#
self . parent . hide all ()
#else:
#
self . parent . show all()
self .destroy()
107
108
109
110
111
112
113
def del ( self ) :
print "Adeus"
#os.system(”rm −rf
114
115
116
*”)
117
118
119
120
if
name == "__main__":
c=chave()
gtk.main()
B.1. NAVEGADOR GRÁFICO
B.1.7
53
password.py
Método que permite mudar a palavra-passe que controla a configuração do navegador
gráfico.
1
2
3
4
5
6
#! / u s r / b i n / env python
# −*− c o d i n g : u t f −8 −*−
#
# author
: H e r c u l a n o O l i v e i r a ( h e r c u l a n o . mc . o l i v e i r a @ g m a i l . com )
#
# description
:
7
8
import g t k
9
10
11
12
13
14
15
16
c l a s s password ( g t k . D i a l o g ) :
table = []
entry password old = [ ]
entry password new = [ ]
entry password check = [ ]
parent = [ ]
v a l = False
17
18
19
20
def
init
( self ) :
g t k . Window .
init
( s e l f , g t k .WINDOW TOPLEVEL)
s e l f . s e t t i t l e ( "" )
21
22
23
24
25
26
27
s e l f . s e t d e c o r a t e d ( True )
s e l f . s e t p o s i t i o n ( g t k . WIN POS NONE)
#s e l f . s e t d e f a u l t s i z e ( 3 0 0 , 3 0 0 )
s e l f . s e t r e s i z a b l e ( False )
s e l f . c o n n e c t ( " destroy " , s e l f . d e s t r o y )
s e l f . c o n n e c t ( " delete_event " , s e l f . d e s t r o y )
28
29
30
31
32
33
s e l f . t a b l e = g t k . Table ( 4 , 2 )
p a s s w o r d o l d = g t k . L a b e l ( " Palavra - Passe antiga : " )
p a s s w o r d n e w = g t k . L a b e l ( " Palavra - Passe nova : " )
p a s s w o r d c h e c k = g t k . L a b e l ( " Confirmar Palavra - passe nova :
b u t t o n l a b e l = gtk . Label ( )
")
34
35
36
37
38
39
40
41
42
43
44
s e l f . e n t r y p a s s w o r d o l d = g t k . Entry ( )
# Faz o s c a r a c t e r e s de e n t r y p a r e c e r ****
s e l f . entry password old . s e t v i s i b i l i t y ( False )
s e l f . e n t r y p a s s w o r d o l d . c o n n e c t ( ’key - press - event ’ , s e l f . e v e n t s )
s e l f . e n t r y p a s s w o r d n e w = g t k . Entry ( )
s e l f . entry password new . s e t v i s i b i l i t y ( False )
s e l f . e n t r y p a s s w o r d n e w . c o n n e c t ( ’key - press - event ’ , s e l f . e v e n t s )
s e l f . e n t r y p a s s w o r d c h e c k = g t k . Entry ( )
s e l f . entry password check . s e t v i s i b i l i t y ( False )
s e l f . e n t r y p a s s w o r d c h e c k . c o n n e c t ( ’key - press - event ’ , s e l f . e v e n t s )
45
46
47
48
# C r i a botao e c o n f i g u r a e v e n t o
b u t t o n = g t k . Button ( " Validar " )
b u t t o n . c o n n e c t ( " clicked " , s e l f . b u t t o n c l i c k e d )
49
50
# Anexa o s w i d g e t s na t a b e l a
51
52
53
54
55
56
57
58
self
self
self
self
self
self
self
.
.
.
.
.
.
.
table
table
table
table
table
table
table
. attach ( password old , 1 , 2 , 2 , 3)
. attach ( s e l f . entry password old , 2 , 3 , 2 , 3)
. attach ( password new , 1 , 2 , 3 , 4)
. attach ( s e l f . entry password new , 2 , 3 , 3 , 4)
. attach ( password check , 1 , 2 , 4 , 5)
. attach ( s e l f . entry password check , 2 , 3 , 4 , 5)
. attach ( button , 1 , 3 , 5 , 7)
59
60
s e l f . vbox . p a c k s t a r t ( s e l f .
table
, True , True , 5 )
54
APÊNDICE B. CÓDIGO-FONTE
61
s e l f . show all ()
[ k , w]= s e l f . g e t s i z e ( )
s e l f . p o s i t i o n ( k , w)
62
63
64
65
66
67
68
69
70
71
72
73
74
75
e v e n t s ( s e l f , widget , event , data=None ) :
#p r i n t e v e n t . t y p e
i f ( e v e n t . k e y v a l == 6 5 2 9 3 ) :
s e l f . b u t t o n c l i c k e d ( " clicked " )
# Função de c l i c k no botão
def b u t t o n c l i c k e d ( s e l f , widget , data=None ) :
# Pega i n f o das e n t r y s quando botão eh c l i c a d o .
password text old = s e l f . entry password old . get text ()
password text new = s e l f . entry password new . get text ()
password text check = s e l f . entry password check . get text ()
def
76
f i l e = open ( " password " , " r " )
LineListes = f i l e . readlines ()
f i l e . close ()
77
78
79
80
temp = L i n e L i s t e s [ 0 ]
password = temp [ : l e n ( temp ) −1]
81
82
83
p a s s w o r d t e x t o l d == password ) :
i f ( p a s s w o r d t e x t n e w ==
password text check ) :
f i l e = open ( " password " , " w " )
password text new + "\n"
temp =
f i l e . w r i t e ( temp )
f i l e . close ()
s e l f . v a l = True
#s e l f . p a r e n t . s h o w a l l ( )
s e l f . destroy ()
else :
s e l f . M e s s e n g e B o x ( " Password errada ! " )
else :
s e l f . M e s s e n g e B o x ( " Password antiga errada ! " )
if (
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
def
M e s s e n g e B o x ( s e l f , messenge ) :
99
MessengeBox = g t k . D i a l o g ( )
MessengeBox . s e t d e c o r a t e d ( F a l s e )
Messenge = g t k . L a b e l ( messenge )
MessengeBox . s e t m o d a l ( True )
MessengeBox . vbox . p a c k s t a r t ( Messenge , True , True , 5 )
MessengeBox . a d d b u t t o n ( g t k . STOCK DIALOG ERROR, g t k . RESPONSE ACCEPT)
MessengeBox . s h o w a l l ( )
[ k , w]= MessengeBox . g e t s i z e ( )
#MessengeBox . move ( ( ( g t k . gdk . s c r e e n w i d t h ( ) / 2 ) −(k / 2 ) +3) , ( g t k . gdk . s c r e e n h e i g h t ( ) )
−(w+138) )
MessengeBox . move ( ( ( g t k . gdk . s c r e e n w i d t h ( ) / 2 ) −(k / 2 ) +3) , ( g t k . gdk . s c r e e n h e i g h t ( )
/ 2 ) −(w/ 2 ) )
MessengeBox . run ( )
MessengeBox . d e s t r o y ( )
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
def b u t t o n 2 c l i c k e d ( s e l f , b ut to n ) :
s e l f . destroy ()
115
116
117
118
def
p o s i t i o n ( s e l f , k , w) :
#s e l f . move ( ( ( g t k . gdk . s c r e e n w i d t h ( ) / 2 ) −(k / 2 ) ) , ( g t k . gdk . s c r e e n h e i g h t ( ) ) −(w+140) )
s e l f . move ( ( ( g t k . gdk . s c r e e n w i d t h ( ) / 2 ) −(k / 2 ) ) , ( g t k . gdk . s c r e e n h e i g h t ( ) / 2 ) −(w/ 2 ) )
119
120
121
122
123
def run ( s e l f , p a r e n t ) :
s e l f . p a r e n t = parent
#s e l f . p a r e n t . h i d e a l l ( )
B.1. NAVEGADOR GRÁFICO
124
55
def
d e s t r o y ( s e l f , widget , data=None ) :
#s e l f . p a r e n t . s h o w a l l ( )
s e l f . destroy ()
def
del ( self ) :
print " Adeus "
#o s . system ( ” rm − r f
125
126
127
128
129
130
131
132
133
134
if
name
== " __main__ " :
p=password ( )
g t k . main ( )
*”)
Apêndice C
Scripts
Todos estes scripts foram utilizados para auxiliar o processo de configuração da distribuição NuxKids. Existem alguns outros que apenas foram usados como teste ao sistema,
ou eventualmente, não cumpriam as funções para as quais se destinavam. Logo não achamos que tivesse relevância neste relatório.
C.1
C.1.1
Instalação
ZenWalk
Implementa a instalação do ZenWalk a partir da iso de instalação do ZenWalk, ou vai
buscar os pacotes existentes no repositório do ZenWalk.
1
2
3
4
#! / b i n / bash
# author
#
# description
: H e r c u l a n o O l i v e i r a ( h e r c u l a n o . mc . o l i v e i r a @ g m a i l . com )
:
5
6
7
8
TempFile=/TempFiles
L i v e=/L i v e
9
10
11
#Criamos o s d i r e c t o r i o s de t r a b a l h o .
#mkdir −p $ L i v e
12
13
14
mkdir −p $ TempFiles
mkdir −p $ L i v e
15
16
17
18
19
20
21
22
while [ " $ op " != " a " −a " $ op " != " b " ] ; do
echo " Instalar os pacotes a partir de : "
echo " a ) iso do zenwalk "
echo " b ) repositorio do zenwak ( necessario ligacao a internet ) "
echo −ne " >> "
read op
done
23
24
25
26
27
28
29
case " $ op " i n
a)
echo " Esta opcao ainda nao esta implementada agradecemos a compreencao "
#t a r x v z f zenwalk . t a r . gz −C $ TempFiles / t o o l s /
##Montar a ISO .
mkdir $ TempFiles / i s o
56
C.1. INSTALAÇÃO
30
31
32
33
34
35
36
37
38
39
#
40
41
#
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
esac
mount −o l o o p −t i s o 9 6 6 0 $ TempFiles / t o o l s / zenwalk / zenwalk − 5 . 0 . i s o
$ TempFiles / i s o
#I n s t a l a r p a c o t e s Zenwalk Para a d i r e c t o r i a l i v e .
i n s t a l l p k g −r o o t $ L i v e $ TempFiles / i s o / zenwalk / a / * . t g z
i n s t a l l p k g −r o o t $ L i v e $ TempFiles / i s o / zenwalk / ap / * . t g z
i n s t a l l p k g −r o o t $ L i v e $ TempFiles / i s o / zenwalk /d / * . t g z
i n s t a l l p k g −r o o t $ L i v e $ TempFiles / i s o / zenwalk / l / * . t g z
i n s t a l l p k g −r o o t $ L i v e $ TempFiles / i s o / zenwalk /n / * . t g z
i n s t a l l p k g −r o o t $ L i v e $ TempFiles / i s o / zenwalk /x / * . t g z
i n s t a l l p k g −r o o t $ L i v e $ TempFiles / i s o / zenwalk / xap / * . t g z
i n s t a l l p k g −r o o t $ L i v e s o f t w a r e / zenwalk / k e r n e l / k e r n e l s o u r c e −2.6.23.12 −
i486 −50.1. tgz
umount $ TempFiles / i s o
rm − r f $ TempFiles / i s o
;;
b)
echo " Download "
mkdir $ TempFiles / zenwalk
mkdir $ TempFiles / zenwalk / a
cd $ TempFiles / zenwalk / a
wget f t p : / / f t p . nux . i p b . pt /pub/ d i s t s / zenwalk / i 4 8 6 / c u r r e n t / a / * . t g z
mkdir $ TempFiles / zenwalk / ap
cd . . / ap
wget f t p : / / f t p . nux . i p b . pt /pub/ d i s t s / zenwalk / i 4 8 6 / c u r r e n t / ap / * . t g z
mkdir $ TempFiles / zenwalk /d
cd . . / d
wget f t p : / / f t p . nux . i p b . pt /pub/ d i s t s / zenwalk / i 4 8 6 / c u r r e n t /d / * . t g z
mkdir $ TempFiles / zenwalk / l
cd . . / l
wget f t p : / / f t p . nux . i p b . pt /pub/ d i s t s / zenwalk / i 4 8 6 / c u r r e n t / l / * . t g z
mkdir $ TempFiles / zenwalk /n
cd . . / n
wget f t p : / / f t p . nux . i p b . pt /pub/ d i s t s / zenwalk / i 4 8 6 / c u r r e n t /n / * . t g z
mkdir $ TempFiles / zenwalk /x
cd . . / x
wget f t p : / / f t p . nux . i p b . pt /pub/ d i s t s / zenwalk / i 4 8 6 / c u r r e n t /x / * . t g z
mkdir $ TempFiles / zenwalk / xap
cd . . / xap
wget f t p : / / f t p . nux . i p b . pt /pub/ d i s t s / zenwalk / i 4 8 6 / c u r r e n t / xap / * . t g z
mkdir $ TempFiles / zenwalk / e x t r a
mkdir $ TempFiles / zenwalk / e x t r a /d
cd . . / e x t r a /d
wget f t p : / / f t p . nux . i p b . pt /pub/ d i s t s / zenwalk / i 4 8 6 / c u r r e n t / e x t r a /d/
k e r n e l s o u r c e −2.6.24.2 − i 4 8 6 − 5 2 . 1 . t g z
echo " Instar pacotes Zenwalk Para a directoria TempFiles . "
i n s t a l l p k g −r o o t $ L i v e $ TempFiles / zenwalk / a / * . t g z
i n s t a l l p k g −r o o t $ L i v e $ TempFiles / zenwalk / ap / * . t g z
i n s t a l l p k g −r o o t $ L i v e $ TempFiles / zenwalk /d / * . t g z
i n s t a l l p k g −r o o t $ L i v e $ TempFiles / zenwalk / l / * . t g z
i n s t a l l p k g −r o o t $ L i v e $ TempFiles / zenwalk /n / * . t g z
i n s t a l l p k g −r o o t $ L i v e $ TempFiles / zenwalk /x / * . t g z
i n s t a l l p k g −r o o t $ L i v e $ TempFiles / zenwalk / xap / * . t g z
i n s t a l l p k g −r o o t $ L i v e $ TempFiles / zenwalk / e x t r a /d / * . t g z
rm − r f $ TempFiles / zenwalk
;;
57
58
APÊNDICE C. SCRIPTS
C.2
C.2.1
Configuração/Modificação
Placa gráfica e Montagem da Swap
Inicialmente o processo de configuração e montagem da swap passava por este script em
python. É de salientar que os ficheiros que configuram o Xorg já estavam pré-configurados
para uso geral, o que fez com que houvesse alguns problemas com alguns monitores e placas gráficas.
Este ficheiro foi substituı́do por outro script que existe no ZenLive, e que torna este
processo de configuração mais abrangente. No entanto, achamos importante mostrar esta
parte do trabalho realizado.
1
2
3
4
5
6
#! / u s r / b i n / env python
# −*− c o d i n g : u t f −8 −*−
#
# author
: H e r c u l a n o O l i v e i r a ( h e r c u l a n o . mc . o l i v e i r a @ g m a i l . com )
#
# description
:
7
8
import os , commands
9
10
11
12
13
14
15
c o n f i g u r a r=" false "
DIR = " / etc / X11 "
f o r f i l e in o s . l i s t d i r (DIR) :
i f ( f i l e == " xorg . conf " ) :
c o n f i g u r a r=" true "
print " O ficheiro xorg já esta configurado "
16
17
18
19
i f ( c o n f i g u r a r == " false " ) :
#C o n f i g u r a r a p l a c a g r a f i c a .
vga=commands . g e t o u t p u t ( " lspci | grep VGA " )
20
21
e n t r o u = " false "
22
23
24
25
26
27
temp=vga . f i n d ( " nVidia " )
i f ( temp != −1) :
print vga [ temp : l e n ( vga ) ]
o s . system ( " cp / opt / NuxKids / config / system / xorg / xorg . conf - nVidia / etc / X11 / xorg . conf " )
e n t r o u = " true "
28
29
30
31
32
33
temp=vga . f i n d ( " SiS " )
i f ( temp != −1) :
print vga [ temp : l e n ( vga ) ]
o s . system ( " cp / opt / NuxKids / config / system / xorg / xorg . conf - SiS / etc / X11 / xorg . conf " )
e n t r o u = " true "
34
35
36
37
38
39
40
41
42
43
44
45
46
47
temp=vga . f i n d ( " ATI " )
i f ( temp != −1) :
print vga [ temp : l e n ( vga ) ]
o s . system ( " cp / opt / NuxKids / config / system / xorg / xorg . conf - ATI / etc / X11 / xorg . conf " )
e n t r o u = " true "
temp=vga . f i n d ( " ATI " )
temp=vga . f i n d ( " VMware " )
i f ( temp != −1) :
print vga [ temp : l e n ( vga ) ]
o s . system ( " cp / opt / NuxKids / config / system / xorg / xorg . conf - vmware / etc / X11 / xorg . conf " )
e n t r o u = " true "
i f ( e n t r o u==" false " ) :
print " vesa "
C.2. CONFIGURAÇÃO/MODIFICAÇÃO
48
59
o s . system ( " cp / opt / NuxKids / config / system / xorg / xorg . conf - vesa / etc / X11 / xorg . conf " )
49
50
51
52
53
54
c o n f i g u r a r=" false "
a c t i v e s w a p = commands . g e t o u t p u t ( " swapon -s " )
i f ( a c t i v e s w a p . f i n d ( " / dev / " ) != −1) :
c o n f i g u r a r=" true "
print " A partiç~
a o de swap já esta montada "
55
56
i f ( c o n f i g u r a r == " false " ) :
57
58
#C o n f i g u r a r Swap
59
60
swap=commands . g e t o u t p u t ( " fdisk -l | grep swap " )
61
62
63
64
65
66
67
temp=swap . s p l i t ( )
f o r i in r a n g e ( 0 , l e n ( temp ) ) :
i f ( temp [ i ] . f i n d ( " / dev / " ) ==0) :
print " Swap Partition " , temp [ i ]
p a r t i t i o n=" swapon " + temp [ i ]
o s . system ( p a r t i t i o n )
C.2.2
Ambiente gráfico
Todo o processo de configuração do sistema passa por este ficheiro. Também podemos
usar este script em python para configurar um sistema ZenWalk previamente instalado
juntamente com o respectivo pacote NuxKids, transformando-o num sistema NuxKids
instalado no disco rı́gido.
1
2
3
4
5
6
#! / u s r / b i n / env python
# −*− c o d i n g : u t f −8 −*−
#
# author
: H e r c u l a n o O l i v e i r a ( h e r c u l a n o . mc . o l i v e i r a @ g m a i l . com )
#
# description
:
7
8
import s y s , os , commands
9
10
11
12
13
14
def h e l p ( ) :
print " NuxKids - setup vers~
a o beta 0.0.1 "
print " - config [ utilizador ]
Confirurar NuxKids "
print " -- help
Visualizar ajuda "
print " -v
Vers~
a o do programa "
15
16
17
18
19
20
21
22
23
def w a l k d i r c h o w n ( d , u s e r , group ) :
f o r name in o s . l i s t d i r ( d ) :
path = o s . path . j o i n ( d , name )
i f o s . path . i s d i r ( path ) :
o s . chown ( name , u s e r , group )
w a l k d i r c h o w n ( path )
else :
o s . chown ( path + name , u s e r , group )
24
25
26
27
28
29
30
31
32
i f ( l e n ( s y s . a r g v ) == 1 ) :
help ()
sys . exit ()
else :
opt=s y s . a r g v [ 1 ]
i f opt == ’ -- help ’ :
help ()
pass
60
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
APÊNDICE C. SCRIPTS
e l i f opt == ’ -v ’ :
print " NuxKids - setup vers~
a o beta 0.0.1 "
pass
e l i f opt == ’ - config ’ :
e x i s t e=" false "
i f ( l e n ( s y s . a r g v ) == 3 ) :
u s e r=s y s . a r g v [ 2 ]
f i l e = open ( " / etc / passwd " , " r " )
f o r l i n e in f i l e . r e a d l i n e s ( ) :
i f ( l i n e . f i n d ( u s e r ) != −1 ) :
e x i s t e=" true "
f i l e . close ()
i f ( e x i s t e==" false " ) :
print " Utilizador " , u s e r , " N~
a o existe "
help ()
sys . exit ()
else :
print " A configurar utilizador " , u s e r
#C o n f i g u r a r programas para i n i c i a r o s i s t e m a .
or ige m = o s . path . j o i n ( " / opt / NuxKids / config / system / xfce4 / xinitrc " )
d e s t i n o = o s . path . j o i n ( " / home " , u s e r , " . config / xfce4 " )
e x e c u t a r=" cp " + ori gem + " " + d e s t i n o
o s . system ( e x e c u t a r )
#Remover i c o n s do d e s k t o p
or ig em = o s . path . j o i n ( " / opt / NuxKids / config / system / xfce4 / xfdesktoprc " )
d e s t i n o = o s . path . j o i n ( " / home " , u s e r , " . config / xfce4 / desktop " )
e x e c u t a r=" cp " + ori gem + " " + d e s t i n o
o s . system ( e x e c u t a r )
e x e c u t a r=" rm - rf / home / " + u s e r + " / Desktop /* "
o s . system ( e x e c u t a r )
#T e c l a s de a t a l h o .
e s t a d o=" false "
i f i l e = open ( " / usr / share / themes / Default / xfwm4 / keythemerc " , " r " )
o f i l e = open ( " / tmp / ki ds _ ke yt he m er c " , " w " )
f o r l i n e in i f i l e . r e a d l i n e s ( ) :
i f ( e s t a d o==" false " ) :
i f ( l i n e . f i n d ( " pop up_menu _key = " ) == 0 ) :
e s t a d o=" true "
o f i l e . w r i t e ( " po pup_menu _key = None \ n " )
else :
o f i l e . write ( l i n e )
else :
o f i l e . write ( l i n e )
i f i l e . close ()
o f i l e . close ()
o s . system ( " mv / usr / share / themes / Default / xfwm4 / keythemerc / usr / share / themes /
Default / xfwm4 / b a c k u p _ k e y t h e m e r c " )
o s . system ( " mv / tmp / ki ds _ ke yt h em er c / usr / share / themes / Default / xfwm4 / keythemerc " )
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
or ig em = o s . path . j o i n ( " / opt / NuxKids / config / system / xfce4 / " )
d e s t i n o = o s . path . j o i n ( " / home " , u s e r , " . config / xfce4 " )
e x e c u t a r=" cp " + ori gem + " shortcuts . xml " + d e s t i n o + " / mcs_settings "
print e x e c u t a r
o s . system ( e x e c u t a r )
e x e c u t a r=" cp " + ori gem + " NuxKidsKeys . xml " + d e s t i n o + " / shortcuts "
o s . system ( e x e c u t a r )
#C o n f i g u r a r Desktop
e s t a d o=" false "
i f i l e = open ( " / etc / X11 / dm / Sessions / xfce . desktop " , " r " )
o f i l e = open ( " / tmp / kids_xfce . desktop " , " w " )
f o r l i n e in i f i l e . r e a d l i n e s ( ) :
i f ( e s t a d o==" false " ) :
i f ( l i n e . f i n d ( " Exec " ) == 0 ) :
e s t a d o=" true "
o f i l e . w r i t e ( " Exec =/ usr / bin / startxfce4 \ n " )
C.2. CONFIGURAÇÃO/MODIFICAÇÃO
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
61
else :
o f i l e . write ( l i n e )
else :
o f i l e . write ( l i n e )
i f i l e . close ()
o f i l e . close ()
o s . system ( " mv / etc / X11 / dm / Sessions / xfce . desktop / etc / X11 / dm / Sessions / backup_xfce .
desktop " )
o s . system ( " mv / tmp / kids_xfce . desktop / etc / X11 / dm / Sessions / xfce . desktop " )
#C o n f i g u r a r auto l o g i n gdm
e s t a d o=" false "
i f i l e = open ( " / etc / X11 / gdm / custom . conf " , " r " )
o f i l e = open ( " / tmp / kids_custom . conf " , " w " )
f o r l i n e in i f i l e . r e a d l i n e s ( ) :
i f ( e s t a d o==" false " ) :
i f ( l i n e . f i n d ( " [ daemon ] " ) == 0 ) :
o f i l e . write ( l i n e )
e s t a d o=" true "
o f i l e . w r i t e ( " A u t o m a t i c L o g i n E n a b l e = true \ n " )
a u t o l o g i n u s e r=" Au tomaticL ogin = " + u s e r + " \ n "
o f i l e . write ( autologinuser )
else :
o f i l e . write ( l i n e )
else :
i f ( l i n e . f i n d ( " A u t o m a t i c L o g i n E n a b l e = true " ) == 0 ) :
print " Ficheiro --> / etc / X11 / gdm / custom . conf já configurado "
else :
i f ( l i n e . f i n d ( a u t o l o g i n u s e r ) == 0 ) :
print " Ficheiro --> / etc / X11 / gdm / custom . conf já configurado "
else :
o f i l e . write ( l i n e )
i f i l e . close ()
o f i l e . close ()
o s . system ( " mv / etc / X11 / gdm / custom . conf / etc / X11 / gdm / backup_custom . conf " )
o s . system ( " mv / tmp / kids_custom . conf / etc / X11 / gdm / custom . conf " )
#C o n f i g u r a r x f c e 4 s p l a s h
or ige m = o s . path . j o i n ( " / home " , u s e r , " . config / xfce4 - session " )
e s t a d o=" false "
i f i l e = open ( o rig em + " / xfce4 - splash . rc " , " r " )
o f i l e = open ( " / tmp / kids_xfce4 - splash . rc " , " w " )
f o r l i n e in i f i l e . r e a d l i n e s ( ) :
i f ( e s t a d o==" false " ) :
i f ( l i n e . f i n d ( " Image " ) == 0 ) :
e s t a d o=" true "
o f i l e . w r i t e ( " Image =/ opt / NuxKids / img / xfce4 / splash / xfce4_splash . png \ n " )
else :
o f i l e . write ( l i n e )
else :
o f i l e . write ( l i n e )
i f i l e . close ()
o f i l e . close ()
e x e c u t a = " mv " + o ri gem + " / xfce4 - splash . rc " + ori gem + " / backup_xfce4 - splash .
rc "
o s . system ( e x e c u t a )
e x e c u t a = " mv " + " / tmp / kids_xfce4 - splash . rc " + o ri gem + " / xfce4 - splash . rc "
o s . system ( e x e c u t a )
#C o n f i g u r a r Desktop
or ige m = o s . path . j o i n ( " / home " , u s e r , " . config / xfce4 / mcs_settings " )
e s t a d o=" false "
i f i l e = open ( o rig em + " / desktop . xml " , " r " )
o f i l e = open ( " / tmp / kids_desktop . xml " , " w " )
f o r l i n e in i f i l e . r e a d l i n e s ( ) :
i f ( e s t a d o==" false " ) :
i f ( l i n e . f i n d ( " < option name =\" imagepath_0_0 \" type =\" string \" value =\" " ) !=
−1) :
62
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
APÊNDICE C. SCRIPTS
e s t a d o=" true "
o f i l e . w r i t e ( " \t < option name =\" imagepath_0_0 \" type =\" string \" value =\"/ opt /
NuxKids / img / xfce4 / desktop / desktop -1024 x768 . png \"/ >\ n " )
else :
o f i l e . write ( l i n e )
else :
o f i l e . write ( l i n e )
i f i l e . close ()
o f i l e . close ()
e x e c u t a = " mv " + o ri gem + " / desktop . xml " + o ri gem + " / b ackup_d esktop . xml "
o s . system ( e x e c u t a )
e x e c u t a = " mv " + " / tmp / kids_desktop . xml " + o ri gem + " / desktop . xml "
o s . system ( e x e c u t a )
#Terminal
e x e c u t a = " mkdir -p / home / " + u s e r + " /. config / Terminal "
o s . system ( e x e c u t a )
e x e c u t a = " cp / opt / NuxKids / config / user / terminal / terminalrc / home / " + u s e r + " /.
config / Terminal / "
o s . system ( e x e c u t a )
#Mudar a s p r o p r i e d a d e s dos f i c h e i r o s do u s e r .
e x e c u t a = " chown -R " + u s e r + " : users / home / " + u s e r
o s . system ( e x e c u t a )
e x e c u t a = " chown -R " + u s e r + " : users / opt / NuxKids "
o s . system ( e x e c u t a )
#C o n f i g u r a r s e r v i c o s
o s . chmod ( " / etc / rc . d / rc . hald " , 0 6 4 4 )
#A b i l i t a r o shoutdown
e x e c u t a r=" chmod + s " + " / sbin / shutdown "
o s . system ( e x e c u t a r )
pass
else :
print " Faltam parametros "
help ()
sys . exit ()
else :
print " Parametros incorrectos " , opt
help ()
sys . exit ()
C.2.3
Configuração do Kernel
Os passos aqui apresentados prendem-se mais com um processo ilucidativo do trabalho
realizado, do que com os passos a seguir com rigor. O facto de haver alterações das versões
do software faz com que o processo de configuração e compilação dos módulos varie com
alguma regularidade, não sendo, por isso mesmo, fácil apresentar uma solução geral.
Software necessário.
ˆ linux-live-6.2.4
ˆ aufs
ˆ squashfs3.3
ˆ suqashfs-3.3-cvs-fix
ˆ lzma-457
ˆ sqlzma-3.3-457-2
C.2. CONFIGURAÇÃO/MODIFICAÇÃO
Compilação do Kernel.
1
2
3
4
#! / b i n / bash
# author
#
# description
: H e r c u l a n o O l i v e i r a ( h e r c u l a n o . mc . o l i v e i r a @ g m a i l . com )
:
5
6
7
#Versao do k e r n e l .
k e r n e l v e r=$ ( uname −r )
8
9
10
#D i r e c t o r i o Actua .
CWD=$ (pwd)
11
12
13
#D i r e c t o r i o de f i c h e i r o s t e m p o r á r i o s .
TempFiles=" / TempFiles "
14
15
16
17
18
#V e r i f i c a m o s s e e x i s t e m r e s t o s de o u t r a e x e c u c a o .
#i f [ −d / TempFiles ] ; then
#
rm −r f v / TempFile
#f i
19
20
#Criamos o s d i r e c t o r i o s de t r a b a l h o .
21
22
23
#mkdir −p / TempFiles
mkdir −p / TempFiles / t o o l s
24
25
#F i c h e i r o s n e c e s s a r i o s a c o n f i g u r a c a o do s i s t e m a .
26
27
28
t a r x z v f $ TempFiles / s q u a s h f s 3 . 3 . t a r . gz −C $ TempFiles / t o o l s /
#rm − r f $ TempFiles / t o o l s / s q u a s h f s 3 . 3 . t a r . gz
29
30
31
t a r x z v f $ TempFiles / t o o l s / a u f s . t a r . gz −C $ TempFiles / t o o l s /
#rm − r f $ TempFiles / t o o l s / a u f s . t a r . gz
32
33
34
35
mkdir −p $ TempFiles / t o o l s / sqlzma−patch
t a r x v j f $ TempFiles / t o o l s / sqlzma3 .3 −457 −2. t a r . bz2 −C $ TempFiles / t o o l s / sqlzma−patch /
#rm − r f $ TempFiles / t o o l s / sqlzma3 .3 −457 −2. t a r . bz2
36
37
38
39
mkdir −p $ TempFiles / t o o l s / lzma457
t a r x v j f $ TempFiles / t o o l s / lzma457 . t a r . bz2 −C $ TempFiles / t o o l s / lzma457 /
#rm − r f $ TempFiles / t o o l s / lzma457 . t a r . bz2
40
41
42
t a r x z v f $ TempFiles / t o o l s / l i n u x −l i v e − 6 . 2 . 4 . t a r . gz −C $ TempFiles / t o o l s /
#rm − r f $ TempFiles / t o o l s / l i n u x −l i v e − 6 . 2 . 4 . t a r . gz
43
44
45
46
echo " Compile Kernel "
kernelver =2.6.25.4
k e r n e l=" / usr / src / linux - $ kernelver "
47
48
49
cd $ k e r n e l
cp −f v / boot / c o n f i g − $ k e r n e l v e r $ k e r n e l / . c o n f i g
50
51
make o l d c o n f i g
| | exit 1
52
53
#D e s a b i l i t a m o s a opção CONFIG SQUASHFS
54
55
56
57
sed − i " s / C ON FI G _S QU AS H FS = m /# CO NF I G_ SQ UA S HF S is not set / g " . c o n f i g
sed − i −e " /# C O N F I G _ S Q U A S H F S _ E M B E D D E D is not set / d " . c o n f i g
sed − i −e " / C O N F I G _ S Q U A S H F S _ F R A G M E N T _ C A C H E _ S I Z E =3/ d " . c o n f i g
58
59
make | | e x i t 1
60
61
62
make m o d u l e s i n s t a l l
| | exit 1
63
64
63
64
65
66
67
68
69
APÊNDICE C. SCRIPTS
echo " Copy Boot Files "
rm − r f / boot / c o n f i g − $ k e r n e l v e r
rm − r f / boot / vmlinuz− $ k e r n e l v e r
rm − r f / boot / System . map− $ k e r n e l v e r
rm − r f / boot / c o n f i g
rm − r f / boot / vmlinuz
rm − r f / boot / System . map
70
71
72
73
cp −v $ k e r n e l / . c o n f i g / boot / c o n f i g − $ k e r n e l v e r
cp −v $ k e r n e l / a r c h / i 3 8 6 / boot / bzImage / boot / vmlinuz− $ k e r n e l v e r
cp −v $ k e r n e l / System . map / boot / System . map− $ k e r n e l v e r
74
75
76
77
l n − s f / boot / vmlinuz− $ k e r n e l v e r / boot / vmlinuz
l n − s f / boot / System . map− $ k e r n e l v e r / boot / System . map
l n − s f / boot / c o n f i g − $ k e r n e l v e r / boot / c o n f i g
78
79
80
81
82
83
##Compilar Aufs .
echo " AUFS "
a u f s=" $ TempFiles / tools / aufs "
cd $ a u f s
cp l o c a l . mk M a k e f i l e
84
85
86
87
88
sed
sed
sed
sed
−i
−i
−i
−i
" s / KDIR =
" s / expert
" s / expert
" s / expert
.*/ KDIR = \/ usr \/ src \/ linux - $ kernelver / g " M a k e f i l e
C O N F I G _ A U F S _ F A K E _ D M =.*/# expert C O N F I G _ AU F S _ F A K E = n / g " M a k e f i l e
C O N F I G _ A U F S _ D E B U G =.*/# expert C O N F I G _ A U F S _ D E B U G = n / g " M a k e f i l e
C O N F I G _ A U F S _ S Y S A U F S =.*/# expert C O N F I G _ A U F S _ S Y S A U F S = n / g " M a k e f i l e
89
90
make | | e x i t 1
91
92
93
mkdir −p / l i b / modules / $ k e r n e l v e r / k e r n e l / f s / a u f s
cp −v f $ a u f s / f s / a u f s / a u f s . ko / l i b / modules / $ k e r n e l v e r / k e r n e l / f s / a u f s /
94
95
96
97
98
#Pacth K e r n e l sqlzma
cd / u s r / s r c
echo " Pacth Kernel sqlzma "
sed −e " s / linux -2.6.24.3/ linux - $ kernelver / g "
patch | patch −p0
$ TempFiles / t o o l s / sqlzma−patch / sqlzma2k − 3 . 3 .
99
100
101
102
#SquashFS com LZMA
cd $ TempFiles / t o o l s / sqlzma−patch
echo " SquashFS com LZMA "
103
104
105
106
107
108
sed − i " s / lzma449 / lzma457 / g " sqlzma1 −449. patch
cd . .
patch −p0 < sqlzma−patch / sqlzma1 −449. patch
patch −p0 < sqlzma−patch / sqlzma2k − 3 . 3 . patch
cd . / sqlzma−patch / * . /
109
110
111
112
113
sed
sed
sed
sed
−i
−i
−i
−i
" s / LzmaVer = .*/ LzmaVer = lzma457 / g " M a k e f i l e
" s / KDir =.*/ KDir = \/ lib \/ modules \/ $ kernelver \/ build / g " M a k e f i l e
" s / SqFs = .*/ SqFs = \ $ { KDIR }\/ fs \/ squashfs / g " M a k e f i l e
" s / C ON FI G _S QU AS H FS = .*/ C ON F IG _S QU A SH FS = / g " M a k e f i l e
114
115
make | | e x i t 1
116
117
118
119
cp −v f $ TempFiles / t o o l s / s q u a s h f s 3 . 3 / s q u a s h f s −t o o l s /{mk, un} s q u a s h f s / u s r / b i n
mkdir −vp / l i b / modules / $ k e r n e l v e r / k e r n e l / f s / s q u a s h f s
cp −v f $ TempFiles / t o o l s / lzma457 /C/ Compress /Lzma/kmod/{ sq , un} lzma . ko / l i b / modules /
$kernelver / kernel / fs / squashfs /
C.3. CRIAÇÃO
C.3
C.3.1
65
Criação
pkg e lzm
Dado o directório de trabalho cria o respectivo pacote .tgz e o módulo respectivo .lzm.
1
2
3
4
5
#! / b i n / bash
#
# author
#
# description
: H e r c u l a n o O l i v e i r a ( h e r c u l a n o . mc . o l i v e i r a @ g m a i l . com )
:
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
CWD=$ (pwd)
d i r=$ 1
i f [ ! −n " $ 1 " ] ; then
echo " Falta o directorio de trabalho "
echo " make - pkg [ dir name ] "
else
i f [ ! −d $CWD/ $ d i r ] ; then
echo " N~
a o existe o directório $ CWD / tools / $ dir "
else
rm − r f $ d i r . t g z
rm − r f $ d i r . md5
rm − r f $ d i r . lzm
rm − r f $ ( f i n d $ d i r −name " *~ " )
rm − r f $ ( f i n d $ d i r −name " _ * " )
chown −R r o o t : u s e r s $ d i r
cd $CWD/ $ d i r
23
/ s b i n /makepkg − l y −c n $CWD/ $ d i r . t g z
cd $CWD
md5sum $ d i r . t g z > $CWD/ $ d i r . md5
t g z 2 l z m $ d i r . t g z $ d i r . lzm
24
25
26
27
fi
28
29
fi
C.3.2
Kernel-2.6.25.4-i486.52.live.tgz
Depois de configurar e compilar o kernel executamos este script para criar o respectivo
pacote .tgz de modo a não ser mais necessário a compilação do Kernel para aquela versão.
1
2
3
4
#! / b i n / bash
# author
#
# description
: H e r c u l a n o O l i v e i r a ( h e r c u l a n o . mc . o l i v e i r a @ g m a i l . com )
:
5
6
7
CWD=$ (pwd)
kernelver =2.6.25.4
8
9
10
11
12
13
14
15
16
17
18
i f [ −d ˜/ package−k e r n e l ] ; then
rm −r v ˜/ package−k e r n e l
fi
mkdir −p ˜/ package−k e r n e l
cd l i n u x − $ k e r n e l v e r /
INSTALL MOD PATH=˜/package−k e r n e l / make m o d u l e s i n s t a l l
mkdir −p ˜/ package−k e r n e l / boot
mkdir −p ˜/ package−k e r n e l / e t c / r c . d
mkdir −p ˜/ package−k e r n e l / i n s t a l l
cp a r c h / i 3 8 6 / boot / bzImage ˜/ package−k e r n e l / boot / vmlinuz− $ k e r n e l v e r
66
19
20
21
APÊNDICE C. SCRIPTS
cp . c o n f i g ˜/ package−k e r n e l / boot / c o n f i g − $ k e r n e l v e r
cp System . map ˜/ package−k e r n e l / boot / System . map− $ k e r n e l v e r
cd . .
22
23
24
cp / l i b / modules / $ k e r n e l v e r / k e r n e l / f s / s q u a s h f s / * ˜/ package−k e r n e l / l i b / modules / $ k e r n e l v e r /
kernel / fs / squashfs /
cp / l i b / modules / $ k e r n e l v e r / k e r n e l / f s / a u f s / a u f s . ko ˜/ package−k e r n e l / l i b / modules / $ k e r n e l v e r
/ kernel / fs / aufs /
25
26
27
28
29
30
31
32
33
34
35
36
37
rm ˜/ package−k e r n e l / l i b / modules / $ k e r n e l v e r / modules . *
depmod −b ˜/ package−k e r n e l / $ k e r n e l v e r
cp / e t c / r c . d/ r c . modules ˜/ package−k e r n e l / e t c / r c . d/
cat $CWD/ s l a c k −d e s c . k e r n e l > ˜/ package−k e r n e l / i n s t a l l / s l a c k −d e s c
cd ˜/ package−k e r n e l / boot /
l n − s f vmlinuz− $ k e r n e l v e r vmlinuz
l n − s f System . map− $ k e r n e l v e r System . map
l n − s f c o n f i g −$ k e r n e l v e r c o n f i g
cd . .
f i n d . −exec touch {} \ ;
chown −R r o o t : r o o t .
makepkg − l y −c n ˜/ k e r n e l − $ k e r n e l v e r −i 4 8 6 −52. l i v e . t g z
C.3.3
Converter pkg, lzm e directórios
Converter pacotes .tgz para módulos .lzm, converte directórios para módulos .lzm e
vice-versa.
1
2
3
4
5
6
#! / u s r / b i n / env python
# −*− c o d i n g : u t f −8 −*−
#
# author
: H e r c u l a n o O l i v e i r a ( h e r c u l a n o . mc . o l i v e i r a @ g m a i l . com )
#
# description
:
7
8
import s y s , os , commands
9
10
11
12
13
14
c l a s s lzm :
version = [ ]
tipo = []
dir = []
dirwork = [ ]
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
def
init
( self ) :
arg = l e n ( sys . argv )
i f ( arg < 3) :
s e l f . help ()
sys . exit ()
else :
s e l f . t i p o = sys . argv [ 1 ]
self .
d i r = sys . argv [ 2 ]
s e l f . v e r s i o n = sys . argv [ 3 ]
s e l f . dirwork = s e l f .
d i r + " -" + s e l f . v e r s i o n
i f ( s e l f . t i p o == " -- help " ) :
s e l f . help ()
i f ( ( s e l f . t i p o == " install " ) or ( s e l f . t i p o == " tgz2lzm " ) or ( s e l f .
" dir2lzm " ) ) :
i f ( ( s e l f . t i p o == " install " ) or ( s e l f . t i p o == " tgz2lzm " ) ) :
e x e c u t a = " rm - rf " + s e l f . d i r w o r k
o s . system ( e x e c u t a )
o s . mkdir ( s e l f . d i r w o r k )
self . walk dir ( self .
dir )
i f ( ( s e l f . t i p o == " dir2lzm " ) ) :
s e l f . dir2lzm ()
tipo
==
C.3. CRIAÇÃO
else :
s e l f . help ()
help ( self ) :
def
print " NuxKids build lzm "
print " lzm [ tipo ] [ dir ] [ version ] "
print " -- help
Visualizar ajuda "
print " [ tipo ] "
print " install -> Para instalar os tgz para um dado directório "
print " tgz2lzm -> Para converte tgz para lzm "
print " dir2lzm -> Para converter directórios para lzm "
print " [ dir ] "
print "
-> Indicamos o directório de trabalho "
print " [ version ] "
print "
-> A vers~
a o do nosso trabalho "
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
dir2lzm ( s e l f ) :
def
d i r + " / " + s e l f . d i r w o r k + " . lzm "
e x e c u t a = " dir2lzm " + s e l f .
o s . system ( e x e c u t a )
def
walk dir ( self , dir ) :
f o r name in o s . l i s t d i r ( d i r ) :
path = o s . path . j o i n ( d i r , name )
i f o s . path . i s d i r ( path ) :
s e l f . w a l k d i r ( path )
else :
i f ( name . e n d s w i t h ( " . tgz " ) ) :
i f ( s e l f . t i p o == " install " ) :
e x e c u t a = " installpkg - root " + s e l f . d i r w o r k + " / " + path
o s . system ( e x e c u t a )
i f ( s e l f . t i p o == " tgz2lzm " ) :
temp = name [ : l e n ( name ) −4]
module = temp + " . lzm "
e x e c u t a=" tgz2lzm " + path + " " + s e l f . d i r w o r k + " / " + module
o s . system ( e x e c u t a )
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
if
name
l=lzm ( )
== " __main__ " :
67
Apêndice D
Modificação/Configuração Manual
D.1
Modificação do Código-Fonte do xfdesktop
1 Realizar o download do código-fonte do xfdesktop.
svn co http://svn.xfce.org/svn/xfce/xfdesktop/trunk xfdesktop
2 Alteração ao contéudo do ficheiro xfdesktop-icon.c.
vi xfdesktop/src/xfdesktop-icon.c
2.1 Procurar pelas linhas de código que contém o seguinte:
xfdesktop icon menu popup(XfdesktopIcon *icon)
{
<g return if fail(XFDESKTOP IS ICON(icon));>
<g signal emit(G OBJECT(icon), signals[SIG MENU POPUP], 0, NULL);>
}
2.2 Alterar pelo seguinte:
xfdesktop icon menu popup(XfdesktopIcon *icon)
{
\\ <g return if fail(XFDESKTOP IS ICON(icon));>
\\ <g signal emit(G OBJECT(icon), signals[SIG MENU POPUP], 0, NULL);>
}
3 Gerar novo ficheiro do xfdesktop.
3.1 Configurar
xfdesktop/autogen.sh
3.2 Compilar
make
68
D.2. MODIFICAR APLICAÇÕES
69
3.3 Copiar o ficheiro binário
cp xfdesktop/src/xfdesktop /usr/bin/xfdesktop kids
D.2
Modificar Aplicações
O ficheiro que possibilita alterar as aplicações que estão presentes no sistema encontrase nesta secção devidamente comentado para que seja fácil a sua compreensão. É de
salientar que o ficheiro original não pode ter este tipo de comentários, pois a versão actual não suporta esta funcionalidade.
#Todos os ficheiros obedecem às mesmas regras.
#Existem tr^
es tipos de ficheiros diferentes que s~
ao:
#
#didaticos_setup
#ludicos_setup
#sistem_setup
#
#Tipo de aplicaç~
ao.
#Este tipo pode variar entre:
#
#educativos
#entretenimento
#internet
#system
#
educativos
#Indica se a aplicaç~
ao está disponı́vel às crianças
disponivel
#Imagem associada à aplicaç~
ao.
tetravex.png
#Comando a ser executado para fazer funcionar a aplicaç~
ao.
gnotravex
#Comentário breve sobre o que a aplicaç~
ao faz
Puzzle para juntar números iguais face com face.
...
Apêndice E
Questionário
E.1
Enquadramento
O projecto tem como objectivo principal desenvolver uma distribuição de Linux que
vá ao encontro das necessidades de aprendizagem das crianças. Facilidade, compreensão,
motivação, educação são pontos chave para esta distribuição.
O Linux é um sistema operativo que tem cada vez mais utilizadores. Contudo, existe
ainda muito trabalho pela frente para torná-lo um sistema operativo popular, de modo a
que as pessoas não tenham receio de o usar. Com este projecto pretendeu-se dar mais um
passo nesse sentido. Por vezes, é mais fácil mudar as mentalidades das crianças do que as
dos próprios adultos.
E.2
Objectivo
O objectivo deste questionário é saber qual a aceitação das pessoas a projectos deste
tipo, bem como saber se conhecem o sistema operativo Linux.
Este questionário deve ser apenas preenchido por educadores.
70
E.2. OBJECTIVO
71
Questionário
1. Sabe o que é um LiveCD ?
Sim
Não
2. Conhece o Linux como sistema operativo ?
Sim
Não
3. Acha interessante existir um LiveCD com jogos didácticos e de
entretenimento para as crianças?
Sim
Não
4. Qual a sua primeira impressão quando ouviu falar deste LiveCD para
crianças?
Muito Boa
Boa
Suficiente
Insuficiente
5. Da sua experiência a lidar com crianças pode indicar qual a
impressão que as crianças tiveram ao LiveCD?
Muito Boa
Boa
Suficiente
Insuficiente
6. Das necessidades que uma criança tem na sua aprendizagem, este
LiveCD pode ajudar a criança a desenvolver-se?
Sim
Não
7. Da sua impressão sobre o CD, tem alguma crítica? Algum aspecto
que gostaria de ver diferente?
Obrigado!