12 janeiro 2022

Array Multidimensional - UPDATE#01


UPDATE#01

Obtive uma resposta num comentário que demonstrou uma forma mais interessante de trabalhar com o array multidimensional que provavelmente consome muito menos memória e tem mais apelo prático. No primeiro script eu desejei somente demonstrar que existe e não me ative a testar outra maneira já que aquela também funciona. Apesar de um provável consumo maior de memória do primeiro script que está comentado no código, ter as listas(arrays) internas com nomes específicos, cria-se uma possibilidade de manipular esses dados de outra forma já que o próprio nome da lista(array) poderá fazer referência ao dado que possui. Mas que fique claro que isso não necessariamente significa que seja adequado trabalhar com array numa grande escala. 

Vale ressaltar que algumas outras ferramentas podem ser mais simples de manipular e obter um resultado correto de forma mais direta além de uma melhor persistência do próprio dado.

Sendo assim agradeço Jan Welten - administrador do grupo Classic ASP developers que foi quem mostrou essa solução já adicionada ao código. A lista(array) já é definida no 'ReDim' com a quantidade das duas dimensões enquanto no código comentado se trabalha inicialmente a partir de uma lista(array) dinâmica simples, adicionando cinco outras listas(arrays) que já podem existir no script, tendo estas listas(arrays) qualquer outro nome. Falta confirmar se aceitará sem problemas adicionar listas(arrays) de tamanhos variados e de tipos diferentes.
 
Abaixo o texto anterior com algumas alterações pontuais:

Array multidimensional é nada mais que um array dinâmico simples com um novo array alocado em seus elementos ou um array já com múltiplas dimensões na sua declaração 'ReDim'. Podemos também considerar esse post um 2º update sobre array. Informações acerca do script você encontra nos textos anteriores, tudo ai já foi tratado antes.

Independente da eficácia de um modo ou outro de obter e tratar dados veja este espaço como um depósito de tudo que testo, encontro por ai e principalmente do que vocês me trazem. Compreender array dinâmico levou a entender e executar o multidimensional.

Tendo dificuldades em acompanhar? Volte ao primeiro post sobre ASP classic

26 dezembro 2021

Arrays ASP-C - update 01


Pra ir mais adiante vamos voltar ao array no ASP-C.  Na postagem anterior foi utilizado um exemplo de como trabalhar com array, observe abaixo:

Percebam que três elementos que não foram informados são reconhecidos pelo 'For Each' e por causa disso foi necessário tratar com o 'IF' para que o resultado não ficasse sem sentido. Sendo assim verifique abaixo uma alternativa mais interessante utilizando agora um loop 'For':

Neste caso agora estamos utilizando o 'uBound()' que identifica o tamanho do array lista gerando um valor respectivo. O resultado é exatamente o mesmo. O 'uBound' funciona exatamente como o 'len()' do Python. Podemos também evitar de informar que não tem nada deste modo abaixo:

Foi utilizado o 'Exit For' para isso e como já foi dito é preciso criar uma condição 'If" específica para que funcione.

Indo mais adiante mostrarei um exemplo de como adicionar elementos a um array utilizando o loop 'For', e diferente do que afirmei outrora existe sim array dinâmico e mostrarei ao fim desse post a forma de utilizar. Agora observe abaixo e perceba que deste modo será preciso especificar exatamente para o 'For' a quantidade de vezes que os dados serão inseridos:

Acima fiz questão de utilizar o 'uBound' novamente, mas eu poderia ter informado para ir até 5 na condição do 'For', entretanto o 'uBound' impede que se informe uma quantidade além ou aquém o que pode gerar erro ou um resultado incompleto. 

Com o tempo trarei mais informação se achar necessário sobre o array no ASP-C, contudo se você sentir falta de algo me informe abaixo que procurarei adicionar como update. 

------UPDATE #01 - 03/01/2022

Quando escrevi esse texto realmente achava que arrays dinâmicos não funcionavam em ASP-C. Eu poderia dizer que a quantidade de informação superficial na internet me levou a pensar deste modo e foi exatamente isso que ocorreu. O problema maior destas informações são detalhes muitas vezes mínimos que não ficam explícitos nos erros que recebemos no browser, sendo assim abaixo temos um trecho de código onde podemos ver como de fato isso funciona:

