Mais um blog inútil.

Março 9, 2010

Mais um ano, mais um ataque.

Arquivado em: Fail, Serious Business, Useless — dongs @ 16:45

As notícias sobre tecnologia cada vez mais se aproximam às notícias sobre terrorismo ou epidemias. Há dias, foi apresentado um artigo sobre um novo ataque ao RSA [PDF], baseado em falhas, que pôs a blogosfera em polvorosa. Existe alguma razão para isto? Absolutamente não.

É bem sabido que existem imensas classes de ataques que podem afectar implementações perfeitamente correctas do RSA (e não só).  Em particular, este novo ataque usa falhas geradas por flutuações de voltagem exteriores à máquina para derivar bits da chave privada. Nada de novo. Este ataque já tinha sido proposto em pelo menos 2006. Ataques baseados em outros tipos de falhas são mais do que conhecidos, alguns deles tendo sido usados para quebrar os smartcards da TV Cabo (glitching).

Como é comum para qualquer ataque bem conhecido, existem maneiras de proteger implementações contra o mesmo. Isto é uma completa não-notícia, e só mostra como blogs e bloggers são absolutamente lixo no que toca a apresentar notícias com algum tipo de rigor e isenção.

Março 2, 2010

Multiplicação de polinómios – part ii

Arquivado em: Coding, Serious Business, Useless — dongs @ 23:42

Viva. Após a maré de degredo que afectou este estimado blog, venho tentar retomar a dignidade e qualidade do mesmo, uma tarefa deveras hercúlea.

Consideremos a multiplicação de polinómios em \mathbb{F}_2[x]. O algoritmo considerado no post anterior é conhecido há milénios e tem uma complexidade quadrática, i.e., O(n^2) operações para multiplicar dois polinómios de grau n. Este algoritmo será óptimo? Não.

Nos anos 60, foi descoberto o algoritmo de Karatsuba para multiplicar números inteiros em assimptoticamente menos operações. Resumidamente, este algoritmo divide os números a multiplicar na sua parte superior e inferior, e efectua a multiplicação em 3, não 4, multiplicações menores. Por exemplo, para multiplicar 123456 e 789012, dividimos ambos os números a meio: 123, 456, 789 e 012. Obtemos a parte menos significativa do resultado por multiplicar 456*012 = 5472. A parte mais significativa é obtida por 789*123 = 98154. O resto do nosso produto é obtido por efectuar a operação: (123+456)(789+012) - 5472 - 98154 = 360153. O resultado final é 5472 + 10^3*360153 + 10^6*98154 = 97408265472. Podem facilmente verificar que o resultado está correcto.

Este método pode ser aplicado recursivamente aos produtos mais pequenos resultantes de cada passo (divide and conquer). Isto significa que esta recorrência vai precisar de O(n^{\log_2 3}) operações para multiplicar dois números. Isto pode parecer irrelevante, mas faz toda a diferença com números grandes (e.g., com mais de 1024 bits.)

O método de Karatsuba não se limita aos inteiros; aplica-se a qualquer anel comutativo. Isto significa que podemos facilmente adaptar este método para multiplicar polinómios. Os truques algébricos para acelerar a multiplicação são uma área extremamente interessante: duas referências relevantes e recomendadas são 'Multidigit multiplication for mathematicians' e 'Faster multiplication in GF(2)[x]'.

No caso dos polinómios com coeficientes em {0,1}, i.e., \mathbb{F}_2[x], a tarefa é ainda mais simples: a adição é equivalente à subtracção, ambas sendo efectuadas com um simples xor. Implementar este algoritmo em C++ sem operações condicionais é ainda mais simples, dada a natureza recursiva do mesmo:

template<unsigned N>
inline word kmul(word a, word b)
{
	word a0, a1, b0, b1;
	word z0, z1, z2;

	a0 = a&(const word)((1<<(N/2))-1);
	b0 = b&(const word)((1<<(N/2))-1);
	a1 = a>>(const word)(N/2);
	b1 = b>>(const word)(N/2);

	z0 = kmul<N/2>(a0,b0);
	z2 = kmul<N/2>(a1, b1);
	z1 = kmul<N/2>(a0^a1, b0^b1) ^ z0 ^ z2;
	return z0 ^ (z2<<N) ^ (z1<<(N/2));
}

