Escrito por Helio Loureiro
Categoria:

Após as partes 1 e 2 sobre como escrever uma aplicação com python-twitter, onde foi visto como instalar o pacote python-twitter ou via fonte ou via pacote Debian, e como registrar sua aplicação no Twitter, finalmente chegamos ao final: escrevendo a aplicação em python.

O objetivo de toda essa série de descrição de como utilizar uma aplicação de twitter-python era mostrar como fiz um script para automatizar o #FF, enviado às sexta-feiras.  

Inicialmente escrevi o seguinte script que fazia exatamente o #FF para todos os meus seguidores:

#! /usr/bin/python
import twitter

# App python-tweeter
# https://dev.twitter.com/apps/815176
api = twitter.Api(
    consumer_key = 'xxxxxxx',
    consumer_secret = 'yyyyyyyy',
    access_token_key = 'zzzzzzz',
    access_token_secret = 'zzzzzzzz'
    )
FOLLOWERS = []
users = api.GetFollowers()
for u in users:
        sc_name = str(u.screen_name)
        FOLLOWERS.append(['@' + sc_name])

SIZE = 140
MSG = "#FF"
i = 1
api.PostUpdate("Automated python-twitter-#FF mode=on")
for uid in FOLLOWERS:
    print i, uid
    if ( len(MSG + " " + uid) > SIZE):
        print MSG
        api.PostUpdate(MSG)
        sleep(60)
        MSG = "#FF " + uid
    else:
        MSG += " " + uid
    i += 1

print MSG
api.PostUpdate(MSG)

Esse pequeno script mostrou uma limitação do uso do python-twitter 0.8.1: a lista de usuários era buscada somente com os último 100 seguidores.  O demais não retornavam.  Eu corrigi esse comportamento e lançei o "0.8.2", mas na verdade ainda não foi aprovado.

Basicamente o módulo twitter, ou classe, permite buscar todos os seguidores com o método GetFollowers().  Cada seguidor retornado volta como uma matriz (array) de seguidores, com seus parâmetros como atributo do objeto retornado.  Então como exemplo um dos meus seguidores:

>>> print users[0]
{"description": "Expert in software development, photographer, open networker, 
 writer, handyman, old DJ+radiohost, idealist, creative, easily inspired, 
 very independent, spunky", 
"favourites_count": 44, 
"followers_count": 27800, 
"friends_count": 30580, 
"geo_enabled": true, 
"id": 5377742, 
"location": "Copenhagen, Denmark", 
"name": "J\u00f8rgen Larsen", 
"profile_background_color": "000000", 
"profile_background_tile": true, 
"profile_image_url": 
 "http://a0.twimg.com/profile_images/728474665/J_rgen_Larsen_org_nobackground_small_128x128_normal.png", 
"profile_link_color": "000000", 
"profile_sidebar_fill_color": 
 "http://a1.twimg.com/profile_background_images/78764489/background3.jpg", 
"profile_text_color": "333333", 
"protected": false, 
"screen_name": "porcupinex", 
"status": {"created_at": "Fri Apr 01 06:36:13 +0000 2011", 
    "favorited": false, 
    "id": 53707220474544128, 
    "source": "HootSuite", 
    "text": "RT @renejsum: RT @tinybuddha \"We must accept finite disappointment, but never lose infinite hope.\"
        ~Martin Luther King Jr. (Til @jesperdahl)", 
    "truncated": false}, 
"statuses_count": 1500, 
"time_zone": "Copenhagen", 
"url": "http://on.fb.me/porcupinex", 
"utc_offset": 3600}

chamando cada user[] como follower (for follower in user:), é possível verificar seus atributos usando algo como follower.url, follow.screen_name e assim por diante.  Em geral o que se vê no twitter é no formato @helioloureiro, que é uma referência ao atributo screen_name, esse sem o "@" originalmente.

Para publicar algo usando python-twitter, basta utilizar o método PostUpdate()

 

api.PostUpdate("Testando via twitter...")

