Elmord's Magic Valley

Software, lingüística, mitologia nórdica e rock'n'roll

Estatuto do Nascituro

2013-06-12 07:22 -0300. Tags: life, politics

A essas alturas você já deve ter ouvido falar do Estatuto do Nascituro, um projeto de lei que, entre outras coisas, ilegaliza o aborto em caso de estupro (atualmente permitido por lei), e prevê o pagamento de uma bolsa (de um salário mínimo) à vítima caso o pai da criança não seja identificado.

Que como se não bastasse ter sido estuprada, a vítima ainda vai ter que carregar por nove meses o fruto do estupro, uma criança que ela não pretendia ter e não teve nenhuma escolha em ter, problema é dela. Que o fato de que ter um filho pode alterar completamente a vida dela, também pouco importa. Afinal, a única função da mulher é reproduzir mesmo. Além disso, ela receberá auxílio financeiro do estado (de um salário mínimo, evidentemente mais do que suficiente), e cuidar de uma criança é só uma questão de dinheiro, não é mesmo?

Não, pouco importa a vítima. O importante nessa história toda é a criança. A criança que terá uma vida ótima, com um pai estuprador e uma mãe que não a queria e que sempre vai associá-la ao estupro. Certamente a criança será beneficiada em nascer em tal ambiente familiar bem estruturado, acolhedor e preparado para recebê-la. E na dúbia ocasião em que não seja esse o caso, a criança sempre poderá ir para a adoção, viver em um igualmente bem estruturado e acolhedor orfanato por tantos anos quanto necessário, até, talvez, ser adotada por uma família que, talvez, lhe oferecerá boas condições de vida. Mas isso é um caso especial; no geral, a mãe biológica, que é a verdadeira responsável pela criança, é que ficará com a criança. Afinal, quem mandou ser estuprada?

Diga NÃO ao Estatuto do Nascituro.

1 comentário

Pidgin Off-the-Record

2013-06-07 21:33 -0300. Tags: comp, web, privacy

Acabei de descobrir um plugin chamado pidgin-otr (pacote pidgin-otr no Debian/Ubuntu), que permite realizar conversas encriptadas independentemente do protocolo de comunicação utilizado. O plugin funciona cifrando e decifrando mensagens individuais nos clientes, e transmitindo para o servidor o conteúdo cifrado como se fosse uma mensagem comum.

O plugin é bastante conveniente de usar. Para ativá-lo, basta instalar o pacote e habilitá-lo na janela de plugins do Pidgin (Tools > Plugins > Off-the-Record Messaging). A partir daí, as janelas de conversação apresentarão um ícone que permite iniciar uma conversa privada (desde que o outro usuário também possua o plugin). Pelo que eu entendi, uma vez que isso tenha sido feito para um usuário, conversas posteriores serão cifradas automaticamente por padrão.

Quem me contou foi o Reddit (em um post sobre a acesso da NSA a dados do Google, Apple, Facebook e diversas outras organizações estadunidenses).

3 comentários

Coisas que você não sabe sobre a glibc

2013-05-29 11:48 -0300. Tags: comp, prog, c, unix

Em algum momento do ano passado, por falta de coisa melhor para fazer, eu me parei a ler o manual da GNU libc. Não cheguei a ir muito longe, mas descobri um bocado de coisas interessantes no processo.

scanf

A scanf é uma das primeiras funções que vemos quando aprendemos C. Por isso mesmo, acabamos vendo só a funcionalidade básica para sobrevivência. Aí achamos que conhecemos a scanf e nunca mais nos preocupamos com ela. Ela possui um bocado de features interessantes, entretanto:

Other I/O

Miscelânea

No más

A glibc tem muita coisa (a versão em PDF do manual tem cerca de mil páginas). Vale a pena dar uma olhada no manual, nem que seja apenas para descobrir que tipo de recursos ela fornece, caso um dia você precise de algum deles.

3 comentários

Tcl pode ser um bom shell

2013-05-23 00:01 -0300. Tags: comp, unix, shell

Para o meu choque e horror, acabei de me dar conta de que Tcl pode ser uma alternativa decente ao shell do Unix. Essa galera me convenceu ainda mais disso. Com meia dúzia de funções auxiliares para fazer piping e redirecionamentos de maneira mais conveniente, essa pode ser uma boa solução.

Por um lado, problem solved. Por outro lado, isso me tira uns 80% da motivação para escrever um shell. Talvez o que seria uma boa é criar uma "extensão" de Tcl que permita o uso da sintaxe convencional do shell para pipes e redirecionamentos. O fato de que o Tcl usa strings para representar todos os tipos de dados inclusive torna trivial o problema de passar dados estruturados entre processos no Unix.

