Tuesday, June 12, 2007

C# trivia #1: overloads, strings, nullable types

esta entrada sirve a la vez para probar el mas reciente Windows Live Writer

Tenemos estas clase:

public class Foo {
public void Bar(string x) {
Console.WriteLine("string x was called");
}
public void Bar(int? x) {
Console.WriteLine("int? x was called");
}
}

cual sera la salida a la consola con el siguiente codigo:

Foo f = new Foo();
try {
f.Bar(null);
}
catch {
Console.WriteLine("no method was called");
}

Wednesday, June 06, 2007

Filemon salva el dia una vez mas

Estoy de regreso, me lastime la cabeza en un juego de futbol, me la pase muy mareado por mas de una semana, pero ya estoy bien

Esta vez fue un control ActiveX (todavia estamos peleando con controles ActiveX), pense que ya habia hecho todo para que funcionara, pero aun asi el #@$^ control simplemente no funcionaba, asi que corri Filemon para ver si el archivo era siquiera accesado, y encontre 2 referencias al archivo, una en el folder del GAC, y otra en program files\internet explorer, pero ninguna referencia a donde yo habia copiado el dll.

Asi que decidi copiar el archivo dll a donde IE lo estaba buscando, lo puse en
c:\program files\Internet Explorer\
y todo empezo a funcionar perfectamente

Talez pude haber registrado el control en el GAC, pero ya estaba muy frustrado (tenia varios dias con este problema) y creo que ya habia tratado antes eso mismo y no me habia funcionado.

pero bueno... pues ahi tienen otro truco mas que pueden intentar cuando ya hallan intentado todo lo demas, usa filemon para ver de que directorio esta tratando IE de cargar tu control, y copialo ahi

y si aun no sabes que es filemon, deberias bajarlo y jugar con el, es una herramienta mas que excelente, y te ahorrara muchos dolores de cabeza (y no precisamente de los causados en juegos de futbol J)

salu2

Tuesday, May 22, 2007

como arreglar cuando google reader reporta items nuevos inexistentes


de vez en cuando google reader (por diferentes razones) nos reporta que tenemos items nuevos, pero no los podemos ver (ya que realmente no existen), para arreglar este problema simplemente
- click en "all items"
- click en "mark all as read"

tecnologia para rastrear ubicacion de telefonos celulares

wow... me encontre esto via Aldoara, pensabas que eso de rastrear la ubicacion geografica de los telefonos celulares solo pasaba en las peliculas?... echale un vistazo

Friday, May 18, 2007

control activeX en .NET no funciona bajo https

keywords: .net user control, activex, ocx, IE7, IE, https, http, seguro

Justin y yo tuvimos una semana muy pesada peleandonos con unos controles ActiveX desarrollados en C# y .NET 2.0, asi que vamos a postear algunas de nuestras experiencias con los problemas y soluciones que encontramos (para que podamos recordarlas despues), la prima es sobre controles ActiveX corriendo bajo https.

Desarrollamos el control, todo funcionaba muy bien, uno de nuestros clientes queria ese control en un sitio https, asi que dijimos no hay problema... hasta que tratamos, y tratamos, y tratamos y nada funcionaba, el control simplemente no cargaba correctamente (si cargaba, pero no hacia lo que necesitabamos, esto era aun peor).

La solucion resulto ser algo muy simple (como normalmente es el caso); cuando incluyes un control, normalmente se hace asi:

<object id="someId" classid="SomeDll#Namespace.ClassName"></object>

Esa es la forma en la que lo encuentras en los ejemplos en internet, y funciona muy bien (una vez que pasas todas las demas barreras para hacerlo funcionar) bajo http, pero cuando corres ese mismo sitio bajo https, el control simplemente no funciona.

la solucion?

Cuando creas tu control, le asignas un identificador unico (guid)

[Guid("CAE67AEA-F489-4e52-956B-CCC774F40A3A")]
[ClassInterface(ClassInterfaceType.None), ComSourceInterfaces(typeof(IControlEvents))] // --Expose events
[ComVisible(true)]
public partial class MyControl : UserControl...

mas o menos asi...
bien, para hacer que el control funcione en https, simplemente tendras que usar ese GUID, no el nombre de la clase, asi que escribiriamos el codigo html de la siguiente manera

<object id="someId" classid="clsid:CAE67AEA-F489-4e52-956B-CCC774F40A3A"></object>

listo, es todo lo que hay que hacer, espero que les hallamos evitado algunas horas de dolores de cabeza

salu2

Thursday, May 17, 2007

(humor) soy programador...


un poco de humor para que se despejen...

salu2

Tuesday, May 15, 2007

