?

Log in

No account? Create an account
He leído el libro Black & White Photography A Basic Manual, tercera edición de Henry Horenstein. Este es un libro desarrollado a partir de la fotografía química o análoga, sin embargo, muchos de los consejos que ahí se entregan aplican a la fotografía digital, sobre todo en terminos de composición fotográfica. Henry Horenstein es un fotógrafo profesional, autor y educador. Sus fotografías han sido exhibidas en todo el mundo y están incluidas en muchas colecciones públicas y privadas, incluyendo el Museo de Bellas Artes, Boston; el Museo Nacional de Historia Americana, Smithsonian Institution; y el Museo de Bellas Artes de Houston. Ha publicado más de treinta libros, incluyendo otros libros de texto (Beyond Basic Photography; Fotografía en color; y, con Russell Hart, Fotografía) y libros de sus propias fotografías (Honky Tonk, Aquatics, Creatures, Canine, Racing Days, y Humans). Es profesor de fotografía en Rhode Island School of Design y vive en Boston, Massachusetts.
Aquí un nano resumen del libro.

Nan Goldin, Ivy in the Boston Garden, 1973

La mayoría de los fotógrafos se enfocan para que el tema sea agudo, pero algunas reglas están hechas para romperse. La imagen de Goldin de una drag queen paseando por un parque de la ciudad se siente como un sueño, precisamente porque está un poco desenfocada. Una imagen más nítida podría transmitir información más detallada, pero carece del del estado de ánimo impresionista. ©Nan Goldin; cortesía de Matthew Marks Gallery, Nueva York, NY.


Elliott Erwitt, New York, 2000

Erwitt es bien conocido por sus tomas ingeniosas en la interacción entre perros y humanos. Las fotografías confraninas exitosas requieren un ojo rápido para las decisiones de detalle y composición rápida. Aquí, Erwitt utiliza la que puede ser su herramienta creativa más importante: sus propios pies. Al colocarse frente a las escaleras y agacharse para asegurarse de que la cámara estuviera a la altura de la cabeza, tanto para el hombre como para el perro, fue capaz de crear esta ilusión óptica humorística. ©Elliott Erwitt; cortesía de Magnum Photos.


Thomas Gearty, Near Columbia, South Carolina, 1995

La mayoría de las cámaras modernas son herramientas muy sofisticadas, pero algunos fotógrafos toman deliberadamente un camino de baja tecnología. Para hacer este paisaje de mal humor, Gearty utilizó un Holga, una cámara de plástico barata conocida por su enfoque suave e imprevisibilidad. Debido a que el Holga tiene un control limitado de enfoque y exposición, permite a los fotógrafos trabajar más espontáneamente con menos preocupación por la técnica. ©Thomas Gearty; cortesía del artista.

John Goodman, Two Wrestlers, Havana, Cuba, 2000

La elección de la velocidad del obturador controla el movimiento del sujeto. Goodman utiliza una velocidad de obturación de 1/4 aquí, lo que significa que el obturador está abierto mientras los luchadores están en movimiento y también la cámara está en movimiento porque esa velocidad es demasiado lenta para sostenerla constantemente. El efecto borroso sirve para mejorar la sensación de intensidad de estos atletas cubanos. ©John Goodman; cortesía de June Bateman Gallery, Nueva York, NY.


Michael Kenna, Hillside Fence, Study 2, Teshikaga, Hokkaido, Japan, 2002

Kenna aporta un estilo atrevido y elegante a todas sus fotografías, ya sea fotografiando un paisaje invernal en Japón o una central eléctrica industrial en Inglaterra. Pero las imágenes simples son a menudo las más difíciles de hacer, especialmente cuando un sujeto es casi todo claro o todo oscuro. Aquí, la capacidad de Kenna para controlar la exposición es clave para hacer que esta imagen mínima sea efectiva. ©Michael Kenna; cortesía del artista.

Christine Osinski, Swimmers, Staten Island, New York, 1987

Los buenos fotógrafos hacen un uso eficaz del marco para componer sus imágenes. Para esta toma de su serie en un equipo de natación sincronizada para mujer, Osinski se centró en la conexión entre dos nadadoras, aislando de una manera que es a la vez divertida y surrealista. © Christine Osinski; cortesía del artista.

Un buen libro, de lectura rápida pues se pueden tomar algunos tips de composición para la fotografía digital, la otra mayor parte del libro no aplica por ser un libro pensado en la fotografía análoga.

Henri Cartier Bresson


