Drupal: Problemas con flexslider_views_slideshow con Youtube

Si tienes un FlexSlider y tu primer slider contiene un vídeo de Youtube, seguramente habrás notado que cuando le das play al vídeo, el slider continua su reproducción y te pasa a los siguientes sliders, sin importarle que estas viendo el vídeo del slide inicial.

En este post, encontraras la solución a este problema. Solo debes:

  1. Abrir el archivo sites > all > modules > contrib > flexslider_views_slideshow > js > flexslider_views_slideshow.js
  2. Ubicar la línea 72
  3. Y justo debajo de esa línea [72] pega el siguiente código:
var tag = document.createElement('script');
tag.src = "//www.youtube.com/iframe_api";
var firstScriptTag = document.getElementsByTagName('script')[0];
firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);

window.onYouTubeIframeAPIReady = function()
{
	if(slider.slides.eq(slider.currentSlide).find('iframe').length !== 0)
	{
		var frameId = slider.slides.eq(slider.currentSlide).find('iframe').attr('id');
		var frame = $('#'+frameId);
		var src = frame.attr('src');
		frame.attr('src', src+'&enablejsapi=1');

		var player = new YT.Player(frameId, {
			playerVars: {
				autoplay: 0
			},
			events: {
				'onStateChange': onPlayerStateChange
			  }
		});

		var done = false;
		function onPlayerStateChange(event)
		{
			if (event.data == YT.PlayerState.PLAYING && !done)
			{
				console.log('>> Reproduciendo video = '+event.data);
				Drupal.flexsliderViewsSlideshow.active[fullId].pause();
			}else if (event.data == YT.PlayerState.PAUSED && !done){
				console.log('>> Video en pausa = '+event.data);
				Drupal.flexsliderViewsSlideshow.active[fullId].play();
			}
		};
	}
};

Lo que acabamos de hacer es activar la API de Google, añadiendole a la URL de nuestro iframe el parametro “jsapi=1″.  Y posteriormente, añadimos el evento “onStateChange” al reproductor del vídeo, lo cual nos permite determinar el momento en que el usuario hace Play/Pause.  Una vez que sabemos como esta interactuando el usuario con el vídeo, podemos decirle que hacer en cada estado, para este caso particular nos interesa:

  • PLAYING: Ponemos en pausa el FlexSlider, para que podamos ver el vídeo sin la interrupción de los siguientes sliders.
  • PAUSE: Ponemos a reproducir el FlexSlider, para que continue la presentación de los demás sliders.

Problemas con el código de arriba? Puedes colocar unos timeout despues de los console.log.

Espero le sirva a alguien…

 

Bye!!

WordPress on godaddy windows host (500 – internal server error)

Si estas recibiendo “500 – internal server error” después de instalar WordPress en godaddy con un plan de windows; y cambiar a Linux no es una opción.  Entonces puedes configurar IIS para que muestre los errores en el navegador a través del siguiente web.config:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.webServer>
	<asp scriptErrorSentToBrowser="true"/>
	<httpErrors errorMode="Detailed"/>
    </system.webServer>
</configuration>

Este archivo debes colocarlo en la raíz del servidor y si tu instalación esta en una sub-carpeta, también debes agregarlo a esta:

Imagen

Godaddy root folder /

 

Imagen

WP sub-folder

 

De esta manera podrás ver y arreglar los errores que tiene tu instalación.  Espero le sirva a alguien, pues en mi caso godaddy nunca respondió mis tickets relacionados a este problema.

Instalando Emmet en Sublime Text 2

Aquí les dejo una explicación rápidita de como instalar emmet en Sublime Text 2 (usando Package Control) .  Verdaderamente un plugin muy util.

Estos son los pasos:

  1. Descargar Sublime Text 2
  2. Ejecutarlo
  3. Ir a View > Show Console (Va a aparecer en la parte inferior del editor)
  4. Instalamos el Package Control.  Y para ello debemos copiar (Ctrl+C) esto:
     import urllib2,os,hashlib; h = '7183a2d3e96f11eeadd761d777e62404e330c659d4bb41d3bdf022e94cab3cd0'; pf = 'Package Control.sublime-package'; ipp = sublime.installed_packages_path(); os.makedirs( ipp ) if not os.path.exists(ipp) else None; urllib2.install_opener( urllib2.build_opener( urllib2.ProxyHandler()) ); by = urllib2.urlopen( 'http://sublime.wbond.net/' + pf.replace(' ', '%20')).read(); dh = hashlib.sha256(by).hexdigest(); open( os.path.join( ipp, pf), 'wb' ).write(by) if dh == h else None; print('Error validating download (got %s instead of %s), please try manual install' % (dh, h) if dh != h else 'Please restart Sublime Text to finish installation')
  5. Presionamos ENTER para ejecutarlo
  6. Y una vez completado reiniciamos el editor.
  7. Vamos a Preferences > Package Control 
  8. Tecleamos “Install Package
  9. Y buscamos “emmet”, seleccionamos el que necesitamos.
  10. Hacemos doble click y listo…

Para probarlo, podemos crear un archivo y teclear:

html:5

Y presionar Ctrl+E, y debería autocompletar  el documento con formato HTML5. tambien puedes probar con otros comandos útiles aqui.

Les dejo también un vídeo, aunque no tiene muy buena calidad (sorry).

DotnetCasClient1.0: infinite loop

Your debug log should looks likethis (Please make sure that you have the Configure Diagnostic Tracing active):
DotNetCasClient.Protocol Error: 3237 : Ticket validation error: DotNetCasClient.Validation.TicketValidationException: CAS server ticket validation threw an Exception ---> System.Net.WebException: The underlying connection was closed: Could not establish trust relationship for the SSL/TLS secure channel. ---> System.Security.Authentication.AuthenticationException: The remote certificate is invalid according to the validation procedure.



at System.Net.Security.SslState.StartSendAuthResetSignal(ProtocolToken message, AsyncProtocolRequest asyncRequest, Exception exception)
at System.Net.Security.SslState.StartSendBlob(Byte[] incoming, Int32 count, AsyncProtocolRequest asyncRequest)
at System.Net.Security.SslState.ProcessReceivedBlob(Byte[] buffer, Int32 count, AsyncProtocolRequest asyncRequest)
at System.Net.Security.SslState.StartReceiveBlob(Byte[] buffer, AsyncProtocolRequest asyncRequest)
at System.Net.Security.SslState.StartSendBlob(Byte[] incoming, Int32 count, AsyncProtocolRequest asyncRequest)
at System.Net.Security.SslState.ProcessReceivedBlob(Byte[] buffer, Int32 count, AsyncProtocolRequest asyncRequest)
at System.Net.Security.SslState.StartReceiveBlob(Byte[] buffer, AsyncProtocolRequest asyncRequest)
at System.Net.Security.SslState.StartSendBlob(Byte[] incoming, Int32 count, AsyncProtocolRequest asyncRequest)
at System.Net.Security.SslState.ProcessReceivedBlob(Byte[] buffer, Int32 count, AsyncProtocolRequest asyncRequest)
at System.Net.Security.SslState.StartReceiveBlob(Byte[] buffer, AsyncProtocolRequest asyncRequest)
at System.Net.Security.SslState.StartSendBlob(Byte[] incoming, Int32 count, AsyncProtocolRequest asyncRequest)
at System.Net.Security.SslState.ForceAuthentication(Boolean receiveFirst, Byte[] buffer, AsyncProtocolRequest asyncRequest)
at System.Net.Security.SslState.ProcessAuthentication(LazyAsyncResult lazyResult)
<span style="font-family: Consolas, Monaco, monospace; font-size: 12px; line-height: 18px;">

The solution is simple:

  1. From your Windows machine (where you have your IIS server running). Go to Start > and type "mmc"
  2. Go to File > Add / Remove Snap in...
  3. Now you will see the "Add / Remove snap ins" window
  4. Certificates Snap in > Computer Account > Next
  5. Select a Computer > Local Computer > Finish

Hope it works for you!!... Leave a comment!!

Problem with DotNetCasClient getting additional attributes from CAS-Server response

I’m usin CAS-JASIG server with Active Directory for authentication. But I found a problem with the DotNetCasClient-1.0.1. I was not able to retrieve the user parameters that CAS-Server send in the XML response after a success authentication.

I knew that my CAS-Server response was sending those parameters. Because my PHP-CAS Client applications read those parameters without any problem. In fact the response looks like this:

<cas:serviceResponse xmlns:cas='http://www.yale.edu/tp/cas'>
 <cas:authenticationSuccess>
 <cas:user>janedoe</cas:user>
 <cas:attribute name="mail" value="janedoe@test.com" />
 <cas:attribute name="sn" value="Doe Doe" />
 <cas:attribute name="cn" value="Jane Doe" />
 <cas:attribute name="givenName" value="Jane" />
 </cas:authenticationSuccess>
 </cas:serviceResponse>

NOTE: To send additional user parameters from CAS-Server to CAS-Clients. You need to modify your “deployerConfigContext.xml”. Let me know if you are having problems whit LDAP configuration.

How did I note that DotnetCasClient was not retrieving those additional attributes? Well, from my own C# code when the user was successfully authenticated against CAS-Server I ask to DotnetCasClient for those additional attributes:

CasPrincipal tmpUser = (CasPrincipal)System.Web.HttpContext.Current.User;
if (tmpUser.Assertion.Attributes != null && tmpUser.Assertion.Attributes.Count > 0)
{

     //NEVER MET THIS CONDITION BECAUSE "tmpUser.Assertion.Attributes" WAS ALWAYS NULL

}

How did I solve my problem? Well, after debugging a lot I found out that It was not a configuration problem. That the problem came from the DotNetCasClient code. Because those attributes were never set. So I modified the “DotNetCasClient\Validation\TicketValidator\Cas20ServiceTicketValidator [Line 134] method ParseResponseFromServer” and add the following code :

if (authSuccessResponse.Proxies != null && authSuccessResponse.Proxies.Length > 0)</pre>
{
     :
     :
     //I didn't modified anything here!
     :
     :
     :
}
else
{
     /* HERE STARTS MY CHANGE */
     IDictionary<string, IList<string>> attributes =
               new Dictionary<string, IList<string>>();
     try
     {
          XmlDocument doc = new XmlDocument();
          doc.LoadXml(response);
          XmlNamespaceManager namespaceManager = new XmlNamespaceManager(doc.NameTable);
          namespaceManager.AddNamespace("cas", "http://www.yale.edu/tp/cas");
          XmlNode GeneralInformationNode = doc.SelectSingleNode("/cas:serviceResponse/cas:authenticationSuccess/cas:attributes", namespaceManager);
          XmlNodeList attri = GeneralInformationNode.SelectNodes("cas:attribute",namespaceManager);

         if (attri != null)
         {
             foreach (XmlNode node in attri)
             {
                 XmlElement z = (XmlElement)node;

                 IList<string> values = new List<string>();
                 values.Add(z.GetAttribute("value").ToString());
                 attributes.Add(z.GetAttribute("name").ToString(), values);
             }
         }
         return new CasPrincipal(new Assertion(authSuccessResponse.User, attributes), proxyGrantingTicketIou);
    }
    catch (Exception e)
    {
        throw new TicketValidationException("CUSTOM CODE EXCEPTION["+e.Message+"]: "+e.StackTrace);
    }
    /* HERE ENDS MY CHANGE */

    //I didn't touch anything from here either
             :
             :
             :
             :
}

This is just I problem that I face with DotnetCasClient for this very specific case. I don’t know if is just me but I wanna share my solution (my way). Perhaps if you have a better one, please share :-)

50 Sombras de Grey

Ya leí el primer libro en tiempo record (para mi). En 6 días lo termine y me gusto bastante. El protagonista es un encanto!!! A mi esposo no le gusta mucho verme leyendo este ejemplar y menos hablar de Christian Grey.  No se porque!…  Para las que no lo han leído, se lo recomiendo, es un libro para distraerse.

50 Sombras de Grey

Cuando lo empece, tuve la sensación de estar leyendo “Twilight”. Me parece que el personaje de Anastasia es muy similar al de Bella y pues eso no es lo mas atractivo del libro. Es un personaje muy básico y algo molesto a medida que vas leyendo mas y mas.  Ademas es muy repetitivo y siempre los conflictos son muy similares y desembocan en la misma falta de carácter de Anastasia.

Algo que me pareció exagerando es la cantidad de veces que mencionan “poner los ojos en banco”. Ya hasta me resulta fastidioso y es por eso que no creo que termine de leer el segundo libro. Que ya empece a leer, y me ha resultado extremadamente fastidioso, al punto que me salto los pensamientos de Ana (y la Diosa que lleva dentro).

En fin!… El primer libro es bueno y lo recomiendo… Yo no soporte el segundo, pero es solo mi persepcion. Espero la peli y ojala que Christian sea personificado por Ian Somerhalder.