O objeto JQuery e seus seletores

Postado por Gabriel Verta em 9/10/2009

Continuando o post anterior sobre jQuery, iremos descrever o objeto jQuery.
A maioria das funcionalidades do jQuery é iniciada pela objeto $. O $ no jQuery possui diversas funcionalidades, que podem ser:

- Obtenção de objetos a partir de seletores.
Ex.: Obtendo todos os objetos que contenham a classe "dinamico":
alert($(".dinamico").length)

- "Window onload" (funções que irão ser executadas após o término do carregamento da página).
Ex.: Executando função com mensagem simples:
$(function(){
alert("A página já carregou!")
})

- Funções úteis (a serem descritas em um próximo post).
Ex.: Removendo espaços do final e começo de uma string:
alert($.trim(" texto ").length)

- Ajax
Ex.: Requisição ajax por get
$.get("exemplo-ajax.php", function(resposta){
alert(resposta)
})

- Criar conteúdo dinâmicamente
Ex.: Adicionando um novo paragrafo ao corpo da página:
$('<p>Novo Paragrafo</p>').appendTo(document.body)

Seletores

Seletores são declarações que igualam um ou vários elementos do HTML. São eles que mapeiam o HTML no css:

Seletor Descrição
TAG Traz todos os elementos que sejam da TAG selecionada.
Ex.:
alert($('p').length)
#ID Traz o elemento que tenha o ID selecionado.
Ex.:
$('#conteudo').css('background-color', '#ccc')
.CLASSE Traz todos os elementos que tenham a CLASSE selecionada.
Ex.:
$('.content-center').css('text-align', 'center')
[PROPRIEDADE=VALOR] Traz todos os elementos que tenham a PROPRIEDADE com o VALOR selecionado.
Ex.:
$('[name=nome]').val('Gabriel Verta')
SELETOR1 SELETOR2 Traz todos os elementos que SELETOR2 que estejem dentro do SELETOR1.
Ex.:
$('div label').addClass('required')



Existe uma lista extensa de seletores para jQuery, que podem ser vistas na documentação oficial do jQuery. Tentei criar um site com uma forma dinâmica de ver estes seletores em jQuery, espero que entendam como funciona o site. ;)

Seja seguido no Twitter sem incomodar as pessoas

Postado por Yoshio Iwamoto em 7/10/2009

Em dois dias meu usuário doTwitter pulou de 20 seguidores para quase 200. Não é enganação, é até um problema do Twitter, ou não, já que não é bem um bug.

Se você procurar por aí na internet irá encontrar vários métodos de como conseguir mais seguidores no Twitter, mas todos dizem praticamente a mesma coisa: seguir os outros e esperar que eles te sigam também.

De fato isto é verdade e funciona se você seguir muitos (muitos) usuários, mas minha idéia foi um pouco diferente. Vou contar uma historinha.

Estava vendo na Folha Online uma matéria sobre as principais frases ditas pelos famosos no Twitter e umas das frases era do ilustre William Bonner (que aliás sou grande fã). Eu já esqueci qual foi a frase dele, mas o importante é que graças a matéria eu descobri que ele tinha Twitter (@realwbonner), então passei a segui-lo.

Por curiosidade fui ver quantos seguidores ele tinha e ao entrar na página de seguidores dele meu usuário do Twitter estava sendo exibido no topo dos resultados.

Naquele dia, acho que ele tinha mais ou menos 40 mil seguidores. A exibição do meu usuário na página de seguidores dele acabou me rendendo 3 novos seguidores. Uma idéia estava surgindo...

Entrei novamente na página de seguidores dele, mas meu usuário não estava mais no topo. A causa era que o @realwbonner estava adquirindo mais seguidores fazendo os antigos caírem nos resultados. Uma idéia se completou!

Eureka! Vou criar um script para dar Unfollows e Follows nos Twitters com mais usuários do Brasil. Em tempos em tempos eu executo o script e ele faz o meu usuário ficar no topo dos resultados dos seguidores deles.

