Linux… e mais coisas

Um espaço para dizer um pouco mais sobre coisas interessantes…

Posts de Janeiro, 2007

Usuários avançados: Apóiem os novatos! Por favor!

Publicado por Fábio Emilio Costa em 24 24UTC Janeiro 24UTC 2007

Eu sou usuário do EMACS convicto, então, ao menos na teoria, seria um dos que teriam mais a ganhar com o post do Glaydson Lima, “Esqueçam o VI por favor“. Realmente, concordo com o Glaydson na seguinte citação:
Não existe problema algum em utilizar o editor preferido, mas me irrita a soberba de recomendar para um usuário novato, interessado a aprender Linux que se utilize o VI sem nenhuma menção que existem editores gráficos que fazem o mesmo serviço de forma mais intuitiva e, mesmo em situações de modo texto forçado, informar a existência de outros editores modo texto mais amigáveis. E não me venha com a desculpa que VI é um editor padrão que ensinando assim o usuário poderá utilizar em qualquer situação. Se o usuário sabe o que é o VI, ele saberá substituir um comando para utilizá-lo.

Realmente há um fato aqui: VI existe em tudo quanto é distro Linux, desde o Ubuntu ou o Fedora até mesmo pelas versões de manutenção em um disquete. Além disso, você encontra o VI em qualquer Unix ou Unix Like, não importa se estamos falando de Linux, Mac OS X, FreeBSD, Solaris ou o que valha. Poxa, existe até mesmo VI para Windows (Se duvida, procure a sessão de Downloads do site do VIM, o mais importante clone do VI, e veja com seus próprios olhos). Além disso, em muitos servidores remotos (quem quiser um interessante, a HP oferece um programa chamado HP Test Drive que oferece telnet a diversos servidores HP rodando muitas plataformas diferentes) a principal (senão a única) opção será o VI.
Mas e no caso do usuário comum? Porque tentar “socar goela abaixo” dele o VI? Apenas porque ele é ubiqüo? Porque não lhe mencionar emacs, mcedit, kate, gedit, ou mesmo o gvim, que torna o VI um pouquinho mais usável oferecendo a ele uma interface gráfica?
Acho que não existe desculpa em “forçar a barra”. Não interessa se estamos falando de EMACS, VI ou qualquer outra coisa: “forçar a barra” não é saudável. Uma das grandes vantagens do Linux em cima de outros SOs é o fato não apenas de exisitriem várias opções, mas que elas podem ficar disponíveis no momento da instalação. Uma instalação padrão de uma distro atual lhe dá pelo menos 3 editores de texto. Uma full pode te dar 10 (!!). Por isso mesmo é que eu acho que procurar limitar o conhecimento do usuário ao VI “apenas” por uma questão de imposição é extremamente ruim. O Glaydson ainda coloca o seguinte comentário:
Eu sou “acomodado”… se tem tanta coisa importante para aprender para que ficar decorando dezenas de comandos específicos para cada programa? Aí cai em outro problema dos novatos no Linux: muita gente acha que para usar Linux tem que ler o manual, saber compilar um arquivo .tar.gz e saber alterar o arquivo /etc/fstab. Três anos atrás, ao pedir a opinião a um amigo meu sobre qual Linux utilizar ele respondeu com desdém: “Qualquer um, hoje todo mundo instala Linux”. Imagina hoje que os Linuxs rodam em CD e tem um sistema de instalação com pouquíssimas perguntas.

Tudo bem, não discordo que o usuário precisam conhecer um pouco sobre o Linux. Isso já foi inclusive comentado anteriormente aqui nesse blog. Afinal de contas, se quando você dirige você precisa ter uma idéia do que a droga do óleo de motor faz, porque você não precisa saber o que o /etc/fstab faz? Mas ao mesmo tempo, será que é tão doloroso assim ser ser um pouco mais humilde? Temos que nos lembrar, como já comentei antes, que TODOS JÁ FOMOS  INICIANTES! Todos nós já não soubemos o que aquela p…a do /etc/fstab faz (para os não-iniciados: o /etc/fstab inclui informações sobre todos os sistemas de arquivo que o Linux irá montar na inicialização ou que poderão ser montados pelos usuários. Isso auxilia no boot, pois o sistema sabe quais os parâmetros das várias partições locais ou remotas a sere montadas, e no uso de comandos como mount).
Não tratemos mal os iniciantes, todos já fomos um. Esse é o meu recado no fim das contas. Para aqueles que sentem-se pouco a vontade com os iniciantes, o Linux Advocacy mini-HOWTO possui muitas idéias boas e comentários pertinentes sobre isso. Coloquem-se na pele do usuário iniciante e veja que muitas vezes podemos, mesmo com as melhores das intenções, sermos grosseiros e hipócritas.
Portanto, o recado final meu é uma espécie de chamado as armas: “usuários avançados: apóiem os novatos!!!”

powered by performancing firefox

Enviado em Comunidade, Educação, Linux, Opinião, Software Livre | Deixar um comentário »

Um shell-script para renomear arquivos em massa

Publicado por Fábio Emilio Costa em 23 23UTC Janeiro 23UTC 2007

Quem tem câmera digital sabe o quanto é chato aqueles nomes padrões dados pelas câmeras aos arquivos. Você normalmente não tem como saber que ‘DSC00001.JPG’ é a foto da sua irmã durante o Revellion ou qualquer coisa assim. Para isso, vários programas em várias plataformas tem como objetivo renomear em massa arquivos, ou seja, renomear os arquivos de modo que sigam um padrão identificável.

No Linux, infelizmente, não existe algo assim… Mas felizmente existe o bash. Usando este script, você pode renomear os arquivos de sua digital com um nome apropriado para você. Espero que você faça bom proveito do script.

#!/bin/bashi=1

startprefix="DSC"

endprefix=`hostname`

force=

verbose=

scriptname=${0##*/}

while getopts 'hs:fvn:' OPT_LETRA

do

  case $OPT_LETRA in

     'h') echo "Script para renomear arquivos em massa baseado em prefixo"

   echo

   echo "$scriptname [OPÇÕES] [prefixo_final] (padrao $endprefix)"

   echo

   echo "Opções:"

   echo

   echo "-h            retorna essa mensagem de erro"

   echo "-s [prefixo]  prefixo inicial a ser usado (padrao $startprefix)"

   echo "-n [numero]   numero de sequencia inicial a ser usado (padrao $i)"

   echo "-v            verboso: mostra todas as informacoes"

   echo "-f            sobrescreve arquivos e diretórios existentes"

   exit 0

   ;;

     's') startprefix=$OPTARG

   ;;

     'n') i=$OPTARG

   ;;

     'v') verbose="1"

   ;;

     'f') force="1"

  esac

done

shift `expr $OPTIND - 1`

if [ -n "$1" ]; then

endprefix=$1

fi

files=`ls ${startprefix}*`

total_files=`echo $files |  sed -e 's/ /\\n/g' | wc |  sed -re 's/[ \\t]+/ /g' | cut -d' ' -f2`

pow=0

howmuch=1

while true; do

    if [ $total_files -lt $howmuch ]; then

 break;

    fi

    howmuch=$(($howmuch * 10))

    pow=$(($pow + 1))

done

zero_fill=""

for t in `seq $pow`; do zero_fill="${zero_fill}0"; done

regex="s/^.\\+\\(.\\{$pow\\}\\)$/\\1/"

for actual_file in $files; do

echo $actual_file |  grep -E -e '\\.(jpg|png|gif|bmp)$' > /dev/null

if [ $? -eq 0 ]; then

while true; do

extension=`echo $actual_file | sed -e 's/.\\+\\(\\.\\(gif\\|bmp\\|jpg\\|png\\)\\)$/\\1/'`

     sequence="${zero_fill}${i}"

suffix=`echo $sequence | sed -e $regex`

newfile="${endprefix}_${suffix}$extension"

i=$((i + 1))

if [ -e $newfile -a -z "$force" ]; then

if [ $newfile == $actual_file ]; then

echo "$newfile é o mesmo... Pulando"

 	   break

fi

echo "Pulando - $newfile já existe ..."

else

if [ ! -z "$verbose" ]; then

 	    args='-v'

 	fi

 	if [ ! -z "$force" ]; then

 	    args="${args} -f"

 	fi

 	mv $args "$actual_file" $newfile

 	break

fi

done

    fi

done

Enviado em Linux, Programação, Shell Script, Software Livre | 3 Comentários »

Um shell-script para gerar páginas de miniaturas

Publicado por Fábio Emilio Costa em 23 23UTC Janeiro 23UTC 2007

Todo feriado é a mesma coisa: dezenas de fotos tiradas com as câmeras digitais que possuímos e então divulgamos em nossos sites. Gerar thumbnails (miniaturas) é sempre útil, principalmente quando hospedamos as fotos em um site pessoal, como o fornecido por geocities, por exemplo.

Esse script bash utiliza o ImageMagick para gerar miniaturas das imagens de uma pasta e cria uma página HTML para exibir essas miniaturas. É um tanto simples e até porque não dizer, tosco, mas deve ser útil. Espero que façam bom proveito desse script:

#!/bin/bash

i=0

thumbspage="thumbs.html"

thumbsdir="thumbs"

thumbssuffix="thumbs"

pagename="Página de miniaturas"

force=

verbose=

scriptname=${0##*/}

while getopts 'vhn:p:d:s:f' OPT_LETRA

do

  case $OPT_LETRA in

     'h') echo "SCRIPT para geração de páginas de thumbanils"

   echo

   echo "$scriptname [OPÇÕES]"

   echo

   echo "Opções:"

   echo

   echo "-h               retorna essa mensagem de erro"

   echo "-n [nome_pagina] cabeçalho da página de miniaturas"

   echo "-p [arq_pagina]  nome do arquivo da página"

   echo "-d [dir_thumbs]  diretório onde ficarão as miniaturas das"

   echo "                 imagens do diretorio"

   echo "-s [sufixo]      sufixo a ser adicionado ao nome das miniaturas"

   echo "-v               verboso: mostra todas as informacoes"

   echo "-f               sobrescreve arquivos e diretórios existentes"

   exit 0

   ;;

     'n') pagename=$OPTARG

   ;;

     'd') thumbsdir=$OPTARG

   ;;

     's') thumbssufix=$OPTARG

   ;;

     'p') thumbspage=$OPTARG

   ;;

     'f') force="1"

   ;;

     'v') verbose="1"

esac

done

cabecalho="

<HTML>

<HEAD>

<TITLE>

$pagename

</TITLE>

<BODY>

<TABLE width=100%>

<TR>

<H1 align='center'>$pagename</H1>

"

if [ ! -d "$thumbsdir" ]

then

  mkdir $thumbsdir

else

  if [ -z "$force" ]

  then

      echo "Atenção: Diretório de thumbnails existe! Saindo..."

      exit 1

  fi

fi

if [ -f "$thumbspage" -a -z "$force" ]

then

  echo "Atenção: Arquivo HTML da galeria existe! Saindo..."

  exit 1

fi

echo $cabecalho > $thumbspage

for file in `ls < grep -E -e '(gif<jpg<png<bmp)'`; do

    mainfile=`echo $file < cut -d. -f1`

    thumbfile="${thumbsdir}/${mainfile}_${thumbssuffix}.jpg"

if [ ! -z "$verbose" ];

    then

 echo "Gerando thumbnail para $file: $thumbfile"

    fi

if [ ! -z "$verbose" ];

    then

 args="-verbose"

    fi

convert $args -scale 300x200 $file $thumbfile

