Hoy vamos a dar una introducción de la herramienta para la generación de reportes SQL Server Reporting Services, después pondré un ejemplo de lo que estamos platicando aquí……..
Esta herramienta es una solución basada en servidor que permite la creación, manejo y entrega de reportes en papel y de reportes basados en Web .
Es uno de los componentes del Framework Microsoft Business Intelligence, combina la capacidad de SQL Server para manejo de datos y Microsoft Windows Server con una poderosa y familiar aplicación Microsoft Office System para entregar información en tiempo real.
SQL Server Reporting Services soporta un amplio rango de orígenes de datos, tales como OleDB y ODBC, así como múltiples formatos de salida, como navegadores Web y aplicaciones Microsoft Office System. Usando Microsoft .NET Framework los desarrolladores pueden utilizar capacidades sobre sus sistemas existentes y conectarse a un origen de datos customizados.
SQL Server Reporting Services soporta todo el ciclo de vida de un reporte, incluye:
Report Authoring: Se pueden crear reportes para publicar en el Report Server usando Microsoft u otra herramienta de diseño que use Report Definiction Language y el estándar XML para la definición de reportes.
Report Management: Las definiciones del reporte, carpetas y recursos son publicados y manejados como un servicio Web. El manejo de reportes puede ser ejecutado tanto por demanda como por una planificación especifica.
Report Delivery: Reporting Services soporta el despliegue de reportes por demanda o basado en eventos. Los usuarios pueden ver el reporte en un formato Web o de e-mail.
Report Security: Reporting Services implementa un flexible modelo de seguridad basado en roles, para proteger los reportes y sus recursos. El producto incluye interfaces extensibles para integrarse con otros modelos de seguridad.
Ailas......
DateTime Null
Bueno.... para empezar, esto me surigio como una duda ¿se puede asignar un valor nulo a un DateTime?
La respuesta = No........
¿Por que?.... el tipo DateTime es un "tipo de valor" y segun la definicion de la MSDN (Variables que están basadas directamente en tipos de valor que contienen valores.), nos menciona claramente: "A diferencia de los tipos de referencia, los tipos de valor no pueden contener el valor null".....
Sin embargo, la característica tipos que aceptan valores NULL permite asignar null a tipos de valores.
Ok.. mejor codigo que definiciones...
Vamos a ver como podemos solucionar esto...
Simplemente utilizando el Boxin/Unboxing. DateTime es un tipo de valor "boxing" dentro de un objeto, que es perfectamente válido de acuerdo con el lenguaje de especificación de .NET.
Ailas.....................
La respuesta = No........
¿Por que?.... el tipo DateTime es un "tipo de valor" y segun la definicion de la MSDN (Variables que están basadas directamente en tipos de valor que contienen valores.), nos menciona claramente: "A diferencia de los tipos de referencia, los tipos de valor no pueden contener el valor null".....
Sin embargo, la característica tipos que aceptan valores NULL permite asignar null a tipos de valores.
Ok.. mejor codigo que definiciones...
DateTime z_varodatDateTime = new DateTime();
z_varodatDateTime = null;
El codigo anterior nos marcaria un error "Cannot convert null to 'System.DateTime' because it is a value type"
Vamos a ver como podemos solucionar esto...
object z_varocioDateTime = new DateTime();
z_varocioDateTime = null;
if (z_varocioDateTime != null)
{
DateTime z_varodatDateTime = (DateTime)z_varocioDateTime;
}
Simplemente utilizando el Boxin/Unboxing. DateTime es un tipo de valor "boxing" dentro de un objeto, que es perfectamente válido de acuerdo con el lenguaje de especificación de .NET.
Ailas.....................
Etiquetas:
C#,
Programacion
Microsoft MAP
Hoy vamos a platicar acerca de esta Herramienta que nos permitirá evaluar y planificar la infraestructura IT (Microsoft Assessment and Planning Toolkit)…
Anteriormente había utilizado erramientas como VMware Consolidation Guide, pero me encontre con esto y quería compartirlo con ustedes.
Pero ¿para qué?, pues bien esta herramienta de libre distribución nos ayudara cuando estamos pensando en implementar la virtualización en nuestros sistemas... y no solo eso.....
MAP incluye funcionalidades para la monitorización de los sistemas que se están considerando para un posible proyecto de consolidación bajo Hyper-V así como para Microsoft Virtual Server 2005 R2.
Al finalizar el análisis nos dará un reporte con los resultados y recomendaciones sobre los equipos que pueden ser consolidados, así como los sistemas MS Office y la recomendación de migrar a MS Office 2007, la seguridad en cuestión de que los equipos cuenten con su antispyware, antivirus o cortafuegos, si se utiliza MS SQL Server también realiza un análisis...
Ailas.................
Anteriormente había utilizado erramientas como VMware Consolidation Guide, pero me encontre con esto y quería compartirlo con ustedes.
Pero ¿para qué?, pues bien esta herramienta de libre distribución nos ayudara cuando estamos pensando en implementar la virtualización en nuestros sistemas... y no solo eso.....
MAP incluye funcionalidades para la monitorización de los sistemas que se están considerando para un posible proyecto de consolidación bajo Hyper-V así como para Microsoft Virtual Server 2005 R2.
Al finalizar el análisis nos dará un reporte con los resultados y recomendaciones sobre los equipos que pueden ser consolidados, así como los sistemas MS Office y la recomendación de migrar a MS Office 2007, la seguridad en cuestión de que los equipos cuenten con su antispyware, antivirus o cortafuegos, si se utiliza MS SQL Server también realiza un análisis...
Ailas.................
Etiquetas:
Microsoft,
virtualizacion
Utilizar Web Services de .NET con ASP
Vamos a ver un ejemplo de como consumir un Web Service de .NET, pero utilizando ASP normal:
Para esto vamos a referenciar el WSDL (Web Services Description Language) del Web Services que vamos a consumir.
El codigo en ASP
Para poder instanciar el objeto MSSOAP.SoapClient30 deberas de descargarte el SOAP Toolkit de Microsoft 3.0, lo puedes descargar de aqui
Ailas............
Para esto vamos a referenciar el WSDL (Web Services Description Language) del Web Services que vamos a consumir.
El codigo en ASP
<%@ Language=VBScript %>
<%
Function EjecutarWS()
Dim oSOAPClient, Resultado, ServicioWeb
ServicioWeb = "http://localhost/webservice.asmx?WSDL"
Set oSOAPClient = Server.CreateObject("MSSOAP.SoapClient30")
oSOAPClient.ClientProperty("ServerHTTPRequest") = False
oSOAPClient.mssoapinit ServicioWeb
On Error Resume Next
Resultado = oSOAPClient.consumirWebService("los parametos del web service")
If Err.number<>0 Then
EjecutarWS = "ERROR"
Else
EjecutarWS = Resultado
End If
Set oSOAPClient = Nothing
End Function
%>
<html>
<head>
<meta name="GENERATOR" Content="Microsoft Visual Studio .NET 7.1">
</head>
<body>
<% response.write EjecutarWS() %>
</body>
</html>
Para poder instanciar el objeto MSSOAP.SoapClient30 deberas de descargarte el SOAP Toolkit de Microsoft 3.0, lo puedes descargar de aqui
Ailas............
Etiquetas:
Interoperabilidad,
Programacion,
Visual Studio 2008,
Web Services
Clinicas de Virtualizacion (e-learning)
Por todo Diciembre 2008 Microsoft ofrece sin costo 4 clinicas (en ingles) con todo lo que hay que estudiar de Virtualizacion.
https://www.microsoftelearning.com/eLearning/offerDetail.aspx?offerPriceId=228501
Una vez registrado tienes una subscripción a las 4 clinicas por una año.
E-Learning Clinic 5935: Introducing Hyper-V in Windows Server 2008
Clinic 6334: Exploring Microsoft System Center Virtual Machine Manager 2008
Clinic 6335: Exploring Microsoft Application Virtualization
Clinic 6336: Exploring Terminal Services in Windows Server 2008
A estudiar se ha dicho.......
Ailas...........
https://www.microsoftelearning.com/eLearning/offerDetail.aspx?offerPriceId=228501
Una vez registrado tienes una subscripción a las 4 clinicas por una año.
E-Learning Clinic 5935: Introducing Hyper-V in Windows Server 2008
Clinic 6334: Exploring Microsoft System Center Virtual Machine Manager 2008
Clinic 6335: Exploring Microsoft Application Virtualization
Clinic 6336: Exploring Terminal Services in Windows Server 2008
A estudiar se ha dicho.......
Ailas...........
Etiquetas:
e-learning,
Hyper-V,
virtualizacion,
Windows Server 2008
Por un México mejor
TU PUEDES HACER LA DIFERENCIA Utiliza tu conocimiento para ayudar a un niño en situación de alto riesgo. Presenta un examen de Windows Vista sin costo en MVA y conviertete en padrino de un niño en situacion de calle o de alto riesgo, al presentar tu examen, Microsoft TechNet llevará en tu nombre a 100 niños de una casa hogar, a que pasen un día inolvidable en el Museo del Papalote.
| |||||||||||||||||
Etiquetas:
Microsoft
Diez Mitos LINQ
Mito #1
Todas las consultas LINQ deben comenzar con la palabra reservada 'var'. De hecho, el propósito de la palabra reservada 'var' es iniciar una consulta LINQ.
R = La palabra reservada var y las consultas LINQ, son conceptos diferentes. El propósito del var es dejar que el compilador adivine de qué tipo desea declarar la variable local (tipos implícitos). Por ejemplo, lo siguiente:
porque el compilador infiere que s es un string.
Así mismo, la siguiente consulta:
es exactamente equivalente a:
Aquí puede ver, que todo lo que estamos logrando con var es abreviar IEnumerable. A algunas personas les gusta esto porque quita desorden; otros argumentan que los tipos implícitos pueden dar una menor idea de qué es lo que está pasando
Ahora, hay ocasiones en que una consulta LINQ exige el uso de la palabra reservada var. Esto es cuando se proyecta un tipo anónimo:
Aquí está un ejemplo del uso de un tipo anónimo fuera del contexto de una consulta LINQ:
Mito #2
Todas las consultas LINQ deben utilizar la sintaxis de consulta.
R = Existen dos tipos de sintaxis para las consultas: sintaxis lambda y sintaxis de consulta (o sintaxis de consulta de comprensión). Aquí está un ejemplo de sintaxis lambda :
Aquí está lo mismo expresado en sintaxis de consulta:
Lógicamente, el compilador convierte la sintaxis de consulta a una sintaxis de tipo lambda. Esto significa que todo lo que puede expresarse en sintaxis de consulta, también puede expresarse en sintaxis lambda. La sintaxis de consulta puede ser mucho más sencilla, mucho más con consultas que involucran a más de una variable de rango. (En este ejemplo, usamos una única variable de rango p, así que las dos sintaxis fueron igual de sencillas)
No todos los operadores admiten sintaxis de consulta, por lo que los dos estilos de sintaxis son complementarios. Tomando lo mejor de ambos, usted puede mezclar los estilos de consulta en un único comando (vea el ejemplo del Mito #5)
Mito #3
Para recuperar todos los clientes de la tabla de clientes, debe realizar una consulta similar a la siguiente:
La expresión:
es una consulta frívola. Usted puede simplemente usar:
Asimismo, la siguiente consulta LINQ to XML:
puede ser simplificada a:
Y esto:
puede ser simplificado a:
Mito #4
Para reproducir una consulta SQL en LINQ, debe realizar la consulta LINQ tan similar como sea posible a la consulta SQL.
R = LINQ y SQL son lenguajes diferentes, que emplean conceptos muy diferentes.
Posiblemente la mayor barrera para hacerse productivo con LINQ es el síndrome de "pensando en SQL": mentalmente formular sus consultas en SQL y, a continuación, transliterarlas dentro de LINQ. El resultado es que usted está constantemente luchando contra la API.
Una vez que comience a pensar directamente en LINQ, a menudo sus consultas tendrán poca semejanza con sus contrapartes en SQL. En muchos casos, también podrá ser radicalmente más sencillo.
Mito #5
Para realizar los joins eficientemente en LINQ, usted debe utilizar la palabra reservada join.
R = Esto es cierto, pero sólo al consultar colecciones locales. Al consultar una base de datos, la palabra reservada join es totalmente innecesaria: todos las uniones pueden ser realizadas utilizando múltiples cláusulas from y subconsultas. El uso de múltiples cláusulas from y subconsultas es más versátil también y nos permiten realizar non-equi-joins.
Mejor aún, en LINQ to SQL, se pueden consultar propiedades de asociación, sin la necesidad de utilizar los join. Por ejemplo, le explicamos cómo recuperar los nombres y el ID de todos los clientes que no han hecho compras:
O, para recuperar los clientes que no han hecho compras por encima de $ 1000:
Observe que estamos mezclando la sintaxis de consulta y la sintaxis lambda. Consulte LINQPad para más ejemplos de propiedades de asociación, joins manuales y consultas con sintaxis mezclada.
Mito #6
Porque SQL emite conjuntos de resultados planos, las consultas LINQ deben estructurarse para emitir conjuntos de resultados planos, también.
R = Esto es una consecuencia del Mito # 4. Uno de los grandes beneficios de LINQ es que puede:
1. Consultar un gráfico de un objeto estructurado, a través de las propiedades de asociación (en lugar de tener que utilizar joins) 2. Proyectar directamente dentro de las jerarquías de objetos.
Los dos beneficios son independientes, aunque 1 ayuda a 2. Por ejemplo, si desea recuperar los nombres de clientes en el estado de WA, junto con todas sus compras, puede simplemente hacer lo siguiente:
El resultado jerárquico de esta consulta es mucho más fácil trabajar, que con un conjunto resultado plano.
Podemos lograr el mismo resultado sin las propiedades de asociación de la siguiente manera:
Mito #7
Para hacer joins externos en LINQ to SQL, debe utilizar siempre DefaultIfEmpty().
R = Esto es cierto sólo si desea un conjunto resultado plano . Los ejemplos en el mito anterior, por ejemplo, se convierten en un left outer join en SQL y no requieren del operador DefaultIfEmpty.
Mito #8
Una consulta LINQ to SQL va a ser ejecutada en una sola ida al servidor, solo si la consulta fue construida en un solo paso.
R = LINQ sigue un modelo de evaluación tardía, lo que significa que las consultas se ejecutan no cuando se construyeron, sino cuando se enumeraron. Esto significa que puede crear una consulta en tantos pasos como desee, y en el proceso no consulta al servidor hasta que finalmente inicie el consumo de los resultados.
Por ejemplo, la siguiente consulta recupera los nombres de todos los clientes cuyo nombre empieza con la letra 'A', y que han hecho al menos dos compras. Creamos esta consulta en tres pasos:
Mito #9
Un método no puede devolver una consulta, si la consulta termina con el operador 'new'
R = El truco está en proyectar en un tipo no anónimo ordinario con un inicializador de objeto:
NameDetails es una clase que se podría definir como sigue:
Mito #10
La mejor manera de utilizar LINQ to SQL es instancear un único DataContext a una propiedad estática y utilizar esa instancia compartida para la vida de la aplicación.
R = Esta estrategia tendrá como resultado datos obsoletos, porque los objetos registrados por una instancia DataContext no se actualizan simplemente por reconsulta.
Utilizar una única instancia estática del DataContext en la capa intermedia de una aplicación distribuida provocará más problemas, porque las instancias del DataContext no son multi hilos.
El enfoque correcto es crear nuevas instancias del DataContext como sea necesario, manteniendo esas instancias con vida solo el tiempo que sea necesario.
Ailas..............
Todas las consultas LINQ deben comenzar con la palabra reservada 'var'. De hecho, el propósito de la palabra reservada 'var' es iniciar una consulta LINQ.
R = La palabra reservada var y las consultas LINQ, son conceptos diferentes. El propósito del var es dejar que el compilador adivine de qué tipo desea declarar la variable local (tipos implícitos). Por ejemplo, lo siguiente:
var s = "Hello";
es exactamente equivalente a:
string s = "Hello";
porque el compilador infiere que s es un string.
Así mismo, la siguiente consulta:
string[] people = new [] { "Tom", "Dick", "Harry" };
var filteredPeople = people.Where (p => p.Length > 3);
es exactamente equivalente a:
string[] people = new [] { "Tom", "Dick", "Harry" };
IEnumerable filteredPeople = people.Where (p => p.Length > 3);
Aquí puede ver, que todo lo que estamos logrando con var es abreviar IEnumerable
Ahora, hay ocasiones en que una consulta LINQ exige el uso de la palabra reservada var. Esto es cuando se proyecta un tipo anónimo:
string[] people = new [] { "Tom", "Dick", "Harry" };
var filteredPeople = people.Select (p => new { Name = p, p.Length });
Aquí está un ejemplo del uso de un tipo anónimo fuera del contexto de una consulta LINQ:
var person = new { Name="Foo", Length=3 };
Mito #2
Todas las consultas LINQ deben utilizar la sintaxis de consulta.
R = Existen dos tipos de sintaxis para las consultas: sintaxis lambda y sintaxis de consulta (o sintaxis de consulta de comprensión). Aquí está un ejemplo de sintaxis lambda :
string[] people = new [] { "Tom", "Dick", "Harry" };
var filteredPeople = people.Where (p => p.Length > 3);
Aquí está lo mismo expresado en sintaxis de consulta:
string[] people = new [] { "Tom", "Dick", "Harry" };
var filteredPeople = from p in people where p.Length > 3 select p;
Lógicamente, el compilador convierte la sintaxis de consulta a una sintaxis de tipo lambda. Esto significa que todo lo que puede expresarse en sintaxis de consulta, también puede expresarse en sintaxis lambda. La sintaxis de consulta puede ser mucho más sencilla, mucho más con consultas que involucran a más de una variable de rango. (En este ejemplo, usamos una única variable de rango p, así que las dos sintaxis fueron igual de sencillas)
No todos los operadores admiten sintaxis de consulta, por lo que los dos estilos de sintaxis son complementarios. Tomando lo mejor de ambos, usted puede mezclar los estilos de consulta en un único comando (vea el ejemplo del Mito #5)
Mito #3
Para recuperar todos los clientes de la tabla de clientes, debe realizar una consulta similar a la siguiente:
var query = from c in db.Customers select c;
La expresión:
from c in db.Customers select c
es una consulta frívola. Usted puede simplemente usar:
db.Customers
Asimismo, la siguiente consulta LINQ to XML:
var xe = from e in myXDocument.Descendants ("phone") select e;
puede ser simplificada a:
var xe = myXDocument.Descendants ("phone");
Y esto:
Customer customer = (from c in db.Customers where c.ID == 123 select c)
.Single();
puede ser simplificado a:
Customer customer = db.Customers.Single (c => c.ID == 123);
Mito #4
Para reproducir una consulta SQL en LINQ, debe realizar la consulta LINQ tan similar como sea posible a la consulta SQL.
R = LINQ y SQL son lenguajes diferentes, que emplean conceptos muy diferentes.
Posiblemente la mayor barrera para hacerse productivo con LINQ es el síndrome de "pensando en SQL": mentalmente formular sus consultas en SQL y, a continuación, transliterarlas dentro de LINQ. El resultado es que usted está constantemente luchando contra la API.
Una vez que comience a pensar directamente en LINQ, a menudo sus consultas tendrán poca semejanza con sus contrapartes en SQL. En muchos casos, también podrá ser radicalmente más sencillo.
Mito #5
Para realizar los joins eficientemente en LINQ, usted debe utilizar la palabra reservada join.
R = Esto es cierto, pero sólo al consultar colecciones locales. Al consultar una base de datos, la palabra reservada join es totalmente innecesaria: todos las uniones pueden ser realizadas utilizando múltiples cláusulas from y subconsultas. El uso de múltiples cláusulas from y subconsultas es más versátil también y nos permiten realizar non-equi-joins.
Mejor aún, en LINQ to SQL, se pueden consultar propiedades de asociación, sin la necesidad de utilizar los join. Por ejemplo, le explicamos cómo recuperar los nombres y el ID de todos los clientes que no han hecho compras:
from c in db.Customers
where !c.Purchases.Any()
select new { c.ID, c.Name }
O, para recuperar los clientes que no han hecho compras por encima de $ 1000:
from c in db.Customers
where !c.Purchases.Any (p => p.Price > 1000)
select new { c.ID, c.Name }
Observe que estamos mezclando la sintaxis de consulta y la sintaxis lambda. Consulte LINQPad para más ejemplos de propiedades de asociación, joins manuales y consultas con sintaxis mezclada.
Mito #6
Porque SQL emite conjuntos de resultados planos, las consultas LINQ deben estructurarse para emitir conjuntos de resultados planos, también.
R = Esto es una consecuencia del Mito # 4. Uno de los grandes beneficios de LINQ es que puede:
1. Consultar un gráfico de un objeto estructurado, a través de las propiedades de asociación (en lugar de tener que utilizar joins) 2. Proyectar directamente dentro de las jerarquías de objetos.
Los dos beneficios son independientes, aunque 1 ayuda a 2. Por ejemplo, si desea recuperar los nombres de clientes en el estado de WA, junto con todas sus compras, puede simplemente hacer lo siguiente:
from c in db.Customers
where c.State == "WA"
select new
{
c.Name,
c.Purchases // An EntitySet (collection)
}
El resultado jerárquico de esta consulta es mucho más fácil trabajar, que con un conjunto resultado plano.
Podemos lograr el mismo resultado sin las propiedades de asociación de la siguiente manera:
from c in db.Customers
where c.State == "WA"
select new
{
c.Name,
Purchases = db.Purchases.Where (p => p.CustomerID == c.ID)
}
Mito #7
Para hacer joins externos en LINQ to SQL, debe utilizar siempre DefaultIfEmpty().
R = Esto es cierto sólo si desea un conjunto resultado plano . Los ejemplos en el mito anterior, por ejemplo, se convierten en un left outer join en SQL y no requieren del operador DefaultIfEmpty.
Mito #8
Una consulta LINQ to SQL va a ser ejecutada en una sola ida al servidor, solo si la consulta fue construida en un solo paso.
R = LINQ sigue un modelo de evaluación tardía, lo que significa que las consultas se ejecutan no cuando se construyeron, sino cuando se enumeraron. Esto significa que puede crear una consulta en tantos pasos como desee, y en el proceso no consulta al servidor hasta que finalmente inicie el consumo de los resultados.
Por ejemplo, la siguiente consulta recupera los nombres de todos los clientes cuyo nombre empieza con la letra 'A', y que han hecho al menos dos compras. Creamos esta consulta en tres pasos:
var query = db.Customers.Where (c => c.Name.StartsWith ("A"));
var query = query.Where (c => c.Purchases.Count() >= 2);
var result = query.Select (c => c.Name);
foreach (string name in result) // Solo en este momento la consulta es ejecutada!
Console.WriteLine (name);
Mito #9
Un método no puede devolver una consulta, si la consulta termina con el operador 'new'
R = El truco está en proyectar en un tipo no anónimo ordinario con un inicializador de objeto:
public IQueryable GetCustomerNamesInState (string state)
{
return
from c in Customer
where c.State == state
select new NameDetails
{
FirstName = c.FirstName,
LastName = c.LastName
};
}
NameDetails es una clase que se podría definir como sigue:
public class NameDetails
{
public string FirstName, LastName;
}
Mito #10
La mejor manera de utilizar LINQ to SQL es instancear un único DataContext a una propiedad estática y utilizar esa instancia compartida para la vida de la aplicación.
R = Esta estrategia tendrá como resultado datos obsoletos, porque los objetos registrados por una instancia DataContext no se actualizan simplemente por reconsulta.
Utilizar una única instancia estática del DataContext en la capa intermedia de una aplicación distribuida provocará más problemas, porque las instancias del DataContext no son multi hilos.
El enfoque correcto es crear nuevas instancias del DataContext como sea necesario, manteniendo esas instancias con vida solo el tiempo que sea necesario.
Ailas..............
Etiquetas:
Framework 3.5,
Linq,
Programacion
Guía de Arquitectura de Aplicación v2.0
Con la colaboración del grupo de Paterns & Practices, grupos de producto y expertos de la industria, se liberó la segunda edición (beta) de la Guía de Arquitectura de Aplicación 2.0.
Constituye un lineamiento a nivel de diseño para aplicaciones .net de excelencia.
Ya se encuentra lista para la descarga en el sitio de Codeplex.
Constituye un lineamiento a nivel de diseño para aplicaciones .net de excelencia.
Ya se encuentra lista para la descarga en el sitio de Codeplex.
Etiquetas:
Programacion
Windows Azure
Luego de su presentación en el PDC 2008, el sitio oficial ya te proporciona los detalles de este sistema operativo "in the cloud", que soporta desarrollo, alojamiento de servicios y un entorno para manejarlos. Así, en esta plataforma conviven servicios Live, .NET, SharePoint, SQL Server y Microsoft Dynamics CRM. Para más información, no dudes en visitar el sitio oficial de Windows Azure Services Platform.
Ailas.........
Etiquetas:
Microsoft,
Windows Azure
Suscribirse a:
Entradas (Atom)

