Journalog #3: eudyptula – challenge #1

This is not really a challenge; I’ve done it before. Anyways, now I have the insight about what’s happening behind-the-scenes, and also it’s very easy to recreate the environment and obtain the tools I need to do it.

The first challenge is very simple, as rephrased in my own words:

Write a hello world linux kernel module for your current kernel (supposedly 2.6+), which writes “Hello World!” to your kernel debug log level, upon its initialization.

Tools and programs you’ll need: vim, make, insmod, lsmod, rmmod. And, later on, mutt or sendmail or similar to send your work to little.

Overview

It’s better to start with the Makefile. Add at least two targets to it: all and clean. Refactoring variables (for example, paths) is also nice, if you see yourself repeating the same strings in both targets.

Later, you will create a hello.c file which should be very simple in nature. It should have two functions, one for initialization and one for cleanup for the time the module is unloaded. It will probably also have a couple of standard macros for modules.

Testing your work should also be very straightforward: (i) make, (ii) insmod hello.ko, (iii) rmmod hello. And see your log messages with dmesg | tail.

After everything is done, you can use mutt to send your sources to little, either interactively (hint: use ‘a’ to add attachments) or with a single command:

mutt -s "<id> challenge 1" -a hello.c -a Makefile [email protected] < <message>

where <message> is a file corresponding to the body or your email.

 

Lua: a linguagem de script ideal

Outro dia eu assisti a palestra do Andy Wingo sobre Guile Scheme e em um dos slides, uma definição é utilizada para provocar o espectador, “a sloppy language with a slow implementation”. Acho uma forma interessante de começar o texto, pois nesse texto eu vou apresentar o porquê de eu achar lua a linguagem de script ideal.

Aqui, uso o termo script como uma linguagem cujo objetivo é complementar a linguagem principal do seu projeto. Motivos para usar uma linguagem de script seriam uma carga mental necessária menor para manter partes não críticas do projeto.

Simplicidade é importante. Eu estive trabalhando em 3 projetos de problemas/domínios diferentes escritos em soluções/linguagens diferentes (ou diferentes idiomas/sotaques dentro da mesma linguagem) nesses últimos meses e eu posso afirmar que a carga associada a troca de contexto mental que ocorre diariamente não é nada agradável, produtiva, ou benéfica da alguma forma. Você pode confiar no meu julgamento (se o texto fosse em inglês eu iria preferir a frase “believe me”). Alternar entre duas (!) linguagens complexas durante o desenvolvimento do projeto é… overkill.

No começo, achei que não ia querer usar Lua, por ser uma linguagem muito simples (tipo C) e que não respeita várias “boas ideias de programação” (e.g. reaproveitamento de código, abstração, expressividade etc). Mas acontece que mudei minha forma de pensar para focar mais em “isso é um jogo, lua vai ser usado só para scriptar fases, inimigos, etc”. Toda vez que a gente fosse manter o código de script, o que aconteceria seria atenção aumentada somente a uma parte do código (e.g. esse boss não está agindo como imaginei, o que será que aconteceu? vou olhar o código somente desse script e mais nenhum outro código!) e nada de pegar “conhecimento/abstrações” dos códigos antigos. Na verdade, criar padrões ou coisas do tipo poderia até atrapalhar, já que aumentaria a carga necessária para revisar um script que queremos ver independente dos outros. Essa lógica não é bem muito certa, mas penso nela ao me imaginar desenvolvendo o jogo por um longo prazo.

Lua é uma linguagem simples o suficiente para ter conseguido espaço dentro de um kernel “estabelecido”, o NetBSD. E não é incomum ver preocupações de segurança com coisas complexas e comportamentos implícitos, principalmente quando vindo de pessoas que vem de C ou de desenvolvimento de kernel. Mesmo assim, lua conseguiu um pouco de espaço nessa área frente a outras linguagens bem mais antigas e estabelecidas (como Python).

Lua é simples o suficiente para até ter sido escolhida como “linguagem de consulta” para a interface/programa Wireshark.

