Mostrando entradas con la etiqueta informática. Mostrar todas las entradas
Mostrando entradas con la etiqueta informática. Mostrar todas las entradas

03 febrero 2016

Diario (V)

Me encuentro de nuevo desarrollando aplicaciones android. Después de tanto tiempo sin desarrollar y tenerlo digamos por mano, ha habido algunos problemas.

Para empezar al importar un proyecto desde eclipse al no estar codificado como UTF-8 y android studio si, me han aparecido errores de codificación es decir, letras acentuadas aparecían como un rombo y un interrogante. He abierto cada uno de los archivos .java con el notepad++ y en el menú codificación he hecho click en convertir a UTF-8 sin BOM.

El siguiente problema ha sido que no me reconocía el dispositivo, lo cual es normal ya que le había restaurado la configuración de fábrica. Así que he tenido que ir a:
Ajustes, información del teléfono, hacer click unas 8 veces encima de numero de compilación para que me aparezcan las opciones de desarrollo (están ocultas por defecto) y ahí dentro activar que permita la depuración USB.

Ahora el problema es que Android Studio reconoce el teléfono pero dice que es API-1 cuando debería ser API-19. Lo he arreglado reseteando el adb, y aceptando la ventana emergente que aparece en el teléfono.
Para resetear el adb he ido a Android Device monitor, ahí he ido a view menu,y le he dado a reset adb. No se cual de las dos ha hecho que funcione, pero funciona.

