No estoy suficientemente fogueado en el tema de programación orientada a objetos, creo que si nunca se escuchó el término es bueno mirar un poco en wikipedia para hacerse alguna idea.
Brevemente se podría decir que las clases en python son definiciones, plantillas. Mientras que los objetos son instancias.
Ejemplo sencillo:
class Rectangulo:
def __init__(self,pbase,paltura):
self.base=pbase
self.altura=paltura
def area(self):
return self.base*self.altura
rec1=Rectangulo(3,2)
rec2=Rectangulo(8,5)
print rec1 #Muestra una direccion de memoria
print rec1.area() #Muestra 6
print rec2.area() #Muestra 40
a) Definir una función que reciba un entero y retorne una lista, donde la cantidad de elementos es el número que recibe por parámetro, y el valor del elemento en cada posición es igual al índice que ocupa en la lista.
El range ya lo usé en otros ejemplos pero básicamente usa un intervalo [a,b) para especificar el rango. En este caso va de 0 a numero-1.
b) Definir una función que recibe dos parámetros desde y hasta, y retorne una lista donde los elementos vayan de desde a hasta. Resolver el ejercicio con un while y luego con un for.
c) Definir una función que recibe tres parámetros desde, entonces y hasta, y retorne una lista donde los elementos comiencen en desde, sigan con entonces a hasta. Resolver el ejercicio con un while y luego con un for. Por ejemplo, supongamos que la función se llama enumFromThenTo, los retornos de las siguientes llamadas serían:
enumFromThenTo(1, 3, 11) -> [1, 3, 5, 7, 9, 11]
enumFromThenTo(1, 4, 20) -> [1, 4, 7, 10, 13, 16, 19]
En este caso usé el range con 3 campos, el tercero indica que avance de saltos en saltos.
d) Definir una función que construya una lista de enteros con la lista que recibe por parámetro, pero con los elementos al revés. Por ejemplo: reverse([2, 3, 5, 7, 11]) -> [11, 7, 5, 3, 2]
e) Definir una función que construya una lista de enteros con los elementos de una lista, pero solo aquellos en las posiciones pares. Por ejemplo: posicionesPares([3, 14, 16, 9, 4, 2, 716]) -> [3, 16, 4, 716]
f) Definir una función que construya una lista de enteros con la lista que recibe por parámetro, pero sin incluir los elementos repetidos. Por ejemplo: sinRepetidos([2, 3, 5, 2, 11, 5]) -> [2, 3, 5, 11]
g) Definir una función que construya una lista de enteros con los elementos que las dos listas pasadas por parámetro tienen en común. Por ejemplo: intersección([2, 3, 5], [2, 11, 5]) -> [2, 5]
h) Definir una función que modifique una lista pasada por parámetro, de forma que todos sus elementos tengan un valor menor o igual a max. Si el valor es mayor se le asignará a la celda el valor de max.
Por ejemplo: ceiling([3, 14, 16, 9, 4, 2, 716], 10) -> [3, 10, 10, 9, 4, 2,
10]
i) Dada una lista X compuesta de n elementos, se desea diseñar una función que calcule la desviación estándar D dada por la fórmula: Para elevar un número a un exponente se usa "**", la identación es obligatoria y se me complicó subir bien el código por ser medio chambón jeje
len(string): nos da la cantidad de caracteres de un string
find(substring): busca un elemento en un string y devuelve el índice en donde se encuentra por primera vez y si no lo encuentra devuelve -1. (El índice empieza en 0 y va hasta len(string)-1) .
index(substring): es igual que find sólo que si no lo encuentra en vez de -1 devuelve un error.
isalpha(string): devuelve True cuando el string contiene solo letras, en caso contrario retorna False.
isdigit(string): devuelve True cuando el string contiene solo números, en caso contrario retorna False.
split(string): convierte un string a una lista
lower(string): convierte un string a otro cuyos caracteres quedan todos en minúscula. Los caracteres que no sean letras quedan inmutables.
upper(string): convierte un string a otro cuyos caracteres quedan todos en mayúscula. Los caracteres que no sean letras quedan inmutables
Funciones para listas:
len(lista): parecido al len de strings, en las cadenas nos da la cantidad de elementos que ésta tiene.
append(elemento): agrega un elemento a una lista
index(elemento): nos dice el subíndice del elemento que le pasamos por parámetro (el primero que encuentra) en una lista. (El subíndice puede tomar valores entre 0 y len(lista)-1).
remove(elemento): borra un elemento de una lista (el primero que encuentra que sea elemento).
del(lista[x]): borra una cantidad especifica de elementos (la cual se especifica mediante un rango de subíndices) de una lista y con sólo "del lista" la lista entera.
count(elemento): Nos dice la cantidad de veces que el elemento se encuentra en la lista
set(lista): elimina repetidos
* Cantidad de palabras
* Largo promedio de las palabras
* Palabra más corta
* Palabra más larga
Programar una función separada para cada uno de los puntos (en los dos primeros casos la función debe devolver un entero, y en los últimos dos un string).
La función split() convierte un string a una lista. Por ejemplo. Si ejecutamos el siguiente código:
Nos va a dar como resultado la lista: ['Hola', 'como', 'estas']
Construir una función que solicite al usuario 3 cadenas a, b y c, y que reemplace b por
c en a. La función debe mostrar por pantalla la cadena a una vez reemplazado el texto.
La función len() devuelve la cantidad de caracteres de una cadena. El código anterior daría como resultado: Probando
Este programa en python devuelve una tupla. La cual contiene en el primer campo a la mínima distancia entre el racional y el valor de pi, el segundo al valor de ese racional convertido a float, el tercero al numerador y el cuarto al denominador. Los valores del numerador y el denominador varían cada uno entre 1 y 1000.
La librería math nos proveé de funciones como fabs() que da el valor absoluto de un número y pi el valor de pi =P. El resultado es: (2.667641894049666e-07, 3.1415929203539825, 355, 113)
La famosa calculadora tiene que estar presente. Un par de observaciones con python:
El operador "/" devuelve una división entera a menos que especifiquemos el tipo en el denominador por ejemplo. Lo demás creo que no tiene ninguna ciencia.
Notemos la diferencia entre raw_input() que es una función que "agarra" strings e input() que es otra función que "agarra" enteros. Existen funciones para convertir tipos de datos en lo que usamos y son por ejemplo: int() que convierte a entero y float() que convierte a coma flotante.
Existe un conjunto de utilidades que viene con AsteriskNow en el paquete Dahdi-tools el cual nos permite configurar la tarjeta Digium WildcardTDM400P.
Para ver que tarjeta tenemos escribiremos el siguiente comando:
dahdi_scan
En este caso nos devuelve:
[1]
active=yes
alarms=OK
description=Wildcard TDM400P REV E/F Board 5
name=WCTDM/4
manufacturer=Digium
devicetype=Wildcard TDM400P REV E/F
location=PCI Bus 01 Slot 09
basechan=1
totchans=4
irq=10
type=analog
port=1,FXS
port=2,FXS
port=3,FXO
port=4,FXO
En la tarjeta dice el número de puertos por lo cual ya hemos identificado cuales son los puertos FXO y cuales son los puertos FXS.
El caso de prueba (objetivo): consiste en poder usar un teléfono analógico en una central PBX como la que tenemos. Un diagrama de ilustración es el siguiente:
Paraconfigurarlas placas se ejecutan los siguientes comandos:
dahdi_genconfgenera el archivo de configuración: /etc/asterisk/dahdi_channels.conf
dahdi_cfg -vv: configura la tarjeta a partir del archivo de configuración generado por el comando anterior. Se necesita correr para que los módulos DAHDI del kernel funcionen correctamente. Éste se ejecuta generalmente desde el archivo init de DAHDI
Asterisk interpreta los canales a través del archivo chan_dahdi.conf. Este archivo no existe de ante mano, así que lo crearemos en /etc/asterisk y añadiremos en él estas 3 líneas:
[channels]
#include dahdi-channels.conf
#include chan_dahdi_additional.conf
Además creamos el archivo chan_dahdi_additional.conf en el mismo directorio
Con esto le decimos al sistema Asterisk que lea el archivo dahdi-channels.conf creado en la ejecución de dahdi_genconf y dahdi_cfg -vv y el chan_dahdi_additional que es modificado a través del GUI de FreePBX.
Archivos de configuración de dahdi-tools:
/etc/dahdi/system.conf
/etc/asterisk/chan_dahdi.conf
/etc/dahdi/system.conf:
Aquí se tiene que configurar el cancelador de echo para cada canal a diferencia de zaptel.conf.
En nuestro caso nos ha quedado así: # Span 1: WCTDM/4 "Wildcard TDM400P REV E/F Board 5" (MASTER) #Puerto 1 de la tarjeta Analogica=Modulo FXS Verde fxoks=1 echocanceller=mg2,1 #Puerto 2 de la tarjeta Analogica=Modulo FXS Verde fxoks=2 echocanceller=mg2,2 #Puerto 3 de la tarjeta Analogica=Modulo FXO Rojo fxsks=3 echocanceller=mg2,3 #Puerto 4 de la tarjeta Analogica=Modulo FXO Rojo fxsks=4 echocanceller=mg2,4
# Global data loadzone = us defaultzone = us
Los otros archivos de configuración son:
/etc/dahdi/init.conf:
Reemplaza al archivo zaptel ubicado en /etc/sysconfig/zaptel. Es un shell script que se crea a través del script dahdi ubicado en init.d. Todos sus valores son opcionales. La variable MODULES, sin embargo no se lee más desde este archivo. Esta variable se lee del siguiente archivo:
/etc/dahdi/modules
Acá hay una lista con todos los módulos a cargarse. Reemplaza la variable MODULES del archivo de configuración anterior.
/etc/dahdi/genconf_parameters
Parámetros opcionales, reemplaza a zapconf y también a genzaptelconf
Por otro lado, seria necesaria la configuracion del fichero que “intercomunica” los módulos de la tarjeta con nuestro sistema Asterisk. Esto se registra en el fichero /etc/asterisk/chan_dahdi.conf
Yo conecte el teléfono al puerto 1 (módulo FXS verde) y la linea de teléfono al 3 (módulo FXO rojo).
Los grupos asociados a los canales y puertos que estoy usando se pueden descubrir en el archivo /etc/asterisk/chan_dahdi_groups.conf que está en un #include en chan_dahdi.conf.
Los grupos asociados a los canales y puertos que estoy usando son: Grupo 1: Puerto 1: FXS (canal 1) Puerto 2: FXS (canal 2) Grupo 2: Puerto 3: FXO (canal 3) Puerto 4: FXO (canal 4)
A continuación queda configurar los canales de la tarjeta para que sean reconocidos por Asterisk:
entonces añadimos el soporte DAHDI para FreePBX editando el archivo /etc/amportal.conf agregando al final del archivo la siguiente linea:
ZAP2DAHDICOMPAT=true
Reiniciamos Amportal con:
amportal restart
Y ya hay soporte DAHDI en FreePBX.
Paracomprobar la configuración se procede de esta manera:
Ejecutar:
asterisk -r
dahdi show channels
dahdi show status
Finalmente, si conseguimos tono en el teléfono solo queda configurar la extensión que se puede hacer desde el GUI o editando el archivo /etc/asterisk/extensions.conf:
Colocando las lineas:
[ dahdi ] exten => _9.,3,Dial(DAHDI/g2/${EXTEN})
de esta forma podremos hacer llamadas “saliendo con el 9”, usando el puerto 3 y el grupo 2 (g2)
Hola, este es mi primer post. Equivalente a mi primer paso.
Trato de investigar cosas que no tengo mucha idea pero más adelante cuando haya caminado lo suficiente estaré seguro de que algo sé y tengo fé en que podré recoger información útil de este blog.