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!