quarta-feira, 29 de dezembro de 2010

Controlando o Autostart do KDE 4

Para quem usa o KDE4 (ou mesmo versões anteriores do KDE), certamente já é claro que existe uma maneira de controlar o que deve ou não ser iniciado diretamente no momento do login (quando a sua seção se inicia). Este recurso é chamado "Autostart". Este artigo mostra de maneira fácil e rápida como gerenciar os programas que devem ser iniciados automaticamente, ou seja, que devem constar no Autostart do KDE.


  • Onde está o Autostart??

O Autostart nada mais é do que um diretório com informações dos programas que devem ser iniciados automaticamente. Existem dois desses diretórios, a saber, um a nível geral do sistema (controlado pelo root) e outro a nível de usuário:

# Autostart do usuário
ls /home/usuario/.kde/share/autostart/
# substitua "usuario" pelo nome de seu usuario!!

# Autostart do sistema
ls /usr/share/autostart/

OBS: em algumas distribuições, o diretório do usuário pode estar em "/home/usuario/.kde/Autostart/".

Assim, remover um programa chato que inicia automaticamente sem ser desejado consiste apenas em verificar o nome dele nestas duas listagens acima e apagar seu(s) respectivo(s) arquivo(s).


  • Controlando o Autostart do KDE Graficamente

Uma outra maneira (a nível de usuário) de controlar graficamente o que inicia com o KDE4 é acessar as Configurações do Sistema (System Settings), aba Avançado (Advanced) e clicar no ícone "Iniciar Automaticamente". Note que este recurso não informa o que é iniciado automaticamente segundo as configurações gerais do sistema, porém apenas segundo as configurações particulares do usuário. Vide a imagem abaixo:



Existem dois botões nesta janela:

Adicionar Programa: Permite que um programa existente no seu menu K seja selecionado e adicionado ao seu Autostart.
Adicionar Script: se você tem um script executável (que, no entanto, não está presente no menu K), ele pode ser adicionado através deste botão.

OBS: aparentemente, esta solução gráfica opera independentemente dos diretórios acima mencionados. Assim, possivelmente o que você adicionar aqui não encontrará correspondente nos diretórios mostrados, mas é bom conhecer as duas maneiras, para saber investigar seu sistema e conhecer o que realmente está acontecendo!


  • O Que Tem Nesses Diretórios do Autostart??

São simplesmente pequenos arquivos texto terminados com ".desktop", contendo informações do programa a que se referem e a maneira como o KDE deverá executá-lo. Vide o exemplo de um deles:

cat /usr/share/autostart/klipper.desktop
[Desktop Entry]
Name=Klipper
GenericName=Clipboard Tool
Exec=klipper
Icon=klipper
Type=Application
X-DocPath=klipper/index.html
Terminal=false
X-KDE-autostart-after=panel
X-KDE-StartupNotify=false
X-DBUS-StartupType=Unique
X-KDE-UniqueApplet=true
X-KDE-autostart-condition=klipperrc:General:AutoStart:true
OnlyShowIn=KDE;
Categories=Qt;KDE;Utility;X-KDE-Utilities-Desktop;
Comment=A cut & paste history utility

X-Ubuntu-Gettext-Domain=desktop_kdebase-workspace

Claro que você não vai tentar escrever um arquivo destes diretamente, pois poderá omitir uma opção importante ou configurar algo erradamente. Procure deixar que estes arquivos se gerem de forma automática pelos próprios programas ou utilize o inicializador gráfico, conforme mostrado acima. O conhecimento destes detalhes é útil mormente no sentido de se verificar a que programa pertence cada arquivo .desktop e a ajudá-lo a apagar o inicializador de algum programa intrometido que o inseriu sem sua permissão.

Bom, espero que este pequeno tutorial tenha lhe ajudado a administrar melhor seu KDE e sua seção!! Boa sorte!!

sexta-feira, 24 de dezembro de 2010

Como Listar os Usuários e Grupos Existentes no Linux?

Os usuários existentes em uma instalação do sistema Linux podem ser listados facilmente se conseguimos listar o arquivo de dados onde eles são catalogados pelo sistema, ao lado de várias outras informações pessoais importantes, como a sua senha (criptografada, naturalmente), seu nome, grupo primário, etc. Este fantástico arquivo é o /etc/passwd. Ver o seu conteúdo pode ser feito pelo comando abaixo (não precisa ser root):

cat /etc/passwd

Em geral, isto lista uma série de informações. Os grupos, analogamente, encontram-se no arquivo /etc/group, associados a algumas informações pertinentes, e podem ser listados da seguinte maneira (não precisa ser root):

cat /etc/group

Dependendo de como o sistema esteja configurado, as senhas dos usuários podem ficar em local específico, no arquivo /etc/shadow, que só pode ser lido ou modificado pelo root:

cat /etc/shadow


  • Entendendo o /etc/passwd

Como este arquivo é usado durante o login, ele é acessível a todos os usuário (para leitura), mas só pode ser modificado pelo administrador do sistema. Cada linha representa um usuário e contém seus dados específicos. Cada campo é separado do outro pelo caracter ":" (dois pontos). Observe a seqüência de dados presentes em cada linha, conforme mostra o trecho do arquivo abaixo:

gdm:x:105:112:Gnome Display Manager:/var/lib/gdm:/bin/false
paje:x:1001:1001:O Paje,,,:/home/gabriel:/bin/bash
1 :2: 3 : 4 : 5 :6 :7

1- nome do usuário: contém o nome da conta do usuário, que pode ter entre 1 e 32 caracteres. Em nosso caso, um usuário se chama "gdm" e o outro "paje";

2- É o local da senha. Se, ao invés disso, houver o caracter "x", então o arquivo indica que as senhas estão encriptadas no arquivo /etc/shadow, que só pode ser lido pelo root.

3- UID (User ID). Número identificador do usuário. Nunca existirão dois usuários com o mesmo número. O UID segue as seguintes regras: 0=root; 1-99=contas pré-definidas (ex: bin, sys, mail, games, irc); 100-999=reservados pelo sistema para contas administrativas e de gerenciamento interno; a partir de 1000=usuários convencionais. No caso acima, "gdm" é um usuário administrativo, mas "paje" é um usuário normal.

4- GID (Group ID). Número identificado do grupo primário do usuário. Um usuário pode estar associado a vários grupos, mas tem apenas um grupo denominado "primário". Quando o usuário cria um arquivo novo, por exemplo, este arquivo fica registrado como pertencente a este usuário seu criador e ao grupo ao qual ele está associado como grupo primário no momento de criação do arquivo.

5- Uma série de informações separadas por vírgulas (que nem sempre são cadastradas!), como o nome real do usuário, telefone, número da sala, etc.

6- O caminho completo (absoluto) do diretório do usuário.

7- O shell que será executado cada vez que este usuário fizer login. Em geral é /bin/bash (para usuários comuns), mas pode ser outro shell ou mesmo /bin/false, caso o usuário não seja autorizado a fazer login.

Não foi tão difĩcil entender estes campos, foi??


  • Várias Maneiras de Listar Usuários

Verificando se um usuário existe mesmo, e sabendo suas informações:

grep gdm /etc/passwd
gdm:x:105:112:Gnome Display Manager:/var/lib/gdm:/bin/false

Verificando todos os usuários convencionais (que, supostamente, possuem um diretório no /home):

grep /home/ /etc/passwd

Mostrando uma listagem simples, contendo somente o nome dos usuários, sem as demais informações da linha:

grep /home/ /etc/passwd | cut -d: -f1

O comando "cut" usado no filtro "|" recorta o resultado do comando grep. Os parâmetros significam: "-d:"=delimitador (indica que será fornecida uma informação para delimitar o resultado), "-f1"=indica que deverá ser mostrado apenas o primeiro campo (field 1).

É claro que este comando todo pode ser armazenado em um shell script ou em uma aliases. Adicionalmente, gostaria de encorajá-lo a modificar o comando acima e personalizá-lo conforme deseje!! Sinta-se à vontade!!


  • Entendendo o /etc/group

Analogamente ao /etc/passwd, o /etc/group contém uma linha para cada grupo, onde as informações específicas do grupo são separadas pelo caracter ":" (dois pontos). Exemplo de trecho do arquivo:

video:x:44:paje,fulano,beltrano
1 :2: 3 :4

1- Nome do grupo;

2- Senha do grupo. Analogamente ao /etc/passwd, a senha é substituída pelo caracter "x" para ser armazenada em local seguro. Em muitos sistemas, a administração de grupos é feita exclusiva e diretamente pelo root, sem necessidades de senhas para os grupos.

3- GID (Group ID);

4- Lista de usuários que estão associados a este grupo, separados por vírgulas. Esta lista pode estar vazia, indicando que não há usuários associados ao grupo.


Bom, pessoal, espero que este artigo tenha ajudado... lembrem-se de que, aconteça o que acontecer, o mais importante é que COMENTEM!!

quinta-feira, 23 de dezembro de 2010

Versionando Seus Dados: Boas Práticas e Dicas

Existe inúmeros servidores de controle de versão, como o CVS e o Subversion (SVN). Este artigo visa sugerir boas práticas para que estes servidores sejam utilizados da melhor e mais confiável maneira. É um artigo abrangente, direcionado tanto para desenvolvedores de programas quanto para usuários domésticos que nada sabem de programação.


  • Por Que Versionar Meus Dados??

O versionamento foi criado inicialmente para que equipes de programadores pudessem compartilhar de maneira segura e flexível códigos elaborados na construção de componentes de um mesmo programa. Com o versionamento, tornou-se possível e seguro não só o compartilhamento, como também a recuperação de versões anteriores dos arquivos versionados, ou mesmo a comparação entre as versões de um mesmo arquivo (o chamado diff).
Hoje em dia, com a evolução das tecnologias, como o aumento dos discos rígidos e a facilidade de criação de repositórios na rede (online), tornou-se viável e realmente útil realizar versionamento de qualquer coisa, desde documentos do Open Office, como textos e planilhas eletrônicas, até figuras e códigos de programas. Assim, realmente vale a pena (e recomendo!!) que você versione sua planilha com os endereços e telefones de seus contatos, seus dados de controle de gastos domésticos, sua tese de doutorado, suas fotos da câmera, suas músicas, seus históricos de programas de mensagens instantâneas, os documentos do trabalho, seu livro que vai sair um dia, suas poesias, etc, etc...
O versionamento é capaz de te lhe trazer muitos benefícios, dos quais destaco os seguintes:

1- Cópia de segurança de seus dados (o chamado backup);
2- Organização de seus dados: criação apropriada da estrutura de pastas e melhor escolha dos nomes de arquivos;
3- Armazenamento das versões anteriores dos arquivos, permitindo a recuperação das mesmas ou de parte destas;
4- Comparação entre duas ou mais versões diferentes dos arquivos a partir de programas de diff, presentes hoje na maioria dos grandes aplicativos, como a suíte do Open Office;
5- Edição e manutenção coletiva dos arquivos: várias pessoas mexendo neles ao mesmo tempo não será mais sinônimo de bagunça e perda de dados!!
6- Ferramentas para mesclar dados;
7- Fácil sincronização entre os dados que você produziu e mantém em seus diversos computadores: laptop, máquina do trabalho, máquina de casa, celular, etc..., evitando perdas de arquivos ou perigosas regressões de seus trabalhos devido à acidental sobrescrita de uma versão mais nova por uma mais antiga (que lance a primeira pedra quem nunca cometeu esse equívoco...).


  • Como Versionar Tudo Isso??

Existem milhares de controladores de versão. Eu recomendo o Subversion (abreviadamente denominado de SVN), que é bem mais seguro e inteligente que o CVS, além de existir para a grande maioria as plataformas, ser gratuito e livre, extremamente leve, vastamente testado e retestado e ter plugins e clientes das mais diferentes formas e condições.
Existem tutoriais que ensinam como fazer a sua pasta home do Linux ficar automaticamente versionada pelo SVN, de forma que qualquer coisa que você simplesmente salve ali irá automaticamente ser enviada para o servidor. Apesar de ser imensamente prático, eu não recomendo que você faça isto... mas, por quê?? Porque este procedimento gera muitos commits (efetivações) desnecessários no banco de dados do seu repositório versionado, além de tender a que todos eles sejam feitos sem qualquer mensagem descritiva, o que torna difícil a identificação da versão que você quer recuperar, caso seja necessária.
Este tutorial não ensina a instalar o servidor de controle de versão nem a criar repositórios (se é isso que você quer, navegue aqui mesmo, nesse meu ao lado direito, e veja os outros artigos do Pajé que ensinam detalhadamente muitos dos rudimentos destas técnicas, voltados para o SVN), mas sim ensina boas práticas e como explorar melhor o "poder" do versionamento.


  • Dicas Para um Bom Versionamento

Seguem abaixo várias dicas que podem ser utilizadas tanto por desenvolvedores de softwares quanto por usuários domésticos, em busca de proteção e compartilhamento de seus dados.

1- Sempre faça commits (efetivações) com mensagens. Embora muitos controladores de versões permitam subir dados sem dizer qualquer coisa a respeito, não se furte ao comentário. Somente assim será possível identificar o conteúdo novo de cada revisão criada. Nem preciso dizer que isto é essencial nas buscas e pesquisas, como comparações, das versões antigas.
1.1- Se seu repositório é compartilhado por pessoas de vários países, somente escreva as mensagens em inglês.

2- Não saia fazendo muitos commits alopradamente!!!! Suba apenas aquilo que está funcionando (ou seja, um código completo, sem erros, ou um documento com uma seção inteira adicionada ou revisada). Faça valer o gesto da criação de uma nova revisão do arquivo!!

3- Se algo ficou pendente no arquivo e você considera que possa ser feito mais tarde, não interferindo diretamente na seção onde você está trabalhando, inclua comentários sobre o mesmo. Em código de programa, normalmente se inclui blocos "TODO", para clamar por código extra (que normalmente serão providenciados em outras seções do programa) ou "FIXME" (normalmente indicando trechos hard coded). Em documentos do Open Office, coloque comentários mesmo (menu Inserir, opção Anotação), aquelas caixas de texto amarelas que guardam uma informação extra sobre um trecho do documento, sem interferir no conteúdo (não inclua os comentários como se fossem parte do documento, por favor!!! Eles usualmente lhe escapam e vão acabar sobrando no texto final, o que fica muito feio para o autor!!).

4- Nunca, mas nunca nunquinha da Silva, comece diretamente a trabalhar em seus arquivos locais!!! Antes de fazer qualquer coisa, sincronize sua base de dados local com o repositório, buscando comparar o que você tem com as versões mais novas dos arquivos e atualizando tudo o que você tem.

5- Evite armazenar o seu repositório no mesmo local onde você sempre trabalha!!!! Se ele está na mesma partição de seu disco rígido (ou até se o repositório fica no mesmo disco rígido onde você trabalha), num momento em que o disco entre em pane ou queime, você perderá tudo do mesmo jeito, seus dados locais e o precioso repositório. Vide soluções para este caso, em ordem de segurança, do menos seguro para o mais seguro:
5.1- Você pode armazenar seu repositório em um outro disco rígido de sua máquina, voltado só para isso (ainda assim, pouco seguro);
5.2- Você pode armazenar seu repositório em um dispositivo externo, como um disco externo ou pendrive (segurança média);
5.3- Você pode armazenar seu repositório em uma área de rede, que fica em um servidor de arquivos, ou seja, uma máquina na sua empresa ou na sua casa com um bom espaço ligada 24 horas por dia e com acesso compartilhado (segurança média);
5.4- Você pode armazenar seu repositório em uma área acessível via SSH (ou outro protocolo qualquer) de um storage, com vários discos rígidos compartilhados com alguma técnica de redundância e/ou espelhamento (altamente seguro, porém é mais uma solução corporativa do que doméstica!!);
5.5- Você pode armazenar seu repositório em uma área virtual fornecida por algum compartilhador, como o Dropbox, que mantém severas rotinas de backup e sela o compromisso de altíssima disponibilidade (altamente seguro, porém é mais uma solução doméstica do que corporativa!!);

6- Evidentemente, faça backups freqüentes de seu repositório!!! Nada adiantará ter toda essa tecnologia e um dia acontecer uma fatalidade... faça backups em meios seguros, como CD, DVD, outros Discos Rígidos, etc, conforme o volume e fluxo de seus dados. Agende seu backup em períodos razoáveis, de acordo com a sua produção.
6.1- PELAMORDEDEUS: teste seus backups com freqüência!!! Mais uma vez insisto: de nada adiantará ter toda essa tecnologia, inclusive o backup, se uma fatalidade ocorrer, você perder tudo, ter de voltar ao backup, e justamente aí descobrir que, por algum motivo, você não consegue recuperar o backup, pois: ou ele foi feito de maneira incorreta, ou ele estava acontecendo de maneira parcial e você nunca notou, ou qualquer outra péssima eventualidade.... teste, e teste periodicamente!!

7- Sempre que terminar ou concluir uma parte completa de seu trabalho, envie para o servidor. Programe sua rotina de trabalho para que, no final do expediente (ou de uma seção de trabalho), você tenha concluído o que você iniciou e esteja apto a subir para o servidor. Como não recomendo que suba nada com erros, com código incompleto, com seções de documento incompletas ou inconclusas e sem anotações, então programe direitinho sua seção de trabalho. Claro que imprevistos acontecem, mas tente minimizar isto e deixar o mínimo possível de novidades locais, para garantir a segurança de seus dados e evitar conflitos nas próximas sincronizações, caso ou outros membros da sua equipe trabalhem nos mesmos arquivos que você durante o intervalo entre uma seção e outra de seu trabalho.

8- Por questões de zelo e cuidado, sempre suba documentos e códigos bem formatados e ajustados. Melhora a compreensão, especialmente se você não trabalha sozinho...


Bom, pessoal... em linhas gerais, é isto que quero dizer. Espero ter ajudado!! Qualquer coisa: COMENTEM!!!

terça-feira, 21 de dezembro de 2010

Como Acessar o SVN via HTTP

Este artigo apresenta, de forma resumida, como configurar seu repositório do Subversion para ser acessado usando o protocolo HTTP. Esta configuração é apenas um dos três modos de operação do SVN (mais sobre os outros modos e uma ampla discussão sobre as características, vantagens e desvantagens de cada um encontra-se em nosso outro artigo, aqui. Se o seu caso for aprender a instalar o SVN tunelado por SSH, então veja também este outro artigo aqui). Supõe-se, neste artigo, que o SVN já esteja propriamente instalado e configurado na máquina servidora. Supõe-se que você já tenha um cliente instalado em máquina local, para fins de testes. Caso não saiba instalar um, sugiro consultar nosso outro artigo, aqui.


  • Instalação do Apache

Fazer o SVN ser acessado por HTTP necessita de um servidor Web, já que este protocolo não é o padrão para o SVN. A sua função é colocar-se como intermediário entre o usuário e o repositório versionado, executando, em linhas gerais, as seguintes tarefas:

- Receber as requisições HTTP do cliente;
- Validar o usuário do cliente com base de dados de usuário própria;
- Traduzí-las para o SVN, usando usuário próprio do sistema operacional;
- Coletar as respostas do SVN;
- Traduzí-las de volta para o protocolo HTTP;
- Enviá-las para o cliente.

O servidor web utilizado para tunelar o SVN através do protocolo HTTP é o Apache Web Server 2; o diálogo entre o Apache 2 e o SVN é possível graças a um módulo especial do Apache, o WebDAV. O comando a seguir instala o servidor HTTP e o módulo do webDAV:

apt-get install apache2 libapache2-svn

Após este comando, o Apache 2 será instalado e inicializado, bem como todos os módulos padrão. Após a instalação do módulo do webDAV, ele será automaticamente inicializado. Caso queira se certificar a respeito desta instalação, verifique se surgem as seguintes linhas:

Módulos padrão:
Enabling site default.
Enabling module alias.
Enabling module autoindex.
Enabling module dir.
Enabling module env.
Enabling module mime.
Enabling module negotiation.
Enabling module setenvif.
Enabling module status.
Enabling module auth_basic.
Enabling module deflate.
Enabling module authz_default.
Enabling module authz_user.
Enabling module authz_groupfile.
Enabling module authn_file.
Enabling module authz_host.
Enabling module reqtimeout.

Módulos do webDAV:
Enabling module dav.
Enabling module dav_svn.

Para confirmar quais os módulos estão ativos, basta ler o diretório onde os links simbólicos para os módulos ativos ficam:

# links para os módulos ativos
ls /etc/apache2/mods-enabled/

# todos os módulos instalados
ls /etc/apache2/mods-available/

# onde os arquivos executáveis realmente ficam...
ls /usr/lib/apache2/modules/


  • Configuração do Apache 2

Criação do Arquivo de Senhas

