Monday, January 24, 2022

¿Cómo mover o transferir Docker imagen a otro sistema? How to Transfer/Move a Docker Image to Another System?

 

¿Cómo mover o transferir Docker imagen a  otro sistema?


Este post es una mejora a la entrada [1] Ya que no hace falta pasar por la gestión de ficheros y copiar los ficheros al sistema. Simplemente introducimos el comando en una pipeline de sistema usando el comando de SSH 

docker save imagenDocker:latest | ssh user@nameMachineToCopy  'cat > /path/imagenDocker.tar'

y ejecutamos en la maquina nameMachineToCopy  el siguiente comando   docker load < /path/imagenDocker.tar

Pero aún mejor es ejecutarlo en un solo comando sin ficheros intermedios

docker save imagenDocker:latest | ssh user@nameMachineToCopy  ' docker load '


[1]https://appfleet.com/blog/how-to-transfer-move-a-docker-image-to-another-system/

Thursday, May 6, 2021

Ansible

 Estoy realizando un proyecto en Ansible y cuando estas realizando ciertas tareas sencillas como instalar o  copiar datos a los nodos donde estas configurado en el inventory es mas o menos sencillo. Pero cuando quieres ejecutar tareas específicar en un nodo y no en el resto etc. las tareas se complican. 

una tarea sencilla seria que fallara en las máquinas donde tienes cierta version de S.O. por ejemplo para controlar la distribución se haria de la siguiente manera. 

  - namecheck Distribution 
    ansible.builtin.fail
      msgThe system opetative must be Ubuntu and version 20 or getter 
    whenansible_distribution | lower != "ubuntu" or ansible_distribution_major_version| int  < 20

Otra de las tareas que me llevó tiempo es como te puedes impersonar en otro usuario para eso tienes que instalar  un paquete 

  - nameinstall setfacl support copy temp files with other users.
    ansible.builtin.aptpkg=acl
    becometrue







Thursday, January 28, 2021

Limitar el acceso por SSH de un usuario por Región o ciudad a través de su IP

¿Cómo detectar un inturso en tu equipo?  existen diversas manera pero siempre he querido explorar la de localidad del usuario.

Muchas veces me he preguntado como puedo limitar a las personas que entrar en un equipo Unix por Zona geográfica.   

Una solución pasa por un servicio externo que te diga de que region es la ip que se conecta el usuario. 

Por supuesto si entra a través de una VPN de la region permitida el usuario podría entrar.

Con la api de  https://ipwhois.io/documentation  puedes resolver la localizacion de la ip

 Con el comando

 who --ips |  awk '{ print $5 }'| xargs -t  -I ARG   curl -s  http://ipwhois.app/json/ARG | jq .city

 

puedes ver desde que ciudad se está conectando los usuarios. Este comando lo podrías usar para enviar un correo o para limitar por ssh quien se puede conectar. 

 

Tuesday, July 14, 2020

¿Qué tecnologías son las más demanadas en los perfiles SRE?



Como el perfil de SRE es un poco difuso, me he pasado unos días mirando ofertas de trabajo (1500 ofertas) para ver que habilidades técnicas están pidiendo las empresas a los perfiles DevOps y estos son los datos.

A mi me  sorprende ver que estén pidiendo más Azure que AWS, cuando persaba que era justamente al contrario. Y que cómo lenguaje de programación estén pidiendo más Python

Si quieres hacer carrera en el mundo DevOps debes formate en las siguientes tecnologias: Linux, Azure, Jenkins, Docker, Git, Python y Ansible. No deberías tener problemas para encontrar trabajo del perfíl DevOps

Sunday, February 2, 2020


When you want pass a parameter to exec docker instruction, you must used heredoc format in bash 



#!/bin/bash

export variable="value second parameter"
export log=./log

docker exec  -i dockernamecontainer /bin/bash  <<EOF > $log/logfile.log 2>&1  &
cd /python/; python  app.py firstparameter "$variable"
exit
EOF


the $variable is interpreted by heredoc format and replace command as
cd /python/; python  app.py firstparameter value second parameter