case $i in

        0)

            linha="

            </tr>

            <tr>

            <td align='center' valign='center'>

            <a href='$file'>

            <img src='$thumbfile'>

            </a>

            </td>"

            echo $linha >> $thumbspage

            i=1

            ;;

        1)

            linha="

            <td align='center' valign='center'>

            <a href='$file'>

            <img src='$thumbfile'>

            </a>

            </td>"

            echo $linha >> $thumbspage

            i=0

            ;;

     esac

done

rodape='

</TR>

</TABLE>

</HTML>'

echo $rodape >> $thumbspage

Enviado em Linux, Programação, Shell Script, Software Livre | 4 Comentários »

e-Tropicalia: Cultura Livre, Canibalismo e Internet

Publicado por Fábio Emilio Costa em 23 23UTC Janeiro 23UTC 2007

Por FÁBIO EMILIO COSTA

(NA: Esse artigo foi escrito meio como um “exercício de reflexão”. Alguns conceitos poderão estar estranhos ou até mesmo errados. Peço perdão por tudo e me coloco a disposição no MSN hufflepuffbr @ hotmail . com . br ou no Jabber IM SamWeasley @ jabber . org)

Em um artigo recente publicado pela revista Wired (Dibbel, 2004), Julian Dibbell compara o movimento de Software Livre e do Creative Commons a três coisas do Brasil: o canibalismo dos indíos que aqui viviam, o movimento Pau-Brasil da literatura, com a “antropofagia cultural” de Oswald de Andrade e o movimento da “tropicália” de Gil, Caetano e os Mutantes. No artigo, Dibbell diz:

“(…) [o] Brasil esteve envolvido em seus 500 anos de existência em algumas noções curiosas – e curiosamente prescientes – sobre como a cultura deveria funcionar.” (ibid., NA: todas as traduções do autor)

Isso é interessante, pois todo brasileiro sabe que sua cultura não é uma cultura “única”, criada por um povo único: o Brasil, como cultura, recebeu influências de povos tão díspares como o indígena e o japonês, o alemão e o ucraniano, o francês e o libanês, o africano e o espanhol, o italiano e o português. Somos meio que uma “refavela”, “samba duro de marfim. Marfim da costa de uma Nigéria, miséria em roupa de cetim“, nas palavras de Gilberto Gil, atual Ministro da Cultura e um dos expoentes mundiais na luta pela liberdade de cultura.

Em seguida, o autor diz que, “para os tropicalistas, como para [Oswald] de Andrade, havia apenas uma maneira de se ter sucesso em meio a tantos contrastes” gerados pelo choque da cultura rural de um Brasil rural que estava tornando-se, além de urbano, cosmopolita. “Você não podia acovardar-se diante do que é estranho para você, e tampouco deveria subalternamente imitá-lo. Você devia o deglutir como um todo.

O Brasil é um grande especialista nessa arte de “deglutir” culturas, o que, para qualquer pessoa que entenda o processo atual de globalização e cosmopolitanismo, é parte essencial das competências sociais das pessoas para o futuro. Como Gil afirmou para o autor: “não [era] mais apenas uma mera submissão diante das forças do imperialismo econômico, mas uma resposta canibalista de deglutir o que eles nos davam, digerir e criar algo novo e diferente. Nós entendemos o cultivo de hábitos e maneirismos externos como uma forma de nos nutrirmos, não apenas de nos intoxicarmos.

Quando Gil afirma isso, é interessante estudarmos a nossa própria cultura, “antropofágica” por natureza: as nossas festas, desde a “quadrilha” (que vem de uma dança da realeza francesa trazida pelos portugueses e adaptada pelos povos brasileiros) até o “congado” (que combina elementos cristãos, negros e indígenas), nossos alimentos, que variam desde a feijoada (comida feita pelos escravos com os restos dos alimentos de seus patrões) até à cerveja (trazida pelos alemães), e até mesmo nossa língua, que recebeu expressões como “forró” (uma corruptela do inglês “for all”), “axé” (que vem do iorubá, querendo dizer “boas energias”) e “você” e “vosmicê” (ambas derivações do termo típicamente português “vossa mercê”), são todos eles carregados, como os exemplos mostram, de culturas estrangeiras que foram “deglutidas” por nós e criadas como algo novo.

É justamente nesse cenário que a revista Wired procura entender o Brasil, pois, diferentemente do que pode-se imaginar, esse não é mais apenas o cenário brasileiro, mas sim o cenário do próprio mundo globalizado, de Brasil e Oriente Médio, de Microsoft e Nokia, de Arafat e de Gil, de Internet e Taleban. Um mundo cada vez mais “caótico”, não no sentido de que seja louco, mas no sentido de que é mutável, como uma verdadeira “metamorfose ambulante” para expressar outro fruto do tropicalismo.

Pois, com as ações duras das indústrias, seja ela cultural, farmacêutica ou tecnológica, dos “imperialistas econômicos” de Gil, tornam cada vez mais essa “antropofagia” algo errado. Da mesma forma que o Catolicismo declarou a antropofagia, digamos assim, “gastronômica”, um pecado, as forças do Capitalismo atual procuram tornar a sua versão cultural um pecado. Justamente quando precisamos cada vez mais “tropicalizar” a cultura, estamos sendo impedidos de o fazer.

A bossa do Copyright

Novamente comparando com o tropicalismo, podemos dizer que temos a nossa “e-Bossa Nova”: certinha, bem comportada, apoiada pela grande mídia e pela maioria das pessoas ditas intelectualizadas, e totalmente sem sal, exceto por um poucos lampejos de genialidade. Pois, se a Bossa Nova nos deu Jobim, Toquinho e Vinícius, com certeza o tropicalismo nos deu bem mais: Gil, Caetano, Mutantes (e deles Rita Lee), Chico Buarque (que era mais “comportadinho”), Milton Nascimento, e deles outros tantos músicos.

O mesmo vale atualmente. O nome dessa “e-Bossa Nova” é “copyright“. Talvez seu grande lampejo de genialidade seja a Microsoft: ela possui não apenas inovações interessantes (não podemos fechar os olhos e nem ter medo: lembre-se, somos antropófagos!), mas também é dracônica e maquiavelicamente genial em seus objetivos. Uma pose de bom moço, um “samba de uma nota só” com seus sistemas operacionais, e uma ocasional “esnobada” de “vaia de bêbado não vale” com um processo ou outro contra aqueles que falam o que pensam sobre ela, e temos uma das mais poderosas organizações do planeta exercendo sua força no Brasil.

Talvez a “e-Bossa Nova”, com seus “e-Mecenas”, ainda seja mais interessante para os que possuem visão apenas para o futuro imediato, mas é importante tomar-se cuidado com seus “sambas de uma nota só”. Até mesmo a Legião Urbana, a maior banda de rock do Brasil na opinião de muitos, precisou ter aulas de “como tocar 73 sucessos com apenas três acordes”. Mas ela precisava não apenas de três acordes, mas também de beber de várias fontes, como os Dead Kennedys e o Sex Pistols, Neil Young e Joni Mitchell. E puderam fazer isso pois a cultura ainda era livre: eles não podiam tocar Pistols, mas podiam trazer as idéias dos Pistols, como representantes que eram da “Geração Coca-Cola”. Podiam dizer suas opiniões sobre “Que País é Esse?”. Atualmente, se uma pessoa quisesse aproveitar a cultura existente, principalmente a digital, para mostrar “Que País é Esse?”, provavelmente teria que pedir autorização a alguém… Quem? Se ninguém sabe quem é esse “Charada Brasileiro” da nossa música.

Esse é o cuidado que devemos ter com a “e-Bossa Nova”: não a enxergarmos totalmente malévola, pois ela produziu muitas coisas boas. Mas precismos tomar cuidado para não deixarmos que as “samba de nota só” nos impeça de ver o que vem “Depois do Começo” dessa nossa revolução da Internet, nos obrigando a entender a Internet como “Mais do Mesmo”, aonde as grande corporações dominem a nossa cultura.

Pois para elas, da mesma forma como para a ditadura, qualquer tentativa de tropicalismo “era anarquismo, subversão em pele de cordeiro.” com Gil disse. Somos vistos por elas como uma “infecção social“. Podemos entender que a Internet, para as grandes corporações, é algo como o que a Tropicália representava para os ditadores. E a mensagem delas para nós, que pensamos na Internet como uma forma de mobilizar, angariar, modificar e divulgar cultura: “Vocês representam uma ameaça, algo novo, algo que não pode ser totalmente compreendido, algo que não se ajusta e nem jamais irá se ajustar às práticas culturais existentes. Vocês são perigosos.” (ibid.)

LSD, computadores e liberdade de expressão

Em um momento no artigo da Wired, Dibbell diz:

“Se Stallman pensou que seria o palestrante mais polêmico do evento, ele não contava com Gil, cuja palestra traçava a origem do movimento do software de código aberto e de cultura digital em geral ao LSD. ‘O que eu quiz dizer’, relembra Gil, ‘era que todo o processo que levou ao computador, que levou ao computador pessoal, que levou ao Vale do Silício, foi uma grau extraordinário de cognição que surgiu da intersecção de matemática e desenvolvimento de estruturas cristalogáficas de quartzo possibilitado pelas viagens lisérgicas.’ Ele riu. ‘Bem, talvez não apenas pelas viagens lisérgicas, mas sem sombra de dúvidas possibilitadas por elas.’” (ibid.)

Claro que Stallman ficou preocupado em uma potencial associação do movimento GNU do software livre com os movimentos de legalização das drogas. Mas é claro que Gil não quis sugerir isso. Como o próprio Dibbell afirma:

“Ele (Gilberto Gil) estava sugerindo que o movimento do software livre, e a contracultura dos anos 60 tinham um objetivo comum, que era o de transformar a cultura totalmente. Gil pode falar de maneira um pouco maluca, claro, mas ele não é estúpido. A tropicalização, com todas as suas idéias envolvendo subversão, canibalismo e guitarras elétricas, significa para Gil no fim das contas ‘os marginalizados pela sociedade brasileira tendo acesso ao mundo digital. (…) A inteligência reprimida dos pobres e da classe média do Brasil tendo acesso à essa ferramenta de potencialização da inteligência que é o mundo digital.’ “

De certa forma, a ligação de Gil da informática com o LSD não deixa de ser efetiva. É dito que um certo pesquisador de informática certa vez teria dito: “Existem apenas dois produtos conhecidos da Berkley: o LSD e o UNIX. Não pode ser coincidência!” Se imaginarmos que o GNU/Linux, o resultado mais visível do movimento do software livre surgiu do UNIX, fica visível que a ligação de Gil de certa forma tem sentido.

Mas é bom lembrar uma coisa mais interessante do movimento da contracultura que, de certa forma também liga o próprio tropicalismo ao LSD: o termo contra-cultura talvez seja um pouco errôneo, haja visto que o movimento da contra-cultura não tinha como objetivo o extermínio da cultura, da mesma forma que os movimentos Creative Commons e do Software Livre não visam o extermínio do copyright. A contracultura surgiu em um momento em que a cultura era uma ferramenta de repressão usada pelos poderosos da sociedade contra qualquer crítica a ela. Woodstock surgiu não como um bacanal movido a drogas e rock’n'roll, mas sim como liberdade: o documentário Woodstock mostra cenas de pessoas nadando na lama, praticando tantra yoga, fumando baseado, freiras assistindo aos shows calmamente, pessoas pregando a “flower power“… enfim, todos fazendo o que desejavam sem incomodar os demais. Crítica construtiva, embora regada com o niilismo característico do seu período: podemos dizer que isso caracterizou o movimento contra-cultural, principalmente no caso dos beatniks.