En lo que se refiere a fotografía de calle uno de los expoentes que más me gusta es Henri Cartier Bresson (22 de agosto de 1908-3 de agosto de 2004), el es reconocido como el impulsor de la idea de atrapar el instante decisivo y fue catalogado como «el ojo del siglo». Este es sin duda un fotógrafo excepcional y del cual vale la pena contemplar una de sus fotos durante un largo tiempo. A foto aquí publicada es una de mis favoritas.
Una exposición virtual de sus fotografías las pueden encontrar en el sitio web que la agencia Magnum, empresa que él creó, dispone en su memoria (
https://www.magnumphotos.com/photographer/henri-cartier-bresson/)

Marcel Duchamp - Bicycle Wheel

Bicycle Wheel es la primera "readymade" de Duchamp, una clase de objetos que inventó para desafiar suposiciones sobre lo que constituye una obra de arte. Duchamp combinó dos piezas producidas en masa, una rueda y una horquilla de bicicleta y un taburete de cocina, para crear un tipo de máquina no funcional. Simplemente seleccionando objetos prefabricados y llamándolos arte, de esta manera subvirtió las nociones establecidas del arte del artista y la experiencia estética del espectador. La Rueda de Bicicletas de 1913 se perdió, pero casi cuatro décadas más tarde Duchamp ensambló un reemplazo de piezas prefabricadas recién encontradas y afirmó que la versión posterior es tan válida como la original.

Tags:

Criptografía y Ataque del cumpleaños

El ataque de cumpleaños (Birthday Attack en inglés) es un tipo de ataque criptográfico que explota las matemáticas detrás del problema de cumpleaños en la teoría de la probabilidad[1][2].
Consideremos la probabilidad de encontrar un par de personas que compartan el mismo día cumpleaños en una habitación, ignorando los años bisiestos, si hay 366 personas presentes, entonces sucede con certeza, pero ¿y si hay menos personas?. La paradoja establece que para que haya un 50% de posibilidades de que alguien en una habitación determinada comparta la misma fecha de cumpleaños, necesita 253 personas en la habitación. Sin embargo, si está buscando una probabilidad de más del 50% de que dos personas en la habitación tengan el mismo cumpleaños, solo necesita 23 personas.
Esto sucede porque las coincidencias se basan en pares. Si me elijo como un lado del par, entonces necesito un total de 253 personas para llegar al número de 253 pares. En otras palabras, soy yo combinado con otras 253 personas para formar los 253 conjuntos.
Para llevar a cabo el análisis, suponemos que los cumpleaños se distribuyen uniformemente en el conjunto 1,...,365. Para npersonas en una habitación, queremos evaluar la probabilidad de que al menos dos personas compartan el mismo día de cumpleaños. Fije el espacio de la muestra, O, que se compone de tuplas ordenadas (x1,...,xn)con xi pertenece a {1,..., 365}. Por lo tanto, |O|=365n. Ahora establezca el evento Apara que sea el conjunto de todas las tuplas (xi,...,xj)donde xi = xj para algunos distintos iy j.
Ahora consideremos Ac que consiste en tuplas donde xi != xjpara todas las iy jdistintas (el evento de que no hay ningún par de cumpleaños en el grupo). En este caso,

El código siguiente calcula las probabilidades analíticas, así como también los estima a través de la simulación de Monte Carlo. Para las soluciones numéricas, emplea dos implementaciones alternativas, matchExists1()y matchExists2(). Se presenta el error máximo entre las dos implementaciones numéricas.
Uno de los fundamentos de la criptografía moderna es la función hash criptográfica o función hash unidireccional. [3]
Definición: Una función hash es una función computacionalmente eficiente que asigna cadenas binarias de longitud arbitraria a cadenas binarias de cierta longitud fija, denominadas valores hash.
Para una función hash que genera valores hash de n-bit(por ejemplo, n=128 o160) y tiene propiedades particulares, la probabilidad de que una cadena elegida aleatoriamente se asigne a un determinado valor hash nes de 2^-n. La idea básica es que un valor hash sirve como un representante compacto de una cadena de entrada. En criptografía, una función hash hes seleccionada de tal manera que es inviable computacionalmente encontrar dos valores de entrada distintos con el mismo hash, es decir, dos entradas colisionantes xe ytal que h(x)=h(y), y que dado un valor hash específico y, es inviable computacionalmente encontrar una entrada xde tal manera queh(x)=y.
Por lo tanto, Una función hash Hlibre de colisiones es aquella para la cual no es factible computacionalmente encontrar dos mensajes xe ytales que H(x)=H(y).
Los algoritmos de hashing se usan ampliamente en firmas digitales y para integridad de los datos. En las firmas digitales, se aplica un hash a un mensaje largo (texto, archivo) y solo se firma el valor hash. A continuación, el receptor aplica la función hash al mensaje recibido y comprueba que la firma recibida es correcta para este valor hash. Esto ahorra tiempo y espacio en comparación con la firma del mensaje directamente, lo que implicaría dividir el mensaje en bloques de tamaño adecuado y firmar cada bloque individualmente.
Una segunda utilización de los algoritmos de hashing tiene relación con la integridad de datos, en este caso se calcula un valor hash de n-bits para un mensaje de entrada particular, posteriormente el receptor de esa información puede utilizar el mimo hash para comprobar que los datos del archivo no han sido modificados.
Por otra parte, una tercera aplicación de funciones hash es su utilización en protocolos que implican compromisos a priori, incluidos algunos esquemas de firma digital y protocolos de identificación.
La idea del ataque del cumpleaños esencontrar dos valores de entrada distintos con el mismo hash, análogamente, encontrar dos personas que estén de cumpleaños el mismo día[4]. Por otra parte, si, dado que un mensaje x, es computacionalmente inviable encontrar un mensaje yigual a x tal que H(x)=H(y), entonces se dice que Hes una función hash débilmente libre de colisiones.



using StatsBase, Combinatorics, Plots

matchExists1(n) = 1 - prod([k/365 for k in 365:-1:365-n+1])
matchExists2(n) = 1- factorial(365,365-big(n))/365^big(n)

function bdEvent(n)
  birthdays = rand(1:365,n)
  dayCounts = counts(birthdays, 1:365)
  return maximum(dayCounts) > 1
end

probEst(n) = sum([bdEvent(n) for i in 1:N])/N

Grid = 1:50
analyticSolution1 = [matchExists1(n) for n in Grid]
analyticSolution2 = [matchExists2(n) for n in Grid]
println("Maximum error: $(maximum(abs.(analyticSolution1 - analyticSolution2)))")

N = 10^3
mcEstimates = [probEst(n) for n in Grid]
plot(Grid,analyticSolution1,line=(:dot, 3),color=[:red], label=["Analytics Solution" "Probabilidad de colisión"])
plot!(Grid,mcEstimates, line=(:solid, 1),color=[:blue], title="Birthday Attack", legend=:topleft, label=["mc Estimate" "Probabilidad de colisión"])

xlabel!("Numero de hashing en grupo")
ylabel!("Probabilidad de Colision")
savefig("bA.png")

El programa Julia anterior[5]simula una habitación llena de npersonas, y si al menos dos personas comparten un cumpleaños, devuelve true, de lo contrario devuelve false. crea los cumpleaños de matriz de longitud n, y asigna uniforme y aleatoriamente un entero en el intervalo [1, 365] a cada índice. Los valores de esta matriz se pueden considerar como las fechas de nacimiento de personas individuales.crea los cumpleaños de matriz de longitud n, y asigna uniforme y aleatoriamente un entero en el intervalo [1, 365]a cada índice. Los valores de esta matriz se pueden considerar como las fechas de nacimiento de personas individuales, cuenta cuántas veces se produce cada cumpleaños en birthdayy asigna estos recuentos a la nueva matriz dayCounts(Si dos índices tienen el mismo valor, entonces esto representa a dos personas que tienen el mismo cumpleaños) y si al menos dos personas comparten el mismo cumpleaños, devuelve true, de lo contrario false, evalúa las estimaciones de Monte Carlo y las estimaciones analíticas y numéricas de estas probabilidades en el mismo gráfico.
julia> analyticSolution1 = [matchExists1(n) for n in Grid]
50-element Array{Float64,1}:
0.0              
0.002739726027397249
0.008204165884781345
0.016355912466550215
0.02713557369979347
⋮                
0.9547744028332994
0.9605979728794225
0.9657796093226765
0.9703735795779884
julia> analyticSolution2 = [matchExists2(n) for n in Grid]
50-element Array{BigFloat,1}:
0.0                                                                            
0.002739726027397260273972602739726027397260273972602739726027397260273972602739347
0.008204165884781384875211109026083693000562957402889848001501219741039594670671175
0.01635591246655030499952444237655423798959942624615376705902312752398995416652893
0.02713557369979358932829677725461939702532984349277126002275986037304211905237107
⋮                                                                              
0.9547744028332993405868458595468285377693911544897184628044808862488344848447519
0.9605979728794224391962109132490177397552503756924122497858217036359708662483029
0.96577960932267647458958591643818800959565580573834159775919309603452812219373
0.970373579577988399918655204368403865841718450995386150388780872183317497570465
julia> println("Maximum error: $(maximum(abs.(analyticSolution1 - analyticSolution2)))")
Maximum error: 2.461172365062727820892938546467205715971256384764337390231064159958270652057059e-16
julia> N = 10^3
1000
julia> mcEstimates = [probEst(n) for n in Grid]
50-element Array{Float64,1}:
0.0
0.004
0.014
0.019
0.028
0.949
0.958
0.964
0.965

Referencias:
[1]  «Birthday attack in Cryptography», GeeksforGeeks, 10-sep-2018. .
[2]  H. Yoni y Y. Nazarathy, Statistics with Julia: Fundamentals for Data Science, Machine Learning and Artificial Intelligence [DRAFT]. 2019.
[3]  A. J. Menezes, P. C. van Oorschot, y S. A. Vanstone, Handbook of Applied Cryptography, 5 vols. CRC Press, 1996.
[4]  J. Buchmann, Introduction to Cryptography. Springer Science & Business Media, 2004.
[5]  «Tutorial - Plots Julia». [En línea]. Disponible en: http://docs.juliaplots.org/latest/tutorial/. [Accedido: 12-sep-2019].

 

cyber-security-cybersecurity-device-60504.jpg

La NERC en mazo de 2019 alertó de un incidente de seguridad en una compañía eléctrica en la que se explotaba una vulnerabilidad en un firewall no parchado.

"El operador culpó a su fracaso para aplicar las actualizaciones de seguridad del firewall en la falta de un proceso de revisión de firmware adecuado para examinar las actualizaciones de seguridad antes de implementarse. Se estaba trabajando en la estandarización de dicho proceso, pero el procedimiento no había estado listo a tiempo, lo que provocaba que no se revisara ni implementara un cuello de botella de actualizaciones de firmware."

NERC señaló en esa oportunidad que el ataque era grave, sin embargo, ahora señala que en ese momento aumentó el nivel de cricicidad para llamar la atención sobre el hecho a muchas empresas que pueden no estar implementando actualizaciones de firmware de manera oportuna, lo que resulta en agujeros de seguridad que se abren en sus redes.

Sin duda, una buena estrategia, espero que ahora ya la industria haya tomado nota y tengan parchado el Fortinet.

Referencia:
https://www.zdnet.com/article/cyber-security-incident-at-us-power-grid-entity-linked-to-unpatched-firewalls/

Ranking IEEE spectrum

Hace un par de dias un alumno del Diplomado en Ciberseguridad me preguntaba por que habia dejado Python y preferia Julia, di mis razones, facilidad y redimiento como lo principal y le dije que el mundo se movia para alla, no me creyo mucho.
Ahora el ranking IEEE Spectrum myeve a Julia desde el puesto 32 en el 2018 al puesto 23 en 2019, solo un año y un gran avance, creo que no soy el unico que puensa lo mismo.
https://spectrum.ieee.org/static/interactive-the-top-programming-languages-2019

Actividad ilegal

Me contactaron para hacer un hacking ilegal, dije que yo me dedicaba a la Ciberseguridad pero delincuente no era, me preguntaron si conocía a alguien y dije que no conocía a nadie que hiciera cosas ilegales (al menos en mi círculo de contactos, al menos que yo sepa) ¿Pensarán que uno al dedicarse a esto es delincuente?. No me iré preso por espiar un gil que no es capaz de controlar la Tula. Si tiene dudas sepárese de una vez. ¡Eso!.
Shut UP and hack?!!

Tags:

OSSEC en OpenBSD y los malditos de Vimeo

En el 2012 publiqué un video de instalación de ossec en OpenBSD, el video lo publiqué en Vimeo, pero como los muy malditos borraron mi cuenta porque infringía sus malditas políticas de copyrigth tuve que re publicar el video en youtube (entre paréntesis, los muy malditos de Vimeo, no soo borraron los videos con copyrigth, sino que borraron todo, incluidos los videos de creación propia, registros familiares y recuerdos de mis padres, son unos infelices).
Bueno, este video que Youtube ahora tiene solo 44 visitas, como lo incluí en el material de diplomado de ciberseguridad que estoy dictando en usach, debieran aumentar las visitas,
¡eso!
shut up and hack!!

Oda a la mediocridad

Tags:

Coincidencia parcial de contraseñas

Supongamos que una contraseña de un sistema protegido tiene exactamente 8 caracteres de longitud. Cada carácter es uno de los 62 caracteres posibles: las letras 'a'–'z', las letras 'A'–'Z' o los dígitos '0'–'9'. [1]
En este ejemplo, el valor W(omega)sea el conjunto de todas las contraseñas posibles, es decir, 628. Ahora, de nuevo asumiendo una función de probabilidad simétrica, la probabilidad de que un atacante adivine la contraseña correcta (arbitraria) es de 62-8 »4.6 x 10-15. Por lo tanto, a primera vista, el sistema parece muy seguro.
Supongamos también que como parte de la infraestructura de seguridad del sistema, cuando se intenta iniciar sesión con una contraseña que coincide con 1 o más de los caracteres, un evento se registra en el portal de seguridad del sistema (tomando espacio de la unidad). Por ejemplo, supongamos que la contraseña original es ax25U1z8 y se intenta iniciar sesión con la contraseña a25XX1z8. En este caso, 4 de los caracteres coinciden y, por lo tanto, se registra un evento.
Mientras que la posibilidad de adivinar una contraseña e iniciar sesión parece astronómicamente baja, en este sistema simple (ficticio y demasiado simplista), existe un defecto de seguridad secundario. Es decir, los crackers pueden intentar sobrecargar el sistema de registro de eventos a través de ataques aleatorios. Si los crackers intentan iniciar sesión continuamente en el sistema con contraseñas aleatorias, cada contraseña que coincida con uno o más caracteres registrará un evento, ocupando así más espacio en el disco duro.
Ahora preguntamos ¿cuál es la probabilidad de registrar un evento con una contraseña aleatoria? Denote el evento de registro de una contraseña A. En este caso, resulta ser mucho más conveniente considerar el complemento, Ac := W/A, que es el evento que tiene 0 coincidencias de caracteres. Tenemos que|A^c|= 61^8 porque dada cualquier contraseña correcta (arbitraria), hay 61opciones de caracter para cada caracter, con el fin de garantizar Ac espera. Por lo tanto,
P(Ac) = 618/628»0.87802.
A continuación, tenemos que la probabilidad de registrar un evento es P(A) = 1 -P(Ac) ≈ 0.12198. Así que si, por ejemplo, se realizan 107 intentos de inicio de sesión, podemos esperar alrededor de 1.2 millones de intentosde inicio de sesión para ser escrito en el registro de seguridad.
Ahora simulamos un escenario de este tipo en Julia:

using Random
Random.seed!()

passLength, numMatchesForLog = 8, 1
possibleChars = ['a':'z';'A':'Z';'0':'9']

correctPassword = "3xyZu4vN"

#=crea la función numMatch(), que toma la contraseña de un intento de inicio
de sesión y, a través de una comprensión, comprueba cada índice con respecto
a la de la contraseña real. Si el carácter de índice es correcto, evalúa true,
else false. A continuación, la función devuelve cuántos caracteres eran
correctos.
=#

numMatch(loginPassword) =
sum([loginPassword[i] == correctPassword[i] for i in 1:passLength])

N = 10^7

passwords = [String(rand(possibleChars,passLength)) for _ in 1:N]
numLogs = sum([numMatch(p) >= numMatchesForLog for p in passwords])
numLogs, numLogs/N

El código anterior crea una tupla de cuántos intentos de inicio de sesión se registraron posteriormente y la proporción correspondiente del total de intentos de inicio de sesión.

julia> using Random
julia> Random.seed!()
MersenneTwister(UInt32[0x0bbd9b2e, 0x02312645, 0x5a2b4fe9, 0x38084bb4], Random.DSFMT.DSFMT_state(Int32[-277189735, 1073706802, -914187389, 1073520787, -343235986, 1072703639, -1871703905, 1073574060, -1544551239, 1073106991  …  -1546598837, 1073014899, -867875482, 1072823974, -1051295993, 1087688445, -1947020704, -172246429, 382, 0]), passLength, numMatchesForLog = 8, 1
[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], UInt128[0x00000000000000000000000000000000, 0x00000000000000000000000000000000, 0x00000000000000000000000000000000, 0x00000000000000000000000000000000, 0x00000000000000000000000000000000, 0x00000000000000000000000000000000, 0x00000000000000000000000000000000, 0x00000000000000000000000000000000, 0x00000000000000000000000000000000, 0x00000000000000000000000000000000  …  0x00000000000000000000000000000000, 0x00000000000000000000000000000000, 0x00000000000000000000000000000000, 0x00000000000000000000000000000000, 0x00000000000000000000000000000000, 0x00000000000000000000000000000000, 0x00000000000000000000000000000000, 0x00000000000000000000000000000000, 0x00000000000000000000000000000000, 0x00000000000000000000000000000000], 1002, 0)
julia> passLength, numMatchesForLog = 8, 1
(8, 1)
julia> possibleChars = ['a':'z';'A':'Z';'0':'9']
62-element Array{Char,1}:
'a'
'b'
'c'
'd'
'e'
'6'
'7'
'8'
'9'
julia> correctPassword = "3xyZu4vN"
"3xyZu4vN"
julia> numMatch(loginPassword) =
     sum([loginPassword[i] == correctPassword[i] for i in 1:passLength])
numMatch (generic function with 1 method)
julia> N = 10^7
10000000
julia> passwords = [String(rand(possibleChars,passLength)) for _ in 1:N]
numLogs = sum([numMatch(p) >= numMatchesForLog for p in passwords])
numLogs, numLogs/N
10000000-element Array{String,1}:
"ENMjmyNx"
"Yc14DJhC"
"8FgOL8OH"
"5wUdIVFW"
"a80Fe6vu"
⋮    
"DD8FmBWB"
"qrSNkK2W"
"IyUjbtGF"
"ETsEEnON"
julia> numLogs = sum([numMatch(p) >= numMatchesForLog for p in passwords])
1220297
julia> numLogs, numLogs/N
(1220297, 0.1220297)


¡buena!
Shut up and hack!

Referencia:
[1]  H. Yoni y Y. Nazarathy, Statistics with Julia: Fundamentals for Data Science, Machine Learning and Artificial Intelligence [DRAFT]. 2019.

Julia Cookbook

Como ya he declarado antes, me gustan mucho los libros de cocina, porque son simples para aprender conceptos fundamentales y a partir de ahí, profundizar en el conocimiento. Respecto del libro Julia Cookbook[1]de Jalem Raj Rohit cumple con lo que promete, es un libro simple y fácil de entender, tiene algunos errores en el código que te obliga a “picar” en el, pero es lo típico que sucede pues el libro fue escrito para la versión 0.3.2 de Julia y yo estoy usado la versión 1.1.1, esto podría ser una ventaja a la hora del aprendizaje, pero dificulta la resolución de problemas de forma ágil, que es la gracia de los libros de cocina.
Sin embargo, no deja de ser un libro útil y de referencia rápida, pues ayuda a aclarar conceptos de sintaxis que son útiles cuando uno comienza con un nuevo lenguaje de programación, pero si se quiere aprender Machine Learning o Data Science este libro representaría algo así como la primera clase de programación porque no es su objetivo.


Paperback: 172 páginas
Editor: Packt Publishing - ebooks Account (30 de septiembre de 2016)
Idioma: English
ISBN-10: 1785882015
ISBN-13: 978-1785882012
Dimensiones del producto: 19 x 1 x 23.5 cm
Peso del envío: 11.7 ounces (Ver tarifas y políticas de envío)
Calificación promedio de nuestros clientes acerca del producto: 3.0 de un máximo de 5 estrellas   2 opiniones de clientes
Clasificación en los más vendidos de Amazon: nº3,506,972

Autor:
Jalem Raj Rohit Jalem Raj Rohit es un graduado del IIT Jodhpur con un gran interés en el aprendizaje automático, la ciencia de datos, el análisis de datos, las estadísticas computacionales y el procesamiento del lenguaje natural (NLP). Rohit actualmente trabaja como científico de datos senior en Zomato, también habiendo trabajado como el primer científico de datos en Kayako. Forma parte del proyecto Julia, donde desarrolla modelos de ciencia de datos y contribuye al código base. Además, Raj también es colaborador y voluntario de Mozilla, y ha hecho prácticas en Scimergent Analytics.

Referencia:

[1]        J. R. Rohit, Julia Cookbook. Birmingham Mumbai: Packt Publishing - ebooks Account, 2016.
  

Plot imágenes en Julia

Me estoy involucrando en un proyecto que me tiene entusiasmado, este proyecto involucra el procesamiento de imágenes y videos, así que estoy configurando y probando esta funcionalidad en Julia.
La mayor parte de las capacidades de Julia para el procesamiento de imágenes se pueden encontrar en el paquete JuliaImages.
Para instalar este paquete debe entrar al ambiente adecuado escribiendo el caracter ]
Y luego instalar el paquete.

