Mostrando entradas con la etiqueta ordenadores. Mostrar todas las entradas
Mostrando entradas con la etiqueta ordenadores. Mostrar todas las entradas

miércoles, 18 de enero de 2023

Información sobre oposiciones TIC al Ayuntamiento de Madrid, y otras oposiciones TIC

Información sobre Oposiciones y Ofertas de Empleo Público del Ayuntamiento

 

 

Información específica de Técnico/a Superior TIC del Ayuntamiento de Madrid

 

Información específica de Técnico/a Medio TIC del Ayuntamiento de Madrid

 

Información específica de Técnico/a Auxiliar TIC del Ayuntamiento de Madrid

 

Información sobre Oposiciones del Estado

[OEP del Estado] BOE.es - BOE-A-2021-12608 Real Decreto 636/2021, de 27 de julio, por el que se aprueba la oferta de empleo público para el año 2021.


Normativa, actualizaciones de oposiciones, etc


 

Academias

Algunas venden/dan acceso temarios desarrollados también, las marco con (*):

 

Recursos gratuitos

 

 

Redes sociales

  • Canales de Telegram
    • Para preparar el test:
  • Twitter de PreparaTIC (sobre todo, anuncios relacionados con la Oposición TIC-A1 del Estado, aunque también informa de nueva normativa y demás):

martes, 22 de septiembre de 2015

Mis podcasts favoritos

Un listado de los Podcasts que tengo configurados en la aplicación del móvil que uso para escucharos: Podcast Addict. También os la recomiendo encarecidamente. Los clasifico por temáticas, aunque casi todos son de programación. Pongo a mis favoritos un [*] a la derecha del nombre.




viernes, 26 de diciembre de 2014

Lenguajes de alto nivel para microcontroladores

Últimamente estoy bastante interesado en la búsqueda de algún lenguaje funcional que me pueda servir para programar microcontroladores. En concreto investigo acerca de lenguajes funcionales que se puedan usar para programar las dos familias más populares de microcontroladores: los PIC y los Atmel AVR.

Hay muchas opiniones en internet sobre cuál de las dos familias es mejor que la otra. Después de leer varios post sobre este tema, mi conclusión es que ambas están muy parejas y que la elección tal vez dependa de nuevo de los gustos de cada cual. Aunque si me tuviera que decantar por alguno de los dos yo tiraría por los Atmel quizás porque últimamente son más populares que los PIC (con el apoyo de la comunidad que tiene detrás) y porque tienen algunas versiones que pueden funcionar con 0.7V de alimentación (para poder alimentarlos con una celda solar barata).

Como resultado de mi investigación (no muy fructífera) he encontrado algunos proyectos interesantes. Enumero a continuación no sólo lenguajes funcionales sino toda la variedad de lenguajes de alto nivel que he encontrado para programar microcontroladores (a parte del ensamblador del propio microcontrolador que no lo considero de alto nivel, aunque en él hay que programar las partes que requieren mayor rendimiento):
  • OCaPIC (OCaml)
  • PicoBIT (Scheme) - PIC
  • Forth: (la opción más viable, porque al menos a priori puede caber fácilmente en un micro)
    • avrforth 
    • amforth (8 a 12 KB de flash, 80 bytes de EEPROM, y 200 bytes de RAM). El amforth es muy prometedor.
    • rforth1: Un compilador de Forth para la familia 18Fxxx de microcontroladores PIC. Este mismo autor tiene también un Forth para la familia 16Fxxx de PICs.
  • .NET Micro - Aunque no investigado mucho este, parece que es sobre dispositivos más grandes.
  • uJ (Java) - PIC
  • NanoVM (Java) - Atmel.
  • B#: la "huella" en memoria es un poco grande (<24KB de flash y <2KB de RAM). Pero es un lenguaje de programación orientado a objetos específicamente diseñado para MCUs.
  • PyMite (Python): Huella de memoria grande (64KB de flash, 4KB de RAM).
  • eLua. Para MCUs muy grandes, me da la impresión.
  • ¿Alguna opción más? Seguro. Dejádmelo en los comentario y la pongo ;)
En uno de los enlaces que refiero abajo también sugieren programarse un intérprete personalizado de "pcode" que interprete un conjunto de instrucciones que tú definas.

Esto último parece una idea interesante así como también suena bien eso de poder crearse una especificación de máquina virtual que pudiera correr sobre dispositivos como MCUs. Hay algunas ya, pero visto que la JVM de Oracle/Sun son unas 200 microinstrucciones en la capa de VM parece factible poder generar un estándar o conjunto de instrucciones que pudiera servir para dispositivos de recursos más limitados.

¿Existe ya ese estándar? Porque estos dispositivos tienen una serie de características hardware que se podrían abstraer para luego poder programarlos más fácilmente.

Por último, hace poco terminé de leer y entender (que son dos cosas distintas) el paper de investigación que propició la creación del lenguaje Lisp y toda la belle époque de la inteligencia artificial de los años 80 y 90. Se trata de un artículo del gran John McCarthy titulado "Recursive Functions of Symbolic Expressions and Their Computation by Machine" (¡del año 1960! y todavía hoy en día relevante, que se lo apunten algunas mentes pensantes de nuestra época).

A partir de este paper se pueden extraer las operaciones fundamentales que dieron lugar a las primeras implementaciones del lenguaje Lisp. Con este germen tan prometedor: ¿se podría definir una VM basada en estas operaciones sobre MCUs?

En resumen:
Aunque parezca contradictorio, el poder programar un microcontrolador (MCU) con un lenguaje de alto nivel diferente a C (y al ensamblador, que de por sí no se puede calificar de alto nivel) aunque pueda resultar una idea peregrina a mí al menos me resulta altamente interesante. Máxime cuando la tendencia es que haya cada vez más dispositivos "embebidos" / empotrados / móviles como son los que constituyen la "Internet de las cosas" (IoT ó Intenet of Things en inglés).

¿El futuro o el pasado? Dejo al lector elegir.

Enlaces:

miércoles, 4 de diciembre de 2013

Características de las diferentes versiones de Java

