Encurtando URLs com o Bitly-PHP

5 comments

Posted on 24th March 2010 by Igor Escobar in PHP |Utilidades

, ,

Sobre o Bitly-PHP

Nos últimos dias tenho trabalhado em uma library em PHP (claro) para abstrair as funcionalidades da API RESTful do Bit.ly . Se chama Bitly-PHP. Toda a library foi desenvolvida utilizando PHP5, Orientação a Objetos, Naming Convention e cURL (se não tiver ele usa uma função alternativa).

Download e Documentação

Você pode fazer o download da library direto na pagina do Bitly-PHP no GitHub. Todos os outros exemplos de uso da library você encontra direto no Wiki do Bitly-PHP.

Se você tem o git na sua máquina você pode executar o comando:

git clone git://github.com/igorescobar/Bitly-PHP.git

Encurtando URLs

O primeiro que você deve fazer é incluir a arquivo que contém a library do Bitly-PHP:

include_once("Bitly-PHP/bitly.php");

Depois é muito simples. Você só precisa instanciar o objeto do Bitly PHP, informar a URL que quer encurtar, invocar o método responsável por encurtar as URLs, o shorten.

include_once("Bitly-PHP/bitly.php");
$bitly  = new Bitly();
$bitly->url = 'http://www.google.com/';
$bitly->shorten();

O Bitly-PHP possuí um método responsável por acessar os dados que a API do Bit.ly retorna chamado getData().

include_once("Bitly-PHP/bitly.php");
$bitly  = new Bitly();
$bitly->url = 'http://www.google.com/';
$bitly->shorten();
$bitly->getData()->shortUrl; // Saída: http://bit.ly/b6R4Uf

Se você não sabe qual o nome do parametro que você quer chamar, chame o metodo debug():

include_once("Bitly-PHP/bitly.php");
$bitly  = new Bitly();
$bitly->url = 'http://www.google.com/';
$bitly->shorten();
$bitly->debug();

O debug vai mostrar:

{
    "errorCode": 0,
    "errorMessage": "",
    "results": {
        "http://www.google.com/": {
            "hash": "2V6CFi",
            "shortCNAMEUrl": "http://bit.ly/b6R4Uf",
            "shortKeywordUrl": "",
            "shortUrl": "http://bit.ly/b6R4Uf",
            "userHash": "b6R4Uf"
        }
    },
    "statusCode": "OK"
}

É isso!

[]‘s

Compartilhe!
  • Twitter
  • Google Bookmarks
  • Yahoo! Bookmarks
  • del.icio.us
  • Facebook
  • Live
  • LinkedIn
  • Netvibes
  • MySpace
  • Technorati
  • RSS
  • Print
  • Digg
  • email
  • PDF

Posts Relacionados:

Tutorial jQuery – Método $.live();

2 comments

Posted on 17th March 2010 by Igor Escobar in Geral |JavaScript |Utilidades |jQuery

, ,

Hoje vou falar sobre um método do jQuery muito útil, muito mesmo. Mais informações em inglês pode ser encontrada na documentação oficial do método .live().

O Problema

É muito comum quando estamos desenvolvendo aplicações para Internet e precisamos criar ferramentas tão dinâmicas que acabamos por utilizarmos quase todo o potencial que o JavaScript dispõe a oferecer. Nas ferramentas que desenvolvo é muito comum a interface da ferramenta ser controlada e alterada quase que o tempo todo através da manipulacão do DOM e muitas vezes precisamos atachar comportamentos em um determinado elemento da página.

Por exemplo: Temos um sistema de comentários onde todos os comentários são carregados e as respostas destes comentários aparecem como arvore.

  • Comentário 1
  • Comentário 2
    • Resposta do comentário 2
      • Resposta da resposta do comentário 2
  • Comentário 3

E assim vai…

Eu posso responder em tempo real um comentário e ele ja vai aparecer para mim. Tudo via jQuery. Quando fazemos uma varredura no DOM do documento usando os seletores do jQuery, procuramos por todos os botões que tenha a classe “responder” que originalmente ficam sem ação e depois, via jQuery damos ação ao elemento.

$('.responder').bind('click', function() {
  // instruções
});

Neste ponto, temos um problema. O indice de elementos do jQuery é estático, ele não atualiza automaticamente. Se um novo botão responder surgir na tela o jQuery não surtirá efeito sobre ele, pois ele apareceu DEPOIS da primeira varredura no DOM quando eu usei o seletor $(‘.responder’).

Solução

Para corrigir este problema, podemos utilizar o .live() do jQuery. Independente de quando e a quantidade de botões que surgirem na tela o jQuery irá acrescenta-lo em seu índice e você poderá manipula-lo da forma como quiser.

