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

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 🙂

Você não precisa ser um gênio para cursar Exatas

Faz algum tempo que queria discutir esse assunto e recentemente me deparei com a matéria abaixo e me senti mais motivada para escrever. Durante muito tempo evitei entrar para a área de “Exatas” porque durante minha vida, encontrei pessoas extremamente arrogantes nessa área e acreditava ser um pré-requisito para entrar nesse mundo mágico de gênios. De forma alguma queria ficar no meio dessas pessoas.

Ainda bem que conheci pessoas maravilhosas que me mostraram haver uma luz no fim do túnel e hoje entendo o que acontece de fato. Não vou entrar na discussão sobre Humanas x Exatas porque não é o foco e acredito que isso não leva a lugar algum. No entanto, queria abordar mais o que significa ser cientista e como propiciar uma formação de profissionais voltada à resolução de problemas, não havendo espaço para ego nem show de talentos.

Hoje tenho vários amigos de Computação que fazem Pós-Graduação e me sinto motivada para seguir esse caminho também. No entanto, fico um pouco triste quando discutimos o lado não tão bonito dessa etapa acadêmica. A matéria da Carta Capital Precisamos falar sobre a vaidade na vida acadêmica resume bem esse problema nas universidades:

“A formação de um acadêmico passa por uma verdadeira batalha interna em que ele precisa ser um gênio. As consequências dessa postura podem ser trágicas, desdobrando-se em dois possíveis cenários igualmente predadores: a destruição do colega e a destruição de si próprio. […] Hoje, como professora, tenho preocupações mais sérias como estes alunos que acreditam que os colegas são brilhantes. Muitos deles desenvolvem depressão, acreditam em sua inferioridade, abandonam o curso e não é raro a tentativa de suicídio como resultado de um ego anulado e destruído em um ambiente de pressão, que deveria ser construtivo e não destrutivo. […] É preciso barrar imediatamente este sistema. A função da universidade não é anular egos, mas construí-los. ”

Além disso, o fato de que cada vez mais entram pessoas que já sabem programar nos cursos de Computação faz com que o nível de exigência aumente e apenas os experientes ou os gênios concluem os cursos. O problema é que quem entrou para aprender (o quê, aprender na universidade? que mundo você vive?) fica achando que não deve estar ali e bom, qual o significado mesmo de “universidade”?

Um outro problema que advém disso é a constante arrogância de quem já sabe. Seu coleguinha é gênio? Seu outr@ coleguinha sempre sabe de tudo? Toque aqui! Acontece que Exatas não é um caminho linear. Foi isso que mais adorei nessa matéria aqui Mathematicians are chronically lost and confused (and that’s how it’s supposed to be). Eles falam sobre o processo de aprender Matemática e a lindeza de ser humilde, além de ser absolutamente normal e humano não saber de tudo.

Não esqueça de nunca se desesperar xD

Esse post se trata mais de escrever sobre algo que me incomoda e de motivação para futuros cientistas. Se tem algo que aprendi nessa vida foi: não devo me comparar à ninguém. Meu caminho é único e sei das minhas qualidades e das minhas limitações. Mas, para não ficar só na discussão, aqui vai um post motivacional de pessoas fodonas da programação¹ (são essas pessoas que você deve seguir como inspiração). E lembre-se: os verdadeiros cientistas não têm muita certeza sobre muita coisa (:

¹ http://www.infoworld.com/article/3085150/application-development/dont-just-code-career-advice-from-the-programming-masters.html

 

Fita de Möbius e Escher

Este ano na Semana Unificada de Apresentações do Senac tivemos uma atividade bem legal com a profa. Danielle dos Santos Mingatos (Dani para os conhecidos xD). Foi uma atividade de integração entre os cursos de Ciência da Computação e Engenharia de Computação.

A Dani falou do Escher (já tem post aqui sobre a oficina do ano passado) e fizemos algo beeeem legal: a fita de Möbius! August Ferdinand Möbius foi um matemático alemão do século XIX e ficou bem conhecido com a fita que levou seu nome. Mas não se engane, não é qualquer fita não: trata-se de uma superfície bidimensional não orientada com um lado passando a ser tridimensional no espaço euclidiano quando uma das pontas é torcida (ufa!).

Escher captou bem esse conceito e criou várias obras com essa temática, inclusive se chamam Fita de Möbius. Fica aí a dica de pesquisa para você se divertir nas férias =D

No canal do Numberphile tem dois vídeos muuuito legais com o Tadashi brincando com isso! À medida que você for vendo, tenho certeza de que você terá essa reação:

Adoro este canal, pois eles sempre fazem coisas interessantes e explicam numa linguagem possível de ser compreendida por qualquer um. Como o Tadashi fala, Matemática quando apresentada com uma postura divertida e envolvente É MUITO LEGAL, já o contrário, bom, relembre suas aulas de Matemática :/ (eu foi só trauma, espero que com você não xD).

Escher e seus loops infinitos

Já falei também da professora Eugenia Cheng e ela também postou um vídeo sobre Möbius, mas com…. bagels!

É isso, espero que curtam os vídeos! Tentem fazer em casa também, tenho certeza que vai ser divertido:)

 

Manual de sobrevivência do 1º semestre

Como eu transferi minha matrícula do tecnólogo para Computação, acabei aproveitando 4 disciplinas, por isso estava inscrita em Geometria Analítica, Introdução à Computação e Projeto Integrador I. Neste post vou falar um pouco de materiais e links para você se divertir (porque nem só de estudo vivemos!).

Geometria Analítica

Uma das matérias que mais me desesperei. Jurava que não ia passar, mas nada que sentar bunda e estudar pra valer não resolva. Eu não tive aulas de Geometria na escola, portanto, foi algo bem novo pra mim e tive muita dificuldade em entender os conceitos, ainda mais com essa abordagem super abstrata. Isso me deu até umas ideias para o Projeto Integrador do semestre q vem :), que será um jogo educacional usando a biblioteca Allegro, em C.

Quem me ajudou muito foram as aulas desse professor baiano que você pode ver no canal de GA. Ele segue a abordagem vetorial que a minha professora segue também. Esse material aqui aqui também ajudou muito! Quanto ao aprendizado, desculpa relembrar amiguinh@s, mas não existe segredo! É praticar muito e tentar sempre compreender o que acontece, tirando dúvidas e fazer exercícios extras, se possível.

Algoritmos e Programação I

O livro Elementos de Programação em C é gratuito para estudantes Senac e foi passado como leitura obrigatória. Para mim, C é algo bem diferente e desafiador, pois eu tive contato apenas com linguagens de alto nível (Ruby e Python <3). Também curti muito esse canal sobre Introdução à Programação em C e Ponteiros. Fizemos muitos exercícios do URI e esse foi o diferencial: é programando que se aprende a programar.

Pré-Cálculo