Well, melhor seguir adiante com o resto dos meus planos de dominação mundial.

[P.S.: Eis uma introdução interessante aos poderes do Tcl.]

4 comentários

Tempus fugit, mas só se eu deixar

2013-05-21 04:53 -0300. Tags: life

Quanto menos obrigações eu tenho, mais aparente se torna o fato de que eu não sei usar meu tempo.

Historicamente eu não sou uma pessoa muito "responsável". Ok, eu sou responsável no sentido de que eu sempre (será?) cumpri os "contratos": sempre terminei os trabalhos de aula e as tarefas de bolsa em tempo hábil e me saí decentemente bem nas cadeiras. Na bolsa de IC inclusive a galera admirava meu trabalho. Mas eu nunca fui muito dedicado; o que eu quase sempre fiz foi postergar tudo até o último momento e usar meu færsom cung-fu para terminar as coisas a tempo. E como isso deu sempre certo, eu nunca mudei esse comportamento (fora ter aprendido a começar algumas tarefas uma semana antes do prazo, ao invés de um dia).

O problema é que isso não funciona quando não existem deadlines impostas por outros para fazer as coisas. Por exemplo, tem um bocado de línguas que eu gostaria de aprender, e um bocado de programas que eu gostaria de escrever. Em tempos de outrora eu poderia até argumentar (falsamente, for most part) que a faculdade/bolsa não me deixava tempo para me dedicar a essas coisas. Mas agora que eu estou chegando no fim do curso e tenho rios de tempo livre que eu posso usar como bem entender, torna-se evidente o fato de que eu jogo quilos de tempo fora. Diante dessa observação, estou procurando meios de fazer com que eu use melhor esse tempo.

De repente eu tive um insight sobre para que servem horários: eles servem para que as pessoas façam o que de outra forma elas postergariam indefinidamente.

O problema é que ter horários fixos para as atividades e pré-programar todas as ações é um negócio tão avesso à minha natureza que (1) eu não seria uma pessoa contente fazendo isso; (2) provavelmente não ia funcionar, i.e., eu ia atirar pela janela essa organização toda em meia dúzia de instantes; (3) eu sequer sei como proceder com essa organização. Por exemplo: os dias em que eu tenho que ir no mercado ou arrumar a casa são variáveis. Como é que eu vou planejar de antemão em que momento eu vou fazer essas coisas? You surely don't expect que eu tenha um planejamento melhor das minhas compras do que "essa é a última caixa de leite, amanhã tem que comprar mais", right? E eu só escrevo posts quando estou inspirado, e não levo sempre o mesmo tempo para escrever um post, então não tenho como apontar um período de tempo pré-fixado para isso. And so on.

Felizmente, acho que eu descobri uma maneira de programar melhor meu uso do tempo sem tornar isso um fardo. Eis a técnica:

E é isso. Aqui estou eu dando conselhos sobre administração de tempo sem nenhuma propriedade para tal. Para pessoas diferentes coisas diferentes funcionam melhor, e talvez isto aqui não seja a técnica ideal para você, mas até agora essa foi a idéia de organização de tempo que me parece mais promissora de funcionar para mim. Cumprir os tempos previstos ainda exige um bocado de força de vontade, mas me parece menos burdensome do que programar horários fixos para as coisas. Não que isso seja uma idéia revolucionária, mas enfim. Espero que funcione.

Comentários

LotR #2

2013-05-20 03:05 -0300. Tags: book, rant

Tolkien é um ótimo escritor. As histórias que ele conta é que não compartilham da mesma glória.

Acabei de ler o primeiro capítulo do segundo volume do Senhor dos Anéis. Ok, eu sobrevivi ao primeiro volume (que eu comecei a ler sem nenhuma pressa algum tempo atrás). Sobrevivi ao Tom Bombadil e ao banho anual da Goldberry. Sobrevivi às canções élficas que derrubam até os hobbits de sono (sim, isso é parte da história). Sobrevivi até a Lothlórien e o um mês que a galera ficou jogando fora lá comendo, dormindo e vendo televisão (a.k.a. Mirror of Galadriel) enquanto Sauron et al. tocavam o terror no mundo. Mas este capítulo foi demás.

