Elmord's Magic Valley

Software, lingüística e rock'n'roll. Sometimes in English.

(finish-output mestrado)

2018-01-30 22:27 -0200. Tags: life, academia, mestrado

Gandalf: "Excellent work, Frodo. You defeated Sauron and now... hm! Now everyone can have happy lives forever. Thanks to you."

Frodo: "I know. I just wish... I could forget."

The Lord Of The Rings (1944)flyingmoose.org

Leitouros e leitouras,

Pous que o infindável mestrado findou-se. Ainda falta a homologação da secretaria e da comissão da pós (e é por isso que é um finish-output e não um close), mas, tendo recebido o joinha da banca, orientadores e biblioteca, creio que só o que me resta agora é começar a rodar o garbage collector mental para desentupir o cérebro, e fazer a dança da vitória.

A monografia, para quem (insanamente) quiser ver, está aqui.

11 comentários

Some things I know about Clang and LLVM, part 1

2016-06-17 04:10 -0300. Tags: comp, prog, llvm, mestrado, in-english

In this post I'm going to talk about a few things about Clang and LLVM which I learned during my Master's and which might be useful to people new to Clang/LLVM.

The LLVM Project

According to its website, "The LLVM Project is a collection of modular and reusable compiler and toolchain technologies." The LLVM Project encompasses a number of sub-projects, the main ones being LLVM and Clang. Basically, LLVM is an infrastructure for code compilation, analysis and transformation. LLVM originally stood for "Low Level Virtual Machine", but it is not really a virtual machine, so nowadays "LLVM" is not considered an acronym anymore, it's just the name of the project. Clang (which is pronounced "clang", by the way, not "C-lang") is a C/C++/Objective C compiler which uses LLVM for code generation. The great things about Clang and LLVM are:

  1. Unlike traditional compilers, they are designed as reusable components. You can use Clang and LLVM components as libraries to write your own program analysis/transformation tools, for instance, or you might extend Clang and LLVM with new passes/plugins, or use LLVM as a backend to generate machine code for your compiler. People have implemented JIT compilers (such as this) using LLVM as a basis for code generation, for example.
  2. LLVM is designed around a well-defined intermediate language, called LLVM IR (Intermediate Representation), which is sort of an assembly-like language for an abstract machine. All code transformations at the LLVM level (apart from machine code generation) are implemented as transformations taking an LLVM IR program as input and producing a modified LLVM IR program as output. This makes it easier to add new passes, use them individually, combine them, inspect what each pass does, etc. LLVM IR has a textual representation (which you can print out or feed as input to LLVM), a bitcode representation which is more space-efficient, and an in-memory data structure representation (which is what the LLVM tools use internally).

