martes, 19 de noviembre de 2013

Oracle Linux 6 + Atheros AR9285

Lamentablemente el kernel de Oracle Linux 6 no tiene soporte para Atheros AR9285 (wireless), tampoco es posible recompilar los modulos de los fuentes ya que mandan un error.

Revisando en varios sitios encontre la recomendación de cambiar el kernel que carga por defecto.

Si revisamos /etc/grub.conf encontraremos otros kernels disponibles en la distribución, el kernel que recomiendo es el de titulo "Oracle Linux Server Red Hat Compatible Kernel", lo podemos mover al inicio de la lista y reiniciamos.

Iniciamos el módulo utilizando:

# modprobe ath9k

Y revisamos si esta levantada la tarjeta
# ifconfig -a

Si todavía tienes problemas recomiendo instalar kmod-compat-wireless de la siguiente manera:

# yum install http://elrepo.reloumirrors.net/elrepo/el6/x86_64/RPMS/kmod-compat-wireless-3.3-2.n.el6.elrepo.x86_64.rpm

y reiniciar.

Con esto ya deberíamos tener levantada la wireless.

viernes, 15 de noviembre de 2013

Instalar OVMM sobre un Oracle Virtual Server

Requerimientos:

Tener instalado un servidor OVM con las particiones:
/ (root) de 16GB
swap de 16GB

Pasos:

1. Crear el hostname de la aplicación

# hostname
el valor mostrado lo añadimos a nuestro archivo /etc/hosts, ya que es necesario para la instalación de OVMM
# echo "127.0.0.1   [HOSTNAME]" >> /etc/hosts

2. Añadir memoria RAM a OVS 

Modificar el archivo /boot/grub/grub.conf 
y asignar el valor de dom0_mem=2048M

3. Modificamos la versión de Oracle 

OVMM necesita una versión de Oracle Linux superior a la de OVS, por tanto es necesario modificar la versión de linux e instalar algunos paquetes adicionales necesarios
# echo "RedHat Enterprise Linux Server release 5.5 (Tikanga)" > /etc/redhat-release 
# cd /etc/yum.repos.d/
# wget http://public-yum.oracle.com/public-yum-e15.repo
# yum list
# yum install xz-devel
# yum install zip 


4. Instalamos OVMM

El proceso es sencillo, en mi caso lo hice desde un DVD.

# mkdir /mnt/dvd
# mount /dev/dvd /mnt/dvd
# cd /mnt/dvd
# ./createOracle.sh
# ./runInstaller.sh 

Listo!!


miércoles, 18 de septiembre de 2013

Android: Generar R.java manualmente

Me encontré recientemente con el error de  que no se genera el archivo R.java. Revisando algunos portales logre llegar a la solución con este pequeño script.

PATH_ANDROID=programs/android-studio/sdk/build-tools/android-4.2.2
PATH_MANIFEST=workspaces/DefaultWorkspace/MyApp/AndroidManifest.xml
PATH_RESOURCE=workspaces/DefaultWorkspace/MyApp/res
PATH_LIBS=workspaces/DefaultWorkspace/MyApp/libs
PATH_GENERATE=workspaces/DefaultWorkspace/MyApp/gen

$PATH_ANDROID/aapt package --non-constant-id -f -m \
-M $PATH_MANIFEST \
-S $PATH_RESOURCE \
-I $PATH_LIBS \
-J $PATH_GENERATE --generate-dependencies


El script esta basado en rutas que crea Eclipse, si usas otro IDE puedes cambiar las rutas a las que se ajusten a tu IDE.

Suerte.

(Para hacerlo en Eclipse de forma visual, botón derecho sobre el proyecto -> Android Tools -> Fix project properties)

miércoles, 4 de septiembre de 2013

Android: Compartir en redes sociales especificas

En el post anterior pudimos compartir en redes sociales, en esta ocación vamos a compartir en redes especificas, como "sólo en facebook" o "sólo por correo", para esto creamos en nuestro Activity el siguiente método:

void shareSpecificSocialNetwork(String nameApp, String title,
            String extraTitle, String filename) {
        try {
            List targetedShareIntents = new ArrayList();
            Intent share = new Intent(android.content.Intent.ACTION_SEND);
            share.setType("image/jpeg");
            List resInfo = getPackageManager()
                    .queryIntentActivities(share, 0);
            if (!resInfo.isEmpty()) {
                for (ResolveInfo info : resInfo) {
                    Intent targetedShare = new Intent(
                            android.content.Intent.ACTION_SEND);
                    targetedShare.setType("image/jpeg");
                    if (info.activityInfo.packageName.toLowerCase().contains(
                            nameApp)
                            || info.activityInfo.name.toLowerCase().contains(
                                    nameApp)) {
                        targetedShare.putExtra(Intent.EXTRA_SUBJECT,
                                "Sample Photo");
                        targetedShare.putExtra(Intent.EXTRA_TEXT, extraTitle);
                        targetedShare.putExtra(Intent.EXTRA_STREAM,
                                Uri.fromFile(new File(filename)));
                        targetedShare.setPackage(info.activityInfo.packageName);
                        targetedShareIntents.add(targetedShare);
                    }
                }
                Intent chooserIntent = Intent.createChooser(
                        targetedShareIntents.remove(0), title);
                chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS,
                        targetedShareIntents.toArray(new Parcelable[] {}));
                startActivity(chooserIntent);
            }
        } catch (Exception e) {
            Log.v("PensandoEnBinario", e.getMessage());
        }
    }


Igual que el anterior blog deberíamos crear un botón que ejecute el evento de compartir en facebook:

Button btnFacebook = (Button) dialog
                        .findViewById(R.id.dialogButtonFacebook);
                btnFacebook.setOnClickListener(new OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        shareSpecificSocialNetwork("facebook","PensandoEnBinario",
                                 "Powered by PensandoEnBinario",inputFilename);
                    }
                });


Listo podemos probar con: facebook, twitter, mail, instagram, etc.


Android: Compartir en redes sociales

En esta ocasión vamos a compartir texto e imágenes en las distintas redes sociales, para esto vamos a añadir a nuestro Activity el siguiente método

public void shareSocialNetwork(String title, String extraTitle,
            String filename) {
        Intent share = new Intent(Intent.ACTION_SEND);
        share.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);
        share.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(new File(filename)));
        share.putExtra(Intent.EXTRA_TITLE, extraTitle);
        share.putExtra(Intent.EXTRA_SUBJECT, extraTitle);
        share.setType("image/png");
        startActivity(Intent.createChooser(share, title));
    }


Este método es el encargado de mostrar el dialogo para la selección de redes sociales y los valores por defecto a compartir.

Para ejecutarlo creamos un botón con id btnShare al cual le asignaremos el evento:

ImageButton btnShare = (ImageButton) findViewById(R.id.btnShare);
        btnShare.setOnClickListener(new OnClickListener() {
            public void onClick(View v) {

               shareSocialNetwork("
PensandoEnBinario",
             "Powered by PensandoEnBinario",inputFilename); //inputFilename es una imagen (uri) para compartir
}
});


Listo, ya tenemos un botón que permite compartir en las redes sociales.

Android FullScreen Activity

Muchas aplicaciones móviles requieren mostrarse en FullScreen, para esto tenemos dos posibilidades

Fullscreen en toda la aplicación:

Es necesario editar el archivo :
AndroidManifest.xml
Y en la sección application se añade el parametro:
android:theme="@android:style/Theme.NoTitleBar.Fullscreen"

Fullscreen en pantallas especificas:

Es necesario en el método: onCreate
añadir las siguientes líneas (después de super.onCreate(savedInstanceState)):

 requestWindowFeature(Window.FEATURE_NO_TITLE);
 getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
 WindowManager.LayoutParams.FLAG_FULLSCREEN);