Para que o seu repositório seja acessado com validação de usuário, é preciso que os usuários sejam previamente criados com suas senhas. Caso o seu repositório seja sempre público, este passo se tornará desnecessário.
Os usuários aqui referidos são usuários HTTP, e não usuários do sistema da sua máquina. Estes usuários ficam em um arquivo específico, onde se encontram com suas senhas. Felizmente, o Apache nos fornece uma ferramenta para a criação (e inserção) destes usuários, o htpasswd.
A criação de um arquivo novo, contendo seu primeiro usuário e senha, pode ser feita com o seguinte comando:

htpasswd -c /opt/svnrepos/repo1passwd admin
ou
htpasswd -c /opt/svnrepos/repo1passwd admin [senha]

Onde "admin" pode ser qualquer nome de usuário, e [senha] pode ser qualquer senha. Caso a primeira opção seja digitada, o comando perguntará a senha e pedirá que a repita antes de concluir a execução. Note que a segunda opção armazena a senha no histórico de comandos do shell, então tome cuidado ao usá-la!!
A opção “-c” cria o arquivo de senhas. Sem esta opção, o usuário informado é adicionado ao arquivo referenciado, que já deve existir.
A opção “-d” remove um usuário.

Após o comando, o arquivo passa a existir, com uma linha, onde o nome e a senha do usuário “admin” são separados com o caracter “:”, exatamente como o Linux faz em /etc/passwd. Observe:

cat /opt/svnrepos/repo1passwd
admin:k3ir2JUfTSAr6

Note que a senha está segura e criptografada. Existem opções no htpasswd para que ela não seja criptografada ou para selecionar qual algoritmo dentre os disponíveis deve ser usado em sua criptografia. Mais detalhes sobre o htpasswd pode ser acessado em sua página man ou com o parâmetro “-h”.


  • Configuração do Repositório no Apache

Neste momento, supõe-se que você já tenha um repositório criado no seu sistema de arquivos (tarefa normalmente feita com a ferramenta svnadmin).
Para informar o seu repositório para o Apache, é preciso editar o seguinte arquivo:

vi /etc/apache2/apache2.conf

Neste arquivo, deve-se incluir (em especial, para o bem do administrador de sistemas, no final do arquivo, com um comentário indicando a que veio o bloco de linhas!!), para cada repositório, um conjunto de linhas como este aí embaixo, capaz de informar a localização do repositório e a configuração de acesso ao mesmo:

[Location /repo1]
DAV svn
SVNPath /opt/svnrepos/repo1
AuthType Basic
AuthName "repo1"
AuthUserFile /opt/svnrepos/repo1passwd
Require valid-user
[/Location]

OBS: Substitua os colchetes por sinais de maior e menor, formando a tag corretamente!!

Bom, o que significa isto?? Bem fácil, acompanhe-me:

- Location: É a localização virtual do repositório (no formato de tag, que, para o Apache, recebe o nome de "Contêiner"). No caso acima, ele será acessível pelo endereço "http://[servidor]/repo1";
- DAV svn: Usar o módulo dav, direcionado para o SVN;
- SVNPath: Caminho real do repositório no sistema de arquivos;
- AuthType Basic: Tipo de autenticação. Sendo Basic, o acesso é permitido apenas a usuário devidamente autenticados. Note que esta autenticação não garante encriptação na hora de fornecer os dados sensíveis de usuário e senha pela rede. Dentro de uma rede local, isto pode não ter o menor problema. Porém, não faça assim se o seu repositório é visível pela internet!! Se este for o caso, então cogite usar uma chave de encriptação e proteger a conexão inteira por SSL, utilizando, na verdade, o protocolo HTTPS. Verifique os links de nossos artigos sobre o assunto deixados na conclusão deste artigo...
- AuthName: Nome de identificação do repositório, que aparecerá na janela de login do usuário e no nome do repositório, após o projeto ser baixado via checkout;
- AuthUserFile: Define qual o arquivo de senhas de usuários HTTP, criado pela ferramenta htpasswd, do Apache, conforme mostrado mais acima.
- Require valid-user: Exige login e senha de um usuário válido, independente da ação requerida.

Concluída a configuração, podemos finalmente reiniciar o Apache:

/etc/init.d/apache2 restart

Note que o Apache faz todo o acesso a disco a partir de seu usuário próprio (em geral, o www-data). Assim, é preciso que o seu repositório do SVN, assim como o diretório “db” e todo o conteúdo deste estejam acessíveis a este usuário. Normalmente, basta digitar os seguintes comandos:

Trocando o usuário nos arquivos e diretórios necessários:
chown www-data /opt/svnrepos/repo1
chown -R www-data /opt/svnrepos/repo1/db

Trocando o grupo nos arquivos e diretórios necessários:
chgrp www-data /opt/svnrepos/repo1
chgrp -R www-data /opt/svnrepos/repo1/db


  • WebDAV: Configurando Diferentes Permissões de Acesso (ou: Como acessar anonimamente o repositório?)

O exemplo acima é apenas um exemplo simples. Em alguns casos, porém, é interessante que seu repositório trabalhe com diferentes políticas de permissão de acesso, dependendo da ação (requisição) sendo solicitada. Exemplo: se o seu projeto é de código livre, talvez interesse manter o repositório aberto para leitura (update ou checkout) por toda a comunidade, sem exigir login de usuário e senha, mas, por segurança, manter a exigência de autenticação (usuário e senha) se a ação implicar alguma modificação no repositório (alterar aquivos, modificar propriedades, apagar ou adicionar arquivos, etc.). Assim, você tem seu repositório protegido, ou seja, somente a equipe autorizada é capaz de mexer nele, porém qualquer pessoa, de qualquer lugar do mundo, poderá baixar, a qualquer momento, o último estado (snapshot) do seu sistema.
Para realizar esta proeza, é bem simples. Primeiramente, devemos retirar a linha "Require valid-user", que exige autenticação irrestritamente, sem considerar o tipo de ação. Depois disso, devemos acrescentar as tags "Limit" ou "LimitExcept". A tag "Limit" contendo uma linha "Require valid-user" informa as ações que devem exigir autenticação. A tag "LimitExcept" contendo a mesma linha informa as ações que devem ser excetuadas desta regra, ou seja, que não exigirão autenticação. As duas tags podem ser adicionadas, mas isto será redundante. Em geral, prefira uma das duas. É comum se trabalhar apenas com a LimitExcept, para a configuração ficar menos verbosa.
Em resumo, para a situação proposta, a configuração ficaria:

[Location /repo1]
DAV svn
SVNPath /opt/svnrepos/repo1
AuthType Basic
AuthName "repo1"
AuthUserFile /opt/svnrepos/repo1passwd
# Require valid-user # Retirada esta linha!!
[Limit PUT POST DELETE PROPFIND PROPPATCH MKCOL COPY MOVE LOCK UNLOCK]
Require valid-user
[/Limit]
# Ou então, em lugar do Limit:
[LimitExcept GET PROPFIND, OPTIONS, REPORT]
Require valid-user
[/LimitExcept]

[/Location]

OBS1: Substitua os colchetes por sinais de maior e menor, formando a tag corretamente!!
OBS2: As ações incluídas dentro das tags Limit e LimitExcept são, muitas vezes, métodos HTTP. A listagem completa deles pode ser obtida aqui.
OBS3: Se você incluir no LimitExcept apenas o método GET, seu repositório será acessível anonimamente via HTTP, ou seja, do navegador, mas não poderá ser baixado de um cliente SVN sem nome de usuário e respectiva senha.



  • Conclusões

O acesso via webDAV é muito mais interessante para grandes equipes, pois protege mais o servidor, criando, através do Apache 2, uma camada de abstração entre o usuário e o repositório. Também esconde onde é o local exato em que o repositório está e quem realmente pode acessar a máquina servidora.
Existem, no entanto, muitas outras maneiras de configurar o webDAV, como:

- Forçá-lo a ser acessado apenas por HTTPS (imprescindível se seu repositório está aberto à internet). Se é isto que procura, visite nossos artigos Criando Certificações SSL com OpenSSL e Configurando o Apache com SSL;
- Abandonar o arquivo de senhas do Apache e configurá-lo para usar autenticação a partir de dados de uma tabela do MySQL;
- Dentre muitas outras coisas...

Todos estes tópicos fogem ao escopo deste pequeno artigo, mas espero ter fôlego para abordá-los tão logo, aguardem!!
Claro, como sempre, não devemos nunca nos esquecer do quanto é importante que COMENTEM!! ;-)

quinta-feira, 16 de dezembro de 2010

Verificando as Dependências (Bibliotecas) de um Programa

Quando instalamos um programa no Linux através de repositórios (usando o apt-get, yum, ou outro gerenciador qualquer), não nos damos conta da gama de operações que estes gerenciadores fazem para garantir a integridade do programa, ou seja, garantir que seja instalado o programa correto, com a compilação para a sua arquitetura, que seja a versão mais nova apontada e que faça instalar, concomitantemente, todas as dependências deste programa. É simplesmente uma maravilha não nos preocuparmos com isto!
Contudo, algumas vezes somos forçados a baixar aplicativos que não estão no repositório... daí toda esta magestosa praticidade cai por terra... como verificar se o programa que você acabou de baixar vai rodar?? Como saber se você realmente tem instaladas, em sua máquina, todas as bibliotecas, nas versões corretas, de que ele precisa?? Como achar e instalar as bibliotecas que estão faltando?? Se você se encontra perdido entre estas cruéis indagações, então neste artigo lhe apresentaremos duas soluções interessantes que vão dar uma luz a sua vida!!


  • Usando o comando ldd

É possível que em sua máquina já exista instalado este comando. Ele é muito simples: basta que se digite "ldd [arquivo]", e você terá a lista de todas as dependências do arquivo informado. Lembre-se de que o arquivo deve ser um binário executável, e não um script de texto, como muitos programas em Shell Script ou Python (caso seu programa seja em Python, a própria máquina virtual vai informar o trace do programa, mostrando as bibliotecas de import que não foram encontradas). Exemplo do ldd:

ldd /opt/eclipse/eclipse
linux-gate.so.1 => (0x00310000)
libpthread.so.0 => /lib/tls/i686/cmov/libpthread.so.0 (0x0061e000)
libdl.so.2 => /lib/tls/i686/cmov/libdl.so.2 (0x0020c000)
libc.so.6 => /lib/tls/i686/cmov/libc.so.6 (0x00311000)
/lib/ld-linux.so.2 (0x00a99000)

