October 2007 - Artículos
En una intranet desarrollada para una empresa donde trabajo se requeria que cuando el usuario cerrara su ventana actual de navegador, sin cerrar previamentre su sesion de usuario autenticado, el sistema deberia solicitarle los datos para la autenticacion, por razones de seguridad algunos gerentes cierran sus ventanas con sus credenciales pero algunas personas pueden sentarse en su maquina y seguir con las credenciales en el cache.
En este caso particular las sessiones las guardamos en un Servidor de Session.
La solucion mas rapida que encontre a este problema fue crear una clase que here de System.Web.UI.MasterPage con este codigo y luego que las demas MasterPages principales utilizadas en el sitio hereden (en este caso una sola)
Public Class YODAMasterBase
Inherits System.Web.UI.MasterPage
Protected Overrides Sub OnInit(ByVal e As System.EventArgs)
MyBase.OnInit(e)
If (Context.Session IsNot Nothing) Then
If (Session.IsNewSession) Then
Dim cadenaCookieHeader As String = Request.Headers("Cookie")
If (cadenaCookieHeader IsNot Nothing) Or (cadenaCookieHeader.IndexOf("ASP.NET_SessionId") >= 0) Then
FormsAuthentication.SignOut()
Response.Redirect("~/login.aspx?accion=demo")
End If
End If
End If
End Sub
End Class
Luego hay que heredar de estar MasterPage llamada YodaMasterPage las que necesitemos esta funcionalidad.
Partial Class EJEMPLODeMasterPage
Inherits YodaMasterPage
Tambien podriamos preguntar si es .IsNewSession y el usuario esta autenticado .IsAuthenticated, que luego lo testeare y probare.
Enlaces
Un caso que nos puede tocar es enviar por querystring mas de una variable, eso es simple:
http://www.empresa/pagina.asp?var1=valor1&var2=valor2
Pero cuando esto lo queremos insertar en nuestro web.sitemap y armamos el siteMapNode vemos que no es trivial... (a primera vista)
El error:
No se pudo cargar el archivo de configuracion de mapa del sitio XML web.sitemap; Error al analizar EntityName.
Solucion
Tenemos que utilizar las EntityName para el querido simbolo &, porque espera luego de este simbolo buscar una nombre de entidad y no lo encuentra, asi que debemos dar el nombre de la entidad & (que recursividad no? ;)....
& = &
& = &
Podemos utilizar cualquier de las formas para esta entidad:
<siteMapNode title="JEDIS" url="~/jedis/listado.aspx?var1=valor1&var2=var2" description="" />
<siteMapNode title="JEDIS" url="~/jedis/listado.aspx?var1=valor1&var2=var2" description="" />
Acentos con EntityName
Si queremos por ejemplo agregar acentos por ejemplo Ú que el código es: Ú deberias escribir
Ejemplo:
Si queremos escribir "Último JEDI"
<siteMapNode title="&Uacute;ltimo JEDIS" url="~/jedis/listado.aspx" description="Ejemplo" />
Entonces en el html resultante:
<a href="/jedis/listado.aspx" title="Ejemplo">Último JEDIS</a>
Estaba leyendo el articulo de elBruno de como averiguar el número de serie de VS2005, y me acorde de como consultar el valor del registro desde la linea de comandos y tambien desde el propio VS2005 en la ventana de comandos
[VS2005] Como averiguar el nro de serie de Visual Studio ??
Por eso desde aqui te propongo:
- Como consulta valores del registro desde la linea de comandos (cmd.exe)
- Como realizar la misma consulta desde la ventana de comandos del VS2005
- Algunos ejemplos de uso de la comandos
1 - Consulta al registro
Primeramente el comando de consulta de un valor del registro
Si pedimos la ayuda del comando reg /?
Aqui pedimos nuevamente la ayuda
reg query /?
Ya tenemos la informacion que necesitamos /v ValueName para consultar un valor especifico
Entonces la consulta completa seria
reg query HKLM\SOFTWARE\Microsoft\VisualStudio\8.0\Registration /v PIDKEY
Como no quiero estar mostrando ni el numero de serie ni el ProductId, los ejemplos que mostrare se basan en el ProductId (el mismo que aparece en el Acerca de... del VS2005) solo faltaria replicarlo para obtener el numero de serie.
Entonces nuestro ejemplo queda
reg query HKLM\SOFTWARE\Microsoft\VisualStudio\8.0\Registration /v ProductId
Salida:
! REG.EXE VERSION 3.0
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\8.0\Registration
ProductId REG_SZ xxxxx-xxx-xxxxxxx-xxxxx
2 - Consultar al registro desde la Ventana de comandos del Visual Studio 2005
Y para ejecutar esta sencilla linea dentro de nuestro IDE, lo hacemos en la ventana de comandos, y para ejecutar C:\WINDOWS\SYSTEM32\REG.EXE hacemos uso de Tools.Shell
Probemos antes visualizar la ayuda, aqui esta
Sintaxis:
Tools.Shell [/command] [/output] [/dir:folder] path [args]
Con los parametros de Tool.Shell [/c|/command]: la salida coloca en la ventana de comandos y con [/o|/output] : en la ventana de output
Ademas tenemos que colocar "/?" entre comillas para que no detecte que sea el pedido de ayuda de la misma ventana de comandos, sino como argumento del comando.
y tambien en la ventana de Output
Alias
La linea de comandos soporta alias. Para Tools.Shell es shell, entonces podriamos haber escrito
>shell /c /o "REG.EXE" "/?"
Para consultar el valor del registro del ProductId del Visual Studio dentro del propio Visual Studio tipeamos tal cual como lo hariamos en la linea de comandos pero sin colocar los argumentos entre comillas sino simplemente el comando completo, queda asi:
>Tools.Shell /c /o REG.EXE QUERY HKLM\SOFTWARE\Microsoft\VisualStudio\8.0\Registration /v ProductId
Acuerdate que si necesitas el numero de serie del VS2005 la key es PIDKEY (mira de nuevo el articulo de elBruno)
>Tools.Shell /c /o REG.EXE QUERY HKLM\SOFTWARE\Microsoft\VisualStudio\8.0\Registration /v PIDKEY
Seguimos con el ejemplo. Para poder observar la misma salida que la linea de comandos.
Tambien podriamos colocar el path completo del nuestor programa a ejecutar
>Tools.Shell /c /o C:\WINDOWS\SYSTEM32\REG.EXE QUERY HKLM\SOFTWARE\Microsoft\VisualStudio\8.0\Registration /v ProductId
Para crear un alias
>alias VS2005NumSerie >Tools.Shell /c /o C:\WINDOWS\SYSTEM32\REG.EXE QUERY HKLM\SOFTWARE\Microsoft\VisualStudio\8.0\Registration /v ProductId
3 - Otros ejemplos de comandos
Tambien para que nos puede servir para un ping
Ademas de lanzar comandos hacia el propio IDE con sus respectivos alias que nos pueden ayudar en nuestras tareas cotidianas.
- Cerrar archivo actual: Close
(alias close File.Close)
Cerrar todos los archivos abiertos: CloseAll
(alias CloseAll Window.CloseAllDocuments)
- Idem con:
- Save
(alias save File.SaveSelectedItems)
- SaveAll
(alias SaveAll File.SaveAll)
- SaveAs
(alias SaveAs File.SaveSelectedItemsAs)
- El viejo y querido cls
(alias cls Edit.ClearAll)
Puedes visualizar todos los alias tipeando >alias en la ventana de comando, o crear el propio.
Aqui mas Comandos de Visual Studio con argumentos y Alias de comando predefinidos de Visual Studio
Espero que les sirva de ayuda o guia...
Enlaces
Con un compañero de trabajo estamos instalado en nuestras queridas y costosas (por lo menos para nosotros) notebooks personales la beta 2 de VS2008 (y hace unos meses descargamos la imagen virtual pero como que se nos daño unos de tantos archivos desistimos de seguir, ya volvemos a la carga.
Y me gusto ver Silverlight en accion con estos videos aqui:
Visual Studio 2008 Training Videos
- Get up to speed on Visual Studio 2008
- Client Development
- Web Develpment
- Data Access
- Office Development
- Mobile Development
- Team Development
http://msdn2.microsoft.com/en-us/vstudio/bb655906.aspx

Gracias a esta empresa comScore tenemos el pulso en lo que a busqueda se refiere (basados en su metodología , version en PDF) donde explica tecnicamente como obtiene los resultados por cookies y cual es el problema de la eliminacion de estos archivos que implica el mismo usuario se cuenta mas de una vez y esto no es correcto, interesante para leerlo un dia de lluvia :)
Bueno veamos un poco los datos... nuevos Mr. G lidera ampliamente el espectro con 37 mil millones de busquedas (en Agosto de 2007) con 31MM para busquedas de Google y 5MM para YouTube
Top 10 Search Properties Worldwide* August 2007
Total World Age 15+, Home and Work Locations**
Source: comScore qSearch 2.0
* Search properties based on top 50 properties worldwide where search activity is observed.
** Excludes traffic from public computers such as Internet cafes or access from mobile phones or PDAs.
Estos dos buscadores siguiendo los pasos de los legendarios... acercandose en una 3° y 5° posición.
http://www.baidu.com/ (China) sencillo

