Anúncios

DonkeyMails.com: No Minimum Payout

quarta-feira, 3 de outubro de 2012

Tutorial HTML 5 - Jogos

Olá pessoal! Depois de alguns meses, estou aqui novamente...

Desta vez, venho rapidamente para deixar um tutorial externo para a criação de jogos 2D em HTML5 (Canvas + JS). Como o último assunto que eu estava tratando aqui no Blog era exatamente a nova "versão" do HTML, achei que seria interessante divulgar um tutorial bem legal sobre o desenvolvimento de jogos utilizando os novos recursos da mesma. Infelizmente, ele se encontra em inglês, mas, mesmo que você não tenha o domínio de tal idioma, recomendo muito que dê uma olhada, mesmo que precise utilizar um tradutor.
HTML5 Rocks - No Tears Guide to HTML5 Games

Nesse site, inclusive, há um amontoado de tutoriais sobre HTML5 (bom, esse é um dos objetivos dele), portanto, façam bom proveito!

Se quiserem um exemplo de joguinho sendo desenvolvido baseado nesse tutorial, podem conferir uma "aberração" que estou desenvolvendo para um trabalho da faculdade (disciplina de Desenvolvimento de Páginas Web).

Creio que isto seja tudo por enquanto...
Até a próxima!


PS: Quanto ao tutorial de HTML5 que eu estava fazendo e quanto a própria continuidade de blog, pretendo dar seguimento a ambos, porem ainda não possuo uma previsão de quando irei trazer este blog de "volta a vida".



domingo, 27 de maio de 2012

Tutorial HTML 5, parte 2 - Diagramação

Vamos a questão da diagramação!

Anteriormente, quando fazíamos a diagramação de nossos sites, utilizávamos <div>, <div> e mais <div>... bom, isso não mudou muito, porem, agora, ao invés de criarmos um <div> para para definirmos os setores de nosso layout, temos um conjunto de tags para tornar mais lógica a distribuição do conteúdo de nossas páginas, facilitando o trabalho de ferramentas de indexação e, até mesmo, de acessibilidade. São essas tags:
  • <header></header> : define o "cabeçalho" de sua página ou de seções da mesma, ou seja, na maioria dos sites, onde ficam o logotipo e/ou título da página e opções de navegação, e, no caso de seções, onde se encontram o título e eventuais descrições;
  • <nav></nav> : define as opções de navegação, ou seja, é a área onde se definem os menus (listas) de navegação para as páginas de seu site;
  • <article></article> : define um artigo ou, de forma mais "clara", uma área de página que reúne um determinado tipo de conteúdo, como, por exemplo, as de postagens de um blog;
  • <section></section> : define uma seção "genérica" de uma página, ou seja, uma parte "qualquer" de uma página (eu, normalmente, o utilizo para separar elementos relacionados, como, no caso de um blog, cada post);
  • <aside></aside> : define uma área lateral ao conteúdo principal da página, como uma barra lateral ou menu lateral (se fossemos utilizar este blog como exemplo e ele fosse construído utilizando HTML 5, a área a direita desta postagem poderia ser montada dentro de uma tag "aside");
  • <footer></footer> : assim como a tag <header> define um cabeçalho, a tag <footer> define um rodapé, seja de uma página, seja de uma seção.
Atualmente, com HTML 5, a estruturação de uma página se baseia principalmente nesses elementos. A tag "div" com função de "container", hoje em dia, eu diria servir apenas para definir as propriedades do corpo (body). O uso de "divs" para o estruturar o conteúdo dos elementos citados, continua, praticamente, o mesmo, porem já existem alguns elementos para algumas dessas "utilidades", como é o caso da tag <hgroup>, que agrupa elementos de cabeçalho (h1 a h6) subsequentes em uma página (por exemplo, quando temos um título e um subtítulo utilizando, respectivamente, as tag <h1> e <h2>, podemos agrupá-los em uma tag <hgroup></hgroup>).
Para demonstrar esse novo método de estruturação, abaixo segue um exemplo teórico e bem simples (sem qualquer conteúdo), seguido de um link para um exemplo "prático" bem simples que eu, inclusive, utilizei recentemente para um trabalho da faculdade.

1:  <!DOCTYPE html>  
2:  <html>  
3:  <head>  
4:       <title>Meu blog</title>  
5:  </head>  
6:  <body>  
7:       <header>  
8:            <h1>Meu blog</h1>  
9:            <nav>  
10:                 <ul>  
11:                      <li><a href="#">Home</a></li>  
12:                      <li><a href="#">Outra página</a></li>  
13:                      <li><a href="#">Uma terceira página</a></li>  
14:                 </ul>  
15:            </nav>  
16:       </header>       
17:         
18:       <article id="art_postagens">  
19:              
20:            <section class="postagem">  
21:                 <header>  
22:                      <hgroup>  
23:                           <h3>Seja bem vindo ao blog "Meu blog"!</h3>  
24:                           <h4>Aqui você encontra muito conteúdo interessante</h4>  
25:                      </hgroup>                      
26:                 </header>  
27:                 <div class="sectioncontent">  
28:                      <p>Este é apenas um texto introdutório, com o intuito de promover esta página...</p>  
29:                      <p>Falta de criatividade para redigir um texto que faça algum sentido para um mero exemplo é um problema.</p>  
30:                 </div>       
31:            </section>  
32:              
33:            <section class="postagem">  
34:                 <header>  
35:                      <hgroup>  
36:                           <h3>Uma segunda postagem qualquer...</h3>  
37:                           <h4>Nãoi consegui pensar em nada melhor para escrever aqui.</h4>  
38:                      </hgroup>                      
39:                 </header>  
40:                 <div class="sectioncontent">  
41:                      <p>Ainda bem que escolhi fazer Sistemas de Informação a Letras, pois não tenho a mínima criatividade para escrever.</p>  
42:                 </div>       
43:            </section>  
44:              
45:       </article>  
46:         
47:       <aside id="sidebar_amigos">  
48:            <section class="listablogs">  
49:                 <h4>Blogs amigos:</h4>  
50:                 <ul>  
51:                           <li><a href="#">GcmInfo</a></li>  
52:                           <li><a href="#">Blog do José</a></li>  
53:                           <li><a href="#">Blog da Maria</a></li>  
54:                 </ul>  
55:            </section>  
56:       </aside>  
57:         
58:       <footer>  
59:            <p>Desenvolvido por Guilherme Caeiro de Mattos.</p>  
60:       </footer>  
61:         
62:  </body>  
63:  </html>  