Veja que são informadas as bibliotecas e o caminho onde elas devem estar!! Se você quiser obter ainda mais detalhes, utilize o parâmetro "-v". Desta forma, você poderá descobrir não só as dependências do arquivo, como também as dependências das dependências, tornando bem fácil a instalação e resolução de grande parte dos problemas. Exemplo:

ldd -v /opt/eclipse/eclipse
linux-gate.so.1 => (0x0069d000)
libpthread.so.0 => /lib/tls/i686/cmov/libpthread.so.0 (0x009e7000)
libdl.so.2 => /lib/tls/i686/cmov/libdl.so.2 (0x00f0c000)
libc.so.6 => /lib/tls/i686/cmov/libc.so.6 (0x00a50000)
/lib/ld-linux.so.2 (0x00f31000)

Version information:
/opt/eclipse/eclipse:
libpthread.so.0 (GLIBC_2.0) => /lib/tls/i686/cmov/libpthread.so.0
libdl.so.2 (GLIBC_2.1) => /lib/tls/i686/cmov/libdl.so.2
libdl.so.2 (GLIBC_2.0) => /lib/tls/i686/cmov/libdl.so.2
libc.so.6 (GLIBC_2.3) => /lib/tls/i686/cmov/libc.so.6
libc.so.6 (GLIBC_2.1) => /lib/tls/i686/cmov/libc.so.6
libc.so.6 (GLIBC_2.0) => /lib/tls/i686/cmov/libc.so.6
/lib/tls/i686/cmov/libpthread.so.0:
ld-linux.so.2 (GLIBC_2.3) => /lib/ld-linux.so.2
ld-linux.so.2 (GLIBC_2.1) => /lib/ld-linux.so.2
ld-linux.so.2 (GLIBC_PRIVATE) => /lib/ld-linux.so.2
libc.so.6 (GLIBC_2.1.3) => /lib/tls/i686/cmov/libc.so.6
libc.so.6 (GLIBC_2.1) => /lib/tls/i686/cmov/libc.so.6
libc.so.6 (GLIBC_2.3.2) => /lib/tls/i686/cmov/libc.so.6
libc.so.6 (GLIBC_2.2) => /lib/tls/i686/cmov/libc.so.6
libc.so.6 (GLIBC_PRIVATE) => /lib/tls/i686/cmov/libc.so.6
libc.so.6 (GLIBC_2.0) => /lib/tls/i686/cmov/libc.so.6
/lib/tls/i686/cmov/libdl.so.2:
ld-linux.so.2 (GLIBC_PRIVATE) => /lib/ld-linux.so.2
libc.so.6 (GLIBC_2.1.3) => /lib/tls/i686/cmov/libc.so.6
libc.so.6 (GLIBC_2.1) => /lib/tls/i686/cmov/libc.so.6
libc.so.6 (GLIBC_2.0) => /lib/tls/i686/cmov/libc.so.6
libc.so.6 (GLIBC_PRIVATE) => /lib/tls/i686/cmov/libc.so.6
/lib/tls/i686/cmov/libc.so.6:
ld-linux.so.2 (GLIBC_PRIVATE) => /lib/ld-linux.so.2
ld-linux.so.2 (GLIBC_2.3) => /lib/ld-linux.so.2
ld-linux.so.2 (GLIBC_2.1) => /lib/ld-linux.so.2

Mais opções e alguma ajuda podem ser obtidas com o help:

man ldd
ou: ldd --help


  • Usando o comando getlibs

O comando getlibs dá um passo a frente do ldd! Com ele, não só você conseguirá verificar se existem bibliotecas faltando para seu programa rodar, como também poderá baixar e instalar automaticamente as bibliotecas omissas. De fato, um programinha de ouro para qualquer usuário, desde um administrador de sistemas até o usuário doméstico!!
Provavelmente o getlibs não estará instalado em seu sistema, e talvez não exista no repositório. No entanto, ele poderá ser baixado gratuitamente do site:

http://frozenfox.freehostia.com/cappy/

Se seu sistema é baseado em Debian, baixe o arquivo .deb e instale com o seguinte comando (como superusuário!!):

dpkg -i getlibs-all.deb

Agora é só verificar as dependências:

getlibs /opt/eclipse/eclipse
This application isn't missing any dependencies

A mensagem acima indica que não há dependências faltando. Caso haja, o getlibs vai indicar quais sejam elas e tentar baixá-las e instalá-las para você.
Mais detalhes sobre as opções e parâmetros do getlibs podem ser encontradas neste link.
Aí está: outro programa extremamente útil, que pode lhe salvar dos últimos desesperos da alta madrugada, quando nada mais parecer ter vida...

Bom, claro, muito mais importante do que tudo isso: COMENTEM!!!!

sábado, 20 de novembro de 2010

Instalando o Plugin do SVN no Eclipse

Para quem usa o Eclipse e o SVN, provavelmente não é novidade que se tenha algum problema ao instalar o plugin... o fato é que, apesar de o Eclipse ser uma excelente IDE (tanto para desenvolvimento Java como para Web, C, C++, Phyton, e milhares de outras linguagens), ele não vem com um plugin para o SVN por padrão (vem apenas com o plugin do CVS), e a gente tem que instalar manualmente o plugin de nossa preferência.
Este artigo ensina como se instalar o plugin Subclipse, que considero ser o mais fácil de se instalar e usar. As instruções foram testadas no Eclipse Galileo e Helios, utilizando o SVN Server versão 1.6 no servidor (todas as versões mencionadas são bem atuais, no momento de criação deste artigo). Note que tratamos, aqui, apenas da parte cliente. A parte servidora, ou seja, a instalação e configuração do SVN, já foi tratada em diversos outros artigos deste portal, como este e este.
É importante saber qual versão do SVN instalada no servidor que você usa, uma vez que os clientes de SVN, como o plugin do Eclipse, que funcionam localmente, precisam de um driver para falar com o servidor, e este driver é específico para cada versão.

  • Como descobrir a versão de meu SVN Server??
Bem simples. Acesse a máquina servidora onde o seu Subversion (servidor) está instalado e digite "svnserve --version" ou "svnadmin --version". Observe a primeira linha da saída de texto:

$ svnserve --version
svnserve, version 1.6.6 (r40053) compiled Dec 12 2009, 05:06:12