$('.responder').live('click', function() {
  // instruções
});

Caso queira adicionar ao DOM o mesmo comportamento em mais de um evento, basta fazer o seguinte:

$('.responder').live('mouseover mouseout', function(event) {
  if (event.type == 'mouseover') {
    // faça isso
  } else {
    // faça aquilo
  }
});

Ou crie 2 lives separadamente para cada evento.

$('.responder').live('mouseover', function() {
  // instruções
});
$('.responder').live('mouseout', function() {
  // instruções
});

A princípio o conceito pode ser um pouco confuso. Fica difícil de entender isso quando nunca se passou pelo problema. O dia que algo não funcionar como o esperado pelo jQuery nem simplesmente ter sido chamado, lembre-se do $.live();

Igor
[]‘s

Compartilhe!
  • Twitter
  • Google Bookmarks
  • Yahoo! Bookmarks
  • del.icio.us
  • Facebook
  • Live
  • LinkedIn
  • Netvibes
  • MySpace
  • Technorati
  • RSS
  • Print
  • Digg
  • email
  • PDF

Posts Relacionados:

Novo ano, nova jornada.

3 comments

Posted on 16th March 2010 by Igor Escobar in Curiosidades |Geral

, , ,

É isso aí! Ano novo, nova jornada!

Antes do ano de 2009 acabar eu já observava indícios de que minha vida estava prestes a mudar. Fui Analista de Sistemas da Visie durante 2 anos. Sou de São José dos Campos e fui contratado pelo Elcio Ferreira no início de 2008 para trabalhar em São Paulo – Capital alocado em um cliente da Visie no centro de São Paulo.

Trabalhei quase 2 anos em um projeto para a ACSP (Associação Comercial de São Paulo) que iria substituir o atual sistema de proteção ao crédito da empresa (o famoso SPC). Neste período eu aprendi bastante. Tive a oportunidade de conhecer pessoas incríveis, que realmente mudaram minha vida diretamente e indiretamente.

Quando o projeto foi chegando ao fim o Elcio não achava mais necessário a minha presença no projeto e achou que eu seria mais útil na matriz da Visie em São Judas. Fui para lá e foi ótimo! conheci um novo modelo de trabalho, pessoas incríveis. Adoro trabalhar em um lugar onde as pessoas são apaixonadas pelo que fazem. A realmente sentirei falta de trabalhar para Visie.