Se pegarmos o @hucklucianO que possui mais de 1 milhão de seguidores e deixar o seu usuário em exibição no topo da página de seguidores dele, isto irá fazer as pessoas prestarem mais atenção em você.

Vamos ao script

O script foi desenvolvido em Python (v2.6) e utiliza a Python Twitter API (v0.6).

Baixe o código fonte da Python Twitter API em:
http://python-twitter.googlecode.com/files/python-twitter-0.6.tar.gz

Descompacte com o arquivo com o comando:
$ tar -zxvf python-twitter-0.6.tar.gz

Entre na pasta criada e instale a API (como root):
$ cd python-twitter-0.6
$ sudo python setup.py install

Finalmente, baixe o script que criei aqui. Será necessário edita-lo. Abra com algum editor de texto e altere este trecho:

your_users = [
    ('seu_usuario', 'senha',), # Ex: ('joao', 'asd123'),
    # ('outro usuario', 'senha'),
    # ...
]

No trecho acima você deve inserir o seu usuário e senha do Twitter para que a API possa realizar o login. Você está de posse de 100% do código, repare que em momento algum o seu usuário e senhas são enviados para mim. :D

Neste outro trecho você insere os usuário do Twitter que deseja seguir. Coloque cada usuário em uma linha dentro do espaço delimitado entre as três aspas. No script eu já adicionei alguns camaradas :)

twitter_users = '''
yoshioiwamoto
rafaelsdm
ricardoperez
gabrielverta
'''

Quanto mais seguidores eles tiverem, melhor. Uma dica é dar uma passada no twittercounter onde você pode encontrar quem são os usuários mais seguidos no mundo ou em um país específico (Brasil).

Para rodar o script execute na linha de comando:
$ python followme.py

No meu usuário @yoshioiwamoto eu precisei seguir os 15 usuários do Twitter mais seguidos do Brasil e o script era rodado 3 vezes ao dia.

Uma informação importante, para cada usuário que você segue são necessários 2 requests e o Twitter possui um limite de 150 requests por hora, então gerencie bem os uso deste script.

Se você utiliza sistemas operacionais proprietários que não são baseados em Unix, aguarde até que uma boa alma crie um tutorial para você. :D

VIM – Substituir Tab por Espaços

Postado por Ricardo Perez em 6/10/2009

Uma dica muito rápida!

Se você estiver precisando trocar "Tab" por espaços para identação do seu código fonte, como eu preciso para editar alguns scripts python em um servidor, basta fazer o seguinte:

:set tabstop=n // seta para cada tab o numero n de espaços
:set expandtab // troca a tab por espaço

Note que para as tabs já existentes no código estes comandos não funcionarão, para ajusta isto basta fazer:

:retab

Para setar permanentemente esses ajuste em seu Vim basta colocar estes comandos dentro do ~/.vimrc

Funções com argumentos variáveis em Javascript

Postado por Yoshio Iwamoto em 28/09/2009

Talvez você já tenha se deparado em uma situação onde precisava de uma ou mais funções em Javascript com o mesmo nome, porém com listas de argumentos diferentes ou com um argumento com um valor padrão.

Pois é, isso não existe em Javascript, pelo menos não como outras linguagens normalmente implementam. Um das formas de resolver este problema é utilizando a propriedade arguments das funções.

Propriedade arguments

arguments é uma propriedade que contém os argumentos passados para a função. Ele só pode ser chamado localmente e pode ser utilizado como um array.

Propriedades:
Function.arguments.length: Quantidade de argumentos declarados.
arguments.length: Quantidade real de argumentos.
arguments.callee: Referência para função.

Lembre-se que o arguments deve ser utilizado de dentro da função. Aqui vão alguns exemplos para deixar as coisas mais claras.

Você pode passar quantos argumentos quiser sem precisar declara-los na função:

function myfunc() {
    a = arguments[0];
    b = arguments[1];
    c = arguments[2];
    // ...
}
 
myfunc(1, 2, 3);
 

Um meio de se indicar um valor padrão para um argumento que não é passado:

