Archivo etiqueta Programación

Cómo agregar Apache HTTP Client en Android Studio

Android Studio - Apache HTTP Client

Para usar en Eclipse las librerías de Apache HTTP Client (httpclient y httpmime) simplemente bajaba el port para Android y luego incluía las dependencias especificando los archivos jar: /home/lgallard//Android/libs/httpcore-4.3.2.jar /home/lgallard//Android/libs/httpmime-4.3.5.jar Esta práctica la arrastré al migrar mis proyectos a Android Studio, pero el resto de las librerías si las resolvía con Gradle. Entonces para uniformizar todo, decidí investigar un poco cómo incluir las librerías de Apache HTTP Client. Basta con agregar las siguientes líneas en el archivo build.gradle de tu aplicación:


apply plugin: 'com.android.application'

android {

    dependencies {
        compile group: 'org.apache.httpcomponents' , name: 'httpclient-android' , version: '4.3.5.1'
        compile (group: 'org.apache.httpcomponents' , name: 'httpmime' , version: '4.3.5') {
        exclude module: 'org.apache.httpcomponents:httpclient'}
    }

    android {
        useLibrary 'org.apache.http.legacy'
    }

}

Finalmente sincroniza gradle y compila nuevamente tu proyecto.

Referencia: Apache HttpClient Android (Gradle)

 


,

16 Comentarios

De vuelta…

El Blog de Luis está de vuelta después de un pausa de varios meses, y gracias a la ayuda de una amiga que me está proporcionando el hosting del blog. Varias personas me preguntaron o pidieron información que solo conseguían en mi blog, por lo que decidí reactivarlo nuevamente.

Espero les sirva de ayuda, aprendan algo nuevo o sea una vía para intercambiar información.

¡Disfrútenlo!

, , ,

2 Comentarios

Mi primera aplicación en Android: BatteryReporter

batteryreporter

Desde hace un tiempo estaba con la idea de aprender a desarrollar aplicaciones para Android, y en lo que vi que ofertaron un curso en Coursera de desarrollo de aplicaciones Android vi la oportunidad para hacerlo. Debo confesar que no es “copiar y pegar” (aunque se consigue códigos de ejemplos) y que se debe aprender nuevos conceptos, ya que aun y cuando hayas programado con anterioridad (incluso en Java) ahora debes aprender cómo se hace “a lo Android”.

Después de seguir los vídeos, leer y leer, ya hice mi primera aplicación en Android, que de hecho es parte de una asignación que exigen en el curso. Es una aplicación sencilla que lee el estado de la batería del dispositivo, y reporta si se está cargando así como el porcentaje de carga del mismo.

Para el que quiera probar mi primera aplicación, o simplemente echar una mirada al código por si quiere aprender, aquí dejo el archivo apk y el código del mismo.

El código (MainActivity.java)

Aquí les dejo el código java de la aplicación:

package com.lgallardo.batteryreporter;
import android.os.BatteryManager;
import android.os.Bundle;
import android.app.Activity;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.res.Resources;
import android.view.Menu;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;
public class MainActivity extends Activity {
@Override
 protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 setContentView(R.layout.activity_main);
 }
@Override
 public boolean onCreateOptionsMenu(Menu menu) {
 // Inflate the menu; this adds items to the action bar if it is present.
 getMenuInflater().inflate(R.menu.main, menu);
 return true;
 }