julia>

(v1.1) pkg> add Images
Resolving package versions...
Installed IntervalSets ────────────── v0.3.2
Installed ImageAxes ───────────────── v0.6.0
Installed IdentityRanges ──────────── v0.3.0
Installed Rotations ───────────────── v0.11.1
Installed ImageTransformations ────── v0.8.0
Installed IndirectArrays ──────────── v0.5.0
Installed Images ──────────────────── v0.18.0
Installed AxisArrays ──────────────── v0.3.0
Installed ImageMetadata ───────────── v0.7.1
Installed RangeArrays ─────────────── v0.3.1
Installed ImageShow ───────────────── v0.2.0
Installed ImageDistances ──────────── v0.2.4
Installed ImageMorphology ─────────── v0.2.4
Installed CoordinateTransformations ─ v0.5.0


Esto instala muchas dependencias.

Por otra parte, el paquete TestImages puede ser muy útil a la hora de testear programas pues proporciona un set de imágenes que son estándar, alguna vez escribí sobre las curiosidades de una de las imágenes que se usa para testing de este tipo.



Para cargar imágenes desde este paquete necesitará algunos pre-requisitos y puede escribir por ejemplo:

import Pkg; Pkg.add("TestImages")
import Pkg; Pkg.add("QuartzImageIO")
import Pkg; Pkg.add("ImageView")

