Arquivo

Arquivo do Autor

Novo endereço!


Olá,

Mudei de endereço. Agora meu novo blog se encontra em http://blog.eldermarco.com. Eu gosto do Muitos Mundos, mas escrever em dois blogs sobre o mesmo assunto é meio desnecessário. Assim, ficarei apenas nesse novo endereço, mas esse blog não será excluído e os posts irão ficar. Talvez em migre alguns deles para o novo blog, mas não todos.

 

Sem mais 😉

Anúncios
Categorias:Sem categoria

Obtendo o tempo ocioso em uma sessão do X


Recentemente me deparei com uma pergunta no VOL a respeito do tempo ocioso em uma sessão em modo gráfico. A ideia era que estando o usuário sem realizar qualquer atividade na frente do PC depois de um determinado tempo, fosse deslogado automaticamente. Em modo texto, é possível fazer isso  através da variável TMOUT, mas isso não funciona em modo gráfico.  Em modo gráfico seria necessário obter o tempo ocioso de um usuário que estivesse usando KDE, GNOME, etc, verificar se esse tempo era maior ou igual a um tempo limite e caso fosse, executar um script que desconecta o usuário. A parte de desconectar o usuário não é difícil, mas obter o tempo ocioso do usuário se fez mais complicado. A saída do comando w tinha informações para as sessões em modo texto, mas nada de uma sessão do X. Pensei em obter esse tempo também via D-Bus, perguntando ao gnome-screensaver (no caso de um usuário estiver usando o GNOME ou XFCE), mas notei que o método GetIdleTime, não estava mais disponível.

Dessa maneira, decidi escrever um humilde programa em C usando a Xlib para obter essa informação e então aproveitá-la em um script. Não sou um expert com essa biblioteca, mas o procedimento era bem simples. O programa xidle, como chamei, retorna o tempo ocioso de uma sessão do X em segundos. Segue abaixo o programa, bem como uma explicação nos comentários sobre como compilar ele:

/*---------------------------------------------------------------------
 *    Imprime o tempo de inatividade de uma sessão do X em segundos.
 *
 *    Obs: Compile esse programa com o comando:
 *         $ gcc -o xidle xidle.c -lX11 -lXss
 *
 *         Depois mova-o para um diretório no seu PATH (um bom local
 *         seria o diretório /usr/local/bin)
 *
 *    No Fedora, é necessário instalar o pacote 'libXScrnSaver-devel'
 *    e 'libX11-devel' para poder seguir com a compilação.
 *
 *                 Autor: Elder Marco <eldermarco@gmail.com>
 *                 Data : 13/09/2010
 *    Última modificação: 07/11/2010
 *---------------------------------------------------------------------*/
#include <X11/extensions/scrnsaver.h>
#include <X11/Xlib.h>
#include <X11/Xlibint.h>
#include <stdio.h>

int main() {
     XScreenSaverInfo *info;
     Display *display;

     info = XScreenSaverAllocInfo();
     display = XOpenDisplay(NULL);

     XScreenSaverQueryInfo(display,
                           DefaultRootWindow(display),
                           info);
     printf("%.0f s\n", (float)info->idle/1000);

     Xfree(info);
     XCloseDisplay(display);

     return 0;
}

Considerando que você moveu o programa compilado para algum diretório no seu PATH, basta fazer:

cut -f 1 -d' ' <(xidle)

para obter esse tempo. 🙂

Obviamente, se você executar o programa xidle a partir do terminal, ele sempre vai retornar 0s, já que você acabou de dar um ENTER… mas se quer testar, você pode usar o comando sleep para esperar um tempo e depois executar o xidle (só não toque no teclado e nem mexa no mouse enquanto isso!). Veja:

$ sleep 11 && xidle
11 s
$ sleep 11 && cut -f 1 -d ' ' <(xidle)
11

E pra finalizar, depois que terminei esse programa, encontrei um outro que embora não retorne o tempo ocioso — até onde pude ver –, ele executa um script depois de um tempo de ociosidade do usuário. Procure por xautolock no Google.

Auto-completando opções de comandos com o bash completion


Um recurso que achei muito bom no Ubuntu  e me dei conta que não tinha no fedora é o de auto-completar opções de vários comandos no terminal apenas como a tecla TAB. Já é sabido que o bash é capaz de completar o nome de um de um comando, um arquivo ou um caminho através dessa tecla, mas o que muitos não sabem é que também é possível completar as opções dos comandos passados ou até mesmo o nome de um pacote que você quer remover ou instalar do seu sistema. Vejamos um exemplo (o caractere ‘|’ representa a posição do cursor, abaixo):

