Archive

Author Archive

Multiplicação fácil em binário

August 18th, 2010 No comments

Um algoritmo é uma sequência de passos (incluindo decisões) para se alcançar um objetivo. Geralmente, o termo é usado para se referir a processos computacionais, mas não está restrito ao tema. Um mesmo problema pode ser resolvido por diversos algoritmos e depende dos recursos disponíveis qual será o mais eficiente naquele caso.

Um mesmo algoritmo pode ser eficiente para computadores, mas ineficiente para humanos e vice-versa. Humanos trabalham melhor com manipulação de imagens do que com processos abstratos (por isso muitas vezes os representamos em diagramas). Particularmente, me interesso por ambos. Entender o porquê de algoritmos serem mais humanos ou mais “máquina”  é um ótimo pretexto para aprender mais sobre os dois.

Aqui vai um exemplo de algoritmo humano para resolver multiplicações em binário de forma mais simples:

  1. Disponha os multiplicandos numa tabela de eixos ortogonais a 45º e 135º como na figura.
  2. Para facilitar use pontos para os zeros e traços para os uns e preencha o cabeçalho na ordem numérica normal.
  3. Onde os traços “se encontram”, marque traços verticais, no restante pontos.
  4. Some as linhas verticais como faria normalmente em binário (incluindo o “vai um”).
  5. O resultado estará na ordem numérica correta.

É o mesmo que faríamos numa multiplicação normal, mas de forma visualmente mais simples e significativa. É possível fazer o mesmo com decimais, mas assinalando os valores todos.

O presente post foi inspirado nesse vídeo.

(Esse método aqui eu não consegui entender, mas tb parece interessante).

Que a nerdice esteja com você.

ATUALIZAÇÃO

Para fazer a adição isolada ou como parte da multiplicação já citada, há outro algoritmo mais próximo do que normalmente usamos para somar:

  1. Preocupe-se apenas com o “vai um”, envolva de dois em dois os “uns” substituindo-os por 1 na próxima casa [em verde na imagem] (só que na parte de baixo para se poder acoplar na multiplicação).
  2. Você também pode, para facilitar, envolver de 4 em quatro quando houver tantos, e substituí-los por 1 duas casas adiante [em azul na imagem]. Se pode fazer o mesmo com 8, 16, 32… respectivamente 3, 4, 5 casas adiante [2n].
  3. Quando terminar, transcreva apenas os uns para baixo completando o restante com zeros (aqui não há mágica, a única diferença é circular os grupos para tornar o algoritmo mais visual).
Categories: Filosofia, Informática, Psicologia Tags:

Quine em Go

August 8th, 2010 No comments

Um programa Quine é aquele que gera como output exatamente seu próprio código fonte. Aí vai o meu feito em Go (golang.org).

[English: A Quine is a program that generates exactly it's own source code as output. That's one I made in Go (golang.org).]

/* quine.go by Daniel Mazza */

package main
import "fmt"

func main() {
s := `/* quine.go by Daniel Mazza */

package main
import "fmt"

func main() {
s := %s
fmt.Printf(s + "\n", string(96) + s + string(96))
}
`
fmt.Printf(s + "\n", string(96) + s + string(96))
}

Categories: Filosofia, Informática Tags:

Go Bitwise

July 10th, 2010 No comments

Operadores bitwise são os que atuam bit-a-bit. Em Go são:

  • & (AND)
  • | (OR)
  • ^ (NOT precedendo um operando e XOR entre dois)
  • &^ (AND-NOT, e-não, não-implicação)

Assim, por exemplo, 3|5 retornará 7, pois em binário 3 é 0011 e 5 é 0101 e | retorna 1 se qualquer um dos bits for 1, assim o resultado será 0111, que é 7 em decimal. Com esses operadores lógicos podemos alcançar todos os demais possíveis (quatro com um operando e dezesseis com dois operandos). Veja o código a seguir:

// Bitwise fun by Daniel Mazza
package main

import "fmt"

var (
	p uint8 = 3 // 0011
	q uint8 = 5 // 0101
)

func main() {

	// All possible binary logic operations (equivalent).
	// (Some parentheses are only to enhance readability)

	B1(
		(q &^ q), // 0  00 Contradiction
		(q),      // 1  01 Proposition Q
		(^q),     // 2  10 Negation of Q
		(q | ^q), // 3  11 Tautology
	)
	fmt.Println()
	B2(
		(p &^ p & q),   // 0  0000 Contradiction
		(p & q),        // 1  0001 Conjunction (AND)
		(p &^ q),       // 2  0010 Material nonimplication (AND-NOT)
		(p | (q &^ q)), // 3  0011 Proposition P
		(^p & q),       // 4  0100 Converse nonimplication
		((p &^ p) | q), // 5  0101 Proposition Q
		(p ^ q),        // 6  0110 Exclusive disjunction (XOR)
		(p | q),        // 7  0111 Disjunction (OR)
		^(p | q),       // 8  1000 Joint denial (NOR, Quine's dagger)
		^(p ^ q),       // 9  1001 Biconditional (IFF, <->)
		((p | ^p) ^ q), // 10 1010 Negation of Q
		(p | ^q),       // 11 1011 Converse implication
		(p ^ (^q | q)), // 12 1100 Negation of P
		(^p | q),       // 13 1101 Material implication (->)
		^(p & q),       // 14 1110 Alternative denial (NAND, Sheffer stroke)
		(p | ^p | q),   // 15 1111 Tautology
	)
}

func B1(bs ...uint8) { // Prints last 2 bits
	for _, b := range bs {
		b &^= 1<<8 - 1<<2
		fmt.Printf("%d\t%s\n", b, digits(b)[6:8])
	}
}

func B2(bs ...uint8) { // Prints last 4 bits
	for _, b := range bs {
		b &^= 1<<8 - 1<<4
		fmt.Printf("%d\t%s\n", b, digits(b)[4:8])
	}
}

