21 agosto 2013

as PEPs do Python

Hoje vou falar das PEPs do Python.

PEPs são Propostas de Melhoria do Python (Pyhton Enhancement Proposal - PEP) que implica em padrões, melhorias, funcionalidades, estruturas, dicas e por ai vai.

Existe uma lista grande delas que é chamada de pep #0. Dentre estas algumas são indicadas e valem a pena serem lidas.

A pep 20 por exemplo é esta abaixo, ela é um EasterEgg do Python, para encontra-la no próprio Python basta colocar a seguinte linha de comando e dar enter: >>> import this

import this





O Zen de Python, por Tim Peters
Bonito é melhor que feio.
Explícito é melhor que implícito.
Simples é melhor que complexo.
Complexo é melhor que complicado.
Plano é melhor que aninhado.
Esparso é melhor que denso.
Legibilidade conta.
Casos especiais não são especiais o suficiente para quebrar as regras.
Embora praticidade vença pureza.
Erros nunca deveriam passar em silêncio.
A menos que explicitamente silenciados.
Diante da ambiguidade, recuse a tentação de adivinhar.
Deve haver um -- e preferencialmente só um -- modo óbvio para fazer isso.
Apesar de que daquela maneira pode não ser óbvia à primeira vista, a menos que você seja holandês.
Agora é melhor que nunca.
Embora nunca frequentemente seja melhor que *agora*.
Se a implementação é difícil de explicar, é uma má ideia.
Se a implementação é fácil de explicar, pode ser uma boa ideia.
Espaços são uma grande ideia -- vamos fazer mais desses!

Esses são os princípios da linguagem. Não é uma regra oficial, mas uma linha de conduta para que os programas nesta linguagem sejam sempre apresentáveis. Existem muitas outras como falei acima e vale procurar ler várias, mas por enquanto fiquem com o link para a PEP #8, que é um guia de estilo para a linguagem Python, vale a pena.

See you folks!

20 agosto 2013

Codecademy - o futuro da educação

Hoje vou falar de cursos online e para falar disso vou citar exclusivamente o Codecademy que sinceramente é a coisa mais interessante em termos de cursos online que eu já utilizei.

O Codecademy é simplesmente uma ferramenta poderosa se você tiver fome por conhecimento, digo na área de programação, claro.

A princípio a primeira coisa que você verá é uma página de boas vindas e um mini tuto de como as coisas serão dali adiante. Você já é levado a aprender algum conceito de programação de forma orgânica. Ao adentrar o site você fará seu cadastro e terá várias opções a escolher.As linguagens são variadas indo do JavaScript, HTML/CSS, PHP, Python, Ruby e chegando em API's.

Todas essas linguagens serão detalhadamente trabalhadas por meio de uma interface de estudo muito simples. É provável que boa parte do pessoal ache ruim o fato do site ser em inglês, mas acredito que para quem deseja aprender isso seja o de menos.
Um fator que incentiva a evolução do estudo é o ganho de certos badges(emblemas) que dão a sensação de trabalho cumprido, de troféu mesmo, uma bobagem mas muito interessante que incentiva principalmente crianças no estudo da programação.
Eu quando descobri sobre o site já fui atrás do Python e venho me dedicando nas horas vagas, as vezes não, em destrinchar a linguagem. É extremamente gratificante se deparar com uma ferramenta de ensino que realmente funciona. Apesar de ser em inglês e minha proficiência na linguagem não ser extrema tenho me saído muito bem, sem exageros. Eles realmente prezam pela educação através de exercícios extremamente bem pensados e uma evolução gradual que eu jamais tinha visto. É curioso ver que adentraram em função nas primeiras lições discretamente, fazendo a pessoa pensar no geral desde os primeiros passos.

É interessante ver que no desenrolar do curso você será levado a desenvolver projetos reais. Como por exemplo na parte de HTML/CSS você cria uma página de fato, claro dentro do sistema deles.