Observem que o que permite realmente alterar o tamanho do array é a palavra reservada 'ReDim', contudo há a necessidade de criar o array sem informar a quantidade de índices para que o ASP-C identifique que estamos trabalhando com array dinâmico. Outra coisa que devem ter notado é o uso da palavra reservada 'Preserve'. Esta palavra mantém os itens que a lista já possuía antes e não utilizar fará com que o ASP-C crie um novo array limpo com o mesmo nome. Vale testar como isso ocorre quando diminuímos o tamanho do array ao invés de aumentar como foi no caso acima, testem e comentem abaixo sobre. Para quem está tendo que traduzir o blog vou repetir aqui dois comentários do código acima:

  • os índices que forem informados devem ser do tipo Integer
  • para iniciar o array dinâmico você deverá criar sem informar nenhum valor entre parênteses, o que deve ser mudado antes do uso real dele

Como prometido voltei aqui e atualizei o post com dados mais corretos dessa vez. Qualquer dúvida ou mesmo notar que algo não condiz com a realidade utilizem o sistema de comentários abaixo e me alertem que corrijo. Sobre este último código tudo que usei já foi explicado antes então basta rever os posts anteriores para esclarecer sobre tais detalhes.

20 dezembro 2021

ASP-C Loopings e mais

Voltamos aqui em velocidade máxima pra ganhar tempo. Aqui será tratado vários loopings diferentes e citarei algumas reações das quais me intrigaram e espero que um de vocês ajude confirmando se isso é limitação do ASP-C ou se algo precisa ser feito para obter um resultado coerente. 

Começando pelo 'Do While Loop' e o 'Do Loop While' . Esse looping é usado quando não se sabe exatamente quantas vezes será necessário fazer o procedimento até ser necessário terminar o looping. Entretanto o 'Do Loop While' será executado ao menos uma vez para então testar a condição. Verifique abaixo:

A saída no navegador será como esta imagem ao lado, clique para deixar maior a visualização.

Notem que há um comentário no primeiro exemplo onde falo que o looping não reconhece o operador '=' e por alguma razão foi necessário utilizar o '<=' para que o resultado fosse correto. Acredito que o operador está associando valor à variável ao invés de ser tratado como uma igualdade. Os mestres do ASP-C podem explicar abaixo para que possamos confirmar essa situação.

Seguindo em frente vamos tratar agora do looping 'Do Until Loop' e 'Do Loop Until'. O terceiro exemplo é somente para que possam ver como utilizar o 'Exit Do' e assim sair do loop se alguma outra condição diferente for alcançada. 

Observando bem não há muita diferença entre esses loopings e vai de cada um a utilização deles. Verifique agora os resultados no navegador ao lado e perceba como o 'Exit Do' interfere no resultado final:

Diferente do 'Do While Loop' não houve qualquer problema ao usar o operador '=' e sendo assim acredito que isso possa ser decorrente do fato que o ASP-C já não receber atualizações faz algum tempo. Vamos precisar de ajuda de algum mestre que porventura venha por aqui e se interesse em explicar tal situação.

Por fim vamos agora ao 'While Wend'. Não testei a questão do operador '=' e se vocês notarem algum problema aceito que me alertem abaixo. 

Como podem ver acima o loop irá até atingir a condição. Outro detalhe é que em nenhum destes loops foi necessário incrementar qualquer tipo de contador. O resultado no navegador poderá ser visto ao lado. 

No 'While' loop a condição é sempre testada antes de cada ciclo e portanto só será executado o bloco de código somente se a condição for 'True'. Notem que não há qualquer mistério nesses loopings, apesar de aparentarem fazer a mesma coisa uma avaliação mais detalhada do resultado que se deseja fará com que uns sejam mais úteis do que outro dependendo da situação. Vou aproveitar e colocar abaixo o looping 'For Each' com um array. É preciso declarar o tamanho do array senão será lançado no navegador um erro a menos que se deseje trabalhar com array dinâmico, veja o próximo post para saber mais sobre. No código abaixo vejam que no resultado os espaços do array que não possuem elemento serão apresentados como 'elemento x não contém nada!'. Tente fazer com que ao invés de mostrar isso nada de fato seja apresentado, tentem usar com e sem o 'Exit'. Se conseguirem informe abaixo o seu sucesso.