O tropicalismo também surgiu quando as formas culturais da música, com a Bossa Nova, negavam as raízes culturais brasileiras, em favor de uma forma mais “acadêmica” de música. Como o próprio Caetano Veloso afirma: “foi um tanto chocante. Nós viemos com novas idéias que envolviam guitarras elétricas, poesia virulenta, mal gosto, música tradicional brasileira, missas católicas, pop, kitsch, tango, sons caribenhos, rock’n'roll, e também a nossa música avant-garde e auto-entitulada séria.” (ibid.) Uma “geléia geral” de músicas formadas em cima de muitas idéias teoricamente díspares. Antropofagia cultural. Brasil, pura e simplesmente.

Na Internet, de certa forma, vivemos em uma verdadeira “viagem lisérgica”: manifestos, contos, fotos eróticas, tratados de filosofia, teses econômicas, Sócrates, Osama Bin Laden, Bill Gates, Lawrence Lessig, Linus Torvalds, Richard Stallman, Marcelo Tosatti, profanação, anarquia, positivismo, kitsch, Blogs, chats, mensagens instantâneas, emails, redes de amizade como a Orkut e a NetQI, Fotologs, P2P, Websites, fanfictions… É em meio a essa “geléia geral” de cultura que vivemos.

Uma das coisas mais difíceis para as pessoas que ainda não conseguiram entender esse novo ambiente é entender como separar e disponibilizar informações úteis em meio a tal “geléia geral”. Isso realmente é complicado, mas não tanto para um povo adepto à antropofagia cultural como o brasileiro.

O primeiro passo é entender que a Internet absorve tudo. Colocar conteúdo nela é dar a cara a tapa: você pode ser criticado, você pode ser elogiado. Podem mandar sua mãe para locais pouco agradáveis fazer coisas pouco agradáveis. Podem ofender seus ancestrais, sua anatomia ou suas opções. Por isso é importante a antropofagia: não é temer, nem aceitar pura e simplesmente, e sim deglutir com tudo, digerir e criar algo novo.

O segundo é entender que liberdade de expressão não é apenas uma coisa vaga, mas que é uma verdadeira opção de vida na Internet. A Internet é sobre carpe diem, sobre aproveitar o dia, mas lembrando que carpe diem nada tem a ver com ser idiota. Quebre as leis, e isso não é mais carpe diem, e sim estupidez. E a Internet também não perdoa a estupidez…

E, por fim, e é exatamente aonde as grandes empresas vêem a “infecção cultural”, qualquer mecanismo de repressão na Internet, por mais eficiente que seja, não o será o tempo todo: a própria China tem problemas em manter os sites proibidos de fora da Muralha Digital da China. Satanismo, pedofilia, zoofilia, aberrações de todos os tipos convivem naturalmente com sites positivistas e atitudes boas. É a “geléia geral” novamente ativa. É a antropofagia cultural. Lembre-se: não é temer, nem aceitar pura e simplesmente, e sim deglutir com tudo, digerir e criar algo novo.

e-Tropicalia

Qual é o fim das coisas na Internet? Como impedir que a lei vá contra Internet e vice-versa?

Lessig (2004), em seu livro “Cultura Livre” e com o movimento Creative Commons, expõe uma solução polêmica: que tal defender uma parte dessa antropofagia cyber-cultural chamada Internet?

Antes que as pessoas considerem loucura, é interessante vermos os resultados de movimentos como a Tropícália, a contra-cultura e o software livre. Todos eles, apesar de poderem terem feito algumas coisas “ruins”, geraram coisas muito boas: a tropicália gerou toda uma forma de entender-se a música, que inspira músicos tão diversos quanto Beto Guedes, Raul Seixas e Pato Fu; a contra-cultura rompeu certas “normas” opressivas, como o fato de as pessoas definirem quem você é por suas roupas; e o software livre gerou programas de computador de alta qualidade, com liberdade de aprendizado e expressão. Isso porque tais movimentos puderam pela lei beberem de fontes da cultura. A mesma fonte da qual bebeu a Disney e outras grandes empresas culturais. A mesma da qual bebeu a Microsoft e outras grandes empresas de software.

Mas essas empresas querem cercar com muros altos a fonte da cultura. Como Deus, querem impedir as pessoas de chegarem ao paraíso da cultura. Como os senhores feudais, desejam serem os únicos a determinar como a cultura e a vida das pessoas deverá ser regida. E, pior, elas possuem a força política e financeira para isso. E cada vez mais, elas adquirem a força legal.

É hora da sociedade voltar a entender que o valor do ser humano não vem das exclusividades, e sim da capacidade de cada um contribuir um pouquinho para aumentar a cultura e conhecimento do ser humano. Roma não foi construída em um dia, e não foi propriedade de ninguém. Nenhum dos grandes gênios que a humanidade já teve, de Sócrates até Stephen Hawking, passando por Newton, Einstein e assim por diante fechou seu conhecimento: alguns, na prática, como Hawking, procuraram a tornar o mais simples e esclarecida possível, de forma que todos tivessem acesso a tal cultura e conhecimento.

A Cultura Livre, o software livre, devem ser tratados com o mesmo carinho e idéias pelo ser humano como as envolvidas na preservação da Amazônia, da Antártida, das águas… A humanidade está sendo espoliada pelas grandes empresas que querem criar em cima da propriedade da humanidade chamada “domínio público” sem oferecerem nada em troca.

Precisamos de uma e-Tropicalia, urgente. Precisamos de mais “cyber-canibais”. Não criminosos, nem anarquistas, mas sim de pessoas que não tenham medo de criar, de escrever, de defender os direitos dos outros, de lutar para preservar essa saborosa “geléia geral” chamada Internet.

Lembre-se: não é temer, nem aceitar pura e simplesmente, e sim deglutir com tudo, digerir e criar algo novo.


Bibliografia:

DIBBELL, Julian – “We Pledge Allegiance to the Penguin“, Wired, 12/11, disponível em http://www.wired.com/wired/archive/12.11/linux.html, acessado dia 20/11/2004

LESSIG, Lawrence – “Cultura Livre“, tradução de Fábio Emilio Costa, disponível em http://www.pe.softwarelivre.org/pixies/livros/culturalivre.pdf, acessado dia 12/12/2004


powered by performancing firefox

Enviado em Cultura Livre, Internet, Software Livre | 1 Comentário »

HP Code

Publicado por Fábio Emilio Costa em 23 23UTC Janeiro 23UTC 2007

Para você usar em suas assinaturas


Versão 1.1

Por Bojan ugarin

Tradução não-oficial: Samwise Weasley

Introdução

Você já ficou imaginando o que quer dizer todas aquelas letras, sinais de mais e de menos no rodapé da mensagem de alguém? Elas são os autodenominados “Geek Codes”. Agora existe um deles relacionado a HP também. Você pode mostrar suas preferências sobre o Potterverso para o mundo todo.

Abaixo seguem as instruções sobre como criar manualmente seu HP Code.

O Código

Você deve começar seu código identificando-o como HPCode(1.1) – 1.1 é a versão do código

Adicione um espaço em branco. Como o código é feito de seções, você deveria colocar um espaço em branco entra cada uma das seções. As seções são:

  1. Casa/Escola
  2. Classificação dos Livros
  3. Opinião sobre Fanfiction
  4. Preferências sobre Quadribol
  5. Classes e
  6. Shippers;

Casa de Hogwarts

Diga qual casa de Hogwarts você gostaria de estar.

A Qualquer uma
G Grifinória
H Lufa-Lufa
R Corvinal
S Sonserina

Ou se você não for de Hogwarts, você pode escolher uma escola estrangeira.

B Beauxbattons (França)
D Durmstrang (Leste Europeu)
I Instituto das Bruxas de Salém (EUA)

(Nota: para aqueles que ainda não leram Cálice de Fogo, essas três escolas são mencionadas em Cálice de Fogo; Bauxbattons e Durmstrang o tempo todo, e o Instituto das Bruxas de Salém no capítulo sete. Existe a suspeita de que existem outras escolas mas nós não sabemos seus nomes. Foi incluida também a localização aproximada para essas três. Hogwarts fica na Inglaterra, é claro! ;-) )

Livros

Escreva suas opiniões sobre os livros

PS Pedra Filosofal
COS Câmara Secreta
POA Prisioneiro de Azkaban
GOF Cálice de Fogo
OOTP Ordem da Fênix

Então use esse modificadores para mostrar o que você achou de cada livro.

Simplesmente Odiei
Não gostei
- Não achei legal
= Não tenho uma opinião sobre ele
+ Razoável
++ Gostei dele
+++ Amei esse livro

Se acontecer de ter opiniões iguais para mais de um livro e apenas um deles for seu favorito. (ex.: PS=COS+POA+++GOF++OOTP+++), então coloque um asterisco (*) na frente dele (ex: PS=COS+*POA+++GOF++OOTP+++) Você deverá fazer isso apenas para tornar claro qual livro é o seu favorito.

Por favor, apenas opine sobre os livros que você leu. Se você, por exemplo, leu apenas os primeiros quatro livros, mas não Ordem da Fênix, deixe-o de fora do seu Código.

Fan Fiction

Escreva sua opinião sobre Fanfictions

FF– Odeio
FF- Não gosto
FF= Não tenho opinião formada
FF+ Gosto
FF++ Amo

Se você prefere uma fanfic (específica) a todos os livros, você então deveria colocar o asterisco diante do FF. (ex. PS=COS+POA++GOF+++OOTP+++ *FF++)

Novamente, se você nunca leu fanfics, simplesmente pule essa parte.

Quadribol

Diga em que posição de um time de Quadribol você gostaria de jogar

QA Qualquer uma
QC Artilheiro
QK Goleiro
QB Batedor
QS Apanhador
Q- Não jogo quadribol, e não estou nem aí para Quadribol
Q= Não jogo quadribol, e não tenho uma opinião formada
Q+ Não jogo quadribol, mas gosto de assistir
Q? Não faço a menor idéia do que seja Quadribol

Classes

Escreva quais classes em Hogwarts você gostaria de fazer e qual sua opinião sobre elas (Como não sabemos nada sobre as classes em Beauxbattons, Durmstrand e no IBS, vamos simplesmente assumir que elas são iguais às de Hogwarts).

CH Feitiços
DD Defesa contra as Artes das Trevas
HB Herbologia
HM História da Magia
PO Poções
TR Transfiguração

Estas são as matérias compulsórias em Hogwarts, e você também deveria adicionar algumas outras:

AR Runas Antigas
AT Aritmancia
CM Trato de Criaturas Mágicas
DV Adivinhação
MS Estudo dos Trouxas

Novamente use modificadores para mostrar o que você acha de cada aula.

Não aguento essa matéria
Não gosto dela
- Preferia não ter que estudá-la
= Não sinto nada em especial por essa aula
+ Legal, mas existem aulas melhores
++ Gosto dela
+++ Amo-a, praticamente vivo para ela

Novamente você deveria marcar sua classe predileta com um asterisco, e deixar de fora todas as aulas (optativas) que você não estudaria.

Shipper

Esta é a última sessão do seu código, e é sobre os relacionamentos entre personagens aqui você pode dizer que personagens você acha que deveriam ficar juntos. Primeiro coloque a abreviatura para o homem (na lista dos “Garotos”) coloque uma barra (/) e então a abreviatura para a mulher (na lista das “Garotas”). Se você quiser colocar mais de um shipper, separe-os usando um traço (-).

Você vai obter algo mais ou menos assim:

b1/g1-b2/g2-b3/g3-(…)-bn/gn

Aqui está uma lista de pessoas que já foram citadas até agora (agradecimentos a Troels Forchhammer):

