User Controls

A partir de hoy intentaré escribir un artículo en mi blog sobre cómo resolver ciertas situaciones con las cuales uno se puede llegar a encontrar en el trabajo.

Para empezar, muchos de nosotros en el mundo de la programación nos encontramos en casos donde necesitamos repetir ciertos fragmentos de páginas web. Hablo de los obvios casos como el formulario para el logueo, el muy conocido:

Pero muchas sabemos que en el día a día de los trabajos, de los freelos que nos salen, nos encontramos con que no solo debemos construir algo así, sino que también debemos repetir ciertos componentes como “recuperar password”, “noticias del día”, “calculadora”(para casos como login a bancos) y demás.

Debido a esta necesidad que tenemos, en ASP.Net tenemos la oportunidad de construir nuestros propios controles, que son llamados “User Controls”.

Pero qué es un “user control”? Según la definición del mismo Microsoft, un user control es un tipo de control compuesto que trabaja como una página web ASP.NET, porque en este podemos agregar controles ya existentes (TextBox, Buttons, Grids, etc), definir propiedades y métodos para el control. Y además se pueden embeber dentro de una página ASP.NET para que trabajen unidas.

Entonces, particularmente podemos definir algunas características del User Control

- Permite reutilizar componentes como TextBox, Button, ListBox, CheckBox, etc.

- Permite definir propiedades y métodos

- Permite reutilizar otros user controls existentes

- La extensión de un user control es “.ascx”

- Permite manejar muchos eventos de la clase “Page” (como el Page_Load y otros)

Esas son solo algunas características que puedo mencionar. Pero vamos al grano, osea lo que le gusta más a la gente, el código.

Empezaremos con un ejemplo simple. Varios que ven este tema de User Controls, conocerán el clásico User Control que enseñan al inicio que es el de Login (http://www.15seconds.com/Issue/020319.htm). Pero, imaginemos un poco, si tenemos login, también podemos tener un “recuperar password”. Así que hagamos eso como primer ejemplo simple. Para esto, imaginemos, un requerimiento de nuestro cliente, es que el usuario pueda recuperar su contraseña por “usuario” o por “E-mail”, entonces para esto tenemos que colocar en nuestro User Control un “dropdownlist”, donde se colocará “usuario” o “E-mail”, un textBox donde colocará su información y, por último, un Button.

Para esto asumiremos que ya hemos creado nuestro Web-site y dando click derecho a la raíz seleccionamos “add New Item”, dentro de la ventana que nos sale seleccionamos “Web User Control”, le colocamos de nombre “wucRecoveryPass”.

Al darle click a “Aceptar” nos encontraremos con algo parecido a las directivas de una página web ASP.Net normal, algo así:

Jugando un poco con este user control, se pueden dar cuenta que es muy parecido a crear una página web común y corriente.

Entonces, luego de familiarizarnos con esto, procedemos a agregarle una tabla para darle forma y luego los controles que necesitamos. Finalmente tenemos el sgte código:


<table style="width: 100%;"> <tbody><tr> <td colspan="4"> <b> Si olvidó su contraseña, coloque sus datos necesarios para enviársela por E-mail </b> </td> </tr> <tr> <td> <asp:literal runat="server" id="ltrUsername" text="Usuario(o E-mail)"></asp:literal>
</td> <td> <asp:textbox id="txtDato" runat="server"></asp:textbox>
</td> <td> <asp:dropdownlist runat="server" id="ddlTipo"> <asp:listitem value="0" text="Usuario"> <asp:listitem value="1" text="E-mail"> </asp:listitem> </asp:listitem></asp:dropdownlist>
</td> <td> <asp:button runat="server" id="btnAceptar" text="Enviar E-mail"></asp:button>
</td> </tr> </tbody></table>

Teniendo este código, necesitamos alguna forma de acceder a los componentes (TextBox y DropDownList). Entonces procedemos a crear nuestras propiedades.


public partial class wucRecoveryPass : System.Web.UI.UserControl {
private int entero; public string DatoUsuario { get { return txtDato.Text; } } public string TipoDato { get { return ddlTipo.SelectedValue; } } protected void Page_Load(object sender, EventArgs e) { } }


Ahora sí tenemos todo lo necesario para poder utilizar nuestro control. Para eso creamos una nueva página web llamada “frmUsingUserControl.aspx”. Para utilizar este control tenemos que colocar algo muy simple en la parte superior de nuestro aspx.

Finalmente nuestro form queda de la sgte forma


<form id="form1" runat="server"> <style="width: 500px;"> <wuc:recoverypass id="wucRecov" runat="server"> </wuc:recoverypass></div> </form>

Hasta ahí tenemos algo muy simple. Pero cada uno puede ir experimentando muchas cosas como agregarle un evento al boton en la parte del diseñador del User Control. En ese caso verán que el evento se crea dentro del code behind de éste, pero si desean controlarlo desde la página misma, deberán de crear un delegado, asignárselo al evento del botón y listo. Con eso tienen todo el control que deseen sobre sus user controls, utilizarlos en sus proyectos, tenerlos para reutilizarlos en más de un proyecto, entre otras cosas.

Termino este pequeño artículo dándoles para pensar, cómo harían esas calculadoras que pueden variar de posición sus números cada vez que entran? Un claro ejemplo www.scotiabank.com.pe. Y para el sgte artículo, les dejo la pregunta, cómo harían de una forma dinámica crear un User Control que tenga varios TextBox, los cuales pueden variar dependiendo de un parámetro. Posteen sus ideas y en el sgte artículo les daré algunos tips que he descubierto utilizando los user controls.

Aparte, si es que llego a ir a la conferencia de Microsoft de este miércoles, les estaré informando al respecto.

Nos vemos

cya :3

P.d. Acá les dejo un link con el código fuente de lo explicado, así también el cómo agregarle un evento al botón de forma directa. Código Fuente

Shinji

Spring Community Day Lima 2008

Hoy se realizó el Spring Community Day en el auditorio de Cibertec, llegué a eso de las 9:05, felizmente no había empezado a la hora exacta, porque consideran a la gente algo tardona como yo XD

Bueno, al llegar me encontré con unos amigos que trabajan en Antartec y me senté a lado de ellos. Luego de eso llegó un amigo que, si mal no recuerdo, trabaja en siscom y se sentó a mi lado y conversamos sobre aquellos expositores.

Entonces la conferencia empezó muy bien....pero no, no iré contando todo como un relato, daré mi punto de vista, es decir, mi opinión sobre cada uno de los puntos que se trató. Así también diré lo que me pareció bien y lo que me pareció mal, para así, de repente, se pueda hacer un feedback =)!!!

