viernes, 30 de noviembre de 2018

Portátil nuevo, Windows 10

Vale lo reconozco tengo portátil personal nuevo. Total solo han pasado 10 años desde el ultimo.

Las cosas que he aprendido con mi nuevo portátil :

1 Se me ocurrió la feliz idea de instalar una maquina virtual. Pero por supuesto mi portátil lo impedía por la BIOS. Vale no pasa nada, total solo tengo que darle a la tecla en el momento del inicio. Eso seria fácil si no fuera porque tiene Windows 10 y un arranque tan rápido que es imposible hacerlo así.
Por supuesto mire en Internet y lo encontré . Windows trae la posibilitad de acceder a la BIOS desde Windows. Esta oculto pero funciona

https://www.xataka.com/basics/como-acceder-bios-tu-pc-windows-10

Esto por puesto te vale también si quieres arrancar desde USB o cualquier cosa que quieras hacer con arranque. Ojo: no usar sino tienes claro lo que quieres cambiar

2. Por supuesto mi nuevo portátil lo único que contenía la caja era el cargado y el portátil. Relax hay una forma sencilla de hacer un "discos" de recuperación.  Como hacerlo

3. Que el nuevo Windows te permite hacer shanshot. Que fuerte. Esta es la típica cosas que siempre hacen los de sistemas y piensa que útil una pena que en casa esto no sea posible. Seamos sinceros el desinstalar aplicaciones nunca funciona bien (ni en Windows, ni en móviles )

viernes, 27 de abril de 2018

Llamadas REST al TFS


El TFS se puede consultar por llamadas REST, puedes usar las librerías para tal efecto o puedes hacerlas tú las llamadas
Obtener una lista de proyectos seria

public ListofProjectsResponse.Projects GetAllProjects()
        {
            ListofProjectsResponse.Projects viewModel = null;
            using (HttpClient confClient = new HttpClient(GetCredential()))
            {
                confClient.BaseAddress = @”http://nametfs:8080/tfs/DefaultCollection/”;
                confClient.DefaultRequestHeaders.Accept.Clear();
                confClient.DefaultRequestHeaders.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/json"));
                HttpResponseMessage message = confClient.GetAsync("_apis/projects?stateFilter=All&api-version=1.1").Result;
                if (message.IsSuccessStatusCode)
                {
                     viewModel = message.Content.ReadAsAsync<ListofProjectsResponse.Projects>().Result;
                }
            }
            return viewModel;

}

La seguridad puede ser por un tokent del TFS o puede que no lo tengas así configurado y sea una configuración de Windows. Si ese es tu caso en USUARIO y PASSWORD tienes que poner un usuario con permisos sobre el TFS
 private WebRequestHandler GetCredential()
        {
            WebRequestHandler authtHandler = new WebRequestHandler()
            {
                Credentials = new NetworkCredential(USUARIO, PASSWORD)
            };
            return authtHandler;
        }



Si está configurado con autentificación Basic

public ListofProjectsResponse.Projects GetAllProjects()
        {
            ListofProjectsResponse.Projects viewModel = null;
            using (HttpClient confClient = new HttpClient())
            {
                confClient.BaseAddress = @”http:// nametfs:8080/tfs/DefaultCollection/”;
                confClient.DefaultRequestHeaders.Accept.Clear();
                confClient.DefaultRequestHeaders.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/json"));
                confClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", _credentials);
                HttpResponseMessage message = confClient.GetAsync("_apis/projects?stateFilter=All&api-version=1.1").Result;
                if (message.IsSuccessStatusCode)
                {
                     viewModel = message.Content.ReadAsAsync<ListofProjectsResponse.Projects>().Result;
                }
            }
            return viewModel;

}

Donde:  _credentials= Convert.ToBase64String(System.Text.ASCIIEncoding.ASCII.GetBytes(string.Format("{0}:{1}", "", PersonalAccessToken)))

PersonalAccessToken à este es un valor que tienes en el TFS

viernes, 20 de abril de 2018

Compartir ficheros entre proyectos

Tengo una proyecto asp webform .net del que tengo que hacer otro sitio con parte del código.
Necesito una web nueva, pero que comparta controles de usuario, paginas aspx de la 1 aplicación.  No quiero copiar  y pegar el código y tenerlo duplicado.
 Solución
Pasos
1.       Me creo un proyecto vacío
2.       Añado todo lo que necesito (aspx, ascx, ccs, js ) pero lo añado como link (nuevo elemento existente , y añadir como enlace)

Al añadir como link el código realmente no está en mi directorio, y eso hace que falle al ejecutar sobre el 
La solución es añadir esto al final del fichero del proyecto:

 <Target Name="CopyLinkedContentFiles" BeforeTargets="Build">
    <Copy SourceFiles="%(Content.Identity)" DestinationFiles="%(Content.Link)" SkipUnchangedFiles="true" OverwriteReadOnlyFiles="true" Condition="'%(Content.Link)' != ''" />
  </Target>  