Lua também possui implementações bem rápidas.

E é isso, lua é tipo Go, medíocre por não tentar fazer nada, mas pelo menos não acaba errando demais e se torna bem simples. E pelos motivos expostos, considero lua a linguagem de script ideal dentre as que conheço.


Arquivado em:computação, pt-BR Tagged: lua, script

test-sec-flags: Chamada para Assistência

Leandro Inácio escreveu:

Inspirado pelas discussões na lista de e-mail arch-general, test-sec-flags foi criado para o pid1 (com ajuda do anthraxx, strcat, sangy e rgacogne) para testar o impacto de performance de várias compilações orientadas a segurança e flags de linkagem. O objetivo é determinar se estas flags poderão se tornar o novo padrão para todos os pacotes do Arch Linux. Os resultados preliminares sugerem que o impacto no desempenho é quase inexistente se comparado com as flags de compilação atuais, mas gostaríamos de coletar e comparar mais resultados antes de seguir em frente.

Baixe o código aqui e veja o README para instruções de instalação e uso. O subdiretório results contém instruções de como extrair as estatísticas relevantes a partir dos arquivos gerados.

Estamos coletando os resultados na test-sec-flags wiki no Github. Por favor, adicione seus resultados lá. Em particular, gostaríamos muito de resultados i686, assim como todos os colaboradores anteriores foram em dispositivos x86_64.

Correções são bem vindas.

URL da notícia: https://www.archlinux.org/news/test-sec-flags-call-for-assistance/

Eu não confio no seu julgamento se você não critica sua linguagem de programação

A lógica por trás de tal filosofia é bem simples. Se sua linguagem de programação não possui defeitos, então não há nada para mudar nela, pois ela é perfeita, exatamente como está, imutável, nada precisa mudar. Entretanto, e essa é a parte da argumentação que é menos baseada em consequências lógicas e mais baseada em observações ao meu redor, ainda está para ocorrer o momento em que eu veja um entusiasta de sua linguagem de programação que considere negativo o lançamento de uma nova versão de sua linguagem de programação. Cada uma das mudanças que culminou no lançamento de uma nova versão de sua linguagem de programação era uma carência ou um defeito que existia em sua antiga versão, e os “fãs” só irão reconhecê-lo uma vez que o defeito é corrigido, pois sua linguagem é perfeita, sagrada, livre de questionamentos, um tabu quando se menciona a ideia de defeitos.

Pois bem, eu não acho essa posição de sua parte nenhum pouco honesta, e eu quis fazer esse texto para tentar fazer você refletir um pouco a respeito. Outro motivo é que eu estava há muito tempo sem escrever e esse foi um texto fácil para mim, que fluiu da minha mente para “o papel” encontrando nenhuma barreira ou barreiras imperceptíveis. Eu perdi muito pouco tempo para fazê-lo. É um texto de mera opinião.

A ideia de fazer esse texto me veio após perder bastante tempo para escrever a pauta para um podcast que me convidaram a gravar. O tema do podcast seria a linguagem Rust, e eu, na minha mentalidade de blogueiro que ainda não sabe montar pautas, dediquei 4 páginas da pauta só para elaborar o quão C++ é uma linguagem ruim. Agora você precisa entender que a linguagem C++ foi minha linguagem favorita por 6 anos de tal forma que simplesmente não havia espaço para carinho a outras linguagens de programação, e que eu dediquei muito tempo de minha vida só para entender como eu poderia defender essa linguagem. Hoje em dia, C++ não perdeu meu carinho e ela ainda é minha solução favorita para metade dos problemas que resolvo. Ainda assim, 90% do tempo que dediquei para montar a pauta, foi para criticar C++, e em momento nenhum deixei espaço para que o consumidor daquela pauta/obra pudesse imaginar que eu tenho um apego tão grande por essa linguagem.

Acho que uma boa forma de terminar esse texto é ressaltar que sua linguagem só evolui se você corrigir seus problemas, e isso só vai acontecer uma vez que seus problemas sejam reconhecidos. A “linguagem perfeita” é um termo que só é usado por programadores imaturos, grupo do qual um dia eu também já fiz parte.


