añadidos posts

This commit is contained in:
2025-05-23 10:47:44 -03:00
parent 4022064442
commit 70713a2fd1
17 changed files with 543 additions and 0 deletions

View File

@@ -0,0 +1,20 @@
---
title: "Coord Keeper"
description:
date: 2025-03-19T02:53:57-03:00
image: cover.png
math:
tags: ["DevLog"]
license:
hidden: false
comments: true
draft: false
---
# Motivacion
He notado que en versiones actuales de minecraft han puesto mucha informacion en el menu de debug (el <kbd>f3</kbd>) lo que lo hace cada vez más hostil al jugador promedio intentar encontrar la linea con las coordenadas de donde esta y poderse comunicar con la gente en el mismo servidor, es obvio que esto es totalmente intencionado. Entiendo que el objetivo es que uses las herramientas dadas por los diseñadores del videojuego para poder localizarte. Pero yo necesito una forma de poder guardar las coordenadas localmente en mi computadora. aunque podria haber usado un block de notas para almacenarlas me decidí por hacer algo más inproductivo.... hacer una app de react.
Así que presento Coord-Keeper una app nefasta de React para guardar, compartir y importar Coordenas de minecraft. !!!11!!!
Esta disponible en [Coord-keeper](/coords)
su [codigo fuente](/git/fede/coord-keeper) esta en mi instancia de gitea.

View File

@@ -0,0 +1,93 @@
---
layout: post
title: "Diseño de Software Incident"
date: 2023-09-22T15:08:17+08:00
tags: ["old_blog"]
math: false
draft: false
---
# Instanciacion del SqlConnection
```csharp
using (var connection = new SqlConnection(configuration.GetConnectionString("DefaultConnection")))
```
Eso genera un sql connection que va a existir hasta que salga del scope del programa.
# Creacion del SqlCommand
```csharp
using var command = new SqlCommand();
command.CommandText = "sp_RecuperaProductos";
command.CommandType = System.Data.CommandType.StoredProcedure;
```
# Apertura de la coneccion
```csharp
command.Connection = connection;
command.Connection.Open();
```
## Utilizacion del ExecuteReader
Es un choclo pero basicamente el codigo de abajo se encarga de iterar por cada uno de las entradas de la tabla. **MUY** importante, se tiene que añadir los productos dentro del loop principal del reader ya que lo que no se guarde en cada iteracion se pierde. (los maps no son case sensitive).
```csharp
var reader = command.ExecuteReader();
while (reader.Read())//lee a traves de todas las filas que existen en la tabla
{
//por cada fila que creo tengo que asignar manualmente cada columna con cada propiedad
var producto = new Producto();
producto.Codigo = reader["Codigo"].ToString();
producto.Nombre = reader["Nombre"].ToString();
producto.Cantidad = Convert.ToInt32(reader["Cantidad"].ToString());
producto.CantidadMinima = Convert.ToInt32(reader["CantidadMinima"].ToString());
producto.Precio = Convert.ToDecimal(reader["Precio"].ToString());
var codigoCategoria = reader["CodigoCategoria"].ToString();
producto.Categoria = RepositorioCategorias.Instancia.RecuperarCategorias().FirstOrDefault(c => c.Codigo == codigoCategoria);
//////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////
using var commandProveedores = new SqlCommand();
//otra forma de hacerlo es usando Store Procedures
commandProveedores.CommandText = "sp_RecuperarProveedoresProducto";
commandProveedores.CommandType = System.Data.CommandType.StoredProcedure;
commandProveedores.Parameters.Add("@CodigoProducto", System.Data.SqlDbType.NVarChar,25).Value = producto.Codigo;
/////////////////////////
commandProveedores.Connection = connection;
var readerProveedoresProducto = command.ExecuteReader();
while (readerProveedoresProducto.Read())//lee a traves de todas las filas que existen en la tabla
{
var codigoProveedor = readerProveedoresProducto["CodigoProveedor"].ToString();
var proveedor = RepositorioProveedores.Instancia.RecuperarProveedores().FirstOrDefault(x => x.Codigo == codigoProveedor);
producto.AgregarProveedor(proveedor);
//una vez cargado el objeto completo lo agrego a la coleccion
}
productos.Add(producto);
}
```
# Cerrado de la coneccion
NOTA: no ser mamerto y cerrar la coneccion fuera del while-loop.
```csharp
command.Connection.Close();
```
# Sub-Query
```csharp
using var commandProveedores = new SqlCommand();
commandProveedores.CommandType = System.Data.CommandType.StoredProcedure;
commandProveedores.CommandText = "SP_AGREGARPROVEEDORPRODUCTO";
commandProveedores.Connection = connection;
commandProveedores.Transaction = sqlTransaction;
commandProveedores.Parameters.Add("@CodigoProducto", System.Data.SqlDbType.NVarChar,25).Value = producto.Codigo;
commandProveedores.Parameters.Add("@CodigoProveedor", System.Data.SqlDbType.NVarChar, 25);
foreach (var proveedor in producto.Proveedores)
{
commandProveedores.Parameters["CodigoProveedor"].Value = proveedor.Codigo;
commandProveedores.ExecuteNonQuery();
}
```
# Non-Query
Un query es una consulta de tipo UPDATE, INSERT, DELETE, para el ExecuteNonQuery se devuelve la cantidad de ramas afectadas, menos en el uso de un StoredProcedure donde devuelve -1.
# Notas
> " Si compila y anda, aprueba " ~Laureano

View File

@@ -0,0 +1,11 @@
---
title: "Experimento Gtk3 + Rust"
description:
date: 2024-10-15T19:29:43-03:00
image:
math:
license:
hidden: false
comments: true
draft: true
---

View File

@@ -0,0 +1,71 @@
---
title: "Fix Screen Tear x11"
date: 2024-11-09T13:28:17+08:00
tags: ["Fix"]
image: cover.jpg
math: false
draft: false
---
# ¿Que es el screen tear?
buenas, Si alguna vez instalaron un wm liviano en linux que no use wayland seguramente habrán notado que al momento de mover una ventana en el escritorio o ver un video sucede algo de este estilo.
![Imagen sacada de google donde se demuestra el screen tear](https://qph.cf2.quoracdn.net/main-qimg-4994dca8fc9979e8a10d3422cb5f7bcb)
Donde la imagen se ve recortada por algunos milisegundos. A mi se me hace muy molesto a la vista cuando estoy mucho tiempo (relativamente) delante de la pantalla.
# Solucion
Esto Parece suceder porque muchos [WindowManagers](https://en.wikipedia.org/wiki/X_window_manager) de linux muestran un frame nuevo independientemente de si la gpu logró terminar de dibujar el proximo frame(buffer).
Encontré un parametro que se le puede pasar al X11 para evitar que se muestre un frame que la gpu aun no termino de actualizar.
## Cosas que necesitamos
1. Tener `inxi` instalado
En Arch se puede instalar con un
```
sudo pacman -S inxi
```
y supongo que lo mismo pero reemplazando `pacman -S` por `apt install` en distros debian-base.
2. Necesitamos editar uno(o dos) archivos en el **/usr/share/**
Asi que verifica que tengas permisos para poder escribir en ese path.
## Paso a Paso
1. Executamos `inxi -G`.
Con esto nos daremos cuenta de que tipo de grafica tenemos. En mi caso es una integrada amd
```
i ➜ ~ inxi -G
Graphics:
Device-1: Advanced Micro Devices [AMD/ATI] Lucienne driver: amdgpu v: kernel
```
Por lo que el archivo que tengo que editar es "/usr/share/X11/xorg.conf.d/10-amdgpu.conf"
```
Section "OutputClass"
Identifier "AMDgpu"
MatchDriver "amdgpu"
Driver "amdgpu"
Option "HotplugDriver" "amdgpu"
EndSection
```
Donde añado la opcion "TearFree" "on"
```
Section "OutputClass"
Identifier "AMDgpu"
MatchDriver "amdgpu"
Driver "amdgpu"
Option "HotplugDriver" "amdgpu"
Option "TearFree" "on"
EndSection
```
Demostracion de como queda
![demo tear resuelto](./tear.gif)

View File

@@ -0,0 +1,25 @@
---
title: 'Imagenes: Color a b&w'
date: 2023-09-23T10:35:18-03:00
draft: false
tags: ["old_blog"]
---
# Gimp
Hay varias formas de pasar una imagen a blanco y negro. yo prefiero la de usar **Gimp** con la opcion de `Color > Desaturacion > Color a gama de grises`. Pero voy a listar un par de métodos alternativos para obtener el ~mismo resultado.
![Comparación](/fedecomp.png)
# ImageMagick
> Es un conjunto de utilidades de código abierto para mostrar, manipular y convertir imágenes, capaz de leer y escribir más de 200 formatos.
Una de esas utilidades es llamada `convert`, la cual acepta un archivo y convierte este a el formato que se le especifique. Existe una flag llamada `-colorspace` la cual si le damos el parametro **Gray** la imagen resultante estará representada en una gama de grises.
![Imagen en gama de grises](/fedeg.jpg)
## Nota
Tambien se puede usar la flag `-monocrome` pero esta da un resultado el cual no me termina de gustar, a continuacion doy un par de muestras de como queda,
![Imagen monocroma](/fedebw.jpg)
# Opcion web
Existe [esta](https://pinetools.com/es/imagen-escala-grises) pagina en la cual para generar la imagen en gama de grises solo hay que poner la imagen y darle a **Aplicar**.
![Gama de grises demo](/gamaDeGrises.jpg)

View File

@@ -0,0 +1,14 @@
---
layout: post
title: "RetroArchivements"
date: 2023-09-22T13:30:17+08:00
tags: ["old_blog"]
math: false
draft: false
---
Hace ya un par de dias que estoy usando un [servicio](https://retroachievements.org/user/fedpo2) que implementa una api para trackear tu progreso en distintos juegos retro y no tan retro.
Uno de los que estoy jugando es `Kirby's dream land 2`
![kirby](https://media.retroachievements.org/Images/046585.png)

View File

@@ -0,0 +1,9 @@
---
title: 'ServerMC'
date: 2023-10-27T08:34:58-03:00
tags: ["old_blog"]
draft: true
---
# ¿Que es?
En despues de navidad voy a estar hosteando un server de minecraft (si otra vez 🙄), con varios mods del lado de servidor

View File

@@ -0,0 +1,40 @@
---
title: "Sistema Alquileres DevLog n1"
date: 2024-11-10T00:08:17+08:00
tags: ["DevLog"]
image: cover2.png
math: false
draft: false
---
# ¿Que es esto?
Estas son pequeñas updates que voy a estar haciendo sobre el proyecto final mio de "Ingenieria de Software" (asi se llama la materia). El cual consiste de un sistema de gestion de alquileres. Pensado para tener varios tipos de usuario como un propietario que carge las propiedades que desea publicar siempre y cuando este verificado que le pertenecen a él y un inquilino el cual podra efectuar busquedas de propiedades para alquilas, ver el estado de los alquileres, y pagar los alquileres que sean correpondientes.
Ahí arriba describi solo 2 o 3 de los casi 26 casos de uso que tengo descriptos. Además voy a reutilizar los conocimiento que adquirí haciendo el panel de control para la materia de base de datos.
> Se vienen cositas
Bueno ahora voy a hacer un mini-informe sobre el modulo de seguridad
# Permisos para los clientes
Cito de la entrega del segundo parcial.
>En cuanto a como va el desarrollo, te diria que bien encaminado, actualmente estoy usando svelte/bootstrap para el front y aspnet core 8 ( ? ) para el backend. ya tengo definido que acciones puede hacer un cliente en el sistema mediante un sistema usuario-grupo-permiso Similar a como los permisos son definidos en linux (donde por ejemplo un usuario para poder acceder al uso del audio del servidor necesita estar en un grupo "audio" o para escribir a un almacenamiento en cinta necesita pertenecer al grupo "tape") En mi proyecto por ahora tengo 3 grupos que consisten en los 3 actores que tengo definidos (inquilino, propietario, administracion). Entonces cuando checkeo por si un cliente tiene acceso a un permiso lo puedo averiguar de forma sencilla:
```csharp
var permisos = con.Clientes
.Where(c => c.Dni == cli.Dni)
.SelectMany(c => c.Idgrupos)
.SelectMany(g => g.Idpermisos)
.Distinct();
```
Esto dandome una lista de todos los permisos que posee el cliente.
Tambien tengo hechos los abm de inquilino/propietario pero hay menos que comentar sobre eso.
# Almacenamiento de Contratos de Alquiler
Un requisito que considero muy importante es almacenamiento de los contratos de alquiler. En una primera instancia pense que almacenarlos en un campo blob de mysql podia ser factible pero entre lo que escuché sobre que hace los backups de la base de datos gigantes y el hecho de que estaria haciendo una query a la base de datos para obtener, ponele, 3MB me parece un montón
Almacenarlos con un fileserver simple como [Miniserve](https://github.com/svenstaro/miniserve) que es una excelente herramienta si bien para casos donde tenes un solo servidor pareceria masomenos pasable al final termina no siendo tan buena idea si llegas a necesitar algo minimanente distribuido o que maneje permisos.
Así fue como luego de preguntarle a un amigo y a chatgpt. me decidí por darle una oportunidad a [Minio](https://min.io/) que es una alternativa "S3 pero hosteado en casa". tengo mucho que aprender aún sobre s3 porque tengo solo una idea general de como funciona. Así que voy a dejar una update de esto en unos dias o semanas (no hay chances que sea consistente publicando acá) sobre como va esto. bye.

View File

@@ -0,0 +1,28 @@
---
layout: post
title: "Proximamente: Server Terraria"
date: 2023-09-22T22:24:17+08:00
math: false
draft: true
---
# Anuncio
En los proximos dias voy a estar armando un server de terraria, estoy armando una lista con un par de mods que vamos a poner para ese entonces.
## Mods
A continuacion voy a tirar una lista preliminar de los mods que tengo pensado utilizar:
- [X] **Magic Storage**
Este es uno que no puede faltar _literal_.
- [X] **Calamity**
Tengo pensado poner la versión con Música pero voy a ver si me lo tira la ram ( seguro que sí ).
- [X] **Wing Slot**
Me genera un dilema _Moral_ usar un mod que añada item slots pero creo que este pasa.
- [X] **Boss Checklist**
Sin este mod me voy a terminar acordando de invocar a la reina slime **post-moonlord**.
### Sugerencias
Estoy abierto a que tiren posibles candidatos para añadir a la lista de mods.
## Invitados
- [X] Si estas leyendo esto estás invitado al server de Terraria cuando arranque.

View File

@@ -0,0 +1,15 @@
---
title: 'Anuncio Aoc 2023'
date: 2023-10-03T12:54:22-03:00
tags: ["old_blog"]
draft: false
---
# ¿Que es Advent of Code?
Son un grupo de puzzles de programacion presentados en forma de calendario que suelen ser utizados como:
- Preparacion de entrevistas.
- Training en empresas.
- Practica para familiarizarse con nuevos lenguajes de programacion.
- _etc..._
# Que tengo pensado
Cerca de fin de año voy a hacer todos los dias de esa edicion de advent of code usando `zig` como un ejercicio para aprender ese lenguaje de programacion `(aunque de forma básica)`.

View File

@@ -0,0 +1,15 @@
---
title: 'Bootloader Incident'
date: 2023-09-26T22:27:20-03:00
tags: ["old_blog"]
draft: false
---
# El inicio de la catastrofe
En pocas palabras, **Nunca Corten Un `pacman -Syu`**.
Si utilizan **arch** sabrán que se pueden configurar 'hooks' antes y despues de las operaciones con el comando `pacman`, uno de estos era responsable de actualizar la entrada en el bootloader (uso systemd-boot btw). Al haber cortado sin querer este proceso me quedé sin entrada en el bootloader para linux y solo podia volver al menu de la **UEFI**.
# Posibles Soluciones
## Opcion Atomica
Consiste en reinstalar linux desde 0. ( pero no desde scratch 😳 ). Obviamente es una terrible idea pero es una a la que en otro momento antes de haber aprendido a usar arch hubiera solucionado de esa forma.
## Lo que termine haciendo
Gracias a que tenia una lectora de dvds con un dvd de Linux, pude utilizar `mount` y `chroot` para acceder a la particion con todos mis datos, una vez en este punto reinstalé el kernel (`pacman -S linux`) para que se activen los hooks que corresponden a actualizar la información sobre las opciones de arranque del bootloader.

View File

@@ -0,0 +1,21 @@
---
title: "Primer Post"
date: 2023-09-22T12:28:17+08:00
tags: ["old_blog"]
math: false
draft: false
---
# buenas
buenas
Luego de sufrir bastante con el nginx y su *Reverse Proxy*, finalmente me decidí por poner la pagina del blog en el **WebRoot** y el _gitea_ en un subfolder.
## Como funciona esto
El programa que estoy usando para hacer este blog se llama [Hugo](https://gohugo.io), consiste de una especie de parceador de [Markdown](https://www.markdownguide.org/) a Html estático el cual hosteo con este [webServer](https://nginx.org/en/).
### Como hago nuevos posts
Dentro de la carpeta del proyecto del server hay una que se llama content, todos los `.md` que haya ahí cuando utilizo el comando:
```bash
hugo
```
se genera el html de la paginas del blog las cuales copio usando rsync dentro de la intranet de mi casa
> Luraschi no me robes las llaves del ssh🙏.

View File

@@ -0,0 +1,22 @@
---
layout: post
title: "String Interpolation"
date: 2023-10-24T22:24:17+08:00
tags: ["old_blog"]
math: false
draft: false
---
# ¿Que es?
Es un proceso de evaluado, en el cual se reemplazan placeholders en `string` por valores, en nuestro caso, de variables en momento de ejecución.
# Sintaxis
var manzanas = 4;
var bananas = 3;
Console.WriteLine($"Tengo {manzanas} manzanas");
Console.WriteLine($"Vendí {manzanas + bananas} frutas");
> Basicamente son plantillas.