segunda-feira, dezembro 21, 2009
Go Horse Process e variantes
É leitura recomendada para qualquer pessoa que trabalhe, mas especialmente para quem lida com desenvolvimento de software.
--
Atenciosamente
--
=========================
Alexandre Andrade
Hipercenter.com
quarta-feira, dezembro 09, 2009
algoritmo para encontrar melhor rota
http://www.vivaolinux.com.br/script/Algoritmo-genetico-rotas
############################################################
#ALGORITMO GENETICO DESENVOLVIDO PARA DISCIPLINA INTELIGENCIA ARTIFICIAL #
#OBJETIVO: SOLUCAO EFICIENTE PARA O PROBLEMA DE ROTEAMENTO DE VEICULOS #
#AUTOR: CESAR TINUM ,SABRINE HENRIQUE DATA:06-11-2009 #
#CENTRO UNIVERSITARIO DE BELO HORIZONTE DCE - 7 PERIODO MANHA #
#CONTATO : magodoschatsbh@gmail.com , sabrine@2xt.com.br #
############################################################
#SELECAO #MUTACAO #CROSSOVER
import random #GERACAO NUMEROS ALEATORIOS
from threading import Thread #BIBLIOTECA DE GERACAO DE SUBPROCESSOS (THREADS)
from math import ceil #BIBLIOTECA DE ARREDONDAMENTO NUMERICO
from time import time, strftime
class AG:
def __init__(self, mutacao,crossover,tamPopulacao,fitnes, cidades, maxdistancia, geracoes, numthreads, naoalcanco):
start = time()
self.MAX_DIST = maxdistancia
self.mutacao = mutacao #propriedade de mutacao
self.crossover = crossover
self.NAOALCANCO = naoalcanco #possibilidade de nao haver caminho entre cidades
self.tamPopulacao = tamPopulacao #numero populacao inicial
self.fitnes = fitnes #funcao de avaliacao
self.populacao = [] #vetor contendo a populacao
self.fitPopulacao = [] #vetor com resultado avaliacao de cada elem da populacao
self.distancia = {}
self.NUM_THREADS = numthreads
self.geracoes = geracoes
self. cidades = cidades
self.disCidades(cidades)
self.populacaoInicial = []
self.__initGeracao()
self.selecao()
self.populacaoInicial = self.populacao
for i in range(self.geracoes):
self.__nextGeracao()
self.__crossover()
self.selecao()
finish = time()
self.time = finish - start
self.__header()
#FIM CLASSE INICIALIZACAO
def __initGeracao(self):
try:
threads = []
for i in range(self.NUM_THREADS):
threads.append(self.__startThreads('self.geraPopulacao', {})) #DISPARANDO THREADS PARA GERAR POPULACAO E AVALIACAO DOS ELEMENTOS
self.__endThreads(threads) #ESPERA THREADS ACABAREM
except Exception, e:
print e
def __nextGeracao(self):
try:
threads = []
tamMutacao = round(ceil(float(self.tamPopulacao) / 2)* self.mutacao) #NUMERO DE INDIVIDUOS QUE SOFRERAO MUTACAO
faixa = int(ceil(tamMutacao / self.NUM_THREADS))
r = int((tamMutacao>self.NUM_THREADS and self.NUM_THREADS or tamMutacao)) #VERIFICA SE NUM THREADS E MAIOR QUE NUM ELEMENTOS QUE SOFRERAO MUTACAO
for i in range(r):
threads.append(self.__startThreads('self.geraMutacao', {'ini':i+1, 'tam':faixa})) #DISPARANDO THREADS PARA EFETUAR MUTACAO NOS PIORES ELEMENTOS DA POPULACAO EM FAIXAS
self.__endThreads(threads) #ESPERA THREADS ACABAREM
except Exception, e:
print e
def __endThreads(self, threads):
for t in threads:
t.join(10)
return
def geraMutacao(self,ini, tam):
try:
sorteados = [] #GUARDA ELEMENTOS SORTEADOS PARA QUE O ALGORITMO NAO ENTRE EM LOOP SORTEANDO SEMPRE O MESMO NODO
tamC = self.tamPopulacao
ini = tamC - (2*ini)
flag = True
limite = ini + tam
numCidades = len(self.cidades)
while ini <= limite:
tenhoCidades = True
if flag:
cont = 0
posCorte = random.randint(3, numCidades -1) #PONTO DE CORTE PARA MUTACAO ALEATORIO
n = numCidades-posCorte #NUMERO DE ELEMENTOS QUE SERAO TROCADOS
list = self.populacao[ini][2:posCorte]
del self.populacao[ini][posCorte:] #DELETO O RESTO DO VETOR A PARTIR DO PONTO DE CORTE PARA INSERIR NOVOS ELEMENTOS
sorteados = []
i = 0
j = 0
while tenhoCidades:
flag = False
nodo = self.cidades[random.randint(0, numCidades-1)]
if cont > numCidades - 1:
flag = True
break
if nodo in sorteados or nodo in list:
cont+=1
continue
try:
if self.populacao[ini][posCorte - 1]:
d = (self.adjacencia(nodo, self.populacao[ini][posCorte-1]) and True or None)
else:
d = True
except Exception, e:
d = None
if d:
self.populacao[ini].append(nodo)
list.append(nodo)
res = self.geraFitnes(self.populacao[ini], 2)
self.populacao[ini][0] = res[0]
self.populacao[ini][1] = res[1]
i+=1
tenhoCidades = not self.__sublist(list, self.cidades)
if not flag:
ini+=1
return True
except Exception, e:
return False
def __startThreads(self, funcAlvo, k):
try:
t = Thread(target = eval(funcAlvo), kwargs = k)
t.start()
return t
except Exception, e:
print e
def disCidades(self, cidades): #GERA DISTANCIA ENTRE CIDADES , MATRIZ DE ADJACENCIA
for i in cidades:
self.distancia[i] = {}
for j in cidades:
if not self.distancia[i].has_key(j): #SE J NAO ESTA NO DICIONARIO DA CIDADE I VOU INCLUI-LA
if self.distancia.has_key(j) and j!=i: #SE CIDADE J ESTA NO DICIONARIO (JA TENHO VALOR) E J!=I (NAO E A MESMA CIDADE)
self.distancia[i][j] = self.distancia[j][i]
continue
if i == j:
self.distancia[i][j] = 0
continue
alcanco = random.randint(1, self.NAOALCANCO) #CHANCE DE CIDADES NAO SE ALCANCAREM = 1 EM NAO ALCANCO (PARAMETRO)
if alcanco == 1:
self.distancia[i][j] = 100000 #ATRIBUI VALOR DISTANCIA MUITO ALTO = CIDADE NAO ALCANCAVEL
continue
self.distancia[i][j] = random.randint(1, self.MAX_DIST) #SORTEIA VALOR DA DISTANCIA ALEATORIAMENTE ENTRE 1 - MAX_DIST SE FOR A MESMA CIDADE VALOR DISTANCIA 0
return
def selecao(self): #DIVIDIR A POPULACAO EM GRUPOS PARA APLICAR FUNCAO DE AVALIACAO POR THREADS.
self.populacao.sort()
def geraPopulacao(self):
tam = int(ceil(float(self.tamPopulacao)/4))
try:
for i in range(tam):
d = []
sorteados = []
d.append(self.cidades[random.randint(0, len(self.cidades) - 1)]) #1 CIDADE ALEATORIA
sorteados.append(d[0])
cont = 1
while not self.__sublist(d, self.cidades): #RODA LOOP ENQUANTO NAO TEM TODAS CIDADES NA ROTA - SE IMPASSE ATE 100 ITERACOES - COMECA DE NOVO
b = self.cidades[random.randint(0, len(self.cidades) - 1)]
cont+=1
if cont >len(self.cidades):
cont = 0
d = []
sorteados = []
d.append(self.cidades[random.randint(0, len(self.cidades) - 1)]) #1 CIDADE ALEATORIA
sorteados.append(d[0])
elif b in sorteados:
continue
sorteados.append(b)
c = (self.adjacencia(d[len(d)-1],b) and d.append(b) or False) #VERIFICA SE CIDADES SAO ADJACENTES (EXISTE ROTA ENTRE ELAS)
if len(self.populacao) == self.tamPopulacao: #COMO AS THREADS PODEM SE DIVIDIR EM MAIS ELEMENTOS QUE O TAMANHO ORIGINAL PRAMETRIZADO
return False #DEVIDO AO ARREDONDAMENTO DE VEZES PARA CADA THREAD CRIAR ELEMENTOS
res = self.geraFitnes(d, 0) #VERIFICO AQUI SE TAMANHO TOTAL DE ELEMENTOS JA FOI CRIADO ANTES SE INSERIR CADA ELEMENTO
d.insert(0, res[0])
d.insert(1, res[1])
self.populacao.append(d)
return True
except Exception, e:
print e
def adjacencia(self, a, b):
return ((self.distancia[a][b]<9999 and a!=b or False) and True or False) #SE A DISTANCIA MENOR QUE 9999 AVALIA SE A!=B PARA EVITAR IR E VOLTAR NA MESMA CIDADE
def geraFitnes(self, mat, pos): #AVALIA CADA ROTA POSSIVEL DA POPULACAO
try:
d = []
e = mat[pos:]
mat = mat[pos:]
f = self.cidades
tenhoTodasCidades = ((self.__sublist(mat, f) and True or False) and 1 or 100) #VERIFICA SE ROTA SENDO AVALIADA POSSUI TODAS AS CIDADES
d.extend(self.distancia[mat[i]][mat[i+1]] for i in range(len(mat)))
return [tenhoTodasCidades, sum(d)] #SOMA VALOR DE DISTANCIA ENTRE CIDADES DA ROTA
except Exception, e:
return [tenhoTodasCidades, sum(d)]
def load(self, url):
try:
file = open(url, 'r')
fileLines= file.readlines()
for linha in fileLines:
linha = linha.split(" ")
for indice, distancia in enumerate(linha):
pass
#LE CADA LINHA E ATRIBUI VALOR DE DISTANCIAS
except Exception, e:
print e
def __sublist(self, filho, mae):
try:
contem=[]
contem.extend((item in filho and 1 or 0) for item in mae) #VERIFICA SE ROTA POSSUI TODAS CIDADES
if 0 in contem:
return False
else:
return True
except Exception, e:
print 'Erro na busca de sublista, ', e
def __crossover(self): #IMENDA ROTAS MAIS BEM AVALIADAS EM ROTAS MAL AVALIADAS A PARTIR DE PONTO EM COMUM
try:
tamCrossOver = round(ceil(self.tamPopulacao / 2)* self.crossover) #NUMERO DE INDIVIDUOS QUE SOFRERAO MUTACAO
faixa = int(ceil(tamCrossOver / self.NUM_THREADS))
r = int((tamCrossOver>self.NUM_THREADS and self.NUM_THREADS or tamCrossOver)) #VERIFICA SE NUM THREADS E MAIOR QUE NUM ELEMENTOS QUE SOFRERAO MUTACAO
threads = []
for i in range(r):
threads.append(self.__startThreads('self.geraCrossOver', {'ini':i+1, 'tam':faixa})) #DISPARANDO THREADS PARA EFETUAR MUTACAO NOS PIORES ELEMENTOS DA POPULACAO EM FAIXAS
self.__endThreads(threads)
except Exception, e:
print e
def geraCrossOver(self, ini, tam, nodo=None):
try:
tamC = self.tamPopulacao
ini = tamC - (tam*ini)
flag = True
limite = ini + tam
numCidades = len(self.cidades)
melhorRota = self.populacao[0][2:] #AS CIDADES DA MELHOR ROTA, 2 EM DIANTE POS 0 E 1 SAO AVALIACOES
while ini < limite:
if limite>=self.tamPopulacao:
break
while nodo == None:
posCorte = random.randint(3, len(self.cidades)-1) #PONTO DE CORTE ONDE SERA FEITO A JUNCAO
nodo = (lambda nodo: nodo in melhorRota and nodo or None)(self.populacao[ini][posCorte])
del self.populacao[ini][:2] #RETIRA VALORES AVALIACAO
v = {len(self.populacao[ini][:self.populacao[ini].index(nodo)]):'esq', len(self.populacao[ini][self.populacao[ini].index(nodo):])-1:'dir'} #NUMERO DE ELEMENTOS A DIREITA E ESQUERD DA POSICAO DE CORTE
g = {len(melhorRota[:melhorRota.index(nodo)]):'esq', len(melhorRota[melhorRota.index(nodo):])-1:'dir'} #NUMERO DE ELEMENTOS A DIREITA E ESQUERD DA POSICAO DE CORTE DA MELHOR ROTA
ladoV = max(v.items()) #CRUZAR O LADO QUE TIVER MAIOR NUMERO DE ELEMENTOS [0] = LADO [1] = NUM ELEM
ladoG = max(g.items()) #CRUZAR O LADO QUE TIVER MAIOR NUMERO DE ELEMENTOS [0] = LADO [1] = NUM ELEM
cont=0
c=0
######################################################
#VALIDAR NUM ELEMENTOS EQUIPARANDO AO VETOR BASE ( MELHOR ROTA)
######################################################
if ladoG[0]<ladoV[0]:
ladoV = min(v.items()) #MANTER O LADO DO MELHOR VETOR COMO MAIOR PARA NAO FALTAR INDICE
indiceNodo = self.populacao[ini].index(nodo)
indiceNodoG = melhorRota.index(nodo)
if ladoV[1] == 'esq':
try:
if indiceNodo>0:
del self.populacao[ini][:indiceNodo-1] #DELETA ELEMENTOS A ESQUERDA DO INICIO ATE O INDICE DO VETOR DE JUNCAO
indiceNodo = (indiceNodo > 0 and (indiceNodo - 1))
for indice in range(indiceNodo):
indiceNodoG = (ladoG[1] == 'dir' and (indiceNodoG +1) or (indiceNodoG -1))
self.populacao[ini].insert(indice, melhorRota[indiceNodoG]) #ADICIONANDO ELEMENTOS A DIREITA NO VETOR DE MELHOR ROTA
except Exception, e:
pass
else:
try:
indiceNodo = self.populacao[ini].index(nodo)
if indiceNodo<len(self.populacao[ini])-1:
del self.populacao[ini][indiceNodo+1:] #DELETA ELEMENTOS A ESQUERDA DO INICIO ATE O INDICE DO VETOR DE JUNCAO
indices = []
ind = indiceNodo
id = len(self.cidades) - indiceNodo
while len(indices) < id:
ind+=1
indices.append(ind)
for indice in indices:
indiceNodoG = (ladoG[1] == 'dir' and (indiceNodoG +1) or (indiceNodoG -1))
self.populacao[ini].insert(indice, melhorRota[indiceNodoG]) #ADICIONANDO ELEMENTOS A DIREITA NO VETOR DE MELHOR ROTA
except Exception, e:
pass
############################################
#INSERIR ELEMENTOS PARA QUE ROTA CONTENHA TODAS CIDADES
############################################
list = []
list= self.populacao[ini]
c = 0
try:
while not self.__sublist(self.populacao[ini], self.cidades) and c<50: #TENTO 20 VEZES INSERIR ELEMENTO NA LISTA PARA COMPLETA-LA
cont=0
c+=1
elem = self.cidades[random.randint(0, len(self.cidades)-1)]
while elem in list and cont < 50:
elem = self.cidades[random.randint(0, len(self.cidades)-1)]
cont+=1
if cont < 50:
if self.adjacencia(elem, self.populacao[ini][len(self.populacao[ini])-1]): #VERIFICA ADJACENCIA ENTRE O ELEMENTO E O ULTIMO DO VETOR
self.populacao[ini].append(elem)
break
except Exception, e:
print 'Erro ao completar rota, ', e
res = self.geraFitnes(self.populacao[ini], 0) #VERIFICO AQUI SE TAMANHO TOTAL DE ELEMENTOS JA FOI CRIADO ANTES SE INSERIR CADA ELEMENTO
self.populacao[ini].insert(0, res[0])
self.populacao[ini].insert(1, res[1])
ini+=1
except Exception, e:
pass
def __header(self):
try:
print "**************************************************************************************"
print "* ALGORITMO GENETICO - HEURISTICA DO CAIXEIRO VIAJANTE UNI-BH *"
print "* AUTOR: CESAR T. SILVA, SABRINE HEQUER - cesarts25@gmail.com / sabrinesa@gmail.com*"
print "* DISCIPLINA: INTELIGENCIA ARTIFICIAL PROF: ANA PAULA LADEIRA CCM7 *"
print "**************************************************************************************"
print ""
print " PARAMETROS DE ENTRADA PARA O AG "
print "PROBABILIDADE DE MUTACAO = %f"%self.mutacao
print "PROBABILIDADE DE CRUZAMENTO = %f"%self.crossover
print "PROBABILIDADE DE NAO ALCANCABILIDADE ENTRE CIDADES = 1/%d"%self.NAOALCANCO
print "TAMANHO DA POPULACAO = %d"%self.tamPopulacao
print "CIDADES - ", self.cidades
print "DISTANCIA MAXIMA ENTRE AS CIDADES = %d"%self.MAX_DIST
print "NUMERO DE GERACOES = %d"%self.geracoes
print "NUMERO DE THREADS UTILIZADAS = %d"%self.NUM_THREADS
print ""
print " MATRIZ DE ADJACENCIA "
c = " "
for i in self.cidades:
c += " "+i
print c
for i in self.cidades:
c = []
for j in self.cidades:
c.append(self.distancia[i][j])
print i, c
print ""
print ""
print " RESULTADOS OBTIDOS "
print "MELHOR ROTA - ", self.populacao[0][2:]
print "CUSTO EM KM - ", self.populacao[0][1]
print "TEMPO GASTO PELO ALGORITMO - ", self.time, " segundos."
print ""
pop = raw_input("IMPRIMIR POPULACAO (S/N): ")
if pop.lower() =='s':
print " POPULACAO INICIAL "
for i , j in enumerate(self.populacaoInicial):
print i , '- ', j
if pop.lower() =='s':
print " POPULACAO FINAL "
for i , j in enumerate(self.populacao):
print i , '- ', j
print ""
print " BELO HORIZONTE %s"%(strftime("%d/%m/%Y"))
except Exception, e:
print e
###################
#INSTANCIA CLASSE
####################
if __name__ == "__main__":
try:
print " -- COLETA DE DADOS -- "
ger = input("NUMERO DE GERACOES: ")
pop = input("TAMANHO DA POPULACAO: ")
citys = input("NUMERO DE CIDADES: ")
c = []
c.extend(str(city) for city in range(citys))
print " CALCULANDO ROTA..."
ag = AG(0.3,0.7,pop,'2x+30x2', c, 1200, ger, 4, 50)
except Exception, e:
print e
--
Atenciosamente
--
=========================
Alexandre Andrade
Hipercenter.com
sexta-feira, dezembro 04, 2009
DNS público do Google
8.8.8.8 e 8.8.4.4
Mais informações em
http://code.google.com/intl/pt-BR/speed/public-dns/
--
Atenciosamente
--
=========================
Alexandre Andrade
Hipercenter.com
terça-feira, dezembro 01, 2009
CouchDB - Um Banco de dados Adhoc?
Ainda tenho que avaliá-lo com mais calma, mas me parece útil para situações que hoje usam XML, mas que nunca usei por considerar XML muito chato.
--
Atenciosamente
--
=========================
Alexandre Andrade
Hipercenter.com
sexta-feira, novembro 27, 2009
Work: Software open source para mapeamento de processos
Ela permite mapear, simular e documentar os processos.
A abordagem é bastante simplificada para permitir utilização por um público mais amplo.
Uma demonstração está disponível em http://www.hipercenter.com/work
--
Atenciosamente
--
=========================
Alexandre Andrade
Hipercenter.com
segunda-feira, novembro 23, 2009
Short tutorial to migrate web2py database - model and data
1. To export your sqlite database, use the shell:
db.export_to_csv_file(open('somefile.csv', 'wb'))
2. create a empty postgresql database, and change
db = DAL('sqlite://storage.sqlite')
to
# db = DAL('sqlite://storage.sqlite') # if not, use SQLite or other DB
db = DAL("postgres://user:password@localhost:5432/yournewdatabase")
3. and to import:
db.import_from_csv_file(open('somefile.csv', 'rb'))
--
Atenciosamente
--
=========================
Alexandre Andrade
Hipercenter.com
domingo, novembro 22, 2009
Web2py: Recaptcha in SQLFORM
as pointed out it is not a field.
This is the best way.
form[0].append(TR('',captcha, ''))
Dica do Massimo
--
Atenciosamente
--
=========================
Alexandre Andrade
Hipercenter.com
sexta-feira, novembro 20, 2009
web2py - rounded corners - chrome, safari e firefox
-----------------------------------------------
<div class="box">
test
</div>
in static/base.css add
-----------------------------------------------
.box {
-moz-border-radius: 5px;/*for firefox3*/
-webkit-border-radius: 5px;/*for safari and chrome*/
background-color: rgb(249,249,249);
background-image: url("../default/border_radius?
r=4&color=249,249,249&bg=235,232,230");/*for opera*/
}
in controllers/default.py add
-----------------------------------------------
def border_radius():
import re
try:
radius = request.vars['r']
except KeyError:
radius = 5
try:
color = request.vars['color']
if re.match('\d{3},\d{3},\d{3}',color):
color = 'rgb(%s)'%color
except KeyError:
color = 'rgb(249,249,249)'
try:
bg = request.vars['bg']
if re.match('\d{3},\d{3},\d{3}',bg):
bg = 'rgb(%s)'%bg
except KeyError:
bg = 'rgb(235,232,230)'
import gluon.contenttype
response.headers['Content-Type']= gluon.contenttype.contenttype
('.svg')+';charset=utf-8'
return '''<?xml version="1.0" ?> <svg xmlns="http://www.w3.org/
2000/svg"> <rect fill="%s" x="0" y="0" width="100%%" height="100%%" />
<rect fill="%s" x="0" y="0" width="100%%" height="100%%" rx="%spx" />
</svg>'''%(bg,color,radius)
-----------------------------------------------
you'r done
for WebKit (Safari, Chrome) and Gecko (Firefox) the experimental css3
property is used to create the rounded corners and for Opera an SVG
image with rounded corners is generated and used as background
happily stolen from http://home.e-tjenesten.org/~ato/2009/08/border-radius-opera
Why? Because I did not want to create complicated tables/complicated
css and java scrip rounded corners always made my site very slow and i
dont give a .. for IE.
Hint: you can also do something like
background-image: url("../default/border_radius?
r=50&color=red&bg=blue");
--
Atenciosamente
--
=========================
Alexandre Andrade
Hipercenter.com
quinta-feira, novembro 19, 2009
Linux Hardening
O simples fato de uma máquina estar conectada à internet já representa um risco em potencial. Uma boa experiência para comprovar isso é configurar um IDS (Snort, por exemplo) e depois de um dia apenas analisar seus logs. Veremos várias tentativas de invasão, por qualquer método que nos assustaremos. Não apenas no que diz respeito a servidores, mas também à desktops.
Para quem quer conhecer um pouco mais sobre o assunto, seguem abaixo dois links, um para um texto outro para uma apresentação sobre Linux Hardening:
Artigo - http://www.csirt.pop-mg.rnp.br/docs/hardening/linux.html
Apresentação - http://www.rfdslabs.com.br/wp-content/uploads/2007/06/hardening-linux-2.ppt
--
Dica de http://www.vivaolinux.com.br/dica/Linux-Hardening
Atenciosamente
--
=========================
Alexandre Andrade
Hipercenter.com
SSH: Como resolver problema de demora para digitar usuário e senha
Se para conectar via SSH a um servidor você enfrenta uma certa demora para ser solicitado o usuário e senha, ou seja, você conecta e aguarda alguns segundos para receber a solicitação "Login as: ", então digita o usuário e aperta "enter", e aí demora entre 30 segundos e 2 minutos para receber a solicitação de "password:"...
Imagine esta situação quando um serviço crítico precisa de manutenção e você não consegue nem conectar no servidor... cada segundo é uma eternidade!
Como resolver:
Este problema está relacionado à autenticação utilizando GSSAPI, que é relacionada a autenticação Kerberos. Se você nunca ouviu falar disso ou não utiliza este sistema de autenticação, deve desabilitar, o que vai acabar com a demora para conectar:
Para isto, edite o arquivo /etc/ssh/sshd_config e retire o comentário (#) ou modifique a linha abaixo para ficar da seguinte forma:
Explicação:
Existe um bug em algumas versões de servidor SSH (sshd) onde o default desta opção é "on"... que faz com que o servidor SSH fique tentando autenticar via Kerberos. Desabilitando, você resolve o problema.
Espero que seja útil!
--
Dica de http://www.vivaolinux.com.br/dica/SSH-Como-resolver-problema-de-demora-para-digitar-usuario-e-senha
Atenciosamente
--
=========================
Alexandre Andrade
Hipercenter.com
Serviço virtual do governo de SP calcula chances de encontrar trabalho
Termômetro Nacional do Emprego compara, na web, o perfil de candidato com informações de vagas em seis regiões metropolitanas do país.
O governo do estado de São Paulo anunciou nesta terça-feira (17/11) o Termômetro Nacional do Emprego – ferramenta online que calcula a chance de colocação no mercado de trabalho para quem está desempregado.
Utilizando dados da Pesquisa Mensal de Emprego (PME) do IBGE acumulados desde 2002, o programa analisa as chances de êxito na busca de trabalho para os próximos 30, 60 e 90 dias.
Este cálculo representa as chances médias do grupo representado pela pessoa que faz a consulta.
Além de São Paulo, Porto Alegre, Salvador, Recife, Rio de Janeiro e Belo Horizonte são as regiões metropolitanas que também participam da PME--
Sem dúvida, interessante
Atenciosamente
--
=========================
Alexandre Andrade
Hipercenter.com
Polaris – Google Analytics Desktop
Para quem tem um blog ou mesmo site em produção seguramente quer saber como anda a visitação. Para isso existe o google analytics , que te fornece uma série de estatísticas sobre o assunto. Este serviço que o google nos oferece é muito importante porém as vezes é confuso na apresentação daquilo que é essencial. Pensando nisso acabei descobrindo uma aplicação em Air ( ADOBE ) chamada Polaris para o Google Analytics que funciona no Desktop. Neste caso você não precisa acessar o site do google para ver suas estatísticas e pode visualizar tudo isso em seu Desktop de maneira intuitiva e simples. Existem versões para Windows, Linux e Mac. O programa é gratuíto e tem uma interface bem acabada.Nos testes que efetuei se comportou bem e cumpriu aquilo que se propõe.
Para saber mais a respeito acesse o site da aplicação !
http://pauloamaral.blog.br/polaris-google-analytics-desktop/
--
Atenciosamente
--
=========================
Alexandre Andrade
Hipercenter.com
quarta-feira, novembro 18, 2009
New features not documented in book 2 ed.
decimal field type
http://groups.google.com/group/web2py/browse_thread/thread/3c1957d8ed743513
1.72.1
* Alias for id field
allows to redefine the name of the 'id' field.
* make_migrate=True
rebuild missing .table files
http://groups.google.com/group/web2py/browse_thread/thread/eed21229883b5a1a
* keyed tables
support for legacy tables (MS SQL, DB2, Ingres & Informix)
http://groups.google.com/group/web2py/browse_thread/thread/db150376b06d47fc
1.71.1
* A complete rewrite or the Rows object that makes web2py faster and
smaller
* DALStorage is renamed Row
* Now you can call web DAL form any Python program
* You can also use the template language from any Python program
http://groups.google.com/group/web2py/browse_thread/thread/159b44bfbb634df2
http://groups.google.com/group/web2py/browse_thread/thread/c81061bc00c6181e
1.69.1
* Lots of new DAL APIs including
OR, LIKE, BELONGS, and more on GAE
* response.meta.keywords, reponse.meta.description,
response.meta.author, ...
* response.files.append for including js & css files
* experimental plugin mechanism
http://groups.google.com/group/web2py/browse_thread/thread/fe6381e136995563
http://www.web2py.com/AlterEgo/default/show/248
1.68.1
* New cron
* New hindi and spanish translation
* cached uploads allow for progress bars (thanks AndCycle)
* Ingres support (thanks Chris)
* default setting of content-type (this may cause strange behavior in
old apps when downloading images)
* IS_UPPER and IS_LOWER work with unicode
* CLEANUP now takes regex of allowed/now allowed characters
* New rewrite.py allows dynamic routes
* Better error messages for IS_INT_* and IS_FLOAT_*
http://groups.google.com/group/web2py/browse_thread/thread/ba5fa43f53ad38ad
Other info
----------
How to make your own layouts
http://groups.google.com/group/web2py/browse_thread/thread/6f321414a058b4b3
http://groups.google.com/group/web2py/browse_thread/thread/5a75171b835f542d
http://code.google.com/p/web2py/source/browse/trunk/scripts/layout_make.py
Virtual fields
http://groups.google.com/group/web2py/browse_thread/thread/c684346f13773f93
http://groups.google.com/group/web2py/browse_thread/thread/d59ee3d6c2e6d836
http://www.vimeo.com/7296755
http://www.web2py.com/AlterEgo/default/show/248 (at the end)
--
Atenciosamente
--
=========================
Alexandre Andrade
Hipercenter.com
sábado, novembro 14, 2009
sexta-feira, novembro 13, 2009
Governo pretende liberar cópia de músicas e de livros
12/11 - 11:09 - Erika Klingl, iG Brasília
BRASÍLIA – Guardada a sete chaves, a nova lei de Direitos Autorais, redigida pelo Ministério da Cultura, vai autorizar, pelo menos, duas práticas usuais dos jovens brasileiros. Pretende permitir, por exemplo, que os interessados em realizar fotocópias de um livro o façam da publicação completa e não apenas de pequenos trechos, como é hoje. Também vai criar uma forma legal de autorizar a cópia de músicas para aparelhos de MP3, o que hoje é ilegal e considerado pirataria.
Em entrevista ao iG, o diretor de Direitos Intelectuais do Ministério da Cultura, Marcos Alves, antecipou que o texto vai buscar o equilíbrio entre a proteção aos titulares das obras e o direito do cidadão de ter acesso à cultura. "Temos uma lei muito restritiva hoje e precisamos mudar isso", afirma. "Um universitário que quer copiar um livro acaba incorrendo em crime se xeroca a publicação inteira", avalia. Pela proposta, será permitida a cópia de livros e a livre utilização, desde que essa cópia seja para fins educacionais, não para a utilização econômica.
"O mesmo vale para alguém que comprar um CD de algum artista e o copia para MP3. Mesmo se a pessoas pagou pelo produto, se copiar a música na íntegra é pirata", completa. Em ambos os casos, a solução apontada pelo Ministério da Cultura é semelhante. A ideia é fazer um fundo de reserva de recursos alimentado com taxação dos produtos. Ou seja, um percentual pago à copiadora iria para um fundo destinado a reembolsar os autores e as editoras.
O mesmo argumento serve para quem abastece os aparelhos de MP3. "Esses aparelhos servem principalmente para quem baixa músicas. Então podemos pensar em cobrar uma taxa em cada venda que serviria para os direitos autorais dos artistas e gravadoras", afirma. De acordo com ele, as duas medidas necessitam de regulamentação específica, mas não devem onerar a venda dos produtos de forma significativa.
Para a Maria Cristina Barbato, da Ordem dos Músicos do Brasil (OMB), a proposta é positiva. "É fato que o músico não pode mais perder como ocorre hoje cada vez mais", afirma. A OMB representa, apenas no estado de São Paulo, 50 mil músicos. "Hoje não há controle algum e cada um faz o que quer."
A nova lei de Direitos Autorais está sendo elaborada desde 2007 e, nas próximas semanas, deve entrar em consulta pública antes de ser encaminhado ao Congresso. Havia a expectativa de que o texto fosse apresentado durante o 3º Congresso de Direito de Autor e Interesse Público, que ocorreu esta semana em São Paulo. Mas o governo manteve o suspense. "Estamos com os pontos centrais já bem costurados e devemos divulgá-lo em breve", garante Alves.
No encontro, apenas um item ficou claro a todos. O Estado quer voltar a interferir no processo e vai criar o Instituto Brasileiro de Direito Autoral, espécie de agência reguladora que teria o poder de fiscalizar, por exemplo, o Escritório Central de Arrecadação e Distribuição (Ecad), que distribuiu, em 2008, R$ 270 milhões em direitos autorais.
Esse pode ser um momento importante, então quis deixar registrado.
--
Atenciosamente
--
=========================
Alexandre Andrade
Hipercenter.com
sábado, outubro 31, 2009
Integrando ckeditor com web2py
Using widgets in web2py (integrating CKEditor)
Although web2py comes with an integrated editor, I really like ckeditor and using it for a text field is trivial using widgets!
First, install ckeditor (put the ckeditor inside a js/ckeditor file in your static folder and include it) :
<script type="text/javascript" src="{{=URL(request.application,'static','js/ckeditor/ckeditor.js')}}"></script>
After that, we define a 'body' text field (or whatever name you like):
db.define_table('page',
# more Fields …
Field('body', 'text'))
Then, inside your db.py (or to another file in your models directory) put the widget:
def advanced_editor(field, value):
return TEXTAREA(_id = str(field).replace('.','_'), _name=field.name, _class='text ckeditor', value=value, _cols=80, _rows=10)
and use the widget
db.page.body.widget = advanced_editor
From now, SQLFORM will use ckeditor to show/edit/save data!
FONTE: http://jon.is.emotionull.com/post/227873650/using-widgets-in-web2py-integrating-ckeditor
--
Atenciosamente
--
=========================
Alexandre Andrade
Hipercenter.com
domingo, outubro 25, 2009
Higiene em excesso faz mal à saúde das crianças, diz estudo
Os pesquisadores explicam que isto acontece por que nossa imunidade é construída na infância, a partir de estímulos externos e reações internas do organismo e que, quando esta relação de dependência é afetada de alguma maneira, não produzimos anticorpos suficientes para combater a doença e chegamos a vida adulta com mais chances de desenvolver quadros graves de alergias e baixa resistência.
O resultado é que como o organismo nunca entrou em contato com determinada doença, não sabe como reagir a ela. É como se o nosso cérebro e o nosso corpo não funcionassem diante daquele organismo estranho. Por isso, os médicos aconselham ponderação e bom senso na hora de educar as crianças.
Para eles, passeios no parque, andar descalço na areia e provar novos alimentos são atividades naturais e necessárias aos pequenos, e privá-los pode ser prejudicial no futuro.
http://msn.minhavida.com.br/conteudo/10394-Higiene-em-excesso-faz-mal-a-saude-das-criancas-diz-estudo.htm
-------------------
De qualquer forma, não é nada que quem tenha estudado a história do Brasil não saiba, já que os indíos morreram mais por causa das doenças causadas pelo simples contato com os brancos do que em guerras ou assasinatos.
--
Atenciosamente
--
=========================
Alexandre Andrade
Hipercenter.com
quinta-feira, outubro 08, 2009
O dia em que seremos eternos
Talvez daqui a 20, 50, ou mil anos, chegaremos a um ponto em que teremos tratamento anti-envelhecimento e substituição de órgãos, e talvez até rejuvenescimento, de forma que não teremos mais um limite definido para a vida.
Quando e se isso acontecer, imagino que poderiam acontecer diversas mudanças em nossos paradigmas sociais e individuais.
Embora seja evidente que os custos iniciais dos tratamentos sejam altos, a pressão popular e a alta demanda farão que em um período relativamente curto - falo de um século, em termos de humanidade - eles sejam universalizados.Veja a questão do tratamento da AIDS.
O primeiro deles seria uma valorização da vida, de cada indivíduo. Hoje temos um conceito sobre a vida, e a vida humana, como algo importante, especialmente quando cada um fala de si, mas não valorizamos a vida nas estatísticas.
Pensaremos melhor sobre o valor da vida do outro, de cada número na estatística. Afinal, aquela pessoa, se bem cuidada, poderia ter vivido indefinidamente.
Para mim, um outro conceito que mudaria é a idéia de propriedade. Paradoxalmente, em nossa curta vida, temos a ilusão de que as coisas nos pertencem, como se nós fossemos eternos e elas também.
Com o passar do tempo, haveria uma percepção de que a posse das coisas é transitória: nós não as temos, estamos de posse delas.
Perceberíamos que de fato, não precisamos de muita coisa para sobreviver. A ilusão do acúmulo de riquezas na verdade se fundamenta em duas coisas: a primeira seria uma proteção contra a velhice (instinto de sobrevivência), e a possibilidade de deixar a herança para os filhos (sobrevivência da espécie).
Um terceiro aspecto, o de status social, deixa de ser relevante, quando se tem todo o tempo do mundo para aprender e alterar o padrão de vida.
No aspecto social, haveria uma mudança no padrão econômico significativa: trabalharíamos para viver, e não viveríamos para trabalhar, como nas sociedades capitalistas.
Com a expectativa de vida indefinida, a idéia de aposentadoria parece insensata.
Perceberíamos também que a ilusão de crescimento econômico contínuo, presente no paradigma capitalista, é realmente só um efeito inflacionário: na verdade a economia é de substituição: trocamos uma casa por outra, um móvel por outro, o alimento de ontem pelo de hoje, e a viagem do ano passado pela deste ano. Um brinquedo eletrônico por outro mais atualizado.
No âmbito familiar, haveria uma espetacular valorização da genealogia: afinal seus antepassados e descendentes estarão vivos! Como sociedade, teríamos que pensar melhor no planejamento familiar, pois aí sim, a capacidade do nosso planeta seria limitada. Talvez isso criasse um impulso para a exploração espacial, mas esse de qualquer forma seria um processo mais lento.
Fico imaginando, como seria alterado o papel da religião na sociedade. Afinal, muitas religiões baseiam sua fé na promessa de vida eterna, e quando ela realmente estiver disponível, elas alterariam seu foco de orientações de comportamento com base em uma promessa futura, para algo com reflexos na vida cotidiana.
O trabalho também teria uma mudança significativa. Atualmente, nos identificamos como sendo aquilo que nossa profissão ou atividade é. Dizemos que somos médicos, advogados, pedreiros, agricultores. Talvez muitas pessoas nunca mudem de profissão, mas essa identificação será menor, pois teremos cada vez mais pessoas que passarão por diversas especialidades, apenas pelo prazer de aprender e mudar.
É utópico? Provavelmente. A realidade sempre é mais dura, mas a idéia aqui seria apontar uma direção das mudanças.
--
Atenciosamente
--
=========================
Alexandre Andrade
Hipercenter.com
segunda-feira, setembro 21, 2009
configurando tv digital no linux
--
Atenciosamente
--
=========================
Alexandre Andrade
Hipercenter.com
sexta-feira, agosto 28, 2009
Rede da empresa e 3g juntos
http://www.vivaolinux.com.br/dica/Configurar-rede-da-empresa-e-3G-juntos
--
Atenciosamente
--
=========================
Alexandre Andrade
Hipercenter.com
E-ruby : Programando em Ruby no estilo php
http://rogerioferreira.objectis.net/documentacao/eruby/
--
Atenciosamente
--
=========================
Alexandre Andrade
Hipercenter.com
Cálculo de distância entre cidades
Segue abaixo um script postado em http://www.dicas-l.com.br/dicas-l/20090826.php, que penso que pode ser necessário algum dia:
Como alternativa à dica do Airton, segue abaixo script escrito em Perl que faz a mesma coisa, só que do meu ponto de vista, um pouco mais simples :)
#!/usr/bin/perl -w
use strict;
use DBI;
use LWP::Simple;
die "Uso: distancia.pl < municipio-uf> < municipio-uf>" if(scalar(@ARGV) != 2);
my $origem = $ARGV[0];
my $destino= $ARGV[1];
my $url = "http://maps.google.com/maps?saddr=$origem&daddr=$destino&hl=en&z=1";
my $page = get($url);
my @dados = split(/,distance:"/, $page);
my @dist = split(/ km",/, $dados[1]);
$dist[0] =~ s/,//g;
print "Distancia de $origem a $destino = $dist[0] km\n";
Este script recebe como parâmetro a origem e o destino para o cálculo da distância.
Por exemplo, para calcular a distancia entre Bauru-SP e Brasilia-DF, temos:
~$./distancia.pl Bauru-SP Brasilia-DF
Distancia de Bauru-SP a Brasilia-DF = 933 km
Se o nome da cidade contiver espaços, basta colocá-lo entre aspas:
~$./distancia.pl Bauru-SP "Rio de Janeiro-RJ"
Distancia de Bauru-SP a Rio de Janeiro-RJ = 763 km
Com um pequeno esforço de programação, consegui automatizar a criação de uma tabela de distância entre 55 municípios partindo do script acima, com conexão a banco de dados, etc...
Marcos Roberto Silva=------------------------------------------------------==========
--
Atenciosamente
--
=========================
Alexandre Andrade
Hipercenter.com
terça-feira, agosto 25, 2009
Português vence terceira etapa da Volta de São Paulo
http://www.lancenet.com.br/noticias/09-08-24/604817.stm?ciclismo-portugues-vence-terceira-etapa-da-volta-de-sao-paulo
--
Atenciosamente
--
=========================
Alexandre Andrade
Hipercenter.com
segunda-feira, agosto 24, 2009
off topic - fluxograma para parentes e etc
Baseado em uma tira do site xkcd (http://xkcd.com/627/) , fiz uma versão traduzida.
Clique na imagem para ver o tamanho original
--
Atenciosamente
--
=========================
Alexandre Andrade
Hipercenter.com
Configurando dois sites joomla para acesso único com o JFusion
A instalação é simples, se seguidas algumas regras:
1. os dois sites devem estar em subdiretórios do mesmo site. NÃO FUNCIONA COM SUBDOMINIOS.
EX:
onde <root> é o dominio http://www.meudominio.com/
a)
<root>/
<root>/site2
ou
b)
<root>/site1
<root>/site2
2. Instale o Jfusion SOMENTE NO SITE PRINCIPAL.
3. Configure o Jfusion:
No menu Configuration do Jfusion, configure o plugin "joomla_int"
preencha APENAS os campos do 'Plugin General Details'
4. No plugin manager do JFusion, COPIE o Joomla_ext, colocando o nome de Joomla_site2 (use o nome adequado)
5. Volte à Configuration do Jfusion, e configure o Joomla_site2:
preencha APENAS os campos do 'Plugin General Details'
6. Na lista da Configuration, coloque o joomla_int como Master e o joomla_site2 como slave.
7. No site2, no administrator/ , vá em site > Global Configuration -> System, na caixa "user settings" e altere "allow user registration" para "no"
Se quiser adicionar outro site, repita os passos de 4 a 7.
--
Atenciosamente
--
=========================
Alexandre Andrade
Hipercenter.com
Hector Figueiras vence 2ª etapa da Volta de São Paulo
http://esporte.uol.com.br/ciclismo/ultimas/2009/08/23/ult4360u763.jhtm
--
Atenciosamente
--
=========================
Alexandre Andrade
Hipercenter.com
domingo, agosto 23, 2009
Volta do Estado de São Paulo - Video 2 primeiras etapas
http://www.youtube.com/watch?v=0RfF1_4VdVA
--
Atenciosamente
--
=========================
Alexandre Andrade
Hipercenter.com
Novas Dicas Pro Cycling Manager 2009 - Fugas no plano e na montanha
Na versão 2008, o método mais fácil de ganhar uma etapa era com mini-ataques, de 1 a 2 segundos, nos momentos mais difíceis da prova.
Os mini-ataques permitiam alcançar uma velocidade média boa sem cansar muito o ciclista. Assim, mesmo ciclistas medianos poderiam conseguir excelentes resultados.
Na versão 2009, a melhor forma de fazer uma fuga, é contra atacar.
Vale a velha dica: Faça um ataque curto (E) , espere alguns ciclistas contra-atacarem, assim que iniciarem, pare o ataque, espere eles passarem e com o mouse, clique com o botao direito e escolha o ciclista para contra-atacar.
Mantenha o contra-ataque enquanto os fugitivos estiverem atacando, mudando de alvo do contra-ataque, se necessário.
Você vai notar que os fugitivos se revezam na frente da fuga, também reveze na "cola" deles.
Geralmente os fugitivos param de atacar quando a diferença está entre 40 segundos a 1 minuto.
È o momento de votar para o revesamento normal (D) com nível de esforço em torno de 50, para que vc possa recuperar as barras de energia amarela e vermelha.
Se o seu ciclista é bom de montanha, o que fiz que deu mais certo nas etapas de montanha foi o seguinte:
1. Antes do início da subida, coloque o seu ciclista na frente do pelotão (D), desde que com um nível de esforço razoável (no máximo 55), para não perder energia.
2. Quando a subida iniciar, altere para o cursor de esforço (H), e deixe ele puxar o pelotão, se for o caso.
3. Em algum momento da subida, alguém vai querer atacar, espere ele passar e contra-ataque, usando o mouse.
4. De forma diferente do ataque no plano, a melhor estratégia aqui é parar de contra-atacar logo. Logo que tiver uma pequena distância do pelotão (o mostrador de diferença "quebrar" o grupo da fuga do pelotão), coloque no cursor de esforço(H), alterando o nível com o mouse para 75-85, conforme o caso. Isso permitirá que seu ciclista continue a distanciar do pelotão, sem perder muita energia. Nas subidas, mesmo os contra-ataques consomem muita energia.
5. Após o ataque inicial, gerencie o ciclista apenas com o cursor de esforço, um novo ataque fará a energia do seu ciclista ir embora.
Escolha bem as fugas que for fazer, mesmo descansando bem, na 3ª fuga em diante, o seu ciclista irá perder energia rapidamente, mesmo que as barras amarela e vermelha estejam cheias.
Bem vindo ao mundo (quase) real do PCM 2009.
--
Atenciosamente
--
=========================
Alexandre Andrade
Hipercenter.com
Prologo - Scott vence primeira etapa da Volta de São Paulo
O site oficial da prova (http://www.voltaciclisticadesaopaulo.com.br/voltadoestado/2009/portugues/) só publica os resultados após 72 horas, algo completamente non-sense.
"Tadeu Matsunaga
Na abertura da sexta edição da Volta Ciclística de São Paulo, neste sábado, a equipe Scott/Marcondes César/SJ Campos foi a grande campeã na prova de contra-relógio por equipes, com o tempo de 7min44s831. O evento foi realizado no Complexo Viário Jornalista Roberto Marinho, e teve um percurso de 6 km.
Em segundo lugar ficou a equipe Padaria Real/Céu Azul Alimentos/Cannondalle/Sorocaba, com o tempo de 7min56s404, seguido pelo time Fapi Funvic/Sundown/JKS/Pindamonhangaba, que realizou o percurso em 7min58s42.
Neste domingo, às 7h40, tem início a segunda etapa da competição. O percurso vai até a cidade de São José dos Campos, totalizando 91 km. Apesar de não valer pontos, a classificação final da abertura vale como posição de largada na sequência da competição.
Sidoti e Pagliarini falam sobre a Volta de São Paulo
O ciclista Breno Sidoti (Scott/Marcondes César/SJ Campos) falou com o site prólogo sobre o desempenho da equipe na prova de contra-relógio e sobre suas expectativas para a Volta Ciclística de São Paulo.
"A equipe teve um grande desempenho hoje. Nós viemos fortes e conseguimos baixar o tempo do líder", afirmou.
"Desde o início do ano eu venho em uma crescente, obtendo bons resultados e conquistei a vitória na Volta de Campos. Estou bem fisicamente, foi recente essa vitória. Infelizmente tiraram a nossa prova principal (contra-relógio individual) e da montanha também. Mas estamos preparados para o desafio, temos grandes atletas. Vamos arriscar, será uma prova mais agressiva com certeza".
Sidoti se mostrou insatisfeito com o regulamento da prova, que não oferece pontos as equipes melhor posicionadas na abertura da competição. "Não só eu como nossa equipe discorda dessa regra. Estamos aqui para competir, deveria contar o tempo, bonificação de uma etapa, sair com a camisa de líder.
Recém contratado pela equipe Memorial/Prefeitura de Santos/Giant/Nossa Caixa, Luciano Pagliarini também esteve presente na competição. O atleta falou sobre a atuação do time no contra relógio.
"Foi uma prova muito dura. São 6 km, oito minutos no limite. É uma prova bastante difícil, inclusive pelo horário. Fizemos uma prova relativamente boa".
Pagliarini também ressaltou suas pretensões ao longo da competição. "Meu objetivo é a prova por pontos, a meio-fundo e, em um segundo momento a Madison, sempre em dupla e no velódromo. A prova de estrada será importante na minha preparação – a resistência, o ritmo, os quilômetros percorridos. No entanto, na sequência, minha meta é para pista. Esse tipo de prova é extremamente difícil, mas tenho características que me favorecem", ressaltou o atleta, visando sua participação nas Olímpiadas de 2012.
Em relação ao retorno para o país, Luciano Pagliarini se mostrou confiante. "O objetivo agora é retornar. Depois do que houve com a H2O muitas coisas passam pela cabeça, mas foi o tempo necessário de saber que ainda é momentode continuar e tem muita coisa boa para acontecer. Agradeço o apoio e amizade das pessoas que integram a equipe Memorial. São pessoas sérias que tem grandes objetivos", encerrou."
Fonte:
http://prologo.uol.com.br/scripts/materia/materia_det.asp?idMateria=3147
--
Atenciosamente
--
=========================
Alexandre Andrade
Hipercenter.com
sábado, agosto 22, 2009
Artigo apresentando a Volta de São Paulo
http://360graus.terra.com.br/biking/default.asp?did=29015&action=news
--
Atenciosamente
--
=========================
Alexandre Andrade
Hipercenter.com
Video - Apresentação da Volta de São Paulo
http://video.globo.com/Videos/Player/Noticias/0,,GIM1108713-7823-ATLETAS+DE+SETE+PAISES+PARTICIPAM+DA+VOLTA+CICLISTICA+DE+SP,00.html
Em tempo, no Esporte Espetacular, domingo, haverá uma chamada (ao vivo?) da Volta do Estado de São Paulo.
--
Atenciosamente
--
=========================
Alexandre Andrade
Hipercenter.com
Video - Primeiro dia da Volta de São Paulo
http://video.globo.com/Videos/Player/Noticias/0,,GIM1109336-7823-ESPORTE+NO+SPTV+COMECA+A+VOLTA+CICLISTICA+DE+SAO+PAULO,00.html
A SCOTT ganhou o contra relógio individual.
--
Atenciosamente
--
=========================
Alexandre Andrade
Hipercenter.com
Devagar e sempre - Rubens Barrichelo é o único brasileiro na F1 domingo
--
Atenciosamente
--
=========================
Alexandre Andrade
Hipercenter.com
Antivirus bom e gratuito
Entretanto, há dois ou três meses, descobri um software gratuito que contempla as três soluções.
Trata-se do Rising Free Antivirus.
Tenho usado, e não tenho saudades do Avira, AVG, Avast, Panda e outros que testei.
Nota 10 em 10.
--
Atenciosamente
--
=========================
Alexandre Andrade
Hipercenter.com
Utilidade Pública - 2 via de Certidões de casamento, nascimento e óbito poderão ser solicitadas de qualquer lugar do país.
Segundo a revista INFO,
http://info.abril.com.br/noticias/ti/certidoes-serao-padronizadas-em-todo-o-pais-22082009-9.shl
"As certidões de nascimento, casamento e óbito terão o mesmo modelo a partir do dia 1º de janeiro de 2010.
O modelo será impresso pela Casa da Moeda. Nele, haverá uma matrícula para cada cidadão que informará o número da Declaração de Nascido Vivo (DNV), do cartório de registro, além do livro e da folha. Além disso, o documento contará com um espaço para o oficial do cartório anotar dados importantes sobre a vida da pessoa: se ela casou, se divorciou, morreu.
A medida só será possível graças ao desenvolvimento do sistema de Cadastro Nacional de Cartórios. Nessa iniciativa, todos os cartórios do país serão conectados em rede para compartilhar a armazenar informações dos cidadãos num único banco de dados.
De acordo com Gilson Dipp, corregedor nacional de Justiça, graças aos algoritmos e à infra-estrutura tecnológica, as novas certidões serão à prova de falsificação. E, por conta da integração, os cidadãos poderão, de qualquer parte do país, solicitar uma segunda via do documento e fazer alterações, quando necessário. Hoje, esses processos somente são possíveis no cartório onde a certidão de nascimento foi registrada.
Quem tem o modelo de certidão antigo não precisará procurar o cartório para obter o novo, já que o velho continuará valendo. Os que, por alguma razão, precisarem da segunda via ou de alguma alteração no documento, receberão o novo modelo a partir de janeiro."
Se realmente ocorrer, será uma iniciativa realmente louvável, pois já vi pessoas terem que viajar para conseguirem uma segunda via.
--
Atenciosamente
--
=========================
Alexandre Andrade
Hipercenter.com
sexta-feira, agosto 21, 2009
Header em PHP para corrigir codificação
--
=========================
Alexandre Andrade
Hipercenter.com
sexta-feira, agosto 14, 2009
O Óleo de Lorenzo
É um drama, a respeito da história de um casal que possui um filho portador de uma síndrome rara, que provoca a degeneração cerebral.
A história se desenvolve em torno da luta para não aceitar a morte como inevitável, e na busca de um tratamento eficaz.
O roteiro é excepcional, e é difícil não se envolver com a história.
--
Atenciosamente
--
=========================
Alexandre Andrade
Hipercenter.com
quinta-feira, julho 30, 2009
Pro Cycling Manager 2009 - Como evoluir no início da temporada
São os estágios.
Os estágios de pré-época, embora não aumentem as características, melhoram a forma, propiciando melhores resultados logo no ínicio da temporada.
Os estágios de montanha, colina, paralelos e contra-relogio, se feitos em seu período máximo (10 dias), aumentam as características do estágio em 3 a 4 pontos. O manual diz que o efeito some em 8 semanas, mas se fizer um rodízio de estágios, um aumento temporário se sobrepõe ao outro.
Exemplo:
1 a 10 fev. 10 dias montanha -> + 3 pts montanha.
15 a 25 fev. 10 dias contra - relogio > + 3 pts contra relogio
1 a 10 de mar. 10 dias colinas > + 3 pts colinas
15 a 25 mar. 10 dias montanha > + 3 pts montanha.
No dia 26 de março, o ciclista terá 6 a 8 pts adicionais de montanha, além dos benefícios das outras características secundárias melhoradas. (resistência, recuperação, etc.)
Ainda não testei no PCM 2009, mas no pcm 2008 se o ciclista ganha provas e obtém bons resultados, acaba que as características não se reduzem muito, e no final do ano a evolução natural dele é muito maior.
Outro item importante para a evolução, é colocar um treinador mítico, de preferência da especialidade mais desejada para o atleta. Quanto melhor o treinador, maior a evolução dos atletas.
Seguindo esses cuidados, um ciclista meu que no inicio do primeiro ano tinha montanha 67, no segundo ano já estava com 77. É claro que podes colocar vários ciclistas para evoluir.
Atenciosamente
--
=========================
Alexandre Andrade
Hipercenter.com
segunda-feira, julho 27, 2009
Dicas para Pro Cycling Manager 2009
Modo Carreira:
1. De forma diferente dos PCM anteriores, neste os patrocinadores secundários se oferecem para patrocinar a equipe e somente durante o mês de janeiro.
Por um lado isso é bom, pois antes, ocorria muitas vezes de passar o ano inteiro sem patrocinadores secundários, especialmente se começava com uma equipe "pequena".
A dica é: no começo, sempre clique em "Esperar" para ver os valores mais altos. Acompanhe dia a dia em janeiro as ofertas dos patrocinadores.
Geralmente os melhores valores começam a aparecer após o dia 10.
E procure aceitar seu terceiro e último patrocinador até por volta do dia 20, não espere chegar o final do mês, senão corre o risco de pegar ofertas baixas ou ficar sem ofertas.
2. Modo 3D. O PCM 2009 é o melhor em termos de realismo da inteligência artificial. Então, para ganhar, seus ciclistas têm que estar em um nível bem próximo aos melhores da prova, e usar as estratégias certas, como em uma prova de ciclismo real.
Acabou a mamata do PCM 2008 dos ataques curtos.
3. Ataques. Se quiser iniciar um ataque, faça um ataque curto, espere algum ciclista passar, e faça um contra-ataque. você gastará muito menos energia.
Nas metas de sprint durante uma fuga., sempre coloque seu ciclista para acompanhar alguém do grupo, mesmo que o seu ciclista não seja um bom sprinter, para que ele não "sobre" após o sprint.
Sempre coloque um ciclista seu em todas as fugas iniciais. Ele pode ganhar metas de montanha (e a camisa de montanha), que ajudam na moral com os patrocinadores, mesmo que você não vença a corrida. Geralmente o segundo ou terceiro melhor ciclista da sua equipe. Se o nível dos seus ciclistas abaixo das outras equipes, e seu melhor ciclista não for um dos favoritos, pode ser uma boa opção colocar seu melhor ciclista na fuga.
--
=========================
Alexandre Andrade
Hipercenter.com
domingo, julho 19, 2009
Desinstalar Linux Guest Additions Virtual Box
sudo find /etc -name "*vboxadd*" -exec rm {} \;
sudo find /etc -name "*vboxvfs*" -exec rm {} \;
sudo rm -r /usr/src/vboxadd-*
sudo rm -r /usr/src/vboxvfs-*
sudo rm /usr/sbin/vboxadd-timesync
sudo rm /lib/modules/`uname -r`/misc/vboxadd.ko
sudo rm /lib/modules/`uname -r`/misc/vboxvfs.ko
--
Atenciosamente
--
=========================
Alexandre Andrade
Hipercenter.com
sexta-feira, julho 17, 2009
Subsituto do Last fm 2
http://sonora.terra.com.br/
A diferença em relação aos outros é especialmente a variedade de música brasileira.
--
Atenciosamente
--
=========================
Alexandre Andrade
Hipercenter.com
Economia - Bons resultados se devem ao aumento do salário e políticas para baixa renda
Hoje encontrei uma matéria em que um professor de economia afirma exatamente isso:
Pettersen explica que as causas para esse crescimento estão no mercado interno. Primeiro por causa do aumento do salário e das políticas públicas voltadas para a população de baixa renda. Segundo, pelo fato de a economia brasileira ser diversificada.
http://www.otempo.com.br/otempo/noticias/?IdNoticia=116208
Ao contrário do que nossa elite sempre afirmou, o que funciona não é "deixar crescer o bolo para depois repartir", mas "distribua que cresce".
Curiosamente, Jesus fez algo semelhante no milagre da "multiplicação dos pães e peixes".
A explicação é extremamente simples: se você pega 100 reais e dá ao rico, ele coloca no banco ou mesmo envia para o exterior, já que ele tem tudo o que precisa.
Se você dá 100 reais ao pobre, no dia seguinte os 100 reais estão circulando na economia, porque ele tem tantas necessidades a satisfazer que nem tem como pensar em economizar.
Sejam esses 100 reais de aumento no salário mínimo (obrigando os ricos a distribuir um pouco mais a renda) ou de bolsa família(o governo gastando diretamente com quem precisa,), o certo é
que a políca de Lula gera um enorme incentivo à economia.
--
Atenciosamente
--
=========================
Alexandre Andrade
Hipercenter.com
quarta-feira, julho 15, 2009
Pro Cycling Manager 2009 em português e patch novo
Verifiquei que muitos vieram a este blog procurando pelo Pro Cycling Manager 2009 em português.
Para quem não sabe, a versão internacional do jogo (exceto alemanha e japão) é multi-linguagem, isto é, vêm em inglês, francês, português, espanhol e italiano.
Não sei se a versão anunciada em diversos sites "para download alternativo" é a versão internacional ou não, ou mesmo se tem um crack ou não, já que não cheguei a baixá-la, uma vez que sempre compro o jogo no site oficial.
A Cyanide, produtora do game Pro Cycling Manager, lançou recentemente um terceiro patch (1.0.3.3) , que embora diga que é final, gerou dúvidas na comunidade européia, uma vez que a página de discussão "beta" no forum do jogo foi reaberta.
Como os sites de "download alternativo" anunciaram o jogo antes do terceiro patch, não sei se funcionará com ele. Isso já aconteceu em 2007, quando o crack foi desenvolvido para o segundo patch e houve um terceiro patch.(Lembrando que comprei todas as edições, a partir de 2005).
Outro interesse comum dos visitantes do blog após o lançamento do artigo sobre o jogo, foi sobre um tutorial do jogo, já que o manual oficial está em inglês.
Por isso, devo soltar nos próximos dias algumas dicas para a versão 2009, enquanto elaboro um tutorial mais completo.
--
Atenciosamente
--
=========================
Alexandre Andrade
Hipercenter.com
Tour de France Etapa 11
Mas ao contrário do ano passado, está com disposição de continuar até o final e lutar pela camisa verde, e para quem viu a facilidade das vitórias em relação aos outros sprinters, a aposta é que vencerá outras etapas.
Segue o link para a chegada desta etapa 11:
http://www.sporza.be/cm/sporza/videozone/MG_Tour/MG_Tourtips/1.564102
Para quem viu na ESPN, deu para ver quando mostrou a câmera do helicóptero, que o trabalho do lançador foi mais uma vez fundamental.
Embora Thor Hushovd tenha tentado sprintar antes de Cavendish e tenha até chegado a passá-lo, ele teve que se esforçar antes para alcançar o Cavendish.
Na prática, o lançador e Cavendish estavam se distanciando, e Thor teve que sprintar apenas para não ficar para trás.
Foi por isso que ficou em 5º.
Mas a grande discussão na mídia internacional é sem dúvida a fissão na ASTANA, equipe de Alberto Contador e Lance Armstrong.
A mídia americana aposta sem dúvida em Lance, e há relatos que a volta dele aumentou a audiência do Tour na Espanha aos níveis da era Lance. (A audiência vinha reduzido nesses últimos anos).
Eu torço e talvez apostaria uma quantia simbólica, em Alberto Contador.
Porquê? Porque Lance veio com aquela conversa mole de que queria divulgar a causa do câncer, entrou de penetra na ASTANA, na qual Contador seria líder incontestável, e está causando um racha na equipe.
Se o cara queria disputar direto com o Contador, porque não entrou em qualquer outra equipe? Qualquer outra o teria aceito muito bem, também.
Foi uma sacanagem com o Contador.
Tudo bem que o Lance queria ganhar o Tour pela oitava vez,(http://www1.folha.uol.com.br/folha/esporte/ult92u443153.shtml)
mas não precisava achar um modo de boicotar seu principal adversário.
Acho sacanagem do diretor da ASTANA e e do Lance. Contador não tinha muito o que fazer, já que tinha contrato assinado com a equipe. Aí enrolam o cara com aquele papo de vai aceitar ser gregário, sem problemas, mas na hora do "vamu vê" mostra as unhas.
Mas esperem para ver. Alexandre Vinokourov volta do gelo mês que vêm, mostrar quem é o dono da bola, ou seja da equipe, e libera tanto Lance quanto Contador. Lance terá que montar (não será tão difícil conseguir patrocinadores) uma nova equipe.
Acho que no final do jogo, é isso que o Lance quer: montar uma equipe para ele, como fez o Bjarn Riis com a CSC (agora SaxoBank). Afinal, o comportamento dele está jogando fora todo aquele papo sobre a preocupação com o câncer.
Tudo bem que ele voltasse e até ganhasse o Tour, mas jogo sujo para ganhar não!
Certamente esse não é o tipo de exemplo que queremos.
Classificação da etapa:
1. Mark Cavendish (ING/Columbia) 4min17s55
2. Tyler Farrar (EUA/Garmin-Slipstream) mesmo tempo (m.t.)
3. Yauheni Hutarovich (BLR/Française des Jeux) m.t.
4. Óscar Freire (ESP/Rabobank) m.t.
5. Thor Hushovd (NOR/Cervelo) m.t.
6. Leonardo Duque (COL/Cofidis Le Credit en Ligne) m.t.
7. Gerald Ciolek (ALE/Team Milram) m.t.
8. Lloyd Mondory (FRA/AG2R-La Mondiale) m.t.
9. William Bonnet (FRA/BBOX-Bouygues Telecom) m.t.
10. Nikolai Troussov (RUS/Katusha) m.t.
11. Marco Bandiera (ITA/Lampre-NGC) m.t.
12. Serguei Ivanov (RUS/Katusha) m.t.
13. José Joaquin Rojas Gil (ESP/Caisse d'Epargne) m.t.
14. Daniele Bennati (ITA/Liquigas) m.t.
15. Kenny Robert van Hummel (HOL/Skil-Shimano) m.t.
16. Tom Boonen (BEL/Quick Step) m.t.
17. Andreas Klöden (ALE/Astana) m.t.
18. Cyril Lemoine (FRA/Skil-Shimano) m.t.
19. Filippo Pozzato (ITA/Katusha) m.t.
20. Angelo Furlan (ITA/Lampre-NGC) m.t.
Classificação geral individual:
1. Rinaldo Nocentini (ITA/AG2R-La Mondiale) 43h28min59s
2. Alberto Contador (ESP/Astana) a 6s
3. Lance Armstrong (EUA/Astana) a 8s
4. Levi Leipheimer (EUA/Astana) a 39s
5. Bradley Wiggins (ING/Garmin-Slipstream) a 46s
6. Andreas Klöden (ALE/Astana) a 54s
7. Tony Martin (ALE/Columbia) a 1min
8. Christian Vande Velde (EUA/Garmin) a 1min24s
9. Andy Schleck (LUX/Saxo Bank) a 1min49s
10. Vincenzo Nibali (ITA/Liquigas) a 1min54s
11. Luis Leon Sánchez (ESP/Caisse d'Epargne) a 2min16s
12. Maxime Monfort (BEL/Columbia) a 2min21s
13. Fränk Schleck (LUX/Saxo Bank) a 2min25s
14. Roman Kreuziger (RTC/Liquigas) a 2min40s
15. Vladimir Efimkin (RUS/AG2R-La Mondiale) a 2min45s
16. Carlos Sastre (ESP/Cervelo) a 2min52s
17. Mikel Astarloza (ESP/Euskaltel) a 3min02s
18. Cadel Evans (AUS/Silence-Lotto) a 3min07s
19. Kim Kirchen (LUX/Columbia) a 3min16s
20. Vladimir Karpets (RUS/Katusha) a 3min49s
Líder na classificação de montanha: Egoi Martínez (ESP/Euskatel) - 79 pontos
Líder na classificação de regularidade: Mark Cavendish (ING/Columbia) - 176 pontos
Líder na classificação entre equipes: AG2R-La Mondiale - 128h53min09s
Líder na classificação entre revelações: Tony Martin (ALE/Columbia) - 43h29min59s
--
Atenciosamente
--
=========================
Alexandre Andrade
Hipercenter.com
quinta-feira, julho 02, 2009
Pro Cycling Manager 2009
Embora haja outros modos de jogo, o principal e mais divertido é o de carreira.
Escolha uma equipe, seja das TOP 20 (Pro Tour), ou do restante (chamadas na Europa de Continentais, em contraposição às primeiras, que participam das principais provas, de interesse mundial).
Qualquer que seja o nível da equipe que escolha, o manager terá que gerenciar orçamento, equipamento, treinamento, mas principalmente, as corridas, em 3D ou simuladas.
A cada ano, geralmente no final de junho, é lançada uma nova versão, para aproveitar a 'febre' gerada pelo Tour de France, a corrida mais importante do ciclismo mundial, que acontece em julho.
A partir de 2007, se não me engano, todas as corridas do jogo tem a opção de jogar em 3D, já que algumas provas nas edições anteriores só podiam ser simuladas.
Geralmente, a versão oficial tem em torno de 60 diferentes equipes e mais de 180 corridas/etapas jogáveis em 3D.
A cada ano o realismo dentro das provas melhora, mas a melhora é nos detalhes, que somente aficcionados pelo ciclismo são capazes de perceber.
Apesar das pequenas melhorias gráficas, mudanças na jogabilidade dentro das corridas são o mais interessam.
Detalhes como solicitar reabastecimento de água (2008-2009), ao invés de ter de 2 a 4 garrafinhas no início da corrida. (2005-2009), a adição de corridas de velódromo (2008-2009), a duração do comando de 'atacar' dentro da corrida, etc.
Mas o que acho mais interessante no jogo, é aprender as táticas e estratégia das equipes de ciclismo.
Observando as equipes/jogadores gerenciadas pelo computador, a gente acaba aprendendo a avaliar em que ponto da corrida pode ser interessante atacar, a controlar fugas. a preparar um sprint, a observar as diferentes papeis dos ciclistas dentro de uma corrida, como gregários, livres, sprinters e líderes, a escolher os equipamentos, etc.
Para ciclistas que pretendem levar a sério o esporte, talvez se tornar um profissional, é um jogo muito educativo, porque reproduz em detalhes características das corridas de ciclismo.
O site do jogo é http://www.cycling-manager.com/pcm/
Embora o site seja em inglês, todas as versões do jogo apresentam opção do idioma português, que é configurada por padrão na instalação, ou pode ser mudada dentro do jogo.
A versão 2009 custa 39 dólares (versões anteriores já foram mais caras até), mas com o tempo o valor diminui.
A versão 2008 teve seu preço reduzido em janeiro, para $ 19.99.
http://focus.gamesplanet.com/game-Pro-Cycling-Manager-2008.html?affilie=PCM08
Curiosamente, enquanto o PCM 2006 pode ser encontrado a $9, 99,
(http://www.gamersgate.com/DD-PCM2006/pro-cycling-manager-2006)
o PCM 2007 é impossível de ser encontrado para venda (talvez porque seja o único que chegou a ser crackeado),
Talvez a longa vida da versão 2006 se deva aos fãs, que desenvolveram novas bases de dados (informações sobre equipes, ciclistas) atualizadas, e em alguns casos, até verdadeiros mods do jogo, com muito mais corridas.
Um mod para 2007 da versão 2006 chega a ter uma equipe brasileira, a Scott/Marcondes Cesar/S.J dos Campos.
Para aqueles que se interessarem, esse mod fica em http://www.ppdb.nl/forum/viewtopic.php?f=78&t=5933
Minha sugestão, em relação à relação custo benefício, é para aqueles que tem um computador com placa de video mais antiga, escolham o PCM 2006.
A versão 2008 trouxe uma boa melhoria gráfica no jogo, e de certa forma, é mais fácil do que a versão 2006, usando alguns pequenos truques. É uma boa opção para quem tem um PC com uma placa de vídeo melhor mas não quer ou não pode gastar muito.
A grande diferença da versão 2009 em relação às anteriores, para mim, é a possibilidade de criar sua própria equipe, ao invés de apenas escolher uma equipe existente. Isso já era feito nas edições anteriores usando programas externos, mas agora, passa a ser parte do jogo. O jogo trouxe algumas mudanças na interface dentro das corridas, mas a interface fora das corridas é praticamente a mesma desde o PCM 2007. É para quem deseja o supra-sumo.
Obviamente, a cada ano, as equipes, e as características de cada ciclista são atualizadas, mas há diversas databases atualizadas de versões anteriores em fóruns da comundade.
Mas é possível conhecer pelo menos uma parte de cada versão sem desembolsar um centavo: existem demos disponíveis para download:
PCM 2006
http://www.gamershell.com/download_14319.shtml (392MB)
PCM 2007
http://www.gamershell.com/download_20275.shtml (426MB)
PCM 2008
http://www.gamershell.com/download_29572.shtml (756MB)
A versão 2009 ainda não lançou demo, mas há um trailer oficial:
http://www.cycling-manager.com/pcm/index.php?rub=news-info&id=17
De qualquer forma, eu já tinha comprado antes do lançamento (pré-ordem). ;-)
Enquanto a oportunidade de gerenciar uma equipe de ciclismo de verdade não chega, eu vou me divertindo com a versão digital.
--
Atenciosamente
--
=========================
Alexandre Andrade
Hipercenter.com
quarta-feira, julho 01, 2009
Apoena
É uma ferramenta para elaborar Clippings de notícias. Funciona como uma agência de notícias coletando e processando informações de mais de 300 fontes informativas.
Para facilitar àqueles que não tem conhecimento técnico conhecer o apoena,fiz uma instalação de demonstração em
http://apoena.hipercenter.com
com o login e senha padrão
Usuário: debian
senha: gnu
De tempos em tempos terei que fazer uma reinstalação, então não confiem nessa instalação para qualquer propósito pessoal.
Para aqueles que gostarem e desejarem uma instalação em definitivo, posso providenciar hospedagem e o sistema instalado, ou apenas a consultoria para instalação, com valores a combinar.
--
Atenciosamente
--
=========================
Alexandre Andrade
Hipercenter.com
--
Atenciosamente
--
=========================
Alexandre Andrade
Hipercenter.com
terça-feira, maio 26, 2009
Patch PES Soccer 4.0 - Brasileirão, Libertadores, Estádios, Narração para Pro Evolution Socer 2009
- Brasileirão Série A
- Brasileirão Série B
- Taça Libertadores das Americas
- Fifa
- Liga Italiana
- Liga Espanhola
- Liga Inglesa
- Todos uniformes de todos times e seleções no GDB
- Adboards novos
- Scoreboard novo
- Gritos de torcidas SERIE A E B
- Bandeirinha de escanteio
- Bolas novas
- Redes novas
- Chuteiras novas com os menus
- Times Brasileiros atualizados
- Músicas novas
- Novos Estádios
e gerei um torrent.
Baixe ele aqui: http://www.hipercenter.com/downloads/Patch4PES2009Brasileirao.torrent
É minha tentativa de ajudar na distribuição do excelente trabalho do pessoal.
--
Atenciosamente
--
=========================
Alexandre Andrade
Hipercenter.com
domingo, maio 10, 2009
Ubuntu perfeito
Então, deixo de lado as explicações e deixo o link:
http://hamacker.wordpress.com/script-ubuntu-perfeito/
--
Atenciosamente
--
=========================
Alexandre Andrade
Hipercenter.com
quinta-feira, abril 30, 2009
substituto do last.fm
--
Atenciosamente
--
=========================
Alexandre Andrade
Hipercenter.com
domingo, abril 12, 2009
dicas de seo
http://pcworld.uol.com.br/dicas/2009/04/07/conheca-tecnicas-para-aumentar-a-relevancia-de-seu-site-nas-buscas/
--
Atenciosamente
--
=========================
Alexandre Andrade
Hipercenter.com
segunda-feira, abril 06, 2009
Livros de TI gratuitos online
A partir de uma dica do Viva o Linux
(http://www.vivaolinux.com.br/dica/Livros-de-TI-online-e-gratuitos)
há links para dois sites de livros de TI gratuitos
http://freecomputerbooks.com/
http://www.onlinecomputerbooks.com/
--
Atenciosamente
--
=========================
Alexandre Andrade
Hipercenter.com