Skip to content
7 de junho de 2018 / rafaelti

Redirecionar URL HTTP para HTTPS com Nginx

Objetivo

Redirecionar URL HTTP para HTTPS com Nginx

Plataforma

Linux e Nginx

Conhecimento

Linux

Introdução

Redirecionar seu dominios em HTTP para domínio HTTPS

Solução

A solução é configurar sites-available para redirecionar o tráfego. O sites-enable tem o link simbólico do sites-available.

#redirecionando para https
server {
	listen 80;
    server_name www.yourdomain.com.br yourdomain.com.br;
    return 301 https://yourdomain.com.br$request_uri;
}
#redirecionando para https com www para sem www
server {
	listen 443 ssl http2;
	access_log  off;
	error_log   off;
	server_name www.yourdomain.com.br;
	return 301 https://yourdomain.com.br$request_uri;
}

server {
	listen 443 ssl http2 default_server;
	listen [::]:443 ssl http2 default_server;
	server_name yourdomain.com.br;

	root /usr/share/nginx/html/yourdomain/public;
	index index.html index.htm index.php;

	ssl on;
    #server config
.
.
.
}
Anúncios
10 de abril de 2018 / rafaelti

Usando partition by no Oracle

Objetivo

Utilizar o partition by no Oracle

Plataforma

Oracle SQL Developer

Conhecimento

Oracle SQL Developer e SQL

Introdução

Em um relatório precisei extrair uma sequência de ocorrência. Deparei com o partition by que facilitou minha vida.

Solução

select
EQP_COD, count(*) OVER (partition by PES_COD order by PES_COD) countpes , row_number() OVER (partition by PES_COD order by PES_COD ) seq
from EQUIPE
order by PES_COD

O resultado será para cada equipe da pessoa sua sequência e seu total.

EQP	countpes	seq
TM02	3		1
TM03	3		2
MM02	3		3
MB03	2		1
TB03	2		2
MB05	2		1
TB05	2		2
CO01	1		1
1 de março de 2018 / rafaelti

Erro emulador Android no Ubuntu 16

Objetivo

Corrigir erro ao emular um dispositivo Android no Ubuntu 16

Plataforma

linux, android

Conhecimento

linux

Introdução

Emular android é um recurso válida para testar o app em desenvolvimento quanto por alguma razão não é possível utilizar um dispositivo físico.

Ao executar o comando:

~/Android/Sdk/tools$ ./emulator -avd Nexus_5X_API_25

O retorno será:

libGL error: unable to load driver: i965_dri.so  
libGL error: driver pointer missing  
libGL error: failed to load driver: i965  
libGL error: unable to load driver: i965_dri.so  
libGL error: driver pointer missing  
libGL error: failed to load driver: i965  
libGL error: unable to load driver: swrast_dri.so  
libGL error: failed to load driver: swrast  
X Error of failed request:  GLXBadContext  
  Major opcode of failed request:  155 (GLX)
  Minor opcode of failed request:  6 (X_GLXIsDirect)
  Serial number of failed request:  55
  Current serial number in output stream:  54
...

O que precisará ser feito é substituição de uma biblioteca.

$ cd ~/Android/Sdk/emulator/lib64/libstdc++
$ mv libstdc++.so.6 libstdc++.so.6.bak
$ ln -s /usr/lib/x86_64-linux-gnu/libstdc++.so.6 libstdc++.so.6

Boa codificação

4 de setembro de 2017 / rafaelti

Envio de email com template no ZF2

Objetivo

Envio de email com template através do ZF2

Plataforma

Linux, ZF2

Conhecimento

ZF2, SMTP

Introdução

Em plataformas web é necessário envio email para seus usuários e clientes. A comunicação com seus usuários e clientes com identidade visual é importante.
Portanto o envio de email com template é essencial.

Solução