Introducción a Spring Framework 2.5
Fue muy buena la presentación de Spring en general, donde se señaló una de las mejores características de este framework (IOC, inversion of control), señalando como inicio la clásica frase de Hollywood que se encuentra en varios libros "no nos llames, nosotros te llamaremos", con esta explicación y el primer ejemplo se me despejaron muchiiisimas dudas que tenía acerca del concepto de IOC, el nivel de visibilidad que tienen las clases POJO y demás temas. Pero no, esto no fue suficiente para el expositor, sino que también pudo mostrar lo nuevo de Spring 2.5, utilizando el potencial de las anotaciones en lugar de llenarnos más y más y muchiiiisimo más de un xml que se volvería un mounstro si no fuese por las anotaciones. La verdad me pareció muy bueno este módulo de la conferencia, en especial porque se equivocó en una parte, a mi parecer, siempre tiene que ocurrir eso, porque sino no se despierta la atención de los asistentes (sí, ya sé que salen silbidos, pero eso tb los despierta XD). En resumen, una buena explicación, muy bien el hecho de haber colocado ejemplos para cada parte, demostró la gran potencia de una de las características de Spring.


Spring MVC y Spring Portlet MVC
El estilo de explicación del expositor fue a lo "auto-pregunta y respuesta", me parece bueno debido a que así uno se ahorra en preguntar ciertas cosas xD.Me agradó bastante la introducción de por qué utilizar un framework en sí. La teoría mostrada sobre portlet MVC fue la más interesante, a mi parecer, pues se podía ver todo lo que se reducía con el hecho de utilizar Spring Portlet MVC y no hacerlo desde "cero". Lo que sí me pareció que faltó ahí para colocarle la cereza al postre, era mostrar un ejemplo donde se haya aplicado esto, o algún pequeño ejemplo preparado por el expositor, pero en todo lo demás muy buena, clara y rápida la exposición.


Spring Security
El expositor estuvo muy preparado en el tema, se notaba que tenía un amplio conocimiento al respecto. No sé todo lo que abarque Spring security, pero al hablar con algunos asistentes, me contaron que fue bastante amplia la explicación. Lo único que podría decir como críticaes que hubiese sido bueno un ejemplo, no una grandeza, para mostrar cómo se aplica esa seguridad en una aplicación algo simple, pues, creo yo, que si uno como no usuario de Spring ve todos esos temas de seguridad podría llegar a pensar algo como "Tengo que hacer TODO eso para colocar seguridad? No podría usar solo un poco de eso?". De repente me estoy equivocando, pero esto no opacó en nada el amplio conocimiento de seguridad departe del expositor.


Break.......
Sí, luego de eso vino el Break gracias a JoeDayz y estuvo muy rico :D


Spring Batch
Durante toda la exposición se atrajo la atención del público debido al tema de Batch, porque creo que muchos, como yo, se preguntaban...."batch? esto no son los bat y los sh?" y era obvio que la mayoría de los asistentes no conozcamos al respecto, pues, tal como mencionó el expositor, es un tema nuevo, es algo reciente, así que la posibilidad de que alguien lo conozca era mínima. Pero debo decir que la conferencia se dejó seguir muy bien, pues ese flujo que se mostró explicaba muy bien las cosas. Para este caso obviamente creo que no era necesario un ejemplo pues mas son temas teóricos, alcances de este nuevo tema y demás. Muy buena exposición la verdad.