Garotos: Garotas:
AG Antônio Goldstein Ab Arabella Figg
BW Gui Weasley An Angelina Johnson
CC Colin Creevey Al Alicia Spinnet
CW Carlinhos Weasley Ch Cho Chang
DC Dênis Creevey El Heloísa Midgeon
DD Dédalo Diggle Em Emmeline Vance
DM Draco Malfoy Fl Fleur Delacour
DT Dino Thomas Ga Gabrielle Delacour
DU Duda Dursley Gi Gina Weasley
ED Elias Doge Ha Ana Abbott
EM Ernesto MacMillan He Hermione Granger
FW Fred Weasley Hs Héstia Jones
GW Jorge Weasley Ka Katie Bell
GG Gregório Goyle La Lilá Brown
HP Harry Potter Ls Lisa Turpin
JF Justino Finch-Fletchley Lu Luna Lovegood
KS Quim Shacklebolt Ma Marieta Edgecombe
LJ Lino Jordan Ml Emíla Bulstrode
MC Miguel Corner Mn Minerva McGonagall
MF Marcos Flint Mo Murta-Que-Geme
NL Neville Longbottom Mr Morag MacDougal
OW Olívio Wood Ol Olímpia Maxime
PW Percy Weasley Ps Pansy Parkinson
RB Rúbeo Hagrid Pv Parvati Patil
RL Remo Lupin Pm Padma Patil
RW Rony Weasley Ro Madame Rosmerta
SB Sirius Black Sa Sally-Anne Perks
SF Simas Finnigan Su Suzana Bones
SS Severo Snape Sy Síbila Trelawney
TB Terry Boot To (Nimfandora) Tonks
TN Teodoro Nott    
VC Vicente Crabbe    
VK Victor Krum    
ZS Zacarias Smith    

Alguns exemplos

NL/Ha-SS/Ro Significa que Neville deveria ficar com Ana Abbott e
Snape com a Madame Rosmerta
JF/Su Significa que Justino deveria ficar com Suzana Bones

Se você achou essa parte muito complicada ou simplesmente não gosta de shippers, pule-a.

Finalmente

Quando você terminar isso, seu HP Code deverá parecer mais ou menos assim:

HPCode(1.1) - S PS=COS+*POA+++GOF++OOTP+++ FF= QCCM+*CH+++DD++HB-HM++MS+PO+++TR+++ HP/Lu-RW/He

(Este é o código do criador do HP Code)

Ou assim:

HPCode (1.1)-H PS++COS+++POA+++GOF+++*OOTP+++ FF++ QB
             CH+++DD+++HB++HM+PO++TR+++AR+++AT+++*MS+++
             NL/Gi-BW/Fl-RB/Ol-RW/He-HP/Lu-RL/To

(Esse é o HP Code do tradutor)

(N.T.: É interessante colocar um link para a página do HP Code, para que aqueles que não o conhecem consigam o entender e traduzí-lo. É fácil fazer isso: coloque abaixo do seu HPCode

HPCode – www.hogwarts-library.net/common/hpcode.html)

Enviado em Harry Potter, Off-Topic | 1 Comentário »

RPG for Kids

Publicado por Fábio Emilio Costa em 23 23UTC Janeiro 23UTC 2007

Um pequeno manual para RPG com crianças

Por Fábio “Sam Weasley” Costa

Uma das coisas que mais reparei desde que comecei a jogar RPG em 1992 (Sim, eu sei… Tô ficando velho! E daí? :-p ) é que muitas vezes os jogadores começam a jogar com 13 e 14 anos, ou até menos. Isso não seria nada demais, muito pelo contrário: já é mais que comprovado que o RPG é uma diversão sadia quando bem aplicada.

O problema é que muitas vezes tais jogadores começam jogando com RPGs que não são adequados para a sua idade por:

  1. Possuírem regras demasiado complexas e/ou;

  2. Possuirem cenários muito pesados;

Isso é um grande perigo, pois pode resultar em algumas coisas REALMENTE sérias:

  1. Imagine que um de seus jogadores seja uma criança ou pré-adolescente de certa forma… perturbado. Talvez ele tenha uma família severa, ou lembranças ruins de algum evento qualquer, ou… Enfim, indo direto ao assunto, essa criança… “não é lá muito boa das idéias”. Então você coloca-lhe uma situação na qual ele se sente todo-poderoso com relação à vida. Ótimo. Só que essa criança não saberá distinguir a realidade da ficção e poderá acabar causando problemas MUITO, mas MUITO SÉRIOS MESMO!

  2. De repente, você tá jogando um cenário qualquer mais pesado. Tudo OK… até o momento em que a mãe de um dos garotinhos ouve-o dizer: “Eu <preencha aqui com seu clichê de terror predileto> para invocar <preencha aqui com seu demônio favorito>”. Bem… Tá armada a confusão.

  3. Imaginemos que ainda assim você seja sortudo e não tenha nenhum desses problemas, mas acaba acontecendo de algum panaca misturar drogas, álcool e RPG em uma mistura macabra. Tá, você saber que isso acontece em tudo que mistura drogas, álcool e , mas 99,999999999% do mundo não sabe. Vai ser mais fácil você matar o Tarrasque do que convencer as pessoas de que isso NÃO É SÉRIO!

OK. Vimos rapidamente o tipo de coisas “legais” que podem acontecer com a pessoa despreparada para mestrar para crianças.

Mas como mestrar corretamente para crianças?

Bem, nesse ponto tive grande sorte: fui Mestre QUANDO criança e fui Mestre PARA crianças. E em ambas as situações fui bem sucedido.

Ou seja, devo ter feito algo certo.

Vou assumir: não sou psicólogo, nem pedagogo, muito menos sociólogo, quiçá doutor em qualquer coisa. Sou apenas um Mestre veterano dando seus pitacos e R$ 0,50 de prosa. Mas, como disse anteriormente, fui bem sucedido, o que quer dizer que, de alguma forma, devo ter feito algo certo.

Vou dizer as coisas que creio que funcionam para mim. Sinta-se livre, como Mestre, para contradizer, ignorar e até mesmo xingar como babaquice qualquer coisa que estou escrevendo: como disse, não sou dono da verdade. Mas leia-as com carinho: são experiências de uma pessoa que já mestrou para crianças e conseguiu o fazer mantendo sua (pouca ;-) ) sanidade intacta.

Bem, sem mais delongas, vamos direto ao assunto:

1-) Cenário Adequado:

Pelamordedeus… Se Vampiro é recomendável para maiores de 18 anos, não o é sem razão. Existem detalhes em seu ambiente que são pesados demais para uma criança “deglutir” com facilidade.

Uma escolha de um cenário inadequado para mestrar para crianças pode ser o começo de um grupo mal formado. Muitas vezes, cenários que lidem com excessivo terror ou suspense deveriam ser evitados: crianças não costumam lidar muito bem com esse tipo de coisa. O mesmo vale para cenários com excessiva violência, como os de cyberpunk, ou com conspirações e política em demasia, como Arquivo X.

O que poderia então ser um bom cenário?

Bem, em geral os grandes sucessos dos desenhos da TV podem ser bons cenários. Pokémon, Digimon, Beyblade… todos esses tem o potencial para formar bons cenários para RPG com crianças, ainda mais por serem cenários aos quais os (futuros) jogadores estarão acostumados. Porém, é importante ter cautela e saber definir o pitch correto para o cenário conforme a criança. Algumas crianças são suficientemente maduras para lidar com violência ou suspense, mas outras apenas fingem serem maduras. É MUITO IMPORTANTE essa cautela.

Um cenário inadequado poderia ser Dragon Ball Z, pela excessiva violência do mesmo. Lembre-se: Goku possui golpes capazes de destruir um planeta! (!!!) Ou seja, a violência é grande demais…

Para falar a verdade, qualquer desenho ou seriado pode potencialmente se transformar em cenário de RPG. Por exemplo: se você está jogando RPG com crianças de 5, 6 anos, porque não um cenário dos Ursinhos Carinhosos? Antes de me bater, me xingar ou me sacrificar para Cthulhu, raciocine: os Ursinhos Carinhosos vivem resolvendo o problema de pessoas infelizes, lutam contra o Coração Gelado e suas criações e podem invocar um poder de raios de alegria (“Ursinhos Carinhosos… Contagem regressiva!” - Ursinho Ternura, Ursinhos Carinhosos). Se você parar para pensar, não é muito diferente do que o que você tem quando joga, por exemplo, em um cenário baseado em DBZ. A diferença é que você trabalha muito menos a violência e bem mais a inteligência como forma de resolver seus problemas.

2-) Regras adequadas:

Bem… Imaginemos que você tenha escolhido realmente um bom cenário para crianças. Mas você escolhe jogar, por exemplo, com o sistema D20.

Poxa vida, você realmente quer que eles tenham que saber que uma Investida gera Ataques de Oportunidade, ou que cada turno de combate permite duas ações para um jogador?

Muitas crianças, principalmente de 6 a 9 anos, não possuem a inteligência lógico-matemática suficientemente desenvolvida para trabalhar com conceitos como Ataques de Oportunidade, Investida,Iniciativa…

Uma dica é trabalhar com o sistema de regras mais simples possível, ou então enxutar ao máximo as regras. Elimine toda a gordura que você puder do sistema de regras. Ignore coisas tipo: tipo de danos, regras especiais de dano, bônus e redutores de circunstância…, de forma a resumir o sistema ao máximo.

Melhor ainda: procure ser o mais descritivo possível. Trabalhe com ação e reação. Procure usar a imaginação da criança a seu favor (e creia-me: crianças típicas possuem MUITA, mas MUITA imaginação MESMO!).

Vejamos um exemplo ruim nesse caso:

  • Mestre: “Você está sendo perseguido por um monstro.”

  • Jogador: “Uso uma corda para fazer ele tropeçar.”

  • Mestre: “Você precisa rolar um sucesso em Usar Cordas, CD 25, -2 porque ele está te seguindo, e ele tem direito a um teste de Reflexos, CD 20…”

  • Jogador: “?!?!?!?”

Agora, vejamos um exemplo bom:

  • Mestre: “Você está sendo perseguido por um monstro.”

  • Jogador: “Uso uma corda para fazer ele tropeçar.”

  • Mestre: “Você vê um cipó que pode funcionar como corda.”

  • Jogador: “Pego o cipó.”

  • Mestre: “Aonde você amarra o cipó?”

  • Jogador: “Em alguma árvore perto…”

  • Mestre: “OK, você amarra a corda. Role um dado e vamos ver se você consegue derrubar o monstro.”

 

(Na verdade, o Mestre já definiu que o monstro é burro demais para notar a corda que o personagem apanhou e vai tropeçar na corda)

Viu a diferença? Ele trabalha a imaginação do jogador e algumas definições simples.

3-) Descrições… Descrições… Descrições…

Uma das coisas mais difíceis de serem feitas em um grupo de crianças é descrever cenários, personagens, situações… Crianças em geral são bem dispersas e não se concentram facilmente.

Por favor, aqui fuja do excessivo tecnicismo. Procure dar uma descrição simples e “mágica” da coisa. Nunca, mas NUNCA MESMO, fique em detalhes como “a porta era de madeira” ou “a escadaria tem uma largura de 9 metros”. Use, por exemplo, “a porta era muito velha e parecia fora do tempo e do lugar” ou “a escadaria era luxuosa, e a qualquer momento poderia surgir uma princesa dali”. Aqui você pode até mesmo abusar de adjetivos pomposos que normalmente não seriam adequados para crianças: coisas como “brilho aúreo” ou “força hercúlea” podem ser usadas naturalmente, desde que consigam, mesmo que inconscientemente, transmitir a idéia de poder e magia desejada.

Um dos maiores sucessos atualmente, Harry Potter conquistou a todos, crianças e adultos, graças a várias características, entre elas a descrição “mágica” dos cenários, mesmo nas coisas mais bobas do mundo, como quando o Sr. Dursley “escolhia a gravata mais sem graça do mundo” para ir ao trabalho no dia da queda de Voldemort. Isso leva a criança a pensar: que gravata sem graça era essa? Azul Marinho? Preta? Vinho? Tinha pregadura? Era comum ou borboleta? Que tipo de nó era o que o sr. Dursley usava? Compare essa descrição com “escolhia uma gravata azul marinho de seda”: a última foi definitivamente mais técnica e precisa (revelou a cor da gravata), mas em compensação foi MUITO insossa!