Há sessões para professores chamada After-School Programming onde são criados grupos para os alunos trabalharem juntos. Ainda não entrei nessa sessão. Vou verificar depois para ver como é de fato isso. Vocês também terão o Codecademy labs que são substitutos na página para as IDE's das linguagens usadas no site para não necessitar baixar nenhum programa. Para quem não souber o que é uma IDE basta clicar no link.

E como citei sobre estudo online tem uma matéria do Olhar Digital que trata disso pela visão de alguns recrutadores. Eu sinceramente não vejo problema algum com o estudo online, acho até que essa modalidade em algum momento vai se tornar uma ferramenta bem comum no dia a dia. O estudo online, ou melhor "à distância", precisa somente de uma forma de comprovação de proficiência mais oficial, no caso do Codecademy as provas são feitas de maneira não presencial então para demonstrar proficiência de fato você vai ter de provar na raça por intermédio de algum projeto concreto. O que não é de nenhum modo ruim, mas poderá desanimar quem gosta de seguir o líder se mostrando apto por meio de notas e diplomas. Claro que isso é uma condição de algumas graduações à distância. Muitas destas, quando desenvolvidas por instituições como faculdades e escolas tem as aulas à distância com provas presenciais. Enfim. Seja de uma forma ou de outra eu sou adepto de que o conhecimento faz a diferença e não é a prova que vai demonstrar isso. Seja por meio de suas notas, um diploma ou um projeto o que vale mesmo é como você se sairá no "vamos ver"!

Portanto sintam-se a vontade para passar por lá e diga nos comentários se de fato esse mecanismo será mesmo o futuro da educação.

Até a próxima!

09 agosto 2013

Android Device Manager

Olá Geeks de plantão!

Hoje venho eu aqui para falar de algo completamente diferente dos outros posts, mas que é de utilidade pública! Temos agora a função perfeita de localizar nossos Androids (Android 2.2 e superiores - me confirmem esse detalhe nos comentários ok) e venho explicar aqui de forma rápida como fazer isso:

Procurei na internet, mas as informações estão um tanto quanto distorcidas da realidade. Pelo que vi e provei não é nenhum aplicativo que será instalado. Não! Você não precisa procurar no Google Play um app para isso. Basta somente acessar esse link aqui Android Device Manager. Esteja conectado ao Google com sua conta padrão, quero dizer, a mesma do seu dispositivo. (atualizado! 18/02/2014)

Automaticamente a página irá identificar seus dispositivos e irá mostrar a sua localização. Como podem notar essa página ai está em inglês e como sou curioso testei em português (troque o final do link por pt_BR ao invés de en_US) e verá que a página fica em português mas ainda não aparece nada de mapa, pelo menos não quando testei.

20 julho 2013

Fechamento abrupto da janela...

Saudações Geeks para os Geeks de plantão!

Após um bom tempo, sem tempo, resolvo voltar aqui e fazer deste lugar algo mais. Como comecei a trabalhar muitas coisas ficaram de lado, mas pensei um pouco e comecei a vincular ao meu novo ofício minhas destrezas de programador (rsrsrsrs).

Sendo assim me coloquei a fazer um aplicativo que auxiliasse a empresa num cálculo basicão que vez ou outra precisam e por milagre divino eu consegui. Finalizei o código básico em três dias. Nesse meio tempo relembrei tudo o que poderia à medida que eu necessitei. Ainda estou implementando mais uns recursos antes de lançar o programa Beta e isso vai requerer um tempo maior, mas o principal eu já consegui.

Assim, nesse vai e vem das velhas fontes de informação sobre Python me deparei com algo que já me irritou antes, deveras. A janela teima em não esperar e fecha numa velocidade absurda. Procurei muito, sempre achando que meses atrás eu tinha encontrado um meio simples que sinceramente não lembro. (Na verdade acho que estou trocando a forma de C++ pensando que era Python. =/ ). Sendo assim, como não consigo me relembrar pensei em fazer uma gambiarra que funcionou. Eu ainda acredito que há uma maneira muito mais simples, um comando de uma palavra só e ficarei grato se alguém postar aqui, mas o que desenvolvo com esse post é justamente o improviso. Não sabe? Não lembra? Mesmo assim ainda poderá haver um meio de resolver.

