lunes, 28 de febrero de 2011

Algunas de Vi: Tabulación, ventanas y pestañas

Tabulación:
Una buena manera para trabajar con tabulaciones en vim es utilizando tabstop, expandtab, softtabstop, shiftwidth; con ello se puede definir si se quiere tener tamaños de tabulación de 8 o 4 columnas; también, se puede intercambiar la tabulación por espacios en blanco.


:set tabstop=4

Esto permite tener una tabulación de 4 columnas.


:set expandtab
:set noexpandtab

Cuando está habilitado cambia las columnas de la tabulación por espacios en blanco.


:set shiftwidth=4

Se habilita la cantidad de columnas a indentar en normal mode (<< >>)


:set softtabstop=4

Define cuantas columnas se insertan en modo insertar; cuando expandtab está habilitado, inserta los espacios en blanco apropiados; cuando expandtab está deshabilitado y tabstop es igual que softtabstop, entonces se utiliza tabs por defecto.

Para que la configuración siempre este disponible, se procede a agregar en el .vimrc:

set tabstop=4 softtabstop=4 shiftwidth=4 expandtab


Control de ventanas
En vim se pueden utilizar varias ventanas al mismo tiempo:

:split test.txt
:sp test.txt

split==sp, sirve para abrir otra ventana horizontalmente.


:vsplit test.txt
:vsp test.txt

vsplit==vsp, sirve para abrir una venta verticalmente


:ctrl-w s

Abre el mismo archivo en una nueva ventana.


:only

Cierra toda las ventanas menos el área de trabajo utilizada en ese instante.


:ctrl-w H|J|K|L

Rota las ventanas izquierda,abajo,arriba,derecha respectivamente.


:ctrl-w +
:ctrl-w -
:ctrl-w =
:ctrl-w _
:ctrl-w |

Permite redimensionar una ventana agrandandola, reduciendola, igualando todas las ventanas, o maximizarla verticarlmente, o maximizarla horizontalmente.



:ctrl-w h|j|k|l

Navega entre las ventanas izquierda,abajo,arriba,derecha respectivamente. Además, se puede mapear estos comandos para simplificarlos en el .vimrc:

map h
map j
map k
map l


Pestañás

:tabedit test.txt
Abre un documento en una nueva pestaña

ctrl-w T
Pone en su propia pestaña la ventana que estaba dividida por vsplit o split.

:tabclose
Para cerrar la pestaña que se está trabajando.

:tabonly
Cierra todas las ventanas menos el área de trabajo que se está ejecutando.


:gt
:gT
:#gt

Sirve para avanzar pestañas, retroceder pestañas, ir a una pestaña específica respectivamente.

:tabmove #
Mueve el tab a la posición indicada '#==[0-9]'.

jueves, 30 de septiembre de 2010

Geek Code


-----BEGIN GEEK CODE BLOCK-----
Version: 3.1 GCM/CS/SS
d- s: a- C++++ L B V* U+++ P+ L+++ E--- W+++ N+ o- K- w+ O M+ V-- PS+++ PE+++ Y++ PGP++ t+ 5 X R- tv+ b+++ DI+ D+ G+ e+ h+ r+++ y+++
------END GEEK CODE BLOCK------

sábado, 17 de julio de 2010

Proyecto de ciencias: Mapa 3D de AS ( Actualizado 16/08/10)


Hace mucho tiempo quería tener un proyecto personal innovador y con objetivos cientificos, asi que me decidí por hacer un mapa 3D de sistemas autonomos de Internet y sacar algunas conclusiones matemáticas de ella si se pudiera.

¿Como lo haremos?
Revisando proyectos como the internet mapping project, DEMIS Project, y un largo etc., ya que documentación existe.

¿En cuanto tiempo?
La primera fase deberia estar lista para el mes de diciembre del 2010 con el modelamiento de la solución, los paquetes, contenedores, y parte del código que busque AS y los actualizará si fuese necesario.

