31 marzo 2014

Acceder a un Linux desde internet

Ya vimos como conectar remotamente a una máquina en Raspberry Pi Instalación de NOOBS y primeros pasos. Sin embargo esto era sólo para equipos en la misma red local. Si queremos acceder desde qualquier sitio de internet primero hay que hacer dos cosas.

  • El primero desactivar el DHCP de nuestro router para que siempre la Raspberry (en este caso, pero vale para cualquier equipo) tenga siempre la misma IP. Depende de cada router por ejemplo para el mio sería así.
  • Este paso no hace falta hacerlo siempre ya que muchas veces la raspberry nos quedará ya configurada pero por si no fuese así aquí tenéis un enlace donde se explica
  • Acto seguido hay que abrir el puerto 22 para esta IP tambien en el router. Es fácil, fácil, facil.
  • Finalmente para acceder desde internet, necesitaremos nuestra IP pública, para conocerla simplemente en un navegador navegamos hasta icanhazip.com. Esta web simplemente devuelve nuestra ip pública. El problema suele ser que nuestro ISP (telefonica, vodafone, etc...), normalmente no nos da una IP estática, eso quiere decir que nos cambia constantemente nuestra IP segun va teniendo IPs disponibles. En este caso, o bien nos registramos en un servicio que nos vaya dando nuestra ip publica constantemente o bien programar un pequeño script. Yo voy a optar por la segunda opción ya que tengo un hosting web (podéis obtener uno en hostinger.com, por ejemplo) al cual podre subir mi ip pública cada cierto tiempo.
#!/bin/bash
# Este archivo lo llamamos ipp.sh
a=$(curl -s icanhazip.com)
sleep 30
echo $(date) "ipp" $a >> ipp.txt
lftp -u user,pass ftp.website.com <<EOF
cd /public_html/raspi/
lcd /home/pi/
put ipp.txt
quit 0
EOF

Nota: Hay que instalar lftp para usar este script.

Una vez hecho el script, añadimos permiso de ejecución
chmod u+x ipp.sh
y lo programamos en nuestro cron, recordemos que para hacerlo debemos editar el archivo crontab, para hacerlo simplemente escribimos:
crontab -e
se nos abrirá el archivo con nuestro editor de textos predeterminado al final del archivo añadimos la frecuencia de ejecucion con el formato 
m h dom mon dow command


cron se ejecuta cada minuto, si pusiesemos 
* * * * * /home/pi/ipp.sh
se ejecutaría todos los minutos de todas las horas de todos los dias (el símbolo * equivale a todos). Para más información podéis visitar esta página de Linux Total


En nuestro caso bastará con
0 * * * * /home/pi/ipp.sh

Guardamos y listo.

Ahora ya podremos acceder a la raspberry con putty como haciamos en local pero desde cualquier parte, solo hay que sustituir la IP local por la publica.

27 marzo 2014

Tanque de gas oxidado

La situación es la siguiente. Un tanque de gas privado en la azotea si es un grupo de viviendas o uno más pequeño de 2.500 litros por ejemplo en el jardín si es un particular, algo oxidado, sobretodo por la parte abombada del tanque.

Y un buen día aparece olor a gas, que hace que nos pongamos nerviosos. Normalmente el fallo no es en la parte oxidada, los tanques tienen un grosor considerable, tanto que muchos tanques "nuevos" son en realidad viejos a los que se les ha quitado el óxido superficial, pintado, retimbrado (es decir se les ha sometido a una prueba de resistencia) y seguramente a una radiografía de las soldadura. La fuga suele venir de alguna junta de la valvulería. Una manera rápida de comprobarlo es coger un pulverizador (como el de los limpiacristales), y llenarlo de agua y jabón para la vajilla, en una proporción 1:5 (depende del tipo de jabón por supuesto) y un día poco ventoso pulverizar en la valvulería. Si se forman burbujas ahí está la fuga.

25 marzo 2014

¿Por qué salta mi Interruptor Diferencial? (I)


Un interruptor diferencial (como el de la siguiente imagen), puede saltar por varios motivos. Por fallo mecánico del elemento o por fallo de la instalación. En cualquier caso es una anomalía. Veremos cómo intentar acotar las posibles causas, y dentro de las que estén en nuestra mano, solucionarlas (veremos que en algunas es recomendable la ayuda de un profesional).


Primero, descartaremos un fallo mecánico del dispositivo. Para hacerlo, lo mejor es bajar todos los térmicos que dependen de este diferencial e intentar rearmarlo. Si no tenemos éxito, probablemente es un fallo mecánico del dispositivo.