Vale para TUDO… Qualquer descrição que você fizer, faça-a “mágica”: pode ser de criaturas, pessoas, locais, objetos, circunstâncias…

Por exemplo, veja esta descrição de Hogwarts:

 

“Vocês vêem um grande castelo, a mais ou menos uns 500 metros, sobre a encosta de um rochedo. Suas paredes são de rocha envelhecida pelo tempo, e possui uma grande quantidade de torres e torreões de todos os tamanhos. Pelas janelas das mesmas, vocês podem ver as luzes de milhares de velas, que contrastam totalmente com a luz da lua que projeta seu reflexo nas águas…”

Compare com esta outra descrição:

 

“Vocês vêem um grande castelo no horizonte, sobre um rochedo, como se o castelo estivesse equilibrado sobre uma enorme rampa de terra. A luz do luar contrasta com as paredes escuras e aconchegantes, que lhes transmitem segurança e força milenares, como se o próprio tempo não tivesse conseguido vencer a poderosa mágica que o mantém inteiro. Do muro e das diversas torres e torreões podem-se ver milhares de pontos luminosos, como que feitos por milhões de velas de brilho bruxuleante que transmitem a esperança de conforto e aconchego em seu novo lar. Essas velas, por sua vez, contrastam com o brilho prateado da grande lua cheia refletida no espelho formado pelas águas limpas e cristalinas do lago adiante…”

Note nessa última descrição uma coisa: há muitos elementos emocionais, coisas que vão transparecer o tipo de emoção que o que é descrito passa para os personagens. Coisas como “força milenar”, “brilho bruxuleante”, “esperança de conforto e aconchego” são coisas que na verdade “não existem”: elas são sensações do personagem em relação ao que se vê. Brinque muito com essas coisas. Use todo o lirismo que você puder. Não economize no português, pelo menos enquanto você não ficar empolado e pedante. Não tenha medo de divagar.

A regra aqui é simples: quanto mais espalhafatosa, profunda e “mágica” for a descrição, MELHOR!!!!

4-) Personagens de características únicas:

Esse vale para qualquer tipo de aventura de RPG, mas principalmente com crianças: coloque personagens de diversos tipos, brinque com os estereótipos do cenário, rompa barreiras, nunca deixe os jogadores imaginarem que sabem tudo!

Por exemplo: voltando a Harry Potter, que tipo de personagens começariam uma campanha normal em Hogwarts? Muito provavelmente, alunos com 11 anos de idade, como o próprio Harry e seus amigos no começo da série. Mas são todos bruxinhos de 11 anos de idade “padrão” conforme suas casas? Será que não podemos variar um pouco isso?

Trabalhe sempre os elementos do cenário a seu favor! Por exemplo: no caso acima, dos personagens em uma campanha de Harry Potter, imaginemos que você tenha criado alguns NPCs para essa aventura e que eles estejam já definidos quanto às casas aonde vão. Se um deles for um futuro aluno da Grifinória, mostre-o sério, mandão e responsável, mas pode mostrá-lo também como descolado, vivo e honrado. Um aluno de ufa-Lufa poderia ser tímido, sensível e tristonho, mas também poderia ser alegre, companheiro e falante. Um bruxo da Corvinal poderia ser compenetrado, estudioso e ordeiro, mas poderia ser exótico, espalhafatoso e dado a estranhezas. Um aluno de Sonserina poderia ser frio e calculista, mas no fundo tendo um bom coração, ou poderia tentar mostrar-se amigável, mas na realidade sendo uma pessoa completamente maquiavélica.

Defina para cada personagem uma característica marcante única. Por exemplo: um dos personagens de minha campanha de Harry Potter mais atual é Gianfrancesco “Toppolino” Andreotti, um bruxinho italiano que acabou indo para a Lufa-Lufa. Enquanto iam no trem para Hogwarts ele e mais alguns outros bruxinhos, Toppolino ficava jogando bolas de malabarismo, como se fosse uma forma dele se distrair. Essa característica, assim como o “nome do meio” (que, para os curiosos, significa “Pequeno Rato” em italiano, e que é como é chamado o Mickey Mouse na Itália), vem do background de Toppolino, que era palhaço em um circo na Itália antes de descobrir que era um bruxo e ir para Hogwarts, entre outras curiosidades.

5-) Crie um centro de referência:

Atenção! Embora tenhamos dito na dica anterior que você deva brincar com estereótipos e romper barreiras, tome MUITO CUIDADO! Existem certas coisas que devem ser mantidas, para o bem de “manutenção do cenário”.