Extreme Testing con Spring
Lamentablemente Gustavo Quiroz no pudo asistir debido a que se encuentra en Buenos Aires, asistiendo a unas conferencias de metodologías Ágiles. Pero.........qué más puedo decir? Bastante original la exposición, en todo momento supo cómo captar la atención del público con comentarios muy ciertos y a la vez chistosos sobre todos "nosotros" desarrolladores. Fuera de eso, los temas que abarcó fueron muy amplios en lo que es el testeo, trató bien el porqué del testeo, las facilidades que se nos da al testear y demás temas que mostraron que debemos de testear. No solo, sino que también hubo una muestra bastante práctica de JUnit. Luego de esto se hizo una muestra más pesada sobre JUnit con EasyMock (framework para lo que son mocks), aunque a mi parecer, fue......demasiado largo ese ejemplo XD. Al fin y al cabo, se mostró un principal caso que se tiene al usar mocks que sirvan para Request y Response. Muy buena la exposición, no se puede negar.


Spring Dynamic Modules
Qué es esto? El servidor de Spring (2 versiones, libre y otra que es pagada con soporte), la verdad dejó impresionados a todos el tema de manejar nuevos tipos de paquetes llamados "par" (así como hay war y ear, algo así). Aparte se trataron de temas como el concepto de un módulo y el agregar/remover módulos del servidor de aplicaciones en caliente, es decir, sin bajarse el servidor. La explicación de las capacidades, características, mediciones y demás del server fue bastante completa. Y el hecho de ver una aplicación funcionando en este nuevo servidor fue muy agradable para todos los asistentes :)!!!!


En resumen, fue de bastante agrado el ambiente ahí en la conferencia, las exposiciones en cuestión de conocimiento de temas fue bastante amplio, en relación a ejemplos, muy buenos y explicativos, aunque faltaron algunos ejemplos que hubieran ilustrado de una mejor forma el tema que trataban.

Estoy seguro que todo esto mejorará con el tiempo, pues para ser la primera vez han captado a muchos participantes.

Y, lo que me falta decir es FELICITACIONES a Lennon Shimokawa en especial porque, tal como lo dijo Abner en su exposición, fue el que hizo que esta conferencia se lleve a cabo, espero estas organizaciones sigan con un mayor apoyo y auspicio. Obviamente, no dejo de lado al felicitar también a los conferencistas que se esforzaron bastante para darnos una buena vista de lo que es Spring.

Mucho éxito a este grupo que ha puesto todo de sí en este Spring Community Day 2008

Acá el enlace del grupo 

http://www.springperu.org/

Y por último una foto de los expositores:


Pronto subiré más fotos de la conferencia =) <--- Ya fueron subidas las demás fotos

Información sobre el evento en la página del organizador (Lennon Shimokawa), ppts del evento, fotos, entre otros en el sgte link

Así también el blog de Lennon

Saludos a todos
cya :3

Shinji

P.d. Gracias por los comentarios =)

Cajero Global Net


Holas a todos

Estos días conversaba con otro blogger (http://www.unbugalavez.net/) sobre unos temas laborales y algunas tecnologías de Java y .Net (sobre Spring y los Foundation específicamente) y entre tantas conversaciones salió un tema muy particular como el que me contó un amigo que trabaja en una consultora que se encarga del "Switch"(el cual comunica a las agencias bancarias, saga falabella, ripley y demás entidades), mas o menos fue así:

Amigo: Paaaaala, si supieras el otro día el tema que me encargaron
Yo: Qué fue? o_O
Amigo: Había salido un error grave que tenían que solucionar en la empresa lo más rápido posible
Yo: o_o
Amigo: El problema era que en los cajeros de Global Net cuando uno va sacar dinero, lo normal es colocar un monton menor igual a lo máximo que puedes sacar, pues es un comportamiento muy común, pero parece que alguien quizó probar qué pasaba XD
Yo: XD
Amigo: Cuando alguien probó eso, salía en la pantalla Null Pointer Exception XDDDDDDDDDD
Yo: PLOOOOOOOOOOOOOOOOOOOOOOP XD

Al blogger Gustavo le gustó bastante el asunto que me recomendó colocarlo como una nueva entrada y en eso estoy :D!!!

Pensaba colocar un cajero de global net editándolo con las palabras "Null Pointer Exception", pero entre las búsquedas que hice en google, me sorprendí que otras personas tuvieron errores parecidos y acá les paso los links:



La verdad que a uno le pasen ese tipo de cosas dan muchas ganas de hacerles capturas y ponerlas en internet al instante xD.

Espero no le pase a nadie eso en un momento que esté sacando dinero sino ya saben, pueden enviarme la imagen para agregarlo entre los mayores PLOPS de su cajero Global Net XD.

Nos vemos todos

cya :3

P.d. Por si aca, para los fanáticos de Twitter, el día de hoy me creé uno para probar esta tecnología :D. Les dejo la dire : http://twitter.com/shinjiDev 

Shinji

Las peores prácticas (The worst practices)

Muchos de nosotros llevamos desde días, meses, incluso años viendo código fuente, arreglando código fuente, o buscando un bug. Así que no es novedad habernos topado con más de un código que nos ha dejado literalmente boquiabiertos (sea el nuestro o el de otra persona).

WTFBatman.pngWTFBatman.png

Es por ello que me di el trabajo de pensar día a día qué códigos hice mal, qué códigos arreglé y qué bugs encontré.

Así que enumeremos, de menor a mayor, uno a uno con un nombre característico.

1. ¿Qué significa ese número?

public class DoesntHaveConstant {

public double getIGV(double precio){

return precio*0.19;

}

}

Muchas veces tenemos la manía de colocar código de esta forma, de repente diciéndonos “luego lo coloco en una constante” y ese “luego” nunca llega. ¿Por qué está mal? Me preguntaron muchas veces, y no existe una sola razón, sino varias: “si alguien que no eres tú ve ese código, no sabrá qué significa 0.19”, “¿Cuántas veces se repite ese 0.19 en todo el programa?¿Y si alguna vez cambia, le hago replace?” y la más importante “Si ese valor quiere ser modificado en el tiempo por un administrador y no un programador?”. Lo peor de todo que un día escuché a alguien responder a la última pregunta con un “Le enseño a programar pes”. Osea PLOOOOOOOOOOOP XD. La solución es algo simple, usar constantes y en caso de que se pueda modificar el valor de forma manual por alguien que no sabe programar, usar un properties o sino una interfaz para modificar este valor =).

