nunojob:~ dscape/08$ echo The Black Sheep

Archive for February, 2008

Summer School CDDIP 2008, Struer, Denmark – Selected!

I was selected for all paid trip Struer (Denmark) representing University of Minho – Portugal in the Summer School CDDIP 2008 Erasmus IP program. As far as I know at least five lucky Portuguese students will attend.

But what is CDDIP? CDDIP stands for Conceptual Design and Development of Innovative Products and the goal is to facilitate better interdisciplinary and multidisciplinary collaboration for BSc and MSc students with different technical backgrounds.

If you are from another country and you are also going you can leave me a comment. See you there!

links for 2008-02-27

METS Standard with IBM DB2 Express C using XForms as user-interface and Ruby on Rails as a Rest Web-services

HIGH QUALITY VERSION DOWNLOAD HERE

Well, here is the long promised screen-cast. The amount of topics covered is simply huge. To get you ready for the screen-cast I prepared some other more introductory screen-cast as well as some articles on these subjects. I’m sorry that I don’t have the time to document the REST, but I really advice to invest some time learning it as it’s a very pragmatic way of delivering high quality web services.

I strongly advice you to download this screen-cast from rapidshare as both Youtube and Google Videos quality is really awful. You can download it from here.

This work was really fun to do. So I hope to have the opportunity to develop it further and manage nested rest routes like /mets/1/agents to return the agents of the first submission information package (sip) using some cool DB2 pureXML features. I really feel that with a good plugin to help users take full advantage of DB2 pureXML features and a little of imagination this web-service could be of some use.

I also expect to complete the xforms model as it is not indexing a fileptr to each category when such is selected. I hope to implement this soon enough.

Here are the associated resources I developed:

And here are the other two screencasts I produced to introduce you to XForms and METS:

I also advice you to take a look at this articles. All of them where very helpful to my work.

links for 2008-02-25

links for 2008-02-24

Problema resolvido: NetworkContacto, As candidaturas estão abertas

Como viram andava aborrecido com o facto de não me conseguir candidatar ao programa. Bem parece que o problema está resolvido.

Para quem não sabe o NetworkContacto é um programa de estágios internacionais financiados dentro da comunidade europeia. Existem programas parecidos para, por exemplo, fazer estágio no Japão (Vulcanus in Japan).

Boas candidaturas e viagens :)

XmlSimple?

>> xml_plain = %q(<p>Just a <strong>p</strong> on bold</p>)
=> "<p>Just a <strong>p</strong> on bold</p>"
>> xml_hash = XmlSimple.xml_in xml_plain,
  'ForceArray' => true
=> {"strong"=>["p"], "content"=>["Just a ", " on bold"]}
>> xml_plain2 = XmlSimple.xml_out xml_hash, 
  'RootName' => 'p'
=> "<p>\n  <strong>p</strong>\n  <content>Just a </content>\n  <content> on bold</content>\n</p>\n"

Não querendo ser malvado com quem fez esta biblioteca acho que o mínimo expectável para uma operação de marshall/unmarshall é que seja reflexiva. Lá vou eu ler documentação para descobrir como se ensina o XMLSimple – nome curioso não é? – a ser o que nunca deveria deixar de ser. Reflexivo.

Já agora se alguém já programou web services em rails e sabe como transformar os params em xml de uma forma melhor, let me know!

links for 2008-02-21

PORQUE????

Não consigo compreender porque é que o governo continua a gastar dinheiro em soluções proprietárias que nem sequer separam o ambiente de development do ambiente de deployment.

Para fazer um formulário é preciso usar ASP? Não podiam ter usado LAMP ou Ruby on Rails? E acima de tudo não o podiam ter feito isto _direito_ ?

Lembram-se do e-archia?

FACTOS:

OBS:

Não há links para os trabalhos de 12 porque nenhum deles está online.

Deve ter sido por causa de não ter corrigido os erros ortográficos. É que parecendo que não. É chato! E com o tempo torna-se aborrecido.

Primeiro contacto com programação por parte dos alunos do ensino superior

