Archive

Author Archive

Como computadores enlouquecem (AI)

January 15th, 2012 No comments

[Publicação de brainstorm, não texto argumentativo]

Ontem entendi por acidente porque o sujeito “enlouquece” numa solitária (enquanto pensava sobre inteligência artificial).

Partindo de onde achei a coisa… O que aconteceria com dois AI-bots conversando entre si se o pensamento deles tivesse funcionamento semelhante ao nosso e eles não tivessem mais acesso a dados do mundo real?

Antes, deixe-me expor um ponto. O pensamento é criativo… Se você puser um macaco com fome num ambiente com uma banana suspensa e uma cadeira disposta perto, ele fatalmente vai usar a cadeira para alcançar a banana. Apesar de ser uma ideia muito simples, o poder computacional necessário para se fazer a mesma coisa seria enorme… [A não ser obviamente que fosse um programa específico para alcançar objetos em lugares altos usando-se elementos disponíveis no chão, né? Digo um meta-algoritmo geral]. Não há qualquer ligação entre o significado de banana e o de cadeira que pudesse ser aproveitada num raciocínio analítico (fora alguma galhofa que você quiser pensar) para que o resultado fosse calculado de modo simples. É um flagrante do pensamento que extrapola a experiência. [Tenho suspeitas de como isso se dá, mas seria material de outro post. Deixemos amadurecer mais...].

A questão é: se o pensamento tem um algoritmo criativo [vai além da mera compreensão dos objetos ao redor] podendo inclusive simular ambientes físicos e verificar a viabilidade de se executar uma ação num ambiente imaginário, como impedir que o pensamento continue criando independentemente da realidade levando o sujeito/bot à explosão arbitrária de raciocínios triviais? Noutras palavras, como calcular a economia do raciocínio?

Minha conclusão temporária é que a mente sempre raciocina e cria – com ou sem dados da realidade. Se alguém é privado da rica experiência da realidade, com o tempo, ela, na falta de dados exteriores, procura otimizar os dados que já tem. Mas isso tem um risco, pois se o sujeito tem uma visão equivocada sobre o mundo real essa idéia vai se tornar mais forte em cativeiro. Ou mesmo uma ideia verdadeira, mas de importância menor pode ganhar peso desproporcional quando o sujeito se expõe somente a ela.

Numa solitária, não há bastante dados sobre o mundo. Assim, a mente continua funcionando e criando sem eles levando o sujeito à loucura (temporária ou não) já que a mente começa a criar a partir apenas do vazio e do que já tem. Ocorre, então, um círculo vicioso do pensamento que degenera a mente quanto às suas funções normais.

Ah, sobre os AI-bots, creio que aconteceria o mesmo: enlouqueceriam – se eles não houverem sido melhor desenhados do que fomos nós pelo acaso.

Categories: Filosofia, Informática, Outros, Psicologia Tags:

Às meninas aladas

December 18th, 2011 No comments

Morou por tanto tempo dentro daquela flor que já não cria existir o lado de fora. Não havia um mundo, não havia outras fadas ou zangões, nem sequer havia outras flores; não no seu coração que se tornara pequenino, menor do que sua flor-morada.

Três alternativas: o nada, o absurdo e o tempo.

O nada é apenas a exclusão das demais: fuga abstrata para dentro de si, ou do vazio (os excessos da vida que transbordam pela figura da morte). O tempo, para ela, esterilizou-se… com o passar. Já não trazia novidade. Portanto, as duas opções se tornaram igualmente nulas. Daí o absurdo surgiu como a escolha mais lógica, ou a única. O absurdo aparece como a novidade que não pode ser reduzida à rearticulação das velhas coisas.

Se foi desabrochando na pequena fada a vontade de entrar no lado de fora. Até que, vacilante, rompeu por dentre as pétalas e encontrou as coisas reais: não eram nem um sonho nem um nada, mas interessantes.

Na verdade o sonho e o nada estavam nela – os podia criar quando quisesse -, mas as coisas e a gente estavam no mundo, bem como as novas possibilidades de anular ou sonhar.

Voou para procurar a si mesma em seu lago-natal – Lago dos Sátiros – e lá pôde encontrar o que buscava; ou retomar o que perdera; ou alcançar o novo: na imagem refletida. O mundo é o laço entre o nada e o sonho, entre esses meus dois lados – cogitou admirando-se.

Não é estranho? Porque preciso realizar algo para conquistar minha própria aprovação? …e preciso ir a algum lugar para recobrar minha própria identidade?