public void getStatus(View view) {
TextView statusValueTextView, chargingValueTextView, levelValueTextView;
 ImageView iconImageView;

 String charging = "";
int level, scale;
 float batteryPct;
// Get resources reference
 Resources res = getResources();
// Get values TextViews
 statusValueTextView = (TextView) findViewById(R.id.statusValue);
 chargingValueTextView = (TextView) findViewById(R.id.chargingValue);
 levelValueTextView = (TextView) findViewById(R.id.levelValue);

 // Get ImageView (icon)

 iconImageView = (ImageView) findViewById(R.id.imageView1);

 // Get battery's status
 IntentFilter ifilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
 Intent batteryStatus = registerReceiver(null, ifilter);
// Check if the battery is charging or is charged?
 int status = batteryStatus.getIntExtra(BatteryManager.EXTRA_STATUS, -1);
 boolean isCharging = status == BatteryManager.BATTERY_STATUS_CHARGING
 || status == BatteryManager.BATTERY_STATUS_FULL;
// Update UI status
 statusValueTextView.setText(Integer.toString(status));
// Update UI charging
 if (isCharging) {
 charging = res.getString(R.string.yes);
// Get charging method
 int chargePlug = batteryStatus.getIntExtra(
 BatteryManager.EXTRA_PLUGGED, -1);
 boolean usbCharge = chargePlug == BatteryManager.BATTERY_PLUGGED_USB;
 // boolean acCharge = chargePlug ==
 // BatteryManager.BATTERY_PLUGGED_AC;
if (usbCharge) {
 charging = charging + " " + res.getString(R.string.usb);
 } else {
 charging = charging + " " + res.getString(R.string.ac);
 }

 iconImageView.setImageResource(R.drawable.charging);
 } else {
 charging = res.getString(R.string.no);
 iconImageView.setImageResource(R.drawable.discharging);
 }
chargingValueTextView.setText(charging);
// Update UI level
 level = batteryStatus.getIntExtra(BatteryManager.EXTRA_LEVEL, -1);
 scale = batteryStatus.getIntExtra(BatteryManager.EXTRA_SCALE, -1);
 batteryPct = 100 * level / (float) scale;
levelValueTextView.setText(Float.toString(batteryPct)+"%");
}
}

,

2 Comentarios

Reparar tablas de MySQL

MySQL fix

Si por alguna razón se llegan a encontrar con un mensaje como el siguiente al consultar una tabla:

mysql> select * from data_values_queued;
ERROR 1194 (HY000): Table 'data_values_queued' is marked as crashed and should be repaired

La forma de ver y reparar el problema es la siguiente.

CHECK TABLE

Primero se procede a verificar la tabla, para determinar el problema:

mysql> check table data_values_queued;
+----------------------------+-------+----------+----------------------------------------------------------+
| Table                      | Op    | Msg_type | Msg_text                                                 |
+----------------------------+-------+----------+----------------------------------------------------------+
| datbas1.data_values_queued | check | warning  | 4 clients are using or haven't closed the table properly |
| datbas1.data_values_queued | check | error    | Size of datafile is: 4200         Should be: 4220        |
| datbas1.data_values_queued | check | error    | Corrupt                                                  |
+----------------------------+-------+----------+----------------------------------------------------------+
3 rows in set (0.05 sec)

Aquí vemos que la tabla no fue cerrada adecuadamente, por ejemplo producto de un apagón. En mi caso descarto el primer mensaje porque el motor que uso es InnoDB, el cual permite concurrencia en las tablas.

REPAIR TABLE

Ahora para reparar la tabla se puede usar la siguiente sentencia:

mysql> repair table data_values_queued ;
+----------------------------+--------+----------+----------------------------------------+
| Table                      | Op     | Msg_type | Msg_text                               |
+----------------------------+--------+----------+----------------------------------------+
| datbas1.data_values_queued | repair | warning  | Number of rows changed from 144 to 143 |
| datbas1.data_values_queued | repair | status   | OK                                     |
+----------------------------+--------+----------+----------------------------------------+
2 rows in set (0.00 sec)

 

Ya con esto habremos reparado la tabla. Veamos si es así:

mysql> select * from data_values_queued;
+---------+--------+----------+---------------------+
| id      | iodbId | value    | timestamp           |
+---------+--------+----------+---------------------+
| 1476194 |    170 | 297      | 2012-01-11 08:40:45 |
| 1476193 |    170 | 296      | 2012-01-11 08:40:17 |
| 1476176 |     71 | 11692    | 2012-01-11 05:06:46 |
| 1476177 |     72 | 12061    | 2012-01-11 05:06:46 |
| 1476178 |     73 | 11820    | 2012-01-11 05:06:46 |
| 1476179 |    107 | 11703    | 2012-01-11 05:06:46 |
...
| 1476258 |    170 | 282      | 2012-01-11 11:07:43 |
+---------+--------+----------+---------------------+
143 rows in set (0.00 sec)

Referencias

,

4 Comentarios

Sentencias preparadas de MySQL en C (ejemplo completo)

MySql logo

En el trabajo me tocó hacer una interfaz a una base de datos MySQL desde C puro, y buscando en Internet di con el libro de MySQL Developer’s Library de Paul DuBois el cual tiene un ejemplo muy bueno de cómo hacer sentencias preparadas usando el conector de C de MySQL en el capítulo 7. Y aunque en el libro explica como ejecutar una sentencia SQL teniendo parámetros preparados (preapared statements) para luego explicar como obtener los datos de la consulta, al final no se ve todo en conjunto por lo que me dispuse a colocar un ejemplo completo:

void iodb_getNumAddresses(int id, int *numAddresses){

 MYSQL *conn;
 MYSQL_STMT *stmt;
 char *sql;

 // Bind variables
 MYSQL_BIND param[1], result[1];

 int myId, myNumAddresses;
 my_bool is_null[1];

 sql = "select count(*) from addresses where id = ?";

 // Open Database
 openDB(&conn);

 // Allocate statement handler
 stmt = mysql_stmt_init(conn);

 if (stmt == NULL) {
  print_error(conn, "Could not initialize statement handler");
  return;
 }

 // Prepare the statement
 if (mysql_stmt_prepare(stmt, sql, strlen(sql)) != 0) {
  print_stmt_error(stmt, "Could not prepare statement");
  return;
 }

 // Initialize the result column structures
 memset (param, 0, sizeof (param)); /* zero the structures */
 memset (result, 0, sizeof (result)); /* zero the structures */

 // Init param structure
 // Select
 param[0].buffer_type     = MYSQL_TYPE_LONG;
 param[0].buffer         = (void *) &myId;
 param[0].is_unsigned    = 0;
 param[0].is_null         = 0;
 param[0].length         = 0;

 // Result
 result[0].buffer_type     = MYSQL_TYPE_LONG;
 result[0].buffer         = (void *) &myNumAddresses;
 result[0].is_unsigned    = 0;
 result[0].is_null         = &is_null[0];
 result[0].length         = 0;

 // Bind param structure to statement
 if (mysql_stmt_bind_param(stmt, param) != 0) {
  print_stmt_error(stmt, "Could not bind parameters");
  return;
 }

 // Bind result
 if (mysql_stmt_bind_result(stmt, result) != 0) {
  print_stmt_error(stmt, "Could not bind results");
  return;
 }

 // Set bind parameters
 myId            = id;

 // Execute!!
 if (mysql_stmt_execute(stmt) != 0) {
  print_stmt_error(stmt, "Could not execute statement");
  return;
 }

 if (mysql_stmt_store_result(stmt) != 0) {
  print_stmt_error(stmt, "Could not buffer result set");
  return;
 }

 // Init data
 (*numAddresses) = 0;

 // Fetch
 if(mysql_stmt_fetch (stmt) == 0){
  (*numAddresses) = myNumAddresses;
 }

 // Deallocate result set
 mysql_stmt_free_result(stmt); /* deallocate result set */

 // Close the statement
 mysql_stmt_close(stmt);

 // Close Database
 closeDB(conn);

}

Aquí lo importante a resaltar es que se tiene dos estructuras especiales del API MySQL, param y result, las cuales configuran los parámetros que usará la sentencia preparada así como el sitio donde se guardarán los resultados, respectivamente. En este ejemplo, al hacer la consulta se tendrá el valor en la variable numAddresses.

Referencias

4 Comentarios

Instalación de Subclipse en Debian (y derivados)

 


Enlace al video

Si estás interesado en instalar Subclipse como cliente SVN para Eclipse, puedes seguir de forma general los pasos explicados a continuación, los cuales son independiente del sistema operativo y serán válidos para Windows, Mac o Linux, salvo el procedimiento de cómo instalar y configurar la librería JavaHL en Debian (y derivados como Ubuntu).

Instalación de Subclipse:

De forma general, estos son los pasos para instalar Subclipse en Eclipse:

  1. Abrir Eclipse, e ir a Help > Install New Software.
  2. Agregar el url de Subclipse para la versión de Eclipse que se tenga. Por ejemplo, para Galileo se debe agregar http://subclipse.tigris.org/update_1.6.x
  3. Seleccionar todos los componentes mostrados: Core SVNkit Library, Optional JNA Library (recommended) y Subclipse.
  4. Aceptar el acuerdo de licencia para iniciar la instalación. Casi finalizando la instalación nos aparecerá un mensaje advirtiendo que se instalará software no firmado, aquí aceptamos.
  5. Al finalizar nos pedirá reiniciar Eclipse.

Librería JavaHL en Debian

Sino quieres usar la librería SVNKit sino JavaHL entonces debes instalar el siguiente paquete:

 aptitude install libsvn-java

