Feeds

quinta-feira, 22 de Janeiro de 2009

Como não reagir a más exposições

Um caso mediático recente:
Durante a semana passada acompanhei um caso caricato passado num canal de TV do EUA, creio que um canal estatal, em que uma estudante comprou acidentalmente um computador Dell com o Ubuntu para frequentar as aulas à distância. Ela queixava-se que o CD do seu ISP não instalava nem conseguia instalar o msoffice, alegadamente requisitos para aceder ao sistema de e-learning da instituição o que a levou a desistir de um semestre.

As reportagens do canal:

Reportagem original (em texto, com possibilidade de vídeo)
Reportagem em resposta à reacção da comunidade (em texto e vídeo)

Em relação à reportagem tenho a salientar um ponto:
Tenho a certeza que não tinham qualquer intenção de atacar o Ubuntu. A sua intenção era a típica de um meio de informação baseado no sensacionalismo e populismo, atacar uma empresa, a Dell, por esta se recusar a resolver o problema, como se resolvesse o problema. Não vou estar aqui a contar a história toda, pois podem vê-la nos links acima.
Como é óbvio, e infelizmente, a reacção de muita gente foi negativa e mesmo destrutiva. Ataques ao canal e à estudante em questão, que neste caso chegaram mesmo a ser atitudes graves e reprováveis, como ofensas e ameaças pessoais. E como é óbvio o canal aproveitou a situação para vender mais da sua "peixeirada".

Pontos a ter em conta:

Relativamente à estudante:

  • Como conseguiu ela comprar aquele portátil? É mais fácil encontrar a página onde eles estão à venda a partir de um motor de busca que pela página principal do site da Dell. E pesquisar por "laptop Dell" não aparecem resultados relativos ao Ubuntu nas primeiras páginas;
  • Não tinha qualquer conhecimento sobre o Ubuntu ou OpenOffice.org;
  • Estava focada em instalar o software de ligação à Internet e o msoffice e acreditava que não era possível frequentar o curso sem isso;
  • Procurou trocar o computador por um com bloatware xp/vista ou obter uma licença deste através da Dell;
  • Tendo obtido resposta negativa, pois aparentemente o prazo para troca já tinha expirado, apresentou o seu caso ao canal de TV em causa;
  • Aparentemente não procurou qualquer tipo de ajuda após o contacto com a Dell;
  • Recebeu montes de ataques e acusações de ignorância, estupidez, etc...
Estamos perante um típico caso de pessoa que vive na total ignorância em relação ao mundo alternativo ao horrível mundo microsoft, mas será razão para atacá-la? Não me parece.

Relativamente ao programa de TV:
  • Típico programa do espectador acusa, nós fazemos a reportagem;
  • Apostou no ataque à Dell, tendo apanhado o Ubuntu no fogo cruzado;
  • Alegaram estar a fazer tudo para ajudar a estudante, mas não em relação ao que a estudante tinha em mãos, e temos que ter em conta que o poderiam fazer, mas isso venderia a notícia? Nunca;
  • Juntamente com a estudante receberam montes de ataques;
  • Lançaram um contra ataque, na minha opinião muito destrutivo.
Um formato de programas que todos conhecemos certamente, eu não sou totalmente contra este tipo de programas. Mas temos que ter em conta que o objectivo principal deles é "vender publicidade" ao maior número de espectadores possíveis. Alegam querer ajudar, e neste caso teriam conseguido de uma forma fácil, mas tal não beneficiaria os seus objectivos. Razões para a Comunidade de SL/OS estar chateada? Sem dúvida, mas lembrem-se que ao atacar um canal de TV poderá ter um efeito idêntico ao de tentar lutar de espada e escudo contra um tanque de guerra.

A atitude da comunidade Ubuntu/GNU/Linux

Podemos dividir as reacções em duas partes: as positivas e as negativas.

Às positivas foi dada pouca atenção na segunda reportagem, mas felizmente existiram referências. Muita gente se ofereceu apara ajudar a estudante e para lhe dizer que era possível usar o portátil como estava e até lhe mostrar os pontos favoráveis.