Agora, ao exemplo mais prático:
Para visualizá-lo, basta clicar em "exemplo" abaixo e, para visualizar o código do mesmo, basta, em seu navegador, procurar pela opção "Visualizar/Exibir código fonte" ou, na maioria dos casos, apertar em seu teclado "CTRL + U".

Exemplo




Bom, acho que isto foi tudo por enquanto.

Quanto ao próximo post, não tenho certeza do que irei tratar, porem, quando resolver isso, editarei esta postagem e começarei a escrever a próxima.
Ah! Também é possível que eu edite esta para adicionar algo que possa ter ficado faltando (por exemplo, estou pensando em comentar o código HTML postado aqui, apesar de o mesmo já ser meio "auto explicativo".


Tutorial HTML 5, parte 3 - ...

As formatações efetuadas nos comandos e trechos de arquivos de configuração foram geradas utilizando a "ferramenta" Source Code Formatter, encontrada neste link.

Tutorial HTML5, parte 1 - Introdução

Como prometido, mesmo que com um pouco de atraso (na realidade, muito atraso), hoje estou aqui para iniciar um tutorial básico sobre HTML5, onde irei tratar das principais alterações estruturais, novos elementos e algumas coisas mais.
Eu gostaria de enfatizar que, por ser algo bem básico, este será apenas uma espécia "resumo" das novidades trazidas pela nova versão da linguagem de marcação HTML, mas, para não ficar apenas na "teoria", tentarei fazer uso de exemplos práticos e, é claro, não entrarei nas questões "básicas" do HTML, tendo em vista que este tutorial se dirige a pessoas que já tenham, pelo menos, a base da versão anterior.

Bom, como a grande maioria já deve saber, a linguagem de marcação HTML (HyperText Markup Language) teve seu conceito formulado bem no final da década de 80 e sua publicação apenas em 1991. De lá para cá, já se foram duas décadas e a linguagem recebeu um total de 4 versões e alguns updates dessas versões (atualmente, o padrão vigente é o 4.01), e já foi, inclusive, "sucedida" pelo XHTML. 
Mesmo assim, desde de 2008, o W3C, visando substituir os padrões HTML 4.01 e o XHTML, aderiu ao desenvolvimento do HTML 5,que já estava sendo desenvolvido por outro grupo desde 2004.

Atualmente, esse nova versão já se encontra quase ao ponto de ser oficialmente lançada e, inclusive, já é parcialmente suportada (pelo menos, os principais recursos) por quase todos os principais navegadores atualmente no mercado.


Com essa nova versão do HTML, busca-se, dentre outras coisas, criar uma semântica clara no código, facilitar a acessibilidade, reduzir o uso de plugins (como o Flash) para adição conteúdo animado e interativo, adicionar novas tags para trabalhar com conteúdo comummente utilizado (como audio e vídeo), reduzindo a necessidade de scripts, e permitir a execução das páginas em qualquer dispositivo.


Agora, deixando de "blá, blá, blá" , vamos a estrutura básica de uma página HTML 5:

 <!DOCTYPE html>  
 <html>  
 <head>  
    <title>Título da pagina</title>  
 </head>  
 <body>  
 </body>  
 </html>  

Como é possível perceber, a estrutura é idêntica a da versão anterior do HTML, porem, há uma única "particularidade", a declaração do "DOCTYPE", onde agora só é especificado como "html".
 
 <!DOCTYPE html>  

Todo o resto, que antes era declarado dentro do DOCTYPE, agora fica a cargo do navegador.

Bom, eu sei que este post foi bem curto, mas pretendo começar o tutorial propriamente dito na próxima postagem, falando da questão da diagramação e os novos elementos para tal.

 Tutorial HTML5, parte 2 - Diagramação

As formatações efetuadas nos comandos e trechos de arquivos de configuração foram geradas utilizando a "ferramenta" Source Code Formatter, encontrada neste link.

segunda-feira, 30 de abril de 2012

De volta ao mundo dos vivos!

Fala, pessoal!

Já faz quase um ano desde que postei algo aqui pela última vez! Os motivos que causaram isso foram diversos, sendo os principais falta de tempo e preguiça (quando tinha tempo)! Por diversas vezes, pensei até em reviver o blog, mas sempre desanimava, como aconteceu quando o Windows 8 Developer Preview foi lançado. Eu cheguei até a instalar o S.O. e gravar um vídeo enquanto o testava, mas desanimei na hora de publicar a postagem.

De qualquer maneira, de lá para cá, muita coisa aconteceu: terminei o Ensino Médio, o curso técnico de Informática, fui contratado pela escola onde estagiava, pouco tempo depois me demiti (não foi por problemas com a empresa, mas por falta de tempo mesmo) e, agora, estou meio que "prestando serviços" para lá. Além disso, no fim do ano passado, fiz o ENEM e dois vestibulares: um para Ciência da Computação na UERJ (Universidade do Estado do Rio de Janeiro) e outro para Tecnologia em Análise e Desenvolvimento de Sistemas no IST (Instituto Superior de Tecnologia) da FAETEC (Fundação de Apoio a Escola Técnica). No vestibular para a UERJ, ainda estou na espera, havendo a possibilidade de "entrar" na 4ª ou 5ª reclassificações (se ocorrerem para o curso em questão), enquanto no caso do IST, de 8 vagas disponibilizadas pelo vestibular (o resto foi pelo SISU), fiquei em 16ª, logo, também não entrei.

Por outro lado, pelo SISU, utilizando a nota do ENEM, consegui uma vaga para Sistemas de Informação na UNIRIO (Universidade Federal do Estado do Rio de Janeiro)! Pela minha classificação inicial, eu só iria começar no segundo semestre, mas, devido a desistências, acabei entrando para o 1º e, atualmente, encontro-me fazendo tal curso na instituição em questão.

Sinceramente, eu havia até pensado em fazer Sistemas de Informação na própria UNIRIO, mas já havia descartado tal opção, pois o foco do curso não era exatamente o que eu buscava. Mesmo assim, como minha média do ENEM, pelo SISU, me permitiria ingressar em tal instituição, não pensei duas vezes e, para não desperdiçar a oportunidade, me candidatei a uma vaga, sendo classificado de primeira!

Começaram as aulas e, a princípio, pensava apenas em ver como era o curso e a universidade, possivelmente, saindo de lá assim que fosse classificado na UERJ, mas, passadas a reunião de apresentação e algumas aulas, meu pensamento mudou completamente. Além de ter adorado a instituição, que possui uma infraestrutura excelente (os computadores que uso no laboratório, por exemplo, são melhores do que o melhor que há onde trabalho), o ensino é de primeira. Provavelmente, não sairei mais de lá!


... deixando de lado a questão da faculdade, estou querendo voltar a postar algumas coisas interessantes por aqui. Anteriormente, me concentrava mais em Linux, pois era o "material" com o qual mais lidava na época, porem, agora, pretendo me focar mais em coisas como programação e desenvolvimento web, dentre outras.


Enfim, como estou tendo uma disciplina de "Desenvolvimento de Páginas Web" e o professor está lidando unicamente com HTML5, pretendo voltar com força total em cima desse assunto. Sendo assim, aguardem que, até o próximo fim de semana, aparecerei por aqui com coisas novas!

sábado, 21 de maio de 2011

Dica: Alterar resolução do Ubuntu rodando no VirtualBox

Fala, pessoal!

Desculpem-me por ficar um pouco mais de um mês sem postar. Novamente isso ocorreu por falta de tempo e preguiça (quando houve tempo), um pouco de cada.

Desta vez venho mostrar como fazer para alterar a resolução do Ubuntu quando este está rodando em uma máquina virtual, dentro do VitualBox, que, por padrão, fica em 640x480 ou, na melhor das hipóteses, em 800x600.

Para fazê-lo é simples, bastará instalar o driver de vídeo que o próprio VirtualBox fornece e realizar algumas alterações no arquivo xorg.conf.

Indo direto ao ponto...

1) Primeiramente, como dito antes, será necessário instalar o driver de vídeo que o VirtualBox force. Para acessar o arquivo de instalação, no menu do VirtualBox na janela da máquina virtual aberta, clique em "Dispositivos" e, em seguida, em "Instalar Adicionais para Convidado". Neste momento, será "carregado"/montado um CD com o rótulo "VBOXADDITIONS_versãoDoVBoxAdditions".
Em versões mais recentes do VitualBox, será carregado um "autorun" que facilitará o trabalho, que irá instalar tudo automaticamente, mas caso isso não aconteça, basta executar no terminal (como root), o arquivo "VBoxLinuxAdditions.run" da seguinte forma (considerando que o diretório ativo no terminal seja o ponto de montagem do CD):
 sudo sh VBoxLinuxAddtions.run