O início de 2010 foi quente para mim. Recebi muitas propostas de emprego neste período, a maioria para sobrinhos faz tudo (#sick) e algumas interessantes. Uma delas foi a oportunidade de trabalhar no Virgula. Fui chamado para entrevista, gostei muito do lugar e pelo que conversamos a equipe também é promissora. Lá eu fiz um teste. Um simulado oficial da Zend (in english) para testar os conhecimentos. Três dias depois eu fui comunicado de que havia sido selecionado para a vaga.

Hoje, dia 16 de março de 2010. Eu encerro a minha jornada como membro da Visie e inicio uma brand new como parte da equipe do Virgula.

Que venha o Virgula, então!

Igor
[]‘s

Compartilhe!
  • Twitter
  • Google Bookmarks
  • Yahoo! Bookmarks
  • del.icio.us
  • Facebook
  • Live
  • LinkedIn
  • Netvibes
  • MySpace
  • Technorati
  • RSS
  • Print
  • Digg
  • email
  • PDF

Posts Relacionados:

  • Nenhum post relacionado!

Inscreva o seu grupo na Zend

4 comments

Posted on 15th December 2009 by Igor Escobar in Curiosidades |Geral |Internet |PHP |Utilidades

,

A Zend anúnciou ontem no seu perfil do facebook que irá criar uma área no portal zend.com com o intuito de divulgar os grupos de usuários PHP. Não importa de que país e localidade seja o seu grupo de usuários php. Se você quiser divulgar o seu grupo no site oficial da Zend. Envie um e-mail para localphp[arroba]zend.com com as seguintes informações:

Nome do Grupo
Localização do Grupo (Pais e Estado)
Informações para contato
Site
Uma Logo
Curta descrição do grupo.

É uma boa notícia. Ter o seu grupo reconhecido pela empresa responsável pelo desenvolvimento da linguagem PHP é um ótimo empurrãozinho para o seu grupo crescer. Boa Sorte!

[]‘s
Igor.

Compartilhe!
  • Twitter
  • Google Bookmarks
  • Yahoo! Bookmarks
  • del.icio.us
  • Facebook
  • Live
  • LinkedIn
  • Netvibes
  • MySpace
  • Technorati
  • RSS
  • Print
  • Digg
  • email
  • PDF

Posts Relacionados:

Pense Fora da Caixa

6 comments

Posted on 8th December 2009 by Igor Escobar in Blogosfera |Geral

Hoje irei compartilhar com você uma questão que me perguntaram em uma entrevista de emprego há uns 5 anos atrás. Essa questão realmente me inspirou e mudou minha perspectiva na maneira pelas quais busco resolver problemas.

Questão: Você está está dirigindo um carro em uma noite de tempestade e está chovendo pesado quando, de repente, ao passar por uma parada de ônibus, você vê três pessoas esperando por um ônibus:

1. Uma senhora de idade que parece que está a beira da morte;
2. Um amigo das antigas que já salvou sua vida uma vez;
3. O(a) parceiro(a) perfeito(a) que você sempre sonhou em passar o resto da vida;

Qual deles você ofereceria uma carona se coubesse apenas um passageiro em seu carro?

Esse é um dilema ético e moral, então veremos as opções que apareceram na minha cabeça no momento:

- Você poderia pegar a senhora de idade, porque se ela fosse morrer, você podeira salvá-la primeiro;
- Ou você pode pegar seu velho amigo que uma vez salvou sua vida, e essa seria a chance perfeita de retribuir o favor.
- No entanto, você pode nunca mais encontrar seu par perfeito;

Não direi a resposta que eu dei, mas nem preciso, eu não fiquei com o emprego. Entretanto, fiquei intrigado, e liguei uma semana depois para perguntar qual era a resposta certa…

E foi isso que eles me responderam:

O candidato que foi contratado nos deu essa resposta:
“Eu daria a chave do carro para meu velho amigo que levaria a senhora da idade para o hospital. Eu ficaria para trás… e aguardaria o próximo ônibus com a parceira dos meus sonhos”.

Algumas vezes, nós ganharíamos mais de fossemos capazes de ultrapassar nossas limitações. Nunca se esqueça de pensar fora da caixa ou além do óbvio.

Vi este texto aqui.

Compartilhe!
  • Twitter
  • Google Bookmarks
  • Yahoo! Bookmarks
  • del.icio.us
  • Facebook
  • Live
  • LinkedIn
  • Netvibes
  • MySpace
  • Technorati
  • RSS
  • Print
  • Digg
  • email
  • PDF

Posts Relacionados:

  • Nenhum post relacionado!

Um pouco sobre certificações (W3C)

8 comments

Posted on 25th November 2009 by Igor Escobar in Curiosidades |Geral |Internet |Utilidades |Web 2.0 |Web Standards

, ,

Ontem aconteceu a Conferência da W3C Brasil. Infelizmente não pude ir, mas acompanhei tudo pelo twitter através da hash tag #webbr2009.

Diversos assuntos foram discutidos neste dia, dentre eles o que mais me chamou a atenção foi a quantidade de opniões divergentes com relação ao ter ou não ter certificações para os profissionais que lidam com o desenvolvimento front-end todos os dias.

De todas as opniões que foram expressadas neste dia, se juntar tudo e fazer uma categorização das opiniões, vocês vão ver que tudo gira em torno da desilusão dos profissionais quanto a este assunto.

Vi muitas pessoas sendo contra a certificação, pelo fato de muitos ja terem comprovado e sentido na pele o grande interesse de algumas instituições – que prefiro não citar – em vender somente o papel e não o conhecimento.

Depois da discussão que tive com alguns amigos que trabalham na área pude ver que as pessoas não são desiludidas com A CERTIFICAÇÃO em si. Os profissionais estão desiludidos na maneira como ela é vendida e mantida pelas instituições e a forma como as empresas fazem a utilização desta certificação.

A certificação é vendida como se fosse um curso qualquer. Onde o candidato à certificação entra em uma salinha, responde umas perguntas e sai certificado. O que é uma demonstração CLARA de que as instituições não estão nem um pouco interessadas no nível do profissional que sai dali com este papel de baixo do braço e sim pelo dinheiro dos que acreditam que este papel vai mudar o seu mundo – o que tem uma pitada de verdade.

Vi também que muitos estavam “indignados” pelo fato das empresas utilizar tais certificações como filtro em um processo de seleção. Veja bem, eu também acho isso uma sacanagem mas não acho isso, o fim do mundo. A empresa tem um senso equivocado as vezes pensando que se eles ignorarem todos os que não tem certificação e entrevistar somente o que tem estarão fazendo um bom negócio pois os que não tem é lixo – na visão deles.

Mas por outro lado em grandes corporações este filtro serve puramente para agilizar o processo. Imagina uma empresa com uma fila de 3 mil candidatos a uma vaga. Eles iriam demorar 5 anos para entrevistar todo mundo da forma mais humana e minuciosa possível, mas infelizmente, eles acreditam que mesmo ignorando 2 mil sem certificações eles acreditam que pelo menos 10% destes mil que sobraram sejam bons profissionais.  Se pensarmos por este lado, é totalmente aceitável o filtro quando aplicado em uma situação como esta – mesmo sabendo que eles podem ter perdido os steve jobs pessoal deles. Steve Jobs não tem nível superior, imagina ele procurando emprego? milhares de empresas aplicando seus filtros em cima de uma mente brilhante, cool. ;)

