miércoles, 13 de marzo de 2013

Exchange 2010: Traslado de buzón y libreta de direcciones no funciona

Me sucedió de repente que cuando los usuarios de outlook presionaban el botón "Para..." para poder tener acceso a la libreta de direcciones, el outlook se quedaba guindado con el mensaje "Outlook está intentando recuperar información del servidor...", y después de mucho tiempo tiraba un mensaje de error diciendo que no podía recuperar la información. No encontré nada que pudiera reparar este error, y no recordaba haber cambiado nada en el exchange para que eso ocurriera; sencillamente los usuarios ignoraban el error pero no podía solucionarlo.
 
Poco tiempo después, al crear nuevos usuarios en el dominio me di cuenta que no podía trasladar estos usuarios desde un servidor Exchange 2003 (que es el servidor de dominio) hacia mi servidor Exchange 2010 como normalmente lo hacía anteriormente. Además de esto, estos usuarios no podían consultar su correo desde Outlook Web App. Supuse que lo del Web App es porque sus buzones debían estar almacenado en el Exchange 2010, ya que es el servidor que tengo configurado para eso; pero no lograba trasladar los buzones, me decía que el tiempo de espera se había agotado, con el mensaje: "La llamada a 'net:tcp://SERVERNAME/Microsoft.Exchange.MailBoxReplicationService SERVERNAME... agotó el tiempo".
 
Me puse a investigar y encontré que la libreta de direcciones no se estaba generando y generaba un error que decía "OABGen detectó el error 80040115 al obtener acceso a Active Directory "SERVERNAME" para "".""- "\Lista de direcciones sin conexión predeterminada", por lo que supuse que tendría que ver con la comunicación entre ambos servidores. Encontré que Exchange 2010 utiliza un Client Access Server que está relacionado con la libreta de direcciones y con el OWA, pero no pude encontrar nada que solucionará el error. Pensé también que podría tener que ver algo con el certificado o cuestiones similares, pero nada.
 
Después de muchas pruebas y cuando ya estaba instalando un nuevo servidor para "limpiar" todo, me di cuenta que fallaba algo del RPC (Remote Procedure Call). Quise convertir el servidor Exchange 2010 en un DC y me tiraba un error al intentar hacer el llamado de procedimiento remoto, y también me lo tiraba en el nuevo servidor.
 
¡Pude encontrar entonces cuál era el error! Hace algunos meses había reinstalado el ISA Server, y se me había olvidado reajustar una configuración que incluso había mencionado en un post anterior: debía deshabilitar el filtro RPC. Una vez hecho esto, ¡todo el exchange volvió a la normalidad!
 
Sucedieron una serie de síntomas raros que hacían pensar que alguna cosa diferente había pasado, certificados malos, algún cambio de configuración en el exchange, permisos en el Active Directory, etc. pero era nada más una configuración en el ISA Server y que con solamente ver los foros que se referían a un solo síntoma era imposible encontrar.

viernes, 18 de enero de 2013

Crear un HorizontalScrollView programáticamente en Android

Deseaba crear un HorizontalScrollView similar al que usa Angry Birds al momento de elegir al nivel que queremos jugar, pero de manera programática porque hacerlo a través de XMLs me complicaba un poco el cálculo de los tamaños de los objetos.
 