Si tenemos éxito la causa se debe a un desequilibrio entre la corriente que pasa por la fase y la que pasa por el neutro. Estas corrientes deben tener la misma intensidad siempre ya que de lo contrario significa que hay algunos electrones que entraron y no salieron (entre otras, pero no nos vamos a poner puristas de momento).

En este caso, vamos a ver que circuito es el que nos provoca el fallo. Para hacerlo bajamos la mitad de los térmicos, y la otra mitad los dejamos subidos. Si podemos rearmar el circuito que da problemas es uno de los que hemos dejado bajados. Evidentemente si no podemos rearmar, el circuito que da problemas pertenece a la mitad que hemos dejado subidos.

Una vez sabemos en que subgrupo está el problema repetimos la operación dejando levantados la mitad de este subgrupo y bajados la otra mitad. Así hasta que sólo nos quede un circuito que al dejarlo subido nos impida rearmar y que si lo tenemos bajado y todos los demás subidos rearma sin problema.

Ya hemos detectado el circuito, ahora hay que concretar. Para empezar debemos ver si lo que provoca la derivación es un receptor o la instalación misma de ese circuito que se ha degradado. Para hacerlo desconectamos todos los receptores de este circuito, lo cual no siempre es fácil. Por ejemplo si ese circuito son "enchufes Cocina" vamos a la cocina y desenchufamos la nevera, el microondas etc. y intentamos rearmar, si lo conseguimos vamos enchufando los receptores uno a uno hasta que salta el diferencial. El receptor que haya hecho saltar el diferencial es el que deriva. Hay que repararlo, adquirir uno nuevo, o prescindir de ese receptor.

Por contra, si no conseguimos rearmar habiendo desconectado todos los receptores (incluida la iluminación), se debe probablemente a un fallo en la instalación, que pueden ser cables pelados, tomas dañadas, etc.

Otra posibilidad es si el diferencial salta sólo a ciertas horas del día, muy probablemente se deba a humedades en algún punto. Para encontrar el problema hay que repetir el proceso lo que evidentemente, es mucho más lento bajamos la mitad esperamos un día a ver si salta... Los instaladores autorizados (los que tienen carnet). Deben tener por ley un medidor de aislamiento y pueden encontrar el problema bastante rápido.

Una vez detectado el circuito que tiene el problema de humedades, repetimos. Desconectamos todos los receptores y vemos si al cabo de un día salta. Si es así, el problema es la instalación si no, es uno de los receptores. Si el problema esta en la instalación normalmente se debe a que algo de polvo se ha acumulado en algun sitio, por la madrugada el agua del aire condensa (rocío) y humedece ese polvo que ahora es conductor, así se produce una pequeña derivación entre fase y tierra que es lo que hace saltar el diferencial. La solución pasa por limpiar la parte de la instalación (una toma, un aplique...) que da el problema. Ahora bien detectar cual es, es trabajoso sin medidor, así que en este punto habría que llamar a un profesional).

Otro caso es cuando se da cuando llueve. Aquí si que es importante acordar con un instalador que se pase un día que llueva o colocar un monitor, si no se puede demorar meses. Si lo quiere hacer uno mismo, el método es análogo al anterior.

El último caso que expondremos es aquel que salta cuando hay muchos dispositivos electrónicos conectados a la vez, si por ejemplo se desenchufan la mitad de ordenadores y este problema no se da, la causa es la pequeña derivación que provocan algunos filtros electrónicos, al sumarse todos ellos pueden hacer saltar el diferencial. La sólución pasa por dividir el circuito en dos (o los que hagan falta) y hacer pasar cada nuevo circuito por un diferencial diferente.

Espero os sea útil.

Abrir pdf interno desde una App propia

Una de las maneras más sencillas de anexar documentación a una app de manera que no tengamos que volver a formatearla, sobretodo si es de consulta puntual es hacerlo mediante un pdf.

Es decir, hacemos click en un botón tipo "leer licencia" y se nos abre el pdf con la licencia.

La solución viene por supuesto de la mano de un Content Provider, o de una de sus subclases, en concreto FileProvider, aunque tambien podemos crear nuestro propio Content provider.

Como siempre alguien ya ha hecho este trabajo por nosotros y comparto el link.

20 marzo 2014

Agregando publicidad en Apps Android

Hemos decidido monetizar algunas aplicaciones que tenemos en Google Play, para hacerlo básicamente hemos seguido las instrucciones de Cómo Empezar.

