PDF de programación - the original hacker 03 201401

Imágen de pdf the original hacker 03 201401

the original hacker 03 201401gráfica de visualizaciones

Publicado el 11 de Julio del 2017
1.318 visualizaciones desde el 11 de Julio del 2017
1.002,6 KB
26 paginas
Creado hace 10a (07/01/2014)
THE ORIGINAL HACKER
SOFTWARE LIBRE, HACKING y PROGRAMA-
CIÓN, EN UN PROYECTO DE

EUGENIA BAHIT


@eugeniabahit

GLAMP HACKER Y
PROGRAMADORA EXTREMA
HACKER ESPECIALIZADA EN PROGRAMACIÓN
EXTREMA E INGENIERÍA INVERSA DE CÓDIGO
SOBRE GNU/LINUX, APACHE, MYSQL,
PYTHON Y PHP. EUGENIABAHIT.COM

DOCENTE E INSTRUCTORA DE TECNOLOGÍAS
GLAMP CURSOS.EUGENIABAHIT.COM
CURSOSDEPROGRAMACIONADISTANCIA.COM

MIEMBRO DE LA FREE SOFTWARE
FOUNDATION FSF.ORG, THE LINUX
FOUNDATION LINUXFOUNDATION.ORG E
INTEGRANTE DEL EQUIPO DE DEBIAN
HACKERS DEBIANHACKERS.NET.

CREADORA DE PYTHON-PRINTR, EUROPIO
ENGINE, JACKTHESTRIPPER. VIM CONTRI-
BUTOR. FUNDADORA DE HACKERS N'
DEVELOPERS MAGAZINE Y RESPONSABLE
EDITORIAL HASTA OCTUBRE '13.

Buenos Aires, 7 de Enero
de 2014

ÍNDICE DE LA
EDICIÓN NRO3

INGENIERÍA DE SOFTWARE: DE LAMBDAS, CLOSURES,
WRAPPERS Y DECORADORES. DESMITIFICANDO PYTHON -
PARTE I......................................3

INGENIERÍA INVERSA DE CÓDIGO EN LA SEGURIDAD
INFORMÁTICA COMO FORMA DE DETECCIÓN DE
VULNERABILIDADES..............................9

BASH SCRIPTING AVANZADO: UTILIZANDO DECLARE
PARA LA DEFINICIÓN DE TIPOS.................18

EUROPIO ENGINE LAB: CONSUMIR LA API DE
EUROPIO ENGINE DESDE EL FRONT-END DE UN SITIO
WEB ESTÁNDAR................................22

The Original Hacker – www.originalhacker.org

®2013, 2014 Eugenia Bahit – www.eugeniabahit.com – Bajo Licencia Creative Commons BY-NC-SA

3

INGENIERÍA DE SOFTWARE:
DE LAMBDAS, CLOSURES,
WRAPPERS Y DECORADORES.
DESMITIFICANDO PYTHON -
PARTE I

EN EL MUNDO DE LA
INGENIERÍA DE SISTEMAS,
PYTHON ES UNO DE LOS
LENGUAJES MÁS TEMIDOS Y
RESPETADOS. EL RESPETO,
NO ES ALGO QUE DEBA
PERDERSE, PERO EL MIEDO,
DEBERÍA SER ERRADICADO.
Y ESO, ES LO QUE
PRETENDO LOGRAR CON ESTA
SERIE DE DOS ENTREGAS:
OTORGAR UNA EXPLICACIÓN
CLARA, SIMPLE Y
DEFINITIVA SOBRE LOS 4
“MONSTRUOS” DEL
LENGUAJE. EN LA ENTREGA
DE ESTE MES, LAMBDAS Y
CLOSURES.

L

levo años poniendo caras de sorpresa y asombro cada vez
que escucho a mis colegas hablar sobre funciones lambda,
closures, wrappers y decoradores en Python. Y llevo la
misma cantidad de tiempo tratando de dar a mis alumnos un
mensaje "tranquilizador" cuando me consultan alarmados por estos
"cuatro monstruos".