Pois bem. Vejam o super código abaixo:


Como podem ver, esse super código, se você clicar no arquivo .py, onde ele será executado independente do IDE, a janela nem ao menos demorará o suficiente para que olhemos pro canto certo. Isso é um inconveniente que sinceramente acho que todas as linguagens já deviam ter uma configuração padrão para evitar isso, mas como não tem há uma gambiarra pra isso muito simples utilizando IF e WHILE.

O WHILE será usado para implementar um comando de fechamento de programa. Primeiro vamos criar uma variável global (padronizei de EXIT em caixa alta mesmo) onde esta variável receberá o valor 0.

Observem abaixo:



Após iniciar o loop while e trabalhar o corpo do código é necessário criar uma condição IF como podem ver no exemplo acima. Essa condição definirá que o usuário está mesmo querendo terminar o programa e portanto o valor da variável global EXIT mudará para 0 fazendo com que o loop WHILE termine. Podem ver que há duas declarações de IF aninhadas. A primeira simplesmente determina se o usuário quer sair de fato e a segunda condição IF cria somente um travamento para janela, que fica esperando um valor qualquer já que o IF e o ELSE vão mudar o valor da variável EXIT para 0 independentemente.

Esse segundo IF é o segredo, fazendo com que a janela permaneça aberta até pelo menos o clique do enter. Uma solução não muito elegante, mas que vai auxiliar enquanto uma mais direta não aparece.

Como provavelmente notaram, há várias condições de resposta de SIM na primeira condição IF. Isso é muito útil já que o usuário terá opções diversas para conseguir finalizar o programa. Verifiquem bem todas as opções e tentem entender por que todas elas foram feitas.

That's all folks!

Isso está me auxiliando enquanto não recordo a linha de comando exata. No entanto, como deixei claro, o post é para mostrar mesmo que independente de implementações que tenhamos na manga, ainda assim temos possibilidade de resolver o que quer que seja. (claro, que não seja bug da linguagem!)

See you!

ATUALIZAÇÃO---------------------- 15/08/2013


Olá. Com o tempo sempre aparecem coisas mais interessantes e começamos a ver que antes poderíamos ter feito diferente. Esse é um dos casos e acredito que voltarei para esse post para atualizar várias vezes, visto que os exemplos acima são de fato extremamente iniciantes.


Portanto, assim sendo, aqui vai uma atualização para reduzir a quantidade de opções no "IF". Essa redução ajuda a deixar o código menos bagunçado, feio mesmo. Ainda não é a melhor alteração a ser feita mas por enquanto serve. Verifique o novo exemplo:



Aqui está sendo utilizado o ".lower()" que faz com que o que for digitado pelo usuário não tenha caracteres em caixa alta. O mesmo pode ser pensado no contrário com o ".upper()" e colocando as opções de acordo no "IF".

04 março 2013

Pygame… start!

Para quem se interessou pelo pygame eu vou tentar trazer alguma luz sobre o caso e como utilizar os
recursos à medida que eu mesmo consiga absorver o conteúdo.

A princípio é necessário instalar a biblioteca do pygame. Acesse esse link e escolha o que se encaixa com o seu S.O. e versão do python. Para começar vamos olhar o exemplo abaixo:



O import pygame importa o pacote com todos os módulos do pygame instalados e a chamada "pygame.init()" inicializa cada um desses módulos. Isso deve ser feito sempre, claro. Provavelmente você encontrará um pacote sendo inicializado junto, o sys.


A inicialização do módulo sys vai servir primeiramente para quando for executado o comando quit, mais a frente ficará mais claro.

Agora vamos para uma janela:


A primeira linha serve para ser colocado o tamanho da janela, height - altura, width - largura. O que aparece na última linha display.set_mode() é uma função que irá pegar os valores informados em size. Esses valores podem ser indicados diretamente na função como no exemplo abaixo:


Sendo exatamente com dois parênteses como mostrado e só com um quando se usa a variável size. Estou incerto de chamar size de variável ou de atributo, mas como o nome size não se encontra dentro de uma class vou considerar uma variável até segunda ordem.

Usando um pouco de dedução o speed serve para definir a velocidade de movimentação dentro das coordenadas x e y. Nesse caso ele, o objeto escolhido sofrerá uma mudança total de um movimento em diagonal pra em linha reta se simplesmente trocarmos um dos números - 2 para 0 por exemplo.

Na linha que encontramos black temos três valores que são o Red, Green, Blue. Essa variável será utilizada mais adiante.

Agora vemos uma parte interessante que lê uma imagem que deverá inicialmente estar dentro da mesma pasta onde será salvo o arquivo .py. Se salvar com outro nome basta trocar o ball.bmp por ele.


O image.load() é a função que carregará a imagem e o get_rect() é onde terá a coordenada do retângulo. Nesse caso imagino que o padrão está sendo determinado ao não ser informado nada.

Agora na parte final desse código temos um loop while. Nessa parte do while vamos encontrar a função quit que mencionei anteriormente. É ai, nesse primeiro if, que se a janela for fechada o programa será terminado. Acredito que isso se refira a limpar da memória tudo que foi carregado para gerar a janela. Vou confirmar isso posteriormente.


Após o ballrect podemos ver como foi feito para que a imagem ao tocar nas laterais venha a ter um movimento oposto ao inicial.

Mais abaixo encontramos o .fill que serve para determinar a cor de fundo da tela, é onde utilizamos o black determinado no inicio. As outras funções eu ainda não compreendi com clareza, por isso vou deixar pra depois.

Esse código é o mesmo que se encontra na wiki do pygame. Basta clicar nesse link para acessar a página, mas o código completo pode ser visto clicando no 'continue lendo', abaixo. Se não estiver vendo o continue lendo provavelmente você já vai estar vendo o código completo. Ao testar você verá uma bola ou imagem se movimentar dentro da janela sempre que o mouse se mover. Ainda estou atrás de descobrir o por que da dependência do mouse. O que ou qual função faz isso nesse código. Qualquer dúvida adicione uma resposta abaixo. Ou se souber algo sobre isso que mencionei agora ficarei grato em saber.

25 janeiro 2013

Python 3?

Galera do mal! Eu venho aqui em busca de opiniões acerca deste ponto. A princípio esclarecerei meus pensamentos iniciais chegando ao que penso hoje e talvez fique mais fácil entender meus intentos. (sim eu me direciono à todos do curso BCC). Logo quando cheguei pensei que aprenderia C++, na verdade eu ansiava por isso. Não por nada fantástico, mas por simplesmente ter começado a estudar por C++. Foi quado o Python surgiu na história e não me chateei por simplesmente descobrir que as duas linguagens meio que se "entrelaçam". Assim que as aulas começaram eu já baixei a última versão do Python no momento 3.3. Com isso naturalmente fui forçado a aprender do modo que esta se comporta, mas nem por isso sem deixar de lado as outras versões da linguagem até por que 70% dos tutoriais e pdfs exemplificam normalmente pela versão 2.7.


Pelo que compreendi disso, desta situação, o fato de que é bom passar um tempo pra se utilizar outras versões até para que possíveis bugs sejam sanados. Ao que me consta isso ocorreu por volta de 2010-11 (estou certo?), a atualização. Por esse ponto vi muitos blogs se interessando em disseminar o Python 3, encarar por assim dizer agora. Até por que a linguagem não desenvolveu um modo de "recalxutar" programas antigos. Quero dizer, não tem outro método a não ser ir linha a linha corrigindo a problemática.
Pois bem... ai se encontra minha opinião. Mais cedo ou mais tarde já estaremos na versão 4.x (será?!) e bugs atuais corrigidos, mas meio que receosos ainda estaremos no 2.7 (2.x), migrando somente neste momento pra 3.x. Isso faz sentido de fato? As mudanças são poucas ao que vejo principalmente para iniciantes, mudanças mais profundas na linguagem eu mesmo não tenho como perceber já que é meu primeiro contato. Nem por isso deixo de saber os comportamentos antigos das coisas que estudo agora, até por que como falei é inevitável. 
Meu  posicionamento nesse caso é simples. Não vejo sentido em permanecermos na 2.7, por mais que encontremos nesse meio tempo incongruências no material atual que temos disponíveis. Isso serve até mesmo para o aprendizado, nos forçando a correr atrás de abarcar o novo diante de tanta informação ultrapassada. Isso não é por praticidade ou algo do tipo, muito pelo contrário. Vejo que vamos ter no futuro um trabalho duplo por menor que seja, pra nos atualizarmos. Podemos simplesmente quando em teste ou exercícios especificar que em linguagens anteriores o que funcionaria seria "assim e assado", em comentários e algo do tipo. Ou simplesmente encarando que a linguagem muda mesmo, é a vida.
O que vocês dizem?

