Shell: Somar uma lista de números

Você tem uma lista de números, um por linha, e precisa somá-los:

$ cat numeros.txt
3
5
7
9
11
13
15

Primeiro, coloque todos em uma única linha:

$ paste -s numeros.txt
3	5	7	9	11	13	15

Agora mude o delimitador (-d) de TAB para “+”, para compor a expressão aritmética de soma:

$ paste -s -d + numeros.txt
3+5+7+9+11+13+15

Agora sim, basta passar a expressão resultante para a calculadora do shell:

$ paste -s -d + numeros.txt | bc
63
Posted in Shell | Tagged , , , , | 3 Comments

Visual Studio: Updating Intellisense

Se sua pressão aumenta toda vez que vê essa mensage no Visual Studio, é possível desabilitar totalmente essa funcionalidade:

Vá em: C:\Program Files\Microsoft Visual Studio 8\VC\vcpackages ou equivalente na sua máquina e apague (ou renomeie para algo inócuo) o arquivo feacp.dll.

Isto desabilita o Intellisense para C++, mas não para C# (onde ele funciona melhor). Infelizmente isto também desabilita funcionalidades como o auto-complete ou a navegação “inteligente” entre arquivos.

É, pode ser um preço pequeno a pagar pela manutenção de sua sanidade.

Posted in Windows | Tagged , , , , | Leave a comment

Shell: Obter o IP da interface de rede

(LANG=C; ifconfig eth0|grep "inet addr"|cut -f2 -d:|cut -f1 -d" ")

Para pegar o endereço de uma interface diferente basta colocar o nome dessa interface no lugar de eth0.

É interessante que o comando seja colocado entre parênteses, para não modificar o valor da variável de ambiente LANG da sua sessão de shell atual (que controla o idioma em que os aplicativos são exibidos).

Posted in Linux, Shell | Tagged , , | 7 Comments

C, C++: Cuidado com funções definidas como macros

Imagine uma função definida em uma macro que faça a potência de dois de um determinado número. Ela poderia ser definida da seguinte forma:

#define quadrado(n) \
    n * n

Acontece que o comportamento, dependendo dos parâmetros, nem sempre é o esperado. Veja o que acontece no exemplo a seguir:

int main(void)
{
    int a = 2;

    printf("%d\n", quadrado(a)); // Imprime 4

    printf("%d\n", quadrado(a + 1)); // Imprime 5

    return 0;
}

A expansão da macro quadrado(a + 1), resultou a seguinte expressão:

a + 1 * a + 1
2 + 1 * 2 + 1 // Substituindo os valores de a
2 + 2 + 1 // Obedecendo a precedência dos operadores
5

Neste caso, para resolver o problema a sugestão seria usar uma função inline, que assim como a macro, poupa uma chamada de função mas se comporta como uma função convencional.

inline int quadrado(int n) {
    return n * n;
}
Posted in C, CPP | Tagged , , , , , | 8 Comments

C, C++: Usando a seção de dados

As variáveis da pilha de execução, são automaticamentes desalocadas quando a mesma retorna. No caso do exemplo a seguir, o retorno da função teste() é o endereço de memória da string “Teste123″ (ou seja, para onde str aponta e não str propriamente dito).

char *teste(void)
{
    char *str = "Teste123";

    return str;
}

Esta string está alocada na seção de dados do programa e existirá durante toda sua execução, não se restringindo ao escopo da pilha, o que torna segura sua utilização.

Vale lembrar que esta string é protegida somente para leitura, qualquer tentativa de escrita em uma de suas posições, fatalmente irá gerar uma falha de segmentação.

Posted in C, CPP | Tagged , , , , , , , , | 1 Comment

Shell: Descobrir seu IP na internet

Algumas vezes uma máquina está conectada à internet de forma indireta, através de um proxy ou mesmo um firewall com múltiplos links de internet. Os comandos seguintes permitem descobrir qual IP a máquina está utilizando na internet.