A minha opinião sobre estas certificações é: Devemos sim ter certificações. Quanto mais o nosso ramo amadurecer neste sentido e ter instituições que comprovem e testem os profissionais que atuam neste meio é mais um passo que damos rumo a extinção dos sobrinhos. Quanto mais formal tornarmos o nosso ramo de trabalho, mais dificulta o acesso das empresas sérias a profissionais sem compromisso e consideração com o ramo e as pessoas que atuam nele. Tevemos sim ter certificações, talvez tenhamos que amadurecer melhor esta idéia e talvez não oferecermos uma certificação de HTML ou CSS mas sim de Padrões Web, quem sabe…

Se a forma como tudo é “vendido” mudar, estas certificações servirão como uma forma de valorizar o profissional que possui esta certificação. Tudo tende a agregar valor.

Este é um ótimo assunto e que diferente de só fornecer a certificação, devemos GARANTIR que o profissional que porta este selo é um profissional que no mínimo se importa com a gente, com a nossa luta e principalmente, com o cliente.

Meu amigo Chris também falou e apontou suas consideração sobre o debate, vale a pena dar uma lida também.

[]‘s
Igor.

Compartilhe!
  • Twitter
  • Google Bookmarks
  • Yahoo! Bookmarks
  • del.icio.us
  • Facebook
  • Live
  • LinkedIn
  • Netvibes
  • MySpace
  • Technorati
  • RSS
  • Print
  • Digg
  • email
  • PDF

Posts Relacionados:

Manifesto Slow

6 comments

Posted on 17th November 2009 by Igor Escobar in Curiosidades |Geral |Internet |Utilidades

Cansado de ler sobre este manifesto no Twitter. Resolvi dar uma googada para sumir com a minha wtf-face. :)

O que é o Manifesto Slow?

O Manifesto Slow é um manifesto criado por não sei quem cujo este criou um site chamado (claro): Manifesto Slow. Se você se der o trabalho de acessar verá de cara um resumo curto e grosso sobre o que é este manifesto.

“Esse manifesto não contém nada. Porquê? Fazer um consumiria tempo. E tudo se resume em ganhar tempo. Tempo para que? Para não fazer nada.”

E nisto se resumi o Manifesto. Todas as dicas e pensamentos são escritos no blog do manifesto slow com o único objetivo: Poupar tempo. Todas as dicas são totalmente e unicamente em prol de não fazer nada ou fazer menos.

Se você ainda não entendeu nada, no blog do manifesto eles já publicaram alguns exemplos de como você deve fazer para se unir ao Manifesto Slow.

Na minha humilde opnião, você deve tomar muito cuidado na hora de escolher o que vai ouvir e o que vai jogar fora. Nesta lista que eles divulgaram tem apenas 7 exemplos sobre o que se trata o manifesto slow e duas delas eu discordo e uma eu diria que há controversa. Quando temos o dom da palavra é melhor tomarmos cuidado com o que dizemos pois isso pode se virar contra você ou não.

A grande questão é: Tudo isso é uma grande piada ou eles querem mesmo de alguma forma mudar o mundo? rs.

Compartilhe!
  • Twitter
  • Google Bookmarks
  • Yahoo! Bookmarks
  • del.icio.us
  • Facebook
  • Live
  • LinkedIn
  • Netvibes
  • MySpace
  • Technorati
  • RSS
  • Print
  • Digg
  • email
  • PDF

Posts Relacionados:

  • Nenhum post relacionado!

William Bonner fala sobre o Twitter

0 comments

Posted on 17th November 2009 by Igor Escobar in Curiosidades |Geral |Internet

,

O Twitter é o serviço de microblogging mais famoso do sistema solar, porém, muitas pessoas ainda não fazem a menor idéia para o que serve e qual a sua real utilidade.

Acompanhando as atualizações do meu Twitter acabei me deparando com este vídeo onde o William Bonner fala sobre o Twitter, conta como ele faz o uso do Twitter e o que mudou na vida dele após a sua utilização.