Thursday, November 10, 2016

Error to download Java

Oh my good, I cant download java.


Thank you for accessing the Oracle Software Delivery Cloud. Due to your country location, we are unable to process your request. If you have an active support contract, you may request physical media by either submitting a Service Request or calling Customer Support. If you wish to purchase or evaluate our products on a 30-day trial please contact the appropriate Sales Representative for your country.

Monday, October 17, 2016

crear una imagen con docker

Como empezar con docker

Docker funciona mediante los conceptos de container e imágenes. Una imagen es una máquina sin instanciar, con todo instalado y que no puede ser modificada una vez creada. Una imagen de Docker parte siempre de otra imagen.  Un containter es la instancia de una máquina que parten de una imagen.  

Fichero Dockerfile
 
Para generar una imagen, se debe crea un fichero Dockerfile donde se indica la imagen de la que se parte. Para ver los listados de imágenes disponibles se pueden buscar en https://hub.docker.com/  En el fichero Dockfile se aplican los cambios que sea necesario para nuestro proyecto. Se realizan copia de ficheros mediante el comando ADD (deprecate) o COPY,  se pueden establecer variables de entorno con el comando ENV y  ejecutar comandos , instalación de paquetes, con el comando RUN.

Para que se puedan acceder a los puertos de la imagen se usa el comando EXPOSE en el fichero Dockefile. Como pueden ser los tipicos de ssh y tomcat  EXPOSE 22 80  9001
Para finalizar se usa el servicio supervisiord para la ejecución de varios servicios de nuestra imagen y en el que se debe configurar un fichero para lanzar los script correctamente en el puerto 9001
CMD ["/usr/bin/supervisord"]

Comandos de docker para crear un proyecto
  
Para llevar a cabo la creacion de un sistema docker he eguido los siguientes pasos

  1. Se crea una imagen, ver fichero Dockerfile,  mediante el comando docker build -t usuario/proyecto .
  2. Se crea un volumen de datos  docker volume create  --name datosPersistentes para los volumenes
  3. Se crea el container docker run -p 8080:8080 -p 9001:9001  -v datosPersistentes:/data  -v    -i -t  usuario/proyecto. Desde este momento ya se puede acceder al container. Ver si se dejan todos los puertos abiertos o simplemente el 8080 . Si se hace un control-c se para el container. Si se lanza con la opción -d se desvincula y no se parará el container y si se quiere parar con el comando   docker stop idcontainercreado
  4. Se inicializa el container docker start idcontainercreado, cada vez que se quiera lanzar el container

El comando se puede concatenar para ser mas rápido.
docker build -t usuario/proyecto . &&  docker run -p 8080:8080 -p 9001:9001  -v datosPersistentes :/data    -i -t   usuario/proyecto


Para comprobar que los servicios están levantados se mira el enlace
   
   
Los container se pueden para la ejecución y volver a ejecutarlos mediante el comando docker stop y docker start

Para acceder a una máquina docker se puede ejecutar el comando docker exec -i -t idcontainercreado /bin/bash

Es recomendable borrar las imágenes y container ya que ocupan mucho espacio.

Por último se puede publicar una imagen en un repositorio publico como el de https://hub.docker.com con el comando docker  login --username=usuario --email=miemail@loquesea.nose
Se hace login en el sistema y con el comando
docker push usuario/proyecto
Se publica la imagen

Comandos útiles de docker

Ver todos los container
docker  ps -a
Ver la version de docker
docker -v

Borrar los container
docker  rm   idimagen
Borra Todos los container que cumplen como nombre del container ‘condicion’

docker ps -a | grep ‘condicion' | awk '{print $1}' | xargs --no-run-if-empty docker rm
Borrar todos los volúmenes. Cuidado con borrar los datos del container
docker volume ls  | awk '{print $2}' | xargs docker volume rm

Borrar todas las imágenes. No borrará los container en start
docker images  | grep condition | awk '{print $3}' | xargs docker rmi