Fue un dolor de cabeza y por más que buscaba en Internet no encontraba algún artículo que me explicara paso por paso cómo hacerlo, hasta que encontré el siguiente link que me ayudó a entender algunos conceptos: http://www.arpitonline.com/blog/2012/07/01/creating-custom-layouts-for-android/, pero además tuve que ingeniarme algunas cositas extras para hacerlo funcionar tal como quería. Posteo aquí los pasos a seguir:
  1. Crea una clase que herede de ViewGroup. ViewGroup es un View que te permite agregar Views dentro de él. Llamaremos a esta clase MyGroup. Esta clase tendrá dos objetos que nos ayudarán a crear el efecto del Scroll, además de los Views que se agregarán en él:
  2.  
    HorizontalScrollView scroll;
    LinearLayout layout;
     
  3. Dentro del constructor de MyGroup insertamos el siguiente código para agregar el scroll:
  4.  
    scroll = new HorizontalScrollView(context);
    scroll.setHorizontalScrollBarEnabled(false);
    addView(scroll);
    layout = new LinearLayout(context);
    scroll.addView(layout);
     
    HorizontalScrollView es una clase que solamente permite agregarle un hijo, éste será nuestro layout, el cual contendrá todos los views que formarán parte del scroll.
     
  5. Agrega al layout los objetos que se mostrarán en el scroll a través de la sentencia layout.addView(view).
  6.  
  7. Tal como lo describe el artículo, los objetos internos del ViewGroup no se mostrarán a menos que les indiquemos su posición y tamaño, esto lo hacemos sobreescribiendo el método onLayout. En este método, para cada view dentro de nuestro ViewGroup debemos llamar su método layout, algo similar a esto:
  8.  
    for(int i=0;i
        View v = getChildAt(i);
        v.layout(x1,y1,x2,y2);
    }
     
    Esto funciona para views simples, pero en el caso de layouts, éstos también deben indicarle a sus hijos su posición y tamaño ya que hasta ese momento tienen tamaño 0. Una forma común y sugerida en el artículo para resolver esto es sobreescribir el método onMeasure del layout para así poder indicarle a sus hijos el tamaño que tendrán. En mi caso, el único objeto que forma parte del ViewGroup es el scroll, y dentro de éste esta el layout y dentro del layout están los demás views que también deben recibir su tamaño y posición. Así que utilice el onLayout para indicar estos tamaños. Pero probando de varias maneras los objetos no salían como deseaba, hasta que me di cuenta de algo: layout debe tener un ancho igual a la suma de los anchos de sus hijos mas los espacios entre ellos, y el scroll debe tener el ancho en el que deseo aparezcan los views. Aunque puede parecer obvio, puede generar mucha confusión; si voy a poner un objeto seguido de otro sus anchos se calculan diviendo el ancho de la pantalla entre el numero de objetos, pero si quiero poner espacios entre ellos, hay que tomar en cuenta que el layout debe contemplar estos espacios y que es probable que sea incluso más grande que el scroll. El código sería algo así:
     
    protected void onLayout(boolean changed, int l, int t, int r, int b) {
        //Quiero que el scroll sea de alto la mitad de la pantalla y que esté centrado
        scroll.layout(0, b/4, r, b*3/4);
     
        //Calculo el ancho que tendrá cada objeto
        int w = (int)(b/2f*tasa);
     
        //El ancho del layout será igual a la suma de los anchos más las separaciones más la posicion inicial
        layout.layout(0, 0, (w+separacion)*(n-1)+w+pos_inicial, b/2);
     
        //Calculo la posición de los views dentro del layout
        for(int i=0; i< layout.getChildCount(); i++) {
            View v = layout.getChildAt(i);
            v.layout((w+separacion)*i+pos_inicial, 0, (w+separacion)*i+w+pos_inicial, b/2);
        }
    }
     
Una vez hecho, el scroll funcionó perfectamente en cualquier dispositivo. Ahora habrá que añadirle el onTouch y los damos eventos.
 
No es la única forma de hacerlo, pero me funcionó muy bien!

viernes, 2 de noviembre de 2012

Sincronizar dispositivos móviles con Exchange 2010

El mundo en que vivimos actualmente nos exige estar permanentemente conectados y en comunicación. Es por eso que el correo electrónico ya no es solamente algo que dejamos para nuestras desktops o laptops, sino que lo andamos en nuestros celulares, tablets, etc. La configuración de esta característica no es nada complicado para aquel que conoce un poco de protocolos de correos y sus configuraciones elementales, pero cuando queremos sincronizar nuestros dispositivos móviles con nuestras cuentas de correo, contactos y calendarios que tenemos en la oficina, por ejemplo con Microsoft Exchange, el trabajo puede volverse un poco complicado.