A partir de Java 5 (1.5 en la numeración estándar de Oracle/Sun) se añaden a este lenguaje algunas características muy interesantes que intentan acercarlo a otros lenguajes "más modernos" diseñados "para el siglo XXI". Me refiero por ejemplo a Ruby, Python, Scala, etc. Enumero a continuación cada una de ellas, con la esperanza de poder hacer un artículo de cada una en el futuro.


Java 1.5


  • Genéricos (generics)
  • Bucle "for/in" (for/in loop)
  • Autoempaquetado/desempaquetado (autoboxing/unboxing)
  • Enumeraciones seguras con tipo (typesafe enums)
  • Argumentos variables (varargs)
  • Importaciones estáticas (static imports)
  • Anotaciones/metadatos (annotations/metadata)

Java 1.6


  • Servicios web y procesado de XML (web services and XML processing)
  • JDBC 4.0
  • Programación basada en anotaciones (annotation-based programming)
  • APIs de compilación de Java (Java compiler APIs)
  • APIs de escritorio (desktop APIs)
  • Scripting


Java 1.7


Las características de Java 7 y 8 están sacadas de la página web de OpenJDK, que tiene un formato bastante interesante en plan tabla "plain text".

Category    Description
================================================================================
vm          JSR 292: Support for dynamically-typed languages (InvokeDynamic)
            Strict class-file checking
lang        JSR 334: Small language enhancements (Project Coin)
core        Upgrade class-loader architecture
            Method to close a URLClassLoader
            Concurrency and collections updates (jsr166y)
i18n        Unicode 6.0
            Locale enhancement
            Separate user locale and user-interface locale
ionet       JSR 203: More new I/O APIs for the Java platform (NIO.2)
            NIO.2 filesystem provider for zip/jar archives
            SCTP (Stream Control Transmission Protocol)
            SDP (Sockets Direct Protocol)
            Use the Windows Vista IPv6 stack
            TLS 1.2
sec         Elliptic-curve cryptography (ECC)
jdbc        JDBC 4.1
client      XRender pipeline for Java 2D
            Create new platform APIs for 6u10 graphics features
            Nimbus look-and-feel for Swing
            Swing JLayer component
            Gervill sound synthesizer [NEW]
web         Update the XML stack
mgmt        Enhanced MBeans [UPDATED]

Java 1.8


Category    JEP     Description
================================================================================
--/--       126     Lambda Expressions & Virtual Extension Methods
            138     Autoconf-Based Build System
            160     Lambda-Form Representation for Method Handles
            161     Compact Profiles
            162     Prepare for Modularization
            164     Leverage CPU Instructions for AES Cryptography
            174     Nashorn JavaScript Engine
            176     Mechanical Checking of Caller-Sensitive Methods
            179     Document JDK API Support and Stability
vm/--       142     Reduce Cache Contention on Specified Fields
vm/gc       122     Remove the Permanent Generation
            173     Retire Some Rarely-Used GC Combinations
vm/rt       136     Enhanced Verification Errors
            147     Reduce Class Metadata Footprint
            148     Small VM
            171     Fence Intrinsics
core/--     153     Launch JavaFX Applications
core/lang   101     Generalized Target-Type Inference
            104     Annotations on Java Types
            105     DocTree API
            106     Add Javadoc to javax.tools
            117     Remove the Annotation-Processing Tool (apt)
            118     Access to Parameter Names at Runtime
            120     Repeating Annotations
            139     Enhance javac to Improve Build Speed
            172     DocLint
core/libs   103     Parallel Array Sorting
            107     Bulk Data Operations for Collections
            109     Enhance Core Libraries with Lambda
            112     Charset Implementation Improvements
            119     javax.lang.model Implementation Backed by Core Reflection
            135     Base64 Encoding & Decoding
            149     Reduce Core-Library Memory Usage
            150     Date & Time API
            155     Concurrency Updates
            170     JDBC 4.2
            177     Optimize java.text.DecimalFormat.format
            178     Statically-Linked JNI Libraries
            180     Handle Frequent HashMap Collisions with Balanced Trees
core/i18n   127     Improve Locale Data Packaging and Adopt Unicode CLDR Data
            128     BCP 47 Locale Matching
            133     Unicode 6.2
core/net    184     HTTP URL Permissions
core/sec    113     MS-SFU Kerberos 5 Extensions
            114     TLS Server Name Indication (SNI) Extension
            115     AEAD CipherSuites
            121     Stronger Algorithms for Password-Based Encryption
            123     Configurable Secure Random-Number Generation
            124     Enhance the Certificate Revocation-Checking API
            129     NSA Suite B Cryptographic Algorithms
            130     SHA-224 Message Digests
            131     PKCS#11 Crypto Provider for 64-bit Windows
            140     Limited doPrivileged
            166     Overhaul JKS-JCEKS-PKCS12 Keystores
web/jaxp    185     JAXP 1.5: Restrict Fetching of External Resources



Semántica de las categorías:

vm:     comp, gc, rt, svc
core:   lang, libs, i18n, net, sec, svc
client: gui, sound
web:    jaxp, jaxb, jaxws, corba

lunes, 9 de septiembre de 2013

Error 404 friki

Retomando un poco este mi blog, os pego un error 404 (página no encontrada) que me pasaron el otro día. Es del sitio web GitHub (para colgar código y gestionar proyectos de software libre, uno de los sitios más populares). Siesque, al final, somos todos igual de frikis :D

Error 404 friki

jueves, 9 de febrero de 2012

"Hello World" en Arduino

Esta tarde soldé finalmente las patas a uno de mis Arduinos Nano v3.0 (o mejor habría que decir Chi-duinos). La operación ha sido delicada, pero con el estaño de 0.5 mm de grosor que me he adquirido ha sido satisfactoria. Al menos parece que todas las patas se han soldado bien.

Elementos para soldar las patas del Arduino Nano
En la foto podéis ver el estaño, un Arduino sin soldar, la fila de patas sin cortar, el soldador en medio, la protoboard con el montaje del ejemplo "Blink!" (que es el Hello World del Arduino) y el cable Mini-USB a USB.

Para soldar las patas más fácilmente conviene dejarlas pinchadas en la protoboard y soldarlas ahí.