Listo!!

lunes, 26 de agosto de 2013

Linux + Android SDK + Célular Android (USB Drivers)

El presente es un tutorial para conectar Android SDK con los célulares Android de distintos fabricantes.

Lo primero que tenemos que hacer es detectar es el fabricante de nuestro célular. Para eso conectamos por USB el célular a la PC y ejecutamos

#lsusb

Tendremos una lista con los distintos puertos USB y el fabricante del dispositivo conectado.

El fabricante de mi dispositivo (célular) es el siguiente:

Bus 005 Device 006: ID 0fce:6193 Sony Ericsson Mobile Communications AB

Si todavía no encuentran el suyo pueden probar ejecutando "lsusb" con y sin conectar por USB el célular. El que se añadede en la lista será el de su célular.

Uno de los parametros de la línea extraida es el Id del fabricante, a continuación lo marcamos de rojo:

Bus 005 Device 006: ID 0fce:6193 Sony Ericsson Mobile Communications AB 

Luego de que tenemos detectado el Id del fabricante tendremos que editar o crear el archivo (como usuario root):
#/etc/udev/rules.d/51-android.rules

En este archivo añadimos la siguiente línea
SUBSYSTEM=="usb", ATTR{idVendor}=="0fce", MODE="0666", GROUP="plugdev" 

Noten que el Id del fabricante esta marcado de rojo. Este es el valor de nuestro fabricante de dispositivo (Célular)

Nos queda darle permisos al archivo:
#chmod a+r /etc/udev/rules.d/51-android.rules

Desconectamos y conectamos el USB de conexión al célular y probamos con la herramienta del SDK Android (sdk/platform-tools)
#adb devices
List of devices attached
BX903H993B    device


Listo hemos logrado la conexión de nuestro Android SDK con nuestro dispositivo android y podemos comenzar a desarrollar.

lunes, 8 de julio de 2013

Apache 2.4 añadir VirtualHost para Zend Framework 2

La versión de ZF2 trae por defecto una configuración para levantar un VirtualHost en Apache. Pero esta configuración no funciona correctamente en Apache 2.4.

A continuación adjunto la configuración correcta para Apache 2.4, espero les sea útil.


<VirtualHost *:80>
  ServerName "local.mipagina.com"
  DocumentRoot "/home/webmaster/local.mipagina.com/public"
  SetEnv APPLICATION_ENV "development"
  ErrorLog "/var/log/httpd/local.mipagina.com.err"
  <Directory "/home/webmaster/local.mipagina.com/public">
    DirectoryIndex index.php
    Options Indexes FollowSymLinks
    AllowOverride All
    Allow from All
    require all granted
  </Directory>
</VirtualHost> 


Probado en Slackware 14

viernes, 25 de enero de 2013

PHP - capturar el IP del cliente

Adjunto un script muy necesario para poder extraer el IP del cliente, que incluye validaciones de red interna, host local y redirecciones:
function getIp()
    {
        if (isset($_SERVER['HTTP_X_FORWARDED_FOR']) 
     AND $_SERVER['HTTP_X_FORWARDED_FOR'] 
     AND (!isset($_SERVER['REMOTE_ADDR']) 
     OR preg_match('/^127\..*/i', trim($_SERVER['REMOTE_ADDR'])) 
     OR preg_match('/^172\.16.*/i', trim($_SERVER['REMOTE_ADDR'])) 
     OR preg_match('/^192\.168\.*/i', trim($_SERVER['REMOTE_ADDR'])) 
     OR preg_match('/^10\..*/i', trim($_SERVER['REMOTE_ADDR'])))) {
                $ips = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']);
                return $ips[0];
        }
        return $_SERVER['REMOTE_ADDR'];
    }

Configure Grafana and Slack

To configure Grafana to send alerts to Slack, you need to set up a notification channel in Grafana and configure it to use the Slack integra...