quinta-feira, 30 de maio de 2013

Pegar o número de CPUs (CORES) usando python

Eu estava testando alguns algorítimos para funcionar de forma a usar os vários núcleos das máquinas atuais (Core i7 - 8 núcleos), porem esse número pode varia para mais ou para menos dependendo da máquina. Quando só importa a sua máquina para processar o algorítimo, você acaba colocando o numero de threads simultâneas manualmente... porem quando você quer extrair o máximo da maquina, independente de qual ela seja, você deve encontrar de forma automática o número de cores para determinar o melhor número de threads a ser usada simultaneamente.

Porem no Python isso pode variar um pouco, aqui eu juntei vários casos de como determinar o número de cores (CPUs) em vários ambientes diferentes: (Windows, Linux, FreeBSD, Jython e outros)

Cada uma das funções abaixo serve tem uma forma diferente de determinar o número de CPUs, é só escolher a que mais se adéqua ao seu ambiente.

def get_cores_python():
    u"\nRetorna o número de cpu usnado python 2.6+\n"
    import multiprocessing
    return multiprocessing.cpu_count()

#-----------

def get_cores_posix():
    u"\nRetorna o número de cpu usnado POSIX(Interface Portável entre Sistemas Operacionais)\n"
    import os
    res = int(os.sysconf('SC_NPROCESSORS_ONLN'))
    if res > 0:
       return res
    return None

#-----------

def get_cores_psutil():
    u"""
Retorna o número de cpu usnado google psutil
http://code.google.com/p/psutil/
"""
    import psutil
    return psutil.NUM_CPUS

#-----------

def get_cores_windows():
    u"\nRetorna o número de cores(CPUs) em máquinas Windows\n"
    import os
    res = int(os.environ['NUMBER_OF_PROCESSORS'])
    if res > 0:
        return res
    return None

#-----------

def get_cores_jython():
    u"\nRetorna o númeo cores(CPUs) usando interpretador jython\n"
    from java.lang import Runtime
    runtime = Runtime.getRuntime()
    res = runtime.availableProcessors()
    if res > 0:
        return res
    return None

#-----------

def get_cores_bsd():
    u"\nRetorna o número de cores(CPUs) usando o processo externo em máquinas com sistema BSD (FreeBSD, openBSD e outras)\n"
    import subprocess
    sysctl = subprocess.Popen(['sysctl', '-n', 'hw.ncpu'], stdout=subprocess.PIPE)
    scStdout = sysctl.communicate()[0]
    res = int(scStdout)
    if res > 0:
       return res
    return None

#-----------

def get_cores_linux():
    u"\nRetorna o número de cores(CPUs) atraves da leitura do /proc/cpuinfo contando as chamadas de cada núcleo\n"
    res = open('/proc/cpuinfo').read().count('processor\t:')
    if res > 0:
       return res
    return None

#-----------

def get_cores_solaris():
    u"\nRetorna o número de cores(CPUs) atravez da leitura do /devices/pseudo/ contanto um a um\n"
    pseudoDevices = os.listdir('/devices/pseudo/')
    expr = re.compile('^cpuid@[0-9]+$')
    res = 0
    for pd in pseudoDevices:
        if expr.match(pd) != None:
            res += 1
    if res > 0:
       return res

#-----------

def get_cores_unixlike():
    u"""
Returna o número de cores(CPUs) analisando o arquivo de log dmesg.
Esse processo pode varias muito entre versões do sistema operacial, então esse codigo pode necessitar de ajustes.
O quê importa é a idéia do algorítimo. -- Está validado usando ubuntu 13.04 --
"""
    dmesg = open('/var/log/dmesg').read() # O local varia com a distribuição
    dmesgProcess = subprocess.Popen(['dmesg'], stdout=subprocess.PIPE)
    dmesg = dmesgProcess.communicate()[0]
    res = 0
    while ' CPU' + str(res) + ': ' in dmesg: # faz o loog enquando ' CPU: ' existir no arquivo de log
        res += 1
    if res > 0:
        return res
    return None

quarta-feira, 13 de abril de 2011

Django + SQL Server no LINUX



13/04/2010

Recente mente eu tive uns probleminhas ao tentar usar em um projeto o Django com o Microsoft SQL Server 2008, sendo que o Django está em uma maquina Linux.