Qual deve ser a linguagem de programação que serve de introdução ao seu curso superior de informática? Para mim a resposta não podia ser mais evidente: Haskell.

Pelo que sei no ISEP a primeira coisa que se aprende é Java, o que acho chocante. Afinal o paradigma de programação orientada aos objectos é vastíssimo e ensinar alguém a programar em Java sem estes conhecimentos por trás parece-me de uma irresponsabilidade incrível. Isto após uma reestruturação que ocorreu o ano passado! Pode-se alegar que o ISEP tenta formar profissionais que sejam absorvidos o mais rapidamente possível pelas empresas, que não se pretende formar investigadores. Mas, na minha opinião pessoal, existem coisas que são base para um licenciado em informática. Têm que conhecer os paradigmas de programação que existem pelas valias que eles oferecem e não pelo facto da sua sintaxe ser mais ou menos acessível. Como me parece evidente que qualquer informático deve saber estruturas de dados e algoritmia. São as ferramentas base com que trabalhamos diariamente e por muito que as empresas queiram monos lá a trabalhar a “chapar” código têm que existir algo que diferencie esse mono de um pedreiro. Senão para que o canudo?

Mas e porque Haskell?

  1. É uma linguagem funcional. Os problemas são entendidos como problemas matemáticos, o que permite aos alunos quebrar com a pre-formatada ideia que programar é deve ser seguindo o paradigma imperativo.
  2. A maneira de pensar nesta linguagem é diferente. Dijkstra disse que “It is practically impossible to teach good programming to students that have had a prior exposure to BASIC: as potential programmers they are mentally mutilated beyond hope of regeneration.”. Aposto que ele diria o oposto sobre Haskell. É difícil ensinar mal alunos que começam por aprender/gostar de Haskell.
  3. Ao aprender os vários paradigmas o aluno torna-se mais versátil. Começando por Haskell certamente que não vai ver todos os problemas de uma forma imperativa. Esta forma diferente de pensar vai-lhe permitir, no futuro, a mais valia de saber escolher o método mais apropriado para resolver um problema que se depare no futuro. Pode na altura não usar Haskell mas vai-se lembrar dos mecanismos que aprendeu e da forma, correcta, que aprendeu para resolver problemas.
  4. As outras vantagens do Haskell: Esquema de recursividade extremamente simples, Strongly Typed, Lazy Evaluation, Elegância do código.

Atrevo-me até a dizer que podem dizer mal do Haskell em tudo que quiserem menos que é mau como ferramenta de ensino. Para isso, é simplesmente divinal.

Se quiserem ver uma melhor resposta a esta pergunta Why Haskell podem ler este artigo no Good Math, Bad Math. E caso queiram espreitar um pouco de código podem visitar (e rir-se um bocado com) este The Evolution of a Haskell Programmer.

Introducação a Criptografia: One Time Pad

Na criptografia clássica o One Time Pad é o mais famoso algoritmo de encriptação simétrica. O principio é simples. Um simples XOR entre a chave e o texto que quer deseja encriptar, sendo que a chave deve ser do mesmo tamanho que o texto e aleatória. Não compreenderam? Passo a explicar com uma história ilustrativa:

Imaginemos que a Alice convidou o Manel – o Bob foi fazer séries televisivas para crianças sobre construção civil – para sair mas assume que a Eva – provavelmente a ex-namorada – recebe todas as mensagens que são enviadas pelo Manel (mania da perseguição ou principio de Kerckhoff , eis a questão.). Então quando o convidou para sair disse ao Manel para usar como chave um simples ’1′ e para responder ’0′ caso não tivesse disponibilidade e ’1′ caso tivesse.

O Manel quer e responde sim e supõe-se que a Eva viu a mensagem resultante – 0. Como a chave foi gerada aleatoriamente pela Alice e é partilhada apenas pelos dois a Eva apenas sabe que existe a probabilidade de 50% de ele ter aceite, e outros 50% de ele ter recusado. Mas bem isto já ela sabia sem ter que recorrer a métodos de cryptanalysis.  E mesmo se as probabilidade forem diferentes a analise vai sempre mostrar apenas aquilo que já se sabia. A probabilidade de cada digito acontecer.

