Translate
miércoles, 26 de febrero de 2020
martes, 25 de febrero de 2020
Generar sitios estáticos con Hugo
Hugo es uno de los generadores de sitios estáticos de código abierto más populares. Con su sorprendente velocidad y flexibilidad, Hugo hace que la creación de sitios web sea divertido.
Homebrew, un administrador de paquetes para macOS y linux, se puede instalar desde brew.sh. Luego de instalar brew
brew install hugo
Para verificar su nueva instalación:
hugo version
Ahora podemos crear el sitio :
hugo new site quickstart
cd quickstart
git init
git submodule add https://github.com/budparr/gohugo-theme-ananke.git themes/ananke
El tema lo podemos descargar desde: https://github.com/budparr/gohugo-theme-ananke/archive/master.zip si no queremos usar git. Extraemos ese archivo .zip para obtener un directorio "gohugo-theme-ananke-master". Luego cambiamos el nombre de ese directorio a "ananke" y lo movemos al directorio "themes /".
Luego, agregue el tema a la configuración del sitio:
echo 'theme = "ananke"' >> config.toml
Ahora agregamos el contenido :
Se puede crear archivos de contenido manualmente (por ejemplo, como contenido / <CATEGORY> / <FILE>. <FORMAT>) y proporcionar metadatos en ellos, sin embargo, puede usar un comando:
hugo new posts/my-first-post.md
Edite el archivo de contenido recién creado si lo desea, comenzará con algo como esto:
---
title: "My First Post"
date: 2019-03-26T08:47:11+01:00
draft: true
---
Ahora, vamos a iniciar el servidor Hugo:
hugo server -D
| EN
+------------------+----+
Pages | 10
Paginator pages | 0
Non-page files | 0
Static files | 3
Processed images | 0
Aliases | 1
Sitemaps | 1
Cleaned | 0
Total in 11 ms
Watching for changes in /Users/bep/quickstart/{content,data,layouts,static,themes}
Watching for config changes in /Users/bep/quickstart/config.toml
Environment: "development"
Serving pages from memory
Running in Fast Render Mode. For full rebuilds on change: hugo server --disableFastRender
Web Server is available at http://localhost:1313/ (bind address 127.0.0.1)
Press Ctrl+C to stop
Podemos navegar en http://localhost:1313/
Podemos editar o agregar contenido nuevo y luego simplemente actualizar el navegador para ver los cambios.
Cuando el sitio este listo, debemos cambiar las configuraciones. Debemos editar config.toml y cambiar los valores:
baseURL = "https://example.org/"
languageCode = "en-us"
title = "My New Hugo Site"
theme = "ananke"
Además, si ya tenemos un dominio listo, podemos configurar baseURL. Tenga en cuenta que este valor no es necesario cuando se ejecuta el servidor de desarrollo local.
Luego debemos reconstruir nuestro sitio con:
hugo -D
La salida estará en el directorio ./public/ de forma predeterminada (-d / - marca de destino para cambiarlo, o establecer publicar dir en el archivo de configuración).
Dejo link: https://gohugo.io/
lunes, 24 de febrero de 2020
ZIO
ZIO es una biblioteca Scala de dependencia cero para programación asincrónica y concurrente. Y tiene un logo muuuuyyyy copado...
Su filosofía esta basada en fibras (que son como hilos de ejecución) altamente escalables y sin bloqueo que nunca desperdician ni pierden recursos, ZIO permite crear aplicaciones escalables, resistentes y reactivas que satisfagan las necesidades de su negocio. Entre las características podemos nombrar:
Su filosofía esta basada en fibras (que son como hilos de ejecución) altamente escalables y sin bloqueo que nunca desperdician ni pierden recursos, ZIO permite crear aplicaciones escalables, resistentes y reactivas que satisfagan las necesidades de su negocio. Entre las características podemos nombrar:
- Alto rendimiento.
- Tipe-safe.
- Concurrente.
- Asincrónico.
- Seguridad en los recursos.
- Probable
- Elástico.
- Funcional.
Antes de empezar debemos incluir a ZIO en el proyecto agregando la siguiente entrade en el build.sbt:
libraryDependencies += "dev.zio" %% "zio" % "1.0.0-RC17"
Si deseamos utilizar streams ZIO, también debe incluir la siguiente dependencia:
libraryDependencies += "dev.zio" %% "zio-streams" % "1.0.0-RC17"
Ahora veamos un pequeño ejemplo:
import zio.App
import zio.console._
object MyApp extends App {
def run(args: List[String]) =
myAppLogic.fold(_ => 1, _ => 0)
val myAppLogic =
for {
_ <- putStrLn("Hello! What is your name?")
name <- getStrLn
_ <- putStrLn(s"Hello, ${name}, welcome to ZIO!")
} yield ()
}
run debería devolver un valor ZIO que tenga todos sus errores manejados,
Como se puede ver myAppLogic, se plegó de tal forma que produce un valor si falla, habrá un 1; pero si tiene éxito, habrá un 0.
Si está integrando ZIO en una aplicación existente, utilizando inyección de dependencia, o no controla su función principal main, se puede crear un sistema de tiempo de ejecución para ejecutar sus programas ZIO:
import zio._
import zio.console._
object IntegrationExample {
val runtime = new DefaultRuntime {}
runtime.unsafeRun(putStrLn("Hello World!"))
}
ZIO proporciona un módulo para interactuar con la consola. Puede importar las funciones en este módulo con el siguiente fragmento de código:
import zio.console._
Si necesita imprimir texto en la consola, puede usar putStr y putStrLn:
// Print without trailing line break
putStr("Hello World")
// res8: ZIO[Console, Nothing, Unit] = zio.ZIO$Read@2ba3e0d1
// Print string and include trailing line break
putStrLn("Hello World")
// res9: ZIO[Console, Nothing, Unit] = zio.ZIO$Read@75e3acfe
Si necesita leer la entrada desde la consola, puede usar getStrLn:
val echo = getStrLn flatMap putStrLn
// echo: ZIO[Console, java.io.IOException, Unit] = zio.ZIO$FlatMap@72bc78be
Es importante utilizar la consola de zio porque cada fibra tiene sus propios recursos, y la consola de Zio soluciona la interacción con la consola.
Dejo link : https://zio.dev/
viernes, 21 de febrero de 2020
Machine Learning. Curso básico de Machine Learning Gratis!!!
Quiero recomendar este curso gratuito de Machine Learning, donde aprenderas a usar Numpy, Pandas, Seaborn, Matplotlib, Plotly y Sckit-Learn con Python.
Entre los temas tenemos:
- Usar Python para Machine Learning y Data Science
- Implementar algoritmos de Machine Learning
- Usar Scikit-learn, el módulo más utilizado para Machine Learning
- Usar Plotly para hacer gráficos interactivos
- Aprender Numpy para el procesamiento numérico
- Aprender a usar Matplotlib para hacer gráficos con los datos
- Aprender Regresión Lineal para Machine Learning
- Aprender Regresión Logística para Machine Learning
- Aprender Random Forest para Machine Learning
- Aprender a contruir árboles de decisión para el aprendizaje de máquinas
Dejo link : https://www.udemy.com/course/curso-machine-learning/?fbclid=IwAR12pEVsdyfhcG-Aa35QOWFmgL2ATMhgEYPLF5WEACauP4a8G99RsVo9WMg
Kubernetes
Kubernetes es una plataforma de orquestación de contenedores. El origen de Kubernetes se remonta al data center de google. Todo comenzó con la plataforma llamada Borg. Borg era utilizado para la orquestación de aplicaciones. En 2014 google decide hacer open source a Borg con el nombre de “Kubernetes” que no es el más fácil de pronunciar pero así es google. En 2015, Kubernetes fue el primer proyecto donado a una joven organización llamada Cloud Native Computing Foundation. (CNCF)
De esta manera Kubernetes comenzó a tener cada vez más relevancia y su comunidad crecía rápidamente. Hoy en día, kubernetes es uno de los proyectos con más crecimiento en Github y se convirtió en una de las plataformas más utilizadas para orquestación de containers.
Kubernetes ofrece un conjunto de primitivas distribuidas y técnicas de encapsulamiento para la creación de aplicaciones automatizables. Kubernetes ofrece un entorno de administración centrado en contenedores. Kubernetes orquesta la infraestructura de cómputo, redes y almacenamiento para que las cargas de trabajo de los usuarios no tengan que hacerlo. Esto ofrece la simplicidad de las Plataformas como Servicio (PaaS) con la flexibilidad de la Infraestructura como Servicio (IaaS) y permite la portabilidad entre proveedores de infraestructura.
Por ahora eso es todo...
Dejo links:
https://kubernetes.io
https://cloud.google.com/kubernetes/
De esta manera Kubernetes comenzó a tener cada vez más relevancia y su comunidad crecía rápidamente. Hoy en día, kubernetes es uno de los proyectos con más crecimiento en Github y se convirtió en una de las plataformas más utilizadas para orquestación de containers.
Kubernetes ofrece un conjunto de primitivas distribuidas y técnicas de encapsulamiento para la creación de aplicaciones automatizables. Kubernetes ofrece un entorno de administración centrado en contenedores. Kubernetes orquesta la infraestructura de cómputo, redes y almacenamiento para que las cargas de trabajo de los usuarios no tengan que hacerlo. Esto ofrece la simplicidad de las Plataformas como Servicio (PaaS) con la flexibilidad de la Infraestructura como Servicio (IaaS) y permite la portabilidad entre proveedores de infraestructura.
Por ahora eso es todo...
Dejo links:
https://kubernetes.io
https://cloud.google.com/kubernetes/
Libros de Java Code Geeks
Download IT Guides!
jueves, 20 de febrero de 2020
Guía de Raku en castellano
Quiero compartir esta pagina que es una guía rápida del lenguaje de programación Raku.
Para los novatos en Raku sería un punto de partida y puesta en marcha.
Y como todo buen tutorial comienza con un "Hola Mundo" :
say 'hola mundo';
que también puede escribirse como:
'hola mundo'.say;
Dejo link: https://raku.guide/es/
Para los novatos en Raku sería un punto de partida y puesta en marcha.
Y como todo buen tutorial comienza con un "Hola Mundo" :
say 'hola mundo';
que también puede escribirse como:
'hola mundo'.say;
Probar distribuciones linux sin instalarlas con DistroTest
Me gusta mucho probar distros de linux, por suerte ahora todo es más fácil con DistroTest. Es una pagina donde se lintan las dindtros, eliges una y las podes acceder por VNC. Sin instalar nada.
No más instalación!!!
Dejo link: https://distrotest.net/
lunes, 17 de febrero de 2020
El lenguaje de programación V, Parte 9
Seguimos con V
El modelo de concurrencia de V es muy similar a Go. Para ejecutar una función de modo concurrente simplemente se debe llamar con go foo (). En estos momentos se esta trabajando en rutinas y en un planificador.
Si queremos probar nuestro codigo podemos hacerlo :
// hello.v
fn hello() string {
return 'Hello world'
}
// hello_test.v
fn test_hello() {
assert hello() == 'Hello world'
}
Todas las funciones de prueba deben colocarse en archivos * _test.v y comenzar con test_.
Para ejecutar las pruebas, haga v hello_test.v. Para probar un módulo completo, haga v test mymodule.
Algo importante es que la palabra clave assert también se puede utilizar fuera de las pruebas.
Esto fue todo de V, si me piden una opinión es una buena combinación de Go y Rust. Que eso es bueno, pero no aporta mucho al mundo de la programación.
Dejo link: https://vlang.io/
El modelo de concurrencia de V es muy similar a Go. Para ejecutar una función de modo concurrente simplemente se debe llamar con go foo (). En estos momentos se esta trabajando en rutinas y en un planificador.
Si queremos probar nuestro codigo podemos hacerlo :
// hello.v
fn hello() string {
return 'Hello world'
}
// hello_test.v
fn test_hello() {
assert hello() == 'Hello world'
}
Todas las funciones de prueba deben colocarse en archivos * _test.v y comenzar con test_.
Para ejecutar las pruebas, haga v hello_test.v. Para probar un módulo completo, haga v test mymodule.
Algo importante es que la palabra clave assert también se puede utilizar fuera de las pruebas.
Esto fue todo de V, si me piden una opinión es una buena combinación de Go y Rust. Que eso es bueno, pero no aporta mucho al mundo de la programación.
Dejo link: https://vlang.io/
sábado, 15 de febrero de 2020
El lenguaje de programación Raku
Hice un post de Raku, pero no mostré nada de código y quedo bastante incompleto. Por eso la idea de este post es mostrar un poco más. Vamos hacer una función que retorne el ultimo elemento de una lista :
use v6;
sub last-elem(@list) {
@list[* - 1];
}
say last-elem(<a b c d e>);
nos retornará "e" veamos otro ejemplo, ahora vamos a retornar los 2 últimos elementos :
use v6;
sub last-two(@list)
{
@list[* - 2, * - 1];
}
say "{last-two(<a b c d e>)}";
nos retornará "d" y "e", vamos hacer una función que busque un elemento por un indice pasado por parámetro :
use v6;
sub get-at(@list, $elem)
{
@list[$elem];
}
say get-at(<a b c d e>, 4);
nos retornará "e" veamos otro ejemplo, ahora vamos a retornar una lista de reversa :
use v6;
sub reverse-list(@list)
{
@list.reverse;
}
say "{reverse-list(<a b c d e>)}";
va retornar "e d c b a"
Por ultimo vamos a hacer una función que retorne n números :
use v6;
sub lotto-select($n, $m)
{
gather for ^$n
{
take (1 ... $m).pick(1).first;
}
}
say "{lotto-select(6, 49)}";
A mi entender tantos símbolos como @, $, etc, hacen difícil leer el codigo, sobre todo a las personas que no venimos de Perl
Dejo link: https://examples.p6c.dev/index.html
use v6;
sub last-elem(@list) {
@list[* - 1];
}
say last-elem(<a b c d e>);
nos retornará "e" veamos otro ejemplo, ahora vamos a retornar los 2 últimos elementos :
use v6;
sub last-two(@list)
{
@list[* - 2, * - 1];
}
say "{last-two(<a b c d e>)}";
nos retornará "d" y "e", vamos hacer una función que busque un elemento por un indice pasado por parámetro :
use v6;
sub get-at(@list, $elem)
{
@list[$elem];
}
say get-at(<a b c d e>, 4);
nos retornará "e" veamos otro ejemplo, ahora vamos a retornar una lista de reversa :
use v6;
sub reverse-list(@list)
{
@list.reverse;
}
say "{reverse-list(<a b c d e>)}";
va retornar "e d c b a"
Por ultimo vamos a hacer una función que retorne n números :
use v6;
sub lotto-select($n, $m)
{
gather for ^$n
{
take (1 ... $m).pick(1).first;
}
}
say "{lotto-select(6, 49)}";
A mi entender tantos símbolos como @, $, etc, hacen difícil leer el codigo, sobre todo a las personas que no venimos de Perl
Dejo link: https://examples.p6c.dev/index.html
jueves, 13 de febrero de 2020
Libros de Java Code Geeks
|
martes, 11 de febrero de 2020
Perl 6, mejor conocido como Raku
A Perl 6 le metieron tantos cambios que lo más coherente era llamarlo de otra manera y de esta forma nace Raku.
Raku tiene la intención de llevar adelante los altos ideales de la comunidad Perl. Raku ha sido desarrollado por un equipo de voluntarios dedicados y entusiastas, y continúa desarrollándose.
Raku se ve altamente influido por la programación funcional, de esta manera, tiene clausuras, lazy evaluation, patter matching.
Programación orientada a objetos tambien se hace presente y incluye genéricos, roles y polimorfismo.
Paralelismo, concurrencia y asincronía, tambien incluido el soporte multinúcleo
Gramáticas definibles para la coincidencia de patrones y el procesamiento de cadenas generalizado
Mecanografía opcional y gradual
Dejo link : https://www.raku.org/
Raku tiene la intención de llevar adelante los altos ideales de la comunidad Perl. Raku ha sido desarrollado por un equipo de voluntarios dedicados y entusiastas, y continúa desarrollándose.
Raku se ve altamente influido por la programación funcional, de esta manera, tiene clausuras, lazy evaluation, patter matching.
Programación orientada a objetos tambien se hace presente y incluye genéricos, roles y polimorfismo.
Paralelismo, concurrencia y asincronía, tambien incluido el soporte multinúcleo
Gramáticas definibles para la coincidencia de patrones y el procesamiento de cadenas generalizado
Mecanografía opcional y gradual
Dejo link : https://www.raku.org/
lunes, 10 de febrero de 2020
El lenguaje de programación V, Parte 8
Seguimos con V
V puede manejar datos nulos con resultados opcionales :
struct User {
id int
name string
}
struct Repo {
users []User
}
fn new_repo() Repo {
return Repo {
users: [User{1, 'Andrew'}, User {2, 'Bob'}, User {10, 'Charles'}]
}
}
fn (r Repo) find_user_by_id(id int) ?User {
for user in r.users {
if user.id == id {
return user
}
}
return error('User $id not found')
}
fn main() {
repo := new_repo()
user := repo.find_user_by_id(10) or { // Los tipos de opciones deben manejarse mediante bloques `or`
return // El bloque `or` debe terminar con` return`, `break` o` continue`
}
println(user.id) // "10"
println(user.name) // "Charles"
}
V combina Opcionales y Resultado en un solo tipo, por lo que no necesita decidir cuál usar.
Si no necesita devolver un error, simplemente puede devolver none.
Esta es la forma principal de manejar los errores en V. Es similar a Go, pero la ventaja es que los errores pueden ser manejados, y manejarlos es mucho menos complicado.
err se define dentro de un bloque or y se establece el mensaje de error. err está vacío si no se devolvió algún error.
user := repo.find_user_by_id(7) or {
println(err) // "User 7 not found"
return
}
También puede propagar errores:
resp := http.get(url)?
println(resp.body)
http.get devuelve? http.Response. Se llamó con?, Por lo que el error se propaga a la función de llamada (que debe devolver un opcional) o en caso de que los cables principales entren en pánico.
Básicamente, el código anterior es una versión más corta de
resp := http.get(url) or {
panic(err)
}
println(resp.body)
V no tiene una forma de forzar el desenvolvimiento de un opcional (como el desenvolvimiento de Rust () o el de Swift). Tienes que usar o {panic (err)} en su lugar.
V también tienen generics :
struct Repo<T> {
db DB
}
fn new_repo<T>(db DB) Repo<T> {
return Repo<T>{db: db}
}
// Esta es una función genérica.
fn (r Repo<T>) find_by_id(id int) ?T {
table_name := T.name // en este ejemplo, obtener el nombre del tipo nos da el nombre de la tabla
return r.db.query_one<T>('select * from $table_name where id = ?', id)
}
db := new_db()
users_repo := new_repo<User>(db)
posts_repo := new_repo<Post>(db)
user := users_repo.find_by_id(1)?
post := posts_repo.find_by_id(1)?
Dejo link: https://vlang.io/
V puede manejar datos nulos con resultados opcionales :
struct User {
id int
name string
}
struct Repo {
users []User
}
fn new_repo() Repo {
return Repo {
users: [User{1, 'Andrew'}, User {2, 'Bob'}, User {10, 'Charles'}]
}
}
fn (r Repo) find_user_by_id(id int) ?User {
for user in r.users {
if user.id == id {
return user
}
}
return error('User $id not found')
}
fn main() {
repo := new_repo()
user := repo.find_user_by_id(10) or { // Los tipos de opciones deben manejarse mediante bloques `or`
return // El bloque `or` debe terminar con` return`, `break` o` continue`
}
println(user.id) // "10"
println(user.name) // "Charles"
}
V combina Opcionales y Resultado en un solo tipo, por lo que no necesita decidir cuál usar.
Si no necesita devolver un error, simplemente puede devolver none.
Esta es la forma principal de manejar los errores en V. Es similar a Go, pero la ventaja es que los errores pueden ser manejados, y manejarlos es mucho menos complicado.
err se define dentro de un bloque or y se establece el mensaje de error. err está vacío si no se devolvió algún error.
user := repo.find_user_by_id(7) or {
println(err) // "User 7 not found"
return
}
También puede propagar errores:
resp := http.get(url)?
println(resp.body)
http.get devuelve? http.Response. Se llamó con?, Por lo que el error se propaga a la función de llamada (que debe devolver un opcional) o en caso de que los cables principales entren en pánico.
Básicamente, el código anterior es una versión más corta de
resp := http.get(url) or {
panic(err)
}
println(resp.body)
V no tiene una forma de forzar el desenvolvimiento de un opcional (como el desenvolvimiento de Rust () o el de Swift). Tienes que usar o {panic (err)} en su lugar.
V también tienen generics :
struct Repo<T> {
db DB
}
fn new_repo<T>(db DB) Repo<T> {
return Repo<T>{db: db}
}
// Esta es una función genérica.
fn (r Repo<T>) find_by_id(id int) ?T {
table_name := T.name // en este ejemplo, obtener el nombre del tipo nos da el nombre de la tabla
return r.db.query_one<T>('select * from $table_name where id = ?', id)
}
db := new_db()
users_repo := new_repo<User>(db)
posts_repo := new_repo<Post>(db)
user := users_repo.find_by_id(1)?
post := posts_repo.find_by_id(1)?
Dejo link: https://vlang.io/
viernes, 7 de febrero de 2020
El lenguaje de programación V, Parte 7
Seguimos con V
V es un lenguaje muy modular. Se recomienda crear módulos reutilizables y es muy simple hacerlo. Para crear un nuevo módulo, crea un directorio con el nombre del módulo y los archivos .v con código:
cd ~/code/modules
mkdir mymodule
vim mymodule/mymodule.v
module mymodule
pub fn say_hi() {
println('hola desde mi modulo!')
}
Puede tener tantos archivos .v en mymodule / como desee.
Compílelo con v build module
~/code/modules/mymodule.
Eso es todo, ahora puedes usarlo en tu código:
module main
import mymodule
fn main() {
mymodule.say_hi()
}
Tenga en cuenta que debe especificar el módulo cada vez que llama a una función externa. Esto hace que el código sea mucho más legible y fácil de entender, ya que siempre está claro qué función se llama desde qué módulo. Especialmente en proyectos grandes.
Los nombres de los módulos deben ser cortos, de menos de 10 caracteres. No se permiten importaciones circulares.
Puede crear módulos en cualquier lugar.
Todos los módulos se compilan en un solo ejecutable.
Si desea escribir un módulo que invoque automáticamente algún código de configuración cuando se importe (tal vez desee llamar a algunas funciones de la biblioteca C), escriba una función de inicio del módulo dentro del módulo:
fn init() {
// your setup code here ...
}
La función init no puede ser pública. Se llamará automáticamente.
Un tipo implementa una interfaz mediante la implementación de sus métodos. No hay una declaración explícita de intención, no hay palabras clave "implementa".
struct Dog {}
struct Cat {}
fn (d Dog) speak() string {
return 'woof'
}
fn (c Cat) speak() string {
return 'meow'
}
interface Speaker {
speak() string
}
fn perform(s Speaker) {
println(s.speak())
}
dog := Dog{}
cat := Cat{}
perform(dog) // "woof"
perform(cat) // "meow"
enum Color {
red green blue
}
fn main() {
mut color := Color.red
// V sabe que color es un color por ende podemos suprimir Color.
color = .green
println(color) // "1"
if color == .green {
println("it's green")
}
}
Dejo link: https://vlang.io/
Dé un vistazo a cómo se verá el futuro con IA
Me llego el siguiente mail de microsoft, sobre un ebook gratuito :
|
Suscribirse a:
Entradas (Atom)