func digits(b uint8) string { // 8 digits, "%#b" doesn't exist (yet)
	s := fmt.Sprintf("%b", b)
	for i := 8 - len(s); i > 0; i-- {
		s = "0" + s
	}
	return s
}

Categories: Filosofia, Informática Tags:

Configurando CGI no Snow Leopard

June 20th, 2010 No comments

Common Gateway Interface é uma tecnologia que permite criar páginas web dinâmicas com (quase) qualquer linguagem de programação.

Preliminares

Verifique se seu servidor Apache está ativo. Abra um navegador qualquer em http://localhost e deverá aparecer “It works” (no Snow Leopard). A URL http://localhost/~username/ deve mostrar uma página mais bonitinha de título “Your website.” (se você ainda não houver alterado essas páginas).

Se não aparecer nada disso, você tem de ativá-lo. Clique na maçã no canto da tela, vá em System Preferences (Preferências do Sistema) e em Sharing (Compartilhado). Clique em Web Sharing (Compartilhamento Web) e deve aparecer uma bolinha verde indiciando que o servidor está ativo. Aproveite para ver que é mostrado seu IP na rede. É esse endereço que as demais pessoas da rede devem acessar no navegador se quiserem ver o site que você está hospedando na porta 80.

Quando você precisar reiniciar o Apache, você pode desmarcar e marcar novamente o compartilhamento ou pelo comando no terminal (fornecendo a senha root quando solicitada):

sudo apachectl restart

CGI padrão

Costuma-se usar um alias (que encontra-se em /etc/apache2/httpd.conf, linha 328) dos endereços que começam por cgi-bin/ para um diretório restrito onde ficam os arquivos CGI. No Snow Leopard, vc acessa, por exemplo, http://localhost/cgi-bin/script.cgi e o arquivo que será executado será /Library/WebServer/CGI-Executables/script.cgi. Isso evita que, havendo algum erro no servidor, o arquivo seja baixado em vez de executado, o que geraria problemas de segurança (imagine se o arquivo contiver a senha da base da dados).

Essa opção já vem habilitada por padrão, apenas crie um arquivo CGI como os exemplos ao final do post, coloque-o na pasta /Library/WebServer/CGI-Executables/ e dê permissão de execussão do arquivo pelo terminal com o comando:

sudo chmod +x /Library/WebServer/CGI-Executables/meu_arquivo.cgi

Então acesse no navegador http://localhost/cgi-bin/meu_arquivo.cgi para vê-lo rodando.

CGI em Sites/

Mas às vezes você simplesmente precisa de algo mais prático, vamos então habilitar que qualquer arquivo de extensão .cgi na pasta Sites seja executado onde estiver.

Configure o arquivo /etc/apache2/users/username.conf dessa maneira (trocando sempre username pelo seu nome de usuário):

<Directory "/Users/username/Sites/">
    Options Indexes ExecCGI MultiViews FollowSymLinks
    AddHandler cgi-script .cgi
    AllowOverride All
    Order allow,deny
    Allow from all
    <IfModule dir_module>
        # Esse condicional não é necessário, mas é interessante,
        # ele faz com que também index.cgi possa ser índice, isto
        # é, seja a resposta ao solicitar a URL de seu diretório.
        DirectoryIndex index.html index.cgi
    </IfModule>
</Directory>

Virtual host