Esta conclusão é generalizável a um qualquer número de bits, como foi provado por Claude Shannon.

Parece perfeito mas é impraticavel. Como é obvio é preciso de uma chave do tamanho do texto que precisamos de enviar, todas as vezes. E essa chave tem que ser do conhecimento dos dois interlocutores. Se quiserem saber o que aconteceu depois para resolver o assunto vão ter que aprender muita criptografia pelo meio. Mas não é isto que me levou a escrever este artigo.

O que me levou a escrever este artigo foi uma pergunta – de um exame antigo de criptografia – na qual se perguntava como era possível que, num banco que conseguia usar este método (apesar de ser impossível, mas ok!), tivesse havido uma transacção na qual teria sido depositada 500 euros em vez de 100 que tinham sido ordenados pelo titular da conta. Teria forçosamente que existir um man-in-the-middle mas como podia ele romper este algoritmo.

Apesar de não ter a certeza penso que a resposta seria: Ou o bandido tem a chave ou então ele sabe onde está o ’1′, fez XOR com um dos 256 dígitos disponíveis e teve a sorte do input ser aceite pela entidade bancária como 500 euros. Por outras palavras o OTP protege a confidencialidade mas não garante a preservação do seu conteúdo (acho que normalmente se refere a isto como integridade dos dados :|).

Alguma ideia que não estas?

Burlado pela vibramovel

Isto é um email escrito a coisa de uns minutos pelo meu companheiro de quarto. A situação foi presenciada por mim.


Pessoal acabei de ser burlado!!Já apresentei queixa a todos as entidades que conheço (vibramovel, rede4, anacom, queixas.co.pt, se conhecerem mais alguma digam) e quero-vos avisar o que hoje me aconteceu!Eu sei que parece surreal e eu mesmo ainda não acredito.. ainda ontem carreguei o telemóvel e hoje já fiquei sem 5€ em menos de nada e sem culpa nenhuma!!!

Este é o mail que enviei a reclamar e se lerem percebem o que me aconteceu:

———- Forwarded message ———-
From: Nuno L.
Date: 2008/2/18
Subject: [Reclamação] Burlado

Boa noite,Venho por este meio fazer uma reclamação, pois fui vitima de uma burla por vossa parte!- Hoje, dia 18/02/2008 pelas 22:34 recebi no meu telemóvel (93*******) uma mensagem do 3339:
“A tua password e ****. Insere-a na pagina web ou envia MUSICA para o 4002. +info/ajuda? liga 707501522″

- Pelas 22:39 recebo exactamente a mesma mensagem do 3339!
- As 22h39 recebo uma mensagem do numero 4002:
“Benvindo ao Clube JOGO! Os melhores jogos para telemóvel! 2 Jogos Java +info/ajuda? Liga 707501522. n queres+? envia sair jogo p/4002.4E/semana”- A mesma hora (22h39) e recebo também do 4002:
“Clica no link que recebeste para sacar os teus conteúdos. Deves ter wap/GPRS activado. Nao tens? Contacta o 1693. Com os Clubes 4002 so tens a ganhar!”

Como não tinha activo nada em lado nenhum pensei que as mensagem fossem engano, mas após receber as duas ultimas reparo que me foi cobrado cerca de 4€ do meu saldo sem a minha autorização nem activação de nenhum serviço!!!!

Entrei em contacto com o call center do meu operador e pago mais 0.4€ (mas desta vez sou avisado disso) e apenas me dizem que não podem fazer nada, para me queixar a Vibramovel pelo numero 707501522, mas para ter cuidado que é um número de valor acrescentado (ao menos o assistente teve essa decência) mas que para cancelar tenho que mandar uma mensagem para o 4002 mensagem que tem um custo normal.

As 22h50m mandei mensagem para o 4002 com o texto “SAIR TODOS”

- As 22h51m recebo do 3330 a seguinte mensagem:
“Os teus clubes foram cancelados. Atenção: ainda tens 2 jogos, disponíveis que vais perder! Para os usares envia VAI p/4002 e re-activa clube.”

