viernes, 3 de febrero de 2012

Estilos en wordpress

¿Nunca te has visto buscando entre el código de wordpress para conseguir que una parte apareciera en un color diferente? ¿Nunca has intentado toquetear para que cierta imágen apareciera un poco más arriba? Si estás leyendo esto, seguramente sea así. Yo también... y al final casi siempre he encontrado una solución más sencilla que mis intentos de cambiar el código fuente del blog.


Todos aquellos cambios que se refieran a estilos, generalmente pueden hacerse sin necesidad de tocar los archivos .php, para eso están las hojas de estilos. Y wordpress y sus themes aplican estilos a casi todo lo que se te ocurra.


Por ejemplo, una de las cosas que quería hacer el otro día es colorear de manera diferente el elemento del menú actual, es decir, aquel en el que me encontrar en cada momento. Mi primera reacción fue meterme en el código php y tratar de coger la categoría del post para luego poder identificarla en el menú.... patrañas!! Wordpress ya aplica una clase css específica a aquel elemento que sea el actual y dándole un estilo específico en el archivo .css conseguiremos nuestro objetivo.


¿Cómo saber esto? Bueno, pues lo mejor es navegar un poco por la web e ir inspeccionando el código que se genera en cada una de las páginas y secciones. Para ello el Firebug para firefox es una gran herramienta que te dirá las clases CSS que tiene cada elemento, pudiendo observar que efectivamente, el elemento de un menú que está seleccionado, tiene una clase especial o que cada uno de los elementos de una barra lateral tienen un estilo que se puede modificar igualmente para todos en el mismo sitio.


Si con esto no tienes suficiente, entonces posiblemente si que tengas que modificar algún archivo PHP y podrás hacerlo desde la propia administración del blog. A ser posible no modifiques más que los archivos que ahí se presentan, el resto ya forman parte del core de wordpress y si crees que necesitas cambiar algo de ahí... replantéatelo, seguramente estés haciendo algo mal o lo estés viendo desde la perspectiva complicada.

Si por último, tienes que hacer demasiados cambios, plantéate hacer tu propio theme (en inglés).

miércoles, 1 de febrero de 2012

Altura de un DIV igual que la de sus hijos

Hoy vuelvo con un poco de CSS. Es una cuestión que se me ha planteado en muchas ocasiones: digamos que tienes un div contenedor de otros dos o tres divs con una altura no definida que varía en función del contenido que le vayamos a meter. Estos divs estarán colocados con un float para que tengan la forma de columnas y queden uno junto al otro. Un ejemplo de esta estructura sería:


<div id="contenedor">
    <div id="columna1">contenido de altura variable</div>
    <div id="columna2">
       <div id="sub1">mas contenido</div>
       <div id="sub2">mas contenido</div>
       ...
    </div>
<div>

Cómo he comentado, si a los divs internos (columna1 y columna2) les aplicamos un estilo para que "floten" quedarán en forma de columna: float:left;
Sin embargo tendremos un problema con el contenedor que no se adaptará a la altura de los hijos y se quedará con una altura de 0

Para solucionar esto, hay que añadir un último div a la estructura que no tenga la propiedad float y con un clear:both como se ve a continuación:

<div style="clear:both;"></div>

De esta manera quedará solucionado el problem y el div padre se quedará adaptado a la altura de la más alta de las dos columnas

Visto en muchos sitios, pero cogido de aquí

martes, 24 de enero de 2012

Evitar que el reproductor de M80 se pare cada media hora

Hoy voy con un consejo que se aleja a lo que normalmente tengo habituado, pero que seguro que será de utilidad a mucha más gente que los otros: Cómo evitar que el reproductor de M80 radio se pare cada media hora.

Y es que si escuchas habitualmente esta radio a través de internet, te habrás dado cuenta de que cada media hora tienes que ir al reproductor y volver a darle al play, lo cual es un rollo.

Para solventar este problema, se puede instalar un plug-in o add-on para Firefox que recargue la página cada 29 minutos automáticamente, por tanto evita que se llegue a la media hora que es cuando se para. Escucharemos un corte de que se está recargando la página, pero al instante seguiremos escuchando la emisión.

Los pasos son:
  • Utilizar Firefox (si no lo haces, instálalo, te lo recomiendo encarecidamente)
  • Instalar el plugin "ReloadEvery"
    • Pinchar en "Continue to Download"
    • Pinchar en "Add to Firefox"
    • Aceptar la ventana que aparece: "Instalar ahora" o parecido
    • Reiniciar Firefox
  • Con el plugin instalado, abrir la página de M80, el reproductor online
  • Botón derecho sobre la pestaña y en el menú "Reload Every" seleccionar el valor deseado (algo que sea inferior a 30 min, yo recomiendo 29)
  • Asegurarte en ese mismo menú que está activado (enabled) de lo contrario no recargará
Con esto ya está completado, mira a ver si te funciona y me cuentas

UPDATE: para el navegador Google Chrome se puede utilizar la extensión Easy Auto Refresh

Un saludo

miércoles, 21 de diciembre de 2011

El truco de la semana: Cambiar los tabs en Eclipse

Utilizo el IDE eclipse constantemente para programar, ya sea en Java o en PHP y me vuelvo loco cuando tengo que cambiar entre dos editores diferentes del mismo programa: estoy trabajando en un archivo y quiero mirar alguna cosa de otro... los dedos se me van automáticamente al ALT + TAB utilizado en windows para cambiar de ventana lo que hace que me salga del eclipse y vaya a parar a otra aplicación diferente. Esto me pasa no una vez, ni dos, sino constantemente y es un engorro.

Hoy he descubierto un par de atajos que pueden ayudar a moverse entre los editores de eclipse de una manera rápida y sin tener que echar mano al ratón:

CTRL + PgUp / CTRL + PgDown
Nos permite pasar al siguiente y anterior editor respectivamente

CTRL + F6
Tiene la misma función que el ALT+TAB de windows, pulsando F6 repetidas veces pasamos al siguiente editor, en el orden en que los hemos visitado, mucho mejor opción que la anterior.

CTRL + E
Abre un dialogo en el que vemos todos los editores abiertos y con las teclas del cursor y ENTER, saltamos a la ventana que más nos guste.

Mi solución:
La opción que más me gusta es la de CTRL + F6 pues funciona justo como yo quiero, pulsando una vez, voy al último editor visitado que generalmente es el que estoy buscando. Sin embargo la tecla F6 me pilla muy a desmano porque no la tengo entre las teclas más presionadas, por lo que he entrado en el editor de atajos de teclado y simplemente he cambiado la E por el F6, para cambiar sus funcionalidades cuando está CTRL pulsado.
Para hacer esto, en Window -> Preferences y ahí dentro de General, la opción Keys (o buscar Keys directamente en el cuadro de búsqueda superior)

martes, 20 de diciembre de 2011

Error de violación de seguridad Sandbox

Largo tiempo sin publicar... hoy lo hago para reportar este error que me ha surgido y que seguro a más de uno le puede ayudar a solucionar el problema, o incluso a mi en un futuro. Aquí va:

Si aparece en siguiente error de violación de seguridad:
Error #2049: Violación de la seguridad Sandbox:
http://100.100.100.100:7001/App/myApp.swf no puede cargar datos en http://100.100.100.200:8080/App2/dir/MyWebService?id=”5”

Hay que hacer lo siguiente.

Esto ocurre porque desde el archivo de Flex desplegado en la máquina 1 (IP:100.100.100.100 ) se está llamando a un web service situado en otra máquina 2 (IP: 100.100.100.200)
El problema se resuelve creando un fichero xml de nombre crossdomain.xml con este contenido:

<?xml version="1.0"?>
<cross-domain-policy>
 <allow-access-from domain="100.100.100.100" />
</cross-domain-policy>

Y se despliega en la raíz del servidor de la máquina 2. Es decir, tiene que estar accesible desde:
http://100.100.100.200:8080/crossdomain.xml

Ahora ya no debería aparece dicho error.

domingo, 20 de noviembre de 2011

Apagar ordenadores desde escritorio remoto en Windows

El típico comando del acceso directo para poder apagar ordenadores desde el escritorio remoto de windows:

%windir%\System32\shutdown.exe -s -f -t 00

viernes, 4 de noviembre de 2011

WicketSession fuera de Wicket

Wicket tiene su propio objeto de sesión que se puede utilizar dentro de una aplicación para guardar elementos entre distintas llamadas de un mismo cliente. Este objeto será una org.apache.wicket.Session o algún otro objeto que la extienda como WebSession o un objeto propio.

Mientras no nos salgamos de la aplicación de Wicket todo va bien y tendremos la sesión disponible... pero ¿y si tenemos que enviar al usuario a otra parte de nuestro servidor que se sale de nuestra aplicación? A un servlet distinto o un formulario de otra parte, por ejemplo. En ese caso perderemos la sesión y no podremos saber que se trata del mismo que viene de la aplicación Wicket.

Hay una solución para este problema y que nos dejará la sesión disponible en cualquier otro lugar (servlets, jsps...) y es a través de un filtro especial llamado WicketSessionFilter que hará justo lo que deseamos, transportar la sesión a otros lugares.
Para usarlo, debemos configurarlo primero en el archivo web.xml del servidor de aplicaciones:

<!-- The WicketSesionFilter can be used to provide thread local access to servlets/ JSPs/ etc -->
  <filter>
    <filter-name>WicketSessionFilter</filter-name>
    <filter-class>org.apache.wicket.protocol.http.servlet.WicketSessionFilter</filter-class>
    <init-param>
      <param-name>filterName</param-name>
      <!-- expose the session of the input example app -->
      <param-value>FormInputApplication</param-value>
    </init-param>
  </filter>
 
  <!-- couple the session filter to the helloworld servlet -->
  <filter-mapping>
    <filter-name>WicketSessionFilter</filter-name>
    <url-pattern>/helloworldservlet/*</url-pattern>
  </filter-mapping>

En el parámetr filterName, debemos poner el valor de otro filtro que ya tengamos en nuestra aplicación (la verdad que esto no lo se muy bien por qué, pero es como me ha funcionado) y el resto de campos se puede ver bastante bien en el ejemplo: el mapping al servlet en el que queremos tener disponible nuestra sesión de Wicket.

Ahora ya se puede acceder a la sesión desde el servlet de la siguiente manera:

Session wicketSession = Session.get();

Que dentro de un servlet quedaría algo así:

public class HelloWorldServlet extends HttpServlet
 {
        public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException,
                IOException
        {
                res.setContentType("text/html");
                PrintWriter out = res.getWriter();
                String message = "Hi. " +
                        (Session.exists() ? " Veo la sesion de Wicket " + Session.get() + "."
                                : " No encuentro la sesion de Wicket.");
                out.println(message);
                out.close();
        }
 }


Fuente: http://wicket.apache.org/apidocs/1.4/org/apache/wicket/protocol/http/servlet/WicketSessionFilter.html