As negativas foram mais que muitas, e o canal não exitou em usar essa atitude negativa no seu programa. Se a situação estava má, aí é que piorou. Quem assistia ao programa e não conhecia o mundo alternativo ao império de Redmond ficou com uma impressão extremamente negativa em relação a todos nós. E aqui não podemos culpar exclusivamente o canal, podemos criticar o seu formato de programa, mas atacá-lo desta forma pode correr mal. E garantidamente causou estragos.

Atitudes a ter em conta neste tipo de casos

A principal atitude a ter em conta é a de nunca atacar utilizadores de informática que desconhecem o mundo do software livre, estarão simplesmente a afastá-los, ou pior ainda, a torná-los defensores do lado oposto. A melhor atitude será certamente a de oferecer ajuda, aconselhar e incentivar as pessoas a mudarem. Mas repito, ao atacá-las estarão simplesmente a perdê-las.

Outra atitude a ter em conta é a de como lidar com meios mediáticos, criticar defensores do software fechado ou comentar em blogues pró-ms é uma coisa, meter-se com meios mediáticos de comunicação é outra. Mas em ambos os casos é melhor nunca tomar uma atitude negativa, não quer dizer que não possam atacar com fundamentos válidos, mas sim nunca cair no desagradável. Com meios mediáticos o melhor a fazer é fundamentar bem o vosso ponto de vista sem nunca entrar no desagradável, lembrem-se que o seu poder mediático pode ser destrutivo. Usem os argumentos a favor, que já são mais que suficientes.

Lembrem-se que ser troll não é um exclusivo dos nossos adversários, e que no nosso meio também podem existir, muitas vezes dando uma má imagem de todos nós. Existem formas de jogar ao ataque contra os nossos adversários sem por em causa a nossa credibilidade, e nesses casos o meu conselho é: Aproveitem-nas, mas repito, sem ataques pessoais ou insultos gratuitos.

Emrelação a este caso as coisas não acabaram tão mal quanto isso. Aparentemente a estudante está a frequentar o curso e com o seu Ubuntu. Já sabe como utilizar o OpenOffice.org para criar documentos que podem ser lidos pelo pessoal do curso e obviamente já se liga à Internet do seu próprio portátil. Podem ver essa informação no blogue pessoal de um dos membros desse canal, aqui. Dá-nos essa informação positiva, apesar de manterem a posição da sua reportagem.

quinta-feira, 4 de Dezembro de 2008

A grande mudança: Python 3000 lançado.

Foi anunciado hoje o lançamento oficial da versão 3.0 da popular linguagem de script Python, também conhecida por Python 3000.
A lista de novidades é bastante significativa e, com este lançamento, existe uma quebra de compatibilidade com as versões anteriores. Pelo que qualquer código escrito para Python 2.x ou mesmo 1.x poderá ter que ser re-escrito.

As principais novidades:

  • print passa a ser uma função: print()
  • As funções map(), filter(), range() e zip() assim como os métodos dict.keys(), dict.items() e dict.values() passa a retornar iteradores em vez de listas. No caso da função range() o comportamento é similar ao xrange() da versão 2.x que desaparece nesta versão. A função list(iterator) poderá ser usada para retornar uma lista através de um iterador, mas caso não seja necessário deve ser evitado de modo a salvaguardar o uso de memória.
  • As strings passam a ser todas Unicode.
  • Os inteiros são automáticamento de tipo Long.
  • O operador diferença <> for removido e substituido pelo operador !=
  • Desaparece a função reduce(function, iterable), devendo recorrer-se a implementações iterativas em sua substituição.
  • etc...
Na nota de lançamento oficial podem ser consultadas todas as modificações mais detalhadamente.

Esta linguagem é de extrema importância e este lançamento terá algum impacto pois entre utilizadores dela estão o Google, a NASA, é parte fulcral em muitas funcionalidades de distribuições GNU/Linux, como o Ubuntu Red Hat/Fedora, etc... Existem também muitas aplicações web desenvolvidas em Python e a linguagem é usada para criar scripts em muitos videojogos, pelo que o seu conhecimento poderá ser útil para o desenvolvimento de Mods. Há mesmo quem defenda que é uma alternetiva viável ao shell script para a criação de utilitários de administração de sistemas, pois esta é independente da shell que se usa.