Arquivado em:computação, pt-BR Tagged: C++, programação, rust

Journalog #2: cryptopal

Little is dead. Probably. Whatever. My shitty mutt setup won’t have enough patience to wait for its reply, so I am moving on to another challenge.

But before, here is a quick pause to talk about setting up email clients: who cares??? Once upon a time, a few mistakes and years ago, I would find pretty awesome to have a decent mutt/alpine setup. Nowadays, this is pretty much useless, unless you also talk to other people with the same setup. For example, it is probably a paradise to use mutt to send emails to LKLM or to cool wizards like Eric Raymond or Richard Stallman, or even to the next g{uy,irl} replying to your comment on Hacker News. For now, I think Inbox is becoming more and more awesome. Disclaimer: this is not an ad, it’s just a personal recommendation from a guy that never lets its inbox have more than fifty unread emails (it all comes down to the whole debate between the oldieeee spam-fuck-off-from-my-mailbox and oh-your-email-is-super-relevant-cmon-lets-talk).

–> Cryptopals <–. Don’t expect me to duplicate information here, click in the link and see it by yourself. It’s basically a set of challenges about cryptography, in the same style of the eudyptula challenge. Theoretically, you don’t need any (prior) crypto experience to start with.

I would really like to learn Rust and to use that knowledge to solve these challenges, or alternatively Clojure and next-gen-Python. However, I don’t have much commitment to do this at the moment; I’d rather give it a shot with my wannabe C/C++ code.

If all goes well, then possibly a series of posts will follow with comments on each of the challenges. If not, then…what? Nobody will notice it anyway; everybody is busy out there trying to catch pokemon and/or watching Friends. Kinda reasonable, depending on your point of view.

So…here comes the nerdy stuff.

Journal

I should stop using the word journal. But here’s how I approached the challenge (you can do it in 5 minutes with your tricky Ruby/Python/Perl; you don’t need to read my poor adventures in C/C++. But it’s all about the experience; I’d rather spend one week in a single problem but get mostly everything out of it and document my thought process, rather than…(?)…blah):

Challenge 1, set 1: convert hex to base64. OK. Hex, not integer/ascii/char/byte. I struggled to get that. It’s actually kinda simple, but most converters you will find out there (including the base64 program available on OS X and on several linux distros) will assume your input is in ASCII.

So, no no no. Don’t you even dare to do a shitty system(“base64 <blablabla>”) call.

The first thing I did was to actually read how to convert from <blah> to base64. The process is really simple to understand (hint: Wikipedia), especially after you try it yourself with two or three examples. It does not really matter whether your input is in decimal/ASCII or hex; but hex is easier to manipulate.

Things that help:

  • bitwise operat{ors,ions} (especially <<, >> and &).
  • several helper functions (bonus: to do it in a functional language, it should be probably very elegant if it is well coded and idiomatic)

I decided to code and run everything within CRUX with vim and without any plugins, even my .vimrc file. Plain/vanilla stuff.

Here is the first working version of my code. Warning: coded after 1am. I am going to improve it until the weekend; more on that later.

….ooooops. Damn, I have a CRUX under VMWare. How do you expect me to copy the code to this blog? I don’t have a X server, I don’t want to install VMWare extensions, I don’t want to take a screenshot of the code (eeergh).

CURLLLLLLLL: https://clbin.com/

This code is really bad:/

I will fix it before going to the second set. And that’s it for {the ,to}day.

Journalog #1: eudyptula

I have no idea if it’s still alive, but I want to participate in the eudyptula challenge again. Last time I did it was probably a little less than 2 years ago, and I was still playing with with Arch at the time.

I am using OS X this month, which screws the whole thing from the beginning. I have to use a virtual machine then. VMWare Fusion is already installed in my system, so whatever. I have to grab a Linux box now. Heck…something very lightweight, no-frills. First thing that comes to mind: CRUX. Yeah, it’s you baby.

