Si vieron este post : https://emanuelpeg.blogspot.com/2021/04/como-crear-un-proyecto-clojure.html
Deben haber pensado: y los test, donde están los test?
Bueno, vamos a hacer una pequeña función cuadrado por ejemplo :
Deben haber pensado: y los test, donde están los test?
Bueno, vamos a hacer una pequeña función cuadrado por ejemplo :
Y luego creamos una carpeta y hacemos una aplicación de consola:
mkdir miPrimerApp
cd miPrimerApp
dotnet new console
code .
Como verán le puse miPrimerApp a la carpeta y luego ejecute visual code con el comando "code ."
En visual code podemos ver la clase Program.cs que se va a ejecutar :
using System;
public delegate void MiDelegado(int i);
public class Test
{
public static void Main()
{
MiClase miClase = new MiClase();
// instanciamos un delegado. Observa que el método MiMetodo de la clase
// MiClase cumple con la firma definida en el delegado
MiDelegado delegado = new MiDelegado(miClase.MiMetodo);
delegado(83); // Se hace la llamada al delegado
}
}
public class MiClase
{
public void MiMetodo(int i)
{
Console.WriteLine("El valor pasado como parámetro es: {0}", i);
}
}
Como podemos instanciar delegados? Tenemos diferentes maneras:
Dejo link: https://www.tutorialsteacher.com/csharp/csharp-delegates
Esto es muy fácil hacemos así :
$ lein new app nombreDeLaApp
Generating a project called nombreDeLaApp based on the 'app' template.
Me llego un mail de jetbrain con la presentación de "code with me" que es una nueva funcionalidad de su Ide y la verdad es que esta muy bueno.
Dejo el video :
Por lo tanto una tarea recomendada es chequear los indices cada tanto y reconstruirlos (cuando no esten utilizando la base)
Lo que hice es un script que inserta en la tabla INDEX_REBUILD los datos de los indices que deben ser reconstruidos. Y luego podemos reconstruirlos de forma automatica o manual.
Lo hice para base de datos oracle pero es interesante hacerlo para otros motores :
DROP TABLE INDEX_REBUILD CASCADE CONSTRAINTS;
CREATE TABLE INDEX_REBUILD AS (select *
from index_stats);
DECLARE
CURSOR INDEX_NAMES is
SELECT INDEX_NAME FROM all_indexes
where TABLE_OWNER = 'nombreDelEsquema'
-- AND TABLE_NAME = 'nombreDeLaTabla'; -- Si deseo correrlo para una tabla puedo descomentar esta linea.
BEGIN
FOR N IN INDEX_NAMES LOOP
EXECUTE IMMEDIATE 'analyze index ' || N.INDEX_NAME || ' validate structure';
dbms_output.put_line( N.INDEX_NAME );
END LOOP;
INSERT INTO INDEX_REBUILD select *
from index_stats
where round((del_lf_rows/lf_rows)*100,2) >= 20
OR height > 3
OR lf_rows > lf_blks;
COMMIT;
END;
Dado que tenemos los indices a reconstruir en una tabla, podemos hacer esto de forma automática :
CURSOR INDEX_NAMES is
SELECT NAME FROM INDEX_REBUILD;
BEGIN
FOR N IN INDEX_NAMES LOOP
EXECUTE IMMEDIATE 'ALTER index ' || N.NAME || ' REBUILD';
END LOOP;
END;
Pero tenemos que tener cuidado porque este proceso puede llevar mucho tiempo. Si se hace para una o dos tablas puede servir, pero para una base de datos grande o mediana, nunca terminaría. En ese caso es mejor hacerlo manual con un equipo de mate y bizcochitos.
Talvez tendría que hacer un post explicando un poco más la fragmentación y porque esos valores mágicos que pongo en la consulta, pero eso va llevar mucho tiempo...
Los objetivos principales de la Fundación OpenJS son:
Promover la adopción generalizada y el desarrollo continuo de soluciones web, JavaScript y tecnologías relacionadas.
Facilitar la colaboración dentro de la comunidad de desarrollo de JavaScript.
Crear un centro de gravedad para proyectos de código abierto en todo el ecosistema de JavaScript de un extremo a otro, guiándolos hacia una gobernanza abierta y diversas bases de colaboradores.
Para alojar la infraestructura para admitir proyectos de código abierto de JavaScript alojados.
Permitir, a través del avance de Proyectos y alianzas estratégicas, una web abierta y accesible.
La idea es proporcionar un hogar neutral para proyectos críticos, con principios comunes de gobernanza técnica y responsabilidad. Al hacerlo, estan proporcionando la sostenibilidad a largo plazo tanto de los proyectos individuales como del ecosistema en su conjunto.
Dejo link : https://openjsf.org/
Rust para Windows tiene como objetivo poner a disposición las API más antiguas y más recientes aprovechando el proyecto win32metadata para crear proyecciones idiomáticas de la API de Windows para lenguajes distintos de C# y F#.
Este framework puede generar enlaces a todas las API de Windows necesarias sobre la marcha. Lo que debemos hacer es especificar qué tipos de API necesitamos dentro de un archivo build.rs:
fn main() {
windows::build!(Windows::Data::Xml::Dom::*,
Windows::Win32::WindowsProgramming::CloseHandle,
Windows::Win32::WindowsAndMessaging::MessageBoxA,
Windows::Win32::SystemServices::{
CreateEventW, SetEvent, WaitForSingleObject
},
);
}
Los enlaces generados se pueden importar y usar en los archivos fuente de Rust:
use bindings::{
Windows::Data::Xml::Dom::*,
Windows::Win32::SystemServices::{CreateEventW, SetEvent, WaitForSingleObject, PWSTR},
Windows::Win32::WindowsAndMessaging::{MessageBoxA, HWND, MESSAGEBOX_STYLE},
Windows::Win32::WindowsProgramming::CloseHandle,
};
Microsoft ha proporcionado varios programas de muestra que utilizan varias API de Windows, incluidos Direct2D, Microsoft.Web.WebView2.Core, Win2D y otros.
Win32metadata no solo permite proyecciones automatizadas de API de Windows, sino que también se esfuerza por facilitar su uso al convertir tipos no específicos como uint en enumeraciones específicas, tipos opacos como objetos HANDLE y GDI en estructuras fuertemente tipadas, etc.
La documentación de Rust para todas las API proyectadas también está disponible para describir cómo se proyectan las API y los tipos de Windows en Rust idiomático.
Rust para Windows todavía está en versión preliminar y el proyecto agradece las contribuciones para identificar y corregir errores en el código fuente.
Dejo video :
Dejo link: https://docs.microsoft.com/en-us/windows/dev-environment/rust/rust-for-windows
Avance rápido a .NET 6 y obtenemos la propuesta DateOnly y TimeOnly. Como implican los nombres, estas estructuras están diseñadas para contener solo una fecha o solo una hora. El nombre original de la estructura DateTime era solo Date. Esto continúa en VB, donde la palabra clave Date continúa haciendo referencia a DateTime. Por lo tanto, se eligió el nombre DateOnly para evitar confusiones.
Otra razón por la que se eligió el nombre DateOnly es que DateTime.Date ya devuelve un valor DateTime. Esto no se puede cambiar, pero los nuevos programadores esperan que devuelva una fecha. Al llamar al tipo DateOnly, la nueva propiedad coincidente se puede llamar DateTime.DateOnly.
De manera similar, TimeOfDay es problemático ya que muchas propiedades y métodos lo usan para referirse a un valor de DateTime o TimeSpan.
DateOnly y TimeOnly no implementarán el atributo Serializable. En .NET Core y versiones posteriores, este atributo se considera obsoleto, al igual que las bibliotecas de serialización que dependen de él.
En este momento, no hay planes para abordar escenarios avanzados como el manejo de la zona horaria real y el período frente a la duración. Este rol lo maneja en gran parte la biblioteca Noda Time. Basado en Joda Time de Java, también le permite representar fechas parciales como "3 de enero" o "marzo de 2021", donde el año, el día o el mes faltan intencionalmente.
Dejo link : https://www.infoq.com/news/2021/04/Net6-Date-Time/
Si utilizamos oracle o postgres o alguna otra base de datos podemos partir estas tablas de modo que la información vieja quede en otras particiones y podamos trabajar con un rango menor de información, mejorando así la performance de nuestro sistema.
Pero MariaDb también permite partir tablas!! (que suerte porque sino este post era al pedo :P )
Existen 2 tipo de particiones vertical y horizontal, es decir por filas o columnas.
Vamos a empezar con preguntas frecuentes...
Cuando particionar tablas? Cuando tenes una tabla grande.
Que es grande? Depende del servidor que tengas, de cuanto va a crecer la tabla, etc...
Cuando no esta bueno particionar la tabla? Cuando consultas información vieja todo el tiempo, no vas a ver el cambio, en el caso de particion por fila. Y no es conveniente hacer partición por columna si siempre recupero todas las columnas.
Lo aplico en la base de producción y veo que onda? No seas pavo, lo más conveniente es aplicarlo en un servidor de prueba y probar. Podes jugar con la cantidad de registros de la partición; ver cuales son las tablas que conviene partir. Para esto lo ideal es tener una batería de test de performance y medir, medir y medir... Y al final aplicar en producción.
Como particiono? Buena pregunta, ahora voy a explicar un poco más. Como imaginaran la particiones son por tabla, es decir parto una tabla en n partes, el numero n impacta en la performance por lo tanto hay que elegir el mejor posible y ir probando. Para partir una tabla necesito un criterio de partición; por ejemplo las facturas más viejas a esta fecha se encuentran en una parte; las más viejas que esta otra fecha en otra y así …
MariaDb implementa el particionado horizontal. Básicamente, se pueden realizar cuatro tipos de particionado, que son:
RANGE: la asignación de los registros de la tabla a las diferentes particiones se realiza según un rango de valores definido sobre una determinada columna de la tabla o expresión. Es decir, nosotros indicaremos el numero de particiones a crear, y para cada partición, el rango de valores que serán la condición para insertar en ella, de forma que cuando un registro que se va a introducir en la base de datos tenga un valor del rango en la columna/expresion indicada, el registro se insertara en dicha partición.
LIST: la asignación de los registros de la tabla a las diferentes particiones se realiza según una lista de valores definida sobre una determinada columna de la tabla o expresión. Es decir, nosotros indicaremos el numero de particiones a crear, y para cada partición, la lista de valores que serán la condición para insertar en ella, de forma que cuando un registro que se va a introducir en la base de datos tenga un valor incluido en la lista de valores, el registro se insertara en dicha partición.
HASH: este tipo de partición esta pensado para repartir de forma equitativa los registros de la tabla entre las diferentes particiones. Mientras en los dos particionados anteriores eramos nosotros los que teníamos que decidir, según los valores indicados, a que partición llevamos los registros, en la partición HASH es MariaDb quien hace ese trabajo. Para definir este tipo de particionado, deberemos de indicarle una columna del tipo integer o una función de usuario que devuelva un integer. En este caso, aplicamos una función sobre un determinado campo que devolvera un valor entero. Según el valor, MariaDb insertará el registro en una partición distinta.
KEY: similar al HASH, pero la función para el particionado la proporciona MariaDb automáticamente (con la función MD5). Se pueden indicar los campos para el particionado, pero siempre han de ser de la clave primaria de la tabla o de un índice único.
SUBPARTITIONS: MariaDb permite además realizar subparticionado. Permite la división de cada partición en múltiples subparticiones.
Luego de toda esta teoría solo quedan ganas de partir, de partir tablas! Y se parten así:
CREATE TABLE by_year (
d DATE
)
PARTITION BY RANGE (YEAR(d))
(
PARTITION P1 VALUES LESS THAN (2001),
PARTITION P2 VALUES LESS THAN (2002),
PARTITION P3 VALUES LESS THAN (2003),
PARTITION P4 VALUES LESS THAN (MAXVALUE)
)
Y listo, la macana es que para particionar una tabla existente, tenemos que crear una nueva y copiar los datos y luego renombrar.
Truffle es un framwork Java para construir implementaciones de lenguajes de programación como intérpretes para árboles de sintaxis abstractos auto-modificables. Al escribir un intérprete de lenguaje con Truffle, automáticamente usará el compilador GraalVM como un compilador jit (just in time) para el lenguaje. Al tener acceso a este framework, una aplicación Ruby, por ejemplo, puede ejecutarse en la misma JVM que una aplicación Java. Además, un lenguaje host basado en JVM y un lenguaje invitado pueden interactuar directamente entre sí y pasar datos de un lado a otro en el mismo espacio de memoria.
Con el fin de proporcionar valores políglotas en los lenguajes implementados con Truffle, se ha desarrollado el llamado protocolo de interoperabilidad políglota. Este protocolo de interoperabilidad consiste en un conjunto de mensajes estandarizados que cada lenguaje implementa y usa para valores políglotas. El protocolo permite a GraalVM admitir la interoperabilidad entre cualquier combinación de lenguajes sin que sea necesario que se conozcan entre sí.
En próximos post, vamos a profundizar como ejecutar aplicaciones políglotas con graalvm.
Dejo link: https://www.graalvm.org/reference-manual/polyglot-programming/
Spring lanzo la primera versión de Spring Native, para convertir las aplicaciones Spring Boot existentes, escritas en Java o Kotlin, en imágenes nativas de GraalVM. Las imágenes nativas de GraalVM son pequeñas, optimizadas y se inician rápidamente. Las compensaciones, sin embargo, son tiempos de compilación más largos y menos optimizaciones de tiempo de ejecución en comparación con la JVM.
Trabajando con el equipo de GraalVM durante los últimos 18 meses, Spring Native actúa como un puente para garantizar que GraalVM comprenda el código Spring Boot tradicional.
Dejo link : https://spring.io/blog/2020/11/23/spring-native-for-graalvm-0-8-3-available-now
|
En Microsoft, han visto un crecimiento creciente en el uso de Java por parte de los clientes en sus servicios en la nube y herramientas de desarrollo. Por lo tanto han trabajado para ampliar y profundizar el soporte de Java para clientes y desarrolladores.
Los binarios de Microsoft Build de OpenJDK para Java 11 se basan en el código fuente de OpenJDK, siguiendo los mismos scripts de compilación utilizados por el proyecto Eclipse Adoptium y probados con la suite Eclipse Adoptium Quality Assurance (incluidas las pruebas del proyecto OpenJDK). Sus binarios para Java 11 han pasado el Kit de compatibilidad técnica de Java (TCK) para Java 11, que se utiliza para verificar la compatibilidad con la especificación de Java 11. Microsoft Build de OpenJDK es un simple reemplazo directo para cualquier otra distribución de OpenJDK disponible en el ecosistema de Java.
Los binarios de Microsoft Build of OpenJDK 11 pueden contener correcciones y mejoras que consideramos importantes para sus clientes o usuarios internos. Es posible que algunos de estos aún no se hayan respaldado formalmente en sentido ascendente y estén claramente indicados en las notas de lanzamiento. Esto nos permite acelerar las mejoras y las correcciones mucho más rápido mientras procedemos a implementar esos cambios en paralelo. Las actualizaciones serán gratuitas y estarán disponibles para que todos los desarrolladores de Java las implementen en cualquier lugar.
Microsoft utiliza una variedad de proyectos Java de código abierto para tareas críticas en Azure para respaldar su infraestructura global, así como para Big Data y sistemas de análisis de registros. Los servicios de back-end de LinkedIn y Yammer se implementan casi por completo en microservicios de Java nativos de la nube distribuidos. Minecraft Java Edition también sigue siendo omnipresente con un ecosistema significativo de mods y una comunidad de modders entusiastas, y aprovechamos Java para ejecutar los servidores detrás de Minecraft Realms.
Azure está experimentando un crecimiento significativo en las cargas de trabajo de Java a través de Azure Spring Cloud, Azure App Service, Azure Functions y Azure Kubernetes Service. En el futuro, y una vez que comiencen a implementar nuevas JVM con Microsoft Build of OpenJDK en Azure, buscarán oportunidades para recomendar mejores optimizaciones para cargas de trabajo basadas en Java en estos servicios.
A finales de este año, Microsoft Build of OpenJDK se convertirá en la distribución predeterminada para Java 11 en los servicios administrados por Azure. Los clientes no tendrán que realizar ninguna tarea de mantenimiento, ya que la transición será fluida y transparente a través de la implementación de aplicaciones. Para todos los demás servicios de Azure, los clientes pueden traer el JDK que elijan, incluido Microsoft Build of OpenJDK. Proporcionaremos más actualizaciones sobre eso en los próximos meses.
Dejo link : https://www.microsoft.com/openjdk