Todas las Ciudades del Planeta. Parte 1

Por diversas razones en varios proyectos para clientes hemos tenido que crear una lista de países, ciudades, idiomas. Ahora que estamos trabajando en the Company Tool (Una herramienta de seguimiento y control de la operación para compañías pequeñas y medianas) nos encontramos con el mismo asunto e incluso ampliado porque necesitamos la lista de todos los países y ciudades del mundo, así que decidimos revisar un poco mejor si hay algo que podíamos hacer para no repetirnos y tener este problema resulto de una mejor forma. Este artículo es el producto de esa investigación y el código que construimos.

Información de todos las Ciudades.

Lo primero era obtener la lista de todos los países y ciudades del mundo, eso tenía que existir en alguna parte así que luego de un rato en internet encontramos que podíamos copiarla a mano de Wikipedia o consumir un servicio llamado GeoNames que no solo incluye Wikipedia sino muchas más fuentes, este servicio expone unos Servicios Web (web services) con JSON o XML donde se pueden realizar una serie de consultas asociadas a cualquier ciudad o país del mundo, sin embargo tiene unos limites de uso (30.000 peticiones por día y 2.000 por hora) y no queríamos depender de un servicio externo por más que este parece bastante confiable, tomamos entonces la otra opción y descargamos la data. Ahora bien procesar 2 GB de datos no resultó tan sencillo.

Lo segundo era cargarlos a nuestro SQL 2008 R2 para poder hacer consultas, explorar las capacidades de georeferenciación (Datos geográficos) incluidos en SQL y construir nuestro propio servicio.

Cargando la Data de GeoNames en SQL Server 2008 R2.

Antes que nada hay que transformar el archivo que venia en formato UTF8 a UTF16. Algunas recomendaciones en Internet dicen que puede importarse con el asistente de SQL y la opción de encoding del archivo, pero no funcionó aunque le dimos varias vueltas así que utilizamos esta herramienta, que convierte el archivo desde UTF8 a UTF16 y que funcionó perfectamente.

Luego construimos una tabla en la base de datos con la estructura del archivo:

--CREATE TABLE Core.GeoNames(
--geonameid int NOT NULL,
--name nvarchar(200) NULL,
--asciiname nvarchar(200) NULL,
--alternatenames nvarchar(max) NULL,
--latitude float NULL,
--longitude float NULL,
--feature_class char(2) NULL,
--feature_code nvarchar(10) NULL,
--country_code char(3) NULL,
--cc2 char(60) NULL,
--admin1_code nvarchar(20) NULL,
--admin2_code nvarchar(80) NULL,
--admin3_code nvarchar(20) NULL,
--admin4_code nvarchar(20) NULL,
--population bigint NULL,
--elevation int NULL,
--gtopo30 int NULL,
--timezone char(31) NULL,
--modification_date date NULL)

Luego insertamos la data desde el nuevo archivo convertido en UTF16 en nuestra base de datos.

--BULK INSERT Core.GeoNames
--FROM 'C:ReferenceGeoNamesutf16Allcountries.txt'
--WITH( DATAFILETYPE = 'widechar',
-- FIELDTERMINATOR = 't',
-- ROWTERMINATOR = 'n')


--Select top 1000 * from Core.GeoNames

En este punto ya tenemos la data cargada y podíamos hacer consultas sobre ella, incluso tenemos unos campos con latitud y longitud pero no estamos aprovechando el poder de los datos geográficos de SQL Server 2008 R2 (incluso en su versión Express que es gratuita). Así que modificamos la tabla de GeoNames para incluir un campo geográfico. (Los campos geográficos incluyen en su análisis la curvatura de la tierra, los campos geométricos no, así que si uno quiere analizar cosas pequeñas como una bodega, almacén, etc, usando sus coordenadas gps y georeferenciacion debe usar campos geométricos, pero ese es tema de otro post)


--ALTER TABLE Core.GeoNames
-- ADD geog GEOGRAPHY NULL
--GO

Creado el campo geográfico hay que actualizarlo con la información de cada punto, nótese aquí como se construye el campo utilizando la función POINT a la que le pasamos la longitud y latitud. (Curiosamente si se integra luego esto con GoogleMaps ellos utilizan latitud y longitud)

--UPDATE Core.GeoNames
-- SET geog = GEOGRAPHY::STGeomFromText
-- ('POINT(' + CAST(longitude AS CHAR(20))
-- + ' ' + CAST(latitude AS CHAR(20)) + ')',4326)

Un par de índices son buenos y necesarios para las consultas sobre 9 millones de registros tengan un rendimiento aceptable.

--ALTER TABLE Core.GeoNames
-- ADD CONSTRAINT pk_geonames_geonameid
-- PRIMARY KEY (geonameid)
--GO