El único problema que hemos tenido ha sido al actualizar el SDK para tener la última versión disponible. Acualizar el SDK en si no supone ningún problema, pero después de hacerlo hay que actualizar el ADT, el problema es que al hacerlo mediante Help > Check for updates en Eclipse, dice que no hay actualizaciones. Si no hacemos nada más, al intentar importar un proyecto o librería (como nos pasaría posteriormente al intentar agregar la libreria de Google Play Services). Al llegar al último paso y darle al botón de finalizar. Eclipse no hace nada, y hacemos click una y otra vez y nada.

La solución vino como siempre de StackOverflow, simplemente hay que ir a Help > install new software y añadir esta url:  https://dl-ssl.google.com/android/eclipse/

A parte de este problema todo ha ido como la seda. El resumen es como sigue:
1.- Actualizamos el SDK. En Eclipse Window > SDK Manager elegimos la última API disponible (en el momento de escribir esto API19).
2.- Actualizamos el ADT. Como hemos visto Help > Check for updates, no nos ha funcionado, sin embargo Help > install new software, hemos añadido la url y probablemente la próxima vez no haya problema.

3.- Configurar el google play services SDK tal como se explica en en la web de developers.
   3.1.- Window > SDK Manager en extras encontramos google play services.
   3.2.- importamos el contenido de lo que acabamos de instalar al workspace de eclipse: File > Importar... navegamos al directorio importar (marcamos la casilla de copiar).
  3.3 si queremos un AVD para poder comprobarlo tendriamos que instalar Google APIs para API17 o superior (como eso ya lo teníamos hecho, en el paso 1, pues nada).


4.- En nuestra aplicación configuramos el target en project.properties para android-13
5.- Ponemos en el AndroidManifest.xml el atributo android:minSdkVersion a 10 (API10 que equivale a android 2.3.3).
  android:minSdkVersion="10"
  android:targetSdkVersion="19" />
6.- Añadimos el proyecto de biblioteca de servicios de Google Play y hacemos referencia a él.
   6.1.- Hacemos clic con el botón derecho en el proyecto de la aplicación en Eclipse y seleccionamos Properties (Propiedades).
   6.2.- Seleccionamos Android y, a continuación, hacemos clic en Add... (Añadir). Buscamos el proyecto google-play-services_lib y seleccionamos OK (Aceptar) para añadir la biblioteca de servicios de Google Play.
   6.3.- El proyecto ahora hace referencia a la biblioteca de servicios de Google Play

7.- Añadimos una etiqueta meta-data en Android manifest.xml  
<?xml version="1.0" encoding="utf-8"?>
<manifest   xmlns:android="http://schemas.android.com/apk/res/android"
package="com.company"
android:versionCode="1" android:versionName="1.0">
<application android:icon="@drawable/icon
android:label="@string/app_name"
android:debuggable="true">
<meta-data android:name="com.google.android.gms.version"
android:value="@integer/google_play_services_version"/>
<activity   android:label="@string/app_name" android:name="BannerExample">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
</application>
</manifest>

8.- Declaramos com.google.android.gms.ads.AdActivity en Android manifest.xml
lt;?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.company"
android:versionCode="1" android:versionName="1.0">
<application android:icon="@drawable/icon" android:label="@string/app_name"
android:debuggable="true">
<meta-data android:name="com.google.android.gms.version"
android:value="@integer/google_play_services_version"/>
<activity android:label="@string/app_name" android:name="BannerExample">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
<activity android:name="com.google.android.gms.ads.AdActivity"
android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize"/>
</application>
</manifest>

9.- Configuramos los permisos de red en Android manifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.company"
android:versionCode="1" android:versionName="1.0">
<application android:icon="@drawable/icon" android:label="@string/app_name"
android:debuggable="true">
<meta-data android:name="com.google.android.gms.version"
android:value="@integer/google_play_services_version"/>
<activity android:label="@string/app_name" android:name="BannerExample">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
<activity android:name="com.google.android.gms.ads.AdActivity"
android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize"/>
</application>
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
</manifest>

10.- Como nuestra publicidad es tipo banner seguimos las instrucciones de Banners I. Nosotros hemos optado por añadirlo en el XML.
10.1.- Añadimos el View "Adview"
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:ads="http://schemas.android.com/apk/res-auto"
android:id="@+id/LinearLayout1"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical"> 
<com.google.android.gms.ads.AdView
android:id="@+id/adView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
ads:adSize="BANNER"
ads:adUnitId="ca-app-pub-xxxxxxxxxxxxxxxxxxx" />
.
.
.
<LinearLayout>