Tudo isso já estaria de bom tamanho se não fossem duas coisas: o @ale_borba reclamou do flood de #FFs e realmente eu não queria mandar #FF para todo mundo, mas somente para quem realmente participa no Twitter.  Como eu tenho a política de seguir de volta quem me segue, tem muitos "robôs" que eu gostaria de evitar.  Então resolvi criar um grupo "amigos" e buscar somente os seguidores desse grupo:

 

Acabei escrevendo a busca de seguidores por grupo sem utlizar a API do python-twitter, com urllib2 e json:

 

lstname = 'Amigos'
AMIGOS = []
NOMES = {}
FOLLOWERS = {}
parameters = {}
parameters['cursor'] = -1
ic = 0
while (parameters['cursor'] != 0):
    url = '%s/%s/%s/members.json' % (api.base_url, user,lstname)
    
    json = api._FetchUrl(url, parameters=parameters)
    data = simplejson.loads(json)
    for u in data['users']:
        AMIGOS.append(u)
    parameters['cursor'] = int(data['next_cursor_str'])

    if (ic == 10): break
    ic += 1

Para evitar ainda um flood de mensagens (ou trollada), inclui ainda um randrange() pra criar uma aleatoriedade nos #FFs.  Comecei com 50%, mas aumentei pra 33% (1/3).  Também adicionei um belo sleep() para evitar o envio massivo de #FF, tornando um pouco mais suave as indicações.

O código final que utilizo atualmente é esse:

#! /usr/bin/python
import twitter
from time import sleep
from sys import exit
import simplejson
from random import randrange

# App python-tweeter
# https://dev.twitter.com/apps/815176
api = twitter.Api(
    consumer_key = 'xxxxxx',
    consumer_secret = 'yyyyyy',
    access_token_key = 'zzzzzzz',
    access_token_secret = 'kkkkkkkk'
    )

user = 'helioloureiro'
lstname = 'Amigos'
AMIGOS = []
NOMES = {}
FOLLOWERS = {}
parameters = {}
parameters['cursor'] = -1
ic = 0
while (parameters['cursor'] != 0):
    url = '%s/%s/%s/members.json' % (api.base_url, user,lstname)
    
    json = api._FetchUrl(url, parameters=parameters)
    data = simplejson.loads(json)
    for u in data['users']:
        AMIGOS.append(u)
    parameters['cursor'] = int(data['next_cursor_str'])

    if (ic == 10): break
    ic += 1

for a in AMIGOS:
    NOMES[a['screen_name']] = 1

users = api.GetFollowers()
for u in users:
    status = ""
    try:
        if (NOMES[u.screen_name] == 1):
            FOLLOWERS['@' + u.screen_name] = 1
            status = "OK"
    except:
        status = "NOT"

    print u.screen_name, status
    
SIZE = 140
MSG = "#FF"
i = 1
api.PostUpdates("Automated python-twitter-#FF mode=on")
for uid in FOLLOWERS.keys():
    if not (randrange(0,2)):
        print "Nao foi:", uid
        continue
    print i, uid
    if ( len(MSG + " " + uid) > SIZE):
        print MSG
        api.PostUpdate(MSG)
        sleep(60)
        MSG = "#FF " + uid
    else:
        MSG += " " + uid
    i += 1

sleep(60)
print MSG
api.PostUpdate(MSG)

api.PostUpdates("Python Twitter #rockz!!!")
api.PostUpdates("Automated python-twitter-#FF mode=off")

Com esse princípio de uso do python-twitter já criei várias aplicações, inclusive para re-enviar minhas publicações daqui e ainda utilizando o eri.cx para encurtar os link.

Escrito por Helio Loureiro
Categoria:

Na primeira parte da série de artigos sobre como escrever uma aplicação em python-twitter, apresentei como baixar e instalar os pacotes necessários.  E ainda uma sugestão para utilizar uma versão a mais do python-twitter, 0.8.2.

Agora falta comentar como criar sua configuração no twitter e como utilizar as chaves para autenticação com python-oauth2.

Tendo uma conta aberta no twitter, a criação da aplicação se faz através do http://dev.twitter.com.

Clicando em "Your apps" se obtém acesso ao sistema de criação e gerenciamento de aplicações.


