| Rogelio's profileEcyware SpaceBlogLists | Help |
Ecyware SpaceCode - Codigo, Panama, Suecia y mas cosas |
|||||
|
May 26 Sobre articulo en La Prensa Aqui tienen un extracto y el enlace. Todavia opino lo mismo y voy mas aya, que podemos hacer otras cosas como FabLab en Panamá, que lo veo más interesante. Pero yo soy una persona futurista, posiblemente lo tengamos en algunos años. "La compra de las laptop por el Gobierno para estudiantes graduandos, a un costo de más de 10 millones de dólares, fue una inversión poco rentable. Estas declaraciones fueron hechas por Rogelio Morrell Caballero, de la empresa de consultoría tecnológica Admios S.A., afiliada a la Ciudad del Saber." ![]() http://mensual.prensa.com/mensual/contenido/2009/05/26/hoy/panorama/1767290.asp Saludos, Rogelio March 26 Microsoft y su HttpClient http://www.pluralsight.com/community/blogs/aaron/archive/2009/03/13/consuming-the-twitter-rest-api-with-httpclient-wcf-rest-starter-kit.aspx Me gusta cuando se inspiran en las cosas mias. Pongo el código para que vean como utilizan internamente HttpRequest con Linq to XML try March 19 La nube o servicios de aplicativos por internetCloud Computing o como yo lo denoto Servicios de Aplicativos por
Internet (SAI), es la nueva tendencia que se esta viviendo en 2009. Les puedo comentar mis experiencias con algunas de estas nuevas tecnologías. Salesforce.com Interesante: Tiene un modelo de base de datos que mas se asemeja a Microsoft Access. Tiene un lenguaje como JavaScript que se llama Apex y en realidad sirve para ciertas cosas muy limitadas, pero al parecer se puede hacer cosas como servicios web y triggers. Todo el esquema o modelo además se puede acceder por servicios SOAP. El diseño de Salesforce.com permite hospedar aplicaciones Flash, Flex o Silverlight y permite que este sea un modelo "casi" ideal para implementaciones de aplicaciones ricas de internet o RIA (Rich Internet Applications). Potencial: Tiene un gran potencial porque ya tienen rato en el mercado y porque el modelo tiene semejanzas a Microsoft Access, es decir, es fácil de entender. Ahora no quiere decir que las relaciones por si sean Entidad / Relación en un 100%. Desventajas: El modelo de negocios es por subscripción, como el de todos los modelos de Cloud Computing. El costo es igual para todos aunque no estoy seguro si varía por región geográfica (una mensualidad que oscila entre 30 a 50 dolares). Otra desventaja es que Apex solo puede ser ejecutado dentro de un trigger o un llamado de SOAP. Es decir, no puedo tener un tipo de Job que ejecute Apex. Desventaja muy grande. Amazon Web Services (AWS) Interesante: Tienen toda clase de servicios, pero los que mas interesan son ECS2 (Elastic Cloud Services), traducción es un sistema de virtualización de sistemas operativos en Windows o Linux ; S3, el cual es un servicio de almacenamiento de archivos y SimpleDB que es el servicio de base de datos no relacional. Potencial: ECS2 tiene potencial para ciertos escenarios, el costo a mi todavía no me llama la atención al menos que sea para ejecutar aplicaciones por cierto intervalo de tiempo. Aun prefiero mi servidor barato con costo de operación barato y que se pueda controlar. Me gusta la idea si de que se puede tener varias instancias de la misma imagen (imaginate tener Win2003 Data Center Edition con 400kb/s de internet downstream!) de un robot web y que te almacene todo en SimpleDB. Esto es de maravilla en mi mundo de robots web que parsean la web. Desventajas: El modelo de subscripción puede ser costoso, aunque Amazon recientemente esta introduciendo un modelo de subscripción que se asemeja al de web hosting (tarifa fija mensual). Por lo general, Amazon esta cobrando por hora si es ECS2, por ancho de banda y almacenamiento si es SimpleDB o S3. Todavía me falta evaluar Google App Engine y Windows Azure. Este primero me costo obtener la cuenta ya que solo es posible si estas en Estados Unidos (no pregunte como hice, pero lo hice), y el otro es por invitación pero Microsoft es abierto a esto. March 11 Ecyware WebRobot 1.0 - antecedentes Estoy tomando las tecnologias en HttpLightClient y IELightClient y creando una herramienta inspirada en estos, que digamos son hermanos lejanos de GreenBlue Inspector. La utilidad de esto es que los robots web necesitan estar lo mas cercano a Internet Explorer para ser exitosos. Esto quiere decir que necesitan la ayuda de Internet Explorer para navegar. Larga historia, pero les puedo sumarizar en que todavia no encuentro un motor JavaScript que no sea de un browser y sea opensource lo suficiente robusto e inteligente para que durante la ejecucción de un robot no me salga un popup preguntadome que quiero hacer. Hasta ahi eso. Estoy iniciando con un WPF usando un Frame y esto lo convierto a un WebBrowser pero el dia de ayer me encontre con la sorpresa de que me tiraba una cantidad de errores de JavaScript. Parece que hoy encontre la solución al problema. (Todavia tengo que juntar mis ideas, pero el WebRobot va tener la opción de ejecutar scripts, habilitarlo para que sea visible o invisible, y por default debe tener un modelador de base de datos para guardar los datos del robot. Un flujo como: Robot Script -> Robot Runner -> Robot DataBase). http://msdn.microsoft.com/en-us/library/system.windows.controls.webbrowser.aspx
There is much functionality of the native Web Browser control that our managed wrapper does not yet expose. The following code snippet [prepared with Matt G.] shows how to get the IWebBrowser2 interface from the WPF WebBrowser control. This allows access to methods on the object that are not publicly exposed in other ways for the control. Do note, however, that this code sample will only work in fully trusted code.
First, see IWebBrowser2 documentation here: http://msdn.microsoft.com/en-us/library/aa752127.aspx ... To compile this code, add a COM Reference to System32\shdocvw.dll or ieframe.dll (whichever you have, depending on version of IE).
[ComImport, InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] [Guid("6d5140c1-7436-11ce-8034-00aa006009fa")] internal interface IServiceProvider { [return: MarshalAs(UnmanagedType.IUnknown)] object QueryService(ref Guid guidService, ref Guid riid); } static readonly Guid SID_SWebBrowserApp = new Guid("0002DF05-0000-0000-C000-000000000046");
... IServiceProvider serviceProvider = (IServiceProvider)myWebBrowser.Document; Guid serviceGuid = SID_SWebBrowserApp; Guid iid = typeof(SHDocVw.IWebBrowser2).GUID; SHDocVw.IWebBrowser2 myWebBrowser2 = (SHDocVw.IWebBrowser2) serviceProvider.QueryService(ref serviceGuid, ref iid); ...
And then myWebBrowser2 is ready for interaction.
You can also handle the native web browser's events (http://msdn.microsoft.com/en-us/library/aa768309(VS.85).aspx) through the generated managed wrappers, like this: SHDocVw.DWebBrowserEvents_Event wbEvents = (SHDocVw.DWebBrowserEvents_Event)myWebBrowser2; void OnWebBrowserNewWindow(string URL, int Flags, string
TargetFrameName, ref object PostData, string Headers, ref bool
Processed) { // Set Processed to cancel opening of the new window. } January 14 CodeDOM sencillamente con Method Extensions // Class and namespace declaration CodeCompileUnit targetUnit = new CodeCompileUnit(); CodeNamespace namespaceDeclaration = new CodeNamespace(NAMESPACE); namespaceDeclaration.Imports.Add(new CodeNamespaceImport("System")); namespaceDeclaration.Imports.Add(new CodeNamespaceImport("System.Runtime.InteropServices")); namespaceDeclaration.Imports.Add(new CodeNamespaceImport("Microsoft.Win32")); CodeTypeDeclaration targetClass = new CodeTypeDeclaration(CLASSNAME) { IsClass = true, TypeAttributes = TypeAttributes.Public, IsPartial = true }; namespaceDeclaration.Types.Add(targetClass); targetUnit.Namespaces.Add(namespaceDeclaration); CodeAttributeDeclaration classInterfaceAttribute = new CodeAttributeDeclaration("System.Runtime.InteropServices.ClassInterfaceAttribute", new CodeAttributeArgument(new CodePrimitiveExpression(ClassInterfaceType.AutoDual))); CodeAttributeDeclaration comVisibleAttribute = new CodeAttributeDeclaration("System.Runtime.InteropServices.ComVisibleAttribute", new CodeAttributeArgument(new CodePrimitiveExpression(true))); CodeAttributeDeclaration guidAttribute = new CodeAttributeDeclaration("System.Runtime.InteropServices.GuidAttribute", new CodeAttributeArgument(new CodePrimitiveExpression(Guid.NewGuid().ToString().ToUpper()))); CodeAttributeDeclaration progIdAttribute = new CodeAttributeDeclaration("System.Runtime.InteropServices.ProgIdAttribute", new CodeAttributeArgument(new CodePrimitiveExpression(PROGID))); // public static void RegisterFunction(Type type) CreateMethod("System.Void", "RegisterFunction", MemberAttributes.Public | MemberAttributes.Static) .AddParameter("type", FieldDirection.In, "System.Type") .AddCodeSnippet("Registry.ClassesRoot.CreateSubKey(GetSubKeyName(type));") .AddMemberToClass(targetClass); // public static void UnregisterFunction(Type type) CreateMethod("System.Void","UnregisterFunction", MemberAttributes.Public | MemberAttributes.Static) .AddParameter("type", FieldDirection.In, "System.Type") .AddCodeSnippet("Registry.ClassesRoot.DeleteSubKey(GetSubKeyName(type),false);") .AddMemberToClass(targetClass); // private static string GetSubKeyName(Type type) CreateMethod("System.String", "GetSubKeyName", MemberAttributes.Public | MemberAttributes.Static) .AddParameter("type", FieldDirection.In, "System.Type") .AddCodeSnippet("\"CLSID\\{\" + type.GUID.ToString().ToUpper() + \"}\\Programmable\";") .AddMemberToClass(targetClass); // public void OnConnection(object Application, ext_ConnectMode ConnectMode, object AddInInst, ref Array custom) CreateMethod("System.Void","OnConnection", MemberAttributes.Public) .AddParameter("Application", FieldDirection.In, "System.Object") .AddParameter("ConnectMode", FieldDirection.In, "Extensibility.ext_ConnectMode") .AddParameter("AddInInst", FieldDirection.In, "System.Object") .AddParameter("custom", FieldDirection.Ref, "System.Array") .AddCodeSnippet("mainApplication = Application as Application;") .AddMemberToClass(targetClass); // public void OnDisconnection(ext_DisconnectMode RemoveMode, ref Array custom) CreateMethod("System.Void", "OnDisconnection", MemberAttributes.Public) .AddParameter("RemoveMode", FieldDirection.In, "Extensibility.ext_DisconnectMode") .AddParameter("custom", FieldDirection.Ref, "System.Array") .AddCodeSnippet("mainApplication = null;") .AddMemberToClass(targetClass); // public void OnAddInsUpdate(ref Array custom) CreateMethod("System.Void", "OnAddInsUpdate", MemberAttributes.Public) .AddParameter("custom", FieldDirection.Ref, "System.Array") .AddMemberToClass(targetClass); // public void OnStartupComplete(ref Array custom) CreateMethod("System.Void", "OnStartupComplete", MemberAttributes.Public) .AddParameter("custom", FieldDirection.Ref, "System.Array") .AddMemberToClass(targetClass); // public void OnBeginShutdown(ref Array custom) CreateMethod("System.Void", "OnBeginShutdown", MemberAttributes.Public) .AddParameter("custom", FieldDirection.Ref, "System.Array") .AddMemberToClass(targetClass); } public CodeMemberMethod CreateMethod(string returnType,string name, MemberAttributes attributes) { CodeMemberMethod method = new CodeMemberMethod { Attributes = attributes, Name = name, ReturnType = new CodeTypeReference(returnType) }; return method; } } public static class CodeDomExtensions { public static CodeMemberMethod AddParameter(this CodeMemberMethod method, string name, FieldDirection direction, string parameterType) { method.Parameters.Add( new CodeParameterDeclarationExpression { Name = name, Direction = direction, Type = new CodeTypeReference(parameterType) }); return method; } public static CodeMemberMethod AddCodeSnippet(this CodeMemberMethod method, string code) { method.Statements.Add(new CodeSnippetStatement(code)); return method; } public static CodeMemberMethod AddMemberToClass(this CodeMemberMethod method, CodeTypeDeclaration addMemberToClass) { if (!addMemberToClass.Members.Contains(method)) { addMemberToClass.Members.Add(method); } return method; } } January 12 HttpLightClient y IELightClient Open Source: Mis librerías de creación de robots webHttpLightClient IELightClient Brevemente, estas librerías son útiles para web scraping, web automation y también para todo lo que tiene que ver con web testing y web hacking (en términos de White hat). Como usar HttpLightClientLa clase base en todo la librería se llama HttpWebClient, la cual define el cliente web a utilizar. HttpCommand es el comando o set de métodos para un protocolo o metodología en particular. En teoría, se podría heredar de HttpCommand (IHttpCommand) y crear comandos mas específicos. Es decir, si quisiéramos crear un SoapCommand para probar web services, o crear un SecurityCommand y agregar métodos para probar o hacking. SecurityCommand existe actualmente pero no se ha completado todavía. Para iniciar HttpWebClientHttpWebClient<HttpCommand> httpClient = new HttpWebClient<HttpCommand>(); httpClient.SetServicePointSettings(20, 100 * 1000, 10); command = httpClient.CreateHttpCommand(); command.KeepAlive = true; Donde configuramos SetServicePointSettings, esto es necesario para tener un buen rendimiento en los llamados web. Al igual que System.Net.HttpWebRequest, podemos configurar otro conjunto de propiedades como KeepAlive. Para obtener una página HTML en XMLXDocument page = command.GetDocumentForUrl(new HttpSettings { Query = supp.Link }, Preparser); Donde el primer parámetro espera un HttpSettings, en este caso con el link, y el segundo parámetro es un delegate o función para pre parsear cualquier tipo de error que retorne la consulta (internamente usamos el famoso SgmlReader, por consiguiente es importante que el HTML sea parseable por SgmlReader). Preparser ejemplopublic string Preparser(string data) { data = data.Replace(@"<base href=http://www.ecyware.com>",string.Empty); data = data.Replace(@"<html xmlns=""http://www.w3.org/1999/xhtml"">","<html>"); data = data.Replace(@"<!DOCTYPE html PUBLIC ""-//W3C//DTD XHTML 1.0 Transitional//EN"" ""http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"">", string.Empty); int noscriptStart = data.IndexOf("<noscript>"); int noscriptEnd = data.IndexOf("</noscript>",noscriptStart); data = data.Replace(data.Substring(noscriptStart, (noscriptEnd - noscriptStart) + 11), string.Empty); do { int scriptStart = data.IndexOf("<script"); int scriptEnd = data.IndexOf("</script>", scriptStart); data = data.Replace(data.Substring(scriptStart, (scriptEnd - scriptStart) + "<script>".Length + 1), string.Empty); } while (data.IndexOf("<script>") > 0); return data; }
Como usar GetDocumentForUrl en un flujo de secuencias conocidaGetDocumentForUrl(indice, preparser, parametros), permite ingresar un indice de un flujo o pasos ya registrados. Para registrar un paso conocido, se agrega un HttpSettings a una lista, con un URL que puede contener parametros en formato String. Ejemplo // load links steps.Add( new HttpSettings { QueryMask = http://www.ecyware.com/productos/{0}/{1}.html } ); steps.Add( new HttpSettings { QueryMask = "{0}/information.html" } ); steps.Add( new HttpSettings { QueryMask = "{0}/other_information.html" } ); steps.Add( new HttpSettings { QueryMask = "{0}/listado.html?pagina={1}" } ); command.RegisterSteps(steps);
Ejemplo con IELightClientstring login = "http://www.ecyware.com/auth"; var document = ieClient.GetDocument(login); document.GetInputElement("ctl00_PageContent_Login1_UserName").value = "username"; document.GetInputElement("ctl00_PageContent_Login1_Password").value = "123456"; document.GetInputElement("ctl00_PageContent_Login1_CheckboxRememberMe").value = "on"; document.GetInputElement("ctl00_PageContent_Login1_UserName").value = "username"; // Aqui hacemos un HTTP POST ieClient.SubmitFromButton(document, "ctl00_PageContent_Login1_Button"); string redir = "http://www.ecyware.com/Authenticated.aspx?login=zn89s,s090&M"; string html = ieClient.GetHtml(redir); document.close(); document = null; // logged in Diferentes formas de parsear contenido con IELightClient y HttpLightClient// Obtiene un XDocument dado un Url y un Preparse delegate XDocument mainDocument = ieClient.GetXDocumentForUrl(settings.Query, Preparse); // Obtiene un XDocument usando TryParseToXml de un HttpCommand XDocument postBackDocument = new XDocument(); command.TryParseToXml(Preparse(ppiDocument.body.outerHTML), out postBackDocument); January 08 Leyendo sobre R, salte a F#, se me ocurrio crear un open source university project y encontreDecember 04 Guias de Arquitectura de RIA, Servicios y Agile Excelente lectura, en especial la de RIA Architecture y Agile Architecture... --- http://www.codeplex.com/AppArch/Wiki/View.aspx?title=Downloads&referringTitle=Home Pocket GuidesSubsets of content from the Main Guide with minor rework to keep it relevant to a particular topic.
Videos
Powerpoint Slides
Sobre LINQ To SQL, LINQ to Entities y nHibernate LINQ To SQL Gets Kicked to the Curb... Needs A Good Home http://codebetter.com/blogs/david.hayden/archive/2008/10/30/linq-to-sql-gets-kicked-to-the-curb-needs-a-good-home.aspx He tenido preguntas varias sobre mi opinión personal de si utilizar LINQ to SQL vs. LINQ to Entities. Mi experiencia con LINQ to SQL es agradable, lo utilize para un desarrollo de robots web que leen data de paginas web y crear una estructura relacional de base de datos. Hasta ahi todo bien. A la hora de hacer un diseño ORM de una aplicación empresarial, el diseñador es amigable y la tendencia es a querer diseñar el modelo de entidades en el designer. Lo cual es una punto donde Linq to Entities es mas por asi decirlo capaz. Ahora, el problema ha surgido que el API de Linq to Entities no es el mejor mientras que el API de Linq to Sql es mas amigable. Para concluir, LINQ to SQL esta muerto, no lo van a desarrollar ni matener más asi que la opción desde Redmond es que todo el mundo utilize LINQ to Entities. Mi recomendación es evaluar sus desarrollos actuales, si requieren de esto o algo mas como LINQ to SQL. Es mas, seria capaz de opinar que LINQ to Dataset o nHibernate seria una solución por el futuro cercano hasta que Microsoft arregle todas estos problemas de API no compatibles. Saludos, Rogelio November 24 Creando un DAL con LINQ to SQL y LINQ to Entities Interesante articulo y muy util de Tony Sneed de DevelopMentor, publicado en MSDN Magazine. http://msdn.microsoft.com/en-us/magazine/dd263098.aspx En el blog aparece mas detalle para arreglar un issue con Linq to Entities http://blog.tonysneed.com/?p=120 Todavia me siento mal por que Microsoft cancelo Linq to SQL, pero Entities tiene cosas interesantes, que yo espero en la versión 2 ya sea casi igual a la experiencia en Linq to SQL. November 12 Boku y WW Telescope El blog de WorldWide Telescope tiene todo el detalle de la nueva versión. Esto para los fanaticos de la astronomia. http://community.research.microsoft.com/blogs/wwt_data_blog/default.aspx Mientras que Boku, es un juego de aprendizaje para que los niños aprendan a ... programar! Interesante por supuesto. http://research.microsoft.com/projects/boku/ November 11 Que perdimos durante la era de Moscoso - Torrijos
Estuve leyendo recientemente un periódico hace poco sobre el "rating" o calificación que tiene Panamá, la cual todavía esta un paso abajo para lograr la famosa calificación de grado de inversión. Me puse a pensar una buena teoría de porque esto es relevante en el aspecto político. La gráfica era algo de analizar, durante la administración del presidente Ernesto Balladares, se mantuvo totalmente estable, entramos al periodo de Moscoso y bajo a BB- y con Martin nuevamente se pudo subir a BB+. · Panamá no tiene una economía industrializada, depende totalmente de los servicios los cuales... · Se denominan Sector Bancario, Sector Zona Libre, Sector ACP más otras exportaciones importantes (bananas, etc.). · La planilla estatal es sumamente grande a comparación con el sector privado · El sector privado no tiene un porcentaje alto de brindar algún tipo de innovación, ya sea en servicios, industrial o científica.
La economía del país perdió mucho terreno durante la época de Mireya Moscoso, a tal punto que el crecimiento fue un PIB negativo. Los partidos políticos más grandes para este entonces eran Panameñista y PRD, con otros detrás. Lo cual muchos pensaran es bueno. Pero ahora regreso a eso. Rogelio Morrell C. October 23 He estado en SQL Server 2008 estas ultimas semanas SQL Server 2008 me esta emocionando a tal nivel que vale la pena hasta retomar las certificaciones. Apenas he revisado todo lo que tiene pero por ejemplo el nuevo Reporting Services tiene un Report Builder que pareciera estar desarrollado en WPF. Tambien tiene .NET habilitado por default el nuevo SQL Server Database Engine (SQLCLR). Aqui un enlace el SQL Server 2008 Jumpstart para los interesados. http://sqlserver2008jumpstart.microsofttraining.com/ October 09 WCF Best PracticesWCF Best Practices http://mehranikoo.net/CS/archive/2008/05/31/WCF_5F00_Best_5F00_Practices.aspx In our conversations with customers and partners, questions related to the design and development best practices are quite common and WCF is not an exception. Some of these questions are very specific to a customer scenario but most of them are generic questions around contract versioning, security, load balancing, etc. There are a number of resources on MSDN and CodePlex that cover these general topis and since I usually send these links to developers in the follow up emails, I think it is a good idea if I put these links in this blog post. We highly recommend WCF developers to read these best practices in the early stages of the development because some of these practices need to be adopted from the very first version of your application. For example, in order to create Forward-Compatible Data Contracts you need to implement IExtensibleDataObject starting from the first version of the data contract. So here we go... I will try to keep this list updated as I find other resources and write my own posts on this topic. October 08 nHibernate Search with LuceneNHibernate.Search using Lucene.NET Full Text Index (3 partes)http://blogs.intesoft.net/?tag=/lucene"Ayende added the NHibernate.Search last year but I've never seen a great deal of documentation or examples around it so hopefully this post will help others to get started with it. Basically, this addition to NHibernate brings two of the best open source libraries together - NHibernate as the Object Relational Mapper that persists your objects to a database and Lucene.NET which provides full-text indexing and query support. So how do you use it?" Si ... regrese a Lucene land nuevamante... |
||||
|
|