É absurdo… mas é real. Preciso de um espelho para me ver e de um mundo para viver. Não pode a gente fazer de si o próprio mundo – ou ver no mundo a pura continuação de si -, pois se recai sempre no calabouço da existência, na autofagia evolutiva,  na armadilha de Darwin e na necessidade da escolha que no meu caso, se acaba trancando por dentro. Só se pode transcender de algo, não do vazio, não de si, apenas. Pois o outro não é outra modalidade do mesmo. Se ambos: eu e o mundo, algo e o nada, o mundo e o nada fossem o mesmo, haveria ainda do que se esconder?

Mas a realidade não é estática como esse lago sereno, como revelação do que há para além do sujeito que observa e independentemente dele. A realidade (interessante) nasce da conjunção entre mim (e a gente) e o mundo. Como temeria encontrar meus pesadelos no mundo se eles já não estivessem em mim de algum modo? O mesmo se diz dos sonhos… Eu tenho as figuras desbotadas, mas a realidade as preenche com cores revitalizantes. Ela tem essa força que me escapa, a de arbitrar sem motivo. Já eu estou presa no sentido, não consigo escolher como a verdade se dá, como a realidade de doa, mas sim como desfruto o que vem.

O absurdo é: a coincidência entre o que é e o que não deveria ser; o terrível espetáculo do inesperado; o convite para o jogo compulsório do ser, sempre p’ra valer.

Então lembrou-se porque fora esconder-se na flor quando lhe ardeu o ciúme das ninfas e sátiros. Eles não voam, mas parecem completos, e parecem bem. O que é isso, o ciúme? Seria penetrar à felicidade alheia sem querer? Ou à aparência da felicidade alheia? Afinal, podem, eles, ser felizes sem mim? Se alguém for feliz sem mim, significa que falhei? Sentir isso é pior do que trancar-se novamente para sempre. Na verdade, sentir isso é justamente trancar-se para sempre… do lado de fora de si. Há saída?

Para todo lado, menos na direção que olho fixamente… De fato, a decisão de romper e sair permanece: jamais deixei a flor. Nesse instante, ela acorda e vê que não saiu mesmo. As pétalas iluminadas indicam o nascer do novo dia. Mas ela teme o mundo – ou teme jamais caber nele – e fica lá para sempre.

E é por isso que algumas flores nunca desabrocham, porque alguma fada esconde-se lá por ciúme em vez de voar.

- Daniel Mazza

Categories: Arte Tags:

JavaScript “read-only” Object

September 22nd, 2011 No comments

This is yet the best hack I found…

function A () { // context container

	var privateA = 'XYZ';

	function B () {

		var privateB = 'xyz';

		this.v1 = 1;
		this.v2 = 'b';
		this.f1 = function () { return privateA; };
		this.f2 = function () { return privateB; };
	}

	var newB = new B();

	for (i in newB) arguments.callee[i] = newB[i]; // copy B methods to A

	return arguments.callee;
};
A(); // initialize

A.v1;   //=> 1
A.v2;   //=> "b"
A.f1(); //=> "XYZ"
A.f2(); //=> "xyz"

A.v1;     //=> 1
A.prototype.v1 = 2; // no effect
A.v1;     //=> 1
A.v1 = 2; // A.v1 changed...
A.v1;     //=> 2
A();      // regenerate...
A.v1;     //=> 1 // original content

A.v3 = 'whatever';
A();
A.v3 //=> "whatever"

A.f1(); //=> "XYZ"
A.f1 = function () { return 'Oh, no! The public function is lost...' };
A.f1(); //=> "Oh, no! The public function is lost..."
A();    // come on, baby
A.f1(); //=> "XYZ" // :-) 

Have fun

Categories: Informática Tags:

Anonymous vs NATO (Otan)

June 15th, 2011 No comments

Pessoal, eis um fato digno de nota.

Recentemente um grupo de hackers ativistas chamados “Anonymous” (anônimos) foi considerado, pelo governo americano, “uma ameaça ao governo e ao povo” pois Anonymous cooperaram com a WikiLeaks sobre as informações secretas vazadas do governo americano.

Envio a vocês agora a maravilhosa resposta de Anonymous para OTAN:

Saudações, amigos da Otan. Nós somos a Anonymous

Em uma recente publicação, vocês destacaram o Anonymous como ameaça ao ‘governo e ao povo’. Vocês também alegaram que sigilo é ‘um mal necessário’ e que transparência nem sempre é o caminho certo a seguir.

O Anonymous gostaria de lembrá-los que o governo e o povo são, ao contrário do que dizem os supostos fundamentos da ‘democracia’, entidades distintas com objetivos e desejos conflitantes, às vezes. A posição do Anonymous é a de que, quando há um conflito de interesses entre o governo e as pessoas, é a vontade do povo que deve prevalecer.  A única ameaça que a transparência oferece aos governos é a ameaça da capacidade de os governos agirem de uma forma que as pessoas discordariam, sem ter que arcar com as consequências democráticas e a responsabilização por tal comportamento.

