SlideShare una empresa de Scribd logo
1 de 33
Funcional* para trollear
PyconES 2015 - Valencia
Alejandro E Brito Monedero
@ae_bm
Advertencia
Me he leído el CoC pero seguramente se me
escape algo que pueda ser políticamente
incorrecto.
En mi defensa, el Gangsta Rap, los videojuegos,
el metal y el stand up comedy de genios como
Richard Pryor y George Carlin.
Sobre la monadas, functores y otros temas fancy,
esta no es la charla ni la conferencia JFYI ;-)
El protocolo
Nombre Alejandro Brito Monedero
Insultos @ae_bm
Como estoy aquí No se ^_^
Ocupación Sysadmin / DevOps / … /
Buzzword
Paradero Madrid DevOps, Python Madrid,
Postgres España, ...
● Código que cabe en tu
memoria a corto plazo =>
● Mantenible
● Capacidad de
composición
● Trollear no usando
programación imperativa
Alonzo Churh
Cálculo
Python no es un lenguaje
funcional:
● Mutabilidad por defecto
● Iteración > recursividad
● Tipos
● ...
● Reducir los side
effects
● Reducir la necesidad
de mutar los datos
● Funciones como
ciudadanos de primer
orden
● Hacer funciones que
se puedan componer
● Aprovechar el
lazyness
Pensar en lineas de ensamblaje o
comando_1 | comando_2 | …
si has usado un poco *NIX
Hora de ver algo de python
l = []
for e in range(100):
if e % 2 == 0:
l.append(pow(e, 2))
for, if → map y filter
l = map(lambda x: pow(x, 2),
filter(lambda x: x % 2 == 0,
range(100)))
for, if → map y filter
* en python 3 l no es una lista
l = [pow(x, 2)
for x in range(100)
if x % 2 == 0]
for, if → list comprehension
a = [0, 2, 4, 6]
b = [1, 3, 5]
c = []
while a and b:
c.append((a.pop(0), b.pop(0)))
c == [(0, 1), (2, 3), (4, 5)]
zip a.k.a cremallera
a = [0, 2, 4, 6]
b = [1, 3, 5]
c = zip(a, b)
c == [(0, 1), (2, 3), (4, 5)]
zip a.k.a cremallera
Hablemos de la memoria y el regalo del laziness
with open('genoma.txt', 'rb') as f:
read_data = f.read()
...
Out of memory: kill process xxxx
Killed process xxxx (python)
Mejor es iterar sobre
cada elemento.
Siendo el elemento
creado justo antes de
ser utilizado
Python 2
range() → xrange()
map() → itertools.imap()
filter() → itertools.ifilter()
zip() → itertools.izip()
Python 2 y Python 3
[x for x in iterable if f(x)] →
(x for x in interable if f(x))
¿La única forma de crear iteradores es usar OOP
e implementar la interfaz iterador?
Generators
def fancy_generator():
yield "I"
yield "am"
yield "fancy"
' '.join(fancy_generator()) == 'I am fancy'
La hora de las baterías ha llegado
itertools
Inspirados en construcciones de lenguajes tan
populares como APL, Haskell y SML
Eficientes en el uso de memoria (recordar los
streams)
https://docs.python.org/2/library/itertools.html
https://docs.python.org/3/library/itertools.html
itertools
cycle('abc') → 'a' 'b' 'c' 'a' 'b' 'c' 'a' ...
repeat('¿cuanto falta?') → '¿cuanto falta?' '¿cuando falta?' ...
chain([1,2,3], [4, 5, 6]) → 1 2 3 4 5 6
dropwhile(lambda x: x<5, [1,4,6,4,1]) → 6 4 1
takewhile(lambda x: x<5, [1,4,6,4,1]) → 1 4
Generadores combinatorios
...
functools
Funciones de orden superior a.k.a funciones que
reciben y/o retornan funciones
Decoradores
https://docs.python.org/2/library/functools.html
https://docs.python.org/3/library/functools.html
functools
reduce(operator.add, [1, 2, 3], -6) → (((-6 + 1) + 2) + 3)
partial(): generar una función con argumentos
prefijados
wraps(): para usar con los decoradores
lru_cache(): crear una función con memoria
¿Los decoradores, los closures y funciones
anidadas?
- Seguro ya hay N charlas del tema
Hora de ver algo de código real
Conclusiones
Hacer funciones pequeñas K.I.S.S
Aprovechar las baterías de python
Pensar en listas, iteradores, streams
Usar composición de funciones
El I/O y las validaciones tratar de tenerlo en los
extremos
Disciplina para no introducir side effects
Preguntas
Ya he terminado
Créditos
https://upload.wikimedia.org/wikipedia/commons/8/87/Horchateria_de_Santa_Catalina_en_Valencia.jpg
https://upload.wikimedia.org/wikipedia/sr/7/73/Trollface.png
https://upload.wikimedia.org/wikipedia/commons/1/15/Ambox_warning_pn.svg
http://giphy.com/gifs/jon-stewart-why-lYKvaJ8EQTzCU
https://upload.wikimedia.org/wikipedia/commons/thumb/3/39/Lambda_lc.svg/500px-Lambda_lc.svg.png
http://witchkitteh.deviantart.com/art/Teach-me-204949930
https://upload.wikimedia.org/wikipedia/en/a/a6/Alonzo_Church.jpg
http://giphy.com/gifs/a8749TBnyEIY8
https://upload.wikimedia.org/wikipedia/commons/9/97/%22USE_PROPER_TOOLS_FOR_THE_JOB_-
_TAKE_CARE_OF_THEM%22_-_NARA_-_515954.jpg
https://c2.staticflickr.com/8/7266/6953971910_664578fc08_b.jpg
http://i.giphy.com/NusWKgMXzVhIc.gif
http://i.giphy.com/DJZ14OxhrEsx2.gif
http://i.giphy.com/6lScd4x2D5Oko.gif
http://i.giphy.com/l41lZZqhIUA6IJNDO.gif
http://img4.wikia.nocookie.net/__cb20131226180633/dragonball/images/thumb/5/51/Grumpy-cat-
nope.jpg/500px-Grumpy-cat-nope.jpg
http://i.giphy.com/AMqCTHuCMFpM4.gif
http://i.giphy.com/IIjH0wN7F3uzS.gif
http://i.giphy.com/fDzM81OYrNjJC.gif