24 janeiro 2013

Python 2.x versus 3.x

Procurando mais informações sobre o python e como uso o 3.3 acaba que mais cedo ou mais tarde me deparo com alterações implementadas nessas últimas versões. A primeira que vou explorar e trazer aqui será sobre o comando input().

Para quem já usa o python 3.3 já deve ter notado que o raw_input já era. E o motivo disso é muito simples:

Primeiro explicando o raw_input(): este como a maioria já sabe serve para receber dados e transforma tais dados em strings. Sejam números ou qualquer informação que seja. Já o input('') tem uma capacidade superior que é identificar o valor que está sendo colocado, mas também ele tem a capacidade de aceitar códigos, como o terminal. Basicamente, no python 2.7 se você usar input(''), você estará abrindo uma porta para alguém intervir no código. Isso pode ser bom em termos se necessário.



Já no Python 3.x a coisa ficou diferente, parcialmente. A princípio o raw_input() mudou para input('') somente, mas agora os parênteses são obrigatórios. Este é um raw_input inteligente, fazendo o que o raw não fazia que é identificar o tipo de entrada e portanto gerar tipos distintos ao invés de criar somente strings. Até ai tudo bem. Agora o antigo input(), que dava acesso à intervenções no código se tornou eval(). Basicamente com a mesma função, mas tecnicamente mais restrito, já que o input() já serve pra maioria das coisas com mais eficiência. No entanto descobri por meio deste eval que dá pra criar entradas múltiplas para variáveis diferentes.



O problema consiste somente no fato de que por meio do eval se pode intervir no código com códigos. Basicamente o processo de entrada eval vai tentar usar os dados, se estes significarem algo pra linguagem de modo a fazer com que este código seja usado como se já fosse uma implementação. Podendo criar quebras e travamentos.

De qualquer modo acredito ser muito simples impedir tal ocorrência por meio do .replace. Ainda não testei devidamente, mas parece ser uma saída. Logo quando testar atualizo o post.

Uma das fontes que utilizei para fazer esse post fala que não há modo seguro com eval(), o que é uma pena. Link

21 janeiro 2013

Lista 3 Q10

Este é outro exercício do qual tive certa dificuldade, mais pelo caminho que escolhi pra fazer do que pela questão em si. Uma coisa curiosa são as variáveis "unidade" e "dezena" que tive que repetir para que funcionassem nas partes necessárias do programa. Como podem ver é basicamente pra colocar números por extenso.

Lista 3 Q9

na busca de resolver umas listas pra aula de IP essa foi uma questão que quase não consigo fazer. Ela tem uma condição .replace que basicamente substitui uma coisa por outra. Procure no código que ficará fácil entender como isso é feito. O resto são condições if, elif e else. Claro que por ser iniciante está sem muito tratamento e está longe ainda de ficar estético.

...

Sem muita enrolação esse blog será um depósito do meu aprendizado em Python que estou estudando na faculdade. Aqui terá códigos e compreensões minhas e de colaboradores se aparecer.

Vou postar de tudo um pouco, falar sobre Python, C++, Java, Matemática, tecnologia móvel, Hardware... o que der na telha.