Podemos aproveitar e configurar um virtual host (um endereço [DNS], no caso http://devel, que é acessível por você e para quem você estiver servindo). No caso, usaremos apenas para o desenvolvimento local de websites em CGI. Crie um arquivo de nome qualquer (com extensão .conf) na mesma pasta do arquivo anterior, por exemplo /etc/apache2/users/devel.conf com o seguinte conteúdo:

<Virtualhost *:80>
    # Onde o root do site se encontra no sistema:
    DocumentRoot /Users/username/Sites/devel
    # Endereço URL pelo qual será acessível:
    ServerName devel
</Virtualhost>

E para que esse endereço seja visto como local, edite o arquivo /etc/hosts com seu editor preferido adicionando ao final:

# Desenvolvimento http://devel
127.0.0.1	devel

Para abrir o arquivo no editor padrão use o comando:

open /etc/hosts

Será requerida a senha de root ao salvar. Teste com um arquivo .html ou .cgi em http://devel.

Exemplos de arquivos CGI

Lembre-se de alguns detalhes:

  • Se a linguagem usada for interpretada, a primeira linha deve apresentar o caminho para o interpretador (ou com env) precedido de #!
  • Você deve sempre imprimir primeiramente o header (como o Content-Type) seguido de duas quebras de linha antes do conteúdo
  • Você deve tornar o arquivo executável (chmod +x)

[Os exemplos a seguir não estão otimizados, são apenas ilustrativos].

Bash

#!/bin/bash
# hello_bash.cgi

echo "Content-Type: text/html"
echo
echo "<html>"
echo "<body>"
echo "<h1>Hello Bash!</h1>"
echo "</body>"
echo "</html>"

Ruby

#!/usr/bin/env ruby
# hello_ruby.cgi

puts "Content-Type: text/html"
puts
puts "<html>"
puts "<body>"
puts "<h1>Hello Ruby!</h1>"
puts "</body>"
puts "</html>"

C

#include <stdio.h>

int main (void)
{
	printf("Content-Type: text/html\r\n");
	printf("\r\n");
	printf("<html>\n");
	printf("<body>\n");
	printf("<h1>Hello C!</h1>\n");
	printf("</body>\n");
	printf("</html>\n");
	return 0;
}

Go

package main 

import "os"

func main() {
	s := "Content-Type: text/html\r\n"
	s += "\r\n"
	s += "<html>\n"
	s += "<body>\n"
	s += "<h1>Hello Go!</h1>\n"
	s += "</body>\n"
	s += "</html>\n"
	os.Stdout.WriteString(s)
}

Divirta-se!

Categories: Informática Tags:

Academia vs Emancipação Educacional

June 12th, 2010 No comments

Em vias de terminar minha graduação, sinto-me impelido a louvar o fim. Digo, não porque terminei, eu, o curso, mas porque acabou-se, ela, a educação acadêmica. Faliu, ruiu, “findou-se a finalidade”, expirou-se a validade, pulverizaram-se as justificativas para esse monumento ao suplício intelectual. Queria meu dinheiro de volta, meus cinco anos de volta ou uma indenização por danos intelectuais. Se pudesse voltar no tempo, haveria investido em ensino a distância, pois quem sabe manter distância do ensino me resguardasse de seus danos. Mas dessa vez, não me refiro a nosso propriamente lastimável paisinho ou a uma local instituição, mas a um absurdo global.

Quando a Academia fundou-se em Platão, foi formulada de maneira a tornar o saber mais acessível do que sem ela (tanto o já conhecido como o que se haveria de desvelar) com os recursos de sua época. Ouso dizer que se Platão tivesse diante de si um computador com Internet, não hesitaria em fazer dele bom uso e promover uma dialética global. Mas a intenção de sua Academia degenerou-se… Agora ela é um lugar onde o saber é sofrido em vez de aprendido: deixou de ser o melhor acesso disponível ao saber e tornou-se um rito de passagem para a vida mercadológica; mergulhou-se numa falsa burocracia por conta da qual o homem nunca esteve tão distante de um saber tão próximo por outras vias.

A fim de garantir a mais-valia, a academia não só deixa de proporcionar o melhor acesso ao saber e ao pensar, mas também milita contra a emancipação da educação pela Internet. Não apenas deixa de usar os melhores recursos para disseminação das informações (computador, data show, intra e internet) como também não incentiva ou mesmo desqualifica projetos Wiki (Wikipédia, Wikicionário, Wikilivros, Wikiversidade) e afins.

Mas é claro que já que a emancipação é um tanto inevitável, uma tendência, digamos, “teleológica” do saber, é preciso fingir que os novos recursos foram apropriados pela academia, ou ficaria óbvio seu papel anti-educacional. Por outro lado, se os novos recursos fossem legitimamente assimilados, aí ficaria óbvio que os alunos não precisam mais de academia alguma senão para conseguir certificação legal e reconhecida no mercado do saber. Ou seja, que a certificação acadêmica é só uma outra versão do papel-moeda… E é. É preciso inflacionar o capital financeiro e deflacionar o capital intelectual, pois é no primeiro que se baseia nosso atual sistema econômico e os que dele mais se beneficiam (e o regem, é óbvio). [Vale lembrar que Economia é de bens e serviços, não a reduza ao plano financeiro].

Fique claro, meu discurso não é Maxista (detesto sua subjetividade pré-definida e monetizada felicidade), mas sou favorável à socialização do saber. Afinal, custaria tanto para o Estado dispor na Internet o material de estudo de todos os cursos acadêmicos? Por que tem isso de ficar a cargo da iniciativa privada?

Gostaria que houvesse uma instituição que só desse certificação sem “tentar ensinar” nada, sério. Imagine você poder estudar do seu jeito (mas com a referência da bibliografia base definida pela instituição) e então ir só fazer a prova (ou outras formas de avaliação) e ganhar o diploma?

“Ah, mas assim é muito fácil!” Porra, é essa a idéia! Não é pra ser difícil, é pra garantir que você sabe, apenas isso. Tá vendo como é rito de passagem? A gente acha cruel aquelas tribos que botam adolescentes pra mexer em colmeias para levar picadas e se tornarem “adultos”, mas não acha cruel colocar crianças e jovens décadas a fio em ruínas educacionais, aprendendo de maneira extremamente ineficaz, sendo punidas quando não se adequam, quando poderia ser fácil e divertido como um videogame, e ainda brigar com eles quando preferem ficar no computador em vez de estudar… Fala séeeerio!

Atualização 29/10/2010

O reitor (Doutor em direito João Grandino Rodas) da Universidade de São Paulo (USP), uma notável instituição de ensino do país, dá entrevista à Veja, concordando muito, a meu ver,  o com o conteúdo desse post e aponta alguns outros problemas sérios…

As universidades Brasileiras parecem amarradas pelos sindicalistas ou, quando não, pela ideologia subjacente a esses. Essa tradição pseudo-marxista luta de toda forma contra o desenvolvimento por entender a “meritocracia” como algo ruim e qualquer tentativa da universidade de se afinizar com o mercado é vista como “ameaça de privatização” (como aquele terrorismo no horário eleitoral). Assim, impedida de angariar investimento privado para promover a pesquisa, continua se apoiando desnecessariamente em impostos, no suor do contribuinte que muitas vezes nem está ligado à instituição. Trata-se dos idiotas de sempre… Diabolizam qualquer interesse empresarial e não concebem a possibilidade de o investimento em pesquisa ser algo bom para todo mundo. Cara, não há interesse do mercado destruir a Academia… (Eles querem gente qualificada). Ela própria parece estar perseguindo esse fim, obstinadamente, a ponto de o mercado ter de ignorar o diploma em favor de outros parâmetros.

Sabemos disso. No meu período no IFCS pude perceber a quantidade de gente medíocre em meio a poucos gênios (os quais considero realmente admiráveis) que fazem nada senão ficar encaixando velhas falácias socialistas em todos os eventos que se lhe apresentam e falar mal de qualquer um, em exercício ou ainda meramente capaz, de liderar ou promover qualquer ação efetiva no mundo real que não possa ser convertida num aforismo ridículo. E como toda boa religião, o socialismo se contorce à vontade em paradoxos tentando neutralizar ou se esquivar de qualquer evidência de eu erro em vez de aprimorar-se até mesmo jogando-se jocosamente das bordas da cognoscibilidade na falta de recurso último. Dogmáticos para umas coisas e céticos para outras… isto é, cínicos, desonestos.

[Aliás aproveito para dizer que não sou socialista ou capitalista (nem de centro), porque meu foco é outro. Ambos são sistemas econômicos - e não políticos - orietados ao capital financeiro. Mas economia e a política só fazem sentido se orientadas a idéias, recursos e valores (como entidades necessárias da ontologia da coisa). É uma ideia que eu gostaria de discutir melhor num post futuro, mas em linhas gerais traz ao gerenciamento do capital como algo inerente, mas secundário em vista o exercício pleno da atividade humana, propriamente humana. Não se trata de capitalizar ou distribuir o dinheiro, ele é sempre uma ficção útil (sempre orientado ao bem de alguém, de algum grupo ou, preferencialmente, da sociedade, e não "gera desigualdade", mas a evidencia), são ações do Estado, isto é, uma representação essencialmente relacional  da disposição de um indivíduo/grupo/instituição para com os demais e vice-versa. (Não é um pleonasmo, as representações são, em muito, socialmente relacionais, mas nem sempre consiste nisso sua essência. E há inclusive representações psicológicas não sociais). Basta notar que ele muda de valor a depender da disposição para obtê-lo (e da quantidade de unidades em giro) e também que sempre há uma ética (provavelmente hoje equivocada e caduca) pressuposta na economia. Não seria uma utopia ingênua... explico depois.]

Em suma, os inimigos da Academia transcendem a esfera acadêmica. Ao que parece, situação e oposição são o inimigo (até porque agora são o mesmo). É hora de mudar a forma de aprender, ensinar, pesquisar (mas certificar com rigor) por uma educação de escopo aberto, autônoma, acessível a todos via Internet e tecnologia. Eis o mar aberto… para além dos tentáculos do presidente molusco avesso à razão.

Categories: Filosofia, Informática, Psicologia Tags:

Fliptext em Go

May 11th, 2010 No comments

O programa “fliptext” em Go exercita as funcões básicas da linguagem e é um bom pretexto para vê-la funcionando. O programa recebe argumentos pela linha-de-comando e devolve o texto invertido (horizontal e verticalmente). Na verdade, é uma simples transposição de caracteres para outros da tabela UTF-8 que sejam ou pareçam os primeiros invertidos.

Esse post contém caracteres que não são corretamente visualizados em todos os navegadores e sistemas operacionais! Funciona perfeitamente em Chrome/Mac.

Por exemplo:
˙sopᴉʇɹǝʌuᴉ soɹᴉǝɯᴉɹd so ɯɐɔǝɹɐd no ɯɐɾǝs ǝnb 8-ɟʇn ɐlǝqɐʇ ɐp soɹʇno ɐɹɐd sǝɹǝʇɔɐɹɐɔ ǝp oɐɔᴉsodsuɐɹʇ sǝldɯᴉs ɐɯn ǝ ‘ǝpɐpɹǝʌ ɐu ˙(ǝʇuǝɯlɐɔᴉʇɹǝʌ ǝ lɐʇuozᴉɹoɥ) opᴉʇɹǝʌuᴉ oʇxǝʇ o ǝʌloʌǝp ǝ opuɐɯoɔ-ǝp-ɐɥuᴉl ɐlǝd soʇuǝɯnᵷɹɐ ǝqǝɔǝɹ ɐɯɐɹᵷoɹd o ˙opuɐuoᴉɔunɟ ɐl-ǝʌ ɐɹɐd oʇxǝʇǝɹd ɯoq ɯn ǝ ǝ ɯǝᵷɐnᵷuᴉl ɐp sɐɔᴉsɐq sǝõɔunɟ sɐ ɐʇᴉɔɹǝxǝ oᵷ ɯǝ ”ʇxǝʇdᴉlɟ“ ɐɯɐɹᵷoɹd o

Veja o código fonte:

/* Main stuff */

package main
import ("os"; "flag"; "strings")
func init() { flag.Parse(); loadList() }
func main() { os.Stdout.WriteString(FlipText(GetStr()) + "\n") }
func GetStr() string { return strings.ToLower(strings.Join(flag.Args(), " ")) }

/* Flip */

func FlipText(s string) string { // Função que faz a inversão do texto
	c := []int(s) // string para array de inteiros
	j := len(c)
	if h := j/2; j % 2 != 0 { c[h] = flipChar(c[h]) } // Se impar, inverte o central
	j--
	for i := 0; i < j; i, j = i+1, j-1 { // Inverte os carac. das extrem. p/ centro
		c[i], c[j] = flipChar(c[j]), flipChar(c[i])
	}
	return string(c)
}

func flipChar(i int) int { // Função que inverte um caracter
	if List[i] != 0 { return List[i] }
	return i
}

/* List */

var List = make(map[int]int) // Lista assoc. de carac.

func loadList() { // Carrega a lista de carac.
	for _, v := range strings.Split(strList1, "\n", 0) { // Unívocos
		if v != "" {
			arr := []int(v)
			List[arr[0]] = arr[2]
		}
	}
	for _, v := range strings.Split(strList2, "\n", 0) { // Biunívocos
		if v != "" {
			arr := []int(v)
			List[arr[0]], List[arr[2]] = arr[2], arr[0]
		}
	}
}

/* Pre-List */

// Unívocos
var strList1 = `
ã	ɐ
á	ɐ
à	ɐ
â	ɐ
é	ǝ
ê	ǝ
í	ᴉ
î	ᴉ
ó	o
ô	o
ú	n
ç	ɔ
4	h
5	s
`
// Biunívocos
var strList2 = `
a	ɐ
b	q
c	ɔ
d	p
e	ǝ
f	ɟ
g	ᵷ
h	ɥ
i	ᴉ
j	ɾ
k	ʞ
l	l
m	ɯ
n	u
p	d
q	b
r	ɹ
t	ʇ
u	n
v	ʌ
w	ʍ
y	ʎ
(	)
[	]
{	}
<	>
!	¡
?	¿
.	˙
,	'
_	‾
1	⇂
2	ᄅ
3	ᄐ
6	9
7	ㄥ
`

Compile:

# Em vez de 6... ajuste para sua arquitetura ( 5, 6 ou 8 )
6g fliptext.go
6l -o fliptext fliptext.6

E use pelo terminal assim:

./fliptext <um texto qualquer>

Por exemplo:

./fliptext 'gostou?'

¿noʇsoᵷ

Categories: Informática Tags:

A famíla privada

March 29th, 2010 1 comment

Como todo tema interessante, é vasto. Para ir direto ao ponto, considerarei patente que outros modelos familiares são viáveis (como, por exemplo, o modelo aristocrático) e tão legítimos quanto nosso modelo atômico burguês, o modelo freudiano. Cada tipo de família tem suas características distintivas que acarretam em diferenças noutras dimensões sociais como a educação, a economia e a política. O modelo familiar é amiúde ajustado ao modelo geral em que está inserido como uma espécie de estágio preparatório para esse; uma articulação micro/macro. Assim, a família preserva em si o gérmem de todo o conflito nacional inclusive suas sinistras sutilezas.

Uma das coisas que mais me intriga na família é sua estrutura neurótica, isto é, os “motivos” e a maneira pela qual evita melhorar. É um tabu de verdade, maior até do que o tema da sexualidade na família, a discussão dos critérios com que se desenham os papéis familiares como um todo; com que se compõe a relação de poder familiar em todos os aspectos. Quer uma amostra da amplitude desse poder? Veja se durante a discussão do tema você não sente como se estivesse discutindo “assuntos de criança”. Como se não houvesse mais motivo para entender como a vida familiar se desdobra e se define e como poderia ser melhor. Afinal, você já está passando da classe dos filhos para a classe dos pais, não é mesmo?. Por que se preocupar?

Exato, luta de classes. Não poderia ser diferente numa família capitalista. O cidadão é feito de capacho no trabalho, chega em casa e trata os filhos como? Como se fosse chefe, é claro. É uma relação orientada ao/pelo capital. Veja como a propriedade privada é o elemento definitivo dessa rede simbólica:

- Por que tem que ser assim?
- Porque a casa é MINHA.

- Quando vou poder escolher que as coisas sejam como acho melhor?
- Quando você tiver a SUA casa.

- Isso não é justo!
- Quando você tiver os SEUS filhos, você “escolhe” o que acha justo fazer com eles.

Você não acha que seria muito difícil o cidadão aceitar o assédio moral no trabalho se isso já não houvesse ocorrido em sua própria família? O poder de decisão está vinculado desde a relação familiar à propiedade privada e a criança, refém da situação, acaba por assimilar essa estrutura mantida por anos a fio. A influência desse modelo é multiplicada na família freudiana, pois a criança não tem outras fontes de identificação (diferentemente da aristocrática ou a agora promovida pelo advento da Internet). Há portanto um monopólio sentimental e de identificação que multiplica a efeito das ações cruéis.

A ideologia dos pais é então delineada nesses termos…

Trivialização do saber: “Já fomos crianças e sabemos tudo que passa na cabeça dos filhos e podemos antever tudo”.
Acordo proteção/submissão: “Seremos bonzinhos com vcs se fizerem o que mandarmos, protegeremos vcs do mundo e de nós”.
Anulação da subjetividade: “Nossos planos para nossos filhos são melhores do que quaisquer que eles possam ter. Basta que se enquadrem”.

Se você estiver com dificuldades de entender por que alguém não pode fazer o que quer com os demais por que lhe cabe numa relação [dentre outras coisas] a parte financeira, basta lembrar do consagrado exemplo de abuso por parte de maridos machistas quando os homens dominavam o mercado. Curioso é que as mulheres tenham lutado por seus direitos e mesmo assim [muitas vezes] não compreendam que fazem [frequentemente] o mesmo com os filhos.

O capitalismo tem suas contrariedades. É um regime que estimula atitudes paradoxais: de um lado estimula que se capitalize, isto é, junte recursos, po outro estimula que se desperdice com supérfulos [carro do ano etc] que inclusive atrapalha que se junte recursos. Não é a catalização que faz o capitalismo, mas a alternância entre os atos de juntar e dispersar recursos; é o que move o motor. A relação familiar, em reflexo, tem suas contrariedades. Em vez de se ajudar como um time em prol de todos, tende a simplesmente reproduzir internamente o modelo competitivo e hostil inadequado para a própria finalidade estipulada (o bem e a autonomia dos membros).

No Brasil, para complicar ainda mais, temos um mercado [ordinário] incapaz se assimilar seus formandos e, pior, limitado a atividades não muito sofisticadas [excelentes profissionais não tem lugar aqui]. Esse curioso fator é reproduzido também na família que injuria caricaturalmente ou diretamente tanto os que não conseguiram engajar-se no mercado quanto os que preferem se qualificar mais a fim de, ao atira-se nas engrenagens do sistema, esteja pleno em competência para fazê-lo e não venha mais a se re-desgastar em desgastadas relações familiares [eu!]. Essas caricaturas são tentáculos ideológicos que habitam como memes a cultura nacional e que acionados por familiares são capazes de ferir intensamente [pelo acúmulo de investimento sentimental causado pelo claustrofóbico convívio] e provocar sérias brigas.

Para lidar com esses problemas é preciso entender sua maneira de ser e acontecer e é a isso que me propus nesse texto em pequena dose. Essa “utopia” de família colaborativa não me parece tão distante… para mim.

;-)