Para quem ainda não entendeu o seu uso e não faz a mínima idéia para que serve, o video da uma clareada na cabeça de vocês.

Twitter do Willian Bonner: @realwbonner

William Bonner fala sobre o Twitter

[]‘s
Igor.

Compartilhe!
  • Twitter
  • Google Bookmarks
  • Yahoo! Bookmarks
  • del.icio.us
  • Facebook
  • Live
  • LinkedIn
  • Netvibes
  • MySpace
  • Technorati
  • RSS
  • Print
  • Digg
  • email
  • PDF

Posts Relacionados:

  • Nenhum post relacionado!

10 Dicas JavaScript e Boas Práticas

10 comments

Posted on 5th November 2009 by Igor Escobar in Curiosidades |JavaScript |Web Standards

, ,

Recentemente alguns site e blogs vem divulgando listas de dicas para se codificar em javascript. Apresentando melhores práticas de desenvolvimento e muitas dicas bacanas, Pensei que este seria um bom tópico para se extender e compartilhar com vocês. Neste post estou reunindo as minhas top 10 dicas e boas práticas para codificação javascript.

Espero que gostem.

1. Use o atributo defer para indicar o uso scripts externos no IE

O propósito do defer é avisar o script que está sendo requisitado externamente para esperar  até que a página seja carregada ou o DOM esteja preparado. O mesmo pode ser realizado através de bons métodos não-obstrutivos via javascript, que usualmente inclui códigos que previne a execução de scripts antes que o DOM seja carregado por completo.

A vantagem do defer ocorre quando utilizamos o Internet Explorer, tendo em vista que é único browser que suporta o atributo defer. Então, se você precisa de um rápido script que rode únicamente e exclusivamente no Internet Explorer, e você não quer que ele execute antes que o DOM esteja preparado, então simplesmente adicione defer="defer" no sua tag <script> e ela irá rapidamente tratar o seu problema. Corrigir a transparência de arquivos PNG no IE6 é uma das possibilídades práticas do uso do defer.

(Edit: O atributo defer deve ser usado quando escondemos um script de outros browsers com o uso dos comentários condicionais  – conditional comment – que afete somente os navegadores da Microsoft – de outra maneira o script vai rodar normalmente em outros browsers.)

2. Use o CData Section para previnir erros de validação XHTML Strict

Muitas vezes seus scripts vão residir em arquivos externos e chamados dentro da tag <script> dentro do  <head> do documento, ou então antes do fechamento da tag </body>.

Mas este documento pode estar eventualmente usado em um local que junto dele existem marcações HTML, como abaixo:

<div>
<p>
<script type="text/javascript">
var my_variable = 100;
if (my_variable < 50) {
// alguma coisa aqui...
}
</script>
</p>
</div>

Você pode notar que no código acima, dentro do if, existe o símbolo <  que representa “menos”, que é parte da sintax, corréto? Este símbolo causa um erro de validação. O validador interpreta ele como um inicio de uma marcação ou uma tag HTML que não foi fechada, a não ser que você encapsule o seu código com o CData, assim:

<div>
<p>
<script type="text/javascript">
//<![CDATA[
var my_variable = 100;
if (my_variable < 50) {
// alguma coisa aqui...
}
//]]>
</script>
</p>
</div>

3. Evite palavras-chaves reservadas do JavaScript quando estiver criando funções e identificadores

Muitas palavras são reservadas no javascript, então você deve evitá-las quando forem criar variáveis ou outros idenficadores. A lista completa de palavras-chaves do javascript segue abaixo:

break
case
catch
continue
default
delete
do
else
finally
for
function
if
in
instanceof
new
return
switch
this
throw
try
typeof
var
void
while
with

4. Evite palavras reservadas do JavaScript quando estiver criando funções e identificadores

Que estão também algumas palavras reservadas, que não estão necessariamente sendo usadas pela linguagem mas são reservadas para o uso futuro. São estas:

abstract
boolean
byte
char
class
const
debugger
double
enum
export
extends
final
float
goto
implements
import
int
interface
long
native
package
private
protected
public
short
static
super
synchronized
throws
transient
volatile

5. Não mude o tipo das variaveis depois da declaração inicial.

No javascript, tecnicamente, isso é perfeitamente legal:

var my_variable = "Esta é uma string";
my_variable = 50;

Depois que a variável é inicialmente declarada como string na linha 1, na linha 2 o seu valor é mudado e o seu tipo também. Esta não é uma boa prática e deve ser evitada.

6. Não use variáveis globais.

