Mostrando las entradas con la etiqueta python. Mostrar todas las entradas
Mostrando las entradas con la etiqueta python. Mostrar todas las entradas

jueves, septiembre 29, 2011

Jugando con Python y Oracle Express 10 en Ubuntu / Debian


Machete útil para el curso de Python que voy a dar en Belatrix

Instalando Oracle Express 10 en Ubuntu / Debian
  • Agregar en /etc/apt/sources.list

deb http://oss.oracle.com/debian unstable main non-free
  • Importar las llaves

wget http://oss.oracle.com/el4/RPM-GPG-KEY-oracle -O- | sudo apt-key add -
  • Actualizar repos

sudo apt-get update
  • Instalar

sudo aptitude install oracle-xe-client oracle-xe-universal 
  • Configurar

sudo /etc/init.d/oracle-xe configure
  • Setear algunos paths al fnal de los archivos ~/.bash y en ~/.profile tanto del usuario con poder de sudo que realizó la instalación, como del usuario oracle (sudo su - oracle), como del root (necesario para compilar algunas cosas). Recordar que luego de cambiar estos archivos, se debe loguear nuevamente, e incluso reiniciar las X, para que las variables de entorno queden correctamente seteadas. Si no sabe de lo que estoy hablando, reincie la compu.
Entonces, al final de ~/.profile



if [ -n "$BASH_VERSION" ]; then
    # include .bashrc if it exists
    if [ -f "$HOME/.bashrc" ]; then
. "$HOME/.bashrc"
    fi
fi

# set PATH so it includes user's private bin if it exists
if [ -d "$HOME/bin" ] ; then
    PATH="$HOME/bin:$PATH"
fi

Al final del ~/.bashrc

ORACLE_HOME=/usr/lib/oracle/xe/app/oracle/product/10.2.0/server
PATH=$PATH:$ORACLE_HOME/bin
export ORACLE_HOME
export ORACLE_SID=XE
export PATH

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$ORACLE_HOME/lib

  • Reinicie X, sesiones, o la maquina. 
  • Pruebe que se puede loguear como sysdba
sudo su - oracle
sqplus / as sysdba

  • Acceda a la interface web entrando a http://127.0.0.1:8080/apex como sys (o sysdba) + el password escrito durante el sudo /etc/init.d/oracle-xe configure
  • Entre a Administration > Manage Database Users > Users
  • En Account Status cambie el status de HR a unlocked y cambie la contraseña. Esto, porque la contraseña podría estar outdated. Enseguida vamos a necesitar esa contraseña. En mi caso, le he puesto "hr".
  • Nuevamente dentro del sqlplus lance algunos comandos, solo para conocer el nivel de acceso.
alter session set current_schema=HR
select * from all_users ;
select * from all_tables where owner = 'HR';


Para jugar con python, y corrigiendo apenas lo que encontré en http://agiletesting.blogspot.com/2005/05/installing-and-using-cxoracle-on-unix.html
  • Baje la ultima versión de cx_Oracle-x.x.tar.gz desde aqui.
  • Copie en /root los .bashrc y .profile anteriores, para que root tenga acceso a varias variables de entorno y rutas necesarias para compilar
  • Instale el paquete gcc
  • Conviértase en root sin olvidar el - mediante:
sudo su - root
  • Descomprima cx_Oracle-X.x.tar.gz y ejecute denro de la subcarpeta 
python setup.py install
  • Aqui va un ejemplo de conexión, con la contraseña "hr" del usuario HR. Idealmente, no copie el código desde aquí. Este lenguaje es muy sensible a los espacios, en su lugar hágalo desde aquí: http://pastebin.com/GqZBS38C

import cx_Oracle                                  
from pprint import pprint

connection = cx_Oracle.Connection("HR", "hr")
cursor = cx_Oracle.Cursor(connection)

#Ejemplo trayendo desde una tabla de sistema
sql = "SELECT TABLE_NAME FROM ALL_TABLES"
cursor.execute(sql)
data = cursor.fetchall()
print "TABLE_NAME"
pprint(cursor.description)
pprint(data)
cursor.close()
connection.close()


martes, noviembre 03, 2009

sex.py, o como validar direcciones de correo



Necesitaba limpiar una carpeta llena de archivos .txt, una Maildir en realidad, repletos de encabezados de rebotes y explicaciones de los majordomos y mailer-daemons. Es decir, recorrer esta marabunta de archivos, y volcar las direcciones de correo que allí figuraran.

Y me encontré con un tremendo programa, sex.py - este programa ya no puede encontrarse en el sitio de los desarrolladores, de modo que subi una copia aqui:

http://www.bunker.org.ar/incubadora.varios/Tools/sex.py

Actualización: Antes de ejecutarlo, suministrarle unas librerías necesaria:

sudo apt-get install python-dnspython python-ldns  python-adns python-dns

Ejemplo:

python sex.py -sr Maildir/ base.txt

Este script es prácticamente una aspiradora de direcciones de correos, y puede ser apuntado hacia cualquier cosa, una url, un archivo, una carpeta, comparando con servidores dns por direcciones de correo validas, ordenando, quitando duplicados, volcando resultados a otro archivo, de todo.

Ejemplo para chequear si son direcciones validas desde el punto de vista del DNS:

sex.py -y  base.txt | tee comparados.csv

Paciencia... este paso demora mucho. Y cuando termina veremos muchos codigos de error de todo tipo. Cuentas saturadas, inexistentes, mail server que evitan la conexion, filtros antispam celosos, etc.

Ocasionalmente aparecen algunos con codigo 250, que no son error pero que aparecen aquí.

De modo que evito estos "250" con

grep -v '250' comparados.csv > comparados2.csv

Ahora conviene abrir el comparados2.csv con openoffice, y quedarse con la columna A. Luego, esa columna puede pegarse en gedit para evitar durante la comparación que viene a continuación, problemas con codificaciones. El archivo mas limpio que obtenemos con gedit podriamos llamarlo, por ejemplo, sucios.txt

Tenemos ahora un archivo con direcciones que no sirven. Si quiero compararlos con mi archivo original, gigantesco de correos, y crear un nuevo archivo de direcciones validas:

for i in `cat base.txt`; do echo $i|grep -v -f sucios.txt; done > limpitos.new

Ojo que este for puede demorarse bastante. Chequear en otra terminal mediante un

tail -f limpitos.new

Listo, ahora me aseguro de no sobre exigir el smtp con rebotes innecesarios (que siempre son la mayoría). Además, es de unos amigos, y no quiero abusarme.

Otra alternativa a este bucle, a veces incompatible con algunos shells, son las siguientes líneas que disfruté programando en ruby.

i = 0
File.open('base.txt', 'r') do |f1|
  while linea = f1.gets
    File.open('sucios.txt', 'r') do |f2|
      while linea2 = f2.gets
        if linea == linea2
          #puts "mail que existe en rebotados! - se debe ignorar" + linea
          sucio = 1
          break
        else
          sucio = 0
        end
      end #fin while 2
      unless sucio == 1
        puts linea
        i = i + 1
      end
    end #fin segundo file.open
  end #fin primer while
end #fin primer open
puts "Total limpios " + i.to_s
 

Se puede bajar desde http://www.bunker.org.ar/incubadora.varios/Tools/limpiar.rb

Eso es todo. Ahora se puede usar esta salida con algún programa como ssmtp, o para lo que usted quiera. Yo lo uso con mi Regadera. Como dato, de una base de 8000 correos, me quedaron limpios 6634, y sumado a la comprobación de que tienen muy buenas posibilidades de saltar filtros anti spam.

Saludos

domingo, septiembre 21, 2008

Compartir carpeta para LAN/Web, en forma ultra rapida, desde la consola

Este lenguaje nunca deja de sorprenderme, pero compartir la carpeta en curso... ¿con 2 (dos) líneas?

s@obelix:~/Desktop/UTN$ python

>>> import SimpleHTTPServer
>>> SimpleHTTPServer.test()
Serving HTTP on 0.0.0.0 port 8000 ... Ctrl + C to Stop
localhost - - [21/Sep 01:05:18] "GET / HTTP/1.1" 200 -
localhost - - [21/Sep 01:05:18] "GET / HTTP/1.1" 200 -
localhost - - [21/Sep 01:07:44] "GET /Informatica_afectiva.pdf.txt HTTP/1.1" 200 -


(Via shell-fu)

jueves, junio 12, 2008

Acceso a MSSQL desde Python / PHP


Sistemas operativos: Linux y Windows

Notas y posible apunte de alumnos

Comic: http://the-geek.org/xkcd-es/strips/python/



Comprobado en MSSQL 2000 Enterprise en ingles, con SP2 (en inglés también). La versión en español presentaba problemas aleatorios de acceso al puerto 1433, y no traía la simpática base Northwind.

Notas importantes

Importación de base anterior, en MySQL:
  • http://www.microsoft.com/technet/prodtechnol/sql/2000/deploy/mysql.mspx

Codificación