Copiar ficheros desde el host a un container
docker cp foo.txt mycontainer:/foo.txt

Monday, June 13, 2016

Extraer texto de un pdf

La extración de texto de los PDF es fácil cuando sabes como hacerlo. Yo he usado las librerias pdfbox version 2.0.2

    <dependency>
            <groupId>org.apache.pdfbox</groupId>
            <artifactId>pdfbox</artifactId>
            <version>2.0.2</version>
        </dependency>

Simplemente se define un área  de extraccion de texto. Lo malo que no sabes si las coordenadas del xy empiezan (0,0) arriba o abajo.

Cuando agregas un rectangulo a un PDAnnotationLink() las coorenadas de las Y empiezan en lo alto de la página 

Cuando invocas    PDFTextStripperByArea() las coordenadas de la Y empieza en el pié de la página

PDFTextStripperByArea stripper = new PDFTextStripperByArea();
stripper.setSortByPosition(true);
Rectangle2D rect = new Rectangle2D.Float(x, y, width, height);
stripper.addRegion("region", rect);
stripper.extractRegions(page);
stripper.getTextForRegion("region")

Para realizar el cambio de coordenada, se ha realizado esta función. 


private Rectangle2D changeUpper2Lower(Rectangle2D rect ,PDPage page){
 
    return new Rectangle2D.Float(
      (float)rect.getX(),
      (float)page.getMediaBox().getHeight() - (float) rect.getY()-(float)rect.getHeight(),
      (float)rect.getWidth(),
      (float)rect.getHeight());
 
  }



Friday, January 8, 2016

instalacion de open stack

Para la instalación de openStack seguí el tutorial de

http://docs.openstack.org/developer/devstack/guides/single-machine.html

 Basicamente es :
Añade un usuario
 
adduser stack
apt-get install sudo -y || yum install -y sudo
echo "stack ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers

Haz login con este usuario

Descargate DevStack

sudo apt-get install git -y || sudo yum install -y git
git clone https://git.openstack.org/openstack-dev/devstack
cd devstack

pero tuve que modificar el script stackrc, el repositorio de git interno antes de lanzar stack.sh 