Categories: Filosofia, Psicologia Tags:

ControllerMate v4 + PS3 Joystick

March 28th, 2010 1 comment

Comprei um gamepad PS3-like com porta normal e USB para fazer umas experienciazinhas no Mac… Fuçando no YouTube achei tutoriais sobre o ControllerMate que é um programa para manipular a entrada de drivers. Você “programa” num ambiente de fluxograma como cada imput é “traduzido”. Por exemplo, se você tem um jogo cujas teclas de locomoção do personagem são “W”, “A”, “S” e “D” você pode fazer como que o gamepad seja reconhecido como se você estivesse usando o teclado.

ControllerMate

Para testar desenhei uma configuração para jogar Duke Nukem 3D – que admito estar um luxo. Para usá-la, compre um gamepad/joypad, instale o driver pra mac, compre o programa ControllerMate (ou escreva para o Papai Noel) e importe minha configuração.

Veja a configuração do Duke:

O primeiro grupamento no fluxograma refere-se ao eixo vertical do controle analógico esquerdo. O bloco preto é o input do gamepad, o abaixo é o calibrador (um recurso do programa que faz uma regrinha de três entre as faixas de valores entrada/saída). Há um comparador de igualdade entre uma constante numérica (o valor esperado) e o valor de saída do calibrador. Sim, é uma versão estranha do “if”.