Más contenido relacionado

La actualidad más candente

La actualidad más candente (6)

Presentacion Python
Presentacion  Python Presentacion  Python
Presentacion Python
 
Excel stuff
Excel stuffExcel stuff
Excel stuff
 
Transparencias taller Python
Transparencias taller PythonTransparencias taller Python
Transparencias taller Python
 
Ia Robotica
Ia RoboticaIa Robotica
Ia Robotica
 
Ia Robotica
Ia RoboticaIa Robotica
Ia Robotica
 
Jruby On Rails. Ruby on Rails en la JVM
Jruby On Rails. Ruby on Rails en la JVMJruby On Rails. Ruby on Rails en la JVM
Jruby On Rails. Ruby on Rails en la JVM
 

Similar a Funcional para trollear

Python - Programación para machos
Python - Programación para machosPython - Programación para machos
Python - Programación para machosJorge Hernandez
 
Iniciación a las artes marciales con Python
Iniciación a las artes marciales con PythonIniciación a las artes marciales con Python
Iniciación a las artes marciales con PythonIsrael Fermin Montilla
 
¿Cómo aprender Python sin morir en el intento?
¿Cómo aprender Python sin morir en el intento?¿Cómo aprender Python sin morir en el intento?
¿Cómo aprender Python sin morir en el intento?Adolfo Fitoria
 
El lenguaje de pogramación C++
El lenguaje de pogramación C++El lenguaje de pogramación C++
El lenguaje de pogramación C++Rodrigo Corral
 
Pythonlearn-01-Intro.pptx
Pythonlearn-01-Intro.pptxPythonlearn-01-Intro.pptx
Pythonlearn-01-Intro.pptxDiegoSalvetti2
 
Python científico (introducción a numpy y matplotlib))
Python científico (introducción a numpy y matplotlib))Python científico (introducción a numpy y matplotlib))
Python científico (introducción a numpy y matplotlib))kikocorreoso
 
De 0 A Python En 40 Minutos
De 0 A Python En 40 MinutosDe 0 A Python En 40 Minutos
De 0 A Python En 40 Minutosflekoso
 
Python ¿2 vs 3?
Python ¿2 vs 3?Python ¿2 vs 3?
Python ¿2 vs 3?Joel Rivera
 