Aquí tenéis el resultado final:

Blink Arduino Nano!!

miércoles, 18 de enero de 2012

Wikipedia blackout page

Wikipedia blackout page
Hoy la Wikipedia en inglés está de luto. En señal de protesta cuando vas a consultar cualquier artículo en ella te sale la pantalla que ves arriba. En la wikipedia en español se puede ver un banner arriba apoyando la protesta pero todavía se pueden leer los artículos.

Me sumo a la protesta: no a la SOPA, PIPA, Ley de Economía Sostenible (aka Ley Sinde), ACTA o como la quieran llamar.

La información tiene que ser libre, internet tiene que ser libre. Ya no lo pueden parar, ni siquiera con legislaciones perniciosas.

lunes, 16 de enero de 2012

Pantallas de error originales

¿Por qué poner el típico HTTP Error 503 Service unavailable si puedes poner un mensaje comprensible por todo el mundo y a la vez gracioso?

Error HTTP/503 gracioso

Encontrado en una web de por ahí que dejó de funcionar por unas horas.

lunes, 9 de enero de 2012

¿Cuánto dura una batería de 300mAh conectada a un Arduino?

Se me plantea la pregunta de calcular cuánto duraría una batería de 300mAh conectada a un Arduino Nano v3.0.

La capacidad de una batería se mide en mAh. Esta cifra nos da la duración de la batería, mediante la siguiente fórmula:

Capacidad(mAh) = I(mA) x t(h)
t(h) = Capacidad(mAh) / I(mA)

En nuestro caso particularizamos para el dispositivo Arduino Nano. Sabemos que este dispositivo tiene un regulador de tensión cuya corriente máxima es de 500mA:

Capacidad = 300mAh = 300mA x 1h
I = 500 mA => t(h) = 300mAh/500mA = (3/5)h = (3x60)/5 = 36 min

Por completar la explicación, según las especificaciones, podemos alimentar al dispositivo mediante una fuente de tensión no regulada en el rango de 7—12V. En otro de los pines nos deja alimentarlo con una fuente regulada de 5V (por ejemplo esta tensión nos la podría dar una fuente de PC). El microprocesador irá más o menos rápido (varían los MHz) dependiendo de la tensión de alimentación, pero seguirá funcionando. En nuestro caso lo que se propone es conectar una batería de 9V al pin de alimentación no regulada.

Retomando la reflexión sobre la autonomía de la batería hemos visto que si conectamos una batería de 300mAh a un Arduino nos va proporcionar corriente como mínimo 36 minutos. Dependiendo de los componentes que conectemos al Arduino (sobre todo, de los componentes conectados a los puertos, que "chupan" 40mA como máximo cada uno) esta duración es mayor o menor.

Si conectamos otros componentes la corriente que tiene que soltar la fuente aumentaría y la autonomía disminuiría. Hay motores más eficientes y que consumen menos corriente que otros (por ejemplo, los que iban montados en los walkman). Tengo que hacer medidas, pero me da la impresión que un motor con su circuito driver puede llegar a consumir del orden de amperios. Con lo que la autonomía de todo el sistema cae sensiblemente. A parte de los motores, hay otros tipos de sensores que también consumen corriente (sensores de ultrasonidos, micrófonos, cámaras, sensores de temperatura, etc).

Nota 12/1/2012: Leo en algún foro de por ahí que también hay que tener en cuenta otros factores, como son el tipo de batería (Ni-Cd, Li-Ion, etc), las curvas de descarga en voltaje, las veces que se puede cargar y descargar la batería, etc. Es decir, que el tema de las baterías es un asunto peliagudo. También dicen que los mAh son aproximados pero no exactos.

jueves, 29 de diciembre de 2011

Idea — Fábricas robóticas modulares

Empezaré esta serie de artículos transcribiendo las ideas que me rondan la cabeza cuando intento dormirme. No sé si será autosugestión o qué, pero el caso es que en ese momento me parecen tan interesantes que me quedo un buen rato dándoles vueltas. Tanto que a veces pierdo el sueño y hasta que no las dejo medio-cerradas no consigo dormirme.

Albergo siempre el miedo de que a la mañana siguiente no me acuerde de ellas, como si fueran sueños que al final caerán en el olvido. Para que eso no ocurra, y como positivamente sé que ninguna de estas ideas al final llegará a materializarse... y en parte para decir de forma retrospectiva en el futuro: "ves, yo ya lo pensé en el año tal", las dejo aquí escritas para que las lea algún curioso nostálgico de los recuerdos en el futuro. ¿Quién sabe? Lo mismo estos archivos no se perderán en el tiempo y alguien los tendrá a bien en conservar. O quizás después de todo sí que se perderán.

Por todo lo anterior empiezo esta serie de artículos de mis locas ideas y proyectos. Algunos intentan ser originales como podría ser este. Otros están basados en cosas que he leído por ahí y que he modificado y/o adaptado (lo que llaman ahora los "modesnos" innovación).

Esta idea se me ocurrió hace unos días, al intentar dormirme una noche en la que me costó conciliar el sueño. Me planteaba la pregunta de por qué la fabricación de muchos productos occidentales se realiza en países emergentes mientras que el diseño se queda en occidente. Pasa con todas las empresas de tecnología ahora: Apple, HP, IBM, etc. La respuesta que encontraba era que en esos países, al haber muchos menos derechos laborales y la gente no reclamarlos por o no haberlos conocido nunca o tener miedo de las represalias, la mano de obra es mucho más barata y los países occidentales son incapaces de competir con eso. ¿Qué solución puede tener esto? ¿Cómo salimos de la encruzijada?

Entonces pensé en la definición del término "robot". Es un término que popularizó el dramaturgo checo Karel Čapek. Sin embargo, el inventor de la palabra fue su hermano Josef. Éste le sugirió el término "roboti" para una novela que estaba escribiendo. Literalmente "robota" en checo significa labor o trabajo y figuradamente "trabajo duro" (Wikipedia). Así que también se podría traducir en cierto sentido como esclavo.