Com o 'For Each' o loop irá percorrer todos os elementos declarados e não declarados. Outro detalhe é que o contador 'd' só existe dentro do looping para que a saída apresente as posições de cada elemento e não serve de fato para que o looping funcione.

Assim chegamos ao fim de mais um post sobre conceitos básicos do ASP-C e com essas ferramentas muita coisa já poderá ser feita com um nível mais complexo e mais útil pra vida real. Como dito em outro post no futuro trarei informações sobre 'Procedures' ou 'Procedimentos', o que chamamos de função e que no ASP-C temos 'Function' e 'Sub'.

Espero realmente que este esforço seja de grande ajuda pra todos os visitantes do blog e interessados no ASP classic. Como dito antes se qualquer coisa aqui estiver incorreta informe abaixo para que possamos aprender juntos.

13 dezembro 2021

ASP-C no começo

Desta vez não vamos de "Hello world", evitando ao máximo perder tempo.

Vou supor que você já sabe lógica básica e tem algum tipo de conhecimento em alguma linguagem de programação ao menos, portanto com isso em mente evitarei entrar em detalhes maiores. Vou me ater a mostrar variáveis, condições e looping num primeiro momento e se alguma dúvida mais específica surgir utilizem a caixa de comentários abaixo.

Existem quatro formas de declarar variáveis no ASP-C

Como podem ver acima nenhuma das formas que utilizei foi necessário declarar o tipo da variável. O ASP-C detecta automaticamente o tipo e nesse caso não houve nenhuma diferença se pública ou private devido ao fato que o "Response.write" está no mesmo escopo das variáveis. A resposta no browser é esta abaixo:



A primeira variável não possui nenhuma palavra reservada. Ela é criada mas não será alocada na memória e seu tipo é detectado em tempo de execução*. Isso faz com que toda vez que chamar a var01 o ASP procurará no script inteiro para descobrir se já existe o que poderá causar uma diminuição de desempenho. Assim conseguirá poupar espaço na memória, mas exigirá uma busca e isso deve ser bem avaliado. 
A segunda var02 com o Dim (dimension - declare in memory) citado acima terá um espaço próprio na memória e com isso, em sistemas muito limitados outro problema poderá ocorrer que é restringir a memória livre pra outros processos. Para scripts simples provavelmente nada será notado nem na primeira nem nessa segunda, mas em sistemas muito grandes isso poderá ser um problema, portanto, volto a falar que essa decisão deverá ser bem calculada.
As duas outras declarações são autoexplicativas, mas nesse código em específico não fazem diferença alguma. No futuro quando for falar de 'Functions' e 'Sub' explicarei melhor sobre elas. No momento não será preciso fazer uso. Agora vamos avançar um pouco mais:

Acima perceba a estrutura de condição If. Veja como escrever corretamente ela no ASP-C. Nesse caso a primeira condição é a certa e portanto será apresentando o seguinte resultado:




Note que a codificação não está sendo detectada corretamente e para isso será preciso informar no começo do Script a seguinte linha:

Response.CharSet = "UTF-8"

Com essa linha declarada logo no início o retorno no navegador passa a ficar assim:




Avaliem bem todos os termos reservados incluindo o 'Then' que no Python seria os ':'. Algumas pessoas colocam as condições entre parênteses, mas até agora não vejo necessidade e funciona do mesmo modo. Tendo entendido tudo até agora você já é capaz de criar algum tipo de resultado mais prático e mais complexo, bastando um pouco de boa vontade. Agora como podem ver abaixo estamos utilizando o looping 'For': 


Com ele podemos criar uma repetição limitada e ainda podemos escolher de quanto em quanto queremos que isso ocorra utilizando o 'Step' que pode ser negativo e portanto decrescente, quando não informado ele incrementa de um em um. Fiz outra coisa que foi aninhar um 'If' dentro do looping e como a maioria das linguagens poderíamos aninhar vários outros desde que haja real motivo para isso. Observem o caso do 'Exit For' e no comentário que é precedido de uma única aspa simples explico que de outro modo o ASP-C retornaria um erro de sintaxe. Sendo a condição do 'If' correta quando o 'i' for igual a 7 ele retorna que 'Não podemos continuar!' junto à tag do HTML "<br/>" que pula linha dentro das aspas duplas e acaba entrando no segundo 'If' aninhado que também está correto já que 'i' continua valendo 7. O looping 'For' portanto será terminado antes de alcançar o 10. Observe bem e tente fazer diferente para receber os erros relacionados.

