quarta-feira, janeiro 27, 2010
Scaffolding para Code Igniter
http://blog.relaxos.com.br/php/ci-scaffold-gerador-de-crud-para-code-igniter/
O link para baixar o scaffold é
http://code.google.com/p/ci-scaffold/
--
Atenciosamente
--
=========================
Alexandre Andrade
Hipercenter.com
segunda-feira, janeiro 11, 2010
Modal windows com Jquery
http://dev.iceburg.net/jquery/jqModal/
--
Atenciosamente
--
=========================
Alexandre Andrade
Hipercenter.com
sexta-feira, janeiro 08, 2010
Raspagem de dados
Afinal, de certa forma já usamos, porque qualquer buscador da web (leia-se google, bing, yahoo) utiliza-se deste recurso.
http://imasters.uol.com.br/artigo/15447/bancodedados/raspagem_de_dados/
--
Atenciosamente
--
=========================
Alexandre Andrade
Hipercenter.com
sábado, janeiro 02, 2010
Novo RG: cadastro deve começar em janeiro
Documento terá microchip e dados gravados a laser. Um dos objetivos do governo é evitar falsificações.
O ano de 2010 deve começar com mudanças nos documentos dos brasileiros. O Instituto Nacional de Identificação (INI), órgão ligado à Polícia Federal, espera que nos próximos dias seja publicado o decreto para implementação do novo Registro de Identidade Civil (RIC).
O documento vai reunir os números de todos os documentos de registro dos cidadãos, como CPF, Carteira de Trabalho, Carteira Nacional de Habilitação e Título de Eleitor – além do Registro Geral. Com a publicação do decreto, a expectativa é de que o cadastro para a emissão das novas carteiras de identidade comece em janeiro.
Ao solicitar o RIC, o cidadão passará pelos procedimentos habituais para obter a carteira de identidade, com coleta de digitais, fornecimento de dados pessoais e assinatura. A diferença, segundo a Polícia Federal, é que o processo será totalmente informatizado, garantindo um cadastro nacional biométrico.
O novo cartão terá um sistema complexo de tecnologia que inclui microchip e dados gravados a laser no documento. O objetivo é evitar falsificações e permitir maior agilidade na transmissão de dados sobre uma pessoa em todo o território nacional. Os órgãos regionais deverão receber estações de coleta e transferir os dados para o órgão central em Brasília, que por sua vez emitirá a nova identidade.
Espera-se que a partir do terceiro ano de implementação do projeto 80 mil pessoas possam ser cadastradas por dia, alcançando a meta de 20 milhões de cidadãos por ano. Em nove anos, cerca de 150 milhões de brasileiros devem ter o novo RIC.--
Atenciosamente
--
=========================
Alexandre Andrade
Hipercenter.com
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