una hora de diferencia de zona horaria no siempre es igual a una hora de diferencia

esta es una de esas cosas que no se porque no lo sabia...

Esto me paso por sorpresa en un viaje reciente, fui a una ciudad que yo sabia que estaba bajo la siguiente zona horaria, asi que ajuste la zona horaria en mi celular, pero la hora no cambio... me quede un poco confundido y empece a cambiar a otras zonas horarias hasta que entendi lo que estaba pasando

Despues de eso verifique el mismo comportamiento en mi PC, si aun no me crees puedes intentarlo ahora mismo, cambia tu pc a diferentes zonas horarias y veras que la hora cambia no necesariamente cuando tu esperas que cambie

por ejemplo: la hora es la misma en
(GMT-07:00) Mountain Time (US & Canada) y
(GMT-06:00) Central America

...y yo se al menos de una aplicacion donde este detallito causa un problema...

forma facil de ver los metodos y propiedades expuestos en un archivo TLB

...simplemente arrastra (drag and drop) el archivo TLB a una ventana de Visual Studio (funciona al menos en VS2005), al hacer esto abrira el "object browser" y de ahi podras expander el objeto y ver la definicion completa de sus metodos y propiedades

Monday, April 30, 2007

control ActiveX para ver archivos PNG en IE7?


Acabo de bajar este poster de SilverLight a mi maquina, luego trate de abrirlo con IE7; y me dio este mensage. Me sorprendio un poco, pero le di click para activarlo, solo para recibir este mensaje de error:


COMO DICE!?

Thursday, April 26, 2007

problemas en Oracle, parte 2 de 1000: establecer valor a variables

en Oracle no se usa el SET para establecer el valor de una variable
SET variable_name = value;

eso te dara un descriptivo "ORA-00922: missing or invalid option"

para hacerlo, se hace al estilo de Delphi =o)

variable_name := value;

problemas en Oracle, parte 1 de 1000: queries contra scripts

por lo que veo en google, la comunidad latina aprecia bastante a Oracle, haber que tal me va con esta serie de articulos...
Esto lo tengo que poner aqui para recordar en el futuro, tambien espero bloguear acerca de muchisimos otros problemas que he tenido usando Oracle

Este problema en particular aplica cuando ejecutas multiples operaciones para crear vistas, funciones, etc

Cuando estes ejecutando en modo query:
al crear o reemplazar funciones, incluir ";" al final
al crear o reemplazr vistas, no incluyas ";", sino "go" al final

de lo contrario recibiras bellos errores como
" Warnings: --->
W (1): Warning: execution completed with warning
<--- "

"[Error] Script lines: 639-664 ----------------------
ORA-06575: Package or function FUNCTION_NAME is in an invalid state"

y tus vistas/funciones no seran modificados

cuando estas ejecutando como script, todo necesita llevar ";" al final

yahoo mail haciendose el gracioso...




aaarggh...

Sunday, April 22, 2007

Distribuir configuracion de seguridad de .NET 2.0 sin usar SDK o caspol

Este articulo aplica a: Seguridad en Microsoft .NET Framework 2.0
keywords: CAS, full, trust, assembly, security, policy, mscorcfg.msc caspol.exe

Cuando quieres ajustar la configuracion de seguridad en .NET 2.0 usas la herramienta mscorcfg.msc (Control Panel/Administrative Tools/Microsoft .NET Framework 2.0 Configuration)

Peeeeero, algunas veces uno necesita distribuir esa misma configuracion a (muchas o algunas) otras maquinas en produccion, y el problema es que la herramienta mscorcfg.msc solo esta incluida como parte del SDK el cual mide como 354MB, otra opcion es usar la linea de comando, pero eso como que asusta a la mayoria de la gente, hay mucha gente que tiene este problema, asi que decidi poner aqui una solucion facil para este problema.

Les menti en el titulo del articulo, si necesitas el SDK, pero solo en una maquina, y como eres un desarrollador (cierto?), supongo que tienes Visual Studio instalado en al menos una maquina, y ahi esta incluido el SDK, si no tienes el mentado SDK en ninguna maquina pues vas a tener que bajarlo e instalarlo al menos en una maquina.

Una vez que ya tengas la herramienta mscorcfg, configura la maquina con los permisos que quieras distribuir, asigna confianza a los assemblies (trust assemblies), ajusta las zonas de seguridad (adjust zone security settings), etc, cuando hallas terminado de hacer los ajustes necesarios, usa esta opcion

Configure Code Access Security Policy (configurar politicas de seguridad que definen que tantos permisos le damos al codigo)







Create Deployment Package (crear paquete de distribucion)






Veras un dialogo el cual no tiene muchas opciones