# yum l|[TAB]
list          localinstall

Note que eu me referi a uma opção que começa com ‘l’ do comando yum e teclei TAB (duas vezes na primeira vez) e como retorno, o shell me mostrou as duas opções possíveis para o comando yum que começam com a letra ‘l’: list e localinstall. Nesse caso, se eu colocar mais uma letra e dar um TAB, a opção já fica automaticamente definida.  Assim, se fizer:

# yum lo|[TAB]

o shell irá expandir para

# yum localinstall |

Vejamos mais dois exemplos. Um ainda com o yum e outro com o comando update-alternatives:

# yum ins|[TAB]

Expande para

# yum install |

E depois tento instalar um programa que começa com ea:

# yum install ea|[TAB]
earcandy.noarch                           easymock2-javadoc.noarch
earth-and-moon-backgrounds-common.noarch  easymock2.noarch
earth-and-moon-backgrounds-dual.noarch    easymock-javadoc.noarch
earth-and-moon-backgrounds-kdm.noarch     easymock.noarch
earth-and-moon-backgrounds.noarch         easystroke.x86_64
earth-and-moon-backgrounds-single.noarch  easytag.x86_64

isto é, uma lista de todos os programas que posso instalar no meu sistema. Agora veja:

# yum install easyt|[TAB]

e então..

# yum install easytag |

Agora com o update-alternatives:

# update-alternatives --|[TAB]
--admindir  --auto      --display   --install   --remove    --verbose
--altdir    --config    --help      --quiet     --set       --version
# update-alternatives --c|[TAB]

E será expandido para:

# update-alternatives --config |

LOL! Ficou com vontade de ter um recurso desse no seu Pinguim? Então, como uso fedora, vou passar o procedimento para obter esses efeitos nele. Se você usa outra distro, procure por esse pacote e instale ele. No caso do fedora, é bem simples.  Instale o pacote bash-completion no seu sistema:

# yum install bash-completion

E é somente isso. 🙂

Você pode ver uma lista de comandos que permitem utilizar o recurso de auto-completar listando o conteúdo do diretório /etc/bash_completion.d:

$ ls /etc/bash_completion.d

Onde cada arquivo nesse diretório se refere a um comando do sistema.

É até possível criar suas funções que permitem auto-completar comandos que você queira ou de programas que criou, mas isso está fora do escopo desse post. Só com esses você já terá muitos comandos com esse recurso.

Minhas impresssões com o Ubuntu 10.04 – Lucid Lynx


Sempre fui um usuário do fedora.  Sou até chato de vez de quando, de tanto que falo dessa distro para amigos. Não porque eu a ache melhor que as outras ou coisa do tipo. A verdade é que simplesmente sou apegado a distro por me identificar com ela ou simplesmente porque aprendi a gostar dela, conforme fui me envolvendo com  o mundo do software livre. No entanto, resolvi deixar de lado  esse meu apego  e me aventurar em terras um pouco (não muito) desconhecidas de outras distros. Eu já usava o Arch Linux  e Ubuntu através de uma máquina virtual, com a intenção de conhecer sem ter de formatar o PC ou ficar a rodar pelo LiveCD (no caso do Ubuntu), mas tomei uma decisão faz pouco tempo de mudar minha distro padrão e então baixei e instalei o Ubuntu 10.04 Lucid Lynx  64 bits no meu PC e também no do meu pai.

Uma coisa que sempre me chamou a atenção no Ubuntu, é que a equipe de arte da distro sempre fez um bom trabalho deixando um visual nessa distro que fica realmente muito bonito, na minha opinião. Eu gosto de desktops bonitos e nessa parte, o Ubuntu teve um ponto positivo comigo, apesar de não ser um suuuper ponto, visto que não considero a parte mais importante numa distro. Mas é alguma coisa, principalmente para usuários iniciantes em que uma primeira impressão pode definir se fica ou não na distro (ou no Linux).

Minha área de trabalho no Ubuntu 10.04 - Lucid Lynx. Ainda a padrão, já que gostei bastante dela.

