bash: acessar display do X com outro usuário

Quem usa linux dificilmente larga o famoso prompt de comando.
Isso se deve ao grande poder e à conhecida versatilidade do BASH.

Entretando, existem sempre algumas dificuldades que a grande maioria passa.
Neste POST está mais uma dessas, bem como a solução.

Talvez você precise executar um programa no modo gráfico, mas com sua inicialização partindo dum comando.
Isso talvez aconteça pois você quer visualizar os erros/outputs deste programa em específico.

Pra isso, simplesmente você faz:

hudson@vostrolab ~/ $ programa

Mas talvez a idéia seja simplesmente executar um programa com outro usuário. Então você pensa:

hudson@vostrolab ~/ $ su – usuario -c “xlogo”

E aí você obtém:

Password:
No protocol specified
Error: Can’t open display: :0

Isso acontece pois as chaves usadas para autenticar sua sessão do X (modo gráfico) não são mais válidas a partir do momento em que você troca de usuário.
Tal medida de segurança parece exagero, mas é uma herança de quando as sessões X eram muito usadas em rede.

Pra resolver essa, basta liberar sua sessão X para autenticar outros usuários, usando o comando xhost.
Isso deve ser feito antes de trocar de usuário.

hudson@vostrolab ~/ $ xhost +local:local
non-network local connections being added to access control list
hudson@vostrolab ~/ $ su – usuario -c “xlogo”
Password:
hudson@vostrolab ~/ $

xlogo foi usado como exemplo de aplicação, pois abre uma simples ‘janela’ na tela.
Nesse ponto da execução, você deve ver sua aplicação normalmente, seja um mozilla ou um thunderbird =).

Não esqueça de desfazer a autorização com o ‘menos’ ao invés do ‘mais’:

hudson@vostrolab ~/ $ xhost -local:local
non-network local connections being removed from access control list

Referências: http://www.tuxradar.com/content/command-line-tricks-smart-geeks

Manipulação de CPF e CNPJ

Ao desenvolver sistemas aqui no Brasil, muitas vezes se faz necessário trabalhar com CPF e CNPJ e armazenar estes dados em banco.

Embora os campos de entrada desta informação geralmente sejam mascarados para o tal formato (___.___.___-__ ou __.___.___/____-__), muitos desenvolvedores preferem armazenar sem os pontos, traços e barras em campos to tipo string no banco de dados. String pois alguns desses números começam com 0(zero), então se for campo integer poderá enfrentar problemas.

Depois, na hora de usar estes números, pra definir se é um CNPJ ou CPJ basta remover a máscara e fazer a contagem do length: se for 11 é CPF, se for 14 é CNPJ, e qualquer coisa diferente disso é wrong_number. 🙂

Por exemplo em jQuery poderia ser feito algo assim:
cpf_or_cnpj_input_value = $('#cpf_or_cnpj').val();
cpf_or_cnpj_input_value = cpf_or_cnpj_input_value.replace(/[^\d]/g, '');
switch (cpf_or_cnpj_input_value.length) {
case 11:
is_this_cpf_or_cnpj = "cpf";
break;
case 14:
is_this_cpf_or_cnpj = "cnpj";
break;
default:
is_this_cpf_or_cnpj = "wrong_number";
break;
}

Sendo que na segunda linha é usada uma expressão regular que substitui tudo o que não for dígito, por ”.
E na hora de mostrá-lo, utiliza-se um helper para exibí-lo com pontos, traços e barras, conforme o formato desejado.

Confira por exemplo como ficaria um helper para exibir um CPF fictício em linguagem ruby, usando a sintaxe de slice de array, informando o começo e quantos caracteres deseja em cada slice:

cpf.rb
>> cpf
=> "12345678977"
>> "#{cpf[0,3]}.#{cpf[3,3]}.#{cpf[6,3]}-#{cpf[9,2]}"
=> "123.456.789-77"

O mesmo helper em linguagem python. Repare que em python é diferente: você diz o começo e o fim, e não o começo e quantos caracteres quer:

cpf.py
>>> cpf
'12345678977'
>>> "{}.{}.{}-{}".format(cpf[0:3], cpf[3:6], cpf[6:9], cpf[9:11])
'123.456.789-77'

Referências: https://gist.github.com/dirceu/cc46f465f6957491827f
Greetings to: Dirceu Tiegs (https://github.com/dirceu)

nginx Error: 413 Request Entity Too Large

Ao instalar um WordPress, um dos problemas que talvez enfrente seja: Erro: 413 Request Entity Too Large
Costuma aparecer ao fazer upload de um plugin, tema, mídia ou arquivo qualquer para seu wordpress. Indica que o tamanho do que você está ‘upando‘ é muito grande. Maior do que o esperado.

O que é necessário fazer pra solucionar?

Basta adicionar a seguinte instrução ao arquivo de configuração do nginx que define o wordpress (/etc/nginx/sites-available/seu_wordpress.conf):

server {
client_max_body_size <Tamanho Desejado>M;

}

 
Dessa maneira, passamos a barreira do nginx.
Daí seu blog começa a avisar que o limite encontrado foi no upload_max_filesize do php.ini.
Então, visando ultrapassar a barreira do php.ini, basta incluir isso no final do .htaccess que esta na raiz do blog(/var/www/seu_wordpress/):

php_value upload_max_filesize 64M
php_value post_max_size 64M
php_value max_execution_time 300
php_value max_input_time 300

 
Feito, isso, ultrapassamos a barreira do php.
Agora sim. Tudo funcionando:

Instalando tema do arquivo enviado: meutema.zip

Descompactando o pacote…

 

Referências:
http://www.wpbeginner.com/wp-tutorials/how-to-increase-the-maximum-file-upload-size-in-wordpress/
http://pt.stackoverflow.com/questions/41619/enviando-arquivos-no-nginx-erro-413-request-entity-too-large

Aproximação de clientes em potencial

Entrar em contato com um potencial cliente que nunca ouviu falar de você pode ser assustador. Seja através de uma ligação ou um email, é necessário dar atenção inicialmente justamente a essa maneira escolhida para contato.

Aos poucos torna-se fácil.

Segue formato de email usado para entrar em contato com clientes em potencial, e que já rendeu conversas que levam ao trabalho remunerado.

Assunto: Eu gostaria de ajudá-lo com X

Olá,

Meu nome é Eric Davis e eu gostaria de conversar com você sobre X.

Seu projeto chamou minha atenção pois X. Por gentileza, você poderia me contar um pouco sobre qual é sua principal necessidade atualmente?

Obrigado

Assinatura,

Perceba que única preocupação da abordagem é: iniciar uma conversa. Você não quer vender seu serviço logo de cara. Você não precisa contar-lhe toda sua história ou listar os nomes dos seus melhores clientes e provar 10 razões principais pelas quais você é o melhor freelancer para ele.

Você precisa apenas iniciar a conversa.

Levei algum tempo para entender isso. Eu tentava me vender ao máximo logo no email inicial para evitar ‘idas e vindas’ de informação, tipo uma conversa. Foi então que percebí que eu estava na verdade despejando uma parede de texto e sugestões de atividades a serem feitas pelo meu potencial cliente. Atividades estas que eu mesmo estava pedindo-lhes para realizar.

Como você se sentiria se alguém que você não conhece sugerisse um monte de atividades pra você fazer?

Comece pequeno, com um curto email inicial, e deixe a conversa progredir naturalmente.

Não tenha medo de abordagens frias. Emails, ligações telefônicas ou encontro pessoalmente: todos funcionam e todos tem suas vantagens e desvantagens. Mas é importante fazê-las de maneira apropriada.

Você perderá 100% dos clientes que não entrar em contato.

by Eric Davis (http://theadmin.org)

Como importar um PDF e exportá-lo usando GIMP e convert?

É fácil, basta abrir o documento PDF usando o GIMP, com as opções padrão (a saber, páginas importadas como layers, ou camadas). Posteriormente, inverta a ordem das layers, a primeira vira a última, e a última vira primeira. É facil fazer isso através do navegador de layers que pode ser aberto no menu Windows, ou atalho CTRL+L.

Uma vez invertidas as posições, basta exportar em formato .mng usando o menu File->Export As.. e colocar essa extensão .mng ao final do nome do arquivo na hora de exportar. Feito isso, abra um terminal e digite:

$ convert arquivo.mng arquivo.pdf

Lembrando que o programa ‘convert’ é parte integrante do imagemagick e imagemagick-common, ou seja, é necessário instalá-lo antes, como por exemplo em debian based:

$ sudo apt-get install imagemagick imagemagick-common

Façam bom proveito! E muito cuidado ao modificar documentos de propriedade. Este tipo de documento PDF é assinado, como pode ser visto aqui:

Antes:

$ pdfresurrect -i arquivo.pdf

Versions: 1
Version 1 — 1844 objects
PDF Version: 1.4
Title: How to change desktop background automatically
Author: Smallbee Corporation ™
Subject: Creating desktop solutions
Keywords: pdf, gimp, convert, export
Creator: (Adobe InDesign CS5.5 \(7.5.2\))
Producer: (Adobe PDF Library 9.9)
CreationDate: (D:20150509174538+05’30’)
ModDate: (D:20120609165553+05’30’)
Trapped:

Depois:

$ pdfresurrect -i arquivo.pdf

Versions: 1
Version 1 — 228 objects
PDF Version: 1.4
Title: (arquivo.pdf)
Author:
Subject:
Keywords:
Creator:
Producer: (ImageMagick 6.7.7-10 2014-03-06 Q16 http://www.imagemagick.org)
CreationDate: (D:20151031160654)
ModDate: (D:20151031160654)
Trapped:

Referências: https://patrick-nagel.net/blog/archives/199/comment-page-1

Desenvolvimento de temas WordPress a partir de template HTML– Parte 1

Após a instalação do wordpress, crie a pasta com o nome que quiser em wordpress/wp-content/themes/pasta-criada/.

Dentro dela extrai seu template siga os seguintes passos.

O primeiro passo a ser feito é subdividir seu index em páginas lógicas. Inicialmente serão criados os seguintes arquivos:

  • header.php
  • footer.php
  • index.php
  • functions.php
  • style.css

No arquivo header.php, como o nome já diz, irá todo o cabeçalho que estamos acostumados a fazer num index normal, desde o doctype até o fechamento do <header>.

No footer.php seria o que colocamos no rodapé do nosso bom e velho index, do início do <footer> até o final, onde tem o </html>.

No index.php irá toda a parte principal do site onde será colocado todo o conteúdo e o loop (que será explicado mais detalhadamente em futuro POST da série).

No functions.php será onde colocaremos todas as funções do WordPress, a parte mais programática da coisa.

E finalmente crie o style.css. Para o wordpress reconhecer um tema é necessário ter um arquivo style.css com comentários, contendo as informações do tema. Então dentro do style.css adicione o comentário:

/*
Theme Name: Seu Tema
Theme URI: https://blog.smallbee.com.br/
Description: Meu primeiro tema em wordpress.
Author: Seu nome
Author URI: https://blog.smallbee.com.br/
Version: 1.0
Tags: WordPress, smallbee
*/

Agora no index.php adicione na primeira linha a função
<?php get_header(); ?>
que chamará o arquivo header.php. E na última linha
<?php get_footer(); ?>
que chamará o footer.php.

Configurando o Header

Para adicionar título dinâmico utilize a template tag
<?php bloginfo('name'); ?>
entre as tags title ficando assim:

<title><?php bloginfo('name'); ?></title>

Para adicionar descrição dinâmica utilize a template tag <?php bloginfo('description'); ?> na meta tag description, ficando assim:

<meta name="description" content="<?php bloginfo('description'); ?>">

Para colocar a codificação do site adicione a template tag <?php bloginfo('charset'); ?> na meta tag charset <meta charset="<?php bloginfo('charset'); ?>">

Na criação de temas para wordpress é obrigatório o uso de caminho absoluto de imagens, scripts e estilos. A template tag <?php bloginfo( ‘template_url’ ); ?>. Então adicione em todas imagens, scripts e estilos <?php bloginfo( 'template_url' ); ?>/

Exemplos:

<img src="<?php bloginfo( 'template_directory' ); ?>/img//logo.png" alt="Smallbee">

<script src="<?php bloginfo( 'template_url' ); ?>/js/main.js"></script>

<link href="<?php bloginfo( 'template_url' ); ?>/css/main.css" rel="stylesheet">

Pronto! Está feita a primeira parte! Para ver seu mais novo tema em funcionamento, ainda faltam alguns passos que serão postados no decorrer da série, mas você já pode ver seu monstrinho disponível ao acessar seu wordpress/wp-admin no menu Aparência -> Temas e ele estará lá…

Obrigado pela leitura!

Para aprofundar o seu conhecimento da template tag bloginfo consulte a documentação do wordpress, seu melhor amigo a partir de agora: https://codex.wordpress.org/Function_Reference/bloginfo

eSpeak: O Linux também fala!

Pra quem costuma elogiar o Linux dizendo: “Só falta falar”.
Agora vai ter que mudar um pouco o discurso.

O Linux também fala!

Um dos nomes dessa tecnologia é text-to-speech (texto pra fala). Já faz algum tempo que essa tecnologia vem evoluindo. Ótimo recurso para quem desenvolve aos portadores de necessidades especiais, como os deficientes visuais, por exemplo.

Mas ainda ainda tem muito o que evoluir. Não está pronta para ser usada na narração de um vídeo institucional por exemplo, para evitar gastos com um estúdio de gravação profissional (que não é nada barato).

Pra explorar text-to-speech em Linux, basta instalar o espeak e se divertir:

[root@vostrolab ~]# yum install espeak

O que eu tenho instalado aqui por exemplo, é esse:

[root@vostrolab ~]# rpm -qa|grep espeak
espeak-1.46.02-1.fc16.i686

Agora é só mandar falar:

[hudson@vostrolab ~]$ espeak -v pt “CiaLinux, compartilhando o que é livre.”

Perceba que usei o parâmetro opcional -v pt, para determinar a voz que me interessa.

Para verificar as vozes disponíveis:

[hudson@vostrolab ~]$ espeak –voices

A título de curiosidade, essas vozes ficam indexadas em /usr/share/espeak-data/voices/ e demais dicionários junto em /usr/share/espeak-data/.

O que segue é informação adicional:
eSpeak  was  written  by  Jonathan  Duddington  <jonsd@jsd.clara.co.uk>.  The  webpage  for  this  package  can  be  found  at http://espeak.sourceforge.net/.

Por: Hudson Murilo dos Santos
Referências: man espeak
http://elcio.com.br/o-linux-tambem-fala/

Clonando um banco de dados do MySQL

Então prezado leitor,

Depois de um tempo sem postar, tenho mais uma à apresentar;
Presta atenção com calma, lê bem antes de executar!

Os tempo sem postar não quer dizer eu desistí;
Quer dizer prepara aí, que tem vários POST por vir!

Se liga nessa, não tenha pressa, que o tal do BASH é bom à beça.

Essa dica é pra comunidade ligada na administração de MySQL. Maneira simples de fazer uma clonagem de um banco pra outro:

Em suma, isso gera um dump:

$ mysqldump > dumpfile

E isso faz load no novo banco recém criado:

$ mysq < dumpfile

Por exemplo, agora com todos os parâmetros na íntegra, veja como os comandos ficariam em meu ambiente.
Vamos supor que tenho um banco chamado banco01 e desejo cloná-lo em cima do banco02:

$ mysqldump -u smallbee -p –host mysql.smallbee.com.br banco01 > dumpfile.sql

Para fazer load no banco novo (depois de criado é lógico):

$ mysql -u smallbee -p –host mysql.smallbee.com.br banco02 < dumpfile.sql

Por: Hudson Murilo dos Santos
Referências: man mysql && man mysqldump