Para previnir possíveis conflitos, em 99% dos casos, use o “var” no início quando estivermos declarando uma variável e seu valor. Isso faz com que a sua variável exista somente no escopo da função e não fora dela, ou seja, toda variável criada pelo var, só poderá ser acessível dentro do escopo no qual ela foi declarada e não mais fora dele. Então, se acontecer de você utilizar duas variáveis com o mesmo valor em lugares diferentes do seu script, nenhum conflito ocorrerá.

7. Javascript é Case-Sensitive.

Lembre-se do que vem a seguir: No código que segue temos duas variáveis que estão armazenando seus valores em 2 lugares diferentes na memória, e não um só, como alguns podem pensar. São duas variáveis completamente diferentes alocadas em lugares diferentes na memória:

var myVariable = "data";
var myvariable = "more data";

8. Use o switch para lidar com multiplas condições

Não faça isso:

if (example_variable == "cyan") {
// faça algo aqui...
} else if (example_variable == "magenta") {
// faça algo aqui...
} else if (example_variable == "yellow") {
// faça algo aqui...
} else if (example_variable == "black") {
// faça algo aqui...
} else {
// faça algo aqui...
}

Faça isso:

switch (example_variable) {
case "cyan":
// faça algo aqui...
break;
case "magenta":
// faça algo aqui...
break;
case "yellow":
// faça algo aqui...
break;
case "black":
// faça algo aqui...
break;
default:
// faça algo aqui...
break;
}

O segundo bloco de código faz exatamente a mesma coisa que o primeiro – mas o segundo é limpo, fácil de ler, fácil de dar manutenção e modificar.

9. Use o try-catch para previnir que erros sejam expostos para os usuários

Encapsulando todo o seu código no try-catch, você pode evitar que o usuário final nunca veja um feio erro de javascript exposto na tela. Assim:

try {
funcaoQueNaoExiste();
} catch (error) {
document.write("Um erro ocorreu.")
}

No código acima, eu tentei chamar uma função que não existe, para forçar um erro. O navegador não vai exibir o típico erro “not an object” ou “object expected”, mas ao invés disso, vai exibir um erro mais customizável que eu incluí dentro do meu “catch”. Você pode também deixar o catch vázio para nada ser mostrado para o usuário, ou você pode criar uma função que seja chamada dentro do catch que faça o tratamento deste erro para propósitos de debug etc.

Mantenha na sua cabeça que isso pode esconder erros do desenvolvedor também, então uma boa decumentação do código e comentários podem ser úteis neste ponto.

10. Faça comentários multi-linhas legíveis, mas simples

Em javascript, você pode comentar uma linha de código colocando um // no início da linha. Você também pode criar um comentário em bloco como mostra a seguir: /* [comentário aqui ] */. Algumas vezes você precisa incluir um comentário longo, um comentário de mais de uma linha. Um bom método para se utilizar que não tenha uma visual esmagador, mas é fácil de identificar o código é esse a seguir:

/*
* Este é um comentário multi-linha...
* bla bla bla...
* bla bla bla...
* bla bla bla...
* bla bla bla...
*/

E é isso :-)

Este artigo é uma adaptação e tradução do texto: 10 JavaScript Quick Tips and Best Practices

Compartilhe!
  • Twitter
  • Google Bookmarks
  • Yahoo! Bookmarks
  • del.icio.us
  • Facebook
  • Live
  • LinkedIn
  • Netvibes
  • MySpace
  • Technorati
  • RSS
  • Print
  • Digg
  • email
  • PDF

Posts Relacionados:

Benchmarking de desempenho de código no PHP

4 comments

Posted on 27th October 2009 by Igor Escobar in Otimização |PHP

, ,

Antes de mais nada, Benchmarking é o nome pomposo dado às práticas adotadas na indústria (não importa qual) que visam alcançar um desempenho/qualidade superior. Ou seja, Benchmarking é todo tipo de prática cujo objetivo é melhorar/maximizar/amplificar os resultados.

No artigo de hoje vamos abordar benchmarking focado em código, desempenho especificamente. Não é meu objetivo neste artigo aprofundar sobre profiling etc. Existem muitas práticas de benchmarking que podem ser utilizadas para poder alcançar algum tipo de amplificação na sua área, porém não daria para falarmos detalhadamente de todas em um único artigo.

Quando desenvolvemos aplicações para Internet e o stress da aplicação será muito grande (como um todo), temos que ter cuidado, muito cuidado. Conhecer mais de uma forma de se implementar uma única solução pode ser o que vai salvar o seu pescoço.

Benchmarking de código – na prática

