viernes, 10 de mayo de 2019

Error de permisos al tratar de instalar Appium

Si tratando de instalar Appium de la manera clásica nos sale este error: Error: EACCES: permission denied como se puede observar en el siguiente ejemplo:

mmagni@mmagni-lenovo:~$ sudo npm install -g appium
/usr/bin/appium -> /usr/lib/node_modules/appium/build/lib/main.js
/usr/bin/authorize-ios -> /usr/lib/node_modules/appium/node_modules/.bin/authorize-ios

> appium-chromedriver@4.11.0 install /usr/lib/node_modules/appium/node_modules/appium-chromedriver
> node install-npm.js

(node:5303) UnhandledPromiseRejectionWarning: Error: EACCES: permission denied, mkdir '/usr/lib/node_modules/appium/node_modules/appium-chromedriver/2019410-5303-1pkr3c0.3t64'
(node:5303) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). (rejection id: 1)
(node:5303) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.
[20:58:15] [Chromedriver Install] Installing Chromedriver version '2.46' for platform 'linux' and architecture '64'
[20:58:15] [Chromedriver Install] Opening temp file to write 'chromedriver_linux64' to...
Error: EACCES: permission denied, mkdir '/usr/lib/node_modules/appium/node_modules/appium-chromedriver/2019410-5303-1jmtk1l.nnoej'
npm WARN optional SKIPPING OPTIONAL DEPENDENCY: fsevents@2.0.6 (node_modules/appium/node_modules/fsevents):
npm WARN notsup SKIPPING OPTIONAL DEPENDENCY: Unsupported platform for fsevents@2.0.6: wanted {"os":"darwin","arch":"any"} (current: {"os":"linux","arch":"x64"})

npm ERR! code ELIFECYCLE
npm ERR! errno 1
npm ERR! appium-chromedriver@4.11.0 install: `node install-npm.js`
npm ERR! Exit status 1
npm ERR!
npm ERR! Failed at the appium-chromedriver@4.11.0 install script.
npm ERR! This is probably not a problem with npm. There is likely additional logging output above.

npm ERR! A complete log of this run can be found in:
npm ERR!     /home/mmagni/.npm/_logs/2019-05-10T23_58_16_106Z-debug.log

La solución para este problema de permisos es ejecutar el mismo comando agregando los siguientes parámetros:

mmagni@mmagni-lenovo:~$ sudo npm install -g appium --unsafe-perm=true --allow-root
/usr/bin/appium -> /usr/lib/node_modules/appium/build/lib/main.js
/usr/bin/authorize-ios -> /usr/lib/node_modules/appium/node_modules/.bin/authorize-ios

> appium-chromedriver@4.11.0 install /usr/lib/node_modules/appium/node_modules/appium-chromedriver
> node install-npm.js

[21:02:23] [Chromedriver Install] Installing Chromedriver version '2.46' for platform 'linux' and architecture '64'
[21:02:23] [Chromedriver Install] Opening temp file to write 'chromedriver_linux64' to...
[21:02:23] [Chromedriver Install] Opened temp file '/tmp/2019410-5611-12mbuip.95vu/chromedriver_linux64.zip'
[21:02:23] [Chromedriver Install] Downloading https://chromedriver.storage.googleapis.com/2.46/chromedriver_linux64.zip...
[21:02:33] [Chromedriver Install] Writing binary content to /tmp/2019410-5611-12mbuip.95vu/chromedriver_linux64.zip...
[21:02:33] [Chromedriver Install] Extracting /tmp/2019410-5611-12mbuip.95vu/chromedriver_linux64.zip to /tmp/2019410-5611-12mbuip.95vu/chromedriver_linux64
[21:02:33] [Chromedriver Install] Creating /usr/lib/node_modules/appium/node_modules/appium-chromedriver/chromedriver/linux...
[21:02:33] [Chromedriver Install] Copying unzipped binary, reading from /tmp/2019410-5611-12mbuip.95vu/chromedriver_linux64/chromedriver...
[21:02:33] [Chromedriver Install] Writing to /usr/lib/node_modules/appium/node_modules/appium-chromedriver/chromedriver/linux/chromedriver_64...
[21:02:33] [Chromedriver Install] /usr/lib/node_modules/appium/node_modules/appium-chromedriver/chromedriver/linux/chromedriver_64 successfully put in place

> appium-selendroid-driver@1.13.3 install /usr/lib/node_modules/appium/node_modules/appium-selendroid-driver
> node ./bin/install.js

