Primeros pasos con Threading Building Blocks

Escrito por Juanjo el Monday, 24 de January del 2011 a las 7:33 pm

Hace poco, como tema de una presentación en la Facultad, @jmbarroso y yo estuvimos “jugando” con una librería de paralelización de Intel de la que no tenía ni idea de su existencia y que me dejó francamente sorprendido. Se llama Threading Building Blocks (TBB), lleva algunos años en el mercado y en este post explicaré someramente qué es, para qué sirve, y qué viene a mejorar en el mundo de la paralelización.

TBB – Qué es

TBB es una librería escrita en C++, para programas hechos en este lenguaje (por ahora), que facilita la paralelización de los mismos en procesadores multicore gracias a las funciones y estructuras que provee. Su objetivo es lograr un paralelismo escalable, haciendo uso de C++ estándar, que además abstraiga al programador de los detalles de la plataforma y del manejo de hilos, que exprese el paralelismo de una manera más simple y que realice un mejor aprovechamiento de los recursos de los procesadores.

TBB – Ventajas

TBB permite expresar el paralelismo como Tareas en lugar de Hilos. De esta forma, no es necesaria llevar a cabo manualmente la gestión de los mismos: no más create, join, manage, etc. Dichas tareas son asignadas automáticamente a hilos, haciendo un uso eficiente de los recursos del procesador.

Una característica curiosa es el uso de una técnica denominada task stealing; la librería se encarga de asignar/desasignar tareas entre procesadores de manera transparente al programador, según la carga de trabajo actual, para equilibrar el trabajo de todos. Toda esta “abstracción” permite desarrollar soluciones más simples de alto nivel.

Además, es compatible con otros paquetes de paralelización, por lo que se puede optar por usar algunos componentes de TBB bajo ciertas circunstancias, y usar diferentes soluciones (OpenMP, gestión de hilos manualmente) en otras.

TBB – Contenido

La librería provee soluciones de distinta índole para facilitar la paralelización de las aplicaciones, que se pueden dividir en:

Algoritmos básicos:
• parallel_for
• parallel_reduce
• parallel_scan

Algoritmos avanzados:
• parallel_while
• parallel_do
• pipeline
• parallel_sort

Contenedores:
• concurrent_queue
• concurrent_vector
• concurrent_hash_map

Reserva de memoria escalable:
• scalable_malloc
• scalable_free
• scalable_realloc
• scalable_calloc

Exclusión mutua:
• mutex
• spin_mutex
• queuing_mutex
• spin_rw_mutex
• queuing_rw_mutex
• recursive mutex

Operaciones atómicas
• fetch_and_add
• fetch_and_increment
• fetch_and_decrement
• compare_and_swap
• fetch_and_store

Timing:
• Método thread_save portable para procesar el tiempo transcurrido.

Planificador de tareas
• Acceso directo para controlar la creación y la ejecución de tareas

Instalando TBB.

La última versión estable de la librería para Windows, Linux y Mac se puede encontrar aquí.

La instalación resulta bastante sencilla. En mi caso con la versión para Mac OS, que no diferirá mucho de la disponible para Linux:

Se descomprime el tgz descargado. Yo lo hice en un directorio de mi home donde instalo los frameworks y librerías que utilizo (grails, maven, gradle, mercurial, etc) pero /opt/ podría ser otra ubicación adecuada. También he creado un enlace simbólico “tbb” que apunte a la última versión, para usarlo al referirme a la librería, en vistas a simplemente actualizar el enlace en caso de que siga descargando en el futuro versiones de la librería y quiera cambiar fácilmente entre ellas:

juanjo:bin juanjo$ pwd
/Users/juanjo/bin
juanjo:bin juanjo$ ls -ltr
drwxr-xr-x   4 juanjo  juanjo       136 24 ene 17:21 tbb30_20101215oss
juanjo:bin juanjo$ ln -s tbb30_20101215oss/ tbb
juanjo:bin juanjo$ ls -ltr
drwxr-xr-x   4 juanjo  juanjo       136 24 ene 17:21 tbb30_20101215oss
lrwxr-xr-x   1 juanjo  juanjo        22 24 ene 17:28 tbb -> tbb30_20101215oss/

Es necesario modificar el archivo bin/tbbvars.sh para asignar a la variable TBB30_INSTALL_DIR la ruta al directorio raíz de la librería:

juanjo:tbb juanjo$ pwd
juanjo:bin juanjo$/Users/juanjo/bin/tbb
juanjo:bin juanjo$ cat -n bin/tbbvars.sh
 
# Threading Building Blocks Home
    30    TBB30_INSTALL_DIR=/Users/juanjo/bin/tbb

Cargamos las variables definidas en el fichero, que se deberá hacer cada vez que se abra una terminal y se desee trabajar con la librería. La alternativa es añadir la línea al fichero ~/.bash_profile para hacerlo automáticamente al cargar sesión:

juanjo:bin juanjo$ source bin/tbbvars.sh

Para probar si todo está configurado correctamente, intentamos compilar y ejecutar uno de los ejemplos incluídos en la distribución:

juanjo:tbb juanjo$ cd examples/GettingStarted/sub_string_finder/
juanjo:sub_string_finder juanjo$ make
g++ -O2 -DNDEBUG  -o sub_string_finder sub_string_finder.cpp -ltbb
g++ -O2 -DNDEBUG  -o sub_string_finder_extended sub_string_finder_extended.cpp -ltbb
g++ -O2 -DNDEBUG  -o sub_string_finder_pretty sub_string_finder_pretty.cpp -ltbb
./sub_string_finder_extended
Done building string.
Done with serial version.
Done with parallel version.
Done validating results.
Serial version ran in 8.01188 seconds
Parallel version ran in 4.1834 seconds
Resulting in a speedup of 1.91516

En efecto, todo funciona, y ya estamos en disposición de empezar a utilizar los componentes que nos provee TBB. De hecho, en el ejemplo que lanzamos se observa una de las bondades: un speedup del 91% que no está nada mal.

En el próximo artículo veremos cómo hacer uso de los componentes incluídos en la librerías, paralelizando un código secuencial y desgranando el código fuente del mismo.

Más información:

• Página Oficial de Threading Building Blocks.

Comentarios (3)

Categoria: Coding,Informática,Tecnología

Un Novato en el Agile Open Spain 2010 (I)

Escrito por Juanjo el Wednesday, 17 de November del 2010 a las 1:21 am

El fin de semana pasado tuve la enorme suerte de asistir al Agile Open Spain 2010, un evento celebrado anualmente, donde se reúnen los entusiastas de las Metodologías Ágiles en España para compartir experiencias y, en menor medida, rajar de las cárnicas :-P

Yo, en mi situación de virgen (entiéndase como persona que asiste por primera vez), no tenía ninguna expectativa puesta en el evento, pues apenas había indagado en Internet sobre celebraciones de años anteriores, o sobre conferencias similares en otros países. Sin embargo, ser miembro de Agile Canarias y, por tanto, fiel admirador de esta “forma” de ver el desarrollo del software y de todas sus bondades asociadas, me convenció de que tomar un vuelo a Barcelona y dejarme caer por la Universidad La Salle, junto a Juanma (@jmbarroso), Fran (@fran_reyes) y Yeray (@ydarias) (en adelante: Comando Muyayo) no iba a ser tiempo perdido. Y vaya que no lo fue. Lo juro por Snoopy.

Vayamos por partes.

Para hacer honor a la verdad, el viaje no empezó como debería haber empezado. Al llegar al aeropuerto de Los Rodeos el jueves por la tarde, mi compañero de viaje (Juanma) y yo nos encontramos con la agradable (léase con ironía; mucha ironía) sorpresa de que nuestro vuelo en Vueling había sido replanificado. ¿Qué significaba eso? Que mientras nosotros estábamos dirigiéndonos al punto de facturación, el avioncito ya iba por Cádiz, kilómetro arriba, kilómetro abajo. Supuestamente, nos comunicaron el cambio por e-mail hacía dos meses. Nosotros, ni nos enteramos.

– ¿Y ahora qué hacemos? – nos preguntamos, contemplando la opción de ver el AOS desde casa, con Fran retransmitiendo por streaming con el NexusOne.

– ¡Improvisación! – decidimos al fin, negándonos asumir los designios del perro destino.

There’s an old saying that goes: “Cuando un amigo se muda, no pierdes un amigo; ganas una casa donde quedarte” Y por suerte para nosotros, dos amigos viven ahora en Madrid. Una simpática vendedora de Spainair nos consiguió un vuelo a Barcelona, vía Madrid, por un precio razonablemente económico, con el único contratiempo de tener que hacer noche en la capital. Un par de llamadas, y a las tres horas estábamos en Tribunal, degustando unas tapas terriblemente buenas con Sergio y Aurora (@aurocj). Gracias chicos, por acompañarnos esa noche ;-)

Al día siguiente, y sin más contratiempos, llegamos a Barcelona, a una pensión más bien cutre (lo que tiene reservarla dos horas antes de viajar…) pero limpia, suficiente para un fin de semana. Por la tarde, nos reunimos con Fran y después de jartarnos (sí, con “j”; con “h” parece que comimos menos) en el almuerzo, cerca de Plaza Catalunya, nos dirigimos al primer día del Agile Open Spain 2010.

Una vez recogida nuestras acreditaciones y almacenar la contraseña de la Wi-Fi, pasamos a un salón donde ya estaban reunidos prácticamente todos los asistentes (200 almas). Reconocí a Alejandro (@alejandropgarci), de Autentia, y a Dani Latorre (@dani_latorre) de Jobsket, dos auténticos cracks a los que conocí a su paso por Tenerife. Una vez sentado, empezaron las gratas sorpresas:

– El modelo de conferencia difiere radicalmente de todos los eventos y charlas a los que he asistido alguna vez. Este formato se conoce como Open Space, y al parecer, tiene como principal característica la carencia de una agenda predefinida antes de empezar. Con esto se consigue que los asistentes, sentados en un círculo y ayudados por un moderador/facilitador, organicen por si mismos los temas en los que están interesados participar u asistir.

Open Space

– Una vez propuestos las ponencias, se exhortaba a los promotores de las mismas a reunirse con personas que hubiesen expuesto temas afines, para discutir la posible mezcla de los mismos en una única ponencia.

– Para hacer honor a las metodologías ágiles, las charlas se ubicaron en un panel en la pared, y “ágilmente” se fueron distribuyendo las ponencias en las clases y horarios disponibles, cambiando varias veces las disposiciones según le interesaba a unos o a otros. Sinceramente, en su momento dudé de dicha forma de proceder, y llegué a creer que pasarían veintiséis años y catorce días antes de que nos pusiéramos de acuerdo sobre cómo deberían quedar las charlas, pero apenas quince minutos de rotaciones y algún que otro “¡No me hagan eso, joder! ¡A las 9 de la mañana no!” fue suficiente.

– Otro problema: el 70-80% de las charlas propuestas parecían muy pero que muy interesantes, y el solapamiento de muchas te obligaba a hacer una elección dolorosa, muy cerca del “¿A quién quieres más, a papá o a mamá?”. Después de algunas reflexiones personales, logré establecer un planning de las ponencias a las que quería asistir, y aún sin estar seguro de haber hecho la elección correcta, pensé que si al final alguna no me interesaba, simplemente podría cambiar de aula. No cambié ninguna.

Panel de Conferencias

Terminé el día visitando a un amigo de la infancia, por lo que me perdí la cena y las cañas respectivas de esa noche. Por suerte para todos, Yeray estaba ahi para contarlo ;-)

En el próximo post, hablaré de las ponencias como tal y de las sensaciones que me llevé de las mismas. Puede adelantar que fueron muy inspiradoras. Dudo que pueda expresar en palabras lo mucho que te hacen pensar sobre la forma de ver tu trabajo diario, y en la ambición necesaria para mejorar diariamente en el plano profesional que, como siempre, afecta a cómo afrontas el plano personal.

Aún así, lo intentaré. Permanezcan atentos.

PD: Las fotos son de Juanma y Yeray ;-)

Comentarios (2)

Categoria: Coding,Informática,Personal

Java from the past

Escrito por Juanjo el Thursday, 4 de November del 2010 a las 7:17 pm

Por qué Java es un lenguaje from the past:

1
2
if (a != null && a.getFoo() != null && a.getFoo().getBar() != null 
    && a.getFoo().getBar().getTutu() != null)

En Groovy:

1
if (a?.foo?.bar?.tutu)

¿Quedó claro?

Escribir comentario

Categoria: Coding,Humor

Tips de Supervivencia: Atajos de teclado en Eclipse

Escrito por Juanjo el Saturday, 7 de February del 2009 a las 2:22 am

Después del primer tip de supervivencia sobre la autenticación automática vía SSH (que me permite ahorrar unos cuantos segundos al día) publico este otro sobre los atajos de teclado en Eclipse, para aprovechar una de las características más útiles del editor.

Todos los programas tienen shortcuts (atajos de teclado), y prácticamente todo el mundo utiliza alguno. Probablemente todo el que trabaje con algún entorno de programación hace uso de varios de ellos con total naturalidad, casi sin percatarse. Pero también me he dado cuenta de que hay muchos compañeros de clase que se conforman con muy pocos, casi todos básicos, bien porque no conocen los demás atajos, bien porque no consideran necesario realizar el esfuerzo de aprenderlos y utilizarlos (no solo en Eclipse, sino en otras herramientas: Vim, la Terminal, etc). Bien, yo creo que son indispensables si se desea programar con rapidez y soltura, o manejar las perspectivas/opciones/vistas de Eclipse con celeridad sin tener que hacer uso del ratón, que si bien es más cómodo, nos obliga a retirar las manos del teclado (nuestra herramienta de codificación), haciéndonos perder algunos segundos innecesariamente.

Yo no los aprendí todos de golpe; poco a poco los fui asimilando paulatinamente, conforme alguien me revelaba su existencia y su utilidad. Paso a detallar los shortcuts que utilizo diariamente:

Primero, los más básicos no sólo de Eclipse, sino de cualquier editor (de texto, imágenes, etc):

  • CTRL + X : Cortar la selección.
  • CTRL + C : Copiar la selección.
  • CTRL + V : Pegar la selección.
  • CTRL + Z : Deshacer última acción.
  • CTRL + Y : Rehacer última acción desecha.

Estoy seguro que todos los usamos periódicamente. Es más cómodo también realizar la selección desde el teclado, haciendo uso de SHIFT + Flechas, ayudado de las teclas Inicio, Fin, RevPág, AvPág, y CTRL (Windows/Linux) o ALT (Mac).

Los siguientes son específicos de Eclipse, y son los que contienen la verdadera chicha del tema. Están organizados de mayor relevancia (bajo mi singular y subjetivo punto de vista) a menor:

  • CTRL + BARRA_ESPACIADORA : Autocompletado de metodos/variables/etc.
  • CTRL + SHIFT + R : Búsqueda de un recurso (código fuente, jar, xml, properties…) en los proyectos abiertos (sin tener que ir al explorador de paquete a buscarlo).
  • CTRL + SHIFT + G : Buscar referencias al método/clase en el Workspace. El único caso en que yo prefiero usar el botón derecho -> References -> Proyect, porque si hay muchos proyectos abiertos tarda más en hacer la búsqueda.
  • CTRL + O : Ver métodos/atributos de la Clase.
  • CTRL + D : Eliminar una línea.
  • CTRL + M : Maximizar/Minimizar la ventana activa.
  • CTRL + I : Corregir indentacion.
  • ALT + UP_ARROW / DOWN_ARROW : Subir/Bajar una línea. Respecto a éste, me costó muchísimo quitarme la maña de seleccionar las líneas que deseaba, cortarlas, moverme a donde quería, y pegarlas.
  • CTRL + T : Arbol de Herencia (para ver las clases que implementan una interfaz, por ejemplo).
  • CTRL + F : Búsqueda en el fichero actual.
  • CTRL + H : Buscar en todo el proyecto/workspace (dentro de ficheros java, jars, xmls, htmls, Spring beans…)
  • CTRL + ‘/’ (CTRL + SHIFT + 7): Añadir/quitar comentarios “//”.
  • CTRL + L : Ir a una línea específica.
  • CTRL + SHIFT + L : Ver todos los atajos de teclado.
  • ALT + SHIFT + C : Cambiar la firma del método actual (parámetros, nombre, tipo retornado, etc… los cambia en todas las clases que hagan uso del método).
  • CTRL + AV_PAG / REV_PAG : Siguiente/Anterior pestaña de las abiertas en la ventana activa.
  • CTRL + E : Ver las pestañas de código fuente para seleccionar una.
  • CTRL + ‘+’ (del teclado numérico) : Expandir un bloque entre llaves (cuando solo se muestra la firma).
  • CTRL + ‘-’ (del teclado numérico) : Contraer un bloque (para mostrar sólo la firma).

En modo Debug añadiría también:

  • F5 : Entrar en una llamada.
  • F6 : Ir a la siguiente línea de código (“Step”).
  • F7 : Ir a la sentencia de retorno del método.
  • F8 : Continuar hasta el siguiente breakpoint.
  • CTRL + Q (sobre un elemento) : Inspeccionar estructura y valores del elemento (p.e. una variable).

Hay otros dos atajos que debería usar, pero no lo hago. El primero, porque utilizo CTRL + F, y el segundo, porque sigo usando el ratón (aunque ya me he comprometido conmigo mismo a cambiar esto :P )

  • CTRL + J : Búsqueda incremental (como Firefox).
  • CTRL + 1 : Arreglo rápido. Es equivalente a pulsar sobre la “x” que sale al lado de la línea que contiene errores en el código fuente, sugiriendo soluciones.

Para finalizar, dos apuntes más:

- Todos estos atajos son configurables; pueden ser adaptados a nuestras preferencias personales. En Windows->Preferences->General->Keys está la lista de todos los ellos y su configuración asociada
.
- Existe un Plugin para Eclipse llamado MouseFeed que te muestra el shortcut asociado a una acción que se lleve a cabo con el ratón, de tal forma que así podemos aprender nuevas funcionalidades en el teclado para irnos desprendiendo de Mickey.

¿Usas algún atajo más? Compartelo con todos en un comentario ;)

Bonus Tip: escribir “syso” y luego hacer uso del shortcut de autocompletado (CTRL + Barra Espaciadora) nos da como resultado “System.out.println(“”);. Ahi lo dejo, aunque como todos somos buenos programadores, los mensajes los imprimimos usando loggers, y la consulta de valores de variables lo hacemos mediante el debugger, ¿no? :P :P

Comentarios (7)

Categoria: Coding,Informática,Tips Supervivencia

Sabiduría Popular I: Problemas

Escrito por Juanjo el Wednesday, 4 de February del 2009 a las 11:55 pm

“Algunas personas, cuando se encuentran con un problema, piensan «Ya lo tengo!, usaré expresiones regulares». En ese momento ya tienen dos problemas“.

Oído decir por Jamie Zawinski, desarrollador de NetScape. Yo lo vi en Intenta.

Escribir comentario

Categoria: Coding,Humor,Informática,Sabiduría Popular

Test Técnico de Java

Escrito por Juanjo el Monday, 2 de February del 2009 a las 3:50 pm

No me acuerdo exactamente donde fue que encontré las siguientes preguntas, pero si son verídicas, soy un completo ignorante (por cierto, no es lo mismo intuirlo que corroborarlo). Al parecer, son preguntas que se hacen en la parte “técnica” de las entrevistas de trabajo para ingenieros informáticos en el Reino Unido. Son bastante bastante concretas sobre Java… y no sé ni una. Creo que me queda mucho que estudiar para aspirar a las certificaciones Sun…

Aquí van las preguntas (en inglés):

1- Troubleshoot the following class that is producing performance errors on the site:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
package com.blah.dataaccess;  
 
import java.sql.*; 
import javax.sql.*;  
import com.blah.data.*;  
 
public class GetFormats {   	
 
   private Connection con;  	
 
   public static String GetFormat(String user) 	{ 	 		
      String format = "mpeg4_150k";
      try {
         con = ConnectionFactory.getConnection();
         String sql_string = "select wfmt_urlroot from wprf, wfmt where wprf_value = wfmt_id and wprf_type = 'bandwidth' and wprf_wusr_id = ?";
         PreparedStatement pstmt = con.prepareStatement(sql_string);
         pstmt.setString(1, user);
         ResultSet rs = pstmt.executeQuery();
         if (rs != null) {
            while (rs.next()) { 
               format = rs.getString(1);
            }
         }
      } catch (SQLException e) {
          String error = ""+ e.toString();
      }
      return formats;
      }
   }
}

2- What’s wrong with the following Tag:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
package com.blah.webui;  
 
import java.sql.*; 
import java.lang.*; 
import java.util.*; 
import java.net.URLEncoder;  
 
public class OutputFooter extends TagSupport {
 
   public String Footer() {
      String html = "";
      html = html + "</body></html>";
      return html;
   }
 
   public int doStartTag() throws JspException {
      try {
         // and write out the formatted content to the page
         pageContext.getOut().write(Footer());
      } catch (java.io.IOException ioe) {
         throw new JspTagException(ioe.getMessage());
      }
      // and skip evaluating the body of the tag (as there shouldn't be one)
      return SKIP_PAGE;     
   }
}

3- If you need to obtain and return the referring URL into a JSP page, how would you do it?

4- Describe how you would set up servlet mappings in Tomcat or any other J2EE servlet container, what would you do to involve Apache in this process to provide a unified URL convention for static and dynamic elements of the site.

5- Describe the steps involved in making Apache and a servlet container such as Tomcat work together. Discuss the relative merits of mod_jk and mod_proxy.

6- Discuss the differences between redirection and forwarding in the Java server environment within a cluster, between servers in a cluster and between sites.

7- Describe how serving of static and dynamic fragments can best be done in a clustered environment for high efficiency under high load with maximum availability.

8- The company has decided to settle on memcached to provide a distributed cache store. Describe how you would create a set of custom tags to provide an interface to memcached to provide for creating, updating, invalidating and retrieving cached items.

9- Explain the steps, giving references to libraries you would use, to enable elements from a content management system to connect with XML-RPC services to provide pings.

10- What’s your preferred way of parsing incoming XML and why?

11- Describe the stages involved in getting Ant, subversion and Eclipse working together to automatically build a tree from a subversion repository and deploy it to Tomcat.

12- Discuss the relative merits of

<c:import>

and

<jsp:include>

13- Discuss the difference between a custom tag which supports EL and one which supports RT.

14- Describe (with code examples if possible) how you would use an EL based JSP fragment to iterate through a simple XML file and make decisions based on the values of certain nodes.

15- The introduction of JSR-220 brought with it JPA. Hibernate is an open source ORM solution. Briefly describe, with a small example if possible, the impact JPA has had on the Hibernate project, and what steps would need to be taken to convert an existing hibernate project to conform with the JPA specification in JSR-220. What advantages to would this conversion bring?

16- When using a persistence layer within a multi-threaded environment which has the potential for a long object lifetime, special precautions must be made to ensure the system can maintain a high degree of concurrency, and also work correctly in a clustered environment. Give a short explanation of the problem domain and a potential high-level solution.

17- Explain the following method signature:

<T extends Myobject> T getMyobject(Class<T> MyObjectType);

18- Explain the difference between phantom, soft, strong and weak references and give a context they would be used in.

19-Diagnose the following exception, found in the tomcat catalina.out file:

java.security.AccessControlException: access denied (java.net.SocketPermission 192.168.1.244:80 connect,resolve) 
	at java.security.AccessControlContext.checkPermission(AccessControlContext.java:264) 	
        at java.security.AccessController.checkPermission(AccessController.java:427) 	
        at java.lang.SecurityManager.checkPermission(SecurityManager.java:532)
 	at java.lang.SecurityManager.checkConnect(SecurityManager.java:1034)
 	at sun.net.www.http.HttpClient.openServer(HttpClient.java:459)
 	at sun.net.www.http.HttpClient.<init>(HttpClient.java:214)
 	at sun.net.www.http.HttpClient.New(HttpClient.java:287)
 	at sun.net.www.http.HttpClient.New(HttpClient.java:299)
 	at sun.net.www.protocol.http.HttpURLConnection.getNewHttpClient(HttpURLConnection.java:796)
 	at sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:748)
 	at sun.net.www.protocol.http.HttpURLConnection.connect(HttpURLConnection.java:673)
 	at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:917)
 	at org.apache.taglibs.standard.tag.common.core.ImportSupport.acquireReader(ImportSupport.java:331) 
.......

20- Design a simple three database table structure which would allow the creation, editing and publication of a webpage stored in a content management system.

Concurrencia, clústering, parsing XML, diseño DB, Templates….. En pocas palabras, la-le-che :P

Comentarios (3)

Categoria: Coding,Informática

Más modificaciones en el diseño

Escrito por Juanjo el Friday, 30 de January del 2009 a las 12:21 am

A pesar de que no se vean cambios a simple vista, he modificado el código del CSS completamente (cosa que para un noob en diseño web como yo, tiene mérito :P ).

Ahora el blog aparece centrado (y no a la izquierda), y si se observa el css, las capas y los elementos se posicionan relativamente y no de modo “absoluto” como antes. Este cambio lo considero esencial, pues maquetar cualquier cosa (añadir un menú, modificar un tamaño) se convertía en una odisea. De todas formas aún no he logrado hacer que el título aparezca donde quiero, pero todo se andará.

Por otra parte he empezado a padecer las distintas intrepetaciones de la página que hacen los navegadores, y estoy padeciendo algo muy similar al trastorno bipolar: paso de una completa alegría y euforia al ver la página en Firefox, a la más vil de las miserias cuando abro Explorer. Y todo en décimas de seguro, qué barbaridad. En ese sentido espero poder descubrir como hacer un híbrido decente para ambos, que no me destrocen el layout en uno por verlo maravillosamente en otro.

También voy a agregar un pie de página, porque ahroa el final es algo soso. Más nada, hasta aquí los cambios en el blog.

(PD: Mi mente me está dando una mala pasada… en un continuo intento de postergar los posts con contenido de verdad que sé que debo escribir, me paso la tarde perdiendo el tiempo con estas chorradas :P )

Escribir comentario

Categoria: Blogs,Coding

Imagen de cabecera aleatoria

Escrito por Juanjo el Saturday, 10 de January del 2009 a las 10:43 pm

Como comenté en el post anterior, he añadido al blog un cambio que me agrada bastante: la de poder cargar una imagen aleatoria al entrar en la página. Bastante fácil todo, excepto por un detalle: como el theme que utilizo define la propiedad de la imagen en el CSS (background-image:url(ruta-imagen)), la generación de la alatoriedad no sabía cómo llevarla a cabo exactamente, hasta que descubrí que jQuery permite la modificación de atributos de las hojas de estilo (enlace). jQuery es una librería de funciones JavaScript que, básicamente, hace mil virguerías. Recomiendo pasarse por la página y echarle un vistazo. Pues bien, al final el código quedó tal que así:

En la cabecera, añadimos la librería:

<script src="http://www.jjcoellov.es/scripts/jquery.js" 
   type="text/javascript"></script>

Y luego en el cuerpo agregamos este código:

   <script type="text/javascript">
   /* Cambiar la imagen de la cabecera aleatoriamente */ 
 
  /* Calcular un valor aleatorio entre 0 y el tamaño del array 
   *  pasado por parametro */
   function randomPos(a) {
      return Math.floor((Math.random() * a.length) % a.length);
   }
 
   /* Array con las rutas de las imágenes a utilizar */
   var rutasImg = [ "/imagenes/cabecera1.jpg", 
                    "/imagenes/cabecera2.jpg",
                    "/imagenes/cabecera3.jpg",];
 
   /* Hacemos uso de jQuery para modificar (o asignar) el valor 
    *  del atributo "background-image" al elemento 
    *  con id "cabecera"  */
   $(document).ready(function() { 
      var imagen = "url(" + rutasImg[randomPos(rutasImg)] + ")";
      $("#cabecera").css("background-image", imagen);
   });
 
   </script>

Y eso es todo. Podría ser mucho más sofisticado: obtener todas las imagenes de un directorio especificado (aunque necesitaría algún lenguaje del lado del servidor para llevarlo a cabo), o generalizarlo para que obtenga una imagen aleatoria en cualquier elemento, simplemente ubicando el código dentro del mismo. Tambiés puede resultar innecesario añadir jQuery para hacer esta nimiedad, pero como resulta bastante sencillo utilizarlo decidí incluirlo. Es muy probable que haya métodos alternativos haciendo uso de funciones nativas de javascript, pero como primera aproximación creo que es adecuado. Si alguien busca algo similar, espero que le sirva de ayuda.

Escribir comentario

Categoria: Coding

Comentarios Recientes
  • Programador web Cádiz: Parece un poco inconforme de que el mundo rueda alrededor de Google…pero la idea es...
  • Fernando: Que pocas ganas de colaborar, este tipo de información es muy útil para muchísima gente. Que pena que la...
  • Danielfcc: Alguien sabe como activar el agrupamiento de parrafos era +/- de esta forma.. + function1 - function2...
  • Pablo: Algo que me pareció bueno es lo de poder configurar tus propios atajos, yo particularmente me configuré...
  • Pablo: Excelente post, pagina de inicio para google chrome! =)
  • informatico: Gran trabajo….me gustaria saber más sobre ello…para cuando la siguiente entrada??? gracias.
  • Churry: Esta entrada ya se publico?? “En el próximo artículo veremos cómo hacer uso de los componentes...
  • Gregorio: Qué cabrones, lo tuvieron que pasar genial. Iré solicitando el acceso al comando a ver si para el próximo...
  • LcOHN: Muy bueno, con el ctrl + F11 corre los test. Saludos! grac
  • alexis perez: Pero no hay que ser un ingeniero para darse cuenta que por ejemplo en la pregunta 1, reclama o lanza...


All's clear