Muitas vezes, quando estamos meditando para solucionar um problema, precisamos saber se aquela implementação é rápida. Mas, como assim, rápida? Como eu vou saber se uma determinada implementação de código/função é rápida o suficiente de forma que supra as necessidades sem comprometer a qualidade de modo geral do sistema?

Vale lembrar que o método que vou mostrar aqui faz com que os resultados variem de máquina para máquina, pois é tudo uma questão de processamento. Os resultados aqui apresentados são apenas para ILUSTRAR e SIMULAR para atingirmos resultados significantes.

Este é o seu momento “MythBusters”.

Descobrir qual é a forma mais rápida de se resolver um problema é uma tarefa simples (nem sempre), em determinados casos, não temos um parâmetro para saber se devemos seguir pelo caminho A ou B, tudo o que nos resta é saber várias formas de se codificar/implementar uma determinada solução e medir o desempenho de todas elas, cada trecho, para assim, resolver o problema.

Vou dar um exemplo de como se medir o desempenho de uma implementação de código, levando em conta um problema que tivemos aqui no trabalho.

Tivemos que desenvolver um framework adhoc (free style) onde nós conseguíssemos obter resultados semelhantes a alguns frameworks bem comuns na Internet como Code Igniter, Cake PHP etc. MVC, Inflector, ActiveRecord, Rotas de Urls etc.

Agora vem a pergunta na cabeça de vocês:
- Por que re-inventar a roda?

A empresa que pediu para que a gente re-inventasse a roda, alegou que estes são frameworks não “oficiais”, e são feitos/mantidos por pessoas em que eles não confiam (untrusted or non certified application).

Resumindo? Eles queriam ver como a “coisa” era implementada, para poder, assim, atingir o melhor desempenho e retirando tudo o que eles não precisam da aplicação, tornando-a mais leve.

A grande questão?

O aquivo ActiveRecord.class.php está demorando muito para terminar o seu serviço, quando você instanciava uma nova classe, a dita cuja tinha um modelo, que, por sua vez, também possuía um controle onde possuía todas as regras do negócio.

Sempre que executássemos uma método da classe por ex ->find, findFirst ou findAll ele retornava um array de objetos, ou seja, era um array e todas as suas posições eram compostas por objetos e suas respectivas propriedades (atributos).

Exemplo

Array
(
    [0] => Usuarios Object
        (
            [nome] => Igor Escobar 1
            [email] => blog@igorescobar.com
        )

    [1] => Usuarios Object
        (
            [nome] => Igor Escobar 2
            [email] => blog@igorescobar.com
        )

    [2] => Usuarios Object
        (
            [nome] => Igor Escobar 3
            [email] => blog@igorescobar.com
        )

)

Era mais ou menos assim que ele retornava os usuários de uma determinada tabela. Este é um array de objetos com apenas 3 elementos, mas para você ter um resultado para que possamos simular um resultado no benchmarking mais expressivo, você precisa de um array de objetos com mais elementos, pois iria exigir mais do processador, etc. No nosso experimento vou aumentar este array de objetos para 10.000 elementos e veremos quanto tempo ele demora para fazer o trabalho.

Medindo o desempenho (do trecho)

Criei uma class de exemplo, apenas para conseguirmos a estrutura vista acima:

<?php
public class Usuarios {
	var $nome;
	var $email;
}
?>

Agora, eu crio a implementação para atingir o resultado esperado:

$arraUsuarios = array();
for($i = 1 ; $i <= 10000; $i++):
	$obUsuarios = new Usuarios();
	$obUsuarios->nome = "Igor Escobar {$i}";
	$obUsuarios->email = "blog@igorescobar.com";
	$arraUsuarios[] = $obUsuarios;
endfor;

Para medir o desempenho exatamente no trecho que queremos, eu utilizo a função microtime() do php.

$time_start = microtime(true);
$arraUsuarios = array();
for($i = 1 ; $i <= 10000; $i++):
	$obUsuarios = new Usuarios();
	$obUsuarios->nome = "Igor Escobar {$i}";
	$obUsuarios->email = "blog@igorescobar.com";
	$arraUsuarios[] = $obUsuarios;
endfor;
$time_end = microtime(true);
$Benchmarking1 = ($time_end - $time_start);
echo "Array de Objetos levou: " . $Benchmarking1 . " microsecondos<br />\n";
//Output: Array de Objetos levou: 0.04233980178833 microsecondos

Agora vamos criar uma outra implantação, ao invés de retornarmos uma array de objetos, vamos retornar um array de arrays, ou seja, seria uma array com n posições e todas as suas propriedades seriam INDICES do array e não mais atributos do objeto.

Exemplo

