En esta charla, basada en una que dió Mark Rendle, analizamos características de varios lenguajes de programación a la vez que las combinamos para crear eso... el "peor" lenguaje posible.
Charla que di en la Commit Conf 2019
Charla que di en la Bilbostack 2022 sobre Kubernetes.
Discutía casos de uso, cuando usarlo y cuando no y algunos consejos destinados a aquellos que se están planteando usarlo.
Escalando workloads serverless en Kubernetes con KedaEduard Tomàs
Este documento presenta sobre cómo ejecutar cargas de trabajo serverless en Kubernetes. Explica que serverless y Kubernetes no tienen por qué ser mutuamente excluyentes y que existen implementaciones como Azure Functions que permiten ejecutar funciones serverless en Kubernetes. También discute sobre cómo usar KEDA para escalar automáticamente funciones de Azure basadas en eventos externos y cómo modelar workloads serverless como jobs para evitar que el HPA mate pods que aún están procesando.
CollabDays 2020 Barcelona - Serverless Kubernetes with KEDAEduard Tomàs
KEDA es un escalador para kubernetes basado en eventos externos, pensado para escalar workloads serverless. En esta charla mostré como ejecutar Azure Functions en un Kubernetes y escalarlos con KEDA, así como una estrategia alternativa escalando Jobs.
Keda o como convertir Kubernetess en ServerlessEduard Tomàs
Este documento presenta KEDA, un proyecto de código abierto que permite escalar automáticamente aplicaciones en Kubernetes en respuesta a eventos externos. Explica cómo KEDA monitorea eventos para escalar proactivamente despliegues, permitiendo convertir Kubernetes en un entorno serverless. También describe cómo usar KEDA para desplegar funciones de Azure en Kubernetes y cómo gestionar procesos largos para evitar problemas de escalado.
Eduard Tomàs presenta sobre temas de memoria, .NET y rendimiento. Explica conceptos como cómo funciona la recolección de basura, las generaciones de memoria y cómo reservar memoria puede afectar el rendimiento de una aplicación. También cubre temas como value types vs reference types, value types con semántica de referencia, Span<T> y stackalloc para mejorar el manejo de la memoria. Recomienda medir el rendimiento y solo optimizar cuando sea necesario.
Containers en .NET (Dot Net 2018 - Spain)Eduard Tomàs
Este documento presenta una charla sobre contenedores en .NET. Se discuten las diferencias entre .NET Core y .NET Framework en contenedores, incluidas las ventajas de .NET Core como ser más modular y funcionar en Linux. También se cubren buenas prácticas para .NET Core como configuración, secretos y multi-stage builds. Se explican escenarios para mover aplicaciones .NET Framework existentes a contenedores y se concluye con una discusión sobre CI/CD utilizando contenedores.
Charla que di en la Bilbostack 2022 sobre Kubernetes.
Discutía casos de uso, cuando usarlo y cuando no y algunos consejos destinados a aquellos que se están planteando usarlo.
Escalando workloads serverless en Kubernetes con KedaEduard Tomàs
Este documento presenta sobre cómo ejecutar cargas de trabajo serverless en Kubernetes. Explica que serverless y Kubernetes no tienen por qué ser mutuamente excluyentes y que existen implementaciones como Azure Functions que permiten ejecutar funciones serverless en Kubernetes. También discute sobre cómo usar KEDA para escalar automáticamente funciones de Azure basadas en eventos externos y cómo modelar workloads serverless como jobs para evitar que el HPA mate pods que aún están procesando.
CollabDays 2020 Barcelona - Serverless Kubernetes with KEDAEduard Tomàs
KEDA es un escalador para kubernetes basado en eventos externos, pensado para escalar workloads serverless. En esta charla mostré como ejecutar Azure Functions en un Kubernetes y escalarlos con KEDA, así como una estrategia alternativa escalando Jobs.
Keda o como convertir Kubernetess en ServerlessEduard Tomàs
Este documento presenta KEDA, un proyecto de código abierto que permite escalar automáticamente aplicaciones en Kubernetes en respuesta a eventos externos. Explica cómo KEDA monitorea eventos para escalar proactivamente despliegues, permitiendo convertir Kubernetes en un entorno serverless. También describe cómo usar KEDA para desplegar funciones de Azure en Kubernetes y cómo gestionar procesos largos para evitar problemas de escalado.
Eduard Tomàs presenta sobre temas de memoria, .NET y rendimiento. Explica conceptos como cómo funciona la recolección de basura, las generaciones de memoria y cómo reservar memoria puede afectar el rendimiento de una aplicación. También cubre temas como value types vs reference types, value types con semántica de referencia, Span<T> y stackalloc para mejorar el manejo de la memoria. Recomienda medir el rendimiento y solo optimizar cuando sea necesario.
Containers en .NET (Dot Net 2018 - Spain)Eduard Tomàs
Este documento presenta una charla sobre contenedores en .NET. Se discuten las diferencias entre .NET Core y .NET Framework en contenedores, incluidas las ventajas de .NET Core como ser más modular y funcionar en Linux. También se cubren buenas prácticas para .NET Core como configuración, secretos y multi-stage builds. Se explican escenarios para mover aplicaciones .NET Framework existentes a contenedores y se concluye con una discusión sobre CI/CD utilizando contenedores.
Este documento habla sobre cómo desplegar contenedores en producción usando orquestadores, centrándose principalmente en Kubernetes. Explica los beneficios de usar un orquestador como Kubernetes para administrar el ciclo de vida de los contenedores y proveer servicios adicionales. También discute algunos mitos comunes sobre Kubernetes y ofrece consejos sobre buenas prácticas al usar Docker y Kubernetes.
Codemotion 2015 - Bienvenido de nuevo c++Eduard Tomàs
El documento presenta una introducción al lenguaje C++ moderno. Explica las diferencias entre C++ clásico y C++ moderno, incluyendo el uso de smart pointers, contenedores estándar, expresiones lambda y otras características de C++11/14. También resume brevemente algunas de las principales características de C++ como inferencia de tipos, decltype, gestión de memoria con RAII y más.
Containerize a netcore application with aksEduard Tomàs
This document discusses containerizing a .NET Core application with Azure Kubernetes Service (AKS) using three levels: 1) Using kubectl commands directly, 2) Creating YAML configuration files, and 3) Using Helm charts for deployment automation and management. It provides an overview of deploying a .NET Core application to an AKS cluster with an Ingress controller and services.
Aplicaciones de consola fáciles? Más quisieramosEduard Tomàs
Este documento presenta una introducción al desarrollo de aplicaciones de consola en diferentes plataformas como *NIX, Windows y de forma cruzada. Explica la arquitectura del terminal en *NIX y Windows, las novedades de Windows 10 para aplicaciones de consola, y diferentes opciones para desarrollar aplicaciones de consola de forma cruzada usando .NET Standard y bibliotecas como ncurses y Win32 Console API.
Serverless with Azure Functions and CosmosDbEduard Tomàs
El documento describe una arquitectura serverless para una aplicación que recopila datos de cervecerías y permite a los usuarios publicar revisiones de cervezas y brindar por las revisiones de otros usuarios. La arquitectura utiliza Azure Functions para ejecutar código sin servidores, Cosmos DB para almacenar datos de forma flexible y grafos para consultas avanzadas sobre las relaciones entre usuarios y revisiones.
El documento describe un evento técnico de un día organizado por Plain Concepts. La agenda incluye charlas sobre CSS Grid Layout, desarrollo multiplataforma con Xamarin, Docker, Azure, Swagger y entrega continua con Visual Studio Team Services. También se mencionan conceptos como Kubernetes e incluye una demostración de Docker.
Whar are microservices and microservices architecture (MSA) How we reach them? Are they the same or SoA or not? When to use them? What are the key characteristics?
Slides of my talk given in #Gapand2017 in Andorra
El documento describe los pasos para hacer cerveza artesanal: 1) plantar y cosechar grano y lúpulo, 2) maltear el grano, 3) macerar el grano en agua caliente, 4) hervir el mosto, 5) añadir lúpulos, 6) enfriar el mosto rápidamente, 7) fermentación y envasado, 8) compartir la cerveza con amigos. También incluye información sobre la conferencia Microsoft Summit de octubre de 2016 y sobre Azure Functions.
React native - Unleash the power of your deviceEduard Tomàs
This document summarizes a presentation about React Native, a library for building mobile apps using JavaScript and React. React Native allows building native mobile apps using the same tools and workflow as web development. It brings the "React way" of building UIs with reusable components to mobile and uses a single-direction data flow. While code can be shared between platforms, some UI components may not be fully reusable due to platform differences. The virtual DOM generated by components is translated to real native UI.
Presentación de mi charla en la #dotNetSpain2016 sobre ASP.NET Core.
Temas tratados:
Model Binding
Routing
Tag Helpers
View Components
Configuración
Localización
Este documento presenta React Native, una librería desarrollada por Facebook que permite crear aplicaciones móviles nativas usando JavaScript y React. Explica que React Native usa el mismo enfoque de flujo de datos y fuente única de verdad que React, pero genera interfaces nativas en lugar de HTML. También cubre temas como el uso de JSX, estilos CSS propios, y la necesidad de patrones arquitectónicos más allá de React para aplicaciones grandes.
Vistazo a React (la librería JavaScript para UI), la arquitectura Flux y React Native. Se cuentan los fundamentos del "One Direction Data Flow": Como pensar como React y Flux y una introducción a React Native: la versión de React que permite crear aplicaciones Android y iOS usando JavaScript
IndexedDb es una API HTML5 para guardar datos en local. A diferencia de localStorage, IndexedDb es muy rápida, permite búsquedas y es válida para grandes cantidades de datos.
Descripción del Bridge for iOS (Project Islandwood - WinObjC): sus características, sus limitaciones y sus expectativas a futuro. Como crear proyectos que funcionen tanto en XCode/iOS y VS/Windows 10 usando el bridge
Introducción al desarrollo de videojuegos 2D con Wave EngineEduard Tomàs
Este documento presenta los componentes principales del motor de juegos Wave Engine, incluyendo Drawables para elementos gráficos, Behaviors para comportamientos, y Sprite y Animation2D para animaciones. Explica cómo usar Transform2D para posicionar elementos, y SplashScreen y SpriteRenderer para dibujar elementos en la pantalla. También cubre el uso incorrecto de heredar de Entity y recomienda recursos adicionales sobre spritesheets y empaquetado de texturas.
Mi Carnaval, Aplicación web para la gestión del carnaval y la predicción basa...micarnavaltupatrimon
Mi Carnaval es la plataforma que permite conectar al usuario con la cultura y la emoción del Carnaval de Blancos y Negros en la ciudad de Pasto, esta plataforma brinda una amplia oferta de productos, servicios, tiquetería e información relevante para generarle valor al usuario, además, la plataforma realiza un levantamiento de datos de los espectadores que se registran, capturando su actividad e información relevante para generar la analítica demográfica del evento en tiempo real, con estos datos se generan modelos predictivos, que permiten una mejor preparación y organización del evento, de esta manera ayudando a reducir la congestión, las largas filas y, así como a identificar áreas de alto riesgo de delincuencia y otros problemas de seguridad.
Este documento habla sobre cómo desplegar contenedores en producción usando orquestadores, centrándose principalmente en Kubernetes. Explica los beneficios de usar un orquestador como Kubernetes para administrar el ciclo de vida de los contenedores y proveer servicios adicionales. También discute algunos mitos comunes sobre Kubernetes y ofrece consejos sobre buenas prácticas al usar Docker y Kubernetes.
Codemotion 2015 - Bienvenido de nuevo c++Eduard Tomàs
El documento presenta una introducción al lenguaje C++ moderno. Explica las diferencias entre C++ clásico y C++ moderno, incluyendo el uso de smart pointers, contenedores estándar, expresiones lambda y otras características de C++11/14. También resume brevemente algunas de las principales características de C++ como inferencia de tipos, decltype, gestión de memoria con RAII y más.
Containerize a netcore application with aksEduard Tomàs
This document discusses containerizing a .NET Core application with Azure Kubernetes Service (AKS) using three levels: 1) Using kubectl commands directly, 2) Creating YAML configuration files, and 3) Using Helm charts for deployment automation and management. It provides an overview of deploying a .NET Core application to an AKS cluster with an Ingress controller and services.
Aplicaciones de consola fáciles? Más quisieramosEduard Tomàs
Este documento presenta una introducción al desarrollo de aplicaciones de consola en diferentes plataformas como *NIX, Windows y de forma cruzada. Explica la arquitectura del terminal en *NIX y Windows, las novedades de Windows 10 para aplicaciones de consola, y diferentes opciones para desarrollar aplicaciones de consola de forma cruzada usando .NET Standard y bibliotecas como ncurses y Win32 Console API.
Serverless with Azure Functions and CosmosDbEduard Tomàs
El documento describe una arquitectura serverless para una aplicación que recopila datos de cervecerías y permite a los usuarios publicar revisiones de cervezas y brindar por las revisiones de otros usuarios. La arquitectura utiliza Azure Functions para ejecutar código sin servidores, Cosmos DB para almacenar datos de forma flexible y grafos para consultas avanzadas sobre las relaciones entre usuarios y revisiones.
El documento describe un evento técnico de un día organizado por Plain Concepts. La agenda incluye charlas sobre CSS Grid Layout, desarrollo multiplataforma con Xamarin, Docker, Azure, Swagger y entrega continua con Visual Studio Team Services. También se mencionan conceptos como Kubernetes e incluye una demostración de Docker.
Whar are microservices and microservices architecture (MSA) How we reach them? Are they the same or SoA or not? When to use them? What are the key characteristics?
Slides of my talk given in #Gapand2017 in Andorra
El documento describe los pasos para hacer cerveza artesanal: 1) plantar y cosechar grano y lúpulo, 2) maltear el grano, 3) macerar el grano en agua caliente, 4) hervir el mosto, 5) añadir lúpulos, 6) enfriar el mosto rápidamente, 7) fermentación y envasado, 8) compartir la cerveza con amigos. También incluye información sobre la conferencia Microsoft Summit de octubre de 2016 y sobre Azure Functions.
React native - Unleash the power of your deviceEduard Tomàs
This document summarizes a presentation about React Native, a library for building mobile apps using JavaScript and React. React Native allows building native mobile apps using the same tools and workflow as web development. It brings the "React way" of building UIs with reusable components to mobile and uses a single-direction data flow. While code can be shared between platforms, some UI components may not be fully reusable due to platform differences. The virtual DOM generated by components is translated to real native UI.
Presentación de mi charla en la #dotNetSpain2016 sobre ASP.NET Core.
Temas tratados:
Model Binding
Routing
Tag Helpers
View Components
Configuración
Localización
Este documento presenta React Native, una librería desarrollada por Facebook que permite crear aplicaciones móviles nativas usando JavaScript y React. Explica que React Native usa el mismo enfoque de flujo de datos y fuente única de verdad que React, pero genera interfaces nativas en lugar de HTML. También cubre temas como el uso de JSX, estilos CSS propios, y la necesidad de patrones arquitectónicos más allá de React para aplicaciones grandes.
Vistazo a React (la librería JavaScript para UI), la arquitectura Flux y React Native. Se cuentan los fundamentos del "One Direction Data Flow": Como pensar como React y Flux y una introducción a React Native: la versión de React que permite crear aplicaciones Android y iOS usando JavaScript
IndexedDb es una API HTML5 para guardar datos en local. A diferencia de localStorage, IndexedDb es muy rápida, permite búsquedas y es válida para grandes cantidades de datos.
Descripción del Bridge for iOS (Project Islandwood - WinObjC): sus características, sus limitaciones y sus expectativas a futuro. Como crear proyectos que funcionen tanto en XCode/iOS y VS/Windows 10 usando el bridge
Introducción al desarrollo de videojuegos 2D con Wave EngineEduard Tomàs
Este documento presenta los componentes principales del motor de juegos Wave Engine, incluyendo Drawables para elementos gráficos, Behaviors para comportamientos, y Sprite y Animation2D para animaciones. Explica cómo usar Transform2D para posicionar elementos, y SplashScreen y SpriteRenderer para dibujar elementos en la pantalla. También cubre el uso incorrecto de heredar de Entity y recomienda recursos adicionales sobre spritesheets y empaquetado de texturas.
Mi Carnaval, Aplicación web para la gestión del carnaval y la predicción basa...micarnavaltupatrimon
Mi Carnaval es la plataforma que permite conectar al usuario con la cultura y la emoción del Carnaval de Blancos y Negros en la ciudad de Pasto, esta plataforma brinda una amplia oferta de productos, servicios, tiquetería e información relevante para generarle valor al usuario, además, la plataforma realiza un levantamiento de datos de los espectadores que se registran, capturando su actividad e información relevante para generar la analítica demográfica del evento en tiempo real, con estos datos se generan modelos predictivos, que permiten una mejor preparación y organización del evento, de esta manera ayudando a reducir la congestión, las largas filas y, así como a identificar áreas de alto riesgo de delincuencia y otros problemas de seguridad.
Mi Carnaval, Aplicación web para la gestión del carnaval y la predicción basa...micarnavaltupatrimon
Mi Carnaval es la plataforma que permite conectar al usuario con la cultura y la emoción del Carnaval de Blancos y Negros en la ciudad de Pasto, esta plataforma brinda una amplia oferta de productos, servicios, tiquetería e información relevante para generarle valor al usuario, además, la plataforma realiza un levantamiento de datos de los espectadores que se registran, capturando su actividad e información relevante para generar la analítica demográfica del evento en tiempo real, con estos datos se generan modelos predictivos, que permiten una mejor preparación y organización del evento, de esta manera ayudando a reducir la congestión, las largas filas y, así como a identificar áreas de alto riesgo de delincuencia y otros problemas de seguridad.
Mi Carnaval, Aplicación web para la gestión del carnaval y la predicción basa...
El "peor" lenguaje del mundo
1. MAD · NOV 22-23 · 2019
El peor lenguaje del mundo
(Una charla basada en una que dio Mark
Rendle en una BuildStuff)
Eduard Tomàs
Making beers. Breaking software.
@eiximenis
2. MAD · NOV 22-23 · 2019
¿Quien soy yo?
Empecé a desarrollar con un ZX Spectrum
Aficionado a la literatura fantastica
(buenos, nada de R. A. Salvatore) y de
ciencia ficción
Hago cerveza (y me la bebo)
Trabajo en Plain Concepts
Microsoft MVP desde 2012
4. MAD · NOV 22-23 · 2019
COBOL…
IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO-WORLD.
PROCEDURE DIVISION.
DISPLAY 'Hello, world'.
STOP RUN.
Inspirado en Flow-Matic (creado por
Grace Hopper) se diseñó en 1960
5. MAD · NOV 22-23 · 2019
… AND IBM COBOL!
//COBUCLG JOB CLASS=A,MSGCLASS=A,MSGLEVEL=(1,1)
//HELOWRLD EXEC COBUCLG,PARM.COB='MAP,LIST,LET'
//COB.SYSIN DD *
001 IDENTIFICATION DIVISION.
002 PROGRAM-ID. 'HELLO'.
003 ENVIRONMENT DIVISION.
004 CONFIGURATION SECTION.
005 SOURCE-COMPUTER. IBM-360.
006 OBJECT-COMPUTER. IBM-360.
0065 SPECIAL-NAMES.
0066 CONSOLE IS CNSL.
007 DATA DIVISION.
008 WORKING-STORAGE SECTION.
009 77 HELLO-CONST PIC X(12) VALUE 'HELLO, WORLD'.
075 PROCEDURE DIVISION.
090 000-DISPLAY.
100 DISPLAY HELLO-CONST UPON CNSL.
110 STOP RUN.
//LKED.SYSLIB DD DSNAME=SYS1.COBLIB,DISP=SHR
// DD DSNAME=SYS1.LINKLIB,DISP=SHR
//GO.SYSPRINT DD SYSOUT=A
//
Sí, los mismos que años más tarde se
superaron con JSONx
6. MAD · NOV 22-23 · 2019
APL (A Programming Language)
'Hello, World!'
Creado en 1962 por Kenneth Iverson cuando trabajaba en IBM
7. MAD · NOV 22-23 · 2019
APL (A Programming Language)
life←{↑1 ⍵∨.∧3 4=+/,¯1 0
1∘.⊖¯1 0 1∘.⌽⊂⍵}
Creado en 1962 por Kenneth Iverson cuando trabajaba en IBM
¡Se usaban teclados especiales!
8. MAD · NOV 22-23 · 2019
MUMPS
Q N R,Q,C,D,E,W,B,G,H,S,T,U,V,F,L,P,N,J,A S N=$G(N),Q='N,F=Q+Q,P=F+F,W=$L($T(Q))
S W=$E(W,Q),S='N_+N,W=W-F*S,L=$G(L),R=$C(Q_F_P),R(F)=$C(F+Q_F),R(P)=$C(W-F) W #
S T=$E($T(Q+F),F,WS)_$C(W+S+F) X T S B=$P(T,$C(P_P),F),C=B(W*W),D=B-(C*W*W)W
F G=S-Q:F:S+F+Q S E=B-(C*W*W+(D*W)),H=$E($T(Q),G),@H=$S(@H<S:'Q,Q:N)_@H,T=C_D_E
F A=Q:Q:WS S J=$E(T,A),C(F)=$S(J>(F+Q)&(J<(S-F)):Q,Q:+N),C(P)=$S(J#F:Q,Q:+N) D
.S C(Q)=$S(J<(S-F):+N,Q:Q),C(F+Q)=$S(J>Q&(J<(S-F))&(J'=(P+'L))&(J'=(P)):Q,Q:+N)
.S H('L)=L F S H(N?.E)=$O(C(H('$G(N)))) Q:H('+L)=L S F(A,H('L))=C(H(W[(WS)))
F U=Q:Q:P W !,R F V=Q:Q:P+F W $S(F(V,U):'Q,Q:$C(P_(WS))) W:'(V#F) $C('N_F_F+F)
W !!,R(F)_C_R(P)_D_R(P)_E_R(F) X $RE($E($T(Q),Q+F,P+Q))_R(P)_'N W # G:N=L Q+F Q
Creado en 1966 por Neil Pappalardo, Robert Greenes and Curt Marble
Todo se puede abreviar a 1,2 ó 3 carácteres
Y el tamaño máximo de fichero estaba limitado…
hello()
write "Hello, World!",!
quit
9. MAD · NOV 22-23 · 2019
INTERCAL
DO ,1 SUB #5 <- #64
DO ,1 SUB #6 <- #194
DO ,1 SUB #7 <- #48
PLEASE DO ,1 SUB #8 <- #22
DO ,1 SUB #9 <- #248
DO ,1 SUB #10 <- #168
DO ,1 SUB #11 <- #24
DO ,1 SUB #12 <- #16
DO ,1 SUB #13 <- #162
PLEASE READ OUT ,1
PLEASE GIVE UP
Creado en 1972 por Don Woods y James Lyons
No usa GOTO (ya sabemos que es malo)
… pero usa COMEFROM que es peor.
11. MAD · NOV 22-23 · 2019
Brainfuck
+[-[<<[+[--->]-[<<<]]]>>>-]>-.---
.>..>.<<<<-.<+.>>>>>.>.<<.<-.
El que conoce (casi) todo el mundo. De 1992 por Urban Müller
Se ejecuta sobre una máquina que es una cinta con celdas y un puntero a una de ellas
El lenguaje tiene solo 8 caracteres, que cada uno efectua una operación sobre el puntero
o bien el contenido de la celda apuntada.
12. MAD · NOV 22-23 · 2019
Malbolge
(=<`#9]~6ZY32Vx/4Rs+0No-
&Jk)"Fh}|Bcy?`=*z]Kw%oG4UUS0/@-ejc(:'8dc
Lo creó Ben Olmstead en 1998 con el objetivo de conseguir el lenguaje de programación
más difícil de desarrollar
De hecho se tardaron dos años en generar el primer programa válido
¡Y lo generó un algoritmo!
Parece ser que es Turing-Completo, pero no se ha demostrado al 100%
13. MAD · NOV 22-23 · 2019
Nuestro propio lenguaje
14. MAD · NOV 22-23 · 2019
Principios de diseño
Queremos que los programadores entren en él…
… y atraparlos en un mar de características inútiles, complejas o raras
No dejar que el desarrollador puede tomar decisiones en las cosas simples
Pero darle toda la libertad en las complejas
Queremos que parezca simple pero sea complicado
16. MAD · NOV 22-23 · 2019
PHP
PHP == PHP Hates Programmers
Incosistencia total en el naming y el casing
Prefijo de variables inútil
Mucha de la sintaxis molesta de C/C++
… con el rendimiento de BASIC
17. MAD · NOV 22-23 · 2019
Primera iteración
class Greeter {
public function __construct(£name) {
£this->name = £name;
}
public function say(£thing) {
echo £thing, ' ', £this->name, BS::EOL;
}
}
18. MAD · NOV 22-23 · 2019
Python
Invalid code
for root, sub, files in os.walk('.'):
if 'AssemblyInfo.cs' in files:
file = os.path.join(root, 'AssemblyInfo.cs')
for line in fileinput.input(file, inplace=1):
if aiv_pattern.search(line):
print(aiv)
else:
print(line, end='')
Valid code
for root, sub, files in os.walk('.'):
if 'AssemblyInfo.cs' in files:
file = os.path.join(root, 'AssemblyInfo.cs')
for line in fileinput.input(file, inplace=1):
if aiv_pattern.search(line):
print(aiv)
else:
print(line, end='')
¡Espacios importan!
19. MAD · NOV 22-23 · 2019
Segunda iteración
class Greeter
public function __construct(£name)
£this->name = £name;
public function say(£thing)
echo £thing, ' ', £this->name, BS::EOL;
No es solo Python: F#, Occam, Haskell, YAML,…
20. MAD · NOV 22-23 · 2019
Whitespace
Lenguaje publicado en 2003 por Edwin Brady y Chris Morris.
La sintaxis solo son espacios, tabuladores y líneas en blanco
21. MAD · NOV 22-23 · 2019
(Casi) Cada lenguaje
null, nothing, nil, undefined, null_ptr, NULL, void, unit
Algunos como C# hasta permiten nulls en tipos “simples” (int, bool, …)
22. MAD · NOV 22-23 · 2019
Nuestros operadores para null
£a = null // Todo se puede asignar a null
£a->equals(null) // Falso o excepción
null->equals(£a) // Excepción siempre
£a == null // Siempre falso (nada es igual a null)
nada == null // Siempre cierto (ya que nada es igual a null)
£a is null
28. MAD · NOV 22-23 · 2019
JavaScript (3)
El ; en JavaScript es opcional
var foo = function() {
var bar = 'baz'
return
{
bar: bar
}
}
29. MAD · NOV 22-23 · 2019
Tipado: ¿Estático o dinámico?
class Greeter
public function __construct(£name)
TO_TAKE_FROM_THE_BAG;
(unless £name isNot null);
£this->name = £name;
public function say(£thing isProbablyA string)
echo £thing, ' ', £this->name, BS::EOL;
30. MAD · NOV 22-23 · 2019
Palabras claves contextuales
En C# async/await son palabras claves contextuales
El siguiente código es válido en C#:
https://gist.github.com/jaredpar/de522f659963bf50e0fd9f24d3b00768
public class C
{
async async await(await async) => await async;
}
31. MAD · NOV 22-23 · 2019
Palabras clave contextuales
struct for
if isProbablyA number
else isProbablyA number
function function(£then)
if £then->if > £then->else
return £then->if
else
return £then->else
38. MAD · NOV 22-23 · 2019
Versionado del lenguaje
Como C++? (C++11, C++14, C++17, C++20…)
Como JavaScript? (ES4, ES5, ES2015, ES2016,…)
Como Java? (J2SE 1.3, J2SE 1.4, J2SE 5.0, Java SE 6, Java SE 7,…)
Como dotnet? (.net core 1.0 con asp.net 5, mvc 6, EF 7 y C#7)