If you're debugging JavaScript in Visual Studio Code you probably have used either the Chrome Debugger or the <
The post Easier browser debugging with Developer Tools integration in Visual Studio Code appeared first on Microsoft Edge Blog.
Clojure Deref (July 16, 2021)
Clojure News 16 07 2021
Welcome to the Clojure Deref! This is a weekly link/news roundup for the Clojure ecosystem. (@ClojureDeref RSS)
Highlights
Big congrats to Amperity on their Series D financing and valuation of $1B, making them another "unicorn" built substantially on Clojure and ClojureScript, approaching 100 Clojure developers. It is great to see these Clojure success stories at scale! Amperity has also been a great contributor to the Clojure ecosystem, so many thanks to them.
Podcasts and videos
-
LispCast - Eric Normand on the power of data
-
clojure-lsp - Eric Dallo showcases clojure-lsp
-
sudoku solver - Dutch Clojure Meetup #133
Blogs, discussions, tutorials
-
Zig, Skia, Clojure, Geometry and the Japanese TV Show: ICFP Contest 2021 by Nikita Prokopov
-
BEAM all the things! ClojErl, an implementation of Clojure on the Erlang Virtual Machine - an interview with Juan Facorro, it’s creator
-
Projectless literate Clojure with embedded SVG by George Kontsevich
Libraries and tools
Some interesting library and tool updates and posts this week:
-
Datomic Cloud 884-9095 - new lower pricing tiers, API Gateway automation, and simplified operation
-
data.json 2.4.0 - no dependency JSON parser/writer in Clojure
-
tools.reader 1.3.6 - Clojure reader in Clojure
-
tools.build 0.1.3 - Building artifacts in Clojure
-
holy-lambda 0.2.3 - micro-framework that integrates Clojure with AWS Lambda
-
rcf - (NEW) turn your Rich Comment Forms into tests
-
datalevin 0.4.40 - simple, fast and durable Datalog database
-
bootleg 0.1.9 - simple template processing command line tool to help build static websites
-
depstar 2.1.267 - builds JARs, uberjars, does AOT, manifest generation, etc for deps.edn projects
-
pathom 2021.07.10-alpha - logic programming through attribute relationships.
-
pathom-viz 2021.7.11 - visualization tools for Pathom
-
pathom-viz-connector 2021.07.15-1 - connect Pathom parsers with the Pathom Viz Electron standalone tool
-
mirabelle 0.3.0 - stream processing engine for monitoring
-
clojure-lsp 2021.07.12-12.30.59 - Language Server (LSP) for Clojure
-
Calva 2.0.204 - Clojure for VS Code
-
babashka 0.5.0 - native, fast starting Clojure interpreter for scripting
-
eastwood 0.8.1 - Clojure lint tool
-
antq 0.16.0 - point out your outdated dependencies
Video throwback
If you haven’t seen it, the classic Every Clojure Talk Ever by Alex Engelberg and Derek Slager does a pretty good job of lovingly capturing the foibles and curiosities of the Clojure community. Enjoy!
Usar un flujo de testing de algún tipo (TDD, BDD, E2E…) es una buena medida de calidad. No porque te asegure que la función u objeto funcione como esperas, sino porque indica que el proyecto posee una buena arquitectura y detrás hay buenos desarrolladores.
Hacer testing no trata solo sobre crear código que compruebe otro código, sino una metodología de trabajo profesional que amplia la visión del código. Escribes un preciso guión de que buscas, dejando claro como debe comportarse y de que manera reaccionará en casos extraordinarios. Todo ello sin tan siquiera escribir la funcionalidad. Además, de manera indirecta, dejas documentado el funcionamiento.
Suele decirse que hacer testing es artesanal, que todos los casos son únicos. No es cierto, disponemos de patrones o plantillas que nos ayudan a empezar y estructurar. Y entre las más sencillas y conocidos son encontramos con Given-When-Then.
Plantilla Given-When-Then
Creado por Daniel Terhorst-North y Chris Matts como parte de BDD (Behavior-Driven Development), son sugieren un patrón de 3 bloques informales de comentarios para dividir el código.
- Given (Dado): Preparas el escenario del test, como la base de datos, variables o condiciones propicias.
- When (Cuando): Condiciones que transformarán el contenido.
- Then (Entonces): Verificas el resultado final, que se ha cumplido todo lo que esperabas o los casos propuestos.
Pongamos sobre la mesa un ejemplo en prosa. Vamos a escribir un test para el cuento de “los 3 cerditos”. El objetivo es comprobar que están a salvo del lobo.
Dado 3 casas, [‘paja’, ‘madera’, ‘ladrillos’]…
Cuando sople el lobo sobre cada una…
Entonces debe existir 1 o más casas en pie.
Ahora vamos a crear un ejemplo real en JavaScript pero muy simple. Queremos una función que nos informe si una anchura y una altura de una imagen iguales. Tal solo indicaremos cuanto es la anchura y altura, devolviendo un true
, false
o null
dependiendo la situación.
Primero definimos la función, pero sin contenido, en imagenes.js
. Podrías considerar que estas documentando.
// imagenes.js
/**
* Comprueba si es una medida cuadrada o contiene la misma anchura y altura
* @param float anchura
* @param float altura
* @return boolean, en caso de no disponer de argumentos con el tipo correcto devolverá un null
*/
function esAnchuraYAlturaCuadrada(anchura, altura) {
}
// Exportamos para que pueda ser invocado desde otros lugares
module.exports = {
esAnchuraYAlturaCuadrada
};
Ahora hacemos uso de Jest para hace el test. Creamos siguiente archivo imagenes.test.js
.
// imagenes.test.js
const {esAnchuraYAlturaCuadrada} = require('./imagenes');
/* Given */
anchura_1 = 500;
altura_1 = 250;
anchura_2 = 400;
altura_2 = 400;
anchura_3 = 400.2;
altura_3 = 400;
anchura_4 = "foo";
altura_4 = 150;
anchura_5 = false;
altura_5 = "boo";
/* When */
resultados_1 = esAnchuraYAlturaCuadrada(anchura_1, altura_1);
resultados_2 = esAnchuraYAlturaCuadrada(anchura_2, altura_2);
resultados_3 = esAnchuraYAlturaCuadrada(anchura_3, altura_3);
resultados_4 = esAnchuraYAlturaCuadrada(anchura_4, altura_4);
resultados_5 = esAnchuraYAlturaCuadrada(anchura_5, altura_5);
/* Then */
test('No son iguales', () => {
expect(resultados_1).toBe(false);
});
test('Son iguales', () => {
expect(resultados_2).toBe(true);
});
test('No son iguales', () => {
expect(resultados_3).toBe(false);
});
test('No se puede comparar un texto con un número', () => {
expect(resultados_4).toBe(null);
});
test('No se puede comparar un boolean con un texto', () => {
expect(resultados_5).toBe(null);
});
Instalamos la librería Jest que será la encargada de realizar los test.
npm install --save-dev jest
Y lo ejecutamos.
./node_modules/jest/bin/jest.js
Obviamente fallarán todas.
Ya sabemos que buscamos, y que debe devolver. Es hora de definir la función.
// imagenes.js
/**
* Comprueba si es una medida cuadrada o contiene la misma anchura y altura
* @param float anchura
* @param float altura
* @return boolean, en caso de no disponer de argumentos con el tipo correcto devolverá un null
*/
function esAnchuraYAlturaCuadrada(anchura, altura) {
// Es un número?
if (anchura === parseFloat(anchura) && altura === parseFloat(altura)) {
// Es igual?
return anchura == altura;
}
return null;
}
// Exportamos para que pueda ser invocado desde otros lugares
module.exports = {
esAnchuraYAlturaCuadrada
};
Cuando se vuelva a testear comprobarás que pasa todos los casos.
PASS ./imagenes.test.js
✓ No son iguales (2 ms)
✓ Son iguales (1 ms)
✓ No son iguales
✓ No se puede comparar un texto con un número (1 ms)
✓ No se puede comparar un boolean con un texto
Test Suites: 1 passed, 1 total
Tests: 5 passed, 5 total
Snapshots: 0 total
Time: 0.317 s, estimated 1 s
Ran all test suites.
Has sido testigo de todos los pasos típicos en un desarrollo con la metodología TDD.
- Documentar.
- Crear test.
- Ejecutar el test, recibiendo que falla.
- Crear la funcionalidad.
- Volver a ejecutar, recibiendo un éxito.
Si quieres profundizar, puedes explorar mi curso gratuito de testing donde podrás conocer otras técnicas e implementaciones en otros lenguajes.
Usar un flujo de testing de algún tipo (TDD, BDD, E2E…) es una buena medida de calidad. No porque te asegure que la función u objeto funcione como esperas, sino porque indica que el proyecto posee una buena arquitectura y detrás hay buenos desarrolladores.
Hacer testing no trata solo sobre crear código que compruebe otro código, sino una metodología de trabajo profesional que amplia la visión del código. Escribes un preciso guión de que buscas, dejando claro como debe comportarse y de que manera reaccionará en casos extraordinarios. Todo ello sin tan siquiera escribir la funcionalidad. Además, de manera indirecta, dejas documentado el funcionamiento.
Suele decirse que hacer testing es artesanal, que todos los casos son únicos. No es cierto, disponemos de patrones o plantillas que nos ayudan a empezar y estructurar. Y entre las más sencillas y conocidos son encontramos con Given-When-Then.
Plantilla Given-When-Then
Creado por Daniel Terhorst-North y Chris Matts como parte de BDD (Behavior-Driven Development), son sugieren un patrón de 3 bloques informales de comentarios para dividir el código.
- Given (Dado): Preparas el escenario del test, como la base de datos, variables o condiciones propicias.
- When (Cuando): Condiciones que transformarán el contenido.
- Then (Entonces): Verificas el resultado final, que se ha cumplido todo lo que esperabas o los casos propuestos.
Pongamos sobre la mesa un ejemplo en prosa. Vamos a escribir un test para el cuento de “los 3 cerditos”. El objetivo es comprobar que están a salvo del lobo.
Dado 3 casas, [‘paja’, ‘madera’, ‘ladrillos’]…
Cuando sople el lobo sobre cada una…
Entonces debe existir 1 o más casas en pie.
Ahora vamos a crear un ejemplo real en JavaScript pero muy simple. Queremos una función que nos informe si una anchura y una altura de una imagen iguales. Tal solo indicaremos cuanto es la anchura y altura, devolviendo un true
, false
o null
dependiendo la situación.
Primero definimos la función, pero sin contenido, en imagenes.js
. Podrías considerar que estas documentando.
// imagenes.js
/**
* Comprueba si es una medida cuadrada o contiene la misma anchura y altura
* @param float anchura
* @param float altura
* @return boolean, en caso de no disponer de argumentos con el tipo correcto devolverá un null
*/
function esAnchuraYAlturaCuadrada(anchura, altura) {
}
// Exportamos para que pueda ser invocado desde otros lugares
module.exports = {
esAnchuraYAlturaCuadrada
};
Ahora hacemos uso de Jest para hace el test. Creamos siguiente archivo imagenes.test.js
.
// imagenes.test.js
const {esAnchuraYAlturaCuadrada} = require('./imagenes');
/* Given */
anchura_1 = 500;
altura_1 = 250;
anchura_2 = 400;
altura_2 = 400;
anchura_3 = 400.2;
altura_3 = 400;
anchura_4 = "foo";
altura_4 = 150;
anchura_5 = false;
altura_5 = "boo";
/* When */
resultados_1 = esAnchuraYAlturaCuadrada(anchura_1, altura_1);
resultados_2 = esAnchuraYAlturaCuadrada(anchura_2, altura_2);
resultados_3 = esAnchuraYAlturaCuadrada(anchura_3, altura_3);
resultados_4 = esAnchuraYAlturaCuadrada(anchura_4, altura_4);
resultados_5 = esAnchuraYAlturaCuadrada(anchura_5, altura_5);
/* Then */
test('No son iguales', () => {
expect(resultados_1).toBe(false);
});
test('Son iguales', () => {
expect(resultados_2).toBe(true);
});
test('No son iguales', () => {
expect(resultados_3).toBe(false);
});
test('No se puede comparar un texto con un número', () => {
expect(resultados_4).toBe(null);
});
test('No se puede comparar un boolean con un texto', () => {
expect(resultados_5).toBe(null);
});
Instalamos la librería Jest que será la encargada de realizar los test.
npm install --save-dev jest
Y lo ejecutamos.
./node_modules/jest/bin/jest.js
Obviamente fallarán todas.
Ya sabemos que buscamos, y que debe devolver. Es hora de definir la función.
// imagenes.js
/**
* Comprueba si es una medida cuadrada o contiene la misma anchura y altura
* @param float anchura
* @param float altura
* @return boolean, en caso de no disponer de argumentos con el tipo correcto devolverá un null
*/
function esAnchuraYAlturaCuadrada(anchura, altura) {
// Es un número?
if (anchura === parseFloat(anchura) && altura === parseFloat(altura)) {
// Es igual?
return anchura == altura;
}
return null;
}
// Exportamos para que pueda ser invocado desde otros lugares
module.exports = {
esAnchuraYAlturaCuadrada
};
Cuando se vuelva a testear comprobarás que pasa todos los casos.
PASS ./imagenes.test.js
✓ No son iguales (2 ms)
✓ Son iguales (1 ms)
✓ No son iguales
✓ No se puede comparar un texto con un número (1 ms)
✓ No se puede comparar un boolean con un texto
Test Suites: 1 passed, 1 total
Tests: 5 passed, 5 total
Snapshots: 0 total
Time: 0.317 s, estimated 1 s
Ran all test suites.
Has sido testigo de todos los pasos típicos en un desarrollo con la metodología TDD.
- Documentar.
- Crear test.
- Ejecutar el test, recibiendo que falla.
- Crear la funcionalidad.
- Volver a ejecutar, recibiendo un éxito.
Si quieres profundizar, puedes explorar mi curso gratuito de testing donde podrás conocer otras técnicas e implementaciones en otros lenguajes.
In March, we announced that Microsoft Edge would be moving from a 6-week to a 4-week release cycle cadence to deliver more innovation to u
The post How to opt-in to the Extended Stable release cycle option beginning with Microsoft Edge 94 appeared first on Microsoft Edge Blog.
669
Extra Ordinary 14 07 2021
Evercade is delighted to announce another new collection for the Evercade family of systems, and a new publisher! Renovation Collection 1 will bring twelve incredible 16-bit games from Japanese publisher Telenet and its US subsidiary Renovation. With the collection to be labeled number 23, this will be the first cartridge in our 2022 lineup with... View Article
The post Evercade Announces Renovation Collection 1 – Coming Early 2022 appeared first on Evercade.
Reuse Dired buffers
Manuel Uberti 14 07 2021
This is going to be a really quick one, mainly a “thank you!” to Lars
Ingebrigtsen. Lars has recently added a new option on the Emacs master branch:
dired-kill-when-opening-new-dired-buffer
. I will let the documentation speak for
itself:
dired-kill-when-opening-new-dired-buffer is a variable defined in ‘dired.el’.
Its value is t
Original value was nilYou can customize this variable. This variable was introduced, or its default value was changed, in version 28.1 of Emacs. Probably introduced at or before Emacs version 28.1.
If non-nil, kill the current buffer when selecting a new directory.
Setting this new option to t
means that pressing RET or ^ in a Dired buffer will
reuse the existing buffer. This is something I required a while ago (#20598) and
that up until today I had been hacking up poorly in my .init.el
.
I know the Emacs developers have more urgent bugs to work on, but this is such a nice improvement I am pretty sure you can see me happily smiling right now.
Reuse Dired buffers
Manuel Uberti 14 07 2021
This is going to be a really quick one, mainly a “thank you!” to Lars
Ingebrigtsen. Lars has recently added a new option on the Emacs master branch:
dired-kill-when-opening-new-dired-buffer
. I will let the documentation speak for
itself:
dired-kill-when-opening-new-dired-buffer is a variable defined in ‘dired.el’.
Its value is t
Original value was nilYou can customize this variable. This variable was introduced, or its default value was changed, in version 28.1 of Emacs. Probably introduced at or before Emacs version 28.1.
If non-nil, kill the current buffer when selecting a new directory.
Setting this new option to t
means that pressing RET or ^ in a Dired buffer will
reuse the existing buffer. This is something I required a while ago (#20598) and
that up until today I had been hacking up poorly in my .init.el
.
I know the Emacs developers have more urgent bugs to work on, but this is such a nice improvement I am pretty sure you can see me happily smiling right now.
Una cápsula del tiempo para Lucy
NeoFronteras 13 07 2021
Indie Heroes – The Games
Evercade 13 07 2021
The ‘Indie Heroes’ Collection 1 Cartridge brings 14 independently developed games to Evercade. Originally made for classic systems, this specially curated line-up showcases talented developers from around the world. From platformers to story-driven horrors – this collection has plenty of depth and variety. So what exactly are you going to be able to play... View Article
The post Indie Heroes – The Games appeared first on Evercade.
FreeBSD News Flash 13 07 2021
L’incontrolat
AU Agenda 12 07 2021
La entrada L’incontrolat aparece primero en AU Agenda.
L’ETNO. Corona, 36 A l’estiu el cinema es gaudeix a la fresca, ja siga al claustre de La Nau, al llit del Túria o al pati del museu valencià d’etnologia L’Etno, on es posa en marxa la primera edició d’un cicle titulat L’incontrolat que explora les relacions entre el documental, l’etnologia i l’antropologia. Es projectaran […]
La entrada L’incontrolat aparece primero en AU Agenda.