Logo que dei o primeiro boot, o Ubuntu já me notificou que da existência de um driver (proprietário) para a minha placa de vídeo Nvidia. Eu adorei isso e como sei que, por enquanto,  nenhuma solução livre  trabalha de maneira satisfatória com placas Nvidia, resolvi instalar o driver proprietário e logo tive o compiz também rodando de maneira discreta no meu PC, da maneira como gosto.  Pra ser sincero,  o driver nouveau avançou muito ultimamente e é muito provável que eu passe a usar ele num futuro muito próximo.

A canonical tem cumprido o que disse: “Linux for Human Beings”. Ubuntu é uma distro fácil de usar, configurar, com vários scripts/programas que a deixam ainda mais completa instalando tudo o que usuário precisa (e também o que não precisa..), como codecs, Java, Flash, players, algumas configurações, etc.  O Ubuntu Perfeito, criado pelo Hamacker é muito bom nisso. Existe também o Ubuntu Start e atualmente, foi lançado o Ubuntu Control Center que integra várias serviços do Ubuntu em um mesmo local e também o Ubuntu Tweak.  A comunidade está sempre disposta a ajudar pelos fóruns e o IRC. Aliás, tive um problema com o meu som que não funcionava na parte frontal e encontrei alguém já disposto a me ajudar no canal #ubuntu-br no freenode.net .  Depois de quebrar um pouco a cabeça, descobri o problema, que teve uma solução bem simples.

O gerenciador de pacotes apt-get é  bem rápido, mas muitos usuários dizem que se comparado com o yum, do fedora ele é beeem mais rápido.  Bom, pode ser que no passado o yum era mais lento, mas atualmente não percebi grandes diferenças Achei satisfatório o desempenho dos dois. Os repositórios do programa me impressionaram. Tem software pra tudo lá! É bom saber que se um dia eu precisar, poderia esperar encontrar ele nos repositórios. Mais interessante ainda é launchpad que permite a você criar pacotes para o Ubuntu e disponibilizar para todo mundo. Isso faz falta no fedora, visto que não existe nenhum serviço que permite criar repositários e manter programas nele. Eu, por exemplo, mantenho alguns programas e jogos que empacoto no Open SUSE Build Service, que permite criar pacotes para o fedora, mas nada fornecido pelo comunidade fedora, até onde sei.

Mas nem tudo são flores. Além do problema com o som numa versão de 64 bits que relatei acima, ainda achei três coisas que não me agradaram. A primeira diz respeito a tradução do sistema para o português brasileiro. Houve momentos em que li erros de português ou falta de atenção do tradutor em certos trechos. Acho que seria melhor dizer, falta de atenção mesmo. A questão é que isso não deveria ter passado  em alguma revisão e por ter chegado ao usuário final  dá uma impressão de que a equipe não se importa com a qualidade da tradução feita . Infelizmente, não tenho nenhum screenshot de exemplo aqui, já que não fiquei capturando telas quando via algo assim, mas  encontrei esses erro em alguns lugares e seria bom corrigir. Mas também devo dizer que não foram em muitos, mas o suficiente para me chamar a atenção.

Outro problema chatinho é o painel do GNOME que costuma se desorganizar em algumas sessões. Algumas vezes, preciso abrir um terminal e digitar pkill gnome-panel para corrigir esse problema e não acho uma solução elegante para algo que não deveria acontecer..

O terceiro problema diz respeito ao pacote gmt, um conjunto de ferramentas que utilizo bastante para processamento Geofísico. Geralmente para gerar mapas de anomalias, realizar interpolaçõrd, etc. Quando instalei esse pacote no Ubuntu, percebi que ele não colocou o caminho dos binários para esse programa no meu PATH, fazendo que com que eu tivesse de colocar manualmente editando meu arquivo ~/.bashrc. Houve também um problema de conflito entre pacotes desse mesmo software e não entendi os motivos, mas não era algo essencial, se é que era necessário. Fora isso, instalei, coloquei no PATH e tudo funcionou sem problemas.

Assim, esse pouco tempo  usando o Ubuntu como padrão no meu PC  me faz concluir que essa é uma distro que merece realmente se a mais popular entre os usuários, pelo fato de ter um alto investimento em simplicidade  — do ponto de vista de um usuário não experiente com computadores, antes que algum chato venha reclamar :-).  É também uma distro com excelente desempenho, apesar de ter lido críticas dizendo o oposto em alguns lugares. O tempo de boot no meu PC me impressionou.  A verdade é que se tiver de sugerir uma distro para um usuário super leigo eu terei duas sugestões de cara: fedora ou Ubuntu. Mais o Ubuntu do que o fedora ainda, mas também vejo o fedora como uma distro para iniciantes.

Não sei se irei manter o Ubuntu no meu PC é provável que volte para o fedora. Sinto falta dele pelos motivos que citei no primeiro parágrafo, mas com certeza irei manter ele no PC do meu pai que também gostou muito da distro.  Se for o caso de mudar, não considero deixar um dual boot, não curto muito isso. Já mantive Windows e Linux em dual boot no meu PC e acho chato ter de cuidar de dois sistemas operacionais num mesmo PC.

Verdade  seja dita, sou homem de uma distro só.

Tratando argumentos passados a um programa em C


Recentemente, tive de escrever um programa em C na minha iniciação científica e o objetivo principal do programa era ler o arquivo de um outro e retirar dele, algumas informações. Assim, eu precisaria passar o nome do programa e mais algumas opções que se fizessem necessárias como argumentos para o meu programa, mas queria fazer isso de uma maneira mais organizada e então resolvi procurar alguma função que fosse capaz de tratar desses argumentos.  Tive sorte de encontrar a função getopt da biblioteca unistd.h. Essa função é muito similar ao comando getopts em shell script. De fato, é a cópia dela em linguagem C (ou seria a getopts a cópia da getopt em shell script? Bah! Deixa pra lá!)

A sintaxe dessa função é:

int getopt (int argc, char **argv, const char *options)
extern char *optarg;
extern int optind, opterr, optopt;

A função getopt retorna o próximo caractere passado como argumento ou -1 quando a lista de argumentos passados termina. Se o caractere é desconhecido ou não foi passado o argumento a uma opção que requer, será retornado  ‘?’.  O argumento options é uma string que irá dizer quais são as opções válidas para o seu programa.  Se uma opção requer um argumento, você precisa especificar isso colocando um ‘:’ na frente dessa opção.

As variáveis externas apresentadas acima carecem de uma explicação:

  • opterr – Se a função getopt encontra algum erro como um caractere de opção inválido ou a falta de algum argumento que não foi passado para uma opção, ela imprime uma mensagem de erro. Para desativar essas mensagens e você mesmo tratar elas, você pode definir a variável com um valor zero no seu programa.
  • optarg –  Você passa ao seu programa opções, mas algumas delas requerem algum argumento. Por exemplo, uma opção como -o poderia necessitar que você especificasse um arquivo de saída. A variável optarg é um ponteiro para a string que contém o argumento passado a opção retornada pela função getopt.
  • optind – Essa variável é utilizada como forma de saber qual o próximo elemento de argv deve ser processado. Ele é bastante útil para você tratar argumentos que não são opções e nem argumentos de opções. O programa abaixo irá mostrar um exemplo.
  • optopt – Se a função getopt encontrar um caractere de opção desconhecido ou o usuário não passou o argumento que deveria para uma determinada opção,  será retornado ‘?’ e  a função getopt irá armazenar caractere nessa variável.

Assim, vamos considerar um programa que aceite  as opções x, y e z, sendo que z necessita de um argumento a ser passado.  Esse programa poderia se chamar testagetopt e ser como abaixo:

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <unistd.h>

int main ( int argc, char *argv[] )
{
	int opcao;		// Opção passada pelo usuário ao programa.
	int indice;		// Usado para pegar argumentos que não são opções
				    // Nem argumentos usados em opções.

	int xflag =  0;		// Opção -x desativada por default
	int yflag =  0;		// Opção -y desativada por default

	char *zarg = NULL;      // Irá apontar para o argumento de z
				            // se for passado.

	// Desativa as mensagens de erro da função getopt
	opterr = 0;

	// Faz um loop pegando as opções passados pelo usuário. Note
	// o ':' depois do 'z'. Isso quer dizer que deve haver um
	// argumento depois dessa opção.
	while ( ( opcao = getopt ( argc, argv, "xyz:" ) ) != -1 )
	{
		switch ( opcao )
		{
			// Usuário passou a opção -x, habilita:
			case 'x':
				xflag = 1;
				break;

			// Usuário passou a opção -y, habilita:
			case 'y':
				yflag = 1;
				break;

			// Usuário escolheu a opção -z, pegar o argumento
			case 'z':
				zarg = optarg;
				break;

			// Se houve algum problema, vamos diagnosticar e enviar
			// nossas próprias mensagens de erro.
			case '?':
				if ( optopt == 'z' )	// Esqueceu um argumento
					fprintf (stderr, "Opção '-%c' requer argumento.\n",
					optopt);
				else if ( isprint ( optopt ) )
				     	fprintf( stderr, "Opção '-%c' desconhecida.\n",
				        optopt );
			        else
			            fprintf( stderr, "Caractere '\\x%x' de opção desconhecido.\n",
				            optopt );
				exit ( 1 );
		}
	}

	printf ( "         xflag = %s\n", xflag ? "sim" : "não" );
	printf ( "         yflag = %s\n", yflag ? "sim" : "não" );
	printf ( "          zarg = %s\n", zarg  ?  zarg : "nenhum" );

	printf ( "Outros argumentos:\n" );

	for ( indice = optind; indice < argc; indice++ )
		printf ( "                 %s\n", argv[indice]);

	return 0;
}

Compile o programa:

$ gcc -o testagetopt testagetopt.c

Executando com algumas opções teríamos:

shell> ./testagetopt -xy -z topgear.txt testagetopt blabla
         xflag = sim
         yflag = sim
          zarg = topgear.txt
 Outros argumentos:
                 testagetopt
                 blabla

shell> ./testagetopt -x -z topgear.txt testagetopt blabla
         xflag = sim
         yflag = não
          zarg = topgear.txt
Outros argumentos:
                 testagetopt
                 blabla

shell> ./testagetopt -y -z topgear.txt testa?.txt
         xflag = não
         yflag = sim
          zarg = topgear.txt
Outros argumentos:
                 testa1.txt
                 testa2.txt
                 testa3.txt
                 testa4.txt
shell> ./testagetopt -z
Opção '-z' requer argumento.

$ ./testagetopt -c
Opção '-c' desconhecida.

shell> ./testagetopt -xy topgear.txt
         xflag = sim
         yflag = sim
          zarg = nenhum
Outros argumentos:
                 topgear.txt

Bem mais prático!

Referências:

Using getopt – Documentação oficial da função

Documentação relacionada:

Getopt Long Options –  Para o caso de você querer usar opções longas, não somente com uma letra.

Argp – Um função que permite tanto opções longas quanto curtas, além de criar uma saída para as opções --help e --version automaticamente.

Reforma


Recentemente, fiz a migração de alguns posts do meu antigo blog, o Idiossincrasias para este. No entanto, devido a alterações que fiz para mudar os URLs para esse novo endereço (dei um sed no arquivo .xml de exportado) acabou que alguns posts ficaram sem imagens e alguns ficaram sem os vídeos, não sei por qual motivo. Assim, não estranhe caso encontre posts mais antigos assim. Nas minhas horas vagas estou a corrigir isso, mas sendo muitos posts e ainda alguns com dezenas de imagens (no caso de posts que falei da migração para o Fedora), acaba que isso vem a demorar bastante.

Mas você pode visitar o mesmo p0st no blog Idiossincrasias que ele ainda está inteiro por lá! Só irei mudar as coisas por aqueles lados quando terminar de arrumar as coisas por aqui 🙂

Categorias:Geral, migração Tags:

Nightingale, um fork do Songbird para o Linux


Há pouco dias atrás a equipe do Songbird anunciou que o player de música deixaria de ser suportado no Linux. Entre as justicativas, estava o argumento de que existem pouquíssimos usuários desse player para o Linux. Ainda,  segundo o blog desse player, foi uma conclusão dolorosa deixar o suporte para o Pinguim.

Eu cheguei a testar o Songbird certa vez enquanto estava a ter problemas com o Amarok e confesso que gostei bastante dele, apesar de ter tido outros problemas, mas nada de anormal. O Songbird é um excelente player na minha opinião e só não tinha ido ainda para os repositórios do fedora por ter versões de  certas bibliotecas que eram próprias e coisas que não são aceitáveis pelo Projeto Fedora.  Apesar de eu não ser um usuário desse player — sou apaixonado pelo Amarok —,  não achei boa essa ideia de abandonar o Linux. Bom, não somente eu…

Não durou muito tempo e surgiu um novo projeto baseado no Songbird, o Nightingale que tem justamente a intenção de manter o suporte para o Linux.  Fiz uma visita no fórum do projeto e tem um pessoal bastante animado com o desenvolvimento do Nightingale. Uma boa parte, são pessoas dispostas a traduzi-lo para seus idiomas, inclusive já apareceu um voluntário para fazer a tradução para o português brasileiro.

Será que a coisa rola? Espero que sim. Espero que em breve ele já esteja nos repositórios de várias distros por aí, inclusive o fedora.