Abaixo, ao final temos o 'Next' do 'For', diferente do 'End' do 'If' esse 'Next' implica que o 'i' será automaticamente incrementado pelo valor do 'Step' e virá assim o próximo ciclo. Veja a linha que codifica para UTF-8 acima de todo Script.

De uma forma muito rápida vimos várias coisas aqui que já dão possibilidade de criar vários resultados interessantes. No futuro virei com outros tipos de loopings e provavelmente um início sobre 'Functions'. Qualquer dúvida não deixe de perguntar abaixo e se encontrou alguma inconsistência no que apresento aqui informe para que possamos aprender juntos.

Siga o link para saber como utilizar o ASP-C na sua máquina Windows

10 dezembro 2021

ASP Classic

Com um título desses eu devo ter chamado a atenção de alguém, ao menos um jurássico na área ou alguém se deparando com a necessidade de estudar. Claro que o ASP não tem nada muito além do que qualquer outra linguagem a não ser um detalhe: documentação ZERO!

É, eu estou usando de uma hipérbole e não vejo tanto exagero assim. É simplesmente um deserto. Num universo conectado os mecanismos de busca acabam dando mais trabalho do que deveriam. E aqui eu alfineto de fato todos eles. O melhor momento desses buscadores foi no início desse processo onde tudo sem filtro algum aparecia na sua tela e você evitava de clicar em certas coisas. Porém...

Digamos que você é feito eu e odeia muita enrolação e quer ver o cru da coisa e testar. 

Digamos que você Jurássico já trabalhou anos seguidos com tal estrutura de programação que se utiliza de scripts¹, e sabe que algo sempre vem à mente para ser garimpado e muito pouco é encontrado. 

Não prometo nada e digo logo, aqui vou colocar meus passos pelo ASP Classic e já consegui alguns livros. Um me decepcionou bastante já que contém erros absurdos. Ainda acho que foi proposital do autor pra fazer os leitores aprenderem de fato como utilizar tamanho monumento histórico ao corrigir o livro em quase todos os exemplos.

Pra ficar mais fácil de entender:

De início consegui testar algumas poucas linhas num servidor da empresa que utiliza o ASP-C. Tudo muito normal, variáveis, padrões e palavras reservadas como sempre. Decidi correr atrás de livros pra não perder tempo na internet. Não sei se foi a melhor decisão. Dois em inglês e um destes acho que não vou usar tão cedo. Dois em português que contém várias discrepâncias como citado acima. Com isso em mãos, mais exatamente num Kindle, me vi pensando em como rodar aqui no meu notebook como consigo com o PHP por intermédio do XAMPP e assim estudar com certa facilidade.

Por fim comecei a ler mais sobre IIS - Internet Information Services - ou serviço de informações da internet. IIS é  um pacote de software projetado pra windows server²,  mas eu não estou usando o Windows Server. Eu utilizo aqui o 11 e decidi mesmo assim seguir alguns passos.

Primeiro abra pela pesquisa do windows o painel de controle ou aperte "windows + i". 

Pelo painel de controle clique em "Programas" depois "Ativar ou desativar recursos do Windows". Nesta nova tela você ativará todas as opções abaixo e tudo que tiver dentro delas tb:

  • .NET Framework 3.5 (inclui .NET 2.0 e 3.0)
  • .NET Framework 4.8 Advanced Services
  • Serviços de informações da Internet
  • Serviço de ativação de processos do Windows


Pela tecla de atalho "Windows+i" será aberto "Configurações". Vá para "Aplicativos" depois clique em "Recursos Opcionais", depois em "Mais recursos do Windows" no fim da tela. A mesma janela aparecerá bastando ativar os recursos citados acima.

Tendo feito isso será preciso fechar tudo e reiniciar o Windows 11. Isso mesmo, não adianta reclamar, tem de fazer. Quando reiniciar corra atrás do Windows Update e faça uma verificação. Atualize seu sistema e reinicie novamente se houver update. Ao reiniciar abra o browser que você usa e escreva localhost. A imagem abaixo precisa aparecer para comprovar que já está funcionando. O próximo passo depende do nível de segurança do seu Windows sobre as pastas do sistema:

 