Este dialogo es un poco extraño y buggy*, pero solo tienes que especificar un nombre de archivo (que sera creado) en un folder valido (existente), por ejemplo c:\SecuritySettings

La otra cosa que seguro querras cambiar es "security policy level to deploy" (nivel de la politica de seguridad que deseas distribuir), si vas a distribuir a maquinas en produccion querras usar "machine" (aplica a todos los usuarios de la maquina) o "user" (solo al usuario bajo el que lo instales, click Next, luego finish.

Lo que este programita hace es que nos crea un paquete que contiene toda la configuracion de seguridad de .net en esa maquina, y lo pone en un simple y pequeño programita de instalacion que puedes correr en cualquier maquina para ajustar la configuracion de seguridad facil y rapido.

Asi que ahora lo unico que necesitas hacer es llevar ese programita a todas las maquinas a donde quieras distribuir la configuracion de seguridad, correrlo y listo

Cuando corres ese programita naturalmente estaras esperando un dialogo que te pregunte darle click en next, next, next, finish, pero no habra ningun dialogo, veras una ventanita aparecer por un segundo y luego desaparece y eso es todo lo que hace (es posible que necesites correr el programa con privilegios mas elevados que los que tengas en cada maquina), si pudiste correr el programita, la configuracion de seguridad ha sido cambiada exitosamente.

asi que ahora si "corre en mi maquina!", puedes hacer que corra en otras maquinas tambien =o)

Wednesday, April 18, 2007

Microsoft presenta campaña “Estrella Solidaria"

me encuentro con esto en el blog de Zero4, lo cual me parece excelente. a echarle ganas jovenes!

La empresa donará cinco dólares a la ONG Aldeas Infantiles SOS por cada desarrollador que obtenga la cuarta estrella en Latinoamérica.

Monday, April 16, 2007

Todo lo que bloguees podra y sera usando en tu contra

En algun momento la mayoria de los blogueros escriben algun articulo controversial, algunos blogueros lo hacen tan frequentemente que ya ni genera tanta reaccion en la blogosfera.

Algunos tratan de dictar reglas para la blogosfera, lo cual practicamente le quita el sentido mismo al blog, para mi ese tipo de "llamadas a la comunidad" son solamente gente tratando de crear el siguiente buzzword o ganar (en algunos casos mas) popularidad y todo lo que viene ligado a esto; si tu eres un "z list" bloguer como yo, probablemente no haria diferencia alguna si pusieras algo incorrecto en tu blog.

Leyendo mis blogs hoy me encuentro con este post de Sam Gentile: "Se busca: Una edicion de Windows para No-Idiotas"; y el problema que tengo con esto es en llamar idiotas a los usuarios regulares. Si yo uso mucho el teclado y la linea de comando, me hace eso un usuario avanzado y a los que no lo usan los hace idiotas?

Se cuidadoso cuando escribas en tu blog, sin importar que tan popular sea tu blog, nunca sabes cuando podria usarse en tu contra (en una entrevista de trabajo por ejemplo), yo no voy a recomendar un codigo de conducta, simplemente digo que hay que usar el sentido comun y respetar a tus lectores y respetar a la gente en general.

buenas noches

Saturday, April 14, 2007

hola mundo desde F#

Justin y yo estamos empezando a jugar con F# (version 1.9.1 esta disponible)

open System;
Console.WriteLine("hello world");
let name = Console.ReadLine();;
Console.WriteLine("hello "+ name);
Console.Read();

ya veremos que tal nos va, esperamos bloguear sobre el tema pronto

el fin de mi guarda pantallas, gracias McAfee

He usado el screen saver BSD (Blue Screen of Death) por muchisimo tiempo... ahora se ha ido =o(

actualizacion de Notepad lista

...al menos de Notepad2 =o)

Los cambios mas importantes en Notepad 2.0.x comparado con version 1.0.12 incluye soporte para guardar la configuracion del programa en archivo .ini, dialogos modeless de "encontrar y reemplazar", operaciones "encontrar y reemplazar" con soporte multilinea (usando expresiones con diagonal invertida), notificacion opcional de cambio de archivos y mucho mas.

Hay tambien algunas regresiones, por ejemplo el soporte de la pagina de codigo ANSI ha sido reducido al default en el sistema, los bookmarks han sido elminados, algunos esquemas de sintaxis han sido eliminados y Notepad2 ya no corre en Windows 9X, si necesitas algunas de esas cosas tendras que quedarte con Notepad 1.0.12.
la lista completa de actualizaciones la encuentras aqui (solo ingles)

si aun usas Notepad podrias darle un chance al Notepad2, es tan ligero y rapido como Notepad, pero muchisimo mas poderoso

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