¿Quienes lo conforman?
Es personal y por ahora el egoísmo.

Finalmente, será diseñado bajo una plataforma open-source especificamente python + postgresql + opensuse.. tal vez utilize slackware si fuese necesario montar un servidor, resumiendo todo bajo opensource.


Actualización ----> 16/08/10

Se ha definido el problema, el modelo de casos de uso y el modelo conceptual. Definí el caso de uso mapear por subred y después de mucha documentación acerca de protocolos encontré la mejor manera de hacer el escaneo, al menos logicamente.
Después de joder, joder y seguir jodiendo a varios profesores, encontré muy buenas pautas e ideas para poder realizar el proyecto.

Actualización ----> 18/09/10
El último mes no he avanzado casi nada, ya está definido todo logicamente definido para empezar la codificación. Sin embargo, por falta de conocimientos y desarrollo aún no desarrollo el programa. Tento que avanzar.

domingo, 4 de julio de 2010

Opensuse 11.3 Rc2

Le hice el upgrade a mi sistema luego de que se fuera al cacho por insertar un usb walkman que termino comprimiendo el fuse y corrompiendo mi filesystem a read/only.. no desperdicie tiempo y me instale el OpenSuse 11.3 RC1 con un usb stick y asunto arreglado. Al principio solo reconocia el wireless, pero luego de un zypper up , reconocio todo menos la webcam en mi poderosa gateway t-1616.
Finalmente se salio el release candidate 2 y le hice el upgrade zypper dup funcionando de maravillas. Solo un detalle cuando envien a invernar y lo apagan subitamente el applet del network manager en KDE posiblemente se corrompa, asi que cuando reinicien para volver a obtener red escriban como root:
#dbus-send --system --dest=org.freedesktop.NetworkManager /org/freedesktop/NetworkManager org.freedesktop.NetworkManager.wake

Eso volvera a activar el applet del networkmanager de KDE y asunto arreglado. Les dejo un snapshot de mi desktop.
desktop

miércoles, 13 de enero de 2010

Sockets en Python

Untitled Document.md

Introduccion a los sockets

programar en red con python puede caer en 2 categorias, usar un modulo de
protocolo o programar el protocolo desde cero.
los sockets son una extension del sistema de entrada/salida del sistema
operativo que permite la comunicacion entre procesos y maquinas.
un socket permite usar llamadas del sistema operativo para hablar con otras
maquinas y/o procesos sobre la maquina que los ha llamado.

algunas llamadas al sistema en *nix que funcionan con descriptores de ficheros
incluyen a open(), read(), write(), close(). un descriptor de fichero
tipicamente refiere a un fichero o una entidad de tipo fichero; pueden ser,
directorios, bloques, socket, fifo’s.

python provee una interface de socket del sistema operativo, el modulo socket,
si es que se piensa diseñar el protocolo desde cero.

Creación de un socket

la creación de un socket es diferente de un cliente a un server.

creación de un cliente

primero, se tiene que crear el objeto socket, luego se le tiene que definir la
familia del protocolo (como será transmitida la data), y el tipo desocket
(protocolo usado para transmitir la data).

familias de procolo: socket.AF_UNIX, socket.AF_INET, socket.AF_INET6
Tipo de socket: socket.SOCK_STREAM, socket.SOCK_DGRAM, socket.SOCK_RAW,
socket.SOCK_RDM, socket.SOCK_SEQPACKET

Segundo, hay que conectar el objeto socket al servidor remoto. El método connect()
envia una tupla conteniendo el host remoto | dirección IP y el puerto remoto.

    host = "www.example.com"
    port = 80
    #Creación del objeto socket
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)#Conectandolo hacia un host remoto
    s.connect(host, port)

Creación de un server