Seu próprio relatório cita um perfeito exemplo disso, o ataque do Anonymous à HBGary (empresa de tecnologia ligada ao governo norte-americano). Se a HBGary estava agindo em nome da segurança ou do ganho militar é irrelevante – suas ações foram ilegais e moralmente repreensíveis. O Anonymous não aceita que o governo e/ou  os militares tenham o direito de estar acima da lei e de usar o falso clichê da ‘segurança nacional’ para justificar atividades ilegais e enganosas. Se o governo deve quebrar as leis, ele deve também estar disposto a aceitar as consequências democráticas disso nas urnas. Nós não aceitamos o atual status quo em que um governo pode contar uma história para o povo e outra em particular. Desonestidade e sigilo comprometem completamente o conceito de auto governo. Como as pessoas podem julgar em quem votar se elas não estiverem completamente conscientes de quais políticas os políticos estão realmente seguindo?

Quando um governo é eleito, ele se diz ‘representante’ da nação que governa. Isso significa, essencialmente, que as ações de um governo não são as ações das pessoas do governo, mas que são ações tomadas em nome de cada cidadão daquele país. É inaceitável uma situação em que as pessoas estão, em muitos casos, totalmente não cientes do que está sendo dito e feito em seu nome – por trás de portas fechadas.

Anonymous e Wikileaks são entidades distintas. As ações do Anonymous não tiveram ajuda nem foram requisitadas pelo WikiLeaks. No entanto, Anonymous e WikiLeaks compartilham um atributo comum: eles não são uma ameaça a organização alguma – a menos que tal organização esteja fazendo alguma coisa errada e tentando fugir dela.

Nós não desejamos ameaçar o jeito de viver de ninguém. Nós não desejamos ditar nada a ninguém. Nós não desejamos aterrorizar qualquer nação.

Nós apenas queremos tirar o poder investido e dá-lo de volta ao povo – que, em uma democracia, nunca deveria ter perdido isso, em primeiro lugar.

O governo faz a lei. Isso não dá a eles o direito de violá-las. Se o governo não estava fazendo nada clandestinamente ou ilegal, não haveria nada ‘embaraçoso’ sobre as revelações do WikiLeaks, nem deveria haver um escândalo vindo da HBGary. Os escândalos resultantes não foram um resultado das revelações do Anonymous ou  do WikiLeaks, eles foram um resultado do conteúdo dessas revelações. E a responsabilidade pelo conteúdo deve recair somente na porta dos políticos que, como qualquer entidade corrupta, ingenuinamente acreditam que estão acima da lei e que não seriam pegos.

Muitos comentários do governo e das empresas estão sendo dedicados a “como eles podem evitar tais vazamentos no futuro”. Tais recomendações vão desde melhorar a segurança, até baixar os níveis de autorização de acesso a informações; desde de penas mais duras para os denunciantes, até a censura à imprensa.

Nossa mensagem é simples: não mintam para o povo e vocês não terão que se preocupar sobre suas mentiras serem expostas. Não façam acordos corruptos que vocês não terão que se preocupar sobre sua corrupção sendo desnudada. Não violem as regras e vocês não terão que se preocupar com os apuros que enfrentarão por causa disso.

Não tentem consertar suas duas caras escondendo uma delas. Em vez disso, tentem ter só um rosto – um honesto, aberto e democrático.

Vocês sabem que vocês não nos temem porque somos uma ameaça para a sociedade. Vocês nos temem porque nós somos uma ameaça à hierarquia estabelecida. O Anonymous vem provando nos últimos que uma hierarquia não é necessária para se atingir o progresso – talvez o que vocês realmente temam em nós seja a percepção de sua própria irrelevância em uma era em que a dependência em vocês foi superada. Seu verdadeiro terror não está em um coletivo de ativistas, mas no fato de que vocês e tudo aquilo que vocês defendem, pelas mudanças e pelo avanço da tecnologia, são, agora, necessidades excedentes.

Finalmente, não cometam o erro de desafiar o Anonymous. Não cometam o erro de acreditar que vocês podem cortar a cabeça de uma cobra decapitada. Se você corta uma cabeça da Hidra, dez outras cabeças irão crescer em seu lugar. Se você cortar um Anon, dez outros irão se juntar a nós  por pura raiva de vocês atropelarem que se coloca contra vocês.
Sua única chance de enfrentar o movimento que une todos nós é aceitá-lo. Esse não é mais o seu mundo. É nosso mundo – o mundo do povo.

Somos o Anonymous.
Somos uma legião.
Não perdoamos.
Não esquecemos.
Esperem por nós…