Para criar uma aplicação, caso ainda não tenha uma, clique em "Register a new app" no menu da direita.

O item "Aplication Name", que parece não ter relação nenhuma além de um nome pra se lembrar, é o que cria a referência de aplicativo utlizado para posts no Twitter (aparece na parte de baixo de um post).  Então um nome legal faz toda a diferença, tal qual batizar um filho.


Também percebi que não é possível utilizar nomes já existentes, tanto que tentei registrar o nome da minha aplicação como "python-twitter" e o sistema não permitiu, então utilizei "python-tweeter".


Crie o aplicativo como "cliente", pra evitar troca de chaves via web e  com permissão de "leitura e escrita".

Criada a sua aplicação, agora é hora de olhar a parte de credencias para seu uso com o módulo oauth2, ou melhor, python-oauth2.

Utilizando python-twitter, com oauth2 pra autenticação, cria-se um objeto de tweet como abaixo:

tweet = twitter.Api(
    consumer_key = '9zz1zuWjMy0aKm2d6HK20Q',
    consumer_secret = 'd5xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
    access_token_key = 'yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy',
    access_token_secret = 'zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz'
    )

A nomenclatura das informações necessárias são muito parecidas com as utilizadas pelo Twitter, facilitando a localização dos mesmos.  "Consumer Key" no Twitter refere-se à consumer_key no python-oauth2, "Consumer Secret" à consumer_secret, "Access Token (oauth_token)" à access_token_key e "Access Token Secret (oauth_token_secret)" à access_token_secret.


Após criado seu aplicativo, basta clicar no mesmo para ver tais dados.  Pelo que pude perceber, o ÄPI Key" e "Consumer Key" são os mesmos, mas os dados sobre seu aplicativo mostram primeiramente o "API Key".

Isso já completa parcialmente os dados necessários para autenticação.  Os dados seguintes referem-se às credenciais de usuário, que não utilizará a web para se autenticar, como foi selecionado anteriormente.  Nesse caso é possível encontrar tais dados no menu da direita, ainda dentro dos detalhes da aplicação.

Basta clicar em "My Access Token" para obter as informações necessárias.

Com essas informações em mãos, já é possível fazer um pequeno teste seguido de um "Hello World" no Twitter totalmente em Python:


#! /usr/bin/python
import twitter
 
tweet = twitter.Api(
    consumer_key = '9zz1zuWjMy0aKm2d6HK20Q',
    consumer_secret = 'd5xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
    access_token_key = 'yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy',
    access_token_secret = 'zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz'
    )
 
print tweet.VerifyCredentials()
print tweet.GetPublicTimeline()
tweet.PostUpdate("Hello World")
 
Escrito por Helio Loureiro
Categoria:

Depois que fiz uma aplicação em Python pra enviar #FF pras pessoas que sigo, recebi alguns pedidos pra mostra um HOWTO ou algo parecido. Como foi um procedimento bastante longo de se descrever, resolvi seguir o modelo "Jack estripador" e mandar em partes:python-twitter

  • Parte 1: pacotes Debian
  • Parte 2: configuração do Twitter
  • Parte 3: programa em Python

Pode parecer um certo exagero, mas é que precisei adaptar várias coisas tanto na parte 1 quanto na 3. Se eu descrever tudo de uma vez só, vai ficar muito, mas muuuuuuito longo.

Agora falando um pouco sobre python-twitter, esse é um módulo (ou classe) pra conectar no Twitter (duh!). A versão que está nos respositórios do Debian/Ubuntu é ainda a antiga, 0.6, que partia do princípio que a autenticação no twitter se fazia através de username e password. Atualmente o Twitter usa uma forma mais rebuscada, pra evitar o envio desses por meios não seguros e possível roubo de identidade, utilizando um método de token. Você cria uma aplicação com um registro no Twitter e o mesmo pede autorização ao usuário pra se conectar em sua conta. Irei comentar melhor isso na parte 2.

Voltando à instalação no Debian/Ubuntu, que no momento em que escrevo estão nos releases 6.0.1 (Squeeze) e 10.10 (Maverick Meerkat), é preciso baixar o python-twitter, que está na versão 0.8.1, a partir do projeto em:

python-twitter-0.8.1.tar.gz

Essa versão de python já traz o novo método de autenticação baseado em oauth2. E falando nesse, o oauth que vem em Debian/Ubuntu também está desatualizado e não funiona com essa versão nova do Twitter que exige tokens. Então é necessário baixar a versão do site e instalar:

python-oauth2

Eu baixei a versão 1.5.167 e funcionou corretamente por aqui.

Eu já previamente deixei esses pacotes disponíveis aqui, mas com arquitetura i386. Mas deixei também os fontes pra gerar os pacotes.

python-oauth2_1.5.167_all.deb

python-oauth2_1.5.167.dsc

python-oauth2_1.5.167.tar.gz

python-twitter_0.8.2_all.deb

python-twitter_0.8.2.dsc

python-twitter_0.8.2.tar.gz

Se você tiver os pacotes build-essential e dpkg-dev, deve bastar pra iniciar a instalação. Basta descompactar o arquivo tar.gz utilizando o dsc, como por exemplo:

dpkg-source -x -b python-twitter_0.8.2.dsc

Isso criará o diretório do pacote, no caso python-twitter-0.8.2. Em seguinda basta entrar nesse diretório e gerar o pacote:

dpkg-buildpackage

Isso criará o pacote DEB na sua arquitetura.

Um olhar mais minuscioso notará que estou fornecendo o pacote 0.8.2 do python-twitter, que não existe no repositório ainda. Esse pacote contém uma atualização minha :-)

Com tudo isso instalado, já é possível testar se o python-twitter está instalado corretamente e na versão correta:

Python 2.6.6 (r266:84292, Sep 15 2010, 15:52:39) 
[GCC 4.4.5] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import twitter
>>> twitter.__version__
'0.8.2'
 


Se ao invés disso você tiver a versão 0.8.1, a corrente do site, a maioria das coisas que fiz funcionarão, exceto a listagem de seguidores (followers).

Escrito por Helio Loureiro
Categoria:

Faz alguns dias, comecei a ter o prazer de assistir os vídeos do YouTube em cor-de-rosa:

Principalmente no recente instalado Ubuntu 64 bits.  A princípio achei que era um dos tão mencionados problemas de flash em Linux 64, mas pude ver em alguns fóruns que isso tem afetado todos as versões de Linux pra Intel, tanto de 32 quanto 64 bits.

Consegui amenizar um pouco o problema com as dicas que encontrei aqui:

http://www.webupd8.org/2011/03/fix-pinkred-youtube-videos-bug-using.html

Mas o problema persiste.  Mais uma boa razão pra abandonar logo o flash, que é proprietário e depende unicamente da Adobe pra corrigir.

Escrito por Helio Loureiro
Categoria:

Já faz algum tempo que comprei uma máquina da STI, Semp Toshiba, do tipo "computador popular". Comprei pelo preço baixo e pelo fato de vir com Linux instalado (um é causa o outro, efeito, mas não sei qual é qual). Isso uns 3 anos atrás. Nunca fui muito adepto de equipamento pré-montado, mas nessa época já estava meio cansado de ficar entrando em boca-de-hardware na Santa Ifigênia pra montar um computador decente.

A grande surpresa foi a qualidade do acabamento do computador: teclado excelente e macio, mouse ótico, entradas de leitor pra cartões de memória (todos os tipos até onde testei), caixas de som com amplificador energizado via USB, 2 GB de RAM, 250 GB de disco SATA e drive gravador de DVD. Realmente um hardware legal (lembre-se que isso foi há 3 anos atrás).

Na época veio com Insigne Linux instalado. Acho que durou uns 5 minutos rodando, o tempo de olhar a cara do sistema, até eu instalar um Ubuntu por cima. Desde então tenho usado o mesmo com Linux 32 bits.