Eu estudei muito pelo canal do Grings e Khan Academy. Encontrei também este material aqui em inglês. Sem mistério também, tem que estudar e fazer as listas! (:

Introdução à Computação

Quando eu tiver muito dinheiro, vou doar para esse cara aqui, Titio Trevas. Também existem vários PDF’s disponíveis que apresentam mais a teoria. Pensa numa aula em que eu saía em entender nada do que o professor falava! Mas comecei a assistir os vídeos e fazer os exercícios que passei de boa. Não se desespere! É normal seu cérebro não entender tudo, ainda mais para quem não está acostumado a pensar como um computador. 

Projeto Integrador I

Esse eu comecei a ficar realmente preocupada. A proposta era fazer uma figura usando a biblioteca tikZ, em Latex. Foi bem difícil no começo, mas with a little help from my friends (aka Gabriel), deu tudo certo. O que me ajudou bastante foi começar a ligar os pontos usando um plano cartesiano. Eu fiz o relatório e vocês podem baixá-lo clicando aqui para saber mais. O resultado foi essa coisa fofa que vocês veem aí e minha inspiração foi essa animação da Chibird:

nhom nhom :3

PARTE 2

Pixar in a Box <333

pixar_in_A_box

O Khan Academy fez uma parceria muito legal com a Pixar: Pixar in a box! Eles mostram toda a Matemática e a prepração por trás ds animações. Estou fazendo e pretendo finalizar nas férias, para me divertir um pouco. Viu que fofo o monstrinho? 😀

How to Bake a Pi

Descobri essa professora de Matemática fenomenal e me apaixonei. Ela mostra como a Matemática está no nosso dia a dia e nem percebemos e o quanto perdemos por não ver isso. Ela tem um canal no Youtube e um livro que está na minha lista de compras! Eu adoro ver pessoas assim que tentam atrair as pessoas para Matemática, em vez de julgar quem não curte (ainda mais considerando o péssimo ensino que temos, né).

A complexidade sensível: um paralelo entre videogames e arte

Esse curso gratuito no Coursera é uma parceria com a Unicamp e discute jogos sob uma abordagem mais cultural. Achei bem legal, fica aí a dica para quem sempre algo a mais além do fato de jogar 🙂

Concluindo…

Este semestre foi bem intenso e algo que aprendi que fez toda a diferença foi entender a distribuir meu tempo de estudos de acordo com minhas necessidades. Isso é algo só você saberá, então não há fórmula mágica. Lembre-se de sempre respeitar seu ritmo de estudos e de pedir ajuda sempre que precisar (vou falar mais sobre isso em próximos posts, prometo). Isso não é fraqueza, é humano e pedindo ajuda você chega mais longe.

É isso, espero que curtam!

 

Um pouco da história das mulheres na computação

Programming requires patience and the ability to handle detail. Women are ‘naturals’ at computer programming – Grace Hopper

Desde mesmo antes de mudar para TI, eu queria compreender mais sobre como a área de Computação, antes tão receptiva para as mulheres, hoje se tornou uma área masculina, estereotipada e violenta (veja isso e isso).

Na matéria de Introdução à Computação, estamos desenvolvendo uma pesquisa relacionada à evolução da Computação e decidi estudar mais sobre a participação das mulheres no desenvolvimento dessa ciência. Assim que o trabalho estiver pronto, posto aqui (também faremos um vídeo e acho que vocês vão curtir).

Nathan Ensmenger (2010) fala que historiadores da computação só começaram a reconhecer a contribuição crucial das mulheres para a área no começo dos anos 90. Isso justifica o pouco material publicado sobre o assunto. Estou aprendendo coisas muito legais e daqui a pouco compartilho com vocês.

Para terminar, essa foto de uma matéria da Cosmopolitan, de 1967. que espero servir de inspiração para vocês <3

Computer Girls

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?

Dicas para ser um(a) bom(a) estudante de Computação

good
Como tudo na vida, sem esforço e dedicação não há muitos frutos, certo? Em Computação isso é um pouquinho mais rigoroso (e mais divertido). A seguir listei algumas dicas de como se tornar uma boa estudante/bom estudante. Reuni essas dicas a partir de conversas com amigos da área e procurando outros posts por aí. Preparados?!

Aprenda inglês

Se já sabe, procure por certificações.

Tenha uma rotina de estudos

É importante que seja a que você se sente melhor, sem neuras. Tenha um compromisso com seus estudos, assim como você tem com as outras coisas da sua vida. Procure sempre dar o melhor de si, mas sem exigir perfeição.

Não tenha medo de errar

Nunca.

Seja curiosa(o)

Precisa falar mais alguma coisa sobre esse tópico?

Seja autodidata

Isso não tem nada a ver com nunca pedir ajuda, mas ter a autonomia de buscar soluções por si mesma é primordial. Cá entre nós, essa é a parte mais legal de ser cientista! 🙂


Sempre busque por excelência

Procure coisas que vão te desafiar. Ande com quem você admira, treine sempre e tenha sempre foco. Parece bobeira, mas se você aplicar isso no seu dia a dia, fará toda a diferença.

Um passo de cada vez

Para quem está começando, ao olhar a grade curricular, parece que vai ser um caminho infinito. Dando um passo de cada vez, mas um passo bem sólido e fundamentado, a realização dos seus objetivos serão consequência de tudo isso.

Peça ajuda e ajude os outros

Se você, como eu, não é nenhum gênio (ou pelo menos não descobrimos ainda xD), frequentemente você vai ter dúvidas. Computação é algo totalmente novo para seu modo de pensar, por isso vai ser recorrente a sensação de estar perdida. Peça ajuda, tire dúvidas, confie em si mesma e siga em frente.

Lembre-se de porquê você começou

Quando se sentir desmotivada, lembre-se de porque começou (ou veja fotos do Pusheen e outros gatinhos xD). Tenha uma lista de coisas para fazer quando precisar se animar: frases, vídeos, fotos, etc., qualquer coisa que te inspire. É importante ouvir nosso corpo e descansar também.

Tenha paciência e acredite em você

E você, quais dicas teria para acrescentar?