All work and no play makes Jack a dull boy

sexta-feira, 28 de novembro de 2014

resolver o “Unsupported” no Chrome on iOS

Como resolver o “Unsupported” no Chrome on iOS (específicamente usando Facebook OAuth)?

Embora há quem possa se opor a essa solução, foi a que funcionou para mim:
if( navigator.userAgent.match('CriOS') )
    window.open('https://www.facebook.com/dialog/oauth?client_id='+appID+'&redirect_uri='+ document.location.href +'&scope=email,public_profile', '', null);
else
    FB.login(null, {scope: 'email,public_profile'})

=]

quinta-feira, 27 de novembro de 2014

identificar windows phone com javascript

Eis uma forma simples de verificar se é Windows Phone.

if (/windows phone|lumia/i.test(navigator.userAgent.toLowerCase())) {
// faça suas coisas aqui
}

=]

quinta-feira, 20 de novembro de 2014

verificar se está em iframe ou app do Facebook

Se você tem sua página no Facebook tanto por iframe ou como app, saiba como fazer para verificar, com javascript se o acesso é feito via Facebook.

Se for por iframe:
if (window.name.indexOf('iframe_canvas_fb') >= 0){
 // no Facebook
}
Se for por app:
if (window.name.indexOf('app_runner_fb') >= 0){
 // no Facebook
}

be happy

=]

quarta-feira, 19 de novembro de 2014

parsear parâmetro GET com javascript

Como parsear o que vem após o '?' na url usando javascript?

Tem uma função bem básica que ajuda nisso:
function getQueryVariable(variable) {
    var query = window.location.search.substring(1);
    var vars = query.split('&');
    for (var i = 0; i < vars.length; i++) {
        var pair = vars[i].split('=');
        if (decodeURIComponent(pair[0]) == variable) {
            return decodeURIComponent(pair[1]);
        }
    }
    console.log('Variável da query %s nao encontrada', variable);
}
Agora veja se deu certo botando sua url assim:
"http://sua_url_assim/?codigo=xablau
console.log(getQueryVariable('codigo'));
O retorno esperado é xablau

Fonte

quinta-feira, 13 de novembro de 2014

Lista de uma lista de tuplas

Para criar uma lista a partir de uma lista de tuplas com python?

Dada a lista de tuplas:
>> lista_tuplas = [('a', 'b', 'c'), ('d', 'e', 'f'), ('g', 'h', 'i')]

Faça
>> list(''.join(''.join(x) for x in lista_tuplas))
>> ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i']


terça-feira, 11 de novembro de 2014

AND, OR e NOT com Django Haystack


Não, o  django.db.models.Q  não funciona ao buscar usando o haystack com  SearchQuerySet(). O haystack oferece sua própria versão para usar com o filter().

Eis o exemplo da documentação oficial:
from haystack.query import SQ

# We want "title: Foo AND (tags:bar OR tags:moof)"
sqs = SearchQuerySet().filter(title='Foo').filter(SQ(tags='bar') | SQ(tags='moof'))

Funciona "like a charm".


sexta-feira, 7 de novembro de 2014

Descobrir ip local com python

Como saber qual seu ip local com python?
>> import socket
>> socket.gethostbyname(socket.gethostname())
Segundo a documentação do python, o módulo socket:
Esse módulo provê acesso à interface do socket BSD. Está disponível em todos os sistemas Unix modernos, Windows, Mac OS X, BeOS, OS/2, e provavelmente plataformas adicionais.
=]

quinta-feira, 6 de novembro de 2014

parsear pdf com javascript? PDF.js


Sim, é isso mesmo! O que é? A autodefinição diz:
Uma plataforma baseada em web-standards para parsear e renderizar PDFs
Essa belezura é mais uma obra do povo Mozilla.

PDF.js _ site | github

=]

quarta-feira, 5 de novembro de 2014

juntar querysets

Como combinar ou como mesclar querysets (2 ou mais) em apenas um elemento?
from itertools import chain
lista_final = list(chain(primeira_queryset, segunda_queryset))
Usar o método chain do itertools é mais rápido do que fazer um loop em cada um e apendar em outra lista. Por que ele é mais rápido? Como quase tudo em python, se há um método que faz mais rápido, muito provavelmente é por ter sido implementado em C. Não é diferente aqui, é mais rápido por ser implementado em C.

Agora, caso você queira que a lista final tenha um ordem comum às querysets, você pode trabalhar com uma lambda dentro de um sorted() combinada ao chain().
lista_final = sorted(
    chain(primeira_queryset, segunda_queryset),
    key=lambda instance: instance.data_criacao)