Fontes:

http://blogs.estadao.com.br/link/do-anonymous-para-a-otan/
http://anonnews.org/?p=press&a=item&i=1001

PS: Nesse momento anonnews.org está fora do ar… Parece que alguém está procurando problema, rsrs.

Categories: Outros Tags:

Singelo retorno ao desenho

May 17th, 2011 5 comments

Desde pequeno que não desenho mais. Dá vontade de voltar a desenhar…

Categories: Arte Tags:

Jair Bolsonaro e Preta Gil

March 30th, 2011 No comments

Esse tema é tão quente que não posso deixar passar sem publicar minhas considerações.

Seja qual for o motivo, opinião ou confusão, Bolsonaro foi extremamente infeliz na resposta à Preta Gil no programa CQC (quadro PQS – O Povo Quer Saber). Pois, mesmo no caso de confusão, houve uma associação mental entre Preta Gil, homossexualidade, promiscuidade e o “mal” que foi, no mínimo, estranha.

A pergunta foi muito clara: “Se o seu filho se apaixonasse por uma negra, o que você faria?“. Preta Gil ainda foi feliz em usar o termo “negra” em vez de “preta” para não parecer uma auto-referência. E a resposta, como sabemos, foi: “Não vou discutir promiscuidade com quem quer que seja. Não corro esse risco porque os meus filhos foram muito bem educados e não viveram em ambientes como lamentavelmente é o teu“.

Bolsonaro alega que não entendeu a pergunta, achou que se referia à homossexualidade. Isso faz algum sentido, porque a resposta foi muito dissonante da anterior (de que ele não se importava se tinha tido chefes brancos ou negros), mas ainda assim o erro foi tão gritante – e eu quero crer que não houve edição maliciosa pelo CQC – que aponta para associações mentais comprometidas, características de raciocínios esquivos e pouco francos sobre um determinado tema (o que não implica que raciocine mal sobre outros temas). Ele fez a merda, mereceu o processo, que se defenda sozinho, não quero aqui tentar definir qual foi a intenção do que ele falou.

Meu post é sobre conceitos e apanha esse caso apenas como ilustração e ponto de partida da discussão de um problema mais amplo: a intolerância às diferenças.

“Começando do começo”

Primeiro, vamos recapitular dois conceitos: tolerância e discriminação.

  • Tolerar (dicio, michaelis) não é gostar, preferir ou entender, mas está mais ligado a respeitar ou aceitar. A tolerência, portanto pode ser boa ou ruim. A tolerância à corrupção política, por exemplo, é ruim. A tolerância a uma manifestação artística que não lhe apraz, é boa.
  • Discriminar (dicio, michaelis) é diferenciar, distinguir. A discriminação, portanto, pode ser boa ou ruim. Discriminar uma raça quanto aos direitos e deveres civis, por exemplo me parece, na maioria das vezes, ruim tanto em prejudicar (Apartheid) quanto para privilegiar (cota racial). Mas há casos especiais como os direitos trabalhistas da gestante (discriminação por gênero) que são bons. E às vezes são bons também noutros âmbitos como categorias esportivas (discriminam por altura e peso), banheiros separados (por gênero), requisitos para dirigir automóvel (idade, saúde e habilidade) e para, por exemplo o papel numa filmagem que só pode ser feito por um negro/índio/japa/etc (discriminação por raça).

Essas palavras ganharam sentido pejorativo ou limitado no cotidiano uso, como se uma fosse sempre boa e a outra sempre ruim. É importante que se esclareça isso, porque elas recursivamente aparecem na boca de demagogos.

Cotas raciais

Há muitos exemplos de intolerância e discriminação ruins de consequências drásticas. As cota racial para o ingresso em universidades, por exemplo, pode deixar de fora um estudante branco pobre, dando sua vaga para um estudante negro pobre, ainda que eles estejam em igualdade de condições sócioeconômicas e o estudante branco tenha uma nota maior no vestibular. Deve ser difícil explicar para esse estudante que isso é justo por conta do que brancos (que já morreram há muito) fizeram a negros (já falecidos há tempos) em nossa história, mesmo que ele não esteja hoje favorecido em relação ao candidato negro. Não seria isso a instauração de um motivo legítimo para que ele, em revanche, se tornasse tão racista quanto a lei que o prejudicou? É uma pena que haja quem defenda esse mau exemplo de discriminação racial.

Preferências pessoais