julia> using TestImages
julia> img = testimage("cameraman")
julia> plot(img)

Desde REPL todo bien, pero no se por qué imprime las imágenes al reves.

Para cargar archivos de imagen que ya están en su computador, debe utilizar el paquete FileIO:

julia> using FileIO

julia> img = load("/Users/jar/src/julia/lena_color_512.tif")
julia> plot(img)

Luego de solucionar algunos problemas con VSCode, el código también funciona en ese editor.

REPL vs vsCode

pkg> add CairoHe tenido un problema con VSCode, al querer plotear una imagen en Julia, el códido funciona bien en REPL, pero en VScode no grafica y no muestra la imágen:
using Plots, FileIO, ImageView
img = load("/Users/jar/src/julia/lena_color_512.tif")
plot(img)
El probelam se produce en el Pkg ImageView que no funciona porque no es capaz de cargar la librería GTK y libgtk-3:

The error is this:
[ Info: Precompiling ImageView [86fae568-95e7-573e-a6b2-d8a6b900c9ef]
ERROR: LoadError: error compiling top-level scope: could not load library "libgtk-3"
dlopen(libgtk-3.dylib, 1): image not found
Stacktrace:
[1] include at ./boot.jl:326 [inlined]
[2] include_relative(::Module, ::String) at ./loading.jl:1038
[3] include(::Module, ::String) at ./sysimg.jl:29
[4] top-level scope at none:2
[5] eval at ./boot.jl:328 [inlined]
[6] eval(::Expr) at ./client.jl:404
[7] top-level scope at ./none:3
in expression starting at /Users/jar/.julia/packages/Gtk/aP55V/src/Gtk.jl:44
ERROR: LoadError: Failed to precompile Gtk [4c0ca9eb-093a-5379-98c5-f87ac0bbbf44] to /Users/jar/.julia/compiled/v1.1/Gtk/Vjnq0.ji.
Stacktrace:
[1] error(::String) at ./error.jl:33
[2] compilecache(::Base.PkgId, ::String) at ./loading.jl:1197
[3] _require(::Base.PkgId) at ./loading.jl:960
[4] require(::Base.PkgId) at ./loading.jl:858
[5] require(::Module, ::Symbol) at ./loading.jl:853
[6] include at ./boot.jl:326 [inlined]
[7] include_relative(::Module, ::String) at ./loading.jl:1038
[8] include(::Module, ::String) at ./sysimg.jl:29
[9] top-level scope at none:2
[10] eval at ./boot.jl:328 [inlined]
[11] eval(::Expr) at ./client.jl:404
[12] top-level scope at ./none:3
in expression starting at /Users/jar/.julia/packages/ImageView/1uiRS/src/ImageView.jl:5
ERROR: LoadError: Failed to precompile ImageView [86fae568-95e7-573e-a6b2-d8a6b900c9ef] to /Users/jar/.julia/compiled/v1.1/ImageView/4mtgY.ji.
Stacktrace:
[1] error(::String) at ./error.jl:33
[2] compilecache(::Base.PkgId, ::String) at ./loading.jl:1197
[3] _require(::Base.PkgId) at ./loading.jl:960
[4] require(::Base.PkgId) at ./loading.jl:858
[5] require(::Module, ::Symbol) at ./loading.jl:853
[6] include_string(::Module, ::String, ::String) at ./loading.jl:1008
[7] (::getfield(Main._vscodeserver, Symbol("##9#12")){String,Int64,Int64,String})() at /Users/jar/.vscode/extensions/julialang.language-julia-0.12.1/scripts/terminalserver/terminalserver.jl:153
[8] withpath(::getfield(Main._vscodeserver, Symbol("##9#12")){String,Int64,Int64,String}, ::String) at /Users/jar/.vscode/extensions/julialang.language-julia-0.12.1/scripts/terminalserver/repl.jl:62
[9] (::getfield(Main._vscodeserver, Symbol("##8#11")){String,Int64,Int64,String})() at /Users/jar/.vscode/extensions/julialang.language-julia-0.12.1/scripts/terminalserver/terminalserver.jl:152
[10] hideprompt(::getfield(Main._vscodeserver, Symbol("##8#11")){String,Int64,Int64,String}) at /Users/jar/.vscode/extensions/julialang.language-julia-0.12.1/scripts/terminalserver/repl.jl:28
[11] macro expansion at /Users/jar/.vscode/extensions/julialang.language-julia-0.12.1/scripts/terminalserver/terminalserver.jl:148 [inlined]
[12] (::getfield(Main._vscodeserver, Symbol("##7#10")))() at ./task.jl:259
in expression starting at /Users/jar/src/julia/testImages.jl:1

Intenté desinstalando Gtk e Instalando nuevamente y no funciona, tabién intenté con
]build Gtk y tampoco funciona, también con

