Mostrando entradas con la etiqueta Tips. Mostrar todas las entradas
Mostrando entradas con la etiqueta Tips. Mostrar todas las entradas

martes, 27 de marzo de 2018

Todas las abstracciones fugan

Esta frase la he escuchado (y leído) bastantes veces, y para ser honesto, nunca terminé de entender a que se refería. Hace poco volví a leerla y me dije: Entendámosla de una vez por todas
¿De donde viene todo? Del artículo The law of leaky abstractions, escrito en Noviembre de 2002 por Joel Spolsky.

“All non-trivial abstractions, to some degree, are leaky”

Viene a decir que toda abstracción, excluyendo aquellas que son triviales, tarde un temprano fuga, revelando aspectos que tratábamos de abstraer.

Veámoslo con un ejemplo:


Todos hemos visto una implementación del patrón repository como la siguiente:

    public interface IStudentRepository : IDisposable
    {
        IQueryable<Student> GetStudents();
        Student GetStudentByID(int studentId);
        void InsertStudent(Student student);
        void DeleteStudent(int studentID);
        void UpdateStudent(Student student);
        void Save();
    }

El hecho de que el método GetStudents devuelva un IQueryable implica que debamos conocer detalles acerca de la implementación del repositorio, conocer que hay detrás, ya que el proveedor de Linq ejecutará algunas instrucciones en memoria y otras sobre una motor de bases de datos. No podemos ignorarlo si queremos no meternos en líos. Podemos decir por tanto que nuestra abstracción IStudentRepository fuga


¿Hay más ejemplos comunes?


Por supuesto, una rápida búsqueda por internet nos dará un bonito listado de abstracciones, que usamos comúnmente, y que fugan (¿todas lo hacen no? XDXD)
  • El garbage collector: tarde o temprano, si tu aplicación realiza mucha presión sobre la memoria, o si es una aplicación que necesita un altísimo rendimiento, tendrás que entender su implementación para alcanzar ese nivel de optimización deseado.
  • Un sistema de ficheros distribuido, bajo SMB por ejemplo, trata de abstraerte de que los ficheros están en remoto, mostrándolos como si de un disco local se tratase.  No obstante la latencia o los posibles micro-cortes de red pueden hacer que tengas que manejar dichos ficheros de un modo diferente (y conocer que de hecho esos ficheros no son locales).
  • La clase string de C# por ejemplo, que debido su implementación genera un nuevo string cada vez que concatenamos dos strings existentes previamente. Si no conocemos este detalle, podemos sufrir serios problemas de rendimiento y escalabilidad.

¿Es esto malo?


No lo considero necesariamente malo, simplemente está ahí y lo mejor es que lo conozcamos y seamos conscientes de ello.
Nuevas tecnologías y herramientas tratan de elevar el nivel de abstracción que manejamos al desarrollar software, nos obstante, ya que estas abstracciones fugarán de un modo u otro, debemos conocer sus detalles, cómo estas abstracciones funcionan y han sido implementadas, antes de pasar sin más a utilizarlas.

Recursos: 


jueves, 1 de junio de 2017

Tip acerca del code coverage en una VSTS Build

Estaba hoy “jugando” con las builds de Visual Studio Team Services, quería ver la cobertura de código que tenía después de ejecutar mis tests… es sencillo, tan solo hay que activar un check en la configuración de la build para que la ejecución capture la cobertura.
Supongo que sabéis que una vez que VSTS os muestra el resultado de la build, incluyendo la cobertura, podemos descargar dicha cobertura para realizar un análisis más en profundidad en nuestro Visual Studio


clip_image002

Abriendo el archivo en Visual Studio me llevé una desagradable “sorpresa:


clip_image003

Podéis ver como la cobertura está teniendo en cuenta 3 asemblies que en principio no deberían estar ahí, ya que son dependencias a través de paquetes NuGet. Qué demonios, ¡Yo sólo quiero ver la cobertura de mi código!

Lo primero, entender la causa: ¿Por qué pasa esto?

