Linhas de execução em Python

As linhas (ou encadeamento) de execução permitem-nos executar tarefas em simultâneo. Em Python podemos usar o módulo threading, embora existam muitos outros.

Vamos criar várias linhas de execução (threads):

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import threading
import time
import random

def sleeper(name, s_time):
    print('{} começado às {}.'.format(
        name, time.strftime('%H:%M:%S', time.gmtime())))

    time.sleep(s_time)

    print('{} terminado às {}.'.format(
        name, time.strftime('%H:%M:%S', time.gmtime())))


for i in range(5):
    thread = threading.Thread(target=sleeper, args=(
        'Linha ' + str(i + 1), random.randint(1, 9)))

    thread.start()

print('Já terminei, mas as outras linhas de execução não.')

Em primeiro lugar, importamos os módulos necessários: time, random e threading. Para criar threads só precisamos do último. Usamos time para simular uma tarefa e obter o seu tempo de início e fim; random, para fazer com que o nossa linha tenha uma duração aleatória.

A função sleeper «dorme» (não faz nada) durante o tempo que especificamos, diz-nos quando começou a «dormir» e quando acabou de «dormir». Como argumentos, passamos o nome que queremos dar à linha e o tempo que a função vai «dormir».

Depois, criamos um loop que cria 5 fios que executam a função sleeper. No threading.Thread devemos indicar a função a executar (target=sleeper) e os argumentos que queremos passar-lhe, args=('Linha ' + str(i + 1), random.randint(1, 9).

O resultado da execução é aleatório: não sabemos qual o processo que irá terminar primeiro:

Linha 1 começado às 09:16:14.
Linha 2 começado às 09:16:14.
Linha 3 começado às 09:16:14.
Linha 4 começado às 09:16:14.
Linha 5 começado às 09:16:14.
Já terminei, mas as outras linhas de execução não.
Linha 2 terminado às 09:16:17.
Linha 5 terminado às 09:16:20.
Linha 3 terminado às 09:16:21.
Linha 4 terminado às 09:16:21.
Linha 1 terminado às 09:16:22.

Software livre e política

O software livre é anarquista ou capitalista? Alguns dizem que é comunista, outros dizem que é capitalista, anarquista... Quem tem razão? Fazem sentido comentários como os feitos pelo antigo diretor executivo da Microsoft, Steve Ballmer? Continúa leyendo Software livre e política

O software livre é melhor do que a alquimia

É difícil explicar os benefícios do software livre a pessoas que não compreendem computadores? Tal como não é preciso ser jornalista para compreender os benefícios da liberdade de imprensa, não é preciso ser programador para compreender os benefícios do software livre.

Continúa leyendo O software livre é melhor do que a alquimia

Remover acentos com o sed ou o iconv (GNU/Linux)

Por vezes é útil remover acentos de um texto ou de palavras. Para tal podemos utilizar o sed, que normalmente já está instalado no GNU/Linux.

Basta criar um ficheiro como o seguinte...

#!/bin/sed -f

# Este programa remove os acentos, funciona tanto para espanhol como para
# português.
#
# Exemplo de utilização
# $ echo 'Eles também têm tempo.' | ./remover-acentos.sed

# Em maiúsculas
s/Á/A/g
s/É/E/g
s/Í/I/g
s/Ó/O/g
s/Ú/U/g

s/À/A/g

s/Ã/A/g
s/Õ/O/g

s/Â/A/g
s/Ê/E/g
s/Ô/O/g


# Em minúsculas
s/á/a/g
s/é/e/g
s/í/i/g
s/ó/o/g
s/ú/u/g

s/à/a/g

s/ã/a/g
s/õ/o/g

s/â/a/g
s/ê/e/g
s/ô/o/g

Dar-lhe permissão para executar (sudo chmod u+x remover-acentos.sed) e, depois, executar algo como echo 'Eles também têm tempo' | ./remover-acentos.sed, que retirará os acentos da frase, deixando-a assim: «Eles tambem tem tempo». Podemos passar qualquer texto para o programa através de um tubo. Assim, cat texto.txt | ./remover-acentos.sed removeria os acentos do texto no ficheiro texto.txt.

Outra opção é converter o texto para ASCII por transliteração com o programa iconv, que também está normalmente instalado no GNU/Linux. Assim, para converter um texto para ASCII, simplesmente tens de executar algo como iconv -f utf-8 -t ascii//translit texto.txt ou echo 'Não é uma árvore' | iconv -f utf-8 -t ascii//translit.

Os estúpidos códigos QR en restaurantes

Antes era comum ir a um restaurante, olhar para o menu e encomendar: era tão simples como isso. Agora muitos lugares já nem sequer têm um menu físico; assumem que o cliente tem um telefone «inteligente» e uma ligação à Internet. Se for este o caso, espera-se que o cliente utilize a câmara e digitalize o código QR, o que o leva a uma página web que não respeita a privacidade, leva frequentemente muito tempo a carregar e, em muitos casos, não é muito intuitiva.

É ineficiente, polui mais

O carregamento de uma página web com imagens num servidor remoto, para cada cliente, é poluente. Com um menu físico, não se desperdiça electricidade, as pessoas podem reutilizar o menu indefinidamente... Se não houver Internet ou se não tiveres bateria, como consultar o menu com o QR?

Sem privacidade

Quando visitamos um sítio web, deixamos uma pegada digital. Se utilizarmos códigos QR para consultar o menu, há empresas, governos, etc., que podem saber que num momento específico consultámos o menu de um restaurante específico.

Os clientes também perdem a sua privacidade quando pagam com cartão em vez de usarem dinheiro, mas isso é outra questão.

Melhor sem QR

Eu não tenho um telemóvel «inteligente» e não gosto de restaurantes. Se eu comer num restaurante, peço o menu físico. Se não mo derem, têm de me dizer, porque não tenho forma de ver o código QR. A maioria da comida dos restaurantes não é saudável, os trabalhadores são frequentemente explorados, muita comida é desperdiçada, há poucas opções veganas, etc. A indústria da hospitalidade tem muitos problemas. A utilização do código QR para menus é apenas mais um passo na direcção errada, mas muito fácil de combater, recusando-se a utilizar um telefone «inteligente» para digitalizar um estúpido código QR.