Categories
Desenvolvimento

Sintaxe OOP para JavaScript em 5 minutos

Criar uma classe

class Funcionario {

}

Adicionar um construtor

class Funcionario {
    constructor () {
    }
}

Criar propriedades

class Funcionario {
    constructor (nome, salario) {
        this._nome = nome;
        this._salario = salario;
        this._bonificacao = 1.05;
    }
}

Criar método

class Funcionario {
    constructor (nome, salario) {
        this._nome = nome;
        this._salario = salario;
        this._bonificacao = 1.05;
    }
    calculaSalarioFinal () {
        return this._salario * this._bonificacao;
    }
}

Propriedades estáticas

class Funcionario {
    static contador = 0;

    constructor (nome, salario) {
        this._nome = nome;
        this._salario = salario;
        this._bonificacao = 1.05;

        Funcionario.contador += 1;
    }
    calculaSalarioFinal () {
        return this._salario * this._bonificacao;
    }
}

Getters e setters

class Funcionario {
    static contador = 0;

    constructor (nome, salario) {
        this._nome = nome;
        this._salario = salario;
        this._bonificacao = 1.05;

        Funcionario.contador += 1;
    }
    calculaSalarioFinal () {
        return this._salario * this._bonificacao;
    }
    get nome () {
        return this._nome;
    }
    set nome (novoNome) {
        this._nome = novoNome;
    }
}

Herança

class Gerente extends Funcionario {
    constructor (nome, salario) {
        super(nome, salario);
        this._bonificacao = 1.07;
    }
}
class Diretor extends Funcionario {
    constructor (nome, salario) {
        super(nome, salario);
        this._bonificacao = 1.09;
    }
}

Sobrescrever um método

class Diretor extends Funcionario {
    constructor (nome, salario) {
        super(nome, salario);
        this._bonificacao = 1.09;
    }
    calculaSalarioFinal (adicional=0) {
        return super.calculaSalarioFinal() + adicional;
    }
}

Simular um classe abstrata

class MinhaClasse {
    constructor () {
        if (this.constructor === MinhaClasse) {
            throw new Error('"MinhaClasse" é abstrata');
        }
    }
}

Simular um método abstrato

class MinhaClasse {
    constructor () {
        if (this.constructor === MinhaClasse) {
            throw new Error('"MinhaClasse" é abstrata');
        }
    }
    meuMetodo () {
        throw new Error('Método não implementado');
    }
}

Referências

  • https://cursos.alura.com.br/course/javascript-polimorfismo
  • https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Classes
Categories
Uncategorized

Destructuring em JavaScript

Trata-se de uma sintaxe que permite “desembrulhar” valores de um objeto ou um array antes de atribuí-los à variáveis.

O exemplo a seguir “desembrulha” os valores de um array em duas variáveis.

> const [ peso, idade ] = [ 70, 36 ];
> console.log(peso)
70
> console.log(idade)
36

Outro exemplo usando arrays.

> const [ peso, idade, ...resto ] = [ 70, 36, 170, 1984 ]
> console.log(peso)
70
> console.log(idade)
36
> console.log(resto)
[ 170, 1984 ]

Também é possível “desembrulhar” propriedades de objetos.

> const { peso, idade } = { peso: 70, idade: 36 }
> console.log(peso)
70
> console.log(idade)
36

Mais um exemplo usando objetos.

> const { peso, idade, ...resto } = { "peso": 70, "idade": 36, "altura": 170, "nascimento": 1984 }
> console.log(peso)
70
> console.log(idade)
36
> console.log(resto)
{ altura: 170, nascimento: 1984 }

É possível ainda construir novos arrays “desembrulhando” valores de outros arrays.

> const array1 = [ 70, 36 ]
> const array2 = [ "setenta", "trintaeseis" ]
> const array3 = [...array1, ...array2 ]
> console.log(array3)
[ 70, 36, 'setenta', 'trintaeseis' ]