O resultado é que quando você inclina o controle analógico para cima retorna-se o equivalente a “seta para cima” do teclado, e quando enclina para baixo retorna-se “seta para baixo” e quando está no meio não retorna nada. Os três primeiros grupamentos tem a mesma função: um para analógico esquerdo vertical, outro para analógico direito horizontal e o terceiro para analógico esquerdo horizontal.

Esse quarto grupamento define que se os dois controles analógicos forem pressionados simultaneamente como botões – e vc estiver fora do jogo – ele será iniciado.

Tudo isso foi para trocar de armas pelo R1 e R2, aqueles botõezinhos lá atrás. Aquele item central é um contador que varia de 1 a 10 e que ao pressionar R1 você incrementa e R2 decrementa e ao pressionar ambos simultaneamente o valor é resetado para 1. Esses item em redor são comparadores com constantes que em caso positivo “pressionam” a tecla numérica referente ao número no teclado (com excessão do 10 que aciona o 0).

Aqui é bem simples, a maioria são correlações simples entre botões do gamepad e do teclado com excessão daqueles amarelos que referem-se ao “mouse virtual”. O item retangular em cima à direita é um ajuste entre o eixo vertical do controle analógico direito que simula o mouse aim (que deve ser precedido pelo clique no botão central do gamepad [Analog] equivalente ao U).