Hace es una copia de todos los ficheros que son link a nuestro directorio  y ya funciona todo. 


viernes, 12 de enero de 2018

Doble-click en controles ListBox

Los controles ListBox no tiene un evento de servidor para el dobleclick
La solución que más consiste en capturar el doble click por JavaScript e invocar un sumit de un botón oculto.

No me gustaba mucho la idea.
Desde la base de

Hice el mío  propio,  
    public class MiListBox : ListBox, IPostBackEventHandler
    {
       
        #region IHttpHandler Members

        public bool IsReusable
        {
            
            get { return true; }
        }
       
        public void ProcessRequest(HttpContext context)
        {
            //Escriba aquí la implementación del controlador.
        }

        #endregion

        public event EventHandler DblClick;
        private const string _DOUBLE_CLICK = "dbl";
        protected virtual void OnDblClick(EventArgs e)
        {
            if (DblClick != null)
            {
                DblClick(this, e);
            }
        }
        protected override void OnInit(EventArgs e)
        {
            if (this.Page != null)
            {
                this.Page.RegisterRequiresControlState(this);
            }
            base.OnInit(e);
        }
        protected override void OnPreRender( EventArgs e)
        {
            string script = this.Page.ClientScript.GetPostBackEventReference(this, _DOUBLE_CLICK);
            this.Attributes.Add("ondblclick", script);
            base.OnPreRender(e);
        }
        public void RaisePostBackEvent(string eventArgument)
        {
            if (eventArgument == _DOUBLE_CLICK)
            {
                this.OnDblClick(EventArgs.Empty);
            }
        }
    }
Yo no necesitaba  datos, ni da por el estilo por eso  hereda de IPostBackEventHandler e implementar la función RaisePostBackEvent  

Si hubiera  necesitado datos tendrá  que haber heredado de  IPostBackDataHandler  e RaisePostBackData

viernes, 20 de octubre de 2017

Borrar registros duplicados en sqlserver

Según  microsoft


Otra solución

-- tabla temporal  
SELECT DISTINCT col1, col2, col3
 INTO #tablaTemporal
FROM   mitabla;

select * from  #tablaTemporal
-- Borrar todos los datos de la tabla original
DELETE FROM mitabla;

-- Volcar los datos no duplicados desde la tabla temporal a la original
INSERT INTO mitabla
SELECT * FROM #tablaTemporal;

drop table #tablaTemporal;

viernes, 18 de agosto de 2017

Multi-idioma

Tengo una web asp .net webForm  el  multi-idioma lo tenia resuelto con  resources.
Llega el cliente y exige que  una página web del sitio los textos estén en ficheros po 😥😥.

Que es un fichero po : portable object

Es un fichero donde están las etiquetas. Más información

http://www.xperimentos.com/2009/02/21/ficheros-de-traduccin-pot-po-y-mo/

Si se puede editar con el poedit y con un block de notas. Esto me parece super  interesante con respecto al resources. Pero claro estamos es el último sprint, ahora tengo que usar algo diferente 😥😥😥

Bueno todo tiene solución y está vez la solución está en 
https://github.com/turquoiseowl/i18n

A mi personalmente no me funciona las opciones de otras rutas u otro nombre del fichero, pero el resto me fue de lujo.

La próxima vez además de asegurarme si la aplicación  tiene que ser multi-idioma,  preguntaré donde tienen que ir los textos traducidos.

Tengo una “manía” y es que los formatos de fecha los almaceno en fichero de recursos,  para evitarme problema de separadores y diferente formatos de fechas.

Para que el idioma del PO  me funcionará en servidor
1.       Establecemos el idioma

Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo(culture);
Thread.CurrentThread.CurrentCulture = Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo(culture);
i18n.LanguageTag lt = i18n.LanguageTag.GetCachedInstance(culture);
HttpContext.Current.SetPrincipalAppLanguageForRequest(lt);

2.       Leer etiquetas del po en servidor
public string GetTraduccionPO(string name)
        {
            i18n.TranslateSvc_HttpContext auixc = new i18n.TranslateSvc_HttpContext(this.Context);
            string cad = auixc.ParseAndTranslate("[[[" + name + "]]]");
            return cad;
        }
     3. Para el caso de las fechas

lbFecha.Text = string.Format(CultureInfo.InvariantCulture, GetTraduccionPO("fecha"), dato.FechaInicio);

jueves, 1 de junio de 2017

Grid & Update panel y un error raro

Tengo un el tipo grid en un upate panel ,  cuando se pulsa el botón de consultar te lleva al detalle de la línea.

Unas veces me funciona bien y otras daba el error:

Uncaught Error: Sys.WebForms.PageRequestManagerServerErrorException: An unknown error occurred while processing the request on the server. The status code returned from the server was: 500

El problema estaba en número de datos, mi grid tenía 28.000 registros . 

La solución en mi caso:

<system.web>
<httpRuntime maxRequestLength="2097151" />
</system.web>