- Primeiro procure na partição C: a pasta "inetpub", dentro acesse a pasta "wwwroot". Ao acessar tente criar um arquivo de texto nesta pasta clicando com o botão direito. Se conseguir está tudo ok e você poderá vincular a pasta ao seu workplace e IDE qualquer que você use. Se não permitir isso você precisa acessar as configurações da pasta e alterar a segurança da mesma para que seu usuário tenha acesso, talvez mesmo sendo administrador seja preciso. Observe a imagem à direita abaixo qual usuário eu selecionei e perceba que marquei todas as opções da pasta na parte de "permissões para usuários" aplicando em seguida.


 Pronto! Agora você conseguirá codificar em ASP e verá o resultado no seu browser padrão. Sem ter de subir pra onde quer que seja que já esteja preconfigurado pra isso e possa testar.

Vale colocar mais um detalhe: por padrão os erros do ASP não aparecerão no browser e isso precisa ser corrigido da seguinte forma: 

Abra a pesquisa do Windows e digite "IIS". Clique no "Gerenciador do Serviços de Informação da Internet". Perceba na imagem ao lado que eu escolho entre duas opções de aplicação com quase o mesmo nome. Com ele aberto procure o ícone ASP e clique duas vezes. Clique em "Propriedades de Depuração", depois em "Enviar erros ao Navegador", troque False por True. À direita desta mesma tela tem uma opção "Aplicar" ou "Cancelar". Clique em "Aplicar" e pronto!

Agora haverá algum avanço no seu estudo do ASP-Classic. No futuro trarei alguns códigos básicos, mas para um teste definitivo crie um arquivo "index.asp" dentro da pasta "wwwroot". Nele adicione essa pequena tag ASP e salve: 

<%  Response.write "O ASP está funcionando normalmente!" %>  

Para abrir no navegador digite "localhost/index.asp". A resposta no browser será essa última imagem abaixo à esquerda. Perceba que há erro de codificação, é preciso informar qual utilizar pra corrigir isso, mas num próximo post eu falo sobre este e outros detalhes mais específicos da linguagem. 

Por fim espero que isso sirva tanto quanto me serviu. Ainda que muitos digam que ASP é uma linguagem morta é bom saber que isso é completamente fora da realidade pois muitos sites ainda hoje insistem em utilizar o ASP Classic e muitos destes tem dificuldade em avançar pra ASP.NET ou outras. 


Um detalhe importante para quem usa Xampp ou qualquer outro serviço por meio do localhost. Será preciso alterar a porta padrão do Xampp que é 80 para qualquer outra livre. Aqui alterei para 8012 o que me faz ter de escrever no navegador da seguinte forma: 'localhost:8012/' para poder acessar meus estudos e projetos em PHP.

Para fazer isso basta clicar dentro do Painel de Controle do Xampp em 'Explorer'. Dentro desta pasta procure por 'apache\conf' e abra com o bloco de notas o arquivo 'httpd.conf'. Dentro deste arquivo clique 'ctrl + f' e busque por 'Listen'. Troque 80 por 8012 ou uma porta de seu desejo que esteja livre. Se não tiver certeza de qual escolher clique no botão 'Netstat' dentro do Painel de controle do Xampp para verificar quais portas estão sendo usadas e assim escolher alguma não listada nesta tela. Para mim isso foi suficiente não tendo que alterar mais nada. Feche o arquivo e salve as alterações. Vá no navegador e digite: 'localhost:8012/' ou a porta de sua escolha. Com isso você verá seus arquivos, pastas ou se houver algum 'index.html' ou 'index.php' ele será lido e apresentado automaticamente. Não ocorrendo isso volte no arquivo e procure qualquer entrada lá que não esteja comentada '#' que faça referência à porta 80 e adicione os detalhes pertinentes. Salve e teste novamente. Ainda não obtendo resultado procure no google algo mais detalhado sobre esse assunto. Como falei acima aqui não precisei trocar nada além do que citei e portanto acredito que na sua máquina ocorrerá do mesmo modo. Vale ressaltar que não sou um expert em nada do que falei aqui e portanto se você explodir sua máquina o problema é seu por acreditar em um post na internet e/ou por não saber seguir instruções.

