Elmord's Magic Valley

Software, lingüística, mitologia nórdica e rock'n'roll

Como evitar que Google, Facebook, Twitter e a NSA saibam por onde você anda na Web

2013-07-13 22:53 -0300. Tags: comp, web, privacy

Agora que é um fato público e conhecido que os dados que você entrega ao Google, Facebook e companhia não estão em boas mãos (e se você acha que está tudo bem, queira assistir um videozinho), pode ser uma boa você reduzir a quantidade de informação a que eles têm acesso.

E graças aos botões de "Curtir", "Tweet", "+1" e similares, bem como as propagandas do Google, o Google Analytics, e o uso extensivo do googleapis.com, essas empresas recebem informação suficiente para ter uma boa idéia de por onde você anda na Web, mesmo quando você está navegando páginas fora desses serviços, a menos que você tome os devidos cuidados.

Existe um bocado de addons que você pode instalar no Firefox para reduzir a possibilidade tracking. (Se você usa o Chrome, é mais fácil você começar a usar o Firefox). Neste post, listo alguns deles e explico como eles podem ser usados para esse fim.

AdBlock Plus

O AdBlock Plus é um addon bem conhecido cujo uso primário é bloquear propagandas. Por si só, isso já é um começo, pois evita que os servidores de propaganda possam trackeá-lo. Porém, o AdBlock pode ser usado para bloquear quaisquer itens indesejáveis de terceiros em páginas. Por exemplo, suponha que você deseja bloquear acessos de outras páginas para o Facebook (há maneiras mais convenientes de atingir esse objetivo, todavia):

  1. Vá a alguma página que faça acesso ao Facebook.
  2. Clique no ícone do AdBlock e selecione Open blockable items (ou Abrir itens bloqueáveis).

  3. Encontre algum dos acessos ao Facebook na lista e dê dois cliques sobre o mesmo.
  4. A janela que se abre apresentará várias possibilidades de regras de bloqueio. Selecione a mais apropriada (neste caso, facebook.net^; note que posteriormente você também deverá repetir o processo para o facebook.com).
  5. Clique no botão Advanced (ou Avançado). Este botão apresentará algumas opções adicionais à direita. Dentre elas, a mais útil é a Third-party only (ou Apenas terceiros); se marcada, essa opção impede o acesso ao facebook.net, exceto a partir do próprio facebook.net. Você pode achar isso útil se por algum diabo você ainda usa a rede social da NSA para se comunicar.

  6. Clique em Add filter (ou Adicionar filtro). Está feito!

Você pode bloquear outros sites (como facebook.com, twitter.com, google-analytics.com, scorecardresearch.com, etc.) da mesma maneira.

Por padrão, o AdBlock permite "ads não-intrusivos". Embora a idéia seja bem-intencionada, na prática isso significa que ele não bloqueia o Google por padrão, então é uma boa idéia desabilitar essa opção indo no menu do AdBlock, Filter preferences, primeira aba (Filter subscriptions), e desmarcar Allow some non-intrusive advertising.

Por padrão, o AdBlock faz atualizações automáticas da lista de sites a bloquear. Se você quiser evitar isso, abra o about:config, procure a opção extensions.adblockplus.subscriptions_autoupdate e dê dois cliques sobre ela para ajustá-la para false.

Disconnect

O Disconnect é um addon que já vem com uma lista padrão de sites de tracking conhecidos e bloqueia acessos aos mesmos a partir de sites de terceiros. Só descobri esse addon hoje, e como eu já uso o RequestPolicy, não cheguei a experimentá-lo direito, mas aparentemente ele funciona bem.

Smart Referer

Por padrão, sempre que o browser faz acesso a uma página a partir de outra (e.g., quando você clica em um link, ou quando uma página inclui uma imagem ou script de outra), o browser envia na requisição um header Referer, que diz qual é a proveniência do acesso (i.e., a página que continha o link ou a imagem ou script). O Smart Referer é um addon que faz com que o browser só envie esse header se a origem e o destino estiverem no mesmo domínio, o que impede o site de saber de onde você está vindo.