ISO file is ~400MB in size. I said lightweight, not small. Installation process is cool.

Screen Shot 2016-07-12 at 9.08.22 PM5 min or so and everything is properly set up. Bootloader, fstab…nothing fancy. CRUX uses LILO (I forgot about that!), but this is a simulated BIOS system anyway (in VMWare), so TO /dev/null, mister GRUB2! And you then reach a few seconds of enlightenment, away from the 21st century. systemd? Xorg? What’s that? OK, there are some btrfs packages laying around. Still!! What? The folks at without-systemd.org (no hyperlink. Go figure.) have a point.

Serendipity: it turns out some people really take this seriously.

All set, rebooting. Let’s work!! I am going to do everything as root, I don’t care. Screw. It’s 2016, virtual machines do have snapshots, bae.

I need to send one plain text (non-HTML) email to start the challenge. That’s all. So I need to grab mutt. I don’t care about sendmail, mail, fetchmail, whatever; so I will need a TUI to do basic stuff. Yah, I know, mutt will use sendmail behind-the-scenes, whatever.

This leads me to…package management. How to install mutt? Heck, no apt-get, yum, pacman. I chose CRUX, now I pay for that, right?? Not really. CRUX has a very basic ports/package management system, I’d compare it to OpenBSD. Hopefully, mutt is going to be present there. It is. So…1 or 2 min reading its handbook and it turns out all I need is

ports -u && prt-get install mutt

Cool. Now here comes the PITA stuff. I have to get a very basic ~/.muttrc. Well, it would be a PITA if we were in the 2000s, but no one cares about man pages anymore(1). Stack Overflow and hippie blogs are the way to go. So a quick Googling here and there leads me to a basic IMAP + SMTP mutt setup with my email provider.

…er, no. Grrrrrr. Mutt does not recognize smtp. Whaaat?! It turns out the default mutt from CRUX is not compiled with smtp enabled. You gotta be kidding me. Okay, let’s compile it from source with the correct flags. I would usually probably take 20+ minutes to figure this out, but I think after all these years playing with linux distros I learned something. It took me less than 3 minutes to go to /usr/ports/opt/mutt and edit the Pkgfile over there, then run pkgmk and finally pkgadd -u to install it. I didn’t have any prior knowledge of this stuff, it was mostly a matter of Cmd-F’ing the handbook webpage and introspecting (=a fancy word for trial-and-error) the command line.

OK, mutt is now installed. WITH SUPPORT FOR EVERYTHING I NEED, damn it. Now…let’s log in. Cool, it works. Actually…my email provider (Google, yaaay) tells me I am logging in from an insecure app, and thus it blocks my login attempt. Aaaaaaaa….ok, I like this feature! But I temporarily disable it (note to self: re-enable it later, you security freak creature!).

Test #1: hello world email sent back to myself. OK, my phone rings. In fact, twice. Leave me alone, I am migrating my apps, I have more than one email client installed on it. You never did that?! Well…everything’s working, so I just send an email to [email protected]

And this is supposed to be a happy ending. For today. Except that…maybe this challenge does not even exist anymore. I hope it does, I really want to do it. Time is key.

Screen Shot 2016-07-12 at 9.35.04 PM.png

Bye.

(1) man anymore: this is my first footnote. For more information, see anymore(8).

Community Ethos

I don’t know how to name this post. These are a couple of resources I think every user that participates in online communities should know about — or, at least, become aware of:

Impressões de um ebook reader

Resolvi fazer um texto com minhas impressões após ter testado um ebook reader. Resolvi fazer isso após ter tido uma experiência bem positiva com o mesmo, que foi inesperado para mim.

Qualquer ebook reader

Primeiro, uma clarificação. Um tablet é um tablet, e não um dispositivo especializado em leitura de livros que possui uma tela de e-ink otimizada para (1) evitar agressão a sua visão e (2) estender a duração da bateria a níveis espantosos. Logo, nada que se aplique a essas impressões se aplicaria a um tablet.

