Javascript – atribuição por referência x atribuição por valor

No Javascript os dados do tipo primitivos são atribuídos por valor e os objetos são atribuídos por referência.

O que são dados do tipo primitivos?

  • string
  • number
  • boolean
  • null
  • undefined
  • symbol

O que são considerados objetos?

  • Array
  • Funções
  • { }

O que significa passar os dados por valor?

Nos dados primitivos os dados são passados por valor, isso significa que é criado uma cópia e acontece uma nova alocação de memória para aquela informação.

let a = 1;
let b = a;
b += 1;

console.log(a); //1
console.log(b); //2

No exemplo acima, quando defino b é criado uma nova alocação de memória que copia o valor de a e atribui a minha nova variável b. Elas agora são independentes.

O que significa passar os dados por referência?

Quando falamos que os dados são passados por referência significa que irão apontar para o mesmo objeto na memória – o novo objeto será apenas uma referência ao caminho do objeto original na memória (pense como se fosse um atalho que você cria no seu desktop).

Isso acontece nos objetos:

let person = { name : 'Pacato'};
let person2 = person;
person2.name = 'Leon';

console.log(person.name); //Leon
console.log(person2.name); //Leon

Como person2 é apenas uma referência ao objeto alocado na memória como person, qualquer alteração em qualquer um deles será refletida no outro.

let arr = [1,2]; 
let arr2 =arr; 
arr2.push(3); 
console.log(arr); // [1, 2, 3]
console.log(arr2); // [1, 2, 3]

O mesmo ocorre com o array acima.

Como debugar NodeJS no VS Code?

Recentemente comecei a testar o VS Code, depois de alguns anos usando o Sublime Text (leia como abrir sublime no terminal (Linux) sem usar a sessão do terminal) e descobri que é possível fazer o debug de NodeJS do VS Code.

No momento que escrevi isso estou usando a V 1.29.1 do editor no Linux (Ubuntu), talvez algo possa ser um pouco diferente em outras versões ou plataformas.

O VS Code tem um botão de Debug na sidebar esquerda (de ícones), também pode ser ativado pelo menu View -> Debug ou ainda pelo atalho CTRL+SHIFT+D.

Neste debugger é possível fazer o start de uma aplicação/script em  NodeJS diretamente pelo VS Code.  Para isso antes é necessário criar um arquivo de configuração, clicando em Add Configuration (imagem abaixo).

Você define que é NodeJS e que a configuração será de Launch e o VS Code irá criar um arquivo launch.json na raiz do seu workspace, com o arquivo padrão. Você pode ter uma série de comandos diferentes para o debug, no mesmo arquivo – cada um representará uma opção no select de debug.

O editor disponibiliza vários modelos prontos de configurações, a Launch é a necessária para rodar e debugar um arquivo.

Com ela pronta, se você clicar em debugar (o ícone de “play” do printscreen acima) o VS Code irá executar seu arquivo e, por padrão, exibir no console interno do editor (debug console) qualquer resultado.

Ele também irá respeitar todos os breaking points que você marcar no arquivo. Você também tem uma aba de variáveis (na sidebar esquera do debug) que exibe tudo o que está disponível enquanto seu código roda.

Também é possível você acoplar o debugger do VS Code a um processo em NodeJS que já está rodando em sua máquina, para isso é necessário adicionar a configuração de “attach” no arquivo de config.

O vídeo abaixo (em inglês) explica um pouco dos processos básicos de debug com o editor.

Tabém vale a pena conferir a documentação sobre debug de NodeJS com o VS Code, lá tem detalhamento sobre as ocnfigurações possíveis para o Launch, protocolos utilizados, qual terminal utilizar (o do próprio VS Code ou externo), etc.

Como pegar preço de ações no Google Spreadsheet

Se você acompanha no twitter ou facebook sabe que não é segredp meu interesse no mercado financeiro.

Apesar deste post não ser exatametne sobre código, eu acredito que a programação vai além de criar código e algoritmo: eu, enquanto desenvolvedor, tenho como um dos objetivos do meu trabalho automatizar processos.

No último ano eu migrei todo meu controle de investimentos para uma planilha megazord no Google Drive que vai um pouco além do básico lucro/prejuízo para cada investimento.

Nela faço cálculo do preço médio (que me ajudar no cálculo de imposto de renda que incide na venda de ações), proventos (para saber meu ganho real, e não apenas na valorização do ativo),  histórico de compras e vendas e alguns gráficos que permitem ver com facilidade exatamente como está a alocação da minha carteira – por tipo de investimento e, dentro da categoria, a distribuição em cada ativo.

Uma das funções indispensáveis para este tipo de acompanhamento  é ter a cotação dos ativos disponíveis de forma automática na planilha – e é isso que o  =GOOGLEFINANCE faz.

Para pegar o último preço disponível de um ativo, é só usar a fórmula passando como primeiro parâmetro o código (ticker) da ação, por exemplo:

=GOOGLEFINANCE(“ITSA4”)

O segundo parâmetro é qual atributo será solicitado, por padrão é o preço:

=GOOGLEFINANCE(“ITSA4”, “price”)

Alguns dos atributos que podem ser solicitados:

  • "price" – Cotação de preços em tempo real, com atraso de até 20 minutos.
  • "priceopen" – Preço no início do pregão.
  • "high" – Preço da alta no dia atual.
  • "low" – Preço da baixa no dia atual.
  • "volume" – O volume de negociações do dia atual.