Para quem não conhece é realmente uma linguagem a aprender.

quarta-feira, 12 de Novembro de 2008

"Porque detesto a Microsoft?"

Estas palavras não são propriamente minhas, mas sim de um cibernauta holandês, que publicou um site no ano passado e que recentemente descobri. E dado o teor, extensão e argumentação deste documento decidi que merece ser divulgado.

Ao ler fico com a sensação que podemos dividir a microsoft em duas categorias.
A primeira é a de uma empresa pouco inovadora, que pouco trás de novo. Basicamente pega na criação dos concorrentes e obtem sucesso com isso. E mesmo naquilo que fazem a qualidade é questionável. Mas no que diz respeito à inovação, pouca existe. Desde o primeiro sucesso em larga escala, o MS-DOS que foi comprado a uma empresa "amiga", até ao primeiro windows, tentativa de copiar o Xerox Alto e combater outra cópia do mesmo chamada MacOS, etc...
A outra categoria é a realmente assustadora. Como pode uma empresa com a descrição acima sobreviver num mundo tão competitivo? Primeiro tiveram a sorte do seu lado, saiu-lhes o euromilhões dos contractos de software, com o contracto da IBM para estes desenvolverem um sistema operativo, que basicamente foi comprado e sofreu umas modificações técnicas, para a sua linha de computadores pessoais. A partir daí conseguiram pôr-se numa posição de poder, e consequentemente segui-se uma série de politicas ferozes de aniquilação de concorrência. Passar acima de tudo e todos, custe o que custar. Numa atitude que faz muito lembrar os métodos que podemos ver retratados em filmes como O Padrinho ou em séries como Os Sopranos. Eliminar a concorrência a todo o custo.

Deixo aqui o site para quem quiser ler: (em inglês)
http://www.vanwensveen.nl/rants/microsoft/IhateMS.html

Acredito em grande parte do que está descrito nesse site. Basicamente é uma espécie de compilação de muitas notícias e factos Históricos que quem está atento à indústria TI já deve conhecer. Mas acho que também é uma prova de que uma abordagem livre e aberta ao desenvolvimento de software é a melhor forma de enfrentar este monopólio. Simplesmente o software livre tem um grau de imunidade a tácitas de aniquilação que o software proprietário não terá numa situação similar. Por esse facto também a ms aposta forte nas patentes de software, estas sim podem constituir uma arma poderosa contra toda a concorrência. Sob o pretexto de inovação registam patentes muitas vezes ridículas: duplo click, page up/page down, etc...

Não quero com isto apelar ao ódio, mas sim apelar a uma abertura de mentes.
Uma boa leitura, a todos os que a decidirem fazer.

Tutorial MVC - 4 Inserir dados, Formulários e Validação

Este tutorial é um seguimento directo do anterior. Utilizaremos os mesmos componentes e tabela de dados para criar um sistema de registo de utilizadores. Se não tem acompanhado esta série aconselho-lhe a dar uma olhadela ao tutorial anterior.
No que diz respeito à validação, será usado o novo sistema form_validation introduzido na versão 1.7.0. Dado que este tutorial é orientado para iniciantes não vi razão pela qual não o orientar para a nova versão.

Em qualquer página web com validação de dados existe o seguinte ciclo de validação:

  1. Pedir os dados ao utilizador
  2. Verificar os dados
  3. Caso os dados não sejam válidos exibir erros e voltar ao ponto 1
  4. Tratar os dados

Começando pela solicitação de dados, vamos criar uma view user/register.php com o seguinte conteúdo:

<?php echo validation_errors() ?>

<?php echo form_open('user/register') ?>
<fieldset>
<label for="username">Utilizador: </label>
<input type="text" id="username" value="" />
<label for="password">Palavra-Passe:</label>
<input type="password" id="password" value="" />
<label for="confirm">Confirmar:</label>
<input type="password" id="confirm" value="" />
<label for="email">E-mail</label>
<input type="text" id="email" value="" />
</fieldset>
<input type="submit" value="Enviar" />
</form>

