domingo, 26 de julho de 2015

Meteor package development: “Error: inconsistent dependency constraint across unibuilds?”

If you are stucked trying to run your meteor app or trying to run a “meteor add my:package” and are getting the inconsistent dependency constraint you should try:
  1. Update your project with “meteor update”;
  2. Verify the versions of your package dependencies and replace for the lastest versions of then.

sexta-feira, 1 de maio de 2015

Propostas para a Harmony - ES6

A versão 6 da amada, desejada, maravilhosa e estupenda ECMAScript está vindo.
E no meio de tudo que pode vir, tem algumas coisas que realmente são veri biutifus.
Então vamos dar uma olhada, para o ECMAMóvel!

Escopos, binding e calling

const

A nova keyword const permite declarar constantes (essa é bem óbvia, né?!)

let

A nova keyword let vai funcionar bem parecido com a velha e boa var, mas será block-scoped e com melhor semântica use-before-set. "Mas é o que Gabriel?!" você pergunta
Você não poderá usar a let num escopo global, só em escopos locais. E se já ouvir uma variável declarada com let no escopo, você terá uma exception. Quase sendo um tipo de const.

var a = [1,1,2,3,5,8];
for(let i = 0; i < a.length; i++){
console.log(a[i]);
}

console.log(i); // Aqui vai dar um ratchofly e a var i não vai fugir do escopo mais

domingo, 27 de abril de 2014

Macros em JS com Sweet.js - Hygienic macros - Parte I

Sweet.js? Macro? É de cumê?

Não, meu sinhô, é bem melhor que isso. :D
Macros são quando você pode mudar ligeiramente , ou não, o processamento sintático de uma linguagem para facilitar a sua vida. Lembra do velho swap entre variáveis? Fiz um macro pra ele, se liga:

// wow.js
macro swap {
 rule { $x and $y } => {
  var tmp = $x;
  $x = $y;
  $y = tmp 
 }
}

var a = "a",
    b = "b";

console.log(a, b); // => a b
swap a and b;
console.log(a, b); // => b a

Interessado? Agora pra continuar instale o Sweet.js via npm

$ npm install -g sweet.js

Agora você pode compilar os JS com macro assim:

$ sjs wow.js -o output.js
Se você compilar o wow.js vai ver ele assim:

var a$381 = 'a', b$382 = 'b';
console.log(a$381, b$382);
var tmp$384 = a$381;
a$381 = b$382;
b$382 = tmp$384;
console.log(a$381, b$382);

Gaaabrieel-san, mas o que diabos é isso que ele fez com as variáveis? Coisa mais feia!
Calma, isso se chama "higienização" e serve pra prevenir conflitos entre variáveis, por exemplo:

var tmp = "tmp", b = "b";
swap tmp and b;

// ...
// output.js
// Sem higienização

var tmp = "tmp", b = "b";
var tmp = tmp;
tmp = b;
b = tmp; 

Viu? So many conflicts, wow!
Isso é só a ponta do Iceberg :p
calm down and wait for more in soon

sexta-feira, 28 de fevereiro de 2014

Rails tips


posts = Post.all
tags = posts.tags
# That is really bad because Rails is doing too many queries in database, we can make it better:

posts = Post.find(:all, include: :tags) # Not too many queries in database, more performance

Dica Rails

Quando estiver executando seu Rails app em development. Acesse o localhost:3000/rails/info.
:D

sexta-feira, 31 de janeiro de 2014

HelloBar e Landing Pages

Qual é o basicão de uma Landing Page? É um input pra um usuário interessado botar o email e/ou o nome.
Conheça o HelloBar pra facilitar a sua vida na criação de email lists

terça-feira, 24 de dezembro de 2013

Instalando Zsh no Ubuntu

Configurando o ZSH como seu terminal padrão incluindo o oh-my-zsh