2. ¿Qué hace esto?¿x1, x2 y x3?¿Versiones?

public class WhatIsThis {

private int x1;

private int x2;

private int x3;

public int doSomething(){

return x1*x2 + x3;

}

}

A la clase le iba a poner “WTFIsThis”, pero mejor no =P. Es obvia la razón de por qué está mal, pero por si es que alguien no se ha dado cuenta la diré: “¿Alguien sabe para qué sirve doSomething?”. Está bien que muchas veces venga un método con ese nombre en los libros de los cuales uno estudia, pero no se debería de crear una clase que no tiene un nombre descriptivo, que tiene variables que no te dicen nada y peor aun, un método que te dice que hace algo, pero……no sabes qué es. La solución es muy simple: nomenclatura. Hay que aprender a nombrar a las clases, variables, métodos y demás.

3. ¿Esos no son datos de una persona?

public class PersonaDAO {

public void save(String pNombre, String sNombre,

String apePaterno, String apeMaterno, String telefono, int edad, String email, Date fechaNacimiento, String direccion){

//Here is the code

}

}

Esto es algo más complejo de ver, pues uno muchas veces está acostumbrado a trabajar de la forma “funciona y listo”, sin abstraernos un poco a la POO. Es decir, si lo que va grabar el DAO, es un objeto Persona, y conociendo que…..un objeto Persona puede contener todos esos datos, por qué necesitamos pasar toooooooooooodos los datos en lugar de pasar solo un objeto de la clase Persona, debidamente llenado, y grabarlo directamente a la BD. La solución ya fue implícitamente mencionada.

4. Sin comentarios…..

if (accion.equalsIgnoreCase(CReclamo.RECLAMO_ACCION_GRABAR)){

// nothing

}else if (accion.equalsIgnoreCase(CReclamo.RECLAMO_ACCION_ENVIAR)){

SirectMovimientoSolReclamo movSolicitudVerificacion1 = generaMovimiento(CReclamo.ESTADO_RECLAMO_VERIFICADO1, usuarioResponsable, idTipoAprobacion);

movSolicitudVerificacion1.setSirectSolicitudReclamo(reclamo);

listaMovimiento.add(movSolicitudVerificacion1);

}

No señores, no estoy bromeando, este código es de un programa real que utiliza actualmente una empresa (obviamente no mencionaré el nombre). Extraje una sección del código para mostrarles las cosas que uno puede encontrar en cada código y quedar como la imagen de Batman del comienzo. Ojo, la parte que dice “//nothing” no significa que yo lo haya eliminado y haya puesto eso, NO, así es tal como está en el código fuente. La pregunta que me hago es……si no vas a hacer nada, para qué le pones un “if”?. Para esto, a mi parecer, existen 2 soluciones: Primera, Colocar “if” solo para situaciones que ameritan una acción, que ameritan que al procesar no hagas una condición que no te lleve a nada, en caso te digan que coloques un “if” para que sea más entendible el código, colócale un comentario y listo, es mucho mejor tener un comentario que ocupe algo de líneas, en lugar de hacer trabajar al procesador en una condición que no hace NADA. Segunda solución: despide a ese programador XD.

Obviamente la 2da solución es una broma, pues en momentos que uno se encuentra con cosas así, sean de uno o de otros, no vale la pena enojarse, sino reírse y reírse hasta más no decir. Porque recuerden algo, todos fuimos alguna vez terneras.

Espero haya sido de su gusto este artículo.

Y me despido haciéndoles la pregunta: “¿Cuál fue el peor código que has visto en tu vida?”

Y esto va solo para la gente que lee mi blog, pronto haré un tipo de concurso donde sortearé un libro original de ASP.NET. Así que escriban con todo para saber quiénes realmente desean participar de este concurso. En estos días decidiré si será solo para la gente relacionada con el tema o no. Gracias por todo a todos =)


//*******************************
//English
//*******************************

Many of us have worked for days, months, even years looking a lot of source code, fixing source code, or maybe finding bugs. So, We have faced a lot of ugly source code that we finished with this face:

WTFBatman.pngWTFBatman.png

That’s the reason of i was thinking this days about my uglys source code, the ugly source code that I fixed and some bug that I found.

So, let’s enumérate, from less to more, one by one with a caracteristic name:

1. ¿What’s the meaning of that number?

public class DoesntHaveConstant {

public double getIGV(double precio){

return precio*0.19;

}

}

Many times we write this kind of code, maybe thinking “I will change it after that…”, but that never happen. “Why is this bad?” That is the question that someone asked me, and there is no just one reason: “Just a little bit of people will understand the meaning of 0.19”, “How many times did you repeat that 0.19 in the application? If in the future that value needs to be changed, how can I do that? Replace?”, and the most important “If that value needs to be changed in the future for someone who don’t know about how to program?”. The worst of this is that someday I heard someone answering the last question “I can teach him/her how to program”. PLOOOOOOP XD. The solution is simple, you need to use Constants or maybe properties to modify the value manually.

2. ¿What is this?¿x1, x2 y x3?¿Versions?

public class WhatIsThis {

private int x1;

private int x2;

private int x3;

public int doSomething(){

return x1*x2 + x3;

}

}

The reason is obvious, but if you didn’t see it, it’s: “Does anyone know what is the functionality of doSomething?” Ok we’ve seen this method in books, but you shouldn’t use that kind of names to a class, a variable, method or other things. The solution is very easy, put a descriptive name to your classes, variables, methods and others.

3. ¿Is that the description of a Person?

public class PersonDAO {

public void save(String pNombre, String sNombre,

String apePaterno, String apeMaterno, String telefono, int edad, String email, Date fechaNacimiento, String direccion){

//Here is the code

}

}

This is something complex to see, because many of us a lot of times work of the way “if this works, so it’s ok”, without to take the abstraction of POO. So, if the DAO will save a Person object, and you know that a Person object contains those parameters, why do we need to pass a lot of parameters rather than just one Person object.

4. No comments…..

if (accion.equalsIgnoreCase(CReclamo.RECLAMO_ACCION_GRABAR)){

// nothing

}else if (accion.equalsIgnoreCase(CReclamo.RECLAMO_ACCION_ENVIAR)){

SirectMovimientoSolReclamo movSolicitudVerificacion1 = generaMovimiento(CReclamo.ESTADO_RECLAMO_VERIFICADO1, usuarioResponsable, idTipoAprobacion);

movSolicitudVerificacion1.setSirectSolicitudReclamo(reclamo);

listaMovimiento.add(movSolicitudVerificacion1);

}

No, I’m not kidding, this is a real source code of a real program that works in an enterprise. I copied this section of the code because I wanted to show the kind of code that can leave you like the batman image xD. Hey, if you don’t understand, that part of the code that says “//nothing”, that doesn’t mean that I have deleted some code and put that, NO, that’s the original way of the source code. So, why do you need to put a conditional that does …..NOTHING???. There are two solutions: First, just put a conditional when you really need it. Second, fired him/her XD

Obviously i was kidding in the second solution, because in that kind of moments you just need a laugh, come on don’t be angry for that, just a lot of laughs. Because remember, we have failed sometime.

I hope you liked this article.

And my final question for you is: “What’s the worst code that you have ever seen?”


cya :3

Shinji

CERTIFICADO MCTS - ASP WEB BASED CLIENT DEVELOPMENT

Alineación al centro

I did it again *-*
Sep, lo hice de nuevo =D!!!

Bueno, no pude llegar al 100%, me equivoqué en una pregunta XD

Pero lo logré, pasé con éxito el MCTS de ASP.NET =D!!

Hace unos momentos, a las 9am rendí mi examen, salí a las 9:25am y estaba algo nervioso pues en un momento se trabó el programa con el que se rinde el examen, pero a las finales todo bien. Ahora tengo que inscribirme de nuevo a la página de Microsoft para que me envíen mi kit de bienvenida. Y bueno, tengo que pagar mis 80 dolares para el sgte examen que es el de MCPD, de ahí sacaré los MCTS de Windows Forms y el otro de Aplicaciones Distribuidas =)!!!

Hoy en la noche terminaré de hacer el reporte que les comenté, aparte subiré los resúmenes que hice del Kit 70-528.

Gracias a las personas que me apoyaron, en serio muchas gracias, porque sus palabras fueron de gran ayuda =)!!!

Saludos a todos :D!!!

cya :3

Shinji

Resumen MCTS 70-536

Holas a todos en general

Mil disculpas si es que me demoré demasiado en volver a escribir alguna entrada, pero en verdad el trabajo y demás temas que me han surgido son la razón de esto. Pero no se preocupen, vuelvo recargado.

Tal como les prometí el otro día, iba a colocar un resumen del libro mcts self-placed training kit (Exam 70-536): Microsoft .NET framework 2.0 Application Development Foundation, así que lo prometido es deuda y acá tienen el link para descargarlo desde rapidshare.

http://rapidshare.com/files/138103343/Framework2.0.zip.html

Ojo, este resumen fue hecho muchas veces traduciendo las palabras de manera muy literal y en otros casos estuve combinando algo de inglés con español, así que no crean que es un resumen perfecto.

Muchas gracias a quienes a veces preguntan por el blog a ver cuándo vuelvo y qué tema colocaré.
Así que quería tener algo original con qué volver, y debido a mi experiencia de buscar muchas páginas con el título "best practices" y demás cosas, me dije, por qué no colocar un tema de "The Worst Practices", para que se puedan ver algunas cosas con las que uno se topa en el día a día del trabajo, incluso cosas que uno mismo ha cometido durante la carrera profesional, es algo normal que ocurra, y si les ha ocurrido bastante temprano, mejor pa que más adelante no les ocurra de nuevo.

Así que el próximo artículo que colocaré en el blog será ese, obviamente en español e inglés para de paso seguir practicando my english xD.

A ver, comentarios aparte sobre lo que estoy haciendo estos días, lo puedo resumir en 3 cosas importantes:
- Me encuentro estudiando para mi sgte examen de certificación en .NET, este será el MCTS en ASP.NET (70-528), para el cual también estoy haciendo resumenes propios, los cuales colgaré luego.
- Estuve trabajando en un cliente de Sonda del Perú (creo que no es recomendable nombrarlo) y estuve algo de semana y media ahí arreglando algunos errores de un sistema(el cual no participé en la etapa de desarrollo) que ibamos a subir al servidor de aplicaciones de ellos, así como también otro proyecto en el cual sí participé. Ambos proyectos cuentan con las sgtes tecnologías : Java, JPA (TopLink), Spring y Struts. Son algo pequeñas pues el tiempo de desarrollo asignado fue algo de entre mes y medio y 2 meses, es que eran para procesos de negocio pequeños de la empresa cliente.
- Me encuentro preparandome mentalmente para mi primera exposición (tipo conferencia) ante público de mi tesis (no es sustentación de tesis) en la feria Infosoft 2008, esta feria se realiza anualmente en la PUCP y si gustan mayor información pueden darle click al link. El tema a tratar, como ya les comenté será sobre la tesis que realizé con mi amigo Diego Castro (si tuviera un link de su blog o algo en el futuro lo colocaré, pero por el momento no hay) sobre la medición de habilidades de los alumnos de Ingeniería a través de su carrera universitaria. El día que voy a exponer será el Viernes 22 de Agosto a las 12:10pm (sep, medio día), en el auditorio de Ciencias e Ingeniería. Así que todos quedan cordialmente invitados a este evento que será un buen momento para practicar para la sustentacion de la tesis T____T

Gracias a los que siguen leyendo el blog, no se preocupen que colocaré cosas más interesantes que encuentre durante este tiempo de trabajo.

Felicitaciones algo atrasadas para Lennon que he notado que obtuvo no sé cuántas certificaciones (regala una xD).

Saludos a todos :3

cya :3

Shinji

P.d. Para aquellos que querían ciertas diapositivas sobre mi curso, no creo que sea conveniente colocarlo en este sitio, así que mejor lo colocaré en rapidshare y se los envío a su correo. Quien las desee, solo coloque su correo en los post. Muchas gracias :3

CERTIFICADO MCTS MICROSOFT NET FRAMEWORK - APPLICATION DEVELOPMENT FOUNDATION


Buenas a todos :D Y mil disculpas por haberlos dejado por un tiempo, pero esto se ve explicado con la imagen de arriba =)!!
Sí :D Lo que mencioné desde mi primer posteo, mi meta, llegar a certificarme en Microsoft, AL FIN LO HICE *O*
Luego de haber sacrificado más de un mes para poder meterme a estudiar de lleno preparándome para el primer examen de certificación, llegó el día, hoy 18 de abril, logré mi meta y pude sacar el certificacion de MCTS Microsoft .Net Framework - Application Development Foundation :)!!
Y lo hice con un tiempo menor a 30 minutos, logrando un puntaje, que la verdad no pensaba lograr desde un comienzo, 100%
Muy pronto publicaré algunos artículos que tengo pendientes subir a este blog, como tablas de columnas dinámicas en JSF usando Trinidad. Cómo llamar un método de tu backbean en JSF usando javascript (esto es un chiche, no es el mejor método :P) Y de paso les pasaré todos los resúmenes que hice para llegar a este resultado que en verdad me trae bastante satisfacción, luego de tanto esfuerzo, sacrifico...sueño...y hambre xD
Ahora que ya es 18, no te preocupes Ollanta, ya te prestaré mi libro pa que le saques copia :P
Nos vemos y no se preocupen, que actualizaré de forma más frecuente ahora que estoy "libre". Lo digo entre comillas, porque ahora me preparo para el MCTS de ASP .Net, y ahora pienso lograrlo con la misma nota, 100%. Les comentaré luego sobre eso :)
Cuidense y gracias por sus visitas que veo, que a pesar de no haber escrito, se incrementaron más de lo imaginado
Buen día :D


Shinji

Some Tips to .Net Developers (Algunos tips para los que desarrollamos en .Net)

Este artículo tratará sobre algunos tips o cosas que de repente necesitamos en ciertos momentos y son algo escondidas o difíciles de encontrar en la web.

La estructura será la siguiente

Pregunta-Respuesta

Espero les guste el estilo:

Pregunta

Cuando tengo un error en una página, el cual no pueda controlar, necesito que no aparezca esa pantalla amarilla que siempre aparece mostrándole al cliente un error que no entiende. ¿Cómo puedo hacer una página de error general para toda la aplicación?

Respuesta

Web.config, esa es la respuesta. Se necesita configurar este archivo con los siguientes tags:

Explicaré un poco esto:

defaultRedirect = Acá colocaremos la página hacia donde deseo que se redirija mi aplicación cuando ocurra un error en ésta. Tener mucho cuidado, pues si se coloca como default una página que intencionalmente tiene error, se puede quedar en un bucle infinito debido a que solicitaría a cada momento la página de error.

mode= El modo puede ser de 3 tipos:

- On à Habilita al tag CustomErrors para redirigirse a la página de error que uno indica en defaultRedirect.

- Off à Deshabilita los CustomErrors, de tal forma que si sucede un error, el cliente verá la clásica página amarilla.

- RemoteOnly à Este es el más interesante de todos. Permite mostrar al cliente los CustomErrors ante un error de la aplicación, sin embargo, los errores que ocurren son mostrados al localhost,

Pregunta

Muchas veces llego a escuchar en el trabajo “oe, lo he compilado como 40 veces durante el día y mi máquina ya está lenta, reinicio la PC, cierto?”

Respuesta

NO, para solucionar la limpieza de memoria luego de cierta cantidad de compilaciones que uno realiza a su aplicación, uno puede usar el web.config para esto, de la siguiente manera:


Creo que casi todos conocen lo que hacen las propiedades defaultLanguage y debug, así que no describiré estos, me iré directo al que nos interesa:

numRecompilesBeforeAppRestart = Lo que hace esta propiedad es setear la cantidad de veces que uno debe compilar previamente a que el Visual Studio limpie(libere) la memoria para que así la PC no la sientan tan lenta.

Pregunta

Muchos me han dicho que puedo controlar un evento de varios botones o componentes con un solo método, me averigüe que esto es cierto, pero no tengo idea de cómo saber qué botón fue el que levantó el evento.

Respuesta

Dentro de un evento, normalmente tenemos lo que son (object sender, EventArgs e), pues lo que buscamos está en el primer parámetro que no está por las puras ahí.

Ahora, supongamos que lo que tenemos son 3 botones, el procedimiento para saber cuál levantó el evento el siguiente:

//Obtenemos el elemento casteándolo

Button b = (Button)sender;

//Como sabemos, cada boton tiene un identificador único, entonces nos guiamos por eso

if (b.ID == “miBoton”) {…….}

Obviamente Uds se encargarán de llenar toda la lógica, eso no corresponde a este tutorial =P.

Pregunta

He visto muchas páginas web que pueden detectar tu sistema operativo, tu browser, su versión, si acepta cookies o no, entre otras cosas. Sé que se puede hacer por javascript, hay millones de códigos por toda la red, pero si deseo hacerlo por medio de C# o VB, es esto posible?

Respuesta

SI, para resolver este problema solo tenemos que usar la clase HttpBrowserCapabilities y obtener la propiedad Browser de Request. Es decir, algo así:

HttpBrowserCapabilities miBrowser = Request.Browser;

De esta forma podemos obtener

- Nombre del browser = miBrowser.Browser

- Version del browser = miBrowser.Version

- ¿Es una versión beta mi browser?= miBrowser.Beta

- Sistema operativo = miBrowser.Platform

- Soporte de cookies = miBrowser.Cookies

- Soporte de JavaScript = miBrowser.EcmaScriptVersion

Y pueden obtener muchísimos más datos, pero para este ejemplo, solo deseamos motrar esto.