Copyright (C) 2000-2009 CollabNet.
Subversion is open source software, see http://subversion.tigris.org/
This product includes software developed by CollabNet (http://www.Collab.Net/).

The following repository back-end (FS) modules are available:

* fs_base : Module for working with a Berkeley DB repository.
* fs_fs : Module for working with a plain file (FSFS) repository.

Cyrus SASL authentication is available.

  • Preparando para Instalar o Plugin do Eclipse

Para todas as operações daqui para frente você deverá ter um JDK (Java Development Kit) instalado em sua máquina. Caso não o tenha, você poderá baixá-lo gratuitamente aqui.
Supomos que você baixou o Eclipse do site oficial (http://www.eclipse.org/), e que é a versão correta para seu sistema e sua arquitetura (32 ou 64 bits). Recomendo que baixe a compilação mais completa, com as ferramentas de JEE, uma vez que elas poderão ser muito úteis, mesmo que você inicialmente não vá desenvolver para web. Agora basta descomprimir o Eclipse e colocá-lo em uma pasta acessível.
Para rodar o programa, basta rodar o seu executável dentro de sua pasta padrão (não é necessária qualquer processo de instalação prévio):

cd eclipse
./eclipse

A instalação do plugin é feita de dentro do Eclipse mesmo, acessando o menu HELP, opção "Install New Software...", conforme mostra a Figura 1.


Figura 1: Menu Help do Eclipse Helios.

Acessando esta opção, entramos na ferramenta de atualização e instalação de novos plugins para o Eclipse. Virtualmente qualquer coisa pode ser instalada ou removida de seu Eclipse nesta tela. Portanto, tome cuidado ao mexer nestes componentes, pois não é tão difícil "quebrar" as dependências dos plugins e corromper o seu Eclipse.


  • Instalando o Subclipse, SVN Plugin para o Eclipse

Na tela de instalação de novos plugins, alcançada no item anterior, precisamos adicionar o repositório na rede onde encontraremos o plugin de que precisamos. Alguns repositórios já existirão na lista de repositórios desta janela, mas são os repositórios padrão do Eclipse, e não de outros plugins desenvolvidos por terceiros. Note que, nestes repositórios padrão, existe o plugin Subversive, que tem funcionalidades análogas ao Subclipse, sendo uma alternativa a este. Nunca instale os dois!! Este artigo, contudo, limita-se apenas ao Subclipse.
O repositório correto poderá ser encontrado na própria página do Subclipse, item Download and Install. Para ajudá-lo, já copiei o endereço do repositório aqui:

http://subclipse.tigris.org/update_1.6.x

Este endereço é acrescentado clicando-se no botão "Add". Uma vez acrescentado, o repositório é lido (se você estiver conectado à internet, claro!!), e as opções aparecerão na janela principal. Vide Figura 2 (clique para aumentar!).


Figura 2: tela de atualização e instalação de novos plugins do Eclipse, com o repositório do Subclipse adicionado e sendo lido.

Neste momento, basta se saber selecionar os itens corretos e deixar que o próprio Eclipse encontre os plugins, baixe-os e instale-os automaticamente para você!! Assim, para que tudo funcione, selecione os itens:

Aba "Subclipse", item "Subclipse";
Aba "Subclipse", item "Subversion Client Adapter";
Aba "Subclipse", item "SVNKit Client Adapter".

E, para o driver do subversion:
Aba "Core SVNKit Library", item "SVNKit Library".

- Clique em "Next";
- Confirme os plugins, clicando em "Next" novamente;
- Aceite os termos da licença e conclua a operação, aguardando o término do download.

Após o download e instalação completos, o Eclipse pedirá que seja reiniciado. Procure reiniciar apenas se seus trabalhos estão todos salvos.
Se, em algum momento deste procedimento, surgir uma mensagem dizendo que você está instalando um software que não foi verificado ("Warning: You are installing software that contains unsigned content. Blá blá blá blá..."), ignore-a. O procedimento está correto, a despeito disto...


  • Testando a Instalação

Se o Eclipse reiniciou corretamente, provavelmente estará tudo pronto. Para verificar se o Subclipse foi instalado corretamente, selecione a perspectiva que lhe é característica: acesse o menu WINDOW, opção "Open Perspective". Selecione "Other" e escolha a perspectiva "SVN Repository Exploring", exatamente como está na Figura 3:


Figura 3: Abrindo a perspectiva do Subclipse.

Esta perspectiva deve existir na lista. Caso não haja, alguma coisa ficou faltando...
Abrindo a perspectiva, você poderá instalar um repositório, seguindo o item abaixo.


  • Instalando um Repositório

Um repositório é o local remoto onde está o banco de dados do SVN, contendo seus dados versionados. Vide os tutorias anteriores do Pajé sobre SVN para aprender mais sobre repositórios, SVN e a parte servidora (referenciados no caput deste artigo).
Para instalar um repositório, abra a perspectiva do SVN (conforme mostrado no item anterior) e clique com o botão direito no view "SVN Repositories". Selecione a opção "New" e sub-opção "Repository Location". Surgirá uma janela pedindo o local do repositório. Complete com os dados que você tem a respeito de seu repositório. Logo depois, uma nova janela perguntará dados adicionais, como o nome do usuário, a senha do usuário e a porta que deve ser acessada no servidor. Complete todas estas informações com os dados corretos da configuração de seu servidor (ou pergunte ao administrador da sua rede como ele configurou isso tudo...).
Uma última tela, que surge apenas no primeiro acesso, pede que você confirme o recebimento da chave de segurança, caso a conexão seja segura. É possível que surja, ainda, outra tela pedindo que repita o nome do usuário. Estas duas perguntas podem ou não ocorrer, dependendo da situação do seu servidor. Responda "Yes" para a primeira e complete a segunda sem sustos com os dados que você já tem.
Prontinho!!! Seu repositório está na lista!! Clique no ícone ao lado esquerdo do endereço, para abri-lo, escolha o projeto que deseja baixar e clique com o botão direito em cima da pasta, selecionando o comando checkout. Isto baixará seu primeiro projeto com esta instalação do cliente SVN.

Boa sorte!! Espero ter sido detalhista o suficiente para que todos que venham a este artigo consigam fazer a instalação com sucesso!! Lembrem-se que, como sempre, em qualquer artigo deste portal, é fundamental que COMENTEM!!

sábado, 30 de outubro de 2010

Testando a Placa de Vídeo no Linux com mesa-utils

Então imagine: você acabou de instalar a sua nova distribuição Linux, ou a nova versão dela, e quer saber se o driver de vídeo está rodando, ou seja, se a sua placa aceleradora de vídeo funciona perfeitamente. Ou então: você acaba de trocar ou comprar uma placa de vídeo nova e quer saber se o driver está rodando direitinho... mais ainda: você acabou de instalar o driver da placa de vídeo e quer confirmar se ele está funcionando. Outro cenário: instalei o Kubuntu, mas os efeitos gráficos não estão funcionando; quero testar a placa de vídeo.
Tudo te leva a uma mesma pergunta: como testar, de forma rápida, a performance do vídeo no Linux??


  • Usando o glxgears

Existe um programa simples e rápido para tanto!! Ele é denominado glxgears e nem sempre vem com a sua distribuição. Não se preocupe: ele pode ser instalado com o conjunto de aplicativos gráficos do pacote mesa-utils. Se sua distribuição é baseada em Debian, instale, como root:

apt-get update
apt-get install mesa-utils

Agora simplesmente abra um terminal (Terminal ou Konsole) e digite:

glxgears

Se tudo estiver certinho com sua placa de vídeo, driver e configurações do X, então deve aparecer uma janela do X com três simpáticas engrenagens rodando ativamente. Deixe o terminal aberto. A cada 5 segundos, haverá uma saída de texto no terminal indicando o desempenho gráfico de sua placa (quantidade de frames per second - fps - ou: quadros por segundo).
Veja o exemplo na imagem abaixo...




  • Obtendo Informações sobre a Placa de Vídeo

Se o seu caso é obter informações mais detalhadas (bem mais avançadas!) e técnicas sobre a placa de vídeo e todos os módulos e bibliotecas que o driver de vídeo está rodando, pormenorizadamente, então este pacote acima vai te ajudar com outro programa simples e útil. Digite no terminal, após instalar o pacote mesa-utils:

glxinfo

Surgirá uma saída de texto enorme, contendo diversas informações sobre seu dispositivo de vídeo, o driver que está rodando e todos os detalhes concernentes. Apenas um pequeno trecho do mesmo (clique para ampliar):




  • Testando Eventos de Janela

Outra ferramenta presente neste pacote e que pode ser particularmente útil para programadores, como desenvolvedores de jogos, é o programa glxdemo. Ele abre uma pequena janela com um quadrado amarelo centralizado, ocupando grande parte da janela. A cada pixel que o usuário mova ou redimensione as bordas da janela, é gerado um evento que o glxdemo captura e acusa numa saída de texto. Para usá-lo, abra-o no terminal e tente mover ou redimensionar a janela:

glxdemo

Vide o exemplo:



  • O Teste Final: Testando Múltiplas Conexões com GLX

Similar ao glxgears, existe o glxheads, porém este testa múltiplas conexões com o GLX. O resultado é uma janela com um triângulo rodando, sendo recalculado e redesenhado, com uma simpática saída de texto indicando lindamente o nome de sua placa de vídeo e algumas informações básicas sobre a mesma. Basta digitar, no terminal:

glxheads

Vide o exemplo (clique para aumentar, como todos os outros):




Bom, pessoal... espero ter ajudado em alguma coisa!! O objetivo deste artigo foi contribuir tanto para usuários com problemas de configuração de placas de vídeo quanto para programadores interessados em explorar o máximo delas. Conforme todos os outros artigos, se você gostou, detestou, salvou sua vida ou acabou de vez com ela: COMENTE!!!
E até a próxima!!

sexta-feira, 24 de setembro de 2010

Dica Desert Operations: Quando o Melhor Ataque é a Defesa!

OK, todos já sabem que eu ando jogando este jogo e que, ao lado de dicas do Linux, eu publico dicas de jogos de estratégia... bom, mas esta dica de hoje também é boa e se dirige a jogadores de nível intermediário ou mesmo avançado!! Vamos ao cenário: você normalmente junta muito dinheiro com suas fábricas, metrópoles e cidades, e gasta tudo fazendo tanques e navios, soldados e mergulhadores?? Cada ataque que você realiza consome grande parte de suas frotas e você precisa ficar de resguardo, construindo tudo de novo?? Está cada vez mais custoso atacar, porque seus inimigos são fortes e a garantia da vitória é proporcional ao peso de sua frota?? E, o pior: depois de um ataque de sucesso, suas frotas encontram-se debilitadas e você fica muito vulnerável a contra-ataques, que podem tomar grande parte de suas suadas conquistas?? Pois é, então está na hora de jogar usando uma estratégia diferente: a defesa!!
Quem sofre um ataque normalmente é avisado alguns minutos antes. De cada ataque realizado, podemos colher um de dois resultados:

  • O atacante é vitorioso: então ele toma dinheiro, fábricas, minas, cidades e metrópoles do defensor. Derruba suas frotas e defesas, ou grande parte delas.
  • O atacante é derrotado: tudo acontece em sentido inverso!! O defensor derruba as frotas do atacante, ou grande parte delas. Como contra-ataque, automaticamente toma-lhe dinheiro, cidades, fábricas, minas, metrópoles...

Veja que pode ser extremamente útil trocar, em certas situações, uma estratégia de ataque por uma de defesa!!
Mas, como realizar uma boa defesa?? Agora sim está falando a minha língua!! Siga as dicas abaixo:

  • Antes de tudo, empregue algum tempo (e dinheiro) investindo em mecanismos de defesa. Estão todos no Centro de Pesquisas, aba Defesa. Claro que grande parte dos pré-requisitos já estarão desenvolvidos se você já tem alguma coisa de marinha e exército, mas os melhores mecanismos de defesa exigem que as pesquisas vão um pouco mais além;
  • Construa suas defesas. Elas não encarecem com a quantidade. Vá no Pentágono e mantenha-se sempre construindo;
  • Nunca exagere, construindo apenas defesas de um tipo. Existem armas que detonam certas defesas sem sofrer qualquer ferimento. Desenvolva um pouco de cada, e mantenha o máximo de variedade possível nas suas defesas;
  • Crie uma frota para atacar com R1, mas que não será usada em ataque. Esta frota será acionada imediatamente se você for atacado. Coloque nesta frota apenas os armamentos que têm nível de defesa maior (ou ao menos igual) que nível de ataque, como os tanques T90, os Tanques Anti-Aéreo, corveta K130 e Submarino Classe 212A;
  • Tenha na sua frota de defesa sempre ao menos um item de cada meio (terra, mar e ar), para evitar perder tudo com ataques de meios dos quais não há defesa (exemplo: se sua frota está cheia de tanques, mas não tem nenhum avião ou helicóptero, e você for atacado por um avião...);
  • Lembre-se de que os espiões nem sempre olham os armazéns. Neste caso, mantenha no armazém uma frota reserva, cópia idêntica em poder ou preferencialmente até mais poderosa que a frota que você está usando em R1 para defesa;
  • Antes de qualquer ataque você tem alguns minutos... entre sempre no jogo e, se você vir um ataque agendado, corra aumentando as defesas e movendo seu armazém para a frota de defesa. Muitas batalhas podem ser ganhas surpreendendo o inimigo assim, mesmo aquele que se deu o trabalho de espionar detidamente seu arsenal;
  • Outra opção seria enganar os espiões trouxas: manter uma frota de defesa magrinha mas um armazém lotado de armas de todo o tipo. Na iminência de um ataque, após a espionagem, você pega e move grande parte para a frota de defesa. Subitamente, sua defesa fica bem mais forte e supera o ataque projetado pelo seu inimigo, ganhando fácil grandes vantagens sobre ele...

Bom, pessoal, como é custoso produzir tudo isso apenas para a defesa, igualmente é custoso produzi-lo para atacar... espero que estas dicas de estratégias do Desert Operations sejam utilizadas sabiamente e ajudem aos colegas jogadores!!
E lembrem-se: o importante, afinal, não é ganhar, mas sim se divertir!! Qualquer coisa: COMENTEM!!!

domingo, 12 de setembro de 2010

Desert Operations: Dicas para o Jogo

Pessoal, como alguns já sabem, tenho me divertido muito com o jogo online de estratégia Desert Operations. Já escrevi aqui um artigo contando brevemente como é o jogo e com um tutorial em vídeo para iniciantes. Este presente artigo, vindo a completar o primeiro, contém algumas dicas estratégicas que servirão tanto para iniciantes quanto jogadores intermediários. Espero que sejam úteis!!

  • Ao se iniciar no jogo, procure logo construir todas as construções. Ao menos um prédio de cada construção.
  • Note as seguintes regras básicas do jogo:
  1. Todas as construções de imóveis (prédios, cidades, fábricas, Universidade, minas, aeroporto, etc.) só podem ser feitas uma por vez. Algumas, no entanto, permitem que você indique quantas unidades pretende construir na seqüência, o que é ótimo, mas lembre-se de que cada unidade nova aumenta o preço total, embora não aumente o tempo de construção;
  2. Fabricações de armamentos, como tanques, navios e aviões, armas e militares (soldados, mergulhadores, etc.) podem ser feitas simultâneamente. Independente da quantidade solicitada, o tempo de construção será o mesmo, apenas o preço que fica mais salgado;
  3. As unidade que permitem acumular fabricações (chamada "expansão"), como os simuladores, os campos de tiro e as fábricas de tanques, navios e aeronaves, vão ficando significantemente mais caras e demoradas a cada expansão.
  • Projete bem as suas construções e expansões para não ficar, na hora H, com a possibilidade de construir bloqueada esperando uma tarefa demorada terminar...
  • Sempre deposite dinheiro no banco, ele te ajuda a render mais dinheiro, o que é sempre bom, mesmo a curto prazo. Nunca desfalque sua conta no banco e evite sacar. Tente, ao máximo possível, trabalhar com o que você tem em mãos.
  • Atente para as construções que aumentam a geração de capital: Metrópoles e Fábricas geram um bom dinheiro, secundadas por cidades. Minas são importantes para gerar ouro, que é inútil para iniciantes, mas muito valioso no mercado e nas atividades de espionagem.
  • Embora cidades gerem pouco dinheiro (em relação às Metrópoles), são mais baratas e mais rápidas de se construir. Assim, você pode gerar cidades e fábricas (também barato e rápido de se construir) só para servir de isca para possíveis ataques, que vão destruí-las, preservando um pouco mais as suas metrópoles.
  • Esforce-se por manter sempre uma pesquisa em andamento. Existem pesquisas que são realmente demoradas, e você precisa realizá-las para aumentar as possibilidades de fabricação de armamentos (novos tanques, novos navios e submarinos, novos aviões, novos mecanismos de defesa). Lembre-se de que o jogo só permite que se realize uma pesquisa de cada vez. Não adianta choramingar...
  • Planeje as suas pesquisas: algumas são cumulativas e algumas estão presentes como pré-requisito para diversas armas, inclusive algumas da defesa!!
  • Um bom estrategista tem sempre uma frota especial para a defesa de sua cidade, com prioridade R1. Assim, se você for atacado, seu inimigo se surpreenderá com a sua frota de defesa e, mesmo que ele ganhe, vai ter de sacrificar muitos de seus recursos.
  • Um bom estrategista sempre mantém uma rede de defesa forte. Mas não mais forte do que sua frota, pois a defesa é sempre a primeira coisa que cai, e a frota é o que vem depois, quando a batalha esquenta. Se você aplicar todo o seu dinheiro montando uma defesa boa, a sua frota vai ficar fraca demais e, quando a defesa cair, a sua derrota será certa... o inimigo é tanto mais forte quanto mais capaz de desafiar e derrubar sua defesa.
  • Atente para os valores de ataque e defesa de cada componente militar (desde soldados até navios, aviões e tanques). Observe que alguns itens têm a defesa forte e o ataque fraco, como o tanque T90 e a Corveta, sendo próprios para uma frota exclusiva de defesa. Outros, no entanto, têm o ataque muito forte e a defesa ridícula, como o Detector de Minas Hameln, sendo apropriados para uma frota somente de ataque. Posicionar suas armas em seus devidos lugares é uma arte e pode ser a garantia do seu fortalecimento ou sua fraqueza...
  • Poupe diamantes!!! Eles podem ser a moeda do jogo, mas adquirí-los custa dinheiro de verdade!!
  • Planeje sua renda para não faltar dinheiro, mas planeje o uso de seu dinheiro para tê-lo em constante gasto e mantendo seu jogo sempre construindo e/ou pesquisando alguma coisa, continuamente. As pesquisas, rendas e construções permanecem ocorrendo, depois de iniciadas, mesmo se você estiver desconectado.
  • Acompanhe a sua pontuação e a sua classificação geral no jogo, são bons medidores de seu desempenho.
  • Acompanhe obstinadamente as mensagens de correio. São através delas, nos relatórios de combate, que você se informa se foi atacado, podendo visualizar o relatório detalhado do combate e alguns dados de seu oponente.
  • Seja cuidadoso ao entrar em alianças, mas não se deixe abater: é normal que você sofra derrotas e ataques, visto que existem jogadores mais fortes que você, mas levante-se, anime-se e prepare-se para competir!! Espírito esportivo, pois trata-se de um jogo apenas, e jogo não é a vida real!!

Beleza, pessoal!! Boa diversão e, não esqueçam: COMENTEM!!!

sábado, 4 de setembro de 2010

KTurtle: Programando em Logo no KDE


O KTurtle, da suíte do KDE. Fácil e simples ambiente de programação em Logo.



Um exemplo das possibilidades de desenho com a tartaruguinha...


Existem inúmeros usuários do KDE no mundo hoje em dia, mas ainda muito poucos conhecem a grande diversidade de programas da sua suíte. Posso mesmo arriscar dizer que, talvez por não serem essenciais para o funcionamento da interface, muitos destes programas são verdadeiramente marginalizados e esquecidos pelas distros populares de Linux e seus usuários. Dentre tais cito especialmente os diversos aplicativos da seção Educação, dividida em quatro ricas sub-seções: Linguagens, Matemática, Miscelânea e Ciência. Hoje vou tratar do KTurtle, presente na sub-seção Miscelânea.
O KTurtle é um simpático interpretador para a antiga linguagem Logo, criada por Seymour Papert do MIT Artificial Intelligence Laboratory em 1967. O grande objetivo deste programa, assim como o da linguagem que interpreta, é, segundo seus desenvolvedores, “tornar a programação tão fácil e acessível quanto possível” (Manual do KTurtle), de forma a poder ensinar a crianças, de modo agradável, intuitivo e prático, os fundamentos da matemática, geometria e programação.
Enfim, o Logo é uma linguagem cujo principal fim é criar programas que, através do cálculo de variáveis e das estruturas básicas de algoritmos, consigam gerar números que vão orientar o movimento de uma sorridente tartaruguinha na tela. Mover a tartaruguinha ensina matemática e geometria, mas também ensina programação, lógica e alguma coisa artística, com sorte...
O KTurtle é é uma ferramenta fantástica para este objetivo: possui uma interface simples e fácil de usar, aceita modo de tela cheia e numeração das linhas do código, possui identificação colorida de sintaxe, tem várias velocidades de execução, para a observação mais apropriada do movimento da tartaruga e permitindo ao usuário, inclusive, pausar a execução a qualquer momento e retomá-la quando quiser, ou mesmo mudar a velocidade durante a execução, após soltar o botão pause. Quando executando em qualquer velocidade (exceto a mais rápida), cada comando é marcado no momento de sua execução, facilitando a depuração e entendimento do código. Possui uma boa ferramenta de seleção de cores. Por fim, os lindos deseninhos feitos com nossa amiga tartaruguinha podem ser salvos em arquivos PNG.
Como um dos objetivos do Logo é ser acessível e ter seus comandos traduzidos para a linguagem do usuário, o KTurtle suporta igualmente traduções para outros idiomas além do inglês.


  • Exemplo de Código em Logo

Um exemplo de um programa bem simples em Logo está listado abaixo, com o resultado do movimento da tartaruguinha na figura correspondente. Observe que o Logo permite inclusive estruturas de repetição (com o comando repeat).

repeat 9 [

go 150, 130
repeat 20 [
turnright 10
forward 10
]

]





  • Concluindo

Considero o Logo uma boa ferramenta para a educação e me espanto em vê-la tão pouco explorada. Acredito que isto se dê devido especialmente à desinformação neste campo, visto que hoje é relativamente fácil se encontrar laboratórios de informática nas escolas e existem aplicativos como o KDE e o KTurtle que rodam mesmo em máquinas mais humildes, oferecendo, todavia, gratuitamente e com alta qualidade, fartos recursos para a excelência desejada na experiência com dada linguagem e cumprimento de seus objetivos.

sábado, 14 de agosto de 2010

Criando Objetos em JavaScript

Apesar de JavaScript ser uma linguagem procedural, ela também é uma linguagem orientada a objetos. Como pode ser isto?? A explicação é simples: inicialmente, o JavaScript era apenas uma linguagem estruturada, procedural, e ponto final. No entanto, ela ganhou tantas melhorias e novas ferramentas durante as suas muitas modificações, releituras e ampliações que se tornou possível utilizar facilmente o paradigma de orientação a objetos através de determinadas técnicas de construções de funções (além de poder utilizar o operador "." para navegar pela estrutura DOM).
Este artigo versa sobre como utilizar as ferramentas funcionais de JavaScript para trabalharmos com orientação a objeto, de forma a dar mais poder, flexibilidade e organização a nosso código. Parte do que material teórico de precisaremos já foi discutida no nosso velho tutorial sobre o objeto Date e o prototype, que pode ser acessado aqui.
Vale lembrar que objetos (na verdade, as suas classes) podem ser instanciados diversas vezes, sendo suas instâncias independentes umas das outras. As técnicas mostradas aqui respeitam esta característica do paradigma OO. Note que, como o JavaScript é não tipado e procedural, a linguagem assume que todos os objetos e métodos criados têm ampla visibilidade (modificador de acesso público) e nunca gerarão diretamente problemas de casting. Se você não entende este detalhe técnico, não se preocupe, pois ele não lhe fará falta... siga em frente tranqüilo!!

  • Criando um Objeto em JavaScript

Basta criar uma função normalmente e instanciá-la com o operador new. Em outras palavras, o operador new pode tornar em objeto qualquer função que você escreva. Vejamos:

function Object() {
}

window.alert(new Object());

O código acima declara uma função e, através do seu instanciamento, esta função é tornada em objeto na memória. Simples e fácil.
Parece louco que qualquer função em JavaScript é automaticamente uma candidata à classe e ao instanciamento, mas é isto mesmo: JS é muitas vezes simples e prático!!


  • Criando Métodos em JavaScript

Igualmente simples, para se criar um método basta se criar uma variável dentro de uma função onde seja declarada uma outra função, ao invés de um valor. Veja os exemplos:

function Object() {
this.getName = function() {
return "Object Hello World!!";
};
}

var object = new Object();
window.alert(object.getName());

Observações importantes:
1- Sempre que declarar um método, para se ter certeza de que este método vai ser uma função intrínseca ao objeto, deve-se usar a palavra reservada this, conforme mostra o exemplo acima;
2- Como a declaração de método é, na verdade, uma declaração de variável, deve-se terminá-la com o ponto-e-vírgula depois do fecha chaves!! Este é um erro clássico, mormente para quem faz este procedimento pela primeira vez;
3- Os métodos, em sendo funções, podem receber parâmetros normalmente, como qualquer outra função ordinária.

Outra maneira de se declarar um método é através de associação de funções a variáveis indiretamente, conforme o exemplo:

function Object() {
this.getFullName = getFullName;
}

function getFullName() {
return "Super Object Hello World!!";
}

var object = new Object();
window.alert(object.getFullName());

Esta técnica é útil quando se quer fazer métodos iguais para dois ou mais objetos. Como uma arquitetura bem projetada tende a eliminar este cenário, talvez seja mais interessante utilizar o primeiro idioma, vez que ele é de mais fácil leitura, menos verboso e, especialmente, evita o problema de duplicação de nomes de métodos e funções, o que tente a provocar erros bobos mas de difícil depuração.


  • Usando o Objeto Prototype

É possível, por extensão, adicionar-se propriedades e métodos a objetos já existentes do JavaScript. Para tanto, precisaremos acessar o objeto prototype, presente em todos os objetos, e capaz de absorver novas variáveis de funções e valores. Estude o exemplo abaixo, onde iremos modificar o objeto String para que ele tenha um método a mais, capaz de retornar a primeira palavra da String. Para se chamar o método, não é necessário se acessar o objeto prototype pois, uma vez este declarado através daquele, o método passa a compor a estrutura do objeto, em qualquer instância que seja.

String.prototype.getFirstWord = function() {
if(this.length > 1) {
for (i=0; i < this.length; i++) {
if (this.charAt(i) == ' ') {
return this.substring(0,i);
}
}
}
return "";
};
window.alert("pajé online".getFirstWord());


  • Conclusão

Apesar do JavaScript ter sido projetado, originalmente, como uma linguagem estrutural, procedural, simples e singela, hoje é possível, através de mecanismos simples e da maleabilidade creditada à linguagem, extendê-las de diversas maneiras, como a aplicação do paradigma de orientação a objetos. Não é tão complexo criar objetos, métodos e propriedades em JavaScript (na verdade, talvez até mais simples que em outras linguagens mais fechadas dentro dos conceitos do paradigma, como o Java), porém é de extremo valor para um desenvolvimento mais profissional, flexível, extensível e complexo, permitindo manter-se a ordem e a hierarquia dos dados, além da boa estrutura e manutenência do código.
Gostou?? Detestou?? Foi bom pra você?? Então COMENTE!!!

quarta-feira, 11 de agosto de 2010

Iniciando-se no Jogo Desert Operations


Olá Pessoal!!

Para não dizer que falo apenas de trabalho, estou passando uma dica de um jogo online, gratuito (até certa medida), com o qual tenho me entretido um pouco... é o "Desert Operations" (o link para o servidor em português do Brasil é este: http://www.desert-operations.com.br). Trata-se de um jogo de estratégia, baseado no antigo modelo de países, cidades, territórios e alianças, todos em guerra, naturalmente, onde você tem que montar a sua cidade e o seu poder militar, vender e trocar recursos, explorar os trabalhadores em troca de impostos, fazer laços de amizade e alianças com outros países, atacar os mais fracos e ganhar dinheiro para colocar no banco e render juros. Nada pouco violento, porém ainda no nível da estratégia.
Para quem quiser dar uma olhadela no visual do jogo, existe o vídeo de um breve tutorial para iniciantes, que pode ser visto aqui.
O jogo é bem interessante e completamente online. Fortemente baseado em image map (apenas alguns componentes secundários, como o Chat, em Flash), é impressionantemente compatível com qualquer navegador. Existe, no chat, uma sala exclusiva para aprendizado e é fácil de se obter, na tela principal, o manual do usuário. Minha crítica maior, até o momento, é que não dá para se deixar a janela aberta, mesmo que com o chat funcionando, e contar que a sua sessão se mantenha ativa sozinha. É preciso ficar clicando em alguma coisa, mesmo que de 10 em 10 minutos, senão sua sessão cai. Acredito que isto poderia ser resolvido com um cookie e/ou uma requisição remota AJAX simples, sem prejuízo das regras do jogo. Ao menos antes que algum viciado crie um proxy para fazer requisições repetidamente e manter a sessão aberta sem a presença física do usuário...
Bom... Se for de seu gosto, espero que se divirtam!!

sábado, 31 de julho de 2010

Várias Maneiras de Matar uma Aplicação

A verdade é a seguinte: embora o Kernel do Linux seja a coisa mais estável do mundo (impressionantemente estável como poucas coisas na vida!!), as aplicações que nós rodamos muitas vezes não têm esta mesma propriedade (nem tempo de desenvolvimento, já que o Kernel é de fato bem velhinho...). Assim, acontece o inesperado: as aplicações travam!! E a gente tem que pedir ao Kernel que as "mate", ou seja, interrompa os seus processos, nem que seja bruscamente, e recupere (às vezes chamado "reivindique") a memória usada por elas. Não preciso nem dizer que, o que quer que estes programas estejam fazendo, vai para o espaço, e, uma vez tendo a memória que ocupam ao rodarem reivindicada, eles viram meras vagas lembranças...
Bom, este é o cenário deste artigo: como matar um programa no Linux?? As instruções servem tanto para programas rodando normalmente quanto para aqueles que travaram e não respondem. Qualquer programa pode ser matado porque quem mata é o Kernel, e com o Kernel ninguém pode (lembrem-se de que estamos falando de sistemas de verdade, e não de sistemas com falhas de proteção entre as camadas básicas, como o Windows e alguns sistemas embarcados muito simples...)


  • Matando Bruscamente

Matar bruscamente um programa é a última coisa que fazemos, recurso somente utilizado quando nada mais é possível e o programa não responde mais. A maneira mais simples é digitar o comando kill. Este comando precisa do argumento referente ao PID (identificador do processo) do programa e do tipo de sinal a ser enviado. Para achar o PID de seu programa, veja o número da primeira coluna deste comando:

ps -e

(a opção "-e" exige que se mostrem todos os processos).
Em geral isto exibe uma lista enorme. Então, se você sabe qual programa matar, resuma a saída com o comando grep (exemplo, vamos matar o kedit):

ps -e | grep kedit
20128 pts/0 00:00:00 kedit

Viu?? Apenas uma linha, que informa que o PID do kedit é 20128. Felizmente, só temos uma instância do kedit rodando. Agora vamos matar esse camarada (coitado, aqui ele tava rodando direitinho, mas foi eleito como bode expiatório deste tutorial... a vida nem sempre é justa...):

kill -9 20128

Isto mata exatamente aquela instância. Se houver mais de uma instância do kedit, elas terão identificadores diferentes (PIDs diferentes) e você conseguirá matar apenas a instância que você quer. Não se esqueça de usar o "-9", pois esta opção indica ao Kernel que realmente mate o programa, ou seja, que envie o sinal denominado "SIGKILL" para o processo.
Peraí!! O que é esse negócio de sinal?? É a maneira como o Kernel elenca os estados dos processos, e sabe o que fazer com cada um. Existem diversos estados, apesar de quase nunca precisarmos pensar nisso... mas o Kernel precisa controlar os sinais para que seus componentes saibam como tratar o processo. Por isso, o comando kill, apesar do nome, nunca mata realmente o processo, mas apenas solicita ao Kernel que troque o estado daquele programa, ou seja, que envie um determinado sinal para ele, o referente à sua morte, seu letal fim...
Quer saber quantos sinais existem?? Digite:

kill -l
1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL
5) SIGTRAP 6) SIGABRT 7) SIGBUS 8) SIGFPE
9) SIGKILL 10) SIGUSR1 11) SIGSEGV 12) SIGUSR2
13) SIGPIPE 14) SIGALRM 15) SIGTERM 16) SIGSTKFLT
17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP
21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU
25) SIGXFSZ 26) SIGVTALRM 27) SIGPROF 28) SIGWINCH
29) SIGIO 30) SIGPWR 31) SIGSYS 34) SIGRTMIN
35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3 38) SIGRTMIN+4
39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8
43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12
47) SIGRTMIN+13 48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14
51) SIGRTMAX-13 52) SIGRTMAX-12 53) SIGRTMAX-11 54) SIGRTMAX-10
55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7 58) SIGRTMAX-6
59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2
63) SIGRTMAX-1 64) SIGRTMAX

