viernes, 31 de julio de 2009

Web Service: ¿Service1 is not define?

Hice un web service que permite comunicar código javascript con un método que existe en el web service, éste se ejecuta en forma asíncrona. En el código javascript está el siguiente código de ejemplo:

function btnEnviar_onclick() {
var resultado = Service1.HelloWorld(document.getElementById("txtNombre").value,
OnComplete, OnTimeOut, OnError);
return true;
}

function OnComplete(arg) {
alert(arg);
}

function OnTimeOut() {
alert("Time is up");
}

function OnError() {
alert("Error");
}

El problema es que estoy consiguiendo el error "Service1 is not define". Existe cinco cosas importantes que hay que tomar en cuenta:

1º - El web service debe estar corriendo, ¡obvio!
2º - El nombre del directorio donde está el web service debe ser utilizado en el momento de instanciar o llamar a un método del web service.
3º - Por supuesto, también es importante agregar el control ScripManager a la página *.aspx y dentro de ese control agregar un ServiceReference.
4º Si aun no aparece, entonces revizar el código Javascript y verificar que los nombres de los métodos OnComplete, OnTimeOut y OnError estén bien escritos en todo lado donde se vayan a usar. Recordemos que Javascript es sencible a mayúsculas y minúsculas.
5º Si se están usando WebService estáticos, el método debe ser declarado con la palabra reservada Shared (VB) o static (C#).
6º Puede ocurrir que el web service es llamado pero se lanza una excepción indicando que no encuentra al web service y por más que intente hacerlo funcionar, no ocurre. Un caso así ocurrió cuando se ejecutaba una aplicación en una máquina virtual. La solución fue simplemente reiniciar la máquina virtual. Sí por supuesto, dicha solición se aplicó casí después de tres horas después de tantos intentos infructuosos, jaja!

7º Existe un caso especial, pero ocurre solo si utilizamos Web Services Estáticos.El mensaje de error equivalente con el que podemos toparnos es el siguiente:
   Error: Sys.Net.WebServiceFailedException: The server 
   method 'StaticMethod' failed with the following error: 
   Archivo de origen: http://localhost:10258/WebSite2
   /ScriptResource.axd?d=58xHtP0kV6y42p9jtK_IzqsHQXnRb-
   2ldpNeZlGfSlZEESQ9GeHLihiyxiP1&t=d2c0a1c Línea: 5488

Eso es por una única razón. Se produce si un botón que se 
supone llama a una función de JS y la función de JS llama 
a una función stática en el lado del servidor, es muy 
probable que la función sí se pueda ejecutar (la del lado 
del servidor) pero la respuesta de retorno va a fallar ya 
que el botón hace postback haciendo que el otro mensaje 
que se había enviado, falle totalemente.
Y continuando con la solución para el problema anterior del Web Service, lo que hay que hacer es llamar al web service utilizando el nombre del directorio seguido del nombre de la clase web service separado con punto quedando ahora:

var resultado = SimpleWebService.Service1.HelloWorld.....;

Otro punto importante es que debe existir la siguiente línea de código en el encabezado
de la clase:

<System.Web.Script.Services.ScriptService()> _

miércoles, 22 de julio de 2009

Javascript: Los 10 frameworks más populares.

Resumen de los diez mejores frameworks hechos con Javascript en ajaxline.com

Frases acerca de software y programación

Esta buena ésta lista de frases que encontré en Web Intenta:

  • La simplicidad es requisito previo para la fiabilidad. (Dijkstra)
  • No debes dar al mundo lo que pide, pero sí lo que necesita. (Dijkstra)
  • Si un oyente asiente con la cabeza cuando estás explicando tu programa, despiértale. (Perlis)
  • No tengas buenas ideas si no estás dispuesto a responsabilizarte de las mismas. (Perlis)
  • Optimización prematura es la fuente de todo mal -o al menos la mayor parte- en la programación. (Knuth)
  • Hablar es barato. Muéstrame el código. (Torvalds)
  • Sólo podemos vislumbrar un corto período hacia el futuro, pero podemos ver que hay muchas cosas por hacer. (Turing)
  • Hay muchas preguntas que los tontos pueden hacer y que los sabios no pueden responder. (Polya)
  • Daría mi brazo derecho a ser ambidiestro. (Kernighan)
  • UNIX es básicamente un sistema operativo sencillo, pero tienes que ser un genio para entender su simplicidad. (Ritchie)
  • A veces la manera más fácil de conseguir algo es ser un poco ingenuo al respecto. (Joy)
  • El software es un gas, se expande hasta llenar su recipiente. (Myhrvold)
  • Se requiere una mente muy inusual para llevar a cabo el análisis de lo obvio. (Whitehead)
  • Todas las verdades son fáciles de entender una vez que se descubren, la cuestión es descubrirlas. (Galilei)
  • No hay nada más despreciable en el campo de la programación que un programa no documentado. (Yourdan)
  • El control de la complejidad es la esencia de la programación. (Kernighan)
  • Es mejor tener 100 funciones que operan sobre una estructura de datos, que 10 funciones que operan sobre 10 estructuras de datos. (Perlis)
  • La mejor manera de predecir el futuro es inventarlo. (Kay)
  • Un ejemplo no es otra manera de enseñar, es la única manera de enseñar. (Einstein)
  • Cada programa es una parte de algún otro programa y rara vez se ajustan. (Perlis)

MySql: HeidiSQL, un gestor gráfico más.


HeidiSql es un interfaz gráfico para administrar MySQL. Permite navegar y gestionar las bases de datos MySQL de una forma intuitiva y con un interfaz Windows. El programa es gratuito.

Con un tamaño de descarga inferior a los 2Mb y de ejecución rápida y liviana, otras de sus características principales son:

- Generación de exportaciones SQL.
- Sincronización de tablas entre bases de datos.
- Gestión de privilegios de usuario.
- Importación de archivos de texto.
- Exportación de datos a formatos CSV, HTML y XML.
- Navegación y edición de los datos de las tablas en una "confortable" grid.
- Procesos de inserción batch y ficheros binarios dentro de las tablas.
- Escritura de consultas con un resaltado de sintaxis personalizado y con autocompletado.
- Monitorización y eliminación de procesos de cliente.


martes, 14 de julio de 2009

Asp.Net: Validar páginas en CSS Validation Service

En el pie de página de un sitio que estaba haciendo, quise poner un link que diga Validar CSS, implica que al dar clic debería cargar el servicio de validación de CSS que ofrece W3C, pero éste debería mostrame si la página actual que tenía abierta esta conforme a las reglas de CSS.

Analizando un poco la situación vi que la URL para llamar al servicio es:

http://jigsaw.w3.org/css-validator/validator?uri=URL

Donde URL es donde debemos poner la URL de nuestra página. Entonces muy fácil, solo tengo que poner en código una sentencia que me devuelva la URL de la página web en la que estoy navengando. Para obtener la dirección de un recurso específico del sitio web (URI) se puede usar la función Page.Request.Url.AbsoluteUri.

Finalmente todo el link para mandar a validar la página me quedó de la siguiente manera:

<a href="http://jigsaw.w3.org/css-validator/validator?uri=<% Response.Write(Page.Request.Url.AbsoluteUri) %>">Validar CSS</a>

domingo, 12 de julio de 2009

Drupal: Problemas con APC

Desde que instalé Ubercart y Delve en el informe de estado del sistema de Drupal me aparecen tres advertencias que dicen lo siguiente:

Performance logging APC.
Performance logging on live web sites works best if APC is enabled.

Performance logging APC memory size.
APC has been configured for , which is less than the recommended 48 MB of memory. If you encounter errors when viewing the summary report, then try to increase that limit for APC.

Performance logging details
Performance detailed logging is enabled. This can cause severe issues on live sites.

Esto se debe a que yo había activado el módulo llamado Performance logging details y por eso estaba recibiendo dichas advertencias. Basándome en soluciones encontradas en diferentes foros se dice que tengo que activar un módulo en el archivo php.ini. El módulo es php_apc.dll (se activa quitando el punto y coma que lo precede) además hay que agregar una línea de código al final del mismo archivo; la línea de código es la siguiente:

apc.shm_size = 64

Luego reinicie el servidor Apache y efectivamente las advertencias dejaron de aparecer. El detallazo es que me comenzó a salir un cuadro de diálogo avisando sobre un error en el servidor Apache. En otras palabras arreglé una cosa pero se daño el sistema por otro lado.

Finalmente, llegué a una conclusión efectiva. Como a mi no me gusta ver esas advertencias llegué a la conclusión de desactivar el módulo
Performance logging details, de por sí, ni me interesaba, jaja!

viernes, 10 de julio de 2009

Web: Que buen sitio

Encontré un sitio que vale la pena recordar ya que en él se habla de todo un poco sobre diseño, herramientas de desarrollo, etc. Está muy completo y lo recomiendo.

El sitio es www.baluart.net

sábado, 4 de julio de 2009

Asp.Net: Referenciar un objeto de un CreateUserWizard object

En caso de querer modificar el valor de un objeto del control CreateUserWizard, es necesario hacer un casting para obtener el objeto y a parte de eso hay que usar una serie de métodos para poder referenciar al objeto ya que el control CreateUserWizard está dividido en varias partes:

Dim errMessage As Literal
errMessage = CType(AsistenteCrearUsuario.CreateUserStep.
ContentTemplateContainer.FindControl("ErrorMessage"), Literal)

En el caso de que se esté usando un CreateUserWizard dentro de un UpdatePanel, lo mejor es convertir el CreateUserWizard en templates ya que los controles de Login no permiten modificar fácilmente los controles dentro del CreateUserWizard.

Asp.Net: Modificar Items que crea un Repeater Control

En ocasiones uno desea modificar un valor que se va a presentar en un Repeater control de Asp.Net. Entonces hay que obtener por así decirlo toda la estructura que viene en el objeto DataItem. A continuación el código en C# y VB.Net:

VB.Net:

Dim nav As XPathNavigator = CType(e.Item.DataItem, IXPathNavigable).CreateNavigator
Dim pagina As String = nav.Select("/Titulos/Titulo").Current.SelectSingleNode("pagina").Value


C#:
XPathNavigator nav = ((IXPathNavigable) e.Item.DataItem).CreateNavigator();
string pagina = nav.Select("/Titulos/Titulo").Current.SelectSingleNode("pagina").Value

El objeto XPathNavigator también tiene el método SelectSingleNode("nombreNodo") para recuperar el valor de un nodo.

Asp.Net: Response.End()

El método End() del objeto Response siempre lanza una excepción; para corregirlo se puede usar la siguiente instrucción en vez de usar Response.End():

  • HttpContext.Current.ApplicationInstance.CompleteRequest()

Asp.Net: Globalization

Cinco formas de implementar globalization en una aplicación web con Asp.Net:

1º En CodeBehind usar el objeto GetLocalResourceObject:

  • Label1.Text = GetLocalResourceObject("Label1Resource1.Text").ToString()
2º En el source de la página aspx modificar la propiedad Text del control:

  • <asp:Label ID="Label1" runat="server" Text="<% Resources:Label1.Text %>" />

3º En el source usar el atributo meta en el elemento del control Asp.Net:

  • <asp:Label ID="Label1" runat="server" meta:ResourceKey="lblLabel1" />
lblLabel1 = es un key en el archivo de recursos.

4º Usando recursos globales; en el source modificar el atributo Text:

  • <asp:Label ID="Label1" runat="server" Text="<%$ Resources:ClassNameRS, Label1 %>" />

5º Usando recursos globales; en el code behind usar objeto Resources:

  • Label1.Text = Resources.ClassNameRS.Label1
Resources.ClassNameRS.Label1 = Label1 es un key en el archivo de recursos globales.


En la parte gráfica de la página (Diseño) existe una propiedad llamada Expressions. Esa propiedad permite asociar un key que se encuentra en un archivo de recursos con una propiedad del control. Esto es solo para hacer las cosas más rápido.