Outro ponto polêmico é no que diz respeito a gostos pessoais… Eu já namorei meninas de raças diferentes e a que namorei por mais anos até hoje foi uma menina negra. Mas eu posso entender que as pessoas tem preferências diferentes e não há problema nisso. Há quem não goste de ruivas, morenas, japas, índias, louras ou negras. Não me concedo o direito impor meus gostos a outrem. Mas é claro que isso se torna um problema quando estamos num sistema político-econômico no qual a subjetividade de uns define as condições objetivas da qualidade de vida de outros… Mas esse é um problema que escapa às possibilidades individuais de ação, restando soluções conjunturais, circunstanciais.

Humor

Sobre o mundo humorístico… Sou muito flexível quanto ao tema, mas cuidadoso quanto à circunstância de enunciação (uma parte do significado do ato de fala depende disso). Por exemplo, eu e meus amigos nerds fazemos piadas sobre nerds. Mas acho que quando alguém de fora vai fazer uma piada, tem que ter a sensibilidade se fazê-lo sem que pareça mais do que uma piada. Mas se eu for num show de humor, obviamente não posso esperar que não se faça piadas sobre isso (mas, preferencialmente, sem referências individuais). Então, se por um lado não considero que negros sejam café-com-leite no mundo do humor (até porque negros fazem piadas sobre negros), entendo que devido ao contexto histórico, se deve fazê-lo com cautela, principalmente para um público amplo.

Racismo “por tabela”

Às vezes, a carga racista de um evento ou coisa qualquer está na possibilidade de suporte para um racismo verdadeiro utilizando-se daquele evento ou coisa inicialmente inocente. Um grande exemplo foi um jogo americano, desses de matar zumbis, onde o personagem em primeira pessoa era branco e havia uma fase numa aldeia africana… Ainda que o jogo tenha sido feito sem essa intenção (não sei dizer), deveria ter-se apercebido da possibilidade de uso por garotinhos racistas americanos nesse outro sentido (lá o racismo ainda é forte). Por analogia, uma piada, um jogo, uma série de TV etc tem de cuidar não apenas para não ser racista, mas também para não gerar ferramentas para o racismo.

Em suma…

Voltando ao caso em questão, me sinto triste por um cara que defende coisas que acho importantes, até contra o racismo no caso das cotas, tenha caído nessa infeliz situação (por erro próprio). Espero que ele se responsabilize por isso, e se desculpe por seu erro (confusão ou não), até para que isso não manche por “osmose sócio-cultural” as ideias importantes que ele defendia. Eu não sou o tipo do cara que aproveita a polêmica para ferrar alguém, estou procurando fazer a mesma análise que faria se a coisa não estivesse estourando na mídia e espero ter sido bem-sucedido num juízo ponderado. Mas confesso que fiquei decepcionado e gostaria que ele aproveitasse para rever suas concepções erradas sobre homossexualidade e outros temas, nos quais eu mesmo afirmo que ele peca.

O vídeo de Rodrigo Constantino está maravilhoso, confiram:

Categories: Outros Tags:

Go no GCC (golang.org)

March 29th, 2011 No comments

É isso mesmo! A linguagem Go foi incluída no GCC 4.6 (GNU Compiler Collection). Isso significa que subiu oficialmente ao hall das importantes linguagens mundiais, principalmente das open-source. Assim, virá na coleção padrão de compiladores do Linux e outros sistemas assim como já vinham C, C++, Objective-C, Java etc.

Eu esperava por isso já faz algum tempo, pois  creio ser bem merecido. Go é uma linguagem maravilhosa e tem tudo para – sem exagero – substituir com folga as grandes linguagens que temos no mercado! Eu sei que cada qual defende sua linguagem com unhas e dentes, mas se você considerar ponderadamente o que Go é, acho difícil que duvide do meu prognóstico.

