miércoles, 16 de abril de 2014

Lista de tablas con el tamaño ocupado por cada una

En algunos casos, por cuestión de administración uno necesita verificar el tamaño ocupado por las tablas en una base de datos, afortunadamente existe el procedimiento del sistema sp_spaceused, con el cual, enviando como parámetro el nombre de la tabla obtengo la información necesaria.

Sin embargo, necesité virifcar el tamaño de todas las tablas al mismo tiempo, con el fin de comparar la cantidad utilizada en diferentes tablas, y pues buscando encontré en la siguiente dirección http://infoinnova.net/2012/01/tablas-de-una-base-de-datos-con-sus-respectivos-tamanos/  el script que me permitió generar dicha consulta:

SELECT 
    X.[name], 
    REPLACE(CONVERT(varchar, CONVERT(money, X.[rows]), 1), '.00', '') 
        AS [rows], 
    REPLACE(CONVERT(varchar, CONVERT(money, X.[reserved]), 1), '.00', '') 
        AS [reserved], 
    REPLACE(CONVERT(varchar, CONVERT(money, X.[data]), 1), '.00', '') 
        AS [data], 
    REPLACE(CONVERT(varchar, CONVERT(money, X.[index_size]), 1), '.00', '') 
        AS [index_size], 
    REPLACE(CONVERT(varchar, CONVERT(money, X.[unused]), 1), '.00', '') 
        AS [unused] 
FROM 
(SELECT 
    CAST(object_name(id) AS varchar(50)) 
        AS [name], 
    SUM(CASE WHEN indid < 2 THEN CONVERT(bigint, [rows]) END) 
        AS [rows],
    SUM(CONVERT(bigint, reserved)) * 8 
        AS reserved, 
    SUM(CONVERT(bigint, dpages)) * 8 
        AS data, 
    SUM(CONVERT(bigint, used) - CONVERT(bigint, dpages)) * 8 
        AS index_size, 
    SUM(CONVERT(bigint, reserved) - CONVERT(bigint, used)) * 8 
        AS unused 
    FROM sysindexes WITH (NOLOCK) 
    WHERE sysindexes.indid IN (0, 1, 255) 
        AND sysindexes.id > 100 
        AND object_name(sysindexes.id) <> 'dtproperties' 
    GROUP BY sysindexes.id WITH ROLLUP
) AS X
WHERE X.[name] is not null
ORDER BY X.[rows] DESC


Espero sea de utilidad.

Saludos

domingo, 3 de febrero de 2013

Azure–Desarrollando aplicaciones Multi-Cliente para la nube

 

Como ahora ando buscando temas de arquitectura para mis próximos productos para Azure, encontré este libro de “Patterns & Practices“ en el cual describen como debería ser una aplicación para diferentes clientes o suscriptores.

En el vínculo se encuentra el libro completo en PDF (versión 3.0 de diciembre de 2012) , además incluye el código de ejemplo y hands on labs para apoyar el aprendizaje, definitivamente super recomendado.

El link al contenido: http://msdn.microsoft.com/en-us/library/ff966499.aspx

image

martes, 16 de octubre de 2012

Charm de settings con la política de privacidad

Hola, Uno de los motivos por los cuales las app no son aceptadas en el windows store es por que no tienen definida una política de privacidad.

En el siguiente ejemplo voy a mostrar como crear en el charm de settings una política de privacidad.

1. Crear un xaml que contenga la información de “acerca de”

a. En nuestra app adicionar un nuevo control de usuario, en mi caso lo llamaré AcercaDe.xaml:

image

b. Escribir en este xaml la información de contacto y la información de la política de privacidad, para ello he creado en este xaml un stackpanel dentro del cual utilicé varios textblok para especificar la información:

<UserControl
x:Class="MiTaskList.AcercaDe"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:MiTaskList"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
d:DesignHeight="300"
d:DesignWidth="400">

<Grid Background="Black">
<StackPanel>
<TextBlock>Acerca de:</TextBlock>
<TextBlock>Aplicacion desarrollada por:</TextBlock>
<TextBlock>Robinson Moscoso</TextBlock>
<TextBlock>rmoscosp@hotmail.com</TextBlock>
<TextBlock>Tel: 57-3002141652</TextBlock>
<TextBlock>robinmp.wix.com</TextBlock>
<TextBlock></TextBlock>
<TextBlock>Política de privacidad</TextBlock>
<TextBlock TextWrapping="Wrap">Esta aplicación hace uso de la conexión a internet, única y exclusivamente, para descargar información relativa de la misma desde nuestros servidores. Ninguna información de la máquina o del usuario es enviada de vuelta a ellos ni a ningún otro servidor a través de internet ni de ningún otro medio por parte de esta aplicación.</TextBlock>