function myfunc(a, b) {
    var c = 3;
    if (arguments.length == 3) {
        c = arguments[2];
    }
    /*
    ou
    var c = arguments.length == 3 ? arguments[2] : 3;
    */
}
 
myfunc(1, 2);
 
/* ou */
 
myfunc(1, 2, 3);
 

Verificando a quantidade de argumentos passados com os permitidos:

function myfunc(a, b) {
    if (arguments.length != myfunc.arguments.length) {
        alert('Passe 2 argumentos!');
    }
    // ...
}
 
myfunc(1); // exibe 'Passe 2 argumentos!'
 
/* ou */
 
myfunc(1, 2, 3); // exibe 'Passe 2 argumentos!'
 

O callee pode ser utilizado em recursões onde não se conhece o nome da função, como as funções anônimas:

function myfunc() {
    return function(a) {
        if (a > 10) {
            return a;
        }
        return arguments.callee(a + 1);
    }
    // ...
}
 
myfunc()(1);
 

Jquery – Introdução a biblioteca Javascript

Postado por Gabriel Verta em 21/09/2009

Introdução
JQuery é uma biblioteca Javascript que tem como objetivo simplificar o tratamento javascript em uma página HTML, ou seja, tornar mais fácil o tratamento de eventos, animações, requisições Ajax... Muito utilizada no mercado devido a facilidade de uso e de extensão, onde os diversos programadores que a utilizam criam plugins para as mais variadas atividades, tais como slide de imagens, máscara para campos de formulário, tornar bordas redondas dentre outras...

Como funciona?
Para utilizar a biblioteca basta adicionar o arquivo Javascript do jQuery:

<html>
<head>
<script type="text/javascript" src="jquery.js"></script>

<script type="text/javascript">

</script>
</head>
<body>
<a href="http://jquery.com/">jQuery</a>
</body>
</html>

A última versão também pode ser encontrada em http://code.jquery.com/jquery-latest.js

Exemplo de utilização
Caso eu queira que todos os elementos que tenham a classe "dinamico" sejem ocultadas quando apertado o botão ocultar, eu teria o seguinte código dentro da função de ocultar:


$('.dinamico').hide()

ou ainda, utilizando os efeitos do jQuery:


$('.dinamico').fadeOut("slow")

Veja este exemplo funcionando:

No próximo post explicarei algumas funcionalidades do objeto jQuery e como funcionam os seletores.

Monitorando sua internet 3G

Postado por Rafael Sierra em 2/08/2009

Em decorrência da minha mudança de imóvel por conta do meu (em breve) casamento fiquei sem internet. O prédio atual onde moro não tem suporte a cabeamento da Net/Virtua e a Telefônica foi, legalmente, proibida de vender novas assinaturas telefônicas, o que significa que eu não tinha até então internet em casa, e pra resolver isso a sempre sábia @pathiene sugeriu que utilizássemos uma internet 3G qualquer, e como eu já tinha feito um teste com o Claro 3G, que funcionou muito bem por eu estar em um lugar onde geralmente não se tem muita atenção das operadoras de celular, resolvi então ver qual seria a melhor opção, que dentre as disponíveis a OI/Velox se destacou.

O problema começa na assinatura do contrato, quando você lê no mesmo: "...até um limite de 10GB por mês..." caso eu ultrapasse o limite será cobrado R$0,10 por MB adicional, ou R$102,40 por GB adicional, e no caso da Claro com 1GB por mês tendo como punição ao abuso o corte da velocidade de 1Mbps para 128Kbps. Naturalmente, não existe de forma clara e abertamente disponível aos seus clientes (ao menos no caso da Oi, não posso confirmar quanto a outras operadoras) um link como o http://consumo.virtua.com.br que lhe disponibiliza um relatório diário com o seu consumo, bastando saber qual o mac address de seu dispositivo.

Pois bem, para resolver esse problema recorri, naturalmente, à programação e criei um script que para ser adicionado ao crontab que irá gerar um relatório constante do seu consumo. O script é feito em Ruby (ahh Rafael, pq Ruby e não Python/Java/C/PHP??, simples: porque eu quis) e pode ser baixado em http://blog.stiod.com/wp-content/uploads/2009/08/net_counter.rb .