Wednesday, January 03, 2007

primer chiste geek del año

Ayer estuve tratando de postear mas cosas, pero al parecer blogger.com no estaba funcionando, ni siquiera pude dejar comentarios en otros blogs de blogger =o(

pero bueno... feliz año a todos!

Tuesday, January 02, 2007

primer post del año

Acabo de pasar de Juarez al Paso, ha estado nevando toda la mañana aqui, espero que no me retracen mi vuelo, y lo peor de todo es que vuelo a travez de Denver, donde ha estado nevando bastante en los ultimos dias, de hecho antes de venir aca, estuvo cerrado el aeropuerto por 2 dias, y cuando yo pase el vuelo estuvo a tiempo pero mi equipaje no llego, y luego cuando llego, una de las maletas estaba rota y total que... haber como me va hoy

por mientras, tengo internet mientras voy en el auto, gracias a mi Cingular 8125 =o), asi que creo que al menos estare leyendo blogs el dia de hoy, y estare actualizando mi lista de blogs interesantes

Wednesday, December 20, 2006

funcion para generar numeros aleatorios, con todos los digitos distintos

El codigo para este articulo aplica a C#

Leyendo blogs, me encontre con este post (en italiano), donde Marco quiere escribir una funcion que le genere numeros aleatorios de 5 digitos, el resultado se requiere en un string, donde todos los digitos son diferentes, es decir, cada numero (de 5 digitos) generado, no puede tener 2 digitos iguales, la funcion que el escribio es la siguiente:

private string GetRandom()
{
Random rn = new Random();
string resultnum=string.Empty;
do
{
string a = rn.Next(0, 9).ToString();
if (resultnum.Contains(a)!=true)
resultnum = resultnum + a;
}
while (resultnum.Length<5); style="color: rgb(0, 0, 255);">return resultnum;
}

Inmediatamente me dio curiosidad por ver que areas que podria mejorar, y me puse a escribir una funcion que obtuviera el mismo resultado, pero en forma mas optimizada

cosas que saltan a mi mente inmediatamente son:

  1. concatenacion de strings
  2. el loop y la comparacion para encontrar numeros que no tengamos previamente

Entonces lo que quise lograr en mi funcion es: evitar la concatenacion, y ejecutar el loop exactamente 5 veces, esto es el resultado:

static char[] allNumbers = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' };
Random r = new Random();
public string GetRandom2() {

char[] result = new char[5];
int max = 9, pos=0;
for (int i=1; i<6; pos =" r.Next(0," style="color: rgb(0, 128, 0);">//*** swap positions
allNumbers[pos] ^= allNumbers[max];
allNumbers[max] ^= allNumbers[pos];
allNumbers[pos] ^= allNumbers[max--];
}
return new string(result);
}

La tecnica que use,

- fue tener un arreglo predefinido de caracteres con todos los digitos,

- luego tengo una variable max que uso para llamar el metodo Random.Next(0, max),

- en cada iteracion del loop decremento esta variable,

- y cambio el numero que resulto elegido a la ultima posicion, con esto lo dejo fuera de las posibilidades para la siguiente llamada

Estos cambios me dieron una ganancia realmente minima (3 milesimas por cada 1000 llamadas), luego se me ocurrio mover la declaracion de la variable Random afuera de la funcion, para que se reusara con cada llamada a este metodo, y eso si que me dio una ganancia tremenda, llamando la funcion 10,000 veces, el metodo original me da 114ms, y el metodo nuevo 6ms, asi que ahi era donde estaba realmente el problema, lo demas es casi insignificante =o(

Seguro alguien mas puede crear una funcion mas rapida, pero yo cumpli mi objetivo =o)

salu2

Signo de que estas blogueando mucho: blog Deja Vu

Antonio Ganci nos platica (blog en italiano) que algunas veces cuando va a postear algo, le da la sensacion de que ya escribio eso antes en su blog, algo asi como blog Deja Vu, luego se pone a checar sus posts viejos, para cerciorarse que no lo habia escrito realmente

Se me hizo chistoso, personalmente aun no me ha pasado algo asi, pero probablemente le pasa a bastante gente en estos dias; el efecto Deja Vu me parece un tema muy interesante... y hace algunos dias fui a ver la pelicula Deja Vu, que se me hizo bastante buena, aunque creo que le encontre unos errores en la secuencia, pero haber ustedes que piensan

salu2

Como borrar elementos de una lista generica

El codigo para este articulo aplica a C# 2.0

Una tarea mas o menos comun cuando usamos una lista generica, es borrar elementos de esta, vamos a ver que alternativas tenemos:

#1 La forma definitivamente equivocada de hacerlo:

List<Person> l1 = GetList();
//*** The wrong way
foreach (Person p in l1) {
if (p.Age > 30)
l1.Remove(p);
}

Este codigo nos dara una excepcion InvalidOperationException: "Collection was modified; enumeration operation may not execute."

#2 Funciona mas o menos (y nos permite ejecutar una accion en cada elemento que vamos a borrar)

List<int> ints = new List<int>();
ints.Add(1);
ints.Add(2);
ints.Add(3);
ints.Add(4);
ints.Add(5);
ints.Add(6);

ints.ForEach(delegate(int i) {
if ((i % 2) == 0) {
Console.WriteLine("removing"+i.ToString());
ints.Remove(i);
}
});

Si corres este codigo funcionara perfectamente, pero la verdad es que tiene un problema grande, si agregaras los numeros pares primero, verias que no los borra todos, y no te da una excepcion ni nada, simplemente se sale del foreach y continua; asi que este metodo funciona, pero solo en condiciones especiales, lo cual lo hace codigo peligroso

#3 La forma correcta: recorremos la coleccion hacia atras y borramos elementos cuando necesitamos
int x = ints2.Count;
while (--x>=0) {
if (ints2[x] < 4)
ints2.RemoveAt(x);
}

#4 Una mejor manera: La lista generica trae un metodo ya incluido que nos sirve para borrar multiples elementos

ints2.RemoveAll(delegate(int i) {
return i <4;
});

#5 Pero que pasa si quiero ejecutar una accion en cada elemento que se borre?

ints2.RemoveAll(delegate(int i) {
if (i < 4) {
//*** Perform action here
Console.WriteLine("removing :" + i.ToString());
return true;
}
else
return false;
});


Si el elemento fuera una clase, podrias mandar llamar uno de sus metodos antes de borrarlo (por ejemplo una llamada a la base de datos)

Mas adelante escribire en detalle porque exactamente las alternativas #1 y #2 no funcionan

salu2

Monday, December 18, 2006

poner el focus en el campo UserName de un control ChangePassword

Estaba intentando todo tipo de cosas para poner el focus en el control UserName del control ChangePassword, resulta que es tan simple como:

if (!Page.IsPostBack)
ChangePasswordControl.Focus();

Funciona para el control Login tambien

if (!Page.IsPostBack)
LoginControl.Focus();

macros en el buen amigo DOS

Acabo de leer este post (por Jeffery Hicks?): Make an old friend do your work Donde explica como puedes usar el buen "doskey" para facilitarte la vida (en la linea de comando), y me motivo a escribir este post por 2 razones:

- Le faltaron un par de cosas
- Quiero recordar estos comandos, ya que parece que comienzo a olvidar cosas =o(

Vamos a ver, primero el define una macro asi:
doskey xl="%programfiles%\Microsoft Office\Office11\Excel.exe" $1 $2 $3 $4 $5

y explica "Puedes usar variables como $1 y $2 (hasta $9)".
Pero porque limitarnos con solo 9 parametros? puedes escribir la macro asi:
doskey xl="%programfiles%\Microsoft Office\Office11\Excel.exe" $*

Y tomara cualquier numero de parametros que le pases. Para probar que tomaba mas de 10 parametros cree un archivo 1.xls y luego corri este comando (muchisima gente no sabe de esta capacidad del CMD):

for /l %e in (2,1,11) do copy 1.xls %e.xls

Esa linea quiere decir algo asi como: un loop del 2 al 11, incrementos de 1, copia el archivo 1.xls a [variable].xls;
Ahora tengo 11 archivos para jugar, ahora llamo la macro:
xl 1 2 3 4 5 6 7 8 9 10 11

Lo cual nos lleva a otro punto que le falto: "de la linea de comando puedo escribirxl file1.xls file2.xls file3.xls y Excel abrira los 3 archivos"
Pues no tienes que especificar la extension, puedes pasar el nombre del archivo sin extension y Excel lo abrira sin problemas

Esto tambien nos lleva a otro punto: Si solo quieres abrir un solo archivo, solo tienes que escribir el nombre del archivo:
1.xls
Y Windows lo abrira usando la aplicacion asignada a ese tipo de archivo (Excel en este caso), asi que para archivos simples, no necesitamos la macro

finalmente, esta macro no funciona para Notepad (o Notepad2), si ejecutas
np 1.txt 2.txt
trata de abrir el archivo "1.txt 2.txt"

Asi que solo puedes abrir un archivo a la vez =o(

un ultimo truco, para borrar una macro, simplemente ejecutas
doskey myMacro=

salu2

Sunday, December 17, 2006

Como obtener todos los campos privados de otra clase

Hace casi 2 meses escribi unos articulos acerca del uso de refleccion, especificamente sobre como ejecutar metodos privados, alguien dejo una pregunta sobre como podria obtener todos los campos privados de una clase, apenas hoy me di tiempo para contestar aqui mismo en el blog; primero vamos a crear una clase de prueba

class TestClass {
private int prop1;

public int Prop1 {
get { return prop1; }
set { prop1 = value; }
}

private string prop2;

public string Prop2 {
get { return prop2; }
set { prop2 = value; }
}

private bool prop3;

public bool Prop3 {
get { return prop3; }
set { prop3 = value; }
}

public bool field4;

public TestClass() {
prop1 = 10;
prop2 = "20";
prop3 = false;
field4 = true;
}
}



luego creamos una instancia de esta clase, y utilizamos el metodo GetFields para obtener la lista de campos, pasando como parametros que queremos los campos privados que pertenezcan a una instancia (que no sean estaticos), una vez que tenemos la lista podemos hacer lo que queramos, en este caso imprimo el tipo del campo y el valor de este

TestClass test = new TestClass();
FieldInfo[] fields = test.GetType().GetFields(BindingFlags.NonPublic BindingFlags.Instance);
foreach (FieldInfo f in fields)
Console.WriteLine(string.Format("type:{0} \t value:{1}", f.FieldType.ToString(), f.GetValue(test)));




listo, eso es todo. Ahora solo para hacerlo un poquito mas interesante me puse a crear una funcion generica para realizar esta tarea y puede reutilizarse con cualquier otra clase:

static void PrintPrivateFields<T>(T theInstance) where T:class {
Type t = theInstance.GetType();
FieldInfo[] fields = t.GetFields(BindingFlags.NonPublic BindingFlags.Instance);
foreach (FieldInfo f in fields)
Console.WriteLine(string.Format("type:{0} \t value:{1}", f.FieldType.ToString(), f.GetValue(theInstance)));
}



para usarla simplemente creamos la instancia de la clase, y pasamos esta instancia a nuestra funcion:


TestClass test = new TestClass();


PrintPrivateFields(test);


noten que no necesito pasarle el tipo generico asi


PrintPrivateFields<TestClass>(test);


sino que el compilador es inteligente y puede derivar el tipo generico.


Espero les sea util, el codigo completo lo encuentran aqui, salu2

Termine de navegar "El Internet"

From tecblog

O dicho de otra manera, por fin termine de leer todos los blogs que tenia pendientes!, la cosa es que he estado enfermo y bastante ocupado este ultimo mes, lo cual tambien ha sido la razon de que no he escrito mucho en mi blog. Pero los escritores de los blogs que leo no me dan descanso, apenas si me paso 2 dias sin leer blogs y me atrazo bastante; aqui les dejo una lista de los posts que me han parecido mas interesantes (de los 266 blogs a los que estoy subscrito), tratare de incluir los links interesantes en español en algun lado en esta pagina, creo que en el link que les dejo todo es en ingles =o(
Posts interesantes

Friday, December 15, 2006

Como instalar Visual Studio SP1 en menos de una hora

La noticia de que el Service Pack 1 para Visual Studio esta listo anda por todos los blogs, pero hay un problemita, estan reportando que se tarda muchisimo para instalar (mas de 2 horas), yo lo que hice es que cerre todos los programas de windows y esta lista de servicios:

- Print Spooler
- Tu programa antivirus, ej. yo tengo: "Symantec Antivirus Client"
- Task Scheduler
- TCP/IP NetBIOS Helper Service
- VNC Server
- IIS Admin Service (junto con los otros servicios que dependen de este)
- MSSQL* (Puede haber varios de estos, yo los apagaria todos)
- cualquier otro servicio que reconozcan y que puedan apagar sabiendo que no va a afectar nada (sincronizador de PDA, etc)

y listo, la instalacion completa salio como en media hora, ojala que esto le sirva a alguien
salu2

Actualizacion: en mi maquina vieja (que le acabo de instalar Windows Vista) la actualizacion de Visual Studio me tomo solo 20 minutos =o) siguiendo mi simple recomendacion

Monday, December 11, 2006

Tour Juarez-Chihuahua 2006

Pues es esa temporada del año en la que tengo la oportunidad de regresar a visitar a la familia y amigos por alla en mi tierra, voy a estar en Juarez y Chihuahua (y Cuauhtemoc talvez 1 o 2 dias) entre el 23 de Diciembre y el 1 de Enero, si alguien esta interesado en tener una cena geek, platicar o lo que sea, dejenme un comentario y ahi nos arreglamos

salu2

Saturday, December 09, 2006

Windows is unable to find a system volume that meets its criteria for installation

Tuve algunos problemitas (bueno, realmente solo uno, el error mencionado en el titulo) instalando Windows Vista en mi maquina vieja ( hey, mi maquina ya tiene mas de un año... y hey!, ya tengo mas de un año en esto del blog!!)... en que estaba, ah si, lo del mensaje ese de error, pues por mas que trataba, seguia recibiendo ese mensaje al tratar de instalar Vista en cualquiera de las (3) particiones de mi disco SATA, borre particiones, las formatee, las recree, nada funcionaba. Por supuesto anduve buscando informacion acerca de este problema, y lo mejorcito que encontre fue una respuesta en un foro "Vista debe ser instalado en la particion activa", y eso que se supone que quiere decir???

En un ultimo y desesperado intento, desconecte el otro disco duro (que no mencione antes =o) ), dejando solo el disco SATA conectado, corri la instalacion y voila!, era todo lo que necesitaba, la instalacion corrio sin ningun problema despues de eso, y todo esta funcionando perfectamente hasta ahorita, creo que hasta Internet Explorer 7 me gusta mucho mas en Vista, y esto de los efectos Aero Glass esta chido chido chido!

Aqui esta una lista de teclas de rapido acceso para aquellos de ustedes que sean nuevos usando Vista (no halle un link en español =o(... tendre que poner una recopilacion aqui pues =o))

Y pues espero que mi experiencia le sea de ayuda a alguno, ahora si me disculpan tengo que ir a jugar, siguiente paso: Office 2007

Thursday, December 07, 2006

Wednesday, December 06, 2006

Comandos de Novell para recordar

Yo "creci" usando servidores Novell y DOS, recuerdo que era bastante bueno para administrar servidores Novell, pero hace un buen que no toco un servidor de estos; ayer unos colegas estaban teniendo problemas con uno de estos servidores y me hablaron para pedirme ayuda, y yo no me podia acordar de esos comandos, asi que este post es para guardar en mi memoria digital esos comandos para en caso de que se me ofrezca despues, y talvez tambien tu eres bien suertudo y los puedas usar algun dia

Comandos para el servidor

  • server - En un prompt de DOS, inicia el servidor
  • restart server - resetear el servidor pues
  • VRepair - Usalo para corregir problemas con los volumenes (no puedes usar vrepair en un volumen montado)
  • enable/disable login - para que los usuarios no nos molesten
  • mount/dismount - poner un volumen disponible a los usuarios (mount all para montar todos los volumenes)
  • volume - obtener una lista de volumenes montados, o la informacion acerca de un volumen en particular (parametro)
  • down - bajar el servidor (amablemente)
  • load/unload monitor - cargar/descargar el monitor (para administrar el servidor con un bonito UI)
  • tcpcon - un bonito monitor con bastante informacion sobre TCP y otros protocolos de red
  • display environment/processors/servers/networks / modified environments / interrupts -
  • list devices - obtener una lista de dispositivos de almacenamiento (discos duros, cd-rom, etc)
  • memory - muestra el total de memoria instalada a la cual el sistema operativo tiene acceso
  • mirror status - ver el estado de las particiones de disco espejeadas(???), ver el porcentaje de datos espejeados en cada particion
  • modules - obtener una lista de los modulos cargados

Commands para las maquinas de usuario

  • attach - connectar a otro servidor, pero mantenerse conectado al servidor actual
  • caston/castoff - habilita mensajes de la red de otras maquinas de usuario y del servidor si se usa la opcion ALL
  • chkvol - muestra informacion del volumen, espacio libre, uso, archivos borrados, etc
  • login/logout - pues eso mismo...
  • rights - muestra los derechos para archivos y directorios
  • rconsole - consola remota, para controlar el servidor desde un cliente; si el servidor no se especifica, nos muestra una lista
  • purge - remover archivos (previamente borrados) permanentemente, archivos purgados no pueden ser recuperados
  • slist - lista de servidores
  • syscon - administrar usuarios, grupos, derechos, etc
salu2

Tuesday, December 05, 2006

Haz estado usando patrones de diseño desde hace tiempo...

Por ejemplo aqui esta este, llamado Composed method:
Divide tu programa en metodos que realizan una tarea identificable. Manten todas las operaciones de un metodo al mismo nivel de abstraccion. Esto resultara naturalmente en programas con muchos metodos pequeños, cada uno con pocas lineas de codigo.
Es tan simple como extraer codigo de metodos grandes, y crear metodos mas pequeños, algo que haces todos los dias que programas algo, hay muchos patrones simples como este, lo unico que hacen es describir (con un nombre corto) las tareas que realizas diariamente.

La idea es que conociendo estos patrones por nombre, te puedes comunicar mucho mas rapido, facil y mejor, y usandolos te conviertes en un programador mas educado, un mejor desarrollador; recuerda que un gran desarrollador es aquel que no solo escribe codigo increiblemente eficiente, sino que ademas es capaz de comunicar ideas y trabajar en equipo.

"El mejor codigo en el mundo no tiene sentido si nadie sabe acerca de tu producto."

Asi que como ves, ya has estado usando patrones de diseño desde que estas programando, ahora aprendete los nombres de estos, aprende mas patrones, usalos y educa a tu equipo (tambien a compañeros, lectores de tu blog, etc) sobre estos.

Ademas de todo lo anterior, tambien aprendes mas tu al enseñar a los demas.

salu2

Monday, December 04, 2006

si eres talentoso, las herramientas no importan tanto

Este es el primer post usando blogger beta, haber que tal... mientras chequense este chavo, lo que puede hacer usando solamente Paint

Sunday, December 03, 2006

trucos css: encabezado, pie de pagina y area principal cubriendo 100% del documento

En los viejos tiempo (no hace ni tanto) yo empezaba una pagina con una table html con 3 rows, uno para el encabezado, uno para el area principal (al 100% de tamaño) y uno para el footer

En estos dias esto ya no funciona, y ademas nos dicen que debemos usar CSS puro, que nada de html y no se que... pero como logramos esto con puro CSS?

Vamos a necesitar algo de CSS y un poco de javascript, primero vamos a ver el CSS

html,body,form
{
margin:0;
padding:0;
}//prevent some default spacing on some browsers
.header
{
text-align:center;
background-color:Navy;
color:White;
width:100%;
}
.footer
{
background-color:Orange;
color:Navy;
position:absolute;
bottom:0;
border:0;
}
div.scrollable{
overflow:auto;
border-left-width:0px;
border-bottom-width:0px;
border-top-width:0px;
border-right-width:0px;
background-color:Gray;
color:White;
position:absolute;
}

Lo mas interesante es la clase div.scrollable; la propiedad overflow:auto hace que el DIV sea scrollable, y el resto es para eliminar los border y poner algo de color.

Ahora vamos a ver el html:

<html>
<head>
</head>
<link rel="stylesheet" type="text/css" href="test.css" />
<body>

<div>
<div id="header" class="header" height="20px">
This is the header
</div>

<div id="mainDiv" class="scrollable">
This is the main body<br>
There is a lot of stuff in the main
<br><br><br><br><br><br><br><br><br><br>
There is a lot of stuff in the main
<br><br><br><br><br><br><br><br><br><br>
There is a lot of stuff in the main
<br><br><br><br><br><br><br><br><br><br>
There is a lot of stuff in the main
<br><br><br><br><br><br><br><br><br><br>
There is a lot of stuff in the main
<br>
<br><br><br>
This is the last line
</div>

<div id="footer" class="footer" height="20px">
<div style="float:left">This is a div on the left</div>
<div style="float:right">This is a div on the right</div>
</div>

</div>

</body>
</html>

A proposito he puesto muchas lineas en la seccion media, para que se pueda apreciar que el documento hace scrolling (solo en la parte de enmedio, el header y footer siempre se quedan en su lugar). Tambien como un "bono" puse 2 divs en el footer, uno alineado a la izquierda y otro a la derecha, ambos a la misma altura, ya que me he dado cuenta que esta es una de las cosas que mucha gente batalla para lograr. Ya mero terminamos, solo necesitamos un poco de Javascript:

var mainDivHeight;
var mainDivWidth;

function AdjustFullSize() {
var screenHeight = 450;
var screenWidth = 610;

if (window.innerHeight) {
screenHeight = window.innerHeight;
screenWidth = window.innerWidth;
}
else if (document.body) {
screenHeight = document.body.clientHeight;
screenWidth = document.body.clientWidth;
}

mainDivHeight = screenHeight - 20 - 20; //20+20 for header and footer
mainDivWidth = screenWidth - 0;

document.getElementById('mainDiv').style.height = mainDivHeight + 'px';
document.getElementById('mainDiv').style.width = mainDivWidth + 'px';
}

Diferentes browsers tienen diferentes propiedades para accesar el tamaño del documento, asi que nos encargamos de eso y luego asignamos el tamaño al maindiv que es nuestra area principal, mandamos llamar esta funcion en el "onload" (y tambien en el onresize!) y listo, el resultado final es este, puedes obtener el codigo completo de ahi, espero que les sea util.

salu2