Principais características:

  • É compilada para código de máquina (não bytecode) e de tipagem estática (validada em tempo de compilação), portanto sua velocidade é comparável à de C e a tendência é se tornar cada vez mais rápida por otimização em futuras releases.
  • É simples de aprender. A sintaxe é semelhante à de C de algum modo, mas muito mais afinizada com linguagens dinâmicas contemporâneas como Python.
  • Suporta orientação a objeto. Mas com características peculiares muito interessantes… Objetos sem classes. São tipos/estruturas com seus métodos (funções vinculadas a eles), interfaces e packages [veja mais a seguir].
  • É robusta e franca
    • Suporta processos concorrentes como recuso built-in.
    • Suas facilidades não iludem o programador sobre o que está ocorrendo nos bastidores.
    • É desenhada para aceitar caracteres UTF-8 por default inclusive em identificadores de variáveis e funções!
    • Tem recurso de inferência concisa de tipos para declaração simplificadas.
    • Tem “coletor de lixo” (garbage collector).
    • Explora o poder de processadores multicore.
    • Tem muuuitas bibliotecas padrão com tudo o que você geralmente sente que precisa e falta em outras linguagens.
    • O código é tão legível que já é quase sua própria documentação e é fácil tanto para programadores quanto para o compilador rastrear as dependências pelas regras de importação.
    • O compilador avisa sobre variáveis ou packages declaradas mas não utilizadas.
    • Possui biblioteca para números arbitrariamente grandes ou arbitrariamente precisos.
  • É segura quanto ao tipo e quanto ao acesso à memória (tem ponteiros mas não ponteiros aritméticos e o tamanho de uma array é parte do tipo da array).
  • É limpa. Graças ao bom Deus não me puseram shorthands como “templates” para declaração de múltiplos tipos o que arruinaria aquele monumento ao rigor que Go é. Mas alguns conceitos sobre manipulação de tipo ainda estão em discussão, porém cada vez menos se sente a necessidade de novos recursos para tal.
  • É uma linguagem de sistema (pode ser usada para desenvolver sistemas operacionais), mas é ao mesmo tempo de uso geral.
  • É modesta. [Isso eu demorei um pouco para valorizar, mas vendo a coisa na prática tenho que julgar que foi um acerto, dadas as circuntâncias]. Ou seja, não tenta vencer conceitualmente linguagens intelectuais como Scheme e tantas outras interessantes, mas simplesmente dá o que precisamos sem paradigmas desnecessariamente sofisticados que poderiam tornar o ato de programar muito burocrático. Em suma, tem sua rigorosa filosofia, mas evita “filosofices” puramente acadêmicas e anti-pragmáticas ou até mesmo boas idéias que não caberiam nesse momento histórico.
  • É open source (você por ir lá na lista de email e influenciar a linguagem), bem como usar à vontade.
  • É patrocinada e fomentada pelo Google, feita principalmente pelo time do Google que inclui grandes nomes da história da informática e novas mentes brilhantes. Esse fator é relevante porque muitas vezes uma linguagem é maravilhosa mas “não pega” amplamente como no caso de D. Com um fomentador de porte e qualidade, não há como “não pegar”.
  • É madura. Aprendeu com os erros e acertos de grandes linguagens e veio numa época em que conceitos de linguagens de programação foram testados e regenerados à exaustão. Portanto, pôde contar com um desenho firme, elegante e seguro.

Isso é apenas uma amostra, portanto espero que não julgue a linguagem somente pelo meu post. A seguir, ponho alguns exemplos relevantes, mas dê uma olhada no site oficial. E você pode testar a linguagem online.

Exemplos

Programa mínimo

package main

func main() {
    //code
}

Hello world

package main

import "fmt"

func main() {
    fmt.Println("Olá Mundo!")
}

Inferência de tipo

package main

import "fmt"

func main() {

    var s1 string // tipo declarado
    s1 = "Olá "

    s2 := "Mundo" // tipo inferido

    fmt.Println(s1 + s2)
}

Caracteres UTF-8 por padrão, inclusive em identificadores

package main

import "fmt"

func main() {
    Saudação()
}

func Saudação() {
    fmt.Println("Olá Mundo!")
}

Processos concorrentes (exemplo trivial)

package main

import (
    "fmt"
    "time"
)

func main() {

    sec := int64(1000000000) // 1 segundo em nanosegundos

    // "go" aciona o processo e continua sem esperar
    go DigaNoTempo("Mundo!", 3 * sec)
    go DigaNoTempo(" ",      2 * sec)
    go DigaNoTempo("Olá",    1 * sec)

    time.Sleep(4 * sec) // aguardando os processos...
    fmt.Printf("\n")
}

func DigaNoTempo(s string, t int64) {
    time.Sleep(t)
    fmt.Printf(s)
}

// output: Olá Mundo!

Funções anônimas

package main

import (
    "fmt"
)

func main() {

    f := (func() func() {
        n := 0
        return func () {
            n = n + 1
            fmt.Printf("%d ", n)
        }
    })()
    // função anônima (executada) que retorna função anônima como em JavaScript

    f()
    f()
    f()
    fmt.Printf("\n")
}

// output: 1 2 3

Orientação a objeto (tipo numérico)

package main

import (
    "fmt"
)

func main() {

    n := new(Natural)
    *n = 4

    if n.ÉZero() {
        fmt.Printf("%v é zero\n", *n)
    } else {
        fmt.Printf("%v não é zero\n", *n)
    }

    if n.ÉPar() {
        fmt.Printf("%v é par\n", *n)
    } else {
        fmt.Printf("%v não é par\n", *n)
    }
}

type Natural uint // uint é o inteiro sem sinal de 16 bits

func (n *Natural) ÉZero() bool {
    if *n == 0 {
        return true
    }
    return false
}

func (n *Natural) ÉPar() bool {
    if n.ÉZero() || *n%2 == 0 {
        return true
    }
    return false
}