http://www.naver.com/ (Coreano)mmm un poco complicado ....
Y por casa como estamos?
Tengo poco conocimiento de esta empresa... pero parece que estos tipos de análisis dan pie para luego realizar consultorias asi que bueno, tomemos como es: "Un articulo disponible" que nos da pautas que en las busquedas hay un negocio redondo... vamos el AdSense.. je!
Enlaces:
comScore: 61 Billion Searches Conducted Worldwide in August
http://www.comscore.com/press/release.asp?press=1802
- Metodologia: http://www.comscore.com/method/method.asp
- PDF: The impact of cookie deletion on the accuracy of site-server and ad-server metrics:an empirical comscore study
Dr. Magid Abraham, Cameron Meierhoefer, Andrew Lipsman, ComScore, inc.
http://www.comscore.com/request/cookie_deletion_white_paper.pdf
Ya sabemos utilizar facilmente el RadioButtonList pero como llamar a una funcion del lado del cliente (javascript) desde un LisItem, veamos un ejemplo
Tenemos un sencillo webcontrol RadioButtonList
<asp:RadioButtonList ID="RadioButtonList1" runat="server" >
<asp:ListItem Value="yoda">Yoda</asp:ListItem>
<asp:ListItem Value="luke">Luke Skywalker</asp:ListItem>
<asp:ListItem Value="r2d2">R2-D2</asp:ListItem>
<asp:ListItem Value="c3po">C-3PO</asp:ListItem>
</asp:RadioButtonList>
y un metodo a llamar en javascript
<script language="javascript" type="text/javascript"> function mensaje(ctlOpcion){ alert("Opcion seleccionada: " + ctlOpcion.value); }
</script>
Pero como agregamos llamada a un metodo del cliente? No tenemos a nuesta disposicion nada referente a lado del cliente
Entonces no nos queda mas remedio que ir al codigo...y agregarlo mediante el metodo Atributtes.Add (ya que es una coleccion)
Dim itemRadioBtn As ListItem
For Each itemRadioBtn In RadioButtonList1.Items
itemRadioBtn.Attributes.Add("onClick", "mensaje(this);")
Next
Vamos recorriendo los items de nuestro RadioButtonList y en el evento onClick (podria ser otro que necesitemos) vamos declarando la llamada a la funcion javascript.
Para verlo funcionar (aunque sea en imagen)
Tambien podriamos recorrer mediante javascript, una opcion seria sin conocer la cantidad de items
Veamos un script
<script language="javascript" type="text/javascript"> 1:
2: function mensajeSeleccionado(ctrlOpcionesId){ 3: alert("Opcion seleccionada:" + OpcionObtenerSeleccionada(ctrlOpcionesId)) 4: }
5:
6: function OpcionObtenerSeleccionada(ctrlOpcionesId)
7: { 8: //Recorremos los items
9: var posicion = 0;
10: var item = document.getElementById(ctrlOpcionesId+"_"+posicion);
11: alert(ctrlOpcionesId+"_"+posicion);
12: while(item != null){ 13: if(item.checked) { 14: return item.value;
15: } else{ 16: posicion += 1;
17: item = document.getElementById(ctrlOpcionesId+"_"+(posicion));
18: }
19: }
20: }
</script>
Y lo llamamos con un enlace
<a href="BLOCKED SCRIPTmensajeSeleccionado('<%=RadioButtonList1.ClientId %>');">Ver Seleccion</a>
y enviamos el Id del lado del Cliente de nuestro webcontrol.
<a href="BLOCKED SCRIPTmensajeSeleccionado('<%=RadioButtonList1.ClientId %>', <%=RadioButtonList1.Items.Count %>);">Ver Seleccion</a>
(cabe aclarar que es mejro escribir esto desde el codigo y no inline como estamos utilizando <% %>)
Bueno y la firma de la funcion javascript seria
function mensajeSeleccionado(ctrlOpcionesId, cantidadItems){
alert("Opcion seleccionada:" + OpcionObtenerSeleccionada(ctrlOpcionesId, cantidadItems))
}
y recorrer mediante un bucle for... que te lo dejo para tarea del hogar ;)
Enlaces
- RadioButtonList (Clase)
Representa un control de lista que encapsula un grupo de controles de botón de opción.
- ListItem.Attributes (Propiedad)
Obtiene una colección de pares de nombre y valor de atributo para la clase ListItem que ésta no admite directamente.
- AttributeCollection (Clase)
Proporciona acceso de modelo de objetos a todos los atributos declarados en la etiqueta de apertura de un elemento de control de servidor ASP.NET. No se puede heredar esta clase.