mencionei o Smart Referer antes por aqui, mas até recentemente não tinha me dado conta de quão importante ele é: uma quantidade enorme de sites usa serviços hospedados nos servidores do Google (jQuery, reCAPTCHA, Maps, entre outros), e por padrão, ao acessar esses serviços, o browser acaba informando ao Google pelo header Referer que página você está acessando. Com o Smart Referer, você evita enviar essa informação (a menos que o jQuery ou outro serviço se dê ao trabalho de enviar essa informação; pelo menos no caso do jQuery esse não parece ser o caso (ainda)).

O Smart Referer não exige configuração nenhuma, não adiciona ícone de toolbar nenhum, e faz o seu serviço quietinho sem incomodar ninguém.

HTTPS Everywhere

O HTTPS Everywhere é um addon mantido pela Electronic Frontier Foundation que traduz URLs HTTP de sites conhecidos para URLs HTTPS seguras. Por exemplo, toda vez que você acessa http://en.wikipedia.org, o addon substitui automaticamente a URL por https://en.wikipedia.org. Com isso, evita-se enviar informações não-encriptadas pela Web por descuido.

RequestPolicy

Um plugin que você pode achar útil é o RequestPolicy. Ele bloqueia todos os acessos de páginas a sites de terceiros por padrão (com exceção de uma pequena lista de acessos conhecidos, como por exemplo de wordpress.com para wp.com, e que você pode escolher na instalação), e permite adicionar exceções para sites individuais através de um ícone na barra de toolbars. O RequestPolicy é um dos plugins que melhor garante sua privacidade, às custas da inconveniência de ter que freqüentemente adicionar novas exceções para conseguir usar páginas. Ele também é útil para carregar páginas mais rápido em um 3G ou algum outro tipo de conexão lenta. Não recomendo muito para pessoas menos-que-paranóicas e que não vivam com uma conexão de 6kB/s, desde que você use alguma alternativa como o Disconnect.

Últimas observações

Uma lista de outros addons e serviços para assegurar melhor sua privacidade pode ser encontrada no PRISM Break.

Fugindo do assunto de addons, uma alternativa de serviço de e-mail para quem quer fugir do GMail é o SAPO, um provedor português. O SAPO Mail fornece 10GB de espaço e fica hospedado em Portugal, onde existe uma legislação decente de prote(c)ção de dados pessoais (dê uma olhada na política de privacidade dos camaradas).

2 comentários

Pidgin Off-the-Record

2013-06-07 21:33 -0300. Tags: comp, web, privacy

Acabei de descobrir um plugin chamado pidgin-otr (pacote pidgin-otr no Debian/Ubuntu), que permite realizar conversas encriptadas independentemente do protocolo de comunicação utilizado. O plugin funciona cifrando e decifrando mensagens individuais nos clientes, e transmitindo para o servidor o conteúdo cifrado como se fosse uma mensagem comum.

O plugin é bastante conveniente de usar. Para ativá-lo, basta instalar o pacote e habilitá-lo na janela de plugins do Pidgin (Tools > Plugins > Off-the-Record Messaging). A partir daí, as janelas de conversação apresentarão um ícone que permite iniciar uma conversa privada (desde que o outro usuário também possua o plugin). Pelo que eu entendi, uma vez que isso tenha sido feito para um usuário, conversas posteriores serão cifradas automaticamente por padrão.

Quem me contou foi o Reddit (em um post sobre a acesso da NSA a dados do Google, Apple, Facebook e diversas outras organizações estadunidenses).

3 comentários

fgetcsv: A cautionary tale

2013-05-18 01:52 -0300. Tags: comp, prog, web, php, rant

Quando eu reescrevi o blog system, eu resolvi manter o índice de posts em um arquivo CSV e usar as funções fgetcsv e fputcsv para manipulá-lo. Minha intuição prontamente me disse "isso é PHP, tu vai te ferrar", mas eu não lhe dei importância. Afinal, provavelmente seria mais eficiente usar essas funções do que ler uma linha inteira e usar a explode para separar os campos. (Sim, eu usei um txt ao invés de um SQLite. Eu sou feliz assim, ok?)

