Bueno voy a empezar el post un poco off-topic. Hoy termina el Blog Posting Month durante el cual se supone que los bloggers deberíamos hacer un post diario durante todo un mes, yo empecé tarde pero cumplí XD. Y bueno como celebración a este mes quiero recomendarles unos cuantos blogs de buenos amigos para que los tengan por ahí y los lean :)
- Memorias de un lobo con sueños de Yumer López
- salsaparapizza... de Cristian Caroli
- JSanGil de Jose San Gil
- Some code, design and random things de Saúl Hernández
- /random/thoughts de Nicolás Lara
Bueno vamos con el post :P
Hace un rato leyendo mi Google Reader revisé un post que me compartió JSanGil sobre Go, el lenguaje de programación desarrollado por la gente de Google y sacado al "mercado" hace creo que un poco más de un mes. Lamentablemente la falta de tiempo libre me ha privado de ver que tal es el lenguaje pero tengo entendido que es una mezcla entre Python y C++, siendo dos lenguajes que me agradan y me manejado en algún momento u otro, me atrae el concepto. Pero en particular en este post no voy a hablar sobr el lenguaje Go ya que no lo he probado sino una pequeña polémica que se ha creado alrededor del lanzamiento de Go.
Poco después de salir Go, en la sección de Issue Tracker disponible en la página principal del lenguaje http://golang.org/ surgió un tal Francis McCabe alegando que él ya había creado un lenguaje de programación llamado "Go!" acerca del cual incluso publicó un libro ("Let's Go!") pero cometió el error de nunca registrar el copyright del nombre. Esto obviamente presenta un problema y una decisión importante que tomar para la gente del proyecto Go. El lenguaje del señor McCabe no es tan místico o salido de la nada como podría parecer, antes del lanzamiento de Go al buscar "Go programming language" en Google el primer resultado aparentemente era el lenguaje de este señor entonces cabría pensar: ¿Cómo es que la gente del equipo de Go no hizo esta investigación? ¿O acaso sí la hicieron y cruzaron los dedos y esperaron a ver si nadie decía nada?
Técnicamente no están haciendo nada mal... El lenguaje original no está registrado y es totalmente válido que Google utilice el nombre Go pero los argumentos de la comunidad son algo válidos desde el punto de vista de la mentalidad y lema de Google: "Do no evil". Además ante las constantes paranoias (las cuales no comparto y es similar a lo que comentó Gil-lom en su post de hoy) de muchos de los internautas sobre el brazo infinito de Google que parece arropar todos los ámbitos de la tecnología, y lo cual incluso los ha hecho merecederos de una seria investigación de monopolio por parte del gobierno de Estados Unidos comparable únicamente con la abierta a Microsoft en sus tiempos de gloria, Google tiene una gran lupa encima por un grupo considerable de internautas esperando ver cuál va a ser la próxima movida de Google en cuanto a esta situación... ¿Serán los malos o una vez más harán lo correcto? Les avisaré apenas sepa :P
See ya,
Kris
lunes, 30 de noviembre de 2009
domingo, 29 de noviembre de 2009
CRM Filtered Lookup Multi
Hoy toca un poco más de info empresarial jeje. Bueno mencionando otra vez el sistema Microsoft Dynamics CRM 4.0, recientemente tuve la necesidad de realizar filtros al momento de asignar relaciones entre dos entidades, por ejemplo asignarle a un cliente un casillero existente pero al momento de consultar la lista de casillero que se puedan asignar sólo mostrar los que no tienen un cliente previamente asignado. Cuando estuve buscando la información noté la falta de un tutorial que estuviese en español ya que la única información al respecto que logré conseguir fue en el post de Jim Wang: CRM Filtered Lookup Multi y está en inglés. Voy a suponer que deben saber algunas cosas como poder crear y registrar plugins en el sistema así como la asignación de código en los eventos Javascript de los formularios.
Lo primero que deben hacer es crear un plugin con el siguiente código (extraído del blog de Jim Wang):
Una vez creado el plugin y teniendo el archivo .dll correspondiente deben registrar ese plugin en el evento Execute sin especificar entidad y seteando los valores en los que se pueden apreciar en esta imagen:
Register Execute Event. Deben tomar en consideración que deben adaptar el código a sus necesidades particulares.
Luego de haber hecho esto deben insertar el siguiente código en el evento OnLoad del formulario de la entidad a la que desean asociar la instancia seleccionada.
Este código funciona en el contexto de relaciones N-N en el sistema. En el trabajo logré modificar el código que se muestra aquí para relaciones de tipo 1-N usando consultas FetchXML y AJAX pero lo pondré en otro post ya que no tengo el código disponible ahorita. Cualquier duda en cuanto a este ejemplo pregunten en los comentarios o mándenme un correo electrónico a kpantic@manapro.com
See ya,
Kris
Lo primero que deben hacer es crear un plugin con el siguiente código (extraído del blog de Jim Wang):
/*
* Microsoft Dynamics CRM Lookup Filter
* Plug-Ins: Execute message on the Pre Stage/Synchronous/Server/Parent Pipeline.
* Jim Wang @ Aug 2009, http://jianwang.blogspot.com, http://mscrm.cn
*
*/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Web;
using Microsoft.Crm.Sdk;
namespace CRMExecuteEvent
{
public class CRMExecuteEvent : IPlugin
{
string lookupId;
public void Execute(IPluginExecutionContext context)
{
lookupId = HttpContext.Current.Request.QueryString["id"] == null ? null : HttpContext.Current.Request.QueryString["id"].ToString();
if (lookupId == null) return;
try
{
if (context.InputParameters.Contains("FetchXml"))
{
string beforeXml = (String)context.InputParameters["FetchXml"];
if (beforeXml.Contains("<entity name="\"new_shippingmark\"">") /* Aquí deben reemplazar new_shippingmark y poner el nombre de la entidad a consultar */ && beforeXml.Contains("xml-platform"))
{
//Aquí deben personalizar la consulta FetchXML que desean hacer en lugar de la que iba a mandar el sistema.
string afterXml =
"";
//Reemplazamos el string de consulta fetchXML por el que deseamos.
context.InputParameters["FetchXml"] = beforeXml.Replace(beforeXml, afterXml);
}
}
}
catch (System.Web.Services.Protocols.SoapException ex)
{
throw new InvalidPluginExecutionException("An error occurred in the CRM plug-in.", ex);
}
}
}
}
Una vez creado el plugin y teniendo el archivo .dll correspondiente deben registrar ese plugin en el evento Execute sin especificar entidad y seteando los valores en los que se pueden apreciar en esta imagen:
Register Execute Event. Deben tomar en consideración que deben adaptar el código a sus necesidades particulares.
Luego de haber hecho esto deben insertar el siguiente código en el evento OnLoad del formulario de la entidad a la que desean asociar la instancia seleccionada.
var relId = "new_new_shippingmark_quote"; //Estos son los valores que deben adaptar a sus
var lookupId = crmForm.all.customerid; //necesidades y acorde a las entidades a usar.
var lookupEntityTypeCode;
var navId = document.getElementById("nav" + relId);
if (navId != null)
{
var la = navId.onclick.toString();
la = la.substring(la.indexOf("loadArea"), la.indexOf(";"));
navId.onclick = function()
{
eval(la);
var areaId = document.getElementById("area" + relId + "Frame");
if(areaId != null)
{
areaId.onreadystatechange = function()
{
if (areaId.readyState == "complete")
{
var frame = frames[window.event.srcElement.id];
var li = frame.document.getElementsByTagName("li");
for (var i = 0; i < li.length; i++)
{
var action = li[i].getAttribute("action");
if(action != null && action.indexOf(relId) > 1)
{
lookupEntityTypeCode = action.substring(action.indexOf("\(")+1, action.indexOf(","));
li[i].onclick = CustomLookup;
break;
}
}
}
}
}
}
}
function CustomLookup()
{
var lookupSrc = "/" + ORG_UNIQUE_NAME + "/_controls/lookup/lookupmulti.aspx?class=&objecttypes=" + lookupEntityTypeCode + "&browse=0";
if(lookupId != null && lookupId.DataValue != null && lookupId.DataValue[0] != null)
{
lookupSrc = lookupSrc + "&id=" + lookupId.DataValue[0].id;
}
var lookupItems = window.showModalDialog(lookupSrc, null);
if (lookupItems) // This is the CRM internal JS funciton on \_static\_grid\action.js
{
if ( lookupItems.items.length > 0 )
{
AssociateObjects( crmFormSubmit.crmFormSubmitObjectType.value, crmFormSubmit.crmFormSubmitId.value, lookupEntityTypeCode, lookupItems, true, null, relId);
}
}
}
Este código funciona en el contexto de relaciones N-N en el sistema. En el trabajo logré modificar el código que se muestra aquí para relaciones de tipo 1-N usando consultas FetchXML y AJAX pero lo pondré en otro post ya que no tengo el código disponible ahorita. Cualquier duda en cuanto a este ejemplo pregunten en los comentarios o mándenme un correo electrónico a kpantic@manapro.com
See ya,
Kris
sábado, 28 de noviembre de 2009
Pacman
Bueno antes de terminar el día voy a postear un poco sobre un proyecto que estoy haciendo para la entrega final de la materia Inteligencia Artificial 2.
La idea general es hacer un agente automatizado que juegue Ms. Pacman de forma inteligente. La implementación va a estar basada en una investigación realizada por Simon Lucas disponible aquí: Evolving a Neural Network Location Evaluator to Play Ms. Pac-Man. Consiste en implementar una red neural para la evaluación de las decisiones a tomar en cada estado del juego usando simultáneamente un algoritmo genético para el entrenamiento de los pesos de la red usando como cálculo del fitness el promedio de scores logrados por el algoritmo después de varias simulaciones del juego.
Ahora, porque Ms. Pacman? Básicamente porque es más retador. Los fantasmas en la implementación de Pacman original siempre toman las mismas acciones, o sea, son determinísticos, mientras que en Ms. Pacman toman actitudes aleatorias lo cual hace más impredecible y más difícil aprender y tomar las decisiones correctas. Bueno no tengo tiempo ahorita como para ponerme a escribir 10 párrafos más sobre el proyecto como quisiera pero luego de terminarlo les echo el cuento completo y en detalle cómo hicimos todo, que librerías usamos y un video con los resultados definitivos :), será divertido.
See ya,
Kris
La idea general es hacer un agente automatizado que juegue Ms. Pacman de forma inteligente. La implementación va a estar basada en una investigación realizada por Simon Lucas disponible aquí: Evolving a Neural Network Location Evaluator to Play Ms. Pac-Man. Consiste en implementar una red neural para la evaluación de las decisiones a tomar en cada estado del juego usando simultáneamente un algoritmo genético para el entrenamiento de los pesos de la red usando como cálculo del fitness el promedio de scores logrados por el algoritmo después de varias simulaciones del juego.
Ahora, porque Ms. Pacman? Básicamente porque es más retador. Los fantasmas en la implementación de Pacman original siempre toman las mismas acciones, o sea, son determinísticos, mientras que en Ms. Pacman toman actitudes aleatorias lo cual hace más impredecible y más difícil aprender y tomar las decisiones correctas. Bueno no tengo tiempo ahorita como para ponerme a escribir 10 párrafos más sobre el proyecto como quisiera pero luego de terminarlo les echo el cuento completo y en detalle cómo hicimos todo, que librerías usamos y un video con los resultados definitivos :), será divertido.
See ya,
Kris
Nice data :)
Ya que son más de las 12, este puede contar como un post de mi 3er día en el blog jeje pero nah, mas tarde pongo algo más interesante :P.
Ahorita estaba revisando mi Google Analytics del blog y resulta que estas son las estadísticas de los browsers usados por los visitantes jajajaja, me gustan, me gustan XD.
Firefox 61.11%
Chrome 27.78%
Safari 8.33%
Mozilla 2.78%
See ya,
Ahorita estaba revisando mi Google Analytics del blog y resulta que estas son las estadísticas de los browsers usados por los visitantes jajajaja, me gustan, me gustan XD.
Firefox 61.11%
Chrome 27.78%
Safari 8.33%
Mozilla 2.78%
See ya,
Kris.
viernes, 27 de noviembre de 2009
Chromium OS and Google
Vamos empezando bien :D 2 días / 2 entradas :P.
Bueno como muchos saben hace algunos días Google mostró los avances de su sistema operativo Google Chrome OS, dedicado exclusivamente a lo que se conoce como "cloud computing" donde todos los datos del usuario se almacenan en la "nube" de Internet. Voy a evitar comentar sobre el funcionamiento del sistema hasta que tenga la oportunidad de probarlo y para eso voy a usar esto: Chromium OS Build by Hexxeh. En ese link tenemos una guía completa de como montar Chrome OS en un pendrive booteable para probarlo sin necesidad de instalar ningún software adicional ni tener que hacer modificaciones a la tabla de particiones de nuestra computadora...
Bueno como muchos saben hace algunos días Google mostró los avances de su sistema operativo Google Chrome OS, dedicado exclusivamente a lo que se conoce como "cloud computing" donde todos los datos del usuario se almacenan en la "nube" de Internet. Voy a evitar comentar sobre el funcionamiento del sistema hasta que tenga la oportunidad de probarlo y para eso voy a usar esto: Chromium OS Build by Hexxeh. En ese link tenemos una guía completa de como montar Chrome OS en un pendrive booteable para probarlo sin necesidad de instalar ningún software adicional ni tener que hacer modificaciones a la tabla de particiones de nuestra computadora...
FetchXML Builder
En el trabajo suelo trabajar mucho con AJAX y en particular sobre un sistema de Microsoft llamado Microsoft Dynamics CRM, la versión 4.0.
Para agregarle dinamismo y comodidades a muchos de los formularios y vistas usadas en el software se utiliza un protocolo particular a través de AJAX donde la información codificada en el XML usado necesita un formato específico llamado FetchXML. Para escribir esta codificación puede no ser sencillo cuando trabajamos con muchas entidades y enlaces en la consulta que deseamos hacer entonces disponemos de una herramienta muy útil llamada FetchXML Builder. La pueden conseguir acá: FetchXML Builder y nos permite definir, para la entidad que deseamos consultar, los atributos a retornar por la consulta así como las condiciones y enlaces con otras unidades que deseamos que se cumplan en los datos a obtener. Al insertar el código en Javascript es cuestión de cambiar los "<" por "<" y los ">" por ">" para que al enviar el XML para la consulta AJAX no haya problemas y listo, les ahorra mucho tiempo de pensar como va a ser la consulta y la redacción de la misma.
See ya,
Kris
Para agregarle dinamismo y comodidades a muchos de los formularios y vistas usadas en el software se utiliza un protocolo particular a través de AJAX donde la información codificada en el XML usado necesita un formato específico llamado FetchXML. Para escribir esta codificación puede no ser sencillo cuando trabajamos con muchas entidades y enlaces en la consulta que deseamos hacer entonces disponemos de una herramienta muy útil llamada FetchXML Builder. La pueden conseguir acá: FetchXML Builder y nos permite definir, para la entidad que deseamos consultar, los atributos a retornar por la consulta así como las condiciones y enlaces con otras unidades que deseamos que se cumplan en los datos a obtener. Al insertar el código en Javascript es cuestión de cambiar los "<" por "<" y los ">" por ">" para que al enviar el XML para la consulta AJAX no haya problemas y listo, les ahorra mucho tiempo de pensar como va a ser la consulta y la redacción de la misma.
See ya,
Kris
jueves, 26 de noviembre de 2009
Welcome...
Hola gente :),
Hoy tuve una noche bastante ociosa y entre todas las ideas que pasaron por mi mente una de esas fue crear un blog, tengo tiempo por hacerlo pero como de costumbre, entre una cosa y otra, pasó de largo. Pero bueno, heme aquí hoy, escribiendo la primera entrada de mi blog. Voy a hacer todo lo posible por mantenerlo actualizado, pero no prometo nada :D, vamos a ver que tal me va.
Voy a tratar de publicar todas esas nimiedades que me puedan parecer interesante, ya sean noticias, cosas que haya hecho en clases o en el trabajo y bueno, capaz un día me siento inspirado y simplemente me pongo a comentar sobre algún tema en particular, quien sabe jeje.
Por el momento no me encanta el diseño pero fue el template mejorcito que conseguí, cuando tenga un chance capaz me pongo a hacer uno yo pero por ahora se queda así :P.
Nos estamos viendo,
Kris.
Hoy tuve una noche bastante ociosa y entre todas las ideas que pasaron por mi mente una de esas fue crear un blog, tengo tiempo por hacerlo pero como de costumbre, entre una cosa y otra, pasó de largo. Pero bueno, heme aquí hoy, escribiendo la primera entrada de mi blog. Voy a hacer todo lo posible por mantenerlo actualizado, pero no prometo nada :D, vamos a ver que tal me va.
Voy a tratar de publicar todas esas nimiedades que me puedan parecer interesante, ya sean noticias, cosas que haya hecho en clases o en el trabajo y bueno, capaz un día me siento inspirado y simplemente me pongo a comentar sobre algún tema en particular, quien sabe jeje.
Por el momento no me encanta el diseño pero fue el template mejorcito que conseguí, cuando tenga un chance capaz me pongo a hacer uno yo pero por ahora se queda así :P.
Nos estamos viendo,
Kris.
Suscribirse a:
Comentarios (Atom)