Sua lista de sinais vai ser parecida com esta acima... Ainda bem que o Kernel gerencia isto tudo sozinho...


  • Matando Graficamente



ProcessTable: o gerenciador de processos do KDE.

Se você usa o KDE, então existe uma maneira de matar graficamente um aplicativo!! Aperte CTRL + ESC. Isto abrirá o ProcessTable, o gerenciador de processos gráfico do KDE. Identifique o nosso bode expiatório (kedit) na tabela, clique nele e aperte o botão "matar".
O ProcessTable faz o mesmo que o comando kill, porém de forma gráfica. Se essa for a sua preferência e se houver interface gráfica rodando, o procedimento pode ser feito tranqüilamente desta maneira sem nenhuma perda de eficiência.


  • Quem Pode Matar??

Todos os usuário podem matar seus processos, ou seja, não precisa ser root para matar um processo. No entanto, um usuário sem preferências de administrador não pode matar o processo do outro. Apenas o root (ou alguém com privilégios como tal) pode matar qualquer processo da máquina, porque, afinal de contas, o root é o root...


  • Matando Suavemente Um Serviço

Muitos programas, como deamons e serviços, têm toda uma rotina de clean-up (descarrego e limpeza) que é executada ao ser descarregado. Normalmente estas rotinas ficam em scripts e mesmo os scripts de shutdown do sistema (desligamento) estão encadeados em ordem, de forma que um só pode ser executado ao final da conclusão de outro. Para permitir uma morte mais limpa a estes programas especiais e evitar que, por algum motivo (e isto já vi várias vezes!!), o desligamento da máquina páre bruscamente no meio do procedimento, caindo num terminal em modo texto, esperando a conclusão de um processo que pendurou e nunca vai terminar, é possível fazer uma morte suave, mais tranqüila, que não interrompe o descarrego do serviço (e do sistema, conseqüentemente).
Vamos supor que o KDM tenha travado durante o desligamento do sistema. Assim, precisamos matá-lo. Porém, o seu processo implica em scripts que, se forem interrompidos bruscamente, como o foram, paralizam o desligamento, caindo num terminal em modo texto. Então, matamos o KDM desta maneira:

ps -e | grep kdm
2882 ? 00:00:00 kdm
kill -HUP 2882

A opção "-HUP" concede ao KDM uma morte suave, talvez até com opção de realizar o último desejo...


  • Matando de uma vez Todas as Instâncias de uma Aplicação

Se você tem várias instâncias de uma aplicação e quer matar todas elas, ou mesmo se só tem uma instância, mas não quer se preocupar em buscar o PID da mesma, basta usar o comando killall. Vamos ao exemplo, matando nosso pobre kedit:

killall kedit

Dessa, nenhum kedit que o referido usuário esteja rodando escapa...
CUIDADO: se você digitar um comando como este usando privilégios de root, você vai matar todas as instâncias de todos os usuários do referido programa, o que pode causar problemas sérios, especialmente se estiver no contexto de um servidor...


  • Resumindo...

Existem várias maneiras de se matar aplicativos no Linux. A notícia boa é que, por mais que as aplicações travem, o sistema é estável, permitindo-se recuperar o controle. Usar um método ou outro depende de sua situação: um usuário doméstico, rodando sobre interface gráfica, tenderá a considerar cômodo o ProcessTable. Um administrador de sistemas, logado remotamente e preocupado com os serviços que precisa manter no ar, vai mergulhar nas opções dos comandos kill e ps. Em suma: a gama de opções nos dá ferramentas para o uso mais apropriado em diversas situações.