La creación de un server es parecido al de un cliente. Primero se tiene que
crear el objeto socket, luego añadir las opciones de socket setsockopt();
además, se tiene que asociar un puerto a una interface de red y ponerlo a
escuchar por conexiones. Finalmente, se aceptan las conexion de los clientes
usando socket.accept() en una iteración infinita hasta que el programa
termine o levante una excepción. Los servers usan la misma interface socket que
los clientes.

    host = ' '
    port = 9876

    #Creacion del objeto 
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

    #Definir las opciones del socket
    s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

    #Asociarlo a un puerto + interface
    s.bind(host, port)

    #Ponerlo a escuchar por conexiones
    s.listen(3)

Comunicando con sockets

Python provee 2 maneras para enviar data a través de la red: objetos de socket,
y objetos tipo fichero usando socket.makefile().

Los objetos de socket se usan cuando hay una necesidad de controlar el tamaño,
los tiempo de espera, u algun otro detalle de la data que esta siendo escrita o leida.

Los objetos de fichero son mejores si se trabaja con protocolos orientados a
conexión ya que pueden manejar el análisis sintáctico de la data recibida que
ha sido garantizada por el protocolo.

Errores en la transmisión pueden ocurrir por varios factores tales como, la
desconexión de un servidor, error de direccionamiento, etc.
Por ello python define 4 posibles excepciones:

  • socket.error para problemas generales de entrada/salida

  • socket.gaierror para error de búsqueda de información de direccionamiento.

  • socket.herror para errores de direccionamiento para funciones que usan h_errno en C.

  • socket.timeout para manejar tiempo de espera después de haber llamado settimeout() sobre un socket.

Los errores con los objetos tipo ficheros en realidad hacen una llamada al
socket del sistema, asi que se aplican los mismos errores que los objetos de
socket. También se debe evitar el bloqueo mutuo entre el emisor y el receptor,
por ello hay que asegurar envio/recibo de data con socket.shutdown() antes de
recibir/enviar nueva data.

Sobre tiempos de espera para detectar y manejar errores es utilizando timeouts,
con esto se puede conseguir que python detecte inactividad en el sistema cuando
hay comunicación entre el cliente y el servidor. Para habilitar timeouts,
llamamos a socket.settimeout() enviando el tiempo limite en segundos, luego
si existe un problema de tiempo de espera se llamará socket.timeout como excepción.

También se pueden realizar transmisiones de un solo sentido usando llamadas a
socket.shutdown(), con esto logramos sockets de una sola via (half open sockets).
Esto es útil si se requiere asegurar que toda la data escrita ha sido
transmitida, o preveer deadlocks en una comunicación. Al finalizar el llamado a
shutdown y asegurar que toda la data ha sido transmitida en esa via, el
socket no podrá ser usado nuevamente.

La llamada a socket.shutdown() requiere un argumento para indicar el modo de
funcionamiento o modo de bloqueo.

  • 0 previene lecturas.

  • 1 previene escrituras.

  • 2 previene lecturas y escrituras.

CODIGO DE EJEMPLO:

El siguiente ejemplo lo he realizado orientado a conexión y sin conexión, en
ambos el servidor recibe como parámetro un fichero del arbol *nix para ser
listado y enviado al cliente; para ejecutar el fichero sera necesario 2 consolas
abiertas o el servidor corriendo en 2do plano.

    #./[script] [fichero]
    #./serverTCP.py
    #./clienteTCP.py /etc/

Clientes con python

  • Cliente TCP

#!/usr/bin/python

#Cliente objeto socket

    import socket, sys
    host = "127.0.0.1"
    port = 10101
    filename = sys.argv[1]

    #Creacion del objeto socket (IPv4, TCP)
    try:
        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    except socket.error, e:
        print "Error creando el socket: %s" %e

    #Conectandolo hacia un host remoto
    try:
        s.connect((host, port))
    except socket.gaierror, e:
        print "Error conectando al servidor %s" %e
    try:
        s.sendall(filename)
    except socket.error, e:
        print "Error enviando datos: %s" %e
    while 1:
        try:
            buf = s.recv(2048)
        except socket.error, e:
            print "Error reciviendo datos: %s" %e
        if not len(buf):
            break
        sys.stdout.write(buf)
  • Cliente UDP
    #!/usr/bin/python
    import socket, sys
    host="127.0.0.1"
    port=10101
    message=sys.argv[1]
    try:
        s=socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    except socket.error, e:
        print "Error creando el socket: %s:" %e
    try:
        s.sendto(message,(host,port))
    except socket.error, e:
        print "Error enviando datos: %s" %e
    s.settimeout(5)
    while 1:
        try:
            message, address=s.recvfrom(2048)
        except socket.timeout:
            print "Cerrado por inactividad"
            sys.exit(1)
        except socket.error, e:
            print "Error recibiendo datos: %s" %e
        if not len(message):
            break
        sys.stdout.write(message+"\n")

Servers con python

  • Server TCP

      #!/usr/bin/python 
      import socket, pickle, os 
      host = "" 
      port = 10101 
    
      #Creacion del objeto socket(IPv4, TCP) 
      s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    
      #Definir las opciones del socket 
      s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    
      #Asociarlo a un puerto + interface 
      s.bind((host, port)) 
    
      #Ponerlo a escuchar por conexiones 
      s.listen(3) 
      print "Corriendo sobre puerto %d; Ctrl-C para interrumpir" % port
      while 1: 
          try: 
              csock, caddr = s.accept() 
          except KeyboadInterrupt: 
              raise 
          except: 
              traceback.print_exc() 
      continue 
    
      #Manejando la conexion 
      try: 
          print "Cliente conectado", csock.getpeername()
      except KeyboadInterrupt:
          raise
      except:
          traceback.print_exc()
      while 1:
          try:
              data = csock.recv(2048)
              if not len(data):
                  break
              dir=os.listdir(data)
              for dir in dir:
                  csock.sendall(dir+"\n")
                  csock.shutdown(1)
          except KeyboadInterrupt:
              raise
          except:
              traceback.print_exc()
              csock.close()
    
  • Server UDP

      #ServerUDP.py
      #!/usr/bin/python
    
      import socket, os
      host=""
      port=10101
      s=socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
      s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
      s.bind((host,port))
      print "Corriendo sobre puerto %d; Ctrl-C para interrumpir" % port
      while 1:
          try:
              message, address = s.recvfrom(2048)
              print "Got data from", address
              dir=os.listdir(message)
              for listdir in dir:
                  s.sendto(listdir, address)
          except KeyboardInterrupt:
              raise
          except:
              traceback.print_exc()
    

sábado, 24 de octubre de 2009

Algunas de Vi: Busqueda


Busqueda en vi

Key Función
fa Busca el primer caracter a desde la derecha del cursor.

Fa Busca el primer caracter a desde la izquierda del cursor.

; Repite el último f,F comando.

/string Busca por el string hacia la derecha del cursor, se pueden usar regexp

?string Busca por el string hcia la izquierda del cursor, se pueden usar regexp

n Repite el último comando / o ?.
set number Enumera todas las lineas.



viernes, 23 de octubre de 2009

Algunas de Vi: Copiar y Pegar

Copiar y Pegar

Key Función
yy or Y Copia una linea al buffer.
nyy or nY Copia n lineas al buffer.
yw Copia una palabra al buffer.

ynw or nyw Copia n palabras al buffer.
y$ Copia el texto desde el cursor hasta el final de la linea.

“ayy Copia una lina al buffer llamado a.

“Ayy Agrega una linea al buffer llamado A.

p Pega texto a la derecha del cursor.

P Pega texto a la izquierda del cursor.

np Pega n copias de texto a la derecha del cursor.

“ap Pega el contenido del buffer a hacia la derecha del cursor.

“c3P Pega 3 copias de texto del buffer c hacia la izquierda del cursor.

“add Mueve la linea al buffer llamado a.

“a5dd Mueve 5 lineas al buffer llamado a.

dw Elimina una palabra y la pone en el buffer.