Mini clase Intro Programación Python UTN Profesorado 2015
Mini clase Intro Programación Python UTN Profesorado 2015Mini clase Intro Programación Python UTN Profesorado 2015
Mini clase Intro Programación Python UTN Profesorado 2015Mariano Reingart
 
ECIMag 2010 - Clase 4/5
ECIMag 2010 - Clase 4/5ECIMag 2010 - Clase 4/5
ECIMag 2010 - Clase 4/5Corvalius
 
Programando con Python
Programando con PythonProgramando con Python
Programando con PythonMario IC
 

Similar a Funcional para trollear (20)

Python - Programación para machos
Python - Programación para machosPython - Programación para machos
Python - Programación para machos
 
Iniciación a las artes marciales con Python
Iniciación a las artes marciales con PythonIniciación a las artes marciales con Python
Iniciación a las artes marciales con Python
 
02 - Tipos de datos escalares en Python 3
02 - Tipos de datos escalares en Python 302 - Tipos de datos escalares en Python 3
02 - Tipos de datos escalares en Python 3
 
¿Cómo aprender Python sin morir en el intento?
¿Cómo aprender Python sin morir en el intento?¿Cómo aprender Python sin morir en el intento?
¿Cómo aprender Python sin morir en el intento?
 
Python Vs C
Python Vs CPython Vs C
Python Vs C
 
Go python, go
Go python, goGo python, go
Go python, go
 
El lenguaje de pogramación C++
El lenguaje de pogramación C++El lenguaje de pogramación C++
El lenguaje de pogramación C++
 
Django
DjangoDjango
Django
 
Pythonlearn-01-Intro.pptx
Pythonlearn-01-Intro.pptxPythonlearn-01-Intro.pptx
Pythonlearn-01-Intro.pptx
 
Python científico (introducción a numpy y matplotlib))
Python científico (introducción a numpy y matplotlib))Python científico (introducción a numpy y matplotlib))
Python científico (introducción a numpy y matplotlib))
 
De 0 A Python En 40 Minutos
De 0 A Python En 40 MinutosDe 0 A Python En 40 Minutos
De 0 A Python En 40 Minutos
 
python CIENTIFIFO.pdf
python CIENTIFIFO.pdfpython CIENTIFIFO.pdf
python CIENTIFIFO.pdf
 
Python ¿2 vs 3?
Python ¿2 vs 3?Python ¿2 vs 3?
Python ¿2 vs 3?
 
Mini clase Intro Programación Python UTN Profesorado 2015
Mini clase Intro Programación Python UTN Profesorado 2015Mini clase Intro Programación Python UTN Profesorado 2015
Mini clase Intro Programación Python UTN Profesorado 2015
 
ECIMag 2010 - Clase 4/5
ECIMag 2010 - Clase 4/5ECIMag 2010 - Clase 4/5
ECIMag 2010 - Clase 4/5
 
Python + Ciencia = ♥
Python + Ciencia = ♥Python + Ciencia = ♥
Python + Ciencia = ♥
 
Phyton
PhytonPhyton
Phyton
 
Programando con Python
Programando con PythonProgramando con Python
Programando con Python
 
Python101
Python101Python101
Python101
 
Memoria dinamica en c
Memoria dinamica en cMemoria dinamica en c
Memoria dinamica en c
 

Más de Alejandro E Brito Monedero (14)

Mad scalability (perfomance debugging)
Mad scalability (perfomance debugging)Mad scalability (perfomance debugging)
Mad scalability (perfomance debugging)
 
Tres historias
Tres historiasTres historias
Tres historias
 
AMQP vs GRAPHITE
AMQP vs GRAPHITEAMQP vs GRAPHITE
AMQP vs GRAPHITE
 
Sysdig
SysdigSysdig
Sysdig
 
Sysdig SRECon 16 Europe
Sysdig SRECon 16 EuropeSysdig SRECon 16 Europe
Sysdig SRECon 16 Europe
 
Top Bug
Top BugTop Bug
Top Bug
 
Fabric más allá de lo básico
Fabric más allá de lo básicoFabric más allá de lo básico
Fabric más allá de lo básico
 
Experiencias con PostgreSQL en AWS
Experiencias con PostgreSQL en AWSExperiencias con PostgreSQL en AWS
Experiencias con PostgreSQL en AWS
 