pkg> add Cairo
pkg> build Cairo

Pero el problema persiste.

La única solución que encontré fue instalar una extensión en VSCode para que grafique en una ventana aparte dentro del programa, tratando de emular el estilo Jupyter.
https://github.com/yzhang-gh/vscode-jupyter
Concuerdo plenamente con lo que dice Simon Wenkel: "es razonable dejar de utilizar Python y avanzar hacia Julia por completo".

Aquí su post https://www.simonwenkel.com/2018/10/05/Julia-for-datascience-machine-learning-and-artificial-intelligence.html
Un buen review de los frameworks para trabajar con DS, ML y AI con Julia.

"Previously, I mentioned that it might be the right time to rethink the choice of programming language(s)especially in the context of AI applications for the physical world/engineering. If it is possible to reach FORTRAN-like computational performances with Julia, then it is reasonable to deprecate Python and move towards Julia entirely.
Where Python is executable pseudocode, Julia is executable math. Models look just like the description in the paper, and you have the full power and simplicity of the Julia language (including control flow, multiple dispatch and macros).
Flux.jl
There are many lists and tutorials out there that refer either to outdated Julia packages with no or limited compatibility with Julia 1.0 or the packages are too shallow for any useful application. Moreover, I missed some description of the packages to avoid checking them all out manually to know what they do. Therefore, I am maintaining this list here. (This list is fluent and will be updated and extended from time to time.)"
Ayer estuve en una reunión en la que se me interrogó insistentemente por la segmentación de redes de control industrial (SCADA/ICS), este es un tema recurrente en la industria, pues el nivel de cumplimiento de estándares no siempre es el adecuado.
Los conceptos de Defensa en Profundidad, que mencioné hace poco en una conferencia sobre SCADA e infraestructura crítica, se centra en la separación de dispositivos, puertos de comunicación, aplicaciones, servicios y otros activos en grupos llamados "Zonas de seguridad". Estas zonas se interconectan a través de "conductos de seguridad" que al igual que el conducto utilizado para albergar y contener alambre y cable, se utilizan para proteger una o más rutas de comunicación o canales. La lógica es simple: al aislar activos en grupos y controlar todo el flujo de comunicaciones dentro y entre grupos, la superficie de ataque de un grupo determinado se minimiza importantemente.
Este concepto se definió originalmente en el Purdue Reference Model for Computer Integrated Manufacturing (CIM), que define la organización jerárquica de los sistemas CIM. El concepto se incorporó más tarde a la ISA-99 como el "Modelo de Zona y Conducto", que más tarde se incorporó al estándar IEC-62443.
Las zonas se pueden definir desde una perspectiva "física" o una "lógica". Las zonas físicas se definen de acuerdo con la agrupación de activos en función de su ubicación física. Las zonas lógicas se agrupan en función de una funcionalidad o característica determinada.
Sin embargo, hay que considerar también que los conductos de seguridad son también un tipo especial de zona que agrupa las "comunicaciones" en una disposición lógica de los flujos de información dentro y entre varias zonas. Los conductos también se pueden organizar de acuerdo con restricciones físicas (cableado de red) y/o lógicas (canales de comunicación).
La idea de este modus operandi es que cuando se implementan correctamente, las zonas y los conductos limitan las comunicaciones de tal manera que cada zona será inherentemente más segura.
Un problema recurrente en el mundo de los ICS es que muchas veces las zonas en este tipo de redes se solo separan en dos o tres zonas (por ejemplo: una zona de sistema de control, una zona de negocio y una DMZ entre las otras dos). Sin embargo, más granulares sean las zonas y los conductos, habrá una mejora correspondiente en la seguridad.