O funcionamento do script é muito simples:
sdm@sdm:~$ ./net_counter.rb -h
Usage: net_counter.rb [OPTIONS]
Utilize este script para mensurar o consumo de sua rede
-i, --interface=val Interface que deve ser analizada. Padrão: ppp0
-f, --file=val Arquivo onde deve ser armazenado os dados.
Evite usar o mesmo arquivo para diferentes interfaces. Padrão: report_ppp0.txt
-h, --help Exibe esta mensagem.

Edite o seu crontab e adicione o comando nele, você pode customizar ele para gerar logs mensais, adicionando o comando net_counter.rb --file /qualquer/lugar/report_ppp0_`date +%m`.txt. Lembre-se apenas de dar permissão de execução no script (chmod +x) e de coloca-lo no PATH do seu crontab (/usr/bin/ costuma servir).

Para saber como esta o consumo da sua rede basta analizar o arquivo report_ppp0.txt ou seja lá qual for o nome que você escolher, o arquivo está disposto da seguinte forma:

  • Primeira linha: Trafego de download total (somatório desde a primeira execução para aquele arquivo)
  • Segunda linha: Trafego de upload total (idem)
  • Terceira linha: Trafego de download desde a última vez que você se conectou
  • Quarta linha: Trafego de upload desde a última vez que você se conectou

Em todos os casos o número sera em bytes, em um post futuro talvez eu faça o script que calcula em K, M ou GB.

Observações:

  • O script utiliza os dados do arquivo /proc/net/dev
  • A internet 3G da Claro e Oi funcionam muito bem em Praia Grande/SP, se você vier passar um feriado aqui, pode trazer seu notebook e modem tranquilamente :)
  • O modem oferecido pela Oi funcionou perfeitamente no Ubuntu 9.04 e foi extremamente simples e intuitiva sua configuração
  • Desculpem pelos 4 meses e 1 dia sem atualização no blog :S
  • Sim, o ultimo post foi de primeiro de abril

Migrando de Python para Java

Postado por Rafael Sierra em 1/04/2009

É consenso que o fluxo natural de todos seja o amadurecimento, e é com vista nisso que passei a enchergar Java com outros olhos.

Antes eu via Java como uma linguagem muito prolixo, verboso, parecido com aquele momento em que você tem que documentar o seu TCC, porém, começo a sentir que isso é um mal necessário.

Como você pode confiar em um sistema que num determinado momento assume que uma variável é um inteiro e no outro é uma conexão em um servidor IRC pronta para receber comandos de algum mestre? Pois é, é exatamente assim que as linguagens com tipagem dinâmica se comportam, uma vez que o invasor alcança seu objetivo, ele poderá fazer o que quiser. Mas pode ficar tranquilo, esse tipo de coisa não acontece em Java, pois sua estrutura rígida impede que o invasor (ou mesmo o desenvolvedor, por que não?) faça o que bem entende do seu aplicativo.

Outro ponto que considerei, foi com relação a segurança de distribuição do seu sistema. Em linguagens dinâmicas e de script como Python, PHP e Ruby, você normalmente é obrigado a entregar o código-fonte de seus scripts (!!), existem soluções de obscuração de código, mas nada se compara ao excelente sistema de bytecodes do Java, com ele, você pode tranquilamente (sem trema) compilar seu programa e entregar a seu cliente, simples assim :D

E claro, não posso concluir sem antes falar sobre o número de pacotes de terceiros disponíveis, de acordo com o gráfico claro e lúcido que pode ser encontrado em http://www.cs.berkeley.edu/~flab/languages.html, a linguagem Java (uma das linhas vermelhas) é a que em 2006 mais possui projetos no SourceForge, ou seja, é muita gente criando projetos que com certeza serão úteis a você.

Então não perca tempo, comece logo a estudar Java, pois definitivamente esse será o futuro.