Na verdade o que eu queria era manter o arquivo como tab-separated values, de maneira que ele fosse o mais fácil possível de manipular com as ferramentas convencionais do Unix (cut, awk, etc.). As funções do PHP aceitam um delimitador como argumento, então pensei eu que bastaria mudar o delimitador para "\t" ao invés da vírgula e tudo estaria bem. Evidentemente eu estava errado: um dos argumentos da fputcsv é um "enclosure", um caractere que deve ser usado ao redor de valores que contêm espaços (ou outras situações? who knows?). O valor padrão para a enclosure é a aspa dupla. Acontece que a fputcsv exige uma enclosure: não é possível passar uma string vazia, ou NULL, por exemplo, para evitar que a função imprima uma enclosure em volta das strings que considerar dignas de serem envoltas. Lá se vai meu tab-separated file bonitinho. Mas ok, não é um problema fatal.

A segunda curiosidade é que a fgetcsv aceita um argumento "escape", que diz qual é o caractere de escape (\ por default). Evidentemente, você tem que usar um caractere de escape; a possibilidade de ler um arquivo em um formato em que todos os caracteres exceto o delimitador de campo e o "\n" tenham seus valores literais é inconcebível. Mas ok, podemos setar o escape para um caractere não-imprimível do ASCII (e.g., "\1") e esquecer da existência dele. Acontece que a fputcsv não aceita um caractere de escape, logo você não tem como usar o mesmo caractere não-imprimível nas duas funções. WTF?