[21:02:34] Java version 11.0.3 found
[21:02:34] Ensuring /usr/lib/node_modules/appium/node_modules/appium-selendroid-driver/selendroid/download exists
[21:02:34] Downloading Selendroid standalone server version 0.17.0 from https://repo1.maven.org/maven2/io/selendroid/selendroid-standalone/0.17.0/selendroid-standalone-0.17.0-with-dependencies.jar --> /usr/lib/node_modules/appium/node_modules/appium-selendroid-driver/selendroid/download/selendroid-server-7cf7163ac47f1c46eff95b62f78b58c1dabdec534acc6632da3784739f6e9d82.jar
[21:02:59] Writing binary content to /usr/lib/node_modules/appium/node_modules/appium-selendroid-driver/selendroid/download/selendroid-server.jar.tmp
[21:02:59] Selendroid standalone server downloaded
[21:02:59] Determining AndroidManifest location
[21:02:59] Determining server apk location
[21:03:00] Extracting manifest and apk to /usr/lib/node_modules/appium/node_modules/appium-selendroid-driver/selendroid/download
[21:03:00] Copying manifest and apk to /usr/lib/node_modules/appium/node_modules/appium-selendroid-driver/selendroid
[21:03:00] Cleaning up temp files
[21:03:00] Fixing AndroidManifest icon bug

> appium-windows-driver@1.5.1 install /usr/lib/node_modules/appium/node_modules/appium-windows-driver
> node install-npm.js

Not installing WinAppDriver since did not detect a Windows system
npm WARN optional SKIPPING OPTIONAL DEPENDENCY: fsevents@2.0.6 (node_modules/appium/node_modules/fsevents):
npm WARN notsup SKIPPING OPTIONAL DEPENDENCY: Unsupported platform for fsevents@2.0.6: wanted {"os":"darwin","arch":"any"} (current: {"os":"linux","arch":"x64"})

+ appium@1.13.0
added 584 packages from 402 contributors in 42.928s

martes, 19 de diciembre de 2017

Instalar MongoDB Community Edition en Debian 9

Deberemos instalar libssl1.0.0 la cual no se encuentra en los respositorios de Debian 9.

Ejecutamos:

$ wget http://security.debian.org/debian-security/pool/updates/main/o/openssl/libssl1.0.0_1.0.1t-1+deb7u3_amd64.deb
$ sudo dpkg -i libssl1.0.0_1.0.1t-1+deb7u3_amd64.deb
$ sudo apt install dirmngr
$ sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 2930ADAE8CAF5059EE73BB4B58712A2291FA4AD5
$ sudo su
# echo "deb http://repo.mongodb.org/apt/debian jessie/mongodb-org/3.6 main" | sudo tee /etc/apt/sources.list.d/mongodb-org-3.6.list
# exit
$ sudo apt update
$ sudo apt install -y mongodb*

¡Listo!

jueves, 14 de diciembre de 2017

ERROR tratando de instalar polymer-cli

Si intentaste instalar polymer-cli:

$ sudo npm install -g polymer-cli

...y obtuviste el siguiente error:

Error: EACCES: permission denied, mkdir '/usr/lib/node_modules/polymer-cli/node_modules/wd/build'

El mismo se soluciona agregando el parámetro --unsafe-perm al comando:

$ sudo npm install -g polymer-cli --unsafe-perm

miércoles, 13 de septiembre de 2017

Argentina DevDay

Se viene otra edición de Argentina DevDay. La misma está organizada por un grupo de desarrolladores y parte de Python Mendoza y Pyladies Mendoza. Python Mendoza y Pyladies Mendoza son dos comunidades voluntarias de desarrolladores que buscan llevar a cabo eventos y meetups.
  La imagen puede contener: texto y exterior 

Links útiles:

viernes, 8 de septiembre de 2017

S.P.A. en Español

Invito a toda la comunidad de desarrolladores web a unirse a mi página y grupo de Facebook.

Página: https://www.facebook.com/spa.espanol/

Grupo: https://www.facebook.com/groups/376764012741361/

Hasta ahora no existía ninguno que hablara del tema S.P.A. en general, solo habían páginas y grupos específicos sobre cada tecnología. ¡Gracias!

¿Cómo hacer un IFRAME responsive?

Este problema se resuelve poniendo un <div> como envoltorio del <iframe>, con la siguiente propiedad CSS:

-webkit-overflow-scrolling:touch;

El código nos quedaría de la siguiente forma:


.wrapper {
    -webkit-overflow-scrolling:touch;
}

<div class="wrapper">
    <iframe ... width="100%"></iframe>
</div>

sábado, 12 de agosto de 2017

Apuntar un dominio a una IP dinámica de una instancia de Google Cloud Compute

Cuando contratamos un servicio en Google Cloud Platform y creamos una instancia de una máquina virtual decubrimos que nos dan una IP dinámica. Los costos de una IP estática son elevados en este proveedor de hosting (cobro por hora). La solución es utilizar algún proveedor de DNS de IPs dinámicas.

En este ejemplo vamos a utilizar el servicio que nos brinda NO-IP. Vamos a crear un dominio en esa página y luego vamos a apuntar el dominio real que queramos utilizar a este otro mediante un registro CNAME. Una vez creado el dominio en NO-IP, ponemos la IP temporal que tengamos en ese momento apuntando a ese dominio.

El paso siguiente consistirá en bajar el software cliente de NO-IP e instalarlo en nuestra VM de GCloud. Para ello nos vamos a la sección de descarga del cliente. Les dejo el link directo de la descarga asumiendo que la instancia tiene instalado un sistema operativo Linux:

https://www.noip.com/download?page=linux

Para descargarlo directamente en nuestra instancia y no tener que hacer un posterior upload al servidor de producción, podemos ejecutar los siguientes comandos:

$ wget https://www.noip.com/client/linux/noip-duc-linux.tar.gz
$ tar xvfz noip-duc-linux.tar.gz

Ahora procederemos con la instalación:

$ cd noip-2.1.9-1
$ make
$ sudo make install

    * (Paso opcional aquí: ir)

Finalmente ejecutamos el cliente que actualizará nuestra IP cada vez que esta cambie.

$ sudo /usr/local/bin/noip2

Ahora solo resta apuntar al dominio registrado en NO-IP el dominio final que queramos utilizar en producción. En este ejemplo, voy a usar uno gratuito registrado en Freenom, el cual es más estético que las opciones que nos brinda NO-IP. Primero, nos logueamos en Freenom y nos vamos a la sección Services  My Domains. Hacemos click en Manage Domain:


Ahora entramos en Manage Freenom DNS e ingresamos las siguientes entradas:


En este ejemplo appicar.ddns.net es el dominio registrado en NO-IP y appicar.tk, el de Freenom. Ustedes deberán reemplazar ahí por sus respectivos dominios.

Checkeamos que todo esté en orden:

$ dig www.appicar.tk


Como podemos observar, los dominios apuntan correctamente a sus respectivos blancos.

Aquí termina el tutorial básico. Si siguieron todos los pasos anteriores ya contarán con un servicio que les actualizará automáticamente el registro A del dominio que registraron en NO-IP.

Script de Logging

Durante el proceso de instalación nos preguntará si queremos ejecutar algún script cuando se realice la actualización de la IP. Yo creé un script que escribirá un log en /var/log/noip/log. Veamos el contenido del mismo:

# cat /usr/bin/noip-log

#!/bin/bash

echo $(date +"%Y-%m-%d %H:%M:%S") - IP updated: $(myip) >> /var/log/noip/log


Copien el contenido de noip-log a un archivo con el mismo nombre y denle permisos de ejecución:

# chmod +x /usr/bin/noip-log

Después tenemos que crear el archivo /usr/bin/myip que nos devolverá en la consola nuestra IP pública. Ponemos este código dentro del mismo:


#!/bin/bash

curl -s checkip.dyndns.org | sed -e 's/.*Current IP Address: //' -e 's/<.*$//'


Le damos permisos de ejecución:

# chmod +x /usr/bin/myip

Ahora lo vamos a ejecutar nosotros mismos para dejar registro de la IP actual:

# /usr/bin/noip-log
# cat /var/log/noip/log
2017-08-11 21:05:57 - IP updated: 35.196.20.137

domingo, 6 de agosto de 2017

Node.js v8 en Ubuntu y Debian

Para instalar Node.js v8 tienen que ejecutar estos comandos:

Ubuntu:

# curl -sL https://deb.nodesource.com/setup_8.x | sudo -E bash -
# sudo apt-get install -y nodejs

Debian:

# curl -sL https://deb.nodesource.com/setup_8.x | bash -
# apt-get install -y nodejs