Entretanto fiz exatamente tudo aqui com o Windows 11 e nada, nada ocorreu de errado até agora. Portanto eu atesto que isso seja por sua conta e risco já que há alteração de recursos do sistema. Tendo dito isso e confirmando que estou tirando o corpo fora de qualquer absurdo que você faça na sua máquina, espero que seja de fato muito útil essa informação e que muitos comentários lindos e agradecidos apareçam por aqui. Na próxima vou tratar mais da linguagem(Script!) em si e trazer alguns exemplos dela sendo executada na minha máquina. 

Até breve!

24 novembro 2021

Realidade Virtual e Aumentada - um universo expandido

Podemos citar inúmeras formas de como essa tecnologia atualmente está invadindo nossas vidas e seria preciso muito mais do que um simples post num blog para tratar de todos os detalhes pertinentes. Antes de mais nada é preciso diferenciar realidade aumentada da realidade virtual: 

  • R.A. pretende sobrepor a realidade com conteúdo virtualizado aprimorando a realidade com objetos, personagens, reações, etc. 
  • R.V. é no entanto um ambiente totalmente digitalizado que transporta a experiência para qualquer tipo de situação predeterminada. 
A realidade aumentada é de certo modo uma derivação da realidade virtual que hoje torna-se mais possível devido aos equipamentos atuais como smartphones que possuem cameras e todo o poder computacional que possuem. A realidade virtual necessita de equipamentos mais específicos como óculos VR que forçam a imersão por meio de imagens tridimensionais, sons e muitas vezes algum tipo de reação como vibração ou até mesmo cheiro: "pesquisadores das universidades de Yorke e Warwick desenvolveram um capacete que permite ao usuário não somente ver (...) mas também sentir sabores e cheiros associados com a cena". 

Da medicina passando pelo exército aos jogos existem formas cada vez mais elaboradas desta tecnologia auxiliar em tarefas ou práticas já existentes. Desde tratamentos de fobias (as duas R.A. e R.V. já foram utilizadas) ao treinamento de militares (conflitos em todos os tipos de situações) o uso parece só ter começado e portanto o limite aparenta ser somente hardware. A educação também aos poucos se apropria do uso incluindo a ferramenta e permitindo a experiência como a própria vivência do ato na realidade pode permitir e assim temos diante de nós uma porta recente, permitida pelo aprimoramento constante da tecnologia como um todo. As nossas máquinas como citado acima hoje em dia já possuem poder suficiente para tal processamento de dados, mas ao que tudo indica ainda não é o ideal.

De forma simplificada basta citar que muitos estudantes já experimentam coisas como viajar para Roma antiga, fazer operações cirúrgicas, combater em ambientes hostis. Não há comparação entre a experiência 2D de um livro estático para uma virtualização de um problema ou situação e percebe-la do ponto de vista de primeira pessoa. Basta pensar no fato de que muito embora a mente pareça detectar o que é ilusão de algo real, ao se colocar numa situação de imersão total de som, imagem e possivelmente num futuro cheiro e sabor a mente permite-se acreditar e tal experiência torna-se tão efetiva quanto algo na realidade. O desenvolvimento se acelera já que em dado momento não há mais resistência e viver o fato tende a ser muito mais proveitoso do que somente imaginar ou ver fotos.

Indo mais adiante podemos afirmar que tal ferramenta não se restringe somente ao aprendizado de algo, mas ao deleite. Podemos visitar museus e visualizar suas obras mais famosas, voar até outro país, ver nossos familiares como se estivéssemos perto. O limite sempre será hardware. Quanto mais imersão se deseja, mais complexo são os aparelhos e mais refinada a experiência. 

Atualmente podemos citar o Facebook com o Horizons Workrooms que pretende possibilitar a interação em ambientes profissionais onde avatares reagem e demonstram exatamente o que o indivíduo deseja. Poderão trabalhar em documentos de forma colaborativa e a utilização do óculos permite visualizar o computador sem a necessidade de retirar do rosto. Ao que foi declarado essa tecnologia em fase beta já vem sendo utilizada por eles e a priori não terá propagandas direcionadas já que não é coletado o teor do que se discute.

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.