Hemos vuelto un a;o y pico despues, y en forma de chapa!
Parece mentira que haya pasado tanto tiempo, me cago en la puta que rapido se me ha hecho xDDD. Mayormente empece el trabajo nuevo y ya tengo mi hogar al que me mude un poquito antes de navidad. Asi que el development lo deje un poquito de lado pero ahora que estoy mucho mas asentado puedo escribir un poco mas sobre mis mierdas por aqui y a que me estoy dedicando ultimamente.
Bancos
Pues la verdad es que el sistema de bancos lleva corriendo ya casi 2 a;os y sigue como el primer dia, he tenido algunos problemas como mencione en su dia en el hilo de automatizacion de bancos con las IDs pero todos solucionados y ahora lleva meses sin pararse nada mas que para refrescar los credenciales que es cada 3 meses (debido a la PSD2, no se puede hacer cada mas).
Asi que, queda todo un poco como en las imagenes que puse por ahi, la verdad es que bastante contento con el resultado! Y he podido estar triste viendo bajar los ahorros con la casa lmao.
Tambien arregle lo que ponia de cambios de dinero entre cuentas que se contaba como gasto y como ingreso, ya no se cuenta de ninguna de las dos maneras.
Deployments
Aqui no ha cambiado tampoco absolutamente nada, los deployments siguen funcionando de puta madre de la misma manera que los updates de los container que se sigue haciendo una vez a la semana, en ese aspecto 10/10.
Rust
Pues he seguido aprendiendo sobre ello, con la sintaxis ya no tengo ningun problema aunque con el borrow checker me sigo peleando de vez en cuando ya no son las mismas peleas que cuando empece xDDD.
Una de las cosas que hice en Rust, fue traducir la herramienta de ocean y tambien el templater (que lo bautice como laguna), a dia de hoy sigo utilizando los templates y de hecho tengo muy pendiente seguir mejorandolos en ese aspecto (asi como el templater). Aunque de esto hablare un poquito mas adelante.
El ultimo proyecto es una especie de randomizer de reglas para cuando juego al ajedrez con un colega que me llevo un par de horas hacer y fue todo bastante fluido!
Development workflow
Aqui es donde creo que mas ha cambiado/esta cambiando en este momento, si recordais el plugin de Gradle que hice hace tiempo (OceanLib, aunque he de renombrarlo joder), me dejaba definir las librerias de una manera mucho mas comoda pero todavia le faltaba algo. Las librerias las tenia que meter en tiempo de compilacion en la libreria para que pudiesen ser autocompletadas, al final lo que he terminado haciendo es un servicio con el que habla el plugin para poder resolver las dependencias (basicamente un traductor de String -> maven) y a;adirle la posibilidad de tener workspaces (ahora los repositorios no usan el .m2/repositories si no el del workspace).
De esta manera, la estructura de directorios quedaria mas o menos asi:
WorkspaceName
---- definition.json
---- src
-------- Package1
-------- Package2
---- .repository
-------- dep1... etc
Y ahi ya podria ejecutar los comandos de hacer building etc (recordad que esto esta en proceso todavia), y las dependencias ahora se cachean por workspace en vez de globales (aunque en esto tambien me gustaria hacer algo).
Asi que ahora con el plugin de Gradle para mis aplicaciones internas actualizado y el resolver de dependencias queda algo bastante guay en general, aunque me quedan por pulir muchas cosas, cosa que ire haciendo poco a poco conforme me vaya encontrando las mierdas, he quedado relativamente contento con el resultado.
Librerias
Como veo que cada vez estoy haciendo mas servicios para cosas internas (ahora estoy haciendo uno para visualizar gastos en las compras de supermercado), me he hecho una libreria para manejar la authenticacion, logging, monitoring y toda esta parafernalia. El core es literalmente 3 interfaces pero que he creado bindings para 2 librerias rest (Spring y Ktor por ahora) para ver como funcionaria y la ire evolucionando poco a poco.
El core es algo asi:
interface Request {
val operation: String
fun getHeader(name: String): String?
operator fun <T> set(key: String, value: T)
operator fun <T> get(key: String): T
}
interface Response {
var statusCode: Int
fun getHeader(name: String): String?
fun setHeader(name: String, value: String)
}
interface RequestInterceptor {
fun preRequest(request: Request, response: Response): Boolean {
return true
}
fun postRequest(request: Request, response: Response) {}
}
Por lo que luego puedo crear los Interceptors que quiera (ejemplo para a;adir la request ID)
class RequestIdInterceptor: RequestInterceptor {
override fun preRequest(request: Request, response: Response): Boolean {
val requestId = UUID.randomUUID().toString()
request["X-Request-Id"] = requestId
MDC.put("X-Request-Id", requestId)
return true
}
}
Y el adapter de Spring en este caso queda algo por el estilo:
class SpringResponse(private val response: HttpServletResponse): Response {
override val statusCode = response.status
override fun getHeader(name: String) = response.getHeader(name)
override fun setHeader(name: String, value: String) = response.setHeader(name, value)
}
class SpringMillyAdapter(private val interceptor: RequestInterceptor): HandlerInterceptor {
override fun preHandle(
request: HttpServletRequest,
response: HttpServletResponse,
handler: Any
): Boolean {
val adaptedRequest = SpringRequest(request)
val adaptedResponse = SpringResponse(response)
return interceptor.preRequest(adaptedRequest, adaptedResponse)
}
override fun postHandle(
request: HttpServletRequest,
response: HttpServletResponse,
handler: Any,
modelAndView: ModelAndView?
) {
val adaptedRequest = SpringRequest(request)
val adaptedResponse = SpringResponse(response)
return interceptor.postRequest(adaptedRequest, adaptedResponse)
}
}
Aunque al adapter este le he puesto alguna que otra cosa mas, pero al final lo unico que tengo que hacer es ponerle una anotacion a la clase principal y a empezar con la logica de negocio! Una cosa que me paso en un proyecto el a;o pasado (de ahi que haya hecho esto), es que me pase mas tiempo haciendo monitoring, logging etc que con la logica de negocio y no quiero que me pase de nuevo xDDD
Ideas futuras
Debido a que estoy creando muchos servicios, tambien me toca crear muchos clientes (e incluso las interfaces de los servicios), quiero crearlos automaticamente. He visto que para este tipo de cosas esta OpenAPI/Swagger (creo recordar, he de mirarlo), pero no se yo si me van a gustar sus soluciones, estoy casi seguro de que al final acabare haciendo mis mierdas (ya que me lo paso muy bien en el proceso).
La segunda es que quiero mejorar Ocean para poder leer el fichero de dependencias y poder hacer building del workspace entero sin preocuparme del orden y que se haga de manera atomica (poder cambiar varios repositorios a la vez).
La tercera es que me gustaria poder crear varias reviews pero hacer building de todas a la vez, para esto debo crear un servicio que se baje el codigo de varias reviews y ejecute Ocean. Esto me gustaria que fuese mas o menos agnostico ya que existen muchos host (Jetbrains Space, Github, Gitlab, Bitbucket) y luego poder crear los adapters de cada uno. Esta es la idea mas lejana pero que es a lo que mas me gustaria llegar porque estoy hasta las pelotas de que en los hosts de codigo solo te dejen crear una review de un repositorio en vez de varios y es algo que me parece increible que no se haya hecho todavia. Si en el futuro algun host ofrece eso pue sseria bastante sencillo cambiar el adapter.