O primeiro problema foi como acessar, pois o Django não tem suporte nativo ao SQL Server.
Encontrei alguns módulos de terceiros que fazia o serviço, só que se o Django estivesse no windows.
Ex: django-mssql só funciona no Windows, usa uma outro modulo que não tem similar para Linux.

Minha saida foi usar o pymssql, que se demonstrou ser muito eficiente.
Depois de ter aberto o SQL Server para TCP na porta 1433, consegui lo
gar com o pymssql facilmente, mas ainda tive uns obstáculos a superar.

A minha ferramenta era para migração de dados, tirar o SQL Server e
colocar no MySQL.
primeiro problema foi a codificação. O Django usa o UTF8 e o SQL Server usa o "CP1252" (demorou para saber). Conversor do array:

def rowdecode(row):
row2=[]
for item in row:
if type(item)==str:
txt = unicode(item, 'cp1252')
row2.append( txt )
else:
row2.append( item )
return row2

O outro problema é que os nomes das colunas no SQL Server estavam bem "espirados" tinha colunas com mais de 30 caracteres no nome. A solução estava a query de solicitação:

SELECT [nome_muito_muito_longo_como_esse] AS nome_curto form FROM [base].[dbo].[bdo_tabela]

e o terceiro problema é que campos nvarchar do SQL Server pode ser maior que o varchar do MySQL

sendo assim usei o CAST para corrigir o tamanho .

Por último, na minha importação tinha mais de 5 milhões de entradas (era uma tabela com logs importantes da aplicação) o Django começou a consumir cada vez mais memória, até a maquina ficar lenta e eu tive de interromper a operação.
Foi pesquisar o que estava ocorrendo quando descobri que o Django manter um histório em memória das query enviadas ao banco.
A solução foi ficar esvaziando esse histórico, dai o espaço em memória ficou baixo e estável durante a toda a importação.

def salva(row):
from django.db import connection
dado = LogHistorico(.......................)
dado.save()
connection.queries.pop()

Quase nada de para superar, como a ajuda pela internet foi escassa resolvi portar no meu blog.
Espero que ajude a mais alguem.

quarta-feira, 3 de novembro de 2010

Como fazer os HASH do shadow usando python




As senhas no linux ficam em um arquivo "/etc/shadonw" só que elas são mascaradas por uma função de hash, ex:

bispo:$6$7rmDOxic$53xiWN/VjGLnSLE25EfSPWixgCKr5GwXoO5HOrhZMpvNL3JiSvOmtYu3cTdcRof9p9rpCw5G3/LXE1aRoubS9/:14916:0:99999:7:::

para gerar um hash desse ou mesmo checar se a senha é válida podemos usar um modulo em python chamado crypt

o crypt tem dois valores a serem entrados: senha em texto puro e o passo
>>> import crypt
>>> crypt.crypt(senha,passo)


Minha senha é fedora_linux, como podemos chegar ao valor do hash "$6$7rmDOx...aRoubS9/" para validar esse senha:

O passo do shadow é a parte inicial do hash $6$7rmDOxic$ (12 primeiros caracteristicas).

para gerar o hast é só colocar

>>> crypt.crypt('fedora_linux','$6$7rmDOxic$')
'$6$7rmDOxic$53xiWN/VjGLnSLE25EfSPWixgCKr5GwXoO5HOrhZMpvNL3JiSvOmtYu3cTdcRof9p9rpCw5G3/LXE1aRoubS9/'


pronto, temos o hash completo gerado, com isso já podemos fazer o teste de validação da senha

para criar uma senha nova o procedimento é:
1) Gerar um passo novo, ex: $6$9aaz9XCD$
2) Escolhe uma nova senha, ex: nova_senha
>>> crypt.crypt('nova_senha','$6$9aaz9XCD$')
'$6$9aaz9XCD$Se77F6VrRJAGHZx6pIatONUYiSg7j4phpUDG8VFcgVyLn9eDPnTajBKgn1XSfS/5huIquHiZrcXwONsMlYIMP.'


Se sobrescrever o hash antigo por esse novo, a senha do usário estará trocada para "nova_senha".

Fica ai essa dica para quem quiser fazer um aplicativo mais integrado ao linux e usando o banco de senhas do linux para fazer o login da aplicação.

Cartão de Credito LINUX


Parece até brincadeira, mas é verdade.

Como uma forma arecadar fundos, a LINUX FOUNDATION está lançando o cartão de crédito LINUX.