2) Tendo sido os drivers instalados, agora temos de alterar o arquivo "/etc/X11/xorg.conf". Para editá-lo, no terminal e como root, abra-o em um editor de textos (eu usarei o nano, que roda direto no terminal, mas pode-se usar qualquer outro, como o gedit):
 sudo nano /etc/X11/xorg.conf

Obs.: Caso utilize uma versão do Ubuntu igual ou superior a 10.04, primeiro será necessário criar o arquivo em questão e copiá-lo para o diretório "/etc/X11" para depois então efetuar qualquer alteração. Para fazê-lo execute os seguintes comando no terminal:
 # Aqui será criado um arquivo com o nome xorg.conf.new
sudo X -configure :1
# Aqui você copiará o arquivo criado para /etc/X11 renomeando-o para "xorg.conf"
sudo cp xorg.conf.new /etc/X11/xorg.conf
# Agora, basta abri-lo em um editor de textos para executar as alterações que serão citadas a seguir
sudo nano /etc/X11/xorg.conf


Com o arquivo aberto, faça as seguintes alterações:
Na seção "Device", altere o valor do atributo "Driver" para "vboxvideo" se assim não estiver:
   Driver  "vboxvideo"

Na seção "Screen":
Adicione ou altere o atributo "DefaultDepth" da seguinte forma:
   DefaultDepth 24


E na subseção "Display" (ainda dentro da seção "Screen"), onde em seu atributo "Depth" o valor é "24" (caso não haja esta subseção, será necessário criá-la como descrito abaixo), adicione o atributo "Modes" com um valor igual a resolução desejada:
SubSection "Display"
Viewport 0 0
Depth 24
Modes "1024x768"
EndSubSection

Tendo sido isso feito, salve o arquivo (no editor nano, o comando é CTRL+O) e reinicie a sessão do usuário que as alterações provavelmente terão surtido efeito (caso nada aconteça ou ocorra algum tipo de problema, houve algum erro na execução dos passos aqui descritos).

