Monday, February 26, 2007

Esto es lo que pasa cuando olvidas el folder RadControls de Telerik

Este articulo aplica especificamente a aplicaciones asp.net desarrolladas usando Telerik Rad Controls

Ayer tuve un lapsus tontus, olvide copiar el folder RadControls al servidor y no podia salir de este error:

Object reference not set to an instance of an object.
at Telerik.WebControls.RadWindowManager.BuildTemplates()
at Telerik.WebControls.RadWindowManager.Render(HtmlTextWriter writer)
at System.Web.UI.Control.RenderControlInternal(HtmlTextWriter writer, ControlAdapter adapter)
at System.Web.UI.Control.RenderControl(HtmlTextWriter writer, ControlAdapter adapter)
at System.Web.UI.Control.RenderControl(HtmlTextWriter writer)
at System.Web.UI.Control.RenderChildrenInternal(HtmlTextWriter writer, ICollection children)
at System.Web.UI.Control.RenderChildren(HtmlTextWriter writer)
at System.Web.UI.HtmlControls.HtmlForm.RenderChildren(HtmlTextWriter writer)
at System.Web.UI.HtmlControls.HtmlForm.Render(HtmlTextWriter output)
at System.Web.UI.Control.RenderControlInternal(HtmlTextWriter writer, ControlAdapter adapter)
at System.Web.UI.Control.RenderControl(HtmlTextWriter writer, ControlAdapter adapter)
at System.Web.UI.HtmlControls.HtmlForm.RenderControl(HtmlTextWriter writer)
at System.Web.UI.Control.RenderChildrenInternal(HtmlTextWriter writer, ICollection children)
at System.Web.UI.Control.RenderChildren(HtmlTextWriter writer)
at System.Web.UI.Control.Render(HtmlTextWriter writer)
at System.Web.UI.Control.RenderControlInternal(HtmlTextWriter writer, ControlAdapter adapter)
at System.Web.UI.Control.RenderControl(HtmlTextWriter writer, ControlAdapter adapter)
at System.Web.UI.Control.RenderControl(HtmlTextWriter writer)
at System.Web.UI.Control.RenderChildrenInternal(HtmlTextWriter writer, ICollection children)
at System.Web.UI.Control.RenderChildren(HtmlTextWriter writer)
at System.Web.UI.Page.Render(HtmlTextWriter writer)
at System.Web.UI.Control.RenderControlInternal(HtmlTextWriter writer, ControlAdapter adapter)
at System.Web.UI.Control.RenderControl(HtmlTextWriter writer, ControlAdapter adapter)
at System.Web.UI.Control.RenderControl(HtmlTextWriter writer)
at Telerik.WebControls.RadAjaxManager.AJAX_Page_Render(HtmlTextWriter output, Control container)
at System.Web.UI.Control.RenderChildrenInternal(HtmlTextWriter writer, ICollection children)
at System.Web.UI.Control.RenderChildren(HtmlTextWriter writer)
at System.Web.UI.Page.Render(HtmlTextWriter writer)
at System.Web.UI.Control.RenderControlInternal(HtmlTextWriter writer, ControlAdapter adapter)
at System.Web.UI.Control.RenderControl(HtmlTextWriter writer, ControlAdapter adapter)
at System.Web.UI.Control.RenderControl(HtmlTextWriter writer)
at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)

el manejo de excepciones de Telerik podria ser mejor para proporcionar informacion mas detallada, pero bueno... solo necesitaba otro par de ojos para ver el problema

Friday, February 23, 2007

que haces programando?

excelente post de Carlos Manuel Perez, para todos los que realmente amamos esta profesion y que tenemos una pasion verdadera por lo que hacemos y nos falta tiempo para programar mas

Si eres de los que haces tu ocho horas de curro y al salir no quieres ni ver un teclado, ¿qué haces programando?

Si eres de los que sabes las cuatro características básicas de tu lenguaje para hacer los típicos programas de gestión; es decir ni más ni menos que lo que te exige el día a día, y no coges un libro de programación, ni quieres aprender nada nuevo, ni lees técnicas para mejorar, ¿qué haces programando?

Si tu estilo de programación es el copiar y pegar código encontrado en Google, sin intentar entenderlo, sin saber cómo modificarlo para tus usos, ¿qué haces programando?

Si los usuarios finales no te importan (o peor, los desprecias) y piensas que lo que estás haciendo es un ente abstracto que no va a usar nadie que te importe y tú te dedicas a tirar código (o peor, a fingirlo) durante ocho horas exclusivamente para que te paguen a fin de mes, ¿qué haces programando?


salu2

Thursday, February 15, 2007

Antes de que preguntes...

"Usare google antes de hacer preguntas idiotas"
En estos dias todo mundo piensa que saben como usar google (mas o menos de la misma manera que creen saber usar Windows... uff)

Para muchas (la mayoria) cosas funciona bien si le ponemos unas cuantas palabras (aunque ayuda bastante saber cuales palabras no poner), pero algunas veces no es tan facil encontrar las cosas, ahi es cuando necesitas tener tus habilidades de busqueda en google, como minimo debes tener estas en tu arsenal:

- intitle: busca en el titulo de las paginas
- link: Te da una lista de sitios que tienen links al sitio que especifiques (parece que no funciona muy bien)
- site: busca solo en el sitio que especifiques
- intext: busca unicamente en el texto (omite links, titulos, etc)
- inanchor: busca en las palabras incluidas en el link (no en el link en si)
- inurl: busca donde la palabra se encuentre en el url
- filetype: nos regresara links a archivos del tipo que especifiquemos
- define: te da una definicion de la palabra que le pongas, ademas de links a paginas relacionadas
- usar comillas
- usar comodines
- usar OR, AND
- usar -
- usar rangos

Si no sabes usar todos esos "comandos" te falta aprender bastante para que encuentres las cosas mucho mas rapido.
Ademas de estos comandos hay muchas herramientas incluidas dentro de google.com, por ejemplo::

- una calculadora (ponle ahi sumas, restas, etc... veras)
- conversiones (metros, litros, grados... lo que se te antoje)
- informacion sobre UPS, Fed Ex, USPS, VIN (Estados Unidos solamente... creo)
- peliculas
- etc, etc, etc (cuando me van a agregar translate:????)

checate esta pagina para una lista muy completa de las cosas que puedes hacer en google (ingles), incluyendo todas las que puse en mi lista y muchas mas, aprendetelas y veras como encuentras mucho mas rapido lo que necesites

Tuesday, February 13, 2007

adios nombre de usuario y password

Cada que uses usuarios y passwords en tus aplicaciones, considera usar System.Net.NetworkCredential para mantener y pasar la informacion en las funciones, esta clase encapsula estos campos y ademas te permite extender tu aplicacion en el futuro si es que quisieras incluir un dominio.

En mi caso estoy usando esta clase ya que en nuestro sistema implementamos una arquitectura de plugins con el cual me puedo autenticar a cualquier sistema que implemente una interface muy simple, usando esta clase me da la extensibilidad de poder autenticar con Windows, Active Directory o cualquier sistema especifico

Saturday, February 10, 2007

variables magicas para ayudarnos a debuguear excepciones

Este articulo aplica a C#, J#, y Visual Basic.
Ya habia leido sobre estas variables hace mucho tiempo, pero no podia encontrar nada acerca de estas magicas cosas por ningun lado, el problema mas que nada es que no se llaman magicas ni estan escondidas, estan documentadas y se llaman Pseudovariables;

Pseudovariables son terminos usados para mostrar cierta informacion en una ventana de variables o el dialogo QuickWatch. Puedes poner una pseudovariable de la misma manera que pondrias una variable normal. Pero las pseudovariables no son variables y no corresponden a variables en tu programa.

Pero bueno, no creo que mucha gente sepa sobre estas, asi que ahi les van:
  • $exception: Muestra informacion sobre la ultima excepcion. Si no ha ocurrido una excepcion evaluar $exception nos muestra un mensaje de error. En Visual C# solamente, cuando el asistente de excepciones esta desabilitado, $exception se agrega automaticamente a la ventana de locales cuando sucede una excepcion.
  • $user: Muestra una estructura con informacion de la cuenta del usuario corriendo la aplicacion. Por cuestiones de seguridad la informacion sobre el password no se muestra.
Cuando estas debugueando una excepcion podrias tener algun codigo asi:

try {
//algun codigo
} catch (Exception e) {
//no necesitas e aqui, solo la pusiste para tener la informacion de la excepcion en la ventana de Watch
}

Podrias escribir el codigo asi:
try {
//algun codigo
catch { } //pon el breakpoint en esta linea, inspecciona $exception (Debug, Watch, Watch 1, escribe $exception en esta ventana)

y obtener la misma informacion.

La pseudovariable $user esta claramente explicada, no hay mas que decir.

En codigo nativo tenemos algunas pseudovariables mas disponibles, checate el link si estas interesado.

son las pequeñas cosas...

Friday, February 09, 2007

ataque DOS contra google usando las herramientas de google?

Me acabo de encontrar post en el blog Google Operating System que muestra como puedes hacer un respaldo de tu blog, si es que lo tienes en blogspot.com, basicamente te permite correr un query asi::

http://ebersys.blogspot.com/search?max-results=N

el cual regresa en una sola pagina gigante N numero de posts para tal blog

Pero que tal que a los niños malos de la colonia se les ocurre correr un monton de estos queries contra varias paginas al mismo tiempo? seria muchisimos datos viniendo de los servidores de google, acabo de intentar el siguiente

http://googlesystem.blogspot.com/search?max-results=2000

y se tardo un buen en bajar todo el contenido

Para arreglar el problema seria facil, podrian poner restricciones sobre quien puede correr el query, por ejemplo requerir que el usuario de blogspot estuviera autenticado y que solo pudieras correr queries contra tu blog

a menos que a google no le importe y lo puedan manejar sin problemas, ya veremos que pasa

como regla general, a menos que seas parte de google, no permitas que en tus sistemas los usuarios puedan correr queries que regresen todos los datos

salu2

Thursday, February 08, 2007

protected, internal, protected internal... de verdad sabes que hacen?

Este articulo aplica a C#
Todos creemos dominar los modificadores de acceso, pero me puedes decir lo que protected internal hace?
apuesto que mas de la mitad de los desarrolladores .NET contestarian incorrectamente, vamos a ver:

  1. private:
    1. Este es el nivel de acceso mas restrictivo.
    2. Es accesible solamente dentro del cuerpo de la clase o estructura en que esta declarado.
    3. Tipos declarados dentro (nested types) del mismo cuerpo de la clase tambien tienen acceso a los tipos privados.
  2. public:
    1. Este es el nivel de acceso con menos restricciones.
    2. No hay restricciones para accesar miembros publicos, son tan visibles como la clase.
  3. protected:
    1. El acceso es limitado a la clase que los contiene o a tipos derivados de la clase.
    2. Lo cual quiere decir que no puedes crear una instancia de esta clase y accesar los miembros protegidos.
  4. internal:
    1. El acceso esta limitado solo al assembly en donde la clase reside.
  5. protected internal:
    1. Acceso es limitado a el assembly donde la clase reside o a tipos derivados de la clase.

Este ultimo es bastante capcioso, a primera vista podria parecer que permite acceso solo dentro del assembly donde la clase reside y las clases derivadas, pero el "o" ahi es lo que hace la diferencia, si marcas una propiedad protected internal puede ser usada fuera del assembly actual. basicamente protected sobreescribe internal, asi que ni siquiera estoy seguro de cuando es que se podria usar tal modificador.

pero bueno, regresando al tema, si no me crees eso de protected internal, puedes verificar tu mismo:

Assembly1:

public class Test {
protected internal string prop1;
}


Assembly2://despues de agregar la referencia a Assembly 1

public class Test2: Test {
public string prop2;
public Test2() {
prop2 = prop1; //el acceso a prop1 viene de otro assembly, de un miembro protected internal
}
}


Si esto es nuevo para ti, podrias pensar que es absurdo, entonces como haces que una propiedad sea visible solo en el assembly actual y en las clases derivadas (pero solo de este assembly)?

Pues no es tan complicado, marcas la clase como internal, lo cual restringe el acceso solo al assembly actual, y luego marcas la propiedad como protected, lo cual resulta en acceso desde las clases derivadas pero solo dentro del assembly actual.:

internal class Test {
//accesible solo en este assembly y clases derivadas dentro de este assembly
protected string prop1;
}

salu2

Sunday, February 04, 2007

VS2005, VS2007 (Orcas), XNA, LINQ, WPF en Windows Vista

que tal con el titulo... =o)

Justin y yo estabamos jugando hoy con estas tecnologias, la verdad que no fue tan divertido como esperabamos que fuera, la version corta es que estas cosas juntas no funcionan en Vista, aqui esta una lista de los problemas

* VS2005 no funciona en Vista, se traba aleatoriamente y muy seguido
* VS2007 funciona bien en Vista
* XNA no esta soportado en VS2007 o Vista, solo en VS2005 Express (XP)
* el WPF mas reciente no esta soportado en VS2007, solo en VS2005
* LINQ funciona bien en VS2007

Asi que si estas pensando en jugar con algunas de esas tecnologias en Vista, tal vez deberias considerar usar XP, la experiencia seria mucho mejor

salu2