- As 22h54 recebo do 3339 mais uma mensagem:
“Ainda não iniciaste o teu download. Clica neste link! http://…&#8221;

- As 23h23 recebo do 3339 outra mensagem:
“Ainda não inseriste a tua password! A tua password e ****. Insere-a na pagina web ou envia MUSICA para o 4002. +info/ajuda? liga 707501522″

Disseram-me que apenas podia cancelar o serviço (que eu não solicitei), que não poderia reaver o meu dinheiro e que não poderiam prevenir que no futuro isto não voltasse a acontecer!

Por isso já sabem mal comessem a receber mensagens estranhas, mandem uma mensagem para o 4002 com o texto “SAIR TODOS” (sem parênteses)

Não vos digo para reenviarem este email porque assim isto parecia uma chain letter, mas isto é verdade (o meu saldo que o diga)!!

links for 2008-02-13

Devolvam as passwords aos vossos utilizadores com Ruby on Rails 2.0

Uma coisa que me chateia imenso nas webapplications de trazer por casa – traduzindo aquelas que são feitas por colegas meus ou por outros amadores pela web fora – é o facto de guardarem quase sempre as passwords na base de dados em plaintext. Acho que não tem o direito de saber a password que uso, nem que a use exclusivamente nesse site (como é o caso)

Assim, se quem fez a aplicação for mal intencionado, pode simplesmente obter a vossa password escrevendo

select * from users where user.username = 'nick'

Mas mesmo que não sejam mal intencionados, outra pessoa pode aceder a base de dados. Ou podem simplesmente não se ter protegido contra sql injection. Há um milhão de razões pelas quais nunca se deve guardar as password em plaintext, sendo que a principal deles é o facto da password não ser vossa. É do utilizador. E isso faz toda a diferença! Não acreditam em mim certo? Estou a exagerar.

Convido-os a visitar esta página

Agora procurem por ‘qualquer_coisa. O resultado é

  • Pesquisa por “\’qualquer_coisa”:

Este \’ é importantíssimo pois significa que a página se esta a proteger contra ataques de sql injection. Caso contrario um hacker podia, com alguma sorte, obter informação privilegiada que estava contida nessa base de dados.

Mas ninguém faz um erro destes, certo? Errado. Vamos ao google e procurem php em páginas de Portugal. O sexto resultado, e único que testei, é a associação nacional de farmácias. Se procurarem por ‘qualquer_coisa o resultado é um não tão surpreendente erro. Isto é um exemplo de milhares, alguns dos quais onde vocês inserem as vossa password (e sabe-se lá o que mais) diariamente. Não se sentiam melhor se soubessem que nessa base de dados não está a vossa password?

Mas voltando ao assunto, a táctica que vou usar consiste em usar um algoritmo de one way hash chamado SHA. O utilizador, quando se regista no site, insere a sua password. Esta é processada (num processo que se chama de digest) para uma hash que contém não a password mas sim a encriptação dessa password em SHA. Como SHA é um algoritmo de one-way-hash, é fácil obter a hash única para qualquer palavra mas quase impossível de decifrar no sentido inverso. Para ser suficiente, mas não é.

Comecemos por ir para a consola do rails. Entrem no terminal e naveguem até onde tem a vossa Ruby on Rails web application. Agora escrevam.

./script/console

Quando lá estiverem podem verificar que aplicando este algoritmo a palavra porto obtemos sempre a mesma resposta.

>> password = 'porto'
=> "porto"
>> Digest::SHA256.hexdigest(password)
=> "01735c5ff1608734e4c38449a00b74bb9a8d5423ed548238da70178e9e803483"
>> Digest::SHA256.hexdigest(password)
=> "01735c5ff1608734e4c38449a00b74bb9a8d5423ed548238da70178e9e803483"

Não sei se repararam mas o nosso utilizador usa uma palavra pass muito fraca. Isto vai fazer a diferença, por o hacker pode obter a password facilmente se tiver a hash.

Como? Sim eu disse que era muito difícil crackar o SHA, alias não conheço ninguém que o tenha feito. Ninguém conhece :P