Espero que esta dica venha a ser útil. Caso haja qualquer dúvida, não exite em perguntar nos comentários!

As formatações efetuadas nos comandos e trechos de arquivos de configuração foram geradas utilizando a "ferramenta" Source Code Formatter, encontrada neste link.

sábado, 16 de abril de 2011

Migração Linux - parte 5: Script de configuração do sistema

Boas pessoal! Finalmente estou de volta!

Gostaria de começar este post me desculpando por ficar mais de uma semana sem adicionar algo novo a este blog. Como de costume, quando tive tempo, acabei não conseguindo escrever algo para trazer para cá.

Desta vez, como citado no título da postagem, irei tratar da parte "final" da migração do laboratório de informática (da escola onde faço estágio) para o Ubuntu Linux: o script de configuração do sistema (também responsável pela instalação de softwares adicionais).

Devido as necessidades que se apresentavam no momento de sua criação, ele possui as seguintes funções:
  • Criar os usuários do sistema;
  • Fazer backup dos arquivos que serão alterados;
  • Configurar a conexão com a rede (ip fixo, dns etc);
  • Configurar os repositórios;
  • Configurar o Grub;
  • Configurar o SSH;
  • Alterar o "/etc/rc.local/" para que restaure a área de trabalho dos usuários;
  • Instalar softwares adicionais;
  • Configurar bloqueios a sites impróprios.
Com isso em mente, tratarei de cada parte em separado e depois deixarei um exemplo completo, que poderá ser alterado à vontade!

Neste post serão citados vários arquivos que não estão aqui representados, então, links para download dos mesmos estarão disponíveis conforme eles forem mencionados.

Indo direto ao assunto...

Back-ups
Como serão feitas alterações em arquivos de aplicações de extrema importância para o sistema, é sempre bom manter uma cópia dos mesmos em seu estado antes das modificações, então:
 echo "Efetuando backups de segurança..."
mkdir /home/[meuUsuario]/backups/
cp /etc/apt/sources.list /home/
[meuUsuario]/backups/
cp /etc/resolv.conf /home/
[meuUsuario]/backups/
cp /etc/default/grub /home/
[meuUsuario]/backups/
cp /etc/grub.d/00_header /home/
[meuUsuario]/backups/
cp /etc/grub.d/10_linux /home/
[meuUsuario]/backups/
cp /etc/network/interfaces /home/
[meuUsuario]/backups/
cp /etc/rc.local /home/
[meuUsuario]/backups/
echo "Os back-ups foram salvos dentro de \"/home/
[meuUsuario]/backups/\"!!!"
Neste caso, eu simplesmente crio uma pasta chamada "backups" dentro do "home" do meu usuário (meuUsuario) e copio para lá todos os arquivos que sofrerão alguma mudança durante a execução do script. Caso haja algum problema, basta restaurar o "original".

Criação dos usuários do sistema
 echo "Criando grupos e usuários do sistema..."
addgroup professores
useradd -m -p '[hashMD5DaSenhaDoUsuarioEntreAspasSImples]' Professores -g professores
addgroup alunos
useradd -m -p '[hashMD5DaSenhaDoUsuarioEntreAspasSimples]' Alunos -g alunos
Aqui eu só estou criando dois usuários, "Alunos" e "Professores", inseridos em dois grupos também criados. É importante citar que estou passando uma senha criptografada em MD5. Para gerar o hash MD5 da senha basta executar no terminal:
 echo minhaSenha | mkpasswd -s -H md5

Configuração da conexão com a rede
 echo "Configurando a rede..."
# Como cada PC terá um IP diferente, eu informo na hora o que será utilizado.
read -p "Informe o ip desejado: " varip
echo "O ip escolhido foi \"$varip\"!!!"
# Em seguida, reescrevo o arquivo /etc/network/interfaces, onde são configuradas
# as interfaces de rede. Defino o ip como fixo e um gateway e um servidor DNS
# específicos.
echo "auto lo\niface lo inet loopback\n\nauto eth0\niface eth0 inet static\naddress $varip\nnetmask 255.255.255.0\ngateway 192.168.xx.xx\ndns-provider 192.168.xx.xx" > /etc/network/interfaces
# Por fim, reinicio o serviço de rede.
/etc/init.d/networking restart
Assim como comentei nos trechos, eu (na realidade o script) pergunto o IP desejado e reescrevo o arquivo "/etc/network/interfaces", definindo IP (informado anteriormente) como fixo, o gateway a ser utilizado e o servidor DNS (name server). Se a interface relativa a sua placa de rede não estiver sendo identificada como "eth0", será necessário alterar o script, colocando a identificação correta.

Configuração dos repositórios
 echo "Configurando o Apt e o Aptitude..."
cp recursos/sources.list /etc/apt/sources.list
apt-get update
aptitude update
sudo wget http://www.medibuntu.org/sources.list.d/$(lsb_release -cs).list --output-document=/etc/apt/sources.list.d/medibuntu.list
echo "Fazendo backup de medibuntu.list em \"/home/[meuUsuario]/backups\"..."
cp /etc/apt/sources.list.d/medibuntu.list /home/[meuUsuario]/backups/
cp recursos/medibuntu.list /etc/apt/sources.list.d/medibuntu.list
sudo apt-get -q update
#sudo apt-get -q update
sudo apt-get --yes -q --allow-unauthenticated install medibuntu-keyring
Primeiramente, eu faria alterações no arquivo "/etc/apt/sources.list", mas, como ele tem bastante conteúdo (muitas das linhas comentadas, as quais não removo para o caso de "virem a necessárias"), preferi apenas substituí-lo por um já "configurado".
Já que faço uso de um servidor Apt-cacher, a configuração do arquivo em questão deverá ser feita como mencionado na parte 4 desta "migração", ou seja, você deverá direcionar os repositórios para o servidor Apt-cacher da rede. Para fazê-lo, basta apenas alterar as entradas presentes do seguinte modo (reforçando que deverá ser feito com todas):
 #Substituir:
deb http://br.archive.ubuntu.com/ubuntu/ lucid main restricted
#Por:
deb http://[IPDoServidorApt-Cacher]:3142/br.archive.ubuntu.com/ubuntu/ lucid main restricted
Para facilitar, estou disponibilizando aqui uma cópia de meu arquivo (no qual se faz necessário apenas informar o IP do servidor Apt-Cacher, e que já tem o repositório "partner" adicionado, o qual é de extrema importância para eventos mais a frente).
Ainda na configuração dos repositórios, eu os atualizo e adiciono o Medibuntu, baixando o arquivo com a indicação para o mesmo dentro de "/etc/apt/sources.list.d/", com o nome de "medibuntu.list". Como eu também uso o servidor Apt-cacher para ele, apesar de o arquivo só ter umas poucas linhas, eu faço o mesmo que com o "sources.list", substituindo-o por um arquivo já configurado.
De qualquer maneira, a alteração que se faria necessária seria igual a do caso do "sources.list", citada acima. Da mesma forma disponibilizo para download meu arquivo "medibuntu.list" aqui, onde falta apenas informar o IP do servidor Apt-cacher.
Em sequência a isso, apenas atualizo novamente os repositórios e, digamos... "libero" o Medibuntu.

Configuração do Grub, protegendo as entradas do modo de recuperação com senha
 echo "Configurando GRUB2..."
echo "cat << EOF\nset superusers=\"nomeDoSuperUsuario\"\npassword_pbkdf2 nomeDoSuperUsuario senhaCriptografadaDoSuperUsuario\nEOF" >> /etc/grub.d/00_header
cp recursos/10_linux /etc/grub.d/10_linux
update-grub
Na segunda linha, eu adiciono ao fim do arquivo "/etc/grub.d/00_header" as definições de usuário e senha do Grub. Na terceira, substituo o arquivo "/etc/grub.d/10_linux" por um idêntico (disponível aqui), mas com as alterações necessária já efetuadas (para saber que alterações são essas, leia este post, que ensina a proteger o modo de recuperação do Grub 2 com senha). Na quarta, eu simplesmente executo o comando "update-grub" que fará com que as alterações entrem em vigor.

Configuração do SSH
Na parte que segue, eu habilito apenas o usuário com privilégios administrativos (criado durante a instalação do sistema) e o usuário "Professores" a se conectarem através do ssh (adicionando, ao fim do arquivo "/etc/ssh/sshd_config", a linha "AllowUsers ...") e reinicio o seviço :
 echo "Configurando ssh..."
echo "\nAllowUsers meuUsuarioAdministrativo Professores" >> /etc/ssh/sshd_config
/etc/init.d/ssh restart

Restauração da área de trabalho dos usuários
 echo "Configurando rc.local..."
cp recursos/rc.local /etc/rc.local
Eu basicamente substituo o arquivo "/etc/rc.local" por outro já alterado (disponível aqui), que executa os seguintes comandos:
 rm -fr /home/Professores/.gconf /home/Professores/.gconfd /home/Professores/.gnome2
rm -fr /home/Alunos/.gconf /home/Alunos/.gconfd /home/Alunos/.gnome2
Ele apaga os diretórios que contem os arquivos de configuração do gnome de cada usuário. Como o script "rc.local" é executado a cada mudança de run level (normalmente só ocorrerão durante a inicialização e encerramento do sistema), quando um usuário fizer uma alteração em sua área de trabalho (papel de parede, tema etc) e reiniciar o computador, ao tentar fazer log in, o sistema não encontrará os arquivos de configuração do gnome e os recriará, porem em sua forma padrão.
Isto pode ser visto como uma "gambiarra" (a mãe das invenções), mas é plenamente funcional!

Instalação de softwares adicionais
 echo "Instalando programas..."