Não me pareceu possível por todos os comandos do jogo no gamepad de forma interessante, então selecionei os mais usados, mas deixe o teclado por perto ao jogar. Aqui vão os comandos no gamepad para o jogo.

Gamepad/Joypad

Gamepad Ação
Seta para cima/baixo Ir para frente/trás
Seta para esquerda/direita Virar para esquerda/direita
Analógico esquerdo vertical Ir para frente/trás
Analógico esquerdo horizontal Ir para esquerda/direita
Analógico esquerdo para o fundo Abrir porta, mover alavanca etc
Analógico direito vertical Inclinação vertical (mouse aim) [requer Analog]
Analógico direito horizonta Virar para esquerda/direita
Analógico direito para o fundo Atira
Xis Atira
Triângulo Chuta
Quadrado Pula
Bola Abaixa
Select Esc
Start Enter
Analog Ativar Inclinação vertical
R1 Passar para próxima arma
R2 Passar para arma anterior
R1 + R2 Primeira arma, pistola
L1 Inclinar para cima
L2 Inclinar para baixo
Analógico esquerdo + Analógico direito para o fundo Iniciar jogo no Mac

Bom jogo!

Categories: Informática Tags: ,

Como embutir imagem no HTML (Utilitário em Ruby e Go)

March 25th, 2010 1 comment

Às vezes você gostaria de embutir uma imagem diretamente no código da página sem ter de “linkar” para outro arquivo. Isso é útil quando você precisa por tudo num só arquivo .html (por exemplo quando resolver fazer um daqueles joguinhos em javascript ou simplesmente reduzir o número de requisições ao servidor [quando a imagem é usada numa só página, raro]). É o mesmo sistema para envio de imagens por e-mail.

Para tal, se quiser fazer manualmente, é assim:

<img src="data:<mime-type>;base64,<base64-data>" \>

Sendo o <mime-type> algo como “image/gif” [o tipo MIME] e a <base64-data> os dados da imagem.

Por exemplo:

<img src="data:image/gif;base64,
R0lGODlhDwAPAMQSAAAAAFr/zu+cKe+lIe+tIfdrGPd7IfeMIfe1Ife9GPfO
GP/eEP/nEP/vCP/3CP//AP//CP///1n/yAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAFn/yCH/C05FVFNDQVBFMi4wAwEAAAAh+QQFEAAS
ACwAAAAADwAPAAAFVqAkikBZjqhUPix7ogDUzg8wAoyzuoBLKoAGpNer1VQJ
hYIhpPEIpmi0BhAAIthslli9arVcg/eLJarE5EjMpiqgwTl2WxxVLOQkgOEg
GCBeKSpRKSEAACH5BAUQABIALAAAAAAPAA8AAAUnoCSOZGmeJgCM6glAzwo8
scmIj5Trper/LVJkSCSijsikcslsOpshADs=" />

Cujo resultado será a imagem:

Para codificar uma imagem para o formato base64 você pode usar a função base64_encode() em PHP ou Base64.encode64() em Ruby.

Para tornar a minha vida mais fácil, e de quebra a sua, eis uns mini aplicativos para fazer o trabalho chato…

Versão Ruby

#!/usr/bin/env ruby -wKU

# by Daniel Mazza (http://creativecommons.org/licenses/by-nc/2.5/br/)

require "rubygems"
require "base64"
require 'open-uri'