Fabric Fast & Furious edition
Fabric Fast & Furious editionFabric Fast & Furious edition
Fabric Fast & Furious edition
 
Así que pusiste MongoDB. Dime ¿cómo lo administras?
Así que pusiste MongoDB. Dime ¿cómo lo administras?Así que pusiste MongoDB. Dime ¿cómo lo administras?
Así que pusiste MongoDB. Dime ¿cómo lo administras?
 
AWS Baby steps circa 2008
AWS Baby steps circa 2008AWS Baby steps circa 2008
AWS Baby steps circa 2008
 
Using Logstash, elasticsearch & kibana
Using Logstash, elasticsearch & kibanaUsing Logstash, elasticsearch & kibana
Using Logstash, elasticsearch & kibana
 
Wireshark tips
Wireshark tipsWireshark tips
Wireshark tips
 
Mi experiencia con Amazon AWS EC2 y S3
Mi experiencia con Amazon AWS EC2 y S3Mi experiencia con Amazon AWS EC2 y S3
Mi experiencia con Amazon AWS EC2 y S3
 

Último

PLANEACION DE CLASES TEMA TIPOS DE FAMILIA.docx
PLANEACION DE CLASES TEMA TIPOS DE FAMILIA.docxPLANEACION DE CLASES TEMA TIPOS DE FAMILIA.docx
PLANEACION DE CLASES TEMA TIPOS DE FAMILIA.docxhasbleidit
 
Guía de Registro slideshare paso a paso 1
Guía de Registro slideshare paso a paso 1Guía de Registro slideshare paso a paso 1
Guía de Registro slideshare paso a paso 1ivanapaterninar
 
Herramientas que posibilitan la información y la investigación.pdf
Herramientas que posibilitan la información y la investigación.pdfHerramientas que posibilitan la información y la investigación.pdf
Herramientas que posibilitan la información y la investigación.pdfKarinaCambero3
 
La Electricidad Y La Electrónica Trabajo Tecnología.pdf
La Electricidad Y La Electrónica Trabajo Tecnología.pdfLa Electricidad Y La Electrónica Trabajo Tecnología.pdf
La Electricidad Y La Electrónica Trabajo Tecnología.pdfjeondanny1997
 
Documentacion Electrónica en Actos Juridicos
Documentacion Electrónica en Actos JuridicosDocumentacion Electrónica en Actos Juridicos
Documentacion Electrónica en Actos JuridicosAlbanyMartinez7
 
Trabajo de tecnología excel avanzado.pdf
Trabajo de tecnología excel avanzado.pdfTrabajo de tecnología excel avanzado.pdf
Trabajo de tecnología excel avanzado.pdfedepmariaperez
 
#Tare10ProgramacionWeb2024aaaaaaaaaaaa.pptx
#Tare10ProgramacionWeb2024aaaaaaaaaaaa.pptx#Tare10ProgramacionWeb2024aaaaaaaaaaaa.pptx
#Tare10ProgramacionWeb2024aaaaaaaaaaaa.pptxHugoGutierrez99
 
Modelo de Presentacion Feria Robotica Educativa 2024 - Versión3.pptx
Modelo de Presentacion Feria Robotica Educativa 2024 - Versión3.pptxModelo de Presentacion Feria Robotica Educativa 2024 - Versión3.pptx
Modelo de Presentacion Feria Robotica Educativa 2024 - Versión3.pptxtjcesar1
 
La electricidad y la electronica.10-7.pdf
La electricidad y la electronica.10-7.pdfLa electricidad y la electronica.10-7.pdf
La electricidad y la electronica.10-7.pdfcristianrb0324
 
Inteligencia Artificial. Matheo Hernandez Serrano USCO 2024
Inteligencia Artificial. Matheo Hernandez Serrano USCO 2024Inteligencia Artificial. Matheo Hernandez Serrano USCO 2024
Inteligencia Artificial. Matheo Hernandez Serrano USCO 2024u20211198540
 
Red Dorsal Nacional de Fibra Óptica y Redes Regionales del Perú
Red Dorsal Nacional de Fibra Óptica y Redes Regionales del PerúRed Dorsal Nacional de Fibra Óptica y Redes Regionales del Perú
Red Dorsal Nacional de Fibra Óptica y Redes Regionales del PerúCEFERINO DELGADO FLORES
 