Na verdade, agora testando melhor (já que a documentação não nos conta muita coisa), aparentemente a fputcsv nunca produz um caractere de escape: se o delimitador aparece em um dos campos, ele é duplicado na saída (i.e., a"b vira a""b). Evidentemente, não há como eliminar esse comportamento. Mas então o que será que faz o escape character da fgetcsv?

# php -r 'while ($a = fgetcsv(STDIN, 999, ",", "\"", "\\"))
             { var_export($a); echo "\n"; }'
a,z
array (
  0 => 'a',
  1 => 'z',
)
a\tb,z
array (
  0 => 'a\\tb',
  1 => 'z',
)

Ok, o escape não serve para introduzir seqüências do tipo \t. Talvez para remover o significado especial de outros caracteres?

a\,b,z
array (
  0 => 'a\\',
  1 => 'b',
  2 => 'z',
)
a b,z
array (
  0 => 'a b',
  1 => 'z',
)
a\ b,z
array (
  0 => 'a\\ b',
  1 => 'z',
)

Muito bem. Como vimos, o escape character serve para, hã... hmm.

Mas o fatal blow eu tive hoje, olhando a lista de todos os posts do blog e constatando que o post sobre o filme π estava aparecendo com o nome vazio. Eis que:

# php -r '
    $h = fopen("entryidx.entries", "r");
    while ($a = fgetcsv($h, 9999, "\t"))
       if ($a[0]=="20120322-pi") var_export($a);'
array (
  0 => '20120322-pi',
  1 => 'π',
  2 => '2012-03-22 23:53 -0300',
  3 => 'film',
)

# LC_ALL=C php -r '
    $h = fopen("entryidx.entries", "r");
    while ($a = fgetcsv($h, 9999, "\t"))
       if ($a[0]=="20120322-pi") var_export($a);'
array (
  0 => '20120322-pi',
  1 => '',
  2 => '2012-03-22 23:53 -0300',
  3 => 'film',
)

A próxima versão do Blognir deverá usar fgets/explode.

UPDATE: Aparentemente o problema só ocorre quando um caractere não-ASCII aparece no começo de um campo. Whut?

UPDATE 2:

"a b","c d"
array (
  0 => 'a b',
  1 => 'c d',
)
"a"b","c"d"
array (
  0 => 'ab"',
  1 => 'cd"',
)
"a\"b","c d"
array (
  0 => 'a\\"b',
  1 => 'c d',
)

5 comentários

Twitter via linha de comando

2013-05-07 14:27 -0300. Tags: comp, unix, web, about

Por falta de coisa mais interessante para fazer, e já que RSS não é exatamente a tecnologia da modinha, estou disponibilizando experimentalmente um feed do blog no Twitter. A continuidade do "serviço" está sujeita à existência de usuários. [Update: Pensando melhor, provavelmente todo o mundo que tem interesse em seguir blogs usa RSS. Enfim, o feed está aí, por enquanto.]

A parte interessante da história é que eu descobri um bocado de clientes de linha de comando do Twitter no processo. Dos que eu experimentei, o que melhor me satisfez foi o t. (Eu experimentei mais outros dois clientes: o TTYtter, um cliente interativo pra lá de bizarro, mas com mil features e aparentemente fácil de estender; e o twidge, que aparentemente não suporta UTF-8. Existem dúzias de outros clientes, como uma pesquisa no Google revela.)

Os poderes mágicos do t derivam do fato de ele ser particularmente conveniente de usar em scripts. Um exemplo extraído da documentação:

Favorite the last 10 tweets that mention you

t mentions -n 10 -l | awk '{print $1}' | xargs t favorite

É possível instalar o t pelo RubyGems, através do comando gem install t. Antes de instalá-lo, certifique-se de que você tem instalado o Ruby e o RubyGems (pacotes ruby, ruby-dev e rubygems no Debian/Ubuntu; não ter o ruby-dev é um problema comum).

Uma vez instalado, é necessário executar t authorize, para realizar o processo de registro da aplicação no Twitter e de autorização do acesso da aplicação à sua conta. Você pode executar t sem argumentos para ver uma lista dos comandos disponíveis. Para mais informações, dê uma olhada no README na página do projeto.

(Quem me contou foi essa página.)

4 comentários

To tweet or not to tweet

2013-04-07 22:41 -0300. Tags: life, comp, web, privacy

Dracula: "I'm all screwed"

Richter: "I am the instrument of your doom"

Dracula: "Perhaps not... not yet"

Richter: "What!?!?!"

???: "Richter! You killed my father! Prepare to die!"

Richter: "ALUCARD!!!"

Alucard: "You can't know... you'll never know how it feels..."

* TUM *

Richter: "NOOOOOOOO!"

– Castlevania, Hélio's edition

Há pouco mais de um ano eu abandonei o Twitter (well, not quite; eu só parei de postar lá, na verdade) por conta de eles terem vendido o acesso à base de tweets para umas empresinhas de mineração de dados. Há pelo menos metade desse tempo eu venho remoendo essa decisão.

Assumptions

Na época eu usava o Twitter com "tweets protegidos", i.e., apenas as pessoas que eu autorizei que me seguissem podiam ver os meus tweets. Eu assumia assim que apenas uns poucos conhecidos veriam o que eu estava postando.

Não é bem assim que a coisa funciona. Embora tweets protegidos não sejam retweetáveis, nada impede alguém capaz de ler um tweet de copiá-lo e retweetá-lo na mão. Retweets são uma feature fundamental do Twitter; não faz muito sentido contar com que algo postado no Twitter não vá ser retweetado. Proteger os tweets não melhora muito a situação.

Abandonemos, pois, a noção de que existe "publicidade seletiva" no Twitter: assumamos que "o que você diz no Twitter pode ser visto no mundo inteiro instantaneamente" (palavras dos termos de serviço, as it happens). E por "o mundo inteiro", leia-se o mundo inteiro. Na época da matrícula da UFRGS nesse ano eu vi alguns retweets da @ufrgsnoticias que provavelmente não estavam nos planos dos indivíduos retweetados e que eu fiquei cogitando comigo mesmo se não poderiam causar algum problema para os mesmos. Essa "falta de privacidade" é, me parece, uma propriedade fundamental do serviço Twitter, não um erro da companhia Twitter que o fornece. Assim (me parece), não faz sentido condenar o Twitter por esse tipo particular de falta de privacidade, mas tão-somente aprová-la ou não (e utilizar ou não o serviço de acordo).

(Essa falta de privacidade na verdade é uma propriedade compartilhada com blogs e páginas pessoais. No Twitter isso é um pouco mais acentuado pela facilidade de retweetar posts alheios, mas não é fantasticamente diferente. Essa "publicidade fundamental" é diferente do vazamento de informações pessoais para terceiros que não é fundamental para o serviço e não é do interesse do usuário. Mais sobre isso adiante.)

Ok, tweets são públicos. "Tweet privado" é praticamente uma contradição em termos. Aceitemos esse fato e tomemos por princípio que o Twitter só serve para postar coisas que não nos importamos de compartilhar com o mundo (e.g., links para coisas interessantes, recomendações de filmes/livros, etc.). Entendido isto, podemos seguir usando o Twitter com a consciência limpa.

Heh, não

Faltam dois problemas a considerar. O primeiro é o uso que se faz dessa informação além da mera publicação mundial. Isso inclui a venda ao acesso da base de tweets para as empresinhas de data mining, que foi a causa original do meu desgosto pelo Twitter.

Na verdade, o Twitter sempre vendeu o acesso a tweets, mesmo antes desse incidente; a diferença é apenas que o Twitter costumava limitar o acesso aos tweets dos últimos trinta dias. (O fato de que eles já brincavam de vender tweets antes não torna o ato de vender o acesso à base inteira nem mais nem menos ético, mas vamos adiante.)

O segundo problema são as outras informações que caem nas mãos do Twitter além dos tweets, e que uso o Twitter faz delas. Vamos por partes.

A miserable little pile of non-secrets

Pois, o Twitter vende, e sempre vendeu, o acesso a (porções da) base de tweets. Esses tweets são públicos para início de conversa*. A diferença entre baixá-los você mesmo e comprar o acesso é que as APIs do Twitter impõem certos limites na busca de tweets (e.g., aparentemente existe um limite de 1500 tweets nos resultados de buscas por termos), e que provavelmente a base é oferecida em um formato mais conveniente de manipular. (* Tweets protegidos são outra história. Eles vivem em um limbo questionável: a política de privacidade jamais menciona "tweets protegidos", então pelo menos para mim não está claro se eles são considerados informação pública (e conseqüentemente comercializável), ou se estão inclusos entre os dados pessoais que o Twitter diz não vender (o que não impede que o Twitter seja comprado e com ele seus dados, but I digress).)

A possibilidade de data mining, assim, pode aumentar com o fato de que o acesso à base de tweets é comercializado, mas ela não deixa de existir sem essa comercialização. Na verdade, a Internet inteira é alvo de data mining. Google (a organização) e outros mecanismos de busca já podem facilmente explorar toda informação pública na Internet, independentemente do seu consentimento. A diferença de postar no Twitter é facilitar a vida do Twitter e parceiros, mas postar em qualquer outro local público da web (como o identi.ca, ou seu blog pessoal) tem o mesmo risco.

É uma propriedade da Internet que toda informação pública é (em geral) facilmente acessível. Uma conseqüência disso é que coisas que antes eram muito difíceis (e.g., catar todas as notícias sobre um certo tópico ou pessoa nos jornais dos últimos N anos) agora são viáveis, e, junto com todas as vantagens que isso proporciona, vêm certas conseqüências negativas para a privacidade das pessoas. A sociedade vai ter que dar um jeito de se adaptar a isso, mas não é um problema do qual se possa escapar trocando o serviço em que essas informações serão publicadas (assumindo que se pretenda publicar essas informações para quem quer que as queira ler).

Fica a questão de se é ok o Twitter ganhar dinheiros vendendo acesso aos meus posts sem me pagar nada. Essa questão é sugerida como um exercício para o leitor.

The actual secrets

O segundo problema são os outros dados além dos tweets. Esses dados podem ser divididos em duas classes: os dados "inevitáveis", i.e., aqueles que o Twitter necessariamente obtém a partir do uso do serviço; e os dados "evitáveis", i.e., aqueles que você pode evitar mandar com um pouco de cuidado.

Os dados inevitáveis incluem:

Os dados evitáveis incluem:

Fica a questão de se é "certo" usar um serviço que coleta dados que você acha que ele não deveria coletar só porque você consegue burlar a coleta. A resposta depende de quão idealista você está se sentindo hoje.

Outros comentários

Uma desvantagem de usar um serviço centralizado para publicação de informações (e.g., Twitter, Blogger, Wordpress, Facebook (ok, o Facebook tem inúmeros outros problemas, but I digress)) é que os "dados inevitáveis", tais como logs de acesso, ficam concentrados com uma única organização. Mesmo na arquitetura atual da Internet, em que acessar um serviço implica contar-lhe onde você está e possivelmente outros dados, a situação não é tão ruim se os dados estão espalhados entre vários servidores, o que dificulta sua exploração. (Seu provedor de acesso continua com um bocado de informação, entretanto.)

Por outro lado, uma rede social é mais útil quando um grande número de pessoas a usa; essa é uma vantagem de "todo o mundo" usar o Twitter, ao invés de cada um "roll their own" microblog. Porém, em teoria nada impede que cada um rolle seu own microblog e todos funcionem de maneira integrada, desde que eles usem um protocolo comum de comunicação.

µ.

Conclusão

A conclusão é que talvez eu volte a usar o Twitter no futuro próximo. Ou não.

3 comentários

The tableless table

2013-03-01 23:13 -0300. Tags: comp, web

[Pintura de Hasegawa Tōhaku de um mestre zen prestes a cortar um gato em dois]
Mumon, membro do CSS Working Group

Uma rápida inspeção do código-fonte atual (mas em vias de mudar) das páginas do ~vbuaraujo revelará que eu tenho (ou tinha) o costume questionável de usar TABLEs para layout mais ou menos shamelessly. Meus motivos para isso eram:

De qualquer forma, essa tabela do blog andava me incomodando, em parte porque uma das coisas que eu mais gosto do CSS é a possibilidade de desabilitá-lo (View > Page Style > No Style no Firefox) e ler as páginas como as seqüências de texto que Deus quis que elas fossem, coisa que não é possível quando a página usa TABLEs.*

Recentemente eu descobri uma maravilha do CSS 2.1: é possível usar CSS para instruir o browser a renderizar elementos quaisquer (e.g., DIVs) como tabelas, linhas, células, etc. Assim, migrar de um layout baseado em TABLEs para um baseado em DIVs + CSS é trivial:

<!-- Exemplo com CSS inline; normalmente a coisa decente a se fazer
     é dar IDs aos elementos e estilizá-los com um arquivo CSS externo. -->

<H1>Título</H1>

<DIV STYLE="display: table; width: 100%; table-layout: fixed">
    <DIV STYLE="display: table-row">
        <DIV STYLE="display: table-cell; width: 75%">
            <P>coluna 1
        </DIV>
        <DIV STYLE="display: table-cell: width: 25%">
            <P>coluna 2
        </DIV>
    </DIV>
</DIV>

<P>Rodapé.

No caso de uma tabela com uma única linha, a DIV com display: table-row (equivalente a um <TR>) não é estritamente necessária; o browser cria uma "linha anônima" para conter as células. A propriedade table-layout: fixed indica que a largura das colunas é fixa; o padrão é auto, que permite que a largura das colunas seja reajustada de acordo com o conteúdo das células. Há outros valores possíveis para display relacionados a tabelas; para mais informações, consulte o standard.

_____

* Normalmente eu faço isso quando estou usando uma tela pequena e quero dar zoom em uma página sem que ela transborde para fora da janela ou que uma barra lateral cresça junto com o texto e coma espaço útil da tela.

Comentários

Fun with CSS (not)

2013-01-06 21:20 -0200. Tags: comp, web

HTML segue sendo minha maneira preferida de editar texto formatado desde 1927. (Houve um tempo, antes de entrar para a CIC, em que eu fazia trabalhos de aula em HTML e depois copiava e colava do browser no Word para imprimir.) Entretanto, esse tal de CSS e seu box model às vezes me decepcionam.

No penúltimo post, eu resolvi colocar uma imagem à esquerda do texto, de modo que o texto seguisse normalmente no espaço vazio à direita da imagem. Trabalho para um elemento floated. Coisa simples, não? Acontece que por três pequenos acasos essa tarefa foi menos trivial do que parecia ser.

Primeira tentativa

O primeiro passo foi adicionar a figurinha com a propriedade float: left e olhar no browser o resultado. Como eu ainda não tinha escrito o resto do texto do post, o que aconteceu é que o link de comentários e o post seguinte ficaram arranjados ao lado da imagem. Embora o problema fosse desaparecer assim que eu continuasse a adicionar texto, por uma questão de princípios eu resolvi garantir que o conteúdo de um post ficaria isolado do post seguinte independentemente de quanto texto houvesse no post. A primeira coisa que eu tentei foi colocar um <DIV> em volta do post inteiro. Isso não resolve o problema: o elemento floated não conta no tamanho da DIV por padrão, e a DIV termina antes da figura. A solução que eu encontrei nas Internets (e que não vou me dar ao trabalho de vasculhar no histórico para descobrir onde achei) foi dar a propriedade overflow: hidden para a DIV que engloba o post. Não, a definição oficial da propriedade overflow: hidden não é essa. Anyway. Primeiro problema resolvido.

Segunda tentativa

Por um acaso infernal, a primeira coisa ao lado da imagem, depois de um subtítulo, era um BLOCKQUOTE. O comportamento normal do BLOCKQUOTE é deixar uma margem à esquerda, indentando o texto citado. Porém, o CSS resolveu calcular a margem a partir da esquerda da DIV do post, ignorando a existência da imagem floated. Como a margem era menor que a largura da imagem, ela era simplesmente desprezada. O mesmo problema acontece com listas (com o bônus de que as bullets de uma lista são posicionadas no espaço da margem por padrão, e conseqüentemente aparecem por cima da imagem).

Não achei uma solução decente para isso. A solução indecente foi:

Agora está tudo certo, certo?

Terceira tentativa

Bem, não. Por outro acaso infernal, a imagem era um link. Lembra do nosso BLOCKQUOTE com margem maluca? Pois a margem maluca invisível agora fica sobreposta à imagem, e com isso o trecho de imagem que fica ao lado do BLOCKQUOTE não é clicável. Tentei tacar z-index na imagem e no BLOCKQUOTE para mudar a ordem de sobreposição. Nada.

Acontece que:

Ou seja, quando eu taquei um position: relative; left: 24px no BLOCKQUOTE, ele passou a ser empilhado sobre a imagem floated, com margem e tudo. A solução, portanto, é tacar um position: relative; z-index: 10 na imagem, para valores arbitrários de 10 (e um z-index: 0 no BLOCKQUOTE por via das dúvidas).

Agora tudo funciona. Certo?

4 comentários

Facebook stalks you

2012-01-05 23:49 -0200. Tags: comp, web, privacy

Que o Facebook não tem respeito nenhum pela privacidade dos seus usuários não é nenhuma novidade. Porém, os meios de que ele se utiliza para obter dados ainda me surpreendem.

Como bom nerd, eu tenho o costume de olhar os logs de acesso do blog para ver em que páginas as pessoas têm caído. Ontem eu notei uma seqüência de acessos interessante:

Data: 2013-01-04 01:50:01 -0200
IP: (removido)
URL: /~vbuaraujo/blog/?entry=20120820-xmodmap
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.97 Safari/537.11
Referer: http://www.facebook.com/l.php?u=http%3A%2F%2Finf.ufrgs.br%2F~vbuaraujo%2Fblog%2F%3Fentry%3D20120820-xmodmap&h=VAQEHMeNj

Data: 2013-01-04 01:50:01 -0200
IP: 66.220.158.114
URL: /~vbuaraujo/blog/?entry=20120820-xmodmap
User-Agent: facebookexternalhit/1.1 (+http://www.facebook.com/externalhit_uatext.php)
Referer: (vazio)

Isto é:

  1. Usuário abre um link via Facebook;
  2. Logo depois o Facebook requisita a página para olhar.

O link contido na string de User-Agent do bot do Facebook tem o seguinte a dizer:

Why does Facebook appear in my server logs?

Facebook allows its users to send links to interesting web content to other Facebook users. Part of how this works on the Facebook system involves the temporary display of certain images or details related to the web content, such as the title of the webpage or the embed tag of a video. Our system retrieves this information only after a user provides us with a link. You may have found this page because a Facebook user sent a link from your website to other Facebook users. If you have any questions or concerns about any links or content sent by one of our users, please contact us at legal@facebook.com.

Parece útil, não? Parece quase uma razão legítima para stalkear o usuário (heh). Acontece, entretanto, que os acessos do facebookexternalhit normalmente ocorrem menos de um segundo depois que um usuário clica em um link, não quando o link é submetido. Não tenho conta no Facebook, e portanto não tenho como testar melhor isso; estou me guiando pelos acessos do facebookexternalhit nos logs. (Para minha surpresa, o bot já tinha visitado o blog algumas vezes antes. Nunca tinha descoberto porque os acessos foram ao famoso post sobre os horários dos TM{1,2,3}, que eu filtro dos logs para visualizar, já que ele é responsável pela grande maioria dos acessos.) Porém, nem sempre os dois acessos aparecem juntos, então não sei exatamente qual é o princípio por trás disso.

2 comentários

Proxy Auto-Config

2012-11-14 01:24 -0200. Tags: comp, web, mundane

Problema: fazer o browser usar um servidor proxy para apenas alguns sites.

Solução: Existe uma tecnologia de última geração inventada pela Netscape em 1996 chamada Proxy Auto-Config (PAC). A idéia é mui simples e bella: escreve-se um arquivo JavaScript definindo uma função FindProxyForURL(url, host). Essa função recebe a URL e o hostname da página que o browser está tentando acessar, e retorna uma string especificando como o acesso deverá ocorrer:

A esse script estão disponíveis algumas funções para manipulação de URLs e hostnames, além das funções normais do JavaScript.

No meu caso, o objetivo é acessar o portal da ACM através do proxy do Instituto de Informática, para poder baixar papers, e usar uma conexão direta para todos os outros sites. O arquivo PAC fica algo como:

function FindProxyForURL(url, host) {
    if (dnsDomainIs(host, "dl.acm.org"))
        return "PROXY 127.0.0.1:3128";
    else
        return "DIRECT";
}

De posse do arquivo PAC, basta configurar o browser para usá-lo. No Firefox, selecione Preferences > Advanced > Network > (Connection) Settings... > Automatic proxy configuration URL, e insira a URL para o arquivo (no caso de um arquivo local, algo como file:///caminho/do/arquivo.pac).

Note que você poderia escrever um script para substituir esse arquivo automaticamente de acordo com a presença de servidor(es) proxy, ou apontar a URL para um script CGI/PHP/whatever em um servidor HTTP para gerar a configuração de proxy dinamicamente.

Quem me contou foi esse povo.

1 comentário

The woes of Firefox

2012-07-18 17:43 -0300. Tags: comp, web, mundane

Seguindo a aparente trend no mundo das interfaces gráficas para GNU/Linux, algumas das novas "features" do Firefox e seus addons só são configuráveis via propriedades no about:config. Eis uma relação das que me foram necessárias.

Itens úteis nessa vida de 3G:

Outros:

Provavelmente vou adicionar coisas a esse post no futuro.

3 comentários

Main menu

Posts recentes

Tags

comp (72) unix (27) life (27) prog (26) random (22) lang (19) about (18) mundane (18) mind (14) web (13) rant (11) img (10) privacy (8) ramble (7) bash (7) esperanto (7) conlang (5) pldesign (5) home (4) misc (4) freedom (4) book (4) lisp (4) copyright (4) academia (3) kbd (3) film (3) music (3) politics (3) security (3) poem (2) editor (2) network (2) worldly (2) android (2) physics (2) c (2) php (2) cook (2) wrong (2) mestrado (2) pointless (1) audio (1) perl (1) shell (1) kindle (1)

Elsewhere

Quod vide


Copyright © 2012-2014 Vítor Bujés Ubatuba De Araújo
O conteúdo deste site, a menos que de outra forma especificado, pode ser utilizado livremente, com ou sem alterações, desde que seja mencionado o autor, preferivelmente com a URL do documento original.

Powered by Blognir.