No se qué es lo que rodea a Python que lo hace estar involucrado
en explicaciones complejas que pretenden hacerlo parecer un
lenguaje místico, parte de un culto religioso o logia secreta. Pero lo
que sí se, es que Python no es un lenguaje místico ni
complejo. Es tan solo un lenguaje de programación más. Potente,
sí. Agradable y prolijo, también. Pero sigue siendo un lenguaje más,
que por más complejidad que se le quiera atribuir, siempre habrá
oportunidad de desmitificarla y encontrar una explicación sencilla. Y
a eso he venido con este artículo; a desmitificar un hito en
la historia de este maravilloso lenguaje.

FUNCIONES LAMBDA
Muchas veces -y muy a mi pesar- llamadas "funciones anónimas",
las funciones lambda en Python, no son más que una forma de
definir una función común y corriente, de una única instrucción
de código, en una única línea.

Es decir, una función lambda es la forma de definir una función que tradicionalmente podría escribirse de
forma común, en una sola línea de código. Pero esto, solo podrá hacerse con aquellas funciones cuyo
algoritmo, no posea más de una instrucción.

The Original Hacker – www.originalhacker.org

®2013, 2014 Eugenia Bahit – www.eugeniabahit.com – Bajo Licencia Creative Commons BY-NC-SA

4

DEFINIR UNA FUNCIÓN LAMBDA
La siguiente función:

def mifuncion(nombre):
return "Hola %s!" % nombre

Con lambda, podría definirse en una sola línea de código, ya que posee una única instrucción. Para ello, se
utilizaría la siguiente instrucción:

mifuncion = lambda nombre: "Hola %s!" % nombre

Visto de esta forma, hasta se corre el riesgo de perderle el respeto a las funciones lambda. De hecho lo
anterior, casi no requiere de una explicación. Sin embargo, la daré por si aún quedan dudas.

Una función lambda es una forma de definir una función de una sola
instrucción, en una sola línea de código

Una función lambda es una forma de definir una función de una sola instrucción, en una sola línea de código,
claro que, con una sintaxis particular:

variable = lambda parametro1, parametro2, parametro9: instrucción a ser retornada

Al igual que las funciones comunes, las funciones lambda admiten parámetros por omisión y la
principal diferencia es que el resultado de toda instrucción siempre es retornado:

neto = lambda bruto, iva=21: bruto + (bruto * iva / 100)

INVOCAR FUNCIONES LAMBDA
La llamada a las funciones lambda es idéntica a la de funciones comunes. Es decir, el hecho de ser
funciones asignadas a una variable, no significará que éstas se ejecutarán sin ser invocadas. Por el contrario,
son funciones que al igual que las funciones comunes, deberán ser invocadas a través de la variable a la cual
se las asignado:

neto = lambda bruto, iva=21: bruto + (bruto * iva / 100)

print neto(100)

The Original Hacker – www.originalhacker.org

®2013, 2014 Eugenia Bahit – www.eugeniabahit.com – Bajo Licencia Creative Commons BY-NC-SA

5

# Retorna 121

print neto(200)
# Retorna 242

print neto(bruto=100, iva=19)
# Retorna 119

EL TIPO DE DATOS DE UNA VARIABLE ASIGNADA COMO FUNCIÓN LAMBDA
Una variable a la cual se le asignado la definición de una función lambda, muy intuitivamente, es una
variable de tipo "función lambda". Y esta obviedad no es en demérito de Python; muy por el contrario, es
lo que convierte a Python en un lenguaje con coherencia lógica:

>>> neto = lambda bruto, iva=21: bruto + (bruto * iva / 100)
>>> neto
<function <lambda> at 0xb6a7e0d4>

CLOSURES
Los closures son funciones que dentro de ellas, definen otra función. Hasta aquí, es una definición
que poco dice sobre los closures, pero si a lo anterior agregamos que al ser invocado un closure, retorna la
función que define dentro, la cosa comienza a verse un poco mejor.

Un closure es entonces, una función que define otra función y la
retorna al ser invocado.

Por ejemplo:

def closure():

def funcion_interna():
return 1

return funcion_interna

Al llamar a closure() lo que en realidad obtendríamos como resultado, sería otra función, la función llamada
funcion_interna():

variable = closure() # Ahora variable es una función, la función funcion_interna()
print variable() # Imprimirá 1 (1 es el retorno de funcion_interna()

The Original Hacker – www.originalhacker.org

®2013, 2014 Eugenia Bahit – www.eugeniabahit.com – Bajo Licencia Creative Commons BY-NC-SA

6

Visto de esta forma, intentamos únicamente introducir el concepto sintáctico y funcional de un closure. Ahora
nos toca ver cómo y para qué se utilizan.
Sabemos entonces, que se trata de funciones que definen otra función dentro y la retornan pero también,
debemos agregar que dichas funciones internas, tienen la capacidad de reconocer y recordar el
valor de variables y parámetros definidos dentro del closure:

def closure(parametro):

def funcion():
return parametro + 1 # parametro es de la función closure()

return funcion

variable = closure(parametro=1)
print variable() # Imprime 2

Y hasta aquí, nuevamente, lo máximo que hemos hecho es entender cómo funciona un closure y cómo se
define e invoca, pero ninguno de los ejemplos sería válido en términos de buenas prácticas, pues ninguno
justificaría su implementación.

Un closure DEBE tener una razón de ser. De hecho, mi consejo es
evitarlos toda vez que sea posible resolver el planteo sin utilizarlos.
Pues dificultan la lectura del código y su entendimiento, cuando en
realidad, deberían estar allí para facilitarlo.

Un ejemplo tal vez más esclarecedor de un closure bien implementado, podría ser el siguiente:

def calcular_iva(alicuota):

def estimar_neto(importe_bruto):
return importe_bruto + (importe_bruto * alicuota / 100)

return estimar_neto

# Productos gravados con el 21%
get_neto_base_21 = calcular_iva(21)
harina = get_neto_base_21(10)
arroz = get_neto_base_21(8.75)
azucar = get_neto_base_21(12.5)

# Productos gravados con el 10.5%
get_neto_base_105 = calcular_iva(10.5)
tv = get_neto_base_105(12700)
automovil = get_neto_base_105(73250)

El requerimiento anterior, podría haber requerido definir dos funciones independientes (get_neto_base_21
y get_neto_base_105) con prácticamente el mismo algoritmo y una importante redundancia.

The Original Hacker – www.originalhacker.org

®2013, 2014 Eugenia Bahit – www.eugeniabahit.com – Bajo Licencia Creative Commons BY-NC-SA

7

En su defecto, podría haberse resuelto mediante una única función con 2 parámetros, la cual hubiese
requerido replicar el valor de uno de los parámetros incansablemente, en las reiteradas llamadas.

Pues allí, es donde tenemos la justificación para implementar un closure:




evitar definir múltiples funciones con algoritmos redundantes
evitar la sobrecarga de parámetros

Se justificará el uso de closures cuando su finalidad consista en evitar
la redundancia y la sobrecarga de parámetros

Pero para entender mejor el móvil, veamos en código qué oportunidades teníamos:

# Recurrir a algoritmos redundantes

def get_neto_base_21(importe_bruto):
return importe_bruto + (importe_bruto * 21 / 100) # línea redundante

def get_neto_base_105(importe_bruto):
return importe_bruto + (importe_bruto * 10.5 / 100) # línea redundante

harina = get_neto_base_21(10)
arroz = get_neto_base_21(8.75)
azucar = get_neto_base_21(12.5)
tv = get_neto_base_105(12700)
automovil = get_neto_base_105(73250)

# Recurrir a la sobrecarga de parámetros

def get_neto(alicuota_iva, importe_bruto):
return importe_bruto + (importe_bruto * alicuota_iva / 100)

Ahora, en las siguientes llamadas, notar el valor recurr
  • Links de descarga
http://lwp-l.com/pdf5191

Comentarios de: the original hacker 03 201401 (0)


No hay comentarios
 

Comentar...

Nombre
Correo (no se visualiza en la web)
Valoración
Comentarios...
CerrarCerrar
CerrarCerrar
Cerrar

Tienes que ser un usuario registrado para poder insertar imágenes, archivos y/o videos.

Puedes registrarte o validarte desde aquí.

Codigo
Negrita
Subrayado
Tachado
Cursiva
Insertar enlace
Imagen externa
Emoticon
Tabular
Centrar
Titulo
Linea
Disminuir
Aumentar
Vista preliminar
sonreir
dientes
lengua
guiño
enfadado
confundido
llorar
avergonzado
sorprendido
triste
sol
estrella
jarra
camara
taza de cafe
email
beso
bombilla
amor
mal
bien
Es necesario revisar y aceptar las políticas de privacidad