Mas o hacker pode pegar numa lista de palavras comuns nas passwords e, para cada uma das palavras associar a hash correspondente. Agora se tiver a vossa hash pode comparar com o dicionário que criou descobrir algumas das passwords da base de dados, aquelas que estavam na lista de palavras comuns.

Para resolver este problema usamos um salt. Um salt é também uma palavra (como a vossa password) que sera usada para evitar esta técnica. é mais simples mostrar que explicar, e por isso mesmo:

>> password = 'porto'
salt = [Array.new(6){rand(256).chr}.join].pack("m").chomp
>> salt = [Array.new(6){rand(256).chr}.join].pack("m").chomp
=> "19L6gVcD"
>> salt = [Array.new(6){rand(256).chr}.join].pack("m").chomp
=> "CqEVe632"
>> password = 'porto'
=> "porto"
>> Digest::SHA256.hexdigest(password + salt)
=> "c017e1c49096149097050c76f0406dce9245058e0d..."

De certeza que o hacker não vai procurar pela string portoCqEVe632 e, portanto, os nossos utilizadores estão seguros. Caso queiram saber um pouco mais sobre o que se passa no criação do salt, e que é aquele pack(‘m’) peçam nos comentários e eu escrevo um artigo sobre isso. Senão nunca mais saio daqui! :P.

Agora surge a pergunta, como usar esta informação em rails. Simples.

Vamos começar por criar um projecto:

rails secureusers && cd secureusers

Agora precisamos de criar o modelo de utilizador

./script/generate model User username:string \
  password_hash:string password_salt:string
rake db:migrate

Abram o vosso User.rb model, apaguem o que lá tem, e insiram o seguinte código

require 'digest/sha2'
class User < ActiveRecord::Base
# usei o attr_accessible em vez do
# attr_protected :password_hash, :password_salt
# porque é boa prática em Rails usar o enabled para 
# os campos acessíveis e não o contrário.
#
# Imaginem que tinham um campo isAdmin e se 
# esqueciam de por no protected.
# Ao dizerem que enabled só o :username impedem 
# o acesso a todo e qualquer outro campo,
# excepto aqueles que foram explicitamente 
# escolhidos por vocês.
  attr_accessible :username
  attr_accessor :password

  def before_save
    unless password.blank?
      salt = [Array.new(6){rand(256).chr}.join].pack("m").chomp
      self.password_salt, self.password_hash = salt,
      Digest::SHA256.hexdigest(password + salt)
    end
  end

  def self.authenticate(username, password)
    user = User.find :first,
        :conditions => ['username = ?', username])
      if user.blank?
        raise "O utilizador não existe"
      elsif Digest::SHA256.hexdigest(password + user.password_salt) != user.password_hash
        raise "A autenticação falhou"
      else
        user
      end
  end
end

Usei o attr_accessible em vez do protected porque considero esta uma boa practica. Prefiro dizer quais os campos acessíveis que quais os que se deve proteger. Assim não corro o risco de me esquecer de proteger algum campo. E os que são para ver nota-se bem quando faltam :P Podem ler mais sobre isto aqui.

Depois de toda esta explicação o código deve ser muito facil de entender. Até para quem não sabe Ruby. Vamos testar?

>> nuno = User.new
=> #<user id: nil,
  username: nil,
  password_hash: nil,
  password_salt: nil,
  created_at: nil,
  updated_at: nil>
>> nuno.username = 'nuno'
=> "nuno"
>> nuno.password = 'porto'
=> "porto"
>> nuno.save
=> true
>> nuno
=> #</user><user id: 1, 
  username: "nuno",
  password_hash: "c490ea11d96be24ece2ca0dba11d84fc9b...",
  password_salt: "V+b7Sqjh",
  created_at: "2008-02-12 19:28:54",
  updated_at: "2008-02-12 19:28:54">

E agora autenticar:

User.authenticate 'nuno', 'porto'
=> #</user><user id: 1, 
  username: "nuno",
  password_hash: "c490ea11d96be24ece2ca0dba11d84fc9b...",
  password_salt: "V+b7Sqjh",
  created_at: "2008-02-12 19:28:54",
  updated_at: "2008-02-12 19:28:54">

Fixe. É so por no session[:user] ;) Para finalizar aconselho-vos vivamente a suportarem open-id para o processo de autenticação dos utilizadores. Existem plugins muito bons que o fazem, e podem ler mais sobre open-id no seu fantástico guia supersónico.

links for 2008-02-12

e-archia.net

Bem a minha primeira aventura em rails chegou a metade. Quem estiver interessado em ver as sources, pode sacar este não-tão-pequeno ficheiro. Senão fica aqui a screenshot. O site não está online porque eu, com a pressa, não tenho a certeza ser fiz escapeHTML ao texto que vem da base de dados. Ficam as screenshots:

Nunca parto inteiramente

 

links for 2008-02-11

Working different models in the same form on Ruby on Rails

Well it’s been a heck of a week, loving somethings on rails and hating others :P

Anyway I had a problem with working with different models on a form. If you are having the same kind of issues I’ll give you some pointers:

My notes file is so big I think I’ll never solve all those issues. *g* Anyway another pointer I can give you is to check out haml. I didn’t used it but it sure is simpler than html.

links for 2008-02-09

Quote of the day

Quote.create(
:quote => ‘Great spirits have often encountered violent opposition from weak minds.’,
:author => ‘Albert Einstein’
)

Random in Ruby on Rails

So your doing a find on your model and you want a random instance. I didn’t find a method to do this so I decided to make my own.

In this case I wanted a random quote. So after generating the model all I had to do was:

def self.random
  Quote.find_by_id rand(Quote.count) + 1
end

And now you can simply call your random quotes in any controller action you desire. Just

@rquote = Quote.random

If this is the lamest ruby ever please feel free to give me some feedback :) I will be delighted to learn a different way!

[EDIT: Discussion about this at Rails Core]

links for 2008-02-07

This version of RMagick was created to run with ImageMagick 6.3.3 but ImageMagick 6.3.8 is in use

A paciencia tem os seus limites e vou dormir. Se entretanto alguém descobrir a solução para isto peço-lhe o favor de me deixar nos comentários.

links for 2008-02-06

links for 2008-02-05

Góticos

Tenho que partilhar. RAP põe-te a pau.

Vem ai os góticos!

Já agora se alguém se der ao trabalho de traduzir para Português por favor deixe em comentário.

os góticos nao sao assim taum maos cmo parexe eu xou gotica e vdd ke andamux xempre d preto e parexe k xomux mortos vivox ou axim max ux goticos xao simbolo de trixtexa cada vex k vex uma pexoa k e gotica exa pexoa podia ter mto problemax na sua vbida e axim para ax outrax pexoax n xatiarem tanto elex tornam-xe goticox e xecalhar tax a apenxar max porke tanta obxexao plos cemiterios bm os cemiterios sao lugares calmo onde a gente podemux xurar xem k ninguem nos veja (pk ax pexoax penxam k a gente n temux xentimentux) e e um bom sitiu para penxarmux na noxa vida e o ke kerexmux faxer dela ax pexoax normaix(n e k a gente n seja)cuxtumam ir a praia para penxar a gente vai ao cemiteriu por ixo penxa kuandu virex um gotico k ela ou ela e uma pexoa cmo outra kualker xo km apenax maix problemax duke ax outrax k excolheu a vida d gotico

em: http://papilio.wordpress.com/2007/11/10/e-por-falar-em-goticos/

links for 2008-02-04

Skitch Invites (Mac OS X only)

I have been receiving some emails asking me how do I create these images. Well I use Skitch, which is one of my favorite Mac OS X apps (along with Books, Textmate and iSync). Unfortunately it’s still invite only.

Anyway if your interested in giving Skitch a try just leave a comment in this post, and I’ll send it to the email you provided as soon as possible.

Dizem que é impossivel sonhar a cores

A minha pergunta é:

Quem é que diz isso? QUEM!?

Follow

Get every new post delivered to your Inbox.