Zonas seguridad por nivel de integración
Industrial Network Security Securing Critical Infrastructure Networks for Smart Grid SCADA and Other Industrial Control Systems
por Eric D. Knapp y Joel Thomas Langill

En EE.UU. por ejemplo, en las plantas nucleares exigen al menos cinco niveles, pero no me referiré a eso porque nunca he trabajado en una planta nuclear, si alguien tiene un proyecto para mi de ese tipo, llámeme, obvio que quiero participar.
La ventaja de segmentar lo más posible las zonas y conductos es que este trabajo ayuda a identificar las áreas en que se debe aplicar controles de seguridad a nivel de host, red y controles de acceso y ayuda a identificar más claramente los vectores de ataque para cada zona. Otra ventaja de la segregación extrema que se propone es que si hay activos que no pueden ser protegidos individualmente con sistemas antimalware o listas blancas de aplicaciones, esos activos se pueden agrupar en una zona especial y las defensas antimalwares se implementan en los conductos de esa zona, esto es muy útil para proteger sistemas heredados como los Windows XP que siempre se encuentran o los SUN Microsystems antiquísimos que me ha tocado ver en algunas instalaciones industriales, pero siempre se debe considerar que cada arquitectura industrial es única, debido a que cada sistema se despliega en un entorno particular (productos finales manufacturados, ubicación geográfica, dotación de personal, etc.) y cómo cada sistema se integra con otros sistemas auxiliares para formar una arquitectura de control industrial completa.
Uno de los mayores desafíos para es establecer zonas de seguridad y conductos adecuados es determinar los requisitos que deben cumplir los activos para colocarse en una zona determinada u otra. Lamentablemente no hay una sola respuesta para esto, pues ya dijimos que todos los ICS son distintos en cada realidad empresarial.
Estos requisitos u objetivos normalmente se pueden desglosar en dos categorías amplias. La primera se basa en las comunicaciones y en la forma en que cada activo interactúa con otros activos fuera de una zona determinada y la otra está determinada por el acceso físico que estos activos tienen.
A nivel de comunicaciones podemos considerar por ejemplo a un ingeniero de procesos que trabaja con un equipo en su oficina y otro computador en la sala de control, este usuario (considerado como activo) ¿de qué "zona" es miembro? ¿O este usuario es un "conducto" entre zonas?. Por otra parte, también hay activos que estando conectados a una red industrial proporcionan la capacidad para el intercambio de información. Esta comunicación puede designarse como "local" o dentro de la misma zona y al mismo tiempo "remoto" o fuera de la zona.
Otra forma de clasificar los activos dentro de una misma zona es su disposición física, Por ejemplo, en una sala de control pueden convivir operadores de planta, técnicos e ingenieros de sistemas, sin embargo, no todos tienen el mismo nivel de confianza, por ende, no tienen el mismo nivel de acceso, esto puede llevar a la necesidad de generar zonas segregadas para mantener la seguridad en sus respectivos niveles de confianza.
Al evaluar la red e identificar zonas potenciales, se debe incluir todos los activos (dispositivos físicos), sistemas (dispositivos lógicos como software y aplicaciones), usuarios, protocolos y otros elementos. Por ejemplo, considere dos activos, si estos se pueden separar sin afectar a la función principal de ninguno de los elementos, entonces considere ponerlos en dos grupos funcionales distintos. Por ejemplo, si algunos sistemas SCADA utilizan el protocolo DNP3, cree una lista de todos los dispositivos que se comunican actualmente a través de DNP3. Evalúe a cada uno para ver si DNP3 es necesario para su función o no. Si no es así, elimínelo del grupo funcional y, si es posible, deshabilite también el protocolo no utilizado en el servidor SCADA. El resultado será una lista de todos los activos que realmente utilizan ese protocolo.
Del mismo modo, considere qué activos están conectados entre sí en la red, tanto física como lógicamente. Cada uno representa un grupo funcional basado en la conectividad de red y el flujo de datos. Una vez más, evalúe cada elemento individualmente, y si no necesita pertenecer al grupo, elimínelo de él.
Un grupo funcional puede basarse en casi cualquier cosa. Los grupos funcionales comunes a tener en cuenta al definir zonas en redes industriales incluyen Seguridad, Control Básico de Procesos, Controles de Supervisión, Procesos de Control Punto a Punto, Control de Datos almacenados, Comunicaciones Comerciales, Acceso Remoto, capacidad de parchado, redundancia, protección contra malware y capacidad de autenticación. Se pueden considerar otros grupos, como grupos de usuarios y grupos de protocolos industriales etc.
Sin duda, es una tarea larga de enfrentar, pero una vez concluida los beneficios son tangibles y duraderos, ya profundizaré en otros conceptos en otra oportunidad, ahora ya le dediqué mucho tiempo a esto.
Shut ap and hack!

Network Analysis Using Wireshark Cookbook

Wireshark es, definitivamente, el estándar del mercado para el análisis de redes y el análisis de redes TCP/IP en particular y es muy popular para solución de problemas y para entender lo que realmente está sucediendo a través de la red y cuáles son los problemas que pueden existir.






Network Analysis Using Wireshark Cookbook de Yoram Orzach
Paperback: 452 pages
Publisher: Packt Publishing (December 24, 2013)
Language: English
ISBN-10: 1849517649
ISBN-13: 978-1849517645




Como señalé en post anterior sobre libros por mi trabajo he tenido que leer muchos libros, uno de ellos es el libro Network Analysis Using Wireshark Cookbook de Yoram Orzach, un fantástico libro de cocina que, como tal, es una referencia rápida y muy práctica para trabajar con Wireshark en todo tipo de redes. Sin embargo, tiene algo que lo hace diferente de otros libros de cocina, además de indicar el problema específico  como trabajarlo con Wireshark proporciona los fundamentos teóricos, con el fin de dar al lector los antecedentes teóricos requeridos.
El contenido pasa por una buena introducción de las funciones básicas de Wireshark, filtros, display filters, herramientas básicas y avanzadas de estadística, Ethernet, LAN Switching, and Wireless LAN, análisis ARP y IP, análisis de tráfico TCP/UDP, HTTP, DNS, troubleshoting, multimedia y un apartado sobre seguridad en redes que está muy interesante.
En resumen, este ha sido uno de los libros más utiles sobre redes que he podido leer en este último tiempo.
 

Tags:

La bici es el mejor invento del mundo, siempre he pensado que los ecologistas están cambiando la contaminación atmosférica por la contaminación del agua, pues las baterías eléctricas y otros materiales de estos vehículos eléctricos solo provocarán una transformación en las futuras preocupaciones ambientales.


En cualquier discusión sobre la seguridad cibernética industrial, siempre va a haber objeciones de algunas personas que se basan en percepciones erróneas. Las más comunes son:

  1. La ciberseguridad de las redes industriales no es necesaria. Este mito proviene de la creencia de que cualquier cosa que suceda en IT no aplica para OT. Esto simplemente no es cierto. Si bien la segmentación de redes es un método valioso para establecer zonas de seguridad y mejorar la seguridad, la separación absoluta de las redes es prácticamente imposible de obtener. Siempre existen sistemas que admiten puertos de diagnóstico inalámbricos, medios extraíbles que se pueden operar manualmente, etc. Este mito también supone que todas las amenazas se originan fuera de la red industrial, y no aborda el riesgo de la información privilegiada y el impacto resultante de un evento cibernético en el ICS de un usuario autorizado.

  2. La seguridad industrial es imposibile. La seguridad requiere parches. Los dispositivos deben ser parcheados para protegerlos contra la explotación de una vulnerabilidad descubierta, y los sistemas antivirus necesitan actualizaciones regulares. Los entornos de control no pueden soportar ciclos de parches adecuados, lo que hace que las medidas de seguridad cibernética sean discutibles. Si bien es cierto que se trata de desafíos a los que se enfrentan los ICS, no significa que una postura de seguridad fuerte no se puede obtener a través de otros controles compensadores. La seguridad industrial requiere una base de gestión de riesgos y una comprensión del ciclo de vida de la seguridad.

  3. La seguridad cibernética es responsabilidad de otra persona. Este es muy típico en muchas empresas, sobre todo cuando no se establecen las políticas de responsabilidades adecuadas, el paso de la pelota cuando hay dificultades el lo primero que suelen hacer. Los gerentes operativos de la planta esperan que los gerentes de TI adopten la responsabilidad (y el presupuesto) para la seguridad cibernética o biceversa. La Ciberseguridad debe estar considerada en los niveles ejecutivos más altos en una organización debidamente estructurada, y las responsabilidades apropiadas se reducirán tanto a TI como a OT según sea necesario, para que puedan trabajar en conjunto, la seguridad cibernética es un problema integral que requiere una solución integral.

  4. Es lo mismo que la seguridad cibernética "IT". Esta es otra percepción errónea común que a veces puede dividir los grupos de operaciones de TI y planta dentro de una organización. El solo hecho de que las redes OT tangan el mismo ethernet no significa que la ciberseguridad deba ser tratada de la misma manera. Como señalé en una conferencia de INACAP este año, los protocolos SCADA/ICS tienen particularidades especiales que no permiten que el mismo firewall y el mismo IDS/IPS funcionen adecuadamente en ambos ambientes. Las redes industriales y empresariales son diferentes, y requieren diferentes medidas de seguridad para protegerlas adecuadamente.