Utilizando o wget:

echo $(wget -qO- http://www.whatismyip.com/automation/n09230945.asp)

Utilizando o lynx (ou o links2):

lynx -dump http://www.whatismyip.com/automation/n09230945.asp
Posted in Linux, Shell | Tagged , , , , , , , | Leave a comment

C, C++: Banir funções usando o pré-processador

Quem usa o GCC pode tirar vantagem do pré-processador para banir de vez do código algumas funções consideradas maléficas como gets() e sprintf(), por exemplo. Basta acrescentar no seu código a seguinte linha:

#pragma GCC poison gets sprintf

Um erro semelhante a este irá surgir em tempo de compilação:

teste.c:6:12: error: attempt to use poisoned "gets"
Posted in C, CPP | Tagged , , , , , , | 1 Comment

Tcl/Tk: Expressões aritméticas sem "expr"

O comando [expr] é um dos que mais desagradam quem está começando a programar em Tcl, por causa da sintaxe:

% puts "2 + 2 = [ expr {2+2} ]"
2 + 2 = 4

O comando [unknown], super versátil, permite-nos chutar o [expr] pra escanteio na grande maioria das situações. Normalmente, [unknown] é o comando acionado automaticamente pela linguagem em caso de erro de digitação ou comando desconhecido. Tudo que ele faz é retornar uma mensagem de erro. Exemplo:

% 6*8+3*2+42
invalid command name "6*8+3*2+42"

Mas ele pode ser alterado, como quase tudo em Tcl.

Antes, é mais prudente reservar o comando [unknown] original dando-lhe outro nome:

% rename unknown MsgErro

Agora, ele se chama [MsgErro]. Em seguida, criamos um novo comando [unknown]:

% proc  unknown  args  {
if      { [ regexp  {^[-+/\*\.0-9 ()]+$}  $args ] }     {
return  [ expr $args ]
}

uplevel 1 MsgErro $args
}

Traduzindo: a cláusula “IF” usa Expressões Regulares para detectar se a linha de comando “incorreta” é uma expressão aritmética, inclusive parênteses. Assim, também podemos agrupar expressões. Se a cláusula “IF” não casar, o novo comando [unknown] retorna aquela função de erro original que foi transferida para o comando [MsgErro]. Não precisamos mais da sintaxe chata do [expr]:

% 6*8+3*2+42
96

% 45+2*3+6-1
56

% (45+2)*(3+6)-1
422

% puts "Um dia tem 24 horas ou [24*60] minutos"
Um dia tem 24 horas ou 1440 minutos
Posted in Tcl-Tk | Tagged , , , , , | Leave a comment

Shell: Calcular a raiz quadrada

Para calcular a raiz quadrada de um número em Shell, use o comando bc. Ele é uma calculadora completa, que entre outras funções úteis, tem a sqrt (de “square root”).

Basta mandar o comando pela entrada padrão (STDIN) e o resultado aparece na saída padrão (STDOUT):

$ echo "sqrt(16)" | bc
4

$ echo "sqrt(144)" | bc
12

Para guardar o número e o resultado em variáveis, faça assim:

numero=144
resultado=$(echo "sqrt($numero)" | bc)

echo "A raiz quadrada de $numero é $resultado"
Posted in Shell | Tagged , , , , | 6 Comments

MySQL: Contar linhas e registros não nulos

A função COUNT pode ser usada de várias formas diferentes as quais retornam diferentes resultados de uma contagem. A mais comum é quando precisa-se saber quantas linhas existem em uma tabela, podendo ser executada com a declaração:

SELECT COUNT(*) FROM tabela

A diferença mais significativa está na contagem de registros não nulos dentro de uma tabela, que pode ser executada da seguinte forma:

SELECT COUNT(campo) FROM tabela

O resultado da última declaração é diferente da primeira pois o resultado somente apresenta a soma dos registros não nulos e não o número de linhas existentes.

Posted in MySQL | Tagged , , , , , , | Leave a comment