Usando vários núcleos no make

Dica do Cifali

make -j17

aonde 17 é a quantidade de núcleos+1 que deseja usar na compilação. nesse caso usamos 16 nucleos, ou seja, se a maquian que  for compilar tiver 4 núcleos, usar -j5

OBS: Na documentação do make não recomendam usar essa opção, mas até agora não tivemos problemas neste quesito.
OBS2: Isso aumenta consideravelmente o load do servidor, então cuidado!

Encontrando arquivos que foram modificados nos ultimos 15 minutos

Sempre me perguntei como os empacotadores de rpm deb compilavam as coisas e depois faziam o pacote com os binários/libs pré-compilados

Depois de uma longa pesquisa no gooogle aliado a uma boa leitura do man/help descobri um comando que pode ser muito útil.

Basicamente eu baixo os tar.gz do que eu quero instalar (ex. nginx) descompacto, compilo com as infos que eu quero, depois executo o comando abaixo para verificar quais arquivos foram modificados nos últimos 15 minutos. Para um resultado mais preciso, basta cronometrar quanto tempo levou o make install e ajustar no comando conforme necessidade.

find / -type f -mmin -15 |egrep -v "^/proc|^/home|^/root|^/.|^/tmp|.log$"

Esse egrep serve pra filtar o conteúdo que não é desejado, por exemplo: Não me importa se houve modificações no /proc ou /tmp

Lista de if em shellscript

Neste exemplo estou usando o comando test, mas pode ser com if também

test ­-r #Testa se tem permissão de leitura
test ­-w #Testa se tem permissão de escrita
test ­-x #Testa se tem permissão de execução
test ­-f #Testa se é um arquivo regular
test ­-d #Testa se é um diretório
test ­-u #Testa se seu SUID está ativado
test ­-g #Testa se seu SGID está ativado
test ­-s #Testa se seu tamanho é maior que zero

Exemplo:
Exibe o texto “ok” se o arquivo teste.txt possuir permissão de leitura:

test -r teste.txt && echo "ok"

Da pra usar os mesmos parametros usando IF:

if [ -r teste.txt ]; then echo "ok"; fi

Negação (exibe a mensagem se não tiver permissão de escrita):

test -r teste.txt || echo "nao ok"

Obtendo IP real em uma aplicação web atrás de um proxy reverso

Quando utilizamos um proxy reverso como varnish ou nginx (até mesmo com o apache da pra fazer isso) temos um pequeno problema em aplicações que logam ip do usuário (como um sistema de comentários, por exemplo).

Ao configurar um proxy reverso, normalmente denominamos um header separado para o IP real da aplicação, pode ser qualquer header, mas normalmente é utilizado o header XForwardedFor (que chamamos de XFF)

Existem diversas soluções para isto, a primeira atraves de php, bastando inserir o código abaixo em algum arquivo de include global (como arquivo de conexão ao banco)

<?php
$_SERVER['REMOTE_ADDR'] = $_SERVER['X_FORWARDED_FOR'];
?>

Para uma solução a nível de webserver (apache) podemos usar o mod_rpaf.
Para instalar no ubuntu (e distros baseadas em debian)

apt-get install libapache2-mod-rpaf

Para demais distros, pode-se obter o source na página do projeto:
http://stderr.net/apache/rpaf/

Manipulação de usuários MySQL

Dica básica, mas tem gente que se embanana com isso.

Cenário: Criar uma base de dados chamada mydb, criar um usuário chamado myuser com permissão de acesso total a esta base de dados e acesso somente a localhost.

Primeiramente conectamos ao mysql como root e criamos a base de dados mydb

mysql -u root -pMinhaSenhA
create database mydb;

Agora uma dica legal, da pra criar usuários mysql apenas adicionando permissões. basicamente quando tu manda um grant e o usuário não existe, o mysql cria ele automaticamente… sabendo usar isso é muito bom 😉

Agora criamos então o usuário e adicionamos permissão as interfaces loopback 127.0.0.1, localhost e ::1 (loopback ipv6)

mysql u root -pMinhaSenhA
GRANT ALL PRIVILEGES ON mydb.* TO 'myuser'@'localhost' IDENTIFIED BY 'MinhaSenhA';
GRANT ALL PRIVILEGES ON mydb.* TO 'myuser'@'127.0.0.1' IDENTIFIED BY 'MinhaSenhA';
GRANT ALL PRIVILEGES ON mydb.* TO 'myuser'@'::1' IDENTIFIED BY 'MinhaSenhA';

Agora testamos o acesso, deve ser exibido somente a base mydb e information_schema (no meu caso aparece também uma base do capeta chamada test que o ubuntu criou automaticamente, mas nada qe um “drop database test;” não resolva)

mysql -u myuser -pMinhaSenhA
Welcome to the MySQL monitor.  Commands end with ; or g.
Your MySQL connection id is 70
Server version: 5.5.20-0~ppa1~oneiric (Ubuntu)

Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or 'h' for help. Type 'c' to clear the current input statement.

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mydb               |
| test               |
+--------------------+
3 rows in set (0.00 sec)

Agora sim, tudo criado e funcionando! 😉

Função javascript para imprimir pagina ao carregar

Tenho usado essa e funciona bem 😉

<script language="JavaScript" type="text/JavaScript">
<!--
function chromePrint(){
print();
}
function chromePrintDelay(){
setTimeout("print()", 500);
}
var browserName=navigator.appName;
if (browserName=="Microsoft Internet Explorer")
{
window.print();
}
else
  {
  if (browserName=="Netscape") //google chrome app.Name
  {
  chromePrintDelay();
  }
  else {
   window.onload = window.print; // helps with Opera
   }
   }
//-->
</script>