Se você está com Python 2.4 ou superior, usar attrgetter como alternativa ao uso de lambda.
from operator import attrgetter
lista_final = sorted(
    chain(primeira_queryset, segunda_queryset),
    key=attrgetter('data_criacao'))

fonte

terça-feira, 4 de novembro de 2014

Trocar editor de texto default do crontab

Como trocar o editor default do crontab?

Segue com o exemplo de trocar do nano para usar o vim.
CentOS
$ export VISUAL=vim

Ubuntu
$ export EDITOR=vim

Mas se for a primeira vez que você tente editar o crontab, a saída poderá ser assim:
$ crontab -e
no crontab for jonatascd - using an empty one

Select an editor.  To change later, run 'select-editor'.

  1. /bin/ed
  2. /bin/nano       <---- easiest
  3. /usr/bin/vim/tiny

Choose 1-3 [2]:

Com um simples 'Enter' você confirma que usará o nano, ou digite um número para indicar sua opção.

=]

segunda-feira, 3 de novembro de 2014

Parseando url com javascript

Existe um truque excelente para parsear urls com javascript, que foi apresentado por John Long no Github. Essa técnica funciona bem, mas com o uso da propriedade search seria um uma query string. Isto não é muito útil caso você precise acessar certas variáveis. Assim,  a seguinte função expande esse paradigma, provendo uma propriedade adicional num objeto baseado na query string original.
function parseURL(url) {

    var parser = document.createElement('a'),

        searchObject = {},

        queries, split, i;

    // Let the browser do the work

    parser.href = url;

    // Convert query string to object

    queries = parser.search.replace(/^\?/, '').split('&');

    for( i = 0; i < queries.length; i++ ) {

        split = queries[i].split('=');

        searchObject[split[0]] = split[1];

    }

    return {

        protocol: parser.protocol,

        host: parser.host,

        hostname: parser.hostname,

        port: parser.port,

        pathname: parser.pathname,

        search: parser.search,

        searchObject: searchObject,

        hash: parser.hash

    };

}
Fonte.

quinta-feira, 30 de outubro de 2014

elasticsearch port


Para assegurar, garantir a porta na qual o elasticsearch está rodando, é preciso descomentar (ou alterar) duas linhas do arquivo de configuração.
#network.host: 127.0.0.1
e
#http.port: 9200

No meu caso (instalado no Mac com gem), o arquivo de configuração estava em:
/usr/local/Cellar/elasticsearch/1.2.1/config/elasticsearch.yml

terça-feira, 21 de outubro de 2014

Onde chove

Utilidade pública no ar!

Projeto de conclusão de curso de 2 alunos da UFRJ, Onde Chove mostra os pontos da cidade do Rio que estão chovendo.

Tenho usado com alguma frequência nas últimas semanas para ver qual rota farei de moto até o trabalho.

Recomendadíssimo.

http://www.ondechove.com.br/

domingo, 19 de outubro de 2014

Alfred não morreu



Uma das novidades do Yosemite é que o Spotlight teve um upgrade nas suas funcionalidades e ficou mais esperto. Algumas pessoas (eu inclusive) chegaram a pensar que, com as novidades ele poderia matar o Alfred.
Novo spotlight
Lembrando que a proposta do Alfred é ajudar na produtividade. Como vantagem você ainda pode desligar, reiniciar, e botar o computador para dormir; quanto ao Finder além de buscar arquivos de uma forma (mesmo que visualmente) mais interessante, você também esvazia a lixeira com um comando. Fazer buscas na web, histórico do clipboard, favoritos, interação com o Terminal e por ai vai.

Qual a graça de fazer coisas por um app que você pode fazer com uns 2,3 cliques? Bem, algumas pessoas são mais chegadas a usar mouse/trackpad o mínimo possível, ou melhor, preferem fazer o máximo de operações sem ter que mover as mãos para fora do teclado - e nisso está uma das principais vantagens do Alfred.

Eu sei que há antecessores e alternativas ao Alfred, mas para mim, por hora:
Long live Alfred

quinta-feira, 16 de outubro de 2014

Macbook demorando a acordar

Você chega no escritório, num café, na casa de amigos ou na própria casa, resolve abrir seu macbook para mostrar ou ver algo e tem que esperar um bom tempo para que ele enfim volte à vida?

É uma reclamação comum, mas é algo que acontece em função de um mecanismo de proteção da vida da bateria.

