martes, 26 de febrero de 2019

Error HTTP 401.2 Unauthorized los encabezados de autenticación no son válidos.

Cómo solucionar el error HTTP 401.2 - Unauthorized: 

Error HTTP 401.2 - Unauthorized
No está autorizado a ver esta página; los encabezados de autenticación no son válidos.

o el error en inglés:


HTTP Error 401.2 - Unauthorized You are not authorized to view this page due to invalid authentication headers.






El error me sale cuando intento cambiar la autenticación de una aplicación web local en mi máquina de desarrollo. Por default un sitio web creado en IIS tiene la autenticación anónima activada para que sea un sitio abierto.

En esta ocasión estoy intentando utilizar una cuenta de windows para acceder al sitio web y por eso quiero activar la autenticación de windows. Lo que hago es desactivar la autenticación anónima y activar la autenticación de windows desde IIS > sitios > mismito > Autenticación.

Es importante mencionar que para mi sitio web local, estoy usando un host name personalizado, es decir que tengo una linea en el archivo hosts que dice:

127.0.0.1       local.midominio.com

Esto es para poder accederlo desde mi navegador local con esa dirección y facilitar mis pruebas.

Investigando un poco, el problema se presenta cuando se utiliza la autenticación integrada y el host name apunta a la dirección loopback local, es decir 127.0.0.1

Solución.

La solución es especificar el o los host names que están mapeados a la dirección de loopback local en el registro. Sigan los pasos de abajo para solucionar el problema:
  1. Setear el registro DisableStrictNameChecking a 1. Creo que este paso puede ser omitido, chequen sin hacerlo.
  2. Click Inicio, click Run, escribir regedit, y click OK.
  3. En el Registry Editor, localizar y click en el siguiente registro: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa\MSV1_0
  4. Click derecho en MSV1_0, seleccionar New (Nuevo), y click en Multi-String (Valor de cadena multiple).
  5. Escribir BackConnectionHostNames y dar ENTER.
  6. Click derecho en BackConnectionHostNames, y click en Modificar.
  7. Escribir el o los host names de los sitios locales, y click OK.
  8. Cerrar el Registry Editor, reiniciar IIS.
Una vez hecho esto, prueban de nuevo.


Espero les sirva.


lunes, 25 de febrero de 2019

Agregar variable en href de una liga con jQuery

Cómo agregar variable en href de una liga con jQuery

Hola.

Seguramente se han visto en la necesidad de tener que editar la URL de una liga con Javascript o jQuery. Esto siempre es útil para cambiar la URL de destino de una liga, agregar un parámetro en base a algún evento.

Tengo un formulario de búsqueda con combos y cajas de texto en el que se usa un paginado controlado por una liga. La liga debe contener todas las variables y valores para que la búsqueda sea exacta.

Yo estaba buscando una función que agregue ampersand (&) o el signo de interrogación dependiendo si es la primer variable. Como no existe tal función se tiene que adecuar el código para considerar la primer variable.

Para hacer esto se debe usar el método attr de jQuery para modificar el href de la liga.

La liga se ve así:

<a id="idliga" href="urlacambiar">liga</a>

Y aquí les dejo el código que utilicé, modifíquenlo a su necesidad:

//path y variables que conforman la URL
var x = "/micontrolador/_Listado?v1=valor1";
var y = "&v2=valor2";
var y = "&p=2";

var xhref = x+y+z;

//seteando el atributo href de la liga
$('#idliga').attr('href', xhref);


Solo tengan cuidado con la primer variable que se especifica con el signo de interrogación que cierra, las ademas son separadas por ampersand &.

Como ven el selector lo estoy haciendo con el id de la liga pero puede ser a través de una clase css u otra cosa.

Espero les sirva.




jueves, 21 de febrero de 2019

Insertar código AdSense en head html con Ad Inserter

Cómo insertar código AdSense en head HTML con Ad Inserter


Hola.

Agregué el plugin Ad Inserter en una instalación de WordPress para poder incluir el código js de Google AdSense en el sitio.