Mi idea consiste en sustituir esta mano de obra barata por robots para que tanto el diseño como la fabricación se puedan realizar en los países occidentales a un coste comparable al que ahora se tiene en los países emergentes sin derechos laborales. No es una idea nueva esta, ya que en la industria automovilística por ejemplo se viene haciendo algo parecido desde hace muchos años.

Mi aportación a esta idea, sin embargo, es que la fábrica sea modular. Es decir, en vez de tener una línea de fabricación lineal como su propia palabra indica, que sea más una línea de fabricación en 2 dimensiones, incluso en 3 dimensiones.

¿Qué quiere decir esto? Limitándonos por ejemplo a una planta de fábrica, quiere decir que la diferente maquinaria se tendría que repartir en módulos. Cada módulo tendría que estar especializado en una tarea en concreto. Por ejemplo tendríamos un módulo que podría ser de troquelado, otro de impresión de piezan en una impresora 3D, otro módulo dedicado al pulido de las piezas, etc. Todos los módulos tendrían que tener además de la maquinaria específica, un par de brazos robóticos al menos con los que se manipularan las piezas y se aplicaran los procesos correspondientes a esa fase de la fabricación. La maquinaria no tendría que controlarse físicamente con botones o mandos, sino telemáticamente mediante una API. Esto ahorraría el tiempo en la realización de cada proceso.

Este planteamiento tendría varias ventajas:
  • Se podría escalar más fácilmente este sistema. Desde unos pocos módulos podríamos escalar a toda una planta, incluso podríamos escalar en altura a una fábrica de varias plantas. La inversión sería progresiva. 
  • Cuando un módulo necesitase reparación se podría sacar de la "línea de producción" o planta de producción en nuestro caso para reparar. Mientras se podría introducir otro módulo de las mismas características.
  • Mediante un programa de inteligencia artificial se podría intentar optimizar el proceso de fabricación para que fuera más óptimo, moviendo por ejemplo módulos de un sitio a otro de forma que el tiempo de producción de un producto se minimizara.
  • Si en vez de un control totalmente automático de los diferentes módulos se optase porque un operario especializado manipulase el proceso, se podría dar responsabilidad a ese operario sobre un módulo en concreto.

La comunicación entre los diferentes módulos se podría hacer mediante cintas móviles mecanizadas o mediante plataformas móviles que se pudieran mover libremente por los pasillos de servicio entre los módulos. Estos movimientos también serían susceptibles de optimización.

He hablado antes del control automático de todo el proceso de fabricación. Pero debido a que hay fases del montaje que son complejas sería deseable que los operarios también tuviesen alguna forma de grabar cada fase del proceso de fabricación. Se podrían grabar varias veces al operario para tener una muestra más significativa. De esta forma, si las condiciones iniciales son similares esa fase se podría reproducir de forma automática y la inteligencia artificial lo que tendría que hacer es ocuparse de los cambios sutiles en cada caso.

Además, alguno de los muros de la fábrica servirían como entrada de materias primas (por ejemplo una o dos fachadas del edficicio) y los otros muros como salidas (las fachadas restantes).

Como conclusión, si este sistema funciona sería un posible sustituto a la fabricación que actualmente se hace por operarios humanos en condiciones de trabajo precarias. La dificultad estriba en conseguir brazos robóticos lo suficientemente hábiles y fiables para poder sustituir la eficiencia que actualmente tiene el cuerpo humano (que sabemos que es una de las máquinas más perfectas que existen).

martes, 27 de diciembre de 2011

Neuromante, de William Gibson

Hace mucho que quería dejar aquí algún comentario sobre esta novela. Desde que la leí la primera vez en cierto sentido es una de mis novelas de referencia. Dicen los estudiosos de estos temas que es una de las primeras novelas del estilo ciberpunk.

De hecho mi primer contacto con ella fue en el tren, de camino a casa después de haber pasado el día en la universidad. Era mi época de estudiante, cuando todavía tenía mucho tiempo para leer (y más ganas de leer que de estudiar). Tampoco me había acomodado tanto como hoy e iba casi todos los días en tren a la universidad. Por aquel entonces, todo hay que decirlo, esta situación tampoco me agradaba mucho.

Había un chico enfrente mío con un ejemplar de la novela, en la edición española de la editorial Minotauro. La portada era curiosa: un dibujo más o menos abstracto que nunca he llegado muy bien a saber qué simboliza. Sobre fondo oscuro se ve una especie de esfera brillante y por detrás unos cilindros también de colores oscuros la rodean. He visto portadas de esta novela mejores, en la que se puede ver a Molly (un personaje de la novela) posando desafiante.

También recuerdo que pocos días después entré en el FNAC de Callao y me la compré. La primera lectura que hice de la novela fue tan rápida como poco fructífera. No me había enterado de nada.

Sólo después de dos o tres lecturas comprendí el sentido de lo que tenía entre manos. Una obra inspiradora, con un lenguaje propio y eléctrico. Yo que siempre estoy pensando en frases que se pueden citar cuando leo algo, esta novela sin duda es un filón. Casi toda se podría citar, frases enteras rellenarían mi pared si tuviera el espacio suficiente.

En cuanto al tema, sin destriparlo mucho, trata sobre un vaquero (hacker) del ciberespacio que ha caído en desgracia y que de buenas a primeras se ve embarcado en una operación que no sabe muy bien en qué acabará. El universo es parecido al de esa película que también nos gusta tanto: Blade Runner.

Así que si te gusta Blade Runner yo creo que puedes darle una oportunidad a Neuromante. Eso sí, la lectura en inglés se hace un poco ardua, tanto por el léxico como por el ritmo propio de la novela.

sábado, 17 de diciembre de 2011

Reflexiones sobre el tamaño óptimo de los backups incrementales o diferenciales


Definimos el factor:

Factor (F) = (Suma Incrementales o Diferenciales) / Full del ciclo

El factor está acotado de la siguiente manera:

0 ≤ F ≤ (N-1)

Donde N es la duración del ciclo. Por ejemplo si se hacen backups full semanales y cada día un incremental, N=7 porque es por semana. Si se hiciera un backup full mensual y el resto de los días del mes incrementales, N=30.

Valores de F mayores que (N-1) no tienen mucho sentido ya que querría decir que
la los incrementales, de media, pesan más que el full del ciclo.