Segundo, eu achei que eu não gostava de ler, mas ebooks realmente são superiores a livros:

  • Muito leve, é possível segurar com uma única mão não importa em que posição você esteja.
  • Ocupa pouco espaço e carrega todos os seus livros, então você não precisa ter preguiça de ir até a estante para escolher o próximo livro para ler. Pode deixar sempre perto de você e tudo certo.
  • A página não dobra ou “cai” enquanto você está lendo. É sempre confortável.
  • Quando você está lendo aqueles livros mais densos, o livro não precisa usar uma fonte minúscula para economizar espaço. O tamanho da fonte é sempre confortável, pois é você que escolhe.
  • Marca a página para cada livro automaticamente. Nada de preocupação de colocar um marca página antes de largar o livro de lado enquanto se distrai com alguma outra tarefa como atender o celular por 5 minutos.
  • Dicionário. Nunca em minha vida eu fui uma pessoa que costumava ler com um dicionário do lado. Entretanto, acabei descobrindo essa função realmente útil. E melhor de tudo, você não precisa carregar o dicionário junto com seu livro para onde for. E algo tão bom quanto, não precisa sair gastando tempo procurando a palavra no dicionário.
  • Em uma semana eu terminei de ler a metade restante do livro que eu havia interrompido ano passado.
  • Há também uma vantagem que não sei se é muito bem explorada ainda. Assim como no Steam, atualizações são baratas. Assim sendo, toda essa bagunça de procurar por erratas podia diminuir.
  • Você não precisa pagar para ter livros clássicos da literatura cujo direitos autorais já expiraram. Só se você quiser pagar pela tradução de alguém.

Tentei ler HQs no ebook reader também, mas não achei confortável e para alguns desenhos, é melhor ter a experiência de perceber todas as cores e detalhes que o artista fez.

Dicas

Caso esteja procurando o melhor ebook reader e não esteja preocupado com o preço, a lista de funcionalidades que usaria para classificar um ebook reader como sendo versão de luxo seria:

  • Tela de alta resolução.
  • A tela não é minúscula como algumas versões mais baratas. 6 polegadas é um tamanho ótimo.
  • Touchscreen capacitiva.
  • Frontlight.

EDIT (2016/07/14):

E eu completei vários dias estando de posse de um ebook reader baseado em tela de e-ink. Não há muito mais há acrescentar, então nem vou criar um post novo. Só há dois novos comentários que quero fazer.

Dá para ler HQ/comic/mangá tranquilamente também, caso esteja no formato ePUB:

Foto do PocketBook Touch Lux 3 sendo usado para ler a comic 18 days

A câmera do celular não é muito boa, mas garanto que além de legível, a arte continua incrível

O segundo comentário que eu tenho a adicionar, é que você pode escolher uma tela de screensaver legal para funcionar como porta-retrato. Fotos de natureza (ex.: cachoeiras) trazem tranquilidade a algumas pessoas. Aí no meu ebook reader, eu uso como screensaver uma foto que trás tranquilidade para mim (uma brincadeira legal seria você tentar adivinhar o que é comentando por aqui).


Arquivado em:pt-BR Tagged: ebook, livros

screen-4.4.0-1 incapaz de recuperar sessões antigas

Leandro Inácio escreveu:

Caso você atualizou para screen-4.4.0-1 você estará incapacitado de recuperar sessões já iniciadas com versões anteriores do screen. Por favor tenha certeza que suas sessões estão fechadas antes de atualizar.

URL da notícia: https://www.archlinux.org/news/screen-440-1-unable-to-attach-old-sessions/

Flash player no Opera browser!

O método de adicionar o “libflashplayer.so”, no diretório “/usr/lib/opera/plugins/ ” não funciona mais, isto está desatualizado.

Para que o flash funcione corretamente no navegador Opera, precisamos instalar dois pacotes:

ttf-ms-fonts” e o “chromium-pepper-flash” , ambos presentes no AUR.

Logo:

$ yaourt -S ttf-ms-fonts
$ yaourt - S chromium-pepper-flash

Feito isso basta reiniciar seu Opera e aproveitar este excelente navegador!