A view acima é um formulário típico em PHP/HTML. Na primeira linha serão imprimidas as mensagens de erro caso a validação dos dados falhe. Recorre-se também à função form_tag para gerar uma tag form que chamará o controlador responsável por validar e armazenar os dados.

Agora para armazenar os dados resta-nos criar o controlador para o efeito. Mas antes disso vamos preparar a nossa classe modelo para guardar este tipo de dados. Lembre-se que estamos a criar um formulário para registo de utilizadores e dados sensíveis como a password não serão armazenados no formato em que são inseridos. A palavra passe será transformada antes de ser armazenada recorrendo à função de hashing sha1 utilizando uma chave salt para impedir a obtenção da palavra passe através de dicionários com hashs conhecidos. Ao modelo user_model.php serão acrescentados os seguintes métodos:

<?php
private function hashPassword($password)
{
//gera uma string salt aleatória
$data['salt'] = sha1(rand());
//gera o hashing da password
$data['password'] = sha1($data['salt'].$password);
return $data;

}

function register()
{
$data['username'] = $this->input->post('username');
$hash = $this->hashPassword($this->input->post('passwd'));
$data['passwd'] = $hash['password'];
$data['salt'] = $hash['salt'];
$data['email'] = $this->input->post('email');

$this->db->insert('users', $data);
}
?>

O método register guarda os dados, depois de codificar a password. Usando o método insert do Active Record a inserção de dados não poderia ser mais simples, basta um array associativo em que o indice corresponde ao nome do campo na tabela e depois passá-lo como argumento da função insert. Para obter os dados enviados pelo formulário podem usar o método $this->input->post('nome') ou aceder directamente ao respectivo elemento no array post: $_POST['nome'].

O método hashPassword é responsável apenas por gerar um hash e um salt para a password.

Por fim no controlador user vamos criar um método register que, neste exemplo, será responsável por criar as regras e executar o ciclo de validação.
<?php

function register()
{
//definição da lista de regras a aplicar
$config=array(
array(
'field' => 'username',
'label' => 'Nome de Utilizador',
'rules' => 'required|min_length[4]|max_length[20]'
),
array(
'field' => 'passwd',
'label' => 'Palavra Passe',
'rules' => 'required|min_length[6]|matches[confirm]'
),
array(
'field' => 'confirm',
'label' => 'Confirmação de Palavra Passe',
'rules' => 'required'
),
array(
'field' => 'email',
'label' => 'E-mail',
'rules' => 'required|valid_email'
)
);

//atribui a lista de regras à próxima execução da validação
$this->form_validation->set_rules($config);
//Teste de validação de dados
if(($this->form_validation->run())==FALSE)
{
//caso a validação não tenha tido sucesso
//ou ainda não foi invocada
$this->load->view('user/register');
}
else
{
//se a validação teve sucesso
$this->user_model->register();
//redirecciona para uma página de sucesso
redirect('user/success');
}
}

?>

Neste exemplo recorremos ao método de criar um array com todas as regras de validação a aplicar. Nesse array cada elemento possui três campos:
  • field: possui o nome do campo a avaliar, deverá obrigatoriamente corresponder ao id do elemento do formulário que fornecerá esses dados.
  • label: contém uma identificação do campo, compreensível pelos utilizadores, a aparecer na mensagem de erro.
  • rules: aqui são declaradas as regras a ser aplicadas ao campo, as mais comuns são: required, campo obrigatório; min_length/max_length, definem os limites de tamanho em caracteres dos dados inseridos; valid_email, endereço de correio electrónico válido; etc...
A estrutura if no exemplo garante a execução do ciclo de validação. Na primeira chamada ao controlador, invocada pelo utilizador, a validação falha sempre sem qualquer erro, por isso é exibida a view com o formulário. O utilizador ao enviar os dados faz com que o controlador seja de novo invocado e a validação executada. Se falhar será re-exibido o formulário com as respectivas mensagens de erro. Caso os dados estejam correctamente inseridos, estes serão guardados na base de dados. Após o armazenamento o controlador redirecciona-nos para uma página de sucesso que não foi listada neste exemplo, dada a sua simplicidade deixo-a ao critério de cada um.