Luego se tienen dos alternativas para indicarle a Eclipse la existencia de dicha librería:

  1. Lo correcto es tratar de hacer que Eclipse lea el archivo de configuración con la ruta a la librería JavaHL. Yo la verdad no he logrado dar con el archivo eclipse.ini para el usuario, solo el archivo general /etc/eclipse.ini. Allí como root se puede puede agregar la línea mostrada en negritas, quedando algo como esto:
  2. -startup
    plugins/org.eclipse.equinox.launcher_1.0.201.R35x_v20090715.jar
    --launcher.library
    plugins/org.eclipse.equinox.launcher.gtk.linux.x86_1.0.200.v20090520
    -showsplash
    org.eclipse.platform
    --launcher.XXMaxPermSize
    256m
    -vmargs
    -Djava.library.path=/usr/lib/jni
    -Xms128m
    -Xmx512m
  3. La otra solución es hacer un enlace simbólico a la librería, esto es:
  4. ln -s /usr/lib/jni/libsvnjavahl-1.so /usr/lib/
  5. Reiniciar Eclipse y verificar yendo a Preferences > Team > SVN, donde debe aparecer la versión de la librería.

Librería SVNKit

Con la instalación al principio se descargó la librería SVNKit, la cual puede usarse en sustitución de JavaHL, sin necesidad de configurar ningún archivo adicional de inicialización y con la ventaja de ser multiplataforma, es decir, que en Windows y Mac también servirá. Para esto solo hay que ir a Window> Preferences > Team > SVN y seleccionar en la interfaz SVN a usar la opción que diga SVNKit:

SVNKit

Ya con esto podrás usar este cliente SVN en Eclipse!!

, ,

6 Comentarios

Plugin Sociable hackeado para bit.ly

Sociable WordPress Plugin

Estuve probando varios plugins para que los usuarios del blog puedan compartir las entradas en las redes sociales como Twitter o Facebook y el que más me gustó fue Sociable. Pero al probar con Twitter y con Identi.ca me di cuenta que utiliza awe.sw como herramienta para acortar el URL, pero el servicio está colapsado y no están dando invitaciones. De esta forma me puse a investigar maneras de hacerlo funcionar con Bit.ly y me encontré con un artículo que describe exactamente lo que quería, sin embargo el código usa la función file_get_contents, la cual arroja el siguiente error en mi servidor:

Warning: file_get_contents() [function.file-get-contents]: URL file-access is disabled in the server configuration in /home/g/gallardo/web/wp-content/plugins/sociable/sociable.php on line 813

Que es el resultado de no tener activa la variable allow_url_fopen habilitada en PHP. Después de consultar con mi proveedor de hosting, me aconsejaron que usará cURL en vez de file_get_contents, por lo que tuve que hacer algunas modificaciones al archivo sociable.php, y agregar el archivo sociable-bitly.php que es donde se acorta los URLs con cURL.

Ambos archivos los coloqué en un zip sociable.3.5.2-hacked.zip por si alguien necesita usarlo. Pero ojo,  que no es el plugin completo sino son únicamente estos archivos para copiar en la carpeta /sociable del plugin oficial. Otro detalle es que se debe editar el archivo sociable-bitly.php para colocar el login y el API Key de Bit.ly en las siguientes líneas:

$bitlylogin = 'yourbitlylogin';
$bitlyapikey= 'yourbitlyapikey';

Se podría hacer más cosas con este plugin, como por ejemplo quitar por completo el código de awe.sw, crear los campos de entrada para Bit.ly en el panel de administración, o integrarlo con tinyurl. Esperemos que la próxima versión oficial tenga algunos de estos cambios.

Referencias:

,

2 Comentarios

Empaquetenado código Python para Symbian

PyS60

Digamos que quieres empaquetar una aplicación Python para teléfonos Symbian de forma que puedas distribuir software en archivos de instalación .sis. ¿Cómo puedes hacerlo? Fácil, con ensymble.

Instalación de ensymble

En Debian puedes instalarlo desde los repositorios escribiendo:

aptitude install ensymble

Empaquetado de una aplicación

Si tienes un archivo llamado aplicacion.py y quieres convertirlo en un archivo de instalación .sis, solo escribe:

ensymble py2sis aplicacion.py

Empaquetado de directorios

Algunas veces necesitas empaquetar directorios para distribuir librerías. En este caso debes copiar la estructura de directorios que deseas en tu teléfono y copiar allí tus archivos. Por ejemplo, digamos que quieres hacer un archivo .sis para una librería Python que creaste, llamada milib donde los archivos configuraciones.py y red.py serán guardados:

mkdir MiLib/pyhon/lib/milib
cp configuraciones.py MiLib/pyhon/lib/milib
cp red.py MiLib/pyhon/lib/milib

ensymble simplesis --caption="MiLib" --version=1.0.2 MiLib

Con la última orden terminarás con un archivo llamado MiLib_v1_0_2.sis. Este archivo instalará un directorio llamado  E:\\Python\Lib\milib (o C:\\Python\Lib\milib dependiendo de donde lo instales) con tus dos archivos Python.

,

2 Comentarios

Octave: una alternativa a MATLAB

sombrero

Siempre me había preguntado si existía una alternativa Software Libre a MATLAB para hacer algunas prácticas de laboratorio de la universidad, al estilo de las que puedes encontrarte en materias como procesamiento de señales y comunicaciones. Buscando en Internet me encontré con Octave, así que decidí probarlo y darle una oportunidad. Veamos cómo instalarlo, cómo luce y mis comentarios al respecto…

Instalando Octave

En Debian basta con instalar el siguiente paquete:

aptitude install qtoctave

Esto instala Octave como intérprete de órdenes, algunos de sus componentes y una interfaz gráfica Qt para usar Octave como haríamos con MATLAB. Si se requiere de otros componentes de Octave se pueden instalar de acuerdo a las necesidades de cada quien. En mi caso yo tuve que instalar el componente decominicaciones:

aptitude install octave-communications

Interfaz QtOctave

La interfaz gráfica permite, entre otras cosas, trabajar con el interprete de órdenes de Octave, ver el listado de variables, editar un archivo .m, y ver el histórico de órdenes; muy similar a como haríamos en MATLAB.

QtOctave

Edición de un archivo.m

En la imagen de arriba vemos un script hecho para la práctica de Comunicaciones II (Universidad Simón Bolívar, Caracas – Venezuela), en el cual se generan algunos códigos de línea para ver cómo lucen en tiempo, sus densidades espectral de potencia, cuán inmune son al ruido y sus patrones de ojo; usando las funciones proporcionadas por la profesora de la materia las cuales fueron hechas en MATLAB. Veamos las imágenes que pude generar:

Tiempo Frecuencia

Subplot Patron del Ojo

Compatibilidad con MATLAB

Aunque muchas de las órdenes y funciones de MATLAB son reconocidas, no todo está implementado igual o de hecho puede que no esté presente en Octave. Por ejemplo, tuve que editar el archivo scope.m para comentar la orden cla (clear current axes) y la declaración de las variables globales no funcionaron para las funciones en los cripts del Toolbox que me proporcionaron para la práctica. Si tienes algún problema con una orden o función de MATLAB puedes consultar el listado de compatibilidad Octave <-> MATLAB

Comentarios finales

A mí parecer Octave es una alternativa real a MATLAB. Pueden decir que no es tan completo como MATLAB…si, es cierto, pero quién usa MATLAB al 100%?  Por otro lado, creo que esta sería una opción para erradicar las malas costumbres de otros sistemas operativos y malos hábitos como comprar licencias privativas que, aunque me consta que en los laboratorios de la universidad tienen sus licencias 100% legales, al final los estudiantes siempre terminan adquiriendo el software pirata para poder hacer sus prácticas en casa.

¿Se pueden adaptar estos laboratorios a Octave? Yo creo que si. Incluso los estudiantes de post-grado podrían crear código (ejemplo fft6) para contribuir con el proyecto Octave aumentando las librerías de funciones…Por mi parte, voy a comunicarle mis hallazgos a mi profesora a ver qué opina!

,

6 Comentarios

Clases y Objetos en PHP

blocksAntes de comenzar a trabajar con clases y objetos, debemos conocer primero la diferencia entre la programación tradicional y la programación orientada a objetos (POO). En la programación tradicional los problemas son resueltos ejecutando una acción tras otra, en otras palabras, escribes un programa donde las acciones son ejecutadas una por una para resolver un problema.

Por ejemplo, si deseas sumar dos números en PHP, basta con el siguiente código:

<?
// Define dos numeros
$a = 2;
$b = 3;
// Suma ambos numeros
$c = $a + $b;
echo "a+b=".$c;
?>

Leer el resto de la entrada »

,

6 Comentarios