Antes de alterar é bom descobrir qual é a configuração atual e entender as opções de configuração.
$ pmset -g | grep hibernatemode
$ hibernatemode  3

Agora que sabemos o valor, vamos à lista de referência dos valores:
  • 0 - Sleep mode das antigas, com RAM ainda ligado mesmo dormindo, hibernação segura desabilitada e acorda rápido.
  • 1 - Modo de hibernação com o conteúdo da RAM escrito em disco, o sistema totalmente desligado enquanto "dorme", mais lento para acordar já que precisa ler o conteúdo da RAM  no disco
  • 3 - Modo padrão das máquinas a partir de 2005. O RAM permanece ligado enquanto dorme, mas o conteúdo da RAM também é escrito em disco antes de apagar. Em caso de perder totalmente a carga da bateria, o sistema entra em hibernação automaticamente
  • 5 - Mesmo que o modo 1, mas é para aqueles que usam secure virtual memory
  • 7 - Mesmo que o modo 3, mas é para aqueles que usam secure virtual memory
Já que estamos devidamente apresentados às alternativas, vamos alterar:
$ sudo pmset -a hibernatemode 0

Se você, como eu, estava com modo 3 ou 7 então ainda há um "plus a mais":  você liberar um pouco de espaço no seu disco. Para esses modos há um arquivo com a imagem criada antes de dormir. No meu caso era um arquivo de 1.07GB - se você está num SSD, por exemplo, isso significa ainda mais, certo?
$ sudo rm /var/vm/sleepimage

Aviso: o parâmetro "-a" significa que esse configuração se aplicará a quando a máquina estiver tanto no carregador quanto na bateria. Se usar "-b" será apenas quando estiver na bateria e "-c" quando estiver apenas no carregador.

Fontes:
Set newer portable Macs' sleep mode
128GB SSD and 23GB of sleep image + swap file, what to do?

quarta-feira, 15 de outubro de 2014

Selecionar várias linhas no PyCharm

Dica simples e rápida para você que, talvez, esteja vindo do Sublime para o PyCharm e ainda está descobrindo esse novo mundo.

Para fazer múltipla seleção de linhas no PyCharm é simples:

Alt + clique


=]

sábado, 6 de setembro de 2014

Quebra de linha no Facebook

Bem curta essa.

Ao compartilhar um post no Facebook via SDK, Api, script e etc, para que suas quebras de linhas funcionem use:
\r\n\r\n

Nem tente, por exemplo, usar <br />. O Facebook escapará os caracteres.

f-o-i: fui

quinta-feira, 4 de setembro de 2014

Rodar elasticsearch ao ligar o Mac

Quer saber como faz para o elasticsearch rodar ao dar boot no seu Mac OS X? É tranquilo, caso você tenha sido sensato para instalar pelo homebrew.
$ ln -sfv /usr/local/opt/elasticsearch/*.plist ~/Library/LaunchAgents

;)
Fonte

quarta-feira, 3 de setembro de 2014

Corrigir “iptables: command not found” error no CentOS 5

Se ao tentar rodar o comando iptables, seu Cent OS 5.x diz que ele não existe, basta adicioná-lo ao PATH no seu arquivo bash_profile.

$ vi ~/.bash_profile

Adicione a pasta /sbin ao PATH:
- procure a seguinte linha:
PATH=$PATH:$HOME/bin
- altere para
PATH=$PATH:$HOME/bin:/sbin

Salve, feche e recarregue o arquivo:
$ source ~/.bash_profile

Pronto
Fonte

terça-feira, 2 de setembro de 2014

Ordenando no Django a partir de uma property

Calma, não enlouqueci!
Todos sabemos que ao atribuir uma referência no order_by do ORM do Django, na verdade, ele irá gerar uma query com o campo pedido na cláusula ORDER BY do Mysql, por exemplo.

Apesar de, na maioria das vezes, as properties envolverem alguma query, não chega a ser um coluna no banco de dados. Então como ordenar por ela?

E lá vamos nós:
class Autor(models.Model):
    primeiro_nome = models.CharField(max_length=30)
    sobrenome = models.CharField(max_length=40)
    email = models.EmailField(blank=True, verbose_name='e-mail')

    def _nome_completo(self):
        return u'%s %s' % (self. primeiro_nome, self. sobrenome)    nome_completo = property(_nome_completo)
    def __unicode__(self):
        return self.nome_completo

sorted(Autor.objects.all(), key=lambda a: a.nome_completo)
Seja feliz!

Fonte