Trabajando con Formasy Smart art en power Point
Trabajando con Formasy Smart art en power PointTrabajando con Formasy Smart art en power Point
Trabajando con Formasy Smart art en power PointValerioIvanDePazLoja
 
La tecnología y su impacto en la sociedad
La tecnología y su impacto en la sociedadLa tecnología y su impacto en la sociedad
La tecnología y su impacto en la sociedadEduardoSantiagoSegov
 
David_Gallegos - tarea de la sesión 11.pptx
David_Gallegos - tarea de la sesión 11.pptxDavid_Gallegos - tarea de la sesión 11.pptx
David_Gallegos - tarea de la sesión 11.pptxDAVIDROBERTOGALLEGOS
 
LUXOMETRO EN SALUD OCUPACIONAL(FINAL).ppt
LUXOMETRO EN SALUD OCUPACIONAL(FINAL).pptLUXOMETRO EN SALUD OCUPACIONAL(FINAL).ppt
LUXOMETRO EN SALUD OCUPACIONAL(FINAL).pptchaverriemily794
 
CommitConf 2024 - Spring Boot <3 Testcontainers
CommitConf 2024 - Spring Boot <3 TestcontainersCommitConf 2024 - Spring Boot <3 Testcontainers
CommitConf 2024 - Spring Boot <3 TestcontainersIván López Martín
 
certificado de oracle academy cetrificado.pdf
certificado de oracle academy cetrificado.pdfcertificado de oracle academy cetrificado.pdf
certificado de oracle academy cetrificado.pdfFernandoOblitasVivan
 
Análisis de Artefactos Tecnologicos (3) (1).pdf
Análisis de Artefactos Tecnologicos  (3) (1).pdfAnálisis de Artefactos Tecnologicos  (3) (1).pdf
Análisis de Artefactos Tecnologicos (3) (1).pdfsharitcalderon04
 
Análisis de los artefactos (nintendo NES)
Análisis de los artefactos (nintendo NES)Análisis de los artefactos (nintendo NES)
Análisis de los artefactos (nintendo NES)JuanStevenTrujilloCh
 

Último (20)

PLANEACION DE CLASES TEMA TIPOS DE FAMILIA.docx
PLANEACION DE CLASES TEMA TIPOS DE FAMILIA.docxPLANEACION DE CLASES TEMA TIPOS DE FAMILIA.docx
PLANEACION DE CLASES TEMA TIPOS DE FAMILIA.docx
 
Guía de Registro slideshare paso a paso 1
Guía de Registro slideshare paso a paso 1Guía de Registro slideshare paso a paso 1
Guía de Registro slideshare paso a paso 1
 
Herramientas que posibilitan la información y la investigación.pdf
Herramientas que posibilitan la información y la investigación.pdfHerramientas que posibilitan la información y la investigación.pdf
Herramientas que posibilitan la información y la investigación.pdf
 
La Electricidad Y La Electrónica Trabajo Tecnología.pdf
La Electricidad Y La Electrónica Trabajo Tecnología.pdfLa Electricidad Y La Electrónica Trabajo Tecnología.pdf
La Electricidad Y La Electrónica Trabajo Tecnología.pdf
 
Documentacion Electrónica en Actos Juridicos
Documentacion Electrónica en Actos JuridicosDocumentacion Electrónica en Actos Juridicos
Documentacion Electrónica en Actos Juridicos
 
Trabajo de tecnología excel avanzado.pdf
Trabajo de tecnología excel avanzado.pdfTrabajo de tecnología excel avanzado.pdf
Trabajo de tecnología excel avanzado.pdf
 
#Tare10ProgramacionWeb2024aaaaaaaaaaaa.pptx
#Tare10ProgramacionWeb2024aaaaaaaaaaaa.pptx#Tare10ProgramacionWeb2024aaaaaaaaaaaa.pptx
#Tare10ProgramacionWeb2024aaaaaaaaaaaa.pptx
 
Modelo de Presentacion Feria Robotica Educativa 2024 - Versión3.pptx
Modelo de Presentacion Feria Robotica Educativa 2024 - Versión3.pptxModelo de Presentacion Feria Robotica Educativa 2024 - Versión3.pptx
Modelo de Presentacion Feria Robotica Educativa 2024 - Versión3.pptx
 
La electricidad y la electronica.10-7.pdf
La electricidad y la electronica.10-7.pdfLa electricidad y la electronica.10-7.pdf
La electricidad y la electronica.10-7.pdf
 
