Minha primeira linguagem funcional: Elixir

Elixir é uma linguagem funcional que vem ganhando bastante espaço nos últimos tempos. É bom para pensar um pouco fora da caixa, principalmente para quem está acostumado a programar usando apenas linguagens imperativas (C, Java, etc.), como euzinha aqui. Dentre os maiores paradigmas de programação, a funcional é a mais antiga!

As linguagens funcionais podem ser compreendidas como avaliações de expressões feitas pelo computador, em que uma função pode envolver outras funções (se você quiser saber mais, procure sobre Cálculo Lambda).

Fiz o curso Try Elixir, do CodeSchool (gratuito e bem rápido, corre lá!). Nessa mesma semana em que tive meu primeiro contato com Elixir, tivemos uma revisão de funções compostas na faculdade e pra mim foi bem legal ver esses conceitos matemáticos assim diretamente aplicados.

Em Matemática, por exemplo, podemos fazer várias funções dentro de funções. Considere

f(x) = sen(x);
g(x) = log(x);
h(x) = x⁴;

Podemos fazer a seguinte composição das funções acima: f(j(h(x))), ou seja,

sen(log(x⁴))

Assim, pensei em implementar essa função composta em Elixir e para fazer isso, vamos usar o pipe operator. Ele funciona assim (veja mais aqui):

O operador pipe é representado por |>, recebe o resultado de uma expressão e passa ele adiante. Vamos dar mais uma olhada no trecho de código acima reescrito com o operador pipe:

other_function() |> new_function() |> baz() |> bar() |> foo()
O pipe pega o resultado da esquerda e o passa para o lado direito.

Usamos a biblioteca :math, que é a mesma usada em Erlang, ficando assim:


defmodule CompositeFunction do
  def my_example(x) do
    result = :math.pow(x, 4)
    |> :math.log()
    |> :math.sin()
    IO.puts(result)
  end
end

Para rodar local, digite iex para entrar no compilador, depois c(“composite_function.ex”) e depois CompositeFunction.my_example(seu_argumento). E Voilà!

Rodando CompositeFunction.my_example(5) no terminal, ele retorna:
0.15395162623403327
:ok

Espero que curtam, até a próxima!

Can you get the loop? #Codewars

No final do ano passado meu namorado me mandou esse site super legal para treinar Algoritmos (sempre bom): Code Wars. Porque eu curti? É mais amigável, a comunidade é mais ativa e você cria um clã com seus amigos. Ainda que você seja iniciante, ele te sugere problemas mais difíceis para você ir treinando, além de mostrar as soluções de outros participantes para você analisar e aprender boas práticas depois de submeter sua solução. E já que falamos de clãs, quem quiser entrar no meu, aí vai o link: entre no meu clã! =D

Semestre passado, vimos algumas Estruturas de Dados e dentre elas, listas encadeadas. Daí resolvi resolver um Kata para revisar nas férias e postar aqui para discutir com vocês.

O problema

Pode ser acessado aqui e a seguir a descrição:

You are given a node that is the beginning of a linked list. This list always contains a tail and a loop.
Your objective is to determine the length of the loop.
For example in the following picture the tail’s size is 3 and the loop size is 11.

Portanto, a solução requer descobrir a posição do tail (que será o nó cujo conteúdo se repete) para retornar o tamanho do loop. O que eu fiz foi criar um dicionário e armazenar os conteúdos dos nós até encontrar um que se repete – o tail. A partir daí, rodei outro while para retornar o tamanho do loop. O código em Python pode ser visto a seguir:


def loop_size(node):
    my_dict = {} 
    p = node // node é o head que foi passado como argumento
    my_dict[node] = p //inicializando dicionário com o conteúdo de node
    
    while p.next not in my_dict: 
        p = p.next
     
    my_dict[p] = p
    tail = p // ao sair do loop eu acho o tail, pois é ele que repete
    
    t = tail
    size = 1 
    while t.next != tail: 
        t = t.next
        size +=1
        
    return size

Sei que é possível resolver esse problema sem utilizar dois whiles, mas por enquanto fica essa solução e depois eu posto novamente o código refatorado, pois ainda preciso estudar mais sobre dicionários. Curtiram? =P

Manual de sobrevivência 2016.2

É com muita alegria que vos falo neste post, pois minha meta desse ano em relação à faculdade era passar em todas e consegui!!

ai que alegria e sufoco!

Foi muito puxado, pensei em desistir de uma matéria, maaaaas tem que perseverar e nunca desistir! Essa foi uma lição muito importante que aprendi esse ano e que repasso a quem tiver lendo esse post =D

Bom, aí vão os links que me ajudaram para sobreviver a este semestre, separados por disciplina (olha como sou legal xD):

Algoritmos II

Pois bem, esse semestre a matéria mais legal foi a de Algoritmos, onde estudamos recursão, algoritmos de ordenação, busca binária, análise de algoritmos e algumas estruturas de dados. Links super úteis:

Algorithms, Part I

Curso gratuito online, se joga!

Sorting Algorithms

Playlist muito didática para quem curte aprender por vídeos.

Data Structures

Idem.

Visualising data structures and algorithms through animation

Esse site é muito legal e foi meu amigo Márcio quem me mandou. Bem colorido e didático.

Dica que vale passar sem sufoco: às vezes você acha que entendeu, mas é só praticando que terá certeza e verá os pontos que não compreendeu, portanto, implemente os algoritmos antes das provas!

Cálculo I

Segunda matéria mais legal!! Cálculo é muito legal e vou deixar também alguns links de vídeos e sites que me ajudaram a compreender melhor os conteúdos: limites, derivadas e introdução ao cálculo integral.

LCM Aquino

Segunda vez que esse canal me ajuda, gosto das explicações dele, pois sempre mostra as provas dos teoremas, além de muitos exemplos.

Toda a Matemática

Esse canal também é muito legal e o professor sempre posta vídeos curiosos do mundo da Matemática.

Wolfram

Site para calcular tudo que você imaginar. Tem plano com desconto para estudante, onde você tem acesso à solução e pode verificar suas respostas (:

Organização e Arquitetura de Computadores

Consegui passar de boa, então você também consegue xD Aí vão os links:

Introdução a Arquitetura de Computadores

Livro muito bom e necessário para a matéria. Tem poucos conteúdos online que explicam tão bem quanto este livro e que seguem a mesma ementa do Senac (:

Memória Principal

Vídeo que me salvou na primeira prova =D

Projeto Integrador II – Jogo educacional 2D

Graças a meu professor, pude desenvolver o mesmo jogo do meu projeto de Iniciação Científica em Python. O link tá no meu github e vocês podem conferir o meu =D
Nesse PI não posso ajudar muito aqui, a não ser incentivar a criar um jogo que você goste muito da ideia (:

Álgebra Linear

Playlist salvadora

Khan Academy

É isso, espero que isso seja útil e até mais!

Compreendendo Recursão

Muito bem, semestre começou com tudo e estou aprendendo muita coisa nova! Uma delas que estou vendo agora é Recursão. Se você já ouvi falar de Algoritmos, provavelmente já deve ter ouvido falar de Recursão também. De acordo com o material da nossa aula

um processo recursivo é um processo que implementa uma relação de recorrência. Uma relação de recorrência é uma expressão matemática utilizada para expressar uma equação de recorrência.

Wait, what? Vamos por partes, pois esse é um conceito muito difícil de ser compreendido, mas vale a pena, prometo. O mais legal de se aprender recursão é criar algoritmos menores e mais bonitos (embora nem sempre seja o mais eficiente!). Resumindo, uma função recursiva vai chamar a si mesma e retornando os valores de cada chamada, até chegar no caso base.

Calma, não é mágica! Acredito que uma das maiores dificuldades seja compreender os passos para escrever uma função recursiva para que esta não caia num loop infinito. Por isso é preciso ter atenção às duas partes essenciais de uma chamada deste tipo e verificar com números inteiros o problema até que você entenda o que será o caso base e a chamada recursiva a partir do exemplo a seguir:

Considere um vetor de inteiros de tamanho n. Uma função recursiva que calcule o produto dos elementos estritamente positivos de um vetor de inteiros v [0..n-1].

 int produto (int v[], int n) {
     if(n == 1){
   	 return v[0];
     }
     if(v[n-1] > 0){
   	 return v[n-1] * produto(v, n-1);
    }
	return produto(v,n-1);
 }

O caso base – Essa é a parte que você sabe o resultado e deve se aproximar na próxima etapa. No exemplo abaixo, vemos que o caso base é a condição if (n == 1) return v[0];, pois quando o vetor chegar até o primeiro elemento, não há mais necessidade de se calcular o produto, certo?

A chamada recursiva – Esta deve ser quebrada em pedaços menores até atingir o caso base. No nosso exemplo, fazemos duas chamadas distintas. Caso o elemento da posição v[n-1] a ser testada seja positiva, então retornamos return v[n-1] * produto(v, n-1); , caso contrário, chamamos a função para continuar a descrescer o valor de n até atingir o valor de 1, nosso caso base.

O que a função faz é o seguinte. Vamos supor que o nosso vetor v[4] = {1, 2, 3, 4} e o tamanho do vetor seja n = 4.

produto(v, 4)

v[3] * produto(v, 3)
v[3] * v[2] * produto(v, 2)
v[3] * v[2] * v[1] * produto(v, 1)
v[3] * v[2] * v[1] * v[0]
>> 4 * 3 * 2 * 1 = 24

Esse exemplo foi retirado desse material e está disponívelneste link. Veja também outras formas de usar a recursividade para resolver o mesmo problema (:

Vá fazendo com calma cada passo para não se perder (o que é muito fácil) e compreender como o computador entende essas chamadas (vale printar todas as entradas para ver o valor de retorno a cada chamada). Dá um trabalho e sua cabeça buga por um momento (ou dias xD), mas seu código fica mais bonito e te deixa com uma sensação maravilhosa de finalmente aprender Recursão 🙂

Como aprender a programar

Olá, pessoas queridas! Este post é uma compilação que resolvi fazer com mais links  e dicas para ajudar a galera que quer aprender a programar. Vale lembrar que, assim como tudo que aprendemos na vida, não se trata de mágica, mas de um processo, então, anime-se para começar a ver as coisas de outro jeito! Abaixo algumas dicas e links para vocês 🙂

1 – Programar se aprende programando

Sei que parece loucura, mas é como aprender outa língua: você tem que praticar para aprender. Neste sentido, sinta-se feliz porque existem muitos sites legais com este propósito!! Acredito que o mais importante é não se preocupar em entender TUDO, ir com calma e paciência.

Embora sejam muitas opções de links e de cursos e parece que você saber disso tudo em 1 dia, não se desespere. Veja cada um e escolha o que melhor você sentir afinidade. Alguns sites que eu usei e recomendo são:

Code.org – um jeito divertido de aprender Algoritmos! Recomendo fortemente, pois é muito importante dominar Lógica de Programação e além disso, é uma proposta bem legal (tem até tutorial com tema de Star Wars!).

Codecademy – tutoriais com várias opções bem legais.

Code School – Gosto muito deles e as aulas são em vídeo. Alguns são pagos, mas dá para fazer uns gratuitos.

Udacity – Também possuem aulas em vídeo e acho mais dinâmico que o CodeCademy, por exemplo.

Made with Code – um projeto muito legal para atrais meninas para programar 🙂

2 – Tenha um projeto que você queira fazer

Sabe aquele app que você sempre quis fazer? Ou um sistema que vai ajudar alguém da sua família? Uma das melhores e mais eficientes formas de se aprender a programar é ter um projeto pessoal, assim você vai se sentir mais motivad@ e confiante. Nessas horas, ajuda muito também pegar um código de qualidade por aí e modificar algumas coisas.

Por que aprender a programar? Ora, tudo que gostamos é feito de código!

3 – Tenha um(a) mentor(a)

Sério, isso é MUITO importante. Já falei isso aqui várias vezes e acho que nunca é suficiente: procure alguém que já tenha experiência para ajudar com suas dúvidas (não é para ficar perguntando tudo, hein). Sabe quando você tentou e mesmo assim não entendeu, ou quer entender mais sobre algo? Não tenha medo de perguntar.

4 – Divirta-se!

Isso é o mais importante e necessário ter em mente. Com isso, sinta-se bem vind@ ao mundo mágico da Programação!

 

Programar é como… dançar

Há um tempo eu li uma post da Alina Rainsford sobre a experiência dela com o balé e a programação. Achei tão legal que resolvi compartilhar aqui. Olha que incrível esse sentimento que ela fala:

You have to do a ballet step a thousand times before your muscles have really learned it. Learning to code is like brain muscle memory.

Eu faço Pole Dance, para quem não sabe ainda, e mês que vem completo 2 anos. Passou muito rápido e lembro até hoje do primeiro dia, da música que a professora usou para passar uma coreografia e claro, do sentimento que me acompanha até hoje: não existe nenhum movimento que eu não possa fazer, o que eu preciso é de treino e persistência .

Como tudo que começamos a fazer, nosso corpo estranha, mas ele se acostuma. Você é quem define os limites dele. Já viu aquela frase do Aristóteles (ou não) de que o que te torna excelente são seus hábitos? Dançar é a prova viva disso.

 

A vida de toda dançarina xD

O seu corpo aprende a reagir ao novo e você se torna cada vez mais confiante e capaz de vencer os desafios. Alguns movimentos você pega de primeira, outros você demora um tempo e isso é normal. Ninguém aprende no mesmo ritmo, por isso, você aprende a ouvir seu corpo e respeitar os sinais dele. A melhor sensação é a de conseguir, principalmente aqueles que demoraram a sair!

Estudar Computação está sendo uma experiência semelhante para mim e todo dia é um desafio. Eu entendo meus limites, mas não me contento com o mínimo. Tenho meu tempo para aprender e estou aprendendo a respeitar isso. Eu posso não saber muito ainda, mas estou trabalhando nisso. Meus amigos, professores, tutores e tudo mais, serão cruciais nesse processo infinito, o que torna a caminhada mais divertida e desafiadora.

Nunca esqueça que pedir ajuda é essencial. Quem nunca precisou de uma mãozinha para resolver um problema, né? 🙂

 

Quando eu quero conquistar algo, sei que o primeiro passo é imaginar, depois trabalhar até conseguir. Sabe como é, eu tenho síndrome de Beyoncé:

I see it, I want it
I stunt, yellow-bone it
I dream it, I work hard
I grind ’til I own it

Espero que vocês tenham curtido. Depois da semana de provas, estou de volta! E você, como se sente ao aprender a programar?

Grace Hopper Conference 2016 – inscrições para bolsas!

A Grace Hopper Conference, a maior reunião e celebração de mulheres na computação, estendeu o prazo de inscrições para se inscrever como estudante ou como parte de uma turma para ganhar bolsas para participar do evento.

Este ano vai acontecer em Houston, Texas (será que vou ser selecionada? é a cidade natal da Beyoncé! <33). Se você sempre quis participar ou conheceu agora e curtiu a ideia, inscreva-se também. Quem for selecionada, vai ganhar auxílio viagem, hospedagem, alimentação e muita coisa legal para vivenciar.

Até quando pode se inscrever?

4 de Abril de 2016.

O que precisa?

Você vai precisar redigir um texto de até 500 palavras falando porque você merece ganhar a bolsa, do seu currículo em inglês e de um ‘histórico’ escolar não oficial, ou seja, descrever as disciplinas que você já fez, as que está cursando no momento, etc. Elas também pedem o contato de alguém para escrever uma carta de recomendação sobre você. Você pode conferir mais sobre esses detalhes aqui.

Não deixe para última hora, pois pode ocorrer imprevistos na hora de enviarem a sua carta de recomendação, que deve ser feita até o prazo de 4 de Abril. Fora isso… Boa sorte!

#cruzandoosdedos

Tutorial de Arduino: Semáforo

Desde que fiz meu primeiro LED acender, me apaixonei por Arduino <3 Veja como é fácil brincar com ele e já comece a pensar nas milhares de coisas que você pode fazer!

Para este tutorial, você vai precisar de:

1 Placa Arduino
1 Protoboard
3 LEDS’s
3 resistores 1KΩ
Cabinhos coloridos o/

WP_20160312_16_52_35_Pro[1]

Preparação

Conecte os resistores no lado negativo da Protoboard e ligue um fio ao GND (ground) da Arduino. Depois conecte o lado positivo dos LED’s nas entradas digitais.

Depois de selecionar a Placa e a Porta, carregue o código e se divirta! Caso queria ver o meu funcionando, clique aqui.


int red = 12; // variáveis para ficar mais bonitinho
int yellow = 8;
int green = 7;

void setup() { // inicialização
  pinMode(red, OUTPUT); // define pino 12 como saída
  pinMode(yellow, OUTPUT); // define pino 8 como saída
  pinMode(green, OUTPUT); // define pino 7 como saída
}

void changeLights(int color, int timer) { //função do semáforo com a cor e o delay como parâmetros
  digitalWrite(color, HIGH);
  delay(timer);
  digitalWrite(color, LOW);
}

void loop(){ // aqui eu chamo a função com a ordem das cores e o delay de cada uma
  changeLights(green, 3000);
  changeLights(yellow, 2000);
  changeLights(red, 5000);
}

Fácil, não? Até a próxima!

Toptal Roadtrip South America

Nessa segunda, dia 29, tive a oportunidade de encontrar com um grupo da Toptal e foi bem legal. Eles têm uma proposta muito diferente e vale a pena conhecer. Se você pensa em trabalhar remotamente algum dia, dê uma lida no material deles aqui:

Os caça talentos estrangeiros, de olho nos experts em tecnologia do Brasil

Não só o carnaval e o futebol brasileiro são valorizados pelos estrangeiros. As empresas cada vez mais procuram talentos locais no âmbito da tecnologia e geram interessantes oportunidades de trabalho. Por um lado, o que torna tudo isso possível é a modalidade home-office. Por outro, a sociedade vai se adaptando ao estilo de vida dos ¨millennials¨, jovens que pertencem à Geração Y – a chamada geração do milênio – e que prezam por horários flexíveis; pela possibilidade de trabalhar em casa; e pelo fato de trabalhar por projetos ao invés de cumprir horário de escritório.

A capacidade de adaptação, o desejo de trabalhar com o que mais gostam e o fato de viverem conectados, também fazem com que estes jovens vejam o trabalho freelance como uma excelente alternativa, o que coincide com a necessidade das empresas estrangeiras.

Freelancer, Prolancer, Trampos, 99design, 99freela e Toptal são algumas das plataformas de contratação online, através das quais muitas empresas procuram profissionais para o trabalho freelance. Só uma breve descrição de cada uma delas:

Freelancer conecta por volta de 18 milhões de empregadores e profissionais freelance de mais de 247 países.
Prolancer oferece em sua plataforma os melhores trabalhadores do mundo digital. São muito ativos no mundo da tecnologia no Brasil.
Trampos é um empresa brasileira que nasceu em 2008 como um projeto de colaboração a fim de construir uma ponte entre aqueles que precisam contratar e os que precisam de trabalho.
99design é voltada exclusivamente para designers. O site tem uma política forte contra cópias, o que pode causar a suspensão da conta do designer que copiar trabalhos alheios. A 99freelas é o mesmo site, mas ampliado a todo tipo de profissionais.
Toptal esta plataforma tem uma diferença. A equipe encarregada do recrutamento procura matches entre desenvolvedores e designers para projetos de acordo com as demandas particulares de cada cliente, um tipo de serviço que contrasta com as estratégias de alto volume utilizadas por outros sites.

Na maioria das plataformas, o candidato pode se cadastrar apenas fornecendo seus dados pessoais e profissionais. Entretanto, há um caso diferente entre elas. Toptal, é a rede mundial líder de desenvolvedores de software e de designers de elite freelance. Ela conta com um rígido processo seletivo para avaliar candidatos de todo o mundo e sua taxa de aceitação é de apenas 3% dos participantes.

Quer se tornar um deles também? :)
Quer se tornar um deles também? 🙂

Seja qual for a maneira de conseguir trabalho, fica claro que a modalidade online quebra com as pautas tradicionais, tem a ver com um mundo hiperconetado e hipercomunicado e é sem duvida uma forma de trabalho que, por suas vantagens, conta com cada vez mais adeptos, tanto da parte dos trabalhadores como das empresas contratantes.

A Toptal no Brasil

A equipe da Toptal se encontra por muitas cidade do Brasil, oferecendo palestras de capacitação gratuitas, não só para seus desenvolvedores e designers, mas também para qualquer pessoa ou instituição que queira saber da companhia e do trabalho freelance. Os interessados podem preencher o formulário online para obter mais informação.

PS. Se você quiser saber mais sobre a plataforma Outsourcely e ganhar desconto de 30% em todos os planos, clique aqui =)

Retrospectiva MasterTech 2016.1

Depois de 320hrs, chegou ao fim (se chegou ao fim é porque foi bom :)! No dia 25/02 tivemos o DemoDay, uma demonstração dos projetos desenvolvidos no curso e foi muito legal.

Eu desenvolvi dois projetos, um em grupo e um individual. O Laser Cat (aguardem novidades por aí!) e o Não me Calo e você pode ver as nossas apresentações aqui e aqui.

Eu fiquei um pouco nervosa sim, mas assim que pisei no palco, me senti confortável. Não tenho vergonha alguma em admitir que mereci estar ali e que eu estava preparada. Dividi o palco com pessoas maravilhosas e compartilhei momentos que levarei para a vida inteira. Mas chega de #mimimi e vamos ao que interessa.

Queria agradecer às seguintes pessoas:

Letícia, Thiago, Guilherme, Marina, nossos professores que passaram mais tempo conosco e ensinaram muito mais do que técnica;

Aos palestrantes Guilherme Horn, da Accenture e Fabrício Barth, da IBM, por terem compartilhado em poucos momentos valorosas ideias.

Ao Rafael, da PandoraLab, por nos emprestar hardwares para nossos projetos por acreditar no nosso potencial;

Ao Harley, por sempre dar um tempinho das suas atividades para checar como estávamos e dando dicas que sempre salvavam nossas vidas;

À Madalena, por ser você e alimentar nosso corpo e alma todo dia;

Ao meu grupo, por ter topado a ideia de brincar com laser e gatos e pelos momentos de diversão;

À Gabi, que topou o desafio de ensinar Yoga para programador@s! <3 À Camila e ao Felipe, pela oportunidade incrível. A todos que, indiretamente e diretamente, contribuíram para esses momentos. Diante de tudo isso, posso dizer que o maior aprendizado que eu vou levar é: eu agora posso ser quem eu quiser!

Não poderia terminar sem um gif da Leslie Knope 😛