/* output:
4 não é zero
4 é par
*/
Categories: Informática Tags:

Breve lamento

November 6th, 2010 No comments

Não sei se a moderação vai liberar esse comentário – nem tem nada demais – num blog do G1, mas acho que merece ser postado aqui… Um tanto off-topic, mas vamos lá.

Talvez a tragédia dessa eleição via falácia nos proporcione – já que provavelmente não um bom governo ou uma boa política – um curioso espetáculo. Temos um futuro ex-presidente que preside o futuro (talvez mais do que o presente e que presidiu o passado), uma futura presidente que tem a tarefa paradoxal de trazer a “continuidade” de um projeto de governo demagogicamente inflado por quase uma década, não indo muito além disso (sendo que ela não tem tal vocação para o sorriso canalha e a afirmação vazia vigorosamente enunciada). O país cresceu quase que apenas no que foge ao âmbito governamental e que geralmente/atualmente vai bem quando o governo atrapalha menos, a economia (fazendo, aliás, em tudo o oposto da ideologia que justificaria, por diferença, a existência do PT). Imagine só quantos empregos Lula “geraria” antes do Plano Real.

Vamos ver no que dá esse princípio de oligarquia… (Viram no discurso de Dilma? Todo mundo querendo se enfiar na frente da câmera? Isso é um presságio). E já começaram a mexer no lugar errado (do ponto de vista dos iludidos eleitores, CPMF/CSS) se esquecendo de que ela não tem a aprovação do Lula (já começa com pouco, 56% chorados, um monte de promessas impossíveis e pactos mil).

Do governo Lula eu esperava um benefício histórico que não veio: o de dar a perceber à população que socialismo é engodo, mas não aconteceu… Por alguma razão estranha, os dados sobre a efetividade falhada do mau governo quase não chegou às pessoas… E quando chegou foi descaracterizado como “PIG”, a “Elite” manipuladora, essas coisas. Que triste fim. Aí fica o pessoal hipnotizado olhando pra um sujeito que faz aquele show da “virtude do proletariado”, zombando da seriedade do cargo e perdoam pq ele é “do povo”. Veja como há uma concepção segregadora nisso, como se nunca quem contrata ou quem conseguiu acumular alguma coisa com esforço, ou quem estudou muito pudesse ser bom o bastante para ser “do povo”.

Acho que, quanto aos três mais expressivos candidatos, seu número de votos foi inversamente proporcional ao que mereciam: Marina, Serra, Dilma.

Não acho que posso dizer que a eleição foi democrática. Enganar descaradamente é democrático? As decisões tomadas pela maioria baseando-se em falsas referências é uma manifestação democrática válida? E o mais impressionante foi ver nossos intelectuais (que sumiram na época do mensalão) se portando como advogados de uma candidatura dessas… Não eram tão sagazes para perceber as articulações ideológicas? Isso não existe quando eles são governo?
De que adianta “Lei da ficha-limpa” quando o crime conta com o apoio de todas as esferas estatais? Vamos ver o que dá pra salvar nesses quatro anos e esperar que não reste para Marina uma herança maldita como a que ficou para Obama.

[Pessoal do PT e afins pode expressar sua indignação contra mim aqui, é só não trolar nem spamizar que eu não deleto e ainda debato. (Nem espero a mesma gentileza nos sites de vcs). Aceito até 'Ad hominem' se vier com um argumento razoável. Se achar muito restritivo que não se cite informações maliciosamente recortadas/descontextualizadas ou "fatos fictícios" de um mundo imaginário que só existe para justificar sua ideologia, favor não postar. De resto, fique à vontade.]

Categories: Outros Tags:

Model Rails 3 serializado (sem ActiveRecord)

October 24th, 2010 No comments