Microsoft Exchange es una herramienta que nos permite mantener sincronizados en nuestra red de negocios nuestros correos, calendarios, contactos, etc. en todos nuestros dispositivos; además que permite el trabajo colaborativo entre todos los miembros de la organización. Pero cuando salimos del alcance de nuestra red, para mantener conectados nuestros móviles existen varias alternativas que podemos tomar. Estuve peleando un par de días para lograr hacer funcionar una u otra característica, pero al lograr resolverlo, definitivamente la experiencia que brinda Microsoft Exchange en este rubro es de alta calidad.

Exchange ActiveSync (EAS)

Es quizás la mejor forma de conectar nuestros dispositivos móviles con Microsoft Exchange. Las recientes versiones de Ipad, Iphone, Blackberry y dispositivos android cuentan con esta funcionalidad. Permite la sincronización de contactos, correos y calendarios. La configuración en el movil es bastante sencilla e intuitiva.

Algunos puntos a considerar en la configuración del movil:
  • El usuario debe especificarse tal como está definido en nuestro ambiente windows (sin @ ni dominio), el dominio se especifica aparte.
  • La especificación de la dirección del servidor varia dependiendo del móvil. En Android y iOS bastará con incluir la dirección del servidor, en Blackberry habrá que introducir la dirección completa del sitio de nuestro OWA (por ejemplo https://www.midominio.com/owa)

Algunos puntos a considerar en la configuración del servidor:
  • Se debe habilitar el OWA (Outlook Web Access), ya que es a través de éste que se realizará la conexión con el servidor.
  • En caso de contar con algún firewall, es necesario abrir el puerto 443 de nuestro servidor.
  • Habilitar el acceso a OWA a los usuarios (Por default este acceso está habilitado).
  • Elegir el tipo de autenticación adecuada, por default está seleccionada la autenticación básica.

POP3 e IMAP

Aunque EAS es quizás la opción más favorable, podría ser que en algunos casos no queramos implementarlo de esta manera; quizás no queremos sincronización completa o solamente queremos recibir los nuevos correos, etc. Independientemente de la razón, Exchange ofrece además de EAS, conectividad a través de los protocolos POP3 e IMAP. En mi caso, utilice EAS pero para un usuario en específico necesitaba no incluir sincronización completa de correos, por lo que debía configurarlo de otra manera.

La configuración de POP3 e IMAP me dió más problemas que la de EAS, quizás porque requiere de mayor atención a algunas cuestiones, enumero algunas:
  • Debe asegurarse que en el Exchange esté habilitado el protocolo que necesitamos y en los puertos correspondientes. Esto lo encontramos en Microsoft Exchange Local -> Configuración de Servidor -> Acceso de Cliente -> POP3 e IMAP
  • En caso de contar con algún firewall, es necesario abrir los puertos para POP3 e IMAP, que son 110 y 143 para conexiones no seguras y 995 y 993 para conexiones seguras.
  • Iniciar los servicios de Microsoft Exchange para POP3 y/o IMAP
  • Elegir el tipo de autenticación adecuada. Esta fue la que me costó encontrar ya que por default no viene con autenticación básica y esta era la manera en que me estaba conectando.
  • En el movil debe incluirse la dirección del servidor (no la de OWA) e indicar los puertos correspondientes.
  • El usuario debe introducirse en el formato servidor\usuario y en el caso que el alias del usuario sea diferente al usuario debe introducirse como servidor\usuario\alias.

Algunos links que podrían servir de ayuda para la configuración de Ipad y Iphones:

http://images.apple.com/es/iphone/business/docs/iPhone_MS_Exchange.pdf
http://www.apple.com/la/iphone/business/docs/iOS_Business_Mar12.pdf

miércoles, 17 de agosto de 2011

IIS se cae al habilitar extensión de PHP para Postgres

Intentando configurar un servidor web con PHP para que pudiera conectarse a Postgres me sucedía que al habilitar la extensión de postgres (quitando el ";" a la línea extension = php_pgsql.dll del php.ini) el servidor IIS se caía.

Al parecer este archivo en las versiones posteriores a la 5.2.5 hacen que el IIS falle. La solución fue sencilla: conseguir el archivo dll de alguna versión anterior de PHP, 5.2.5 o menos, y sustituirla en el directorio ext. Funciona sin problemas y ya puede conectarse a la base de datos PostgreSQL