Eu criei uma classe como serviço no ZF2. Criei o método abaixo.

 public function sendTemplatedGenericEmail() {        
        $view = new \Zend\View\Renderer\PhpRenderer();
        $resolver = new \Zend\View\Resolver\TemplateMapResolver();
        $resolver->setMap([
            'mailTemplate' => __DIR__ . "/../../../../Application/view/layout/{$this->getTemplate()}.phtml"
        ]);
        $view->setResolver($resolver);

        $viewModel = new ViewModel();
        $viewModel->setTemplate('mailTemplate')->setVariables([
            'username' => $this->getUsername(),
            'userid' => $this->getUserid(),
            'subject' => $this->getSubject(),
        ]);

        $bodyPart = new \Zend\Mime\Message();
        $bodyMessage = new \Zend\Mime\Part($view->render($viewModel));
        $bodyMessage->type = 'text/html';
        $bodyPart->setParts(array($bodyMessage));

        $message = new \Zend\Mail\Message();
        $message->setBody($bodyPart);
        $message->setFrom('***psipsi.com.br', 'PsiPsi Info');
        $message->addTo($this->getToemail());
        $message->addBcc('****gmail.com');
        $message->setSubject($this->getSubject());

        $smtpOptions = new \Zend\Mail\Transport\SmtpOptions();
        $smtpOptions->setHost('******.com')
                ->setConnectionClass('login')
                ->setName('*******')
                ->setPort('999')
                ->setConnectionConfig([
                    'username' => '****psipsi.com.br',
                    'password' => '*******',
                    'ssl' => 'tls',
        ]);

        $transport = new \Zend\Mail\Transport\Smtp($smtpOptions);
        $transport->send($message);
    }

Esse trecho seta o template a ser usado. O getter $this->getTemplate() pega o nome do meu template.

$view = new \Zend\View\Renderer\PhpRenderer();
        $resolver = new \Zend\View\Resolver\TemplateMapResolver();
        $resolver->setMap([
            'mailTemplate' => __DIR__ . "/../../../../Application/view/layout/{$this->getTemplate()}.phtml"
        ]);
$view->setResolver($resolver);

Neste trecho é setado as variáveis, tais como o nome e o assunto do email.

 $viewModel = new ViewModel();
 $viewModel->setTemplate('mailTemplate')->setVariables([
		'username' => $this->getUsername(),
		'userid' => $this->getUserid(),
		'subject' => $this->getSubject(),
	]);

Passamos o nosso template para o corpo do email

 $bodyPart = new \Zend\Mime\Message();
 $bodyMessage = new \Zend\Mime\Part($view->render($viewModel));
 $bodyMessage->type = 'text/html';
 $bodyPart->setParts(array($bodyMessage));

É finalizado o email com as informações faltantes para o email. Os getter: $this->getToemail(), $this->getSubject() fazem o trabalho de preencher.

		$message = new \Zend\Mail\Message();
        $message->setBody($bodyPart);
        $message->setFrom('***psipsi.com.br', 'PsiPsi Info');
        $message->addTo($this->getToemail());
        $message->addBcc('****gmail.com');
        $message->setSubject($this->getSubject());

Configuração do SMTP e envio.

		$smtpOptions = new \Zend\Mail\Transport\SmtpOptions();
        $smtpOptions->setHost('******.com')
                ->setConnectionClass('login')
                ->setName('******.com')
                ->setPort('999')
                ->setConnectionConfig([
                    'username' => '****psipsi.com.br',
                    'password' => '*******',
                    'ssl' => 'tls',
        ]);
		$transport = new \Zend\Mail\Transport\Smtp($smtpOptions);
        $transport->send($message);
1 de julho de 2017 / rafaelti

PHP 7 – Classes anônimas

O suporte a classes anônimas foi adicionado utilizando new class. Isso pode ser utilizado no lugar de definições completas de classes para objetos descartáveis.

<?php interface Logger { public function log(string $msg); } class Application { private $logger; public function getLogger(): Logger { return $this->logger;
    }

    public function setLogger(Logger $logger) {
         $this->logger = $logger;
    }
}

$app = new Application;
$app->setLogger(new class implements Logger {
    public function log(string $msg) {
        echo $msg;
    }
});

var_dump($app->getLogger());
?>

O exemplo acima irá imprimir:

object(class@anonymous)#2 (0) {
}

A documentação completa pode ser encontrada na referência de classes anônimas.

20 de junho de 2017 / rafaelti

PHP 7 – Declarações de tipo de retorno

O PHP 7 adiciona o suporte a declarações de tipo de retorno. Similar as declarações de tipo de argumento, as declarações de tipo de retorno especificam o tipo do valor que será retornado por uma função. Os mesmos tipos estão disponíveis para declarações de tipo de retorno, assim como para declarações para tipo de argumentos.

<?php