Da mesma forma é possível construir novo objetos “desembrulhando” valores de outros objetos.

> const obj1 = { "idade": 36, "peso": 70 }
> const obj2 = { "nome": "Fabio" }
> const obj3 = { "funcao": "Piloto", ...obj1, ...obj2 }
> console.log(obj3)
{ funcao: 'Piloto', idade: 36, peso: 70, nome: 'Fabio' }

A sintaxe de destructuring também serve para passagem de parâmetros para funções.

> f = function([idade, peso]) {
    console.log("idade", idade);
    console.log("peso", peso);
  }
> f([ 36, 70 ])
idade 36
peso 70

O mesmo do exemplo acima, mas usando um objeto.

> f = function ({ idade, peso }) {
    console.log("peso", peso);
    console.log("idade", idade);
  }
> f({ "peso": 70, "idade": 36 })
peso 70
idade 36

Referências

  • https://cursos.alura.com.br/destructuring-em-js-c308
    • Aula da https://github.com/juunegreiros
  • https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment
Categories
Uncategorized

Criando um arquivo swap no linux

Primeiro deve-se criar um arquivo com o tamanho de swap desejado. O passo abaixo cria um arquivo de 1Gb.

sudo dd if=/dev/zero of=/swap1 bs=1M count=1000

É necessário que este arquivo seja acessível somente pelo root. Se essa restrição não for atendida, o arquivo pode não ser montado corretamente.

sudo chmod 600 /swap1

O comando abaixo formata o arquivo como swap

sudo mkswap /swap1

Para que este arquivo esteja sempre montado através de inicializações é necessário adicionar uma linha em /etc/fstab.

sudo sed -i -e '$a/swap1    none    swap    defaults 0 0' /etc/fstab

Finalmente é possível ativar o swap no arquivo criado através do comando abaixo.

swapon /swap1
Categories
Uncategorized

Ajustando fuso horário no PHP

Algumas aplicações precisam saber o fuso horário para realizar algumas ações específicas e pode ser uma boa ideia ajustar o date.timezone[1] nas configurações do PHP para essas aplicações.

Se o comando abaixo não exibir nenhuma saída, provavelmente o date.timezone não está configurado.

$ php -r "echo ini_get('date.timezone');"
>>>

É possível verificar a string que será exibida pela aplicação com o comando date[2] e o corrente fuso horário usando o comando abaixo.

$ php -r "echo date('r');"
>>> Fri, 22 Nov 2019 14:28:03 +0000

O +0000 indica que o fuso horário atual é o UTC, que é padrão do PHP quando o date.timezone não está configurado.

Depois de pegar uma opção de fuso horário a partir da documentação[3] do PHP, o teste para verificar se esta opção dará o resultado esperado pode ser feito com o comando abaixo, supondo que a opção escolhida seja America/Sao_Paulo.

$ php -d date.timezone=America/Sao_Paulo -r "echo date('r');"
>>> Fri, 22 Nov 2019 11:35:38 -0300

O -0300 indica o fuso horário America/Sao_Paulo. Para persistir esta configuração devemos definir date.timezone no arquivo php.ini. O lugar deste arquivo pode variar conforme a distro usada.

No Archlinux, todos os arquivos com extensão .ini presentes no diretório /etc/php/conf.d vão fazer parte do php.ini. O comando abaixo adiciona a configuração de fuso horário às configurações do PHP.

# echo date.timezone=America/Sao_Paulo >> /etc/php/conf.d/my-customs.ini

Feito isto, é possível rodar os mesmos comandos acima para verificar se as configurações de fuso horário estão funcionando corretamente.

$ php -r "echo ini_get('date.timezone');"
>>> America/Sao_Paulo

$ php -r "echo date('r');"
>>> Fri, 22 Nov 2019 11:51:25 -0300

Referências

  1. https://www.php.net/manual/en/datetime.configuration.php#ini.date.timezone
  2. https://www.php.net/manual/en/function.date.php
  3. https://www.php.net/manual/en/timezones.php
Categories
Desenvolvimento

Alterar URL de uploads no WordPress

Em algumas ocasiões pode ser necessário que a URL dos arquivos de uploads seja modificada para apontar para outro endereço diferente do padrão. Isso pode ser feito usando a opção upload_url_path.

Para alterar o caminho http://example.com/wp-content/uploads e deixar como http://static.example.com/wp-content/uploads, a opção upload_url_path deve ser definida como abaixo.

update_option(
    'upload_url_path',
    'http://static.example.com/wp-content/uploads'
);

Referência

  • https://developer.wordpress.org/reference/functions/wp_upload_dir/
Categories
Desenvolvimento

Manipulando arquivos com NodeJS

Estes exemplos foram feitos a partir dos exercícios disponíveis no nodeschool, pelo workshopper learnyounode.

Lendo um arquivo de forma síncrona

A ideia aqui era fazer um programa em node que pudesse contar o número de linhas em um arquivo cujo caminho foi fornecido via parâmetro.

// countLines.js
var fs = require('fs');
var filename = process.argv[2]; // parametro
var buffer = fs.readFileSync(filename);
var str = buffer.toString();
console.log(str.split('\n').length - 1);

Lendo arquivo de forma assíncrona

// countLinesAsync.js
var fs = require('fs');
var filename = process.argv[2];
fs.readFile(filename, function(err, data) {
    var str = data.toString();
    console.log(str.split('\n').length - 1);
});

Listando arquivos de um diretório

O programinha abaixo funciona mais ou menos como o comando ls do linux. O primeiro parâmetro é o diretório que se quer listar arquivos e o segundo parâmetro é a extensão dos arquivos que serão listados.

// ls.js
var fs = require('js');
var path = require('path');
var dirPath = process.argv[2];
var ext = '.' + process.argv[3];

fs.readdir(dirPath, function (err, list) {
    if (err) {
        return;
    }
    var files = list.filter(function(f) {
        return path.extname(f) === ext;
    });
    console.log(files.join('\n'));
});

Referências

  • http://nodeschool.io/#workshopper-list
  • https://github.com/rvagg/learnyounode
Categories
Desenvolvimento

Hello World com NodeJS

NodeJS é uma plataforma para programação de Javascript no lado do servidor. Foi construído sobre o interpretador Javascript que é usado no Chrome, o V8.

Instalando no Archlinux

sudo pacman -S nodejs

Depois de instalado é possível acessar um shell interativo através do comando node.

Um ‘Hello World

# hello-world.js
console.log('HELLO WORLD');

Para executar o arquivo acima, basta digitar no console:

$ node hello-world.js 
HELLO WORLD

Algo mais elaborado que isso poderia ser uma mensagem vinda por parâmetro, quando o comando é invocado.

# hello-world-2.js
console.log(process.argv[2]);

A execução do arquivo ficaria da seguinte forma:

$ node hello-world-2.js 'Hello World'
Hello World

Referências

  • http://nodeschool.io/
  • https://github.com/rvagg/learnyounode
Categories
Desenvolvimento

Ambiente de desenvolvimento Django

O Django é um framework de desenvolvimento Web escrito em Python. Toda vez que começo um novo projeto em Django, eu sigo quase sempre as mesmas etapas. Algumas etapas são auxiliadas por outros programinhas bem bacanas que são o pip, o virtualenv e o virtualenvwrapper.

O pip é um gerenciador e instalador de pacotes Python.  Uso o pip para baixar as dependências dos meus projetos. Eu costumo guardar os nomes das dependência em um arquivo de texto, na raiz do projeto, para aqueles que forem instalar o projeto saberem o que devem instalar com o pip.

O virtualenv é uma ferramenta que permite isolar um ambiente Python. Para cada projeto, eu crio um ambiente Python e uso o pip para instalar as dependências do meu projeto nesse ambiente isolado.

O virtualenvwrapper é um facilitador de uso do virtualenv. Ele já define o lugar onde serão criados os ambientes isolados e provê alguns atalhos para ativar, desativar e apagar esses ambientes.

Instalação das ferramentas

Mostro a seguir como eu instalo o pip, virtualenv e virtualenvwrapper em minha estação de desenvolvimento.

Instalando do pip

Eu costumo instalar o pip através do gerenciador de pacotes do sistema operacional. Eu uso o Archlinux, então instalo da seguinte forma:

$ sudo pacman -S python-pip

Se a versão do pip que foi instalada é muito antiga, você pode usar o próprio pip para atualiza-la.

$ sudo pip install pip --upgrade

Instalando o virtualenv

No mesmo estilo acima, eu uso o gerenciador de pacotes do sistema operacional para instalar o virtualenv. Como eu uso o Archlinux, instalo da seguinte forma:

$ sudo pacman -S python-virtualenv

Dependendo do seu sistema operacional, alguns pacotes podem estar mais velhos do o que o desejado. Caso você desconfie disso, você pode instalar o virtualenv através do pip.

$ sudo pip install virtualenv

Instalando o virtualenvwrapper

Da mesma forma que os pacotes acima, eu uso o gerenciador de pacotes do Archlinux para instalar o virtualenvwrapper.

$ sudo pacman -S python-virtualenvwrapper

Só que esse pacote precisa de um passo a mais, que é para carregá-lo automaticamente quando você faz login em um terminal. Para isso tente:

$ echo 'source /usr/bin/virtualenvwrapper.sh' >> ~/.bashrc

Criação de um projeto com um novo ambiente python

Meu ponto de partida agora é a pasta ~/devel, onde eu guardo todos os meus projetos.

Criando o virtualenv

Eu acho importante ser explícito em relação a versão de Python que vou usar. O Archlinux tem o python na versão 3 por padrão. No caso abaixo, quero criar um ambiente isolado com python 2.

$  mkvirtualenv meu_novo_projeto -p /usr/bin/python2

Instalando o Django

Depois que você ativa o virtualenv, seu shell ganha o prefixo com o nome do projeto que você deu, no caso ‘meu_novo_projeto’. Tendo isso, vamos instalar o Django.

(meu_novo_projeto)$ pip install django

Tá demorando né? Sim, o pip é um bocado demorado pra baixar as coisas. Como lição de casa, procure no Google por PIP_DOWNLOAD_CACHE.

Começando o projeto com o Django

Legal, temos o Django instalado no nosso ambiente, agora vamos começar nosso projeto, com o mesmo nome do ambiente que criamos, só pra sermos organizados.

(meu_novo_projeto)$ django-admin startproject meu_novo_projeto

Vamos iniciar o Django pra saber se tudo deu certo.

(meu_novo_projeto)$ cd meu_novo_projeto
(meu_novo_projeto)$ ./manage.py syncdb --noinput
(meu_novo_projeot)$ ./manage.py runserver

Agora veja em seu navegador no endereço http://localhost:8000. Se estiver vendo a telinha inicial do Django, tudo deu certo.

Referências

  • https://docs.djangoproject.com/en/1.6/
  • https://pip.pypa.io/en/latest/installing.html#using-package-managers
  • http://virtualenvwrapper.readthedocs.org/en/latest/
Categories
Linux

Sed – como apagar linhas?

sed é uma ferramenta GNU para tratamento de textos. É possível fazer operações sobre arquivos textuais e saídas de outros programas. Para usar o sed é recomendável saber um pouco de expressões regulares para encontrar padrões, mas é possível usá-lo com simples strings.

Para as experiências a seguir, será usado um arquivo texto com alguns nomes de pessoas, chamada nomes.txt, que contém dois nomes por linha. As alterações feitas pelo sed não persistem no arquivo sem a opção -i, então o mesmo arquivo será usado para todos os comandos.

[~] cat > nomes.txt <<- DONE
Guilherme Sofia
Gustavo Maria
Lucas Beatriz
Enzo Camila
Vinicius Amanda
Joao Bruna
Eduardo Isabela
Bruno Ana
DONE

 Apagar linhas

Em um script para o sed a letra d significa a deleção de uma linha.

Apagar a linha número 2

[~] sed -e '2d' nomes.txt
Guilherme Sofia
Lucas Beatriz
Enzo Camila
Vinicius Amanda
Joao Bruna
Eduardo Isabela
Bruno Ana

Apagar da linha 1 até a linha 3 (inclusive)

[~] sed -e '1,3d' nomes.txt
Enzo Camila
Vinicius Amanda
Joao Bruna
Eduardo Isabela
Bruno Ana

Apagar da linha 3 (inclusive) até o fim do arquivo

[~] sed -e '3,$ d' nomes.txt
Guilherme Sofia
Gustavo Maria

Apagar linhas com o primeiro nome terminando em o

Padrões no sed devem ficar entre duas barras /.

[~] sed -e '/^\w\w*o /d' nomes.txt
Guilherme Sofia
Lucas Beatriz
Vinicius Amanda

Apagar da linha que começa com Lucas até a linha que termina com Amanda

[~] sed -e '/^Lucas/,/Amanda$/d' nomes.txt
Guilherme Sofia
Gustavo Maria
Joao Bruna
Eduardo Isabela
Bruno Ana

Apagar a linha que termina com Beatriz e também a próxima linha

É possível realizar mais de um comando para o mesmo padrão que o sed encontrou no texto de entrada. Os comandos ficam entre chaves. O comando N seleciona a linha seguinte junto a linha do padrão encontrado para serem apagadas pelo comando d.

[~] sed -e '/Beatriz$/{ N; d }' nomes.txt
Guilherme Sofia
Gustavo Maria
Vinicius Amanda
Joao Bruna
Eduardo Isabela
Bruno Ana

Referências

Categories
Linux

Resolvendo a falta da tecla ‘/’ na instalação do Arch Linux

Eu não estava conseguindo começar a instalação do Arch Linux no meu notebook, pois eu não conseguia digitar o caracter ‘/‘. Tenho um Samsung Chronos 7, e a ‘/‘ fica junto com a letra Q.

Em alguns dos fóruns que visitei, uma cara mencionou um comando que se chama showkey, que quando executado mostra o código da tecla pressionada. Com esse programinha, descobri que a tecla Q tem o código 16. A saída do comando é mais ou menos essa:

[email protected] ~ # showkey
kb mode was UNICODE
[ if you are trying this under X, it might not work
since the X server is also reading /dev/console ]

press any key (program terminates 10s after last keypress)...
keycode  28 release
keycode  16 press
keycode  16 release

Esse número 16, que é o keycode do Q, deve ser usado para mapear a ‘/‘ em um arquivo que será  lido pelo comando loadkeys. Para isso foi necessário alterar o arquivo com o mapa do meu teclado, que é do tipo br-abnt2.

[email protected] ~ # gunzip /usr/share/kbd/keymaps/i386/qwerty/br-abnt2.map.gz
[email protected] ~ # vi /usr/share/kbd/keymaps/i386/qwerty/br-abnt2.map

Encontrei a linha 15 dizendo "altgr   keycode  19 = registered" e assumi que devia fazer algo parecido com o keycode 16. Então antes dessa linha, inseri um nova linha e nesse trecho, o arquivo ficou mais ou menos assim:

        altgr   keycode  16 = slash
        altgr   keycode  19 = registered

Depois bastou compactar o arquivo novamente e usar o comando loadkeys para ter a ‘/‘ funcionando.

[email protected] ~ # gzip /usr/share/kbd/keymaps/i386/qwerty/br-abnt2.map
[email protected] ~ # loadkeys br-abnt2

Agora é só continuar a instalação. 🙂