Parece que por defecto VSTS va a tratar de analizar la cobertura de todo assembly para el cual tenga símbolos. Buscando en mi carpeta packages, o en mi bin, efectivamente, los assemblies “malignos” tienen además de su dll un bonito archivo .pdb, es decir símbolos.  Parece que VSTS hace bien su trabajo L


clip_image005

No quiero entrar en la discusión ahora mismo, eso daría para un post entero pero el caso es que hay paquetes que lo hacen, incluyen símbolos, aunque la recomendación parece ser tener dos paquetes, el “normal” sin símbolos, y el que incluye símbolos, por si se necesitan….

Aquí vais a encontrar información:
· https://github.com/elastic/elasticsearch-net/issues/436
· https://docs.microsoft.com/es-es/nuget/create-packages/symbol-packages

En cualquier caso, si no lo remediamos vamos a “ensuciar” nuestros datos de code coverage, ha

¿Que podemos hacer?


De momento solo he encontrado un modo, mediante el uso de un archivo de tipo .runsettings, en el que podamos excluir ciertos elementos de la cobertura. En este caso vamos a excluir los 3 assemblies:


clip_image006

Podéis ver aquí documentación oficial, hay opciones para incluir y excluir assemblies, funciones y atributos

¿Cómo lo uso en visual studio? Tan solo debo seleccionar el archivo, en la siguiente imagen indico como se hace. A partir de ese momento el archivo “aplicará” siempre que lo tengamos marcado, como se ve en la imagen anterior


clip_image007
clip_image008