$ sudo apt-get update && sudo apt-get install zsh # installing zsh
$ wget –no-check-certificate https://github.com/robbyrussell/oh-my-zsh/raw/master/tools/install.sh -O – | sh # oh-my-zsh
$ chsh -s /bin/zsh # setting as default

# Restart your system ;)


O Zsh vai automaticamente carregar o seu .bashsrc

domingo, 8 de dezembro de 2013

Dropping/Resetting Postgres database on Heroku

heroku pg:reset DATABASE_URL 

Type exactly as is the above command in your shell, you will be asked for confirm your app database name, type it and voilà.

Now, is good you remigrate your new database, right?


heroku run rake db:migrate db:seed

Continuando/resumindo downloads no wget

Você tava baixando aquele arquivo a horas no wget e a internet cai. E agora, Juvenal?

Primeiro, na hora de baixar seu comando foi mais ou menos esse:

$ wget http://s007.fileom.com:182/d/yalitlbvmwpxj4w7ma2iot6vc26cawbolw4k75f7qjglyyyen3qcou4t/BreakingBad.505.rmvb

Dai, para poder resumir o download você passa a flag -c

$ wget -c http://s007.fileom.com:182/d/yalitlbvmwpxj4w7ma2iot6vc26cawbolw4k75f7qjglyyyen3qcou4t/BreakingBad.505.rmvb

sábado, 7 de dezembro de 2013

Atrasado sobre as novidades do Ruby 2.0?

Talvez você se atrasou um pouco ou esqueceu o que foi trazido de novo pelo Ruby 2.0. Então aqui dois belisquinhos do que veio de "novo" pra você


Literal symbols list| Lista literal de símbolos

> %i[gabriel rubens] 
=> [:gabriel, :rubens]

Keywords arguments | Like Python? :p

def foo( mother = {} )
  name = mother[:name]
  size = mother[:size]
  
  "#{name} has size #{size}"
end

# ...

> foo name: "Creuza", size: 50000
=> Creuza has size 50000

# or

def foo(name: nil, size: nil)
 # ...
end

NoMethodError ao instalar Sinatra 1.4.4

Tentou instalar o Sinatra 1.4.4 e se deparou com...