Citando Harry Potter, embora você possa quebrar certas barreiras (como tornar Hogwarts, de certa forma, uma Escola de Magia internacional), você deveria manter certas coisas fixas, para manter o cenário consistente (como, por exemplo, as Quatro Casas, a Plataforma 9 e 1/2 em King`s Cross ou a Floresta Proibida).

Podemos dizer que tais pontos são os “centros de gravidade” do cenário: são as bases das bases das bases do cenário, as coisas que formam o mais perfeito cerne do cenário, o que o distingue de tudo o mais. Harry Potter pode ser distinto do resto dos cenários de magia que se passam no mundo moderno por algumas características que incluem: o fato dos bruxos estudarem em uma escola que existe apenas para ensinar magia; a necessidade de todos os bruxos usarem varinhas para executarem mágicas; a existência de mágicas tão terríveis que mandam bruxos para prisão; a impossibilidade de se trazer pessoas de volta da morte através da magia, por mais ilógico que isso possa aparentar; o fato da magia ser quase tão codificada quanto a ciência das pessoas comuns (os trouxas), mas desta exigir também um poder pessoal derivado do talento e do estudo… E assim por diante.

Não existem normas sobre até aonde mexer, você deve descobrir o seu pitch de manutenção e modificação do cenário. Leituras, releituras, re-releituras, pesquisas em sites de fãs, assistir filmes e muita pesquisa de tudo o que se refere ao cenário logo lhe darão os “centros de gravidade” do cenário com total facilidade, e logo você estará sabendo o que você pode mexer, e até onde você pode mexer.

6-) Personagens Preto no Branco:

Por mais que os RPGs atuais defendam a Escala de Cinza, ou seja, personagens nem totalmente bons nem totalmente ruins, quando se joga com crianças é importantíssimo manter essa Escala o mais reduzida em tonalidades possível.

Isso porque crianças tendem a, em geral, não entenderem certa… “sutilezas”… da moralidade “adulta”. O mundo infantil em geral é dividido em estereótipos de bom/mal, feio/bonito, alegre/triste, novo/velho. Tais estereótipos devem ser mantidos: são o centro de referência a partir do qual os personagens dos jogadores poderão interagir com os NPCs que o Mestre expõe para eles.

Perceba que isso exige, de certa forma, que o Mestre redescubra sua “criança interior”. É algo mais ou menos como o filme “Hook: A Lenda do Capitão Gancho“, aonde Robin Williams interpreta um Peter Pan crescido que, para enfrentar o Capitão Gancho e libertar seus filhos de suas garras maléficas, ele precisa recuperar seus poderes. Mas ele só fará isso se voltar a entender a lógica infantil segundo a qual com uma pitada de pó mágico e um pensamento feliz e você voa!

É essa lógica que o Mestre deve redescobrir: é, de certa forma, voltar a acreditar em Papai Noel, no Coelho da Páscoa, e assim por diante. É uma lógica simplista, aonde mais vale a imaginação que um punhado de dólares.

O Mestre ainda pode trabalhar com a lógica dita “adulta”, com seus relativismos e conceitualismos, hipocrisias e meia-verdades e mentiras completas. Na verdade, ele deveria sempre pensar o comportamento dos personagens adultos sob essa lógica. Mas sempre usando a lógica infantil: o professor que dá muito castigo é malvado (mesmo querendo o bem da criança), o professor que não dá dever de casa é bom (mesmo que ele não esteja nem aí para a criança) e assim por diante.

7-) Lição de Moral:

Se fazemos várias vezes a analogia entre os RPGs com crianças e os Contos de Fadas, percebemos que existe mais uma necessidade de uma boa aventura de RPG para crianças: uma Lição de Moral.

A Lição de Moral é o próprio sentido da aventura: se os personagens entenderem a Lição de Moral, conseguirão completar a aventura. Senão, acabarão sendo vitimados pelos efeitos da Lição de Moral, em maior ou menor intensidade, mas de forma impreterível.

As Lições de Moral podem ser definidas antes ou durante a aventura, sendo preferível antes, já que elas, de certa forma, é quem estupulam o “feeling” da aventura. Isso quer dizer, são as Lições de Moral que oferecem uma espécie de “comportamento referencial” para NPCs e PCs, assim como certas “linhas de conduta” na tomada de decisões pelo Mestre.

Se, por exemplo, você definiu a Lição de Moral de uma como “Violência gera apenas Violência”, o comportamento dos personagens deve refletir isso: personagens agressivos vão sempre se dar mal enquanto personagens que procurem resolver seus problemas de outra forma serão sempre beneficiados…

Aqui há uma certa “ruptura” com a lógica que normalmente se pensa em RPG. Em geral, joga-se RPG no esquema meio “causa-conseqüência”. Se ele me bate, eu bato nele…

Esse tipo de lógica funciona muito bem com jogadores maduros como pessoa (mesmo que inexperientes como RPGistas), mas com crianças essa lógica torna-se perigosa, podendo fomentar nelas reações não muito boas. Ela pode acabar desenvolvendo uma agressividade não natural, entre outras coisas.

Por isso, quando se joga com crianças, a lógica tem que ser como a dos Contos de Fada, envolvendo tudo o que eles apresentam: Lição de Moral, personagens Preto no Branco, etc…

8 – ) Nomes mágicos:

Mais um da série “magia no RPG infantil”: todos os personagens devem ter nomes “mágicos”, ou seja, nomes que inconscientemente “despertam” no jogador certas reações.

Por exemplo: um personagem alemão frio e calculista poderia ter o nome Frizt Gutenmeyer, enquanto uma personagem, por exemplo, canadense amigável e divertida poderia ter o nome de Alanis Carlsberg.

Você pensa que isso é apenas relacionado ao RPG? Nada disso!

Vamos dar uma dissecada no nome de alguns personagens de Harry Potter (novamente) para entendermos o impacto que um nome “adequado” pode causar no como você interage com ele:

  • Harry Potter: um nome aparentemente bobo, “comum e vulgar” (Petúnia Dursley), mas que de certa forma transparece força… Um bom nome para o menino que sobreviveu… Imagine se ele chamasse Ernesto… Ou Eduardo?

  • Rony Weasley: um nome que tem uma certa força, e tem um quê de companheirismo, o que não é nada mal quando você é amigo do “menino que sobreviveu”.

  • Hermione Granger: Um nome que tem em si próprio características de inteligência e esperteza (Hermione é o feminino de Hermes, o deus da comunicação grego, e Granger era o sobrenome de um filósofo muito importante.). Bem interessante que esse seja o nome da “sabe tudo” de Grifinória.

  • Draco Malfoy: Um nome ríspido, forte, que indica alguém que não mede esforços para conseguir um objetivo, e que tal objetivo é perverso. (Curiosidade: Malfoy é derivado do francês “má foi”, que significa “má vontade” ou “má fé”).

  • Neville Longbottom: Um nome bem tolo, e um tanto condizente com um personagem bastante desastrado… E que tem um longo (long) caminho para percorrer dentro de um abismo (bottom, que quer dizer depressão) que é a sua vida.

E você pensa que é só para pessoas? Não… Vejamos as Casas de Hogwarts:

  • Grifinória (original Gryffindor): Uma casa conhecida pela honradez e coragem, tem como símbolo o Leão, o animal mais majestoso e honrado em diversas histórias. E Grifinória vem de Grifo, um animal mitológico também associado a honra.

  • Lufa-Lufa (original Hufflepuff): Conhecida por sua dedicação e união, o nome Lufa-Lufa é meio que uma onomatopéia de uma pessoa fazendo grande esforço, como são esforçados os alunos dessa casa. O símbolo dela, o texugo, é um animal adorável, brincalhão e companheiro, mas uma vez provocado, ele ataca com uma ferocidade que assusta até mesmo animais maiores que ele.

  • Corvinal (original Ravenclaw): O corvo é um animal que em muitas culturas é mostrado como o mais sábio da natureza, e o nome Corvinal deriva justamente do animal símbolo dessa casa, conhecida por seus alunos inteligentes e estudiosos.

  • Sonserina (original Slytherin): ambiciosos por natureza, os sonserinos são capazes de tudo para atingirem os fins que desejam. E o ome diz bastante sobre isso: Sonserina deriva de sonso, um adjetivo que indica um animal ou pessoa dissimulado, matreiro, enganador. E talvez seja por isso que a cobra seja o animal símbolo dessa casa.

Vamos ficar aqui, que se fossemos gastar tempo mencionando sobre a “força dos nomes”, ficaríamos horas e horas e horas falando sobre esse assunto.

Bem, essas são apenas algumas dicas. Como disse, não sou dono da verdade. Gostaria de saber mais opiniões sobre esse texto, e posso ser localizado em fudgebrasil@yahoo.com.br.

Para você que quer usar essas dicas… Sinta-se livre.

E divirta-se!

powered by performancing firefox

Enviado em Off-Topic, RPG | Deixar um comentário »

Criando uma classe de janela em FLTK2 usando o FLUID

Publicado por Fábio Emilio Costa em 22 22UTC Janeiro 22UTC 2007

Reblog de um antigo post meu sobre programação. Espero que seja útil.

Simples e multiplataforma, a FLTK (lê-se ?fullticks?) é uma interface gráfica despretenciosa e que oferece recursos básicos para o seu desenvolvedor. Ela gera programas extremamente enxutos e leves em sua interface gráfica e está disponível em várias das principais plataformas e SOs da atualidade.

Nesse artigo, veremos como desenvolver uma classe de Janela utilizando-se do FLUID, um gerador de interface simplificado que vêm com o FLTK.

Nota: Os exemplos serão apresentados para o Dev-C++ for Windows. Para outros compiladores e ambientes operacionais, leia a documentação do compilador e obtenha maiores informações em http://www.fltk.org e http://www.fltk.net. Apesar disso, os exemplos de programação são todos genéricos, podendo ser usados em qualquer platadforma e compilador.

1-) Obtendo os DevPaks:

O Dev-C++ tem como principais características ser free software (GPL) e ser muito extensível, através dos DevPaks, pacotes especiais instalados no ambiente de desenvolvimento. Se você não tiver o Dev-C++, você poderá o obter em http://www.bloodshed.net/dev.

A primeira coisa é obter o DevPak do FLTK. Ele pode ser obtido em http://www.fltk.net/files/devpak/FLTK2.DevPak. Você também precisará do DevPak de libpthreads, copiado em http://www.fltk.net/files/devpak/libpthread.DevPak. Esses dois pacotes são necessários.

Com o Dev-C++ instalado, basta clicar duas vezes nos arquivos dos DevPak. Instale primeiro o libpthread.DevPak, em seguida o FLTK2.DevPak.

2-) Preparando o Dev-C++:

Você precisará preparar o ambiente, inserindo nele o FLUID. Para isso, clique no menu Ferramentas. Você terá um menu semelhante o abaixo.

No caso, o FLUID já está inserido, mas vejamos como inserí-lo no menu. Escolha a opção ?Configurar Ferramentas?. Aparecerá uma janela como a abaixo.

Clique em ?Adicionar? e você receberá uma nova janela, como a seguinte:

Digite ?FLUID? em Título e escolha os caminhos do programa e do diretório de trabalho. Em geral o caminho do programa será C:\Dev-Cpp\bin\fluid.exe, e o diretório de trabalho,C:\Dev-Cpp\bin\. Corrija esses dados conforme sua instalação. Clique OK. Aparecerá a entrada do FLUID na Janela ?Configuração das Ferramentas?. Clique OK. O FLUID já deverá estar no menu Ferramentas do Dev-C++.

Agora que o Dev-C++ já está configurado, vamos passar a ver como o FLUID funciona.

3-) Desenhando uma tela no FLUID:

Para começar, chame o FLUID no Menu Ferramentas. Você deverá receber uma janela como a seguinte.

O FLUID exige uma função para poder começar a criar os Widgets (os objetos de Janela). Para colocar uma função no fluid, vá em New | Code | Function/Method.

Você receberá uma janela como a seguinte (você pode ignorar por enquanto as opções e ir direto ao assunto clicando OK):

Com o tempo você poderá ver essas opções. De imediato, ignore-as e vamos para o assunto que é criar a janela: Vá em New | Group | fltk::Window. Isso irá lhe abrir uma janela. Clique duas vezes sobre ela e você irá receber uma janela de configurações do Widget. Sempre que precisar dessa janela para um certo Widget, clique duas vezes sobre ele:

Por enquanto vamos nos ater à aba GUI. Na aba Style você encontrará configurações relacionadas a cores e fontes do Widget. Na aba C++, você encontrará configurações expecíficas de C++, como visibilidade do Widget e por aí afora.

Na aba GUI, para a Window, alteraremos apenas a propriedade Label. Diferentemente de outras APIs de Interface Gráfica, a FLTK coloca labels em todos os seus componentes. Na verdade, o componente raiz de todos os demais componentes, fltk::Widget, pode ser usado como um Label caso necessário. No caso, vamos definir o Label como ?Hello World!?. As demais propriedades podem ficar como estão. Clique em OK ou aperte ENTER.

Agora temos uma janela vazia com um título na Janela (?Hello World!?). Agora vamos adicionar dois componentes na janela, mais exatamente um fltk::Input e um fltk::ReturnButton. Para isso, clique com o botão direito sobre a Janela. Você irá receber um menu semelhante àquele aonde você adicionou a função e a Janela. Escolha primeiro text | fltk::Input. Dimensione-a e posicione-a aonde preferir, como em qualquer outro ambiente RAD (como o VisualStudio ou o Delphi). Depois de posicioná-lo aonde desejar, clique duas vezes sobre o Input para chamar a janela de propriedades. O fltk::Input é como um componente Edit do Delphi ou um TextBox do VisualStudio. Ele aceita dados e pode alterá-los e tudo o mais.

Na janela de propriedades do fltk::Input, primeiro digite em Label ?Digite o seu nome:?. Depois, vá até Alignment. Perceba que há quatro setas indicando para as quatro direções básicas (para cima, para baixo, direita e esquerda). Clique na seta para cima para marcá-la e na seta para a direita para desmarcá-la. Clique novamente em OK ou pressione Enter. Repare que o label foi parar em cima do Input e centralizado em relação a ele.

Vamos agora para o fltk::ReturnButton. O fltk::ReturnButton é como um botão normal de outros RAD, mas com uma diferença fundamental: no Window aonde ele estiver, ele sempre será acionado quando a tecla Enter for pressionada. Você deve estar pensando agora no botão OK dentro da janela de propriedades do FLUID: ele é um fltk::ReturnButton. Para botões normais, a FLTK oferece o componente fltk::Button, sendo que o fltk::ReturnButton e o fltk::ReturnButton são intercambiáveis.

Clique duas vezes no fltk::ReturnButton. Na janela de propriedades, vamos mudar apenas o Label para ?Hello World!?.

Se você seguiu corretamente todos os passos, você deverá ter conseguido um Form similar a esse:

Se você conseguiu, parabéns! Você criou sua primeira janela no FLUID. Vá em File | Save e salve a janela criada pelo FLUID.

Nota: Em Windows o FLUID tem um bug no qual não pode salvar-se nenhuma janela em diretórios que tenham espaço no nome. Tenha sempre isso em mente ao salvar a janela.

Depois de salvar a janela, vá em File | Write Code. O FLUID irá gerar dois arquivos com o mesmo nome que você deu para a sua janela, mas com extensões .cxx e .h. Serão esses os arquivos que iremos usar no projeto. Pode fechar o FLUID após isso.

4-) Criando um Projeto FLTK2:

OK… Agora que fechamos o FLUID, a primeira coisa que precisamos fazer é voltar ao Dev-C++ e criar um projeto FLTK2 para podermos compilar o código gerado no FLTK.

Voltando ao projeto… Imaginando que tudo tenha sido feito corretamente, você agora terá dois arquivos, .cxx e .h. E agora voltamos ao Dev-C++.

A primeira coisa é ir em Arquivo | Novo | Projeto. Vai abrir-se uma janela como a abaixo:

Escolha, na guia GUI, FLTK2 (Static). Dê um nome qualquer ao projeto nas Opções de Projeto (Por exemplo, Teste). Vai se abrir uma janela normal, solicitando um local para gravar o arquivo .dev do projeto. Escolha um diretório qualquer conveniente para salvar este arquivo. Você receberá uma janela como a seguinte:

Perceba que o sistema já lhe gera um main.cpp. Não iremos o utilizar, mas se quiser compilá-lo para fazer um teste se o FLTK está bem instalado, pressione F9 ou vá em Executar | Compilar & Executar. Salve o arquivo se necessário (no diretório escolhido para o projeto!), e se tudo foi instalado corretamente (e deve ter sido para ter chegado até aqui), você receberá a seguinte janela:

PS: Os ícones na Barra de Tarefas não são partes da FLTK, e sim de um Plugin do WinAMP chamado WinAmpBar…

Se estiver tudo OK, voltemos ao projeto. Vamos inserir os dois arquivos gerados pelo FLUID no projeto. Para isso, copie os arquivos gerados pelo FLUID para o diretório aonde você salvou o seu projeto. Aproveite e renomeie o arquivo, mudando sua extensão de .cxx para .cpp. Depois, vá até o lado direito, aonde está o teu projeto e clique com o botão direito. Um menu como o abaixo irá aparecer. Clique em Adicionar ao Projeto e escolha os arquivos gerados pelo FLUID (relembrando que o .cxx teve sua extensão alterada para .cpp) .

Após adicionar os arquivos, você terá três arquivos no seu projeto: main.cpp e os arquivos .cpp e .h gerados pelo FLUID. Vejamos o .h (no caso, teste.h):

// generated by Fast Light User Interface Designer (fluid) version 2.0002

#ifndef teste_h

#define teste_h

#include <fltk/Window.h>

#include <fltk/Input.h>

#include <fltk/ReturnButton.h>

extern “C” { fltk::Window* make_window(); }

#endif

Na verdade, não vamos aproveitar muito desse código. Vejamos agora o .cpp (no caso, teste.cpp):

// generated by Fast Light User Interface Designer (fluid) version 2.0002

 

#include “teste.h”

 

fltk::Window* make_window() {

fltk::Window* w;

{fltk::Window* o = new fltk::Window(267, 99, “Hello World!”);

w = o;

o->begin();

{fltk::Input* o = new fltk::Input(30, 25, 205, 25, “Digite seu nome:”);

o->align(fltk::ALIGN_TOP);

}

{fltk::ReturnButton* o = new fltk::ReturnButton(70, 60, 130, 25, “Hello World!”);

o->shortcut(0xff0d);

}

o->end();

}

return w;

}

Agora podemos dizer qual será a idéia: perceba que o FLUID gerou os objetos que fltk::Window, fltk::Input, e fltk::ReturnButton usando comandos new, pois eles são objetos declarados nos headers (cabeçalhos) <fltk/Window.h>, <fltk/Input.h> e <fltk/ReturnButton.h>, que são importados no header teste.h. No caso, a idéia será declarar em teste.h uma classe herdando de fltk::Window, e dentreo criar um fltk::Input*, e fltk::ReturnButton*, dessa forma usando os comandos já gerados pelo FLUID para gerar os objetos durante à construção de nossa classe herdada. Na destruição da mesma, deveremos também lembrar de destruir os objetos fltk::Input*, e fltk::ReturnButton*, devolvendo a memória usada por ele.

Vamos começar:

5-) Modificando o .h:

Primeiro de tudo, vamos alterar o header teste.h. Para isso, vamos retirar a linha:

extern “C” { fltk::Window* make_window(); }

E colocar o seguinte código para definirmos a classe:

using namespace fltk;

 

class wHelloWorld:public Window

{

private:

Input *txtHelloWorld;

ReturnButton *btnHelloWorld;

public:

wHelloWorld();

~wHelloWorld();

};

Se você conhece bem C++, deve ter notado que originalmente declaramos que o header usa o namespace fltk. Quando falavamos lá em cima em fltk::ReturnButton, queríamos dizer um objeto ReturnButton no namespace fltk. Com o uso do comando using namespace fltk, evitamos a necessidade de indicar o namespace toda vez. Caso você acredite que você possa ter conflito de nomes usando esse método, utilize a declaração explícita com o fltk::.

Logo em seguida declaramos a classe wHelloWorld, que herda todos os métodos públicos de fltk::Window. Perceba que aqui poderíamos fazer sobrecarga dos vários métodos que a FLTK oferece para sua classe fltk::Window. No caso, porém, não iremos fazer isso. Continuemos, então.

Em seguida, declaramo dois ponteiros para objetos FLTK como privativos: Input *txtHelloWorld e ReturnButton *btnHelloWorld. Esses ponteiros indicarão os objetos que iremos manipular.

Logo abaixo, declaramos o construtor e o destrutor da classe wHelloWorld. Será neles que iremos manipular os objetos, criando-os antes do uso pelo software e os destruindo quando a janela for destruída.

Se você compilar o programa, você receberá o mesmo ?Hello World? visto anteriormente, já que não implementamos a classe wHelloWorld. Então vamos fazer isso.

6-) Implementando a classe wHelloWorld:

Agora vamos passar para a implementação da classe wHelloWorld. Antes, porém, vejamos o código gerado pelo FLUID para a janela em teste.cpp:

// generated by Fast Light User Interface Designer (fluid) version 2.0002

 

#include “teste.h”

 

fltk::Window* make_window() {

fltk::Window* w;

{fltk::Window* o = new fltk::Window(267, 99, “Hello World!”);

w = o;

o->begin();

{fltk::Input* o = new fltk::Input(30, 25, 205, 25, “Digite seu nome:”);

o->align(fltk::ALIGN_TOP);

}

{fltk::ReturnButton* o = new fltk::ReturnButton(70, 60, 130, 25, “Hello World!”);

o->shortcut(0xff0d);

}

o->end();

}

return w;

}

Perceba que ele começa com uma função chamada make_window(), que retorna um ponteiro para uma fltk::Window. Vamos tirar isso e colocar o nosso construtor:

wHelloWorld::wHelloWorld()

:Window(267, 99, “Hello World!”)

{

Window* w;

Perceba que aproveitamos a declaração da Janela gerada pelo FLUID, e aproveitamos o ponteiro fltk::Window* w declarado, pois precisaremos de um fltk::Window* dentro do construtor, e o fltk::Window* w declarado presta-se bem para isso.

Agora, vamos substituir as seguintes linhas:

{fltk::Window* o = new fltk::Window(267, 99, “Hello World!”);

w = o;

o->begin();

Pelo seguinte código:

w=this;

w->begin();

Utilizamos aqui o ponteiro this para auto-referenciar nosso objeto wHelloWorld específico. Em seguida, chamamos o método (ou função-membro, se você preferir) begin() de w, lembrando que w foi inicializado como this, ou seja, como o próprio objeto sendo criado. Esse método begin() é herdado por fltk::Window de fltk::Group e indica aonde o FLTK deverá começar a contar os objetos seguintes como parte da Window. Podemos dizer, utilizando o jargão do VB.Net, que a classe Window é um componente coleção (ou um objeto container, no jargão do Delphi), ou seja, pode ?armazenar? dentro dele outros objetos. Tudo que acontece com ele, acontece aos demais objetos: se ele é desativado, todos os demais objetos o são. Se ele é destruído, todos os demais o são também (em teoria, mas não custa nada dar uma reforçada).

Agora vamos inicializar o ponteiro para nossa.caixa de texto (ou Input), substituindo o seguinte código:

{fltk::Input* o = new fltk::Input(30, 25, 205, 25, “Digite seu nome:”);

o->align(fltk::ALIGN_TOP);

}

por:

txtHelloWorld = new Input(30, 25, 205, 25, “Digite seu nome:”);

txtHelloWorld->align(ALIGN_TOP);

Perceba que a sintaxe de quase todos os objetos FLTK é a mesma

<obj>(<x>,<y>,<l>,<h>,<caption>)

Aonde <obj> é o nome da classe, <x> e <y> indicam a posição aonde o objeto será inserido dentro do conteiner (no caso, wHelloWorld) em pixels, <l> e <h> indicam respectivamente a largura e a altura do objeto (também em pixels), e <caption> guarda um texto a ser exibido próximo (ou dentro) do objeto. No caso, o nosso txtHelloWorld é um Input (equivalente ao TextBox do VB.Net e ao TEdit do Delphi), será construído a 30 pixels do canto direito e a 25 pixels do topo do conteiner dele (no caso, wHelloWorld), terá 205 pixels de largura, 25 pixels de altura e exibirá próximo a ele o texto ?Digite seu nome:?.

Você deve estar se perguntando ?como o FLTK sabe aonde posicionar o texto dos objetos??. Todos os objetos da FLTK possuem um método align() que retorna/define o alinhamento do objeto FLTK específico. Seu default varia de objeto para objeto, mas em geral para os objetos container (como Window ou Group) fica no topo, centralizado (ou de outra forma no padrão do gerenciador de janelas), em objetos de edição (como Input, Output ou RadioButton) à esquerda, centralizado na altura e nos demais casos (como Button ou Label), dentro do Widget. No caso, utilizamos o comando

txtHelloWorld->align(ALIGN_TOP);

para indicarmos que queremos alinhar o texto do nosso txtHelloWorld acima do mesmo, centralizado em relação ao Widget.

Nota: para pessoas que vêem do background do Delphi e do VB, deve ser difícil imaginar o texto como sendo o label do widget. Em ambos os casos, normalmente o texto equivale ao que vai dentro do widget. Na verdade, existe uma diferença aqui entre label e valor. O texto (label) é o texto que indica para o usuário o widget. Já o que o VB e o Delphi entendem como texto é chamado na FLTK de valor (método value()). Veremos mais sobre isso quando estivermos desenvolvendo o código que interagem com a janela.

Falta pouco para convertermos a nossa janela do FLUID em classe. Mude o seguinte código:

{fltk::ReturnButton* o = new fltk::ReturnButton(70, 60, 130, 25, “Hello World!”);

o->shortcut(0xff0d);

}

Para:

btnHelloWorld = new ReturnButton(70, 60, 130, 25, “Hello World!”);

Perceba que não estaremos aproveitando o código:

o->shortcut(0xff0d);

}

Isso porque, como o botão escolhido já é um ReturnButton, ou seja, um Botão acionado quando a tecla Return é pressionada, não há necessidade de definir-se um atalho de teclado para ele, que é a função do método shortcut().

Agora vamos terminar tudo, substituindo esse código:

o->end();

}

return w;

Por este:

w->end();

Perceba que não aproveitamos o return, pois quando utilizamos construtores é esperado que o mesmo receba o objeto construído ao término de sua construção.

Com isso terminamos o construtor. O destrutor é ainda mais simples:

wHelloWorld::~wHelloWorld()

{

delete txtHelloWorld;

delete btnHelloWorld;

}

Ou seja, apenas destrói os objetos criados pela nossa classe wHelloWorld.

No fim das contas, esse é o código que deveremos ter ao fim de tudo:

// generated by Fast Light User Interface Designer (fluid) version 2.0002

 

#include “teste.h”

 

wHelloWorld::wHelloWorld()

:Window(267, 99, “Hello World!”)

{

Window* w;

w=this;

w->begin();

txtHelloWorld = new Input(30, 25, 205, 25, “Digite seu nome:”);

txtHelloWorld->align(ALIGN_TOP);

btnHelloWorld = new ReturnButton(70, 60, 130, 25, “Hello World!”);

w->end();

}

 

wHelloWorld::~wHelloWorld()

{

delete txtHelloWorld;

delete btnHelloWorld;

}

Mas se você compilar e rodar o programa ainda estaremos recebendo o bendito HelloWorld! Como fazer para receber a nossa janela? Veremos isso agora:

 

 

7-) Chamando a Janela desenhada:

Voltemos agora para o nosso main.cpp. Se você estiver usando o DevPak correto no Dev-C++, você deverá ter o seguinte main.cpp:

// This is just small FLTK2 application

// Now you can imediately compile&run it in Dev-C++

// Enjoy FLTK2 – Dejan Lekic, dejan@fltk.net, http://dejan.lekic.org

 

#include <fltk/Window.h>

#include <fltk/Widget.h>

#include <fltk/run.h>

using namespace fltk;

 

int main(int argc, char **argv) {

Window *window = new Window(300, 180);

window->begin();

Widget *box = new Widget(20, 40, 260, 100, “Hello, World!”);

box->box(UP_BOX);

box->labelfont(HELVETICA_BOLD_ITALIC);

box->labelsize(36);

box->labeltype(SHADOW_LABEL);

window->end();

window->show(argc, argv);

return run();

}
Perceba que ele já tem uma janela dentro dele. Vamos modificar o código para que ele receba nossa Janela e a abra.

Primeiro de tudo, remova todo o código de dentro da função main. Mantenha a definição da função e os parâmetros, e mantenha também o return run(). Você provavelmente terá algo como:

// This is just small FLTK2 application

// Now you can imediately compile&run it in Dev-C++

// Enjoy FLTK2 – Dejan Lekic, dejan@fltk.net, http://dejan.lekic.org

 

#include <fltk/Window.h>

#include <fltk/Widget.h>

#include <fltk/run.h>

using namespace fltk;

 

int main(int argc, char **argv)

{

return run();

}

OK… Agora vamos eliminar todos os #includes desnecessários: apague as seguintes linhas:

#include <fltk/Window.h>

#include <fltk/Widget.h>

E as substitua por:

#include ?teste.h?

Com isso você estará indicando ao sistema que você tem um header teste.h, que você precisará usar. Lembre-se que é em teste.h que é aonde está a definição da nossa classe wHelloWorld.

Perceba que não removemos o header <fltk/run.h>, pois precisaremos da função run() definida nele, que retorna um int com um código de erro caso tenha havido uma falha de execução, ou 0 se o programa executou normalmente.

Agora falta muito, muito pouco. Dentro da função main , escreva este código antes de return run():

wHelloWorld *frmHelloWorld=new wHelloWorld();

frmHelloWorld->show();

O que fazemos aqui é:

  1. Criar um objeto wHelloWorld chamado frmHelloWorld;

  2. Chamar o método show() do objeto frmHelloWorld, que ele herdou da classe fltk::Window;

Se tudo estiver OK, você tem o seguinte código:

// This is just small FLTK2 application

// Now you can imediately compile&run it in Dev-C++

// Enjoy FLTK2 – Dejan Lekic, dejan@fltk.net, http://dejan.lekic.org


#include “teste.h”

#include <fltk/run.h>

using namespace fltk;


int main(int argc, char **argv) {

wHelloWorld *frmHelloWorld=new wHelloWorld();

frmHelloWorld->show();

return run();

}
Se estiver, rode e compile o programa, você deverá ter uma janela como a seguinte:

8-) Implementando funcionalidades na Janela:

Agora, porém, tente clicar no Botão ?Hello World!? ou pressionar Return dentro da caixa de texto. Você perceberá que nada acontece! Isso se deve pelo fato de que não avisamos para o FLTK o que ele deve fazer quando o ReturnButton for clicado. No FLTK, isso é feito através de callbacks.

Para aqueles que vêm do panorama VB.Net, podemos comparar toscamente o callback como uma espécie de delegate ao contrário. No delegate, é o objeto que avisa ao sistema que que algo aconteceu com ele, e é o sistema quem deve ter uma função para tratar o evento delegado (daí o nome delegate). No callback, é o sistema quem fornece ao objeto uma função que ele deverá chamar quando algo acontecer com ele (o que que dizer, mal e mal, callback em inglês).

Em FLTK, exige-se que o callback tenha a seguinte estrutura:

void <nome_func>(Widget*, void*);

Onde <nome_func> é uma função que recebe dois parâmetros: um ponteiro para o Widget que disparou o evento (normalmente não-usado) e um ponteiro void (em geral, é por onde vem a janela aonde está o Widget).

Além disso, o FLTK, quando usado em classe, exige que os callbacks não sejam funções membros não-static. Nesse caso restam três opções:

  1. usar funções membro static;

  2. deixar os Widget públicos ou;

  3. usar funções friend;

No caso, adotaremos a terceira opção: até agora não consegui utilizar a primeira no Dev-C++ (por algum motivo de configuração, creio eu) e a segunda não é das melhores opções.

Para quem não sabe o que são funções friend, elas são funções não-membro (ou seja, não fazem parte do objeto) que podem acessar os dados privativos e protegidos (private e protected). Embora elas violem os conceitos de OOP, o uso de friend permite alguns recursos interessantes, como no nosso caso.

Comecemos modificando o teste.h. Nas declarações de #include, adicione as seguintes linhas:

#include <fltk/ask.h>

#include <iostream>

Precisaremos da função fltk::message() (declarada no header <fltk/ask.h>) e do objeto std::string, que pertence ao namespace std (e que está incluído no header <iostream>).

Para nos facilitar a vida com o string, logo abaixo de:

using namespace fltk;

Inclua essa linha:

using namespace std;

Descendo na definição da classe, na parte public, inclua essa linha:

friend void HelloClick(Widget* w, void* v);

Perceba que essa função HelloClick possui exatamente o tipo de parâmetros exigidos por padrão de um callback, como vimos anteriormente.

Aqui acabamos com a questão da definição de classe. Voltemos para o código. No construtor da classe wHelloWorld, logo abaixo a criação do objeto btnHelloWorld, acrescente essa linha:

btnHelloWorld->callback(HelloClick,w);

Nesse caso, utilizamos o método callback do objeto btnHelloWorld para definir o callback do mesmo. No caso, esse método possui o seguinte protótipo, definido em <fltk/Widget.h>:

void callback(Callback* c, void* p);

No caso, definimos como Callback* (um ponteiro de função interno do objeto) nossa função HelloClick (ela é passada como um ponteiro para a função) e passamos como void* o nosso ponteiro w (lembre-se que w é um ponteiro para o objeto criado). É importante notar que o ReturnButton herda o método callback da classe-mãe geral fltk::Widget. Como ela é a classe-mãe de todas as demais, isso quer dizer que todos os objetos FLTK, sem exceção, possuem métodos callback e, portanto, podem receber funções de callback conforme a necessidade.

OK. Agora, vá até o fim do código fonte e insira o seguinte código:

void HelloClick(Widget* w, void* v)

{

wHelloWorld *to=((wHelloWorld*)v);

string strHelloWorld(“Olá,”);

strHelloWorld+=to->txtHelloWorld->value();

strHelloWorld+=”! Sou um programa em FLTK!”;

message(strHelloWorld.c_str());

}

Vamos explicar agora o que isso faz:

Perceba que essa função void HelloClick(Widget* w, void* v) é declarado de forma semelhante à nossa friend definida na classe. Na prática, essa é a nossa friend! Ela é ligada pela assinatura da função (ou seja, ela é uma função void, chamada HelloClick, que recebe um Widget* (um ponteiro para um Widget)e um void* v (um ponteiro ?vazio? – um ponteiro para alguma coisa qualquer).

A primeira coisa que precisamos fazer é transformar o ponteiro void* v recebido em um ponteiro para a nossa janela.

?Mas ele já não é??, você deve se perguntar.

Sim… e não.

Esse ponteiro aponta para o endereço aonde nossa janela foi alocada, mas ele não sabe que no caso temos um objeto da classe wHelloWorld. Por isso, precisamos trasformar o nosso void* v em um wHelloWorld* (ou seja, um ponteiro para um objeto wHelloWorld). Para isso, utilizamos um cast, como o mostrado na linha abaixo:

wHelloWorld *to=((wHelloWorld*)v);

Perceba a declaração do cast: ele associa ao ponteiro wHelloWorld *to o valor de v, mas alertando para o sistema que v deve ser entendido como um ponteiro para um objeto wHelloWorld (wHelloWorld*). Perceba que essa indicação fica em parênteses, como no caso (wHelloWorld*).

As três próximas linhas criam um objeto std::string e colocam nele informações:

string strHelloWorld(“Olá,”);

strHelloWorld+=to->txtHelloWorld->value();

strHelloWorld+=”! Sou um programa em FLTK!”;

Perceba que não precisamos usar std::, pois já declaramos o uso do namespace std no teste.h na linha using namespace std. O objeto strHelloWorld é inicializado com o texto ?Olá, ?, e ao pouco vai recebendo outros textos que vão sendo contatenados ao fim do texto. Na segunda linha está o interessante:

strHelloWorld+=to->txtHelloWorld->value();

Utilizando o método value() do nosso objeto txtHelloWorld, ele pega o texto digitado na caixa de texto no momento em que o callback for acionado e o concatena ao objeto strHelloWorld criado. Em seguida ele adiciona o fim da saudação.

Depois utilizamos a função não-membro do FLTK message() (ou, no caso de não declarar-se o uso de namespace, fltk::message()) para exibir o texto em uma caixa de informações (mais ou menos como uma versão rudimentar do MsgBox() do VB.Net ou do MessageDlg do Delphi):

message(strHelloWorld.c_str());

Essa função, como dissemos anteriormente, é declarado em <fltk/ask.h>. Ele pode receber dois tipos de parâmetros: um char* que será exibido, ou um texto formatado como na função printf() do C, com os devidos dados a serem exibidos. No caso, precisamos oferecer uma saída do nosso objeto string strHelloWorld como um char* (ponteiro de caracteres, o tipo de string do C). Para isso, usamos o método c_str() do objeto strHelloWorld.

Agora, compile e rode o programa. Se tudo deu certo, quando você digitar um texto na caixa de texto, como:

E pressionar a tecla Return ou clicar no botão ?Hello World!?, você irá receber uma mensagem como a seguinte:

Bem, isso conclui nosso rápido interlúdio na FLTK. Para maiores informações, a API da FLTK2 é divulgada em http://www.fltk.net. Nesse mesmo site podem ser obtidos cópias para consulta offline da documentação FLTK (embora levemente desatualizadas, são muito úteis). Outro site importante também é http://www.fltk.org. Nele você poderá encontrar informações adicionais sobre a FLTK.

Enviado em C/C++, Linux, Programação, Tecnologia | 1 Comentário »

Memes: Resoluções 2007 e cinco coisas que odeio na net

Publicado por Fábio Emilio Costa em 17 17UTC Janeiro 17UTC 2007

Desculpem todos, mas estou preparando um post mais interessante. Enquanto isso, vou me atualizando nas Memes da Net. Aqui vou em duas Memes que estão (ou estavam) rolando até bem pouco tempo:

  • Resoluções 2007:

  1. Comprar um Notebook: Sério, estou precisando urgentemente de um, agora no emprego novo meu!!
  2. Começar a pesquisar para um LPI: preciso também, e é também questão de realização profissional
  3. Pagar a faculdade: ter sido financiado pela facu foi ótimo, mas tem seu lado negativo. :-P
  4. Postar mais no blog: eu não sou um problogger e nem pretendo ser, ao menos não tão cedo, mas mesmo assim preciso postar mais no blog;
  5. (Pós virada do ano) Dar o máximo no GuBRo-SP: agora que fui gentilmente aceito como líder, preciso mostrar serviço. E isso ressalta o (1). Não sabe o que é GuBRo-SP? Dá uma olhadinha aqui.
  • Cinco coisas que odeio na Net:
  1. Miguxês: Gente que fala axim já toma um banimento na cara por mim. Tudo bem que a Net exige eficiência, mas custa escrever corretamente para a gente não ser obrigado a decifrar o que está escrito?
  2. Jogos babacas no Orkut, ao menos fora de contexto: quero dizer, é legal você entrar no “Cólera do Dragão no Chuveiro” e participar do “Pergunte ao Shiryu”, mas essa praga tem que se disseminar para comunidades mais sérias?!
  3. Spam: se vocês conhecerem alguém que goste de spam, façam um favor a todos nós: internem esse cara!
  4. Fanboys de Windows que não sabem a menor diferença entre um software livre e um gratuíto. Vide site Baboo (sem link: eles não merecem). Quer ser fanboy, por mim tudo bem, mas ao menos saiba o que você está criticando!
  5. Gente mal-educada: gente, existe uma netiqueta para que, afinal de contas? A pior coisa que existe são os trolls. Trolls bons só no RPG e olhe lá!

powered by performancing firefox

Enviado em Blogosfera, memes | Deixar um comentário »

5 coisas que você não sabe sobre mim

Publicado por Fábio Emilio Costa em 15 15UTC Janeiro 15UTC 2007

Entrando de gaiato na Meme do pessoal da Blogosfera, resolvi colocar aqui cinco coisas sobre mim:

  1. Já fiz teatro, circo e estudei alemão;
  2. Meu primeiro contato com a informática foi aos 4 anos de idade, com um pré-histório MC-1000 (uma espécie de cruza bizarra entre Apple II e TRS-80).;

  3. Sou RPGista inveterado e traduzi materiais de RPG gratuítos da Internet, entre eles o sistema Fudge (aos interessados, o site é http://www.fudgebrasil.cjb.net );

  4. Cheguei a ser mandando para a diretoria quando certa vez uma professora me tomou um livro de informática que estava lendo. Nada demais, se não tivesse míseros 10 anos na época;

     

  5. Entre os gêneros musicais que mais gosto estão o New Age, Celta, Música de Raiz Brasileira (Tonico e Tinoco, Pena Branca e Xavantinho), Eletrônico, Synthpop, anos 80 e românticos anos 70;

    [Atualizando]: Dois fatos adicionais que senti que era relevante

    1. Jogo Xadrez e embora não me considere muito bom, já participei de torneios estaduais quando adolescente;
    2. Sou leitor voraz, sendo que meu hábito de leitura começou aos 9 anos de idade após ler “O Pequeno Príncipe“. Atualmente, me acho pelado se saio de casa sem um livro na mochila. O atual é “Crime e Castigo”;

    powered by

    performancing firefox

    Enviado em Blogosfera, memes | Deixar um comentário »