Veja bem. Boromir, o inútil, depois de tentar roubar o anel do Frodo e atrapalhar a missão, não tendo feito nada de muito útil até esse ponto da história exceto ter ajudado a escavar a neve do monte Caradhras, que no fim das contas eles não atravessaram, perde a briga para um bando de orcs. Aragorn encontra Boromir semi-morto, depois de os orcs terem ido embora. "Eu ferrei com tudo. Agora os orcs levaram os hobbits embora. Vou morrer minha morte miserável aqui", diz Boromir, e morre sua morte miserável ali. Nesse momento a galera sai correndo na pista dos orcs para salvar os hobbits, certo?

Errado. Primeiro, Aragorn, Legolas e Gimli discutem como eles vão fazer o funeral do Boromir. Sim, é mais importante satisfazer o morto do que ir salvar os hobbits (afinal ninguém se importa muito com os hobbits nessa história). Aí eles decidem que cavar dá muito trabalho, então melhor é colocar o Boromir dentro do barquinho dele, junto com seus pertences e os dos orcs que ele conseguiu matar, e levar o barquinho até um ponto do rio e deixar o rio levar embora, não sem primeiro fazer dez mil preparativos. Claro que depois de largarem o barquinho, Aragorn e Legolas ainda cantam umas musiquinhas em homenagem ao morto. A essas alturas o Tolkien já está de saco cheio de escrever poemas (o livro é cheio de poemas), então as musiquinhas têm uma métrica totalmente capenga em comparação com as do primeiro livro. Really, a cena parece as firulas de cavalaria do Dom Quixote, com a diferença de que o Dom Quixote é intencionalmente zoação.

Até que, no final da tarde (essa história toda começou de manhã), Aragorn conclui: "Já sei! Quem sabe a gente vai atrás dos orcs, for a change?" "‘Well, after them!’ said Gimli. ‘Dwarves too can go swiftly, and they do not tire sooner than Orcs. But it will be a long chase: they have a long start.’" A long start? Imagine! Só umas seis horas de vantagem enquanto a gente colocava um morto num barco. O que são meras seis horas comparadas com os trinta dias que a gente passou comendo e dormindo em Lothlórien?

A essas alturas, a motivação primária que eu tenho para continuar lendo esse livro é o prospecto de ler The Last Ringbearer depois. E no fim das contas eu estou reclamando à toa; essa história é uma boa fonte de diversão.

6 comentários

fgetcsv: A cautionary tale

2013-05-18 01:52 -0300. Tags: comp, prog, web, php, rant

Quando eu reescrevi o blog system, eu resolvi manter o índice de posts em um arquivo CSV e usar as funções fgetcsv e fputcsv para manipulá-lo. Minha intuição prontamente me disse "isso é PHP, tu vai te ferrar", mas eu não lhe dei importância. Afinal, provavelmente seria mais eficiente usar essas funções do que ler uma linha inteira e usar a explode para separar os campos. (Sim, eu usei um txt ao invés de um SQLite. Eu sou feliz assim, ok?)

Na verdade o que eu queria era manter o arquivo como tab-separated values, de maneira que ele fosse o mais fácil possível de manipular com as ferramentas convencionais do Unix (cut, awk, etc.). As funções do PHP aceitam um delimitador como argumento, então pensei eu que bastaria mudar o delimitador para "\t" ao invés da vírgula e tudo estaria bem. Evidentemente eu estava errado: um dos argumentos da fputcsv é um "enclosure", um caractere que deve ser usado ao redor de valores que contêm espaços (ou outras situações? who knows?). O valor padrão para a enclosure é a aspa dupla. Acontece que a fputcsv exige uma enclosure: não é possível passar uma string vazia, ou NULL, por exemplo, para evitar que a função imprima uma enclosure em volta das strings que considerar dignas de serem envoltas. Lá se vai meu tab-separated file bonitinho. Mas ok, não é um problema fatal.

A segunda curiosidade é que a fgetcsv aceita um argumento "escape", que diz qual é o caractere de escape (\ por default). Evidentemente, você tem que usar um caractere de escape; a possibilidade de ler um arquivo em um formato em que todos os caracteres exceto o delimitador de campo e o "\n" tenham seus valores literais é inconcebível. Mas ok, podemos setar o escape para um caractere não-imprimível do ASCII (e.g., "\1") e esquecer da existência dele. Acontece que a fputcsv não aceita um caractere de escape, logo você não tem como usar o mesmo caractere não-imprimível nas duas funções. WTF?