function arraysSum(array ...$arrays): array
{
    return array_map(function(array $array): int {
        return array_sum($array);
    }, $arrays);
}

print_r(arraysSum([1,2,3], [4,5,6], [7,8,9]));

O exemplo acima irá imprimir:

Array
(
    [0] => 6
    [1] => 15
    [2] => 24
)

A documentação completa, assim como exemplos de declarações de tipo de retorno pode ser encontrada na referencia declarações de tipo de retorno.

1 de junho de 2017 / rafaelti

PHP 7 – Operador “nave espacial” (spaceship)

O operador nave espacial é utilizado para comparação entre duas expressões. Retornará respectivamente -1, 0 ou 1 quando $a for menor que, igual a, ou maior que $b. As comparações são feitas de acordo com a já conhecida regras de comparação de tipos do PHP.

<?php
// Integers
echo 1 <=> 1; // 0
echo 1 <=> 2; // -1
echo 2 <=> 1; // 1

// Floats
echo 1.5 <=> 1.5; // 0
echo 1.5 <=> 2.5; // -1
echo 2.5 <=> 1.5; // 1

// Strings
echo "a" <=> "a"; // 0
echo "a" <=> "b"; // -1
echo "b" <=> "a"; // 1
?>
25 de maio de 2017 / rafaelti

PHP 7 – Declarações de tipos escalares

Declaração de tipos escalares vem em dois sabores: coercivo (padrão) e restrito. Para parâmetros, os seguintes tipos podem ser forçados (tanto coercivamente quanto rigorosamente): strings (string), inteiros (int), números ponto-flutuante (float), e booleanos (bool). Eles incrementam os tipos introduzidos no PHP 5: nomes de classe, interfaces, array e callable.

<?php
// Modo coercivo
function sumOfInts(int ...$ints)
{
    return array_sum($ints);
}

var_dump(sumOfInts(2, '3', 4.1));

O exemplo acima irá imprimir:

int(9)

Para habilitar o modo rigoroso, uma simples diretiva declare deve ser colocada no topo do arquivo. Isso significa que a rigorosidade de tipificação para escalares é configurada por arquivo. Esta diretiva não afeta somente as declarações de tipo de parâmetros, mas também do tipo de retorno de funções (veja declaração de tipo de retorno), funções internas do PHP e funções de extensões carregadas.

A documentação completa e exemplo de declarações de tipo escalar pode ser encontrada na referência de declaração de tipo.

9 de junho de 2016 / rafaelti

Hello World com Oracle PL/SQL

Objetivo

Criar o primeiro script PL/SQL

Plataforma

Oracle SQL Developer

Conhecimento

Oracle SQL Developer e SQL

Introdução

Script para BD é uma poderosa ferramenta para automatizar rotinas e trabalhar de forma rápida em reparos. O PL/SQL é uma robusta linguagem de script que pode salvar algumas horas de trabalho.

Solução

Faremos o Hello World no PL/SQL. No Sql Developer é necessário ativar a Saída Dbms/Output Dbms, ambos, script e saída dbms, devem estar na mesma conexão.

DECLARE
   messageoutput VARCHAR2(20);     
BEGIN
  messageoutput := 'Hello World';
  dbms_output.put_line(messageoutput);
END;
7 de junho de 2016 / rafaelti

Laço com PL/SQL

Objetivo

Criar laço no script PL/SQL

Plataforma

Oracle SQL Developer

Conhecimento

Oracle SQL Developer e SQL

Introdução

Uma das funções importantes das linguagens de programação é a criação de laço. A dinâmica do funcionamento dos laços no PL/SQL é um pouco peculiar.

Solução

Faremos o laço no PL/SQL. No Sql Developer é necessário ativar a Saída Dbms/Output Dbms, ambos, script e saída dbms, devem estar na mesma conexão.

DECLARE
    type tarray is table of varchar(20) index by pls_integer;
    datasetitem tarray;
    i integer;
    dsindex integer;
BEGIN

  FOR i IN 1..20
  LOOP
     datasetitem(i) := 'Item na posição:'||i;
  END LOOP;
  
  dsindex := datasetitem.first;
  LOOP
    EXIT WHEN dsindex is null;
    dbms_output.put_line(datasetitem(dsindex));
    dsindex := datasetitem.next(dsindex);
  END LOOP;  
END;