Parece que está funcionando, ya no vemos assemblies externos, pero vemos el assembly de tests, y este tampoco lo queremos. Aquí debemos jugar con los atributos, hay que modificar nuestro fichero para que también excluya el atributo [ExcludeFromCodeCoverage] con el que decoramos nuestras clases de tests (https://msdn.microsoft.com/en-us/library/system.diagnostics.codeanalysis.excludefromcodecoverageattribute(v=vs.110).aspx)


clip_image009

Mis clases de tests son así:


clip_image010

Ya tenemos todo lo necesario entonces, ¿cómo lo llevamos a VSTS? Pues bien, debemos subir el fichero a nuestro control de código fuente de modo que VSTS lo pueda encontrar. Además, hay que indicar en la build, en el paso de ejecución de tests, que utilice dicho fichero


clip_image012

Una vez hecho esto podemos lanzar una nueva build y ver que la cobertura de código ya solo incluye lo que queremos.


clip_image013

Objetivo cumplido, aquí podéis descargar mi fichero .runsettings


Espero que os sea de utilidad.

viernes, 11 de noviembre de 2016

Off topic: conservando el espacio en disco

Acabo de reinstalar mi equipo de casa, compre un nuevo y flamante SSD (detalle) y ahora tengo una configuración con 2 discos:
  • SSD de 240 GB para el sistema
  • Disco tradicional 1 TB para datos
No se a vosotros… pero a mi normalmente (tengo 2 equipos más con este tipo de configuración) me dura menos el espacio en C que las cervezas en la nevera, así que he decidido ponerme manos la obra: ¿Como conservar y liberar el espacio en disco (Sobre todo de la unidad de sistema)?

 

¿Alguna vez hibernas tu equipo?

Si la respuesta es NO mejor que sepas que estás perdiendo algunos GB
Para verlos cambia la configuración por defecto de explorador de archivos para poder ver los archivos protegidos:
image

image

Veras un archivo hiberfil.sys, comiéndose algo de espacio (más de 3 GB en mi caso). Desactiva la hibernación ejecutando el siguiente comando en una ventana de comandos con privilegios elevados:
                                                          powercfg.exe -h off
Después de reiniciar el fichero habrá desaparecido

 

¿Los archivos temporales ocupan demasiado?

Pues podemos sacarlos de C y moverlos al disco de datos. Para ellos vamos a Control Panel => System & Security => System => Advanced System Settings, y nos vamos a la sección de variables de entorno. Allí encontraremos 2 variables de sistema, que podemos modificar para nuestro fin

image
Yo las he movido a mi disco tradicional, que está en D.

 

¿Demasiada información de recuperación?

Los puntos de restauración pueden ahorrarte más de un disgusto, pero tambien pueden estar consumiendoi demasiado. Puedes llegar a de nuevo ellos desde Control Panel => System & Security => System => Advanced System Settings

image
Mi consejo: deja el ultimo y cárgate los demás. Además asegúrate de limitar correctamente el máximo tamaño que permites ocupar. Como veis yo lo he limitado al mínimo: 1% de mi disco

image

 

¿Sabías que Windows trae una herramienta para limpiar discos?

Se puede llegar a ella de varios modos, el que yo uso es a través de las propiedades de un disco:

image
Una vez en la herramienta, analizará vuestro disco y propondrá elementos a eliminar. Como veis nhay un bug raro por ahi…  mirad lo que dice que puede borrar: 3.99TB!

image
Si seleccionamos lo que queremos borrar y pulsamos Aceptar Windows se encargara de borrar lo indicado y recuperaremos algo de espacio. Mi experiencia es que esta herramienta es fiable, no tengais miedo.

 

¿Tienes muchas cosas en OneDrive?

Por defecto Onedrive sincronizará vuestros datos en una carpeta en C… y no queremos eso. Yo tengo como 60GB de información en Onedrive y claro,m quiero sacarlos de ahí. Lo podemos hacer de un modo muy sencillo al instalar Windows 10, pero si no es el caso aun podemos hacerlo: id a las propiedades de Onedrive (botón derecho sobre el icono) y después desvinculad. Al volver a configurar la cuenta de Onedrive podréis elegir la nueva ubicación. Eso si, espero que tengáis una buena conexión, porque volverán a descargarse todos los archivos

image

 

Haz que Windows instale aplicaciones y almacene cierto elementos donde quieras

Si escribes “Almacenamiento” en la caja de búsqueda llegarás a una opción de configuración que te permite determinar en que unidad windows maneja ciertos elementos, como las aplicaciones de la tienda que instales, las fotos y otros.

image

image

Hasta aquí, no suele ser la temática de este blog, peeero, a mi me ha venido bien y quizás a alguien tb

sábado, 6 de febrero de 2016

¿Problemas de sincronización en Microsoft Edge?

Normalmente no publico tips o consejos sobre sistemas operativos y dispositivos. Sin embargo hacía tienpo que un problema es estaba molestando bastante y ya que con lai nestimable ayuda de Internet lo solucione quiero compartir dicha solución.
Vereis: En el ámbito personal uso principalmente dos equipos: Una surface pro 3 y un ordenador de sobremesa, ambos con Windows 10. Todo funcionaba con normalidad hasta que hace algunas semanas empece a notar que los favoritos y la lista de lectura de Edge (si, uso Edge, llamadme raro) no estaban sincronizados. Si lo habían estado en el pasado, pero esa relación parecía haber terminado Broken heart

Me dispuse a ver si algún setting había cambiado en Edge, y al ir a la configuración vi que la opción de sincronización estaba desactivada, y además en gris, sin permitirme modificarla:

EdgeSync1

Siguiendo las instrucciones fui a la configuración de Windows (pinche en Settinhs), para comprobar que allí todo estaba bién, la sincronización estaba activada:

EdgeSync2

Este mismo escenario estaba en los dos equipos… ¿Que pasaba?  No lo se, estas son las cosas que me desesperan de Windows, pero bueno, un rato dse busqueda en internet me llevó a la solución: Editar en el registro (regedit.exe) la clave SyncPolicy que esta en la siguiente ruta:

HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\SettingSync

El valor a asignar es el 1 (estaba a cero).

Una vez hecho ya pude activar la sincronización en Edge:

image

Y lo mas curioso: solo necesité hacerlo en uno de los equipos. Una vez lo hice en el primero(el desktop) los favoritos de Edge empezaron a sincronizarse. Fui a la surface y la setting de sincronización se había activado sola Smile

Si esto resuelve a alguién su problema… genial!