Na verdade, agora testando melhor (já que a documentação não nos conta muita coisa), aparentemente a fputcsv nunca produz um caractere de escape: se o delimitador aparece em um dos campos, ele é duplicado na saída (i.e., a"b vira a""b). Evidentemente, não há como eliminar esse comportamento. Mas então o que será que faz o escape character da fgetcsv?

# php -r 'while ($a = fgetcsv(STDIN, 999, ",", "\"", "\\"))
             { var_export($a); echo "\n"; }'
a,z
array (
  0 => 'a',
  1 => 'z',
)
a\tb,z
array (
  0 => 'a\\tb',
  1 => 'z',
)

Ok, o escape não serve para introduzir seqüências do tipo \t. Talvez para remover o significado especial de outros caracteres?

a\,b,z
array (
  0 => 'a\\',
  1 => 'b',
  2 => 'z',
)
a b,z
array (
  0 => 'a b',
  1 => 'z',
)
a\ b,z
array (
  0 => 'a\\ b',
  1 => 'z',
)

Muito bem. Como vimos, o escape character serve para, hã... hmm.

Mas o fatal blow eu tive hoje, olhando a lista de todos os posts do blog e constatando que o post sobre o filme π estava aparecendo com o nome vazio. Eis que:

# php -r '
    $h = fopen("entryidx.entries", "r");
    while ($a = fgetcsv($h, 9999, "\t"))
       if ($a[0]=="20120322-pi") var_export($a);'
array (
  0 => '20120322-pi',
  1 => 'π',
  2 => '2012-03-22 23:53 -0300',
  3 => 'film',
)

# LC_ALL=C php -r '
    $h = fopen("entryidx.entries", "r");
    while ($a = fgetcsv($h, 9999, "\t"))
       if ($a[0]=="20120322-pi") var_export($a);'
array (
  0 => '20120322-pi',
  1 => '',
  2 => '2012-03-22 23:53 -0300',
  3 => 'film',
)

A próxima versão do Blognir deverá usar fgets/explode.

UPDATE: Aparentemente o problema só ocorre quando um caractere não-ASCII aparece no começo de um campo. Whut?

UPDATE 2:

"a b","c d"
array (
  0 => 'a b',
  1 => 'c d',
)
"a"b","c"d"
array (
  0 => 'ab"',
  1 => 'cd"',
)
"a\"b","c d"
array (
  0 => 'a\\"b',
  1 => 'c d',
)

5 comentários

Um aviso de utilidade pública

2013-05-16 15:27 -0300. Tags: home, img

Isto aqui, tanto quanto eu pude determinar (especialmente depois de ter assistido a um desses andando), é um caracol más pequeño del mundo:

[Imagem de um caracol más pequeño del mundo]

Se você não eliminá-los, eles vão crescer, tomar conta da sua casa, rastejar sobre seus pertences e rir na cara da gravidade. Como se não bastasse, eles também produzirão outros caracóis más pequeños del mundo, que em tempo farão a mesma coisa.

#ficadica.

2 comentários

Noun-centric vs. verb-centric OO

2013-05-11 01:36 -0300. Tags: comp, prog, lisp, pldesign

As linguagens orientadas a objetos convencionais são o que podemos chamar de noun-centric: as classes são a "unidade estrutural" mais importante, e os métodos (verbos) pertencem a classes (nomes). Um método é chamado sobre exatamente um objeto, e a escolha de que código será executado para a chamada depende da classe do objeto sobre o qual o método é chamado. A sintaxe objeto.método(args) reflete essa idéia.

Algumas outras linguagens, como Common Lisp e Dylan, entretanto, seguem um modelo "verb-centric": os métodos são definidos fora das classes. Métodos de mesmo "nome" (onde nome = símbolo + pacote ao qual pertence) são agrupados sob uma mesma generic function. As classes de todos os argumentos da generic function são consideradas na hora de escolher que código será executado. Em Common Lisp, a sintaxe (método arg1 arg2...) reflete essa ausência de preferência por um dos argumentos e a existência da função como algo externo a qualquer classe. (Não lembro mais de onde saíram os termos "noun-centric" e "verb-centric" para descrever essa diferença, mas eles não são invenção minha.)

As conseqüências na prática são várias. Uma delas é que no modelo verbocêntrico é possível criar novos métodos para classes existentes sem ter que modificá-las. Por exemplo, se você quiser criar um método novo para trabalhar com strings, você pode defini-lo e usá-lo como qualquer outro método sobre strings, ao invés de criar uma distinção artificial entre métodos nativos da classe String ("foo".method(42)) e métodos definidos somewhere else que trabalham com strings (RandomClass.method("foo", 42)). (Ruby, uma linguagem nominocêntrica, resolve esse problema permitindo "redefinições parciais" de classes. Essa solução, entretanto, tem o problema de que todos os métodos sobre uma classe compartilham o mesmo namespace, i.e., se dois arquivos diferentes quiserem definir method sobre uma mesma classe, as definições conflitarão. Em Common Lisp, cada method estaria em seu próprio pacote, o que evita esse problema.)

Outra vantagem do modelo verbocêntrico é que evitam-se decisões arbitrárias quanto a em que classe se deve incluir um método. Por exemplo, imagine que queiramos definir um método (match string regex), que retorna a primeira ocorrência de regex em string. Esse método vai na classe String, ou em RegEx? E se quisermos procurar por outras coisas além de regexes dentro da string (e.g., outras strings)? E se quisermos procurar regexes em coisas que não são strings (e.g., streams)? No modelo verbocêntrico, essa decisão simplesmente não existe; basta definir match para todas as combinações de tipos de argumentos possíveis.

Uma terceira conseqüência desse modelo é que o conceito de "interface" é desnecessário: "implementar uma interface" consiste em especializar os métodos desejados para a classe em questão. (De certa forma, pode-se imaginar cada generic function como uma interface de um método só, e cada definição de método para a generic function como a implementação da interface para uma combinação de classes. De certa forma, pode-se imaginar muitas coisas.) Uma desvantagem disso é que se perde a garantia estática provida pelas interfaces de que de uma dada classe implementa um conjunto de métodos relacionados. (Garantias estáticas não são exatamente um ponto forte do Common Lisp.)

No modelo nominocêntrico, é possível descrever chamadas de métodos em termos de troca de mensagens: quando escrevemos obj.foo(23, 42), podemos pensar que estamos enviando a mensagem foo(23, 42) para o objeto obj. De fato, em Smalltalk, uma das primeiras linguagens orientadas a objeto, as mensagens são objetos de primeira classe, e é possível fazer algumas coisas interessantes com elas (como por exemplo repassá-las para outros objetos, ou definir um método doesNotUnderstand que trata todas as mensagens que uma classe não reconhece). O modelo de troca de mensagens também é interessante em implementações de objetos distribuídos: nesse caso, uma chamada de método sobre um objeto remoto é de fato uma mensagem enviada pela rede para a máquina onde o objeto se encontra. Uma desvantagem do modelo verbocêntrico é que o a descrição em termos de troca de mensagens não é mais aplicável: um método é chamado sobre múltiplos objetos, e portanto não há um "receptor" da mensagem.

quem diga que o CLOS (Common Lisp Object System) não é de fato orientação a objetos, mas sim um paradigma diferente que é capaz de expressar orientação a objetos e (um bocado de) outras coisas (muitas delas não abordadas neste post, tais como before/after methods (que lembram programação orientada a aspectos) e method combinations). Hoje em dia eu me vejo inclinado a concordar com essa posição, já que o CLOS foge da idéia de objetos como caixinhas fechadas manipuladas apenas através dos métodos expostos pela classe correspondente. Encapsulamento é possível em Common Lisp (basta não exportar os nomes dos slots (a.k.a. propriedades, atributos, membros) no pacote onde foram definidos), mas a noção de objeto = dados + operações se perde, de certa forma. Os objetos são apenas os dados, e as operações somos nós estão contidas nas generic functions / métodos.

2 comentários

Incomparável

2013-05-10 18:39 -0300. Tags: random, img

Incomparável como seu carinho

Incomparável... como seu carinho.

2 comentários

Main menu

Posts recentes

Tags

comp (74) life (29) unix (29) prog (26) random (23) mundane (20) lang (19) about (18) mind (15) web (13) rant (11) img (11) privacy (8) ramble (8) bash (7) esperanto (7) home (6) conlang (5) pldesign (5) academia (5) lisp (4) book (4) freedom (4) copyright (4) mestrado (4) misc (4) music (3) kbd (3) security (3) worldly (3) politics (3) film (3) network (2) editor (2) android (2) wrong (2) cook (2) c (2) physics (2) php (2) poem (2) pointless (1) perl (1) latex (1) shell (1) audio (1) kindle (1)

Elsewhere

Quod vide


Copyright © 2012-2014 Vítor Bujés Ubatuba De Araújo
O conteúdo deste site, a menos que de outra forma especificado, pode ser utilizado livremente, com ou sem alterações, desde que seja mencionado o autor, preferivelmente com a URL do documento original.

Powered by Blognir.