10.2.- Modificamos la activity para buscar y cargar anuncios.

.
.
.
import com.google.android.gms.ads.*;
.
.
.
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// Buscar AdView como recurso y cargar una solicitud.
AdView adView = (AdView)findViewById(R.id.adView1);
AdRequest adRequest = new AdRequest.Builder().build();
adView.loadAd(adRequest);
.
.
.
}


11.- Deberíamos poder compilar.

12.- Hay que acordarse que si la aplicación ya estaba publicada 8como en nuestro caso). Hay que verisonarla es decir en el android manifest hay que añadir:
android:versionCode="2"
android:versionName="1.1" >


Y hasta aquí por hoy.

19 marzo 2014

Raspberry Pi Instalación de NOOBS y primeros pasos.

Hoy he instalado con éxito (y muy fácilmente) varios sistemas operativos para la raspberry pi gracias a NOOBs v1.3.

Básicamente he seguido los pasos de la web "Aquí hay apuntes" y más concretamente los videos de biblioman09

Recomiendo, ver los tres vídeos seguidos tomando apuntes y luego aplicar lo aprendido para instalar noobs en la raspberry pi. Pero ahí cada cual que haga lo que quiera.

Por si sirven a alguien, los apuntes rápidos que he tomado son los siguientes:
  • Descargar NOOBS desde la página oficial de Raspberry, en la sección de descargas.
  • Usar Gparted (en linux), para formatear la SD a fat 32.
  • Copiar los archivos descomprimidos en la raiz de la SD
  • Metemos la SD en la RaspberryPi. Que debe tener conectado un cable hdmi hacia un monitor, un teclado y un mouse, y si es posible conexión ethernet.
  • Seleccionamos los Sistemas Operativos que queramos instalar (los llamaremos OS, por Operating Systems, a partir de ahora). Y le damos a instalar.
  • Una vez acabada la instalación, reiniciamos (si no lo ha hecho el sistema de por si), y seleccionamos el sistema operativo que queramos iniciar. En mi caso Raspbian.
  • Nos aparece Raspberry Pi Software Configuration Tool, le doy a finish porque las opciones me van bien así como están.
  • Si queremos iniciar el servidor gráfico ejecutamos el comando startx.
  • reboot para reiniciar.
  • Ejecuto reebot, reinicia y deja elegir sistema operativo, pero si no elijo ninguno se ejecutará el mismo que la última vez al cabo de 10 segundos. Esto es especialmente útil si a a partir de ahora nos conectaremos de manera remota.
A partir de aquí ya entramos en la conexión remota para la linea de comandos.
  • ejecuto ifconfig (en la Raspberry) para saber la dirección ip de mi dispositivo. Configuro que la IP de la Raspberry sea siempre la misma.
  • Nos bajamos putty al PC desde su página de descargas para acceder por conexion ssh a la raspberry. 
  • Abrimos putty escribimos la dirección IP de la raspberry (que obtuvimos antes). El puerto es el 22. Si siempre tenenmos la misma IP podemos guardar esta configuración con el nombre RaspPi por ejemplo.
  • le damos a conectar.
  • El usuario por defecto: pi y el password: raspberry
  • Si queremos cambiar el password tecleamos sudo passwd
A partir de aquí la conexión remota a una interfaz gráfica:
  • Nos bajamos al PC VNC viewer.
  • Abrimos putty para conectar remotamente. Conectamos como en el aparatado anterior.
  • Una vez en la raspberry tecleamos la orden sudo apt-get update y posteriormente sudo apt-get upgrade para actualizarnos.
  • Tecleamos sudo apt-get install tightvncserver
  • Finalmente para que se ejecute el servidor VNC que acabamos de instalar tecleamos sudo tightvncserver -geometry 1920x1080 -depth 24 :1
  • Ahora abrimos el VNC viewer desde nuestro PC y introducimos la IP de nuestro dispositivo, y el puerto 5901. Si en el punto anterior hubiésemos tecleado tightvncserver -geometry 1920x1080 -depth 24 :2 (la diferencia es el 2 final), el puerto seria 5902.

Volvemos

Después de bastante sin publicar nada por aquí volvemos a las andadas. Sin embargo, seguimos con escasez de tiempo, así que las entradas serán breves y prácticamente para que me sirvan de recordatorio a mi mismo.

No se de que estilo serán las entradas ni la frecuencia que tendrán intentaré que sea al menos una semanal. En cuanto al estilo, es muy probable que sea caótico y que si hay tiempo y ganas haga alguna entrada o indice que las vaya ordenando por series, pero esto ya es especulación.