Pregunta

Obtengo ciertos requisitos de mis clientes que me indican que el título de su página debe de variar según el usuario que ingresa, aparte de tener un diferente estilo de componentes según el usuario, existe alguna clase que me otorgue el .Net para esto?

Respuesta

Sí, para un caso como éste, tenemos una clase muy específica llamada Page, con esta clase podemos obtener varias cosas como el título, la hoja de estilos, el id anónimo del usuario, el queryString, etc. Todo lo que obtenemos podemos modificarlo de tal forma que sea dinámico y varíe según el usuario que ingrese a nuestra aplicación.

Page.Header.Title; //Obtenemos el título de la página y puede setearse

Page.Header.StyleSheet; // Obtenemos la hoja de estilos que va a tener

Page.Request.AnonymousID; // Obtenemos el id anónimo del usuario

Page.Request.QueryString; //Obtenemos el queryString

Resaltaré este último, pues con éste podemos obtener los parámetros que nos pasen por medio de la url, es decir, los parámetros que van luego del símbolo “?”. Como por ejemplo:

http://www.pucp.edu.pe/content/seccionweb_home.php?pIDSeccionWeb=23&pID=103

Eso es todo, espero les haya gustado estos pequeños tips que muchas veces los clientes pueden solicitar, o si deseamos un portal con un portlet con la información del browser del usuario o cosas por el estilo.

---------------ENGLISH----------------

In this article i’m going to show some tips o things that sometimes we need and they are hard to find in the Web.

The structure of the article will be like Question/Answer. I hope you like it:

Question

Sometimes my application have some errors, but i don’t want to show a “yellow page”, because that’s a bad practice. How can I redirect to a custom error page in my entire application?

Answer

Web.config is the answer. You need to configure this file with the next tags:


defaultRedirect = In this property we put the page where we want to redirect our application if we have an error. But, be careful, if you put a page with mistakes in this property, it will cause an infinite loop, because you have a mistake and it will redirect to your custom error page, again, and it will cause a redirect again, again, again….

mode= It have 3 configurations:

- On à Enable the CustomErrors tag to redirect to your Custom Error page.

- Off à It disable the CustomErrors tag, so the client will see the “yellow page” if there is an error.

- RemoteOnly à This is the most interesting configuration. With this configuration the client will see your custom error page, but, the error page will be showed at localhost.

Question

A lot of times i feel that my PC is really slow when I’ve compiled my application a lot of times, and I need to restart it to be ok. What should I do to don’t restart my PC?

Answer

You should clean your memory in automatic way. It can be done with a configuration in the web.config, you just should do:


I think that everybody knows the meaning of defaultLanguage and debug, so i will explain just numRecompilesBeforeAppRestart

numRecompilesBeforeAppRestart = With this property you will indicate to the application that it will clean the memory alter you have compiled “n” times your application. Of this way your PC won’t be slow.

Question

A lot of people tell me that I can control with just one method an event of a lot of components. I investigate it, and that’s true, but how can I know which component triggered the event.

Answer

When we declare a method of a event, it have two parameters (object sender, EventArgs e). Well, we have the answer in the first parameter. We know that our components have an unique Id, so, if we get the id of the component, we can know which component triggered the event. So, we need to do this:

//We get the element casting the sender

Button b = (Button)sender;

//Now, we get the id of the button to recognize which is the component

if (b.ID == “miBoton”) {…….}

Question

I’ve seen a lot of pages that detects your SO, the version of your browser, and other things. I know a way to do it with javascript, but, is there any way to do it with C# or VB?

Answer

Yes, we can do it with the class HttpBrowserCapabilities and we can get it from the property Browser of the class Request. Something like this:

HttpBrowserCapabilities miBrowser = Request.Browser;

Of this way we can get

- Browser’s name = miBrowser.Browser

- Browser’s version = miBrowser.Version

- ¿Is my browser a beta version?= miBrowser.Beta

- SO = miBrowser.Platform

- Support of cookies = miBrowser.Cookies

- Support of JavaScript = miBrowser.EcmaScriptVersion

Obviously you can get more information.

Question

Sometime my clients need to change the title of the page, because it depends of the user, and sometimes, even the style sheet depends of the user. Is there anyway to do this?

Answer

Yes, You can do it with the class Page, you can get and modify the style sheet, title, anonymous id of the user, etc.

Page.Header.Title; //Here we get the title

Page.Header.StyleSheet; // We get the style sheet

Page.Request.AnonymousID; // We get the anonymous Id

Page.Request.QueryString; //we get the queryString

The most important is the queryString, because whit it you can get the parameters of our url. The parameters are next to the symbol “?”. Like this:

http://www.pucp.edu.pe/content/seccionweb_home.php?pIDSeccionWeb=23&pID=103

I hope you enjoyed these little tips that sometimes we need in a little or big application.


Enjoy it =D
I'm waiting your comments =)
Estoy esperando sus comentarios =)


Shinji