Ej. 1: full semanal, resto de los días incrementales

         |-- L --|-- M --|-- X --|-- J --|-- V --|-- S --|-- D --|
Semana 1 |       |       |       |       |       |       | FullS |
Semana 2 | Inc1  | Inc2  | Inc3  | Inc4  | Inc5  | Inc6  |       |

=> Factor = (Inc1 + Inc2 + Inc3 + Inc4 + Inc5 + Inc6) / FullS

Ej. 2: full semanal, resto de los días diferenciales

         |-- L --|-- M --|-- X --|-- J --|-- V --|-- S --|-- D --|
Semana 1 |       |       |       |       |       |       | FullS |
Semana 2 | Dif1  | Dif2  | Dif3  | Dif4  | Dif5  | Dif6  |       |

=> Factor = (Dif1 + Dif2 + Dif3 + Dif4 + Dif5 + Dif6) / FullS

Ej. 3: full mensual, resto de los días incrementales

Semana 1 | FullM | Inc1  | Inc2  | Inc3  | Inc4  | Inc5  | Inc6  |
Semana 2 | Inc7  | Inc8  | Inc9  | Inc10 | Inc11 | Inc12 | Inc13 |
Semana 3 | Inc14 | Inc15 | Inc16 | Inc17 | Inc18 | Inc19 | Inc20 |
Semana 4 | Inc21 | Inc22 | Inc23 | Inc24 | Inc25 | Inc26 | Inc27 |
Semana 5 | Inc28 | Inc29 |

=> Factor = (Inc1 + Inc2 + Inc3 + ... + Inc29) / FullM


Tipos de clientes:

Nos encontramos con dos tipos de clientes problemáticos:

  • Clientes cuyo F < 0.1: Suma de incrementales o diferenciales es menor que el 10% del tamaño del full.
→ CLIENTES INACTIVOS

  • Clientes cuyo F > 0.9: Suma de incrementalos o diferenciales mayor que el 90% del tamaño del full.
→ CLIENTES HIPERACTIVOS

Valor óptimo del factor:

Es difícil dar una cifra óptima ya que la elección de este factor influiría por ejemplo en los tiempos de recuperación, que pueden ser diferentes dependiendo de la política que se quiera seguir en el cliente o de los requerimientos en los tiempos de recuperación.

Además también hay clientes más propensos a tener un F grande. Por ejemplo, cuando son clientes de base de datos es normal generar un volcado diario con los datos. Con lo cual el incremental suele ser grande.

Medidas a adoptar:

Dependiendo del tipo de cliente, ir adoptando las medidas en orden y estudiar cómo evoluciona F a lo largo de las sucesivas semanas.

◊ En los clientes INACTIVOS:

1) Full cada más tiempo

◊ En los clientes HIPERACTIVOS:

1) Estudiar los ficheros que ocupan más tamaño en los incrementales y activar directivas a nivel local en los SaveSets / directorios conflictivos

NOTA: Estas directivas se pueden aplicar a nivel global (se han definido varias políticas en función del sistema operativo) o por el administrador del servidor en cuestión (mediante el fichero .nsr).

1.1) Si son ficheros temporales o prescindibles, excluirlos del backup
  • skip : Excluye un directorio o fichero. Espera una máscara. 
1.2) Con los ficheros que no cambian de tamaño a lo largo de la semana, pero sin embargo se van a cinta:
  • mtime : Graba sólo un fichero cuando el tiempo de modificación del fichero cambia, es decir, cuando cambia el fichero. A veces te llevas ficheros que sólo se han accedido pero no han cambiado, lo que no es muy adecuado.
2) Si son ficheros de log que no se rotan:
  • En Unix se pueden rotar con el logrotate.
  • En Windows: habría que buscar una solución similar.
3) Si son volcados a disco (normalmente copias completas de bases de datos):
  • Estudiar si es necesario hacer el volcado realmente todos los días y llevárselo al backup o se pueden usar otras técnicas de volcado (por ejemplo, volcados incrementales aunque aumentaría el tiempo de recuperación)
  • Si no es posible, documentar en algún sitio que ese cliente tiene los incrementales/diferenciales muy altos y no se puede bajar. Reflejar también el razonamiento.
En la práctica:
  • Normalmente (aunque depende de la herramienta de backup que se use) la suma de los incrementales te los hace directamente, mientras que cuando es un cliente con diferenciales (tipo NAS) los tienes que sumar tú (por cada cliente) para calcular el factor (ya que los clasifica como diferencial nivel 1, 2, 3, etc.
  • Cuando la estadística es en un período de tiempo largo, se puede hacer la suma en el período de todos los incrementales o diferenciales y luego dividir por la suma de todos los fules en el período. De esta forma sale una muestra mayor y los valores son más significativos.
  • Si un cliente tiene varios SaveSets puede que uno de ellos tenga algún problema y los otros estén bien. Realmente cuentan los SaveSets de mayor tamaño dentro de un cliente (los que ocupan GB, es decir en tamaño los del orden de 1E+9). Dado que la política de backup se fija a nivel de cliente, si un SaveSet grande tiene problemas ese cliente tendría que ser entonces candidato para que se le optimice.
  • Los diferenciales en realidad son más grandes que los incrementales, ya que se reflejan los cambios desde el último backup full. Para clientes tipo NAS (como por ejemplo EMC Celerra, NetAPP, etc) no conviene tocar mucho la configuración ya que si no se penaliza de cara a los tiempos de recuperación.

domingo, 4 de diciembre de 2011

¿Puedes romper este código? O como optar a ser espía de UK



eb 04 af c2 bf a3 81 ec   00 01 00 00 31 c9 88 0c
0c fe c1 75 f9 31 c0 ba   ef be ad de 02 04 0c 00
d0 c1 ca 08 8a 1c 0c 8a   3c 04 88 1c 04 88 3c 0c
fe c1 75 e8 e9 5c 00 00   00 89 e3 81 c3 04 00 00
00 5c 58 4d 41 41 41 41   75 43 58 3d 42 42 42 42
75 3b 5a 89 d1 89 e6 89   df 29 cf f3 a4 89 de 89
d1 89 df 29 cf 31 c0 31   db 31 d2 fe c0 02 1c 06
8a 14 06 8a 34 1e 88 34   06 88 14 1e 00 f2 30 f6
8a 1c 16 8a 17 30 da 88   17 47 49 75 de 31 db 89
d8 fe c0 cd 80 90 90 e8   9d ff ff ff 41 41 41 41


Can you crack it? es una forma que se han inventado los británicos de captar a potenciales espías que ayuden en la caza por parte de las fuerzas de la ley de ciber-delincuentes. Si descubres el mensaje en claro asociado al cifrado transcrito arriba, éste te llevará a una página web en la que podrás mandar tu CV y que te "recluten" ;-)