ext = ARGV[0].split(".").last.downcase

img_same = %w(bmp gif ief jpeg tiff)
img_mime = {
  /cod/    => 'cis-cod',
  /jp[eg]/ => 'jpeg',
  /jfif/   => 'pipeg',
  /svg/    => 'svg+xml',
  /tif/    => 'tiff',
  /ras/    => 'x-cmu-raster',
  /cmx/    => 'x-cmx',
  /ico/    => 'x-icon',
  /pnm/    => 'x-portable-anymap',
  /pbm/    => 'x-portable-bitmap',
  /pgm/    => 'x-portable-graymap',
  /ppm/    => 'x-portable-pixmap',
  /rgb/    => 'x-rgb',
  /xbm/    => 'x-xbitmap',
  /xpm/    => 'x-xpixmap',
  /xwd/    => 'x-xwindowdump'
}

if ARGV[1].nil?
  if img_same.include?(ext)
    mime = ext
  else
    img_mime.each do |r,m|
      if r =~ ext
        mime = m
        break
      end
    end
  end
else
  mime = ARGV[1]
end

img = Base64.encode64(open(ARGV[0]).read)

puts "<html><head><title>#{ARGV[0]}</title></head><body>\n\n"
puts "<img src=\"data:image/#{mime};base64,\n#{img}\" />"
puts "\n</body></html>"

O resultado será um arquivo html com exemplo de uso da imagem. Copie a tag <img> do código fonte e use como quiser.

Modos de uso do aplicativo:

1 – Salve num arquivo com extensão .rb (exemplo: imghtml.rb) e use assim pelo terminal:

ruby imghtml.rb pasta/imagem.gif > img.html

Assim você estará codificando a imagem “imagem.gif” na pasta “pasta” e salvando o resultado no arquivo “img.html”.

2 – Salve num arquivo sem extensão (exemplo: imghtml) [e dê um chmod +x imghtml pelo terminal para que se torne executável] e use assim pelo terminal:

./imghtml pasta/imagem.gif > img.html

3 – Se desejar usá-lo como um comando do sistema, salve-o numa pasta bin do $PATH, por exemplo “/usr/local/bin” e então use-o assim:

imghtml pasta/imagem.gif > img.html

Versão Go

Ao contrário do que eu esperava – por se tratar de instrumento de precisão, uma system language – o código em Go ficou bem menor (e como já esperava, bem melhor). Isso pela falta de uma biblioteca MIME x Extensão em Ruby.

Aí vai:

// by Daniel Mazza (http://creativecommons.org/licenses/by-nc/2.5/br/)

package main

import (
	"bytes"; "io/ioutil"; "flag";
	"encoding/base64"; "os"; "mime"; "path"
)

func main() {
	flag.Parse()
	img, _ := ioutil.ReadFile(flag.Arg(0))

	bb := &bytes.Buffer{}
	enc := base64.NewEncoder(base64.StdEncoding, bb)
	enc.Write(img)
	enc.Close()

	var m string

	switch {
	case flag.Arg(1) == "":  m = mime.TypeByExtension(path.Ext(flag.Arg(0)))
	default:                 m = "image/" + flag.Arg(1)
	}

	os.Stdout.WriteString("<html><head><title>" + flag.Arg(0) + "</title></head><body>\n\n" +
		"<img src=\"data:" + m + ";base64," + bb.String() + "\" />" +
		"\n\n</body></html>\n")
}

Compile:

6g imghtml.go; 6l -o imghtml imghtml.6

E use conforme as maneiras 2 e 3 já citadas.

Bom proveito

O mascote da Go ;-)

Categories: Informática Tags: , ,

Psicologia – A ciência anti-natural

March 10th, 2010 No comments

A psicologia hoje tem muitos problemas e, consequentemente, eu enquanto estudante da área tenho ainda mais. Se por um lado me angustio de estar imaturo quanto à big picture desses problemas e suas possíveis soluções, por outro me alivio de saber que ela mesma – a ciência, ou quase, psicologia – também está imatura e que não é um problema só meu. E mais: a imaturidade não constitui, nesse caso, ilegitimidade de aplicação/investigação(1), mais justamente um motivo para realizá-la uma vez que o objeto é claramente real e sua lida urgente.

Superando [ou negligenciando por hora] a questão ética da aplicação técnica de uma imatura ciência, cogitemos sobre a dimensão mais interessante da questão: a teoria. Tanto quanto se queira aprofundar-se na etimologia dos termos “confusão” e “complicação” mais os consideraremos adequados a referirem-se ao estado de nossa novíssima ciência do objeto antiquérrimo, psicologia/psique. Não sem razão… Voltar os olhos do observador sobre si mesmo gera estranhos e interessantes problemas epistemológicos que, para além da vulgata científica, ou mesmo de sua profunda investigação, desafiam a mente, pois ao fazer da mesma objeto de si faz irromper paradoxos diversos ["por um espelho diante de outro não facilita ver o espelho"] e demais questões filosófico-científicas até então negligenciáveis, mas não mais.

Assim, sinto-me desafiado [e vacilante] em filosofando por teorias nunca d’antes levadas a sério para tentar dar conta desse estranhíssimo objeto – nós.

Verborragia à parte, principiemos o lancinante e tedioso trabalho de penetrar às estruturas mentais – desenhadas pela Natureza para esconderem-se do pensante, “a fim de”* não se tornar objeto, “a fim de”* não provocar o conflito que hora procuramos.

Um dos problemas mais sérios – pois ameaçam pragmaticamente/politicamente a própria investigação – é a maneira com que hoje ela se parece comportar, digamos, “arredia” e “magoada” com as demais ciências e com a filosofia em especial com a epistemologia e a lógica. Confesso que não me faltam gargalhadas quando ouço psicólogos falarem desses temas… E confesso que não me faltam lágrimas quando filósofos e cientistas de outras áreas me fazem lembrar os motivos porque a psicologia se magoou e tornou arredia.