No final do ano passado, por volta de meados de dezembro, só então notei uma mensagem de hardware no boot: EM64T. Sabia que era um Core 2 duo, mas achei que era só isso.  Com algumas mensagens no Twitter, algums amigos confirmaram que a CPU era mesmo 64 bits, mas recebi muitas críticas negativas sobre o mesmo em Linux, principalmente em relação à crashes de aplicativos, principalmente em sites com flash. Resolvi então manter os 32 bits.

Recentemente li um  artigo dizendo que o Linux fracassou miseravelmente na arquitetura 64 bits. O texto realmente está certo na abordagem do Linux em relação à nova arquitetura: dizia-se que o Windows estava fadado ao esquecimento dos 32 bits e que Linux iria dominar o desktop pois sua migração era tão fácil quanto a instalação em uma torradeira. E o que vemos atualmente é exatamente o oposto disso: várias recomendações pra se manter Linux em 32 bits por questões de estabilidade. No ponto em que li essa frase, confesso que senti uma pontada de culpa, pra não dizer vergonha.

Por um problema com um aplicativo de VPN da empresa, não posso migrar meu laptop pra 64 bits (processador Intel Core i3) e tenho de continuar envergonhado, mas já o meu desktop... resolvi arregaçar as mangas e instalar. Parti pra instalação do Ubuntu 10.10 em arquitetura AMD64.

Como sempre, dpkg salvou o dia com a lista de aplicativos previamente instalados (dpkg --get-selections >myselections). A migração, ou reinstalação, ocorreu sem demais problemas. Um backup do /etc, bases do mysql e do diretório /root e rapidamente tive o sistema restaurado, e em 64 bits.

Para batizar a *nova* máquina dei o nome de goosfraba, em homenagem ao filme do "tratamento de choque" com Jack Nicholson e Adam Sandler (final meio infeliz, mas em geral é engraçado).

Até o momento a goosfraba tem funcionado melhor que na arquitetura 32 bits: mais rápido. Tenho a sensação de que estava dirigindo uma Audi A3 turbo, mas que antes só colocava até a 4a marcha. E agora vou até a 7a. Mas espero problemas com o Flash Player, pois sei que apesar do Linux não ter fracassado em 64 bits, também não foi o sucesso desejado.

Referências:

[1] What happened to "World Domination 201"? (ou Linux fracassou miseravelmente em 64 bits)


Escrito por Helio Loureiro
Categoria:




Durante a Campus Party Brasil 2011 (#cpbr4) trabalhei como voluntário na área de Software Livre.  Entre várias coisas legais que ocorreram, uma foi o fato do Maddog sempre ficar próximo de nós.  E não foi que bem no dia que fiz uma piada com ele, falando que tinha lugar na bancada da Microsoft - esse dia estava difícil achar uma cadeira e cabo de rede sobrando, veio uma repórter do G1 e escreveu sobre ambos: Maddog e minha piada.

São os meus 5 minutos de fama geek.

Reportagem no G1

Escrito por Helio Loureiro
Categoria:


Como alguém já disse antes: nem todo restart é bom.

Mas infelizmente isso é necessário em alguns momentos.  E meu roteador wireless Netgear WGR614 v7 chegou nesse ponto.  Diariamente ele exige um leve "restart" pra poder funcionar direito na parte wireless, do contrário nada consegue se conectar nele: notebook, netbook, xbox360, celulares... 

Deve ser alguma feature chinesa pois todos os produtos de lá padecem do mesmo mal, que sempre começa a aparecer depois de mais de 1 ano de uso.  Deve ser uma estratégia de marketing pra nos forçar a fazer um upgrade.  Igual ao Windows.

Mas voltando ao problema e sua solução, resolvi partir pra um restart automático (restart do bom, pra deixar claro).  Então primeiramente descobri que o roteador faz um restart ao salvar as configurações de wireless.  Em seguinda utilizei o Add-on do firefox, Live HTTP Headers, que ajudou a capturar os dados enviados ao equipamento:

POST /wlg_adv.cgi HTTP/1.1
Host: 192.168.34.1
User-Agent: Mozilla/5.0 (X11; U; Linux i686; pt-BR; rv:1.9.2.13) Gecko/20101206 Ubuntu/10.04 (lucid) Firefox/3.6.13
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: pt-br,pt;q=0.8,en-us;q=0.5,en;q=0.3
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 115
Connection: keep-alive
Referer: http://192.168.34.1/WLG_adv.htm
Authorization: Basic ZnVjazp5b3U=
Content-Type: application/x-www-form-urlencoded
Content-Length: 60
enable_ap=enable_ap&ssid_bc=ssid_bc&enable_wmm=0&Apply=Apply

O router exige autenticação, o que pode ser visto pela entrada "Authorization: Basic ZnVjazp5b3U=", que não usa criptografia mas um encode de base 64.

Então criei um script pra fazer o trabalho sujo e enviar os mesmos dados ao roteador, mas em Python.

#! /usr/bin/env python
# Script to restart daily my wireless router
# by Helio Loureiro

import httplib
import base64
import urllib
from time import ctime
 
user = "admin"
passw = "password"
host = "192.168.0.1"
 
def GetAuth(user = "user", passw = "passwd"):
        auth = user + ":" + passw
        return base64.encodestring(auth)[:-1]
 
headers = { 
        "Host" : host , 
        "User-Agent" : "Mozilla/5.0  (Python)",
        "Accept" : "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8" , 
        "Accept-Language" : "pt-br,pt;q=0.8,en-us;q=0.5,en;q=0.3",
        "Accept-Encoding" : "gzip,deflate", 
        "Accept-Charset" : "ISO-8859-1,utf-8;q=0.7,*;q=0.7",
        "Referer" : "http://192.168.34.1/WLG_adv.htm" ,
        "Authorization" : "Basic " +  GetAuth(user, passw),
        "Content-Type" : "application/x-www-form-urlencoded"
        }
 
post_params = {
        "enable_ap" : "enable_ap" ,
        "ssid_bc" : "ssid_bc",
        "enable_wmm" : "0",
        "Apply" : "Apply"
        }
 
params = urllib.urlencode(post_params)
 
web = httplib.HTTPConnection(host)
web.request("POST", "/wlg_adv.cgi", params, headers)
response = web.getresponse()
 
if (response.status == 200):
        print "[" + ctime() + "] Wireless router restarted successfully"
else:
        print "[" + ctime() + "] Restart FAILED"
 
data = response.read()
web.close()

Os dados necessários são usuário, senha e IP do roteador wireless (user, passw e host).  Adicionando o script à crontab, o roteador será reiniciado diariamente, aumentando um pouco mais a longevidade de tal produto Chinês.

Escrito por Helio Loureiro
Categoria:

Hoje, no meio das minhas férias, dei uma conectada na rede da empresa pra verificar uns mails (de uns amigos perdidos que mandaram pro endereço errado).

Por lá o comunicador oficial é o Lotus Sametime, da IBM.  Sempre conectei utilizando o Pidgin, um dos melhores clientes multi-serviço para IMs que conheço, e utilizando o módulo meanwhile pra conectar no servidor de sametime.  Qual não foi minha surpresa ao descobrir que o mesmo não funcionava mais.  Apenas recebia uma mensagem de "Version Mismatch" no rodapé do Pidgin e a conexão se encerrava.


Felizmente encontrei fácil uma solução no site do Pidgin, no TT#12623.  A solução sugere que o meanwhile seja configurado pra esconder sua identificação (hide), o que já era feito.  Então editei o arquivo ~/.purple/accounts.xml e adicionei somente uma linha com a informação abaixo:

                <settings>
                        <setting name='fake_client_id' type='bool'>1</setting>
                        <setting name='client_minor' type='int'>8511</setting>
                        <setting name='port' type='int'>1533</setting>
                        <setting name='force_login' type='bool'>1</setting>
                        <setting name='server' type='string'>sametime.internal.server.com</setting>
                </settings>

Funcionou xuxu beleza.  Reiniciei o Pidgin e imediatamente conectei e pude ver os contatos online.

Escrito por Helio Loureiro
Categoria:

Somente algumas pessoas sabem, mas eu criei um encurtador de url, o http://eri.cx.  A idéia é que seja usado para encurtar as URL da empresa.  E também serviu pra mostrar que algo tão simples quanto o encurtador não demanda tanto trabalho, nem pessoas.

Essa última afirmação pode soar estúpida, mas em grandes corporações não.  Como somos cercados por idiotas engravatados, algumas atitudes como essa, de criar algo que precisávamos, são necessárias.

Mas eu mesmo estava meio frustrado com o encurtador uma vez que seu uso exigia (na verdade  eu que achava que exigia) a compilação dos módulos do Choqok para uso no Twitter, entre outros.  O Choqok, para quem não conheçe, é um ótimo cliente KDE4 pra Twitter.

Aproveitando minhas sagradas férias, resolvi olhar um pouco mais a documentação do Yourls, projeto no qual o eri.cx é baseado, pra verificar se isso não era possível de uma forma mais simples.  Vi que existe uma API pra isso, a yourls-api.php, mas seu uso não era tão simples quanto eu achava.  Ou era e eu não percebi.  Mas enfim deu certo e aqui estou descrevendo como configurar.

No próprio Choqok, na aba de Configurações (ou Settings, se estiver em inglês como o meu), clique no último item, Configure Choqok.  Ele abrirá a tela de configuração, onde deve-se ir à aba de "encurtadores de url", ou "url shortening".  Nessa pasta, selecione o encurtador do tipo Yourls e em seguida clique na ferramenta ao lado, pra configurar.



Na parte de "Yourls API URL", entre como no formato mostrado acima: http://eri.cx/yourls-api?

Leia mais:Adicionando o encurtador ao Choqok
Escrito por Helio Loureiro
Categoria:

Meio tosco, meio fora de lugar, mas adicionei os links do AdSense ao site.

Não espero uma enormidade de retorno, mas... acho que não fará mal algum também.

Gostaria de adicionar ao topo da página, mas tenho encontrado muitas dificuldades de layout com esse tema no Joomla.  Talvez isso mostre que já é hora de trocar o mesmo.

Escrito por Helio Loureiro
Categoria:

Horrível a notícia que vi na Internet hoje.  Aparentemente uma lei foi aprovada na Hungria permitindo que Blogs, imprensa, qualquer fonte de notícia seja forçada a publicar suas fontes.

Medida extremamente opressiva, que vai contra todo sentido de liberdade.  Deixo então aqui meu apoio ao povo Húngaro.

E espero que os jumentos de terninho de Brasília não façam o mesmo por aqui com o #AI5Digital.


Escrito por Helio Loureiro
Categoria:

Aproveitando as resoluções de ano novo, alterei o template de CSS da página principal do site.  Editei o "templates/ja_purity/css/template.css" e fiz a seguinte alteração:


table.contentpaneopen {
	border: none;
	border-collapse: collapse;
	border-spacing: 0;
        color: #FFFFFF;
}

Isso melhorou as fontes que aparecem na parte de cima, logo abaixo do logo do site, com informações em branco (cor #FFFFFF).

2011 está aí, férias também, então nada mais justo que acertar essas pequenas pendências de 2010.

= Um pequeno adendo =

Depois de publicar, vi que o links continuavam escuros.  Fiz mais um pequeno adendo ao mesmo arquivo:

table.contentpaneopen a {
    color: #FFFFFF;
}


Escrito por Helio Loureiro
Categoria:

Como já tinha comentado no post anterior, adquiri um laptop novo. Decidi fazer isso pra me livrar da chateação corporativa do laptop da empresa. Agora posso utilizar Linux ou FreeBSD, ou o que eu quiser, incondicionalmente, sem amolação. No momento estou com Linux, Ubuntu pra ser mais preciso, mas com certeza gostaria de rodar FreeBSD nele, o que não farei até que o suporte pra suspend/hibernate esteja mais maduro.

Devido às restrições dos aplicativos da empresa, que estão empacados em 32 bits, optei por utilizar Ubuntu X86 ao invés do AMD64. Se perdi desempenho, nem percebi. Habilitei o kernel com PAE, pra endereçar os 4 GB de memória e tudo está funcionando bem.

 

Leia mais:Análise do Sony Vaio VPC S110GB