Como sabrán la recomendación de Google Adsense es colocar el código de los anuncios dentro de la etiqueta head. Es decir dentro de <head></head> del HTML.

Como solo lo agregué para eso, lo único que busqué fue como hacer eso. Aquí les dejo los pasos:

1. Ir a Settings > Ad Inserter (Ajustes > Ad Inserter)

2. Click en el ícono del engrane de la derecha, después de todos los números.

3. Click en la pestaña Header

4. Pegar el código en el área de texto.

5. Click en el botón activar inserción del código en header HTML "Enable insertion of this code into HTML page header". Sin esta opción activada, no va a salir en el código HTM.

Les dejo aquí imagen de cómo debe verse.

Adsense en head html de wordpress


6. Click en Guardar (Save Settings)

Ahora ya pueden ir a refrescar su sitio y ver su nuevo código dentro del head HTML

Espero les sirva



miércoles, 20 de febrero de 2019

Scroll infinito y búsqueda Ajax con jQuery

Cómo integrar scroll infinito y una búsqueda Ajax con jQuery


Hola.

Aquí dejo la tercera y ultima entrega de la implementación del scroll infinito con una búsqueda Ajax con jQuery.

Como describí en el post anterior, una vez implementado el scroll infinito el requerimiento fue buscar dentro de los elementos del listado.

La solución del post "buscar dentro de un div con jQuery" no funcionó por mucho tiempo debido a que el scroll infinito va arrojando resultados por páginas, en mi caso 20 resultados por página. Haciendo ineficiente el buscar únicamente dentro de los elementos que han sido cargados en el div.

Así que la solución aquí es integrar el scroll infinito con una búsqueda Ajax. El reto es hacer la búsqueda sin afectar la funcionalidad del scroll infinito.

Con el scroll infinito integrado, se requiere asociar el evento onkeyup de una caja de texto al método Ajax de jQuery.

<script type="text/javascript">
    $(document).on('ready', function () {              
        var searchRequest = null;
        
            var minlength = 0; //si quieren un mínimo de caracteres para ejecutar la búsqueda
            $("#idcaja").keyup(function () {
                var that = this,
                value = $(this).val(); //el texto de la caja

                if (value.length >= minlength) {
                    if (searchRequest != null)
                        searchRequest.abort();
                        searchRequest = $.ajax({
                        type: "GET",
                        url: "/micontrolador/_Listado?v1=valor1",
                        data: { 
                            'v2': 'valor2',
                            'q': value
                        },
                        dataType: "text",
                        success: function (msg) {
                            //checar si el valor es el mismo
                            if (value == $(that).val()) {           
                                $(".lista").html($(msg).find(".elemento"));
                                var xhref = "/micontrolador/_Listado?v1=valor1&v2=valor2&p=2&q=" + value;
                                //seteando la liga que maneja el paginado del infiniteScroll
                                $('.numero-pagina').attr('href', xhref);
                                //destruir o no toma cambios                     
                                $('.listado').infiniteScroll('destroy');

                                //inicializar infiniteScroll nuevamente                                                               
                                $('.lista').infiniteScroll({
                                  path: '.numero-pagina',
                                  append: '.elemento',
                                  status: '.page-load-status',
                                  hideNav: '.numero-pagina',
                                });
                                
                            }
                        }
                    });
                }
            });
            
}); // fin on ready

Ahora que escribo esto veo que sí es importante que vean el primer post "Implementar scroll infinito con javascript y HTML en ASP.NET Razor" por la página dinámica, elementos y estilos que se usan en el código de arriba. Además se puede ver aquí cómo implementar el infiniteScroll con jQuery.

Podrán darse cuenta que esta integración a pesar de estar implementada con ASP.NET Razor no tiene ninguna dependencia con esta tecnología. El código puede adaptarse fácilmente a cualquier otro lenguaje de programación de servidor como php o cualquier otro.

PD. Aguas con los métodos del infiniteScroll, son sensibles a mayúsculas y minúsculas.


Espero les sirva.


martes, 19 de febrero de 2019

Buscar dentro de un div con jQuery

Cómo buscar dentro de un div con jQuery


Hola.

Esta sería la segunda de tres entregas acerca de cómo integrar el scroll infinito con una búsqueda con Ajax.

Resulta que, una vez integrado el scroll infinito dentro de la aplicación web, el siguiente requerimiento que surgió fue el de buscar dentro del listado infinito con una caja de texto.

Lo primero que opté por hacer fue el de buscar con jQuery dentro del div, es decir filtrar los elementos de acuerdo a lo que se esté escribiendo.

En este post voy a describir cómo buscar con una caja de texto dentro de un div con jQuery .

El div con los elementos se ve así. Los elementos a filtrar tienen clase .elemento:

<div>
<div class="elemento">
<h3><span>1 </span><a>TITULO 1</a></h3>                          
<p>Calle descripción No. 646. Zona. Ciudad.</p>
</div>
<div class="elemento">
<h3><span>2 </span><a>TITULO 2</a></h3>                          
<p>Calle descripción No. 345. Zona. Ciudad.</p>
</div>
</div>

Elementos más, elementos menos. Ustedes saben que comprobando para más de uno se comprueba para todo.

1. Asocien una función javascript en el evento onkeyup de la caja de texto.

<input type="text" onkeyup="buscar(this);"  />

2. La función queda así:

function buscar(control) {
    $('.elemento').hide();
    var txt = $(control).val();  
    $('.elemento').each(function () {
        if ($(this).text().toLowerCase().indexOf(txt.toLowerCase()) != -1) {
            $(this).show();
        }
    });
}

Lo que hace es que cuando se está escribiendo en la caja de texto oculta todos los elementos de clase .elemento, luego compara la propiedad text de los elementos con el texto escrito y muestra los que coincidan.

En este ejemplo, la propiedad text del elemento va a permitir buscar dentro del texto de todos los elementos internos, es decir del h3, span, a y p.

Aquí dejo la liga a la implementación del scroll infinito con html pos si están interesados:

https://jmartinhc.blogspot.com/2019/02/implementar-scroll-infinito-con-javascript-html-asp-net-razor.html

Espero les sirva.




domingo, 17 de febrero de 2019

Implementar scroll infinito con Javascript y HTML en ASP.NET Razor

Cómo implementar scroll infinito con Javascript y HTML en ASP.NET Razor


Hola.

Tuve que investigar como implementar un scroll infinito como el de los sitios web de moda. De hecho así es como aprendí que lo llaman infinite scroll.

Buscando en internet con este nombre me encontré un plugin en javascript que terminé implementando de manera sencilla. El link del plugin es este:

https://infinite-scroll.com/

Tiene un par de métodos de implementación y la que describo aquí es la que en primera instancia me pareció la mas sencilla y genérica. Implementar con HTML.

Describo aquí lo que necesitan para implementarlo:

1. Descargar del link de arriba en la sección Download cualquiera de estos dos js:

infinite-scroll.pkgd.min.js (minified)
infinite-scroll.pkgd.js (un-minified)

Básicamente la diferencia es que el minified está todo en una sola línea y el otro tiene saltos de línea que lo hace legible. Por supuesto que el primero pesa menos. Yo estoy usando el minified pero da lo mismo.

2. Incluir la referencia en su HTML a donde hayan colocado el js (pueden colocar la ruta absoluta al sitio de infinite-scroll también)

<script type="text/javascript" src="/js/infinite-scroll.pkgd.min.js"></script>

3. Necesitan una pagina dinámica parcial que va a estar resolviendo el listado cuando se hace scroll en el contenido. Yo uso una pagina dinámica programada en c# con vistas cshtml aunque el lenguaje de la página dinámica es irrelevante para efectos del paginado infinito.

Algunas de las características de esta página dinámica son :

Debe recibir un parámetro para controlar el número de página de los resultados que va arrojando

La estructura básica de mi página que resuelve el listado por número de página (_Listado.cshtml):

<div class="lista" data-infinite-scroll='{ "path":".numero-pagina", "append":".elemento","status":".page-load-status","hideNav":".numero-pagina","history":"false"}'>

@{
   int j=1;    
   foreach (var xelemento in Model.Data)
   {
<div class="elemento">
<h3 on><span>@j </span><a>@xelemento.Nombre</a></h3>                          
</div>
   j = j+1;    
   }
}
</div>

<div class="page-load-status">
  <p class="infinite-scroll-request">Loading...</p>
  <p class="infinite-scroll-last">End of content</p>
  <p class="infinite-scroll-error">No more pages to load</p>
</div>

@if (Model.CurrentPage < Model.NumberOfPages)
{
int nextpage=Model.CurrentPage+1;                                                                             
@Html.ActionLink(nextpage.ToString(), "_Listado", "micontrolador", new { p = nextpage }, new { @class = "numero-pagina" })
}

Contiene el div que inicializa el scroll infinito, dentro vienen los elementos del listado, luego el div con los estatus de carga del plugin y al final una liga hacia la siguiente página.

Las clases css de estos elementos son muy importantes porque el scroll infinito se inicializa a través de los elementos con estas clases.

.elemento: es la clase del div de los elementos de la lista.
.numero-pagina: es la clase de la liga que te lleva a la siguiente pagina
.page-load-status: es la clase del div que contiene los status del plugin

En mi caso la vista parcial _Listado.cshtml recibe un parámetro de nombre p para controlar el paginado (p=1,p=2,p=3,p=4....). En el link con clase numero-pagina se ve cómo se pasa el parámetro incrementado en uno: new {p=nextpage}

4. Llamar a la página parcial dinámica desde la página principal. Algo así:

<html>
<body>
@Html.Partial("_Listado")
</body>
</html>

Con esto tienen implementado el scroll infinito dentro de su pagina web.


Espero les sirva.










domingo, 10 de febrero de 2019

Cómo desinstalar navegador Chromium de Mac

Cómo desinstalar el navegador Chromium de Mac


Hola.

Descargué FileZilla para Mac y no me di cuenta que vienen incluidos otros programas en el paquete. Entre ellos y el mas molesto fue Chromium. De hecho al inicio lo confundí con Chrome porque la interfaz gráfica es muy similar.

Este navegador Chromium por default se agrega al Dock y abre cada que prendo la maquina. Hay varias maneras de eliminarlo.

Apliqué las instrucciones que encontré aquí y no me dieron resultado:

https://nektony.com/blog/how-to-remove-chromium-from-mac

Mi problema en realidad fue tonto ya que no lo encontraba en mis aplicaciones y empece a borrar sus archivos de acuerdo al link de arriba sin éxito.

Solución.

Lo que pasó es que debía eliminarlo de mis aplicaciones de usuario. Es decir

‎⁨Macintosh HD⁩ > ⁨Users⁩ > ⁨miusuario

Aquí estuvo siempre y sólo tuve que arrastrarlo a la papelera. Eso fue todo. Pueden burlarse aquí abajo.

Espero les sirva.




Dónde encontrar el archivo php.ini en un hosting windows de godaddy

Dónde se encuentra el archivo php.ini en un hosting windows de godaddy


Hola.

Me encontré un error en un windows deluxe hosting con Wordpress de godaddy. El error era muy raro y al buscar algunas soluciones en internet me encontré una que sugería cambiar algunos parámetros del archivo php.ini

El servicio que estaba utilizando de godaddy era un windows deluxe hosting con Wordpress instalado. Así que hacia uso de php sobre un hosting de windows! Ya sé lo que están pensando pero me había funcionado bastante bien por mucho tiempo y lo mantuve así hasta esta ocasión.

Así que la pregunta que me tomo un tiempo contestar era, en dónde se encuentra el archivo php.ini en  Wordpress instalado en windows en godaddy.

Solución

En realidad el archivo no se encuentra en esta configuración. Lo que tienen que buscar es el archivo

.user.ini

.user.ini es el archivo equivalente al php.ini en esta configuración

Búsquenlo en el directorio raíz de la instalación de Wordpress.


Espero les sirva

Cancelar enter en una caja de texto con javascript

Cómo cancelar enter en una caja de texto con javascript


Dentro de un documento html existen eventos default asociados con cada objeto dentro del documento.

Resulta que necesito cancelar el enter dentro de un textbox, es decir cuando el usuario da enter estando el enfoque en la caja de texto.

Esto es un requerimiento común porque es muy natural que el usuario haga enter una vez que ha terminado de llenar algún formulario. El problema es cuando tienes varios eventos asociados en tu caja de texto y entran en conflicto varios eventos.

Primero que nada la razón de este comportamiento es que la caja de texto se encuentra dentro de un elemento <form> y el evento default de éste siempre es hacer submit. Es decir que cualquier caja de texto dentro del form hace submit al dar enter.

Mi html basico luce así:

<form>
<input type="text" />
</form>

Ahora lo que hay que hacer es bloquear el enter dentro del control y regresar un false para evitar que el elemento form haga submit.

Esto lo logramos usando el evento onkeypress del textbox. KeyCode = 13 es la tecla Enter. Eso devolverá false cuando el keyCode sea enter y eso cancela el submit de la forma html.

<input type="text" onkeypress="return event.keyCode != 13;" />

Si tienen tiempo y quieren ver el código de cada tecla,  agreguen un alert en el mismo evento.

Este ejemplo es con javascript puro. Si quieren usar y tienen jQuery incluido en el documento, pueden usarlo para bloquear todas las cajas de texto o a través de algún selector jQuery.

Algo así:

$(document).on("keypress", "form", function(event) { 
    return event.keyCode != 13;
});

Como saben, las posibilidades son infinitas.

Espero les sirva.


sábado, 9 de febrero de 2019

Editar el archivo robots.txt en Blogger (blogspot)

Cómo editar el archivo robots.txt en Blogger (blogspot)


Pues ahora checando las estadísticas de este su blog, resulta que tengo una alerta sobre ciertas rutas de búsqueda que no están siendo consideras en buscadores debido a que el archivo robots.txt las está bloqueando.

La razón es que las rutas de búsqueda están siendo bloqueadas debido a esta línea en robots.txt

Disallow: /search

Independientemente de las consecuencias de remover esta línea, el propósito de este post es mostrar cómo editar el archivo robots.txt en blogger.

Les dejo aquí los pasos para editar el archivo robots.txt de una cuenta de blogger.

1.- Dentro de tu cuenta de blogger, selecciona: Settings > Search Preferences
2.- En la sección Crawlers and indexing, click en Custom robots.txt - Edit
3.- Seleccionar Yes y en el area de texto que aparece pegar el contenido del archivo robots.txt

Editar robots.txt en blogger
4.- Click en guardar cambios y listo.

Para no esperar a que el buscador pase de nuevo en algunos días, se puede indicar a google que el archivo ha cambiado manualmente.

Para hacer esto pueden entrar al Search Console de google > Crawl > Robots.txt Tester.

Click en Submit y seleccionar la opción: Ask Google to update

Robots.txt Tester

Con esto Google está informado que el archivo ha cambiado para la siguiente vez que el sitio sea indexado.

Espero les sirva



lunes, 4 de febrero de 2019

VMWare Horizon pantalla negra en OSX Mojave

VMWare Horizon pantalla negra en OSX Mojave


Estaba utilizando el cliente VMWare Horizon version 3.8 y algo en macOS Sierra sin problemas pero recientemente acepte la actualización a MacOS Mojave.

Lo que obtuve, ademas del disgusto, fue que sí pude conectarme con el cliente de VMWare Horizon aparentemente bien pero la pantalla negra que inicialmente aparece al conectarse nunca se quitó.

Esto me ocurría con anterioridad pero siempre después de algunos segundos la pantalla negra pasa a la pantalla azul de inicio de windows. Además de esto se puede escuchar el sonido cuando intentas entrar mandando las teclas de ctrl + alt + suprimir. Osea que sí se conecta pero no se ve nada.

Investigando un poco encontré que hay que actualizar la version el cliente de VMWare Horizon. La versión que soporta MacOS Mojave es la 4.10

Aquí les dejo el link descarga del cliente VMWare Horizon 4.10:


Espero les sirva.