O virtualenvwrapper é a maneira mais simples de criar ambientes python isolados (virtualenv). Sua instalação é bem simples.
$ sudo pip install virtualenvwrapper
$ mkdir ~/.envs
$ export WORKON_HOME=~/.envs
$ source /usr/local/bin/virtualenvwrapper.sh
Após a instalação e ter executado o comando source, você manipulará seus ambientes virtuais com os seguintes comandos.
mkvirtualenv nome_do_ambiente: Cria um ambiente virtual.
workon nome_do_ambiente: Utiliza o ambiente virtual.
deactivate nome_do_ambiente: Sai do ambiente virtual.
rmvirtualenv nome_do_ambiente: Delete o ambiente virtual.
É necessário executar os comandos export e source listados acima, toda vez que abrir o terminal. Para automatizar essa tarefa, você pode abrir o arquivo ~/.bashrc (ou ~/.bash_profile para usuários Mac)e adicionar as duas linhas no final do arquivo.
export WORKON_HOME=~/.envs
source /usr/local/bin/virtualenvwrapper.sh
Python Iterators e Generators #dicaDeSexta
Vou fazer uma breve abordagem sobre o uso de Iteratos e Generators
Para iniciar, vamos fazer uma implementação simples do que seria o range do python.
O problema dessa implementação é que ele gera um list desnecessário, vamos supor que queremos gerar um my_range(10000000), ele irá retornar um list com 10000000 de células. É um desperdício de memória.
Beleza! Resolvemos o problema de memória, mas... É muito código pra pouca coisa! A solução está nos generators!
O código ficou muito mais limpo. Quando a palavra chave yield está dentro de uma função, esta função se torna um iterator. Para demonstrar o funcionamento do iterator coloquei uns prints no código acima, para entendermos o seu funcionamento.
O output será o seguinte:
Repare que quando chamamos o método my_xrange(2), o print que é exibido no começo do corpo da função 'my_xrange iniciado.' (linha 6) não foi exibido no output.
Isso porque quando chamamos o método, o Python não chama a função, ele gera um iterator. A função só é executada quando o método __next__ (Python3) ou next (Python2) é chamado. Quando o __next__ é chamado ele libera a execução da função, se a execução chegar a algum yield o valor do yield é retornado, senão, é lançado o StopIteration, como no nosso exemplo nosso loop ia até dois, na terceira chamada ao método __next__ foi lançado o exception StopIterator.
Para iniciar, vamos fazer uma implementação simples do que seria o range do python.
1 def my_range(start, stop=None, step=1):
2 if stop is None:
3 stop = start
4 start = 0
5
6 ret = []
7
8 while start < stop:
9 ret.append(start)
10 start += step
11
12 return ret
13
14
15 for i in my_range(100):
16 print(i)
O problema dessa implementação é que ele gera um list desnecessário, vamos supor que queremos gerar um my_range(10000000), ele irá retornar um list com 10000000 de células. É um desperdício de memória.
Iterator
Um iterator, segundo a documentação do Python é "um objeto que representa um fluxo de dados. Repetidas chamadas ao método next do objeto iterator retorna o item seguinte. Quando não há mais dados é lançado a exception StopIteration.". Para um objeto ser iterator é necessário que ele contenha o método __iter__, grande parte das implementações desse método retorna self. Vejamos a implementação do my_range com iterator. 1 class my_xrange(object):
2 def __init__(self, start, stop=None, step=1):
3 if stop is None:
4 stop = start
5 start = 0
6
7 self.start = start
8 self.stop = stop
9 self.step = step
10 self.current = start
11
12 def __iter__(self):
13 return self
14
15 # Python 3
16 def __next__(self):
17 if self.current < self.stop:
18 ret = self.current
19 self.current += 1
20 return ret
21 raise StopIteration()
22
23 # Python 2 / Compatibilizando
24 def next(self):
25 return self.__next__()
26
27
28 for i in my_xrange(100):
29 print(i)
Beleza! Resolvemos o problema de memória, mas... É muito código pra pouca coisa! A solução está nos generators!
Generators
Segundo a documentação do Python generators "permitem que você declare uma função que se comporta como um iterador, ou seja, ele pode ser usado em um loop". No lugar de return, usamos yield. 1 def my_xrange(start, stop=None, step=1):
2 if stop is None:
3 stop = start
4 start = 0
5
6 while start < stop:
7 yield start
8 start += step
9
10
11 for i in my_xrange(100):
12 print(i)
O código ficou muito mais limpo. Quando a palavra chave yield está dentro de uma função, esta função se torna um iterator. Para demonstrar o funcionamento do iterator coloquei uns prints no código acima, para entendermos o seu funcionamento.
1 def my_xrange(start, stop=None, step=1):
2 if stop is None:
3 stop = start
4 start = 0
5
6 print('my_xrange iniciado.')
7 while start < stop:
8 print('código bloqueado no yield')
9 yield start
10 print('código liberado após iteração')
11 start += step
12 print('acabei')
13
14
15 the_range = my_xrange(2)
16 print('Vou mostrar o primeiro item do the_range')
17 print(the_range.__next__())
18 print('----------------------------------------')
19
20 # para o python2 use
21 # print(the_range.next())
22
23 print('Vou iterar o the_range')
24 print('----------------------------------------')
25 print(the_range.__next__())
26 print('----------------------------------------')
27 print(the_range.__next__())
O output será o seguinte:
Vou mostrar o primeiro item do the_range my_xrange iniciado. código bloqueado no yield 0 ---------------------------------------- Vou iterar o the_range ---------------------------------------- código liberado após iteração código bloqueado no yield 1 ---------------------------------------- código liberado após iteração acabei Traceback (most recent call last): File "my_xrange_stoped.py", line 27, inprint(the_range.__next__()) StopIteration
Repare que quando chamamos o método my_xrange(2), o print que é exibido no começo do corpo da função 'my_xrange iniciado.' (linha 6) não foi exibido no output.
Isso porque quando chamamos o método, o Python não chama a função, ele gera um iterator. A função só é executada quando o método __next__ (Python3) ou next (Python2) é chamado. Quando o __next__ é chamado ele libera a execução da função, se a execução chegar a algum yield o valor do yield é retornado, senão, é lançado o StopIteration, como no nosso exemplo nosso loop ia até dois, na terceira chamada ao método __next__ foi lançado o exception StopIterator.
VirtualBox, Debian e Linux Kernel 4.0
Quando atualizei o Kernel para a versão 4.0, o Virtualbox parou de funcionar, exibindo, inclusive mensagens de erro durante o boot.
Segundo o ticket bug #13835, o problema já foi corrigido na versão 4.3.24 cabendo apenas atualizá-lo.
Até o momento dessa publicação o VirtualBox 4.3.24 ainda não estava nos repositórios padrão do Debian. Para verificar atualizar, basta seguir o passo a passo abaixo como root:
# echo "deb http://download.virtualbox.org/virtualbox/debian wheezy contrib non-free" >> /etc/apt/source.list
# wget -q https://www.virtualbox.org/download/oracle_vbox.asc -O- | sudo apt-key add -
# apt-get update
# apt-get install virtualbox-4.3
Segundo o ticket bug #13835, o problema já foi corrigido na versão 4.3.24 cabendo apenas atualizá-lo.
Até o momento dessa publicação o VirtualBox 4.3.24 ainda não estava nos repositórios padrão do Debian. Para verificar atualizar, basta seguir o passo a passo abaixo como root:
# echo "deb http://download.virtualbox.org/virtualbox/debian wheezy contrib non-free" >> /etc/apt/source.list
# wget -q https://www.virtualbox.org/download/oracle_vbox.asc -O- | sudo apt-key add -
# apt-get update
# apt-get install virtualbox-4.3
Mutucas, Pneu, Borboleta e Vitamina D
Ontem sai para pedalar com meu pai. Achei bem estranho a gente ter conseguido sair da garagem. Sempre que tento fazer tal coisa chove, o PCC faz um toque de recolher e um grupo alienígena de dinossauros invadem a terra.Enfim, o plano era irmos até Paranapiacaba, estava indo tudo bem não fosse elas, da ordem dos diptera, as "Mutucas". Você pode dizer "O Carlos é fresco. Tem medo de tudo". Mas dessa vez foi demais, até meu pai estava reclamando, era possível as ver nos perseguindo na sombra.
Teve uma que me atacou de tal forma, que quando estava indo embora, perguntei onde estava o meu suco e meu pão com mortadela. Depois de doar tanto sangue o mínimo era ter um lanche.
Quando já tínhamos pedalado uns 6 km, o pneu da minha bicicleta furou.
Sem problemas! Somos prevenidos. Temos, bomba de ar, remendo e ferramentas. Só não esperávamos que a bomba de ar quebraria na primeira bombeada. Bora voltar pedalando 6 km com o pneu furado.
Enquanto quicava no banco da bicicleta, eis que surge uma borboleta. Voltemos a frase "Tem medo de tudo", só que dessa vez eu tive motivos para ter medo. A borboleta queria ter relações sexuais comigo. Ela entrou na minha bermuda e não queria sair. Sorte que eu não estava de samba canção.
Eu achei estranho, a um nível ridículo, meu pai sair pra pedalar de calça jeans. Segundo ele, ele só se sente bem pedalando assim. Mas depois da aparição da borboleta, eu até o entendo.
Pelo menos eu tenho Vitamina D acumulada para no mínimo uns 5 anos. O sinal dessa minha super-dosagem é a vermelidão que está presente em boa parte do meu corpo.
Moral a história:
Gostava mais quando o grupo alienígena se juntava ao PCC e não deixava eu sair pra andar de bicicleta com meu pai.
Criando quadrados responsivos
No projeto que estou trabalhando atualmente, tive a necessidade de criar quadrados responsivos.
Criar um quadrado é muito fácil, não? Basta setar a altura igual a largura e estamos felizes. Porém, por se tratar de um quadrados responsivo, estamos pensando em porcentagem.
Se eu definir um quadrado com 10% de largura e 10% de altura. Adivinha o que vai acontecer? Você acertou! Não será um quadrado
Depois de muito tempo estudando uma maneira de fazer um quadrado responsivo, cheguei a seguinte solução:
O padding é sempre relativo a largura, logo, se você definir a altura do elemento com 0 e o padding-bottom com a porcentagem da altura você terá o resultado esperado. Segue exemplo abaixo:
Criar um quadrado é muito fácil, não? Basta setar a altura igual a largura e estamos felizes. Porém, por se tratar de um quadrados responsivo, estamos pensando em porcentagem.
Se eu definir um quadrado com 10% de largura e 10% de altura. Adivinha o que vai acontecer? Você acertou! Não será um quadrado
Exemplo:
10% x 10%
Depois de muito tempo estudando uma maneira de fazer um quadrado responsivo, cheguei a seguinte solução:
O padding é sempre relativo a largura, logo, se você definir a altura do elemento com 0 e o padding-bottom com a porcentagem da altura você terá o resultado esperado. Segue exemplo abaixo:
Guia para Designers: Website Responsivo
O que são Frameworks?
Sempre me perguntam o que é esse tal de Framework que eu sempre falo. Framework nada mais é do que um conjunto de elementos pré-definidos que ajudam a nós desenvolvedores não ficarmos reinventando a roda.Nesse post trabalharei com o Bootstrap do Twitter. Há vários outros, porém a ideia desse post não é ensinar a usar frameworks front-end e sim exemplificar os conceitos de um website responsivo.
Grids
Acredito que esse seja o ponto mais importante quando estamos falando de website responsivo. Os grids são o que mandam na forma que o seu conteúdo irá aparecer.
A primeira coisa a se considerar é qual vai ser a largura do site. Por padrão o Bootstrap trabalha com 1170px de largura no modo responsivo, caso a tela seja menor que 1170px ele passa a assumir 940px, depois 724px, após isso o site fica fluido, ou seja, todos os elementos assumem 100% da página.
Temos 12 tamanhos de colunas diferentes que se encaixam perfeitamente e serão dentro dessas colunas que você colocará o conteúdo do seu site.
Veja um exemplos de colunas aqui: http://maniero.tk/bootstrap/grids.html
Temos 12 tamanhos de colunas diferentes que se encaixam perfeitamente e serão dentro dessas colunas que você colocará o conteúdo do seu site.
Veja um exemplos de colunas aqui: http://maniero.tk/bootstrap/grids.html
Mostrando e ocutando elementos
Uma prática necessária na criação de layouts responsivos é a de mostrar e ocultar elementos na página dependendo do dispositivo que está acessando o site. Um exemplo de utilização dessa prática na criação de Menus. Dificilmente um menu localizado no Header fica bom na navegação mobile, então deve ser criado uma versão para os dispositivos mobile.Bootstrap em PSD
O Bootstrap possui diversos outros elementos que podem ser aproveitados também no layout, assim como botões icones, navbars, etc. Você pode baixar os elementos do Bootstrap em PSD aqui: http://www.bentdesignstudio.com/v2/2012/03/twitter-bootstrap-2-photoshop-template-psd/Conclusão
Espero que esse artigo possam ajudar a vocês "amigos designers" (se é que existe amizade entre programadores e designers, hehe) a esclarecer dúvidas básicas de como funciona um website responsivo. Se surgirem dúvidas eu atualizarei essa postagem.BikeSampa: Experiência
Não, programador não vive só sentado na frente do computador tomando café e digitando na "telinha preta". Tenho hobbies é um deles é pedalar. Adoro a sensação de vento na cara.
Assim que vi as bikes do Itaú espalhadas pela cidade, fiquei encantado. Logo procurei fazer meu cadastro.
Nos primeiros dias comecei a ter problemas. A estação 82 (Shopping Santa Cruz) nunca está disponível. Meu trajeto começa no Shopping Santa Cruz e vai até a Dr. Barcelar (Vila Clementino). Porém devido a essa indisponibilidade tenho que andar até a estação Altino Arantes (estação 83).
Fora isso, em um único dia, peguei uma bicicleta com pneu furado. Devolvi e procurei outra, mas estava com o pedivela com problemas. Só em uma terceira tentativa, encontrei uma bike em estado razoável.
Porém, não tive tantos problemas no estado das bicicletas, as boas pelos 10 reais pagos para dois anos de utilização.
Mas hoje confesso que fiquei tremendamente decepcionado com o serviço, já tive problemas em desbloquear uma bicicleta e ela não sair, porém, bastava ligar novamente e desbloquear outra. Hoje foi diferente. Para começar só havia duas bicicletas na estação (isso não é um problema, sei que tem bastante gente usando) e além de mim, havia outra garota, aparentemente com problemas para desbloquear a bicicleta. Era uma bicicleta para cada. A bicicleta na posição 8 se recusou a sair, minha reação natural foi ligar e pedir para que fosse desbloqueada novamente.
A bicicleta não saiu e ainda ficou como "em uso", o que era para ser um meio alternativo de chegar ao trabalho para poupar tempo, acabou me custando meia hora de atraso.
De qualquer forma, amanhã tentarei usar novamente o serviço, entre pegar um ônibus, ir andandado ou ir de bicicleta, eu ainda prefiro ir de bicicleta, mesmo tendo mais dor de cabeça.
Espero mesmo que o Itaú melhore o serviço, afinal, acho um serviço incrível.
![]() |
| Aqui estou eu indo trabalhar de bicicleta. |
Nos primeiros dias comecei a ter problemas. A estação 82 (Shopping Santa Cruz) nunca está disponível. Meu trajeto começa no Shopping Santa Cruz e vai até a Dr. Barcelar (Vila Clementino). Porém devido a essa indisponibilidade tenho que andar até a estação Altino Arantes (estação 83).
Fora isso, em um único dia, peguei uma bicicleta com pneu furado. Devolvi e procurei outra, mas estava com o pedivela com problemas. Só em uma terceira tentativa, encontrei uma bike em estado razoável.
Porém, não tive tantos problemas no estado das bicicletas, as boas pelos 10 reais pagos para dois anos de utilização.
Mas hoje confesso que fiquei tremendamente decepcionado com o serviço, já tive problemas em desbloquear uma bicicleta e ela não sair, porém, bastava ligar novamente e desbloquear outra. Hoje foi diferente. Para começar só havia duas bicicletas na estação (isso não é um problema, sei que tem bastante gente usando) e além de mim, havia outra garota, aparentemente com problemas para desbloquear a bicicleta. Era uma bicicleta para cada. A bicicleta na posição 8 se recusou a sair, minha reação natural foi ligar e pedir para que fosse desbloqueada novamente.
A bicicleta não saiu e ainda ficou como "em uso", o que era para ser um meio alternativo de chegar ao trabalho para poupar tempo, acabou me custando meia hora de atraso.
De qualquer forma, amanhã tentarei usar novamente o serviço, entre pegar um ônibus, ir andandado ou ir de bicicleta, eu ainda prefiro ir de bicicleta, mesmo tendo mais dor de cabeça.
Espero mesmo que o Itaú melhore o serviço, afinal, acho um serviço incrível.
Portifólio
Depois de um longo tempo prometendo criar um portifólio, finalmente está pronto. Fiz no modo pastel com CodeIgniter. Agora só basta ter tempo para alimentá-lo.
Segue o link: http://www.maniero.tk/
Segue o link: http://www.maniero.tk/
Jquery com MTV(MVC) - Jquery MTVe
"Model-view-controller (MVC) é um modelo de desenvolvimento de Software, atualmente considerado uma "arquitetura padrão" utilizada na Engenharia de Software." - Fonte: http://pt.wikipedia.org/wiki/MVC
Nada é mais problemático nos dias de hoje quanto a falta de padronização nos projetos. Após uma procura na internet encontrei alguns frameworks MVC para javascript, mas, nenhum me agradou. Alguns me pareceram bem completos, mas, não me atendiam muito bem.
Achei de bom senso criar um próprio, coloquei algumas ideias no papel e cheguei a uma primeira versão. Ele deveria ser leve, de fácil utilização e o mais simples possível.
Tentei aproximar ao máximo a forma do Framework Django trabalhar, e cheguei a seguinte estrutura:
Primeiramente, entre na página no GitHub do projeto serão necessários os arquivos que estão dentro da pasta src.
O método "profile" retorna os dados do meu perfil e o find_profile retorna os dados de um usuário qualquer.
O método load:
Como você deve ter percebido ambos os métodos do modelo utilizam o método load. Ele é o método responsável em fazer as requisições via Ajax. E possui os seguintes parâmetros:
Para chamar um método ou acessar um atributo, usa-se o método get.
Exemplos:
model.get('me');
model.get('profile')();
O método template usa o jQuery.tmpl, ele ainda não está em faze final, mas, está bem estável. Então esse será o conteúdo do nosso template:
HTML: https://github.com/carlosmaniero/jQuery-MTVe/blob/master/demos/demo1.tmpl
Os arquivos de template podem ser salvos com a extensão tmpl ou escrito em forma de texto, no exemplo salvaremos em um arquivo .tmpl.
Javascript:
Renderizando um template:
Para renderizar um template, basta utilizar o método método get passando como parâmetros o nome do atributo e o objeto que será usado para substituir no template.
Exemplo:
template.get('profile',json);
Vamos ao javascript:
Javascript:
O exemplo completo você encontra na pasta demos do projeto.
Nada é mais problemático nos dias de hoje quanto a falta de padronização nos projetos. Após uma procura na internet encontrei alguns frameworks MVC para javascript, mas, nenhum me agradou. Alguns me pareceram bem completos, mas, não me atendiam muito bem.
Achei de bom senso criar um próprio, coloquei algumas ideias no papel e cheguei a uma primeira versão. Ele deveria ser leve, de fácil utilização e o mais simples possível.
Tentei aproximar ao máximo a forma do Framework Django trabalhar, e cheguei a seguinte estrutura:
- Model
- Template
- View
- events
Primeiramente, entre na página no GitHub do projeto serão necessários os arquivos que estão dentro da pasta src.
Model:
Nosso modelo irá fazer uma requisição na graph api do Facebook. Ela terá dois atributos. Um será chamado "me" ele armazenará o meu username e outro chamado "base" que será utilizado para requisitar dados de perfil de outros usuários.var model = $.Model({
me : 'carlos.maniero',
base : 'http://graph.facebook.com/',
profile : function() { return this.load('GET', this.base + this.me ); },
find_profile : function(username) { return this.load('GET', this.base + username ); },
});
O método "profile" retorna os dados do meu perfil e o find_profile retorna os dados de um usuário qualquer.
O método load:
Como você deve ter percebido ambos os métodos do modelo utilizam o método load. Ele é o método responsável em fazer as requisições via Ajax. E possui os seguintes parâmetros:
- type: GET ou POST
- url: Endereço da requisição
- data: Json com dados a serem enviados
- options: Opções do método jQuery.ajax
Para chamar um método ou acessar um atributo, usa-se o método get.
Exemplos:
model.get('me');
model.get('profile')();
Template:
O método template usa o jQuery.tmpl, ele ainda não está em faze final, mas, está bem estável. Então esse será o conteúdo do nosso template:
HTML: https://github.com/carlosmaniero/jQuery-MTVe/blob/master/demos/demo1.tmpl
Os arquivos de template podem ser salvos com a extensão tmpl ou escrito em forma de texto, no exemplo salvaremos em um arquivo .tmpl.
Javascript:
var template = $.Template({
profile : 'demo1.tmpl'
});
Renderizando um template:
Para renderizar um template, basta utilizar o método método get passando como parâmetros o nome do atributo e o objeto que será usado para substituir no template.
Exemplo:
template.get('profile',json);
View (Controlador):
"O controlador (controller) recebe a entrada de dados e inicia a resposta ao utilizador ao invocar objetos do modelo, e por fim uma visão baseada na entrada. Ele também é responsável pela validação e filtragem da entrada de dados." - Fonte: http://pt.wikipedia.org/wiki/MVCVamos ao javascript:
var view = $.View({
profile : function(){
var data = $.parseJSON(model.get('profile')());
$("table").append(template.get('profile',data));
},
find_profile : function(username){
var data = $.parseJSON(model.get('find_profile')(username));
$('table').append(template.get('profile',data));
}
});
Events:
Nos eventos ficarão todas as função que serão usadas em nossos elementos.Javascript:
var events = $.Events({
profile : function(evt){
evt.preventDefault();
view.get("profile")();
$(this).attr('disabled','true');
},
find_profile : function(evt){
evt.preventDefault();
var username = $("input[name=username]").val();
view.get("find_profile")(username);
}
});
$("#button_profile").click(events.get('profile'));
$("#button_find_profile").click(events.get('find_profile'));
Como eu disse anteriormente ele é bem simples, porém, bastante útil.O exemplo completo você encontra na pasta demos do projeto.
PHP - Long Polling
Long Polling é uma técnica utilizada para se obter dados e informações em "tempo real" sem que haja uma requisição por parte do usuário.
Como isso é possível?
Existem algumas formas disso ser feito, nesse artigo, abordaremos o Long Polling.
Criaremos nesse artigo um pequeno chat, lembre-se que o intuito do artigo não é ensinar a fazer um chat, e sim, demostrar o funcionamento do Long Polling.
Vamos ao nosso arquivo poll.php, ele será responsável em trazer novas mensagens que foram enviadas pelo chat.
Entendendo o poll.php
No arquivo poll há uma função que recebe como parâmetro o $cur_line, essa é a linha atual do chat. Cada mensagem estará em uma linha de um arquivo .txt.
Sem muito segredo, a função poll lê o arquivo chat.txt e verifica se há novas linhas no arquivo, caso negativo, ele coloca o programa para dormir durante 1 segundo, isso é muito importante para amenizar o gargalo de processamento.
Caso haja novas linhas, ele coloca as novas linhas em um vetor que é encodado para json.
Javascript:
A função get_messages envia um post para o arquivo poll.php e imprime em uma lista o resultado(json) retornado e atualiza o número de linhas carregadas, que vem no json retornado.
Eu sempre recomendo que a conexão seja interrompida de tempo em tempo. No meu caso dixei o timeout em 30 segundos. Isso evita que, em caso de erros, o servidor fique com o processo travado.
Quando requisição é completada, eu chamo a função get_messages novamente, fazendo com que sempre haja uma conexão ativa com o servidor.
Com o Long Polling o chat sempre estará trazendo as novas mensagens de forma rápida, sem precisar ficar enviando milhares de requisições para o servidor.
Se quiser o projeto completo, eu subi no github.
Segue o link: https://github.com/carlosmaniero/Php-long-polling
Demonstração: http://www.livrodeoracao.com.br/dev/chat/index.php
Como isso é possível?
Existem algumas formas disso ser feito, nesse artigo, abordaremos o Long Polling.
Criaremos nesse artigo um pequeno chat, lembre-se que o intuito do artigo não é ensinar a fazer um chat, e sim, demostrar o funcionamento do Long Polling.
Vamos ao nosso arquivo poll.php, ele será responsável em trazer novas mensagens que foram enviadas pelo chat.
set_time_limit(0);
function poll($cur_line){
// Lê arquivo
$data = file_get_contents('chat.txt');
$lines = explode("\n", $data);
// Verifica se o número de linha é igual a linha atual ou se a linha 0 está vazia
if(count($lines) == $cur_line || empty($lines[0])){
// Coloca o script para dormir por 1 segundo
sleep(1);
return poll($cur_line);
}else{
$ret = array();
$ret['lines'] = array();
// Coloca somente as linhas que não foram lidas no vetor
for($cur_line;$cur_line < count($lines); $cur_line++){
$ret['lines'][] = $lines[$cur_line];
}
// Adciona a linha atual no vetor
$ret['cur_line'] = $cur_line;
// Encoda o vetor em json
return json_encode($ret);
}
}
echo poll($_POST['cur_line']);
Entendendo o poll.php
No arquivo poll há uma função que recebe como parâmetro o $cur_line, essa é a linha atual do chat. Cada mensagem estará em uma linha de um arquivo .txt.
Sem muito segredo, a função poll lê o arquivo chat.txt e verifica se há novas linhas no arquivo, caso negativo, ele coloca o programa para dormir durante 1 segundo, isso é muito importante para amenizar o gargalo de processamento.
Caso haja novas linhas, ele coloca as novas linhas em um vetor que é encodado para json.
Javascript:
var cur_line = 0;
var poll;
function get_messages(){
poll = $.ajax({
type: "POST",
url: "poll.php",
data: { 'cur_line' : cur_line },
dataType: "json",
success: function(json, textStatus, jqXHR) {
cur_line = json.cur_line;
// Insere linhas na tela
for(i=0;i' + json.lines[i] + '');
$("#chat #chat-content .messages").prepend(line);
}
},
complete: function(){
get_messages();
},
timeout: 30000
});
}
A função get_messages envia um post para o arquivo poll.php e imprime em uma lista o resultado(json) retornado e atualiza o número de linhas carregadas, que vem no json retornado.
Eu sempre recomendo que a conexão seja interrompida de tempo em tempo. No meu caso dixei o timeout em 30 segundos. Isso evita que, em caso de erros, o servidor fique com o processo travado.
Quando requisição é completada, eu chamo a função get_messages novamente, fazendo com que sempre haja uma conexão ativa com o servidor.
Com o Long Polling o chat sempre estará trazendo as novas mensagens de forma rápida, sem precisar ficar enviando milhares de requisições para o servidor.
Se quiser o projeto completo, eu subi no github.
Segue o link: https://github.com/carlosmaniero/Php-long-polling
Demonstração: http://www.livrodeoracao.com.br/dev/chat/index.php
Capítulo 2 - Vivendo como terráqueo
Depois
de muita pesquisa, Solrac chega a uma conclusão:
- Não tem jeito, eu vou passar pelo menos um quinto da minha vida - o equivalente a três séculos terráqueos - preso nesse planeta.
- Então vou viver como um terráqueo. Vou vender algumas coisas, cursar uma faculdade e quem sabe consigo desenvolver algo que me tire desse planeta.
Ele juntou alguns metais de valor (pelo menos para os terráqueos) que estavam em sua mochila, debaixo de uma toalha - itém indispensável segundo o guia do mochileiro das galáxias – e levou até um senhor no centro da cidade, que trabalhava com uma placa em volta do seu corpo com o inscrito “Compra-se ouro”. Ele foi encaminhado até uma joalheria onde conseguiu um bom dinheiro pelos seus metais.
Solrac
estava decidido em cursar algo que envolvesse linguagens de
programação terráquea. Então realizou sua matrícula em uma
universidade localizada em um bairro de italianos na Zona Leste de São
Paulo. Não foi nada fácil comprovar que ele já havia concluído o
ensino médio, já que a universidade não aceitava histórico
escolar intergalático.
Capítulo 1 - Solrac preso no planeta Terra
Tome
nota:
O
AANT (Associação Alienígena de Normas Técnicas) em conjunto com a
AATEL (Agência Alienígena de Telecomunicações) definiram que
quaisquer tipo de transmissão, sejam elas via celulares, tablets, ou
qualquer outro tipo de aparelho, sejam realizadas através de ondas
de radiação ultravioleta. Na Terra, a ozonosfera torna praticamente
impossível se comunicar com planetas e ou galáxias vizinhas. Por
esse motivo muitos terráqueos não acreditam na existência de
alienígenas.
Durante
sua viagem Solrac estava indo para uma pequena cidade na região
metropolitana de São Paulo, ele estava procurando um local onde
pudesse desenhar formas geométricas, com a finalidade de causar
alguma repercussão na mídia. Em uma manobra mal executada, perdeu o
controle e colidiu com uma arvore.
- Droga!
A nave está destruída. Como vou sair desse fim de Universo?
- Ah!
Minha mãe vai me matar, eu disse que só iria comprar algumas
joias em Saturno.
- E
meu pai? Qual será a reação dele ao saber que dei perda total em
sua nave.
A
única forma de Solrac sair da Terra, era aguardar a vinda de uma
outra espaçonave que poderia demorar séculos terráqueos para
chegar. Dada essas condições, decide então conhecer um pouco mais
sobre o planeta em que estava. Após um série de adaptações que
ele realizou em seu computador, ele conseguiu finalmente acessar a
internet terráquea.
Após uma longa pesquisa no Google sobre tecnologia terráquea, ele chegou a um termo que até então era desconhecido, o Open Source. Ao ler o artigo no Wikipédia ele não entendeu como podem existir pessoas que simplesmente disponibilizam o trabalho de uma vida. Em seu planeta não existia software livre, muito menos gratuito, por essa razão software livre era algo insano para ele.
Desacreditando no que havia lido, ele decide então baixar um Linux, para ver como aquilo funcionava. Após usar o Linux ditribution chooser (http://www.zegeniestudios.net/ldc/index.php?lang=pt-br) baixou o Ubuntu para ver como se sairia. Para sua surpresa o Ubuntu reconheceu perfeitamente os drivers de seu computador, o que o espantou, já que o mesmo foi feito com tecnologia alienígena.
- Não
é possível! Como algo tão bom assim pode ser de graça?
Após
a descoberta do Linux, ele começou a pesquisar mais a respeito de
software livre e linguagens de programação, ficou apaixonado
com a simplicidade do Python. E foi ali, no seu terminal do Ubuntu
que ele fez o seu primeiro “Hello World” em linguagem
terráquea.
Conjuntos Numéricos - Parte II
![]() |
| Creditos: sxc.hu |
Subconjunto
Em subconjuntos iremos estudar se um conjunto A por exemplo é subconjunto do conjunto B, para que isso possa ser verdade todos os elementos de A deve estar presentes em B. Vamos ver um exemplo para ilustrar melhor a situação:
A = { 7 , 8 , 9 }
B = { 6 , 7 , 8 , 9 , 10 }
Logo:
A ⊂ B ou seja A está contido em B, pois os todos os elementos de A pertencem a B, lembrando que a concavidade do símbolo sempre estará apontando para o conjunto com maior número de elementos, logo A ⊂ B é equivalente a B ⊃ A.
Intervalos:
Com intervalos a regra de subconjuntos é aplicada da mesma forma. Exemplos:
[ 1 , 3 [ ⊂ [ 1 , 3 ]
[ 2 , 6 ] ⊄ [ 1 , 6 [
União
Dado os conjuntos:
A = { 1 , 2 , 3 }
B = { 3 , 4 , 5 }
A união dos dois será equivalente a:
A ∪ B = { 1 , 2 , 3 , 4 , 5}
É extremamente importante lembrar-se que em conjuntos não podemos repetir elementos.
Intervalos:
![]() |
| Fonte: Laifi |
Intersecção
A intersecção tem um propósito semelhante ao da união, porém o resultado intersecção de dois conjuntos será um conjunto com os elementos que existem em ambos os conjuntos. Exemplo:
Dado os conjuntos:
A = { 1 , 2 , 3 }
B = { 2 , 3 , 4 }
A intersecção dos dois conjuntos será:
A ∩ B = { 2 , 3 }
Observações:
Se A ⊂ B o resultado da união será B e o da intersecção será A.Vejamos:
A = { 7 , 8 , 9 }
B = { 6 , 7 , 8 , 9 , 10 }
A ∪ B = B = { 6 , 7 , 8 , 9 , 10 }
A ∩ B = A = { 7 , 8 , 9 }
Marcadores:
conjuntos numérios,
matemática
Conjuntos Numéricos - Parte I
![]() |
| Crédito sxc.hu |
irei começar pelos conjuntos com menos elementos.
Conjunto dos números naturais:
Podemos defini-lo como um número inteiro, ou seja, sem casa decimais, positivo o zero também não faz parte.
N = { 1 , 2 , 3 , 4 , 5 , ...}
Conjunto dos números inteiros:
São todos os números sem casas decimais.
I = { ... , -3 , -2 , -1 , 0 , 1 , 2 , 3 , ...}
Conjunto dos números reais:
São todos os números inteiros e os com casas decimais.
R = {... , -0.0000001 , ... , 0 , ... , -0.0000001}
Definindo conjuntos:
Todo conjunto é representado por uma letra maiúscula, seus elementos ficam dentro de colchetes e são separados por vírgula. Vejamos um exemplo:
1) O conjunto C tem como elementos as letras do nome Blog do Carlos, então: C = {b,g,c,a,r,l,o,s}
2) O conjunto X tem como elementos os números 5, 9, 3 e 1, então: X = {5,9,3,1}
Elemento: é um componente de um conjunto.
Conjunto: é uma coleção de elementos.
Para não ficar tão abstrato, vejamos o seguintes exemplos:
1) 3 ∈ I, o elemento 3 pertence ao conjunto dos números inteiros.
2) -3 ∉ {0,1,2}, o elemento -3 não pertence ao conjunto dos números inteiros.
Nos exemplos, 3 e -3 são elementos, I e {0,1,2} são conjuntos.
Intervalos:
| Fonte: UFRJ |
São todos os números reais entre dois extremos. Por exemplo:
A = [1,3], podemos escreve-lo também da seguinte forma A = {x ∈ R / 1 ≤ x ≤ 3 }
No intervalo A não estão representado só os números 1 e 3, mas sim infinitos números entre 1 e 3 inclusive o 1 e o 3, vamos ver agora, elementos que pertençam e que não pertençam ao intervalo A: 1 ∈ A; 1.0000000001 ∈ A; 3 ∈ A; 2.333333 ∈ A; 0.99999 ∉ A; 3.000001 ∉ A
Tipos de intervalos:
1 - Intervalo Fechado:
Quando os dois extremos pertencem ao conjunto. Representamos da seguinte forma:
A = [1 , 3] ou A = { x ∈ R / 1 ≤ x ≤ 3 }
2 - Intervalo Aberto:
Quando os dois extremos não pertencem ao conjunto. Exemplo:
A = ]1,3[ ou A = { x ∈ R / 1 < x < 3}
Então o A é um intervalo de 1 a 3, porém, 1 e 3 não fazem parte, ou seja, 1.0001 ∈ A mas 1 ∉ A o mesmo é válido para o 3, 2.9999 ∈ A mas 3 ∉ A.
3 - Intervalo Semi-aberto
Quando 1 dos dois extremos não pertencem ao conjunto. Vejamos os dois exemplos:
A = [1,3[ ou A = { x ∈ R / 1 ≤ x < 3}
B = ]1,3] ou B = { x ∈ R / 1 < x ≤ 3 }
Por enquanto é só, na parte dois falarei um pouco sobre teoria dos conjuntos.
Marcadores:
conjuntos numérios,
matemática
Python: Números Primos
Faz algum tempo que eu me prometi criar um script para calcular e procurar números primos, usei o algorítimo de Marin Mersenne e desenvolvi o script em python.
Clique aqui para fazer o download do script.
Segue imagens do script:
Clique aqui para fazer o download do script.
Segue imagens do script:
![]() |
Iniciando o programa:
$ python prime.py
|
![]() |
| Tela de menu |
![]() |
Iniciando com debug e salvar números em arquivo:
$ python prime.py debug
$ python prime.py save
Ambos:
$ python prime.py debug save
|
Calculando dias úteis com php
![]() |
| Crédito sxc.hu |
/** * Função que calcula dias úteis no mês * * @autor Carlos Maniero*/ function dias_uteis($mes,$ano){ $uteis = 0; // Obtém o número de dias no mês // (http://php.net/manual/en/function.cal-days-in-month.php) $dias_no_mes = cal_days_in_month(CAL_GREGORIAN, $mes, $ano); for($dia = 1; $dia <= $dias_no_mes; $dia++){ // Aqui você pode verifica se tem feriado // ---------------------------------------- // Obtém o timestamp // (http://php.net/manual/pt_BR/function.mktime.php) $timestamp = mktime(0, 0, 0, $mes, $dia, $ano); $semana = date("N", $timestamp); if($semana < 6) $uteis++; } return $uteis; } // Invocando a função echo dias_uteis(date('m'),date('Y')); // Recebe dias úteis do mês atual echo dias_uteis(1,2012); // Recebe dias úteis do mês 1 de 2012
Simplificando a validação em PHP
![]() |
| Crédito: sxc.hu |
Estou falando da função filter_var() vamos a um exemplo de utilização da mesma:
// Validação de email
if(filter_var('bob@example.com', FILTER_VALIDATE_EMAIL)){
echo "Email Válido!";
}
// Validação de url
if(filter_var('http://carlosmaniero.blogspot.com', FILTER_VALIDATE_URL)){
echo "Url Válido!";
}
Espero que seja um dica útil para vocês, as constantes usadas por essa função pode ser encontrada nesse link: http://php.net/manual/en/filter.constants.php
Plugin para customização de formulários
Como postei anteriormente estou desenvolvendo uma nova versão do Livro de oração, e nisso fui obrigado a desenvolver uma série de plugins para jquery para customização de formulários. Todos sabem da minha paixão pelo mundo open source, logo, estou disponibilizando aqui uma versão beta do plugin, acredito que há muito o que melhorar e tenho certeza que até o fim do meu projeto ele estará bem melhor, mas vamos a uma prévia:
JS: http://goo.gl/ueKw2
CSS: http://goo.gl/76cxn
O plugin é dependente do masked input que pode ser obtido aqui:
http://digitalbush.com/projects/masked-input-plugin/
Segue uma pequena demostração de como usa-lo:
$("seletor").inputCustom({
opção : "valor"
});
Segue a lista de opções:
label
Descrição: Texto padrão do campo, desaparece no evento focus
Padrão: ""
datatype
Descrição: Tipo de dado [text/url/email/number]
Padrão: text
required
Descrição: Seta campo camo obrigatório ou não
Padrão: false
disable
Descrição: Checa se campo pode estar desativado
Padrão: false
minlength
Descrição: Tamanho mínimo em caractéres do texto, em caso de número valor mínimo do número
Padrão: 1
maxlength
Descrição: Tamanho máximo em caractéres do texto, em caso de número valor máximo do número
Padrão: 10000
errorMsg
Descrição: Mensagem de erro caso campo não for corretamente preenchido
Padrão: 'Preencha o campo corretamente!'
errorClass
Descrição: Classe que será aplicada ao elemento caso não esteja corretamente preenchido
Padrão: 'errorField'
labelClass
Descrição: Classe para quando o elemento esteja no texto padrão (label)
Padrão: 'labelActive'
mask
Descrição: Máscara que será aplicada ao elemento (ex.: 99/99/9999), para maiores informações pesquisar o site no maskedinput
Padrão: ""
autoComplete
Descrição: Url onde será recebido o JSON usado para o auto complete: (ex.: { "city_5137":"Ribeirão Pires","city_5138":"Ribeirão Preto"})
Padrão:
click
Descrição: Evento click do elemento
Padrão: function(){}
focus
Descrição: Evento focus do elemento
Padrão: function(){}
focusout
Descrição: Evento focusout do elemento
Padrão: function(){}
keydown
Descrição: Evento keydown do elemento
Padrão: function(){}
keyup
Descrição: Evento keyup do elemento
Padrão: function(){}
Exemplo básico:
$(document).ready(function(){
$("input[name=nome]").inputCustom({
label: "Nome: ",
required: true,
minlength: 3,
maxlength: 150,
errorMsg: "Preencha o campo nome"
});
$("input[name=email]").inputCustom({
label: "Email: ",
required: true,
datatype: "email",
errorMsg: "Preencha o campo email!"
});
$("input[name=url]").inputCustom({
label: "Site: ",
required: true,
datatype: "url",
errorMsg: "Preencha o campo URL"
});
});
Por hoje é só, se possível amanhã estarei falando um pouco mais sobre o plugin.
JS: http://goo.gl/ueKw2
CSS: http://goo.gl/76cxn
O plugin é dependente do masked input que pode ser obtido aqui:
http://digitalbush.com/projects/masked-input-plugin/
Segue uma pequena demostração de como usa-lo:
$("seletor").inputCustom({
opção : "valor"
});
Segue a lista de opções:
label
Descrição: Texto padrão do campo, desaparece no evento focus
Padrão: ""
datatype
Descrição: Tipo de dado [text/url/email/number]
Padrão: text
required
Descrição: Seta campo camo obrigatório ou não
Padrão: false
disable
Descrição: Checa se campo pode estar desativado
Padrão: false
minlength
Descrição: Tamanho mínimo em caractéres do texto, em caso de número valor mínimo do número
Padrão: 1
Descrição: Tamanho máximo em caractéres do texto, em caso de número valor máximo do número
Padrão: 10000
Descrição: Mensagem de erro caso campo não for corretamente preenchido
Padrão: 'Preencha o campo corretamente!'
Descrição: Classe que será aplicada ao elemento caso não esteja corretamente preenchido
Padrão: 'errorField'
Descrição: Classe para quando o elemento esteja no texto padrão (label)
Padrão: 'labelActive'
Descrição: Máscara que será aplicada ao elemento (ex.: 99/99/9999), para maiores informações pesquisar o site no maskedinput
Padrão: ""
Descrição: Url onde será recebido o JSON usado para o auto complete: (ex.: { "city_5137":"Ribeirão Pires","city_5138":"Ribeirão Preto"})
Padrão:
Descrição: Evento click do elemento
Padrão: function(){}
Descrição: Evento focus do elemento
Padrão: function(){}
Descrição: Evento focusout do elemento
Padrão: function(){}
Descrição: Evento keydown do elemento
Padrão: function(){}
Descrição: Evento keyup do elemento
Padrão: function(){}
Exemplo básico:
$(document).ready(function(){
$("input[name=nome]").inputCustom({
label: "Nome: ",
required: true,
minlength: 3,
maxlength: 150,
errorMsg: "Preencha o campo nome"
});
$("input[name=email]").inputCustom({
label: "Email: ",
required: true,
datatype: "email",
errorMsg: "Preencha o campo email!"
});
$("input[name=url]").inputCustom({
label: "Site: ",
required: true,
datatype: "url",
errorMsg: "Preencha o campo URL"
});
});
Por hoje é só, se possível amanhã estarei falando um pouco mais sobre o plugin.
Um novo primeiro post
Estou voltando a postar no blog depois de um longo período, fui extremamente influenciado pelo Leonardo Ferreira, você pode conferir suas inúteis anotações nesse endereço http://ferreiraleonardo.blogspot.com/, tenho algumas certezas sobre essa volta, uma delas é que a qualquer momento vou desistir de postar, e até mesmo esse post pode ser o último.
Sem mais delongas vou contar um pouco sobre o que aconteceu comigo nesse período em que estive off (pelo menos na blogosféra). Primeiramente passei um bom período estudando, em programação obtive sucesso, mas o inglês e o cursinho foi um fracasso, enfim estou trabalhando em uma agência de publicidade e propaganda como programador, lá é uma empresa composta por pessoa sem qualquer senso de humor, onde se aplica puramente a lei da convivência para manter o ambiente estável, você pode confirmar isso com as imagens abaixo:
Sem mais delongas vou contar um pouco sobre o que aconteceu comigo nesse período em que estive off (pelo menos na blogosféra). Primeiramente passei um bom período estudando, em programação obtive sucesso, mas o inglês e o cursinho foi um fracasso, enfim estou trabalhando em uma agência de publicidade e propaganda como programador,
Não posso deixar de falar de um projeto pessoal chamado Livro de Oração, de todos eles é o que mais me dá prazer em realiza-lo ele tem se tornado um site abençoado, e espero que cresça ainda mais, estou trabalhando nele nesse exato momento, ele em breve se transformará em uma rede social, o mais difícil de tocar o projeto é na questão dos layouts, como todo bom programador não sou nada bom com design, mas ai eu entrego na mão de um brother meu que sempre me dá uma força ele se chama Espírito Santo, e sempre tem me ajudado nessas horas, isso ainda está em desenvolvimento, não sei quando vou conseguir entrega-lo já que existe uma complicação chamada tempo, mas sempre que possível trabalho nele, se você se interessar pelo projeto o link é o seguinte: http://www.livrodeoracao.com.br caso esteja necessitado de oração posta lá, pode ter certeza que sempre terá alguém orando por você.
Acho que não tenho mais o que acrescentar nesse primeiro post, vou deixar minha "vidinha de adolescente" de fora dos meus posts, para os que estão acostumados com minhas postagens isso provavelmente isso vai ser um espanto, mas juro que vou tentar deixar as "frescuritis" fora dessa vez.
Assinar:
Postagens (Atom)










