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.