Na primeira compra usando esse cartão a LINUX FUNDATION receberá $50,00 doado pelo banco UMB.

fonte: http://info.abril.com.br/noticias/ti/fundacao-linux-lanca-cartao-de-credito-02112010-2.shl

terça-feira, 26 de outubro de 2010

Como remover backgound de forma profissional

Esse vídeo tutorial do GIMP mostra como remover o fundo da imagem, de forma profissional. tem um Excelente resultado final.

O Audio está em inglês.

segunda-feira, 25 de outubro de 2010

Linux vs Windows - ponto para linux!

Bolsa de Londres agora com linux!

Ela afirma que com a mudança, está oferecendo em rede mundial uma velocidade recorde na negociação (126 microsegundos por transacao)
Essa velocidade veio na substituição do Microsoft. Net por Linux. Ficando com a velocidade duas vezes mais rapida que seus concorrentes (BATS Europa e Chi-X)

fonte: www.computerworlduk.com

sábado, 16 de outubro de 2010

Adaptação do Linux para FreeBSD

Vou abordar algumas alterações entre o linux e o FreeBSD,



1) Umas das principais shell do linux é o BASH, no FreeBSD a shell padrão é o tcsh.
Tirando o nome na utilização diferem muito pouco, o arquivo de inicialização para trocar as
configurações iniciais é ~/.cshrc

2) Instalação de Pacotes:
No linux cada distribuição tem o seu:
apt-get (no Ubuntu)
yum (no Fedora)
No freebsd existem 2 instaladores
pkg_add (download da aplicação compilada)
ports (download da codigo fonte para compilação)
Instalação mais simples é pelo pkg_add:
# pkg_add -r nano
Ele vai no repositório e intala o nano, seria o simiplar ao 'apt-get install nano'
Com o ports:
# cd /usr/ports/www/apache22
# make install clean
Ele vai baixar os fontes do apache e dos arquivos necessários, dai vai iniciar a compilação deles. Demora bastante tempo para compilar. Alguns programas ao compilar fica melhor otimizado ao hardware.

3) Inicialização do sistema:
os run-levels fica no mesmo lugar /etc/inittab
os scripts de inicialização dos serviços ficam na pasta /etc/rc.d/ assim como em alguns linux (slackware)
só que a maioria dos servições no freebsd são instalados usando prefix /usr/local, sendo assim olhe tambem a parta /usr/local/etc/rc.d/
No freebsd os serviços tem que ser habilitados no /etc/rc.conf ou a execulsão será bloqueada
# echo "sshd_enable=\"YES\" >> /etc/rc.conf
Isso tem dois efeitos: 1o. que o script '/etc/rc.d/sshd start' vai está desbloqueado e 2o. que no boot o sshd vai ser inicilizado.

4) Rede:
o ifconfig tem a mesma função, só mudando as posições de algumas informações.
no linux as interfaces de rede são nomeadas em sequencia eth0, eth1, eth2
no freebsd o nome das interfaces tem haver com o modulo que está execultando ela:
placas intel são em0, em1.... as realteck são rl0, rl1... lo é a loopback
O que eu acho mais significativo é que no freebsd tem o status active/noactive se tá ou não com o cabo plugado.
para configurar a rede no boot do freebsd é só acresentar no /etc/rc.conf as linhas
echo "hostname=\"nomemaquina.dominio.com\"" >> /etc/rc.conf
echo "ifconfig_em0=\"inet 10.10.10.100 netmask 255.255.255.0\"" >> /etc/rc.conf
echo "defaultrouter=\"10.10.10.1\"" >> /etc/rc.conf
ou em dhcp:
echo "ifconfig_em0=\"DHCP\"" >> /etc/rc.conf

as propriedades tipo /proc/sys/net/ipv4/ip_forward no linux, pode ser acessada no freebsd usando
# sysctl net.inet.ip.forwarding

5) Firewall:
No linux o firewall atualmente é o iptables, no freebsd o firewall é ipfw ou pfctl
Uma regra para liberar o SSH
# ipfw add allow tcp form any to me 22 in via $ext_if
Sabendo inglês é muito mais simples entender o ipfw que a regra de iptables

6) Lista de hadware:
no linux temos o lspci, no freebsd é o pciconf -l

7) System Managment:
linux:...................FreeBSD:
lsmod ................ kldstat
modprobe ........ kldload / kldunload
strace ............. truss