El primer cabezazo serio trabajando con Python/PHP y contra MSSQL, sobre Windows / Linux / BSD, seguramente serán las codificaciones. En términos generales:

(Fixme):
  • Las ventanas trabajan en UTF-8
  • Las consolas Linux (actuales), en UTF-8
  • Las consolas BSD, en ISO8859
  • MSDOS, en ASCII
  • Las bases de datos, en ISOnnnnn o tambien, latin1

He dejado varios vínculos útiles en http://del.icio.us/karancho/utf-8

#Ejemplo con datos de MSSQL, base Northwind
print unicode(oRS.Fields.Item("ShipAddress"))

#Ejemplo decodeando un valor dentro de un array, procedente de MySQL, via ADODB, en
#latin1 (ISO8859-15, creo), y repleto de acentos y caracteres raros
print arreglo['curso'].decode('latin1')

#Ejemplo para cargar un wx.grid, en una posición determinada
nombre = arr['nombre'].decode('latin1')
grid.SetCellValue(i, 2, nombre)

Mapa

MSSQL Desde Linux
Dentro de Windows
Python
Ejemplo 2
Ejemplo 3
PHP
Ejemplo 1
Idem Ejemplo 1



Ejemplo 1: Cliente: Linux
+ PHP
-> Destino: Windows con MSSQL


  • Paquetes necesarios en Ubuntu: php5-adodb y php5-sybase
  • En Windows, con los componentes ADODB que trae XAMPP es suficiente.
  • ¡No copiar código desde aquí!, hacerlo desde http://pastebin.lugmen.org.ar/4164


<?php
print "
<HEAD>
<!-- <meta http-equiv='Content-Type' content='text/html; charset=utf-8'/> -->

<!-- Codificaciones debido a los acentos procedentes de SQL Server -->
<meta http-equiv='Content-Type' content='text/html; charset=windows-1252'/>
<!-- <meta http-equiv='Content-Type' content='text/html; charset=iso-8859-1'/> -->

</HEAD>
";


$resource=mssql_connect("192.168.1.151","sa","coso");
mssql_select_db("Northwind",$resource);

$sql="SELECT * FROM Orders";

$respuesta=mssql_query($sql,$resource);

while ($fila = mssql_fetch_object($respuesta) ) echo "<p>".$fila->ShipCity;

?>


Ejemplo 2: Cliente: Linux + Python-> Destino: Windows con MSSQL


Ejemplo y configuración:

  • http://pymssql.sourceforge.net/example_pymssql.html

Editores: SPE, Geany, Gvim

Ejemplo de Código

import pymssql

con = pymssql.connect(host='192.168.1.151',user='sa',
password='coso',database='Northwind')

cur = con.cursor()

query="select * from Orders;"
for x in range(10):
cur.execute(query)

while 1:
print "n"
print cur.fetchall()
if 0 == cur.nextset():
break


Ejemplo 3: Computadora corriendo Windows + Python + MSSQL
(con ADO)



  • Python for Windows Extensions: http://starship.python.net/crew/mhammond/
  • Aunque yo usé: http://sourceforge.net/projects/pywin32/
  • Estas pruebas las he realizado con MSSQL 2000. Con MSSQL 2005, al poderse usar ODBC sobre SQL server, hay una manera mas simple, documentada en http://www.time-travellers.org/shane/howtos/MS-SQL-Express-Python-HOWTO.html
  • Ejemplo y configuración: http://www.mayukhbose.com/python/ado/ado-python.php

Ejemplo de Código

#!/usr/bin/env python
# -*- coding: utf-8 -*-

# First import two useful modules
from win32com.client import Dispatch
from adoconstants import *

# Create the ADO Connection object via COM.
oConn = Dispatch('ADODB.Connection')

# Now set the connection properties via the ConnectionString
# We're connecting to a SQL Server on 192.168.1.100 using OLEDB.
oConn.ConnectionString = "Provider=SQLOLEDB.1;Data Source=OREGANOOREGANO;" + "uid=sa;pwd=coso;database=Northwind"

oConn.Open()

# Now create a RecordSet object and open a table
oRS = Dispatch('ADODB.RecordSet')
oRS.ActiveConnection = oConn # Set the recordset to connect thru oConn
oRS.Open("Orders")

#print oRS.Fields.Item(0), oRS.Fields(1)

while not oRS.EOF:
#El siguiente print requiere de convertir los datos procedentes de SQL, en ISO, hacia unicode
#Se agradece el comentario de :
http://sebsauvage.net/python/snyppets/#unicode
print unicode(oRS.Fields.Item("ShipAddress"))
oRS.MoveNext()


Espero que sirva :)