</StackPanel>

</Grid>
</UserControl>



2. Definir una variable en el app.xaml.cs que permita controlar que ya se registró el evento que publica el vinculo en el charm de settings.



image


3. Definir en la primera pagina que se ejecuta en mi app el evento que adiciona a settings el vinculo al xaml que he creado en el punto 1:



a. adicionar variables de control:


image


b. Adicionar en el constructor el registro del evento:


image


c. Adicionar el método OnCommandRequest:


image


d. Adicionar el método onSettingsCommand: (en este método relaciono el xaml de AcercaDe.xaml creado en el numeral 1 de este post)


image


e. agrego los métodos de OnWindowSizeChanged, OnWindowActivated y OnPopupClosed


image


f. todo el código debería verse asi:

using MiTaskList.DataModel;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using Windows.Foundation;
using Windows.Foundation.Collections;
using Windows.UI.ApplicationSettings;
using Windows.UI.Popups;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Controls.Primitives;
using Windows.UI.Xaml.Data;
using Windows.UI.Xaml.Input;
using Windows.UI.Xaml.Media;
using Windows.UI.Xaml.Media.Animation;
using Windows.UI.Xaml.Navigation;

// The Basic Page item template is documented at http://go.microsoft.com/fwlink/?LinkId=234237

namespace MiTaskList
{
/// <summary>
/// A basic page that provides characteristics common to most applications.
/// </summary>
public sealed partial class Inicio : MiTaskList.Common.LayoutAwarePage
{

// Used to determine the correct height to ensure our custom UI fills the screen.
private Rect windowBounds;

// Desired width for the settings UI. UI guidelines specify this should be 346 or 646 depending on your needs.
private double settingsWidth = 646;

// This is the container that will hold our custom content.
private Popup settingsPopup;


public Inicio()
{
this.InitializeComponent();

windowBounds = Window.Current.Bounds;

// Added to listen for events when the window size is updated.
Window.Current.SizeChanged += OnWindowSizeChanged;

//Evento de lanzamiento de settings
//rootPage.NotifyUser("Defaults command added", NotifyType.StatusMessage);
if (!App.isEventRegistered)
{
// Listening for this event lets the app initialize the settings commands and pause its UI until the user closes the pane.
// To ensure your settings are available at all times in your app, place your CommandsRequested handler in the overridden
// OnWindowCreated of App.xaml.cs
SettingsPane.GetForCurrentView().CommandsRequested += onCommandsRequested;
App.isEventRegistered = true;
}


}

private void onCommandsRequested(SettingsPane sender, SettingsPaneCommandsRequestedEventArgs eventArgs)
{
UICommandInvokedHandler handler = new UICommandInvokedHandler(onSettingsCommand);

SettingsCommand generalCommand = new SettingsCommand("DefaultsId", "Acerca de", handler);
eventArgs.Request.ApplicationCommands.Add(generalCommand);
}

private void onSettingsCommand(IUICommand command)
{
//rootPage.NotifyUser("Defaults command invoked", NotifyType.StatusMessage);

// Create a Popup window which will contain our flyout.
settingsPopup = new Popup();
settingsPopup.Closed += OnPopupClosed;
Window.Current.Activated += OnWindowActivated;
settingsPopup.IsLightDismissEnabled = true;
settingsPopup.Width = settingsWidth;
settingsPopup.Height = windowBounds.Height;

// Add the proper animation for the panel.
settingsPopup.ChildTransitions = new TransitionCollection();
settingsPopup.ChildTransitions.Add(new PaneThemeTransition()
{
Edge = (SettingsPane.Edge == SettingsEdgeLocation.Right) ?
EdgeTransitionLocation.Right :
EdgeTransitionLocation.Left
});

// Create a SettingsFlyout the same dimenssions as the Popup.
AcercaDe mypane = new AcercaDe();
mypane.Width = settingsWidth;
mypane.Height = windowBounds.Height;

// Place the SettingsFlyout inside our Popup window.
settingsPopup.Child = mypane;

// Let's define the location of our Popup.
settingsPopup.SetValue(Canvas.LeftProperty, SettingsPane.Edge == SettingsEdgeLocation.Right ? (windowBounds.Width - settingsWidth) : 0);
settingsPopup.SetValue(Canvas.TopProperty, 0);
settingsPopup.IsOpen = true;
}

void OnWindowSizeChanged(object sender, Windows.UI.Core.WindowSizeChangedEventArgs e)
{
windowBounds = Window.Current.Bounds;
}

private void OnWindowActivated(object sender, Windows.UI.Core.WindowActivatedEventArgs e)
{
if (e.WindowActivationState == Windows.UI.Core.CoreWindowActivationState.Deactivated)
{
settingsPopup.IsOpen = false;
}
}

void OnPopupClosed(object sender, object e)
{
Window.Current.Activated -= OnWindowActivated;
}


/// <summary>
/// Populates the page with content passed during navigation. Any saved state is also
/// provided when recreating a page from a prior session.
/// </summary>
/// <param name="navigationParameter">The parameter value passed to
/// <see cref="Frame.Navigate(Type, Object)"/> when this page was initially requested.
/// </param>
/// <param name="pageState">A dictionary of state preserved by this page during an earlier
/// session. This will be null the first time a page is visited.</param>
protected override void LoadState(Object navigationParameter, Dictionary<String, Object> pageState)
{
}

/// <summary>
/// Preserves state associated with this page in case the application is suspended or the
/// page is discarded from the navigation cache. Values must conform to the serialization
/// requirements of <see cref="SuspensionManager.SessionState"/>.
/// </summary>
/// <param name="pageState">An empty dictionary to be populated with serializable state.</param>
protected override void SaveState(Dictionary<String, Object> pageState)
{
}

}
}

 