template<>
inline word kmul<1>(word a, word b)
{
	return a&b;
}

Apesar da menor complexidade deste algoritmo, esta implementação não vai ser mais rápida (para todos os tamanhos úteis) do que a do post anterior. Alguém me sabe dizer porquê?

Fevereiro 22, 2010

CSI: Funchal

Arquivado em: lulz — dongs @ 21:36

lolmadeira1 CSI: Funchal

Fevereiro 7, 2010

COMIC STRIP OFICIAL DO BLOL, LOL (UPDATED)

Arquivado em: Fail, Useless, lulz — sadik @ 23:45

Untitled 11 COMIC STRIP OFICIAL DO BLOL, LOL (UPDATED)

Fevereiro 1, 2010

Falando em vampiros…

Arquivado em: Drama, Fail, Useless — madinfo @ 23:20

Pois bem amigalhaços já que o tema dos vampiros veio ah baila também eu tenho que blogar sobre o assunto...

Eis que surge na TVI uma coisa inédita... uma novela sobre vampiros (coisa nunca vista) cujo nome é: "Destino Imortal" passada na Serra de Sintra, com um amor impossível entre um rapaz e uma rapariga (querem saber mais vejam a novela...).

A SIC sem mais demoras (não copiando nada) faz o seguinte: Filma na Serra de Sintra, e junta a historia de um amor impossível entre uma rapariga e um rapaz e chama-lhe "Lua Vermelha".

E pronto esta é a escolha dos senhores telespectadores em horário nobre... agora só falta nos "Morangos com Açúcar" surgir uma season vampiresca para o circulo ficar completo.

Ois migos! Estou a escrever um poste!

Arquivado em: Drama, Fail, Useless, lulz — sadik @ 19:44

Olá amigos! Estou de volta após um período de hiatus (como diz a malta jovem americana). Vocês devem lembrar-se de mim de tais posts clássicos, como a criação dos memes, "Todo Fit" ou "Dia do Projecto". Desta vez venho aqui falar de algo que realmente é importante e que é o seguinte: vampiros. Aparentemente o que está na moda hoje em dia é gostar de tudo o que esteja relacionado com vampiros. E se por acaso, esses vampiros gostarem de chupar o sangue de outros homens através da veia grossa da piça, então ainda melhor!

Vejamos:

robertpattinson11 Ois migos! Estou a escrever um poste!

Isto é que é um vampiro? O Nosferatu deve estar a dar voltas no caixão a esta hora (sim, porque ainda é de dia e ele provavelmente está a dormir).

Oi pessoal! Vamos falar de consolas!

Arquivado em: Drama, Serious Business — sadik @ 12:52

Ora viva caros amigos! Espero que a vossa cave esteja bem quentinha e com pouca humidade, pois vou falar de algo que vos vai deixar cheio de sopas de cu! Vamos falar da: XBOX 360!

Como toda a gente sabe, eu tenho uma Xbox 360 e gosto de comprar jogos originais, para ela se sentir amada. Mas há sempre pessoal que acha que comprar jogos é um desperdício de dinheiro. Acho isso relativo, há quem curta gastar guito em PDA's e telemóveis, outros gostam de comprar o último produto da maçã mordida. No final, todos compram aquilo que gostam e o que os fazem felizes, seja X, Y ou Z. Mas gostava de saber o que é que vocês acham sobre isso. Comprar games, YAY or NAY?

lolgaitas Oi pessoal! Vamos falar de consolas!

Janeiro 29, 2010

Palavras para quê…

Arquivado em: Drama, Fail, Serious Business — madinfo @ 10:46

Andava eu a googlar coisas sobre o iphone quando dou de caras com isto:

Somos os únicos distribuidores autorizados da marca Cect para Portugal. Oferecemos Cects i9 com 2 Gb de memória desbloqueados dual sim a 110,33 euros com transporte incluído para Portugal continental e ilhas. Clone aperfeiçoado do Iphone, sendo que a Apple criou uma nova versão do Iphone devido à concorrencia do Cect que, apesar de ser mais barato, era mais aperfeiçoado e corrigia alguns bugs do iPhone.