Superando [ou negligenciando, novamente, por hora] a questão política da inserção da Psicologia no panteão das coisas sérias, retornemos a cogitar sobre a dimensão mais interessante da questão: a filosofia em si, não sua nefasta trama ontológico-política.

Voltemos às origens… Não reinventemos a roda, mas a redescubramos. As rodas, as engrenagens, os ossos, os nervos, os músculos… e o resultado simbólico disso tudo que supera em muito a possibilidade de dedução biológica ou ainda meramente comportamental.

Uma analogia que funciona bem para estabelecer esse conceito de inviabilidade(2) de dedução simbólica a partir, puramente, da materialidade [sem que se advogue a ridícula possibilidade de existencia de uma alma sobrenatural] é a de um computador. O computador é, obviamente, inteiramente físico, porém… O que aparece no monitor e o que fazemos com o mouse e teclado, poderíamos chamar de ‘simbólico’, não?

Agora imagine que você vai fazer um tutrial sobre seu editor de texto predileto. Você será bem sucedido se seu tutorial permitir que, tão simplesmente quanto possível, o usuário possa reconhecer o programa quando o vir, entenda como abrí-lo, como ele funciona, as maneiras de interagir com ele e os resultados que ele pode produzir a depender da maneira que se lide com ele. Para isso, você tem duas alternativas principais:

A – Criar um documento com fotos, esquemas, tópicos e subtópicos, um passo-a-passo para cada ação principal etc.

B – Descever como um computador funciona desde o hardware e todas as camadas simbólicas (firmware, assembly, kernel, sistema operacional) até o software em si. Descrever o que acontece ao clicar numa tecla (como o sinal é acionado eletricamente, como é recebido e traduzido para um número relativo a uma tabela de caracteres e capturado em seu editor) ao mover e clicar com o mouse, como tudo isso é traduzido para uma matriz simbólica e exposto e atualizado na tela etc etc etc.

Se a idéia era usar o programa, me parece que a alternativa A é mais bem-sucedida. Ok, aceitamos que a psicologia não é um subcampo da biologia ou medicina, mas se ela for exatamente como a alternativa A, talvez possamos ajudar as pessoas, mas de forma superficial, creio. Seria como um curso técnico de psicologia, o que temo muito que venha a ocorrer… Então, proponho uma alternativa C (intermediária) na qual tanto aprendamos a lidar com a pragmática da psique quanto entender o bastante sobre o que está acontecendo mais profundamente.

Outro problema sério que enfrentamos é a ética. Ética para além do plano normativo, diria metaética. Dentre as diversas questões podemos assinalar:

[o texto está ainda um tanto jogado, mas pretendo tratá-lo mais carinhosamente principalmente a partir desse ponto em breve]

Meta-éticas

A – Até que ponto temos o direito de conduzir o paciente ao que é bom para ele?
A1 – Como sabemos o que é bom para ele?
A2 – Como sabemos que sabemos o que é bom para ele? E isso, como sabemos? Ad infinitum…

B – Como sabemos como conduzir o paciente ao que é bom para ele?
B1 – Como sabemos que é a maneira mais adequada?
B2 – Como sabemos que sabemos qual a maneira adequada? E isso, como sabemos? Ad infinitum…

C – Como sabemos se a necessidade de intervenção é legítima?

D – Como sabemos se nossa ação enquanto psicólogos é adequada à necessidade?

Epistemológicas

A – Como definir um algorítimo de inferência da situação atual com relação a um modelo?
B – Como distinguimos um modelo da dinâmica da psique válido de um inválido?
C – Como distinguimos um modelo da dinâmica da psique verdadeiro de um falso?
D – Como distinguimos um modelo da dinâmica da psique útil de um trivial?
E – Como dirigimos a pesquisa na psicologia?
F – Como definimos o objeto da psicologia?
G – Como formalizamos (definimos, clara, precisa e francamente) e testamos o saber na psicologia?
H – Como formalizamos (definimos, clara, precisa e francamente) testamos o saber em geral?
I – Como fornalizamos e testamos?
J – Por que formalizar e testar?
K – O que é a formalização e teste?
L – Como saber e ter certeza?
M – O que é o saber e a certeza?

Pragmáticas

A – Como aplicar corretamente um algorítimo de inferência da situação atual com relação a um modelo?
C – Como definir e executar um plano de ação a partir da situação atual do paciente?

Multi-disciplinares
A – Qual o valor das atuais abordagens teóricas da psicologia?
B – Qual a contribuição de cada abordagem teórica?
C – Qual o panorama de atuação atual da psicologia hoje e como poderia ser melhor?
D – Como a Psicologia pode se inserir e atuar no contexto político-econômico-social?
E – Como a psicologia pode usufruir dos demais saberes?
F – Como progredir na pesquisa em psicologia?
G – Qual a relação atual e como poderia poderia melhorar a relação entre psicologia e os demais saberes?

Se você for estudante de psicologia e nunca se houver perguntado essas coisas, espero que esteja sentindo um frio na espinha.

Acredito que a solução de um problema é, em geral, um passo trivial após sua boa análise. Assim, a maior parte do tempo pretendo nesse blog analisar cada problema escrupulosamente – e outros – para muitos dos quais ainda não há uma boa solução. Se você curtir minha verborragia arrogante e minhas nerdices em geral, sinta-se convidado a ler vez por outra meu blog. :-)

1 – Uma boa parte da investigação, no nosso caso, ocorre na própria intervenção.
2 – Inviabilidade dos recursos, no sentido de ser mais fácil e mesmo seguro por outra via.
*A lida da Natureza com informações presentes, assim como nós fazemos, é intrigante o bastante para parecer calcular à frente, sendo ou não fato. Seja como for, funciona pensar por hora como se fosse até que se irrompa o conflito.
Categories: Psicologia Tags: