Wednesday, March 28, 2007

hora de actualizar tu lector de archivos PDF

Si aun no estas usando Foxit reader deja de hacer lo que estas haciendo y bajatelo de volada, ahora que si ya lo habias usado y te habia dado problemas con ciertos archivos pdf, pues ahora es el momento de darle una segunda oportunidad, acaban de sacar la version 2.0 y al menos en mi experiencia ya he podido abrir los archivos que antes no podia abrir

Foxit reader es muchisimo mas rapido que el acrobar reader, y no te instala nada de porquerias adicionales, simplemente lo que uno esperaria de un "lector de archivos pdf"... es lo unico que hace, y (ahora) lo hace bien

Sunday, March 18, 2007

arreglar el caching de RadWindow

Este articulo aplica especificamente al componente RadWindow de Telerik

El cual es un wrapper* buenisimo para crear ventanitas dentro de tus aplicaciones asp.net, solo que tiene un problema; cachea* contenido automaticamente; me tomo algunas horas encontrar la solucion, pero es muy sencillo, solo basta una propiedad:

radW:RadWindow
ID="WindowAttachFile"
runat="Server"
NavigateUrl="AttachFile.aspx"
ReloadOnShow="true"
Height="230px"
Width="410px" Modal="true"

Espero que le sea de utilidad a algun alma perdida
salu2
* como se dicen esas palabras en cristiano y que se oiga decente?

Thursday, March 15, 2007

google reader esta siendo actualizado... inquietante

Han cambiado algunos links a botones y algunas otras cosas mas, pero de pronto me doy cuenta que tengo muchas cosas en google, y "un dia sin google" me afectaria bastante, y a ustedes que tal les iria?

Por cierto, checando mi google analytics me di cuenta que alguien de Moscu y alguien de Shangai me visitan a este blog en español, va un saludo y gracias por visitar

salu2

Saturday, March 10, 2007

tres simples preguntas para un buen manejo de excepciones

Se han dicho muchas cosas sobre el manejo correcto de excepciones, pero yo creo que todo se puede resumir en 3 simples preguntas:

Que?
Cuando?
Donde?

que paso y que datos causaron esto?, Esta es probablemente el area donde los desarrolladores tienen mas problema; frecuentemente lo unico que contestan es "que paso?", pero eso no es suficiente; vamos a ver porque:

digamos que tenemos codigo de manejo de errores y...

la aplicacion nos da este mensaje de error (o se guarda en un log): "La informacion del empleado es incorrecta"

el error me dice que paso, pero es demasiado abierto, la descripcion es demasiada vaga, hay muchisimas cosas que podrian estar mal con la informacion del emploeado

Ok, entonces vamos a mejorar el mensaje de error, solo para este ejemplo, digamos que validamos la ciudad; cambiamos el codigo y ahora el error es:

"el valor del campo Ciudad no es valido"

Este mensaje es mucho mejor que el anterior, al menos ya se donde especificamente tengo el problema; la cuestion es que este mensaje de error solo me sirve en el momento en el que sucede, y solo le sirve a la persona/proceso al que le sucedio

Asi que vamos a mejorar aun mas:

"[ILEGIBLE] no es una ciudad valida"

AH!!... ahora se exactamente que paso, y que es lo que lo esta causando, aun si yo solo estuviera leyendo el error en un LOG file, sabria exactamente que paso, lo que es mas, puedo analizar la lista de errores y si veo que este error es muy comun, podria cambiar/mejorar las reglas en la aplicacion basado en la informacion que tengo; tambien me podria dar cuenta de situaciones que si no tuviera esta informacion pues simplemente no sabria, y los usuarios de mi aplicacion "aprenderian" como se tiene que usar la aplicacion, en vez de que se mejorara el proceso, los usuarios tendrian que hacer algo talvez mas lento porque mi aplicacion no da la informacion necesaria

Cuando? siempre debes incluir fecha y hora con cada error

Donde? Esto es casi automatico con esto del stack trace, pero muchas veces el mismo codigo se usa (por ejemplo) desde una aplicacion web y desde un servicio web (estoy haciendo eso mismo ahora) y seria bueno que el mensaje de error tuviera un campo que me indicara de donde se genero el error, si de la aplicacion web o del servicio web

Esto ultimo yo lo he solucionado teniendo un campo adicional en mi tabla de errores llamado "Origen", entonces en la capa mas alta, capturo los errores y lo mando grabar a mi tabla pasando el origen de donde se genero el error, web o servicio web

En resumen, pongan especial atencion al "que?", recuerden que el saber que paso no me dice mucho, los mensajes de error deben contener los datos que causaron el problema, tal como #Empleado, #Producto, propiedad especifica que causo el problema, etc

He visto innumerables veces programadores que tienen que correr una aplicacion varias veces para reproducir el problema, o lo que es peor, el (tristemente) clasico "hableme cuando vea el error otravez!", simplemente porque el log error no contiene informacion que les diga donde es que y que causo el error y que hacer para arreglarlo.

las excepciones deberian ser algo como

el derecho de [Escritura] no se encontro para el empleado [101]

en vez de

No se pudo grabar el registro!

Con la informacion de este ultimo ejemplo que les doy, yo puedo ir a la base de datos inmediatamente y darle derechos de escritura al empleado 101 y se acabo el problema!

Hay un mar de diferencia de un mensaje de error a otro, y ese mar de diferencia es lo que los va a hacer programadores mucho mas productivos a la hora de mantener su mismo software.

El software siempre va a tener bugs, la diferencia es cuanto tiempo les cuesta arreglar un bug cuando estos salen a la vista

Thursday, March 01, 2007

Yo quiero una Mac!


Hace buen rato he tenido la curiosidad de comprarme una Mac, me he detenido mas que nada por el precio, pero ahora definitivamente me voy a comprar una =o)
Una de las razones principales es parallels. Ya hemos visto maquinas virtuales desde hace buen tiempo, en las cuales el sistema operativo "invitado" vive en su propia ventana (hasta ahi todo normalito).

bueno, pues Parallels lleva esto a otro nivel, te permite integrar la Mac y el sistema operativo en el mismo escritorio de trabajo! de tal forma que te puedes cambiar de una app mac a una app de windows en el mismo escritorio, eso es increible!

checate la foto para que veas mas detalle, las aplicaciones Mac y Windows se "mezclan" naturalmente como si fuera un solo OS, aunque las aplicaciones vivan en OSes diferentes,
Las aplicaciones que corren en Windows se muestran dentro de la "barra" de la Mac.
Incluso te permite copiar y pegar entre los dos (y segun me cuenta Justin tambien te permite hacer "drag and drop")

Esto es buen software.

dude!, I'm getting a Mac... solo me espero a que salga Leopard =o)

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

Tuesday, January 30, 2007

The type initializer for * threw an exception

The type initializer for *inserta tu clase favorita aqui* threw an exception

Me estaba volviendo loco con este error, no se encuentra mucha informacion sobre esto, debi haber usado mis poderes psiquicos antes

El escenario es un servicio web (.net 2.0) que manda llamar (muy dentro) un codigo que usa refleccion para instanciar algunas clases, el mismo codigo funciona bien dentro de una aplicacion web, y eso es lo raro, que tan diferente es un servicio web a una aplicacion web en cuestion de permisos y seguridad?

pero bueno, casi desde el principio sospeche que se trataba de un problema con los permisos, pero el hecho de que era un servicio web, y que el mismo codigo funcionaba bien en la aplicacion web me hizo dejar esta opcion hasta el final, busque bastante y no encontre ninguna respuesta, luego decidi configurar otro usuario en IIS para correr mi servicio, y listo, todo corrio bien.

ok, ahora ya se que el problema es con permisos, pero no me gusta mucho el "parche", asi que seguire buscando e intentando algunas cosas haber si encuentro una solucion mas elegante.

tip gratis para aquellos que no sepan
pon "The type initializer for * threw an exception" en google... viste, que bonito? google acepta comodines (wildcards) para hacer busquedas, tambien funciona con multiples comodines en una frase

Monday, January 29, 2007

formateando 0, 1 como si, no, etc

Esto es algo que todos (los programadores) hemos hecho alguna vez, convertir un valor 0, 1 al equivalente si o no, prendido o apagado, verdadero o falso, valor en un string

pues resulta que hay una funcion en el BCL con la cual podemos hacer exactamente eso, string.Format es dicha funcion

Console.WriteLine(string.Format("{0:si;;no}", 0)); //salida "no"
Console.WriteLine(string.Format("{0:si;;no}", 1)); //salida "si"

y nomas por ver que pasaba
Console.WriteLine(string.Format("{0:si;;no}", -1)); //salida "-si"

...Esas pequeñas cosas

Sunday, January 14, 2007

Pregunta capciosa para entrevista

Es el siguiente codigo:
A)
a1 = new SomeClass();
a2 = new SomeClass();

equivalente a este:
B)
a1 = a2 = new SomeClass();

??
(explicar porque)

El truco aqui es como haces la pregunta, si preguntaras "cual es la diferencia entre opcion A y opcion B", ya les estas diciendo que hay una diferencia.

Friday, January 12, 2007

Thursday, January 11, 2007

efectos al cambiar de pestaña en Firefox


chequense esta extencion de Firefox,
estoy seguro que luego agregaran mas efectos...

Tuesday, January 09, 2007

sugerencia para el google reader

ya me permite ponerle estrellitas a los posts y compartirlos, eso esta muy bueno, ahora que tal si me permiten resaltar partes del texto?
apoco no estaria excelente? generalmente en los blogs hay alguna cosita en especial que queremos resaltar... haber si me hacen caso (aja)

Thursday, January 04, 2007

ya recibi my "old new thing"

Ahora, si pudiera conseguir que me lo autografiaran J

Bueno, a leer se ha dicho J