segunda-feira, 22 de agosto de 2016

Semana TI Univem

O minicurso de "Introdução ao Desenvolvimento WEB com Python e DJango" está de volta, agora na Semana de TI do UNIVEM, na sexta-feira (16/09) às 19:30.

Quem sofre com a infra de seus projetos não pode perder o minicurso do Otávio Santos "Docker para Desenvolvedores" no sábado (17/09) às 9:00.

Veja uma nova foma de pensar em programação com Leonardo Lima da Persys "Programação Reativa no Java/Android" segunda-feira (12/09) às 21:30 com continuação na terça-feira (13/09) também às 21:30.

Confira a Programação SemanaTI.

Para quem gosta do Blog Vida de Programador não perca na quarta-feira (14/09) às 19:30 a palestra de Andre Noel "Como perder seus melhores programadores: Dicas práticas".

Para mais informações clique aqui.

Obrigado!

quinta-feira, 4 de agosto de 2016

Python lambda

Lambda é um recurso que possibilita a escrita de forma mais sucinta as funções ou métodos.
Também ajuda a utilizar mais facilmente os recursos funcionais da linguagem.

Veja o exemplo:
#declaracao de funcao tradicional
def add_1(x):
    return x + 1

print add_1(2)

#"declaracao" de funcao com lambda
l_add_1 = lambda x : x + 1

print l_add_1(2)

vetor = [0,1,2,3,4,5]

#novo vetor = vetor + 1
new_vetor = []
for i in vetor:
    new_vetor.append(i + 1)
print new_vetor

#utilizando map
print map(add_1, vetor)

#utilizando map
print map(l_add_1, vetor)

#utilizando map mais lambda inline
print map(lambda x : x + 1, vetor)

#exibe valores impares
print filter(lambda x : x % 2, vetor)

A função map executa a função passada por parâmetro para cada elemento do vetor criando um novo vetor com os resultados.
A função filter cria um novo vetor somente com os elementos do vetor onde a função passada por parâmetro resultou em True.

Obrigado!

quarta-feira, 20 de julho de 2016

Classes Abertas em Python

Em python é possível adicionar métodos e atributos nas classes mesmo depois de já definidas.
class Person(object):
  def __init__(self,name):
    self.name = name

p = Person('programando no aquario')
print p.name
print p

def person_str(self):
  return self.name

Person.__str__ = person_str

print p

def print_hello(self):
  print 'Hello %s' % self.name

Person.hello = print_hello

p.hello()


Assim é possível adicionar algum comportamento a classes de bibliotecas de terceiros sem alterar o código da biblioteca, ou mudar de forma dinâmica o comportamento das classes.

Obrigado!

segunda-feira, 18 de julho de 2016

Python @decorator

Decorators em Python lembram muito as anotações do Java, pelo menos em sua sintaxe.

Os decorators são funções que recebem uma classe ou uma função e retornam algo para substituir a classe ou a função que receberam.
Assim é possível mudar todo o comportamento da função ou da classe, simplesmente a substituindo por outra coisa, ou adicionar comportamento ao comportamento padrão.

def soma(a,b):
  return a + b

print soma(5,5)


O código acima é um exemplo simples de uma função de soma. Agora vamos criar um decorator que realizará um log da execução desta função.
def log_decorator(func):
  def new_func(a,b):
    print 'Executando: %s(%d,%d)' % (func.__name__,a,b)
    result = func(a,b)
    print 'Resultado: %d' % result
    return result

  return new_func


@log_decorator
def soma(a,b):
  return a + b

print soma(5,5)


Nesse exemplo foi adicionado o comportamento de log a função. Agora neste o decorator será utilizado para alterar o comportamento original.
def mult_decorator(func):
  def new_func(a,b):
    return a * b
  
  return new_func

@mult_decorator
def soma(a,b):
  return a + b

print soma(5,5)


Esse último exemplo não é muito usual, mas demonstra bem o potencial que os decorators podem ter.

Decorators podem adicionar atributos a classes, mudar suas funções entre outras coisas mais. Os decorators também podem ser classes que implementem o método __call__ para poderem se comportar como funções, dessa forma é possível parametrizar os decorators.
class AddDecorator(object):
  def __init__(self,val):
    self.func = None
    self.val = val

  def __call__(self,func):
    self.func = func
    return self.decorator

  def decorator(self,a,b):
    return self.func(a,b) + self.val

@AddDecorator(-10)
def soma(a,b):
  return a + b

print soma(5,5)


Obrigado!

sexta-feira, 15 de julho de 2016

Python List Comprehensions

List Comprehensions é uma maneira enxuta para criar listas em Python.
Basicamente é necessário escrever uma pequena regra que gere a lista entre [ ].

# resulta em [ 0 ** 2, 1 ** 2, 2 ** 2, ... ,9 ** 2]
print [ x ** 2 for x in range(10)]

# resulta em ['','a','aa', ..., 'aaaaaaaaa']
print [ 'a' * x for x in range(10)]

# resulta em [0, 1, 3, 6, 10, 15, 21, 28, 36, 45]
print [ sum(range(0,x+1)) for x in range(10) ]

# resulta em [0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
print [ x for x in range(20) if x % 2 == 0 ]


Obrigado!

quarta-feira, 13 de julho de 2016

Python Yield

Com yield é possível criar iteradores de maneira simples e eficiente.
Ao invés de utilizar memória para armazenar uma lista com valores para serem iterados, com yield fica fácil gerar os valores conforme a necessidade.

# gera potencias de 2
def pot2(limit=None):
    i = 0
    while limit is None or i < limit:
        yield 2**i
        i += 1

# imprime um generator
print pot2(10)

# imprime uma lista com os
# valores fornecidos pelo generator
print list(pot2(10))

# generator infinito limitado
# pelo range
g = pot2()
for i in range(5):
    print g.next()

# percorre os valores do generator
for v in pot2(10):
    print v



Obrigado!

domingo, 27 de março de 2016

FLISOL 2016

O Programando no Aquário vai estar presente no FLISOL 2016 em Marília.
Vai disponibilizar um mini curso sobre desenvolvimento web "Introdução ao Desenvolvimento WEB com Python e DJango".

O evento ocorrerá dia 16 de abril no UNIVEM.
http://pitagoras2.univem.edu.br/gwsites/default.asp?site=flisol

As inscrições já estão abertas.
http://pitagoras2.univem.edu.br/gwsites/default2.asp?codigo=85&item=1240

Aproveite os cursos e palestras oferecidos no FLISOL!



Obrigado!

terça-feira, 5 de janeiro de 2016

PHP 7

O PHP 7 já está funcionando com várias novidades.
Na maioria dos lugares li que o desempenho está bem melhor, porém não vou verificar isso neste post.

Separei aqui, as novidades que mais me agradaram e vou tentar mostrar alguns exemplos.
Infelizmente o PHP 7 não é suportado no codepad, então não será possível testar os códigos da maneira tradicional do blog. Para eu testar os códigos foi necessário fazer o download do código fonte e compilá-lo, usei o tutorial do link a seguir tecmint install and compile php 7.

Tipagem dos parâmetros com tipos primitivos
Antes só era possível com arrays, classes ou interfaces.
Analisando a saída do var_dump do código abaixo, é possível notar que os parâmetros são convertidos para a tipagem definida. Na primeira chamada da função concatena é passado um valor numérico que é convertido para string.
<?php

function concatena(string $a, string $b){
 var_dump($a,$b);
 return $a.$b;
}

function mult(float $a, float $b){
 var_dump($a,$b);
 return $a*$b;
}

echo concatena('teste',1),"\n";
echo mult('12.1','13'),"\n";

RFC do PHP

Tipagem do retorno da função ou método
Isso é muito interessante, pois pode ajudar o autocompletar das IDEs e facilita perceber a intenção do método ou da função.
<?php

function concatena(string $a, string $b) : string{
 var_dump($a,$b);
 return $a.$b;
}

function mult(float $a, float $b) : float{
 var_dump($a,$b);
 return $a*$b;
}

echo concatena('teste',1),"\n";
echo mult('12.1','13'),"\n";
RFC do PHP

NULL COALESCE OPERATOR
No código abaixo existem três trechos que tem a mesma finalidade.
A adição do operador ?? reduz e simplifica a sintaxe.
<?php

$array = array(
 'nome' => 'Programando no Aquário'
);
//trecho1
$apelido = $array['nome'];
if(isset($array['apelido'])){
 $apelido = $array['apelido'];
}
//trecho2
$apelido = isset($array['apelido']) ? $array['apelido'] : $array['nome'];

//trecho3
$apelido = $array['apelido'] ?? $array['nome'];

echo $apelido,"\n";
RFC do PHP

Classes anônimas
Este recurso já estava presente na maioria das linguagens O.O., finalmente foi implementado no PHP.
<?php

function translate(string $key) : string{
 $words = array(
  'hi' => 'Olá'
 );
 return $words[$key] ?? $key; 
}

function lazy_translate($key){
 return new class($key){
  private $key;
  public function __construct($key){
   $this->key = $key;
  }
  public function __toString(){
   return translate($this->key);
  }
 };
}

var_dump(lazy_translate('hi'));
echo lazy_translate('hi'),"\n";

RFC do PHP

Obrigado!

Algumas referências:
http://tableless.com.br/10-novidades-do-php-7/
http://www.profissionaisti.com.br/2015/09/10-novidades-do-php-7/
https://medium.com/tenha-perspectiva/principais-novidades-do-php-7-6821683fc9a#.c1b9xpe2t