Solicitando dados de um período de tempo

Utilizando os próximos 3 parâmetros é possível especificar o período de dados que você quer visualizar (data inicial e final) e a periodicidade da informação (diária ou semanal).

Por exemplo, para solicitar a máxima de ITSA4, diárias, de janeiro a outubro de 2018 tenho o seguinte:

=GOOGLEFINANCE(“ITSA4”, “high”, DATE(2018,1,1), DATE(2018,10,31), “DAILY”)

Lembrando que em qualquer fórmula do spreadsheet você pode substituir os parâmetros por valores em outras células – isso permite automatizar muita coisa – inclusive a geração de gráficos.

Por exemplo, se tenho na minha coluna A uma lista dos papéis que tenho em carteira e na coluna B quero exibir a última cotação disponível, em minha cédula B1 posso utilizar a fórmula:

=GOOGLEFINANCE(A1)

Importante lembrar que as cotações tem delay, não devem ser utilizadas para decisão de trade/compra e venda.

Com um pouco de criatividade, filtros e gráficos você pode ter um sistema de visualização e acompanhamento de investimento “taylor made” bem completo com pouco esforço .

Como também tenho cryptomoedas, em breve escrevo sobre como automatizar também a cotação delas lá no Google Spreadsheet.

Na documentação oficial você pode ver todos os atributos possíveis de solicitar com o GOOGLEFINANCE.

Eliminando PHP short tags com regex

Escrevi uma regex para substituir short tags do PHP, a única coisa diferente da maioria que eu encontrei foi que me preocupei em manter as quebras de linhas – e não quebrar nenhuma parte do código comendo caracter (encontrei várias sugestões com regex que acabam “comendo” caracter dependendo do caso).

A expressão regular (regex):

<\?([^p|=])

O replace:

<?php $1

Explicando a REGEX:

Ela irá buscar por qualquer <? que não seja seguido imediatemente por um “p”, garantindo que <?php não case com a regex, ou seguido por um “=” – garantindo que <?= não case com a regex.

Os parêntesis da REGEX criam um grupo de captura que é utilizado no replace, isto serve para casos específicos como

<?if(

O i seria “engolido” neste caso. O grupo de captura também captura quebras de linha, isso garante que:

<?
if($x = $y)

Se transforme em:

<?php
if($x = $y)

E não em:

<?php if($x = $y)

Mantendo a mesma legibilidade e formatação do código original após o replace.

Não encontrei nenhuma situação em que esta regex causou problema, se ela não funcionar em algum caso comente aí.

Controlando GPIO do RaspberryPI com NodeJS

Esta semana eu comecei a me aventurar com o Arduino e depois de me sentir um pouco mais seguro na parte eletrônica resolvi entender como controlar os “pinos”, ou formalmente conhecidos como General Purpose Input/Output (GPIO) do Raspberry Pi.

Consegui fazer testes para controlar GPIO do Raspberry PI pelo terminal unix, mas resolvi colocar em teste a Atwood’s Law:

“any application that can be written in JavaScript, will eventually be written in JavaScript. “

qualquer aplicação que pode ser escrita em JavaScript, eventualmente será escrita em JavaScript.

Controlando GPIO do RaspberryPI com Node.JS

1) Instale NodeJS + NPM no RPi

A instalação do nodejs e do npm pode variar de acordo com o SO que você está usando no RPi – aqui eu estava usando o SO do Kano e consegui instalar sem problemas – mas não via (apt-get).

wget http://node-arm.herokuapp.com/node_latest_armhf.deb
sudo dpkg -i node_latest_armhf.deb

Para verificar se você tem nodejs instalado – ou se a instalação aconteceu com sucesso, utilize os comando abaixo para verificar a versão instalada:

node -v

Repita o proesso para o npm

npm -v

Se eles não estão instalados o primeiro passo é instalar o NodeJS e NPM no seu raspberry.

Camiseta Node.JS

Jabá: camiseta NodeJS do Eu Compraria

2) Instale o rpi-gpio

Com o node e npm instalados você precisa instalar o rpi-gpio utilizando o npm.

npm install rpi-gpio

3) Conecte um led ao seu RPi

Defina o GPIO que você urá utilizar, veja a documentação do GPIO dos RPi do RPi – a imagem abaixo é desta documentação.

No meu caso usei o 13 (que é o GPIO27) e o pino 14 para o terra. Não esqueca de usar um resistor de acordo com o led que você vai utilizar.

Eu utilizei uma protoboard para facilitar a instalação.

4) Crie uma aplicação em Node.JS

Crie uma aplicação de teste e carregue o rpi-gpio.

var gpio = require('rpi-gpio');

O setup (veja a documentação do rpi-gpio) faz o “export” da GPIO e configura se será entrada ou saída.

O último parâmetro é o callback para quando a porta estiver pronta.

gpio.setup(13, gpio.DIR_OUT, write);

No callback, estou escrevendo o valor “true” para o pino 13 (ou GPIO27) – que vai acenter o led conectado lá.

function write() {
  gpio.write(13, true, function(err) {
    if (err) throw err;
    console.log('Written to pin');
  });
}

Agora você já pode fazer um server web interagir com o Arduino, com leds, com a sua casa.

Veja também:

Instalação do NodeJS no RPi – we work we play (en)

Documentação do GPIO do Raspberry Pi (en)

Heim control – Automação residencial com Node.JS (en)