Modo twitter

Inauguraré el modo twitter, es decir, publicaré lo que pienso como si fuera twitter, asi le doy un uso mas intensivo a la app de Livejournal, por otra parte, a veces he usado LinkedIn en ese modo, pero cuando uno busca empleo no es muy buena idea.
Pensaba abrir una cuenta en twitter, pero como esa red es un gallinero, me da lata crear una cuenta y publicar.
Todas las publicaciones con hashtag twitter quedaran públicas solo para los que estan como amigos en Livejournal.

Tags:

pyplot en Julia

Por estos días estuve pegado en un roblema de plot en Julialang utiizando la librería pyplot de python, anteriormente trabajé con otra librería de ploting, pero ahora estoy leyendo el libro Statistics With Julia [DRAFT] de Hayden Klok, Yoni Nazarathy.
El libro está increible, pero tiene algunos problemas, pues seguramente cuando lo escribieron aún utilizaban una versión anterior de pyplot y que ahora hay algunas sentencias deprecadas.
La Actividad 10 “Listing 1.10: Histogram of hailstone sequence lengthsme arrojaba el siguiente error:

┌ Warning: `getindex(o::PyObject, s::Symbol)` is deprecated in favor of dot overloading (`getproperty`) so elements should now be accessed as e.g. `o.s` instead of `o[:s]`.
│   caller = top-level scope at none:0
└ @ Core none:0

Erroneamente yo buscaba el problema en la linea 3, pero no, gracias a la ayuda de kristoffer.carlsson en el foro de Julia, al código comenzó a funcionar, pero la corrección se debía hacer en 18 (Thanks Kriss).

Aquí el código:

using PyPlot

function hailLength(x::Int)
   n=0
    while x != 1
        if x % 2 == 0
           x = Int(x/2)
        else
           x = 3x +1
        end
           n += 1
    end
    return n
end

lengths = [hailLength(x0) for x0 in 2:10^7]
plt[:hist](lengths, 1000, normed="true") #deprecated code
plt.hist(lengths, 1000, density="true")
xlabel("Length")
ylabel("Frequency");

Ahora, lo curioso es que el código funciona en la consola REPL, pero en VS Code no funciona, no se por qué, eso lo tengo que averiguar mañana, porque ya es muy tarde hoy.

REPL
julia> using PyPlot

julia> function hailLength(x::Int)
          n=0
          while x != 1
              if x % 2 == 0
                  x = Int(x/2)
              else
                  x = 3x +1
              end
                  n += 1
          end
          return n
      end
hailLength (generic function with 1 method)

julia> lengths = [hailLength(x0) for x0 in 2:10^7]
9999999-element Array{Int64,1}:
  1
  7
  2
  5
  8
16
  3
19
  6
14
  
114
114
114
114
163
163
163
220
145

julia> plt.hist(lengths, 1000, density="true")
([1.46199e-7, 1.46199e-7, 1.46199e-7, 0.0, 1.46199e-7, 2.92398e-7, 0.0, 2.92398e-7, 5.84795e-7, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.46199e-7], [1.0, 1.684, 2.368, 3.052, 3.736, 4.42, 5.104, 5.788, 6.472, 7.156  …  678.844, 679.528, 680.212, 680.896, 681.58, 682.264, 682.948, 683.632, 684.316, 685.0], PyCall.PyObject[PyObject <matplotlib.patches.Rectangle object at 0x13d954a90>, PyObject <matplotlib.patches.Rectangle object at 0x124e74668>, PyObject <matplotlib.patches.Rectangle object at 0x13d954d68>, PyObject <matplotlib.patches.Rectangle object at 0x13d960400>, PyObject <matplotlib.patches.Rectangle object at 0x13d960748>, PyObject <matplotlib.patches.Rectangle object at 0x13d960a90>, PyObject <matplotlib.patches.Rectangle object at 0x13d960dd8>, PyObject <matplotlib.patches.Rectangle object at 0x13d960ef0>, PyObject <matplotlib.patches.Rectangle object at 0x13d96b4a8>, PyObject <matplotlib.patches.Rectangle object at 0x13d96b7f0>  …  PyObject <matplotlib.patches.Rectangle object at 0x14737ddd8>, PyObject <matplotlib.patches.Rectangle object at 0x14737def0>, PyObject <matplotlib.patches.Rectangle object at 0x1473884a8>, PyObject <matplotlib.patches.Rectangle object at 0x1473887f0>, PyObject <matplotlib.patches.Rectangle object at 0x147388b38>, PyObject <matplotlib.patches.Rectangle object at 0x147388e80>, PyObject <matplotlib.patches.Rectangle object at 0x147388f98>, PyObject <matplotlib.patches.Rectangle object at 0x147392550>, PyObject <matplotlib.patches.Rectangle object at 0x147392898>, PyObject <matplotlib.patches.Rectangle object at 0x147392be0>])

julia> xlabel("Length")
PyObject Text(0.5, 23.52222222222222, 'Length')

julia> ylabel("Frequency");

julia>

Sindicar

RSS Atom

Perfil

deoxyt2
Juan Rodrigo Anabalón R.
Website

Acerca de mi

He estado escribiendo sobre temas de seguridad en Livejournal desde el 2008 y en mi horrible y extinto MSN Spaces desde el 2006. En la actualidad, soy CISO en MonkeysLab y Presidente en ISSA Chile.




MonkeysLab




Copyleft

Copyleft: Atribuir con enlace.







Flickr


ISSA Chile



contador de visitas


contadores gratis

Último mes

September 2019
S M T W T F S
1234567
891011121314
15161718192021
22232425262728
2930     

Tags

Powered by LiveJournal.com
Designed by Lilia Ahner