Trabajando en el CERN (I)

Hace aproximadamente un par de semanas, empecé a trabajar en el CERN, donde estaré aproximadamente 3 meses, hasta finales de Septiembre. Para los que no conozcan el CERN, les diré que es el centro europeo en investigación nuclear, dónde se está acabando de construir el mayor acelerador de partículas, el LHC, de 27km de perímetro, situado a pocos kilómetros de Ginebra, cerca de la frontera, con parte de los laboratorios en Suiza y parte en Francia.

Si se preguntan qué tiene que ver un computer scientist como es el que les habla, con física de partículas, bosones y fermiones, se lo aclararé: nada en absoluto. No trabajo en ningún experimento directamente relacionado con física de partículas, sino que trabajo en el Grid.

El Grid del CERN, para los que no conozcan de su existencia, es, a grandes rasgos, un cluster de clusters. El Grid se compone de diversos clusters, en diferentes centros o universidades repartidos por todo el mundo, a los que el planificador de tareas del Grid les manda trabajos. Los clusters siguen teniendo su propio planificador de tareas (Torque, Condor, etc.) para repartir la carga por sus worknodes.

La idea es que los trabajos se envían al Grid, y éste los envía a un cluster u otro según la carga, las preferencias del usuario, el grupo al que pertenece, si necesita alguna librería especial, etc. Una vez el trabajo se finaliza, el usuario solicita al Grid el resultado de la ejecución y éste se lo copia a un directorio en la unidad de red.

Además del Grid, también se dispone de otro método de computación distribuida llamado LHC@home. El LHC@home es un proyecto público, en el que cada usuario instala un programa (BOINC) en su computador y éste utiliza los momentos en los que no se usa la CPU para procesar las unidades de trabajo que se envían desde el servidor. Se usa para hacer cálculos de trayectoria para el emisor de partículas del LHC.


Mi trabajo consiste en unir ambos sistemas, de modo que cuando el Grid no esté a pleno rendimiento, se introduzcan procesos de LHC@home con baja prioridad. Del mismo modo, si se están ejecutando procesos de LHC@home en el Grid y se necesitan nodos para tareas del Grid, debe guardarse el estado del LHC@home y parar su ejecución, para más tarde continuarla.

La segunda parte trata sobre virtualización. La mayoría de procesos que lanzan los físicos solamente pueden ejecutarse bajo sistemas Unix-like, y la mayoría de máquinas registradas en el LHC@home son Windows. Portar los trabajos a Windows sería demasiado costoso, demasiado complejo y se perdería demasiado tiempo. Por ello, también estoy trabajando en virtualizar (no emular) Linux en Windows, ejecutando el proceso, todo ello metido dentro de un work unit de LHC@home.

Sobre Ginebra, lo cierto es que es una ciudad muy bonita, donde hay muchas cosas por ver y muchas cosas que hacer. Estoy aproximadamente a 20 minutos del centro de Ginebra en autobús, con un autobús cada 15 minutos.

El famoso Jet d'Eau, el más grande del mundo, en el lago Léman. Una de las cosas que sorprende de Ginebra es que los edificios no son en absoluto altos comparado con otras ciudades europeas.




Los utilitarios que utilizan los ginebreses para desplazarse por la ciudad e ir a tomar un café (aparcados delante de un Starbucks)




 

in.solit.us: El día después (de la popularidad)

in.solit.us
Como algunos ya sabréis, hace aproximadamente una semana, decidí publicar en el blog que in.solit.us era oficialmente beta (in.solit.us: Almacenando y compartiendo archivos), y por tanto, darlo a conocer al público. Unos días después, apareció en TodoRSS, y de ahí ya pasó a Error500, Genbeta, del.icio.us, y el registro de nuevos usuarios, archivos y por tanto, el ancho de banda ha subido considerablemente (aproximadamente unos 5GB por día -estadísticas-).

El ancho de banda realmente no es un problema, pero sí la cantidad de nuevos usuarios con múltiples tipos de archivos, que dieron lugar a algunos errores de la aplicación imprevistos, de los cuales, los más importantes ya están solventados, gracias a las sugerencias y problemas de algunos usuarios.

En breve, publicaré una nueva versión de la aplicación, solventando algunos errores que me habéis comunicado, bien usando la contact form de in.solit.us o en éste blog o el blog de in.solit.us.

Respecto al modelo de negocio, como ya he comentado en el blog oficial, de ninguna manera in.solit.us se convertirá en una web tipo Rapidshare, Megaupload o similares con 20 banners de publicidad a cada lado, tiempos de espera, etc. Prefiero cerrar que llegar a ese extremo.

Lo que probablemente sí deba hacerse es introducir algún tipo de publicidad no intrusiva (Google Adsense) o optar por alguna modalidad de pago en la que se disponga de mayor espacio en disco, eliminar límites de upload, etc. De todos modos, aún no está claro, así que al menos, durante las próximas semanas, seguirá como está, sin límite de espacio en disco. Veamos como evoluciona, y decidiré entonces. Por supuesto, estoy abierto a todo tipo de sugerencias sobre el tema.

Gracias a todos los que estáis probando la aplicación, y a los que han reportado problemas, sugerencias, etc. Seguid, por favor ;)



 

in.solit.us: Almacenando y compartiendo archivos

Desde algún tiempo he estado probando las bondades de Ruby on Rails, y esas pruebas acabaron por convertirse en algo que como mínimo es útil para mí, que es la aplicación que hoy os presento. Se podría decir que es su presentación oficial, ya que nadie la conoce (salvo un pequeño círculo de amigos, y algún despistado que ya llega por Google).



in.solit.us es una aplicación web, hecha en Ruby on Rails, íntegramente desarrollada en TextMate (el mejor editor de texto para programar, al que constantemente profiero mis alabanzas) bajo MacOS X, que pretende seguir el hype de las webs 2.0.



La utilidad de la misma, como habréis deducido por el título del post, es básicamente, subir archivos, y compartirlos (públicamente, con otros usuarios, por correo, et cetera)

En la página inicial, comprobaréis que hay un tag cloud (una nube de palabras usadas para la descripción de los archivos clasificados como públicos). Las palabras que aparecen con mayor tamaño son las más usadas. Usando el enlace en cada tag puede navegarse por los archivos que están relacionados con esa palabra.



También se muestran los últimos 10 archivos públicos que se han subido al servidor. No es necesario registrarse para bajar ningún archivo público, ni tampoco hay que esperar 60 segundos para bajarlos. La descarga es instantánea y sin publicidad. Los archivos también pueden comentarse.

Por otro lado, el sistema autodetecta el tipo de archivo que se sube (aplicación, documento, imagen...) y así podemos ver los archivos por categorías.

Existen feeds RSS para seguir nuevos archivos (todos, por categorías, o por usuarios), que pueden agregarse a cualquier lector de feeds, Bloglines, etc.

Si os tomáis unos segundos para registraros (no se requiere confirmación de e-mail), podréis ver el panel de control del usuario, dónde se muestran los archivos propios y los que han compartido con nosotros otros usuarios, además del menú de opciones disponible.

Algunas de las cosas que pueden hacerse con un archivo en el home de un usuario (pueden hacerse búsquedas -filtrar- sobre los archivos que tenemos) :




Podemos, entre otras cosas, configurar ciertos aspectos de nuestro perfil público, y crear grupos de usuarios para más tarde permitirles descargar archivos (de una forma sencilla, usando Ajax).



Para cada archivo, además, podemos crear links de descarga que también podemos enviar automáticamente por e-mail. De este modo, la persona que descargue el archivo no tiene por qué registrarse. Por ejemplo, para el archivo Four Days on Rails, he creado el siguiente link: http://in.solit.us/archives/dcode/286277938

También existe la posibilidad de enviarle el archivo a alguien por e-mail como un attachment.

Como probablemente me deje alguna cosa, creo que lo mejor es que lo probéis vosotros mismos y me deis vuestra opinión, os lo agradecería. Realmente me interesan vuestras opiniones (cosas que no van, cosas que deberían mejorarse, cosas a añadir... lo que sea). Podéis dejar vuestro comentario aquí mismo o usar la contact form de in.solit.us.

Por cierto, gracias a Jordi, Juan, Nuria, Marc, David, Eric, Sergio, Galdric, Ricard por sus sugerencias y/o pruebas de la aplicación ( algunos algo forzados ;) ). A cambio, a los que tenéis blog, os voy a subir el PageRank.



 

MacBook Pro: Root, Ruby on Rails y Boot Camp

Como ya comenté en el anterior post, adquirí un MacBook Pro de 15" en la Apple Store y ya he tenido un par de días para probarlo. La impresión general es muy buena. La batería dura bastante (alrededor de 4:30), la calidad de los materiales también lo es, tanto el teclado como el trackpad son cómodos y el rendimiento comparándolo con antiguos PowerPC es espectacular.

Algunas de las cosas que he hecho estos días para tener el MacBook Pro a mi gusto, que ya prácticamente había olvidado, las plasmo aquí por si le sirve a alguien o para futuras lecturas por mi parte.

Activar usuario root

Ir a NetInfo Manager (en /Applications/Utilities) -usando Spotlight, escribimos NetInfo y acabamos antes-.

Clic en candado para autentificarse como administrador (nos pedirá una contraseña de un usuario administrador)

Ir al menú Seguridad - Activar usuario root (pide nueva contraseña).

Listo. Ahora podemos hacer su en la Terminal.

Instalar entorno desarrollo Ruby on Rails

Desde MacOS X 10.4.6 está instalado Ruby 1.8.2, así que nos podemos saltar el paso de la instalación de Ruby.

Procedemos a instalar rubygems para instalar Rails:
Descargar rubygems

Descomprimir archivo, usando Stuffit desde el escritorio, o con el Terminal:
tar xvfz rubygems-0.8.11.tgz

En el Terminal, usando sudo o su, entrar en la carpeta rubygems-0.8.11/ e instalar rubygems del siguiente modo:
ruby setup.rb

Ya podemos instalar Rails usando rubygems:
gem install rails --include-dependencies

Ruby on Rails listo. Nice and easy. Sólo faltaría el imprescindible TextMate.

Instalando Windows con Boot Camp
Descargar Boot Camp en la web de Apple (Boot Camp Public Beta)

El FAQ de Boot Camp dice que necesitamos un CD con Windows XP con el Service Pack 2 ya incluido.

Si bien la primera versión de Windows XP (sin ningún Service Pack) no me ha permitido realizar la instalación (no funcionaba el teclado), Windows XP con Service Pack 1 sí permite realizar la instalación. Deberemos entonces, una vez instalado Windows XP, bajarnos el Service Pack 2 y aplicarlo para que funcione todo bien y podamos instalar los drivers de Apple.

Descarga Windows XP Service Pack 2 [microsoft.com]

Si os queréis molestar en preparar un CD con Windows XP con Service Pack 2 incluido a partir de un CD de XP normal y el SP2 descargado, podéis seguir estas extensas instrucciones:
Slipstreaming Windows XP with Service Pack 2

Por cierto, por si os interesa, hoy hemos hecho una comparación de tamaño entre el MacBook (13,3") y el MacBook Pro (15") -gracias, Eric- .Perdonad la calidad, está hecha con un Nokia 8800, aunque de todos modos puede verse la diferencia (unos 2cm de largo de diferencia, aunque el Pro es algo más fino):






 

Presentación MacBook Pro

Finalmente, tras pensarlo durante una temporada, me decidí por el MacBook Pro en vez del MacBook. Está más probado, en cuestión de tamaño es prácticamente igual que el MacBook, pese a tener la pantalla más grande, pesa algo menos, y por qué no voy a decirlo, me gusta más.

Uno de mis temores al comprar el Mac por la Apple Store era eso a lo que le llaman compañía de transportes de Apple, TNT. Tanto, que me planteé comprarlo en una tienda física, aunque la diferencia de precio de casi 200 euros me hizo replantearme la Apple Store.

Mis temores se cumplieron, y como en anteriores ocasiones, tuve que enfadarme con ellos para que me entregaran mi Mac. Siempre ponen la excusa de que mi casa está muy lejos, y que el transportista tiene que desviarse de su ruta (a lo sumo serán 5 minutos), así que siempre me dejan para el último, cuando le vaya mejor al transportista. ¿No será para que el Mac vea mundo antes de entregármelo?

Es patético como algo tan eficiente como la Apple Store (y la propia TNT en el resto de Europa) manchan su imagen con estos aprendices de trinitrotolueno (y me consta que no soy el único que tiene problemas con TNT en España). ¿No les parece insólito que tarde menos de llegar de Eindhoven a Barcelona que de Barcelona a mi casa?

De todos modos, ahora ya tengo el Mac en casa y ya tengo todos mis datos pasados del iBook G3 al MacBook Pro (el cable FireWire-FireWire hace maravillas). Para el que no conozca este método, al encender la máquina por primera vez, en el proceso de instalación se pregunta si se quiere hacer una transferencia de información de una máquina antigua. Para ello, se necesita un cable FireWire, para conectar ambas máquinas entre sí, e iniciar la máquina origen en modo disco FireWire (presionando la tecla T mientras arranca). Se presiona siguiente en el Mac destino, et voilà!

El MacBook Pro en sí se nota bien hecho, el MagSafe cumple su función perfectamente, y la batería dura un tiempo razonable (oscila entre las 3:45 y las 4 horas con la carga inicial). Además, me ha sorprendido gratamente la calidad de la iSight integrada.

Como un post sin fotos es menos post, aquí van algunas:



Comparando el tamaño del MacBook Pro de 15" con el iBook de 12" (aquí sí hay diferencia!)



Aunque en delgadez gana el MacBook Pro...








 

Lanzamiento MacBook 13"

Hoy ha lanzado Apple la nueva gama de portátiles MacBook que sustituyen a los anteriores iBook, con procesadores Intel Core Duo, de 1.8 y 2.0 GHz, todos con 512MB de RAM. Las características son muy similares a sus hermanos mayores, los MacBook Pro. iSight, pantalla panorámica de 1280x800, Airport, Bluetooth y los USB y Firewire típicos. Los precios oscilan entre los 1069€ para el blanco de 1,83 y los 1469€ para el negro de 2,0GHz.

La novedad es que ahora hay MacBook en el típico blanco de iBook y en negro, aunque este último sólo se ofrece a 2.0GHz, con disco duro más grande y superdrive, 400 euros más caro.



Al parecer, nos vamos a quedar sin MacBook Pro de 12", que era el que yo quería, así que tendré que conformarme con uno de éstos (probablemente me quedaré con el típico blanco). Aunque el negro también es bonito.

Una configuración interesante sería el modelo base, ampliado a 1GB de RAM, y con 80GB de disco, sobre 1200€. Como siempre, lo mejor, esperar a que pasen algunas revisiones.






 

Ayaan Hirsi se irá de Holanda

Para quien no la conozca, Ayaan Hirsi Ali es una diputada del partido liberal (VVD) en Holanda, autora de Yo Acuso, en el que habla de la discriminación de las mujeres en países islámicos, y autora también del guión de la película Submission, por la que un musulmán mató a Theo Van Gogh. Los de la religión de la paz, como siempre...Ayaan Hirsi Ali

Por cierto, os recomiendo el Yo Acuso, sobretodo a los progres de turno. Aunque le tengáis miedo a leer libros que no recomiende el régimen, éste os abrirá los ojos. Está en Círculo de Lectores.

Después de que el gobierno decidiera obligarle a irse de su casa, debido a presiones de sus vecinos, que no se sienten seguros, ya que está amenazada de muerte, durante un tiempo ha sufrido presiones, intentando quitarle su escaño de diputada y su nacionalidad holandesa, aduciendo mentiras en el momento en que llegó como refugiada a Holanda en 1992.

Finalmente, le han ofrecido un trabajo en el American Enterprise Institute, en Estados Unidos. Lo cierto es que me alegro mucho por ella, ya que estará más segura que en Eurabia, dónde hay demasiado progre estúpido que le hace el juego a los Islamofascistas. La lástima es que cada vez, más gente tiene que abandonar Europa por culpa de los políticos que prefieren defender a los islamistas que a la gente que lucha contra ellos. Como dice Fàbregas en Nihil Obstat, ésto cada vez se parece más a la Alemania nazi. Ganan los fascistas, y así cada vez Europa es más Eurabia.

Más información en:
Infidel Bloggers
Posts en inglés en el blog de Ayaan Hirsi
Peaktalk: Hirsi Ali, the hunted



 

Programando en Ruby on Rails (I)

Para empezar con este primer artículo, deberíamos tener instalado Ruby on Rails. Podéis seguir los pasos de un artículo anterior: Instalar Ruby on Rails en Linux

Nota: Si sólo queremos probar nuestras aplicaciones, no hace falta instalar un servidor en serio. Rails tiene un servidor web con el que podemos hacer pruebas. Podemos arrancarlo ejecutando ruby script/server en la carpeta de nuestro proyecto (por defecto en el puerto 3000).

Para los que aún no sepáis de que va el tema, Rails es un framework para desarrollar aplicaciones web en Ruby, con una velocidad pasmosa (en cuanto se domina un poco).

Rails implementa el patrón de diseño MVC (Model-View-Controller). Básicamente, podríamos decir que las "clases" de Rails se dividen en tres partes: el modelo, que contiene información sobre lo que representa la clase, el controlador, dónde se definen todas las acciones (funciones) que se pueden realizar sobre el modelo, y la vista, que es básicamente, html dónde tendremos acceso a las variables creadas en el controlador.

Por lo general, las clases (un MVC) en Rails representan una tabla de una base de datos, y aquí creo que es donde radica la potencia de RoR.

Veámoslo con un ejemplo:

Inicialmente, para crear un nuevo proyecto tan solo debemos escribir rails nombre_proyecto. Nos creará una carpeta con todos los archivos iniciales. Deberemos configurar nuestra base de datos tal y como explicaba en el artículo de instalación.

Supongamos para el ejemplo que tenemos una tabla en nuestra base de datos llamada Users, y que ésta tiene el típico campo id, un usuario, un password y un nombre.

Para crear un modelo de la tabla, simplemente deberemos ejecutar ruby script/generate model User
Comprovad que automáticamente detecta los plurales y une el modelo User con la tabla Users.

Probablemente necesitemos un controlador para nuestro modelo. Ejecutaremos ruby script/generate controller User

Puede ser interesante usar scaffold para que Rails nos cree un esqueleto de algunas funciones típicas (add, delete, modify, list) que pueden sernos útiles para empezar. Usaremos ruby script/generate scaffold User

Los archivos de la aplicación están dentro de la carpeta app/, separados por controller/, views/ y models/.

Veamos el controlador (app/controller/user_controller.rb)
Si hemos usado scaffold veremos que nos habrá creado algunas funciones, como por ejemplo list, dónde encontraremos algo por este estilo:

def list
    @users = User.find(:all)
end

La anterior función list buscará todos los usuarios de la tabla y los guardará en la variable @users (realmente, lo que hace es un select * from users)

En la definición del modelo, que inicialmente estará vacía (app/models/user.rb), podemos añadir propiedades del modelo, como por ejemplo, la restricción de que el usuario y el password no pueden estar vacíos, o que el usuario debe ser único (se comprobará automáticamente antes de hacer un insert)

class User < ActiveRecord::Base
    validates_presence_of :usuario
    validates_uniqueness_of :usuario
end


Si miramos la vista correspondiente a la acción list de user (app/views/user/list.rhtml), veremos que se usa la variable para mostrar todos los usuarios. Podríamos hacer lo siguiente:

<% for user in @users %>
    <p>Usuario: <%= user.usuario %></p>
    <p>Nombre: <%= user.nombre %></p>
    <%= link_to "Información del usuario", :controller => 'user', :action => 'info', :id => user.id %>
<% end %>


Básicamente, lo que se hace aquí es iterar sobre la variable @users, recorriendo todos los usuarios, para los que se escribe su nombre, usuario, y suponiendo que la id es 1, creando un enlace a /user/info/1

La opción find realmente es interesante, podríamos hacer cosas tales como buscar usuarios cuyo nombre sea el contenido en la variable @nombre de la siguiente forma:

    @nombre = 'rails'
    @users = User.find(:all, :conditions => ["nombre = ?", @nombre])

Esto sería equivalente a:

    @users = User.find_by_nombre(@nombre)

Sí, podemos usar cualquier campo de la tabla para el find_by.

Si quisiéramos hacer un insert la cosa sería así:

    @user = User.new(nombre => 'nombre', usuario => 'nombre', password=>'12345')
    @user.save

Parecido en el caso de querer borrar un campo:

    @user = User.find(id)
    @user.destroy

Probad alguna de éstas cosas, intentaré próximamente hacer otro artículo ampliando algo más con algunos otros ejemplos.





 

Convertir RSS2 a Movable Type

Últimamente he estado probando Movable Type, y la verdad es que me gusta, así que he decidido migrar este blog a dicha plataforma. El problema es que para importar los posts del blog antiguo, la gente de Six Apart no proporciona ninguna utilidad para convertir los posts de otro blog, sino que éstos deben introducirse con un formato especial de Movable Type. Además, tengo pendiente encontrar algún diseño que me guste, o adaptar alguno.

Después de buscar algún conversor, deduciendo al fin que no había ninguno hecho, decidí hacer uno. Convierte los posts exportados en RSS2 (diría que todas las plataformas de blogging permiten exportar todos los posts en RSS2), al formato específico de MovableType.

Está hecho en Java (1.5) y os lo podéis descargar aquí:
Ejecutable RSS2MT (.class) - para ejecutar: java RSS2MT feed.rss posts.mt
Código fuente RSS2MT - para compilar: javac RSS2MT.java
(Adjunto el código fuente también en el cuerpo del artículo.)

Además, me ha servido para conocer una serie de clases muy interesantes de Java para manipular fechas (Date, DateFormat y SimpleDateFormat).

Por un lado, se crea un objeto SimpleDateFormat con el formato de fecha en la que tengamos el String (i.e: Web, 12 Apr 2006 19:24:50 +02:00 sería EEE, dd MMM yyyy HH:mm:ss Z)
SimpleDateFormat dateParser = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss Z");
Se lee la fecha contenida en el String date
Date formattedDate = dateParser.parse(date);
Se aplica el nuevo pattern (04/12/2006 19:24:50)
dateParser.applyPattern("MM/dd/yyyy HH:mm:ss");
Y se escribe la fecha previamente leída con el nuevo formato
out.println("DATE: " + dateParser.format(formattedDate));




 

Apple Boot Camp: Instalando Windows en un mac

He pasado de una temporada de low blogging or not blogging at all, a hacer dos posts en un día. Pero bien, la noticia se lo merece.
Leo prácticamente a la vez en el blog de Enrique Dans y en Microsiervos, que Apple acaba de lanzar oficialmente un software llamado Boot Camp, que permite instalar Windows en un Mac con Intel.

Si eres uno de los afortunados poseedores de un Mac con Intel, mientras el resto seguimos con PowerPCs, puedes descargar Boot Camp en la página oficial de Apple, dónde además se especifican los requerimientos y el funcionamiento del software.



Básicamente, lo que hace es proveer un software que permite instalar de forma sencilla Windows, con un conjunto de drivers para éste, aunque ya se avisa que lo accesorio no funciona (el mando, la iluminación del teclado, etc.).

Las acciones de Apple están subiendo prácticamente un 10% en lo que va de día, lo que muestra la buena aceptación que ha tenido el software, y aunque a mí personalmente, tampoco me importa demasiado poder ejecutar Windows, Linux u otros en el Mac (pero reconozco que cuando finalmente me compre un MacBook Pro, quizá instale Windows XP para probar algunas cosillas), para un switcher de Windows, saber que podrá cambiar a Windows si cree que algo no le va a funcionar en MacOS X, puede hacerle pensar seriamente en comprar un Mac.



 

Search



About

newton.gra2.com is a blog about technology, opinion and random thoughts written by Daniel Alvarez, a computer engineer currently living in Zurich, Switzerland.

Topics

News (20/0)
Manuals (24/0)
Security (7/0)
Music (3/0)
Weeklog (1/0)
Personal (34/0)
Photos (3/0)
Opinion (14/0)
Windows (5/0)

Blogroll

Pros i contres (Jordi)
Entrepa de fusta (Oriol)
Spaghetti Code (Isaac)
Made in net (Eric)
Nogare (Juan)
Blog de Isaac Jimenez
Web d'en Jaume Benet
Montcada Wireless (Fran)
Blog d'en Ricard Forniol
Angela Fabregues
in.solit.us

Libertad Digital
FOX News
The Wall Street Journal
The Washington Times
The Jerusalem Post

Michelle Malkin
Eurabian News
Nihil Obstat
Barcepundit
Expose the left
Davids Medienkritik
Johan Norberg
Ayaan Hirsi Ali

User Functions

:

:


Lost your password?

Latest posts

Stories

No new stories

Comments last 2 days

No new comments

Trackbacks last 2 days

No new trackback comments

Links last 2 weeks

No recent new links