Si ser un especialista en el tema, veo que hay algunos pares hexadecimales que se repiten más que otros (00, 41, 42, 88, 89, 8a, 90, por ejemplo). También creo que se podría asumir que dentro del código descifrado puede haber una URL a la página web donde mandar el CV. Por lo que el patrón http://.../.../ sería uno de los que deberíamos buscar.

Si descubro algo más en los 7 días que quedan para que termine el reto... seguramente les mande mi CV. Aunque va a estar la cosa difícil.

miércoles, 19 de octubre de 2011

Las corrientes de opinión de la blogosfera

Desde hace poco observo en la gente un fenómeno curioso pero por otra parte comprensible. Se trata de las corrientes de opinión que se generan por leer todos los mismos blogs y las mismas webs. En particular me refiero a los temas tecnológicos, que es donde se crean hoy en día intensos debates en la red.

El síntoma característico es opinar de la misma forma o tener pensamientos similares a otra persona cuando se saca un tema tecnológico. Realmente a veces no es que sea una corriente sólo la predominante. A lo mejor es un conjunto finito de entre 1 y 3 opiniones generalmente. Pero justo coincide que con quien estás hablando en un momento dado ha escogido la misma opinión que tú.

Luego te das cuenta que en el fondo si te nutres de las mismas fuentes de información y a cada una le das más o menos el mismo valor (la ponderas de la misma forma) al final la cadena de deducciones nos lleva a todos a los mismos lugares comunes. Lo cual también me hace plantearme la pregunta de si realmente merece la pena leer habitualmente lo mismo o hay que buscar otras fuentes... o lo que es más "inquietante": buscar las fuentes de los hechos y no las opiniones ya procesadas e intentar formarte tú mismo una opinión. Interesante sería también sacar a colación un tema diferente o un debate que no se hubiera considerado antes digno de mención y generar tú una corriente de opinión.

Y es que en esto de la tecnología tener una opinión particular y distinta, una visión original, siempre basada en la lógica y en los hechos claro está, es lo que te puede llegar a diferenciar de los demás. O lo que es lo mismo, poder escribir entradas originales que realmente aporten algo diferente a los asuntos que se discuten dentro de la blogosfera.

martes, 11 de octubre de 2011