Gostou deste tutorial?? Ajudou em alguma coisa?? Detestou completamente???? Então: COMENTE!!!!!!

segunda-feira, 26 de julho de 2010

Atualizando o Flash Player no Firefox

O Flash Player é um plugin para o Firefox. Ao atualizar o Firefox, muitas pessoas devem ter recebido a mensagem de que o plugin do Flash está desatualizado. De fato, existe uma versão mais nova (neste momento em que escrevo, a versão 10.1 substituiu a 10.0), que pode ser baixada do site oficial gratuitamente e instalada de diferentes maneiras, dependendo do formato do arquivo baixado (tar.gz, deb, etc.).


  • Instalando a Versão .deb

Esta é a mais fácil!! Basta baixar do site aí em cima o arquivo .deb e instalar com o comando (como root!!)

dpkg -i install_flash_player_10_linux.deb

Depois disso, reinicie o firefox.


  • Problemas e Observações Importantes:

1- Note que este procedimento acima instala sem o apt-get, aptitude ou qualquer outro gerenciador de pacotes moderno e sofisticado, logo, assume que você está baixando o arquivo correto para a sua distribuição. Se não for o arquivo correto, torna-se uma questão de sorte: o procedimento de instalação pode funcionar ou não, e, caso não funcione, você deve remover a instalação mal-sucedida deste pacote (que pode ser feita com o seu gerenciador de pacotes preferido, ou o apt-get).

2- Note que isto instala a biblioteca do Flash Player (que, na verdade, é apenas um arquivo, denominado "libflashplayer.so") no sistema, ou seja, na pasta "plugins" do local onde o seu Firefox ou Iceweasel está instalado. Isto pode não funcionar, porque o Firefox tem uma arquitetura que privilegia os arquivos encontrados na pasta pessoal do usuário em detrimento aos instalados no sistema.

O que isto quer dizer????
Bom, observe que você tem um diretório, em sua área pessoal (/home/usuario), denominado ".mozilla". Neste diretório são colocadas todas as preferências pessoais suas (temas, configurações, favoritos, etc.), que devem ser prioridades em relação aos padrões do sistema, ou seja, devem sobrescrever os padrões do sistema no momento em que o Firefox se carrega. Dentre estas opções, existe uma pasta denominada ".mozilla/plugins", onde os seus plugins pessoais podem ser carregados. Desta maneira, é possível instalar um plugin que tenha efeito apenas para um usuário (ou então, um usuário que não tem prioridade de administrador do sistema pode instalar seus plugins favoritos). O problema se inicia se você tem aí uma versão antiga do plugin do Flash. No momento em que o navegador se carrega na memória, ele vai dar preferência a esta versão antiga, deixando de lado a versão novinha instalada pelo root...

Como corrigir isto???
Há duas maneiras: a primeira, mais fácil, é remover o plugin antigo, deixando o Firefox carregar o plugin instalado no sistema. A segunda, é esta abaixo:


  • Instalando o Plugin na Pasta Pessoal do Usuário (versão .tar.gz)

Também é simples: basta baixar a versão do arquivo no formato .tar.gz e descomprimi-la:

tar -zxvf install_flash_player_10_linux.tar.gz

Surgirá o arquivo "libflashplayer.so". Agora, basta copiá-lo para o diretório de plugins desejado, que pode ser inclusive o diretório pessoal do Firefox, na sua área de usuário:

cp libflashplayer.so /home/usuario/.mozilla/plugins

Reinicie o Firefox!!


Para verificar a versão dos plugins, vá em Ferramentas -> Complementos -> Plugins e veja, na lista que surge, qual a versão do plugin do Flash que foi carregada!! Outra opção é você utilizar as facilidades do Pajé Online e clicar no botão "Plugins" da seção "Navigator" aí do lado direito.
Claro, se tudo der certo, faça logo o backup da sua pasta .mozilla, de forma a não perder as suas configurações!!
Bom, espero ter ajudado!! Qualquer coisa, vocês já sabem qual é a dança do Pajé: COMENTEM!!!!!

quarta-feira, 21 de julho de 2010

Sincronizando Pen-Drive com o Comando diff

A invenção do pen-drive é fabulosa: portátil, fácil, leve! Porém, é também um perigo para quem pretende usá-lo como backup e não tem muita organização para manter seus dados sincronizados. Uma má sincronia entre os dados que você tem no pen-drive e os dados dos HDs das máquinas que você acessa pode facilmente te levar ao descuido de sobrescerver uma versão nova de um ou mais arquivos por uma versão antiga do mesmo.
Pensando neste problema, este artigo mostra como a sincronia pode ser facilmente verificada com um único comando: o comando diff.


  • Verificando a Sincronia dos Dados

Primeiramente, é preciso montar o pen-drive. Isto pode ser feito com o comando mount, embora, hoje em dia, qualquer um que use uma distro do Linux minimamente atualizada e com interface gráfica pode montar facilmente o pen-drive com poucos cliques.
Supondo que a pasta cuja sincronia deva ser verificada se chame "dados", basta digitar, no terminal:

diff -r /media/KINGSTON/dados /home/usuario/dados

Note que:
/media/KINGSTON - deve ser substituído pelo caminho que corresponde ao seu pen-drive montado.
/home/usuario - deve ser substituído pelo caminho onde se localiza a versão da pasta no HD (ou em outro local).
-r - instrui o comando diff a verificar recursivamente, ou seja, em todos os diretórios e subdiretórios que ele encontrar.


  • Trocando em Miúdos

O comando diff faz dois tipos de comparação: binária e textual. Quando arquivos em modo texto puro (ou no máximo Unicode) existem, ele compara todo o conteúdo reportando, na tela, todos os conflitos entre um e outro. Quando se trata de arquivos binários, o diff faz uma leitura binária de cada arquivo e, havendo um bit diferente, ele reporta (embora, neste caso, não possa indicar em que lugar do arquivo houve o conflito).
Somente são reportados problemas (conflitos) entre as pastas. Assim, tudo que é idêntico não será indicado (quer dizer que, se não há saída, é porque as pastas têm exatamente o mesmo conteúdo). Note que o comando diff também acusa se algum arquivo existir somente em uma das pastas.
Havendo colhido o relatório do comando diff, agora entre em seu gerenciador de arquivos favorito (Koqueror, etc...) e copie os arquivos conforme desejar, atentando apenas aos que foram reportados no relatório.

Bom, essa dica foi rápida... qualquer coisa: COMENTEM!!! E vamos parar de perder arquivos no pen-drive por descuido!!

sexta-feira, 16 de julho de 2010

Alterando o Volume e Ganho com JavaSound

Não foi incomum que algumas pessoas me perguntassem como alterar o volume de um Clip ou uma Stream de Áudio usando a API de som do Java, o JavaSound. Vamos à explicação rápida!!

  • Qual a Diferença Entre Volume e Ganho??

Muitas bibliotecas de execução e manipulação de som (especialmente as mais baixo nível) não têm controle de volume, mas sim de ganho. Ganho é a medida em deciBels (dB) que regula a intensidade do som (mais detalhes aqui). Volume é uma medida adimensional e escalar de intensidade de som.
Tudo estaria resolvido se o ganho variasse da mesma maneira que o volume, já que os dois medem, na prática, a mesma coisa. Porém, o ganho é uma medida logarítmica, ou seja, ela varia muito mais numa extremidade e muito menos na outra, dados os cálculos em exponensiais. O volume é uma interpretação desta variação, porém de maneira escalar, de forma que varie sempre da mesma forma.


  • Implementando Mudaças de Volume em JavaSound

Primeiramente, é preciso se obter o controle de ganho (MASTER_GAIN). Depois, é preciso que se transforme o valor do volume (uma simples percentagem, ou seja, um número entre 0 e 1) em deciBels, usando a fórmula logarítmica abaixo. Com este valor em deciBel, basta agora atribuí-lo ao controle de ganho.

public void setVolume(int percent) {
FloatControl gainControl =
(FloatControl) clip.getControl(FloatControl.Type.MASTER_GAIN);
double gain = percent/100; // deve ser entre 0 (mudo) e 1 (mais forte)
float dB = (float) (Math.log(gain) / Math.log(10.0)*20.0);
gainControl.setValue(dB);
}

Cuidado: não tente obter o controle VOLUME, a não ser que você saiba o que está fazendo, já que ele não costuma existir em muitos sistemas de som, vindo a retornar uma referência nula.


  • Trocando Entre Mudo e Não-Mudo

A rigor, definir o valor como mudo significa simplesmente atribuir valor zero para o ganho. Mas, existe uma maneira mais simples para se trocar entre mudo e audível, mantendo o ganho inicial:

BooleanControl muteControl =
(BooleanControl) clip.getControl(BooleanControl.Type.MUTE);
muteControl.setValue(true); // Define como mudo
muteControl.setValue(false); // Retorna para audível

É isso aí, gente!! Agora ficou fácil!! Claro, é bom lembrar: COMENTEM!!!