--CREATE SPATIAL INDEX geonames_mmmm16_sidx
-- ON Core.GeoNames(geog)
-- USING GEOGRAPHY_GRID
-- WITH (
-- GRIDS = (MEDIUM, MEDIUM, MEDIUM, MEDIUM),
-- CELLS_PER_OBJECT = 16,
-- PAD_INDEX = ON
-- )
--GO

La información descriptiva de los países, regiones e idiomas también esta disponible en los archivos:

countryInfo.txt, admin2Codes.txt, admin1CodesASCII.txt, iso-languagecodes.txt, timeZones.txt

Con sus correspondientes scripts:


--CREATE TABLE [Core].[TimeZones](
-- [CountryCode] [nvarchar](255) NULL,
-- [TimeZoneId] [nvarchar](255) NULL,
-- [GMT offset 1# Jan 2012] [float] NULL,
-- [DST offset 1# Jul 2012] [float] NULL,
-- [rawOffset (independant of DST)] [float] NULL
--) ON [PRIMARY]


--CREATE TABLE [Core].[Iso-LanguageCodes](
-- [ISO 639-3] [nvarchar](255) NULL,
-- [ISO 639-2] [nvarchar](255) NULL,
-- [ISO 639-1] [nvarchar](255) NULL,
-- [Language Name] [nvarchar](255) NULL
--) ON [PRIMARY]


--CREATE TABLE [Core].[countryInfo](
-- [ISO] [nvarchar](255) NULL,
-- [ISO3] [nvarchar](255) NULL,
-- [ISO-Numeric] [float] NULL,
-- [fips] [nvarchar](255) NULL,
-- [Country] [nvarchar](255) NULL,
-- [Capital] [nvarchar](255) NULL,
-- [Area] [float] NULL,
-- [Population] [float] NULL,
-- [Continent] [nvarchar](255) NULL,
-- [tld] [nvarchar](255) NULL,
-- [CurrencyCode] [nvarchar](255) NULL,
-- [CurrencyName] [nvarchar](255) NULL,
-- [Phone] [float] NULL,
-- [Postal Code Format] [nvarchar](255) NULL,
-- [Postal Code Regex] [nvarchar](255) NULL,
-- [Languages] [nvarchar](255) NULL,
-- [geonameid] [float] NULL,
-- [neighbours] [nvarchar](255) NULL,
-- [EquivalentFipsCode] [nvarchar](255) NULL
--) ON [PRIMARY]


--CREATE TABLE [Core].[AdminCodes](
-- [adminCode] [nvarchar](255) NULL,
-- [name] [nvarchar](255) NULL,
-- [fullName] [nvarchar](255) NULL,
-- [geonamesId] [float] NULL
--) ON [PRIMARY]

Esta información nos permite crear una estructura de datos desde la cual podemos consultar los estados de un país (departamentos, provincias), las ciudades que hacen parte de ese estado y muchas más consultas sobre proximidad, por ejemplo cual es la ciudad de más de 15.000 habitantes más cercana a mi punto actual.

Unas consultas rápidas para entender la estructura de datos generada:

Lista de Países: (mejor obtenerla de la tabla countryInfo):


Select * from CoreDB.Core.GeoNames Where
Feature_code = 'PCLI'
Order by Name

Lista de Departamentos (regiones, provincias) de un país:


--deptos o primer nivel
Select top 100 * from CoreDB.Core.GeoNames Where
Country_code ='CO' and Feature_code = 'ADM1'
Order By name

Donde CO es el código del país.
Lista de las ciudades que pertenecen a un depto


--Ciudades o segundo nivel
Select * from CoreDB.Core.GeoNames Where
Country_code ='CO' and Admin1_code = 02 and Feature_code = 'ADM2'
Order By name

Donde CO es el código del país, en este caso Colombia, y Admin1_code es el código del departamento (región, provincia) seleccionado anteriormente.

Con estos datos estamos listos para construir una capa de servicios que exponga esta información, eso lo haremos en la segunda parte.

 

Juan Peláez
Arquitecto de software
3Metas Corp.
www.juanpelaez.com

 

Referencias:

http://www.geonames.org/
http://www.geonames.org/export/codes.html
http://midnightprogrammer.net/post/Integrate-Bing-Maps-With-Geonames-Database-And-ASPNET.aspx
http://forum.geonames.org/gforum/posts/list/817.page
http://blogs.msdn.com/b/edkatibah/archive/2009/01/13/loading-geonames-data-into-sql-server-2008-yet-another-way.aspx

 

Nota: Algunas de estas operaciones de procesamiento del archivo, creación de índices, etc., toman varios minutos, más de 10, en mi maquina de escritorio que es una buena maquina.

Continent codes :
AF : Africa geonameId=6255146
AS : Asia geonameId=6255147
EU : Europe geonameId=6255148
NA : North America geonameId=6255149
OC : Oceania geonameId=6255151
SA : South America geonameId=6255150
AN : Antarctica geonameId=6255152

Adicionar Headers en Mensajes SOAP

Para diferentes efectos (enrutamiento por ejemplo) es necesario agregar a los mensajes SOAP gestionados por servicios de WCF un encabezado (header) personalizado con información, de esta forma se puede enviar información entre los clientes y los servicios sin que sea necesario modificar el contenido del servicio (datos). Un recordatorio rápido de cómo hacerlo usando código en WCF 3.5.

 

 

ServicioFuncionario.ServicioFuncionarioClient sv = new ServicioFuncionario.ServicioFuncionarioClient();
using (new OperationContextScope(sv.InnerChannel))
{
     MessageHeader headerLocal = MessageHeader.CreateHeader("Key", "http://serviciosproduccionCP", "HostCP");
     OperationContext.Current.OutgoingMessageHeaders.Add(headerLocal);

     MessageHeader headerBogota = MessageHeader.CreateHeader("Key", "http://serviciosproduccionBogota", "HostBogota");
     OperationContext.Current.OutgoingMessageHeaders.Add(headerBogota);

     resultado = sv.FuncionarioLogin(login, passWord);
}

sv.Close();

Este código agrega dos encabezados a la petición funcionarioLogin, el valor HostCP y HostBogota es el que nos interesa agregar a los mensajes, con esa información el servicio podría realizar diferentes procesos como enrutamiento, registro, gestión de errores, respaldo entre otros.

 

Nota1: en WCF 4.0 se puede utilizar el tag header en el archivo de configuración del servicio.

Nota2: El protocolo usado en la comunicación debe tener soporte para la gestión de encabezados en el mensaje SOAP.

 

 

Juan Peláez

3Metas Corp

Multicast with WCF 3.5

Para escenarios de Arquitecturas Distribuidas con Multicast usando WCF 3.5 una opción posible es la siguiente:

[ServiceContract(Namespace = "http://servicios.cliente/2009/06", Name = "IRouter")]
public interface IServiceRouter
{
   [OperationContract(ReplyAction = "*", Action = "*")]
   Message ForwardMessage(Message message);
}

[ServiceBehavior(AddressFilterMode = AddressFilterMode.Any)]
class ServiceRouter : IServiceRouter
{
               
        #region IRouter Members
 
        public Message ForwardMessage(Message message)
        {
            Message BogotaServer;
            Message localServer;
 
            MessageBuffer messageBuffer = message.CreateBufferedCopy(int.MaxValue);
            Message messageCopy = messageBuffer.CreateMessage();
            Message messageCopy2 = messageBuffer.CreateMessage();
 
 
            //Almacenamiento en servidor local finca   
            int headerLocalIndex = message.Headers.FindHeader("Key", "http://serviciosproduccionCP");
            if (headerLocalIndex != -1)
            {
                string localHost = message.Headers.GetHeader<string>(headerLocalIndex);
                ChannelFactory<IServiceRouter> client = new ChannelFactory<IServiceRouter>(localHost);
                localServer = (client.CreateChannel()).ForwardMessage(messageCopy);
            }
            else
            {
                throw new InvalidOperationException("No se puede encontrar la cabecera 'local'");
            }
 
            //Almacenamiento en servidor de Bogotá.  
            int headerBogotaIndex = message.Headers.FindHeader("Key", "http://serviciosproduccionBogota");
            if (headerBogotaIndex != -1)
            {
                string bogotaHost = message.Headers.GetHeader<string>(headerBogotaIndex);
                ChannelFactory<IServiceRouter> client = new ChannelFactory<IServiceRouter>(bogotaHost);
                BogotaServer = (client.CreateChannel()).ForwardMessage(messageCopy2);
            }
            else
            {
                throw new InvalidOperationException("No se puede encontrar la cabecera 'bogota'");
            }
 
            return BogotaServer; 
 
        }
 
        #endregion
    }
 

Este código analiza la información enviada por el cliente y crea una copia del mensaje que es distribuido posteriormente a los servidores que estén registrados en el encabezado del mensaje. Esta técnica de enrutamiento se basa en Contenido, el contenido del header del mensaje SOAP.

 

 

Juan Peláez

3Metas Corp.

Grid changes in Edit Event–Framework 4.0

Uno de los clientes de 3Metas utiliza un conjunto importante de controles GridView de ASP.Net para su aplicación de misión crítica, por diferentes consideraciones de diseño estas grillas utilizan unas imágenes para indicar la modificación de registros, pero en vez de editar el registro en la grilla misma cuando se hace clic en el icono se dirige al usuario a un formulario con más validaciones e información, cuando finaliza la edición el usuario regresa a la grilla, muy elegante en términos de usabilidad y experiencia de usuario.

 

Para controlar el evento de edición y obtener el id del registro que se está modificando se hace uso del evento RowEditing del control. En las versiones 2 y 3.5 del framework este comportamiento funcionaba perfectamente, sin embargo al migrar la solución al framework 4.0 y visual studio 2010 este flujo de navegación dejo de comportarse de la forma acostumbrada, ahora cuando el usuario termina el proceso de edición y regresa a la página con el control GridView toda la grilla esta en modo de edición.

 

Este cambio introducido en el Framework 4.0 y que afecta muchas líneas de código ya construido está reportado en Connect y en el foro de ASP.Net, para nosotros la solución más rápida y que introducía menos problemas fue cancelar la edición del registro al terminar el método usando

 

e.cancel = true; //cancelar el proceso de edición por cambios en el comportamiento del framework 4.0

 

Probablemente la mejor forma de lograr este efecto de navegación no era precisamente utiliza el evento RowEditing, sino utilizar un link o image column template, incluso para procesar algo antes de navegar al formulario de edición se hubiera podido usar un button template o un template personalizado, pero la aplicación de nuestro cliente ya estaba así y no era viable realizar ese cambio.

 

 

www.juanpelaez.com

Integrando Visual FoxPro con Windows Communication Foundation

Uno de los clientes de 3Metas tiene una
base instalada muy importante de aplicaciones construidas en Visual Fox Pro 7, 8
y 9. Durante los últimos meses hemos trabajado en conjunto para desarrollar una
estrategia de migración de estas aplicaciones hacia una arquitectura orientada a
servicios (SOA) construida con WCF y el Framework 3.5 de .Net.

Uno de los aspectos claves de un proceso como estos consiste en evitar al
máximo que se siga construyendo funcionalidad en Visual Fox Pro (VFP) así que el
primer paso de la estrategia consiste en la integración de VFP con servicios de
Windows Communication Foundation (WCF) de forma tal que las aplicaciones
actuales se vean beneficiadas de las mejoras en la lógica de negocios o de
nuevas funcionalidades que se construyen con la última tecnología disponible.

1. Lo primero que debe hacerse es construir un servicio de WCF en lo que no
profundizare especialmente.

2. En nuestro caso una vez que tuvimos construido el servicio construimos una
fachada para su
utilización desde VFP.

3. En esta fachada establecemos las referencias a los servicios por medio de
la herramienta de Visual Studio, allí verificamos el tipo de conversión que se
realizará sobre las colecciones genéricas, como queremos proteger la inversión
del cliente en este proyecto esta fachada deberá poderse usar desde VFP pero
también desde aplicaciones desarrolladas con .Net hoy y en el futuro.

4. Creamos una clase que estará visibles por COM desde VFP y que será la
fachada para esta herramienta

5. Esta clase debe estar decorada como COM visible [ComVisible(true)] y para
asegurar las opciones de Intellisense también agregamos la decoración de
generación de la Interfaz [ClassInterface(ClassInterfaceType.AutoDual)]

6. Aunque visual Studio 2008 (VS2008) crea el constructor de forma
predeterminada preferimos asegurarnos así que agregamos el constructor, tener
presente aquí que el constructor no puede sobrecargarse ni recibir parámetros
para evitar problemas en COM

7. Luego creamos los métodos que serán consumidos por VFP y se los decora
como visibles para COM [ComVisible(true)].

8. En nuestro caso los métodos del servicio de WCF devuelven colecciones
genéricas de tipos específicos, por ejemplo la colección de colores de la
entidad color: [CollectionDataContract(Name = «Colores», Namespace
=»http://myDomain.com/Data/2010/01″)] public class Colores:
Collection<ColorEntity> {}, para que estos métodos puedan ser consumidos
desde VFP y teniendo en cuenta la restricción de COM para el manejo de genéricos
se realiza una modificación al método para que no retorne la colección sino que
retorno un arreglo de objetos que es algo que si puede ser manejado por VFP, la
posibilidad de convertir la colección genérica en un arreglo se adiciono con
LINQ, así que debe establecerse la referencia a LINQ en el proyecto y la clase,
al final debe quedar algo como esto:

 

   1:  using System;
   2:  using System.Collections.Generic;
   3:  using System.Linq;
   4:  using System.Text;
   5:  using System.Runtime.InteropServices;
   6:  using ServicioProducto;
   7:   
   8:  namespace ServicesFacade
   9:  {
  10:   
  11:      [ComVisible(true)]
  12:      [ClassInterface(ClassInterfaceType.AutoDual)]
  13:      public class ProductoFacadeVFP
  14:      {
  15:          //default constructor
  16:          public ProductoFacadeVFP() {}
  17:        
  18:          /// <summary>    
  19:          /// Metodo trae los colores del Sistema
  20:          /// </summary>
  21:          /// <returns></returns>
  22:          [ComVisible(true)]
  23:          public Color[] GetColores()
  24:          {
  25:              Colores colores = null;
  26:   
  27:              try
  28:              {
  29:                  ServicioProductoClient srv = new ServicioProductoClient();
  30:                  colores = srv.GetColores();
  31:                  srv.Close();
  32:              }
  33:              catch (Exception ex)
  34:              {
  35:                  throw ex;
  36:              }
  37:   
  38:              return colores.ToArray();
  39:          }
  40:       }
  41:  }

 

9. Al compilar este proyecto se obtendrá una DLL y un archivo de
configuración que corresponde a la forma como se establecerá la comunicación con
el servicio (Address y Bindings), estos dos archivos son los que deben
entregarse a los desarrolladores de VFP para que consuman los servicios.

 

Completada la fase de preparación y construcción de los servicios y su
fachada los desarrolladores de VFP ya pueden integrar estos componentes en sus
aplicaciones, para ello deben realizarse las siguientes actividades:

 

1. Registrar la Interfaz COM de la fachada de los servicios por medio del
comando regasm,
idealmente debería utilizarse el parámetro CODEBASE, la instrucción sería algo
como esto si se corre desde el directorio del Framework 2.0 de .Net:
C:WINDOWSMicrosoft.NETFrameworkv2.0.50727>RegAsm.exe
«C:3MetasClientsClienteProyectoServiceFacade ServicesFacade.dll»
/CODEBASE

2. Uno de los aspectos más importantes de WCF es la separación de la
configuración del servicio del código, el address y el binding del servicio que
están definidos en el archivo de configuración, este archivo de configuración se
generó al compilar la fachada. Para cada proyecto en el que va a utilizarse la
fachada se debe copiar el archivo de configuración del servicio en la misma ruta
del ejecutable de la aplicación de VFP o para depuración en la ruta donde reside
el proyecto, este archivo debe renombrarse con el nombre de la aplicación de VFP
y la extensión .config, en nuestro caso queda algo como esto:
aplicaciondelcliente.exe.config. Muchos de los errores que se pueden presentar
al usar la fachada tienen que ver con el hecho de que la aplicación no encuentra
el archivo de configuración.

3. Registrada la interfaz COM de la fachada y renombrado y ubicado
correctamente el archivo de configuración del servicio ya está todo listo para
que el desarrollador pueda utilizar los servicios desde VFP. Solo debe utilizar
el método CREATEOBJECT con el nombre de la clase de la fachada. Por ejemplo:

 

 

   1:  LOCAL Colores 
   2:  LOCAL MyColor as ServiceFacade.ServicioProducto.Color 
   3:  LOCAL ProductoFacade as ServicesFacade.ProductoFacadeVFP 
   4:   
   5:  ProductoFacade = CREATEOBJECT("ServicesFacade.ProductoFacadeVFP") 
   6:  Colores = ProductoFacade.GetColores() 
   7:   
   8:  OPEN DATABASE "C:3MetasClientsIntegrationsampledata" EXCLUSIVE 
   9:  USE color IN 0 EXCLUSIVE ALIAS tblColor 
  10:  ZAP 
  11:   
  12:  FOR EACH Item IN Colores 
  13:      INSERT INTO color (ColorId) VALUES (Item.ColorId) 
  14:  ENDFOR 

 

Listo, el equipo de desarrolladores de VFP está consumiendo servicios de WCF.

 

Juan Peláez

CTO

3Metas Corp.

 

 

Aclaraciones importantes:

 

· Con Visual Fox Pro se pueden consumir servicios Web, así que si se exponen
los servicios de WCF con un binding básico HTTP el servicio de WCF se ve
exactamente igual que un servicio web y por tanto se consume sin problemas desde
FoxPro, sin embargo desde la perspectiva técnica puede llegar a tener problemas
con objetos de negocios que VFP no entienda o que el servicio de WCF este
expuesto por otro binding lo que haría imposible consumirlo desde VFP nativo, en
nuestro caso las aplicaciones no estaba construidas consumiendo servicios web y
el cliente no quería invertir tiempo de los desarrolladores en que aprendieran a
consumir servicios web desde VFP, de allí tenía sentido que ellos consumieran
objetos COM que les son familiares.

 

· Al crearse el proyecto de fachada podría configurarse por medio de VS2008
la conversión de las colecciones genéricas en arreglos (ARRAYS) sin embargo eso
haría que la fachada perdiera tipos de datos que podrían ser utilizados por
clientes de .Net

 

Referencias:

http://www.dotnet247.com/247reference/msgs/15/75021.aspx
http://www.west-wind.com/presentations/VfpDotNetInterop/DotNetFromVFP.asp
http://www.west-wind.com/presentations/dotnetfromVfp/DotNetFromVfp_ComplexObjects.asp
http://blogs.msdn.com/calvin_hsia/archive/2005/09/02/460206.aspx

Publicidad

Migrando aplicaciones de visual fox pro a .net? tratando de establecer una
politica o un proceso de desarrollo para sus aplicaciones legacy? contactenos a
sales@3metas.com, nuestro equipo tiene la
experiencia y las habilidades necesarias para tener resultados exitosos.

Usando LiveMesh en Ambientes de Trabajo.

Uno de los paradigmas que 3Metas (www.3metas.com) está tratando de romper tiene que ver con las oficinas físicas. La mayoría de las personas que trabajan con nosotros permanecen en sus casas la mayoría del tiempo pero incluso aquellos que están en sitio con nuestros clientes trabajan desde sus casas algunas veces.

 

Para poder soportar este tipo de operación y la expansión geográfica que tenemos en mente es necesario establecer herramientas que reemplacen las que estamos acostumbrados a usar en oficinas tradicionales. Una de esas herramientas es Live Mesh (https://www.mesh.com/welcome/default.aspx)

 

Con Live Mesh cada una de las personas de nuestro equipo puede tener sincronizados en todo momento los documentos y/o archivos relacionados con un proyecto o incluso con la compañía, este es un enfoque diferente al que se le da tradicionalmente a este sistema para permitir la sincronización entre varias maquinas de un mismo usuario. A continuación una guía super rápida de cómo hacer para usar Mesh en escenarios de trabajo

 

1. Vaya a la página de Mesh y autentíquese con su usuario de Windows Live, Messenger o Hotmail.

2. Una vez que se autentique y este en la ventana de administración de dispositivos haga clic en el icono de agregar dispositivos e instale la aplicación Mesh en su computadora.

 

DeviceManager

 

InstallOnDevice  

 

3. Terminado el proceso de instalación lóguese desde la aplicación cliente y seleccione la carpeta que desea compartir con su equipo de trabajo.

 

ClientLogin

 

AddFolderToMesh  

 

4. Luego puede invitar a otros usuarios a que tengan acceso a estos documentos.

 

InviteMembers

5. Cuando los usuarios hagan cambios en los archivos de la carpeta todos recibirán una notificación.

 

Las carpetas de Mesh ahora aparecen en azul.

 

MeshOnDevice

 

El proceso anterior es para la primera persona que comparte un grupo de archivos. Para las personas que hacen parte del grupo de trabajo y que son invitadas por primera vez a usar un recurso compartido en Mesh el proceso es más o menor así:

 

1. Vaya a la página de Mesh y autentíquese con su usuario de Windows Live, Messenger o Hotmail.

2. Una vez que se autentique y este en la ventana de administración de dispositivos haga clic en el icono de agregar dispositivos e instale la aplicación Mesh en su computadora.

3. Terminado el proceso de instalación lóguese desde la aplicación cliente

4. Haga clic en el link de la invitación a la carpeta compartida que le llega a su correo.

5. Se habrá creado un icono en el escritorio, haga doble clic en este icono y verifique la ruta en la que quiere almacenar los archivos que se sincronice desde Mesh.

6. Listo, ya puede está usando Mesh.

 

Cada vez que usted o alguien del grupo de trabajo modifique un archivo todos serán actualizados. No existe control de versiones aun y el sistema informa de conflictos por modificaciones simultáneas, es mejor establecer un poco de orden para evitar problemas pero en general nos ha resultado una herramienta muy útil.

 

Si aun no le queda claro que hace LiveMesh piense en ella como un recurso de red compartido, pero que está en Internet. (La unidad P, Z, X o alguna de esas en las que lo obligan a guardar las cosas que quieren que les hagan backup y que generalmente están en un servidor de la red).

 

Juan Pelaez
CTO
3Metas.

 

Keywords: Emprendimiento, Entrepreneur, Innovación, Creatividad, Gestión de Empresas de Software, Empresa Virtual, commute work, Juan Pelaez, 3Metas, Herramientas, Live Mesh

Windows 7 y Dispositivos Moviles

 

Algo rápido, en @3Metas hemos trabajado mucho los últimos meses en el desarrollo de aplicaciones para dispositivos móviles que corren Windows Mobile. Recientemente actualizamos nuestras maquinas de desarrollo a Windows 7 y hemos encontrado un problema cuando se consumen servicios de WCF.

Como sabrán para consumir un servicio WCF desde un dispositivo móvil usando el compact framework hay que crear una clase proxy utilizando la utilidad NetCFSvcUtil.exe que hace parte del conjunto power toys del compact framework 3.5 de .net.

El problema es que cuando se utiliza esta utilidad en Windows 7 siempre se produce un error como este:

Attempting to download metadata from ‘http://localhost/DinnerNow/service/DeliveryService.svc’ using WS-Metadata Exchange or DISCO.
Error: An error occurred in the tool.

Error: Error in the application.

Hay una incompatibilidad entre el tool de generación de la  clase proxy y Windows 7, afortunadamente ya fue resuelto y puede obtenerse una actualización del tool desde este enlace.

O se puede generar el archivo proxy en Vista o XP y pasarlo al proyecto en Windows 7 :-).

Referencias.

http://blogs.msdn.com/habibh/archive/2009/06/26/netcfsvcutil-exe-and-windows-7.aspx

http://news.softpedia.com/news/Updated-NetCFSvcUtil-exe-for-Windows-7-and-Vista-SP2-118787.shtml

Juan Peláez
CTO
3Metas Corp.

Keywords: Dispositivos móviles, Windows Mobile, WCF, Compact Framework, 3Metas, Desarrollo de Aplicaciones, Soluciones para Dispositivos Móviles, Mobile Devices, Aplicaciones Móviles, Desarrollo de Software, Arquitectura de Aplicaciones Moviles.

 

Publicidad: Necesita desarrollar aplicaciones para Dispositivos Moviles con Windows Mobile?, quiere usar SOA en dispositivos Moviles?, contactenos a sales@3metas.com.

De TFS, Control de Versiones, Branching y Otras

En 3Metas usamos Visual Studio Team Fundation Server (VSTFS2008) como sistema de gestión de proyecto y control de versiones (*), sin embargo al momento de crear las soluciones cometí un error por no revisar con cuidado la guía de Branching de Patterns And Practices de Microsoft lo que me llevo a quedar con los proyectos y la documentación andando pero con un esquema incorrecto de control de código fuente.

 

La solución borrar (destruir) los repositorios de Código Fuente (previo backup por supuesto J) y reorganizar el sistema.

Para destruir un repositorio de código Fuente, se utiliza el comando tf destroy, (Btw: se encuentra en la ruta Program FilesMicrosoft Visual Studio 9.0Common7IDE>) desde la consola de comandos, una confirmación de borrado aparecerá y luego se listaran los archivos y carpetas que se eliminaron.

 

Después de Borrado puede usarse VS2008 con el Team Explorer para volver a la interfaz de gestión de los sistemas de control de código fuente y allí crear de nuevo el repositorio y configurarlo correctamente. Es importante anotar que hay que volver a asignar los permisos a los usuarios que aunque siguen teniendo permisos en el TFS en el Proyecto al que están asignados ahora no tienen permisos en el repositorio de control de versiones. Estos permisos se asignan en la pestana de seguridad de las propiedades del repositorio

 

clip_image002

(el borrado no es lo mismo, el borrado solo marca el repositorio pero sigue existiendo en el sistema se puede ver aquí: Tools > Options > Source Control > Visual Studio Team Foundation Server and check Show deleted items in the Source Control Explorer que los archivos no se borraron)

(Esto también es diferente a la eliminación del proyecto porque yo no quería perder el portal, documentos, work ítems, etc que ya se habían alimentado al sistema)

 

Juan Pelaez

CTO

3Metas Corp.

 

KeyWords: TFS2008, Visual Studio Team Foundation Server 2008, Buenas Prácticas de Desarrollo de Software, Branching, Control de Versiones, Juan Pelaez, 3Metas, Consultores, Expertos Tecnología Microsoft, Estrategia Digital, Nuevos Medios, Desarrollo de Soluciones Interactivas, Twitter, Facebook, Integración de Redes Sociales.

 

 

Team Fundation Server (TFS) es una de esas herramientas “must to have” para una compañía de tecnología como la nuestra, las características de control de versiones, gestión del proyecto, personalización de la metodología de desarrollo, etc, etc, la hacen imprescindible en el modelo que estamos construyendo de una empresa en la que cada persona puede trabajar desde donde quiera.

Aunque no utilice VSTFS2008 una compañía que desarrolle software en algún momento siempre debe tener un sistema de control de versiones, uno basado en Internet agrega gran flexibilidad, otro sistema que hemos usado con buenos resultados es Subversion.

Publicado en www.juanpelaez.com

Publicidad: Necesita integrar sus estrategias de comunicaciones tradiciones con nuevos medios? está buscando aprovechar las oportunidades de mercadeo BTL usando Facebook, Twitter, Flicker, YouTube? Contactenos a sales@3metas.com, tenemos la experiencia y las capacidades para que su proyecto sea exitoso.

 

Splendid CRM Version 2.1 Codigo Fuente

En www.3metas usamos el sistema de CRM de SplendidCRM Company, que es una implementación en .Net del muy conocido Sugar CRM. Hace poco se lanzo una versión nueva (3.0), que incluye un montón de nuevas características en las versiones empresariales y como siempre una versión de comunidad open source, una de las novedades de la versión nueva es la integración de Windows WorkFlow Foundation con el Core del Sistema CRM. (Por cierto no actualice desde la versión 2.1 a la 3.0, algunas características dejaran de estas habilitadas.)

 

Sin embargo parece que ya no es posible encontrar la versión 2.1 del código. Algunas personas me lo han pedido por internet, así que lo comprimí y lo publiqué en mi skydrive:

 

http://cid-1a646e447a191ea8.skydrive.live.com/self.aspx/Public/SplendidCRM21.zip

 

Espero que sea útil para las personas que necesitan esta versión, quieren conocer el código original, están dado soporte a la versión, etc.

 

Juan Pelaez.
Arquitecto de Software

Publicado en: www.juanpelaez.com

Keywords: 3Metas Corp,  Juan Pelaez, Colombia, CRM, Splendid CRM, Digital Strategy, Digital Companies. Estragias CRM, Empresas CRM, Implementacion de CRM, CRM Open Source, Desarrolladores CRM, Implementadores de CRM.

 

Publicidad: Quiere implementar una estrategia de CRM exitosa en su compañía, quiere utilizar software libre sobre plataforma Microsoft para su sistema de CRM. Necesita ayuda para identificar la mejor solución para su necesidad. Nuestro equipo de 3Metas puede ayudarle. Contáctenos. sales@3metas.com

Ejecutando Windows 7 en MacBookPro

 

Hace algún tiempo compré una computadora MacBookPro, y le instale un sistema de triple partición, la experiencia era buena pero había días en que (me imagino que como la mayoría), decía “DIOS Vista, muévete”, especialmente programando, haciendo render, navegando en Internet y esas cosas. En fin…

 

Ayer saque tiempo y le instalé a la maquina Windows 7. La experiencia de instalación estuvo bien, hice un upgrade del sistema Windows Vista así que la cosa tomó más de los 30 minutos que promocionan.

 

La calificación de la maquina fue la misma de vista: 4.8

 

Todos mis archivos y configuración de programas parecen estar bien, curiosamente ahora tengo más espacio libre que cuando inicie la instalación.

 

El sistema de update del OS se fue a actualizar, está cargando versiones nuevas de los drivers de la red inalámbrica y la tarjeta de video.

Para conseguir la llave de licencia fue al sitio de Microsoft, seleccione un instalador en versión e idioma, inicie el proceso de registro, pero no descargue el software solo llegue a la ventana en la que me dan el numero de licencia, lo copie en la ventana de activación y listo. (por cierto que hice todo el proceso sin este número, de esta forma la maquina será útil por 30 días)

Una cosa interesante fue que el instalador mostró una lista de los programas que tendrían problemas para ejecutarse después de la instalación pero también indicaba que si se reinstalaban funcionarían bien, los más notorios:

 

Microsoft Network Monitor y SQL Server 2005, aunque yo uso SQL2008 (WTF?), así que no tengo como comprobar si hay algún problema con SQL Server 2005 y mi upgrade de Windows 7, SQL Server 2008 express funciona perfectamente después de la instalación. (Revisando el visor de eventos si parece que tengo problemas con reporting services y la creación de contadores de desempeño.).

 

Sin embargo al ejecutar el Network Monitor después de la instalación encuentro que hay una nueva versión así que eso resuelve los problemas, a pesar de los errores en el event viewer Reporting Services también está funcionando bien, habrá que investigar más.

 

Después de la instalación el Input Remaper que usaba para controlar los ventiladores no funciona más, sin embargo aparentemente ahora la maquina se calienta menos. Todo lo demás va bien, la maquina realmente se siente más rápida, la barra de tareas es buenísima para cambiar de aplicaciones, el sistemita de control de los iconos al lado del reloj es de lujo.

 

La versión de pruebas que instale es Ultimate así que ahora podre probar el reconocimiento de voz en español finalmente a ver si eso si funciona o no.

 

El nuevo Paint, Calculadora y NotePad son curiosos.

 

Seguire probando..

 

Juan Peláez.

Arquitecto de Software.

3Metas Corp.

 

Publicado en www.juanpelaez.com,  Si está leyendo esto en otra dirección no se pierda el contenido del sitio original.

 

 

Keywords: Windows 7, MacBookPro, Instalacion, Leopard, Linux, Windows Vista, Windows 7, 3Metas Corp, Juan Peláez, Colombia, Fort Lauderdale, Florida, USA, Digital Strategy Company, New Media Company, Social Media Company.

 

Publicidad: Quiere adoptar las últimas tecnologías Microsoft pero no sabe por dónde comenzar, nuestro grupo de expertos pueden ayudarlo a explotar lo mejor y más novedoso de esta plataforma en beneficio de su negocio. Escribanos sales@3metas.com