Showing posts with label tips. Show all posts
Showing posts with label tips. Show all posts

Friday, July 17, 2009

Como guardar archivos .GIF desde MS Outlook


Por alguna razon MS Outlook no tiene una opcion forma facil para guardar archibos GIF directamente desde un mensaje; la unica opcion es que te permite guardarlos como BMP, pero eso haria que perdieras la animacion en si, de hecho tampoco te deja guardar archivos .JPG, .PNG etc, el unico formato que te da como opcion es BMP, pero hay muchas ocasiones en las que queremos guardar el archivo original, de vez en cuando yo mismo necesito esto y se me olvida como es que lo he hecho antes, asi que decidi utilizar mi blog una vez mas para poder recurrir a el en un futuro que lo necesite de nuevo, esto de escribir algo en tu blog para recordarlo luego funciona muy bien, se los recomiendo. Pues bien, aqui esta la solucion.

Les menti en el titulo, si hay forma de guardar archivos .GIF desde MS Outlook, pero por los pasos requeridos mejor no me meto ahi, pero les dire que hay una forma mucho mas facil de hacerlo, solo tienes que enviarte el mensaje a una cuenta de web email, como GMail, Yahoo o Hotmail (que conste que no he probado en Yahoo ni Hotmail, pero creo que funciona ahi tambien)

Una vez que lo abras en tu correo web lo podras guardar normalmente como uno esperaria que se puede hacer, dando click derecho en la imagen, guardar como... y ya esta

Thursday, April 02, 2009

Los miembros de una interface SI pueden ser privados

Este dato sorprende a la mayoria, cualquiera que ha aprendido a usar interfaces sabe que la primera regla es que todos los miembros son publicos y por ende su implementacion tambien lo es, siempre, no es opcional. Al menos hasta que llegaste a este articulo a desaprender que eso no es totalmente cierto. Veamos un pequeño ejemplo, con el puro proposito de demostrarlo.

public interface ITest {

void Test();

}

public class Test : ITest {

void ITest.Test() { //<<== implementacion privada

Console.WriteLine("test");

}

public void Test2() {

Console.WriteLine("test2");

}

}

class Program {

static void Main(string[] args) {

ITest t = new Test();

t.Test();

Test t2 = new Test();

//t2.Test(); //<<=== no compila


Si no lo crees puedes intentarlo tu mismo.

Pero de que me sirve o para que puedo usar esto?

La tecnica te permite asegurarte que el metodo solo es visible a aquellos que usen una variable del tipo de la interface (ITest en este caso). Lo unico que hace es forzar a que el uso de ese metodo sea a travez de una instancia de la interface, osea que, para este ejemplo, si quieres acceder al metodo .Test, solo lo puedes hacer a travez de una variable del tipo ITest.

El unico "truco" para lograr esto es que en la declaracion tienes que agregar el tipo de la interface, antes del miembro:

void ITest.Test();

Seguramente no es el truco mas util, pero es algo para tenerlo guardado ahi en el cofre de los trucos y que en algun momento te sera de utilidad, o talvez algo que te pueda hacer ganar una apuesta ;)

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

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

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, 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...

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

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

Monday, December 18, 2006

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

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