Inteligencia Artificial. Matheo Hernandez Serrano USCO 2024
Inteligencia Artificial. Matheo Hernandez Serrano USCO 2024Inteligencia Artificial. Matheo Hernandez Serrano USCO 2024
Inteligencia Artificial. Matheo Hernandez Serrano USCO 2024
 
El camino a convertirse en Microsoft MVP
El camino a convertirse en Microsoft MVPEl camino a convertirse en Microsoft MVP
El camino a convertirse en Microsoft MVP
 
Red Dorsal Nacional de Fibra Óptica y Redes Regionales del Perú
Red Dorsal Nacional de Fibra Óptica y Redes Regionales del PerúRed Dorsal Nacional de Fibra Óptica y Redes Regionales del Perú
Red Dorsal Nacional de Fibra Óptica y Redes Regionales del Perú
 
Trabajando con Formasy Smart art en power Point
Trabajando con Formasy Smart art en power PointTrabajando con Formasy Smart art en power Point
Trabajando con Formasy Smart art en power Point
 
La tecnología y su impacto en la sociedad
La tecnología y su impacto en la sociedadLa tecnología y su impacto en la sociedad
La tecnología y su impacto en la sociedad
 
David_Gallegos - tarea de la sesión 11.pptx
David_Gallegos - tarea de la sesión 11.pptxDavid_Gallegos - tarea de la sesión 11.pptx
David_Gallegos - tarea de la sesión 11.pptx
 
LUXOMETRO EN SALUD OCUPACIONAL(FINAL).ppt
LUXOMETRO EN SALUD OCUPACIONAL(FINAL).pptLUXOMETRO EN SALUD OCUPACIONAL(FINAL).ppt
LUXOMETRO EN SALUD OCUPACIONAL(FINAL).ppt
 
CommitConf 2024 - Spring Boot <3 Testcontainers
CommitConf 2024 - Spring Boot <3 TestcontainersCommitConf 2024 - Spring Boot <3 Testcontainers
CommitConf 2024 - Spring Boot <3 Testcontainers
 
certificado de oracle academy cetrificado.pdf
certificado de oracle academy cetrificado.pdfcertificado de oracle academy cetrificado.pdf
certificado de oracle academy cetrificado.pdf
 
Análisis de Artefactos Tecnologicos (3) (1).pdf
Análisis de Artefactos Tecnologicos  (3) (1).pdfAnálisis de Artefactos Tecnologicos  (3) (1).pdf
Análisis de Artefactos Tecnologicos (3) (1).pdf
 
Análisis de los artefactos (nintendo NES)
Análisis de los artefactos (nintendo NES)Análisis de los artefactos (nintendo NES)
Análisis de los artefactos (nintendo NES)
 

Funcional para trollear

Notas del editor

  1. Hablamos de que Valencia == Horchata
  2. No hablar de matemáticas, advertir que se puede ser ofensivo sin querer y las excusas que dan los medios
  3. Nombre, que hago, por si quieren insultar, y donde suelo estar por si quieren secuestrar
  4. Objetivos para hacer todo esto
  5. Hablamos que la programación funcional viene de las matemáticas, alonso church lambda calculo
  6. Relax
  7. Hablar que python no es un lenguaje funcional puro, no tunning recursion, mutable, asignacion, etc
  8. Pero no todo esta perdido si tomamos ideas como la inmutabilidad, los side effects, la composicion, funciones de primer orden, lazyness
  9. Mindset que adquieres usando unix, hablar de pipes, filters, tee, etc
  10. Traducion a map y filter del tipico for con un if
  11. Traducion a map y filter del tipico for con un if
  12. Traducion a map y filter del tipico for con un if
  13. Ejemplo de como usar zip, es muy chorra a este nivel
  14. Ejemplo de como usar zip, es muy chorra a este nivel
  15. Chiste en el que hablas de la memoria del ordenador, no precomputar todo y calcular cosas según se piden
  16. Fail
  17. Algebra de iteradores xD
  18. https://github.com/aebm/docker-image-cleaner/blob/master/di_cleaner.py https://github.com/aebm/shuffler/blob/master/shuffler.py https://github.com/aebm/tools/blob/master/es_janitor.py https://github.com/aebm/tools/blob/master/es_cleaner.py