echo "Removendo Empathy..."
apt-get remove empathy -y
echo "Removendo Gwibber"
apt-get remove gwibber -y
echo "Instalando rar..."
apt-get install rar -y --install-recommends
echo "Instalando unrar..."
apt-get install unrar -y --install-recommends
echo "Instalando g++.."
apt-get install g++ -y --install-recommends
echo "Instalando JRE"
apt-get install sun-java6-jre sun-java6-plugin sun-java6-fonts -y --install-recommends
echo "Instalando Java Development Kit..."
apt-get install sun-java6-jdk -y --install-recommends
# Caso não seja encontrado automaticamente pelo Netbeans,
# encontra-se em "/usr/share/doc/openjdk-6-doc"
echo "Instalando Javadocs (do OpenJDK)"
apt-get install openjdk-6-doc -y --install-recommends
echo "Instalando codecs..."
apt-get install -y --force-yes w32codecs libdvdcss2 ubuntu-restricted-extras
echo "Instalando GIMP..."
apt-get install gimp -y --install-recommends
echo "Instalando Blender..."
apt-get install blender -y --install-recommends
echo "Instalando Code::Blocks.."
apt-get install codeblocks -y --install-recommends
echo "Instalando o libgtk2.0-dev"
#aptitude install libgtk2.0-dev
apt-get install libgtk2.0-dev -y --install-recommends
echo "Instalando Lazarus IDE..."
#aptitude install lazarus
apt-get install lazarus -y --install-recommends
echo "Instalando KTurtle..."
apt-get install kturtle -y --install-recommends
echo "Instalando Ambiente de Desenvolvimento Web Quanta Plus..."
apt-get install quanta kxsldbg-kde3 kimagemapeditor-kde3 khelpcenter -y --install-recommends
echo "Instalando TuxMath..."
apt-get install tuxmath -y --install-recommends
echo "Instalando TuxPaint..."
apt-get install tuxpaint -y --install-recommends
echo "Instalando TuxTyping..."
apt-get install tuxtype -y --install-recommends
echo "Instalando KTouch..."
apt-get install ktouch -y --install-recommends
echo "Instalando KHangman..."
apt-get install khangman -y --install-recommends
echo "Instalando KBruch..."
apt-get install kbruch -y --install-recommends
echo "Instalando Kanagram..."
apt-get install kanagram -y --install-recommends
echo "Instalando Inkscape..."
apt-get install inkscape -y --install-recommends
echo "Instalando KolourPaint4..."
apt-get install kolourpaint4 -y --install-recommends
echo "Instalando Scribus..."
apt-get install scribus -y --install-recommends
echo "Instalando KTuberling"
apt-get install ktuberling -y --install-recommends
echo "Instalando lmemory..."
apt-get install lmemory -y --install-recommends
echo "Instalando Gnome Tetravex..."
apt-get install gnotravex -y --install-recommends
echo "Instalando Flash Player Plug-in..."
dpkg -i instalandores/install_flash_player_10_linux.deb
echo "Removendo versões anteriores do BrOffice/OpenOffice..."
apt-get remove openoffice* -y
echo "Instalando BrOffice 3.2.1..."
dpkg -i instaladores/broffice3.2.1/DEBS/*deb
dpkg -i instaladores/broffice3.2.1/DEBS/desktop-integration/*deb
echo "Instalando NetBeans 6.9.1"
chmod +x instaladores/netbeans-6.9.1-ml-linux.sh
sh instaladores/netbeans-6.9.1-ml-linux.sh
echo "Instalando Blender 2.56..."
cp -r instaladores/blender-2.56a-beta-linux-glibc27-i686 /usr/local/Blender
ln -s /usr/local/Blender/blender /usr/local/bin/blender
cp recursos/blender-2.56.desktop /usr/share/applications
chmod +x /usr/local/bin/blender
Bom, quanto a esta parte não tenho muito o que falar... Eu removo clientes de mensagens instantâneas para evitar que alunos fiquem acessando MSN ou coisas do gênero e instalo softwares que serão utilizados durante as aulas.
No fim desse trecho, percebe-se que alguns programas eu instalo localmente. Bom, o flash e o BrOffice, a princípio, foram apenas testes, mas acabaram ficando, no caso do NetBeans, eu só encontrava versões antigas dele nos repositórios e, no caso do Blender 2.56 (cujo atalho -"blender-2.56.desktop"- encontra-se aqui), é devido ao fato de só haver o 2.49b disponível nos repositórios.

Efetuar bloqueios a sites impróprios
 echo "Efetuando bloqueios a sites: configurando \"/etc/hosts\""
java -jar AlterarHostName.jar
Como podem ver, só é executado um arquivo ".jar", mas é ele que faz a mágica. Como não tenho experiência em Shell Script, resolvi fazer esta parte em Java, linguágem que tenho um conhecimento um pouco além do básico.
Tudo que esse arquivo faz é ler o arquivo "hosts" de uma outra máquina, que já estava com diversos sites bloqueados, alterar a linha onde se encontra o nome do outro computador, substituíndo pelo nome do atual e, por fim, reescrever o arquivo "/etc/hosts" desta última com tais informações.
Sei que poderia ter feito isso de um modo mais fácil, porem aproveitei para treinar um pouquinho de leitura e escrita de arquivos...
Os arquivos "hosts" e "AlterarHostName.jar" podem ser encontrados respectivamente aqui e aqui. O código fonte do "AlterarHostName.jar" eu disponibilizarei assim que possível, pois não o estou encontrando em lugar algum.

Script completo
Abaixo segue o Script completo:
 #! /bin/bash

echo "Efetuando backups de segurança..."
mkdir /home/[meuUsuario]/backups/
cp /etc/apt/sources.list /home/[meuUsuario]/backups/
cp /etc/resolv.conf /home/[meuUsuario]/backups/
cp /etc/default/grub /home/[meuUsuario]/backups/
cp /etc/grub.d/00_header /home/[meuUsuario]/backups/
cp /etc/grub.d/10_linux /home/[meuUsuario]/backups/
cp /etc/network/interfaces /home/[meuUsuario]/backups/
cp /etc/rc.local /home/[meuUsuario]/backups/
echo "Os back-ups foram salvos dentro de \"/home/[meuUsuario]/backups/\"!!!"

echo "Criando grupos e usuários do sistema..."
addgroup professores
useradd -m -p '[hashMD5DaSenhaDoUsuarioEntreAspasSImples]' Professores -g professores
addgroup alunos
useradd -m -p '[hashMD5DaSenhaDoUsuarioEntreAspasSimples]' Alunos -g alunos

echo "Configurando a rede..."
read -p "Informe o ip desejado: " varip
echo "O ip escolhido foi \"$varip\"!!!"
echo "auto lo\niface lo inet loopback\n\nauto eth0\niface eth0 inet static\naddress $varip\nnetmask 255.255.255.0\ngateway 192.168.xx.xx\ndns-provider 192.168.xx.xx" > /etc/network/interfaces
/etc/init.d/networking restart

echo "Configurando o Apt e o Aptitude..."
cp recursos/sources.list /etc/apt/sources.list
apt-get update
aptitude update
sudo wget http://www.medibuntu.org/sources.list.d/$(lsb_release -cs).list --output-document=/etc/apt/sources.list.d/medibuntu.list
echo "Fazendo backup de medibuntu.list em \"/home/[meuUsuario]/backups\"..."
cp /etc/apt/sources.list.d/medibuntu.list /home/[meuUsuario]/backups/
cp recursos/medibuntu.list /etc/apt/sources.list.d/medibuntu.list
sudo apt-get -q update
#sudo apt-get -q update
sudo apt-get --yes -q --allow-unauthenticated install medibuntu-keyring

echo "Configurando GRUB2..."
echo "cat << EOF\nset superusers=\"nomeDoSuperUsuario\"\npassword_pbkdf2 nomeDoSuperUsuario senhaCriptografadaDoSuperUsuario\nEOF" >> /etc/grub.d/00_header
cp recursos/10_linux /etc/grub.d/10_linux
update-grub

echo "Configurando ssh..."
echo "\nAllowUsers meuUsuarioAdministrativo Professores" >> /etc/ssh/sshd_config
/etc/init.d/ssh restart

echo "Configurando rc.local..."
cp recursos/rc.local /etc/rc.local

echo "Iniciando script de instalação de programas..."
echo "Removendo Empathy..."
apt-get remove empathy -y
echo "Removendo Gwibber"
apt-get remove gwibber -y
echo "Instalando rar..."
apt-get install rar -y --install-recommends
echo "Instalando unrar..."
apt-get install unrar -y --install-recommends
echo "Instalando g++.."
apt-get install g++ -y --install-recommends
echo "Instalando JRE"
apt-get install sun-java6-jre sun-java6-plugin sun-java6-fonts -y --install-recommends
echo "Instalando Java Development Kit..."
apt-get install sun-java6-jdk -y --install-recommends
# Caso não seja encontrado automaticamente pelo Netbeans,
# encontra-se em "/usr/share/doc/openjdk-6-doc"
echo "Instalando Javadocs (do OpenJDK)"
apt-get install openjdk-6-doc -y --install-recommends
echo "Instalando codecs..."
apt-get install -y --force-yes w32codecs libdvdcss2 ubuntu-restricted-extras
echo "Instalando GIMP..."
apt-get install gimp -y --install-recommends
echo "Instalando Blender..."
apt-get install blender -y --install-recommends
echo "Instalando Code::Blocks.."
apt-get install codeblocks -y --install-recommends
echo "Instalando o libgtk2.0-dev"
#aptitude install libgtk2.0-dev
apt-get install libgtk2.0-dev -y --install-recommends
echo "Instalando Lazarus IDE..."
#aptitude install lazarus
apt-get install lazarus -y --install-recommends
echo "Instalando KTurtle..."
apt-get install kturtle -y --install-recommends
echo "Instalando Ambiente de Desenvolvimento Web Quanta Plus..."
apt-get install quanta kxsldbg-kde3 kimagemapeditor-kde3 khelpcenter -y --install-recommends
echo "Instalando TuxMath..."
apt-get install tuxmath -y --install-recommends
echo "Instalando TuxPaint..."
apt-get install tuxpaint -y --install-recommends
echo "Instalando TuxTyping..."
apt-get install tuxtype -y --install-recommends
echo "Instalando KTouch..."
apt-get install ktouch -y --install-recommends
echo "Instalando KHangman..."
apt-get install khangman -y --install-recommends
echo "Instalando KBruch..."
apt-get install kbruch -y --install-recommends
echo "Instalando Kanagram..."
apt-get install kanagram -y --install-recommends
echo "Instalando Inkscape..."
apt-get install inkscape -y --install-recommends
echo "Instalando KolourPaint4..."
apt-get install kolourpaint4 -y --install-recommends
echo "Instalando Scribus..."
apt-get install scribus -y --install-recommends
echo "Instalando KTuberling"
apt-get install ktuberling -y --install-recommends
echo "Instalando lmemory..."
apt-get install lmemory -y --install-recommends
echo "Instalando Gnome Tetravex..."
apt-get install gnotravex -y --install-recommends
echo "Instalando Flash Player Plug-in..."
dpkg -i instalandores/install_flash_player_10_linux.deb
echo "Removendo versões anteriores do BrOffice/OpenOffice..."
apt-get remove openoffice* -y
echo "Instalando BrOffice 3.2.1..."
dpkg -i instaladores/broffice3.2.1/DEBS/*deb
dpkg -i instaladores/broffice3.2.1/DEBS/desktop-integration/*deb
echo "Instalando NetBeans 6.9.1"
chmod +x instaladores/netbeans-6.9.1-ml-linux.sh
sh instaladores/netbeans-6.9.1-ml-linux.sh
echo "Instalando Blender 2.56..."
cp -r instaladores/blender-2.56a-beta-linux-glibc27-i686 /usr/local/Blender
ln -s /usr/local/Blender/blender /usr/local/bin/blender
cp recursos/blender-2.56.desktop /usr/share/applications
chmod +x /usr/local/bin/blender
echo "Efetuando bloqueios a sites: configurando \"/etc/hosts\""
java -jar AlterarHostName.jar
Obs.: Os itens que tem de ser alterados/especificados estão representados em negrito.

Bom, estando com tudo pronto, tudo definido, é só salvar o arquivo com a extensão ".sh" (por exemplo, pode chamá-lo de script_de_configuracao.sh) e abrir o terminal e executar o script como root:
 sudo sh script_de_configuracao.sh

Feito isso, ele começará a trabalhar automaticamente, só pedindo a intervenção do usuário logo no início, quando vai configurar a rede, e no final, quando vai instalar o NetBeans, pois este último só possui instalador gráfico.

E está encerrada a sequência de posts sobre a minha migração para o Linux do laboratório de informática da escola on faço estágio!

Espero que este post tenha sido útil! Se houver qualquer dúvida, correção ou informação adicional, não deixe de recorrer aos comentários!

Logo estarei de volta com algumas dicas! Até a próxima!

Migração Linux - parte 4

As formatações efetuadas nos comandos e trechos de arquivos de configuração foram geradas utilizando a "ferramenta" Source Code Formatter, encontrada neste link.

terça-feira, 5 de abril de 2011

Dica: proteger com senha o Modo de Recuperação no Grub

Estou de volta!

Quando temos algum problema com o sistema (Ubuntu Linux) e o mesmo fica incapacitado de ser iniciado ou não funciona devidamente (ao ponto de impedir que o usuário, iniciando o sistema normalmente, acesse o terminal) é comum recorrermos ao modo de recuperação. Nele temos acesso a um terminal sendo executado como root, tornando possível manipularmos o sistema "livremente", de modo a aplicarmos as correções necessárias.
Certamente ele é algo útil. O problema é que, "nas mãos" de alguém mal intencionado, pode comprometer toda a segurança e integridade do sistema.

Hoje vou falar (na realidade, escrever) sobre como proteger com senha a opção do "modo de recuperação" do Ubuntu no Grub, lembrando que é válido apenas para versão 2 (Grub 2) e talvez superiores.

Para tal, primeiramente é preciso criar um "super usuário" do Grub com senha para acessar as entradas protegidas. Para fazer isso é preciso editar o arquivo "/etc/grub.d/00_header", adicionando ao seu final as seguintes linhas:
 cat << EOF
set superusers="nomeDoSuperUsuario"
password nomeDoSuperUsuario senhaDoSuperUsuario
EOF

Creio que não haja muito a ser comentado sobre o caso acima... é só substituir "nomeDoSuperUsuario"
e "senhaDoSuperUsuario" pelo nome de usuário e senha desejados. O único problema é que, se alguém acessar o arquivo "00_header", terá acesso a tais informações de maneira explicita. Visando evitar isso, é possível fazer uso de uma senha criptografada, assim como descrito no caso abaixo:
 cat << EOF
set superusers="nomeDoSuperUsuario"
password_pbkdf2 nomeDoSuperUsuario senhaCriptografadaDoSuperUsuario
EOF

Da mesma forma que ocorre na situação anterior, basta
substituir "nomeDoSuperUsuario" e "senhaCriptografadaDoSuperUsuario" pelo nome de usuário desejado e a senha criptografada.
Para gerar tal senha, é preciso executar no terminal "grub-mkpasswd-pbkdf2" que irá requisitar o password desejado, a confirmação do mesmo e, por fim, irá devolvê-lo de forma criptografada (que será utilizada no lugar de "senhaCriptografadaDoUsuario"). Aproveito para alertar que,
no lucid (10.04), é meio "bugado", tendo vezes em que ele retorna a senha criptografada e vezes em que não faz o mesmo (tive de tentar várias vezes até funcionar), e também que, quando gerada, será uma sequência de caracteres bem grande (começando a partir de "grub.pbkdf2..."), mas é algo normal.

Tendo sido estas alterações feitas, agora é hora de partir para o arquivo "/etc/grub.d/10_linux". Aqui, aproximadamente na linha 72, há um trecho mais ou menos assim:
 if ${recovery} ; then
title="$(gettext_quoted "%s, with Linux %s (recovery mode)")"
else
title="$(gettext_quoted "%s, with Linux %s")"
fi
printf "menuentry '${title}' ${CLASS} {\n" "${os}" "${version}"
O que é preciso fazer é deixar este bloco da seguinte forma:
 if ${recovery} ; then
title="$(gettext_quoted "%s, with Linux %s (recovery mode)")"
printf "menuentry '${title}' ${CLASS} --users nomeDoSuperUsuario {\n" "${os}" "${version}"
else
title="$(gettext_quoted "%s, with Linux %s")"
printf "menuentry '${title}' ${CLASS} {\n" "${os}" "${version}"
fi
Fazendo desta forma, a senha será aplicada apenas ao modo de recuperação.
Perceba que a seguinte linha agora só se apresenta dentro do bloco "if .. else", não mais fora do mesmo...
printf "menuentry '${title}' ${CLASS} {\n" "${os}" "${version}"  
... e que ela também sofreu uma pequena alteração, que foi destacada, caso a condição (é modo de recuperação?) seja verdadeira.
 if ${recovery} ; then
title="$(gettext_quoted "%s, with Linux %s (recovery mode)")"
printf "menuentry '${title}' ${CLASS} --users nomeDoSuperUsuario {\n" "${os}" "${version}"
Se a condição for falsa, ela fica inalterada (não requerendo autenticação):
 else
title="$(gettext_quoted "%s, with Linux %s")"
printf "menuentry '${title}' ${CLASS} {\n" "${os}" "${version}"
fi

Se tudo estiver certo até aqui, agora só resta executar o comando "update-grub"...
 sudo update-grub
... e testar se as alterações estão funcionando.
No menu do Grub, é só selecionar alguma opção de modo de recuperação que será exibida uma "tela preta" requisitando o usuário e, em seguida, a senha. Caso esteja tudo certo, o sistema será iniciado pelo modo escolhido, senão, aparecerá uma mensagem informando que as informações estão incorretas, pedindo que seja pressionada qualquer tecla para continuar, voltando para o menu anteriormente exibido (se alguma tecla for pressionada, é claro).

Para mais informações sobre como proteger as entradas do Grub com senha, recomendo dar uma olhada neste tópico do UbuntuForums.Org.

Novamente espero que este post tenha sido de alguma ajuda! Se houver qualquer dúvida, é só fazer uso dos comentários!

As formatações efetuadas nos comandos e trechos de arquivos de configuração foram geradas utilizando a "ferramenta" Source Code Formatter, encontrada neste link.
As fontes de informação utilizadas para a criação deste tópico foram este tópico do forum UbuntuForum-BR.org e este do UbuntuForum.Org.

Anúncios

DonkeyMails.com: No Minimum Payout