Claro que tive de entrar para ver o que era... e sim era mesmo isso... um clone ranhoso do iphone... agora imaginem se o iphone já é mau pensem como será este magnifico clone chines com symbian...

Aqui fica o site:

http://www.cectportugal.com/

PS: Na hora do fecho desta redação eis que surge ainda melhor:

http://www.tugatronica.com/iphone-chines-com-autenticacao-por-impressao-digital/

Vejam caros leitores...

Janeiro 28, 2010

Cantina da FCT UNL no Google Calendar (com SMS)

Arquivado em: Coding, Serious Business — falso @ 21:54

Ora Viva amigos!
Hoje venho aqui blogar não sobre uma coisa inútil como é habitual, mas sobre algo deveras útil!

Como devem saber (se não sabem, deviam!!!) eu há uns tempos tinha feito um parser à pagina das ementas no site dos Serviços de Acção Social da Universidade Nova de Lisboa que cria um RSS Feed onde se pode ver no Google Reader (ou outro) todos os dias a ementa do dia.

Mas já há uns tempos me tinham dito que na Universidade do Minho[1] há um marmanjo que importa as ementas lá do sitio para o Google Calendar. E vocês perguntam qual a razão para isso né? A beleza da cena é que no Google Calendar existe uma feature que permite enviar avisos de eventos por SMS, já viram onde isto nos leva né ;-)

Então decidi por mãos à obra e comecei a programar, decidi usar Python pois as APIs dos Serviços do Google parecem ser mais viradas para essa linguagem.

O primeiro problema era fazer parse da pagina da SAS, então descobri no Google um parser de HTML lindo chamado BeautifulSoup que até tem um *slogan* todo jeitoso - You didn't write that awful page. You're just trying to get some data out of it. Right now, you don't really care what HTML is supposed to look like. Neither does this parser.
Em muito pouco tempo, sem usar uma única regex lá consegui fazer parse ao site e sacar de la todos os dados que precisava.

Depois andei a cuscar o Google Data API Developer's Guide: Python, e com a ajuda dos exemplos rapidamente fiz uma rotina que importava o que eu precisava para o Google Calendar.

Aqui se segue o código caso alguém queira implementar o mesmo para outras faculdades da UNL.

#!/usr/bin/env python
# this script can never fail
# -*- coding: utf-8 -*-

# This program is free software. It comes without any warranty, to
# the extent permitted by applicable law. You can redistribute it
# and/or modify it under the terms of the Do What The Fuck You Want
# To Public License, Version 2, as published by Sam Hocevar. See
# http://sam.zoy.org/wtfpl/COPYING for more details.

# urle de exemplo
# http://sas.unl.pt/cantina?year_menu:int=2010&month_menu:int=1&day_menu:int=25

import urllib
from BeautifulSoup import BeautifulSoup

try:
  from xml.etree import ElementTree # for Python 2.5 users
except ImportError:
  from elementtree import ElementTree
import gdata.calendar.service
import gdata.service
import atom.service
import gdata.calendar
import atom
import getopt
import sys
import string
import time

import datetime

# ids dos calendarios. almoco - almoco dieta - jantar - jantar dieta
cal_ids = ['/calendar/feeds/XXXXXXXXXXXXXXXXXXXXXXXXXX%40group.calendar.google.com/private/full',
          '/calendar/feeds/XXXXXXXXXXXXXXXXXXXXXXXXXX%40group.calendar.google.com/private/full',
          '/calendar/feeds/XXXXXXXXXXXXXXXXXXXXXXXXXX%40group.calendar.google.com/private/full',
          '/calendar/feeds/XXXXXXXXXXXXXXXXXXXXXXXXXX%40group.calendar.google.com/private/full']

# logar-se ao google
calendar_service = gdata.calendar.service.CalendarService()
calendar_service.email = 'XXXXXXXX@gmail.com'
calendar_service.password = 'XXXXXXXX'
calendar_service.source = 'Google-Calendar'
calendar_service.ProgrammaticLogin()