Array
(
    [0] => Array
        (
            [nome] => Igor Escobar 1
            [email] => blog@igorescobar.com
        )

    [1] => Array
        (
            [nome] => Igor Escobar 2
            [email] => blog@igorescobar.com
        )

    [2] => Array
        (
            [nome] => Igor Escobar 3
            [email] => blog@igorescobar.com
        )

)

O mesmo script, apenas montando de maneira diferente (array de arrays), ficou assim:

$time_start = microtime(true);
$arraUsuarios = array();
for($i = 1 ; $i <= 10000; $i++):
	$arraUsuarios[] = array (
			'nome' => "Igor Escobar {$i}",
			'email' => 'blog@igorescobar.com'
		);
endfor;
$time_end = microtime(true);
$Benchmarking2 = ($time_end - $time_start);
echo "Array de Arrays levou: " . ($Benchmarking2) . " microsecondos<br />\n";
//Output: Array de Arrays levou: 0.036391973495483 microsecondos

Qual método é mais rápido?

// Se resultado for negativo: Método 1 é mais rápido
// Se resultado for positivo: Método 2 é mais rápido
echo "Resultado: " . ($Benchmarking1 - $Benchmarking2);
//Output: Resultado: 0.007580041885376

Viram? Duas formas de fazer a mesma coisa e a segunda forma é 0.007580041885376 microsegundos mais rápida.

Conclusão

Neste simples teste, podemos tirar a seguinte conclusão: neste caso, utilizar a minha estrutura de retorno como um array de objetos é mais lento do que trabalhar com um array de arrays. Este é um teste fora da realidade, quanto mais próximo da realidade a complexidade do dia-a-dia, este número aumenta, tende a ser cada vez maior.

Veja que este exemplo não envolve conexão com banco de dados, acrescente todo o stress que envolve validação de regras de negócio, segurança, consistência e etc., e veja este número crescer MUITO mais.

Vale lembrar que eu não estou dizendo para vocês não, nunca mais, utilizarem objetos, porque não é isso, estou apenas ilustrando que NESTE CASO, foi mais rápido, e mais interessante para o projeto que o retorno desta função fosse um array de arrays, é tudo uma questão de escolher entre mysql_fetch_assoc, mysql_fetch_array, mysql_fetch_object ou mysql_fetch_row, cada uma tem suas características e são válidas dependendo da sua necessidade em questão.

Você pode aplicar isso em “tudo” na sua aplicação, até para saber quanto tempo uma determinada função demora para terminar seu trabalho basta utilizar o microtime() no começo e no final da função e subtrair os valores do maior para o menor.

$time_start = microtime(true);
//nome da função
$time_end = microtime(true);

E é isso, pessoal, espero que tenham gostado. Certamente, se vocês utilizarem este recurso para o seu crescimento profissional, será de muita valia para vocês.

Fonte Completo

<?php
class Usuarios {
	var $nome;
	var $email;
}

$time_start = microtime(true);
$arraUsuarios = array();
for($i = 1 ; $i <= 10000; $i++):
	$obUsuarios = new Usuarios();
	$obUsuarios->nome = "Igor Escobar {$i}";
	$obUsuarios->email = "blog@igorescobar.com";
	$arraUsuarios[] = $obUsuarios;
endfor;
$time_end = microtime(true);
$Benchmarking1 = ($time_end - $time_start);
echo "Array de Objetos levou: " . $Benchmarking1 . " microsecondos<br />\n";

$time_start = microtime(true);
$arraUsuarios = array();
for($i = 1 ; $i <= 10000; $i++):
	$arraUsuarios[] = array (
			'nome' => "Igor Escobar {$i}",
			'email' => 'blog@igorescobar.com'
		);
endfor;
$time_end = microtime(true);
$Benchmarking2 = ($time_end - $time_start);
echo "Array de Arrays levou: " . ($Benchmarking2) . " microsecondos<br />\n";

// Se resultado for negativo: Método 1 é mais rápido
// Se resultado for positivo: Método 2 é mais rápido
echo "Resultado: " . ($Benchmarking1 - $Benchmarking2);

?>

[]‘s
Igor.

UPDADE: Este artigo foi reformulado devido a muitas dúvidas e questionamentos referentes a este meu método. Obrigado a todos que ajudaram no amadurecimento do conteúdo.

Compartilhe!
  • Twitter
  • Google Bookmarks
  • Yahoo! Bookmarks
  • del.icio.us
  • Facebook
  • Live
  • LinkedIn
  • Netvibes
  • MySpace
  • Technorati
  • RSS
  • Print
  • Digg
  • email
  • PDF

Posts Relacionados: