Como configurar atalhos no KDE

Para configurar atalhos para programas como o Dolphin ou Konsole é muito fácil, basta clicar com botão direito no menu K -> Edit Application e selecionar o programa o qual você quer configurar um atalho.

Sobre a aba Advanced, vá em Current Shortcut Key e configure o atalho desejado. Por exemplo, para o programa Dolphin eu configurei o atalho Meta + E e para o Konsole o atalho Ctrl + Shift + K agora salve e feche o KDE Menu Editor.

O seguinte problema pode acontecer: se ao salvar e tentar executar o atalho nada acontecer é porque a opção de habilitar os hot keys não está corretamente habilitada. A solução que encontrei foi editar o arquivo khotkeysrc diretamente, não sei se há uma forma mais elegante de se fazer mas dessa forma funcionou para mim.

Portanto, abra o terminal, e edite o arquivo ~/.kde/share/config/khotkeysrc e altere a linha 7 de:

Enabled=false

para:

Enabled=true

Salve e feche. Tente novamente os atalhos. Se funcionar parabéns senão tente reiniciando o pc ou reiniciando somente o servidor kdm:

service kdm restart

Listar arquivos e diretórios com Boost Filesystem

Boost Library

Boost surgiu com o propósito de ser um repositório de bibliotecas que impedissem os programadores de terem de reinventar a roda e se tornou o primeiro lugar a ser procurar por software open source de qualidade com este propósito.

Boost é o produto de uma idéia de criar um repósitorio de bibliotecas open source e de alta qualidade que passam por um extensivo processo de revisão. Boost possui mais de 80 bibliotecas que podem ser incluídas em seus programas C++ sem medo de errar pois estão entre os melhores e mais portáteis componentes do mundo C++.

Hoje vou falar um pouco sobre uma dessas bibliotecas, a Filesystem.

Primeiro, será necessário instalar o pacote libboost-filesystem1.40-dev faça:

sudo apt-get install libboost-filesystem1.40-dev

Criamos um arquivo operacoesDiretorio.cpp

#include "boost/filesystem.hpp"
#include <iostream>

namespace bfs = boost::filesystem;

int main (int argc, char* argv[]) {
    if (argc != 2) {
        std::cerr << "numero de argumentos invalidos" << std::endl;
        return 1;
    }

    bfs::path caminho (argv[1]);

    if (!bfs::exists(caminho)) {
        std::cerr << "Caminho nao existe" << std::endl;
        return 1;
    }

    if (bfs::is_directory(caminho)) {
        bfs::directory_iterator dir_itr (caminho);
        bfs::directory_iterator end_itr;

        for (; dir_itr != end_itr; ++dir_itr) {
            //listar tudo dentro da pasta
           // std::cout << dir_itr->path().filename() << std::endl;

            //listar somente diretorios
//            if (bfs::is_directory (dir_itr->status()))
//                std::cout << dir_itr->path().filename() << std::endl;

            //listar arquivos regulares
            if (bfs::is_regular_file (dir_itr->status()))
                std::cout << dir_itr->path().filename() << std::endl;
        }
    }
    else //nao eh um diretorio
        std::cout << caminho.leaf() << " nao eh um diretorio" << std::endl;
}

Compile o programa incluindo -lboost_filesystem:

g++ operacoesDiretorio.cpp -lboost_filesystem -o operacoesDiretorio

Na linha 4 criei um alias para o namespace boost::filesystem para tornar mais simples sua utilização no programa. O programa recebe um argumento pelo terminal que representa o diretório que deve ser aberto e ter seu conteúdo listado.
Na linha 12, com o diretório fornecido, criamos a variável caminho do tipo path que é o tipo responsável por representar diretórios de forma indepentende de plataforma.

Para percorrer o conteúdo do diretório criamos um iterador fazendo:

bfs::directory_iterator dir_itr (caminho);

e

 bfs::directory_iterator end_itr;

que quando criado pelo construtor default, cria um iterador que aponta para o fim de um diretório.

O resto do programa deve ser auto explicativo, sendo interessante notar as interessantes funções: bfs::is_directory() e bfs::is_regular_file() que são sobrecarregadas para receber como parametro tanto um file_status que contem informações sobre o arquivo, com um path. A função leaf retorna o nome do arquivo ou diretório por exemplo, se o caminho for /home/user/teste.txt a função leaf retorna a string teste.txt.

A parte comentada mostra as outras manipulações possíveis sobre o caminho.

Listar arquivos e pastas de um diretório em C++ usando dirent.h

Estudando a biblioteca Boost regex, e criando um programa semelhante ao grep, me deparei com o problema de como abrir o diretório fornecido pelo terminal e obter os arquivos desse diretório para então efetuar a busca pelo termo procurado em cada arquivo.

Bom, descobri duas formas de ler um diretório, a primeira utiliza o arquivo dirent.h da biblioteca C POSIX que embora não faça parte do C padrão, é considerada uma biblioteca pseudo-padrão e é portável entre várias plataformas.

A segunda forma utiliza a biblioteca Filesystem da Boost. No próximo post falarei sobre como fazer essa manipulação com diretórios utilizando o Filesystem.

Vamos ao código:

Para se utilizar a dirent.h você precisa incluir os seguintes arquivos:

#include <dirent.h>
#include <cstdlib>
#include <iostream>
#include <string>

Com isso você já pode usar os nomes definidos em dirent.h, string e os streams de entrada e saída.

O próximo passo é na função main, receber um nome de diretório pelo terminal e chamar a função que criaremos listaArquivos.

int main (int argc, char* argv[]) {
    if (argc != 2) {
        std::cerr << "Diretorio nao fornecido." << std::endl;
        exit (1);
    }

    listaArquivos (argv[1]);

    return 0;
}

A função listaArquivos é implementada da seguinte forma:

int listaArquivos (std::string nomeDir) {
    DIR *dir = 0;
    struct dirent *entrada = 0;
    unsigned char isDir = 0x4;
    unsigned char isFile = 0x8;

    dir = opendir (nomeDir.c_str());

    if (dir == 0) {
        std::cerr << "Nao foi possivel abrir diretorio." << std::endl;
        exit (1);
    }

    //Iterar sobre o diretorio
    while (entrada = readdir (dir))
        if (entrada->d_type == isFile)
            std::cout << entrada->d_name << std::endl;

    closedir (dir);
    
    return 0;
}

O que basicamente precisa ser feito é declarar um ponteiro do tipo DIR que apontará para o diretório, um ponteiro entrada que iterará sobre os elementos do diretórios (pastas e arquivos) e os valores isDir e isFile indicam se trata-se de um diretório ou um arquivo.

Para informações mais detalhadas sobre as estruturas em dirent.h confira o blog do Kodumaro

C de volta a primeira posição no ranking da TIOBE

A proveitando a recente notícia de que C está de volta ao primeiro lugar entre as linguagens de programação , (muito devido a C ser uma das primeiras linguagens que os programadores aprendem) C é uma poderosa linguagem de propósito geral, e fonte a partir da qual, Bjarne Stroustrup desenvolveu o C++ originalmente com o nome C with Classes, como um melhoramento de C.

O desenvolvimento inicial de C, ocorreu no AT&T Bell Labs, entre 1969 e 1973 por Dennis Ritchie e Ken Thompson.

C é considerada uma linguagem de baixo nível pois permite ao programador manipular informações diretamente ao nível do hardware, permite utilização de código Assembly e controle de memória, entre outras coisas. C ficou muito conhecida por ter sido utilizada no sistema UNIX, tendo inclusive seu próprio desenvolvimento impulsionado pelo desenvolvimento desse poderoso Sistema Operacional.

C é realmente uma linguagem muito poderosa, se você for trabalhar construindo sistemas operacionais, drivers de equipamentos e/ou sistemas críticos que necessitam obter o máximo do que o hardware pode oferecer e não quer programar em Assembly, então C é a linguagem perfeita para você.

Contudo, C++ pode fazer praticamente tudo que C faz e ainda é uma linguagem orientada a objetos que te permite escrever código de mais alto nível, possui um conjunto de estruturas de dados e algoritmos muito eficientes que foram escritos para serem muito rápidos, esse conjunto faz parte da biblioteca padrão STL. Permite escrever código genérico com o uso de Gabaritos sendo esse um dos recursos mais poderosos de C++.

Utilizarei esse Blog para falar mais sobre essa linguagem que tanto gosto, C++. Nos próximos posts falarei mais dos recursos de C++.

Fontes:
Linguagem C
Linguagem C++

Creating a public key for using in Github

When configuring Git on my Ubuntu 9.10 system, I came across some problems, which I discuss here:

For a detailed tutorial on how to create ssh keys see link below:

Generating SSH keys (Linux)

Some problems that may arise:

ssh git@github.com Agent admitted failure to sign using the key. Permission denied (publickey)

Agent admitted failure to sign using the key.
Permission denied (publickey).
fatal: The remote end hung up unexpectedly

That’s because your system didn’t add your identity, you should do this:
ssh-add ~/.ssh/id_rsa

Now try:
ssh git@github.com

you should see something like this:
PTY allocation request failed on channel 0
ERROR: Hi pedrolinhares! You've successfully authenticated, but GitHub does not provide shell access
Connection to github.com closed.

Well, at least you have been connected to the server.

That’s all, now, follow the rest of the Github’s tutorial and soon you’ll be able to push your first project to Github.com, just like me.

Como criar senha para usuário postgres do PostgreSQL (ubuntu)

Se você, como eu, instalou o postgresql pelo apt-get logo percebeu que não tinha a senha default para o usuário padrão postgres. Bom, até hoje não sei se existe essa senha (se souber me diga..), porém consegui modifica-lá fazendo o seguinte.

Primeiro acesse o arquivo pg_hba.conf em /etc/postgresql/8.3/main/pg_hba.conf
O arquivo estará com umas linha mais ou menos assim:
# Database administrative login by UNIX sockets –
local   all         postgres                          ident (ou ident sameuser)
# TYPE  DATABASE    USER        CIDR-ADDRESS          METHOD

ident significa que o usuário do banco deverá ser o mesmo do sistema operacional. Entretanto não é isso que queremos e como não sabemos a senha do usuário postgres criado faça:

$ sudo passwd postgres

Forneça a senha para usuário root e em seguida nova senha para o usuário postgres. Feito isso hora de mecher no arquivo pg_hba.conf, faça isso:
# Database administrative login by UNIX sockets –
local   all         postgres                          trust
# TYPE  DATABASE    USER        CIDR-ADDRESS          METHOD

Isso fará como que o banco permita que qualquer usuário do sistema operacional ou da rede que possa acessar o banco tenha acesso como qualquer usuário do banco e que possa acessar qualque banco de dados.

Reinicie o Postgresql:

$ sudo /etc/init.d/postgresql-8.3 restart

Feito isso, agora faça:

$ psql -U postgres

deverá acessar o banco postgres como  usuário postgres sem necessidade de senha.

agora defina uma senha para o usuário postgres, fazendo:

ALTER USER postgres  ENCRYPTED PASSWORD ‘password’;

Saia do psql e no prompt volte a acessar o pg_hba.conf e faça:
local   all         postgres                          md5
# TYPE  DATABASE    USER        CIDR-ADDRESS          METHOD

Com o method md5 irá requisitar uma senha para o usuário do “banco de dados” não do sistema operacional.
Reinicie o postgresql:

$ sudo /etc/init.d/postgresql-8.3 restart

E acesse o banco:

$ psql -U postgres

deverá pedir a senha que foi a criada pelo psql através do comando ALTER USER.

Agora deverá funcionando. Senão, é porque esqueci algo, sendo assim, procure no google o que estiver faltando mas em geral é algo como isso.

Sempre que modificar o arquivo pg_hba.conf reinicie o postgresql.

Para maiores detalhes e outras coisas que não estão aqui, acesse:

http://www.postgresql.org/docs/current/static/auth-pg-hba-conf.html

http://www.postgresql.org/docs/current/static/auth-methods.html#AUTH-PASSWORD