luego se ejecutar y al hacer clic en settings  se ve de esta forma:


image


y al hacer clic en acerca de, se abre el AcercaDe.xaml:


image

domingo, 9 de septiembre de 2012

Iconos para mi WinRT App

Cuando vemos el diseño que traen las app para windows 8 los iconos llaman bastante la atención.
image
Y cuando desarrollamos nuestras apps y queremos tener dicho iconos en ellas, para muchos la opción es buscar el png en algún buscador de imagenes, o incluso abrir paint y manos a la obra.
Lo que muchos no saben, es que estos íconos son una fuente que viene en windows, y que la podemos utilizar en nuestra app y solo utilizar el simbolo que correspone al icono respectivo dentro de un textblock por ejemplo.
El tipo de letra a utilizar es “Segoe UI Symbol” y con el mapa de caracteres podemos identificar el simbolo que queremos utilizar en nuestra app.
image
Luego lo seleccionamos, lo copiamos y lo pegamos dentro de un Textblock que tenga en el atributo FontFamily el tipo de letra “Segoe UI Symbol”.
image
Y pues al ser una fuente tenemos la ventaja de poder cambiar el tamaño fácilmente, el color de nuestros iconos, y lo mejor de todo, nuestra app queda mucho mas liviana al no tener que incluir este tipo de imágenes. 
El resultado:
 image

jueves, 6 de septiembre de 2012

A desarrollar Windows 8 apps con BDotNet, Microsoft y apps.co

 

Hola, teniendo en cuenta la iniciativa del Ministerio TIC , apps co en la cual se apoya el desarrollo de aplicaciones en nuevas tecnologías (Click aquí para más información) y el apoyo de Microsoft para que estas apps sean en Windows 8 y Windows Phone, BDotNet se une a esta iniciativa capacitando a los desarrolladores que quieran hacer parte de esta iniciativa.

¿Cómo se van a realizar dichas capacitaciones?

Esta capacitaciones se harán por medio de web cast, en los cuales guiaremos el proceso del desarrollo de las apps que nuestros miembros quieran sacar adelante.

Inicialmente las capacitaciones estarán basadas en Windows 8, para lo cual es importante que se inscriban en la pagina oficial del apps co, seleccionando que la tecnología a aprendes de desarrollo Nativo y dentro de esta Windows 8

image

image

Es muy importante tener en cuenta que solo se pueden capacitar en una tecnología a la vez, y si el usuario se inscribe más de una vez, solo se tendrá en cuenta el ultimo registro que haya realizado.

Ahora, los invitamos a que sigan la comunidad, a través de nuestra página www.bogotadotnet.org, en nuestra página de facebook https://www.facebook.com/ComunidadBogotaDotNet y en twitter a través del hashtag #BDotNet  para informarlos de los pasos a seguir.

lunes, 27 de agosto de 2012

PPTs y talleres de la clase sistemas de información

 

Para mis estudiantes del curso de Sistemas de Información de la UN.

Por favor diligencien este formulario para enviarles el material de las clases.

Como subir un App WinRT a Windows app store

Dentro de las oportunidades que se vienen con Windows 8 es la de poder ofrecer nuestras aplicaciones a través del Windows app store. En este artículo veremos los pasos para subir nuestras apps:

1. Registro:

Lo primero es ir al Windows Dev Center (http://msdn.microsoft.com/en-us/windows/apps) e iniciar sesión con el live id.
Seguido vamos a la opción de Dashboard, en la cual iniciamos el proceso de registro, seleccionando el país en el que nos encontramos, para nuestro caso “Colombia”
image
Una vez en la ventana de registro llenamos la información correspondiente. Para tener en cuenta, el código postal lo podemos encontrar en la página de 4-72 (aplica para Colombia: http://190.26.208.149/CodigosPostales/Index.html#app=76ee&4817-selectedIndex=1)
image

Una vez hacemos clic en siguiente debemos leer y aceptar el contrato (Application Development Agreement)
image

2. PRECIO y pago

En la página se nos especifica el precio a pagar por el registro, si se tiene un código se puede incluir en esta parte.
image
Una vez se hace clic en siguiente se activa la ventana de pago, en la cual registramos la información de una Tarjeta de Crédito por medio de la cual se hará el pago.
image
Una vez registrados los datos del medio de pago se debe hacer la confirmación de la compra:
image
Una vez realizados estos pasos nos llega un correo de conformación de la creación de la cuenta y del pago realizado. Ahora ya podemos iniciar nuestro trabajo en el dashboard
image

3. SUBIR UNA APP

Una vez ingresamos al Dash Board podemos iniciar con el proceso de carga de nuestra aplicación, para ello utilizamos el link Submit an app:
image
Para subir la app nos pide los siguientes pasos:
image
  • App Name
Se debe reservar el nombre que tendrá la app.
image
image
  • Selling details (Opciones para la venta)
En esta opción se determina el precio, y si aplica en periodo de prueba de la app, para nuestro caso nuestra app será gratis (Free).
Además en esta opción se debe seleccionar en que mercados quedará disponible, teniendo en cuenta las opciones y palabras que tiene nuestra app, pues una palabra común en el dialecto colombiano, puede ser mal vista en otra región, lo cual puede causas que la app no sea subida al app store.
image
También se debe seleccionar la fecha en que será lanzada nuestra app, la primera opción es publicarla una vez pase el proceso certificación.
También se debe seleccionar la categoría sobre la cual se alojará la app, en mi caso “Business”
Se debe también seleccionar si la app requiere para funcionar algunas especificaciones de hardware, particularmente si el dispositivo debe tener alguna versión de DirectX o si requiere dispositivos con más de 2GB de RAM.
Se debe seleccionar si la app  cumple con las directrices de accesibilidad, importante tener en cuenta que si la app no cumple con alguna de las opciones de accesibilidad descritas en la guía y es seleccionada esta opción, la app no será certificada.
image
  • Características avanzadas
image
En este apartado configuramos 1. si la app y cuenta con  “Push notifications and Live Connect services”  los cuales deben ser configurados antes de subir la app para la certificacion. 2. “In-app offers” si se quiere configurar ofertas dentro de la aplicación.
  • Audiencia a quien va dirigida la app (Age rating and rating certificates)
Se debe seleccionar para que público puede estar disponible la app, hay que tener en cuenta que Windows Store no permite subir aplicaciones explicitas para adultos únicamente (por ejemplo apps de contenido sexual)
image
  • Criptografía (Cryptography)
Permite especificar si la app usa encriptación.
image
  • Paquetes
Es necesario subir el paquete de nuestra app, este paquete se puede crear a través de Visual Studio (proximante publicaré un post al respecto)
image
  • Descripción
Una ves tenemos los paquetes subidos, precedemos a dar una descripción de nuestra app, en la cual se pide:
  1. Descripción de la app, que será el texto que leerán nuestros usuarios antes de descargar la app
  2. App Features (Características)
  3. Keywords (Palabras clave)
  4. Description of update (descripción de la actualización)
  5. Copyright and trademark (Derechos de autor)
  6. Additional license terms (Términos adicionales de la licencia)
  7. Screenshots (pantallazos)
  8. Promotional images (imágenes promocionales)
  9. Recommended hardware (Hardware recomendado)
  10. Website
  11. Support contact info (Información de contacto para soporte)
  12. Privacy policy ( Política de privacidad)
image
  • Notas a los probadores (Notes to testers)
Permite escribir información que ayuda a los probadores a entender y a utilizar la aplicación. La información ingresada en esta parte no será vista por los usuarios de la app.
image

4. Enviar la app para certificación

Una vez se han completado todos los pasos se habilita la opción de enviar la app para la respectiva certificación.
image

Bueno, espero sea de utilidad este pequeño tutorial sobre el proceso de carga de nuestras apps.