Às vezes você quer carregar informações configuráveis em seu aplicativo Rails que não estão num banco de dados. Geralmente a alternativa é colocar num documento passível de serialização e carregar por initializer (config/initializers/*.rb). O problema é que o seu cliente não vai editar esse arquivo no servidor via vim/ssh ou baixando via ftp ou de alguma maneira parecida, então o ideal seria que esses dados se comportassem como um model ActiveRecord podendo ser editado via formulário normal.

Para dar um exemplo prático… Há informações de um site que não faz sentido que estejam numa tabela, porque seria como que uma tabela de uma linha só. Digamos… Título, slogan, descrição, status (no ar ou em manutenção) etc.

Eis o passo-a-passo da maneira mais simples que encontrei…

No Shell:

rails new app
cd app
rails g scaffold Conf title:string slogan:string desc:text
rm db/migrate/*_create_confs.rb
rm -rf app/views/confs/*
touch app/models/conf.yml

Arquivos:

# app/helpers/application_helper.rb
module ApplicationHelper
  def app_conf
    unless defined?(@app_conf)
      @app_conf = YAML.load(File.read("#{Rails.root}/app/models/conf.yml")).symbolize_keys
    end
    @app_conf
  end
end

# config/routes.rb
App::Application.routes.draw do
  get "confs/", :controller => :confs, :action => :edit
  post "confs/set", :controller => :confs, :action => :update
end

# app/controllers/confs_controller.rb
class ConfsController < ApplicationController

  def edit
    @conf = Conf.new
  end

  def update
    @conf = Conf.new(params[:conf])
    if @conf.save
      flash[:notice] = "Successfully updated configuration."
      redirect_to confs_path
    else
      render :action => 'edit'
    end
  end

end

# app/models/conf.rb
require 'active_model'
require 'yaml'

class Conf
  include ActiveModel::Conversion
  include ActiveModel::Validations
  extend ActiveModel::Naming

  attr_accessor :title, :desc, :slogan

  def initialize(attributes = {})
    @_conf_path = "#{Rails.root}/app/models/conf.yml"
    @_data = attributes
    begin
      @_data = YAML.load(File.read(@_conf_path)) if @_data.empty?
    rescue
      @_data ||= {}
    end
    if @_data.class == Hash
      @_data.each do |name, value|
        send("#{name}=", value)
      end
    end
  end

  def save
    File.open(@_conf_path, 'w') {|f| f.write(@_data.to_hash.to_yaml) }
    true
  end

  def persisted?
    false
  end

end

# app/views/confs/edit.html.erb
<h1>Editing config</h1>

<%= form_for @conf, :url => confs_set_path do |f| %>
  <% if @conf.errors.any? %>
    <div id="error_explanation">
      <h2><%= pluralize(@conf.errors.count, "error") %> prohibited this conf from being saved:</h2>

      <ul>
      <% @conf.errors.full_messages.each do |msg| %>
        <li><%= msg %></li>
      <% end %>
      </ul>
    </div>
  <% end %>

  <div class="field">
    <%= f.label :title %><br />
    <%= f.text_field :title %>
  </div>
  <div class="field">
    <%= f.label :slogan %><br />
    <%= f.text_field :slogan %>
  </div>
  <div class="field">
    <%= f.label :desc %><br />
    <%= f.text_area :desc, :size => '40x5' %>
  </div>
  <div class="actions">
    <%= f.submit 'Change config' %>
  </div>
<% end %>

# app/views/layouts/application.html.erb
<!DOCTYPE html>
<html>
<head>
  <title><%= app_conf[:title] %><%= app_conf[:slogan].empty? ? '' : (' - '+ app_conf[:slogan])  %></title>
  <%= stylesheet_link_tag :all %>
  <%= javascript_include_tag :defaults %>
  <%= csrf_meta_tag %>
</head>
<body>
<% flash.each do |name, msg| %>
<%= content_tag :div, msg, :id => "flash_#{name}" %>
<% end %>
<%= yield %>

</body>
</html>

Assim os dados são carregados normalmente no formulário para que você os edite. Como esses dados não são para ser usados numa só página, mas por toda a aplicação, não há necessidade de uma action show. Essa página de edição deve, obviamente, ser assegurada por regras que administração que não estão nesse post só para não ficar confuso.

Outra vantagem dessa abordagem é que os dados são atualizados em tempo real. Se fossem carregados num initializer, seria preciso reiniciar a aplicação para que fossem atualizados.

Categories: Informática Tags:

Meus votos 2010

October 2nd, 2010 No comments

Escolhendo o melhor ou desviando do pior, eis meus votos na ordem da urna:

Deputado estadual:
11120 F.Bolsonaro
Deputado federal:
1120 J.Bolsonaro
Senador 1:
233 Marcelo Cerqueira
Senador 2:
251 Cesar Maia (infelizmente)
Governador RJ
43 Fernando Gabeira (com muito orgulho)
Presidente da República Federativa do Brasil
43 Marina Silva (com muito orgulho)

Cola dos votos para imprimir

Publique também os seus!

Que sejam eleitos os melhores.

TwitterArt da urna para você colar:

@silva_marina #OndaVerde #Marina43
┈┈╭━━━━━━━━━━╮┈┈
┈┈┃╭━━━━╮┏┳┳┓┃┈┈
┈┈┃┃┈┈┈┈┃┣┳┳┫┃┈┈
┈┈┃┃┈┈┈┈┃┣┳┳┫┃┈┈
┈┈┃╰━━━━╯┗━━┛┃┈┈
┈┈╰━━━━━━━━━━╯┈┈
 

 

Categories: Política Tags: