Scripting: exprime tu gvSIG (II). Crear un buffer

En anteriores entradas hemos visto cómo crear un script muy sencillito en gvSIG 2.0.

En esta entrada os traemos un vídeo en el que implementaremos un script que crea una capa shape de polígonos que se obtienen de aplicar un buffer a las geometrías de una capa de puntos. La distancia del buffer se obtiene de uno de los campos de la capa de puntos.

Los pasos que se siguen en el script son:

  • Obtener la capa de entrada
  • Crear la definición de datos (Schema) de la nueva capa
  • Obtener los datos de creación de la nueva capa
  • Crear la nueva capa
  • Recorrer los fenómenos de la capa de entrada (puntos)
  • Generar las nuevas geometrías
  • Añadir las nuevas geometrías a la nueva capa
  • Terminar la edición de la capa nueva
  • Liberar el conjunto de fenómenos de la capa de entrada

El código con comentarios es el siguiente

from gvsig import *

def main():
  #Obtenemos la capa activa
  layer = currentLayer()

  #Creamos la definición de los datos
  schema = createSchema(layer.getSchema())
  schema.modify()

  #Obtenemos la proyeccion
  crs = currentProject().getProjectionCode()

  #Definimos la ruta de la nueva capa
  ruta = "/home/victor/carto/influencia.shp"

  #Creamos la capa
  newLayer = createShape(
    schema,
    ruta,
    CRS = crs,
    geometryType = SURFACE
  )

  #Obtenemos los fenomenos de la capa de entrada
  features = layer.features()

  #Recorremos los fenomenos 
  for feature in features:

    # Obtenemos el valor del area de influencia
    influencia = feature.get("Influencia")

    #Creamos la nueva geometria aplicando un buffer sobre la geometria del fenomeno de entrada
    geom = feature.geometry().buffer(influencia)

    # Obtenemos los valores de los atributos del fenomeno de entrada
    values = feature.getValues()

    # Insertamos la nueva geometria en la capa nueva
    values["GEOMETRY"] = geom
    newLayer.append(values)

  # Terminamos la edicion de la nueva capa guardando los cambios
  newLayer.commit()

  # Liberamos el conjunto de fenomenos de la capa de entrada
  features.dispose()

Debes tener en cuenta que para que funcione es necesario tener la última versión de gvSIG 2.0 y la extensión Scripting Framework instaladas. Además, la vista debe tener una capa activa y esta capa debe tener un campo llamado Influencia de tipo double. Y au mejor, podéis modificar el script para que se adapte a vuestros datos.

Espero que os haya gustado y recordad; nos vemos en las próximas Jornadas internacionales de gvSIG!

Posted in gvSIG Desktop, scripting, spanish | 1 Comment

8as Jornadas gvSIG: Taller sobre Gestión del saneamiento y drenaje urbano

[English translation with Google Translator]

El miércoles 28 de Noviembre se realizará un taller sobre Gestión del saneamiento y drenaje urbano en las 8as Jornadas Internacionales gvSIG, impartido por Tècnicsassociats.

Este taller dispondrá de traducción simultánea Español-Inglés.

El objetivo del taller es acercar el software libre al mundo de la ingeniería civil, concretamente en la especialidad de ingeniería sanitaria, para hacerles conocer las posibilidades y las oportunidades que actualmente ofrecen las soluciones de código libre para alcanzar una excelente gestión y diseño de una red de saneamiento y drenaje urbano.

La experiencia nos demuestra que la heterogeneidad del perfil de los asistentes a este tipo de talleres, obliga a realizarlo siguiendo la propuesta de temario que seguidamente se adjunta:

  • Principios de las fuentes de código libre, las ventajas de trabajar con ellas y su repercusión en el mundo de la ingeniería civil
  • Introducción a los software gvSIG, PostGRE con PostGIS 2.0, y EPA SWMM 5.0e (Programa de análisis matemático de redes de saneamiento y drenaje urbano)
  • Conceptualización y diseño de un modelo de datos de una red de saneamiento
  • Análisis SIG con diferentes geoprocessos para llenar el modelo de datos diseñado.
  • Explicación de INPcom: Extensión de comunicación de gvSIG con EPA SWMM realizada por nuestro equipo que permite, entre otras, la exportación de todos los parámetros que EPA SWMM utiliza en su modelo matemático de análisis de redes de saneamiento y drenaje urbano.
  • Exportación de la información, una vez determinada y verificada al código EPA SWMM.
  • Ejecución de EPA SWMM, visualización de resultados, retorno a gvSIG y análisis de los mismos con el gis, por tal de obtener todo el potencial de análisis que gvSIG nos ofrece en la interpretación de resultados.

Material necesario para la realización del taller:

  1. Instalar gvSIG 1.11 portable.  (como EPA SWMM 5.0e está sólo en entorno WINDOWS, todo el taller se realizará bajo este entorno).
  2. Descargar las siguientes extensiones, descomprimir el fichero, y copiar las 3 carpetas que hay en él en el directorio \bin\gvSIG\extensiones de la carpeta de instalación de gvSIG 1.11 portable.
  3. Descargar e instalar EPA SWMM 5.0e (Descargar SWMM5 vE – Programa de instalacion).
  4. Descargar Flumen BLOQUES (Descargar el software: Cálculo de la lluvia de
    proyecto a partir del procedimiento de Bloques Alternados)
  5. Descargar Notepad ++ (Para descargar, escoger installer o zippackage)
  6. Descargar Libreoffice portable (Descargar PORTABLE APPS 117 MB).
  7. Descargar los datos a utilizar, y descomprimir el fichero .zip en local.
  8. Descargar la guía del taller (English translation with Google translator).
  9. Descargar la guía de la extensión INPcom (English translation with Google translator).

Conductor: Xavier Torret Requena
Consultor en Tècnicsassociats, arquitectura, enginyeria i gis.
http://es.linkedin.com/pub/xavier-torret-requena/23/572/495
www.tecnicsassociats.com

Posted in english, events, gvSIG Desktop, spanish | Tagged , , , | 2 Comments

8as Jornadas gvSIG: Taller de Gestión Municipal

El jueves 29 de Noviembre se realizará un taller sobre Gestión Municipal en las 8as Jornadas Internacionales gvSIG, impartido por Tècnicsassociats.

El objetivo del taller es hacer patente las posibilidades que ofrece gvSIG y el ecosistema de las fuentes de código libre para una excelente gestión del mundo local. Se hará patente la apuesta por una administración pública con funcionarios altamente capacitados, donde lo inteligente no son las ciudades -smart cities-, sino que la inteligencia reside en los gestores y ciudadanos. En el transcurso del taller se podrá visualizar cómo la Administración Local se puede convertir en el mejor garante de los activos públicos con una gestión eficiente y de calidad. Creando un proyecto desde el inicio se dará énfasis a varios conceptos: “comenzar es fácil”, “la implementación es escalable” y “valorizando el personal municipal formando”.

En el taller se realizará un repaso por diferentes áreas municipales como son:

  • Cartografía y sig local. Cargar información de servicios WMS.
  • Catastro: Cargar información del catastro en WMS.
  • Planeamiento urbanístico, herramientas como el 3D de gvSIG utilizadas para mejorar la concepción volumétrica de nuestras ciudades.
  • Actividades: Un ejemplo de gestión y fiscalización de las actividades municipales.
  • Gestión de servicios propios: Aplicaciones de gvSIG en combinación con otras tecnologías libres para una excelente gestión de los servicios municipales como:
    • Vialidad y movilidad
    • Alumbrado público
    • Saneamiento y drenaje urbano
    • Abastecimiento de agua potable
    • Verde urbano, zonas verdes y arbolado viario
  • Inventariado y toma de datos en campo.

Material necesario para la realización del taller:

  1. Instalar gvSIG 1.11.
  2. Descargar las siguientes extensiones, descomprimir el fichero, y copiar las 2 carpetas que hay en él en el directorio \bin\gvSIG\extensiones de la carpeta de instalación de gvSIG 1.11.
  3. Descargar la guía del taller y el esquema.
  4. Descargar los datos a utilizar, y descomprimir el fichero .zip en local.

Recomendable:

  1. Descargar Libreoffice.

Conductor: Josep Lluís Sala Sanguino
Director técnico en Tècnicsassociats, arquitectura, enginyeria i gis.
http://es.linkedin.com/in/joseplluissala
www.tecnicsassociats.com

Posted in events, gvSIG Desktop, spanish | Tagged , | Leave a comment

8as Jornadas gvSIG: Taller de Scripting con Python

En las próximas Jornadas Internacionales de gvSIG se realizará un taller sobre el scripting en gvSIG 2.0. El taller está dirigido a todos los usuarios de gvSIG que tengan interés en el scripting en gvSIG 2.0. Es muy recomendable que se tengan conocimientos de programación y si es posible del lenguaje Python , ya que es el que vamos a utilizar en el taller.

En cualquier caso Python es muy intuitivo y fácil de aprender…no es necesario ser programador para poder hacer tus propios scripts y aumentar la funcionalidad de gvSIG.

¿Qué vamos a ver?

En este taller trataremos de introducir los conceptos básicos para el uso de esta extensión e implementaremos algunos scripts de utilidad. Sin embargo, queremos saber vuestra opinión antes de decidir qué cosas queremos ver o implementar. Por ello os animamos a que aportéis vuestros comentarios y trataremos de dar respuesta a todo lo que podamos.

¿Qué necesito para participar en el taller?

Como es natural estar inscrito en las jornadas 🙂 . Por lo demás, basta con que traigas tu ordenador y tengas instalada la última versión publicada de gvSIG 2.0 y de la extensión de scripting (Scripting Framework), que se puede instalar desde el administrador de complementos de gvSIG; recuerda que la extensión de scripting no se instala por defecto y que debes seleccionarla manualmente.

¡Nos vemos en las jornadas!

Posted in community, development, gvSIG Desktop, scripting, spanish | Tagged , , | 6 Comments

Embajadores gvSIG

Una de las ideas que nos gusta repetir es que gvSIG no es un camino a recorrer, sino un camino a construir. Desde el inicio del proyecto y la posterior creación de la Asociación gvSIG no hemos parado de crecer, organizarnos y reinventarnos tantas veces como fuera necesario, pero siempre con unos mismos objetivos, con una misma visión. Poner en marcha un nuevo modelo de desarrollo, negocio, producción o como prefiramos denominarlo basado en los valores de solidaridad, cooperación e independencia.

Con esta visión, de la que hemos ya hablado más extensamente en muchas ocasiones, (posts, artículos, presentaciones, etc) hemos ido organizándonos atendiendo a las condiciones de cada momento, de cada situación, de cada lugar.

Producto de este proceso son ya numerosas las jornadas que se celebran, las comunidades que se organizan, las actividades en las listas, el desarrollo de productos sectoriales y la alianza con otros proyectos, por poner unos ejemplos.

Y producto de este proceso, anunciamos ahora la creación de la figura de los embajadores gvSIG, personas con capacidad de representar a la Asociación gvSIG ante diferentes instituciones (administraciones, universidades, etc) y en todo tipo de evento (jornadas, foros, etc.).

Los embajadores gvSIG son gente de reconocido prestigio profesional  cuya actividad siempre se ha caracterizado por los valores de independencia, libertad y solidaridad, porque cuando hablamos de software libre, de esto es lo que estamos hablando, al menos desde gvSIG.

Al tiempo que estamos empezando a construir el tema de los embajadores, ya estamos pensando como podría ser la evolución de esta nueva pata de gvSIG. Porque hablamos de las características que han de reunir los embajadores como individuos, pero aquí, en gvSIG, siempre nos han gustado reivindicar el valor de lo colectivo frente a los individualismos y es por ello por lo que nos ponemos a pensar como nos gustaría que en un futuro el conjunto de embajadores fuera algo más que la suma de unos brillantes y honestos individuos.

Esto me recuerda a un proyecto sobre el que hace un tiempo estuvimos trabajando pero nunca llegamos a poner en marcha, la creación de algo así como un Foro Científico – Social. Un foro que nos recuerde que la ciencia y la tecnología no son más que un medio para alcanzar los objetivos sociales que nos propongamos y que a través de la participación y el debate pudiera servir a la Asociación gvSIG para orientar su desarrollo al servicio de lo que se necesita, es decir, que se oriente a la demanda y no a una oferta que pueda estar desconectada de la realidad.

Pero bueno, esto es ya hablar de futuro, de un futuro que nos gustaría que los embajadores gvSIG, funcionando de manera colectiva, se pusieran a construir. De momento, nos quedamos con lo que consideramos que es una excelente noticia. Ya tenemos una nueva herramienta de trabajo y organización.

Ah, por cierto, que no se nos olvide, aprovechamos para presentar al primero de nuestros embajadores.

Posted in gvSIG Association, opinion, spanish | Leave a comment

Scripting: exprime tu gvSIG

Una de las novedades que introduce la versión 2.0 de gvSIG es la inclusión de un pequeño entorno para el desarrollo y ejecución de scripts que interactúen con la aplicación. Estos scripts nos permiten automatizar pequeñas tareas o añadir alguna funcionalidad que echemos en falta y que seamos capaces de implementar.

El lenguaje elegido desde el proyecto gvSIG para dar soporte al scripting es Jython , que es una implemetación del lenguaje Python que se ‘ejecuta’ en la máquina virtual de Java (JVM), lo que permite que esté completamente integrado con gvSIG.

La instalación por defecto de gvSIG no lleva de base el plugin que nos aportara el soporte de scripting, así que lo primero que tendremos que hacer será instalarlo, puedes consultar cómo en la documentación del administrador de complementos de gvSIG .

El plugin de scripting aporta dos herramientas, por un lado un editor y organizador de nuestros scripts, Scripting Composer, y por otro un lanzador de estos, Scripting Launcher. Estas dos herramientas están disponibles en el menú Herramientas -> Scripting así como en dos botones en la barra de botones de gvSIG.

images/scripting-composer.png

Como podéis ver en la imagen el Composer se divide en 3 zonas principales, un explorador de archivos, desde el que podemos ver los scripts que tenemos disponibles, un área de edición, y un área de notificaciones dónde podremos ver las incidencias que ocurran durante la ejecución de nuestros scripts.

Una de las ventajas que ofrece que la extensión de scripting esté integrada en gvSIG es que nos permite acceder a los documentos que tenemos cargados en la aplicación e interactuar con ellos, lo que junto con el refactoring de los APIS de gvSIG 2.0 y las librerías que se han creado, permite crear scripts de forma sencilla. Veámoslo con un ejemplo.

Supongamos que tenemos una capa cargada cuya estructura de datos tiene un campo llamado ELEVATION y nosotros queremos obtener los valores máximo y mínimo de este campo. Para ello debemos recorrer todas las features de la capa y comprobar los valores de este campo, almacenar el valor máximo y el mínimo y mostrarlos mediante una ventana.

from gvsig import *
from commonsdialog import *

def main(): 
  layer = currentLayer()
  if layer == None:
    msgbox("Deberá haber cargada y 
             seleccionada una capa.", "AVISO", 1)
    return

  emax = 0.0
  emin = 0.0

  for feature in layer.features():
    if feature.ELEVATION > emax :
      emax = feature.ELEVATION
    if feature.ELEVATION < emin or emin ==0.0:
      emin = feature.ELEVATION
  msgbox("Elevación máxima=%s y mínima=%s" % (emax, emin),
         "Elevation", 0)

El resultado de ejecutar el script es el que puede verse en la imágen siguiente.

images/script-ejecuted.png

Espero que os haya gustado y que os anime a empezar a programar vuestros propios scripts en Python y si es así, y os volvéis algo pythonicos tal vez os guste leer el zen de python o mejor aún leerlo ejecutando vuestro propio script en gvSIG. ¿Nos contáis cómo?

Posted in gvSIG Desktop, scripting, spanish | 6 Comments

Llamada para testeo gvSIG 2.0 beta1 / Call for testing gvSIG 2.0 beta1

Estimados usuarios y desarrolladores,

Como algunos ya sabréis, recientemente se ha publicado gvSIG 2.0 beta1. Os animamos a que la probéis y nos reportéis errores y sugerencias de mejora a través nuestras listas de correo [1] o directamente en nuestro sistema de gestión de peticiones [2].

Abrimos un plazo de dos semanas para recibir incidencias, las cuales se intentarán corregir, siempre en función de su importancia, para la versión final. A partir del 1 de noviembre, por supuesto, podéis seguir enviando incidencias, pero solo arreglaremos errores críticos.

Podéis descargar gvSIG 2.0 beta1 desde [3].

De antemano os agradecemos vuestra colaboración.

El equipo gvSIG.

[1] http://www.gvsig.org/web/home/community/mailing-lists

[2] https://devel.gvsig.org/redmine/projects/gvsig-desktop/issues

[3] http://www.gvsig.org/web/projects/gvsig-desktop/official/gvsig-2.0/descargas

Dear users and developers,

As most of you probably know, recently it has been released gvSIG 2.0 beta1. We encourage you to test it and send us bugs and feature requests via our mailing lists [1] or directly in our bug tracker [2].

The deadline to report issues to be fixed in the final version is November 1st. After this date of course you can continue reporting issues but we only will fix critical bugs.

You can download gvSIG 2.0 beta1 at [3].

Thanks in advance for your contributions.

The gvSIG team.

[1] http://www.gvsig.org/web/home/community/mailing-lists

[2] https://devel.gvsig.org/redmine/projects/gvsig-desktop/issues

[3] http://www.gvsig.org/web/projects/gvsig-desktop/official/gvsig-2.0/downloads/view?set_language=en

Posted in community, english, gvSIG Desktop, spanish, testing | Tagged , | Leave a comment

4as. Jornadas de Latinoamérica y el Caribe de gvSIG

Los días 24 al 28 de setiembre de 2012, en el Centro de Conferencias de la Intendencia de Montevideo (ponencias) y en la Facultad de Ingeniería de la Universidad de la República (talleres), se realizaron las 4as. Jornadas de Latinoamérica y el Caribe de gvSIG y 2as. Jornadas gvSIG Uruguay, cuyo lema fue “Creciendo en Comunidad” (http://www.gvsig.org/web/community/events/jornadas-lac/2012). Los tres primeros días fueron de ponencias y los dos últimos de talleres. Como miembro del Comité de Organización y de la Comunidad gvSIG Uruguay me siento muy satisfecho con los resultados: más de 150 asistentes de 8 países (Argentina, Brasil, Paraguay, Chile, Venezuela, Honduras, España, además de Uruguay); cerca de 30 ponencias de los más diversos temas, que fueron evaluadas y aprobadas por un Comité Científico creado para la ocasión; una mesa de apertura con autoridades nacionales de jerarquía; una mesa final de debate sobre el tema “Software público, ¿debe ser software libre? Perspectivas desde las geotecnologías”; y 8 talleres (3 de ellos con 2 ediciones cada uno) muy variados y concurridos (más de 170 asistentes en total), de los cuales los comentarios generales han sido de una evaluación muy positiva.
presentación en Sala AzulPresentación en Sala Doradapresentación de libro sobre IDEmesa debate acerca de Software Público - Software Libre
Quisiera agradecer a todas y todos que hicieron esto posible: a mis compañeras y compañeros del Comité de Organización (y la colaboración de sus instituciones de origen), a las y los integrantes del Comité Científico, a la Intendencia de Montevideo –sede de las presentaciones-, a la Universidad de la República (en especial las Facultades de Ingeniería –sede de los talleres- y de Ciencias), a todos los patrocinadores (AGESIC, Banco de Seguros del Estado, Kapern), a los invitados para la apertura y para la mesa de debate, a Valeria Gaibisso por el diseño de la imagen de estas Jornadas, a todas y todos los ponentes y asistentes, en especial a quienes tuvieron que realizar largos traslados para poder estar, y a todas y todos los que colaboraron con la difusión del evento (incluyo aquí en especial a ANTEL por la trasmisión que hizo en vivo de las presentaciones, a través de uno de los canales de Adinet TV). Y muy especialmente a la Asociación gvSIG que apostó fuertemente por el éxito de estas Jornadas.
taller usuarios básicotaller usuarios básico 2a. edicióntaller usuarios avanzadotaller sobre gvSIG Batoví
Este esfuerzo compartido prueba una vez más que el proyecto gvSIG se consolida en Latinoamérica y el Caribe -así como también se consolida la Comunidad gvSIG Uruguay-, que se profundiza esa disposición a compartir (información, conocimiento, experiencias) que venimos pregonando, y que este nuevo paradigma de colaboración y cooperación, va lenta pero inexorablemente sustituyendo el modelo de competencia que nos han venido imponiendo.
taller extensionestaller extensiones, 2a. edicióntaller publicación mapastaller publicación mapas, 2a. edición
El lema de estas Jornadas (Creciendo en Comunidad) lo entendimos (y entendemos) en más de un sentido:
§ indica que vamos creciendo y que somos una Comunidad (enfatizando la carga ideológica del término)
§ da a entender que es en comunidad que crecemos (no es en solitario que crecemos -como personas- sino juntándonos, agrupándonos; en definitiva, en comunidad).
§ subraya que es la comunidad la que crece (en calidad: es el concepto Comunidad el que crece, el que se desarrolla, el que madura)
§ insinúa que este crecimiento es de la Comunidad LAC (regional) como comunidad de comunidades (nacionales y locales), como luces que se van encendiendo a medida que se conforman nuevas comunidades, y que van formando un conjunto que es mucho más que la suma de las partes. Y creemos que es esencial crear esos lazos transversales entre las comunidades LAC que hoy no existen o son muy débiles.
taller desarrollotaller saneamiento, 1a. partetaller saneamiento, 2a. partealgunos de los presentes, al finalizar las ponencias
Con el compromiso en los valores promovidos desde la Asociación gvSIG (http://www.gvsig.com/asociacion), las Comunidades gvSIG de Latinoamérica y el Caribe han dado un paso más hacia la independencia tecnológica, hacia la colaboración, la solidaridad y el conocimiento compartido. ¡Felicitaciones!

Posted in community, events, opinion, spanish | 2 Comments

gvSIG y la educación superior: gvSIG Campus

Me ocurre a menudo, alguien me hace una consulta por correo y acabo pensando: «esto puede ser interesante para más gente». Así que recordando los tiempos de la universidad (que en este caso es más que apropiado) me aplico el viejo lema de «nada se escribe para ser usado una única vez» por aquello de reutilizar trabajos y colarlos en varios proyectos…

Así que nada, este pequeño artículo que viene de un correo que escribí ayer sirve para recordar que en gvSIG tenemos una comunidad, todavía no muy activa, orientada a los estudios superiores más allá de la educación secundaria. Este esfuerzo pone a disposición de profesores y alumnos un par de medios para que puedan colaborar y hacer cosas juntos, en nuestro afán porque de ahí aparezcan cosas interesantes (por no usar el ya muy manido término sinergias) . La comunidad se llama gvSIG Campus y básicamente dispone de dos herramientas:

Lista de correo

Una lista de correo con 75 silenciosos suscritos actualmente, la mayoría profesores universitarios, cuyo objetivo es poner el canal de comunicación para que la comunidad universitaria pueda compartir experiencias, proyectos, oportunidades de colaboración, etc. Puedes darte de alta en http://www.freelists.org/list/gvsig-campus.

Una vez dado de alto podrás enviar correos a la dirección gvsig-campus@freelists.org y se distribuirá a todos los miembros de la lista de correo.

Base de datos Campus

Disponemos de una base de datos on-line para poder dar difusión a ideas o proyectos en marcha o acabados relacionados con gvSIG en el contexto de la comunidad Campus: proyectos de desarrollo, análisis y casos de estudio, tesinas de final de carrera, etc.

La base de datos está pensada como un punto de difusión para la comunidad universitaria y ciertamente todavía no ha tenido demasiado uso aunque esperamos que los profesores se animen a participar.

Puedes acceder a la base de datos en http://outreach.gvsig.org/campus y un ejemplo de ficha en esa base de datos podría ser el proyecto de Integración de JASPA y gvSIG.

Posted in community, spanish, technical collaborations | Tagged , | 11 Comments

Quick tip: add a function to the field calculator

If you are struggling on the field calculator of gvSIG because it lacks some chunk of code that would make your life easier, maybe you will find this interesting. On the field calculator you can evaluate external python scripts to add new functions to it. It’s easy, just type on a new text file something quite self-explanatory  like this (if you know the minimum basics of Python language):

def mysplit(myString, splitChar, position):
     try:
         val = myString.split(splitChar)[position - 1]
     except:
         val = -999
     return val

Then on the second tab of the calculator, locate your file and click on the “Evaluate” button. If no errors are reported then you can use your mysplit function on the field calculator in the same way you use the built-in ones. In my case I used this to parse a field with the typical “X,Y,Z” centroids that I couldn’t parse with subString because they had different lengths so the Python string split was so convenient. This was as easy as just typing on the calculator to get the first coordinate:

toNumber(mySplit([LONGFIELD],",",1))

Easy, isn’t it?

Posted in development, english, gvSIG Desktop | Tagged , , | 1 Comment