Tutorial: Tomcat7 + Struts2 + VIM "à la" sysadmin

  1. Nos bajamos las últimas versiones de Tomcat y de Struts. Para este tutorial suponemos que Tomcat está instalado y arrancado, de forma que podemos desplegar las aplicaciones en la URL /manager (esa parte de la complejidad es para nosotros transparente ya que la gestiona Tomcat).
  2. Creamos la estructura de directorios siguiente (los ficheros los iremos creando más adelante):
  3. +-webapp_template/
      | make.sh
      +-versions/
      +-src/
        | index.jsp
        +-jsps/
        | | HelloWorld.jsp
        +-WEB-INF/
          | web.xml
          | struts.xml
          +-lib/
          | | [librerías.jar, ver más adelante]
          +-classes/
            | [ficheros .java dentro de su paquete]
  4. Grabamos las últimas versiones de las siguientes librerías (todas son o de Struts o de se pueden encontrar en la web de Apache) en el directorio lib, que es donde va a buscar los .jar el servidor Tomcat. Las librerías son:
    • struts2-core
    • xwork-core
    • ognl
    • freemarker
    • commons-fileupload
    • commons-io
    • commons-lang
    • commons-logging
    • javassist
  5. El script en bash make.sh tiene el siguiente contenido (este realmente es el paso más "sysadmin"):
  6. ----------- make.sh ------------------------------------
    #!/bin/bash
    TIMESTAMP=$( date "+%Y%m%d%H%M%S" )
    RUTA_DIR_ACTUAL=$( dirname `pwd` )
    NOMB_DIR_ACTUAL=$( basename `pwd` )
    HOME_APP="`pwd`"
    ROOT_LIB="$HOME_APP/src/WEB-INF/lib"
    LIBRERIAS="."
    for i in $( ls -1 $ROOT_LIB ); do
      LIBRERIAS=$LIBRERIAS:$ROOT_LIB/$i
    done
    #echo LIBRERIAS=$LIBRERIAS
    rm -rf compiled
    cp -a src compiled
    cd compiled
    find . -name "*.java" -exec javac -verbose -classpath $LIBRERIAS {} \;
    find . -name "*~" -exec rm -v {} \;
    find . -name "#*#" -exec rm -v {} \;
    find . -name "*.java" -exec rm -v {} \;
    cp WEB-INF/struts.xml WEB-INF/classes
    zip -r ../${NOMB_DIR_ACTUAL}.war *
    cd ..
    cp ${NOMB_DIR_ACTUAL}.war versions/${NOMB_DIR_ACTUAL}_${TIMESTAMP}.war
    ---------------------------------------------------------
  7. Creamos nuestra vista (jsps/HelloWorld.jsp) y nuestro controlador (WEB-INF/classes/template/HelloWord.java) con el siguiente código:
  8. ----------- HelloWorld.jsp ------------------------------
    <%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1" %>
    <p><s:property value="greetings" /></p>
    ---------------------------------------------------------
    ----------- HelloWorld.java -----------------------------
    package template;

    import com.opensymphony.xwork2.ActionSupport;

    public class HelloWorld extends ActionSupport {

      String greetings = null;

      public String execute() throws Exception {
        setGreetings("Hello World");
        return SUCCESS;
      }

      public String getGreetings() {
        return greetings;
      }

      public void setGreetings(String greetings) {
        this.greetings = greetings;
      }

    }
    ---------------------------------------------------------
  9. Lo siguiente es crear los ficheros de configuración de Tomcat (WEB-INF/web.xml) y de Struts (WEB-INF/struts.xml):
  10. ----------- web.xml -------------------------------------
    <?xml version="1.0" encoding="UTF-8"?>
    <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">

      <display-name>hello</display-name>

      <filter>
        <filter-name>struts2</filter-name>
        <filter-class> org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter </filter-class>
      </filter>

      <filter-mapping>
        <filter-name>struts2</filter-name>
        <url-pattern>/*</url-pattern>
      </filter-mapping>

      <welcome-file-list>
        <welcome-file>index.jsp</welcome-file>
      </welcome-file-list>

    </web-app>
    ---------------------------------------------------------
    ----------- struts.xml ----------------------------------
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE struts PUBLIC
      "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
      "http://struts.apache.org/dtds/struts-2.0.dtd">
    <struts>

      <package name="hello" extends="struts-default">
        <action name="HelloWorld" class="template.HelloWorld">
          <result>/jsps/HelloWorld.jsp</result>
        </action>
      </package>

    </struts>
    ---------------------------------------------------------
  11. Creamos el fichero index.jsp que luego llamará al Action:
  12. ----------- index.jsp -----------------------------------
    <%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%>
    <!DOCTYPE& html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <%@ taglib prefix="s" uri="/struts-tags" %>
    <html>
      <head>
        <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
        <title>Hello Sample</title>
      </head>
      <body>
        <s:action name="HelloWorld" executeResult="true"></s:action>
      </body>
    </html>
    ---------------------------------------------------------
  13. ./make.sh, desplegar (en el interfaz web del Tomcat) y probar la aplicación (en http://localhost:8080/webapp_template/). Cruzar los dedos para que funcione.

La mayor parte de este tutorial está transcrito de una página web donde lo encontré. Realmente mi aportación es el script make.sh y perfilar la estructura de directorios.

Cualquier comentario será bienvenido.

sábado, 8 de octubre de 2011

Steve Jobs, in memoriam

Mucho se ha escrito estos últimos días sobre el cofundador de Apple, Steve Jobs. Nos dejó este miércoles. Poco hay que añadir a esas opiniones de gente que en realidad le conocían mejor que yo. Pero alguna línea le quería dedicar aquí hoy.

Acabo de ver el vídeo de la graduación de la Universidad de Stanford en donde Steve Jobs da el discurso inaugural a los recién graduados y que se disponen a emprender su propia vida, sus propios sueños.

Me quedo eso que dijo allí y que supongo influyó también en todos los presentes en este discurso: tienes que vivir tus propios sueños y no los de otro, tienes que hacer en la vida lo que realmente te gusta y no conformarte con lo que han pensado o hecho otros.

Adiós Steve.


Steve Jobs (izquierda) y Steve Wozniak (derecha)

lunes, 11 de julio de 2011

Mi experiencia con LinkedIn

Por resumir un poco y volcar aquí (cual dump de base de datos) la experiencia de los últimos días con LinkedIn (que ha sido bastante activa por cierto), voy a exponer a continuación una serie de puntos que considero interesantes por los cuales a lo mejor te tendrías que plantear entrar en esta comúnmente denominada red social de los negocios.

Se parece a otras redes sociales que conozco:

  • Se parece a Facebook en el modelo de Amigos/Contactos. No hay clasificación, sólo puedes etiquetar a tus contactos, pero es más una clasificación de cara a tí mismo. También puedes dar visibilidad a tus contactos o no. Yo considero de mala educación no hacerlo, no entiendo qué se gana ocultando tus contactos a los demás.
  • Puedes incorporar estados de tu cuenta de Twitter. Esto lo veo una ventaja si tu cuenta de Twitter tiene un corte profesional. Si no es así, tal vez sea una desventaja.
  • Muchas veces se tiende a crear una red de contactos con tus conocidos y amigos, cuando deberías extenderlo a algo parecido a intercambiar tu tarjeta. Para los que no tenemos tarjeta, más útil todavía.


Hechos diferenciales:

  • Debido a su enfoque profesional, todo el mundo tiene una foto más o menos seria en su perfil. Menos los que somos informales por naturaleza.
  • Puedes ver la trayectoria profesional de tus conocidos y amigos. Ver cómo les va e incluso ayudarles si les recomiendas porque cuando has trabajado con ellos te ha gustado o ha sido una experiencia positiva.
  • Aunque parezca contradictorio con el punto anterior, cuando menos amigo tuyo sea quien te recomienda, más valor tiene la recomendación.
  • Te puede interesar qué cursos o qué formación tiene un contacto tuyo, de cara a haber ascendido a un puesto en concreto. De esta forma puedes plantearte tú hacer el mismo curso para intentar conseguir lo mismo.
  • Para añadir a alguien a tu LinkedIn sólo tienes que darle tu mail o que él te dé el suyo. Incluso puedes ligar varias cuentas de correo a tu perfil de LinkedIn.
  • Si lo tienes actualizado es muy fácil generar tu CV en formato PDF y en los idiomas a los que hayas traducido tu perfil.

Bueno, teniendo en cuenta que la experiencia ha sido corta, yo creo que he llegado a algunas conclusiones interesantes. Espero que os sirvan.

lunes, 25 de abril de 2011

OpenStack Workshop de Madrid

Sobre el vivero de empresas y la empresa que daba la charla (StackOps)

NOTA: OpS = OpenStack, para abreviar

Las charlas se daban en el Vivero de Empresas de Carabanchel, un proyecto de la CAM para alojar a empresas tecnológicas en ciernes/StartUps. La directora del vivero nos estuvo hablando un rato sobre que cualquiera con un proyecto interesante se puede meter ahí. Luego nos habló una chica de una empresa que da asesoramiento técnico/jurídico a las otras empresas del vivero.

Finalmente ya tomaron la palabra los de StackOps, que son 3 personas:

  • Diego Parrilla, que es el CEO y quien dio la charla de OpS-Compute.
  • Luis Gervaso, que es el CTO y quien dio la charla de OpS-Object Storage (a la que no asistí).
  • Arturo Suárez, que es el COO.

La empresa se dedica a proporcionar servicios de valor añadido sobre la pila de componentes básicos de OpS.

Parte teórica

No me pude quedar hasta el final, sólo vi la primera parte del acto en donde explicaban un poco la motivación y soporte que tiene el proyecto y el módulo OpS-Compute (también llamado NOVA). Es un proyecto formado por una comunidad de gente que quiere aportar cosas al mismo, muy a la manera de los grandes proyectos de software libre. Los dos fundadores son Rackspace (un proveedor muy grande de IaaS) y la NASA. Luego están metidos en la comunidad un montón de empresas más, grandes y pequeñas.

OpS-Compute es una plataforma de IaaS y se encarga de:

  • Hacer que funcionen las instancias (darles los recursos necesarios, CPU, memoria, dispositivos de bloques, etc).
  • Administrar los interfaces de red.
  • Controlar el acceso a la nube a los usuarios y sus proyectos asociados (validación de momento contra MySQL y LDAP).


El OpS-Object Storage (aka SWIFT) es la parte de almacenamiento digamos, esa no me dio tiempo pero hubiera sido interesante (el taller iba muy retrasado, y a las 8.15 que es cuando en teoría tenían que haber terminado las dos partes, tan sólo habían terminado la primera).

Hay una tercera pata, OpS-Imaging Service, que se encarga de la gestión de las imágenes de instalación. De esta sólo hablaban de pasada, aunque dicen que en la nueva Release de OpenStack que ha salido ahora en abril, de nombre Cactus, se potencia mucho más que en las anteriores. Puedes hacer migración de un tipo de imagen a otra. Aunque tal y como lo contaba, no debe de estar al 100% implementado todo.

A partir de ahora hablo de OpS-Compute. Es digamos la base de la plataforma IaaS. Sus principios básicos son sencillez y escalabilidad. En principio proporciona características de tolerancia a fallos, alta disponibilidad, etc.

En cuanto al hipervisor que usan, es agnóstico en ese sentido. Puedes usar Xen, KVM, Hyper-V, VMware... No te fuerza a usar ninguno en concreto. En otros aspectos también tienden a ser bastante agnósticos e intentar incorporar varias opciones. Por ejemplo, para gestionar las máquinas virtuales se puede hacer con la API de Amazon-EC2 o bien con la de Rackspace (ahora mismo la más completa es la de EC2).

Turno de preguntas

Le preguntaron que cómo proporcionaba OpS la alta disponibilidad y la tolerancia a fallos. Contesta que cada componente tiene su propia forma de garantizarlo, pero que lo más importante es que las BD sobre las que se sostiene OpS estén en RAC. A nivel de red, en otra parte de la charla, comentaron que no está muy desarrollado y que da lo básico pero que si quieres algo más sofisticado te lo tienes que currar tú.

Demo

En la demo el ponente explicó un escenario típico en donde se le crea un usuario a un cliente al que se le va a prestar servicios, se le asigna los roles adecuados a ese usuario para que pueda gestionar la máquina virtual, se crea la máquina y se asigna una IP y se presenta almacenamiento a la misma. Debido a la configuración del entorno de laboratorio no pudo acceder directamente a la máquina, sólo mostrar la salida de la consola. Pero nos aseguró que la cosa funcionaba.

Conclusiones

IMHO, veo los siguientes Pros y Contras en esta solución:

PROS

  • Tiene a muchas empresas detrás.
  • Es agnóstico con el hipervisor que quieras utilizar, si está soportado.
  • Gratis y se puede extender porque disponemos del código.
  • La última Release parece que soluciona muchos de los problemas de las anteriores, está más currada.


CONTRAS

  • No tiene de momento interfaz gráfica para interfaz de administración ("sólo usuarios hardcore").
  • Rackspace, uno de los fundadores, todavía no lo usa en explotación.
  • No me queda claro que el almacenamiento sea fácil de configurar o integrar con nuestro SAN/NAS.
Nos comentaron los organizadores que colgarían las transparencias y los vídeos de las presentaciones. En cuanto los cuelguen actualizaré esta noticia. Sobre todo me interesa porque no asistí a la otra parte de la charla, a OpS-Object Storage.

sábado, 19 de marzo de 2011

Internet en la sociedad

Acabo de ver un vídeo muy interesante sobre cómo las redes sociales dan mucho poder a los ciudadanos, pero a su vez pueden quitárselo. Está en inglés, pero en la animación de youtube escribe todo lo que se dice. Bueno, más o menos, porque es un resumen en forma de mapa conceptual.

El vídeo se titula "The Internet in Society: Empowering or Censoring Citizens?". O traducido al castellano, "Internet en la sociedad: ¿potenciando o censurando a los ciudadanos?".


En resumen, lo que nos quiere decir es que si bien recientemente muchos gobiernos han caído por efecto de las redes sociales (como Facebook o Twitter), no es menos cierto que algunos otros utilizan ese poder de las redes sociales para o bien censurar o bien sacar información de sus ciudadanos para usarla en su contra.

Es una perspectiva pesimista del asunto, pero a considerar dentro de esta nueva cultura de las redes sociales que ahora mismo nos invade. También me gusta en el vídeo la mención a los "digital natives" y "digital inmigrants". A veces no sabes muy bien si perteneces a los primeros o a los segundos. Y sin duda te preguntas si la gente más joven tiene el calificativo de nativos digitales sólo por ser joven, ya que a muchos les quitas el o los 3 dispositivos que saben usar y posiblemente les dejes anulados.

En fin, una reflexión más para este fin de semana tan convulso en Libia. Entre noticia y noticia todavía nos da tiempo a leer o ver otras cosas.

lunes, 28 de febrero de 2011

Mi visión sobre la web actual

La web tal y como la veo yo hoy en día. Una foto en forma de mapa conceptual, con las webs que más uso o que conozco en cada caso concreto. También están las herramientas que se usan para crear esa web, a nivel de software. Vamos, un poquillo de todo.


Puedes pinchar sobre la imagen para verla más grande.