Finalmente para exportar el apk he seguido las instrucciones de este vídeo, que básicamente es ir a view, tool windows, build variants, elegir release. Ir luego a build.gradle cambiar minifyEnabled de false a true (en el video aparece runProguard, pero Android Studio 1.0 lo dejo como deprecated, darle a sync. Luego build, generate signed apk y listo ya la tenemos en el arbol. Botón derecho show in explorer y listo.

Y hasta aquí por hoy.

26 enero 2016

Diario (IV)

Bueno, resulta que el problema parece venir del comando utilizado para ejecutar el script, en vez de
0/30 * * * * /home/pi/ipp.sh
Lo he cambiado a: */30 * * * * . /home/pi/ipp.sh
Ahora todo funciona perfectamente. Si voy a mejorar el script creo que entre las posibilidades podría:

  • detectar cuando icanhazip no me devuelve ninguna IP para que no lo interprete como un cambio y no me guarde ese registro, o mejor, espere 1 minuto y lo vuelva a intentar.
  • Programar el cron para que por la noche no pregunte que IP tiene.
  • Preguntar que IP tengo a mi servidor, en lugar de a icanhazip, así evito intermediarios.

23 enero 2016

Diario (III)

Para acabar con el script de la anterior entrada, vamos a programar su ejecución en cron. Para hacerlo, primero modificamos los permisos.
chmod u+x ipp.sh
luego ejecutamos el editor de crontab
crontab -e
Dentro del editor programamos la siguiente tarea, para que cada media hora se ejecute cada media hora
0/30 * * * * /home/pi/ipp.sh
Parece que no funciona, más adelante comprobaré a que se puede deber el error.

19 enero 2016

Diario (II)

Continuamos, al final después de varias pruebas y lecturas (muy útil el siguiente enlace para el tema ssh-keys [en español] [en ingles]). He decidido utilizar ssh sin passphrase y un usuario nuevo que no tenga permisos para ejecutar comandos como root (los famosos sudoers). Este usuario nuevo lo llamare por ejemplo oficina_palma. Vamos al tema. Lo primero será crear el usuario en la Raspberry que me hará de servidor: adduser oficina_palma Introducimos la contraseña que queramos y luego dejamos por defecto todas las opciones que nos van apareciendo. Ahora en la raspberry cliente generamos un par de claves:
ssh-keygen -t rsa -C "Oficina Palma"
Cuando nos pregunte por la passphrase lo dejamos vacío, lo mismo que para el nombre de archivo y ubicación predeterminados. Llegados aquí se han creado los archivos id_rsa e id_rsa.pub. El segundo es la clave publica que copiaré en el servidor. Para hacerlo:
scp ~/.ssh/id_rsa.pub oficina_palma@xxx.xxx.xxx.xxx:
Donde xxx.xxx.xxx.xxx es la dirección ip del servidor. Ojo con los dos puntos finales.
Ahora accedemos al servidor vía ssh con el usuario recién creado:
ssh oficina_palma@xxx.xxx.xxx.xxx
El archivo de claves publicas estará en nuestra home. Lo movemos al directorio oculto .ssh, creamos el archivo authorized_keys al que añadimos las líneas correspondientes a la clave pública. Y luego cambiamos los permisos.
mkdir ~/.ssh
cat ~/id_rsa.pub >> ~/.ssh/authorized_keys
rm ~/id_rsa.pub
chmod 600 ~/.ssh/authorized_keys
chmod go-w ~/.ssh

Para acabar creo un directorio en la carpeta www llamado oficina_palma que es donde subiré todos los archivos que me interesan. Para hacerlo, escribo en el servidor:
sudo mkdir /var/www/oficina_palma
sudo chown -R oficina_palma:oficina_palma /var/www/oficina_palma/

Y listo, ya podemos seguir con nuestro script. Al que solamente añado la ultima linea para hacer una copia en nuestro servidor del texto con la IP, quedaría así:
#!/bin/bash
# Este archivo lo llamamos ipp.sh
actualIP=$(curl -s icanhazip.com)
sleep 30
ultimaLinea=$(tail -n 1 ipp.txt)
ultimaIP=$(expr match "$ultimaLinea" '.*ipp \(.*\)')
if [ "$actualIP" != "$ultimaIP" ];
    then
       echo $(date) "ipp" $a >> ipp.txt
       scp ipp.txt oficina_palma@xxx.xxx.xxx.xxx:/var/www/oficina_palma
fi

Continuamos en otro momento.

Diario (I)

Voy a intentar crear un servidor de paginas web desde la raspberry pi. Tengo una ip estática lo que facilitará bastante el tema. Si consigo que todo vaya ok, luego intentaré hacerlo con ip dinámica. Si no estoy equivocado, ya instalé un servidor apache en la raspberry. Lo compruebo introduciendo la ip local de la misma en el navegador web. Todo ok. De todas formas si lo quisiera instalar de nuevo sólo debo seguir estas instrucciones Compruebo también si tomcat esta instalado. No lo está, de momento no lo necesito. Como hace bastante que no usaba esta raspberry, voy a actualizar el sistema con los clásicos:
sudo apt-get update sudo apt-get upgrade
Mientras la raspberry trabaja, voy mirando documentación de apache. Lo básico que hay que saber es que el directorio por defecto es en /var/www ( en la documentación de raspberry explica que en las nuevas versiones es una diferente, habrá que acordarse de esto en el futuro.
He copiado algunos archivos a un subdirectorio de /var/www lo he llamado web. Voy a 192.168.1.XXX/web. Todo ha funcionado perfectamente.
Llegados a este punto me gustaría que una raspberry que tengo en otro sitio me enviase algunos datos con cierta periodicidad, entre ellos y el más importante la última dirección IP pública ya que es dinámica y no puedo crear un tunel con ella salvo que lo sepa, lo cual me obliga a estar enviando whatsapps cada vez que necesito algo.
Voy a modificar un poco el código que escribí en la entrada Cómo acceder a un Linux desde internet. El código definitivo es:
#!/bin/bash
# Este archivo lo llamamos ipp.sh

# curl es un comando para cargar el código de una páguina web, -s es para el el silent mode (aunque no aprecio diferencia entre una y otra, tal vez debería leer la documentación (otro dia)). La web icanhazip nos devuelve nuestra ip publica. Lo guardo en la variable actualIP.
actualIP=$(curl -s icanhazip.com)

# detengo el script 30 segundos para dar tiempo a que se cargue
sleep 30

# guardo la ultima línea del archivo ipp.txt (si en vez de 1 hubiese puesto 2 hubiese guardado las dos ultimas lineas)
ultimaLinea=$(tail -n 1 ipp.txt)

# entre las comillas simples esta la siguiente expresión regular .*ipp \(.*\) la cual significa . --> cualquier carácter; * --> repetido 0 o más veces; ipp --> literalmente ipp y un espacio; \( --> la barra invertida es para escapar el paréntesis ya que es un carácter reservado de bash, los paréntesis es para capturar ese grupo, es decir que el comando expr devolverá lo que hay entre paréntesis, que es .* --> cualquier caracter aparecido 0 o más veces.
ultimaIP=$(expr match "$ultimaLinea" '.*ipp \(.*\)')

#comparamos las dos variables, si son diferentes actuamos.
if [ "$actualIP" != "$ultimaIP" ];
then
#lo primero es añadir una linea al fichero ipp.txt con la siguiente estructura, la fecha, la cadena ipp y luego la ip.
echo $(date) "ipp" $a >&gt ipp.txt
#lo siguiente es enviar el archivo por scp a la otra direccion ip, la que nos hace de servidor. Otra opcion que se me ocurre es crear un servidor php en la ip estatica y enviarle los datos mediante post.

Hasta aquí por hoy, no puedo dedicarle más tiempo. Continuo otro día, al final del cual dejaré el código pelado para usar.

09 abril 2014

Chuletas de Bash (II)

Esta es una serie que me sirve de guía para acrodarme de las cuatro cosas básicas de bash. Es caótico y desordenado, pero a mi me va bien. Lo publico por si a alguien le resulta de utilidad.

Si no sigues la serie del principio te recomiendo que lo hagas, es caótica, pero no tanto. A los que seais informáticos puristas tal vez os duela a la vista algo que haga o diga, pero lo que digo siempre, soy industrial... es lo que hay Dicho esto sólo advertir que en este segundo capitulo iré más al grano, si algo no se entiende, ponedlo en comentarios que para eso están y si eso ya hacemos cambios. Bueno al tema.

Vimos como crear variables y expandirlas. Ahora vamos a ver unos cuantos especiales.

$0 nos devuelve el path
$1 nos daria el primer argumento
$2 el segundo, $3 el tercero...
$# nos da el número de argumentos
$@ todos los argumentos


Vamos a hacer un sencillo script, al que llamaremos script02.sh:

#!/bin/bash
echo ""
echo "* Script full command: " $0
echo "* Script first argument: " $1
echo "* Script second argument: " $2
echo "* ..."
echo "* Script number of arguments: " $#
echo "* Script all arguments: " $@
echo ""


Cambiamos los permisos (ver entrada anterior). Y ejecutamos
~$ ./script02.sh escriboCualquierCosa 1237721

Obtenemos:
* Script full command:  ./script02.sh
* Script first argument:  escriboCualquierCosa
* Script second argument:  1237721
* ...
* Script number of arguments:  2
* Script all arguments:  escriboCualquierCosa 1237721


Y esto es todo por hoy.

03 abril 2014

Chuletas de Bash (I)

Si algo no se entiende ya me preguntáis en los comentarios.

Nota cuando escriba un comando en la terminal lo precederé del prompt siguiente ~$, en MSDOS era el famoso C:\> pero evidentemente el promt no forma parte de la orden, no hay que escribirlo.

Todos los scripts de bash empiezan por:
#!/bin/bash
Esto indica donde debe ir a buscar el script el interprete de comandos.

La primera comando que se debe aprender es echo. echo imprime lo que venga detras por la pantalla. es decir si escribimos en la terminal:
~$ echo "ei, ¿cómo va eso?"
Obtendré:
ei, ¿cómo va eso?

Los comentarios en los scripts se ponen con una almohadilla #. Por ejemplo:
# Esto es un comentario

Las variables son como unos contenedores que guardan "cosas". Para expandir la variable (acceder a su contenido) hay que poner el símbolo $ (que no tiene nada que ver con el prompt, casualidades de la vida). por ejemplo:
a=1 --> guarda el valor 1 en la variable a.
b=2 --> ídem con el valor 2 en la variable b.
echo "La variable a vale:" $a --> nos devuelve La variable a vale: 1
c=$a+$b --> No nos devuelve 3 nos devuelve 1+2. Luego veremos por qué.

Vamos a hacer el primer script. Lo vamos a llamar script01.sh:
#!/bin/bash
a=1
echo "a vale" $a

Guardamos. Si ahora ejecutamos el comando:
~$ ls -l 
veremos algo como:
-rw-r--r-- 1 user01 groupA 1 35 Apr 3 11:57 script01.sh
Vamos a fijarnos en la información por partes -rw-r--r-- ,son 10 caracteres, del primero nos vamos a olvidar de momento. los 3 (rw-)siguientes corresponden al usuario y significa que el usuario que ha creado el archivo (user01, en nuestro caso) tiene ciertos permisos el primero es la r de read (lectura), el segundo es w de write escritura, el tercero es un guión que significa que no tiene permiso para ejecutarlo. Los tres siguientes digitos corresponden al grupo que solo tiene permiso de lectura y los tres últimos son para todo el resto de usuarios.

Como nosotros queremos ejecutar el scrip debemos añadir el permiso de ejecución. Lo haremos mediante el comando chmod (que deberemos ejecutar con permisos de administrador, así que ira precedido por sudo), con el mode u+x esto quiere decir algo como "usuario añadimos ejecucion" :
~$ sudo chmod u+x script01.sh

Si ahora ejecutamos el comando:
~$ ls -l 
veremos algo como:
-rwxr--r-- 1 user01 groupA 1 35 Apr 3 11:57 script01.sh

Ahora ya podemos ejecutar el script:
~$ ./script.sh

Obtendremos:
a vale: 1

Vaya, me ha quedado una entrada algo más larga de lo que quería la próxima será mas condensada.  y presupondrá ciertos conocimientos, si alguien no sabe alguna cosa ya dejará algún comentario.


Chuletas de bash (Introducción)

Siguiendo el nuevo estilo algo caótico de este blog. Me propongo ir haciendo minientradas o no tan mini de apuntes rápidos de bash.

Para quien no lo sepa Bash es un interprete de comandos, http://es.wikipedia.org/wiki/Bash. Y si dicho así puede parecer poca cosa, sin embargo la cantidad de cosas que nos permite hacer (algunas con la ayuda de programas para la terminal), es increíble.

La idea de estas chuletas es para la programación de scripts en bash. Y antes de nada he de decir que no soy informático. Sólo ingeniero industrial, por lo tanto si digo algo que no sea exacto, puro o lo que sea y alguien siente que su calma interior se destruye, que respire profundamente y cambie de blog. Avisados quedáis.

Conectar un dominio a un hosting

Supongamos que tenemos un dominio que acabamos de comprar en GoDaddy www.godaddy.com (por ejem y queremos unirlo con nuestro hosting por ejemplo www.hostinger.es.
Para hacerlo:
  • debemos ir a hostinguer y decirle que queremos un nuevo hosting, pero que en vez de un subdominio suyo, tenemos el nuestro propio.




    • Después vamos a Godaddy a dominios, todos los dominios, elegimos el que toque. Y una vez dentro le damos a administrar en el apartado de Servidores de Nombres (DNS, por su nombre en ingles).


    • Cambiamos los DNS por los que nos proporcione el hosting. En el caso de hostinguer se encuentran en cuenta --> detalles, y son: ns1.hostinger.es y ns2.hostinguer.es.
    • En 24 horas máximo ya tendremos el cambio realizado. A mi me ha tardado menos de una hora, pero ya se sabe...

    01 abril 2014

    Copiar y pegar en nano (editor de textos para Linux)

    Una para newbies. Si usáis el editor de textos nano en linux, veréis que hacer copy-paste no es tan evidente como por ejemplo cortar y pegar. De todas formas vamos a repasar las tres.

    • Cortar se hace con Ctrl+K
    • Copiar Alt+6
    • Pegar Ctrl+U


    La ayuda es Ctrl+G, donde están todas las combinaciones de acceso rápido.

    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.

    25 marzo 2014

    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.

    08 marzo 2008

    ¿A que no adivinas que número estoy pensando?

    Foto de MetalPhoeniX bajo una licencia Creative Commons
    Mi novia y yo estábamos jugando con los sobrinos a adivinar que número estaba pensando la otra persona. Para los que no hayan jugado nunca se trata de que A diga un número y si no acierta B le dice si el número pensado es mayor o menor.

    Jugábamos con números del 1 al 10 o si queríamos que la partida se alargase del 1 al 100, en este último caso acababan usando un montón de intentos (incluso repetían números que no se acordaban que habían dicho). En eso que les aseguré que era capaz de adivinar cualquier número del 1 al 10.000 en 20 intentos máximo. La primera vez lo hice en 12 cosa que atribuyeron a la suerte, la segunda en 14 (creo)... jajaja, bueno los niños son un publico fácil, al menos en esto.

    El método no es muy difícil, es ir reduciendo el número de candidatos a la mitad cada vez. Por ejemplo
    -5.000
    -menos
    -2.500
    -menos
    -1.250
    -mas
    (etc)

    Lo que no es tan inmediato es saber cuantos intentos se necesitan de antemano como máximo. Para calcular el numero de intentos se hace el logaritmo base 2 del número de candidatos. De esta manera el número de intentos necesarios en nuestro caso es log210.000 = 13,29 intentos. Para hacerlo de cabeza contáis el número de ceros (4 en nuestro caso) y lo multiplicáis por 3, os quedará un número aproximado a la baja. Por ejemplo si el rango es de 1 a 1.000.000 es aprox 6x3=18 (en realidad 20).

    Todo esto se utiliza bastante en programación en búsquedas en listas ordenadas. En realidad la mayoría de nosotros lo ha hecho, porque de las miles de personas que aparecen en la guía telefónica apenas tardamos 1 minuto en dar con el que buscamos, o con las miles de entradas que tiene un diccionario. Pensemos como lo hacemos, buscamos la palabra "pereza" abrimos el diccionario por un poco más de la mitad, nos aparece "muerte" como "muerte" va antes que pereza nos olvidamos de todas las palabras que hay antes de muerte (acabamos de reducir la búsqueda a la mitad), ahora buscamos en la mitad de las páginas que nos quedan, aparece "pardo" (uy, ya casi estamos) etc. Si nos fijamos lo que hacemos es ir acotando la búsqueda, no haciendo una exhaustiva.

    Pero sólo lo podemos hacer con listas ordenadas. Si el diccionario no siguiese ningún orden preestablecido (o no lo conociésemos nosotros), estaríamos obligados a hacer una búsqueda exhaustiva, es decir, ir mirando una por una todas las palabras. ¿Como se busca en un diccionario chino? jejeje

    15 febrero 2007

    Vuelta al antiguo look


    He vuelto al antiguo look porque las visitas han caido en picado, y creo que se puede deber a que la página tarda demasiado en cargar. Así que voy a tomar un paquete de medidas que son:

    • Vuelta a la antigua plantilla
    • Espaciado de entradas con videos de youtube
    • Traslado de entradas antiguas de la página raíz al archivo



    Por cierto si alguien quiere evaluar el tamaño de su página web puede hacerlo desde:
    http://www.websiteoptimization.com/services/analyze

    14 febrero 2007

    Propuestas a Proximo


    He pensado que si alguno quiere hacer propuestas a este blog puede hacerlo dejando un comentario en esta entrada. Puede ser lo que sea, preguntas de dudas que se tengan, sugerencias para entradas etc.

    12 febrero 2007

    Dividir archivos en ubuntu (linux)


    Supongamos que tenemos un archivo demasiado grande y que para que quepa en algo más pequeño tenemos que dividirlo. En Windows eso se hace con el WinRar o con el hacha. En Ubuntu no hace falta instalar nada.

    Para explicarlo pongo un ejemplo. Imaginemos que tenemos El Señor de los Anillos (ESDLA.avi) versión extendida en el disco duro y nos ocupa 1,5 Gigas y tenemos un pendrive de 1 giga y un reproductor mp3 de 500megas, nos interesaria separarlo en tres archivos de 500 megas cada uno. Para hacerlo escribimos:

    $ split ESDLA.avi -b500m el_señor.

    -b500m indica el tamaño que tendrán los archivos, podemos expresarlo en bytes en k, m... Por ejemplo -b100k haría bloques de 100k.

    Si ahora miramos como ha quedado veremos que tenemos tres archivos:
    el_señor.aa el_señor.ab el_señor.ac

    Lo transportamos donde nos interese y para volver a juntarlos simplemente escribimos:
    $ cat el_señor.* > ESDLA.avi

    Para juntarlo en windows vamos a la ventana del DOS y escribimos:
    c:\> el_señor.aa+el_señor.ab+el_señor.ac ESDLA.avi

    05 febrero 2007

    Partimage muy útil

    Partimage es un programa que permite hacer imagenes de nuestro disco duro. Esto es muy muy muy útil. Por ejemplo supongamos que instalamos en una partición Windows, una vez reconocido todo el hardware, y configurado todo lo que hay que configurar, instalamos los dirvers (targeta gráfica, etc.) luego por supuesto instalamos el office, y el acrobat writer para hacer los pdf necesarios. El emule, el descompresor que queramos (winZip, o similares), el Nero y mil cosas más en total son más de 10 horas de curro sólo en instalar lo esencial.

    Bien pero por causas que no nos entetendremos a explicar. Hay que formatear el disco duro algunas veces. Y otra vez a instalar.

    Pero una vez hecha la instalación de lo básico y comprobada su "estabilidad" decidimos que ese es el punto de partida del que siempre acabamos partiendo. Así que nos gustaria guardar como una copia entera del disco duro con todo instalado ya windows office etc.

    Bueno pues eso se puede hacer con el Partimage os dejo aquí el link con las instrucciones

    17 enero 2007

    ¡¡gtalk y MSN messenger unidos!!

    Si algunos teneis cuenta de gmail ya conocereis gtalk, muy útil en verdad porque permite almacenar tus conversaciones y luego hacer busquedas lo que permite encontrar mensages antiguos en los que se dijo algo importante. Y no sólo eso sino que es más seguro.

    Sin embargo no hay que olvidar que hay mucha gente que sigue usando el messenger, que además en el tema estetico está bastante más puesto.

    Hay un programa que lo simplifica todo, se trata del Gaim, existe versión en windows y Linux. Podeis ver como se configura para gtalk aquí para configurarlo para messenger es aún más fácil sólo hay que poner el protocolo en MSN, la cuenta de correo hotmail y listo.

    En realidad también podríamos hacerlo creando una pasarela, pero como eso es un poquito más complicado y además sobrecarga a los servidores bla bla bla, y esto tira bien (además que es la opción más recomendada) pues ya está