def ParsaSite(ano, mes, dia):
  params = urllib.urlencode({'year_menu:int': ano, 'month_menu:int': mes, 'day_menu:int': dia})
  f = urllib.urlopen("http://sas.unl.pt/cantina?%s" % params)
  soup = BeautifulSoup(f.read())

  # todas as cantinas
  cantinas = soup.findAll(attrs={'class' : 'cantina'})
  for cantina in cantinas:
    # verifica se o conteudo da class title e da FCT
    titletag = cantina.find(attrs={'class' : 'title'})
    if titletag.renderContents().count('ncias e Tecnologia'):
      # apanha o almoco
      almoco = titletag.nextSibling.nextSibling
      # percorre todos os pratos
      almoco_p = almoco.findAll('li')
      al = {}
      for prato in almoco_p:
        key = prato.next.renderContents()
        value = prato.next.next.next.next.next.renderContents()
        al[key] = value

      jantar = almoco.nextSibling.nextSibling
      jantar_p = jantar.findAll('li')
      ja = {}
      for prato in jantar_p:
        key =  prato.next.renderContents()
        value = prato.next.next.next.next.next.renderContents()
        ja[key] = value
      return (al, ja)

def InsereEvento(calendario_id, _data, refeicao, prato):
  evento = gdata.calendar.CalendarEventEntry()
  evento.title = atom.Title(text=prato)
  #evento.where.append(gdata.calendar.Where(value_string='Cantina FCT UNL - Monte de Caparica'))

  dt = datetime.datetime(_data.year, _data.month, _data.day)

  if refeicao == 1:
    inicio = dt + datetime.timedelta(hours=11,minutes=30)
    fim = dt + datetime.timedelta(hours=14,minutes=30)
  if refeicao == 2:
    inicio = dt + datetime.timedelta(hours=18,minutes=30)
    fim = dt + datetime.timedelta(hours=20,minutes=30)

  evento.when.append(gdata.calendar.When(start_time=inicio.isoformat(), end_time=fim.isoformat()))
  calendar_service.InsertEvent(evento, calendario_id)

dt = datetime.date.today()
while dt.weekday() < 5:
  (al, ja) = ParsaSite(dt.year, dt.month, dt.day)

  i = 0

  for k, v in al.iteritems():
    if k == 'Prato':
      InsereEvento(cal_ids[i], dt, 1, v)
    if k == 'Dieta':
      InsereEvento(cal_ids[i], dt, 1, v)
    i+=1

  i = 2

  for k, v in ja.iteritems():
    if k == 'Prato':
      InsereEvento(cal_ids[i], dt, 2, v)
    if k == 'Dieta':
      InsereEvento(cal_ids[i], dt, 2, v)
    i+=1

  # incrementa a data
  dt += datetime.timedelta(days=1)

# acabou boy

O script vai ser corrido todas as segundas durante a madrugada no cron.
Sei que o código não interessa a ninguém, e o que querem é os links para adicionar os calendários ao Google Calendar, portanto aqui vão.

Props pro webmaster do site da SAS por feito um HTML bem estruturadinho.

1 - Se alguém sofrer de algum problema de atraso mental e não souber activar as SMS no Google Calendar, no link para a Universidade do Minho está um documento a explicar como se faz

Janeiro 26, 2010

WP_Birds

Arquivado em: Coding, Serious Business, Useless — falso @ 23:44

Ora viva!

Hoje como estava aborrecido e não me apetecia ir para a rua porque está um barbeiro do caralho decidi meter o blol a validar no w3c validator, primeiro estava com alta drama por causa do penisbird no source do site, mas depois lá aprendi que em HTML também existe o CDATA, e que se o usar por exemplo dentro dum paragrafo posso meter lixo para la à vontade.
E com isto lá pus o blol a validar, mas fiquei com um bichinho atrás da orelha, porque só um penisbird quando podemos ter um molho deles, então tentei seguir as passadas do grande Mario Gamito e decidi também eu fazer um plugin para o WordPress que adiciona penisbirds aleatórios no fim do blog mesmo antes do fechar do BODY.
Sei que é a coisa mais inútil de sempre, mas, é para isso que cá estou eu!
Download: wp_birds_0.1.zip

« Posts anteriores