GIT_BASE=${GIT_BASE:- git://git.openstack.org}
por

GIT_BASE=${GIT_BASE:- https://www.github.com}

el fichero de local.conf lo modifique como sigue lo creé así.

FLOATING_RANGE=192.168.1.252/30
FIXED_RANGE=10.11.12.0/24
FIXED_NETWORK_SIZE=256
FLAT_INTERFACE=em1
ADMIN_PASSWORD=*******


Lanza script

 stack.sh

Ya se puede acceder a la web de openstack con normalidad

Reiciamos la máquina:
    Si la máquina se ha reiniciado como es el caso, hay que lanzar con el usuario "stack" los siguientes comandos.
   
        script /dev/null
           
    Eso es para corregir un fallo del comando de screen que lo usa el script  rejoin-stack.sh
    Lanzamos el script

        rejoin-stack.sh

    Se crean como unas 20 consolas (comando screen) que se  pueden navegar entre ellas con el  "control-a " + "n" de next ó n = al numero de la consola
    En la consola shell  (control-a + 0 )  se lanza el comando    
   
   keystone-all        

    ya puedes entrar en la web de openstack

Friday, October 30, 2015

[Open Stack] error access with horizon

If you have a error similar to :

  • First successful login:
    2015-05-11 01:56:11,986 2327 INFO openstack_auth.forms Login successful for user "gtirloni".
  • Second unsuccessful login:
    2015-05-11 10:24:30,717 2328 INFO openstack_auth.forms Login successful for user "gtirloni".
    2015-05-11 10:24:30,718 2328 ERROR django.request Internal Server Error: /dashboard/auth/login/
    Traceback (most recent call last):
      File "/usr/lib/python2.7/site-packages/django/core/handlers/base.py", line 132, in get_response
        response = wrapped_callback(request, *callback_args, **callback_kwargs)
      File "/usr/lib/python2.7/site-packages/django/views/decorators/debug.py", line 76, in sensitive_post_parameters_wrapper
        return view(request, *args, **kwargs)
      File "/usr/lib/python2.7/site-packages/django/utils/decorators.py", line 110, in _wrapped_view
        response = view_func(request, *args, **kwargs)
      File "/usr/lib/python2.7/site-packages/django/views/decorators/cache.py", line 57, in _wrapped_view_func
        response = view_func(request, *args, **kwargs)
      File "/usr/lib/python2.7/site-packages/openstack_auth/views.py", line 111, in login
        **kwargs)
      File "/usr/lib/python2.7/site-packages/django/views/decorators/debug.py", line 76, in sensitive_post_parameters_wrapper
        return view(request, *args, **kwargs)
      File "/usr/lib/python2.7/site-packages/django/utils/decorators.py", line 110, in _wrapped_view
        response = view_func(request, *args, **kwargs)
      File "/usr/lib/python2.7/site-packages/django/views/decorators/cache.py", line 57, in _wrapped_view_func
        response = view_func(request, *args, **kwargs)
      File "/usr/lib/python2.7/site-packages/django/contrib/auth/views.py", line 51, in login
        auth_login(request, form.get_user())
      File "/usr/lib/python2.7/site-packages/django/contrib/auth/__init__.py", line 102, in login
        if _get_user_session_key(request) != user.pk or (
      File "/usr/lib/python2.7/site-packages/django/contrib/auth/__init__.py", line 59, in _get_user_session_key
        return get_user_model()._meta.pk.to_python(request.session[SESSION_KEY])
      File "/usr/lib/python2.7/site-packages/django/db/models/fields/__init__.py", line 969, in to_python
        params={'value': value},
    ValidationError: [u"'1550aa46bac146a0ac76e4801a66e065' value must be an integer."]
!! Clean you cache !!  ,it  works



Wednesday, March 11, 2015

Smart TV LG, la peor elección

No sé quienes son los diseñadores de la Smart TV de LG, pero creo que no pueden hacerlo peor. Han eliminado el botón de cambiar el idioma del mando a distancia. Mira que traen botones y hasta 2 mandos, y no pueden poner un simple botón que traen todos los decodificadores desde el inicio de la TDT.

El market es realmente malo y escaso de aplicaciones. Eliminan las aplicaciones y las vuelven a poner sin que digan nada. La aplicacion de TotalChannel que estoy pagando, ya la han eliminado 2 veces este mes que yo sepa.

No está AtresMedia ni Mitv. Es un verdadero desastre.


Tuesday, February 17, 2015

sony xperia C5303 se entrecorta el audio de las llamadas de voz

Tengo el teléfono Sony Xperia C5303 con vodafone 4G y se entrecortan el sonido del teléfono. He observado que el teléfono está saltando todo el rato de 3G a 4G. No se si es culpa del teléfono o de vodafone y su 4G. De todos modos, es un telélofono que Vodafone ha configurado y ha entregado a un cliente.  He desactivado el 4G de Vodafone y el audio es claro y alto. Ahora estoy sin 4G pero por lo menos puedo hablar por teléfono.

Saturday, February 14, 2015

yomvi, wuaki.tv y totalchannel, cual es la mejor.

He estado probando los servicios de tv online y estas han sido mis conclusiones. Comentaré las características de Yomvi de canal plus, TotalChannel y Wuaki.tv respecto a la calidad de servicio, plataformas soportadas y catálogo de series y películas .

Wuaki.tv y Yomvi tiene la posibilidad de ver películas y series solamente pagando la suscripción mensual.  Seleccionas la pelicula o serie y la ves cuando quieres. TotalChannel no da esta posibilidad.

TotalChannel es un conjunto de canales al estilo de Imagenio de Movistar,  tiene la opcion de un disco duro virtual con 100 Horas donde puedes programar grabar un programa serie o pelicula. El precio es menor que Imageneo pero mayor que Wuaki.tv o Yomvi. TotalChannel tiene anuncios, lo cual me ha sorprendido, ¡ Es una televisión de pago!

Resepcto a la calidad de servicio, Wuaki.tv falla en fines de semana, desde cortarse a mitad, lo cual es un suplicio, que es cuando tenemos tiempo para ver la televisión.  Respecto Yomvi y TotalChannel no he encontrado este problema.

Respecto las plataformas soportadas, TotalChannel es la peor,  tiene soporte solamente para PS3 y Smart TV de LG, pero no para plataformas Linux ni Android, lo cual es una pena también dicen que soporta Chrome Cast pero no lo puedo usar al tener solamente GNU con Linux y Android. Yomvi puede visualizarse en Android y las Smart Tv de LG, pero no tiene soporte para Chrome Cast. Wuaki.tv tiene soporte para Chrome Cast,  PS, Android y Smart Tv de LG. Gana por goleada por plataforma soportadas.

El catálogo de Wuaki.tv selecction, que es la opción de ver películas y series solamente pagando la suscripción mensual es el mas extenso y mejor. Van cambiando cada mes algunas películas. El catálogo  Yomvi tanto en películas y series ridículo.Puedes comprar o alquilar películas durante 48 horas, un concepto un poco antiguo heradado de los videoclubs. He alquilado películas que no he podido ver. Deberian plantearse el concepto de alquilar películas por el número de visualizaciones.

El cuanto a los idiomas y subtítulos, Wuaki.tv tiene la opción de seleccionarlos y funciona cosa que no sucede con Yomvi ni Total Channel, que si que te dan la opción, pero no funciona cuando pulsas la opción de cambia el audio. El catálogo de Wuaki.tv de peliculas que puedes ver en versión original con subtitulos al castellano podríamos decir que es un 25% de las películas.

En cuanto la integración con las plataformas, totalChannel tiene una gran integracion con los mandos de la LG, es la mas fácil de todas ellas. También es verdad que con wuaki.tv usas el móvil como mando, lo cual es mucho más cómodo. 

En general todas las plataformas son realmente malas pero Wuaki.tv tiene el menor precio y para mí es la mejor de las 3 plataformas por su catálogo. Lo peor de ella es que el fin de semana se corta el servicio y es odios.

Lo mejor de las 3 plataformas es que puedes usar los sistemas si ningún tipo de compromiso de permanencia. Lo cual te puede servir parar testearlas y elegir la que mejor te convenga.



Thursday, November 20, 2014

Cómo crear una instancia de tomcat

Para  crear una instancia distinta de tomcat, se siguen los siguientes pasos

  1. Copiamos el script de tomcat anterior con otro nombre y lo modificacamos con una varialble de la con el nombre de carpeta donde apuntará nuestra instancia  INSTANCE=instance3 y modificamos esta nueva ruta de
    CATALINA_BASE=/var/lib/$NAME/$INSTANCE
  2. Creamos una carpeta de instance3. En ella creamos:
    1. una carpeta "conf" y copiamos en ella el contenido de la carpeta "conf" de tomcat.
    2. una carpteta "log"
    3. una carpeta "temp"
    4. una carpeta "wepapps"
    5. y creamos un link simbolico  a "cache/tomcat7", llamado "work" mediante la instruccion "ln  -s ../../../cache/tomcat7/instance3 work", si esta carpeta
  3. establecemos permisos a la carpeta "instance3" al usuario de tomcat
  4. modificamos el fichero conf/server.xml con el pueto que tendrá nuestra instancia. 
  5. lanzamos el servicio de nuestra nueva instancia.

Friday, September 19, 2014

Hacer una ordenacion aleatoria

Para ordenar de manera aleatoria en mongodb solamente se me ocurre insertar un campo aleatorio.


db.Collection
    .find({},{_id:1})
    .forEach(function(doc){
        db.collection.
        update(
            { _id: doc._id},
            { $set: { r: Math.random() } } ,
            { upsert: true }
                       );
    });
después solo tienes que ordenar por r.

Wednesday, July 9, 2014

Error lucene Mahout and Carrot2

En un proyecto hemos intentado generar un servicio con los cluster de Mahout Kmeans y los de Carrot2. Nos da un error de mahout-math ya que en de la version 0.6 a la 0.9 pasa una clase de interface a clase abstracta y no se pueden utilizar las 2 juntas. Mahout kmeans usa Mahout -math 0.9 y Carrot2 3.9.2 usa Mahout-math-0.6. La solución es recompilar y cambiar el nombre tanto de mahout-math.0.6 y sus referencias a Carrot2. Como uso Maven tambien tengo que publicarlo con otro groupid quitando las dependecias e integrando todo en un único jar. como he odiado este error. java.lang.IncompatibleClassChangeError: Implementing class

Tuesday, July 8, 2014

Regresion lineal con octave.

La regresion lineal sirve para apatir de un gran conjunto de historicos datos, entrenar un algoritmo para a partir de estos datos predecir futuros comportamientos. Parece complejo, pero con Octave es muy sencillo. simplemente cargas los datos de histórico a partir de un fichero csv. Estos datos en la primera columna tenemos la variable a predecir.

 //crea matriz X = dlmread('datos.csv', ";");
//Como hemos comentado en la primera columna está la variable a predecir
Y Y =X(:,1);
//con convencion ponemos a 1 la primera columna.
X(:,1)=1;
//normalizamos dividiendo por el maximo valor de cada columna
X2 = bsxfun(@rdivide,X, max(X));
//calculamos el valor de theta a partir de esta formula matricial
theta=pinv(X'*X)*X'*Y;
//dibujamos los puntos por pantalla. plot(X2(:,2), X2*theta, '-')
 //para saber el valor que predecimos si es correcto o no comprobar los valores de Y con los de
X*theta
//comprobar el error y ajustaremos los modelos matriciales para ver si el error se puede corregir. //añadiremos mas columnas al modelo X dependiendo el tipo de curva que se adapte a nuestro modelo
//por ejemplo añadiendo al modelo distintas columnas. Ten en cuenta que todo aquí son matrices y el tiempo de cálculo se eleva considerablemente.

 =====Solucion =====
X = dlmread('datos.csv', ";");
Y =X(:,1);
X(:,1)=1;
X2 = bsxfun(@rdivide,X, max(X));
X3 = pow2(X2)
X4 = sqrt(X2)
X5 = pow2(X2,3)
X6 = [X2 X3 X4 X5]
theta6=pinv(X6'*X6)*X6'*Y; X6*theta6

sony xperia C5303 arreglado el tema del altavoz y del microfono

Llevo varios días intentando usar mi teléfono móvil, pero no funcionaba ni el micro ni el altavoz externo. Es como si estuviera el jack de los cascos activados. En un foro he leído que simplemente metiendo un destornillador por el jack de los auriculares funcionaba de nuevo. Como no me atrevo a meter un objeto metálico, a ver si lo rompo del todo. He cogido un bastoncillo de los oídos y lo he cortado con las tijeras. La parte que he cortado lo he metido un par de veces hasta el fondo del jack, magia, ha vuelto a funcionar. Solucionado el tema del teléfono.

Monday, June 9, 2014

java and access

to connect access form java, i get this error. Error: java.sql.SQLException: [Microsoft][ODBC Driver Manager] Data source name not found and no default driver specified To connect java 64 bit with access, it 's necesary install driver 64 bit download and install http://download.microsoft.com/download/0/B/8/0B8EFDD9-8CE5-405C-A28D-A108A63AE2FC/AccessDatabaseEngine_X64.exe And if you want read all query and launch this query "SELECT [Name] FROM MSysObjects WHERE Name Like 'MSys*' ORDER BY [Name]" you get this error: error: READ en 'MSysObjects' You must execute a macro http://stackoverflow.com/questions/19971082/no-read-permission-on-msysobjects strDdl = "GRANT SELECT ON MSysObjects TO Admin;" CurrentProject.Connection.Execute strDdl If you get this error "ODBC Driver Manager 'invalid string or buffer length' error " , my solver is update java 1.7.70 at least.