Blog con experiencias, frustraciones y aprendizajes relacionados con el mundo de los Sistemas Computacionales
miércoles, 13 de marzo de 2013
Exchange 2010: Traslado de buzón y libreta de direcciones no funciona
viernes, 18 de enero de 2013
Crear un HorizontalScrollView programáticamente en Android
- 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:
- Dentro del constructor de MyGroup insertamos el siguiente código para agregar el scroll:
- Agrega al layout los objetos que se mostrarán en el scroll a través de la sentencia layout.addView(view).
- 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:
viernes, 2 de noviembre de 2012
Sincronizar dispositivos móviles con Exchange 2010
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
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
miércoles, 20 de julio de 2011
Utilizando SSLSockets en un ambiente de prueba
Siguiendo esta lista de pasos, podrás hacer funcionar tu aplicación con SSLSockets en un ambiente de pruebas donde quizás no tengas instalado un certificado SSL válido (Este post asume que conoces, al menos de manera general, qué es SSL y cómo funciona):
Servidor
Lo primero que se necesita hacer es crear un certificado SSL para el servidor, el cual será utilizado para establecer la comunicación con el cliente. Para la creación de este certificado se puede utilizar la herramienta keytool que viene en el JDK y en el JRE de Sun Microsystems.
Para crear este certificado corremos la siguiente instrucción:
-alias es el nombre con el que haremos referencia al par de claves creado.
-keypass es el password para acceder a la clave privada
-storepass es la clave para acceder al KeyStore
Para saber que escribir en cada una de los inputs que el programa esperará, o para conocer que otras características puedes utilizar con keytool puedes consultar alguno de estos links: http://www.adictosaltrabajo.com/tutoriales/tutoriales.php?pagina=securitySSLKeytool o http://download.oracle.com/javase/1.3/docs/tooldocs/win32/keytool.html. Una vez creado el archivo deberá ser copiado en el directorio de trabajo donde correrá nuestro Servidor.
Ahora estamos listos para programar nuestro servidor en Java, el cual debiera ser algo similar a esto:
public class Servidor {
- public static void main(String args[]) {
- System.setProperty("javax.net.ssl.keyStore", "miKeyStore");
System.setProperty("javax.net.ssl.keyStorePassword", "claveDeKeyStore");
try {
- SSLServerSocketFactory ssf = (SSLServerSocketFactory)SSLServerSocketFactory.getDefault();
SSLServerSocket sss = (SSLServerSocket)ssf.createServerSocket(9999);
SSLSocket s = (SSLSocket)sss.accept();
LineNumberReader in = new LineNumberReader(new InputStreamReader(s.getInputStream()));
PrintWriter out = new PrintWriter(s.getOutputStream());
String linea = in.readLine();
System.out.println(linea);
out.println("respuesta");
out.flush();
No es estrictamente necesario incluir los setProperty en el código, pueden agregarse en la línea de comando al momento de correr el programa, de la siguiente manera:
java -Djavax.net.ssl.keyStore=miKeystore -Djavax.net.ssl.keyStorePassword=claveDeKeyStore Server
Aquí puede ser que tengas tu primer problema, y que al momento de correr el servidor obtengas el siguiente error:
java.net.SocketException: java.security.NoSuchAlgorithmException: Error constructing implementation (algorithm: Default, provider: SunJSSE, class: com.sun.net.ssl.internal.ssl.DefaultSSLContextImpl)
Este error se debe a que no pudo obtenerse la clave del certificado y puede ser por varias razones, la más común es que no estés enviando la clave correcta o que no se encuentre el archivo especificado; pero si se tiene seguridad que no es debido a estos problemas, el error puede deberse a que indicaste una clave distinta en el keypass y el storepass. Como estamos en un ambiente de prueba podemos establecer ambos passwords con el mismo valor y de esta manera el error desaparecerá. Para implementarlo en un ambiente de producción, deberás programas un KeyManager ya que JSSE no provee una manera adecuada de especificar estos passwords a través de System Properties.
Cliente
El código para el cliente podría ser de la siguiente forma:
public class Cliente {
- public static void main(String args[]) {
- try {
- SSLSocketFactory sslsocketfactory = (SSLSocketFactory) SSLSocketFactory.getDefault();
SSLSocket sslsocket = (SSLSocket) sslsocketfactory.createSocket("localhost", 9999);
LineNumberReader in;
PrintWriter out;
in = new LineNumberReader(new InputStreamReader(s.getInputStream()));
out = new PrintWriter(s.getOutputStream());
out.println("hola");
out.flush();
System.out.println(in.readLine());
Pero muy probablemente obtendremos el siguiente error:
javax.net.ssl.SSLPeerUnverifiedException: peer not authenticated
Este error se debe a que el certificado que estamos utilizando no es un certificado SSL válido. El esquema utilizado por SSL es conocido como X.509 y Java utiliza un TrustManager para este esquema, llamado x509TrustManager. Para poder evitar este error tenemos que crear un TrustManager diferente que acepte todos los certificados y no nos genere un error y utilizar este para la creación del Socket. Nuestro código quedaría algo así:
public class Cliente {
- public static void main(String args[]) {
- try {
- X509TrustManager tm = new X509TrustManager() {
- public void checkClientTrusted(X509Certificate[] xcs, String string) throws CertificateException { }
public void checkServerTrusted(X509Certificate[] xcs, String string) throws CertificateException { }
public X509Certificate[] getAcceptedIssuers() { return null; }
SSLContext ctx = SSLContext.getInstance("TLS");
ctx.init(null, new TrustManager[]{tm}, null);
SSLSocketFactory sslsocketfactory = ctx.getSocketFactory();
SSLSocket s = (SSLSocket) sslsocketfactory.createSocket("192.168.0.32", 9999);
LineNumberReader in;
PrintWriter out;
in = new LineNumberReader(new InputStreamReader(s.getInputStream()));
out = new PrintWriter(s.getOutputStream());
out.println("hola");
out.flush();
System.out.println(in.readLine());
exception.printStackTrace();
}
Una vez hecho esto, nuestros dos procesos se comunicarán utilizando SSL sin problemas :).
lunes, 18 de julio de 2011
No se puede iniciar sesión localmente en un Windows SBS 2003
Noté que este era mi caso y procedí a eliminar el usuario administrador del grupo Operadores Remotos. Excelente, ya podía ingresar al servidor de manera local, pero ya no podía hacerlo de manera remota.
¿Cómo hacer que el administrador pueda ingresar de manera remota y local al servidor? Esto no debería ser un problema, pero no sé por qué razón el administrador estaba en Operadores Remotos ni porque no me le daba acceso normal al quitarlo de ahi, pero la solución es sencilla:
- Abrir el editor de objetos de directivas de grupo escribiendo en la línea de comandos gpedit.msc
- Irse a Configuración del equipo -> Configuración de Windows -> Configuración de seguridad -> Directivas locales -> Asignación de derechos de usuario.
- Encontrarás ahi la directiva "Permitir el inicio de sesión a través de Servicios de Terminal Server", darle doble click
- Presionar el botón Agregar un usuario o grupo
- Escribir el usuario o grupo que deseas agregar, asegúrate de incluir el nombre de dominio, por ejemplo: MiDominio\administrador
Con esto el administrador ya podrá ingresar de manera local y remota.
martes, 8 de marzo de 2011
Conexión ODBC en Windows 7
Me parecía raro también que al momento de configurar el ODBC no miraba la larga lista de drivers que normalmente miro sino que solamente me aparecía uno.
El problema era que mi versión del Windows es de 64 bits y existen dos aplicaciones administradoras de ODBC, una de 32-bits y otra de 64-bits. La versión de 32 bits se encuentra en la carpeta %systemdrive%\Windows\SysWow64 y la de 64bits se encuentra en %systemdrive%\Windows\System32.
La versión de 32 bits muestra el DSN de sistema de 32 bits, DSN de usuario de 32 bits y DSN de usuario de 64 bits. La versión de 64 bits muestra el DSN de sistema de 64 bits, DSN de usuario de 32 bits y DSN de usuario de 64 bits.
Así que corriendo la versión correcta del administrador, se puede solucionar el problema.
Más información en http://support.microsoft.com/kb/942976
Unir Windows 7 de 64 bits a un dominio Windows SBS 2003
Una vez que la computadora reiniciaba no había forma de que entrara con alguno de los usuarios del dominio, ni siquiera con el administrador. Después de mucho pelear con la computadora, se me ocurrió averiguar la diferencia que había entre esta computadora y las otras con Windows 7 que habían logrado unirse al dominio sin problemas (esto, porque asumí que el problema estaba relacionado con el Sistema Operativo, ya que nunca me dió ese tipo de problemas con XP).
La diferencia era (además de la marca de la computadora) que el sistema operativo era Windows 7 de 64 bits. No estoy totalmente seguro que está haya sido la causa del problema, pero independientemente de eso, lo importante era averiguar cómo resolverlo. Así que si te ha pasado algo similar y tu computadora, aunque se una al dominio, no te permite ingresar a ella con usuarios del dominio, esta fue la solución que yo encontré y me sirvió muy bien:
- Instalar Support Tools que vienen en los CDs de tu Windows Server 2003
- Ejecutar la aplicación ADSIEDIT.MSC que se encuentra en el directorio Support Tools
- En el menú de la derecha seleccionar Domain -> DC =
-> CN=Computers - Buscar la computadora afectada, presionar el botón derecho sobre ella y elegir Propiedades
- Dar dobleclick en el campo ServicePrincipalName de la lista
- Agregar el siguiente valor: HOST/nombrehost.dominio.xyz
Listo, al hacer esto, podrás ingresar en la computadora con cualquiera de los usuarios del dominio sin ningún problema.
viernes, 7 de enero de 2011
DNS cache en ISA Server
Luego realicé un nslookup para chequear si el DNS devolvía la dirección correcta y si lo hacía. Al parecer solo los navegadores tenian este problema y seguían resolviendo la dirección anterior.
Después de revisar durante un rato, noté que el problema se daba solamente si estaba levantado el Cliente Firewall de ISA, así que supuse que el ISA Server manejaba algún tipo de caché para DNS y que me seguía devolviendo la dirección anterior.
En efecto, este era el problema, y la solución es sencilla: reiniciar el servidor ISA o limpiar el caché. Para limpiar el caché (o borrar solamente la entrada que está dando problemas) descargué el DNSTools para ISA Server, lo corrí, borré la entrada para la dirección antigua y listo, los clientes de mi red accesaron bien a la nueva dirección.
lunes, 6 de diciembre de 2010
Microsoft Exchange 2010 en Windows Server 2008 R2
Después de mucho buscar, encontré este artículo que me pareció excelente: http://www.experts-exchange.com/Software/Server_Software/Email_Servers/Exchange/A_2881-Migrate-Small-Business-Server-2003-to-Exchange-2010-and-Windows-2008-R2.html, muestra los pasos a detalle y muy bien explicados.
Solamente tuve dos pequeños problemas, de los cuales no se mencionaba nada en el artículo:
1) Al momento de instalar el Exchange, me tiraba un error de llamada a procedimientos remotos (RPC) en el servidor Exchange 2003, por lo que no podía instalar la funcionalidad de Hub Transport o Transpote de concentradores y detenía la instalación. Después de investigar un poco, me di cuenta que debía entrar a mi ISA Server, instalado en el servidor Exchange, y en la sección configuración -> complementos deshabilitar los Filtros RPC. Una vez hecho esto, debi instalar de nuevo las caracteristicas que hacían falta y listo.
2) Una vez que trasladaba los buzones de los usuarios, tenía un problema: los usuarios en el exchange 2003 podían comunicarse hacia el exterior y hacia el exchange 2010; pero los usuarios en el exchange 2010 solamente podían comunicarse entre ellos. Este problemita me costó más que el anterior ¡porque habían mil opiniones en Internet! El mensaje que recibía decía que existía un error de Socket y que la comunicación había sido cortada; encontré el problema: de nuevo, tenía problemas en mi ISA Server por tener los puertos SMTP cerrados. Una vez resuelto esto me aparecía "Dirección IP de destino principal 451 4.4.0 ha respondido con: "451 5.7.3 no se puede conseguir la autenticación del servidor de Exchange".". Este problema se debía a que en el servidor Exchange 2003 hay que habilitar la Autenticación de Windows Integrada, tal como se indica en este artículo de Microsoft: http://support.microsoft.com/kb/979175/es.
Una vez resuelto esos dos problemas, mi exchange se encuentra trabajando perfectamente. ¡A seguirlo travesiando entonces para ver qué nuevas cosas interesantes trae! :)
jueves, 25 de noviembre de 2010
Pérdida de datos en SQL Server
Una vez que se ha realizado un commit sobre las transacciones en una base de datos, no puedes ejecutar un rollback para deshacer esta operación; así que necesitarás de algún backup para recuperar tu información. Si tienes un backup lo suficiente nuevo como para restaurar tus datos, pues no tendrás ningún problema, pero si no lo tienes aún asi puedes recuperarlos siguiendo estos pasos:
1. Realiza un backup de transacciones de tu base de datos. Entra al SQL Server Enterprise Manager y sobre tu base de datos presiona el botón derecho. Selecciona la opción Todas las tareas y luego Copia de seguridad de la base de datos....
En la ventana de copia de seguridad selecciona la opción Registro de transacciones e indica el lugar donde deseas que se almacene este backup y asignale una extensión trn.
2. Restaura el backup más nuevo que tengas. Busca el backup más nuevo que tengas y restauralo preferiblemente en otro servidor. Si no cuentas con otro servidor, puedes restaurarlo en una nueva base de datos pero asegurate de cambiar el nombre del archivo físico donde será restaurado para no sobreescribir la base de datos original. Esta restauración se debe realizar con ciertos parámetros especiales. Si la restauración se realizará a través de código utiliza la siguiente sintaxis:
RESTORE DATABASE NuevaBD
FROM DISK = 'C:\Backups\ultimoBackup.bak'
WITH
MOVE 'BDPrevia' TO 'C:\Data\NuevaBD.mdf',
MOVE 'BDPrevia_Log' TO 'C:\Data\NuevaBD_Log.ldf',
NORECOVERY
Las sentencias MOVE sirven para indicar adonde se ubicarán físicamente los archivos lógicos de la base de datos. Esto es lo que nos evitará sobreescribir la base de datos ya existente.
NORECOVERY lo utilizamos para indicarle que sobre esta Base de Datos restauraremos un archivo de transacciones, por lo que la base de datos no quedará operativa sino hasta después de realizar esta restauración donde le indicaremos que lo haga con RECOVERY.
Si la restauración de la base de datos la haremos a través de la interfaz gráfica hay que asegurarse de cambiar el nombre del archivo físico del archivo mdf y del archivo ldf e indicarle que la base de datos quedará no operativa tal como se indica en la siguiente figura:
Si se utiliza la versión Studio Express del SQL Server Management, estos mismos parámetros pueden ser configurados en la ventana de restauración en la ficha "Options".
Si no tienes ningún backup no podrás realizar la recuperación de tus datos, o por lo menos no conozco ninguna forma, si lográs hacerlo por favor comentalo en este post :)
3. Restaura el archivo de transacciones. El último paso es restaurar el archivo de transacciones especificando la fecha anterior a la pérdida de los datos; es decir, que si perdimos los datos el 15 de noviembre de 2010 a la 1 p.m., podemos indicarle que restaure las transacciones hasta cualquier fecha antes de esta en la cual estemos seguros que estaban todos los datos que necesitamos antes de ser borrados. A través de código se utilizaría una sintaxis como esta:
RESTORE LOG BDNueva
FROM DISK = 'C:\Backups\transacciones.trn'
WITH
STOPAT=N'11/15/2010 8:00:00 AM',
RECOVERY
A través de la interfaz gráfica en la versión Studio Express presiona el botón derecho sobre la base de datos (la cual indicará que está en estado de Restauración) y selecciona Tasks, luego Restore y luego Transaction Log... Después debes indicarle que la base de datos debe quedar operativa e indicarle el punto en el tiempo hasta el que quieres restaurar las transacciones.
Listo, con esto tendrás tus datos en BDNueva y podrás sacar de ella lo que necesites. Básicamente lo que este proceso realiza es restaurar una base de datos vieja y luego ejecutar de nuevo las transacciones que se realizaron hasta cierta fecha, generando así nuevamente los datos que necesitamos.
miércoles, 10 de noviembre de 2010
Backup del correo
Microsoft Outlook puede conectarse a un servidor Exchange local, de manera que el buzón del usuario se almacenará en ambos equipos: en la computadora del usuario en un archivo .ost (offline storage table, buzón sin conexión) y en el servidor Exchange.
Los archivos ost permiten a los usuarios accesar a su correo aun cuando el outlook no se encuentre conectado al servidor Exchange; una vez que se conecte, los buzones se sincronizarán. Cuando Outlook se configura para trabajar sin el Exchange, trabaja sobre archivos .pst (personal storage table) que almacena el buzón y demás carpetas del usuario.
Como el buzón en realidad se encuentra almacenado en el servidor, si deseamos formatear la computadora de un usuario o trasladarlo a una nueva computadora, no necesitamos sacar backup de su correo; ya que al configurar el outlook en la nueva computadora, éste se sincronizará con el servidor y creará una copia del buzón almacenado en él en el archivo .ost. Pero hay que tener mucho cuidado con aquellos usuarios que utilicen equipos portátiles y trabajen en sus casas con el outlook, porque si les formateamos sus computadoras antes de que éstas realicen la sincronización con el servidor, los correos que hayan enviado o recibido mientras se encontraban desconectados nunca se almacenaron en el servidor por lo tanto se perderán. Por tal razón, hay que encender la computadora, abrir el outlook, asegurarse que esté conectado con el Exchange y presionar Enviar/Recibir para permitir que la sincronización se lleve a cabo antes de realizar el formateo.
De no tener este cuidado puede ser que nos toque tener que explicarle al usuario lo que ha pasado con esos correos que ha enviado desde su casa el día anterior, y eso...no será tarea fácil.
viernes, 23 de abril de 2010
Introducción a Motores 3D (parte 3)
En el post anterior mencionaba un poco acerca de la Modelview Transformation. Como resultado de esta transformación se obtienen las coordenadas de vista, estas son las coordenadas desde el punto de vista del observador. El siguiente paso es la Projection Transformation y Perspective Division, donde se determina que objetos y/o partes de estos serán mostrados en la pantalla. Además hace un calculo del eje z ya que como nuestro monitor es en 2D debe hacer una transformación para representar objetos 3D, y así poder simular aquellas caras de los objetos que se encuentran más lejos del observador.

En la figura, los objetos contenidos dentro del plano a y b son los que se proyectarán en pantalla. Estos planos se determinan a través de la función glFrustum o glPerspective. También puede generarse una proyección paralela, con todos los objetos contenidos en un paralelogramo, esto se logra a través de la función glOrtho. Pero para producir proyecciones en perspectiva se utilizan las mencionadas primero.
Viewport Transformation
La última transformación por la que pasan cada uno de los puntos es la Viewport Transformation. Ésta básicamente consiste en transformar las coordenadas normalizadas de los puntos en coordenadas de la ventana donde se mostrarán. Se utiliza la función glViewport para indicarle a OpenGL los parámetros que deberá utilizar para realizar la transformación.
Un ejemplo de la configuración del OpenGL para estas transformaciones podría ser así:
const float ar = (float) width / (float) height;
glViewport(0, 0, width, height);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glFrustum(-ar, ar, -1.0, 1.0, 2.0, 100.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity() ;
glViewport establece las medidas de la pantalla y glFrustum establece la perspectiva para la representación de los objetos. Nótese que se establece GL_PROJECTION como la matriz de trabajo para estas transformaciones, luego se cambia a GL_MODELVIEW donde más adelante en el programa se añadírían los puntos de los objetos como se mostró en el post anterior, utilizando la matriz de cada uno de éstos para colocarlos en la posición que les corresponde en el mundo 3D.
Conociendo estas transformaciones, y aprovechando que OpenGL nos facilita el cálculo de todas ellas; el programador puede concentrarse en cuestiones como el movimiento de la cámara, movimiento de los objetos, reglas del juego, etc. para crear su motor 3D.
Hay que tomar en cuenta también otro montón de cosas como ser la iluminación, sombras, efectos especiales, detección de colisiones, etc. algunas de las cuales requerirán de cálculos matemáticos complejos o del ingenio del programador para simularlos. Estas las expondré en los siguientes posts.
lunes, 1 de febrero de 2010
Enorme Log
Me tocaba estar borrando archivos temporales, sucesos de evento, vaciando la papelera, etc. para poder evitar estos problemas. No podía desinstalar ninguno de los programas que tenía y no deseaba formatear el servidor para hacer una partición más grande.
Encontré algo que me ayudará a resolver el problema por lo menos durante un buen tiempo, y es que el Symantec Server cuenta con un servicio llamado Reporting Agents que crea un log en el directorio "C:\Archivos de Programa\Archivos comunes\Symantec Shared\Reporting Agents\Win32" en un archivo llamado ReportsSVC.log. Este archivo va creciendo y creciendo hasta hacerse enorme!, el mío tenía mas de 700MB.
No encontré la forma de configurar la carpeta donde se crea este archivo para poder moverlo de mi disco C, pero si pude moverlo y hacer que comenzara con 1 KB de nuevo :). Solamente hay que detener el servicio Reporting Agents y mover o eliminar el archivo. No encontré mucho de importancia en él, pero por cualquier cosa lo salvé en otra partición :p
lunes, 18 de enero de 2010
MindManager 6 con MS Word 2007
Tengo la versión Professional 6, y todo funcionaba muy bien hasta que decidí actualizarme a Office 2007. La versión 6 del MindManager trabaja con Office 2003, pero al intentar exportar los documentos si tenemos instalado el Office 2007 en vez del 2003, probablemente el programa se quede trabado o nos tire un error.
La nueva versión del MindManager se encuentra integrado con el Office 2007 y trae algunas características al parecer muy interesantes; pero yo necesitaba poder exportar documentos sin necesidad de desinstalar mi Office 2003 ni actualizar mi MindManager.
Bajé una actualización del sitio de Mindjet (el fabricante) que aseguraba resolver el problema y permitir exportar a Office 2007. Instalé la actualización y al entrar a mi MindManager las opciones de exportar a Word y otras habían desaparecido, solamente quedó la opción de exportar a Powerpoint y a rangos de Excel. Esto definitivamente era peor que el estado inicial...
Pero encontré la forma de solucionarlo, es bastante sencilla: solamente hay que ir al Control Panel y en la opción de Agregar y/o Quitar Programas le decimos que queremos cambiar la instalación de MindManager y luego seleccionamos la opción reparar. Al terminarse este proceso, las opciones de exportar a Word y otros programas reaparecen y funcionarán con el Office 2007 sin problemas!!...eso si, si queremos exportar a un archivo de office de 2003, tendremos problemas, así que en este caso hay que exportarlo a Office 2007, abrirlo en la aplicación respectiva y salvarlo como archivo de Office 2003, asunto arreglado!.
viernes, 2 de octubre de 2009
Introducción a Motores 3D (parte 2)
En el post anterior mencionaba que para crear nuestro mundo 3D encontraríamos dos grandes desafíos: la modelación de los objetos en estructuras de datos y la representación de estos en nuestra pantalla 2D.
Mostré un poco, de manera general, la modelación de los objetos; ahora hablaremos de la representación de estos.
La representación de objetos 3D no es un tema fácil, requiere que el programador, no solamente sea un buen programador y conocedor del lenguaje, sino que además debe tener bastantes conocimientos de vectores, albegra lineal, física, geometría analítica, trigonometría, análisis numérico, etc.
A pesar de que nuestro modelo almacena la información en tres dimensiones, debemos transformar esta información a dos dimensiones para representarlo en el monitor. Este cálculo matemático es demasiado complejo, y aunque es posible realizarlo, nos tomaría demasiado tiempo y además ya existen herramientas que lo hacen por nosotros. Una de estas herramientas es OpenGL, éste nos brinda las funciones necesarias para poder realizar estta transformación de nuestro modelo 3D al monitor 2D.
Los objetos pasan por una serie de transformaciones para poder llegar a la representación final, estas transformaciones son:
- Modelview Transformation
- Projection Transformation
- Perspective Division
- Viewport Transformation
Modelview Transformation
En este paso, las coordenadas locales de cada objeto son tomadas y transformadas para darles una posición en el mundo 3D. Como pudimos ver anteriormente, las coordenadas que tenemos almacenadas en nuestro modelo, son coordenadas relativas al objeto y no a su posición en el mundo. En este paso, el objeto es movido a la posición que debe tener en el mundo 3D, ya sea a través de rotaciones, traslaciones o escalamientos. Es importante apuntar que la apariencia final del objeto depende del orden en que se apliquen estas transformaciones. Ejemplo:

En el inciso a) aplicamos primero una rotación al objeto y luego una traslación sobre el eje x, dado que su eje x está rotado se mueve diagonalmente. En el inciso b) aplicamos las mismas transformaciones pero en orden inverso, obteniendo así un resultado diferente.
Para lograr este tipo de transformaciones, OpenGL utiliza una matriz llamada la GL_MODELVIEW matrix. Cada vértice es multiplicado por los valores de esta matriz dándole así su posición real en el mundo. Es decir, que para cada objeto, debo almacenar información que me indique cómo ubicarlo en la posición q deseo. Aplico primero las transformaciones para modificar la matriz y luego voy calculando el valor de cada vértice. Para el ejemplo del inciso a) tendríamos un código similar a este:
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glRotatef(10, 0.0f, 0.0f, 1.0f);
glTranslatef(10.0f, 0.0f, 0.0f);
La primera instrucción le indica a OpenGL con qué matriz vamos a trabajar. Luego cargamos en ella la matriz identidad y luego aplicamos las operaciones de rotación y traslación. Una vez que hemos realizado todas las transformaciones que deseamos para el objeto, le decimos a OpenGL cuáles son los vértices que queremos representar:
glBegin(GL_TRIANGLES);
for (j=0; j<numPolygons;j++) {
//----------------- FIRST VERTEX -----------------
glColor3f(polygon[j].red,polygon[j].green,polygon[j].blue);
glVertex3f( vertex[ polygon[j].vertex[0] ].x, vertex[ polygon[j].vertex[0] ].y,vertex[ polygon[j].vertex[0] ].z);
//----------------- SECOND VERTEX -----------------
glColor3f(polygon[j].red,polygon[j].green,polygon[j].blue);
glVertex3f( vertex[ polygon[j].vertex[1] ].x, vertex[ polygon[j].vertex[1] ].y,vertex[ polygon[j].vertex[1] ].z);
//----------------- THIRD VERTEX -----------------
glColor3f(polygon[j].red,polygon[j].green,polygon[j].blue);
glVertex3f( vertex[ polygon[j].vertex[2] ].x, vertex[ polygon[j].vertex[2] ].y,vertex[ polygon[j].vertex[2] ].z);
}
glEnd();
glBegin le dice a OpenGL el tipo de polígono que vamos a utilizar para representar nuestro objeto. gl Color3f es para indicar el color y glVertex3f es para indicar las coordenadas de cada vértice.
Como podemos ver, se requiere entonces almacenar por cada objeto una matriz para ubicar el objeto en la posición correcta, por lo que en nuestra definición de la clase Object3D debemos añadir esta estructura de datos. La matriz es una matriz 4x4, la explicación del funcionamiento de esta matriz es un tema que esta fuera del objetivo de este post, pero que puede ser deducido a través de un breve análisis matemático. Puede consultarse el siguiente link: http://www.geocities.com/valcoey/intro3d.html
martes, 21 de abril de 2009
Introducción a Motores 3D
Un motor 3D es un programa que nos permite movernos a través de un mundo 3D visualizando objetos 3D en una pantalla 2D, a través de una serie de algoritmos complejos que utilizan la información almacenada en estructuras de datos creadas para este fin.
Podemos realizar un programa que imprima objetos 3D en la pantalla, pero implementar un motor que nos permita movernos dentro de un mundo tridimensional puede ser una tarea realmente compleja. Intentaré, a través de una serie de posts, explicar algunos principios básicos para la implementación de un motor 3D sencillo.
La tarea de crear nuestro mundo 3D contiene dos grandes desafíos:
- La modelación de los objetos en estructuras de datos adecuadas
- La representación de estas estructuras en nuestra pantalla 2D
Las Estructuras de Datos
Para poder crear un mundo 2D en una computadora quizás la utilización de archivos de imagenes, animaciones o dibujado de estructuras geométricas pueda bastarnos; pero, ¿cómo representar en nuestra computadora un objeto tridimensional, el cual tiene infinidad de puntos de vista, acercamientos, movimientos, etc? Almacenar cada pixel del objeto no sería práctico ni nos daría una representación muy real a la hora de mover el objeto a través del mundo virtual.
La mejor forma de modelar los objetos es a través de polígonos. Gran parte de los motores 3D utilizados en los juegos y aplicaciones modernas utilizan polígonos para modelar casi cualquier objeto en su mundo 3D. Y quizás el polígono más utilizado es el triángulo, a partir de triángulos podemos representar cualquier polígono, incluso círculos y esferas.
![]() |
Para poder modelar cada uno de los triángulos que forman un objeto, solamente necesitamos almacenar las coordenadas de cada uno de sus tres vértices. Los vértices son los puntos principales sobre los que se basarán todos los cálculos de nuestro motor. Un vértice representa un punto en el espacio 3D y para modelarlo necesitamos almacenar su coordenada x, y, z. En C++, utilizaríamos una clase similar a esta:
class Vertex3D {
class Polygon3D {
int vertex[3];
class Object3D {
public:
Object3D();
int numVertex; //cantidad de vertices
Vertex3D *vertex; // Lista de vértices
Polygon3D *polygon; // Lista de Polygon3Ds
};
obj.numVertex = 8;
obj.vertex[1].x = 0.0; obj.vertex[1].y = 1.0; obj.vertex[1].z = 0.0;
obj.vertex[6].x = 1.0; obj.vertex[6].y = 1.0; obj.vertex[6].z = 1.0;
obj.vertex[7].x = 1.0; obj.vertex[7].y = 0.0; obj.vertex[7].z = 1.0;
Es importante siempre definir los vértices de los polígonos en el mismo sentido, ya sea en el orden de las agujas del reloj o en sentido contrario; pero todos los polígonos deben de ser definidos en el mismo sentido para así poder determinar cual es la cara frontal del polígono.
Como podemos ver, estas clases nos permitirán entonces (con algunos métodos añadidos y algunos otros atributos importantes), modelar cualquier objeto a través de polígonos y vértices. Diseñar un cubo es sencillo, pero ¿cómo modelaríamos un rostro humano o una nave espacial? A través de código sería imposible; esto lo hacemos a través de herramientas de diseño gráfico como 3dMax, Maya, etc. las cuales generan archivos que después podremos importar a nuestro motor para montar esta información en nuestras estructuras de datos; pero eso lo mostraremos más adelante.
jueves, 19 de febrero de 2009
Servidor PowerEdge no reconoce los discos
Al encender el servidor me mostraba en los mensajes que no reconocía los discos duros. El servidor cuenta con dos discos duros en RAID 1, es decir donde uno es el espejo del otro. Después de intentar un rato, me comuniqué con el soporte de Dell (excelente servicio, por cierto) que me indicó los pasos a seguir para habilitar los discos duros. Al parecer el servidor los había sacado de línea para protegerlos por algún problema que detectó y sencillamente lo que había que hacer era entrar a la herramienta de administración del servidor para ponerlos OnLine de nuevo. Unas vez puestos OnLine los discos revisarían consistencia lo cual tardaría un rato mostrando una luz de color anaranjado y no verde como es lo habitual, pero el Sistema Operativo cargó sin problemas y no había perdida de información.
El personal de Dell me indicó que el problema se podría haber ocasionado por faltas de actualizaciones en el firmware o por la conexión de algún dispositivo no compatible, debido a que yo le indiqué que había conectado el backup. La unidad de backup estaba conectada al servidor en la oficina anterior así que no era falta de compatibilidad, pero yo insistía en que el problema debió ocasionarse por la instalación de la unidad y no por faltas de actualización.
Después de revisar bien la conexión me di cuenta que la conexión de unidad de cinta la había instalado mal (en el puerto equivocado de la unidad de cinta), lo que ocasionó problemas en el servidor. Pero al menos pude aprender un par de cositas que de otra forma no lo hubiera hecho.
lunes, 20 de octubre de 2008
Detalles de Outlook y MSN Messenger al momento de formatear una PC
Cuando una computadora con Windows XP empieza a funcionar lento, a levantar mensajes de virus que ningun antivirus puede limpiar del todo, que el sistema operativo no arranca, o simplemente a hacer cosas raras, a veces es mejor tomar la decisión de formatearla. Definitivamente se debe intentar todo antes de decidir formatearla, ya que el formateo y reinstalación del sistema operativo puede significar muchas horas de trabajo y conseguir de nuevo todos los programas que la computadora necesita. Pero hay veces en que se han agotado todas las soluciones posibles: limpiar el registro de windows, borrar software malicioso, eliminar todos los virus, reinstalar archivos dañados de Windows, etc... y aun asi la computadora no funciona como debiera.
Cuando tomamos esa decisión, es importante sacar un respaldo de la computadora para que al momento de reinstalarle todo, el usuario no haya perdido su información y preferiblemente que todo funcione como funcionaba antes... incluyendo el messenger :) ...
Casi todos los encargados de formatear computadoras sacan respaldo de los documentos importantes, bases de datos, etc., pero con frecuencia se olvida (o se ignora) como sacar respaldo del Outlook y el MSN Messenger. Aunque esta información puede no ser relevante para algunas personas, el hecho de dejarle al usuario la computadora tal como la tenía generará una sensación de agradecimiento y satisfacción en él.
Microsoft Outlook.
Al momento de sacar respaldo de la información de outlook hay tres tipos de información que debemos considerar:
- Libreta de direcciones, Calendario, Tareas, Bandeja de entrada, Elementos enviados y Elementos eliminados
- Carpetas Archivadas
- Direcciones a las que se ha enviado correos
Hacer un respaldo del buzón principal y las carpetas archivadas es una tarea muy conocida y que no implica mucho problema. Pero si solamente respaldamos la libreta de direcciones, al momento de restaurar el sistema, el usuario preguntará por gran cantidad de direcciones que ya no encuentra.
Microsoft Outlook, además de la libreta de direcciones, mantiene un caché de las direcciones a las cuales les hemos enviado un correo. Es por eso que al momento de escribir una letra en el campo "Para..." cuando estamos redactando un correo electrónico, nos aparece una lista con varias direcciones que empiezan con esa letra. Estas direcciones no son las direcciones de la Libreta de Direcciones (o Contactos) sino del caché del outlook. Estas direcciones se encuentran en la carpeta C:\Documents and Settings\<nombre de usuario>\Datos de programa\Microsoft\Outlook o C:\Documents and Settings\<nombre de usuario>\Application Data\Microsoft\Outlook para las versiones Windows en inglés. El archivo que contiene estas direcciones es el archivo con extensión .NK2. Solo necesitamos copiar este archivo y restaurarlo en la carpeta con el mismo nombre al momento de configurar nuevamente el outlook.
MSN Messenger
Generalmente al formatear una computadora perdemos todos nuestros emoticons, background, guiños, etc. que usamos en el msn messenger. Estos archivos podemos moverlos de computadora a computadora sin problema solo necesitamos iniciar sesión en la computadora destino y luego sustituir en la carpeta C:\Documents and Settings\<nombre de usuario>\Configuración local\Datos de programa\Microsoft\Messenger\<dirección de correo electrónico>\ObjectStore o C:\Documents and Settings\<nombre de usuario>\Local Settings\Application Data\Microsoft\Messenger\<dirección de correo electrónico>\ObjectStore la carpeta que deseamos, ya sea Bakcgrounds, CustomEmoticons o Winks3 provenientes de la computadora origen. Al momento de formatear una computadora solo necesitamos sacar respaldo de estas carpetas y sustituirlas después de iniciar sesión en el messenger.
De regreso...
Ha sido un año muy cargado de trabajo, lo que me ha impedido avanzar en algunos proyectos personales que tenía, en algunas cosas que quería aprender y definitivamente en actualizar el blog.
Espero poder retomar el ritmo y escribir más seguido de hoy en adelante...