Shell Script – Tratamento de querystring como cgi

Postado por Gabriel Verta em 24/03/2009

Como fazemos para pegar os valores de uma querystring rodando um shell script por cgi?

Vamos ao código:


for var in `echo $QUERY_STRING | tr "&" "\t"`
do
key=$(echo $var | tr = " " | awk '{print $1}';);
value=$(echo $var | tr = " " | awk '{print $2}';);
declare "query_$key"="$value";
done

Agora a lógica:

Quando chamamos um script via cgi, este cria a variavel de ambiente QUERY_STRING, que conterá o valor do GET em uma string única. Assim temos que tratar esta string para que tenhamos as variáveis com os valores que enviamos.

Vamos começar com este trecho:

`echo $QUERY_STRING | tr "&" "\t"`

Neste estamos mandando exibir o valor da variável QUERY_STRING e jogando a saida para o comando tr, que faz uma tradução de um texto em outro, transformando todos os & em \t no caso.
E o que é esta ` (crase) antes e depois do comando? Serve para você efetivamente executar um comando do shell, onde o resultado é retornado para o script.

Vamos para a próxima linha do script:

key=$(echo $var | tr = " " | awk '{print $1}';);

A partir desta linha, dentro do for, já temos a variavel var com o valor parametro=valor, então temos que pegar este parametro e valor. Exibimos o valor de var, jogando a saída padrão para o tr novamente, só que agora transformamos = em espaço, para aí jogarmos esta saída em outro programa para separar os argumentos, no caso o awk, onde mandamos exibir somente o primeiro parâmetro, rodando direto no shell seria algo como:


$ awk '{print $1}';
parametro valor
parametro

Digitando parametro e valor no awk e mandando exibir apenas o primeiro parâmetro ele retorna somente o primeiro.

Na linha seguinte do nosso script, a mesma coisa é feita, com a diferença de que o segundo parâmetro é pego para termos o valor e não a chave desta vez.

Agora já temos key com a chave do parâmetro do GET, e value com o valor da chave. Vamos a próxima linha:

declare "query_$key"="$value";

Agora estamos criando a variável com o valor de key com o valor de value. Como assim?

Se no GET tivessemos algo como stiod=nozes, $key teria o valor de stiod e $value o valor nozes. Então estariamos criando uma variável stiod com o valor nozes. Seria algo como se estivessemos digitado stiod=nozes no código. Ou seja, a partir deste momento, com o fim do for, temos uma variável com cada chave do GET com o prefixo "query_", e seus respectivos valores.

Seguindo o exemplo anterior, se tivessemos passado arquivo.sh?stiod=nozes, mandando exibir o valor da variável query_stiod seria exibido o valor nozes (echo $query_stiod)

É isso ai,
;)

Como extrair o conteúdo de um arquivo rpm?

Postado por Gabriel Verta em 16/03/2009

O comando que extrai todo o conteudo de um arquivo rpm, criando as pastas que o rpm criaria a partir do diretório atual:

rpm2cpio arquivo.rpm | cpio -idmv
;)

Link sobre cpio

Migration no Codeigniter

Postado por Rafael Monteiro em 13/03/2009

Olá !

Nesse post abordarei uma implementação básica de migration utilizando como base o framework Codeigniter.

Cenário

Para aqueles que desconhecem, o recurso de Migration consiste na abstração das alterações em bases de dados para uma classe que automatiza essa tarefa. Isso é particularmente útil quando trabalhamos em equipe e cada profissional desenvolve em seu ambiente, eventualmente modelando novas tabelas ou adicionando campos as já existentes. Dessa forma, evita-se trabalhar diretamente com o SQL (o que possibilita uma independência do SGBD) e o processo de atualização dos diversos ambientes (inclusive o de produção, quando for o caso) se torna mais simples e ágil.

Continue Lendo »

Av. Conselheiro Nébias, 368A, Cj. 413
Vila Mathias - Santos - SP
Telefone: (13) 3345-4580

© 2008 - 2009 Stiod. Todos os direitos reservados.