NoMethodError: undefined method `size' for nil:NilClass
An error occurred while installing sinatra (1.4.4), and Bundler cannot continue.
Make sure that `gem install sinatra -v '1.4.4'` succeeds before bundling

Pois é, a solução mais rápida pra agora é tentar instalar a versão anterior do Sinatra mesmo


gem install sinatra -v 1.4.3


UPDATE


Você pode tentar também dar um git clone localmente para instalar a 1.4.4 sem problemas

$ git clone https://github.com/sinatra/sinatra.git
$ cd sinatra
$ gem build sinatra.gemspec
$ gem install sinatra-1.4.4.gem

quarta-feira, 27 de novembro de 2013

Shell Script: Sabendo se o usuário é root

Para saber se o usuário é root

if [ "$(whoami)" != "root" ]; then 
 echo "You aren't the root user"
 exit
fi

terça-feira, 22 de outubro de 2013

Baixando vídeos do YouTube com JS direto na página

Outrora, aqui no meu blog mesmo, eu já tinha feito um post sobre isso. Mas convenhamos, eu realmente fui um pouco preguiço quando fiz esse JS velho.
Mas agora, andei bem inspirado ultimamente e fazendo e revendo um bocado de projeto antigo meu e esse foi um dos que retomei coragem pra melhorar o código.


Então, sem mais blá blá blá, vamos lá!


  1. Habilite a barra de favoritos do seu navegador, use os sub-passos se seu navegador for o Chrome, caso não, pule para o passo N#2
    • Se você estiver no Chrome, clique aqui
    • Embaixo de "Aparência", marque o checkbox "Sempre mostrar a barra de favoritos" e feche a aba das Configurações e volte pra cá
  2. Arraste este link  Download Video  para sua barra de favoritos, que apareceu logo abaixo da barra de endereços
  3. Agora é só ir em qualquer página de vídeo no YouTube que você quer baixar, e quando o vídeo começar a carregar é só clicar em Download Video na barra de favoritos. 
  4. Quando clicar em Download Video, irá aparecer uma nova aba [ou janela]. Daí, quando aparecer um reprodutor, é só fazer CTRL+S ;)

quarta-feira, 9 de outubro de 2013

Por que programar é tão bom?

Programar. Só de falar já dá um arrepio e uma vontade de inventar algo novo, e talvez seja por isso que programar seja tão bom.

Se você é programador, então você tem uma sede de criar coisas novas. Essa sensação de criar algo e ver "a criatura" o código "viva" rodando, é de um prazer incomensurável para um criador programador.

Além de ter a sensação de ser um "criador" [sim, como O Arquiteto do Matrix], programar é paixão, pois é um desafio. Um programador gosta de ter seus limites testados, de ser desafiado, colocar seus conhecimentos a prova para se gabar com seus amigos programadores e até quem não é [que poucas vezes entendem e dão valor].

Hoje em dia, mesmo com a comodidade dos codeblocks e como surgimento da raça de programadores "pedreiros", programar ainda desperta paixões profundas no nerd/geek interior e exterior de cada um de nós que vive no e do ecossistema de trabalhar com frias [porque são frias que elas tem calor pra gente!] e sedutoras máquinas.

Mas o ponto que eu realmente gostaria de chamar a atenção aqui são para os codeblocks dos programadores pedreiros, você se considera um programador pedreiro? Ou realmente é impossível de escapar de ser um, com toda essa pressão pela agilidade?
Ah, pouco me importa :D ou não...


(Ahhh, e sem falar da diversão que é ver aquela gambiarra funcionando, né?)

quinta-feira, 12 de setembro de 2013

Agendando tarefas com crontab

Em manutenções de sistemas e de sites, é preciso realizar tarefas de backup e checagem [ou outras tarefas] periodicamente. Todo sistema Linux vem com um programa chamado cron e ele serve justamente pra isso: Agendar tarefas e/ou executá-las com uma certa periodicidade

Para configurar uma crontab [crontab é o nome de uma configuração do cron] para um usuário [crontabs globais do sistema são criadas somente pelo usuário root, esse arquivo global é encontrado em /etc/crontab]. O crontab pode ser usado das seguintes formas:
crontab -e # Edita o crontab para o usuário atual
crontab -l # Lista as tarefas
crontab -r # Apaga a crontab do usuário


Vamos supor que você queira executar o comando echo "Você é demais!" todo dia às 8h:00min, então é só adicionar a seguinte linha depois de rodar crontab -e
0 8 * * * echo "Você é demais"

Agora, vamos entender como é a sintaxe de uso:
minuto hora dia_do_mes mes dia_da_semana programa_a_ser_executado
O * [asterisco] funciona como um caractere coringa e que quando utilizado ele pega toda a faixa de valores para cada parâmetro. Ainda existem mais caracteres especias com diferentes "poderes", por exemplo:
0,30 6,11 * * * echo "Hey, how is going your day?"
0,30 6-11 * * * echo "Relax, bro"
*/2 * * * * echo "Se passaram meia hora"
Vírgula (,): 0,30 quer dizer "aos 0min e 30min execute..."
Hífen (-): 6-11 quer dizer
Dica: Você também pode trocar o dia_da_semana [6o argumento] pelo usuário que executará a tarefa. Ex:

*/2 * * * * root rm -rf /tmp/*

A linha acima diz: "A cada 30 minutos execute o comando como root"

Pois é pessoal, esse é o basicão. Prometo que, quando der, vou aprofundar mais um pouco.

domingo, 8 de setembro de 2013

Engine de animação em JavaScript

function now(){
 return ( new Date ).getTime();
}
 
function animate( time, fn, fps ){
  var start = now(),
      intrval = fps ? 1000/fps : 20,

      id = setInterval(function(){
        var diff = now() - start, p = diff/time;
     
        if( p > 1 ) p = 1;
         fn( p );
        if( p == 1 ) clearInterval( id );
     
      }, intrval);
}
Acima um exemplo  de uma engine simples de animação em JavaScript. 
Simbora ver lá como funciona!
A priori você tem que entender o que é uma animação
O exemplo acima usa a melhor técnica (na minha opinião) de se animar algo, 
que é com porcentagem.
Suponhamos que você queira animar o width de uma div de 200px para 300px em 1 segundo. 
A animação se dá numa transição de 200px até 300px. Então vai ser assim:
width = 200 + (300 - 200) * p
Essa é a "fórmula mágica", onde p é a porcentagem definida por: p = ( now - start )/time [linha 9]
Onde now [veja a function now  - linha 1] representa o tempo agora, 
start o tempo no inicio da animação e time o tempo total em que a animação deverá ocorrer (por exemplo: 1000 milisegundos). 
O FPS [Frames Per Second] representa em que interval a função será chamada para 
atualizar o p [como o nome fps já é bem auto-explicativo, vou pular essa parte]
Quando p = 1 significa que a animação chegou ao fim, então só é preciso "desligar" o setInterval e fim!
Vamos testar a função animate no console:
  1. animate( 1000, function(p){
  2. console.log( p );
  3. });
Viu? Agora tente animar algo simples, por exemplo:
  1. var box = document.getElementById('box'), startWidth = 200, toWidth = 300;
  2. animate( 1000, function(p){
  3. box.style.width = startWidth + ( toWidth - startWidth ) * p;
  4. });
Espero que você tenha entendido tudo, caso não, pode comentar :D

sábado, 25 de maio de 2013

Entediado por não ter nada pra programar?

Tédio. Sem Desafios.
Com certeza um período chato na vida de todo programador é não ter nada para se divertir (é claro que eu tô falando de codificar ainda né). Se você, assim como eu, anda meio entediado aqui vai uma dica: Project Euler. Um site cheio de problemas matemáticos só a espera de você criar um código para solucioná-los. Tem problemas de todos os níveis para todos os tipos de tédio.

Good coding!

terça-feira, 5 de março de 2013

Uma dica

Se você está fazendo um script Ruby e de repente se depara com
syntax error, unexpected keyword_end, expecting $end
Não está sozinho! Lembro da vez que passei horas procurando o motivo da exception. Mas pra lhe ajudar, se for esse o seu caso, provavelmente foi um do que você esquece

require "sinatra"

get "/"
   ...
end

# correto


get "/" do
   ...
end


# Um exemplo de código que daria a exception acima


segunda-feira, 5 de novembro de 2012

Valores Complexos | JavaScript

  1. var arr1 = arr2 = [ ];
  2. arr1.push( 5 );
  3. console.log( arr2 );
No exemplo acima o log daria o output "[5]", isso porque ao alterar o Array arr1 o Array arr2 também é alterado. O mesmo vale para objetos:
  1. var obj1 = {}; 
  2. var obj2 = obj1;
  3. obj1.man = "Man!!!";
  4. console.log( obj2.man );
O output no console seria a mensagem "Man!!!".

Curioso pra saber porque isso ocorre? DON'T PANIC!

Primeiro de tudo, você deve entender como JavaScript armazena os valores das variáveis.
O Array e o Objeto diferem dos outros tipos por serem tratados como valores complexos ( WHAT?! ) e o que ocorre quando eu faço var arr1 = arr2 = [ ]; é que eu não estou copiando o valor de arr1 em arr2 e sim copiando para arr2 a referência da memória arr1, e assim ocorre com todos os demais valores complexos em JS. Então entenda: Valores complexos são armazenados e manipulados por referência de memória.

Os outros tipos, os primitivos, - Number, String, Boolean - são armazenados/copiados por valor mesmo. Nos próximos posts eu vou continuar explicando melhor como isso funciona :D

Espero que tenha entendido, qualquer dúvida ou sugestão será bem-vinda nos comentários.