Nowadays LLVM is quite popular as a compiler backend for various languages, such as Rust. The great thing about targeting LLVM for code generation is that it implements a large number of code optimizations. In fact, when Clang compiles a C/C++/ObjC program, it emits very naive, unoptimized code – most optimizations happen at the LLVM level. Because of this, any compiler targeting LLVM is able to use those same optimizations without having to do anything in particular (other than emitting code which LLVM is able to optimize – LLVM can't do magic, after all).

An example of a weirder project using Clang/LLVM is Emscripten, which implements an LLVM backend, the part which translates LLVM IR to machine code – except in this case the machine code is JavaScript.

Documentation, caveat, and scope of this post

The LLVM Project website has plenty of documentation (for suitable values of "plenty"), for LLVM and Clang. You should consult those for reference. The mailing lists (there are separate ones for the various projects) also have plenty of useful information (although I usually end up there by searching stuff on Google StartPage rather than going directly to the mailing list). As far as I can tell, people are quite helpful if you ask questions there (but I have never personally asked anything).

It's probably a good moment to warn that LLVM and Clang development moves quite fast, so it's probable some (or most) things in this post will be out of date sooner or later. So, when in doubt, consult the documentation. I will not attempt to duplicate the information in the documentation here, but rather will try to provide an overview of things I had to learn and some gotchas I found during the process. As of now, the current stable version of LLVM is 3.8, although I used initially 3.6 and later 3.7 for most of my Master's (which were the most current stable versions at the times).

Compiling LLVM and Clang

If you want to compile LLVM and Clang from source, you can find information in Getting Started with the LLVM System, Building LLVM with CMake, and Clang – Getting Started.

The main gotchas I found in the process were:

If you just want to use the LLVM/Clang infrastructure, rather than modifying it, you may not need to compile it from source; you can install your distribution's development packages for LLVM and Clang instead (e.g., llvm-3.7-dev and libclang-3.7-dev on Debian). Then you can compile your pass/plugin/whatever against those.

Interfacing with Clang/LLVM

As far as I can tell, the primary interface with LLVM is the C++ API. There are C bindings to it too, but I don't know how common it is to use them. Besides C, there are bindings for OCaml, Python and Go, as well as third-party ones for Haskell, Rust, and maybe others. I can't attest to their stability or completeness (I remember trying to compile the OCaml bindings and failing miserably, but I didn't really try hard enough).

For Clang, there is a number of interfaces, the most stable of which (as in "the one that changes the least across Clang versions") is the C LibClang. There is also the Plugin interface and LibTooling, both of which are based on C++ and provide finer-grained control over the generated AST.

LLVM IR as an interface

If you want to use LLVM from a language for which there are no bindings (and you don't want to write the bindings yourself), an alternative is to communicate with LLVM by parsing and emitting LLVM IR directly, rather than using LLVM's APIs. This is what I did for my Master's software, which I wrote in Scheme. If you intend to take LLVM IR code as input (e.g., for writing a code analysis/transformation), you will have to write an LLVM IR parser, which is somewhat annoying (LLVM IR syntax could be quite a bit more regular, if you ask me), but is not particularly hard. If you don't need to read LLVM IR code, but only emit it (for example, if you are using LLVM as a backend for a compiler), then you don't need a parser, you just need to be able to print valid LLVM IR code. The drawback of this approach rather than using a binding is that you will have an extra overhead from converting your data structures to textual LLVM IR, and then feeding it to LLVM (typically invoked as a separate program (usually the opt tool)), which will then reconstruct it as the in-memory LLVM IR representation, rather than generating the in-memory representation directly and running the LLVM routines as library calls in the same process. On the other hand, that's exactly what a traditional compiler (such as GCC) does when calling the assembler, which takes textual assembly code as input (usually piped into it), so it's not like you're necessarily going to have an unacceptable overhead from this.

If you are writing an LLVM IR transformation in this way, and you want to run it as if it were a pass during compilation of a C/C++ program, you'll have to do some tricks. If you want to run your transformation after all other LLVM IR passes, then your life is simple: you can run clang -S -emit-llvm -o - (your normal arguments) to tell Clang to generate "assembly" code rather than an executable (-S), to emit LLVM IR rather than assembly, to output to stdout rather than a file (-o -), and use your normal compilation flags and arguments. Then you can pipe the LLVM IR output into your program (or make your program call clang and read its output via a pipe), transform it as you wish, and then pipe the result back into Clang with clang -x ir - (more arguments) to finish compilation, where -x ir - tells Clang to read code in LLVM IR language from stdin, and (more arguments) will typically include -o executable-name.

If you need to take the output from Clang before any optimization passes are run, things are slightly more tricky. Even if you run Clang with -O0 some LLVM passes may still run. Worse, if you do that, Clang will not include within the LLVM IR code information needed by the optimization passes, such as type information used by type-based alias analysis (TBAA), which means that if you try to do something like clang -O0 ... | your-pass | clang -O3 ..., the result won't be as optimized as if you had directly run clang -O3 on the source, because clang -O0 will lose information which is needed by some of the optimizations performed by clang -O3. The solution is:

clang -S -emit-llvm -Xclang -disable-llvm-optzns -o - -O3 (your normal arguments)

This will make sure Clang includes all information required by optimizations, but stops Clang from invoking the optimizations themselves. Then you can feed this into clang -x ir - -O3 later and optimizations will work properly. (-Xname option passes the option to the compilation subprocess name. Note also that -x ir will apply to all inputs specified afterwards in the command line, not just the -; if you need to pass, say, an extra C file to be combined with the result of your transformation, then you have to specify -x c filename.)

As far as I know, there is no way to simply intercalate a new external pass (i.e., one implemented as an external program) into the process, like "I just want to run:

clang -O3 -lsomelibrary -o hello hello.c

but with this new pass intercalated"; if you want your "compiler+pass" to accept the same arguments as the standard compiler, you'll have to write a routine or script to do some juggling of the arguments passed to each call to the compiler, to get something like:

clang -S -emit-llvm -Xclang -disable-llvm-optzns -o - -O3 hello.c |
     your-pass |
     clang -x ir - -O3 -l somelibrary -o hello

This is another drawback of using an external program and communicating purely via the IR, rather than writing a real LLVM IR pass (which I guess you could intercalate with some -Xclang option or something, I don't really know).

If you need to run specific LLVM passes on an LLVM IR program, you can use the opt tool. For example, if you want to run the reg2mem pass, you can add opt -S -reg2mem in the pipeline. You can run opt -help for a list of available passes. (-S tells opt to emit textual LLVM IR, rather than bitcode.)

End of Transmission

That's it for today. In the next post, I intend to talk a bit about the LLVM IR language itself.

4 comentários

Modelos LaTeX do INF/UFRGS

2014-10-22 17:06 -0200. Tags: latex, academia, mestrado

Update (23/03/2015): Utilize a versão mais atual do pacote iiufrgs.

Update (26/06/2015): Eis um tutorial de como usar o pacote iiufrgs.

(Os modelos que eu disponibilizava aqui are no more.)

3 comentários

State of the life

2014-10-17 01:37 -0300. Tags: life, mind, academia, mestrado, home

As pessoas gostam de dizer que o tempo passa rápido. Eu nunca concordei com essa afirmação; para mim, um ano sempre levou um ano inteiro para passar. Mas esse ano em particular está se puxando em termos de neverendingness. Para futuras consultas, e para quem tiver interesse, deixo aqui um registro simplificado dos fatos.

Em janeiro deste ano, meu pai se mudou para um apartamento em Porto Alegre, e eu, que até então morava em uma casa alugada de solidez questionável, me mudei para a recém desocupada casa. Após uma série de acidentes vivenciosos, cuja enarração está fora do escopo deste livro, encontrei-me por volta de julho dividindo a casa com meu pai e minha irmã, compartilhando com esta última um quarto de 2×2,5m, e tendo que cuidar da mesma no período da tarde. Uma vez que essa obrigação conflitava com a necessidade de comparecer à UFRGS para a bolsa do mestrado e a essas alturas eu já estava perdendo as estribeiras, em uma última tentativa de salvar um pouco da minha sanidade mental, falei com meus orientadores sobre a possibilidade de trancar a matrícula. No fim das contas, ficou combinado que eu poderia continuar realizando as atividades do mestrado remotamente (já terminei todos os créditos necessários (que a partir deste ano são 12, e não 24), e agora só me restam o Trabalho Individual e a dissertação e atividades relacionadas), eu fiquei mui faceiro, e ficou por isso mesmo.

Evidentemente, isso não foi nada produtivo, dada a falta de sossego e de coisas como uma mesa decente e isolamento e o fato de eu passar constantemente estressado ou cansado ou deprimido. Nesse meio tempo eu descobri que é possível comprar casas super-barato nas verdejantes terras de Viamãoheimr se o camarada não se preocupar com trivialidades como escritura e terreno em área verde, e comecei a catar locais para me mudar para no ano que vem. Depois de umas três ou quatro visitas a locais de solidez ainda mais questionável do que a anteriormente citada casa e em localizações pra lá de interessantes, eu larguei de mão essa idéia e decidi esperar até o fim do ano (quando eu me livro da obrigação de cuidar da criança) para alugar uma casa e me mudar.

No dia 15 de setembro, quando eu estava considerando trancar a matrícula pela (n+1)-ésima vez, eu me dei conta de que se eu alugasse uma casa suficientemente perto eu não precisaria esperar até o fim do ano para me mudar; eu podia me mudar agora e só ir para a outra casa à tarde. Até então eu estava tão fixado na idéia de comprar uma casa que isso nem me passou pela cabeça. Catei casa para alugar nas redondezas e encontrei uma elegante peça de 3×5m mais um banheiro para alugar por meia pataca. A saga para conseguir alugar esse bendito imóvel é uma história à parte que eu hei de postar em algum momento para a elucidação de todos os seres sencientes. Suffice it to say que sexta-feira da semana passada eu consegui me mudar para o lugar, e que turns out que 15m² são um tamanho bem razoável se bem utilizado e quando não se tem que dividi-lo com ninguém.

A situação está um pouco melhor desde que eu me mudei para cá. Por outro lado, até o fim do ano eu continuo tendo que brincar de babá às tardes e em outros momentos de interesse, entre outros eventos que me levam a questionar se o conceito de respeito pelo tempo dos outros existe na cabeça da população em geral ou se é alguma flutuação da minha imaginação, mas eu vou levando, pois é só até o fim do ano, e depois disso eu espero me sentir mais confortável em dizer não diante de proposições equiparáveis.

Quanto ao mestrado, by now I'm pretty sure de que eu não quero seguir a carreira acadêmica e viver de publicar papers. Aparentemente é possível ganhar uns bons trocos dando aula em instituições privadas de ensino superior sem ter que fazer pesquisa, e por enquanto este é o meu plano para depois que eu terminar o mestrado. (Para a minha definição de "uns bons trocos", pelo menos. Certamente não tanto quanto um professor titular de universidade federal, mas a carga horária é menor também. Eu não tenho a necessidade de ganhar rios de dinheiro e, contanto que eu ganhe o suficiente para levar uma vida decente e guardar uns trocados, eu prefiro ter mais tempo do que mais dinheiro. Eu me sinto um pouco desconfortável dizendo isso para as pessoas, porque é basicamente uma admissão de vadiagem, mas should it matter, se eu estiver me mantendo com meu próprio dinheiro sem pedir nada para ninguém? Enfim.) Eu tenho tido dificuldade em me motivar a fazer as atividades do mestrado, mas eu tenho levado, e o prognóstico de terminar isso tudo e deixar para trás é bastante animador.

By the way, lembram quando eu manifestei minha descrença pela idéia de que as aulas do mestrado "não são mais do mesmo"? Hell was I right. As predicted, as aulas são much the same thing (pelo menos as que eu tive). A melhor cadeira que eu fiz no semestre foi Programação Funcional Avançada, que nem era do mestrado (foi a cadeira que eu escolhi para realizar a Atividade Didática). Algoritmos e Teoria da Computação foi bacaninha também (em particular a parte de Teoria da Computação), mas nada muito diferente de uma cadeira da graduação. De resto, o semestre foi tolerável primariamente graças aos pães do Hélio. Also as predicted, a variedade de cadeiras (ou falta de) também limita as possibilidades de pegar apenas cadeiras em tópicos de interesse; aliás, os horários das cadeiras do mestrado são um tanto quanto mal-distribuídos (não há praticamente nenhuma cadeira às 8h30, por exemplo), o que aumenta a possibilidade de conflitos de horários entre cadeiras (semestre passado eu tive que escolher entre uma cadeira de programação paralela e uma de tendências em engenharia de software por conta do conflito de horários, por exemplo); soma-se a esse problema o fato de que a maioria das cadeiras é oferecida em apenas um dos semestres do ano, e que recomenda-se fortemente aos alunos cursarem todas as disciplinas no primeiro ano do mestrado. On the bright side, esse ano o PPGC resolveu reduzir o número de créditos obrigatórios do mestrado para 12, o que permite realizá-los todos no primeiro semestre.

Also on the bright side, eu consegui (depois de muitas conturbações, primariamente na minha cabeça) escolher um tema de dissertação em um assunto que me interessa. Vai dar um baita trabalho para implementar, mas pelo menos eu vou aprender coisas pessoalmente úteis para mim no processo.

Do futuro, falamos depois.

6 comentários

A madman and a scholar

2014-07-06 20:41 -0300. Tags: life, mind, academia, mestrado, ramble

Recentemente, conversando com algumas pessoas sobre o mestrado, eu disse, with varying wording, que eu ando meio pirado. Não era figura de linguagem: I meant every word of it. Se eu ainda não perdi totalmente as estribeiras, eu provavelmente devo isso primariamente à Julie Fowlis; eu ainda sou capaz de pôr ela (e a Mari Boine) nos agradecimentos da dissertação.

Semana passada eu tive uma prova, na qual eu sabia não ter ido muito bem. Quinta-feira à noite as notas foram divulgadas por e-mail, e a professora (doravante Professora I) informou que as provas ficariam na secretaria da pós-graduação para quem quisesse pegar, e que só estaria de volta à universidade na segunda. A minha nota estava tão vergonhosa que eu não estava nem a fim de ir pegar a prova. Na sexta, a outra professora da disciplina (doravante Professora II) divulgou os conceitos da disciplina; eu estava de recuperação. Apesar de estar chateado e todo perturbado das idéias, eu resolvi ir pegar a prova na secretaria e dar uma olhada, just to make sure. Turns out que a Professora I somou errado as notas das questões e me deu 2.5 ao invés de 25 em uma questão que valia 25. Se a nota tivesse sido calculada corretamente, eu não teria ficado de recuperação.

Mandei um e-mail para a Professora I sexta ao meio-dia, com um scan da prova. Não recebi resposta até o momento.

Nos últimos dois dias, eu tive três sonhos. (Isso dá uma idéia de quão regulares andam meus padrões de sono ultimamente.) No primeiro, eu estava discutindo loucamente com a Professora I tentando convencê-la sem sucesso de que a nota tinha sido calculada errada. No segundo, eu estava discutindo louca e veementemente com outro professor que queria me rodar por FF a qualquer custo por eu ter faltado a um dia de apresentações. O terceiro foi uma variação de um sonho recorrente, embora infreqüente, em que eu descubro no final do curso que eu não assisti a nenhuma aula da cadeira de Álgebra Linear (da graduação) ou alguma outra coisa math-related e vou ter que refazer a cadeira. Dessa vez o sonho foi mais elaborado e eu tinha mais alguma coisa para fazer depois de apresentar o TCC, mas a essas alturas eu já não lembro mais dos detalhes concretos.

Eu estou meio que urgentemente precisando de umas férias, que eu não terei porque (1) um certo professor, por conta das aulas perdidas por conta da copa (o semestre já não tinha começado mais cedo para compensar isso?), viagens no meio do semestre, aulas canceladas por motivos pessoais e ausência generalizada de cronograma, vai dar aula até além do fim do semestre (pode isso? claro que não; faz diferença? claro que não); (2) bolsista não tem férias. Segundo o pessimamente mal-escrito regulamento do PPGC, o bolsista tem direito a um mês de férias (por ano? na vida? assumindo um mês por ano, dá para emendar o mês de férias de 2014 e o de 2015? por que escrever direito se podemos deixar ambíguo e interpretar como quisermos depois?), mas elas têm que ser combinadas com antecedência com o orientador, e o caso é difícil de defender, porque eu nem fiz grande coisa como bolsista so far. Em qualquer caso, não vale a pena pedir férias agora por conta da cadeira mencionada.

Faz algum tempo que me admira o fato de que essencialmente o mesmo cérebro que servia ao cidadão cavernícola de vinte mil anos atrás também é capaz de absorver e ser bombardeado por quilos e quilos de informação com variáveis graus de abstração numa proporção supostamente muito maior hoje em dia do que então. Hoje isso me levou a duas reflexões: (1) De um lado, uma apreciação do fato de que a vida intelectual do cidadão cavernícola talvez não fosse tão simples assim; aliás, deixo-vos a conjectura (sem qualquer argumento, qualificação ou conhecimento para fazê-la) de que viver naquela época era tão difícil que, tendo-nos livrado de parte dessa complexidade graças a avanços tecnológicos (agricultura e etc.), quilos de poder de processamento foram liberados para as atividades intelectuais mais "elevadas" que realizamos hoje. (2) De outro lado, óbvio que isso ia dar merda, e é por isso que tem tanta gente pirada pelo mundo.

Por que eu estou falando disso? Porque nos últimos tempos eu ando meio overwhelmed com idéias e coisas que seriam interessantes de desenvolver e coisas que eu gostaria de ler e coisas que eu não gostaria tanto assim de ler mas que eu preciso ler para o mestrado e trabalhos para fazer, e eu estou em um ponto em que eu já não foco direito em coisa nenhuma; uma hora estou lendo um paper sobre dependent types, aí não termino de ler e estou lendo fragmentos arbitrários da documentação do Chicken Scheme, aí depois estou lendo sobre phase separation em Lisps, e aí estou escrevendo um leitor de S-expressions em C. (Isso foi um resumo do meu dia de ontem-anteontem (dado meus anteriormente mencionados padrões de sono, eu já não sei quando começou um dia e terminou outro).) Eu quero criar uma linguagem de programação e uma conlang e um sistema de escrita e uma máquina virtual e pensar sobre o problema da minha dissertação e eu não consigo me concentrar em nenhuma dessas coisas por qualquer quantidade decente de tempo nem parar de pensar nelas. Talvez eu estivesse precisando ficar uns dias sem olhar para um computador ou para quaisquer coisas acadêmicas e curtir a vida de outras formas. Não me ocorre nenhuma possibilidade de outras formas, entretanto, e eu me pergunto se eu estou fazendo alguma coisa muito errada com a minha vida. Adicione-se a isso uma prova para a qual enquanto eu estudava e lia os exercícios e as respostas no livro eu me perguntava: "Como é que eu ia pensar nisso? Será que eu sou incompetente? E tu ainda pretende fazer o doutorado?" Adicione-se a isso mil outros problemas que estão fora do escopo do discutível neste blog.

Querida Professora I: Responda o bendito e-mail. Boa noite.

7 comentários

Esse tal de mestrado

2014-02-12 02:08 -0200. Tags: academia, mestrado

Eu pretendia quebrar os últimos três meses de ausência com um post sobre a vida, o universo e todas as coisas, mas esse post não está com cara de sair tão cedo. Ao invés disso, apresento-vos um post de utilidade pública sobre como funciona a inscrição e a matrícula no mestrado no Programa de Pós-Graduação em Computação (PPGC) do Instituto de Informática da UFRGS. Alguns aspectos do processo são um tanto quanto obscuros/mal-documentados, e eu mesmo estou descobrindo aos poucos como as coisas funcionam. Minha idéia inicial era esperar até eu ter "todas" as informações relevantes para escrever; porém, até lá eu provavelmente já vou ter esquecido de metade delas (e, more importantly, das dúvidas que eu tive no processo), então vou começar a escrever com o que eu sei. Correções e coisas que eu descobrir posteriormente serão adicionadas a este post ou publicadas em outros posts com a tag mestrado. (Sim, todas as outras tags do blog são em inglês, mas não estou nem aí. Tal é a minha maldade.)

DISCLAIMER: Este texto baseia-se na minha experiência ao ingressar no mestrado em 2014/1. As regras e procedimentos descritos podem mudar em anos subseqüentes. As competências redatoriais do autor são questionáveis. Use por sua conta e risco. Dito isso, espero que estas informações lhe possam ser úteis.


O primeiro passo para o ingresso no mestrado é a realização do POSCOMP, uma espécie de vestibular da pós-graduação em computação usado por diversas universidades do país. O POSCOMP consiste de 70 questões objetivas (20 de Matemática, 30 de Fundamentos de Computação, e 20 de Tecnologias de Computação).

As inscrições para o POSCOMP ocorrem por volta de julho, e a prova é aplicada por volta de setembro. A matrícula para o mestrado abre depois da realização do POSCOMP. Cada instituição decide como vai usar o resultado do POSCOMP. No caso do PPGC/UFRGS, exige-se que o candidato ao mestrado tenha realizado o POSCOMP no ano da inscrição ou no ano anterior, e que tenha obtido uma pontuação superior à média nacional (que em 2013 foi 30,7). A pontuação do POSCOMP é um dos critérios utilizados na seleção dos candidatos. Além disso, as bolsas de mestrado são dadas aos candidatos com maior pontuação. (Em 2013, foram selecionados 61 candidatos, dos quais 30 receberam bolsa.)

Se você não tiver feito o POSCOMP e não quiser esperar até o ano seguinte para entrar, o que você pode fazer é se inscrever como Aluno Especial no PPGC e ir cursando algumas das cadeiras enquanto não faz o POSCOMP. Tendo feito o POSCOMP, você pode se inscrever para o mestrado e pedir reaproveitamento das cadeiras já cursadas. Alunos Especiais não recebem bolsa, todavia.

Provas anteriores

As provas anteriores e gabaritos estão disponíveis no site da SBC e do COPS/UEL (que tem sido responsável pela aplicação das provas nos últimos anos). As provas e gabaritos de 2012 e 2013 encontram-se exclusivamente no site da UEL. As provas de 2010 e 2011 encontram-se em ambos os sites. As provas de 2002 a 2009 encontram-se apenas no site da SBC.

As provas de 2011, 2012 e 2013 já vêm com as respostas marcadas em vermelho, o que atrapalha o estudo. A solução que eu encontrei foi converter as páginas dos PDF em imagens e extrair apenas o canal azul (que tem intensidade 100% no fundo branco da folha e 0% no resto; o verde também serviria), usando o ImageMagick (pacote imagemagick no Debian/Ubuntu):

for ((i=1; ; i++)); do
    convert -density 150 "blablabla.pdf[$i]" -colorspace RGB -channel B \
            -separate -quality 80 prova-%02d.jpg || break

(Teoricamente, dá para especificar um intervalo de páginas para o ImageMagick, mas, pelo menos na minha máquina, ele come quilos de memória e leva um horror de tempo quando eu faço isso.) As outras provas possuem uma versão sem respostas. (As de 2009 para trás só possuem a versão sem resposta, com o gabarito separado.)

CUIDADO: há os gabaritos provisórios (divulgados logo depois das provas) e os definitivos (corrigidos depois de os alunos terem entrado com recurso). Todo ano cerca de duas a quatro questões acabam sendo corrigidas ou anuladas. Certifique-se de estar usando um gabarito definitivo quando estiver estudando.

Inscrição no PPGC

As inscrições para o mestrado no PPGC são feitas pelo site do PPGC. O edital contém um bocado de informação sobre a inscrição. Aqui listo alguns pontos que me parecem dignos de observação.

Ao inscrever-se, você pode escolher até três linhas de pesquisa de seu interesse, em ordem de prioridade. A cada linha estão associados um ou mais professores. Você pode escolher os orientadores de sua preferência, em ordem de prioridade, ou escolher "Qualquer orientador" na linha de pesquisa. Para descobrir o que faz cada professor, você pode consultar suas informações na página do PPGC, suas páginas pessoais (normalmente linkadas na página do PPGC), a pesquisa de currículos da plataforma Lattes, e seu mecanismo de busca favorito. Tendo se informado sobre um professor, você pode mandar e-mail para o mesmo para trocar uma idéia. Esse processo de catar professores em áreas de interesse e entrar em contato com os mesmos pode ser um tanto quanto demorado, então não deixe para a última hora.

O PPGC tem um bocado de professores (por volta de 60), então mesmo que sua área de interesse não se encaixe direito em nenhuma das linhas de pesquisa "oficiais" do PPGC, é bem provável que haja algum professor que trabalhe com algo próximo ao seu interesse. Assim, é uma boa idéia pesquisar e entrar em contato com os professores antes de concluir a inscrição.

Na inscrição, será exigido um comprovante de que você concluiu ou está em vias de concluir a graduação. No caso exclusivo de alunos da UFRGS, um comprovante de matrícula demonstrando que você está inscrito no trabalho de graduação é suficiente. Na inscrição, também é pedido um bocado de informações sobre o seu curso de graduação que em teoria podem ser obtidos na página do MEC. O formulário de inscrição é bastante ambíguo quanto às informações requisitadas, e eu não tenho muito o que lhe dizer a esse respeito. No caso exclusivo de alunos da UFRGS, você só precisa adicionar o curso de graduação, mas pode deixar os dados do MEC em branco. DISCLAIMER: esse procedimento não está descrito em lugar nenhum; eu descobri indo perguntar na secretaria do PPGC. Sendo assim, nada garante que o procedimento continuará válido nos anos seguintes, então é fortemente recomendado entrar em contato com o PPGC para perguntar como proceder.

A inscrição recomenda que você tenha um currículo na plataforma Lattes. Adicionar todas as informações no currículo é um processo que pode ser bastante tedioso/demorado, então é recomendável fazer isso o quanto antes (você pode fazer isso a qualquer momento, ao invés de esperar o período de inscrições, por exemplo).

Encerrado o período de inscrições, dá-se o processo seletivo. Se você escolheu mais de uma área ou mais de um orientador, em princípio a ordem em que você os escolheu será respeitada. (Os professores têm um número limite de alunos que podem orientar, então pode ser que sua primeira opção não seja atendida por falta de vagas.) Pode ocorrer de professores entrarem em contato com você para discutir outras possibilidades. Se você optar por um orientador diferente daquele que lhe seria atribuído segundo a ordem das suas escolhas, você terá que conversar com este para resolver a questão. NÃO deixe para fazer essa negociação de última hora, achando que tem até o final do processo seletivo para decidir. Embora isso não esteja escrito em lugar nenhum, o processo seletivo (mesmo antes da primeira chamada de divulgação de selecionados) é dividido em duas partes: inicialmente os selecionados são atribuídos aos orientadores de sua preferência, segundo suas escolhas na inscrição e eventuais negociações; depois dessa seleção, há um período de "repescagem", em que os candidatos que sobraram podem ser atribuídos a outros orientadores, mas em que as escolhas feitas na inscrição não têm mais a mesma prioridade. As negociações devem idealmente ser feitas antes desse segundo período.

[História da minha vida: escolhi um professor A na área X como primeira opção, e a área Y como segunda opção. Minha primeira escolha foi atendida. Porém, no dia 26/11, um professor B da área Y me mandou um e-mail perguntando se eu tinha interesse em trabalhar com ele e quando eu tinha disponibilidade para conversar. Como eu estava ocupado com o TCC e a data da primeira chamada que constava no calendário do PPGC era 13/12, deixei para conversar com o professor B apenas no dia 03/12. Turns out que a primeira etapa da seleção ocorreria no dia 05/12, i.e., eu só teria mais um ou dois dias para resolver o assunto. Eu tive sorte de conseguir conversar com os professores e outros alunos do PPGC nesse período e conseguir me decidir em tempo, mas foi uma situação bastante corrida e bastante estressante. Moral da história: não deixe para a última hora. The calendar is a lie.]

Se você for selecionado, alguns dias após a chamada você receberá um e-mail solicitando a confirmação de interesse no curso. Você deve seguir o procedimento descrito no e-mail; caso contrário, considera-se que você desistiu da vaga.


Uma vez selecionado, você deverá fazer sua primeira matrícula, que ocorre por volta de fevereiro. A matrícula é feita pelo Portal do Aluno da UFRGS. As instruções de acesso lhe serão enviadas por e-mail pelo PPGC.

O mestrado consiste de 24 créditos. O tempo recomendado de realização do mestrado é de dois anos; o PPGC recomenda que os 24 créditos sejam obtidos no primeiro ano, deixando o segundo apenas para a realização da dissertação de mestrado. A disciplina/atividade "CMP401 - Trabalho Individual I" é obrigatória e confere 2 créditos. A disciplina/atividade "CMP410 - Atividade Didática I" é obrigatória para os alunos bolsistas e confere 1 crédito.

[Update (10/09/2016): O número de créditos do mestrado mudou para 12. O Trabalho Individual não é mais obrigatório. A Atividade Didática continua sendo obrigatória para alunos bolsistas. Isso serve como um lembrete de que o regulamento muda ocasionalmente, então é importante dar uma conferida no regulamento atual.]

Ao entrar no mestrado, você deve montar um Plano de Curso, que especifica que cadeiras você pretende fazer ao longo do curso e em que semestres pretende cursá-las. A maioria das disciplinas são oferecidas apenas no primeiro ou apenas no segundo semestre. A lista de disciplinas oferecidas pode ser encontrada no site do PPGC. O plano pode ser adaptado no futuro, no caso de haver alterações nas disciplinas disponibilizadas nos semestres futuros, ou no caso de as disciplinas que você escolheu conflitarem em horários, por exemplo.

A página da matrícula (que é comum a toda a UFRGS) é separada da página onde se submete o plano de curso (que é específica do PPGC, e é a mesma página onde você fez a inscrição para o mestrado). Na matrícula você seleciona apenas as cadeiras que pretende cursar no semestre corrente, enquanto no plano de curso você seleciona todas as cadeiras que pretende cursar no curso. Cabe a você fazer a matrícula consistente com o plano. Freqüentemente, a súmula do site do PPGC é menos detalhada do que a do site da matrícula. A vida tem dessas coisas.

Tanto a matrícula quanto o plano do curso devem ser aprovados pelo orientador para serem aceitos. Assim, convém falar com o mesmo antes de fazê-los.


A bolsa de mestrado atualmente é de R$ 1500 por mês. Ela é oferecida apenas aos alunos que cursarem o mestrado com dedicação exclusiva (i.e., não estiverem realizando outra atividade remunerada em paralelo). As bolsas, teoricamente em número limitado, são distribuídas pela ordem de colocação dos candidatos no POSCOMP. A partir de que mês a bolsa é paga e o processo burocrático para recebê-la são coisas que eu descreverei aqui assim que obtiver essas informações.


Não existe entrevista na seleção para o mestrado. A entrevista existe para o doutorado (acho).

Você tem que escolher uma linha de pesquisa e um orientador na inscrição, mas não precisa ter um tema de mestrado definido já no começo.

Depois de inscrito no mestrado, você deve realizar um exame de proficiência (de leitura?) em língua estrangeira (a qual é necessariamente inglês), mas eu ainda não sei como isso funciona.

Se você acha que alguma outra informação deveria ser inclusa aqui, deixe um comentário.

9 comentários

Main menu

Posts recentes

Comentários recentes


comp (114) prog (51) life (44) unix (32) random (27) lang (27) about (24) mind (22) mundane (21) pldesign (20) in-english (19) lisp (17) web (17) ramble (15) img (13) rant (12) privacy (10) scheme (8) freedom (8) lash (7) music (7) esperanto (7) bash (7) academia (7) home (6) mestrado (6) shell (6) conlang (5) copyright (5) misc (5) worldly (4) book (4) php (4) latex (4) editor (4) politics (4) etymology (3) wrong (3) android (3) film (3) tour-de-scheme (3) kbd (3) c (3) security (3) emacs (3) network (3) poem (2) cook (2) physics (2) comic (2) llvm (2) treta (2) lows (2) audio (1) wm (1) philosophy (1) kindle (1) pointless (1) perl (1)


Quod vide

Copyright © 2010-2018 Vítor De Araújo
O conteúdo deste blog, a menos que de outra forma especificado, pode ser utilizado segundo os termos da licença Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International.

Powered by Blognir.